diff --git a/.editorconfig b/.editorconfig index 4ee6cd02539a..e43144c4c815 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ charset = utf-8 # Docstrings and comments use max_line_length = 79 [*.py] -max_line_length = 119 +max_line_length = 88 # Use 2 spaces for the HTML files [*.html] @@ -42,3 +42,6 @@ indent_style = tab [docs/**.txt] max_line_length = 79 + +[*.yml] +indent_size = 2 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 7db926630514..000000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -**/*.min.js -**/vendor/**/*.js -django/contrib/gis/templates/**/*.js -node_modules/**.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 332755a844b0..000000000000 --- a/.eslintrc +++ /dev/null @@ -1,37 +0,0 @@ -{ - "rules": { - "camelcase": ["off", {"properties": "always"}], - "comma-spacing": ["error", {"before": false, "after": true}], - "curly": ["error", "all"], - "dot-notation": ["error", {"allowKeywords": true}], - "eqeqeq": ["error"], - "indent": ["error", 4], - "key-spacing": ["error", {"beforeColon": false, "afterColon": true}], - "linebreak-style": ["error", "unix"], - "new-cap": ["off", {"newIsCap": true, "capIsNew": true}], - "no-alert": ["off"], - "no-eval": ["error"], - "no-extend-native": ["error", {"exceptions": ["Date", "String"]}], - "no-multi-spaces": ["error"], - "no-octal-escape": ["error"], - "no-script-url": ["error"], - "no-shadow": ["error", {"hoist": "functions"}], - "no-underscore-dangle": ["error"], - "no-unused-vars": ["error", {"vars": "local", "args": "none"}], - "no-var": ["error"], - "prefer-const": ["error"], - "quotes": ["off", "single"], - "semi": ["error", "always"], - "space-before-blocks": ["error", "always"], - "space-before-function-paren": ["error", {"anonymous": "never", "named": "never"}], - "space-infix-ops": ["error", {"int32Hint": false}], - "strict": ["error", "global"] - }, - "env": { - "browser": true, - "es6": true - }, - "globals": { - "django": false - } -} diff --git a/.flake8 b/.flake8 new file mode 100644 index 000000000000..c4094af4621c --- /dev/null +++ b/.flake8 @@ -0,0 +1,9 @@ +[flake8] +exclude = build,.git,.tox,./tests/.env +extend-ignore = E203 +max-line-length = 88 +per-file-ignores = + django/core/cache/backends/filebased.py:W601 + django/core/cache/backends/base.py:W601 + django/core/cache/backends/redis.py:W601 + tests/cache/tests.py:W601 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000000..d979bc49b4cb --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,10 @@ +305757aec19c9d5111e4d76095ae0acd66163e4b +ca88caa1031c0de545d82de8d90dcae0e03651fb +c5cd8783825b5f6384417dac5f3889b4210b7d08 +9c19aff7c7561e3a82978a272ecdaad40dda5c00 +7119f40c9881666b6f9b5cf7df09ee1d21cc8344 +c18861804feb6a97afbeabb51be748dd60a04458 +097e3a70c1481ee7b042b2edd91b2be86fb7b5b6 +534ac4829764f317cf2fbc4a18354fcc998c1425 +ba755ca13123d2691a0926ddb64e5d0a2906a880 +14459f80ee3a9e005989db37c26fd13bb6d2fab2 diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 000000000000..ba898fe54574 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +# Django Code of Conduct + +See https://www.djangoproject.com/conduct/. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000000..6c43c1c99adc --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,15 @@ +#### Trac ticket number + + +ticket-XXXXX + +#### Branch description +Provide a concise overview of the issue or rationale behind the proposed changes. + +#### Checklist +- [ ] This PR targets the `main` branch. +- [ ] The commit message is written in past tense, mentions the ticket number, and ends with a period. +- [ ] I have checked the "Has patch" ticket flag in the Trac system. +- [ ] I have added or updated relevant tests. +- [ ] I have added or updated relevant docs, including release notes if applicable. +- [ ] I have attached screenshots in both light and dark modes for any UI changes. diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml new file mode 100644 index 000000000000..0d5ec23550b3 --- /dev/null +++ b/.github/workflows/benchmark.yml @@ -0,0 +1,46 @@ +name: Benchmark + +on: + pull_request: + types: [ labeled, synchronize, opened, reopened ] + +permissions: + contents: read + +jobs: + Run_benchmarks: + if: contains(github.event.pull_request.labels.*.name, 'benchmark') + runs-on: ubuntu-latest + steps: + - name: Checkout Benchmark Repo + uses: actions/checkout@v4 + with: + repository: django/django-asv + path: "." + - name: Setup Miniforge + uses: conda-incubator/setup-miniconda@v3 + with: + miniforge-version: "24.1.2-0" + activate-environment: asv-bench + - name: Install Requirements + run: pip install -r requirements.txt + - name: Cache Django + uses: actions/cache@v3 + with: + path: Django/* + key: Django + - name: Run Benchmarks + shell: bash -l {0} + run: |- + asv machine --machine ubuntu-latest --yes > /dev/null + echo 'Beginning benchmarks...' + asv continuous --interleave-processes -a processes=2 --split --show-stderr 'HEAD^' 'HEAD' |\ + sed -n -E '/(before.*after.*ratio)|(BENCHMARKS)/,$p' >> out.txt + echo 'Benchmarks Done.' + echo '```' >> $GITHUB_STEP_SUMMARY + cat out.txt >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + if grep -q "PERFORMANCE DECREASED" out.txt; + then + exit 1 + fi diff --git a/.github/workflows/data/test_postgres.py.tpl b/.github/workflows/data/test_postgres.py.tpl new file mode 100644 index 000000000000..15dfa0d62ee3 --- /dev/null +++ b/.github/workflows/data/test_postgres.py.tpl @@ -0,0 +1,24 @@ +import os +from test_sqlite import * # NOQA + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql", + "USER": "user", + "NAME": "django", + "PASSWORD": "postgres", + "HOST": "localhost", + "PORT": 5432, + "OPTIONS": { + "server_side_binding": os.getenv("SERVER_SIDE_BINDING") == "1", + }, + }, + "other": { + "ENGINE": "django.db.backends.postgresql", + "USER": "user", + "NAME": "django2", + "PASSWORD": "postgres", + "HOST": "localhost", + "PORT": 5432, + }, +} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000000..46c2cf870724 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,60 @@ +name: Docs + +on: + pull_request: + paths: + - 'docs/**' + - '.github/workflows/docs.yml' + push: + branches: + - main + paths: + - 'docs/**' + - '.github/workflows/docs.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + docs: + runs-on: ubuntu-24.04 + name: docs + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'docs/requirements.txt' + - run: python -m pip install -r docs/requirements.txt + - name: Build docs + run: | + cd docs + sphinx-build -b spelling -n -q -W --keep-going -d _build/doctrees -D language=en_US -j auto . _build/spelling + + blacken-docs: + runs-on: ubuntu-latest + name: blacken-docs + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - run: python -m pip install blacken-docs + - name: Build docs + run: | + cd docs + make black + RESULT=`cat _build/black/output.txt` + if [ "$RESULT" -gt 0 ]; then + echo "💥 📢 Code blocks in documentation must be reformatted with blacken-docs 📢 💥" + fi; + exit $RESULT diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml new file mode 100644 index 000000000000..637dd726a8b6 --- /dev/null +++ b/.github/workflows/labels.yml @@ -0,0 +1,53 @@ +name: Labels + +on: + pull_request_target: + types: [ edited, opened, reopened, ready_for_review ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + pull-requests: write + +jobs: + no_ticket: + name: "Flag if no Trac ticket is found in the title" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: "Check title and manage labels" + uses: actions/github-script@v7 + with: + script: | + const title = context.payload.pull_request.title; + const regex = /#[0-9]+[ ,:]?/gm; + const label = "no ticket"; + const hasMatch = regex.test(title); + const labels = context.payload.pull_request.labels.map(l => l.name); + const owner = context.repo.owner; + const repo = context.repo.repo; + const pr_number = context.payload.pull_request.number; + console.log(`=> Pull Request Title: ${title}`); + console.log(`=> Labels on PR: [${labels}]`); + if (hasMatch && labels.includes(label)) { + console.log(`==> Removing label "${label}" from PR #${pr_number}`); + await github.rest.issues.removeLabel({ + owner, + repo, + issue_number: pr_number, + name: label + }); + } else if (!hasMatch && !labels.includes(label)) { + console.log(`==> Adding label "${label}" to PR #${pr_number}`); + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: pr_number, + labels: [label] + }); + } else { + console.log(`No action needed for PR #${pr_number}`); + } diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml new file mode 100644 index 000000000000..d89085b4a783 --- /dev/null +++ b/.github/workflows/linters.yml @@ -0,0 +1,62 @@ +name: Linters + +on: + pull_request: + paths-ignore: + - 'docs/**' + push: + branches: + - main + paths-ignore: + - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + flake8: + name: flake8 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - run: python -m pip install flake8 + - name: flake8 + # Pinned to v3.0.0. + uses: liskin/gh-problem-matcher-wrap@e7b7beaaafa52524748b31a381160759d68d61fb + with: + linters: flake8 + run: flake8 + + isort: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - run: python -m pip install "isort<6" + - name: isort + # Pinned to v3.0.0. + uses: liskin/gh-problem-matcher-wrap@e7b7beaaafa52524748b31a381160759d68d61fb + with: + linters: isort + run: isort --check --diff django tests scripts + + black: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: black + uses: psf/black@stable diff --git a/.github/workflows/new_contributor_pr.yml b/.github/workflows/new_contributor_pr.yml new file mode 100644 index 000000000000..3e0119ebdc2f --- /dev/null +++ b/.github/workflows/new_contributor_pr.yml @@ -0,0 +1,27 @@ +name: New contributor message + +on: + pull_request_target: + types: [opened] + +permissions: + pull-requests: write + +jobs: + build: + name: Hello new contributor + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + pr-message: | + Hello! Thank you for your contribution 💪 + + As it's your first contribution be sure to check out the [patch review checklist](https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/submitting-patches/#patch-review-checklist). + + If you're fixing a ticket [from Trac](https://code.djangoproject.com/) make sure to set the _"Has patch"_ flag and include a link to this PR in the ticket! + + If you have any design or process questions then you can ask in the [Django forum](https://forum.djangoproject.com/c/internals/5). + + Welcome aboard ⛵️! diff --git a/.github/workflows/python_matrix.yml b/.github/workflows/python_matrix.yml new file mode 100644 index 000000000000..5901e584aa35 --- /dev/null +++ b/.github/workflows/python_matrix.yml @@ -0,0 +1,52 @@ +name: Python Matrix from config file + +on: + pull_request: + types: [labeled, synchronize, opened, reopened] + paths-ignore: + - 'docs/**' + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + define-matrix: + if: contains(github.event.pull_request.labels.*.name, 'python-matrix') + runs-on: ubuntu-latest + outputs: + python_versions_output: ${{ steps.set-matrix.outputs.python_versions }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + - id: set-matrix + run: | + python_versions=$(sed -n "s/^.*Programming Language :: Python :: \([[:digit:]]\+\.[[:digit:]]\+\).*$/'\1', /p" pyproject.toml | tr -d '\n' | sed 's/, $//g') + echo "Supported Python versions: $python_versions" + echo "python_versions=[$python_versions]" >> "$GITHUB_OUTPUT" + python: + runs-on: ubuntu-latest + needs: define-matrix + strategy: + matrix: + python-version: ${{ fromJson(needs.define-matrix.outputs.python_versions_output) }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + - name: Run tests + run: python -Wall tests/runtests.py -v2 diff --git a/.github/workflows/schedule_tests.yml b/.github/workflows/schedule_tests.yml new file mode 100644 index 000000000000..f898941fe3b7 --- /dev/null +++ b/.github/workflows/schedule_tests.yml @@ -0,0 +1,182 @@ +name: Schedule tests + +on: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + windows: + runs-on: windows-latest + strategy: + matrix: + python-version: + - '3.12' + - '3.13' + - '3.14-dev' + name: Windows, SQLite, Python ${{ matrix.python-version }} + continue-on-error: true + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + - name: Run tests + run: python -Wall tests/runtests.py -v2 + + pyc-only: + runs-on: ubuntu-latest + name: Byte-compiled Django with no source files (only .pyc files) + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install . + - name: Prepare site-packages + run: | + DJANGO_PACKAGE_ROOT=$(python -c 'import site; print(site.getsitepackages()[0])')/django + echo $DJANGO_PACKAGE_ROOT + python -m compileall -b $DJANGO_PACKAGE_ROOT + find $DJANGO_PACKAGE_ROOT -name '*.py' -print -delete + - run: python -m pip install -r tests/requirements/py3.txt + - name: Run tests + run: python -Wall tests/runtests.py --verbosity=2 + + javascript-tests: + runs-on: ubuntu-latest + name: JavaScript tests + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: '**/package.json' + - run: npm install + - run: npm test + + selenium-sqlite: + runs-on: ubuntu-latest + name: Selenium tests, SQLite + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + - name: Run Selenium tests + working-directory: ./tests/ + run: | + python -Wall runtests.py --verbosity 2 --noinput --selenium=chrome --headless --settings=test_sqlite --parallel 2 + + selenium-postgresql: + runs-on: ubuntu-latest + name: Selenium tests, PostgreSQL + services: + postgres: + image: postgres:14-alpine + env: + POSTGRES_DB: django + POSTGRES_USER: user + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -r tests/requirements/postgres.txt -e . + - name: Create PostgreSQL settings file + run: mv ./.github/workflows/data/test_postgres.py.tpl ./tests/test_postgres.py + - name: Run Selenium tests + working-directory: ./tests/ + run: | + python -Wall runtests.py --verbosity 2 --noinput --selenium=chrome --headless --settings=test_postgres --parallel 2 + + postgresql: + strategy: + fail-fast: false + matrix: + version: [16, 17] + server_side_bindings: [0, 1] + runs-on: ubuntu-latest + name: PostgreSQL Versions + env: + SERVER_SIDE_BINDING: ${{ matrix.server_side_bindings }} + services: + postgres: + image: postgres:${{ matrix.version }}-alpine + env: + POSTGRES_DB: django + POSTGRES_USER: user + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -r tests/requirements/postgres.txt -e . + - name: Create PostgreSQL settings file + run: mv ./.github/workflows/data/test_postgres.py.tpl ./tests/test_postgres.py + - name: Run tests + working-directory: ./tests/ + run: python -Wall runtests.py --settings=test_postgres --verbosity=2 diff --git a/.github/workflows/schedules.yml b/.github/workflows/schedules.yml new file mode 100644 index 000000000000..041a0b33626a --- /dev/null +++ b/.github/workflows/schedules.yml @@ -0,0 +1,46 @@ +name: Schedule + +on: + schedule: + - cron: '42 2 * * *' + workflow_dispatch: + +permissions: + actions: write + contents: read + +jobs: + trigger-runs: + runs-on: ubuntu-latest + environment: schedules + name: Trigger Full Build + # Only trigger on the main Django repository + if: (github.event_name == 'schedule' && github.repository == 'django/django') || (github.event_name != 'schedule') + strategy: + matrix: + branch: + - main + steps: + - uses: actions/github-script@v7 + with: + github-token: ${{secrets.SCHEDULE_WORKFLOW_TOKEN}} + script: | + const yesterday = new Date(new Date() - (1000 * 3600 * 24)).toISOString(); + const { data: commits } = await github.rest.repos.listCommits({ + owner: context.repo.owner, + repo: context.repo.repo, + sha: '${{ matrix.branch }}', + since: yesterday, + per_page: 1 + }); + if (commits.length) { + console.log(`Found new commit with SHA ${commits[0].sha} on branch ${{ matrix.branch }}`) + await github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: '.github/workflows/schedule_tests.yml', + ref: '${{ matrix.branch }}', + }) + } else { + console.log(`No commits found since ${yesterday} on branch ${{ matrix.branch }}`) + } diff --git a/.github/workflows/screenshots.yml b/.github/workflows/screenshots.yml new file mode 100644 index 000000000000..27ecc58eecb0 --- /dev/null +++ b/.github/workflows/screenshots.yml @@ -0,0 +1,60 @@ +name: Visual Regression Tests + +on: + pull_request: + types: [labeled, synchronize, opened, reopened] + paths-ignore: + - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + selenium-screenshots: + if: contains(join(github.event.pull_request.labels.*.name, '|'), 'screenshots') + runs-on: ubuntu-latest + name: Screenshots + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + + - name: Run Selenium tests with screenshots + working-directory: ./tests/ + run: python -Wall runtests.py --verbosity=2 --noinput --selenium=chrome --headless --screenshots --settings=test_sqlite --parallel=2 + + - name: Cache oxipng + uses: actions/cache@v4 + with: + path: ~/.cargo/ + key: ${{ runner.os }}-cargo + + - name: Install oxipng + run: which oxipng || cargo install oxipng + + - name: Optimize screenshots + run: oxipng --interlace=0 --opt=4 --strip=safe tests/screenshots/*.png + + - name: Organize screenshots + run: | + mkdir --parents "/tmp/screenshots/${{ github.event.pull_request.head.sha }}" + mv tests/screenshots/* "/tmp/screenshots/${{ github.event.pull_request.head.sha }}/" + + - name: Upload screenshots + uses: actions/upload-artifact@v4 + with: + name: screenshots-${{ github.event.pull_request.head.sha }} + path: /tmp/screenshots/ + if-no-files-found: error diff --git a/.github/workflows/selenium.yml b/.github/workflows/selenium.yml new file mode 100644 index 000000000000..14a95f3b66a5 --- /dev/null +++ b/.github/workflows/selenium.yml @@ -0,0 +1,77 @@ +name: Selenium Tests + +on: + pull_request: + types: [labeled, synchronize, opened, reopened] + paths-ignore: + - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + selenium-sqlite: + if: contains(github.event.pull_request.labels.*.name, 'selenium') + runs-on: ubuntu-latest + name: SQLite + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + - name: Run Selenium tests + working-directory: ./tests/ + run: | + python -Wall runtests.py --verbosity 2 --noinput --selenium=chrome --headless --settings=test_sqlite --parallel 2 + + selenium-postgresql: + if: contains(github.event.pull_request.labels.*.name, 'selenium') + runs-on: ubuntu-latest + name: PostgreSQL + services: + postgres: + image: postgres:14-alpine + env: + POSTGRES_DB: django + POSTGRES_USER: user + POSTGRES_PASSWORD: postgres + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install libmemcached-dev for pylibmc + run: sudo apt-get install libmemcached-dev + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -r tests/requirements/postgres.txt -e . + - name: Create PostgreSQL settings file + run: mv ./.github/workflows/data/test_postgres.py.tpl ./tests/test_postgres.py + - name: Run Selenium tests + working-directory: ./tests/ + run: | + python -Wall runtests.py --verbosity 2 --noinput --selenium=chrome --headless --settings=test_postgres --parallel 2 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000000..3373f82e0a52 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,56 @@ +name: Tests + +on: + pull_request: + paths-ignore: + - 'docs/**' + push: + branches: + - main + paths-ignore: + - 'docs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + windows: + runs-on: windows-latest + strategy: + matrix: + python-version: + - '3.13' + name: Windows, SQLite, Python ${{ matrix.python-version }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: 'tests/requirements/py3.txt' + - name: Install and upgrade packaging tools + run: python -m pip install --upgrade pip setuptools wheel + - run: python -m pip install -r tests/requirements/py3.txt -e . + - name: Run tests + run: python -Wall tests/runtests.py -v2 + + javascript-tests: + runs-on: ubuntu-latest + name: JavaScript tests + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: '**/package.json' + - run: npm install + - run: npm test diff --git a/.gitignore b/.gitignore index 238fb3a200c7..7b065ff5fcf3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ docs/_build/ docs/locale/ node_modules/ tests/coverage_html/ -tests/.coverage +tests/.coverage* build/ tests/report/ +tests/screenshots/ diff --git a/.hgignore b/.hgignore deleted file mode 100644 index 8c900d573a91..000000000000 --- a/.hgignore +++ /dev/null @@ -1,15 +0,0 @@ -syntax:glob - -*.egg-info -*.pot -*.py[co] -__pycache__ -MANIFEST -dist/ -docs/_build/ -docs/locale/ -node_modules/ -tests/coverage_html/ -tests/.coverage -build/ -tests/report/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000000..6863d152778f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,26 @@ +repos: + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 25.1.0 + hooks: + - id: black + exclude: \.py-tpl$ + - repo: https://github.com/adamchainz/blacken-docs + rev: 1.19.1 + hooks: + - id: blacken-docs + additional_dependencies: + - black==25.1.0 + files: 'docs/.*\.txt$' + args: ["--rst-literal-block"] + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort + - repo: https://github.com/PyCQA/flake8 + rev: 7.1.1 + hooks: + - id: flake8 + - repo: https://github.com/pre-commit/mirrors-eslint + rev: v9.19.0 + hooks: + - id: eslint diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 000000000000..915d51de46f9 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,19 @@ +# Configuration for the Read The Docs (RTD) builds of the documentation. +# Ref: https://docs.readthedocs.io/en/stable/config-file/v2.html +# The python.install.requirements pins the version of Sphinx used. +version: 2 + +build: + os: ubuntu-24.04 + tools: + python: "3.12" + +sphinx: + configuration: docs/conf.py + fail_on_warning: true + +python: + install: + - requirements: docs/requirements.txt + +formats: all diff --git a/.tx/config b/.tx/config index 77040148ba8a..181845ce111b 100644 --- a/.tx/config +++ b/.tx/config @@ -1,68 +1,68 @@ [main] -host = https://www.transifex.com -lang_map = sr@latin:sr_Latn, zh_CN:zh_Hans, zh_TW:zh_Hant +host = https://www.transifex.com +lang_map = sr@latin: sr_Latn, zh_CN: zh_Hans, zh_TW: zh_Hant -[django.core] +[o:django:p:django:r:core] file_filter = django/conf/locale//LC_MESSAGES/django.po source_file = django/conf/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-admin] +[o:django:p:django:r:contrib-admin] file_filter = django/contrib/admin/locale//LC_MESSAGES/django.po source_file = django/contrib/admin/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-admin-js] +[o:django:p:django:r:contrib-admin-js] file_filter = django/contrib/admin/locale//LC_MESSAGES/djangojs.po source_file = django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po source_lang = en -[django.contrib-admindocs] +[o:django:p:django:r:contrib-admindocs] file_filter = django/contrib/admindocs/locale//LC_MESSAGES/django.po source_file = django/contrib/admindocs/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-auth] +[o:django:p:django:r:contrib-auth] file_filter = django/contrib/auth/locale//LC_MESSAGES/django.po source_file = django/contrib/auth/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-contenttypes] +[o:django:p:django:r:contrib-contenttypes] file_filter = django/contrib/contenttypes/locale//LC_MESSAGES/django.po source_file = django/contrib/contenttypes/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-flatpages] +[o:django:p:django:r:contrib-flatpages] file_filter = django/contrib/flatpages/locale//LC_MESSAGES/django.po source_file = django/contrib/flatpages/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-gis] +[o:django:p:django:r:contrib-gis] file_filter = django/contrib/gis/locale//LC_MESSAGES/django.po source_file = django/contrib/gis/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-humanize] +[o:django:p:django:r:contrib-humanize] file_filter = django/contrib/humanize/locale//LC_MESSAGES/django.po source_file = django/contrib/humanize/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-postgres] +[o:django:p:django:r:contrib-postgres] file_filter = django/contrib/postgres/locale//LC_MESSAGES/django.po source_file = django/contrib/postgres/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-redirects] +[o:django:p:django:r:contrib-redirects] file_filter = django/contrib/redirects/locale//LC_MESSAGES/django.po source_file = django/contrib/redirects/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-sessions] +[o:django:p:django:r:contrib-sessions] file_filter = django/contrib/sessions/locale//LC_MESSAGES/django.po source_file = django/contrib/sessions/locale/en/LC_MESSAGES/django.po source_lang = en -[django.contrib-sites] +[o:django:p:django:r:contrib-sites] file_filter = django/contrib/sites/locale//LC_MESSAGES/django.po source_file = django/contrib/sites/locale/en/LC_MESSAGES/django.po source_lang = en diff --git a/AUTHORS b/AUTHORS index 7ae9bb185a5d..b816c305e53c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,4 +1,4 @@ -Django was originally created in late 2003 at World Online, the Web division +Django was originally created in late 2003 at World Online, the web division of the Lawrence Journal-World newspaper in Lawrence, Kansas. Here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS -- @@ -6,21 +6,28 @@ people who have submitted patches, reported bugs, added translations, helped answer newbie questions, and generally made Django that much better: Aaron Cannon + Aaron Linville Aaron Swartz Aaron T. Myers Abeer Upadhyay Abhijeet Viswa Abhinav Patil + Abhinav Yadav Abhishek Gautam + Abhyudai Adam Allred Adam Bogdał Adam Donaghy Adam Johnson Adam Malinowski Adam Vandenberg + Adam Zapletal + Ade Lee Adiyat Mubarak Adnan Umer + Arslan Noor Adrian Holovaty + Adrian Torres Adrien Lemaire Afonso Fernández Nogueira AgarFu @@ -29,19 +36,24 @@ answer newbie questions, and generally made Django that much better: Ahmed Eltawela ajs Akash Agrawal + Akash Kumar Sen Akis Kesoglou Aksel Ethem Akshesh Doshi alang@bright-green.com Alasdair Nicol + Albert Defler Albert Wang Alcides Fonseca Aldian Fazrihady + Alejandro García Ruiz de Oteiza + Aleksander Milinkevich Aleksandra Sendecka Aleksi Häkli - Alexander Dutton + Alex Dutton + Alexander Lazarević Alexander Myodov - Alexandr Tatarinov + Alexandr Tatarinov Alex Aktsipetrov Alex Becker Alex Couper @@ -53,7 +65,10 @@ answer newbie questions, and generally made Django that much better: Alexey Boriskin Alexey Tsivunin Ali Vakilzade + Aljaž Košir Aljosa Mohorovic + Alokik Vijay + Amir Karimi Amit Chakradeo Amit Ramon Amit Upadhyay @@ -67,12 +82,15 @@ answer newbie questions, and generally made Django that much better: Andreas Mock Andreas Pelme Andrés Torres Marroquín + Andreu Vallbona Plazas Andrew Brehaut Andrew Clark Andrew Durdin Andrew Godwin + Andrew Miller Andrew Pinkham Andrews Medina + Andrew Northall Andriy Sokolovskiy Andy Chosak Andy Dustman @@ -81,6 +99,8 @@ answer newbie questions, and generally made Django that much better: Anssi Kääriäinen ant9000@netwise.it Anthony Briggs + Anthony Wright + Antoine Chéneau Anton Samarchyan Antoni Aloy Antonio Cavedoni @@ -88,15 +108,23 @@ answer newbie questions, and generally made Django that much better: Antti Haapala Antti Kaihola Anubhav Joshi + Anvesh Mishra + Anže Pečar + A. Rafey Khan Aram Dulyan arien + Arjun Omray Armin Ronacher Aron Podrigal + Arsalan Ghassemi Artem Gnilov Arthur + Arthur Jovart Arthur Koziel + Arthur Moreira Arthur Rio Arvis Bickovskis + Arya Khaligh Aryeh Leib Taurog A S Alam Asif Saif Uddin @@ -110,6 +138,7 @@ answer newbie questions, and generally made Django that much better: Baptiste Mispelon Barry Pederson Bartolome Sanchez Salado + Barton Ip Bartosz Grabski Bashar Al-Abdulhadi Bastian Kleineidam @@ -117,17 +146,21 @@ answer newbie questions, and generally made Django that much better: Batman Batuhan Taskaya Baurzhan Ismagulov + Ben Cardy Ben Dean Kawamura Ben Firshman Ben Godfrey Benjamin Wohlwend Ben Khoo + Ben Lomax Ben Slavin Ben Sturmfels + Bendegúz Csirmaz Berker Peksag Bernd Schlapsi Bernhard Essl berto + Bhuvnesh Sharma Bill Fenner Bjørn Stabell Bo Marchman @@ -146,6 +179,8 @@ answer newbie questions, and generally made Django that much better: Brian Beck Brian Fabian Crain Brian Harring + Brian Helba + Brian Nettleton Brian Ray Brian Rosner Bruce Kroeze @@ -175,6 +210,8 @@ answer newbie questions, and generally made Django that much better: charly.wilhelm@gmail.com Chason Chaffin Cheng Zhang + Chiemezuo Akujobi + Chinmoy Chakraborty Chris Adams Chris Beaven Chris Bennett @@ -197,6 +234,7 @@ answer newbie questions, and generally made Django that much better: Chris Wagner Chris Wesseling Chris Wilson + Ciaran McCormick Claude Paroz Clint Ecker colin@owlfish.com @@ -214,6 +252,7 @@ answer newbie questions, and generally made Django that much better: Daniel Alves Barbosa de Oliveira Vaz Daniel Duan Daniele Procida + Daniel Fairhead Daniel Greenfeld dAniel hAhler Daniel Jilg @@ -246,6 +285,8 @@ answer newbie questions, and generally made Django that much better: David Sanders David Schein David Tulig + David Winiecki + David Winterbottom David Wobrock Davide Ceretti Deep L. Sukhwani @@ -269,9 +310,11 @@ answer newbie questions, and generally made Django that much better: Doug Beck Doug Napoleone dready + Durval Carvalho de Souza dusk@woofle.net Dustyn Gibson Ed Morley + Egidijus Macijauskas eibaan@gmail.com elky Emmanuelle Delescolle @@ -288,12 +331,17 @@ answer newbie questions, and generally made Django that much better: Erik Karulf Erik Romijn eriks@win.tue.nl + Erin Kelly Erwin Junge Esdras Beleza Espen Grindhaug + Étienne Beaulé Eugene Lazutkin Evan Grim + Fabian Büchler + Fabian Braun Fabrice Aneche + Faishal Manzar Farhaan Bukhsh favo@exoweb.net fdr @@ -302,21 +350,26 @@ answer newbie questions, and generally made Django that much better: Filip Noetzel Filip Wasilewski Finn Gruwier Larsen + Fiza Ashraf Flávio Juvenal da Silva Junior flavio.curella@gmail.com Florian Apolloner + Florian Demmer Florian Moussous + fnaimi66 Fran Hrženjak + Francesco Panico Francisco Albarran Cristobal Francisco Couzo François Freitag Frank Tegtmeyer Frank Wierzbicki Frank Wiles - František Malina + František Malina Fraser Nevett Gabriel Grant Gabriel Hurley + Gaël Utard gandalf@owca.info Garry Lawrence Garry Polley @@ -324,6 +377,7 @@ answer newbie questions, and generally made Django that much better: Gary Wilson Gasper Koren Gasper Zejn + Gav O'Connor Gavin Wahl Ge Hanbin geber@datacollect.com @@ -331,11 +385,13 @@ answer newbie questions, and generally made Django that much better: George Karpenkov George Song George Vilches + George Y. Kussumoto Georg "Hugo" Bauer Georgi Stanojevski Gerardo Orozco Gil Gonçalves Girish Kumar + Girish Sontakke Gisle Aas Glenn Maynard glin@seznam.cz @@ -345,6 +401,7 @@ answer newbie questions, and generally made Django that much better: Graham Carlyle Grant Jenks Greg Chapple + Greg Twohig Gregor Allensworth Gregor Müllegger Grigory Fateyev @@ -356,6 +413,8 @@ answer newbie questions, and generally made Django that much better: Hang Park Hannes Ljungberg Hannes Struß + Hao Dong + Harm Geerts Hasan Ramezani Hawkeye Helen Sherwood-Taylor @@ -365,6 +424,7 @@ answer newbie questions, and generally made Django that much better: Himanshu Chauhan hipertracker@gmail.com Hiroki Kiyohara + Hisham Mahmood Honza Král Horst Gutmann Hugo Osvaldo Barrera @@ -373,7 +433,6 @@ answer newbie questions, and generally made Django that much better: Iacopo Spalletti Ian A Wilson Ian Clelland - Ian G. Kelly Ian Holsman Ian Lee Ibon @@ -382,9 +441,11 @@ answer newbie questions, and generally made Django that much better: Ifedapo Olarewaju Igor Kolar Illia Volochii + Ilya Bass Ilya Semenov Ingo Klöcker I.S. van Oostveen + Iuri de Silvio ivan.chelubeev@gmail.com Ivan Sagalaev (Maniac) Jaap Roes @@ -392,23 +453,29 @@ answer newbie questions, and generally made Django that much better: Jacob Burch Jacob Green Jacob Kaplan-Moss + Jacob Rief + Jacob Walls + Jakub Bagiński Jakub Paczkowski Jakub Wilk Jakub Wiśniowski james_027@yahoo.com James Aylett James Bennett + James Gillard James Murty James Tauber James Timmins James Turk James Wheare + Jamie Matthews Jannis Leidel Janos Guljas Jan Pazdziora Jan Rademaker Jarek Głowacki Jarek Zgoda + Jarosław Wygoda Jason Davies (Esaj) Jason Huggins Jason McBrayer @@ -436,6 +503,8 @@ answer newbie questions, and generally made Django that much better: Jeremy Carbaugh Jeremy Dunck Jeremy Lainé + Jeremy Thompson + Jerin Peter George Jesse Young Jezeniel Zapanta jhenry @@ -446,12 +515,14 @@ answer newbie questions, and generally made Django that much better: Joao Oliveira Joao Pedro Silva Joe Heck + Joe Jackson Joel Bohman Joel Heenan Joel Watts Joe Topjian Johan C. Stöver Johann Queuniet + Johannes Westphal john@calixto.net John D'Agostino John D'Ambrosio @@ -461,12 +532,17 @@ answer newbie questions, and generally made Django that much better: John Shaffer Jökull Sólberg Auðunsson Jon Dufresne + Jon Janzen Jonas Haag + Jonas Lundberg + Jonathan Davis Jonatas C. D. Jonathan Buchanan Jonathan Daugherty (cygnus) Jonathan Feignberg Jonathan Slenders + Jonny Park + Jordan Bae Jordan Dimov Jordi J. Tablada Jorge Bastida @@ -486,6 +562,7 @@ answer newbie questions, and generally made Django that much better: Julia Elman Julia Matsieva Julian Bez + Julie Rymer Julien Phalip Junyoung Choi junzhang.jn@gmail.com @@ -496,28 +573,34 @@ answer newbie questions, and generally made Django that much better: Justin Michalicek Justin Myles Holmes Jyrki Pulliainen + Kacper Wolkiewicz Kadesarin Sanjek + Kapil Bansal Karderio Karen Tracey Karol Sikora + Kasun Herath Katherine “Kati” Michel Kathryn Killebrew Katie Miller Keith Bussell Kenneth Love Kent Hauser + Keryn Knight Kevin Grinberg Kevin Kubasik Kevin McConnell Kieran Holland kilian Kim Joon Hwan 김준환 + Kim Soung Ryoul 김성렬 Klaas van Schelven knox konrad@gwu.edu Kowito Charoenratchatabhan Krišjānis Vaiders krzysiek.pawlik@silvermedia.pl + Krzysztof Jagiello Krzysztof Jurewicz Krzysztof Kulewski kurtiss@meetro.com @@ -531,12 +614,14 @@ answer newbie questions, and generally made Django that much better: Leandra Finger Lee Reilly Lee Sanghyuck + Lemuel Sta Ana Leo "hylje" Honkanen Leo Shklovskii Leo Soto lerouxb@gmail.com Lex Berezhny Liang Feng + Lily Foote limodou Lincoln Smith Liu Yijie <007gzs@gmail.com> @@ -545,7 +630,9 @@ answer newbie questions, and generally made Django that much better: Lowe Thiderman Luan Pablo Lucas Connors + Lucas Esposito Luciano Ramalho + Lucidiot Ludvig Ericson Luis C. Berrocal Łukasz Langa @@ -557,22 +644,27 @@ answer newbie questions, and generally made Django that much better: Mads Jensen Makoto Tsuyuki Malcolm Tredinnick + Manav Agarwal Manuel Saelices Manuzhai Marc Aymerich Gubern Marc Egli Marcel Telka + Marcelo Galigniana Marc Fargas Marc Garcia Marcin Wróbel Marc Remolt + Marc Seguí Coll Marc Tamlyn Marc-Aurèle Brothier Marian Andre + Marijke Luttekes Marijn Vriens Mario Gonzalez Mariusz Felisiak Mark Biggers + Mark Evans Mark Gensler mark@junklight.com Mark Lavin @@ -587,7 +679,7 @@ answer newbie questions, and generally made Django that much better: Martin Mahner Martin Maney Martin von Gagern - Mart Sõmermaa + Mart Sõmermaa Marty Alchin Masashi Shibata masonsimon+django@gmail.com @@ -596,6 +688,7 @@ answer newbie questions, and generally made Django that much better: Mathieu Agopian Matías Bordese Matt Boersma + Matt Brewer Matt Croydon Matt Deacalion Stevens Matt Dennenbaum @@ -616,15 +709,19 @@ answer newbie questions, and generally made Django that much better: mattycakes@gmail.com Max Burstein Max Derkachev + Max Smolens Maxime Lorant + Maxime Toussaint Maxime Turcotte Maximilian Merz Maximillian Dornseif mccutchen@gmail.com + Meghana Bhange Meir Kriheli Michael S. Brown Michael Hall Michael Josephson + Michael Lissner Michael Manfre michael.mcewan@gmail.com Michael Placentra II @@ -640,6 +737,7 @@ answer newbie questions, and generally made Django that much better: Mihai Preda Mikaël Barbero Mike Axiak + Mike Edmunds Mike Grouchy Mike Malone Mike Richardson @@ -682,14 +780,20 @@ answer newbie questions, and generally made Django that much better: Nicola Larosa Nicolas Lara Nicolas Noé + Nikita Marchant + Nikita Sobolev + Nina Menezes Niran Babalola Nis Jørgensen Nowell Strite Nuno Mariz + Octavio Peri oggie rob oggy + Oguzhan Akan Oliver Beattie Oliver Rutherfurd + Olivier Le Thanh Duong Olivier Sels Olivier Tabone Orestis Markou @@ -697,6 +801,7 @@ answer newbie questions, and generally made Django that much better: Oscar Ramirez Ossama M. Khayat Owen Griffiths + Ömer Faruk Abacı Pablo Martín Panos Laganakos Paolo Melchiorre @@ -720,11 +825,13 @@ answer newbie questions, and generally made Django that much better: Petar Marić Pete Crosier peter@mymart.com + Peter DeVita Peter Sheats Peter van Kampen Peter Zsoldos Pete Shinners Petr Marhoun + Petter Strandmark pgross@thoughtworks.com phaedo phil.h.smith@gmail.com @@ -736,17 +843,23 @@ answer newbie questions, and generally made Django that much better: plisk polpak@yahoo.com pradeep.gowda@gmail.com + Prashant Pandey Preston Holmes Preston Timmons + Priyank Panchal Priyansh Saxena Przemysław Buczkowski Przemysław Suliga + Qi Zhao Rachel Tobin Rachel Willmer Radek Švarz + Rafael Giebisch Raffaele Salmaso + Rahmat Faisal Rajesh Dhawan Ramez Ashraf + Ramil Yanbulatov Ramin Farajpour Cami Ramiro Morales Ramon Saraiva @@ -779,9 +892,12 @@ answer newbie questions, and generally made Django that much better: Rob Nguyen Robin Munn Rodrigo Pinheiro Marques de Araújo + Rohith P R Romain Garrigues + Ronnie van den Crommenacker Ronny Haryanto Ross Poulton + Roxane Bellot Rozza Rudolph Froger Rudy Mutter @@ -790,6 +906,7 @@ answer newbie questions, and generally made Django that much better: Russell Keith-Magee Russ Webber Ryan Hall + Ryan Heard ryankanno Ryan Kelly Ryan Niemeyer @@ -802,6 +919,8 @@ answer newbie questions, and generally made Django that much better: Sander Dijkhuis Sanket Saurav Sanyam Khurana + Sarah Abderemane + Sarah Boyce Sarthak Mehrish schwank@gmail.com Scot Hacker @@ -822,9 +941,11 @@ answer newbie questions, and generally made Django that much better: Sergey Fedoseev Sergey Kolosov Seth Hill + Shafiya Adzhani Shai Berger Shannon -jj Behrens Shawn Milochik + Shreya Bamne Silvan Spross Simeon Visser Simon Blanchard @@ -839,6 +960,8 @@ answer newbie questions, and generally made Django that much better: sloonz smurf@smurf.noris.de sopel + Sreehari K V + Sridhar Marella Srinivas Reddy Thatiparthy Stanislas Guerra Stanislaus Madueke @@ -867,6 +990,7 @@ answer newbie questions, and generally made Django that much better: Takashi Matsuo Tareque Hossain Taylor Mitchell + tell-k Terry Huang thebjorn Thejaswi Puthraya @@ -880,11 +1004,14 @@ answer newbie questions, and generally made Django that much better: Thomas Stromberg Thomas Tanner tibimicu@gmx.net + Ties Jan Hefting Tim Allen Tim Givois Tim Graham Tim Heap + Tim McCurrach Tim Saylor + Toan Vuong Tobias Kunze Tobias McNulty tobias@neuyork.de @@ -894,6 +1021,7 @@ answer newbie questions, and generally made Django that much better: Tom Forbes Tom Insam Tom Tobin + Tom Wojcik Tomáš Ehrlich Tomáš Kopeček Tome Cvitan @@ -922,12 +1050,15 @@ answer newbie questions, and generally made Django that much better: Victor Andrée viestards.lists@gmail.com Viktor Danyliuk + Viktor Grabov Ville Säävuori Vinay Karanam Vinay Sajip Vincent Foley + Vinko Mlačić Vinny Do Vitaly Babiy + Vitaliy Yelnik Vladimir Kuzma Vlado Vsevolod Solovyov @@ -942,23 +1073,30 @@ answer newbie questions, and generally made Django that much better: Will Ayd William Schwartz Will Hardy + Will Zhao Wilson Miner Wim Glenn wojtek + Wu Haotian Xavier Francisco Xia Kai Yann Fouillat Yann Malet + Yash Jhunjhunwala Yasushi Masuda ye7cakf02@sneakemail.com ymasuda@ethercube.com Yoong Kang Lim + Yury V. Zaytsev Yusuke Miyazaki + Yves Weissig + yyyyyyyan Zac Hatfield-Dodds Zachary Voase Zach Liu Zach Thompson Zain Memon + Zain Patel Zak Johnson Žan Anderle Zbigniew Siciarz @@ -977,6 +1115,6 @@ A big THANK YOU goes to: Ian Bicking for convincing Adrian to ditch code generation. - Mark Pilgrim for "Dive Into Python" (https://www.diveinto.org/python3/). + Mark Pilgrim for "Dive Into Python" (https://diveintopython3.net/). Guido van Rossum for creating Python. diff --git a/Gruntfile.js b/Gruntfile.js index 2bf8a10c81b9..2d99041cb87c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,4 +1,6 @@ -var globalThreshold = 50; // Global code coverage threshold (as a percentage) +'use strict'; + +const globalThreshold = 50; // Global code coverage threshold (as a percentage) module.exports = function(grunt) { grunt.initConfig({ diff --git a/INSTALL b/INSTALL index 7c10946c87e9..389f88718678 100644 --- a/INSTALL +++ b/INSTALL @@ -1,6 +1,6 @@ Thanks for downloading Django. -To install it, make sure you have Python 3.6 or greater installed. Then run +To install it, make sure you have Python 3.12 or greater installed. Then run this command from the command prompt: python -m pip install . diff --git a/LICENSE.python b/LICENSE.python index 8e1c618235ae..2fc28e876fa1 100644 --- a/LICENSE.python +++ b/LICENSE.python @@ -13,12 +13,12 @@ A. HISTORY OF THE SOFTWARE ========================== Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands as a successor of a language called ABC. Guido remains Python's principal author, although it includes many contributions from others. In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software. @@ -30,7 +30,7 @@ https://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation was a sponsoring member of the PSF. -All Python releases are Open Source (see http://www.opensource.org for +All Python releases are Open Source (see https://opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases. @@ -70,6 +70,17 @@ direction to make these releases possible. B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON =============================================================== +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- @@ -83,10 +94,8 @@ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. +i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make @@ -191,9 +200,9 @@ version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following +Python 1.6.1 may be located on the internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet +Agreement may also be obtained from a proxy server on the internet using the following URL: http://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on @@ -263,3 +272,17 @@ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in index fecbae358b81..63c16094314a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -5,6 +5,7 @@ include LICENSE include LICENSE.python include MANIFEST.in include package.json +include tox.ini include *.rst graft django graft docs @@ -12,5 +13,4 @@ graft extras graft js_tests graft scripts graft tests -global-exclude __pycache__ global-exclude *.py[co] diff --git a/README.rst b/README.rst index 4302f10ad505..b7532e6b5ad3 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Django ====== -Django is a high-level Python Web framework that encourages rapid development +Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Thanks for checking it out. All documentation is in the "``docs``" directory and online at @@ -29,11 +29,9 @@ ticket here: https://code.djangoproject.com/newticket To get more help: -* Join the ``#django`` channel on irc.freenode.net. Lots of helpful people hang - out there. See https://freenode.net/kb/answer/chat if you're new to IRC. +* Join the `Django Discord community `_. -* Join the django-users mailing list, or read the archives, at - https://groups.google.com/group/django-users. +* Join the community on the `Django Forum `_. To contribute to Django: @@ -45,3 +43,10 @@ To run Django's test suite: * Follow the instructions in the "Unit tests" section of ``docs/internals/contributing/writing-code/unit-tests.txt``, published online at https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/#running-the-unit-tests + +Supporting the Development of Django +==================================== + +Django's development depends on your contributions. + +If you depend on Django, remember to support the Django Software Foundation: https://www.djangoproject.com/fundraising/ diff --git a/django/__init__.py b/django/__init__.py index c6bda275109a..19d8b64198a2 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -1,6 +1,6 @@ from django.utils.version import get_version -VERSION = (3, 2, 0, 'alpha', 0) +VERSION = (6, 0, 0, "alpha", 0) __version__ = get_version(VERSION) @@ -19,6 +19,6 @@ def setup(set_prefix=True): configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) if set_prefix: set_script_prefix( - '/' if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME + "/" if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME ) apps.populate(settings.INSTALLED_APPS) diff --git a/django/__main__.py b/django/__main__.py index 8b96e91ea855..741514384822 100644 --- a/django/__main__.py +++ b/django/__main__.py @@ -3,6 +3,7 @@ Example: python -m django check """ + from django.core import management if __name__ == "__main__": diff --git a/django/apps/__init__.py b/django/apps/__init__.py index 79091dc535b4..96674be73cd0 100644 --- a/django/apps/__init__.py +++ b/django/apps/__init__.py @@ -1,4 +1,4 @@ from .config import AppConfig from .registry import apps -__all__ = ['AppConfig', 'apps'] +__all__ = ["AppConfig", "apps"] diff --git a/django/apps/config.py b/django/apps/config.py index 2728503d6283..28e50e52252f 100644 --- a/django/apps/config.py +++ b/django/apps/config.py @@ -1,10 +1,13 @@ +import inspect import os from importlib import import_module from django.core.exceptions import ImproperlyConfigured -from django.utils.module_loading import module_has_submodule +from django.utils.functional import cached_property +from django.utils.module_loading import import_string, module_has_submodule -MODELS_MODULE_NAME = 'models' +APPS_MODULE_NAME = "apps" +MODELS_MODULE_NAME = "models" class AppConfig: @@ -27,16 +30,20 @@ def __init__(self, app_name, app_module): # Last component of the Python path to the application e.g. 'admin'. # This value must be unique across a Django project. - if not hasattr(self, 'label'): + if not hasattr(self, "label"): self.label = app_name.rpartition(".")[2] + if not self.label.isidentifier(): + raise ImproperlyConfigured( + "The app label '%s' is not a valid Python identifier." % self.label + ) # Human-readable name for the application e.g. "Admin". - if not hasattr(self, 'verbose_name'): + if not hasattr(self, "verbose_name"): self.verbose_name = self.label.title() # Filesystem path to the application directory e.g. # '/path/to/django/contrib/admin'. - if not hasattr(self, 'path'): + if not hasattr(self, "path"): self.path = self._path_from_module(app_module) # Module containing models e.g. ' % (self.__class__.__name__, self.label) + return "<%s: %s>" % (self.__class__.__name__, self.label) + + @cached_property + def default_auto_field(self): + from django.conf import settings + + return settings.DEFAULT_AUTO_FIELD + + @property + def _is_default_auto_field_overridden(self): + return self.__class__.default_auto_field is not AppConfig.default_auto_field def _path_from_module(self, module): """Attempt to determine app's filesystem path from its module.""" # See #21874 for extended discussion of the behavior of this method in # various cases. - # Convert paths to list because Python's _NamespacePath doesn't support - # indexing. - paths = list(getattr(module, '__path__', [])) + # Convert to list because __path__ may not support indexing. + paths = list(getattr(module, "__path__", [])) if len(paths) != 1: - filename = getattr(module, '__file__', None) + filename = getattr(module, "__file__", None) if filename is not None: paths = [os.path.dirname(filename)] else: @@ -70,12 +86,14 @@ def _path_from_module(self, module): raise ImproperlyConfigured( "The app module %r has multiple filesystem locations (%r); " "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % (module, paths)) + "with a 'path' class attribute." % (module, paths) + ) elif not paths: raise ImproperlyConfigured( "The app module %r has no filesystem location, " "you must configure this app with an AppConfig subclass " - "with a 'path' class attribute." % module) + "with a 'path' class attribute." % module + ) return paths[0] @classmethod @@ -83,86 +101,125 @@ def create(cls, entry): """ Factory that creates an app config from an entry in INSTALLED_APPS. """ - try: - # If import_module succeeds, entry is a path to an app module, - # which may specify an app config class with default_app_config. - # Otherwise, entry is a path to an app config class or an error. - module = import_module(entry) - - except ImportError: - # Track that importing as an app module failed. If importing as an - # app config class fails too, we'll trigger the ImportError again. - module = None - - mod_path, _, cls_name = entry.rpartition('.') - - # Raise the original exception when entry cannot be a path to an - # app config class. - if not mod_path: - raise + # create() eventually returns app_config_class(app_name, app_module). + app_config_class = None + app_name = None + app_module = None + # If import_module succeeds, entry points to the app module. + try: + app_module = import_module(entry) + except Exception: + pass else: + # If app_module has an apps submodule that defines a single + # AppConfig subclass, use it automatically. + # To prevent this, an AppConfig subclass can declare a class + # variable default = False. + # If the apps module defines more than one AppConfig subclass, + # the default one can declare default = True. + if module_has_submodule(app_module, APPS_MODULE_NAME): + mod_path = "%s.%s" % (entry, APPS_MODULE_NAME) + mod = import_module(mod_path) + # Check if there's exactly one AppConfig candidate, + # excluding those that explicitly define default = False. + app_configs = [ + (name, candidate) + for name, candidate in inspect.getmembers(mod, inspect.isclass) + if ( + issubclass(candidate, cls) + and candidate is not cls + and getattr(candidate, "default", True) + ) + ] + if len(app_configs) == 1: + app_config_class = app_configs[0][1] + else: + # Check if there's exactly one AppConfig subclass, + # among those that explicitly define default = True. + app_configs = [ + (name, candidate) + for name, candidate in app_configs + if getattr(candidate, "default", False) + ] + if len(app_configs) > 1: + candidates = [repr(name) for name, _ in app_configs] + raise RuntimeError( + "%r declares more than one default AppConfig: " + "%s." % (mod_path, ", ".join(candidates)) + ) + elif len(app_configs) == 1: + app_config_class = app_configs[0][1] + + # Use the default app config class if we didn't find anything. + if app_config_class is None: + app_config_class = cls + app_name = entry + + # If import_string succeeds, entry is an app config class. + if app_config_class is None: try: - # If this works, the app module specifies an app config class. - entry = module.default_app_config - except AttributeError: - # Otherwise, it simply uses the default app config class. - return cls(entry, module) - else: - mod_path, _, cls_name = entry.rpartition('.') - - # If we're reaching this point, we must attempt to load the app config - # class located at . - mod = import_module(mod_path) - try: - cls = getattr(mod, cls_name) - except AttributeError: - if module is None: - # If importing as an app module failed, check if the module - # contains any valid AppConfigs and show them as choices. - # Otherwise, that error probably contains the most informative - # traceback, so trigger it again. - candidates = sorted( - repr(name) for name, candidate in mod.__dict__.items() - if isinstance(candidate, type) and - issubclass(candidate, AppConfig) and - candidate is not AppConfig + app_config_class = import_string(entry) + except Exception: + pass + # If both import_module and import_string failed, it means that entry + # doesn't have a valid value. + if app_module is None and app_config_class is None: + # If the last component of entry starts with an uppercase letter, + # then it was likely intended to be an app config class; if not, + # an app module. Provide a nice error message in both cases. + mod_path, _, cls_name = entry.rpartition(".") + if mod_path and cls_name[0].isupper(): + # We could simply re-trigger the string import exception, but + # we're going the extra mile and providing a better error + # message for typos in INSTALLED_APPS. + # This may raise ImportError, which is the best exception + # possible if the module at mod_path cannot be imported. + mod = import_module(mod_path) + candidates = [ + repr(name) + for name, candidate in inspect.getmembers(mod, inspect.isclass) + if issubclass(candidate, cls) and candidate is not cls + ] + msg = "Module '%s' does not contain a '%s' class." % ( + mod_path, + cls_name, ) if candidates: - raise ImproperlyConfigured( - "'%s' does not contain a class '%s'. Choices are: %s." - % (mod_path, cls_name, ', '.join(candidates)) - ) - import_module(entry) + msg += " Choices are: %s." % ", ".join(candidates) + raise ImportError(msg) else: - raise + # Re-trigger the module import exception. + import_module(entry) # Check for obvious errors. (This check prevents duck typing, but # it could be removed if it became a problem in practice.) - if not issubclass(cls, AppConfig): - raise ImproperlyConfigured( - "'%s' isn't a subclass of AppConfig." % entry) + if not issubclass(app_config_class, AppConfig): + raise ImproperlyConfigured("'%s' isn't a subclass of AppConfig." % entry) # Obtain app name here rather than in AppClass.__init__ to keep # all error checking for entries in INSTALLED_APPS in one place. - try: - app_name = cls.name - except AttributeError: - raise ImproperlyConfigured( - "'%s' must supply a name attribute." % entry) + if app_name is None: + try: + app_name = app_config_class.name + except AttributeError: + raise ImproperlyConfigured("'%s' must supply a name attribute." % entry) # Ensure app_name points to a valid module. try: app_module = import_module(app_name) except ImportError: raise ImproperlyConfigured( - "Cannot import '%s'. Check that '%s.%s.name' is correct." % ( - app_name, mod_path, cls_name, + "Cannot import '%s'. Check that '%s.%s.name' is correct." + % ( + app_name, + app_config_class.__module__, + app_config_class.__qualname__, ) ) # Entry is a path to an app config class. - return cls(app_name, app_module) + return app_config_class(app_name, app_module) def get_model(self, model_name, require_ready=True): """ @@ -178,7 +235,8 @@ def get_model(self, model_name, require_ready=True): return self.models[model_name.lower()] except KeyError: raise LookupError( - "App '%s' doesn't have a '%s' model." % (self.label, model_name)) + "App '%s' doesn't have a '%s' model." % (self.label, model_name) + ) def get_models(self, include_auto_created=False, include_swapped=False): """ @@ -207,7 +265,7 @@ def import_models(self): self.models = self.apps.all_models[self.label] if module_has_submodule(self.module, MODELS_MODULE_NAME): - models_module_name = '%s.%s' % (self.name, MODELS_MODULE_NAME) + models_module_name = "%s.%s" % (self.name, MODELS_MODULE_NAME) self.models_module = import_module(models_module_name) def ready(self): diff --git a/django/apps/registry.py b/django/apps/registry.py index 408964a146b1..92de6075fc90 100644 --- a/django/apps/registry.py +++ b/django/apps/registry.py @@ -18,10 +18,10 @@ class Apps: """ def __init__(self, installed_apps=()): - # installed_apps is set to None when creating the master registry + # installed_apps is set to None when creating the main registry # because it cannot be populated at that point. Other registries must # provide a list of installed apps and are populated immediately. - if installed_apps is None and hasattr(sys.modules[__name__], 'apps'): + if installed_apps is None and hasattr(sys.modules[__name__], "apps"): raise RuntimeError("You must supply an installed_apps argument.") # Mapping of app labels => model names => model classes. Every time a @@ -54,7 +54,7 @@ def __init__(self, installed_apps=()): # `lazy_model_operation()` and `do_pending_operations()` methods. self._pending_operations = defaultdict(list) - # Populate apps and models, unless it's the master registry. + # Populate apps and models, unless it's the main registry. if installed_apps is not None: self.populate(installed_apps) @@ -92,20 +92,22 @@ def populate(self, installed_apps=None): if app_config.label in self.app_configs: raise ImproperlyConfigured( "Application labels aren't unique, " - "duplicates: %s" % app_config.label) + "duplicates: %s" % app_config.label + ) self.app_configs[app_config.label] = app_config app_config.apps = self # Check for duplicate app names. counts = Counter( - app_config.name for app_config in self.app_configs.values()) - duplicates = [ - name for name, count in counts.most_common() if count > 1] + app_config.name for app_config in self.app_configs.values() + ) + duplicates = [name for name, count in counts.most_common() if count > 1] if duplicates: raise ImproperlyConfigured( "Application names aren't unique, " - "duplicates: %s" % ", ".join(duplicates)) + "duplicates: %s" % ", ".join(duplicates) + ) self.apps_ready = True @@ -128,6 +130,7 @@ def check_apps_ready(self): """Raise an exception if all apps haven't been imported yet.""" if not self.apps_ready: from django.conf import settings + # If "not ready" is due to unconfigured settings, accessing # INSTALLED_APPS raises a more helpful ImproperlyConfigured # exception. @@ -162,7 +165,7 @@ def get_app_config(self, app_label): raise LookupError(message) # This method is performance-critical at least for Django's test suite. - @functools.lru_cache(maxsize=None) + @functools.cache def get_models(self, include_auto_created=False, include_swapped=False): """ Return a list of all installed models. @@ -200,7 +203,7 @@ def get_model(self, app_label, model_name=None, require_ready=True): self.check_apps_ready() if model_name is None: - app_label, model_name = app_label.split('.') + app_label, model_name = app_label.split(".") app_config = self.get_app_config(app_label) @@ -216,17 +219,22 @@ def register_model(self, app_label, model): model_name = model._meta.model_name app_models = self.all_models[app_label] if model_name in app_models: - if (model.__name__ == app_models[model_name].__name__ and - model.__module__ == app_models[model_name].__module__): + if ( + model.__name__ == app_models[model_name].__name__ + and model.__module__ == app_models[model_name].__module__ + ): warnings.warn( - "Model '%s.%s' was already registered. " - "Reloading models is not advised as it can lead to inconsistencies, " - "most notably with related models." % (app_label, model_name), - RuntimeWarning, stacklevel=2) + "Model '%s.%s' was already registered. Reloading models is not " + "advised as it can lead to inconsistencies, most notably with " + "related models." % (app_label, model_name), + RuntimeWarning, + stacklevel=2, + ) else: raise RuntimeError( - "Conflicting '%s' models in application '%s': %s and %s." % - (model_name, app_label, app_models[model_name], model)) + "Conflicting '%s' models in application '%s': %s and %s." + % (model_name, app_label, app_models[model_name], model) + ) app_models[model_name] = model self.do_pending_operations(model) self.clear_cache() @@ -253,8 +261,8 @@ def get_containing_app_config(self, object_name): candidates = [] for app_config in self.app_configs.values(): if object_name.startswith(app_config.name): - subpath = object_name[len(app_config.name):] - if subpath == '' or subpath[0] == '.': + subpath = object_name.removeprefix(app_config.name) + if subpath == "" or subpath[0] == ".": candidates.append(app_config) if candidates: return sorted(candidates, key=lambda ac: -len(ac.name))[0] @@ -269,29 +277,29 @@ def get_registered_model(self, app_label, model_name): """ model = self.all_models[app_label].get(model_name.lower()) if model is None: - raise LookupError( - "Model '%s.%s' not registered." % (app_label, model_name)) + raise LookupError("Model '%s.%s' not registered." % (app_label, model_name)) return model - @functools.lru_cache(maxsize=None) + @functools.cache def get_swappable_settings_name(self, to_string): """ For a given model string (e.g. "auth.User"), return the name of the corresponding settings name if it refers to a swappable model. If the referred model is not swappable, return None. - This method is decorated with lru_cache because it's performance + This method is decorated with @functools.cache because it's performance critical when it comes to migrations. Since the swappable settings don't change after Django has loaded the settings, there is no reason to get the respective settings attribute over and over again. """ + to_string = to_string.lower() for model in self.get_models(include_swapped=True): swapped = model._meta.swapped # Is this model swapped out for the model given by to_string? - if swapped and swapped == to_string: + if swapped and swapped.lower() == to_string: return model._meta.swappable # Is this model swappable and the one given by to_string? - if model._meta.swappable and model._meta.label == to_string: + if model._meta.swappable and model._meta.label_lower == to_string: return model._meta.swappable return None @@ -365,6 +373,7 @@ def clear_cache(self): This is mostly used in tests. """ + self.get_swappable_settings_name.cache_clear() # Call expire cache on each model. This will purge # the relation tree and the fields cache. self.get_models.cache_clear() @@ -401,6 +410,7 @@ def lazy_model_operation(self, function, *model_keys): def apply_next_model(model): next_function = partial(apply_next_model.func, model) self.lazy_model_operation(next_function, *more_models) + apply_next_model.func = function # If the model has already been imported and registered, partially diff --git a/django/bin/django-admin.py b/django/bin/django-admin.py deleted file mode 100755 index 594b0f11db53..000000000000 --- a/django/bin/django-admin.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python -# When the django-admin.py deprecation ends, remove this script. -import warnings - -from django.core import management - -try: - from django.utils.deprecation import RemovedInDjango40Warning -except ImportError: - raise ImportError( - 'django-admin.py was deprecated in Django 3.1 and removed in Django ' - '4.0. Please manually remove this script from your virtual environment ' - 'and use django-admin instead.' - ) - -if __name__ == "__main__": - warnings.warn( - 'django-admin.py is deprecated in favor of django-admin.', - RemovedInDjango40Warning, - ) - management.execute_from_command_line() diff --git a/django/conf/__init__.py b/django/conf/__init__.py index ec7efadf46b1..6b5f044e3449 100644 --- a/django/conf/__init__.py +++ b/django/conf/__init__.py @@ -15,17 +15,12 @@ import django from django.conf import global_settings -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.core.validators import URLValidator -from django.utils.deprecation import RemovedInDjango40Warning +from django.core.exceptions import ImproperlyConfigured from django.utils.functional import LazyObject, empty ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE" - -PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG = ( - 'The PASSWORD_RESET_TIMEOUT_DAYS setting is deprecated. Use ' - 'PASSWORD_RESET_TIMEOUT instead.' -) +DEFAULT_STORAGE_ALIAS = "default" +STATICFILES_STORAGE_ALIAS = "staticfiles" class SettingsReference(str): @@ -33,6 +28,7 @@ class SettingsReference(str): String subclass which references a current settings value. It's treated as the value in memory but serializes to a settings.NAME attribute reference. """ + def __new__(self, value, setting_name): return str.__new__(self, value) @@ -46,6 +42,7 @@ class LazySettings(LazyObject): The user can manually configure settings prior to using them. Otherwise, Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE. """ + def _setup(self, name=None): """ Load the settings module pointed to by the environment variable. This @@ -59,23 +56,33 @@ def _setup(self, name=None): "Requested %s, but settings are not configured. " "You must either define the environment variable %s " "or call settings.configure() before accessing settings." - % (desc, ENVIRONMENT_VARIABLE)) + % (desc, ENVIRONMENT_VARIABLE) + ) self._wrapped = Settings(settings_module) def __repr__(self): # Hardcode the class name as otherwise it yields 'Settings'. if self._wrapped is empty: - return '' + return "" return '' % { - 'settings_module': self._wrapped.SETTINGS_MODULE, + "settings_module": self._wrapped.SETTINGS_MODULE, } def __getattr__(self, name): """Return the value of a setting and cache it in self.__dict__.""" - if self._wrapped is empty: + if (_wrapped := self._wrapped) is empty: self._setup(name) - val = getattr(self._wrapped, name) + _wrapped = self._wrapped + val = getattr(_wrapped, name) + + # Special case some settings which require further modification. + # This is done here for performance reasons so the modified value is cached. + if name in {"MEDIA_URL", "STATIC_URL"} and val is not None: + val = self._add_script_prefix(val) + elif name == "SECRET_KEY" and not val: + raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") + self.__dict__[name] = val return val @@ -84,7 +91,7 @@ def __setattr__(self, name, value): Set the value of setting. Clear all cached values if _wrapped changes (@override_settings does this) or clear single values when set. """ - if name == '_wrapped': + if name == "_wrapped": self.__dict__.clear() else: self.__dict__.pop(name, None) @@ -102,11 +109,11 @@ def configure(self, default_settings=global_settings, **options): argument must support attribute access (__getattr__)). """ if self._wrapped is not empty: - raise RuntimeError('Settings already configured.') + raise RuntimeError("Settings already configured.") holder = UserSettingsHolder(default_settings) for name, value in options.items(): if not name.isupper(): - raise TypeError('Setting %r must be uppercase.' % name) + raise TypeError("Setting %r must be uppercase." % name) setattr(holder, name, value) self._wrapped = holder @@ -118,44 +125,26 @@ def _add_script_prefix(value): Useful when the app is being served at a subpath and manually prefixing subpath to STATIC_URL and MEDIA_URL in settings is inconvenient. """ - # Don't apply prefix to valid URLs. - try: - URLValidator()(value) - return value - except (ValidationError, AttributeError): - pass - # Don't apply prefix to absolute paths. - if value.startswith('/'): + # Don't apply prefix to absolute paths and URLs. + if value.startswith(("http://", "https://", "/")): return value from django.urls import get_script_prefix - return '%s%s' % (get_script_prefix(), value) + + return "%s%s" % (get_script_prefix(), value) @property def configured(self): """Return True if the settings have already been configured.""" return self._wrapped is not empty - @property - def PASSWORD_RESET_TIMEOUT_DAYS(self): + def _show_deprecation_warning(self, message, category): stack = traceback.extract_stack() # Show a warning if the setting is used outside of Django. - # Stack index: -1 this line, -2 the caller. - filename, _, _, _ = stack[-2] + # Stack index: -1 this line, -2 the property, -3 the + # LazyObject __getattribute__(), -4 the caller. + filename, _, _, _ = stack[-4] if not filename.startswith(os.path.dirname(django.__file__)): - warnings.warn( - PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, - RemovedInDjango40Warning, - stacklevel=2, - ) - return self.__getattr__('PASSWORD_RESET_TIMEOUT_DAYS') - - @property - def STATIC_URL(self): - return self._add_script_prefix(self.__getattr__('STATIC_URL')) - - @property - def MEDIA_URL(self): - return self._add_script_prefix(self.__getattr__('MEDIA_URL')) + warnings.warn(message, category, stacklevel=2) class Settings: @@ -171,43 +160,36 @@ def __init__(self, settings_module): mod = importlib.import_module(self.SETTINGS_MODULE) tuple_settings = ( + "ALLOWED_HOSTS", "INSTALLED_APPS", "TEMPLATE_DIRS", "LOCALE_PATHS", + "SECRET_KEY_FALLBACKS", ) self._explicit_settings = set() for setting in dir(mod): if setting.isupper(): setting_value = getattr(mod, setting) - if (setting in tuple_settings and - not isinstance(setting_value, (list, tuple))): - raise ImproperlyConfigured("The %s setting must be a list or a tuple. " % setting) + if setting in tuple_settings and not isinstance( + setting_value, (list, tuple) + ): + raise ImproperlyConfigured( + "The %s setting must be a list or a tuple." % setting + ) setattr(self, setting, setting_value) self._explicit_settings.add(setting) - if not self.SECRET_KEY: - raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") - - if self.is_overridden('PASSWORD_RESET_TIMEOUT_DAYS'): - if self.is_overridden('PASSWORD_RESET_TIMEOUT'): - raise ImproperlyConfigured( - 'PASSWORD_RESET_TIMEOUT_DAYS/PASSWORD_RESET_TIMEOUT are ' - 'mutually exclusive.' - ) - setattr(self, 'PASSWORD_RESET_TIMEOUT', self.PASSWORD_RESET_TIMEOUT_DAYS * 60 * 60 * 24) - warnings.warn(PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, RemovedInDjango40Warning) - - if hasattr(time, 'tzset') and self.TIME_ZONE: + if hasattr(time, "tzset") and self.TIME_ZONE: # When we can, attempt to validate the timezone. If we can't find # this file, no check happens and it's harmless. - zoneinfo_root = Path('/usr/share/zoneinfo') - zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split('/')) + zoneinfo_root = Path("/usr/share/zoneinfo") + zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/")) if zoneinfo_root.exists() and not zone_info_file.exists(): raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE) # Move the time zone info into os.environ. See ticket #2315 for why # we don't do this unconditionally (breaks Windows). - os.environ['TZ'] = self.TIME_ZONE + os.environ["TZ"] = self.TIME_ZONE time.tzset() def is_overridden(self, setting): @@ -215,13 +197,14 @@ def is_overridden(self, setting): def __repr__(self): return '<%(cls)s "%(settings_module)s">' % { - 'cls': self.__class__.__name__, - 'settings_module': self.SETTINGS_MODULE, + "cls": self.__class__.__name__, + "settings_module": self.SETTINGS_MODULE, } class UserSettingsHolder: """Holder for user configured settings.""" + # SETTINGS_MODULE doesn't make much sense in the manually configured # (standalone) case. SETTINGS_MODULE = None @@ -231,7 +214,7 @@ def __init__(self, default_settings): Requests for configuration variables not in this class are satisfied from the module specified in default_settings (if possible). """ - self.__dict__['_deleted'] = set() + self.__dict__["_deleted"] = set() self.default_settings = default_settings def __getattr__(self, name): @@ -241,9 +224,6 @@ def __getattr__(self, name): def __setattr__(self, name, value): self._deleted.discard(name) - if name == 'PASSWORD_RESET_TIMEOUT_DAYS': - setattr(self, 'PASSWORD_RESET_TIMEOUT', value * 60 * 60 * 24) - warnings.warn(PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSG, RemovedInDjango40Warning) super().__setattr__(name, value) def __delattr__(self, name): @@ -253,19 +233,22 @@ def __delattr__(self, name): def __dir__(self): return sorted( - s for s in [*self.__dict__, *dir(self.default_settings)] + s + for s in [*self.__dict__, *dir(self.default_settings)] if s not in self._deleted ) def is_overridden(self, setting): - deleted = (setting in self._deleted) - set_locally = (setting in self.__dict__) - set_on_default = getattr(self.default_settings, 'is_overridden', lambda s: False)(setting) + deleted = setting in self._deleted + set_locally = setting in self.__dict__ + set_on_default = getattr( + self.default_settings, "is_overridden", lambda s: False + )(setting) return deleted or set_locally or set_on_default def __repr__(self): - return '<%(cls)s>' % { - 'cls': self.__class__.__name__, + return "<%(cls)s>" % { + "cls": self.__class__.__name__, } diff --git a/django/conf/app_template/apps.py-tpl b/django/conf/app_template/apps.py-tpl index 9b2ce5289c52..b70535218120 100644 --- a/django/conf/app_template/apps.py-tpl +++ b/django/conf/app_template/apps.py-tpl @@ -2,4 +2,5 @@ from django.apps import AppConfig class {{ camel_case_app_name }}Config(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' name = '{{ app_name }}' diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index 0ab3fb9fb96e..536bbb7c45e5 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -21,8 +21,8 @@ def gettext_noop(s): # on a live site. DEBUG_PROPAGATE_EXCEPTIONS = False -# People who get code error notifications. -# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] +# People who get code error notifications. In the format +# [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] ADMINS = [] # List of IP addresses, as strings, that: @@ -38,115 +38,122 @@ def gettext_noop(s): # https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all # systems may support all possibilities). When USE_TZ is True, this is # interpreted as the default user time zone. -TIME_ZONE = 'America/Chicago' +TIME_ZONE = "America/Chicago" # If you set this to True, Django will use timezone-aware datetimes. -USE_TZ = False +USE_TZ = True -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en-us' +# Language code for this installation. Valid choices can be found here: +# https://www.iana.org/assignments/language-subtag-registry/ +# If LANGUAGE_CODE is not listed in LANGUAGES (below), the project must +# provide the necessary translations and locale definitions. +LANGUAGE_CODE = "en-us" # Languages we provide translations for, out of the box. LANGUAGES = [ - ('af', gettext_noop('Afrikaans')), - ('ar', gettext_noop('Arabic')), - ('ar-dz', gettext_noop('Algerian Arabic')), - ('ast', gettext_noop('Asturian')), - ('az', gettext_noop('Azerbaijani')), - ('bg', gettext_noop('Bulgarian')), - ('be', gettext_noop('Belarusian')), - ('bn', gettext_noop('Bengali')), - ('br', gettext_noop('Breton')), - ('bs', gettext_noop('Bosnian')), - ('ca', gettext_noop('Catalan')), - ('cs', gettext_noop('Czech')), - ('cy', gettext_noop('Welsh')), - ('da', gettext_noop('Danish')), - ('de', gettext_noop('German')), - ('dsb', gettext_noop('Lower Sorbian')), - ('el', gettext_noop('Greek')), - ('en', gettext_noop('English')), - ('en-au', gettext_noop('Australian English')), - ('en-gb', gettext_noop('British English')), - ('eo', gettext_noop('Esperanto')), - ('es', gettext_noop('Spanish')), - ('es-ar', gettext_noop('Argentinian Spanish')), - ('es-co', gettext_noop('Colombian Spanish')), - ('es-mx', gettext_noop('Mexican Spanish')), - ('es-ni', gettext_noop('Nicaraguan Spanish')), - ('es-ve', gettext_noop('Venezuelan Spanish')), - ('et', gettext_noop('Estonian')), - ('eu', gettext_noop('Basque')), - ('fa', gettext_noop('Persian')), - ('fi', gettext_noop('Finnish')), - ('fr', gettext_noop('French')), - ('fy', gettext_noop('Frisian')), - ('ga', gettext_noop('Irish')), - ('gd', gettext_noop('Scottish Gaelic')), - ('gl', gettext_noop('Galician')), - ('he', gettext_noop('Hebrew')), - ('hi', gettext_noop('Hindi')), - ('hr', gettext_noop('Croatian')), - ('hsb', gettext_noop('Upper Sorbian')), - ('hu', gettext_noop('Hungarian')), - ('hy', gettext_noop('Armenian')), - ('ia', gettext_noop('Interlingua')), - ('id', gettext_noop('Indonesian')), - ('io', gettext_noop('Ido')), - ('is', gettext_noop('Icelandic')), - ('it', gettext_noop('Italian')), - ('ja', gettext_noop('Japanese')), - ('ka', gettext_noop('Georgian')), - ('kab', gettext_noop('Kabyle')), - ('kk', gettext_noop('Kazakh')), - ('km', gettext_noop('Khmer')), - ('kn', gettext_noop('Kannada')), - ('ko', gettext_noop('Korean')), - ('ky', gettext_noop('Kyrgyz')), - ('lb', gettext_noop('Luxembourgish')), - ('lt', gettext_noop('Lithuanian')), - ('lv', gettext_noop('Latvian')), - ('mk', gettext_noop('Macedonian')), - ('ml', gettext_noop('Malayalam')), - ('mn', gettext_noop('Mongolian')), - ('mr', gettext_noop('Marathi')), - ('my', gettext_noop('Burmese')), - ('nb', gettext_noop('Norwegian Bokmål')), - ('ne', gettext_noop('Nepali')), - ('nl', gettext_noop('Dutch')), - ('nn', gettext_noop('Norwegian Nynorsk')), - ('os', gettext_noop('Ossetic')), - ('pa', gettext_noop('Punjabi')), - ('pl', gettext_noop('Polish')), - ('pt', gettext_noop('Portuguese')), - ('pt-br', gettext_noop('Brazilian Portuguese')), - ('ro', gettext_noop('Romanian')), - ('ru', gettext_noop('Russian')), - ('sk', gettext_noop('Slovak')), - ('sl', gettext_noop('Slovenian')), - ('sq', gettext_noop('Albanian')), - ('sr', gettext_noop('Serbian')), - ('sr-latn', gettext_noop('Serbian Latin')), - ('sv', gettext_noop('Swedish')), - ('sw', gettext_noop('Swahili')), - ('ta', gettext_noop('Tamil')), - ('te', gettext_noop('Telugu')), - ('tg', gettext_noop('Tajik')), - ('th', gettext_noop('Thai')), - ('tr', gettext_noop('Turkish')), - ('tt', gettext_noop('Tatar')), - ('udm', gettext_noop('Udmurt')), - ('uk', gettext_noop('Ukrainian')), - ('ur', gettext_noop('Urdu')), - ('uz', gettext_noop('Uzbek')), - ('vi', gettext_noop('Vietnamese')), - ('zh-hans', gettext_noop('Simplified Chinese')), - ('zh-hant', gettext_noop('Traditional Chinese')), + ("af", gettext_noop("Afrikaans")), + ("ar", gettext_noop("Arabic")), + ("ar-dz", gettext_noop("Algerian Arabic")), + ("ast", gettext_noop("Asturian")), + ("az", gettext_noop("Azerbaijani")), + ("bg", gettext_noop("Bulgarian")), + ("be", gettext_noop("Belarusian")), + ("bn", gettext_noop("Bengali")), + ("br", gettext_noop("Breton")), + ("bs", gettext_noop("Bosnian")), + ("ca", gettext_noop("Catalan")), + ("ckb", gettext_noop("Central Kurdish (Sorani)")), + ("cs", gettext_noop("Czech")), + ("cy", gettext_noop("Welsh")), + ("da", gettext_noop("Danish")), + ("de", gettext_noop("German")), + ("dsb", gettext_noop("Lower Sorbian")), + ("el", gettext_noop("Greek")), + ("en", gettext_noop("English")), + ("en-au", gettext_noop("Australian English")), + ("en-gb", gettext_noop("British English")), + ("eo", gettext_noop("Esperanto")), + ("es", gettext_noop("Spanish")), + ("es-ar", gettext_noop("Argentinian Spanish")), + ("es-co", gettext_noop("Colombian Spanish")), + ("es-mx", gettext_noop("Mexican Spanish")), + ("es-ni", gettext_noop("Nicaraguan Spanish")), + ("es-ve", gettext_noop("Venezuelan Spanish")), + ("et", gettext_noop("Estonian")), + ("eu", gettext_noop("Basque")), + ("fa", gettext_noop("Persian")), + ("fi", gettext_noop("Finnish")), + ("fr", gettext_noop("French")), + ("fy", gettext_noop("Frisian")), + ("ga", gettext_noop("Irish")), + ("gd", gettext_noop("Scottish Gaelic")), + ("gl", gettext_noop("Galician")), + ("he", gettext_noop("Hebrew")), + ("hi", gettext_noop("Hindi")), + ("hr", gettext_noop("Croatian")), + ("hsb", gettext_noop("Upper Sorbian")), + ("hu", gettext_noop("Hungarian")), + ("hy", gettext_noop("Armenian")), + ("ia", gettext_noop("Interlingua")), + ("id", gettext_noop("Indonesian")), + ("ig", gettext_noop("Igbo")), + ("io", gettext_noop("Ido")), + ("is", gettext_noop("Icelandic")), + ("it", gettext_noop("Italian")), + ("ja", gettext_noop("Japanese")), + ("ka", gettext_noop("Georgian")), + ("kab", gettext_noop("Kabyle")), + ("kk", gettext_noop("Kazakh")), + ("km", gettext_noop("Khmer")), + ("kn", gettext_noop("Kannada")), + ("ko", gettext_noop("Korean")), + ("ky", gettext_noop("Kyrgyz")), + ("lb", gettext_noop("Luxembourgish")), + ("lt", gettext_noop("Lithuanian")), + ("lv", gettext_noop("Latvian")), + ("mk", gettext_noop("Macedonian")), + ("ml", gettext_noop("Malayalam")), + ("mn", gettext_noop("Mongolian")), + ("mr", gettext_noop("Marathi")), + ("ms", gettext_noop("Malay")), + ("my", gettext_noop("Burmese")), + ("nb", gettext_noop("Norwegian Bokmål")), + ("ne", gettext_noop("Nepali")), + ("nl", gettext_noop("Dutch")), + ("nn", gettext_noop("Norwegian Nynorsk")), + ("os", gettext_noop("Ossetic")), + ("pa", gettext_noop("Punjabi")), + ("pl", gettext_noop("Polish")), + ("pt", gettext_noop("Portuguese")), + ("pt-br", gettext_noop("Brazilian Portuguese")), + ("ro", gettext_noop("Romanian")), + ("ru", gettext_noop("Russian")), + ("sk", gettext_noop("Slovak")), + ("sl", gettext_noop("Slovenian")), + ("sq", gettext_noop("Albanian")), + ("sr", gettext_noop("Serbian")), + ("sr-latn", gettext_noop("Serbian Latin")), + ("sv", gettext_noop("Swedish")), + ("sw", gettext_noop("Swahili")), + ("ta", gettext_noop("Tamil")), + ("te", gettext_noop("Telugu")), + ("tg", gettext_noop("Tajik")), + ("th", gettext_noop("Thai")), + ("tk", gettext_noop("Turkmen")), + ("tr", gettext_noop("Turkish")), + ("tt", gettext_noop("Tatar")), + ("udm", gettext_noop("Udmurt")), + ("ug", gettext_noop("Uyghur")), + ("uk", gettext_noop("Ukrainian")), + ("ur", gettext_noop("Urdu")), + ("uz", gettext_noop("Uzbek")), + ("vi", gettext_noop("Vietnamese")), + ("zh-hans", gettext_noop("Simplified Chinese")), + ("zh-hant", gettext_noop("Traditional Chinese")), ] # Languages using BiDi (right-to-left) layout -LANGUAGES_BIDI = ["he", "ar", "ar-dz", "fa", "ur"] +LANGUAGES_BIDI = ["he", "ar", "ar-dz", "ckb", "fa", "ug", "ur"] # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. @@ -154,29 +161,24 @@ def gettext_noop(s): LOCALE_PATHS = [] # Settings for language cookie -LANGUAGE_COOKIE_NAME = 'django_language' +LANGUAGE_COOKIE_NAME = "django_language" LANGUAGE_COOKIE_AGE = None LANGUAGE_COOKIE_DOMAIN = None -LANGUAGE_COOKIE_PATH = '/' +LANGUAGE_COOKIE_PATH = "/" LANGUAGE_COOKIE_SECURE = False LANGUAGE_COOKIE_HTTPONLY = False LANGUAGE_COOKIE_SAMESITE = None - -# If you set this to True, Django will format dates, numbers and calendars -# according to user current locale. -USE_L10N = False - # Not-necessarily-technical managers of the site. They get broken link # notifications and other various emails. MANAGERS = ADMINS # Default charset to use for all HttpResponse objects, if a MIME type isn't # manually specified. It's used to construct the Content-Type header. -DEFAULT_CHARSET = 'utf-8' +DEFAULT_CHARSET = "utf-8" # Email address that error messages come from. -SERVER_EMAIL = 'root@localhost' +SERVER_EMAIL = "root@localhost" # Database connection info. If left empty, will default to the dummy backend. DATABASES = {} @@ -188,10 +190,10 @@ def gettext_noop(s): # The default is to use the SMTP backend. # Third-party backends can be specified by providing a Python path # to a module that defines an EmailBackend class. -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" # Host for sending email. -EMAIL_HOST = 'localhost' +EMAIL_HOST = "localhost" # Port for sending email. EMAIL_PORT = 25 @@ -200,8 +202,8 @@ def gettext_noop(s): EMAIL_USE_LOCALTIME = False # Optional SMTP authentication information for EMAIL_HOST. -EMAIL_HOST_USER = '' -EMAIL_HOST_PASSWORD = '' +EMAIL_HOST_USER = "" +EMAIL_HOST_PASSWORD = "" EMAIL_USE_TLS = False EMAIL_USE_SSL = False EMAIL_SSL_CERTFILE = None @@ -214,15 +216,15 @@ def gettext_noop(s): TEMPLATES = [] # Default form rendering class. -FORM_RENDERER = 'django.forms.renderers.DjangoTemplates' +FORM_RENDERER = "django.forms.renderers.DjangoTemplates" # Default email address to use for various automated correspondence from # the site managers. -DEFAULT_FROM_EMAIL = 'webmaster@localhost' +DEFAULT_FROM_EMAIL = "webmaster@localhost" # Subject-line prefix for email messages send with django.core.mail.mail_admins # or ...mail_managers. Make sure to include the trailing space. -EMAIL_SUBJECT_PREFIX = '[Django] ' +EMAIL_SUBJECT_PREFIX = "[Django] " # Whether to append trailing slashes to URLs. APPEND_SLASH = True @@ -262,18 +264,28 @@ def gettext_noop(s): # A secret key for this particular Django installation. Used in secret-key # hashing algorithms. Set this in your settings, or Django will complain # loudly. -SECRET_KEY = '' - -# Default file storage mechanism that holds media. -DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' +SECRET_KEY = "" + +# List of secret keys used to verify the validity of signatures. This allows +# secret key rotation. +SECRET_KEY_FALLBACKS = [] + +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", + }, +} # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/var/www/example.com/media/" -MEDIA_ROOT = '' +MEDIA_ROOT = "" # URL that handles the media served from MEDIA_ROOT. # Examples: "http://example.com/media/", "http://media.example.com/" -MEDIA_URL = '' +MEDIA_URL = "" # Absolute path to the directory static files should be collected to. # Example: "/var/www/example.com/static/" @@ -285,8 +297,8 @@ def gettext_noop(s): # List of upload handler classes to be applied in order. FILE_UPLOAD_HANDLERS = [ - 'django.core.files.uploadhandler.MemoryFileUploadHandler', - 'django.core.files.uploadhandler.TemporaryFileUploadHandler', + "django.core.files.uploadhandler.MemoryFileUploadHandler", + "django.core.files.uploadhandler.TemporaryFileUploadHandler", ] # Maximum size, in bytes, of a request before it will be streamed to the @@ -301,13 +313,18 @@ def gettext_noop(s): # SuspiciousOperation (TooManyFieldsSent) is raised. DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 +# Maximum number of files encoded in a multipart upload that will be read +# before a SuspiciousOperation (TooManyFilesSent) is raised. +DATA_UPLOAD_MAX_NUMBER_FILES = 100 + # Directory in which upload streamed files will be temporarily saved. A value of # `None` will make Django use the operating system's default temporary directory # (i.e. "/tmp" on *nix systems). FILE_UPLOAD_TEMP_DIR = None # The numeric mode to set newly-uploaded files to. The value should be a mode -# you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories. +# you'd pass directly to os.chmod; see +# https://docs.python.org/library/os.html#files-and-directories. FILE_UPLOAD_PERMISSIONS = 0o644 # The numeric mode to assign to newly-created directories, when uploading files. @@ -323,45 +340,51 @@ def gettext_noop(s): # Default formatting for date objects. See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'N j, Y' +DATE_FORMAT = "N j, Y" # Default formatting for datetime objects. See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATETIME_FORMAT = 'N j, Y, P' +DATETIME_FORMAT = "N j, Y, P" # Default formatting for time objects. See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -TIME_FORMAT = 'P' +TIME_FORMAT = "P" # Default formatting for date objects when only the year and month are relevant. # See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -YEAR_MONTH_FORMAT = 'F Y' +YEAR_MONTH_FORMAT = "F Y" # Default formatting for date objects when only the month and day are relevant. # See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -MONTH_DAY_FORMAT = 'F j' +MONTH_DAY_FORMAT = "F j" # Default short formatting for date objects. See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATE_FORMAT = 'm/d/Y' +SHORT_DATE_FORMAT = "m/d/Y" # Default short formatting for datetime objects. # See all available format strings here: # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -SHORT_DATETIME_FORMAT = 'm/d/Y P' +SHORT_DATETIME_FORMAT = "m/d/Y P" # Default formats to be used when parsing dates from input boxes, in order # See all available format string here: # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' - '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' + "%b %d %Y", # 'Oct 25 2006' + "%b %d, %Y", # 'Oct 25, 2006' + "%d %b %Y", # '25 Oct 2006' + "%d %b, %Y", # '25 Oct, 2006' + "%B %d %Y", # 'October 25 2006' + "%B %d, %Y", # 'October 25, 2006' + "%d %B %Y", # '25 October 2006' + "%d %B, %Y", # '25 October, 2006' ] # Default formats to be used when parsing times from input boxes, in order @@ -369,9 +392,9 @@ def gettext_noop(s): # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '14:30:59' - '%H:%M:%S.%f', # '14:30:59.000200' - '%H:%M', # '14:30' + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' ] # Default formats to be used when parsing dates and times from input boxes, @@ -380,15 +403,15 @@ def gettext_noop(s): # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' - '%m/%d/%y %H:%M', # '10/25/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' ] # First day of week, to be used on calendars @@ -396,7 +419,7 @@ def gettext_noop(s): FIRST_DAY_OF_WEEK = 0 # Decimal separator symbol -DECIMAL_SEPARATOR = '.' +DECIMAL_SEPARATOR = "." # Boolean that sets whether to add thousand separator when formatting numbers USE_THOUSAND_SEPARATOR = False @@ -406,14 +429,17 @@ def gettext_noop(s): NUMBER_GROUPING = 0 # Thousand separator symbol -THOUSAND_SEPARATOR = ',' +THOUSAND_SEPARATOR = "," # The tablespaces to use for each model when not specified otherwise. -DEFAULT_TABLESPACE = '' -DEFAULT_INDEX_TABLESPACE = '' +DEFAULT_TABLESPACE = "" +DEFAULT_INDEX_TABLESPACE = "" + +# Default primary key field type. +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # Default X-Frame-Options header value -X_FRAME_OPTIONS = 'DENY' +X_FRAME_OPTIONS = "DENY" USE_X_FORWARDED_HOST = False USE_X_FORWARDED_PORT = False @@ -448,9 +474,9 @@ def gettext_noop(s): ############ # Cache to store session data if using the cache session backend. -SESSION_CACHE_ALIAS = 'default' +SESSION_CACHE_ALIAS = "default" # Cookie name. This can be whatever you want. -SESSION_COOKIE_NAME = 'sessionid' +SESSION_COOKIE_NAME = "sessionid" # Age of cookie, in seconds (default: 2 weeks). SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # A string like "example.com", or None for standard domain cookie. @@ -458,23 +484,23 @@ def gettext_noop(s): # Whether the session cookie should be secure (https:// only). SESSION_COOKIE_SECURE = False # The path of the session cookie. -SESSION_COOKIE_PATH = '/' +SESSION_COOKIE_PATH = "/" # Whether to use the HttpOnly flag. SESSION_COOKIE_HTTPONLY = True # Whether to set the flag restricting cookie leaks on cross-site requests. -# This can be 'Lax', 'Strict', or None to disable the flag. -SESSION_COOKIE_SAMESITE = 'Lax' +# This can be 'Lax', 'Strict', 'None', or False to disable the flag. +SESSION_COOKIE_SAMESITE = "Lax" # Whether to save the session data on every request. SESSION_SAVE_EVERY_REQUEST = False -# Whether a user's session cookie expires when the Web browser is closed. +# Whether a user's session cookie expires when the web browser is closed. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # The module to store session data -SESSION_ENGINE = 'django.contrib.sessions.backends.db' +SESSION_ENGINE = "django.contrib.sessions.backends.db" # Directory to store session files if using the file session module. If None, # the backend will use a sensible default. SESSION_FILE_PATH = None # class to serialize session data -SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' +SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" ######### # CACHE # @@ -482,31 +508,28 @@ def gettext_noop(s): # The cache backends to use. CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", } } -CACHE_MIDDLEWARE_KEY_PREFIX = '' +CACHE_MIDDLEWARE_KEY_PREFIX = "" CACHE_MIDDLEWARE_SECONDS = 600 -CACHE_MIDDLEWARE_ALIAS = 'default' +CACHE_MIDDLEWARE_ALIAS = "default" ################## # AUTHENTICATION # ################## -AUTH_USER_MODEL = 'auth.User' +AUTH_USER_MODEL = "auth.User" -AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend'] +AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"] -LOGIN_URL = '/accounts/login/' +LOGIN_URL = "/accounts/login/" -LOGIN_REDIRECT_URL = '/accounts/profile/' +LOGIN_REDIRECT_URL = "/accounts/profile/" LOGOUT_REDIRECT_URL = None -# The number of days a password reset link is valid for -PASSWORD_RESET_TIMEOUT_DAYS = 3 - # The number of seconds a password reset link is valid for (default: 3 days). PASSWORD_RESET_TIMEOUT = 60 * 60 * 24 * 3 @@ -514,10 +537,11 @@ def gettext_noop(s): # password using different algorithms will be converted automatically # upon login PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.PBKDF2PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', - 'django.contrib.auth.hashers.Argon2PasswordHasher', - 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', + "django.contrib.auth.hashers.PBKDF2PasswordHasher", + "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", + "django.contrib.auth.hashers.Argon2PasswordHasher", + "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", + "django.contrib.auth.hashers.ScryptPasswordHasher", ] AUTH_PASSWORD_VALIDATORS = [] @@ -526,7 +550,7 @@ def gettext_noop(s): # SIGNING # ########### -SIGNING_BACKEND = 'django.core.signing.TimestampSigner' +SIGNING_BACKEND = "django.core.signing.TimestampSigner" ######## # CSRF # @@ -534,17 +558,17 @@ def gettext_noop(s): # Dotted path to callable to be used as view when a request is # rejected by the CSRF middleware. -CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure' +CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure" # Settings for CSRF cookie. -CSRF_COOKIE_NAME = 'csrftoken' +CSRF_COOKIE_NAME = "csrftoken" CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 CSRF_COOKIE_DOMAIN = None -CSRF_COOKIE_PATH = '/' +CSRF_COOKIE_PATH = "/" CSRF_COOKIE_SECURE = False CSRF_COOKIE_HTTPONLY = False -CSRF_COOKIE_SAMESITE = 'Lax' -CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN' +CSRF_COOKIE_SAMESITE = "Lax" +CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" CSRF_TRUSTED_ORIGINS = [] CSRF_USE_SESSIONS = False @@ -553,7 +577,7 @@ def gettext_noop(s): ############ # Class to use as messages backend -MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage' +MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage" # Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within # django.contrib.messages to avoid imports in this settings file. @@ -563,25 +587,25 @@ def gettext_noop(s): ########### # The callable to use to configure logging -LOGGING_CONFIG = 'logging.config.dictConfig' +LOGGING_CONFIG = "logging.config.dictConfig" # Custom logging configuration. LOGGING = {} # Default exception reporter class used in case none has been # specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER = 'django.views.debug.ExceptionReporter' +DEFAULT_EXCEPTION_REPORTER = "django.views.debug.ExceptionReporter" # Default exception reporter filter class used in case none has been # specifically assigned to the HttpRequest instance. -DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter' +DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter" ########### # TESTING # ########### # The name of the class to use to run the test suite -TEST_RUNNER = 'django.test.runner.DiscoverRunner' +TEST_RUNNER = "django.test.runner.DiscoverRunner" # Apps that don't need to be serialized at test database creation time # (only apps with migrations are to start with) @@ -601,14 +625,11 @@ def gettext_noop(s): # A list of locations of additional static files STATICFILES_DIRS = [] -# The default file storage backend used during the build process -STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage' - # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder", # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ] @@ -632,12 +653,12 @@ def gettext_noop(s): ####################### # SECURITY MIDDLEWARE # ####################### -SECURE_BROWSER_XSS_FILTER = False SECURE_CONTENT_TYPE_NOSNIFF = True +SECURE_CROSS_ORIGIN_OPENER_POLICY = "same-origin" SECURE_HSTS_INCLUDE_SUBDOMAINS = False SECURE_HSTS_PRELOAD = False SECURE_HSTS_SECONDS = 0 SECURE_REDIRECT_EXEMPT = [] -SECURE_REFERRER_POLICY = 'same-origin' +SECURE_REFERRER_POLICY = "same-origin" SECURE_SSL_HOST = None SECURE_SSL_REDIRECT = False diff --git a/django/conf/locale/__init__.py b/django/conf/locale/__init__.py index a67f48f2d38a..6ac7bd3bdb6a 100644 --- a/django/conf/locale/__init__.py +++ b/django/conf/locale/__init__.py @@ -8,592 +8,622 @@ """ LANG_INFO = { - 'af': { - 'bidi': False, - 'code': 'af', - 'name': 'Afrikaans', - 'name_local': 'Afrikaans', - }, - 'ar': { - 'bidi': True, - 'code': 'ar', - 'name': 'Arabic', - 'name_local': 'العربيّة', - }, - 'ar-dz': { - 'bidi': True, - 'code': 'ar-dz', - 'name': 'Algerian Arabic', - 'name_local': 'العربية الجزائرية', - }, - 'ast': { - 'bidi': False, - 'code': 'ast', - 'name': 'Asturian', - 'name_local': 'asturianu', - }, - 'az': { - 'bidi': True, - 'code': 'az', - 'name': 'Azerbaijani', - 'name_local': 'Azərbaycanca', - }, - 'be': { - 'bidi': False, - 'code': 'be', - 'name': 'Belarusian', - 'name_local': 'беларуская', - }, - 'bg': { - 'bidi': False, - 'code': 'bg', - 'name': 'Bulgarian', - 'name_local': 'български', - }, - 'bn': { - 'bidi': False, - 'code': 'bn', - 'name': 'Bengali', - 'name_local': 'বাংলা', - }, - 'br': { - 'bidi': False, - 'code': 'br', - 'name': 'Breton', - 'name_local': 'brezhoneg', - }, - 'bs': { - 'bidi': False, - 'code': 'bs', - 'name': 'Bosnian', - 'name_local': 'bosanski', - }, - 'ca': { - 'bidi': False, - 'code': 'ca', - 'name': 'Catalan', - 'name_local': 'català', - }, - 'cs': { - 'bidi': False, - 'code': 'cs', - 'name': 'Czech', - 'name_local': 'česky', - }, - 'cy': { - 'bidi': False, - 'code': 'cy', - 'name': 'Welsh', - 'name_local': 'Cymraeg', - }, - 'da': { - 'bidi': False, - 'code': 'da', - 'name': 'Danish', - 'name_local': 'dansk', - }, - 'de': { - 'bidi': False, - 'code': 'de', - 'name': 'German', - 'name_local': 'Deutsch', - }, - 'dsb': { - 'bidi': False, - 'code': 'dsb', - 'name': 'Lower Sorbian', - 'name_local': 'dolnoserbski', - }, - 'el': { - 'bidi': False, - 'code': 'el', - 'name': 'Greek', - 'name_local': 'Ελληνικά', - }, - 'en': { - 'bidi': False, - 'code': 'en', - 'name': 'English', - 'name_local': 'English', - }, - 'en-au': { - 'bidi': False, - 'code': 'en-au', - 'name': 'Australian English', - 'name_local': 'Australian English', - }, - 'en-gb': { - 'bidi': False, - 'code': 'en-gb', - 'name': 'British English', - 'name_local': 'British English', - }, - 'eo': { - 'bidi': False, - 'code': 'eo', - 'name': 'Esperanto', - 'name_local': 'Esperanto', - }, - 'es': { - 'bidi': False, - 'code': 'es', - 'name': 'Spanish', - 'name_local': 'español', - }, - 'es-ar': { - 'bidi': False, - 'code': 'es-ar', - 'name': 'Argentinian Spanish', - 'name_local': 'español de Argentina', - }, - 'es-co': { - 'bidi': False, - 'code': 'es-co', - 'name': 'Colombian Spanish', - 'name_local': 'español de Colombia', - }, - 'es-mx': { - 'bidi': False, - 'code': 'es-mx', - 'name': 'Mexican Spanish', - 'name_local': 'español de Mexico', - }, - 'es-ni': { - 'bidi': False, - 'code': 'es-ni', - 'name': 'Nicaraguan Spanish', - 'name_local': 'español de Nicaragua', - }, - 'es-ve': { - 'bidi': False, - 'code': 'es-ve', - 'name': 'Venezuelan Spanish', - 'name_local': 'español de Venezuela', - }, - 'et': { - 'bidi': False, - 'code': 'et', - 'name': 'Estonian', - 'name_local': 'eesti', - }, - 'eu': { - 'bidi': False, - 'code': 'eu', - 'name': 'Basque', - 'name_local': 'Basque', - }, - 'fa': { - 'bidi': True, - 'code': 'fa', - 'name': 'Persian', - 'name_local': 'فارسی', - }, - 'fi': { - 'bidi': False, - 'code': 'fi', - 'name': 'Finnish', - 'name_local': 'suomi', - }, - 'fr': { - 'bidi': False, - 'code': 'fr', - 'name': 'French', - 'name_local': 'français', - }, - 'fy': { - 'bidi': False, - 'code': 'fy', - 'name': 'Frisian', - 'name_local': 'frysk', - }, - 'ga': { - 'bidi': False, - 'code': 'ga', - 'name': 'Irish', - 'name_local': 'Gaeilge', - }, - 'gd': { - 'bidi': False, - 'code': 'gd', - 'name': 'Scottish Gaelic', - 'name_local': 'Gàidhlig', - }, - 'gl': { - 'bidi': False, - 'code': 'gl', - 'name': 'Galician', - 'name_local': 'galego', - }, - 'he': { - 'bidi': True, - 'code': 'he', - 'name': 'Hebrew', - 'name_local': 'עברית', - }, - 'hi': { - 'bidi': False, - 'code': 'hi', - 'name': 'Hindi', - 'name_local': 'हिंदी', - }, - 'hr': { - 'bidi': False, - 'code': 'hr', - 'name': 'Croatian', - 'name_local': 'Hrvatski', - }, - 'hsb': { - 'bidi': False, - 'code': 'hsb', - 'name': 'Upper Sorbian', - 'name_local': 'hornjoserbsce', - }, - 'hu': { - 'bidi': False, - 'code': 'hu', - 'name': 'Hungarian', - 'name_local': 'Magyar', - }, - 'hy': { - 'bidi': False, - 'code': 'hy', - 'name': 'Armenian', - 'name_local': 'հայերեն', - }, - 'ia': { - 'bidi': False, - 'code': 'ia', - 'name': 'Interlingua', - 'name_local': 'Interlingua', - }, - 'io': { - 'bidi': False, - 'code': 'io', - 'name': 'Ido', - 'name_local': 'ido', - }, - 'id': { - 'bidi': False, - 'code': 'id', - 'name': 'Indonesian', - 'name_local': 'Bahasa Indonesia', - }, - 'is': { - 'bidi': False, - 'code': 'is', - 'name': 'Icelandic', - 'name_local': 'Íslenska', - }, - 'it': { - 'bidi': False, - 'code': 'it', - 'name': 'Italian', - 'name_local': 'italiano', - }, - 'ja': { - 'bidi': False, - 'code': 'ja', - 'name': 'Japanese', - 'name_local': '日本語', - }, - 'ka': { - 'bidi': False, - 'code': 'ka', - 'name': 'Georgian', - 'name_local': 'ქართული', - }, - 'kab': { - 'bidi': False, - 'code': 'kab', - 'name': 'Kabyle', - 'name_local': 'taqbaylit', - }, - 'kk': { - 'bidi': False, - 'code': 'kk', - 'name': 'Kazakh', - 'name_local': 'Қазақ', - }, - 'km': { - 'bidi': False, - 'code': 'km', - 'name': 'Khmer', - 'name_local': 'Khmer', - }, - 'kn': { - 'bidi': False, - 'code': 'kn', - 'name': 'Kannada', - 'name_local': 'Kannada', - }, - 'ko': { - 'bidi': False, - 'code': 'ko', - 'name': 'Korean', - 'name_local': '한국어', - }, - 'ky': { - 'bidi': False, - 'code': 'ky', - 'name': 'Kyrgyz', - 'name_local': 'Кыргызча', - }, - 'lb': { - 'bidi': False, - 'code': 'lb', - 'name': 'Luxembourgish', - 'name_local': 'Lëtzebuergesch', - }, - 'lt': { - 'bidi': False, - 'code': 'lt', - 'name': 'Lithuanian', - 'name_local': 'Lietuviškai', - }, - 'lv': { - 'bidi': False, - 'code': 'lv', - 'name': 'Latvian', - 'name_local': 'latviešu', - }, - 'mk': { - 'bidi': False, - 'code': 'mk', - 'name': 'Macedonian', - 'name_local': 'Македонски', - }, - 'ml': { - 'bidi': False, - 'code': 'ml', - 'name': 'Malayalam', - 'name_local': 'Malayalam', - }, - 'mn': { - 'bidi': False, - 'code': 'mn', - 'name': 'Mongolian', - 'name_local': 'Mongolian', - }, - 'mr': { - 'bidi': False, - 'code': 'mr', - 'name': 'Marathi', - 'name_local': 'मराठी', - }, - 'my': { - 'bidi': False, - 'code': 'my', - 'name': 'Burmese', - 'name_local': 'မြန်မာဘာသာ', - }, - 'nb': { - 'bidi': False, - 'code': 'nb', - 'name': 'Norwegian Bokmal', - 'name_local': 'norsk (bokmål)', - }, - 'ne': { - 'bidi': False, - 'code': 'ne', - 'name': 'Nepali', - 'name_local': 'नेपाली', - }, - 'nl': { - 'bidi': False, - 'code': 'nl', - 'name': 'Dutch', - 'name_local': 'Nederlands', - }, - 'nn': { - 'bidi': False, - 'code': 'nn', - 'name': 'Norwegian Nynorsk', - 'name_local': 'norsk (nynorsk)', - }, - 'no': { - 'bidi': False, - 'code': 'no', - 'name': 'Norwegian', - 'name_local': 'norsk', - }, - 'os': { - 'bidi': False, - 'code': 'os', - 'name': 'Ossetic', - 'name_local': 'Ирон', - }, - 'pa': { - 'bidi': False, - 'code': 'pa', - 'name': 'Punjabi', - 'name_local': 'Punjabi', - }, - 'pl': { - 'bidi': False, - 'code': 'pl', - 'name': 'Polish', - 'name_local': 'polski', - }, - 'pt': { - 'bidi': False, - 'code': 'pt', - 'name': 'Portuguese', - 'name_local': 'Português', - }, - 'pt-br': { - 'bidi': False, - 'code': 'pt-br', - 'name': 'Brazilian Portuguese', - 'name_local': 'Português Brasileiro', - }, - 'ro': { - 'bidi': False, - 'code': 'ro', - 'name': 'Romanian', - 'name_local': 'Română', - }, - 'ru': { - 'bidi': False, - 'code': 'ru', - 'name': 'Russian', - 'name_local': 'Русский', - }, - 'sk': { - 'bidi': False, - 'code': 'sk', - 'name': 'Slovak', - 'name_local': 'Slovensky', - }, - 'sl': { - 'bidi': False, - 'code': 'sl', - 'name': 'Slovenian', - 'name_local': 'Slovenščina', - }, - 'sq': { - 'bidi': False, - 'code': 'sq', - 'name': 'Albanian', - 'name_local': 'shqip', - }, - 'sr': { - 'bidi': False, - 'code': 'sr', - 'name': 'Serbian', - 'name_local': 'српски', - }, - 'sr-latn': { - 'bidi': False, - 'code': 'sr-latn', - 'name': 'Serbian Latin', - 'name_local': 'srpski (latinica)', - }, - 'sv': { - 'bidi': False, - 'code': 'sv', - 'name': 'Swedish', - 'name_local': 'svenska', - }, - 'sw': { - 'bidi': False, - 'code': 'sw', - 'name': 'Swahili', - 'name_local': 'Kiswahili', - }, - 'ta': { - 'bidi': False, - 'code': 'ta', - 'name': 'Tamil', - 'name_local': 'தமிழ்', - }, - 'te': { - 'bidi': False, - 'code': 'te', - 'name': 'Telugu', - 'name_local': 'తెలుగు', - }, - 'tg': { - 'bidi': False, - 'code': 'tg', - 'name': 'Tajik', - 'name_local': 'тоҷикӣ', - }, - 'th': { - 'bidi': False, - 'code': 'th', - 'name': 'Thai', - 'name_local': 'ภาษาไทย', - }, - 'tr': { - 'bidi': False, - 'code': 'tr', - 'name': 'Turkish', - 'name_local': 'Türkçe', - }, - 'tt': { - 'bidi': False, - 'code': 'tt', - 'name': 'Tatar', - 'name_local': 'Татарча', - }, - 'udm': { - 'bidi': False, - 'code': 'udm', - 'name': 'Udmurt', - 'name_local': 'Удмурт', - }, - 'uk': { - 'bidi': False, - 'code': 'uk', - 'name': 'Ukrainian', - 'name_local': 'Українська', - }, - 'ur': { - 'bidi': True, - 'code': 'ur', - 'name': 'Urdu', - 'name_local': 'اردو', - }, - 'uz': { - 'bidi': False, - 'code': 'uz', - 'name': 'Uzbek', - 'name_local': 'oʻzbek tili', - }, - 'vi': { - 'bidi': False, - 'code': 'vi', - 'name': 'Vietnamese', - 'name_local': 'Tiếng Việt', - }, - 'zh-cn': { - 'fallback': ['zh-hans'], - }, - 'zh-hans': { - 'bidi': False, - 'code': 'zh-hans', - 'name': 'Simplified Chinese', - 'name_local': '简体中文', - }, - 'zh-hant': { - 'bidi': False, - 'code': 'zh-hant', - 'name': 'Traditional Chinese', - 'name_local': '繁體中文', - }, - 'zh-hk': { - 'fallback': ['zh-hant'], - }, - 'zh-mo': { - 'fallback': ['zh-hant'], - }, - 'zh-my': { - 'fallback': ['zh-hans'], - }, - 'zh-sg': { - 'fallback': ['zh-hans'], - }, - 'zh-tw': { - 'fallback': ['zh-hant'], + "af": { + "bidi": False, + "code": "af", + "name": "Afrikaans", + "name_local": "Afrikaans", + }, + "ar": { + "bidi": True, + "code": "ar", + "name": "Arabic", + "name_local": "العربيّة", + }, + "ar-dz": { + "bidi": True, + "code": "ar-dz", + "name": "Algerian Arabic", + "name_local": "العربية الجزائرية", + }, + "ast": { + "bidi": False, + "code": "ast", + "name": "Asturian", + "name_local": "asturianu", + }, + "az": { + "bidi": True, + "code": "az", + "name": "Azerbaijani", + "name_local": "Azərbaycanca", + }, + "be": { + "bidi": False, + "code": "be", + "name": "Belarusian", + "name_local": "беларуская", + }, + "bg": { + "bidi": False, + "code": "bg", + "name": "Bulgarian", + "name_local": "български", + }, + "bn": { + "bidi": False, + "code": "bn", + "name": "Bengali", + "name_local": "বাংলা", + }, + "br": { + "bidi": False, + "code": "br", + "name": "Breton", + "name_local": "brezhoneg", + }, + "bs": { + "bidi": False, + "code": "bs", + "name": "Bosnian", + "name_local": "bosanski", + }, + "ca": { + "bidi": False, + "code": "ca", + "name": "Catalan", + "name_local": "català", + }, + "ckb": { + "bidi": True, + "code": "ckb", + "name": "Central Kurdish (Sorani)", + "name_local": "کوردی", + }, + "cs": { + "bidi": False, + "code": "cs", + "name": "Czech", + "name_local": "česky", + }, + "cy": { + "bidi": False, + "code": "cy", + "name": "Welsh", + "name_local": "Cymraeg", + }, + "da": { + "bidi": False, + "code": "da", + "name": "Danish", + "name_local": "dansk", + }, + "de": { + "bidi": False, + "code": "de", + "name": "German", + "name_local": "Deutsch", + }, + "dsb": { + "bidi": False, + "code": "dsb", + "name": "Lower Sorbian", + "name_local": "dolnoserbski", + }, + "el": { + "bidi": False, + "code": "el", + "name": "Greek", + "name_local": "Ελληνικά", + }, + "en": { + "bidi": False, + "code": "en", + "name": "English", + "name_local": "English", + }, + "en-au": { + "bidi": False, + "code": "en-au", + "name": "Australian English", + "name_local": "Australian English", + }, + "en-gb": { + "bidi": False, + "code": "en-gb", + "name": "British English", + "name_local": "British English", + }, + "eo": { + "bidi": False, + "code": "eo", + "name": "Esperanto", + "name_local": "Esperanto", + }, + "es": { + "bidi": False, + "code": "es", + "name": "Spanish", + "name_local": "español", + }, + "es-ar": { + "bidi": False, + "code": "es-ar", + "name": "Argentinian Spanish", + "name_local": "español de Argentina", + }, + "es-co": { + "bidi": False, + "code": "es-co", + "name": "Colombian Spanish", + "name_local": "español de Colombia", + }, + "es-mx": { + "bidi": False, + "code": "es-mx", + "name": "Mexican Spanish", + "name_local": "español de Mexico", + }, + "es-ni": { + "bidi": False, + "code": "es-ni", + "name": "Nicaraguan Spanish", + "name_local": "español de Nicaragua", + }, + "es-ve": { + "bidi": False, + "code": "es-ve", + "name": "Venezuelan Spanish", + "name_local": "español de Venezuela", + }, + "et": { + "bidi": False, + "code": "et", + "name": "Estonian", + "name_local": "eesti", + }, + "eu": { + "bidi": False, + "code": "eu", + "name": "Basque", + "name_local": "Basque", + }, + "fa": { + "bidi": True, + "code": "fa", + "name": "Persian", + "name_local": "فارسی", + }, + "fi": { + "bidi": False, + "code": "fi", + "name": "Finnish", + "name_local": "suomi", + }, + "fr": { + "bidi": False, + "code": "fr", + "name": "French", + "name_local": "français", + }, + "fy": { + "bidi": False, + "code": "fy", + "name": "Frisian", + "name_local": "frysk", + }, + "ga": { + "bidi": False, + "code": "ga", + "name": "Irish", + "name_local": "Gaeilge", + }, + "gd": { + "bidi": False, + "code": "gd", + "name": "Scottish Gaelic", + "name_local": "Gàidhlig", + }, + "gl": { + "bidi": False, + "code": "gl", + "name": "Galician", + "name_local": "galego", + }, + "he": { + "bidi": True, + "code": "he", + "name": "Hebrew", + "name_local": "עברית", + }, + "hi": { + "bidi": False, + "code": "hi", + "name": "Hindi", + "name_local": "हिंदी", + }, + "hr": { + "bidi": False, + "code": "hr", + "name": "Croatian", + "name_local": "Hrvatski", + }, + "hsb": { + "bidi": False, + "code": "hsb", + "name": "Upper Sorbian", + "name_local": "hornjoserbsce", + }, + "hu": { + "bidi": False, + "code": "hu", + "name": "Hungarian", + "name_local": "Magyar", + }, + "hy": { + "bidi": False, + "code": "hy", + "name": "Armenian", + "name_local": "հայերեն", + }, + "ia": { + "bidi": False, + "code": "ia", + "name": "Interlingua", + "name_local": "Interlingua", + }, + "io": { + "bidi": False, + "code": "io", + "name": "Ido", + "name_local": "ido", + }, + "id": { + "bidi": False, + "code": "id", + "name": "Indonesian", + "name_local": "Bahasa Indonesia", + }, + "ig": { + "bidi": False, + "code": "ig", + "name": "Igbo", + "name_local": "Asụsụ Ìgbò", + }, + "is": { + "bidi": False, + "code": "is", + "name": "Icelandic", + "name_local": "Íslenska", + }, + "it": { + "bidi": False, + "code": "it", + "name": "Italian", + "name_local": "italiano", + }, + "ja": { + "bidi": False, + "code": "ja", + "name": "Japanese", + "name_local": "日本語", + }, + "ka": { + "bidi": False, + "code": "ka", + "name": "Georgian", + "name_local": "ქართული", + }, + "kab": { + "bidi": False, + "code": "kab", + "name": "Kabyle", + "name_local": "taqbaylit", + }, + "kk": { + "bidi": False, + "code": "kk", + "name": "Kazakh", + "name_local": "Қазақ", + }, + "km": { + "bidi": False, + "code": "km", + "name": "Khmer", + "name_local": "Khmer", + }, + "kn": { + "bidi": False, + "code": "kn", + "name": "Kannada", + "name_local": "Kannada", + }, + "ko": { + "bidi": False, + "code": "ko", + "name": "Korean", + "name_local": "한국어", + }, + "ky": { + "bidi": False, + "code": "ky", + "name": "Kyrgyz", + "name_local": "Кыргызча", + }, + "lb": { + "bidi": False, + "code": "lb", + "name": "Luxembourgish", + "name_local": "Lëtzebuergesch", + }, + "lt": { + "bidi": False, + "code": "lt", + "name": "Lithuanian", + "name_local": "Lietuviškai", + }, + "lv": { + "bidi": False, + "code": "lv", + "name": "Latvian", + "name_local": "latviešu", + }, + "mk": { + "bidi": False, + "code": "mk", + "name": "Macedonian", + "name_local": "Македонски", + }, + "ml": { + "bidi": False, + "code": "ml", + "name": "Malayalam", + "name_local": "മലയാളം", + }, + "mn": { + "bidi": False, + "code": "mn", + "name": "Mongolian", + "name_local": "Mongolian", + }, + "mr": { + "bidi": False, + "code": "mr", + "name": "Marathi", + "name_local": "मराठी", + }, + "ms": { + "bidi": False, + "code": "ms", + "name": "Malay", + "name_local": "Bahasa Melayu", + }, + "my": { + "bidi": False, + "code": "my", + "name": "Burmese", + "name_local": "မြန်မာဘာသာ", + }, + "nb": { + "bidi": False, + "code": "nb", + "name": "Norwegian Bokmal", + "name_local": "norsk (bokmål)", + }, + "ne": { + "bidi": False, + "code": "ne", + "name": "Nepali", + "name_local": "नेपाली", + }, + "nl": { + "bidi": False, + "code": "nl", + "name": "Dutch", + "name_local": "Nederlands", + }, + "nn": { + "bidi": False, + "code": "nn", + "name": "Norwegian Nynorsk", + "name_local": "norsk (nynorsk)", + }, + "no": { + "bidi": False, + "code": "no", + "name": "Norwegian", + "name_local": "norsk", + }, + "os": { + "bidi": False, + "code": "os", + "name": "Ossetic", + "name_local": "Ирон", + }, + "pa": { + "bidi": False, + "code": "pa", + "name": "Punjabi", + "name_local": "Punjabi", + }, + "pl": { + "bidi": False, + "code": "pl", + "name": "Polish", + "name_local": "polski", + }, + "pt": { + "bidi": False, + "code": "pt", + "name": "Portuguese", + "name_local": "Português", + }, + "pt-br": { + "bidi": False, + "code": "pt-br", + "name": "Brazilian Portuguese", + "name_local": "Português Brasileiro", + }, + "ro": { + "bidi": False, + "code": "ro", + "name": "Romanian", + "name_local": "Română", + }, + "ru": { + "bidi": False, + "code": "ru", + "name": "Russian", + "name_local": "Русский", + }, + "sk": { + "bidi": False, + "code": "sk", + "name": "Slovak", + "name_local": "slovensky", + }, + "sl": { + "bidi": False, + "code": "sl", + "name": "Slovenian", + "name_local": "Slovenščina", + }, + "sq": { + "bidi": False, + "code": "sq", + "name": "Albanian", + "name_local": "shqip", + }, + "sr": { + "bidi": False, + "code": "sr", + "name": "Serbian", + "name_local": "српски", + }, + "sr-latn": { + "bidi": False, + "code": "sr-latn", + "name": "Serbian Latin", + "name_local": "srpski (latinica)", + }, + "sv": { + "bidi": False, + "code": "sv", + "name": "Swedish", + "name_local": "svenska", + }, + "sw": { + "bidi": False, + "code": "sw", + "name": "Swahili", + "name_local": "Kiswahili", + }, + "ta": { + "bidi": False, + "code": "ta", + "name": "Tamil", + "name_local": "தமிழ்", + }, + "te": { + "bidi": False, + "code": "te", + "name": "Telugu", + "name_local": "తెలుగు", + }, + "tg": { + "bidi": False, + "code": "tg", + "name": "Tajik", + "name_local": "тоҷикӣ", + }, + "th": { + "bidi": False, + "code": "th", + "name": "Thai", + "name_local": "ภาษาไทย", + }, + "tk": { + "bidi": False, + "code": "tk", + "name": "Turkmen", + "name_local": "Türkmençe", + }, + "tr": { + "bidi": False, + "code": "tr", + "name": "Turkish", + "name_local": "Türkçe", + }, + "tt": { + "bidi": False, + "code": "tt", + "name": "Tatar", + "name_local": "Татарча", + }, + "udm": { + "bidi": False, + "code": "udm", + "name": "Udmurt", + "name_local": "Удмурт", + }, + "ug": { + "bidi": True, + "code": "ug", + "name": "Uyghur", + "name_local": "ئۇيغۇرچە", + }, + "uk": { + "bidi": False, + "code": "uk", + "name": "Ukrainian", + "name_local": "Українська", + }, + "ur": { + "bidi": True, + "code": "ur", + "name": "Urdu", + "name_local": "اردو", + }, + "uz": { + "bidi": False, + "code": "uz", + "name": "Uzbek", + "name_local": "oʻzbek tili", + }, + "vi": { + "bidi": False, + "code": "vi", + "name": "Vietnamese", + "name_local": "Tiếng Việt", + }, + "zh-cn": { + "fallback": ["zh-hans"], + }, + "zh-hans": { + "bidi": False, + "code": "zh-hans", + "name": "Simplified Chinese", + "name_local": "简体中文", + }, + "zh-hant": { + "bidi": False, + "code": "zh-hant", + "name": "Traditional Chinese", + "name_local": "繁體中文", + }, + "zh-hk": { + "fallback": ["zh-hant"], + }, + "zh-mo": { + "fallback": ["zh-hant"], + }, + "zh-my": { + "fallback": ["zh-hans"], + }, + "zh-sg": { + "fallback": ["zh-hans"], + }, + "zh-tw": { + "fallback": ["zh-hant"], }, } diff --git a/django/conf/locale/af/LC_MESSAGES/django.mo b/django/conf/locale/af/LC_MESSAGES/django.mo index 5d1db671e790..8b37fdb3fb67 100644 Binary files a/django/conf/locale/af/LC_MESSAGES/django.mo and b/django/conf/locale/af/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/af/LC_MESSAGES/django.po b/django/conf/locale/af/LC_MESSAGES/django.po index 8a9c0ef54860..cbd7abfedc49 100644 --- a/django/conf/locale/af/LC_MESSAGES/django.po +++ b/django/conf/locale/af/LC_MESSAGES/django.po @@ -1,17 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# F Wolff , 2019 +# F Wolff , 2019-2020,2022-2023 # Stephen Cox , 2011-2012 # unklphil , 2014,2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: F Wolff , 2019-2020,2022-2023\n" +"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" "af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +25,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabies" +msgid "Algerian Arabic" +msgstr "Algeriese Arabies" + msgid "Asturian" msgstr "Asturies" @@ -49,11 +52,14 @@ msgstr "Bosnies" msgid "Catalan" msgstr "Katalaans" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Tsjeggies" msgid "Welsh" -msgstr "Welsh" +msgstr "Wallies" msgid "Danish" msgstr "Deens" @@ -148,6 +154,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesies" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -178,6 +187,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreaans" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luxemburgs" @@ -199,6 +211,9 @@ msgstr "Mongools" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Maleisies" + msgid "Burmese" msgstr "Birmaans" @@ -262,9 +277,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Teloegoe" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turks" @@ -274,6 +295,9 @@ msgstr "Tataars" msgid "Udmurt" msgstr "Oedmoerts" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Oekraïens" @@ -281,7 +305,7 @@ msgid "Urdu" msgstr "Oerdoe" msgid "Uzbek" -msgstr "" +msgstr "Oesbekies " msgid "Vietnamese" msgstr "Viëtnamees" @@ -304,8 +328,13 @@ msgstr "Statiese lêers" msgid "Syndication" msgstr "Sindikasie" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" -msgstr "Daai bladsynommer is nie 'n heelgetal nie" +msgstr "Daai bladsynommer is nie ’n heelgetal nie" msgid "That page number is less than 1" msgstr "Daai bladsynommer is minder as 1" @@ -314,7 +343,7 @@ msgid "That page contains no results" msgstr "Daai bladsy bevat geen resultate nie" msgid "Enter a valid value." -msgstr "Gee 'n geldige waarde." +msgstr "Gee ’n geldige waarde." msgid "Enter a valid URL." msgstr "Gee ’n geldige URL." @@ -329,11 +358,15 @@ msgstr "Gee ’n geldige e-posadres." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Gee ’n geldige “slak” wat bestaan ​​uit letters, syfers, onderstreep of " +"koppelteken." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Gee ’n geldige “slak” wat bestaan ​​uit Unicode-letters, syfers, onderstreep " +"of koppelteken." msgid "Enter a valid IPv4 address." msgstr "Gee ’n geldige IPv4-adres." @@ -345,7 +378,7 @@ msgid "Enter a valid IPv4 or IPv6 address." msgstr "Gee ’n geldige IPv4- of IPv6-adres." msgid "Enter only digits separated by commas." -msgstr "Gee slegs syfers in wat deur kommas geskei is." +msgstr "Gee slegs syfers wat deur kommas geskei is." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." @@ -360,6 +393,17 @@ msgstr "Maak seker dat hierdie waarde kleiner of gelyk is aan %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Maak seker dat hierdie waarde groter of gelyk is aan %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Maak seker dat hierdie waarde ’n veelvoud is van stapgrootte %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -418,6 +462,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Lêeruitbreiding “%(extension)s” word nie toegelaat nie. Toegelate " +"uitbreidings is: %(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Nul-karakters word nie toegelaat nie." @@ -429,6 +475,10 @@ msgstr "en" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s met hierdie %(field_labels)s bestaan alreeds." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Beperking “%(name)s” word verbreek." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Waarde %(value)r is nie ’n geldige keuse nie." @@ -443,8 +493,8 @@ msgstr "Hierdie veld kan nie leeg wees nie." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s met hierdie %(field_label)s bestaan ​​alreeds." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -457,11 +507,11 @@ msgstr "Veld van tipe: %(field_type)s " #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” waarde moet óf True óf False wees." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Die waarde “%(value)s” moet True, False of None wees." msgid "Boolean (Either True or False)" msgstr "Boole (True of False)" @@ -470,6 +520,9 @@ msgstr "Boole (True of False)" msgid "String (up to %(max_length)s)" msgstr "String (hoogstens %(max_length)s karakters)" +msgid "String (unlimited)" +msgstr "String (onbeperk)" + msgid "Comma-separated integers" msgstr "Heelgetalle geskei met kommas" @@ -478,12 +531,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Die waarde “%(value)s” het ’n ongeldige datumformaat. Dit moet in die " +"formaat JJJJ-MM-DD wees." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD), maar dit is ’n " +"ongeldige datum." msgid "Date (without time)" msgstr "Datum (sonder die tyd)" @@ -493,19 +550,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Die waarde “%(value)s” se formaat is ongeldig. Dit moet in die formaat JJJJ-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ] wees." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Die waarde “%(value)s” het die korrekte formaat (JJJJ-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ]) maar dit is ’n ongeldige datum/tyd." msgid "Date (with time)" msgstr "Datum (met die tyd)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s”-waarde moet ’n desimale getal wees." msgid "Decimal number" msgstr "Desimale getal" @@ -515,6 +576,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Die waarde “%(value)s” het ’n ongeldige formaat. Dit moet in die formaat " +"[DD] [HH:[MM:]]ss[.uuuuuu] wees." msgid "Duration" msgstr "Duur" @@ -527,14 +590,14 @@ msgstr "Lêerpad" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Die waarde “%(value)s” moet ’n dryfpuntgetal wees." msgid "Floating point number" msgstr "Dryfpuntgetal" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Die waarde “%(value)s” moet ’n heelgetal wees." msgid "Integer" msgstr "Heelgetal" @@ -542,6 +605,9 @@ msgstr "Heelgetal" msgid "Big (8 byte) integer" msgstr "Groot (8 greep) heelgetal" +msgid "Small integer" +msgstr "Klein heelgetal" + msgid "IPv4 address" msgstr "IPv4-adres" @@ -550,11 +616,14 @@ msgstr "IP-adres" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s”-waarde moet een wees uit None, True of False." msgid "Boolean (Either True, False or None)" msgstr "Boole (True, False, of None)" +msgid "Positive big integer" +msgstr "Positiewe groot heelgetal" + msgid "Positive integer" msgstr "Positiewe heelgetal" @@ -565,9 +634,6 @@ msgstr "Klein positiewe heelgetal" msgid "Slug (up to %(max_length)s)" msgstr "Slug (tot en met %(max_length)s karakters)" -msgid "Small integer" -msgstr "Klein heelgetal" - msgid "Text" msgstr "Teks" @@ -576,12 +642,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s”-waarde het ’n ongeldige formaat. Dit moet geformateer word as HH:" +"MM[:ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Die waarde “%(value)s” het die regte formaat (HH:MM[:ss[.uuuuuu]]) maar is " +"nie ’n geldige tyd nie." msgid "Time" msgstr "Tyd" @@ -594,7 +664,7 @@ msgstr "Rou binêre data" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” is nie ’n geldige UUID nie." msgid "Universally unique identifier" msgstr "Universeel unieke identifiseerder" @@ -605,6 +675,12 @@ msgstr "Lêer" msgid "Image" msgstr "Prent" +msgid "A JSON object" +msgstr "’n JSON-objek" + +msgid "Value must be valid JSON." +msgstr "Waarde moet geldige JSON wees." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s-objek met %(field)s %(value)r bestaan nie." @@ -662,7 +738,7 @@ msgid "No file was submitted." msgstr "Geen lêer is ingedien nie." msgid "The submitted file is empty." -msgstr "Die ingedien lêer is leeg." +msgstr "Die ingediende lêer is leeg." #, python-format msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." @@ -676,7 +752,7 @@ msgstr[1] "" "%(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "Dien die lêer in óf merk die Maak skoon-boksie, nie altwee nie." +msgstr "Dien die lêer in óf merk die Maak skoon-boksie, nie altwee nie." msgid "" "Upload a valid image. The file you uploaded was either not an image or a " @@ -688,7 +764,7 @@ msgstr "" #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" -"Kies 'n geldige keuse. %(value)s is nie een van die beskikbare keuses nie." +"Kies ’n geldige keuse. %(value)s is nie een van die beskikbare keuses nie." msgid "Enter a list of values." msgstr "Tik ’n lys waardes in." @@ -699,6 +775,9 @@ msgstr "Tik ’n volledige waarde in." msgid "Enter a valid UUID." msgstr "Tik ’n geldig UUID in." +msgid "Enter a valid JSON." +msgstr "Gee geldige JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -707,20 +786,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Versteekte veld %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Die ManagementForm-data ontbreek of is mee gepeuter" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Dien asseblief %d of minder vorms in." -msgstr[1] "Dien asseblief %d of minder vorms in." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Dien asseblief hoogstens %(num)d vorm in." +msgstr[1] "Dien asseblief hoogstens %(num)d vorms in." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Dien asseblief %d of meer vorms in." -msgstr[1] "Dien asseblief %d of meer vorms in." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Dien asseblief ten minste %(num)d vorm in." +msgstr[1] "Dien asseblief ten minste %(num)d vorms in." msgid "Order" msgstr "Orde" @@ -757,13 +839,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” is nie ’n geldige waarde nie." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s kon nie in die tydsone %(current_timezone)s vertolk word nie; " +"dit is dalk dubbelsinnig, of bestaan dalk nie." msgid "Clear" msgstr "Maak skoon" @@ -783,15 +867,7 @@ msgstr "Ja" msgid "No" msgstr "Nee" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nee,miskien" @@ -1065,43 +1141,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d jaar" -msgstr[1] "%d jare" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d jaar" +msgstr[1] "%(num)d jaar" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d maand" -msgstr[1] "%d maande" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d maand" +msgstr[1] "%(num)d maande" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d week" -msgstr[1] "%d weke" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d week" +msgstr[1] "%(num)d weke" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dae" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dae" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d uur" -msgstr[1] "%d ure" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d uur" +msgstr[1] "%(num)d uur" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuut" -msgstr[1] "%d minute" - -msgid "0 minutes" -msgstr "0 minute" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuut" +msgstr[1] "%(num)d minute" msgid "Forbidden" msgstr "Verbode" @@ -1111,24 +1184,36 @@ msgstr "CSRF-verifikasie het misluk. Versoek is laat val." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"U sien hierdie boodskap omdat dié HTTPS-werf vereis dat u webblaaier ’n " +"“Referer header” moet stuur, maar dit is nie gestuur nie. Hierdie header is " +"vir sekuriteitsredes nodig om te verseker dat u blaaier nie deur derde " +"partye gekaap is nie." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"As “Referer headers” in u blaaier gedeaktiveer is, heraktiveer hulle asb. " +"ten minste vir dié werf, of vir HTTPS-verbindings, of vir “same-origin”-" +"versoeke." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Indien u die -etiket gebruik " +"of die “Referrer-Policy: no-referrer” header gebruik, verwyder hulle asb. " +"Die CSRF-beskerming vereis die “Referer” header om streng kontrole van die " +"verwysende bladsy te doen. Indien u besorg is oor privaatheid, gebruik " +"alternatiewe soos vir skakels na derdepartywebwerwe." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1143,6 +1228,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Indien koekies in u blaaier gedeaktiveer is, aktiveerder hulle asb. ten " +"minste vir dié werf, of vir “same-origin”-versoeke." msgid "More information is available with DEBUG=True." msgstr "Meer inligting is beskikbaar met DEBUG=True." @@ -1176,7 +1263,7 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Ongeldige datumstring “%(datestr)s” gegewe die formaat “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1184,6 +1271,7 @@ msgstr "Geen %(verbose_name)s gevind vir die soektog" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Bladsy is nie “last” nie, en dit kan nie omgeskakel word na ’n heelgetal nie." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1191,21 +1279,21 @@ msgstr "Ongeldige bladsy (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Leë lys en “%(class_name)s.allow_empty” is vals." msgid "Directory indexes are not allowed here." msgstr "Gidsindekse word nie hier toegelaat nie." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” bestaan nie." #, python-format msgid "Index of %(directory)s" msgstr "Indeks van %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: die webraamwerk vir perfeksioniste met sperdatums." +msgid "The install worked successfully! Congratulations!" +msgstr "Die installasie was suksesvol! Geluk!" #, python-format msgid "" @@ -1216,19 +1304,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">vrystellingsnotas vir Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Die installasie was suksesvol! Geluk!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "U sien dié bladsy omdat DEBUG=True in die settings-lêer is en geen URL’e opgestel is nie." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True in die settings-lêer is en geen URL’e " +"opgestel is nie." msgid "Django Documentation" msgstr "Django-dokumentasie" diff --git a/django/conf/locale/ar/LC_MESSAGES/django.mo b/django/conf/locale/ar/LC_MESSAGES/django.mo index 305512b25b09..f0a041294326 100644 Binary files a/django/conf/locale/ar/LC_MESSAGES/django.mo and b/django/conf/locale/ar/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ar/LC_MESSAGES/django.po b/django/conf/locale/ar/LC_MESSAGES/django.po index a7c6bbada06a..25a491b5a6e9 100644 --- a/django/conf/locale/ar/LC_MESSAGES/django.po +++ b/django/conf/locale/ar/LC_MESSAGES/django.po @@ -1,18 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Bashar Al-Abdulhadi, 2015-2016 +# Bashar Al-Abdulhadi, 2015-2016,2020-2021 # Bashar Al-Abdulhadi, 2014 # Eyad Toma , 2013-2014 # Jannis Leidel , 2011 +# Mariusz Felisiak , 2021 +# Muaaz Alsaied, 2020 +# Omar Al-Ithawi , 2020 # Ossama Khayat , 2011 +# Tony xD , 2020 +# صفا الفليج , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-24 16:27+0000\n" +"Last-Translator: Mariusz Felisiak \n" "Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,6 +32,9 @@ msgstr "الإفريقية" msgid "Arabic" msgstr "العربيّة" +msgid "Algerian Arabic" +msgstr "عربي جزائري" + msgid "Asturian" msgstr "الأسترية" @@ -142,7 +150,7 @@ msgid "Hungarian" msgstr "الهنغاريّة" msgid "Armenian" -msgstr "" +msgstr "الأرمنية" msgid "Interlingua" msgstr "اللغة الوسيطة" @@ -150,6 +158,9 @@ msgstr "اللغة الوسيطة" msgid "Indonesian" msgstr "الإندونيسيّة" +msgid "Igbo" +msgstr "الإيبو" + msgid "Ido" msgstr "ايدو" @@ -166,7 +177,7 @@ msgid "Georgian" msgstr "الجورجيّة" msgid "Kabyle" -msgstr "" +msgstr "القبائل" msgid "Kazakh" msgstr "الكازاخستانية" @@ -180,6 +191,9 @@ msgstr "الهنديّة (كنّادا)" msgid "Korean" msgstr "الكوريّة" +msgid "Kyrgyz" +msgstr "قيرغيز" + msgid "Luxembourgish" msgstr "اللوكسمبرجية" @@ -201,6 +215,9 @@ msgstr "المنغوليّة" msgid "Marathi" msgstr "المهاراتية" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "البورمية" @@ -264,9 +281,15 @@ msgstr "التاميل" msgid "Telugu" msgstr "التيلوغو" +msgid "Tajik" +msgstr "طاجيك" + msgid "Thai" msgstr "التايلنديّة" +msgid "Turkmen" +msgstr "تركمان" + msgid "Turkish" msgstr "التركيّة" @@ -283,7 +306,7 @@ msgid "Urdu" msgstr "الأوردو" msgid "Uzbek" -msgstr "" +msgstr "الأوزبكي" msgid "Vietnamese" msgstr "الفيتناميّة" @@ -306,48 +329,55 @@ msgstr "الملفات الثابتة" msgid "Syndication" msgstr "توظيف النشر" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" -msgstr "" +msgstr "رقم الصفحة هذا ليس عدداً طبيعياً" msgid "That page number is less than 1" -msgstr "" +msgstr "رقم الصفحة أقل من 1" msgid "That page contains no results" -msgstr "" +msgstr "هذه الصفحة لا تحتوي على نتائج" msgid "Enter a valid value." -msgstr "أدخل قيمة صحيحة." +msgstr "أدخِل قيمة صحيحة." msgid "Enter a valid URL." -msgstr "أدخل رابطاً صحيحاً." +msgstr "أدخِل رابطًا صحيحًا." msgid "Enter a valid integer." -msgstr "أدخل رقم صالح." +msgstr "أدخِل عدداً طبيعياً." msgid "Enter a valid email address." -msgstr "أدخل عنوان بريد إلكتروني صحيح." +msgstr "أدخِل عنوان بريد إلكتروني صحيح." #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" +msgstr "أدخل اختصار 'slug' صحيح يتكوّن من أحرف، أرقام، شرطات سفلية وعاديّة." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"أدخل اختصار 'slug' صحيح يتكون من أحرف Unicode أو أرقام أو شرطات سفلية أو " +"واصلات." msgid "Enter a valid IPv4 address." -msgstr "أدخل عنوان IPv4 صحيح." +msgstr "أدخِل عنوان IPv4 صحيح." msgid "Enter a valid IPv6 address." -msgstr "أدخل عنوان IPv6 صحيح." +msgstr "أدخِل عنوان IPv6 صحيح." msgid "Enter a valid IPv4 or IPv6 address." -msgstr "أدخل عنوان IPv4 أو عنوان IPv6 صحيح." +msgstr "أدخِل عنوان IPv4 أو عنوان IPv6 صحيح." msgid "Enter only digits separated by commas." -msgstr "أدخل أرقاما فقط مفصول بينها بفواصل." +msgstr "أدخِل فقط أرقامًا تفصلها الفواصل." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." @@ -453,9 +483,11 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" +"%(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "الأحرف الخالية غير مسموح بها." msgid "and" msgstr "و" @@ -492,11 +524,11 @@ msgstr "حقل نوع: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "قيمة '%(value)s' يجب أن تكون True أو False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "قيمة “%(value)s” يجب أن تكون True , False أو None." msgid "Boolean (Either True or False)" msgstr "ثنائي (إما True أو False)" @@ -513,12 +545,14 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"قيمة '%(value)s' ليست من بُنية تاريخ صحيحة. القيمة يجب ان تكون من البُنية YYYY-" +"MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD) لكنها تحوي تاريخ غير صحيح." msgid "Date (without time)" msgstr "التاريخ (دون الوقت)" @@ -528,19 +562,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"قيمة '%(value)s' ليست من بُنية صحيحة. القيمة يجب ان تكون من البُنية YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ] ." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"قيمة '%(value)s' من بُنية صحيحة (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) لكنها " +"تحوي وقت و تاريخ غير صحيحين." msgid "Date (with time)" msgstr "التاريخ (مع الوقت)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "قيمة '%(value)s' يجب ان تكون عدد عشري." msgid "Decimal number" msgstr "رقم عشري" @@ -550,6 +588,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق ([DD] " +"[[HH:]MM:]ss[.uuuuuu])" msgid "Duration" msgstr "المدّة" @@ -562,14 +602,14 @@ msgstr "مسار الملف" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "قيمة '%(value)s' يجب ان تكون عدد تعويم." msgid "Floating point number" msgstr "رقم فاصلة عائمة" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "قيمة '%(value)s' يجب ان تكون عدد طبيعي." msgid "Integer" msgstr "عدد صحيح" @@ -577,6 +617,9 @@ msgstr "عدد صحيح" msgid "Big (8 byte) integer" msgstr "عدد صحيح كبير (8 بايت)" +msgid "Small integer" +msgstr "عدد صحيح صغير" + msgid "IPv4 address" msgstr "عنوان IPv4" @@ -585,11 +628,14 @@ msgstr "عنوان IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "قيمة '%(value)s' يجب ان تكون None أو True أو False." msgid "Boolean (Either True, False or None)" msgstr "ثنائي (إما True أو False أو None)" +msgid "Positive big integer" +msgstr "عدد صحيح موجب كبير" + msgid "Positive integer" msgstr "عدد صحيح موجب" @@ -600,9 +646,6 @@ msgstr "عدد صحيح صغير موجب" msgid "Slug (up to %(max_length)s)" msgstr "Slug (حتى %(max_length)s)" -msgid "Small integer" -msgstr "عدد صحيح صغير" - msgid "Text" msgstr "نص" @@ -611,12 +654,15 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"قيمة '%(value)s' ليست بنسق صحيح. القيمة يجب ان تكون من التنسيق\n" +"HH:MM[:ss[.uuuuuu]]" #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"قيمة '%(value)s' من بُنية صحيحة (HH:MM[:ss[.uuuuuu]]) لكنها تحوي وقت غير صحيح." msgid "Time" msgstr "وقت" @@ -629,10 +675,10 @@ msgstr "البيانات الثنائية الخام" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "القيمة \"%(value)s\" ليست UUID صالح." msgid "Universally unique identifier" -msgstr "" +msgstr "معرّف فريد عالمياً" msgid "File" msgstr "ملف" @@ -640,6 +686,12 @@ msgstr "ملف" msgid "Image" msgstr "صورة" +msgid "A JSON object" +msgstr "كائن JSON" + +msgid "Value must be valid JSON." +msgstr "يجب أن تكون قيمة JSON صالحة." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." @@ -687,7 +739,7 @@ msgstr "أدخل مدّة صحيحة" #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "يجب أن يكون عدد الأيام بين {min_days} و {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." @@ -744,6 +796,9 @@ msgstr "إدخال قيمة كاملة." msgid "Enter a valid UUID." msgstr "أدخل قيمة UUID صحيحة." +msgid "Enter a valid JSON." +msgstr "أدخل مدخل JSON صالح." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -752,28 +807,33 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(الحقل الخفي %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "بيانات ManagementForm مفقودة أو تم العبث بها" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"بيانات نموذج الإدارة مفقودة أو تم العبث بها. الحقول المفقودة: " +"%(field_names)s. قد تحتاج إلى تقديم تقرير خطأ إذا استمرت المشكلة." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "الرجاء إرسال %d إستمارة أو أقل." -msgstr[1] "الرجاء إرسال إستمارة %d أو أقل" -msgstr[2] "الرجاء إرسال %d إستمارتين أو أقل" -msgstr[3] "الرجاء إرسال %d إستمارة أو أقل" -msgstr[4] "الرجاء إرسال %d إستمارة أو أقل" -msgstr[5] "الرجاء إرسال %d إستمارة أو أقل" +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "الرجاء إرسال %d إستمارة على الأكثر." +msgstr[1] "الرجاء إرسال %d إستمارة على الأكثر." +msgstr[2] "الرجاء إرسال %d إستمارة على الأكثر." +msgstr[3] "الرجاء إرسال %d إستمارة على الأكثر." +msgstr[4] "الرجاء إرسال %d إستمارة على الأكثر." +msgstr[5] "الرجاء إرسال %d إستمارة على الأكثر." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "الرجاء إرسال %d إستمارة أو أكثر." -msgstr[1] "الرجاء إرسال إستمارة %d أو أكثر." -msgstr[2] "الرجاء إرسال %d إستمارتين أو أكثر." -msgstr[3] "الرجاء إرسال %d إستمارة أو أكثر." -msgstr[4] "الرجاء إرسال %d إستمارة أو أكثر." -msgstr[5] "الرجاء إرسال %d إستمارة أو أكثر." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "الرجاء إرسال %d إستمارة على الأقل." +msgstr[1] "الرجاء إرسال %d إستمارة على الأقل." +msgstr[2] "الرجاء إرسال %d إستمارة على الأقل." +msgstr[3] "الرجاء إرسال %d إستمارة على الأقل." +msgstr[4] "الرجاء إرسال %d إستمارة على الأقل." +msgstr[5] "الرجاء إرسال %d إستمارة على الأقل." msgid "Order" msgstr "الترتيب" @@ -801,20 +861,22 @@ msgid "Please correct the duplicate values below." msgstr "رجاءً صحّح القيم المُكرّرة أدناه." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "لا تتطابق القيمة المضمنة مع المثيل الأصلي." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" ليست قيمة صالحة." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s لا يمكن تفسيرها في المنطقة الزمنية %(current_timezone)s; قد " +"تكون غامضة أو أنها غير موجودة." msgid "Clear" msgstr "تفريغ" @@ -834,15 +896,7 @@ msgstr "نعم" msgid "No" msgstr "لا" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "نعم,لا,ربما" @@ -1110,7 +1164,7 @@ msgstr "هذا ليس عنوان IPv6 صحيح." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "أو" @@ -1120,67 +1174,64 @@ msgid ", " msgstr "، " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d سنة" -msgstr[1] "%d سنة" -msgstr[2] "%d سنوات" -msgstr[3] "%d سنوات" -msgstr[4] "%d سنوات" -msgstr[5] "%d سنوات" - -#, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d شهر" -msgstr[1] "%d شهر" -msgstr[2] "%d شهرين" -msgstr[3] "%d أشهر" -msgstr[4] "%d شهر" -msgstr[5] "%d شهر" - -#, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d اسبوع." -msgstr[1] "%d اسبوع." -msgstr[2] "%d أسبوعين" -msgstr[3] "%d أسابيع" -msgstr[4] "%d اسبوع." -msgstr[5] "%d أسبوع" - -#, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d يوم" -msgstr[1] "%d يوم" -msgstr[2] "%d يومان" -msgstr[3] "%d أيام" -msgstr[4] "%d يوم" -msgstr[5] "%d يوم" - -#, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ساعة" -msgstr[1] "%d ساعة واحدة" -msgstr[2] "%d ساعتين" -msgstr[3] "%d ساعات" -msgstr[4] "%d ساعة" -msgstr[5] "%d ساعة" - -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d دقيقة" -msgstr[1] "%d دقيقة" -msgstr[2] "%d دقيقتين" -msgstr[3] "%d دقائق" -msgstr[4] "%d دقيقة" -msgstr[5] "%d دقيقة" - -msgid "0 minutes" -msgstr "0 دقيقة" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d سنة" +msgstr[1] "%(num)d سنة" +msgstr[2] "%(num)d سنتين" +msgstr[3] "%(num)d سنوات" +msgstr[4] "%(num)d سنوات" +msgstr[5] "%(num)d سنوات" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d شهر" +msgstr[1] "%(num)d شهر" +msgstr[2] "%(num)d شهرين" +msgstr[3] "%(num)d أشهر" +msgstr[4] "%(num)d أشهر" +msgstr[5] "%(num)d أشهر" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d أسبوع" +msgstr[1] "%(num)d أسبوع" +msgstr[2] "%(num)d أسبوعين" +msgstr[3] "%(num)d أسابيع" +msgstr[4] "%(num)d أسابيع" +msgstr[5] "%(num)d أسابيع" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d يوم" +msgstr[1] "%(num)d يوم" +msgstr[2] "%(num)d يومين" +msgstr[3] "%(num)d أيام" +msgstr[4] "%(num)d يوم" +msgstr[5] "%(num)d أيام" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d ساعة" +msgstr[1] "%(num)d ساعة" +msgstr[2] "%(num)d ساعتين" +msgstr[3] "%(num)d ساعات" +msgstr[4] "%(num)d ساعة" +msgstr[5] "%(num)d ساعات" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d دقيقة" +msgstr[1] "%(num)d دقيقة" +msgstr[2] "%(num)d دقيقتين" +msgstr[3] "%(num)d دقائق" +msgstr[4] "%(num)d دقيقة" +msgstr[5] "%(num)d دقيقة" msgid "Forbidden" msgstr "ممنوع" @@ -1190,16 +1241,21 @@ msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب إرسال “Referer header” بواسطة " +"متصفح الويب الخاص بك، ولكن لم يتم إرسال أي منها. هذا مطلوب لأسباب أمنية، " +"لضمان عدم اختطاف متصفحك من قبل أطراف ثالثة." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"إذا قمت بتكوين المستعرض لتعطيل رؤوس “Referer” ، فيرجى إعادة تمكينها ، على " +"الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-origin”." msgid "" "If you are using the tag or " @@ -1208,6 +1264,10 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"إذا كنت تستخدم العلامة أو " +"تضمين رأس “Referrer-Policy: no-referrer”، يرجى إزالتها. تتطلب حماية CSRF أن " +"يقوم رأس “Referer” بإجراء فحص صارم للمراجع. إذا كنت قلقًا بشأن الخصوصية ، " +"فاستخدم بدائل مثل للروابط إلى مواقع الجهات الخارجية." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1222,6 +1282,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"إذا قمت بضبط المتصفح لتعطيل الكوكيز الرجاء إعادة تغعيلها، على الأقل بالنسبة " +"لهذا الموقع، أو للطلبات من “same-origin”." msgid "More information is available with DEBUG=True." msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." @@ -1230,7 +1292,7 @@ msgid "No year specified" msgstr "لم تحدد السنة" msgid "Date out of range" -msgstr "" +msgstr "التاريخ خارج النطاق" msgid "No month specified" msgstr "لم تحدد الشهر" @@ -1255,14 +1317,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "نسق تاريخ غير صحيح \"%(datestr)s\" محدد بالشكل ''%(format)s\"" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "الصفحة ليست \"الأخيرة\"، كما لا يمكن تحويل القيمة إلى رقم طبيعي." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1271,29 +1333,31 @@ msgstr "صفحة خاطئة (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" +"قائمة فارغة و\n" +"\"%(class_name)s.allow_empty\"\n" +"قيمته False." msgid "Directory indexes are not allowed here." msgstr "لا يسمح لفهارس الدليل هنا." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "”%(path)s“ غير موجود" #, python-format msgid "Index of %(directory)s" msgstr "فهرس لـ %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "تمت عملية التنصيب بنجاح! تهانينا!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"استعراض ملاحظات الإصدار لجانغو %(version)s" #, python-format msgid "" @@ -1302,21 +1366,24 @@ msgid "" "\">DEBUG=True is in your settings file and you have not configured any " "URLs." msgstr "" +"تظهر لك هذه الصفحة لأن DEBUG=True في ملف settings خاصتك كما أنك لم تقم بإعداد الروابط URLs." msgid "Django Documentation" -msgstr "" +msgstr "وثائق تعليمات جانغو" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "المواضيع و المراجع و التعليمات" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "برنامج تعليمي: تطبيق تصويت" msgid "Get started with Django" -msgstr "" +msgstr "إبدأ مع جانغو" msgid "Django Community" -msgstr "" +msgstr "مجتمع جانغو" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "اتصل بنا أو احصل على مساعدة أو ساهم" diff --git a/django/conf/locale/ar/formats.py b/django/conf/locale/ar/formats.py index 19cc8601b75f..8008ce6ec431 100644 --- a/django/conf/locale/ar/formats.py +++ b/django/conf/locale/ar/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F، Y' -TIME_FORMAT = 'g:i A' +DATE_FORMAT = "j F، Y" +TIME_FORMAT = "g:i A" # DATETIME_FORMAT = -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd‏/m‏/Y' +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d‏/m‏/Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." # NUMBER_GROUPING = diff --git a/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo b/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..3c0e32405b1c Binary files /dev/null and b/django/conf/locale/ar_DZ/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ar_DZ/LC_MESSAGES/django.po b/django/conf/locale/ar_DZ/LC_MESSAGES/django.po new file mode 100644 index 000000000000..b32da348689b --- /dev/null +++ b/django/conf/locale/ar_DZ/LC_MESSAGES/django.po @@ -0,0 +1,1397 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jihad Bahmaid Al-Halki, 2022 +# Riterix , 2019-2020 +# Riterix , 2019 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-05-17 05:23-0500\n" +"PO-Revision-Date: 2022-07-25 06:49+0000\n" +"Last-Translator: Jihad Bahmaid Al-Halki\n" +"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" +"language/ar_DZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_DZ\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +msgid "Afrikaans" +msgstr "الإفريقية" + +msgid "Arabic" +msgstr "العربية" + +msgid "Algerian Arabic" +msgstr "العربية الجزائرية" + +msgid "Asturian" +msgstr "الأسترية" + +msgid "Azerbaijani" +msgstr "الأذربيجانية" + +msgid "Bulgarian" +msgstr "البلغارية" + +msgid "Belarusian" +msgstr "البيلاروسية" + +msgid "Bengali" +msgstr "البنغالية" + +msgid "Breton" +msgstr "البريتونية" + +msgid "Bosnian" +msgstr "البوسنية" + +msgid "Catalan" +msgstr "الكتلانية" + +msgid "Czech" +msgstr "التشيكية" + +msgid "Welsh" +msgstr "الويلز" + +msgid "Danish" +msgstr "الدنماركية" + +msgid "German" +msgstr "الألمانية" + +msgid "Lower Sorbian" +msgstr "الصربية السفلى" + +msgid "Greek" +msgstr "اليونانية" + +msgid "English" +msgstr "الإنجليزية" + +msgid "Australian English" +msgstr "الإنجليزية الإسترالية" + +msgid "British English" +msgstr "الإنجليزية البريطانية" + +msgid "Esperanto" +msgstr "الاسبرانتو" + +msgid "Spanish" +msgstr "الإسبانية" + +msgid "Argentinian Spanish" +msgstr "الأسبانية الأرجنتينية" + +msgid "Colombian Spanish" +msgstr "الكولومبية الإسبانية" + +msgid "Mexican Spanish" +msgstr "الأسبانية المكسيكية" + +msgid "Nicaraguan Spanish" +msgstr "الإسبانية النيكاراغوية" + +msgid "Venezuelan Spanish" +msgstr "الإسبانية الفنزويلية" + +msgid "Estonian" +msgstr "الإستونية" + +msgid "Basque" +msgstr "الباسك" + +msgid "Persian" +msgstr "الفارسية" + +msgid "Finnish" +msgstr "الفنلندية" + +msgid "French" +msgstr "الفرنسية" + +msgid "Frisian" +msgstr "الفريزية" + +msgid "Irish" +msgstr "الإيرلندية" + +msgid "Scottish Gaelic" +msgstr "الغيلية الأسكتلندية" + +msgid "Galician" +msgstr "الجليقية" + +msgid "Hebrew" +msgstr "العبرية" + +msgid "Hindi" +msgstr "الهندية" + +msgid "Croatian" +msgstr "الكرواتية" + +msgid "Upper Sorbian" +msgstr "الصربية العليا" + +msgid "Hungarian" +msgstr "الهنغارية" + +msgid "Armenian" +msgstr "الأرمنية" + +msgid "Interlingua" +msgstr "اللغة الوسيطة" + +msgid "Indonesian" +msgstr "الإندونيسية" + +msgid "Igbo" +msgstr "إيبو" + +msgid "Ido" +msgstr "ايدو" + +msgid "Icelandic" +msgstr "الآيسلندية" + +msgid "Italian" +msgstr "الإيطالية" + +msgid "Japanese" +msgstr "اليابانية" + +msgid "Georgian" +msgstr "الجورجية" + +msgid "Kabyle" +msgstr "القبائلية" + +msgid "Kazakh" +msgstr "الكازاخستانية" + +msgid "Khmer" +msgstr "الخمر" + +msgid "Kannada" +msgstr "الهندية (كنّادا)" + +msgid "Korean" +msgstr "الكورية" + +msgid "Kyrgyz" +msgstr "القيرغيزية" + +msgid "Luxembourgish" +msgstr "اللوكسمبرجية" + +msgid "Lithuanian" +msgstr "اللتوانية" + +msgid "Latvian" +msgstr "اللاتفية" + +msgid "Macedonian" +msgstr "المقدونية" + +msgid "Malayalam" +msgstr "المايالام" + +msgid "Mongolian" +msgstr "المنغولية" + +msgid "Marathi" +msgstr "المهاراتية" + +msgid "Malay" +msgstr "ملاي" + +msgid "Burmese" +msgstr "البورمية" + +msgid "Norwegian Bokmål" +msgstr "النرويجية" + +msgid "Nepali" +msgstr "النيبالية" + +msgid "Dutch" +msgstr "الهولندية" + +msgid "Norwegian Nynorsk" +msgstr "النينورسك نرويجية" + +msgid "Ossetic" +msgstr "الأوسيتيكية" + +msgid "Punjabi" +msgstr "البنجابية" + +msgid "Polish" +msgstr "البولندية" + +msgid "Portuguese" +msgstr "البرتغالية" + +msgid "Brazilian Portuguese" +msgstr "البرتغالية البرازيلية" + +msgid "Romanian" +msgstr "الرومانية" + +msgid "Russian" +msgstr "الروسية" + +msgid "Slovak" +msgstr "السلوفاكية" + +msgid "Slovenian" +msgstr "السلوفانية" + +msgid "Albanian" +msgstr "الألبانية" + +msgid "Serbian" +msgstr "الصربية" + +msgid "Serbian Latin" +msgstr "اللاتينية الصربية" + +msgid "Swedish" +msgstr "السويدية" + +msgid "Swahili" +msgstr "السواحلية" + +msgid "Tamil" +msgstr "التاميل" + +msgid "Telugu" +msgstr "التيلوغو" + +msgid "Tajik" +msgstr "الطاجيكية" + +msgid "Thai" +msgstr "التايلندية" + +msgid "Turkmen" +msgstr "" + +msgid "Turkish" +msgstr "التركية" + +msgid "Tatar" +msgstr "التتاريية" + +msgid "Udmurt" +msgstr "الأدمرتية" + +msgid "Ukrainian" +msgstr "الأكرانية" + +msgid "Urdu" +msgstr "الأوردو" + +msgid "Uzbek" +msgstr "الأوزبكية" + +msgid "Vietnamese" +msgstr "الفيتنامية" + +msgid "Simplified Chinese" +msgstr "الصينية المبسطة" + +msgid "Traditional Chinese" +msgstr "الصينية التقليدية" + +msgid "Messages" +msgstr "الرسائل" + +msgid "Site Maps" +msgstr "خرائط الموقع" + +msgid "Static Files" +msgstr "الملفات الثابتة" + +msgid "Syndication" +msgstr "توظيف النشر" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + +msgid "That page number is not an integer" +msgstr "رقم الصفحة ليس عددًا صحيحًا" + +msgid "That page number is less than 1" +msgstr "رقم الصفحة أقل من 1" + +msgid "That page contains no results" +msgstr "هذه الصفحة لا تحتوي على نتائج" + +msgid "Enter a valid value." +msgstr "أدخل قيمة صحيحة." + +msgid "Enter a valid URL." +msgstr "أدخل رابطاً صحيحاً." + +msgid "Enter a valid integer." +msgstr "أدخل رقم صالح." + +msgid "Enter a valid email address." +msgstr "أدخل عنوان بريد إلكتروني صحيح." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"أدخل “slug” صالحة تتكون من أحرف أو أرقام أو الشرطة السفلية أو الواصلات." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"أدخل “slug” صالحة تتكون من أحرف Unicode أو الأرقام أو الشرطة السفلية أو " +"الواصلات." + +msgid "Enter a valid IPv4 address." +msgstr "أدخل عنوان IPv4 صحيح." + +msgid "Enter a valid IPv6 address." +msgstr "أدخل عنوان IPv6 صحيح." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "أدخل عنوان IPv4 أو عنوان IPv6 صحيح." + +msgid "Enter only digits separated by commas." +msgstr "أدخل أرقاما فقط مفصول بينها بفواصل." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "تحقق من أن هذه القيمة هي %(limit_value)s (إنها %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "تحقق من أن تكون هذه القيمة أقل من %(limit_value)s أو مساوية لها." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "تحقق من أن تكون هذه القيمة أكثر من %(limit_value)s أو مساوية لها." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[1] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[2] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[3] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[4] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[5] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأقل (هي تحتوي " +"حالياً على %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[1] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[2] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[3] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[4] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." +msgstr[5] "" +"تأكد أن هذه القيمة تحتوي على %(limit_value)d حرف أو رمز على الأكثر (هي تحتوي " +"حالياً على %(show_value)d)." + +msgid "Enter a number." +msgstr "أدخل رقماً." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "تحقق من أن تدخل %(max)s أرقام لا أكثر." +msgstr[1] "تحقق من أن تدخل رقم %(max)s لا أكثر." +msgstr[2] "تحقق من أن تدخل %(max)s رقمين لا أكثر." +msgstr[3] "تحقق من أن تدخل %(max)s أرقام لا أكثر." +msgstr[4] "تحقق من أن تدخل %(max)s أرقام لا أكثر." +msgstr[5] "تحقق من أن تدخل %(max)s أرقام لا أكثر." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." +msgstr[1] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." +msgstr[2] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." +msgstr[3] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." +msgstr[4] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." +msgstr[5] "تحقق من أن تدخل %(max)s خانات عشرية لا أكثر." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." +msgstr[1] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." +msgstr[2] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." +msgstr[3] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." +msgstr[4] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." +msgstr[5] "تحقق من أن تدخل %(max)s أرقام قبل الفاصل العشري لا أكثر." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"امتداد الملف “%(extension)s” غير مسموح به. الامتدادات المسموح بها هي:" +"%(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "لا يُسمح بالأحرف الخالية." + +msgid "and" +msgstr "و" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s بهذا %(field_labels)s موجود سلفاً." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "القيمة %(value)r ليست خيارا صحيحاً." + +msgid "This field cannot be null." +msgstr "لا يمكن ترك هذا الحقل خالي." + +msgid "This field cannot be blank." +msgstr "لا يمكن ترك هذا الحقل فارغاً." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "النموذج %(model_name)s والحقل %(field_label)s موجود مسبقاً." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s يجب أن يكون فريد لـ %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "حقل نوع: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "يجب أن تكون القيمة “%(value)s” إما True أو False أو None." + +msgid "Boolean (Either True or False)" +msgstr "ثنائي (إما True أو False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "سلسلة نص (%(max_length)s كحد أقصى)" + +msgid "Comma-separated integers" +msgstr "أرقام صحيحة مفصولة بفواصل" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"تحتوي القيمة “%(value)s” على تنسيق تاريخ غير صالح. يجب أن يكون بتنسيق YYYY-" +"MM-DD." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD) ولكنه تاريخ غير " +"صالح." + +msgid "Date (without time)" +msgstr "التاريخ (دون الوقت)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق YYYY-MM-DD " +"HH: MM [: ss [.uuuuuu]] [TZ]." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"تحتوي القيمة “%(value)s” على التنسيق الصحيح (YYYY-MM-DD HH: MM [: ss [." +"uuuuuu]] [TZ]) ولكنها تعد تاريخًا / وقتًا غير صالحين." + +msgid "Date (with time)" +msgstr "التاريخ (مع الوقت)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "يجب أن تكون القيمة “%(value)s” رقمًا عشريًا." + +msgid "Decimal number" +msgstr "رقم عشري" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق [DD] [[HH:] " +"MM:] ss [.uuuuuu]." + +msgid "Duration" +msgstr "المدّة" + +msgid "Email address" +msgstr "عنوان بريد إلكتروني" + +msgid "File path" +msgstr "مسار الملف" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "يجب أن تكون القيمة “%(value)s” قيمة عائمة." + +msgid "Floating point number" +msgstr "رقم فاصلة عائمة" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "يجب أن تكون القيمة “%(value)s” عددًا صحيحًا." + +msgid "Integer" +msgstr "عدد صحيح" + +msgid "Big (8 byte) integer" +msgstr "عدد صحيح كبير (8 بايت)" + +msgid "Small integer" +msgstr "عدد صحيح صغير" + +msgid "IPv4 address" +msgstr "عنوان IPv4" + +msgid "IP address" +msgstr "عنوان IP" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "يجب أن تكون القيمة “%(value)s” إما None أو True أو False." + +msgid "Boolean (Either True, False or None)" +msgstr "ثنائي (إما True أو False أو None)" + +msgid "Positive big integer" +msgstr "عدد صحيح كبير موجب" + +msgid "Positive integer" +msgstr "عدد صحيح موجب" + +msgid "Positive small integer" +msgstr "عدد صحيح صغير موجب" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (حتى %(max_length)s)" + +msgid "Text" +msgstr "نص" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"تحتوي القيمة “%(value)s” على تنسيق غير صالح. يجب أن يكون بتنسيق HH: MM [: ss " +"[.uuuuuu]]." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"تحتوي القيمة “%(value)s” على التنسيق الصحيح (HH: MM [: ss [.uuuuuu]]) ولكنه " +"وقت غير صالح." + +msgid "Time" +msgstr "وقت" + +msgid "URL" +msgstr "رابط" + +msgid "Raw binary data" +msgstr "البيانات الثنائية الخام" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "“%(value)s” ليس UUID صالحًا." + +msgid "Universally unique identifier" +msgstr "المعرف الفريد العالمي (UUID)" + +msgid "File" +msgstr "ملف" + +msgid "Image" +msgstr "صورة" + +msgid "A JSON object" +msgstr "كائن JSON" + +msgid "Value must be valid JSON." +msgstr "يجب أن تكون قيمة JSON صالحة." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "النموذج %(model)s ذو الحقل و القيمة %(field)s %(value)r غير موجود." + +msgid "Foreign Key (type determined by related field)" +msgstr "الحقل المرتبط (تم تحديد النوع وفقاً للحقل المرتبط)" + +msgid "One-to-one relationship" +msgstr "علاقة واحد إلى واحد" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s علاقة" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s علاقات" + +msgid "Many-to-many relationship" +msgstr "علاقة متعدد إلى متعدد" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "هذا الحقل مطلوب." + +msgid "Enter a whole number." +msgstr "أدخل رقما صحيحا." + +msgid "Enter a valid date." +msgstr "أدخل تاريخاً صحيحاً." + +msgid "Enter a valid time." +msgstr "أدخل وقتاً صحيحاً." + +msgid "Enter a valid date/time." +msgstr "أدخل تاريخاً/وقتاً صحيحاً." + +msgid "Enter a valid duration." +msgstr "أدخل مدّة صحيحة" + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "يجب أن يتراوح عدد الأيام بين {min_days} و {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز الاستمارة." + +msgid "No file was submitted." +msgstr "لم يتم إرسال اي ملف." + +msgid "The submitted file is empty." +msgstr "الملف الذي قمت بإرساله فارغ." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." +msgstr[1] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." +msgstr[2] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." +msgstr[3] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." +msgstr[4] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." +msgstr[5] "" +"تأكد أن إسم هذا الملف يحتوي على %(max)d حرف على الأكثر (هو يحتوي الآن على " +"%(length)d حرف)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"رجاءً أرسل ملف أو صح علامة صح عند مربع اختيار \\\"فارغ\\\"، وليس كلاهما." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"قم برفع صورة صحيحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف " +"معطوب." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "انتق خياراً صحيحاً. %(value)s ليس أحد الخيارات المتاحة." + +msgid "Enter a list of values." +msgstr "أدخل قائمة من القيم." + +msgid "Enter a complete value." +msgstr "إدخال قيمة كاملة." + +msgid "Enter a valid UUID." +msgstr "أدخل قيمة UUID صحيحة." + +msgid "Enter a valid JSON." +msgstr "ادخل كائن JSON صالح." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(الحقل الخفي %(name)s) %(error)s" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"نموذج بيانات الإدارة مفقود أو تم العبث به. %(field_names)sمن الحقول مفقود. " +"قد تحتاج إلى رفع تقرير بالمشكلة إن استمرت الحالة." + +#, python-format +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +msgid "Order" +msgstr "الترتيب" + +msgid "Delete" +msgstr "احذف" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "رجاء صحّح بيانات %(field)s المتكررة." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "رجاء صحّح بيانات %(field)s المتكررة والتي يجب أن تكون مُميّزة." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"رجاء صحّح بيانات %(field_name)s المتكررة والتي يجب أن تكون مُميّزة لـ%(lookup)s " +"في %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "رجاءً صحّح القيم المُكرّرة أدناه." + +msgid "The inline value did not match the parent instance." +msgstr "القيمة المضمنة لا تتطابق مع المثيل الأصلي." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "انتق خياراً صحيحاً. اختيارك ليس أحد الخيارات المتاحة." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "“%(pk)s” ليست قيمة صالحة." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"لا يمكن تفسير٪ %(datetime)s في المنطقة الزمنية٪ %(current_timezone)s؛ قد " +"تكون غامضة أو غير موجودة." + +msgid "Clear" +msgstr "تفريغ" + +msgid "Currently" +msgstr "حالياً" + +msgid "Change" +msgstr "عدّل" + +msgid "Unknown" +msgstr "مجهول" + +msgid "Yes" +msgstr "نعم" + +msgid "No" +msgstr "لا" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "نعم,لا,ربما" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d بايت" +msgstr[1] "%(size)d بايت واحد " +msgstr[2] "%(size)d بايتان" +msgstr[3] "%(size)d بايت" +msgstr[4] "%(size)d بايت" +msgstr[5] "%(size)d بايت" + +#, python-format +msgid "%s KB" +msgstr "%s ك.ب" + +#, python-format +msgid "%s MB" +msgstr "%s م.ب" + +#, python-format +msgid "%s GB" +msgstr "%s ج.ب" + +#, python-format +msgid "%s TB" +msgstr "%s ت.ب" + +#, python-format +msgid "%s PB" +msgstr "%s ب.ب" + +msgid "p.m." +msgstr "م" + +msgid "a.m." +msgstr "ص" + +msgid "PM" +msgstr "م" + +msgid "AM" +msgstr "ص" + +msgid "midnight" +msgstr "منتصف الليل" + +msgid "noon" +msgstr "ظهراً" + +msgid "Monday" +msgstr "الاثنين" + +msgid "Tuesday" +msgstr "الثلاثاء" + +msgid "Wednesday" +msgstr "الأربعاء" + +msgid "Thursday" +msgstr "الخميس" + +msgid "Friday" +msgstr "الجمعة" + +msgid "Saturday" +msgstr "السبت" + +msgid "Sunday" +msgstr "الأحد" + +msgid "Mon" +msgstr "إثنين" + +msgid "Tue" +msgstr "ثلاثاء" + +msgid "Wed" +msgstr "أربعاء" + +msgid "Thu" +msgstr "خميس" + +msgid "Fri" +msgstr "جمعة" + +msgid "Sat" +msgstr "سبت" + +msgid "Sun" +msgstr "أحد" + +msgid "January" +msgstr "جانفي" + +msgid "February" +msgstr "فيفري" + +msgid "March" +msgstr "مارس" + +msgid "April" +msgstr "أفريل" + +msgid "May" +msgstr "ماي" + +msgid "June" +msgstr "جوان" + +msgid "July" +msgstr "جويليه" + +msgid "August" +msgstr "أوت" + +msgid "September" +msgstr "سبتمبر" + +msgid "October" +msgstr "أكتوبر" + +msgid "November" +msgstr "نوفمبر" + +msgid "December" +msgstr "ديسمبر" + +msgid "jan" +msgstr "جانفي" + +msgid "feb" +msgstr "فيفري" + +msgid "mar" +msgstr "مارس" + +msgid "apr" +msgstr "أفريل" + +msgid "may" +msgstr "ماي" + +msgid "jun" +msgstr "جوان" + +msgid "jul" +msgstr "جويليه" + +msgid "aug" +msgstr "أوت" + +msgid "sep" +msgstr "سبتمبر" + +msgid "oct" +msgstr "أكتوبر" + +msgid "nov" +msgstr "نوفمبر" + +msgid "dec" +msgstr "ديسمبر" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "جانفي" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "فيفري" + +msgctxt "abbrev. month" +msgid "March" +msgstr "مارس" + +msgctxt "abbrev. month" +msgid "April" +msgstr "أفريل" + +msgctxt "abbrev. month" +msgid "May" +msgstr "ماي" + +msgctxt "abbrev. month" +msgid "June" +msgstr "جوان" + +msgctxt "abbrev. month" +msgid "July" +msgstr "جويليه" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "أوت" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "سبتمبر" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "أكتوبر" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "نوفمبر" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "ديسمبر" + +msgctxt "alt. month" +msgid "January" +msgstr "جانفي" + +msgctxt "alt. month" +msgid "February" +msgstr "فيفري" + +msgctxt "alt. month" +msgid "March" +msgstr "مارس" + +msgctxt "alt. month" +msgid "April" +msgstr "أفريل" + +msgctxt "alt. month" +msgid "May" +msgstr "ماي" + +msgctxt "alt. month" +msgid "June" +msgstr "جوان" + +msgctxt "alt. month" +msgid "July" +msgstr "جويليه" + +msgctxt "alt. month" +msgid "August" +msgstr "أوت" + +msgctxt "alt. month" +msgid "September" +msgstr "سبتمبر" + +msgctxt "alt. month" +msgid "October" +msgstr "أكتوبر" + +msgctxt "alt. month" +msgid "November" +msgstr "نوفمبر" + +msgctxt "alt. month" +msgid "December" +msgstr "ديسمبر" + +msgid "This is not a valid IPv6 address." +msgstr "هذا ليس عنوان IPv6 صحيح." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "أو" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "، " + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +msgid "Forbidden" +msgstr "ممنوع" + +msgid "CSRF verification failed. Request aborted." +msgstr "تم الفشل للتحقق من CSRF. تم إنهاء الطلب." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"أنت ترى هذه الرسالة لأن موقع HTTPS هذا يتطلب \"عنوان مرجعي\" ليتم إرساله " +"بواسطة متصفح الويب الخاص بك ، ولكن لم يتم إرسال أي شيء. هذا العنوان مطلوب " +"لأسباب أمنية ، لضمان عدم اختراق متصفحك من قبل أطراف أخرى." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"إذا قمت بتكوين المستعرض الخاص بك لتعطيل رؤوس “Referer” ، فالرجاء إعادة " +"تمكينها ، على الأقل لهذا الموقع ، أو لاتصالات HTTPS ، أو لطلبات “same-" +"origin”." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"إذا كنت تستخدم العلامة أو تتضمن رأس “Referrer-Policy: no-referrer” ، فيرجى إزالتها. تتطلب حماية " +"CSRF رأس “Referer” القيام بالتحقق من “strict referer”. إذا كنت مهتمًا " +"بالخصوصية ، فاستخدم بدائل مثل للروابط إلى مواقع " +"الجهات الخارجية." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"تشاهد هذه الرسالة لأن هذا الموقع يتطلب ملف تعريف ارتباط CSRF Cookie عند " +"إرسال النماذج. ملف تعريف ارتباط Cookie هذا مطلوب لأسباب أمنية ، لضمان عدم " +"اختطاف متصفحك من قبل أطراف ثالثة." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"إذا قمت بتكوين المستعرض الخاص بك لتعطيل ملفات تعريف الارتباط Cookies ، يرجى " +"إعادة تمكينها ، على الأقل لهذا الموقع ، أو لطلبات “same-origin”." + +msgid "More information is available with DEBUG=True." +msgstr "يتوفر مزيد من المعلومات عند ضبط الخيار DEBUG=True." + +msgid "No year specified" +msgstr "لم تحدد السنة" + +msgid "Date out of range" +msgstr "تاريخ خارج النطاق" + +msgid "No month specified" +msgstr "لم تحدد الشهر" + +msgid "No day specified" +msgstr "لم تحدد اليوم" + +msgid "No week specified" +msgstr "لم تحدد الأسبوع" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "لا يوجد %(verbose_name_plural)s" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"التاريخ بالمستقبل %(verbose_name_plural)s غير متوفر لأن قيمة %(class_name)s." +"allow_future هي False." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "سلسلة تاريخ غير صالحة “%(datestr)s” شكل معين “%(format)s”" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "لم يعثر على أي %(verbose_name)s مطابقة لهذا الإستعلام" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "الصفحة ليست \"الأخيرة\" ، ولا يمكن تحويلها إلى عدد صحيح." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "صفحة خاطئة (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "القائمة فارغة و “%(class_name)s.allow_empty” هي False." + +msgid "Directory indexes are not allowed here." +msgstr "لا يسمح لفهارس الدليل هنا." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” غير موجود" + +#, python-format +msgid "Index of %(directory)s" +msgstr "فهرس لـ %(directory)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "تمَّت عملية التثبيت بنجاح! تهانينا!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"عرض ملاحظات الإصدار ل جانغو " +"%(version)s" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"تشاهد هذه الصفحة لأن DEBUG = True موجود في ملف الإعدادات الخاص بك ولم تقم بتكوين أي " +"عناوين URL." + +msgid "Django Documentation" +msgstr "توثيق جانغو" + +msgid "Topics, references, & how-to’s" +msgstr "الموضوعات ، المراجع، & الكيفية" + +msgid "Tutorial: A Polling App" +msgstr "البرنامج التعليمي: تطبيق الاقتراع" + +msgid "Get started with Django" +msgstr "الخطوات الأولى مع جانغو" + +msgid "Django Community" +msgstr "مجتمع جانغو" + +msgid "Connect, get help, or contribute" +msgstr "الاتصال، الحصول على المساعدة أو المساهمة" diff --git a/django/conf/locale/ar_DZ/formats.py b/django/conf/locale/ar_DZ/formats.py index e091e1788d21..cbd361d62eca 100644 --- a/django/conf/locale/ar_DZ/formats.py +++ b/django/conf/locale/ar_DZ/formats.py @@ -2,28 +2,28 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j F Y' -SHORT_DATETIME_FORMAT = 'j F Y H:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j F Y" +SHORT_DATETIME_FORMAT = "j F Y H:i" FIRST_DAY_OF_WEEK = 0 # Sunday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%Y/%m/%d', # '2006/10/25' + "%Y/%m/%d", # '2006/10/25' ] TIME_INPUT_FORMATS = [ - '%H:%M', # '14:30 - '%H:%M:%S', # '14:30:59' + "%H:%M", # '14:30 + "%H:%M:%S", # '14:30:59' ] DATETIME_INPUT_FORMATS = [ - '%Y/%m/%d %H:%M', # '2006/10/25 14:30' - '%Y/%m/%d %H:%M:%S', # '2006/10/25 14:30:59' + "%Y/%m/%d %H:%M", # '2006/10/25 14:30' + "%Y/%m/%d %H:%M:%S", # '2006/10/25 14:30:59' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/az/LC_MESSAGES/django.mo b/django/conf/locale/az/LC_MESSAGES/django.mo index dfb7d4435285..441b0ca0c92a 100644 Binary files a/django/conf/locale/az/LC_MESSAGES/django.mo and b/django/conf/locale/az/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/az/LC_MESSAGES/django.po b/django/conf/locale/az/LC_MESSAGES/django.po index 95be54a4c727..72734bb6fa4c 100644 --- a/django/conf/locale/az/LC_MESSAGES/django.po +++ b/django/conf/locale/az/LC_MESSAGES/django.po @@ -4,14 +4,17 @@ # Emin Mastizada , 2018,2020 # Emin Mastizada , 2015-2016 # Metin Amiroff , 2011 +# Nicat Məmmədov , 2022 +# Nijat Mammadov, 2024 +# Sevdimali , 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-12 07:21+0000\n" -"Last-Translator: Emin Mastizada \n" -"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Sevdimali , 2024\n" +"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" "az/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,52 +26,58 @@ msgid "Afrikaans" msgstr "Afrikaans" msgid "Arabic" -msgstr "Ərəbcə" +msgstr "Ərəb" + +msgid "Algerian Arabic" +msgstr "Əlcəzair Ərəbcəsi" msgid "Asturian" -msgstr "Asturiyaca" +msgstr "Asturiya" msgid "Azerbaijani" -msgstr "Azərbaycanca" +msgstr "Azərbaycan" msgid "Bulgarian" -msgstr "Bolqarca" +msgstr "Bolqar" msgid "Belarusian" -msgstr "Belarusca" +msgstr "Belarus" msgid "Bengali" -msgstr "Benqalca" +msgstr "Benqal" msgid "Breton" -msgstr "Bretonca" +msgstr "Breton" msgid "Bosnian" -msgstr "Bosniyaca" +msgstr "Bosniya" msgid "Catalan" -msgstr "Katalanca" +msgstr "Katalon" + +msgid "Central Kurdish (Sorani)" +msgstr "Mərkəzi Kürd dili (Sorani)" msgid "Czech" -msgstr "Çexcə" +msgstr "Çex" msgid "Welsh" -msgstr "Uelscə" +msgstr "Uels" msgid "Danish" -msgstr "Danimarkaca" +msgstr "Danimarka" msgid "German" -msgstr "Almanca" +msgstr "Alman" msgid "Lower Sorbian" -msgstr "Aşağı Sorbca" +msgstr "Aşağı Sorb" msgid "Greek" -msgstr "Yunanca" +msgstr "Yunan" msgid "English" -msgstr "İngiliscə" +msgstr "İngilis" msgid "Australian English" msgstr "Avstraliya İngiliscəsi" @@ -80,7 +89,7 @@ msgid "Esperanto" msgstr "Esperanto" msgid "Spanish" -msgstr "İspanca" +msgstr "İspan" msgid "Argentinian Spanish" msgstr "Argentina İspancası" @@ -98,70 +107,73 @@ msgid "Venezuelan Spanish" msgstr "Venesuela İspancası" msgid "Estonian" -msgstr "Estonca" +msgstr "Eston" msgid "Basque" -msgstr "Baskca" +msgstr "Bask" msgid "Persian" -msgstr "Farsca" +msgstr "Fars" msgid "Finnish" -msgstr "Fincə" +msgstr "Fin" msgid "French" -msgstr "Fransızca" +msgstr "Fransız" msgid "Frisian" -msgstr "Friscə" +msgstr "Fris" msgid "Irish" -msgstr "İrlandca" +msgstr "İrland" msgid "Scottish Gaelic" msgstr "Şotland Keltcəsi" msgid "Galician" -msgstr "Qallik dili" +msgstr "Qalisiya" msgid "Hebrew" -msgstr "İbranicə" +msgstr "İvrit" msgid "Hindi" -msgstr "Hindcə" +msgstr "Hind" msgid "Croatian" -msgstr "Xorvatca" +msgstr "Xorvat" msgid "Upper Sorbian" -msgstr "Üst Sorbca" +msgstr "Yuxarı Sorb" msgid "Hungarian" -msgstr "Macarca" +msgstr "Macar" msgid "Armenian" -msgstr "Ermənicə" +msgstr "Erməni" msgid "Interlingua" msgstr "İnterlinqua" msgid "Indonesian" -msgstr "İndonezcə" +msgstr "İndoneziya dili" + +msgid "Igbo" +msgstr "İqbo" msgid "Ido" -msgstr "İdoca" +msgstr "İdo" msgid "Icelandic" -msgstr "İslandca" +msgstr "İsland" msgid "Italian" -msgstr "İtalyanca" +msgstr "İtalyan" msgid "Japanese" -msgstr "Yaponca" +msgstr "Yapon" msgid "Georgian" -msgstr "Gürcücə" +msgstr "Gürcü" msgid "Kabyle" msgstr "Kabile" @@ -170,37 +182,43 @@ msgid "Kazakh" msgstr "Qazax" msgid "Khmer" -msgstr "Kxmercə" +msgstr "Xmer" msgid "Kannada" -msgstr "Kannada dili" +msgstr "Kannada" msgid "Korean" -msgstr "Koreyca" +msgstr "Koreya" + +msgid "Kyrgyz" +msgstr "Qırğız" msgid "Luxembourgish" -msgstr "Lüksemburqca" +msgstr "Lüksemburq" msgid "Lithuanian" -msgstr "Litva dili" +msgstr "Litva" msgid "Latvian" -msgstr "Latviya dili" +msgstr "Latış" msgid "Macedonian" -msgstr "Makedonca" +msgstr "Makedon" msgid "Malayalam" -msgstr "Malayamca" +msgstr "Malayam" msgid "Mongolian" -msgstr "Monqolca" +msgstr "Monqol" msgid "Marathi" -msgstr "Marathicə" +msgstr "Marathi" + +msgid "Malay" +msgstr "Malay" msgid "Burmese" -msgstr "Burmescə" +msgstr "Birman" msgid "Norwegian Bokmål" msgstr "Norveç Bukmolcası" @@ -209,88 +227,97 @@ msgid "Nepali" msgstr "Nepal" msgid "Dutch" -msgstr "Flamandca" +msgstr "Niderland" msgid "Norwegian Nynorsk" -msgstr "Nynorsk Norveçcəsi" +msgstr "Norveç Nyunorskcası" msgid "Ossetic" -msgstr "Osetincə" +msgstr "Osetin" msgid "Punjabi" -msgstr "Pancabicə" +msgstr "Pəncab" msgid "Polish" -msgstr "Polyakca" +msgstr "Polyak" msgid "Portuguese" -msgstr "Portuqalca" +msgstr "Portuqal" msgid "Brazilian Portuguese" msgstr "Braziliya Portuqalcası" msgid "Romanian" -msgstr "Rumınca" +msgstr "Rumın" msgid "Russian" -msgstr "Rusca" +msgstr "Rus" msgid "Slovak" -msgstr "Slovakca" +msgstr "Slovak" msgid "Slovenian" -msgstr "Slovencə" +msgstr "Sloven" msgid "Albanian" -msgstr "Albanca" +msgstr "Alban" msgid "Serbian" -msgstr "Serbcə" +msgstr "Serb" msgid "Serbian Latin" -msgstr "Serbcə Latın" +msgstr "Serb (Latın)" msgid "Swedish" -msgstr "İsveçcə" +msgstr "İsveç" msgid "Swahili" msgstr "Suahili" msgid "Tamil" -msgstr "Tamilcə" +msgstr "Tamil" msgid "Telugu" -msgstr "Teluqu dili" +msgstr "Teluqu" + +msgid "Tajik" +msgstr "Tacik" msgid "Thai" -msgstr "Tayca" +msgstr "Tay" + +msgid "Turkmen" +msgstr "Türkmən" msgid "Turkish" -msgstr "Türkcə" +msgstr "Türk" msgid "Tatar" msgstr "Tatar" msgid "Udmurt" -msgstr "Udmurtca" +msgstr "Udmurt" + +msgid "Uyghur" +msgstr "Uyğur" msgid "Ukrainian" -msgstr "Ukraynaca" +msgstr "Ukrayn" msgid "Urdu" -msgstr "Urduca" +msgstr "Urdu" msgid "Uzbek" -msgstr "Özbəkcə" +msgstr "Özbək" msgid "Vietnamese" -msgstr "Vyetnamca" +msgstr "Vyetnam" msgid "Simplified Chinese" -msgstr "Sadələşdirilmiş Çincə" +msgstr "Sadələşdirilmiş Çin dili" msgid "Traditional Chinese" -msgstr "Ənənəvi Çincə" +msgstr "Ənənəvi Çin dili" msgid "Messages" msgstr "Mesajlar" @@ -304,6 +331,11 @@ msgstr "Statik Fayllar" msgid "Syndication" msgstr "Sindikasiya" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Səhifə nömrəsi rəqəm deyil" @@ -311,10 +343,13 @@ msgid "That page number is less than 1" msgstr "Səhifə nömrəsi 1-dən balacadır" msgid "That page contains no results" -msgstr "Səhifədə nəticə yoxdur" +msgstr "O səhifədə nəticə yoxdur" msgid "Enter a valid value." -msgstr "Düzgün qiymət daxil edin." +msgstr "Düzgün dəyər daxil edin." + +msgid "Enter a valid domain name." +msgstr "Düzgün domen adı daxil edin." msgid "Enter a valid URL." msgstr "Düzgün URL daxil edin." @@ -339,31 +374,52 @@ msgstr "" "Unicode hərflərdən, rəqəmlərdən, alt-xətlərdən və ya defislərdən ibarət " "düzgün qısaltma (“slug”) daxil edin." -msgid "Enter a valid IPv4 address." -msgstr "Düzgün IPv4 ünvanı daxil edin." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Düzgün %(protocol)s adres daxil edin." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Düzgün IPv6 ünvanını daxil edin." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Düzgün IPv4 və ya IPv6 ünvanını daxil edin." +msgid "IPv4 or IPv6" +msgstr "IPv4 və ya IPv6" msgid "Enter only digits separated by commas." msgstr "Vergüllə ayırmaqla yalnız rəqəmlər daxil edin." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Əmin edin ki, bu qiymət %(limit_value)s-dir (bu %(show_value)s-dir)." +msgstr "" +"Əmin olun ki, bu dəyər %(limit_value)s-dir/dır (bu %(show_value)s-dir/dır)." #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "" -"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan kiçik olduğunu yoxlayın." +"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan kiçik olduğunu " +"yoxlayın." #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" -"Bu qiymətin %(limit_value)s-ya bərabər və ya ondan böyük olduğunu yoxlayın." +"Bu qiymətin %(limit_value)s-(y)a/ə bərabər və ya ondan böyük olduğunu " +"yoxlayın." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Bu dəyərin %(limit_value)s addım ölçüsünün mərtəbələri olduğundan əmin olun." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Bu dəyərin %(offset)s dəyərindən başlayaraq %(limit_value)s addım ölçüsü " +"mərtəbəsi olduğundan əmin olun. Məs: %(offset)s, %(valid_value1)s, " +"%(valid_value2)s və s." #, python-format msgid "" @@ -374,10 +430,10 @@ msgid_plural "" "%(show_value)d)." msgstr[0] "" "Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"var)" +"simvol var)" msgstr[1] "" "Bu dəyərin ən az %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"var)" +"simvol var)" #, python-format msgid "" @@ -388,10 +444,10 @@ msgid_plural "" "%(show_value)d)." msgstr[0] "" "Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"var)" +"simvol var)" msgstr[1] "" "Bu dəyərin ən çox %(limit_value)d simvol olduğuna əmin olun (%(show_value)d " -"var)" +"simvol var)" msgid "Enter a number." msgstr "Ədəd daxil edin." @@ -434,6 +490,10 @@ msgstr "və" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s ilə %(model_name)s artıq mövcuddur." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "“%(name)s” məhdudiyyəti pozuldu." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r dəyəri doğru seçim deyil." @@ -448,8 +508,8 @@ msgstr "Bu sahə ağ qala bilməz." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s bu %(field_label)s sahə ilə artıq mövcuddur." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -463,7 +523,7 @@ msgstr "Sahənin tipi: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "“%(value)s” dəyəri True və ya False olmalıdır." +msgstr "“%(value)s” dəyəri ya True, ya da False olmalıdır." #, python-format msgid "“%(value)s” value must be either True, False, or None." @@ -476,6 +536,9 @@ msgstr "Bul (ya Doğru, ya Yalan)" msgid "String (up to %(max_length)s)" msgstr "Sətir (%(max_length)s simvola kimi)" +msgid "String (unlimited)" +msgstr "Sətir (limitsiz)" + msgid "Comma-separated integers" msgstr "Vergüllə ayrılmış tam ədədlər" @@ -491,7 +554,7 @@ msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" -"“%(value)s” dəyəri düzgün formatdadır (YYYY-MM-DD) amma bu tarix xətalıdır." +"“%(value)s” dəyəri düzgün formatdadır (YYYY-MM-DD), amma bu tarix xətalıdır." msgid "Date (without time)" msgstr "Tarix (saatsız)" @@ -556,6 +619,9 @@ msgstr "Tam ədəd" msgid "Big (8 byte) integer" msgstr "Böyük (8 bayt) tam ədəd" +msgid "Small integer" +msgstr "Kiçik tam ədəd" + msgid "IPv4 address" msgstr "IPv4 ünvanı" @@ -567,7 +633,10 @@ msgid "“%(value)s” value must be either None, True or False." msgstr "“%(value)s” dəyəri None, True və ya False olmalıdır." msgid "Boolean (Either True, False or None)" -msgstr "Bul (Ya Doğru, ya Yalan, ya da Heç nə)" +msgstr "Bul (Ya True, ya False, ya da None)" + +msgid "Positive big integer" +msgstr "Müsbət böyük rəqəm" msgid "Positive integer" msgstr "Müsbət tam ədəd" @@ -579,9 +648,6 @@ msgstr "Müsbət tam kiçik ədəd" msgid "Slug (up to %(max_length)s)" msgstr "Əzmə (%(max_length)s simvola kimi)" -msgid "Small integer" -msgstr "Kiçik tam ədəd" - msgid "Text" msgstr "Mətn" @@ -622,6 +688,12 @@ msgstr "Fayl" msgid "Image" msgstr "Şəkil" +msgid "A JSON object" +msgstr "JSON obyekti" + +msgid "Value must be valid JSON." +msgstr "Dəyər düzgün JSON olmalıdır." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s dəyəri %(value)r olan %(model)s mövcud deyil." @@ -713,6 +785,9 @@ msgstr "Tam dəyər daxil edin." msgid "Enter a valid UUID." msgstr "Keçərli UUID daxil et." +msgid "Enter a valid JSON." +msgstr "Etibarlı bir JSON daxil edin." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -721,20 +796,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Gizli %(name)s sahəsi) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm məlumatları əksikdir və ya korlanıb" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm datası ya əskikdir, ya da dəyişdirilib. Çatışmayan xanalar: " +"%(field_names)s. Problem davam edərsə, səhv hesabatı təqdim etməli ola " +"bilərsiniz." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Lütfən %d və ya daha az forma göndərin." -msgstr[1] "Lütfən %d və ya daha az forma göndərin." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." +msgstr[1] "Zəhmət olmasa ən çox %(num)d forma təsdiqləyin." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Lütfən %d və ya daha çox forma göndərin." -msgstr[1] "Lütfən %d və ya daha çox forma göndərin." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." +msgstr[1] "Zəhmət olmasa ən az %(num)d forma təsdiqləyin." msgid "Order" msgstr "Sırala" @@ -779,7 +860,7 @@ msgid "" "may be ambiguous or it may not exist." msgstr "" "%(datetime)s vaxtı %(current_timezone)s zaman qurşağında ifadə oluna bilmir; " -"ya duallıq, ya da mövcud olmaya bilər." +"ya qeyri-müəyyənlik, ya da mövcud olmaya bilər." msgid "Clear" msgstr "Təmizlə" @@ -799,15 +880,7 @@ msgstr "Hə" msgid "No" msgstr "Yox" -msgid "Year" -msgstr "İl" - -msgid "Month" -msgstr "Ay" - -msgid "Day" -msgstr "Gün" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "hə,yox,bəlkə" @@ -838,16 +911,16 @@ msgid "%s PB" msgstr "%s PB" msgid "p.m." -msgstr "p.m." +msgstr "g.s." msgid "a.m." -msgstr "a.m." +msgstr "g.ə." msgid "PM" -msgstr "PM" +msgstr "GS" msgid "AM" -msgstr "AM" +msgstr "GƏ" msgid "midnight" msgstr "gecə yarısı" @@ -1003,7 +1076,7 @@ msgstr "Avq." msgctxt "abbrev. month" msgid "Sept." -msgstr "Sent." +msgstr "Sen." msgctxt "abbrev. month" msgid "Oct." @@ -1081,43 +1154,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d il" -msgstr[1] "%d il" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d il" +msgstr[1] "%(num)d il" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ay" -msgstr[1] "%d ay" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d ay" +msgstr[1] "%(num)d ay" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d həftə" -msgstr[1] "%d həftə" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d həftə" +msgstr[1] "%(num)d həftə" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d gün" -msgstr[1] "%d gün" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d gün" +msgstr[1] "%(num)d gün" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d saat" -msgstr[1] "%d saat" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d saat" +msgstr[1] "%(num)d saat" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d dəqiqə" -msgstr[1] "%d dəqiqə" - -msgid "0 minutes" -msgstr "0 dəqiqə" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d dəqiqə" +msgstr[1] "%(num)d dəqiqə" msgid "Forbidden" msgstr "Qadağan" @@ -1127,13 +1197,14 @@ msgstr "CSRF təsdiqləmə alınmadı. Sorğu ləğv edildi." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Bu HTTPS sayt səyyahınız tərəfindən “Referer header” göndərilməsini tələb " -"edir, amma göndərilmir. Bu başlıq səyyahınızın üçüncü biri tərəfindən hack-" -"lənmədiyinə əmin olmaq üçün istifadə edilir." +"Bu mesajı ona görə görürsünüz ki, bu HTTPS saytı sizin səyyah tərəfindən " +"“Referer header”in göndərilməsini tələb etdiyi halda heç nə " +"göndərilməmişdir. Bu başlıq sizin veb-səyyahınızın kənar şəxlər tərəfindən " +"ələ keçirilmədiyindən əmin olmaq üçün tələb olunur." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1148,14 +1219,14 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Əgər etiketini və ya " "“Referrer-Policy: no-referrer” başlığını işlədirsinizsə, lütfən silin. CSRF " "qoruma dəqiq yönləndirən yoxlaması üçün “Referer” başlığını tələb edir. Əgər " -"məxfilik üçün düşünürsünüzsə, üçüncü tərəf sayt keçidləri üçün kimi bir alternativ işlədin." +"məxfilik üçün düşünürsünüzsə, üçüncü tərəf sayt keçidləri üçün kimi bir alternativ işlədin." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1216,7 +1287,7 @@ msgstr "Səhifə həm “axırıncı” deyil, həm də tam ədədə çevrilə b #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Qeyri-düzgün səhifə (%(page_number)s): %(message)s" +msgstr "Yanlış səhifə (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." @@ -1233,8 +1304,8 @@ msgstr "“%(path)s” mövcud deyil" msgid "Index of %(directory)s" msgstr "%(directory)s-nin indeksi" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: tələsən mükəmməlləkçilər üçün Web framework." +msgid "The install worked successfully! Congratulations!" +msgstr "Quruluş uğurla tamamlandı! Təbriklər!" #, python-format msgid "" @@ -1245,22 +1316,20 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">buraxılış " "qeydlərinə baxın" -msgid "The install worked successfully! Congratulations!" -msgstr "Quruluş uğurla tamamlandı! Təbriklər!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Tənzimləmə faylınızda DEBUG=True və heç bir URL qurmadığınız üçün bu səhifəni görürsünüz." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True və heç bir URL qurmadığınız üçün bu səhifəni " +"görürsünüz." msgid "Django Documentation" -msgstr "Django Sənədləri" +msgstr "Django Dokumentasiya" msgid "Topics, references, & how-to’s" msgstr "Mövzular, istinadlar və nümunələr" @@ -1269,7 +1338,7 @@ msgid "Tutorial: A Polling App" msgstr "Məşğələ: Səsvermə Tətbiqi" msgid "Get started with Django" -msgstr "Django-ya başla" +msgstr "Django ilə başla" msgid "Django Community" msgstr "Django İcması" diff --git a/django/conf/locale/az/formats.py b/django/conf/locale/az/formats.py index 6f655d18ef3e..253b6dddf5df 100644 --- a/django/conf/locale/az/formats.py +++ b/django/conf/locale/az/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j E Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j E Y, G:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j E Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j E Y, G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/be/LC_MESSAGES/django.mo b/django/conf/locale/be/LC_MESSAGES/django.mo index 72defdcb6c1a..9c04ff16ca7c 100644 Binary files a/django/conf/locale/be/LC_MESSAGES/django.mo and b/django/conf/locale/be/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/be/LC_MESSAGES/django.po b/django/conf/locale/be/LC_MESSAGES/django.po index ae690985b2f2..a8172066aef5 100644 --- a/django/conf/locale/be/LC_MESSAGES/django.po +++ b/django/conf/locale/be/LC_MESSAGES/django.po @@ -2,24 +2,25 @@ # # Translators: # Viktar Palstsiuk , 2014-2015 -# znotdead , 2016-2017,2019 -# Дмитрий Шатера , 2016 +# znotdead , 2016-2017,2019-2021,2023-2024 +# Bobsans , 2016 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: znotdead , " +"2016-2017,2019-2021,2023-2024\n" +"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" "be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\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" +"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" msgid "Afrikaans" msgstr "Афрыкаанс" @@ -27,6 +28,9 @@ msgstr "Афрыкаанс" msgid "Arabic" msgstr "Арабская" +msgid "Algerian Arabic" +msgstr "Алжырская арабская" + msgid "Asturian" msgstr "Астурыйская" @@ -51,6 +55,9 @@ msgstr "Басьнійская" msgid "Catalan" msgstr "Каталёнская" +msgid "Central Kurdish (Sorani)" +msgstr "Цэнтральнакурдская (сарані)" + msgid "Czech" msgstr "Чэская" @@ -150,6 +157,9 @@ msgstr "Інтэрлінгва" msgid "Indonesian" msgstr "Інданэзійская" +msgid "Igbo" +msgstr "Ігба" + msgid "Ido" msgstr "Іда" @@ -180,6 +190,9 @@ msgstr "Каннада" msgid "Korean" msgstr "Карэйская" +msgid "Kyrgyz" +msgstr "Кіргізская" + msgid "Luxembourgish" msgstr "Люксэмбургская" @@ -201,6 +214,9 @@ msgstr "Манґольская" msgid "Marathi" msgstr "Маратхі" +msgid "Malay" +msgstr "Малайская" + msgid "Burmese" msgstr "Бірманская" @@ -264,9 +280,15 @@ msgstr "Тамільская" msgid "Telugu" msgstr "Тэлуґу" +msgid "Tajik" +msgstr "Таджыкскі" + msgid "Thai" msgstr "Тайская" +msgid "Turkmen" +msgstr "Туркменская" + msgid "Turkish" msgstr "Турэцкая" @@ -276,6 +298,9 @@ msgstr "Татарская" msgid "Udmurt" msgstr "Удмурцкая" +msgid "Uyghur" +msgstr "Уйгурскі" + msgid "Ukrainian" msgstr "Украінская" @@ -283,7 +308,7 @@ msgid "Urdu" msgstr "Урду" msgid "Uzbek" -msgstr "" +msgstr "Узбецкі" msgid "Vietnamese" msgstr "Віетнамская" @@ -306,6 +331,11 @@ msgstr "Cтатычныя файлы" msgid "Syndication" msgstr "Сындыкацыя" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Лік гэтай старонкі не з'яўляецца цэлым лікам" @@ -318,6 +348,9 @@ msgstr "Гэтая старонка не мае ніякіх вынікаў" msgid "Enter a valid value." msgstr "Пазначце правільнае значэньне." +msgid "Enter a valid domain name." +msgstr "Пазначце сапраўднае даменнае имя." + msgid "Enter a valid URL." msgstr "Пазначце чынную спасылку." @@ -341,14 +374,18 @@ msgstr "" "Значэнне павінна быць толькі з літараў стандарту Unicode, личбаў, знакаў " "падкрэслівання ці злучкі." -msgid "Enter a valid IPv4 address." -msgstr "Пазначце чынны адрас IPv4." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Пазначце сапраўдны %(protocol)s адрас." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Пазначце чынны адрас IPv6." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Пазначце чынны адрас IPv4 або IPv6." +msgid "IPv4 or IPv6" +msgstr "IPv4 або IPv6" msgid "Enter only digits separated by commas." msgstr "Набярыце лічбы, падзеленыя коскамі." @@ -367,6 +404,19 @@ msgstr "Значэньне мусіць быць меншым або роўны msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Значэньне мусіць быць большым або роўным %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Пераканайцеся, што гэта значэнне кратнае памеру кроку %(limit_value)s, " +"пачынаючы з %(offset)s, напрыклад. %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, і гэтак далей." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -454,6 +504,10 @@ msgstr "і" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s з такім %(field_labels)s ужо існуе." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Абмежаванне \"%(name)s\" парушана." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Значэнне %(value)r не з'яўляецца правільным выбарам." @@ -468,8 +522,8 @@ msgstr "Трэба запоўніць поле." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s з такім %(field_label)s ужо існуе." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -496,6 +550,9 @@ msgstr "Ляґічнае («сапраўдна» або «не сапраўдн msgid "String (up to %(max_length)s)" msgstr "Радок (ня болей за %(max_length)s)" +msgid "String (unlimited)" +msgstr "Радок (неабмежаваны)" + msgid "Comma-separated integers" msgstr "Цэлыя лікі, падзеленыя коскаю" @@ -578,6 +635,9 @@ msgstr "Цэлы лік" msgid "Big (8 byte) integer" msgstr "Вялікі (8 байтаў) цэлы" +msgid "Small integer" +msgstr "Малы цэлы лік" + msgid "IPv4 address" msgstr "Адрас IPv4" @@ -591,6 +651,9 @@ msgstr "Значэньне “%(value)s” павінна быць None, True а msgid "Boolean (Either True, False or None)" msgstr "Ляґічнае («сапраўдна», «не сапраўдна» ці «нічога»)" +msgid "Positive big integer" +msgstr "Дадатны вялікі цэлы лік" + msgid "Positive integer" msgstr "Дадатны цэлы лік" @@ -601,9 +664,6 @@ msgstr "Дадатны малы цэлы лік" msgid "Slug (up to %(max_length)s)" msgstr "Бірка (ня болей за %(max_length)s)" -msgid "Small integer" -msgstr "Малы цэлы лік" - msgid "Text" msgstr "Тэкст" @@ -645,6 +705,12 @@ msgstr "Файл" msgid "Image" msgstr "Выява" +msgid "A JSON object" +msgstr "Аб'ект JSON" + +msgid "Value must be valid JSON." +msgstr "Значэньне павінна быць сапраўдным JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Экземпляр %(model)s з %(field)s %(value)r не iснуе." @@ -744,6 +810,9 @@ msgstr "Калі ласка, увядзіце поўнае значэньне." msgid "Enter a valid UUID." msgstr "Увядзіце сапраўдны UUID." +msgid "Enter a valid JSON." +msgstr "Пазначце сапраўдны JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -752,24 +821,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Схаванае поле %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Данныя ManagementForm адсутнічаюць ці былі пашкоджаны" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Дадзеныя формы ManagementForm адсутнічаюць ці былі падменены. Адсутнічаюць " +"палі: %(field_names)s. Магчыма, вам спатрэбіцца падаць справаздачу пра " +"памылку, калі праблема захоўваецца." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Калі ласка, адпраўце %d або менш формаў." -msgstr[1] "Калі ласка, адпраўце %d або менш формаў." -msgstr[2] "Калі ласка, адпраўце %d або менш формаў." -msgstr[3] "Калі ласка, адпраўце %d або менш формаў." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Калі ласка, адпраўце не болей чым %(num)d формаў." +msgstr[1] "Калі ласка, адпраўце не болей чым %(num)d формаў." +msgstr[2] "Калі ласка, адпраўце не болей чым %(num)d формаў." +msgstr[3] "Калі ласка, адпраўце не болей чым %(num)d формаў." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Калі ласка, адпраўце %d або больш формаў." -msgstr[1] "Калі ласка, адпраўце %d або больш формаў." -msgstr[2] "Калі ласка, адпраўце %d або больш формаў." -msgstr[3] "Калі ласка, адпраўце %d або больш формаў." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Калі ласка, адпраўце не менш чым %(num)d формаў." +msgstr[1] "Калі ласка, адпраўце не менш чым %(num)d формаў." +msgstr[2] "Калі ласка, адпраўце не менш чым %(num)d формаў." +msgstr[3] "Калі ласка, адпраўце не менш чым %(num)d формаў." msgid "Order" msgstr "Парадак" @@ -832,15 +907,7 @@ msgstr "Так" msgid "No" msgstr "Не" -msgid "Year" -msgstr "Год" - -msgid "Month" -msgstr "Месяц" - -msgid "Day" -msgstr "Дзень" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "так,не,магчыма" @@ -1116,55 +1183,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d год" -msgstr[1] "%d гады" -msgstr[2] "%d гадоў" -msgstr[3] "%d гадоў" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d год" +msgstr[1] "%(num)d гадоў" +msgstr[2] "%(num)d гадоў" +msgstr[3] "%(num)d гадоў" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месяц" -msgstr[1] "%d месяцы" -msgstr[2] "%d месяцаў" -msgstr[3] "%d месяцаў" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d месяц" +msgstr[1] "%(num)d месяцаў" +msgstr[2] "%(num)d месяцаў" +msgstr[3] "%(num)d месяцаў" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d тыдзень" -msgstr[1] "%d тыдні" -msgstr[2] "%d тыдняў" -msgstr[3] "%d тыдняў" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d тыдзень" +msgstr[1] "%(num)d тыдняў" +msgstr[2] "%(num)d тыдняў" +msgstr[3] "%(num)d тыдняў" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d дзень" -msgstr[1] "%d дні" -msgstr[2] "%d дзён" -msgstr[3] "%d дзён" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d дзень" +msgstr[1] "%(num)d дзён" +msgstr[2] "%(num)d дзён" +msgstr[3] "%(num)d дзён" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d гадзіна" -msgstr[1] "%d гадзіны" -msgstr[2] "%d гадзін" -msgstr[3] "%d гадзін" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d гадзіна" +msgstr[1] "%(num)d гадзін" +msgstr[2] "%(num)d гадзін" +msgstr[3] "%(num)d гадзін" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d хвіліна" -msgstr[1] "%d хвіліны" -msgstr[2] "%d хвілінаў" -msgstr[3] "%d хвілінаў" - -msgid "0 minutes" -msgstr "0 хвілін" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d хвіліна" +msgstr[1] "%(num)d хвілін" +msgstr[2] "%(num)d хвілін" +msgstr[3] "%(num)d хвілін" msgid "Forbidden" msgstr "Забаронена" @@ -1174,13 +1238,13 @@ msgstr "CSRF-праверка не атрымалася. Запыт спынен msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" "Вы бачыце гэта паведамленне, таму што гэты HTTPS-сайт патрабуе каб Referer " -"загаловак быў адасланы вашым вэб-браўзэрам, але гэтага не адбылося. Гэты " -"загаловак неабходны для бяспекі, каб пераканацца, што ваш браўзэр не " +"загаловак быў адасланы вашым аглядальнікам, але гэтага не адбылося. Гэты " +"загаловак неабходны для бяспекі, каб пераканацца, што ваш аглядальнік не " "ўзаламаны трэцімі асобамі." msgid "" @@ -1196,14 +1260,14 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Калі вы выкарыстоўваеце тэг " "ці дадалі загаловак “Referrer-Policy: no-referrer”, калі ласка выдаліце іх. " "CSRF абароне неабходны “Referer” загаловак для строгай праверкі. Калі Вы " -"турбуецеся аб прыватнасці, выкарыстоўвайце альтэрнатывы, напрыклад , для спасылкі на сайты трэціх асоб." +"турбуецеся аб прыватнасці, выкарыстоўвайце альтэрнатывы, напрыклад , для спасылкі на сайты трэціх асоб." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1284,8 +1348,8 @@ msgstr "“%(path)s” не існуе" msgid "Index of %(directory)s" msgstr "Файлы каталёґа «%(directory)s»" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Джанга: Web рамкі для перфекцыяністаў з крайнімі тэрмінамі." +msgid "The install worked successfully! Congratulations!" +msgstr "Усталяванне прайшло паспяхова! Віншаванні!" #, python-format msgid "" @@ -1296,19 +1360,17 @@ msgstr "" "\" target=\"_blank\" rel=\"noopener\">заўвагі да выпуску для Джангі " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Усталяванне прайшло паспяхова! Віншаванні!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Вы бачыце гэту старонку таму што DEBUG=True у вашым файле налад і вы не сканфігурыравалі ніякіх URL." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True у вашым файле налад і вы не " +"сканфігурыравалі ніякіх URL." msgid "Django Documentation" msgstr "Дакументацыя Джангі" diff --git a/django/conf/locale/bg/LC_MESSAGES/django.mo b/django/conf/locale/bg/LC_MESSAGES/django.mo index 63bf5b03b363..f6bd12b04d17 100644 Binary files a/django/conf/locale/bg/LC_MESSAGES/django.mo and b/django/conf/locale/bg/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/bg/LC_MESSAGES/django.po b/django/conf/locale/bg/LC_MESSAGES/django.po index 34cdf7caa192..52cc91301633 100644 --- a/django/conf/locale/bg/LC_MESSAGES/django.po +++ b/django/conf/locale/bg/LC_MESSAGES/django.po @@ -1,10 +1,13 @@ # This file is distributed under the same license as the Django package. # # Translators: +# arneatec , 2022-2024 # Boris Chervenkov , 2012 +# Claude Paroz , 2020 # Jannis Leidel , 2011 # Lyuboslav Petrov , 2014 -# Todor Lubenov , 2013-2015 +# Mariusz Felisiak , 2023 +# Todor Lubenov , 2013-2015 # Venelin Stoykov , 2015-2017 # vestimir , 2014 # Alexander Atanasov , 2012 @@ -12,10 +15,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: arneatec , 2022-2024\n" +"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" "bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,11 +27,14 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Afrikaans" -msgstr "Африкански" +msgstr "африкаански" msgid "Arabic" msgstr "арабски език" +msgid "Algerian Arabic" +msgstr "алжирски арабски" + msgid "Asturian" msgstr "Астурийски" @@ -51,82 +57,85 @@ msgid "Bosnian" msgstr "босненски език" msgid "Catalan" -msgstr "каталунски език" +msgstr "каталански" + +msgid "Central Kurdish (Sorani)" +msgstr "Кюрдски, централен (Сорани)" msgid "Czech" -msgstr "чешки език" +msgstr "чешки" msgid "Welsh" -msgstr "уелски език" +msgstr "уелски" msgid "Danish" -msgstr "датски език" +msgstr "датски" msgid "German" -msgstr "немски език" +msgstr "немски" msgid "Lower Sorbian" -msgstr "" +msgstr "долносорбски" msgid "Greek" -msgstr "гръцки език" +msgstr "гръцки" msgid "English" -msgstr "английски език" +msgstr "английски" msgid "Australian English" -msgstr "Австралийски Английски" +msgstr "австралийски английски" msgid "British English" msgstr "британски английски" msgid "Esperanto" -msgstr "Есперанто" +msgstr "есперанто" msgid "Spanish" -msgstr "испански език" +msgstr "испански" msgid "Argentinian Spanish" msgstr "кастилски" msgid "Colombian Spanish" -msgstr "Колумбийски Испански" +msgstr "колумбийски испански" msgid "Mexican Spanish" -msgstr "Мексикански испански" +msgstr "мексикански испански" msgid "Nicaraguan Spanish" msgstr "никарагуански испански" msgid "Venezuelan Spanish" -msgstr "Испански Венецуелски" +msgstr "венецуелски испански" msgid "Estonian" -msgstr "естонски език" +msgstr "естонски" msgid "Basque" msgstr "баски" msgid "Persian" -msgstr "персийски език" +msgstr "персийски" msgid "Finnish" -msgstr "финландски език" +msgstr "финландски" msgid "French" -msgstr "френски език" +msgstr "френски" msgid "Frisian" -msgstr "фризийски език" +msgstr "фризийски" msgid "Irish" -msgstr "ирландски език" +msgstr "ирландски" msgid "Scottish Gaelic" -msgstr "" +msgstr "шотландски галски" msgid "Galician" -msgstr "галицейски език" +msgstr "галицейски" msgid "Hebrew" msgstr "иврит" @@ -135,163 +144,181 @@ msgid "Hindi" msgstr "хинди" msgid "Croatian" -msgstr "хърватски език" +msgstr "хърватски" msgid "Upper Sorbian" -msgstr "" +msgstr "горносорбски" msgid "Hungarian" -msgstr "унгарски език" +msgstr "унгарски" msgid "Armenian" -msgstr "" +msgstr "арменски" msgid "Interlingua" -msgstr "Международен" +msgstr "интерлингва" msgid "Indonesian" -msgstr "индонезийски език" +msgstr "индонезийски" + +msgid "Igbo" +msgstr "игбо" msgid "Ido" -msgstr "Идо" +msgstr "идо" msgid "Icelandic" -msgstr "исландски език" +msgstr "исландски" msgid "Italian" -msgstr "италиански език" +msgstr "италиански" msgid "Japanese" -msgstr "японски език" +msgstr "японски" msgid "Georgian" -msgstr "грузински език" +msgstr "грузински" msgid "Kabyle" -msgstr "" +msgstr "кабилски" msgid "Kazakh" -msgstr "Казахски" +msgstr "казахски" msgid "Khmer" -msgstr "кхмерски език" +msgstr "кхмерски" msgid "Kannada" msgstr "каннада" msgid "Korean" -msgstr "Корейски" +msgstr "корейски" + +msgid "Kyrgyz" +msgstr "киргизки" msgid "Luxembourgish" -msgstr "Люксембургски" +msgstr "люксембургски" msgid "Lithuanian" -msgstr "Литовски" +msgstr "литовски" msgid "Latvian" -msgstr "Латвийски" +msgstr "латвийски" msgid "Macedonian" -msgstr "Македонски" +msgstr "македонски" msgid "Malayalam" msgstr "малаялам" msgid "Mongolian" -msgstr "Монголски" +msgstr "монголски" msgid "Marathi" -msgstr "Марати" +msgstr "марати" + +msgid "Malay" +msgstr "малайски" msgid "Burmese" -msgstr "Бурмесе" +msgstr "бирмански" msgid "Norwegian Bokmål" -msgstr "" +msgstr "норвежки букмол" msgid "Nepali" -msgstr "Непалски" +msgstr "непалски" msgid "Dutch" -msgstr "холандски" +msgstr "нидерландски" msgid "Norwegian Nynorsk" -msgstr "норвежки съвременен език" +msgstr "съвременен норвежки" msgid "Ossetic" -msgstr "Осетски" +msgstr "осетски" msgid "Punjabi" -msgstr "пенджаби" +msgstr "панджабски" msgid "Polish" -msgstr "полски език" +msgstr "полски" msgid "Portuguese" -msgstr "португалски език" +msgstr "португалски" msgid "Brazilian Portuguese" msgstr "бразилски португалски" msgid "Romanian" -msgstr "румънски език" +msgstr "румънски" msgid "Russian" -msgstr "руски език" +msgstr "руски" msgid "Slovak" -msgstr "словашки език" +msgstr "словашки" msgid "Slovenian" -msgstr "словенски език" +msgstr "словенски" msgid "Albanian" -msgstr "албански език" +msgstr "албански" msgid "Serbian" -msgstr "сръбски език" +msgstr "сръбски" msgid "Serbian Latin" -msgstr "сръбски с латински букви" +msgstr "сръбски - латиница" msgid "Swedish" -msgstr "шведски език" +msgstr "шведски" msgid "Swahili" -msgstr "Суахили" +msgstr "суахили" msgid "Tamil" -msgstr "тамил" +msgstr "тамилски" msgid "Telugu" msgstr "телугу" +msgid "Tajik" +msgstr "таджикски" + msgid "Thai" -msgstr "тайландски език" +msgstr "тайландски" + +msgid "Turkmen" +msgstr "туркменски" msgid "Turkish" -msgstr "турски език" +msgstr "турски" msgid "Tatar" -msgstr "Татарски" +msgstr "татарски" msgid "Udmurt" -msgstr "Удмурт" +msgstr "удмурт" + +msgid "Uyghur" +msgstr "Уйгурски" msgid "Ukrainian" -msgstr "украински език" +msgstr "украински" msgid "Urdu" -msgstr "Урду" +msgstr "урду" msgid "Uzbek" -msgstr "" +msgstr "узбекски" msgid "Vietnamese" -msgstr "виетнамски език" +msgstr "виетнамски" msgid "Simplified Chinese" -msgstr "китайски език" +msgstr "китайски" msgid "Traditional Chinese" msgstr "традиционен китайски" @@ -300,13 +327,18 @@ msgid "Messages" msgstr "Съобщения" msgid "Site Maps" -msgstr "Бързи Maps" +msgstr "Карти на сайта" msgid "Static Files" msgstr "Статични файлове" msgid "Syndication" -msgstr "Syndication" +msgstr "Синдикация" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." msgid "That page number is not an integer" msgstr "Номерът на страницата не е цяло число" @@ -320,11 +352,14 @@ msgstr "В тази страница няма резултати" msgid "Enter a valid value." msgstr "Въведете валидна стойност. " +msgid "Enter a valid domain name." +msgstr "Въведете валидно име на домейн." + msgid "Enter a valid URL." msgstr "Въведете валиден URL адрес." msgid "Enter a valid integer." -msgstr "Въведете валидно число." +msgstr "Въведете валидно целочислено число." msgid "Enter a valid email address." msgstr "Въведете валиден имейл адрес." @@ -333,20 +368,27 @@ msgstr "Въведете валиден имейл адрес." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Въведете валиден 'слъг', състоящ се от букви, цифри, тирета или долни тирета." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Въведете валиден 'слъг', състоящ се от Уникод букви, цифри, тирета или долни " +"тирета." -msgid "Enter a valid IPv4 address." -msgstr "Въведете валиден IPv4 адрес." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Въведете валиден %(protocol)s адрес." -msgid "Enter a valid IPv6 address." -msgstr "Въведете валиден IPv6 адрес." +msgid "IPv4" +msgstr "IPv4" + +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Въведете валиден IPv4 или IPv6 адрес." +msgid "IPv4 or IPv6" +msgstr "IPv4 или IPv6" msgid "Enter only digits separated by commas." msgstr "Въведете само еднозначни числа, разделени със запетая. " @@ -364,6 +406,18 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Уверете се, че тази стойност е по-голяма или равна на %(limit_value)s ." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Уверете се, че стойността е кратна на стъпката %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Въведете стойност, кратна на стъпката %(limit_value)s, започвайки от " +"%(offset)s, например %(offset)s, %(valid_value1)s, %(valid_value2)s, и т.н." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -398,7 +452,7 @@ msgstr "Въведете число." #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "Уверете се, че има не повече от %(max)s цифри в общо." +msgstr[0] "Уверете се, че има не повече от %(max)s цифри общо." msgstr[1] "Уверете се, че има не повече от %(max)s цифри общо." #, python-format @@ -415,7 +469,7 @@ msgid "" msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." msgstr[0] "" -"Уверете се, че има не повече от %(max)s цифри преди десетичната запетая." +"Уверете се, че има не повече от %(max)s цифра преди десетичната запетая." msgstr[1] "" "Уверете се, че има не повече от %(max)s цифри преди десетичната запетая." @@ -424,16 +478,22 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Не са разрешени файлове с раширение \"%(extension)s\". Позволените " +"разширения са: %(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Празни знаци не са разрешени." msgid "and" msgstr "и" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)s с тези %(field_labels)s вече съществува." +msgstr "%(model_name)s с този %(field_labels)s вече съществува." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Ограничението “%(name)s” е нарушено." #, python-format msgid "Value %(value)r is not a valid choice." @@ -449,14 +509,13 @@ msgstr "Това поле не може да е празно." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s с този %(field_label)s вече съществува." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" -"%(field_label)s трябва да са уникални за %(date_field_label)s " -"%(lookup_type)s." +"%(field_label)s трябва да е уникално за %(date_field_label)s %(lookup_type)s." #, python-format msgid "Field of type: %(field_type)s" @@ -464,19 +523,22 @@ msgstr "Поле от тип: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Стойността на \"%(value)s\" трябва да бъде или True, или False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Стойност \"%(value)s\" трябва да бъде или True, или False или None." msgid "Boolean (Either True or False)" -msgstr "Boolean (True или False)" +msgstr "Булево (True или False)" #, python-format msgid "String (up to %(max_length)s)" msgstr "Символен низ (до %(max_length)s символа)" +msgid "String (unlimited)" +msgstr "Стринг (неограничен)" + msgid "Comma-separated integers" msgstr "Цели числа, разделени с запетая" @@ -485,12 +547,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Стойността \"%(value)s\" е с невалиден формат за дата. Тя трябва да бъде в " +"ГГГГ-ММ-ДД формат." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Стойността \"%(value)s\" е в правилния формат (ГГГГ-ММ-ДД), но самата дата е " +"невалидна." msgid "Date (without time)" msgstr "Дата (без час)" @@ -500,19 +566,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Стойността '%(value)s' е с невалиден формат. Трябва да бъде във формат ГГГГ-" +"ММ-ДД ЧЧ:ММ[:сс[.uuuuuu]][TZ]" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Стойността '%(value)s' е с правилен формат ( ГГГГ-ММ-ДД ЧЧ:ММ[:сс[.μμμμμμ]]" +"[TZ]), но датата/часът са невалидни" msgid "Date (with time)" msgstr "Дата (и час)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Стойността \"%(value)s\" трябва да е десетично число." msgid "Decimal number" msgstr "Десетична дроб" @@ -522,26 +592,28 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Стойността “%(value)s” е с невалиден формат. Трябва да бъде във формат [ДД] " +"[[ЧЧ:]ММ:]сс[.uuuuuu] format." msgid "Duration" msgstr "Продължителност" msgid "Email address" -msgstr "Email адрес" +msgstr "Имейл адрес" msgid "File path" msgstr "Път към файл" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Стойността '%(value)s' трябва да е число с плаваща запетая." msgid "Floating point number" msgstr "Число с плаваща запетая" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Стойността \"%(value)s\" трябва да е цяло число." msgid "Integer" msgstr "Цяло число" @@ -549,6 +621,9 @@ msgstr "Цяло число" msgid "Big (8 byte) integer" msgstr "Голямо (8 байта) цяло число" +msgid "Small integer" +msgstr "2 байта цяло число" + msgid "IPv4 address" msgstr "IPv4 адрес" @@ -557,10 +632,13 @@ msgstr "IP адрес" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Стойността '%(value)s' трябва да бъде None, True или False." msgid "Boolean (Either True, False or None)" -msgstr "Boolean (Възможните стойности са True, False или None)" +msgstr "булев (възможните стойности са True, False или None)" + +msgid "Positive big integer" +msgstr "Положително голямо цяло число." msgid "Positive integer" msgstr "Положително цяло число" @@ -570,10 +648,7 @@ msgstr "Положително 2 байта цяло число" #, python-format msgid "Slug (up to %(max_length)s)" -msgstr "Slug (до %(max_length)s )" - -msgid "Small integer" -msgstr "2 байта цяло число" +msgstr "Слъг (до %(max_length)s )" msgid "Text" msgstr "Текст" @@ -583,12 +658,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Стойността \"%(value)s\" е с невалиден формат. Тя трябва да бъде в ЧЧ:ММ [:" +"сс[.μμμμμμ]]" #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Стойността \"%(value)s\" е в правилния формат (ЧЧ:ММ [:сс[.μμμμμμ]]), но " +"часът е невалиден." msgid "Time" msgstr "Време" @@ -601,10 +680,10 @@ msgstr "сурови двоични данни" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "\"%(value)s\" не е валиден UUID." msgid "Universally unique identifier" -msgstr "" +msgstr "Универсално уникален идентификатор" msgid "File" msgstr "Файл" @@ -612,6 +691,12 @@ msgstr "Файл" msgid "Image" msgstr "Изображение" +msgid "A JSON object" +msgstr "Обект във формат JSON" + +msgid "Value must be valid JSON." +msgstr "Стойността трябва да е валиден JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Инстанция на %(model)s с %(field)s %(value)r не съществува." @@ -620,18 +705,18 @@ msgid "Foreign Key (type determined by related field)" msgstr "Външен ключ (тип, определен от свързаното поле)" msgid "One-to-one relationship" -msgstr "словенски език" +msgstr "едно-към-едно релация " #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "%(from)s-%(to)s релация" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "%(from)s-%(to)s релации" msgid "Many-to-many relationship" -msgstr "Много-към-много връзка" +msgstr "Много-към-много релация" #. Translators: If found as last label character, these punctuation #. characters will prevent the default label_suffix to be appended to the @@ -646,7 +731,7 @@ msgid "Enter a whole number." msgstr "Въведете цяло число. " msgid "Enter a valid date." -msgstr "Въведете валидна дата. " +msgstr "Въведете валидна дата." msgid "Enter a valid time." msgstr "Въведете валиден час." @@ -659,16 +744,16 @@ msgstr "Въведете валидна продължителност." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "Броят на дните трябва да е между {min_days} и {max_days}." msgid "No file was submitted. Check the encoding type on the form." -msgstr "Не е получен файл. Проверете типа кодиране на формата. " +msgstr "Няма изпратен файл. Проверете типа кодиране на формата. " msgid "No file was submitted." msgstr "Няма изпратен файл." msgid "The submitted file is empty." -msgstr "Каченият файл е празен. " +msgstr "Изпратеният файл е празен. " #, python-format msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." @@ -703,6 +788,9 @@ msgstr "Въведете пълна стойност." msgid "Enter a valid UUID." msgstr "Въведете валиден UUID." +msgid "Enter a valid JSON." +msgstr "Въведете валиден JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -711,20 +799,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Скрито поле %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Данни за мениджърската форма липсват или са били променени." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm данните липсват или са променяни неправомерно. Липсващи " +"полета: %(field_names)s. Трябва да изпратите уведомление за бъг, ако този " +"проблем продължава." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Моля, въведете %d по-малко форми." -msgstr[1] "Моля, въведете %d по-малко форми." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Моля изпратете не повече от %(num)d формуляр." +msgstr[1] "Моля изпратете не повече от %(num)d формуляра." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Моля, въведете %d или по-вече форми." -msgstr[1] "Моля, въведете %d или по-вече форми." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Моля изпратете поне %(num)d формуляр." +msgstr[1] "Моля изпратете поне %(num)d формуляра." msgid "Order" msgstr "Ред" @@ -754,20 +848,22 @@ msgid "Please correct the duplicate values below." msgstr "Моля, коригирайте повтарящите се стойности по-долу." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "Стойността в реда не отговаря на родителската инстанция." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "Направете валиден избор. Този не е един от възможните избори. " #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” не е валидна стойност." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s не може да се интерпретира в часова зона %(current_timezone)s; " +"вероятно стойността е нееднозначна или не съществува изобщо." msgid "Clear" msgstr "Изчисти" @@ -787,35 +883,27 @@ msgstr "Да" msgid "No" msgstr "Не" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "да, не, може би" +msgstr "да,не,може би" #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d, байт" -msgstr[1] "%(size)d, байта" +msgstr[1] "%(size)d байта" #, python-format msgid "%s KB" -msgstr "%s KB" +msgstr "%s KБ" #, python-format msgid "%s MB" -msgstr "%s MB" +msgstr "%s МБ" #, python-format msgid "%s GB" -msgstr "%s GB" +msgstr "%s ГБ" #, python-format msgid "%s TB" @@ -823,7 +911,7 @@ msgstr "%s ТБ" #, python-format msgid "%s PB" -msgstr "%s PB" +msgstr "%s ПБ" msgid "p.m." msgstr "след обяд" @@ -952,7 +1040,7 @@ msgid "oct" msgstr "окт" msgid "nov" -msgstr "ноев" +msgstr "ноем" msgid "dec" msgstr "дек" @@ -971,7 +1059,7 @@ msgstr "Март" msgctxt "abbrev. month" msgid "April" -msgstr "Април" +msgstr "Апр." msgctxt "abbrev. month" msgid "May" @@ -999,7 +1087,7 @@ msgstr "Окт." msgctxt "abbrev. month" msgid "Nov." -msgstr "Ноев." +msgstr "Ноем." msgctxt "abbrev. month" msgid "Dec." @@ -1043,7 +1131,7 @@ msgstr "Септември" msgctxt "alt. month" msgid "October" -msgstr "след обяд" +msgstr "Октомври" msgctxt "alt. month" msgid "November" @@ -1059,53 +1147,50 @@ msgstr "Въведете валиден IPv6 адрес." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "или" #. Translators: This string is used as a separator between list elements msgid ", " -msgstr "," +msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d година" -msgstr[1] "%d години" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d година" +msgstr[1] "%(num)d години" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месец" -msgstr[1] "%d месеца" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d месец" +msgstr[1] "%(num)d месеца" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d седмица" -msgstr[1] "%d седмици" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d седмица" +msgstr[1] "%(num)d седмици" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d дни" -msgstr[1] "%d дни" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d ден" +msgstr[1] "%(num)d дни" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d час" -msgstr[1] "%d часа" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d час" +msgstr[1] "%(num)d часа" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минута" -msgstr[1] "%d минути" - -msgid "0 minutes" -msgstr "0 минути" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минута" +msgstr[1] "%(num)d минути" msgid "Forbidden" msgstr "Забранен" @@ -1115,31 +1200,43 @@ msgstr "CSRF проверката се провали. Заявката прек msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Вие виждате това съобщение, защото този HTTPS сайт изисква да бъде изпратен " +"'Referer header' от вашият уеб браузър, но такъв не бе изпратен. Този " +"header е задължителен от съображения за сигурност, за да се гарантира, че " +"вашият браузър не е компрометиран от трети страни." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Ако сте настроили вашия браузър да деактивира 'Referer' headers, моля да ги " +"активирате отново, поне за този сайт, или за HTTPS връзки, или за 'same-" +"origin' заявки." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Ако използвате таг или " +"включвате “Referrer-Policy: no-referrer” header, моля премахнете ги. CSRF " +"защитата изисква “Referer” header, за да извърши стриктна проверка на " +"изпращача. Ако сте притеснени за поверителността, използвайте алтернативи " +"като за връзки към сайтове на трети страни." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" -"Вие виждате това съобщение, защото този сайт изисква CSRF бисквитка когато " +"Вие виждате това съобщение, защото този сайт изисква CSRF бисквитка, когато " "се подават формуляри. Тази бисквитка е задължителна от съображения за " "сигурност, за да се гарантира, че вашият браузър не е компрометиран от трети " "страни." @@ -1148,6 +1245,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Ако сте конфигурирали браузъра си да забрани бисквитките, моля да ги " +"активирате отново, поне за този сайт, или за \"same-origin\" заявки." msgid "More information is available with DEBUG=True." msgstr "Повече информация е на разположение с DEBUG=True." @@ -1156,13 +1255,13 @@ msgid "No year specified" msgstr "Не е посочена година" msgid "Date out of range" -msgstr "" +msgstr "Датата е в невалиден диапазон" msgid "No month specified" msgstr "Не е посочен месец" msgid "No day specified" -msgstr "ноев" +msgstr "Не е посочен ден" msgid "No week specified" msgstr "Не е посочена седмица" @@ -1176,19 +1275,22 @@ msgid "" "Future %(verbose_name_plural)s not available because %(class_name)s." "allow_future is False." msgstr "" -"Бъдещo %(verbose_name_plural)s е достъпно, тъй като %(class_name)s." +"Бъдещo %(verbose_name_plural)s е недостъпно, тъй като %(class_name)s." "allow_future е False." #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Невалидна текстова стойност на датата “%(datestr)s” при зададен формат " +"“%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" -msgstr "Няма %(verbose_name)s , съвпадащи със заявката" +msgstr "Няма %(verbose_name)s, съвпадащи със заявката" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Страницата не е \"последна\", нито може да се преобразува в цяло число." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1196,57 +1298,56 @@ msgstr "Невалидна страница (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Празен списък и \"%(class_name)s.allow_empty\" e False." msgid "Directory indexes are not allowed here." msgstr "Тук не е позволено индексиране на директория." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" не съществува" #, python-format msgid "Index of %(directory)s" msgstr "Индекс %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Фреймуоркът за перфекционисти с крайни срокове." +msgid "The install worked successfully! Congratulations!" +msgstr "Инсталацията Ви заработи успешно! Поздравления!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"Разгледайте release notes за Django %(version)s" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -"Вие виждате тази страница защото DEBUG=True е във вашият settings файл и не сте конфигурирали никакви " -"URL-и" +"Вие виждате тази страница, защото DEBUG=True е във вашия файл с настройки и не сте " +"конфигурирали никакви URL-и." msgid "Django Documentation" -msgstr "Django Документация" +msgstr "Django документация" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Теми, наръчници, & друга документация" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "Урок: Приложение за анкета" msgid "Get started with Django" msgstr "Започнете с Django" msgid "Django Community" -msgstr "" +msgstr "Django общност" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "Свържете се, получете помощ или допринесете" diff --git a/django/conf/locale/bg/formats.py b/django/conf/locale/bg/formats.py index b7d0c3b53dd1..ee90c5b08f1f 100644 --- a/django/conf/locale/bg/formats.py +++ b/django/conf/locale/bg/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd F Y' -TIME_FORMAT = 'H:i' +DATE_FORMAT = "d F Y" +TIME_FORMAT = "H:i" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = ' ' # Non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = " " # Non-breaking space # NUMBER_GROUPING = diff --git a/django/conf/locale/bn/formats.py b/django/conf/locale/bn/formats.py index 6205fb95cb76..9d1bb09d13a2 100644 --- a/django/conf/locale/bn/formats.py +++ b/django/conf/locale/bn/formats.py @@ -2,31 +2,31 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F, Y' -TIME_FORMAT = 'g:i A' +DATE_FORMAT = "j F, Y" +TIME_FORMAT = "g:i A" # DATETIME_FORMAT = -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M, Y' +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M, Y" # SHORT_DATETIME_FORMAT = FIRST_DAY_OF_WEEK = 6 # Saturday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', # 25/10/2016 - '%d/%m/%y', # 25/10/16 - '%d-%m-%Y', # 25-10-2016 - '%d-%m-%y', # 25-10-16 + "%d/%m/%Y", # 25/10/2016 + "%d/%m/%y", # 25/10/16 + "%d-%m-%Y", # 25-10-2016 + "%d-%m-%y", # 25-10-16 ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # 14:30:59 - '%H:%M', # 14:30 + "%H:%M:%S", # 14:30:59 + "%H:%M", # 14:30 ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # 25/10/2006 14:30:59 - '%d/%m/%Y %H:%M', # 25/10/2006 14:30 + "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 + "%d/%m/%Y %H:%M", # 25/10/2006 14:30 ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," # NUMBER_GROUPING = diff --git a/django/conf/locale/br/LC_MESSAGES/django.mo b/django/conf/locale/br/LC_MESSAGES/django.mo index 2831728827b8..d864abe918e9 100644 Binary files a/django/conf/locale/br/LC_MESSAGES/django.mo and b/django/conf/locale/br/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/br/LC_MESSAGES/django.po b/django/conf/locale/br/LC_MESSAGES/django.po index ef101e573b84..3b1a759bb7f0 100644 --- a/django/conf/locale/br/LC_MESSAGES/django.po +++ b/django/conf/locale/br/LC_MESSAGES/django.po @@ -1,14 +1,16 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 +# Ewen , 2021 # Fulup , 2012,2014 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-18 21:19+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Breton (http://www.transifex.com/django/django/language/br/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,6 +28,9 @@ msgstr "Afrikaneg" msgid "Arabic" msgstr "Arabeg" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Astureg" @@ -87,7 +92,7 @@ msgid "Argentinian Spanish" msgstr "Spagnoleg Arc'hantina" msgid "Colombian Spanish" -msgstr "" +msgstr "Spagnoleg Kolombia" msgid "Mexican Spanish" msgstr "Spagnoleg Mec'hiko" @@ -149,6 +154,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonezeg" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -179,6 +187,9 @@ msgstr "Kannata" msgid "Korean" msgstr "Koreaneg" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luksembourgeg" @@ -200,6 +211,9 @@ msgstr "Mongoleg" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Burmeg" @@ -263,9 +277,15 @@ msgstr "Tamileg" msgid "Telugu" msgstr "Telougou" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turkeg" @@ -294,7 +314,7 @@ msgid "Traditional Chinese" msgstr "Sinaeg hengounel" msgid "Messages" -msgstr "" +msgstr "Kemennadenn" msgid "Site Maps" msgstr "Tresoù al lec'hienn" @@ -305,14 +325,19 @@ msgstr "Restroù statek" msgid "Syndication" msgstr "Sindikadur" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "" msgid "That page number is less than 1" -msgstr "" +msgstr "An niver a bajenn mañ a zo bihanoc'h eget 1." msgid "That page contains no results" -msgstr "" +msgstr "N'eus disoc'h er pajenn-mañ." msgid "Enter a valid value." msgstr "Merkit un talvoud reizh" @@ -321,7 +346,7 @@ msgid "Enter a valid URL." msgstr "Merkit un URL reizh" msgid "Enter a valid integer." -msgstr "" +msgstr "Merkit un niver anterin reizh." msgid "Enter a valid email address." msgstr "Merkit ur chomlec'h postel reizh" @@ -548,6 +573,9 @@ msgstr "Anterin" msgid "Big (8 byte) integer" msgstr "Anterin bras (8 okted)" +msgid "Small integer" +msgstr "Niver anterin bihan" + msgid "IPv4 address" msgstr "Chomlec'h IPv4" @@ -561,6 +589,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Boulean (gwir pe gaou pe netra)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Niver anterin pozitivel" @@ -571,9 +602,6 @@ msgstr "Niver anterin bihan pozitivel" msgid "Slug (up to %(max_length)s)" msgstr "Slug (betek %(max_length)s arouez.)" -msgid "Small integer" -msgstr "Niver anterin bihan" - msgid "Text" msgstr "Testenn" @@ -611,6 +639,12 @@ msgstr "Restr" msgid "Image" msgstr "Skeudenn" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -702,6 +736,9 @@ msgstr "Merkañ un talvoud klok" msgid "Enter a valid UUID." msgstr "" +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr "" @@ -710,12 +747,15 @@ msgstr "" msgid "(Hidden field %(name)s) %(error)s" msgstr "" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." msgstr[0] "" msgstr[1] "" msgstr[2] "" @@ -723,8 +763,8 @@ msgstr[3] "" msgstr[4] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." msgstr[0] "" msgstr[1] "" msgstr[2] "" @@ -792,17 +832,9 @@ msgstr "Ya" msgid "No" msgstr "Ket" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "ya, ket, marteze" +msgstr "ya,ket,marteze" #, python-format msgid "%(size)d byte" @@ -1077,61 +1109,58 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d bloaz" -msgstr[1] "%d bloaz" -msgstr[2] "%d bloaz" -msgstr[3] "%d bloaz" -msgstr[4] "%d bloaz" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d miz" -msgstr[1] "%d miz" -msgstr[2] "%d miz" -msgstr[3] "%d miz" -msgstr[4] "%d miz" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d sizhun" -msgstr[1] "%d sizhun" -msgstr[2] "%d sizhun" -msgstr[3] "%d sizhun" -msgstr[4] "%d sizhun" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d deiz" -msgstr[1] "%d deiz" -msgstr[2] "%d deiz" -msgstr[3] "%d deiz" -msgstr[4] "%d deiz" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d eur" -msgstr[1] "%d eur" -msgstr[2] "%d eur" -msgstr[3] "%d eur" -msgstr[4] "%d eur" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d munud" -msgstr[1] "%d munud" -msgstr[2] "%d munud" -msgstr[3] "%d munud" -msgstr[4] "%d munud" - -msgid "0 minutes" -msgstr "0 munud" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" msgid "Forbidden" msgstr "Difennet" @@ -1141,7 +1170,7 @@ msgstr "" msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1232,7 +1261,7 @@ msgstr "" msgid "Index of %(directory)s" msgstr "Meneger %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." +msgid "The install worked successfully! Congratulations!" msgstr "" #, python-format @@ -1241,9 +1270,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2012,2015-2017 -# Carles Barrobés , 2011-2012,2014 +# Antoni Aloy , 2012,2015-2017,2021-2022 +# Carles Barrobés , 2011-2012,2014,2020 # duub qnnp, 2015 +# Emilio Carrion, 2022 # Gil Obradors Via , 2019 # Gil Obradors Via , 2019 # Jannis Leidel , 2011 +# Manel Clos , 2020 # Manuel Miranda , 2015 +# Mariusz Felisiak , 2021 # Roger Pons , 2015 +# Santiago Lamora , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2022-05-17 05:23-0500\n" +"PO-Revision-Date: 2022-07-25 06:49+0000\n" +"Last-Translator: Emilio Carrion\n" "Language-Team: Catalan (http://www.transifex.com/django/django/language/" "ca/)\n" "MIME-Version: 1.0\n" @@ -30,6 +34,9 @@ msgstr "Afrikans" msgid "Arabic" msgstr "àrab" +msgid "Algerian Arabic" +msgstr "àrab argelià" + msgid "Asturian" msgstr "Asturià" @@ -67,7 +74,7 @@ msgid "German" msgstr "alemany" msgid "Lower Sorbian" -msgstr "Lower Sorbian" +msgstr "baix serbi" msgid "Greek" msgstr "grec" @@ -85,28 +92,28 @@ msgid "Esperanto" msgstr "Esperanto" msgid "Spanish" -msgstr "espanyol" +msgstr "castellà" msgid "Argentinian Spanish" msgstr "castellà d'Argentina" msgid "Colombian Spanish" -msgstr "Español de Colombia" +msgstr "castellà de Colombia" msgid "Mexican Spanish" -msgstr "espanyol de Mèxic" +msgstr "castellà de Mèxic" msgid "Nicaraguan Spanish" msgstr "castellà de Nicaragua" msgid "Venezuelan Spanish" -msgstr "Espanyol de Veneçuela" +msgstr "castellà de Veneçuela" msgid "Estonian" msgstr "estonià" msgid "Basque" -msgstr "euskera" +msgstr "èuscar" msgid "Persian" msgstr "persa" @@ -124,7 +131,7 @@ msgid "Irish" msgstr "irlandès" msgid "Scottish Gaelic" -msgstr "Escocés Gaélico" +msgstr "Gaèlic escocès" msgid "Galician" msgstr "gallec" @@ -139,7 +146,7 @@ msgid "Croatian" msgstr "croat" msgid "Upper Sorbian" -msgstr "Upper Sorbian" +msgstr "alt serbi" msgid "Hungarian" msgstr "hongarès" @@ -153,6 +160,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "indonesi" +msgid "Igbo" +msgstr "lgbo" + msgid "Ido" msgstr "Ido" @@ -183,6 +193,9 @@ msgstr "kannarès" msgid "Korean" msgstr "coreà" +msgid "Kyrgyz" +msgstr "Kyrgyz" + msgid "Luxembourgish" msgstr "Luxemburguès" @@ -204,14 +217,17 @@ msgstr "mongol" msgid "Marathi" msgstr "Maratí" +msgid "Malay" +msgstr "Malai" + msgid "Burmese" msgstr "Burmès" msgid "Norwegian Bokmål" -msgstr "Norwegian Bokmål" +msgstr "Bokmål noruec" msgid "Nepali" -msgstr "Nepalí" +msgstr "nepalès" msgid "Dutch" msgstr "holandès" @@ -220,7 +236,7 @@ msgid "Norwegian Nynorsk" msgstr "noruec nynorsk" msgid "Ossetic" -msgstr "Ossètic" +msgstr "ossètic" msgid "Punjabi" msgstr "panjabi" @@ -267,9 +283,15 @@ msgstr "tàmil" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "Tajik" + msgid "Thai" msgstr "tailandès" +msgid "Turkmen" +msgstr "Turkmen" + msgid "Turkish" msgstr "turc" @@ -286,7 +308,7 @@ msgid "Urdu" msgstr "urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Vietnamese" msgstr "vietnamita" @@ -309,8 +331,13 @@ msgstr "Arxius estàtics" msgid "Syndication" msgstr "Sindicació" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" -msgstr "Aquesta plana no és un sencer" +msgstr "Aquest número de plana no és un enter" msgid "That page number is less than 1" msgstr "El nombre de plana és inferior a 1" @@ -358,7 +385,8 @@ msgstr "Introduïu només dígits separats per comes." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "Assegureu-vos que el valor sigui %(limit_value)s (és %(show_value)s)." +msgstr "" +"Assegureu-vos que aquest valor sigui %(limit_value)s (és %(show_value)s)." #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." @@ -370,6 +398,12 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Assegureu-vos que aquest valor sigui més gran o igual que %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +" \n" +"Asseguri's que aquest valor sigui un múltiple de %(limit_value)s." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -381,7 +415,7 @@ msgstr[0] "" "Assegureu-vos que aquest valor té almenys %(limit_value)d caràcter (en té " "%(show_value)d)." msgstr[1] "" -"Assegureu-vos que aquest valor té almenys %(limit_value)d caràcters (en té " +"Assegureu-vos que el valor tingui almenys %(limit_value)d caràcters (en té " "%(show_value)d)." #, python-format @@ -395,8 +429,8 @@ msgstr[0] "" "Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcter (en té " "%(show_value)d)." msgstr[1] "" -"Assegureu-vos que aquest valor té com a molt %(limit_value)d caràcters (en " -"té %(show_value)d)." +"Assegureu-vos que aquest valor tingui com a molt %(limit_value)d caràcters " +"(en té %(show_value)d)." msgid "Enter a number." msgstr "Introduïu un número." @@ -405,13 +439,13 @@ msgstr "Introduïu un número." msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Assegureu-vos que no hi ha més de %(max)s dígit en total." -msgstr[1] "Assegureu-vos que no hi ha més de %(max)s dígits en total." +msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s dígits en total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "Assegureu-vos que no hi ha més de %(max)s decimal." -msgstr[1] "Assegureu-vos que no hi ha més de %(max)s decimals." +msgstr[1] "Assegureu-vos que no hi hagi més de %(max)s decimals." #, python-format msgid "" @@ -421,18 +455,18 @@ msgid_plural "" msgstr[0] "" "Assegureu-vos que no hi ha més de %(max)s dígit abans de la coma decimal." msgstr[1] "" -"Assegureu-vos que no hi ha més de %(max)s dígits abans de la coma decimal." +"Assegureu-vos que no hi hagi més de %(max)s dígits abans de la coma decimal." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" -"L'extensió d'arxiu '%(extension)s' no està permesa. Les extensions permeses " -"són: '%(allowed_extensions)s'." +"L'extensió d'arxiu “%(extension)s” no està permesa. Les extensions permeses " +"són: %(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "Caràcters nul no estan permesos." +msgstr "No es permeten caràcters nuls." msgid "and" msgstr "i" @@ -441,6 +475,10 @@ msgstr "i" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Ja existeix %(model_name)s amb aquest %(field_labels)s." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "La restricció %(name)s no es compleix." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "El valor %(value)r no és una opció vàlida." @@ -455,8 +493,8 @@ msgstr "Aquest camp no pot estar en blanc." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ja existeix %(model_name)s amb aquest %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -473,7 +511,7 @@ msgstr "El valor '%(value)s' ha de ser \"True\" o \"False\"." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "El valor '%(value)s' ha de ser cert, fals o cap." +msgstr "El valor '%(value)s' ha de ser cert, fals o buid." msgid "Boolean (Either True or False)" msgstr "Booleà (Cert o Fals)" @@ -549,7 +587,7 @@ msgstr "Ruta del fitxer" #, python-format msgid "“%(value)s” value must be a float." -msgstr "El valor '%(value)s' ha de ser un número de coma flotant." +msgstr "El valor '%(value)s' ha de ser un número decimal." msgid "Floating point number" msgstr "Número de coma flotant" @@ -564,6 +602,9 @@ msgstr "Enter" msgid "Big (8 byte) integer" msgstr "Enter gran (8 bytes)" +msgid "Small integer" +msgstr "Enter petit" + msgid "IPv4 address" msgstr "Adreça IPv4" @@ -577,6 +618,9 @@ msgstr "El valor '%(value)s' ha de ser None, True o False." msgid "Boolean (Either True, False or None)" msgstr "Booleà (Cert, Fals o Cap ('None'))" +msgid "Positive big integer" +msgstr "Enter gran positiu" + msgid "Positive integer" msgstr "Enter positiu" @@ -587,9 +631,6 @@ msgstr "Enter petit positiu" msgid "Slug (up to %(max_length)s)" msgstr "Slug (fins a %(max_length)s)" -msgid "Small integer" -msgstr "Enter petit" - msgid "Text" msgstr "Text" @@ -631,6 +672,12 @@ msgstr "Arxiu" msgid "Image" msgstr "Imatge" +msgid "A JSON object" +msgstr "Un objecte JSON" + +msgid "Value must be valid JSON." +msgstr "El valor ha de ser JSON vàlid." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "La instància de %(model)s amb %(field)s %(value)r no existeix." @@ -639,7 +686,7 @@ msgid "Foreign Key (type determined by related field)" msgstr "Clau forana (tipus determinat pel camp relacionat)" msgid "One-to-one relationship" -msgstr "Inter-relació un-a-un" +msgstr "Relació un-a-un" #, python-format msgid "%(from)s-%(to)s relationship" @@ -650,7 +697,7 @@ msgid "%(from)s-%(to)s relationships" msgstr "relacions %(from)s-%(to)s " msgid "Many-to-many relationship" -msgstr "Inter-relació molts-a-molts" +msgstr "Relació molts-a-molts" #. Translators: If found as last label character, these punctuation #. characters will prevent the default label_suffix to be appended to the @@ -662,7 +709,7 @@ msgid "This field is required." msgstr "Aquest camp és obligatori." msgid "Enter a whole number." -msgstr "Introduïu un número sencer." +msgstr "Introduïu un número enter." msgid "Enter a valid date." msgstr "Introduïu una data vàlida." @@ -674,7 +721,7 @@ msgid "Enter a valid date/time." msgstr "Introduïu una data/hora vàlides." msgid "Enter a valid duration." -msgstr "Introdueixi una durada vàlida." +msgstr "Introduïu una durada vàlida." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." @@ -724,7 +771,10 @@ msgid "Enter a complete value." msgstr "Introduïu un valor complet." msgid "Enter a valid UUID." -msgstr "Intrudueixi un UUID vàlid." +msgstr "Intruduïu un UUID vàlid." + +msgid "Enter a valid JSON." +msgstr "Introduïu un JSON vàlid." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -734,20 +784,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Camp ocult %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Falten dades de ManagementForm o s'ha manipulat" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Les dades de ManagementForm no hi són o han estat modificades. Camps que " +"falten: %(field_names)s. . Necessitaràs omplir una incidència si el problema " +"persisteix." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Sisplau envieu com a molt %d formulari." -msgstr[1] "Sisplau envieu com a molt %d formularis." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Enviau com a màxim %(num)d formulari, si us plau." +msgstr[1] "Enviau com a màxim %(num)d formularis, si us plau." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Sisplau envieu com a mínim %d formulari." -msgstr[1] "Sisplau envieu com a mínim %d formularis." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Enviau com a mínim %(num)d formulari, si us plau." +msgstr[1] "Enviau com a mínim %(num)d formularis, si us plau." msgid "Order" msgstr "Ordre" @@ -777,11 +833,12 @@ msgid "Please correct the duplicate values below." msgstr "Si us plau, corregiu els valors duplicats a sota." msgid "The inline value did not match the parent instance." -msgstr "El valor en línia no coincideix la instancia mare ." +msgstr "El valor en línia no coincideix amb la instància mare ." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" -"Esculli una opció vàlida. Aquesta opció no és una de les opcions disponibles." +"Esculliu una opció vàlida. La opció triada no és una de les opcions " +"disponibles." #, python-format msgid "“%(pk)s” is not a valid value." @@ -813,15 +870,7 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "Any" - -msgid "Month" -msgstr "Mes" - -msgid "Day" -msgstr "Dia" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "sí,no,potser" @@ -985,51 +1034,51 @@ msgstr "des." msgctxt "abbrev. month" msgid "Jan." -msgstr "gen." +msgstr "Gen." msgctxt "abbrev. month" msgid "Feb." -msgstr "feb." +msgstr "Feb." msgctxt "abbrev. month" msgid "March" -msgstr "mar." +msgstr "Març" msgctxt "abbrev. month" msgid "April" -msgstr "abr." +msgstr "Abr." msgctxt "abbrev. month" msgid "May" -msgstr "mai." +msgstr "Maig" msgctxt "abbrev. month" msgid "June" -msgstr "jun." +msgstr "Juny" msgctxt "abbrev. month" msgid "July" -msgstr "jul." +msgstr "Jul." msgctxt "abbrev. month" msgid "Aug." -msgstr "ago." +msgstr "Ago." msgctxt "abbrev. month" msgid "Sept." -msgstr "set." +msgstr "Set." msgctxt "abbrev. month" msgid "Oct." -msgstr "oct." +msgstr "Oct." msgctxt "abbrev. month" msgid "Nov." -msgstr "nov." +msgstr "Nov." msgctxt "abbrev. month" msgid "Dec." -msgstr "des." +msgstr "Des." msgctxt "alt. month" msgid "January" @@ -1085,7 +1134,7 @@ msgstr "Aquesta no és una adreça IPv6 vàlida." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "o" @@ -1095,43 +1144,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d any" -msgstr[1] "%d anys" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d any" +msgstr[1] "%(num)d anys" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d mesos" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mes" +msgstr[1] "%(num)d mesos" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d setmana" -msgstr[1] "%d setmanes" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d setmana" +msgstr[1] "%(num)d setmanes" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dia" -msgstr[1] "%d dies" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dia" +msgstr[1] "%(num)d dies" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d hores" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d hores" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minuts" - -msgid "0 minutes" -msgstr "0 minuts" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minuts" msgid "Forbidden" msgstr "Prohibit" @@ -1141,22 +1187,22 @@ msgstr "La verificació de CSRF ha fallat. Petició abortada." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Estàs veient aquest missatge perquè aquest lloc HTTPS requereix que el teu " -"navegador enviï una capçalera 'Referer', i no n'ha arribada cap. Aquesta " -"capçalera es requereix per motius de seguretat, per garantir que el teu " -"navegador no està sent infiltrat per tercers." +"Esteu veient aquest missatge perquè aquest lloc HTTPS requereix que el " +"vostre navegador enviï una capçalera “Referer\", i no n'ha arribada cap. " +"Aquesta capçalera es requereix per motius de seguretat, per garantir que el " +"vostre navegador no està sent segrestat per tercers." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" -"Si has configurat el teu navegador per deshabilitar capçaleres 'Referer', " -"sisplau torna-les a habilitar, com a mínim per a aquest lloc, o per a " +"Si heu configurat el vostre navegador per deshabilitar capçaleres “Referer" +"\", sisplau torneu-les a habilitar, com a mínim per a aquest lloc, o per a " "connexions HTTPs, o per a peticions amb el mateix orígen." msgid "" @@ -1166,11 +1212,11 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" -"Si utilitza l'etiqueta o " -"inclou la capçalera 'Referrer-Policy: no-referrer' , si et plau elimina-la. " -"La protecció CSRF requereix la capçalera 'Referer' per a fer una " -"comprovació estricte. Si està preocupat en quan a la privacitat, utilitzi " -"alternatives com per enllaçar a aplicacions de " +"Si utilitzeu l'etiqueta o " +"incloeu la capçalera “Referer-Policy: no-referrer\" , si us plau elimineu-" +"la. La protecció CSRF requereix la capçalera “Referer\" per a fer una " +"comprovació estricta. Si esteu preocupats quant a la privacitat, utilitzeu " +"alternatives com per enllaços a aplicacions de " "tercers." msgid "" @@ -1227,7 +1273,7 @@ msgstr "Cadena invàlida de data '%(datestr)s' donat el format '%(format)s'" #, python-format msgid "No %(verbose_name)s found matching the query" -msgstr "No s'ha trobat sap %(verbose_name)s que coincideixi amb la petició" +msgstr "No s'ha trobat cap %(verbose_name)s que coincideixi amb la petició" msgid "Page is not “last”, nor can it be converted to an int." msgstr "La pàgina no és 'last', ni es pot convertir en un enter" @@ -1241,7 +1287,7 @@ msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "Llista buida i '%(class_name)s.allow_empty' és Fals." msgid "Directory indexes are not allowed here." -msgstr "Aquí no es permeten índexs de directori." +msgstr "Aquí no es permeten índex de directori." #, python-format msgid "“%(path)s” does not exist" @@ -1251,8 +1297,8 @@ msgstr "\"%(path)s\" no existeix" msgid "Index of %(directory)s" msgstr "Índex de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: l'entorn de treball per a perfeccionistes de temps rècord." +msgid "The install worked successfully! Congratulations!" +msgstr "La instal·lació ha estat un èxit! Enhorabona!" #, python-format msgid "" @@ -1263,9 +1309,6 @@ msgstr "" "\" target=\"_blank\" rel=\"noopener\">notes de llançament per Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "La instal·lació ha estat un èxit! Felicitats!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " "URLs." msgstr "" -"Està veient aquesta pàgina degut a que el paràmetre DEBUG=Trueconsta al fitxer de configuració i no teniu " -"direccions URLs configurades." +"\"noopener\">DEBUG=Trueconsta al fitxer de configuració i no teniu cap " +"URL configurada." msgid "Django Documentation" msgstr "Documentació de Django" @@ -1285,7 +1328,7 @@ msgid "Topics, references, & how-to’s" msgstr "Temes, referències, & Com es fa" msgid "Tutorial: A Polling App" -msgstr "Programa d'aprenentatge: Una aplicació enquesta" +msgstr "Tutorial: Una aplicació enquesta" msgid "Get started with Django" msgstr "Primers passos amb Django" diff --git a/django/conf/locale/ca/formats.py b/django/conf/locale/ca/formats.py index 746d08fdd288..e6162990d19b 100644 --- a/django/conf/locale/ca/formats.py +++ b/django/conf/locale/ca/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\e\s G:i' -YEAR_MONTH_FORMAT = r'F \d\e\l Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y G:i' +DATE_FORMAT = r"j E \d\e Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = r"j E \d\e Y \a \l\e\s G:i" +YEAR_MONTH_FORMAT = r"F \d\e\l Y" +MONTH_DAY_FORMAT = r"j E" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y G:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - # '31/12/2009', '31/12/09' - '%d/%m/%Y', '%d/%m/%y' + "%d/%m/%Y", # '31/12/2009' + "%d/%m/%y", # '31/12/09' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', - '%d/%m/%Y %H:%M:%S.%f', - '%d/%m/%Y %H:%M', - '%d/%m/%y %H:%M:%S', - '%d/%m/%y %H:%M:%S.%f', - '%d/%m/%y %H:%M', + "%d/%m/%Y %H:%M:%S", + "%d/%m/%Y %H:%M:%S.%f", + "%d/%m/%Y %H:%M", + "%d/%m/%y %H:%M:%S", + "%d/%m/%y %H:%M:%S.%f", + "%d/%m/%y %H:%M", ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ckb/LC_MESSAGES/django.mo b/django/conf/locale/ckb/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..39b9108995e9 Binary files /dev/null and b/django/conf/locale/ckb/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ckb/LC_MESSAGES/django.po b/django/conf/locale/ckb/LC_MESSAGES/django.po new file mode 100644 index 000000000000..1caebbc6b16c --- /dev/null +++ b/django/conf/locale/ckb/LC_MESSAGES/django.po @@ -0,0 +1,1332 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bawar Jalal, 2021 +# Bawar Jalal, 2020-2021 +# Bawar Jalal, 2020 +# Kosar Tofiq Saeed , 2020-2021 +# Swara , 2022-2024 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Swara , 2022-2024\n" +"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" +"language/ckb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ckb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "ئەفریقی" + +msgid "Arabic" +msgstr "عەرەبی" + +msgid "Algerian Arabic" +msgstr "عەرەبیی جەزائیری" + +msgid "Asturian" +msgstr "ئاستوری" + +msgid "Azerbaijani" +msgstr "ئازەربایجانی" + +msgid "Bulgarian" +msgstr "بولگاری" + +msgid "Belarusian" +msgstr "بیلاڕوسی" + +msgid "Bengali" +msgstr "بەنگالی" + +msgid "Breton" +msgstr "بریتۆنی" + +msgid "Bosnian" +msgstr "بۆسنێیی" + +msgid "Catalan" +msgstr "کاتالانی" + +msgid "Central Kurdish (Sorani)" +msgstr "کوردی" + +msgid "Czech" +msgstr "چیکی" + +msgid "Welsh" +msgstr "وێڵزی" + +msgid "Danish" +msgstr "دانیمارکی" + +msgid "German" +msgstr "ئەڵمانی" + +msgid "Lower Sorbian" +msgstr "سۆربیانی خواروو" + +msgid "Greek" +msgstr "یۆنانی" + +msgid "English" +msgstr "ئینگلیزی" + +msgid "Australian English" +msgstr "ئینگلیزی ئوستورالی" + +msgid "British English" +msgstr "ئینگلیزی بەریتانی" + +msgid "Esperanto" +msgstr "ئێسپەرانتەویی" + +msgid "Spanish" +msgstr "ئیسپانی" + +msgid "Argentinian Spanish" +msgstr "ئیسپانیی ئەرجەنتینی" + +msgid "Colombian Spanish" +msgstr "ئیسپانیی کۆڵۆمبی" + +msgid "Mexican Spanish" +msgstr "ئیسپانیی مەکسیکی" + +msgid "Nicaraguan Spanish" +msgstr "ئیسپانیی نیکاراگوایی" + +msgid "Venezuelan Spanish" +msgstr "ئیسپانیی فەنزوێلایی" + +msgid "Estonian" +msgstr "ئیستۆنی" + +msgid "Basque" +msgstr "باسکۆیی" + +msgid "Persian" +msgstr "فارسی" + +msgid "Finnish" +msgstr "فینلەندی" + +msgid "French" +msgstr "فەڕەنسی" + +msgid "Frisian" +msgstr "فریسی" + +msgid "Irish" +msgstr "ئیرلەندی" + +msgid "Scottish Gaelic" +msgstr "گالیکی سکۆتلەندی" + +msgid "Galician" +msgstr "گالیسیایی" + +msgid "Hebrew" +msgstr "ئیسرائیلی" + +msgid "Hindi" +msgstr "هیندی" + +msgid "Croatian" +msgstr "کڕواتی" + +msgid "Upper Sorbian" +msgstr "سڕبی سەروو" + +msgid "Hungarian" +msgstr "هەنگاری" + +msgid "Armenian" +msgstr "ئەرمەنی" + +msgid "Interlingua" +msgstr "ئینتەرلینگوایی" + +msgid "Indonesian" +msgstr "ئیندۆنیزی" + +msgid "Igbo" +msgstr "ئیگبۆیی" + +msgid "Ido" +msgstr "ئیدۆیی" + +msgid "Icelandic" +msgstr "ئایسلەندی" + +msgid "Italian" +msgstr "ئیتاڵی" + +msgid "Japanese" +msgstr "یابانی" + +msgid "Georgian" +msgstr "جۆرجی" + +msgid "Kabyle" +msgstr "کابایلی" + +msgid "Kazakh" +msgstr "کازاخی" + +msgid "Khmer" +msgstr "خەمیری" + +msgid "Kannada" +msgstr "کانێدایی" + +msgid "Korean" +msgstr "کۆری" + +msgid "Kyrgyz" +msgstr "کیرگزستانی" + +msgid "Luxembourgish" +msgstr "لۆکسەمبۆرگی" + +msgid "Lithuanian" +msgstr "لیتوانی" + +msgid "Latvian" +msgstr "لاتیڤی" + +msgid "Macedonian" +msgstr "مەسەدۆنی" + +msgid "Malayalam" +msgstr "مەلایالامی" + +msgid "Mongolian" +msgstr "مەنگۆلی" + +msgid "Marathi" +msgstr "ماراسی" + +msgid "Malay" +msgstr "مالایی" + +msgid "Burmese" +msgstr "بورمایی" + +msgid "Norwegian Bokmål" +msgstr "بۆکامۆلی نەرویجی" + +msgid "Nepali" +msgstr "نیپاڵی" + +msgid "Dutch" +msgstr "هۆڵەندی" + +msgid "Norwegian Nynorsk" +msgstr "نینۆرسکی نەرویجی" + +msgid "Ossetic" +msgstr "ئۆسیتی" + +msgid "Punjabi" +msgstr "پونجابی" + +msgid "Polish" +msgstr "پۆڵۆنی" + +msgid "Portuguese" +msgstr "پورتوگالی" + +msgid "Brazilian Portuguese" +msgstr "پورتوگالیی بەڕازیلی" + +msgid "Romanian" +msgstr "ڕۆمانیایی" + +msgid "Russian" +msgstr "ڕووسی" + +msgid "Slovak" +msgstr "سلۆڤاکی" + +msgid "Slovenian" +msgstr "سلۆڤینیایی" + +msgid "Albanian" +msgstr "ئەلبانی" + +msgid "Serbian" +msgstr "سڕبی" + +msgid "Serbian Latin" +msgstr "سڕبیی لاتین" + +msgid "Swedish" +msgstr "سویدی" + +msgid "Swahili" +msgstr "سواهیلی" + +msgid "Tamil" +msgstr "تامیلی" + +msgid "Telugu" +msgstr "تێلوگویی" + +msgid "Tajik" +msgstr "تاجیکی" + +msgid "Thai" +msgstr "تایلاندی" + +msgid "Turkmen" +msgstr "تورکمانی" + +msgid "Turkish" +msgstr "تورکی" + +msgid "Tatar" +msgstr "تاتاری" + +msgid "Udmurt" +msgstr "ئودمورتی" + +msgid "Uyghur" +msgstr "ئۆیغور" + +msgid "Ukrainian" +msgstr "ئۆکرانی" + +msgid "Urdu" +msgstr "ئوردویی" + +msgid "Uzbek" +msgstr "ئۆزبەکی" + +msgid "Vietnamese" +msgstr "ڤێتنامی" + +msgid "Simplified Chinese" +msgstr "چینی سادەکراو" + +msgid "Traditional Chinese" +msgstr "چینی کلاسیکی" + +msgid "Messages" +msgstr "پەیامەکان" + +msgid "Site Maps" +msgstr "نەخشەکانی پێگە" + +msgid "Static Files" +msgstr "فایلە نەگۆڕەکان" + +msgid "Syndication" +msgstr "هاوبەشکردن" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + +msgid "That page number is not an integer" +msgstr "ئەو ژمارەی پەڕەیە ژمارەی تەواو نییە" + +msgid "That page number is less than 1" +msgstr "ئەو ژمارەی پەڕەیە لە 1 کەمترە" + +msgid "That page contains no results" +msgstr "ئەو پەڕەیە هیچ ئەنجامێکی تێدا نییە" + +msgid "Enter a valid value." +msgstr "نرخێکی دروست لەناودابنێ." + +msgid "Enter a valid domain name." +msgstr "پاوەن/دۆمەینی دروست بنوسە." + +msgid "Enter a valid URL." +msgstr "URL ی دروست لەناودابنێ." + +msgid "Enter a valid integer." +msgstr "ژمارەیەکی تەواو لەناودابنێ" + +msgid "Enter a valid email address." +msgstr "ناونیشانێکی ئیمەیڵی دروست لەناودابنێ" + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیت، ژمارە، ژێرهێڵ یان هێڵ." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"\"سلەگ\"ێکی دروست بنوسە کە پێکهاتووە لە پیتی یونیکۆد، ژمارە، هێڵی ژێرەوە، " +"یان هێما." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "ناونیشانی %(protocol)s دروست بنوسە." + +msgid "IPv4" +msgstr "IPv4" + +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 یان IPv6" + +msgid "Enter only digits separated by commas." +msgstr "تەنها ژمارە لەناودابنێ بە فاریزە جیاکرابێتەوە." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "دڵنیاببە ئەم نرخە %(limit_value)sە (ئەوە %(show_value)sە). " + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "دڵنیاببە ئەم نرخە کەمترە یاخود یەکسانە بە %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "دڵنیاببە ئەم نرخە گەورەترە یاخود یەکسانە بە %(limit_value)s." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "دڵنیابە کە ئەم بەهایە چەندانێکە لە قەبارەی هەنگاوی%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"دڵنیابە ئەم بەهایە چەند هێندەیەکی قەبارەی هەنگاوەکانە %(limit_value)s, " +"دەستپێدەکات لە %(offset)s، بۆ نموونە %(offset)s، %(valid_value1)s، " +"%(valid_value2)s، هتد." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." +msgstr[1] "" +"دڵنیابە ئەم بەهایە لانیکەم %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." +msgstr[1] "" +"دڵنیابە ئەم بەهایە لانی زۆر %(limit_value)d نوسەی هەیە (%(show_value)d هەیە)." + +msgid "Enter a number." +msgstr "ژمارەیەک بنوسە." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." +msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارە نیە." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." +msgstr[1] "دڵنیابە لەوەی بەگشتی زیاتر لە %(max)s ژمارەی دەیی نیە." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." +msgstr[1] "دڵنیابە لەوەی زیاتر نیە لە %(max)s ژمارە پێش خاڵی ژمارەی دەیی." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"پەڕگەپاشبەندی “%(extension)s” ڕێگەپێنەدراوە. پاشبنەدە ڕێگەپێدراوەکان: " +"%(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "نوسەی بەتاڵ ڕێگەپێنەدراوە." + +msgid "and" +msgstr "و" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s لەگەڵ %(field_labels)s پێشتر تۆمارکراوە." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "سنوردارکردنی “%(name)s” پێشێلکراوە." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "بەهای %(value)r هەڵبژاردەیەکی دروست نیە." + +msgid "This field cannot be null." +msgstr "ئەم خانەیە نابێت پووچ بێت." + +msgid "This field cannot be blank." +msgstr "ئەم خانەیە نابێت بەتاڵ بێت." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s لەگەڵ %(field_label)s پێشتر تۆمارکراوە." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s دەبێت بێهاوتا بێت بۆ %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "خانە لە جۆری: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "بەهای “%(value)s” دەبێت دروست یان چەوت بێت." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "بەهای “%(value)s” دەبێت یان دروست، یان چەوت یان هیچ بێت." + +msgid "Boolean (Either True or False)" +msgstr "بولی (یان دروست یان چەوت)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "ڕیزبەند (تا %(max_length)s)" + +msgid "String (unlimited)" +msgstr "ڕیز(بێسنوور)" + +msgid "Comma-separated integers" +msgstr "ژمارە تەواوەکان بە کۆما جیاکراونەتەوە" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"بەهای “%(value)s” شێوازی بەروارێکی نادروستی هەیە. دەبێت بەشێوازی YYYY-MM-DD " +"بێت." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"بەهای “%(value)s” شێوازێکی تەواوی هەیە (YYYY-MM-DD) بەڵام بەروارێکی هەڵەیە." + +msgid "Date (without time)" +msgstr "بەروار (بەبێ کات)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"بەهای “%(value)s” شێوازێکی نادروستی هەیە. دەبێت بەشێوەی YYYY-MM-DD HH:MM[:" +"ss[.uuuuuu]][TZ] بێت." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"بەهای “%(value)s” شێوازێکی دروستی هەیە (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"بەروار/کاتێکی نادروستە." + +msgid "Date (with time)" +msgstr "بەروار (لەگەڵ کات)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "بەهای “%(value)s” دەبێت ژمارەیەکی دەیی بێت." + +msgid "Decimal number" +msgstr "ژمارەی دەیی" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی [DD] [[HH:]MM:]ss[." +"uuuuuu] format بێت." + +msgid "Duration" +msgstr "ماوە" + +msgid "Email address" +msgstr "ناونیشانی ئیمەیڵ" + +msgid "File path" +msgstr "ڕێڕەوی پەڕگە" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "بەهای “%(value)s” دەبێت ژمارەی کەرتی بێت." + +msgid "Floating point number" +msgstr "خاڵی ژمارەی کەرتی" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "بەهای “%(value)s” دەبێت ژمارەی تەواو بێت." + +msgid "Integer" +msgstr "ژمارەی تەواو" + +msgid "Big (8 byte) integer" +msgstr "(8بایت) ژمارەی تەواوی گەورە" + +msgid "Small integer" +msgstr "ژمارەی تەواوی بچوک" + +msgid "IPv4 address" +msgstr "ناونیشانی IPv4" + +msgid "IP address" +msgstr "ناونیشانی ئای پی" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "بەهای “%(value)s” دەبێت یان هیچ، یان دروست یان چەوت بێت." + +msgid "Boolean (Either True, False or None)" +msgstr "بولی (یان دروست یان چەوت یان هیچ)" + +msgid "Positive big integer" +msgstr "ژمارەی تەواوی گەورەی ئەرێنی" + +msgid "Positive integer" +msgstr "ژمارەی تەواوی ئەرێنی" + +msgid "Positive small integer" +msgstr "ژمارەی تەواوی بچوکی ئەرێنی" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "سلەگ (تا %(max_length)s)" + +msgid "Text" +msgstr "نوسین" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"بەهای “%(value)s” شێوازێکی هەڵەی هەیە. دەبێت بەشێوەی HH:MM[:ss[.uuuuuu]] بێت." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"“%(value)s” بەهاکە شێوازێکی دروستی هەیە (HH:MM[:ss[.uuuuuu]]) بەڵام کاتێکی " +"نادروستە." + +msgid "Time" +msgstr "کات" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "داتای دووانەیی خاو" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "“%(value)s ” UUIDێکی دروستی نیە." + +msgid "Universally unique identifier" +msgstr "ناسێنەرێکی بێهاوتای گشتگیر" + +msgid "File" +msgstr "پەڕگە" + +msgid "Image" +msgstr "وێنە" + +msgid "A JSON object" +msgstr "ئۆبجێکتێکی JSON" + +msgid "Value must be valid JSON." +msgstr "بەها پێویستە JSONی دروست بێت." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s هاوشێوەیە لەگەڵ %(field)s %(value)r نیە." + +msgid "Foreign Key (type determined by related field)" +msgstr "کلیلی دەرەکی(جۆر بەپێی خانەی پەیوەندیدار دیاری دەکرێت)" + +msgid "One-to-one relationship" +msgstr "پەیوەندیی یەک-بۆ-یەک" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s پەیوەندی" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s پەیوەندییەکان" + +msgid "Many-to-many relationship" +msgstr "پەیوەندیی گشت-بۆ-گشت" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":؟.!" + +msgid "This field is required." +msgstr "ئەم خانەیە داواکراوە." + +msgid "Enter a whole number." +msgstr "ژمارەیەکی تەواو بنوسە." + +msgid "Enter a valid date." +msgstr "بەرواری دروست بنوسە." + +msgid "Enter a valid time." +msgstr "تکایە کاتێکی ڕاست بنووسە." + +msgid "Enter a valid date/time." +msgstr "بەروار/کاتی دروست بنوسە." + +msgid "Enter a valid duration." +msgstr "بەهای دروستی ماوە بنوسە." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "ژمارەی ڕۆژەکان دەبێت لەنێوان {min_days} و {max_days} بێت." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "هیچ پەڕگەیەک نەنێردراوە. جۆری کۆدکردنی پەڕگەکە لەسەر فۆرمەکە بپشکنە." + +msgid "No file was submitted." +msgstr "هیچ پەڕگەیەک نەنێردراوە." + +msgid "The submitted file is empty." +msgstr "پەڕگەی نێردراو بەتاڵە." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." +msgstr[1] "دڵنیابە کە ناوی پەڕگە زیاتر لە %(max)d نوسەی نیە (%(length)d هەیە)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"تکایە یان پەڕگەیەک بنێرە یان چوارچێوەی پشکنین هەڵبژێرە، نەک هەردووکیان." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"وێنەی دروست هەڵبژێرە. ئەو پەڕگەی بەرزتکردۆوە یان وێنە نیە یان وێنەیەکی خراپ " +"بووە." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"هەڵبژاردەیەکی دروست دیاری بکە. %(value)s یەکێک نیە لە هەڵبژاردە بەردەستەکان." + +msgid "Enter a list of values." +msgstr "لیستی بەهاکان بنوسە." + +msgid "Enter a complete value." +msgstr "تەواوی بەهایەک بنوسە." + +msgid "Enter a valid UUID." +msgstr "بەهای دروستی UUID بنوسە." + +msgid "Enter a valid JSON." +msgstr "JSONی دروست بنوسە." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(خانەی شاراوە %(name)s) %(error)s" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"داتاکانی فۆڕمی بەڕێوەبردن نەماوە یان دەستکاری کراون. خانە وونبووەکان: " +"%(field_names)s. لەوانەیە پێویستت بە تۆمارکردنی ڕاپۆرتی هەڵە بێت ئەگەر " +"کێشەکە بەردەوام بوو." + +#, python-format +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "تکایە لانی زۆر %(num)d فۆرم بنێرە." +msgstr[1] "تکایە لانی زۆر %(num)d فۆرم بنێرە." + +#, python-format +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "تکایە لانی کەم %(num)d فۆرم بنێرە." +msgstr[1] "تکایە لانی کەم %(num)d فۆرم بنێرە." + +msgid "Order" +msgstr "ڕیز" + +msgid "Delete" +msgstr "سڕینەوە" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "تکایە داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"تکایە ئەو داتا دووبارەکراوەکانە چاکبکەرەوە بۆ %(field)s، کە دەبێت بێهاوتابن." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"تکایە ئەو داتا دووبارەکراوەکان چاکبکەرەوە بۆ %(field_name)s کە دەبێت بێهاوتا " +"بن بۆ %(lookup)s لە%(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "تکایە بەها دووبارەکانی خوارەوە ڕاست بکەرەوە." + +msgid "The inline value did not match the parent instance." +msgstr "بەهای ناوهێڵ هاوشێوەی نمونەی باوانەکەی نیە." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "هەڵبژاردەی دروست دیاری بکە. هەڵبژاردە لە هەڵبژاردە بەردەستەکان نیە." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "“%(pk)s” بەهایەکی دروست نیە." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s نەتوانرا لە ناوچەی کاتدا لێکبدرێتەوە %(current_timezone)s؛ " +"لەوانەیە ناڕوون بێت یان لەوانەیە بوونی نەبێت." + +msgid "Clear" +msgstr "پاککردنەوە" + +msgid "Currently" +msgstr "ئێستا" + +msgid "Change" +msgstr "گۆڕین" + +msgid "Unknown" +msgstr "نەزانراو" + +msgid "Yes" +msgstr "بەڵێ" + +msgid "No" +msgstr "نەخێر" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "بەڵێ،نەخێر،لەوانەیە" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)dبایت" +msgstr[1] "%(size)d بایت" + +#, python-format +msgid "%s KB" +msgstr "%s کب" + +#, python-format +msgid "%s MB" +msgstr "%s مب" + +#, python-format +msgid "%s GB" +msgstr "%s گب" + +#, python-format +msgid "%s TB" +msgstr "%s تب" + +#, python-format +msgid "%s PB" +msgstr "%s پب" + +msgid "p.m." +msgstr "پ.ن" + +msgid "a.m." +msgstr "پ.ن" + +msgid "PM" +msgstr "د.ن" + +msgid "AM" +msgstr "پ.ن" + +msgid "midnight" +msgstr "نیوەشەو" + +msgid "noon" +msgstr "نیوەڕۆ" + +msgid "Monday" +msgstr "دووشەممە" + +msgid "Tuesday" +msgstr "سێشەممە" + +msgid "Wednesday" +msgstr "چوارشەممە" + +msgid "Thursday" +msgstr "پێنجشەممە" + +msgid "Friday" +msgstr "هەینی" + +msgid "Saturday" +msgstr "شەممە" + +msgid "Sunday" +msgstr "یەکشەممە" + +msgid "Mon" +msgstr "دوو" + +msgid "Tue" +msgstr "سێ" + +msgid "Wed" +msgstr "چوار" + +msgid "Thu" +msgstr "پێنج" + +msgid "Fri" +msgstr "هەین" + +msgid "Sat" +msgstr "شەم" + +msgid "Sun" +msgstr "یەک" + +msgid "January" +msgstr "ڕێبەندان" + +msgid "February" +msgstr "ڕەشەمە" + +msgid "March" +msgstr "نەورۆز" + +msgid "April" +msgstr "گوڵان" + +msgid "May" +msgstr "جۆزەردان" + +msgid "June" +msgstr "پوشپەڕ" + +msgid "July" +msgstr "گەلاوێژ" + +msgid "August" +msgstr "خەرمانان" + +msgid "September" +msgstr "ڕەزبەر" + +msgid "October" +msgstr "گەڵاڕێزان" + +msgid "November" +msgstr "سەرماوەرز" + +msgid "December" +msgstr "بەفرانبار" + +msgid "jan" +msgstr "‎ڕێبەندان" + +msgid "feb" +msgstr "ڕەشەمە" + +msgid "mar" +msgstr "نەورۆز" + +msgid "apr" +msgstr "گوڵان" + +msgid "may" +msgstr "‎جۆزەردان" + +msgid "jun" +msgstr "پوشپەڕ" + +msgid "jul" +msgstr "‎گەلاوێژ" + +msgid "aug" +msgstr "خەرمانان" + +msgid "sep" +msgstr "‎ڕەزبەر" + +msgid "oct" +msgstr "‎گەڵاڕێزان" + +msgid "nov" +msgstr "‎سەرماوەرز" + +msgid "dec" +msgstr "‎بەفرانبار" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "‎ڕێبەندان" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "ڕەشەمە" + +msgctxt "abbrev. month" +msgid "March" +msgstr "نەورۆز" + +msgctxt "abbrev. month" +msgid "April" +msgstr "گوڵان" + +msgctxt "abbrev. month" +msgid "May" +msgstr "جۆزەردان" + +msgctxt "abbrev. month" +msgid "June" +msgstr "پوشپەڕ" + +msgctxt "abbrev. month" +msgid "July" +msgstr "گەلاوێژ" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "خەرمانان" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "ڕەزبەر" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "‎گەڵاڕێزان" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "‎سەرماوەرز" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "‎بەفرانبار" + +msgctxt "alt. month" +msgid "January" +msgstr "ڕێبەندان" + +msgctxt "alt. month" +msgid "February" +msgstr "ڕەشەمە" + +msgctxt "alt. month" +msgid "March" +msgstr "نەورۆز" + +msgctxt "alt. month" +msgid "April" +msgstr "گوڵان" + +msgctxt "alt. month" +msgid "May" +msgstr "جۆزەردان" + +msgctxt "alt. month" +msgid "June" +msgstr "پوشپەڕ" + +msgctxt "alt. month" +msgid "July" +msgstr "گەلاوێژ" + +msgctxt "alt. month" +msgid "August" +msgstr "خەرمانان" + +msgctxt "alt. month" +msgid "September" +msgstr "ڕەزبەر" + +msgctxt "alt. month" +msgid "October" +msgstr "گەڵاڕێزان" + +msgctxt "alt. month" +msgid "November" +msgstr "سەرماوەرز" + +msgctxt "alt. month" +msgid "December" +msgstr "بەفرانبار" + +msgid "This is not a valid IPv6 address." +msgstr "ئەمە ناونیشانی IPv6 دروست نیە." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s..." + +msgid "or" +msgstr "یان" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "، " + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "‫%(num)d ساڵ" +msgstr[1] "‫%(num)d ساڵ" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "‫%(num)d مانگ" +msgstr[1] "‫%(num)d مانگ" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "‫%(num)d هەفتە" +msgstr[1] "‫%(num)d هەفتە" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "‫%(num)d ڕۆژ" +msgstr[1] "‫%(num)d ڕۆژ" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "‫%(num)d کاتژمێر" +msgstr[1] "‫%(num)d کاتژمێر" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "‫%(num)d خولەک" +msgstr[1] "‫%(num)d خولەک" + +msgid "Forbidden" +msgstr "ڕێپێنەدراو" + +msgid "CSRF verification failed. Request aborted." +msgstr "پشتڕاستکردنەوەی CSRF شکستی هێنا. داواکاری هەڵوەشاوەتەوە." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە HTTPS پێویستی بە \"سەردێڕی " +"ئاماژەدەر\" هەیە کە لەلایەن وێبگەڕەکەتەوە بنێردرێت، بەڵام هیچیان نەنێردراوە. " +"ئەم سەردێڕە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون لەوەی کە وێبگەڕەکەت " +"لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت بۆ “Referer” ناچالاککردووە، تکایە " +"چالاکی بکەرەوە، لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ پەیوەندییەکانی HTTPS، یاخود " +"بۆ داواکانی \"Same-origin\"." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"ئەگەر تۆ تاگی بەکاردەهێنێت " +"یان سەرپەڕەی “Referrer-Policy: no-referrer” لەخۆدەگرێت، تکایە بیانسڕەوە. " +"پاراستنی CSRFەکە پێویستی بە سەرپەڕەی “Referer”هەیە بۆ ئەنجامدانی پشکنینی " +"گەڕاندنەوەی توندوتۆڵ. ئەگەر خەمی تایبەتمەندیت هەیە، بەدیلەکانی وەکو بۆ بەستنەوەی ماڵپەڕەکانی لایەنی سێیەم." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"تۆ ئەم پەیامە دەبینیت چونکە ئەم ماڵپەڕە پێویستی بە شەکرۆکەی CSRF هەیە لە " +"کاتی ناردنی فۆڕمەکاندا. ئەم شەکرۆکەیە بۆ هۆکاری ئاسایش پێویستە، بۆ دڵنیابوون " +"لەوەی کە وێبگەڕەکەت لەلایەن لایەنی سێیەمەوە دەستی بەسەردا ناگیرێت." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"ئەگەر ڕێکخستنی شەکرۆکەی ئەم وێبگەڕەت ناچالاککردووە، تکایە چالاکی بکەرەوە، " +"لانیکەم بۆ ئەم ماڵپەڕە، یان بۆ داواکانی \"Same-origin\"" + +msgid "More information is available with DEBUG=True." +msgstr "زانیاریی زیاتر بەردەستە لەگەڵ DEBUG=True." + +msgid "No year specified" +msgstr "هیچ ساڵێک دیاری نەکراوە" + +msgid "Date out of range" +msgstr "بەروار لە دەرەوەی بواردایە" + +msgid "No month specified" +msgstr "هیچ مانگێک دیاری نەکراوە" + +msgid "No day specified" +msgstr "هیچ ڕۆژێک دیاری نەکراوە" + +msgid "No week specified" +msgstr "هیچ حەفتەیەک دیاری نەکراوە" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "هیچ %(verbose_name_plural)s بەردەست نییە" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"لەداهاتوودا %(verbose_name_plural)s بەردەست نیە چونکە %(class_name)s." +"allow_future چەوتە." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "ڕیزبەندی بەروار نادروستە “%(datestr)s” شێوازی “%(format)s” پێ بدە" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "هیچ %(verbose_name)s هاوتای داواکارییەکە نیە" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "لاپەڕە “کۆتا” نییە، هەروەها ناتوانرێت بگۆڕدرێت بۆ ژمارەی تەواو." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "لاپەڕەی نادروستە (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "لیستی بەتاڵ و “%(class_name)s.allow_empty” چەوتە." + +msgid "Directory indexes are not allowed here." +msgstr "لێرەدا نوانەی بوخچەکان ڕێگەپێدراو نیە." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” بوونی نیە" + +#, python-format +msgid "Index of %(directory)s" +msgstr "نوانەی %(directory)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "دامەزراندن بەسەرکەوتوویی کاریکرد! پیرۆزە!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"سەیری تێبینیەکانی بڵاوکردنەوە بکە بۆ جانگۆی " +"%(version)s" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not " +"configured any URLs." +msgstr "" +"ئەم لاپەڕەیە دەبینیت چونکە DEBUG=True لەناو پەڕگەی ڕێکخستنەکانتە و بۆ هیچ URLێک " +"ڕێکنەخراوە." + +msgid "Django Documentation" +msgstr "بەڵگەنامەکردنی جانگۆ" + +msgid "Topics, references, & how-to’s" +msgstr "بابەتەکان, سەرچاوەکان, & چۆنێتی" + +msgid "Tutorial: A Polling App" +msgstr "فێرکاریی: ئاپێکی ڕاپرسی" + +msgid "Get started with Django" +msgstr "دەستپێبکە لەگەڵ جانگۆ" + +msgid "Django Community" +msgstr "کۆمەڵگەی جانگۆ" + +msgid "Connect, get help, or contribute" +msgstr "پەیوەندی بکە، یارمەتی وەربگرە، یان بەشداری بکە" diff --git a/django/contrib/sitemaps/management/__init__.py b/django/conf/locale/ckb/__init__.py similarity index 100% rename from django/contrib/sitemaps/management/__init__.py rename to django/conf/locale/ckb/__init__.py diff --git a/django/conf/locale/ckb/formats.py b/django/conf/locale/ckb/formats.py new file mode 100644 index 000000000000..162c840d33f3 --- /dev/null +++ b/django/conf/locale/ckb/formats.py @@ -0,0 +1,21 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j F Y، کاتژمێر G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y/n/j" +SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" +FIRST_DAY_OF_WEEK = 6 + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# DATE_INPUT_FORMATS = +# TIME_INPUT_FORMATS = +# DATETIME_INPUT_FORMATS = +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +# NUMBER_GROUPING = diff --git a/django/conf/locale/cs/LC_MESSAGES/django.mo b/django/conf/locale/cs/LC_MESSAGES/django.mo index 956f774307da..95086e3d52e9 100644 Binary files a/django/conf/locale/cs/LC_MESSAGES/django.mo and b/django/conf/locale/cs/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/cs/LC_MESSAGES/django.po b/django/conf/locale/cs/LC_MESSAGES/django.po index e7538fbcf439..14f5ef9684ec 100644 --- a/django/conf/locale/cs/LC_MESSAGES/django.po +++ b/django/conf/locale/cs/LC_MESSAGES/django.po @@ -1,20 +1,24 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 # Jannis Leidel , 2011 -# Jan Papež , 2012 +# Jan Papež , 2012,2024 +# Jiří Podhorecký , 2024 +# Jiří Podhorecký , 2022 # Jirka Vejrazka , 2011 +# Jiří Podhorecký , 2020 # Tomáš Ehrlich , 2015 # Vláďa Macek , 2012-2014 -# Vláďa Macek , 2015-2019 +# Vláďa Macek , 2015-2022 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-18 11:37+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Jan Papež , 2012,2024\n" +"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,11 +32,14 @@ msgstr "afrikánsky" msgid "Arabic" msgstr "arabsky" +msgid "Algerian Arabic" +msgstr "alžírskou arabštinou" + msgid "Asturian" msgstr "asturštinou" msgid "Azerbaijani" -msgstr "ázerbájdžánštinou" +msgstr "ázerbájdžánsky" msgid "Bulgarian" msgstr "bulharsky" @@ -52,6 +59,9 @@ msgstr "bosensky" msgid "Catalan" msgstr "katalánsky" +msgid "Central Kurdish (Sorani)" +msgstr "Střední kurdština (soranština)" + msgid "Czech" msgstr "česky" @@ -151,8 +161,11 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indonésky" +msgid "Igbo" +msgstr "igboštinou" + msgid "Ido" -msgstr "Ido" +msgstr "idem" msgid "Icelandic" msgstr "islandsky" @@ -181,6 +194,9 @@ msgstr "kannadsky" msgid "Korean" msgstr "korejsky" +msgid "Kyrgyz" +msgstr "kyrgyzštinou" + msgid "Luxembourgish" msgstr "lucembursky" @@ -202,6 +218,9 @@ msgstr "mongolsky" msgid "Marathi" msgstr "marathi" +msgid "Malay" +msgstr "malajštinou" + msgid "Burmese" msgstr "barmštinou" @@ -265,9 +284,15 @@ msgstr "tamilsky" msgid "Telugu" msgstr "telužsky" +msgid "Tajik" +msgstr "Tádžik" + msgid "Thai" msgstr "thajsky" +msgid "Turkmen" +msgstr "turkmenštinou" + msgid "Turkish" msgstr "turecky" @@ -277,6 +302,9 @@ msgstr "tatarsky" msgid "Udmurt" msgstr "udmurtsky" +msgid "Uyghur" +msgstr "Ujgurština" + msgid "Ukrainian" msgstr "ukrajinsky" @@ -307,6 +335,11 @@ msgstr "Statické soubory" msgid "Syndication" msgstr "Syndikace" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Číslo stránky není celé číslo." @@ -319,6 +352,9 @@ msgstr "Stránka je bez výsledků" msgid "Enter a valid value." msgstr "Zadejte platnou hodnotu." +msgid "Enter a valid domain name." +msgstr "Zadejte platný název domény." + msgid "Enter a valid URL." msgstr "Zadejte platnou adresu URL." @@ -342,14 +378,18 @@ msgstr "" "Zadejte platný identifikátor složený pouze z písmen, čísel, podtržítek a " "pomlček typu Unicode." -msgid "Enter a valid IPv4 address." -msgstr "Zadejte platnou adresu typu IPv4." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Zadejte platnou %(protocol)s adresu." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Zadejte platnou adresu typu IPv6." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Zadejte platnou adresu typu IPv4 nebo IPv6." +msgid "IPv4 or IPv6" +msgstr "IPv4 nebo IPv6" msgid "Enter only digits separated by commas." msgstr "Zadejte pouze číslice oddělené čárkami." @@ -366,6 +406,20 @@ msgstr "Hodnota musí být menší nebo rovna %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Hodnota musí být větší nebo rovna %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Ujistěte se, že tato hodnota je násobkem velikosti kroku %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Zajistěte, aby tato hodnota byla %(limit_value)s násobkem velikosti kroku , " +"počínaje %(offset)s, např. %(offset)s, %(valid_value1)s, %(valid_value2)s, a " +"tak dále." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -378,7 +432,7 @@ msgstr[0] "" msgstr[1] "" "Tato hodnota má mít nejméně %(limit_value)d znaky (nyní má %(show_value)d)." msgstr[2] "" -"Tato hodnota má mít nejméně %(limit_value)d znaků (nyní má %(show_value)d)." +"Tato hodnota má mít nejméně %(limit_value)d znaku (nyní má %(show_value)d)." msgstr[3] "" "Tato hodnota má mít nejméně %(limit_value)d znaků (nyní má %(show_value)d)." @@ -455,6 +509,10 @@ msgstr "" "Položka %(model_name)s s touto kombinací hodnot v polích %(field_labels)s " "již existuje." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Omezení \"%(name)s\" je porušeno." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Hodnota %(value)r není platná možnost." @@ -470,8 +528,8 @@ msgid "%(model_name)s with this %(field_label)s already exists." msgstr "" "Položka %(model_name)s s touto hodnotou v poli %(field_label)s již existuje." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -498,6 +556,9 @@ msgstr "Pravdivost (buď Ano (True), nebo Ne (False))" msgid "String (up to %(max_length)s)" msgstr "Řetězec (max. %(max_length)s znaků)" +msgid "String (unlimited)" +msgstr "Řetězec (neomezený)" + msgid "Comma-separated integers" msgstr "Celá čísla oddělená čárkou" @@ -578,6 +639,9 @@ msgstr "Celé číslo" msgid "Big (8 byte) integer" msgstr "Velké číslo (8 bajtů)" +msgid "Small integer" +msgstr "Malé celé číslo" + msgid "IPv4 address" msgstr "Adresa IPv4" @@ -591,6 +655,9 @@ msgstr "Hodnota \"%(value)s\" musí být buď None, True nebo False." msgid "Boolean (Either True, False or None)" msgstr "Pravdivost (buď Ano (True), Ne (False) nebo Nic (None))" +msgid "Positive big integer" +msgstr "Velké kladné celé číslo" + msgid "Positive integer" msgstr "Kladné celé číslo" @@ -601,9 +668,6 @@ msgstr "Kladné malé celé číslo" msgid "Slug (up to %(max_length)s)" msgstr "Identifikátor (nejvýše %(max_length)s znaků)" -msgid "Small integer" -msgstr "Malé celé číslo" - msgid "Text" msgstr "Text" @@ -644,6 +708,12 @@ msgstr "Soubor" msgid "Image" msgstr "Obrázek" +msgid "A JSON object" +msgstr "Objekt typu JSON" + +msgid "Value must be valid JSON." +msgstr "Hodnota musí být platná struktura typu JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -713,7 +783,7 @@ msgstr[0] "" msgstr[1] "" "Tento název souboru má mít nejvýše %(max)d znaky (nyní má %(length)d)." msgstr[2] "" -"Tento název souboru má mít nejvýše %(max)d znaků (nyní má %(length)d)." +"Tento název souboru má mít nejvýše %(max)d znaku (nyní má %(length)d)." msgstr[3] "" "Tento název souboru má mít nejvýše %(max)d znaků (nyní má %(length)d)." @@ -739,6 +809,9 @@ msgstr "Zadejte úplnou hodnotu." msgid "Enter a valid UUID." msgstr "Zadejte platné UUID." +msgid "Enter a valid JSON." +msgstr "Zadejte platnou strukturu typu JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -747,24 +820,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Skryté pole %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Data objektu ManagementForm chybí nebo byla pozměněna." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Data objektu ManagementForm chybí nebo s nimi bylo nedovoleně manipulováno. " +"Chybějící pole: %(field_names)s. Pokud problém přetrvává, budete možná muset " +"problém ohlásit." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Odešlete %d nebo méně formulářů." -msgstr[1] "Odešlete %d nebo méně formulářů." -msgstr[2] "Odešlete %d nebo méně formulářů." -msgstr[3] "Odešlete %d nebo méně formulářů." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Odešlete prosím nejvíce %(num)d formulář." +msgstr[1] "Odešlete prosím nejvíce %(num)d formuláře." +msgstr[2] "Odešlete prosím nejvíce %(num)d formulářů." +msgstr[3] "Odešlete prosím nejvíce %(num)d formulářů." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Odešlete %d nebo více formulářů." -msgstr[1] "Odešlete %d nebo více formulářů." -msgstr[2] "Odešlete %d nebo více formulářů." -msgstr[3] "Odešlete %d nebo více formulářů." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Odešlete prosím alespoň %(num)d formulář." +msgstr[1] "Odešlete prosím alespoň %(num)d formuláře." +msgstr[2] "Odešlete prosím alespoň %(num)d formulářů." +msgstr[3] "Odešlete prosím alespoň %(num)d formulářů." msgid "Order" msgstr "Pořadí" @@ -827,17 +906,9 @@ msgstr "Ano" msgid "No" msgstr "Ne" -msgid "Year" -msgstr "Rok" - -msgid "Month" -msgstr "Měsíc" - -msgid "Day" -msgstr "Den" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "ano, ne, možná" +msgstr "ano,ne,možná" #, python-format msgid "%(size)d byte" @@ -1111,55 +1182,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d rok" -msgstr[1] "%d roky" -msgstr[2] "%d let" -msgstr[3] "%d let" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d rok" +msgstr[1] "%(num)d roky" +msgstr[2] "%(num)d roku" +msgstr[3] "%(num)d let" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d měsíc" -msgstr[1] "%d měsíce" -msgstr[2] "%d měsíců" -msgstr[3] "%d měsíců" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d měsíc" +msgstr[1] "%(num)d měsíce" +msgstr[2] "%(num)d měsíců" +msgstr[3] "%(num)d měsíců" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d týden" -msgstr[1] "%d týdny" -msgstr[2] "%d týdnů" -msgstr[3] "%d týdnů" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d týden" +msgstr[1] "%(num)d týdny" +msgstr[2] "%(num)d týdne" +msgstr[3] "%(num)d týdnů" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d den" -msgstr[1] "%d dny" -msgstr[2] "%d dní" -msgstr[3] "%d dní" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d den" +msgstr[1] "%(num)d dny" +msgstr[2] "%(num)d dní" +msgstr[3] "%(num)d dní" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hodina" -msgstr[1] "%d hodiny" -msgstr[2] "%d hodin" -msgstr[3] "%d hodin" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hodina" +msgstr[1] "%(num)d hodiny" +msgstr[2] "%(num)d hodiny" +msgstr[3] "%(num)d hodin" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuta" -msgstr[1] "%d minuty" -msgstr[2] "%d minut" -msgstr[3] "%d minut" - -msgid "0 minutes" -msgstr "0 minut" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuta" +msgstr[1] "%(num)d minuty" +msgstr[2] "%(num)d minut" +msgstr[3] "%(num)d minut" msgid "Forbidden" msgstr "Nepřístupné (Forbidden)" @@ -1169,14 +1237,14 @@ msgstr "Selhalo ověření typu CSRF. Požadavek byl zadržen." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Tato zpráva se zobrazuje, protože tento web na protokolu HTTPS požaduje " -"záhlaví \"Referer\" od vašeho webového prohlížeče. Záhlaví je požadováno z " -"bezpečnostních důvodů, aby se zajistilo, že vašeho prohlížeče se nezmocnil " -"někdo další." +"Tuto zprávu vidíte, protože tento web na protokolu HTTPS vyžaduje, aby váš " +"prohlížeč zaslal v požadavku záhlaví \"Referer\", k čemuž nedošlo. Záhlaví " +"je požadováno z bezpečnostních důvodů pro kontrolu toho, že prohlížeče se " +"nezmocnila třetí strana." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1191,8 +1259,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Pokud používáte značku nebo " "záhlaví \"Referrer-Policy: no-referrer\", odeberte je. Ochrana typu CSRF " @@ -1277,8 +1345,8 @@ msgstr "Cesta \"%(path)s\" neexistuje" msgid "Index of %(directory)s" msgstr "Index adresáře %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Webový framework pro perfekcionisty, kteří mají termín" +msgid "The install worked successfully! Congratulations!" +msgstr "Instalace proběhla úspěšně, gratulujeme!" #, python-format msgid "" @@ -1289,19 +1357,16 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">poznámky k vydání frameworku Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalace proběhla úspěšně, gratulujeme!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Tuto zprávu vidíte, protože máte v nastavení Djanga zapnutý vývojový režim " -"DEBUG=True a zatím nemáte " +"DEBUG=True a zatím nemáte " "nastavena žádná URL." msgid "Django Documentation" diff --git a/django/conf/locale/cs/formats.py b/django/conf/locale/cs/formats.py index c01af8b7d7a3..e4a7ab9946c0 100644 --- a/django/conf/locale/cs/formats.py +++ b/django/conf/locale/cs/formats.py @@ -2,39 +2,42 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. E Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j. E Y G:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y G:i' +DATE_FORMAT = "j. E Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j. E Y G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y G:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '05.01.2006', '05.01.06' - '%d. %m. %Y', '%d. %m. %y', # '5. 1. 2006', '5. 1. 06' - # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' + "%d.%m.%Y", # '05.01.2006' + "%d.%m.%y", # '05.01.06' + "%d. %m. %Y", # '5. 1. 2006' + "%d. %m. %y", # '5. 1. 06' + # "%d. %B %Y", # '25. October 2006' + # "%d. %b. %Y", # '25. Oct. 2006' ] # Kept ISO formats as one is in first position TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '04:30:59' - '%H.%M', # '04.30' - '%H:%M', # '04:30' + "%H:%M:%S", # '04:30:59' + "%H.%M", # '04.30' + "%H:%M", # '04:30' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '05.01.2006 04:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '05.01.2006 04:30:59.000200' - '%d.%m.%Y %H.%M', # '05.01.2006 04.30' - '%d.%m.%Y %H:%M', # '05.01.2006 04:30' - '%d. %m. %Y %H:%M:%S', # '05. 01. 2006 04:30:59' - '%d. %m. %Y %H:%M:%S.%f', # '05. 01. 2006 04:30:59.000200' - '%d. %m. %Y %H.%M', # '05. 01. 2006 04.30' - '%d. %m. %Y %H:%M', # '05. 01. 2006 04:30' - '%Y-%m-%d %H.%M', # '2006-01-05 04.30' + "%d.%m.%Y %H:%M:%S", # '05.01.2006 04:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '05.01.2006 04:30:59.000200' + "%d.%m.%Y %H.%M", # '05.01.2006 04.30' + "%d.%m.%Y %H:%M", # '05.01.2006 04:30' + "%d. %m. %Y %H:%M:%S", # '05. 01. 2006 04:30:59' + "%d. %m. %Y %H:%M:%S.%f", # '05. 01. 2006 04:30:59.000200' + "%d. %m. %Y %H.%M", # '05. 01. 2006 04.30' + "%d. %m. %Y %H:%M", # '05. 01. 2006 04:30' + "%Y-%m-%d %H.%M", # '2006-01-05 04.30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/cy/formats.py b/django/conf/locale/cy/formats.py index db40cabfa6fe..eaef6a618f62 100644 --- a/django/conf/locale/cy/formats.py +++ b/django/conf/locale/cy/formats.py @@ -2,31 +2,32 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' # '25 Hydref 2006' -TIME_FORMAT = 'P' # '2:30 y.b.' -DATETIME_FORMAT = 'j F Y, P' # '25 Hydref 2006, 2:30 y.b.' -YEAR_MONTH_FORMAT = 'F Y' # 'Hydref 2006' -MONTH_DAY_FORMAT = 'j F' # '25 Hydref' -SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006' -SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 y.b.' -FIRST_DAY_OF_WEEK = 1 # 'Dydd Llun' +DATE_FORMAT = "j F Y" # '25 Hydref 2006' +TIME_FORMAT = "P" # '2:30 y.b.' +DATETIME_FORMAT = "j F Y, P" # '25 Hydref 2006, 2:30 y.b.' +YEAR_MONTH_FORMAT = "F Y" # 'Hydref 2006' +MONTH_DAY_FORMAT = "j F" # '25 Hydref' +SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' +SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 y.b.' +FIRST_DAY_OF_WEEK = 1 # 'Dydd Llun' # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," NUMBER_GROUPING = 3 diff --git a/django/conf/locale/da/LC_MESSAGES/django.mo b/django/conf/locale/da/LC_MESSAGES/django.mo index 8a13a4c341d8..59b111a32528 100644 Binary files a/django/conf/locale/da/LC_MESSAGES/django.mo and b/django/conf/locale/da/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/da/LC_MESSAGES/django.po b/django/conf/locale/da/LC_MESSAGES/django.po index 91762662f0d5..eb89a0124212 100644 --- a/django/conf/locale/da/LC_MESSAGES/django.po +++ b/django/conf/locale/da/LC_MESSAGES/django.po @@ -3,7 +3,8 @@ # Translators: # Christian Joergensen , 2012 # Danni Randeris , 2014 -# Erik Wognsen , 2013-2019 +# Erik Ramsgaard Wognsen , 2020-2024 +# Erik Ramsgaard Wognsen , 2013-2019 # Finn Gruwier Larsen, 2011 # Jannis Leidel , 2011 # jonaskoelker , 2012 @@ -13,10 +14,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 05:53+0000\n" -"Last-Translator: Erik Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen , 2020-2024\n" +"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -29,6 +30,9 @@ msgstr "afrikaans" msgid "Arabic" msgstr "arabisk" +msgid "Algerian Arabic" +msgstr "algerisk arabisk" + msgid "Asturian" msgstr "Asturisk" @@ -53,6 +57,9 @@ msgstr "bosnisk" msgid "Catalan" msgstr "catalansk" +msgid "Central Kurdish (Sorani)" +msgstr "Centralkurdisk (Sorani)" + msgid "Czech" msgstr "tjekkisk" @@ -152,6 +159,9 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indonesisk" +msgid "Igbo" +msgstr "igbo" + msgid "Ido" msgstr "Ido" @@ -182,6 +192,9 @@ msgstr "kannada" msgid "Korean" msgstr "koreansk" +msgid "Kyrgyz" +msgstr "kirgisisk" + msgid "Luxembourgish" msgstr "luxembourgisk" @@ -195,13 +208,16 @@ msgid "Macedonian" msgstr "makedonsk" msgid "Malayalam" -msgstr "malaysisk" +msgstr "malayalam" msgid "Mongolian" msgstr "mongolsk" msgid "Marathi" -msgstr "Marathi" +msgstr "marathi" + +msgid "Malay" +msgstr "malajisk" msgid "Burmese" msgstr "burmesisk" @@ -266,9 +282,15 @@ msgstr "tamil" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tadsjikisk" + msgid "Thai" msgstr "thai" +msgid "Turkmen" +msgstr "turkmensk" + msgid "Turkish" msgstr "tyrkisk" @@ -278,6 +300,9 @@ msgstr "tatarisk" msgid "Udmurt" msgstr "udmurtisk" +msgid "Uyghur" +msgstr "uygurisk" + msgid "Ukrainian" msgstr "ukrainsk" @@ -308,6 +333,11 @@ msgstr "Static Files" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Det sidetal er ikke et heltal" @@ -320,6 +350,9 @@ msgstr "Den side indeholder ingen resultater" msgid "Enter a valid value." msgstr "Indtast en gyldig værdi." +msgid "Enter a valid domain name." +msgstr "Indtast et gyldigt domænenavn." + msgid "Enter a valid URL." msgstr "Indtast en gyldig URL." @@ -343,14 +376,18 @@ msgstr "" "Indtast en gyldig “slug” bestående af Unicode-bogstaver, cifre, understreger " "eller bindestreger." -msgid "Enter a valid IPv4 address." -msgstr "Indtast en gyldig IPv4-adresse." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Indtast en gyldig %(protocol)s-adresse." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Indtast en gyldig IPv6-adresse." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Indtast en gyldig IPv4- eller IPv6-adresse." +msgid "IPv4 or IPv6" +msgstr "IPv4 eller IPv6" msgid "Enter only digits separated by commas." msgstr "Indtast kun cifre adskilt af kommaer." @@ -367,6 +404,19 @@ msgstr "Denne værdi skal være mindre end eller lig %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Denne værdi skal være større end eller lig %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Denne værdi skal være et multiplum af trinstørrelse %(limit_value)s, " +"startende fra %(offset)s, fx %(offset)s, %(valid_value1)s, %(valid_value2)s, " +"osv." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -432,6 +482,10 @@ msgstr "og" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s med dette %(field_labels)s eksisterer allerede." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Begrænsning “%(name)s” er overtrådt." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Værdien %(value)r er ikke et gyldigt valg." @@ -446,8 +500,8 @@ msgstr "Dette felt kan ikke være tomt." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s med dette %(field_label)s eksisterer allerede." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -473,6 +527,9 @@ msgstr "Boolsk (enten True eller False)" msgid "String (up to %(max_length)s)" msgstr "Streng (op til %(max_length)s)" +msgid "String (unlimited)" +msgstr "Streng (ubegrænset)" + msgid "Comma-separated integers" msgstr "Kommaseparerede heltal" @@ -555,6 +612,9 @@ msgstr "Heltal" msgid "Big (8 byte) integer" msgstr "Stort heltal (8 byte)" +msgid "Small integer" +msgstr "Lille heltal" + msgid "IPv4 address" msgstr "IPv4-adresse" @@ -568,6 +628,9 @@ msgstr "“%(value)s”-værdien skal være enten None, True eller False." msgid "Boolean (Either True, False or None)" msgstr "Boolsk (True, False eller None)" +msgid "Positive big integer" +msgstr "Positivt stort heltal" + msgid "Positive integer" msgstr "Positivt heltal" @@ -578,9 +641,6 @@ msgstr "Positivt lille heltal" msgid "Slug (up to %(max_length)s)" msgstr "\"Slug\" (op til %(max_length)s)" -msgid "Small integer" -msgstr "Lille heltal" - msgid "Text" msgstr "Tekst" @@ -622,6 +682,12 @@ msgstr "Fil" msgid "Image" msgstr "Billede" +msgid "A JSON object" +msgstr "Et JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Værdien skal være gyldig JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s instans med %(field)s %(value)r findes ikke." @@ -714,6 +780,9 @@ msgstr "Indtast en komplet værdi." msgid "Enter a valid UUID." msgstr "Indtast et gyldigt UUID." +msgid "Enter a valid JSON." +msgstr "Indtast gyldig JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -722,20 +791,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Skjult felt %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm-data mangler eller er blevet manipuleret" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-data mangler eller er blevet pillet ved. Manglende felter: " +"%(field_names)s. Du kan få behov for at oprette en fejlrapport hvis " +"problemet varer ved." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Send venligst %d eller færre formularer." -msgstr[1] "Send venligst %d eller færre formularer." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Indsend venligst højst %(num)d formular." +msgstr[1] "Indsend venligst højst %(num)d formularer." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Send venligst %d eller flere formularer." -msgstr[1] "Send venligst %d eller flere formularer." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Indsend venligst mindst %(num)d formular." +msgstr[1] "Indsend venligst mindst %(num)d formularer." msgid "Order" msgstr "Rækkefølge" @@ -800,15 +875,7 @@ msgstr "Ja" msgid "No" msgstr "Nej" -msgid "Year" -msgstr "År" - -msgid "Month" -msgstr "Måned" - -msgid "Day" -msgstr "Dag" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nej,måske" @@ -1082,43 +1149,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d år" -msgstr[1] "%d år" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d år" +msgstr[1] "%(num)d år" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d måned" -msgstr[1] "%d måneder" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d måned" +msgstr[1] "%(num)d måneder" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d uge" -msgstr[1] "%d uger" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d uge" +msgstr[1] "%(num)d uger" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dage" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dage" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d time" -msgstr[1] "%d timer" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d time" +msgstr[1] "%(num)d timer" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minutter" - -msgid "0 minutes" -msgstr "0 minutter" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minutter" msgid "Forbidden" msgstr "Forbudt" @@ -1128,12 +1192,12 @@ msgstr "CSRF-verifikationen mislykkedes. Forespørgslen blev afbrudt." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" "Du ser denne besked fordi denne HTTPS-webside kræver at din browser sender " -"en “Referer header”, men den blev ikke sendt. Denne header er påkrævet af " +"en “Referer header”, som ikke blev sendt. Denne header er påkrævet af " "sikkerhedsmæssige grunde for at sikre at din browser ikke bliver kapret af " "tredjepart." @@ -1150,8 +1214,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Hvis du bruger tagget eller " "inkluderer headeren “Referrer-Policy: no-referrer”, så fjern dem venligst. " @@ -1235,8 +1299,8 @@ msgstr "“%(path)s” eksisterer ikke" msgid "Index of %(directory)s" msgstr "Indeks for %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Webframework'et for perfektionister med deadlines." +msgid "The install worked successfully! Congratulations!" +msgstr "Installationen virkede! Tillykke!" #, python-format msgid "" @@ -1246,19 +1310,17 @@ msgstr "" "Vis udgivelsesnoter for Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen virkede! Tillykke!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Du ser denne side fordi du har DEBUG=True i din settings-fil og ikke har opsat nogen URL'er." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True i din settings-fil og ikke har opsat nogen " +"URL'er." msgid "Django Documentation" msgstr "Django-dokumentation" diff --git a/django/conf/locale/da/formats.py b/django/conf/locale/da/formats.py index 6237a7209d5a..58292084fb20 100644 --- a/django/conf/locale/da/formats.py +++ b/django/conf/locale/da/formats.py @@ -2,25 +2,25 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' + "%d.%m.%Y", # '25.10.2006' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo index 6864e7f03e6f..e3ef1cbf9a6e 100644 Binary files a/django/conf/locale/de/LC_MESSAGES/django.mo and b/django/conf/locale/de/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po index 3041c6f1409e..90037a28f3f7 100644 --- a/django/conf/locale/de/LC_MESSAGES/django.po +++ b/django/conf/locale/de/LC_MESSAGES/django.po @@ -4,19 +4,21 @@ # André Hagenbruch, 2011-2012 # Florian Apolloner , 2011 # Daniel Roschka , 2016 -# Florian Apolloner , 2018 -# Jannis Vajen, 2011,2013 +# Florian Apolloner , 2018,2020-2023 +# jnns, 2011,2013 # Jannis Leidel , 2013-2018,2020 -# Jannis Vajen, 2016 +# jnns, 2016 +# Markus Holtermann , 2023 # Markus Holtermann , 2013,2015 +# Raphael Michel , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-17 22:58+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: Markus Holtermann , 2023\n" +"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -29,6 +31,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabisch" +msgid "Algerian Arabic" +msgstr "Algerisches Arabisch" + msgid "Asturian" msgstr "Asturisch" @@ -53,6 +58,9 @@ msgstr "Bosnisch" msgid "Catalan" msgstr "Katalanisch" +msgid "Central Kurdish (Sorani)" +msgstr "Zentralkurdisch (Sorani)" + msgid "Czech" msgstr "Tschechisch" @@ -152,6 +160,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesisch" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -182,6 +193,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreanisch" +msgid "Kyrgyz" +msgstr "Kirgisisch" + msgid "Luxembourgish" msgstr "Luxemburgisch" @@ -203,6 +217,9 @@ msgstr "Mongolisch" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malaiisch" + msgid "Burmese" msgstr "Birmanisch" @@ -266,9 +283,15 @@ msgstr "Tamilisch" msgid "Telugu" msgstr "Telugisch" +msgid "Tajik" +msgstr "Tadschikisch" + msgid "Thai" msgstr "Thailändisch" +msgid "Turkmen" +msgstr "Turkmenisch" + msgid "Turkish" msgstr "Türkisch" @@ -278,6 +301,9 @@ msgstr "Tatarisch" msgid "Udmurt" msgstr "Udmurtisch" +msgid "Uyghur" +msgstr "Uigurisch" + msgid "Ukrainian" msgstr "Ukrainisch" @@ -308,6 +334,11 @@ msgstr "Statische Dateien" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Diese Seitennummer ist keine Ganzzahl" @@ -369,6 +400,18 @@ msgstr "Dieser Wert muss kleiner oder gleich %(limit_value)s sein." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Dieser Wert muss größer oder gleich %(limit_value)s sein." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Dieser Wert muss ein Vielfaches von %(limit_value)s sein." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Dieser Wert muss ein Vielfaches von %(limit_value)s sein und bei %(offset)s " +"beginnen, z.B. %(offset)s, %(valid_value1)s, %(valid_value2)s, und so weiter." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -446,6 +489,10 @@ msgstr "und" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s mit diesem %(field_labels)s existiert bereits." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Bedingung „%(name)s“ ist nicht erfüllt." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Wert %(value)r ist keine gültige Option." @@ -460,8 +507,8 @@ msgstr "Dieses Feld darf nicht leer sein." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s mit diesem %(field_label)s existiert bereits." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -487,6 +534,9 @@ msgstr "Boolescher Wert (True oder False)" msgid "String (up to %(max_length)s)" msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)" +msgid "String (unlimited)" +msgstr "Zeichenkette (unlimitiert)" + msgid "Comma-separated integers" msgstr "Kommaseparierte Liste von Ganzzahlen" @@ -569,6 +619,9 @@ msgstr "Ganzzahl" msgid "Big (8 byte) integer" msgstr "Große Ganzzahl (8 Byte)" +msgid "Small integer" +msgstr "Kleine Ganzzahl" + msgid "IPv4 address" msgstr "IPv4-Adresse" @@ -582,6 +635,9 @@ msgstr "Wert „%(value)s“ muss entweder None, True oder False sein." msgid "Boolean (Either True, False or None)" msgstr "Boolescher Wert (True, False oder None)" +msgid "Positive big integer" +msgstr "Positive große Ganzzahl" + msgid "Positive integer" msgstr "Positive Ganzzahl" @@ -592,9 +648,6 @@ msgstr "Positive kleine Ganzzahl" msgid "Slug (up to %(max_length)s)" msgstr "Kürzel (bis zu %(max_length)s)" -msgid "Small integer" -msgstr "Kleine Ganzzahl" - msgid "Text" msgstr "Text" @@ -636,6 +689,12 @@ msgstr "Datei" msgid "Image" msgstr "Bild" +msgid "A JSON object" +msgstr "Ein JSON-Objekt" + +msgid "Value must be valid JSON." +msgstr "Wert muss gültiges JSON sein." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Objekt vom Typ %(model)s mit %(field)s %(value)r existiert nicht." @@ -708,7 +767,7 @@ msgstr[1] "" msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" -"Bitte wählen Sie entweder eine Datei aus oder wählen Sie \"Löschen\", nicht " +"Bitte wählen Sie entweder eine Datei aus oder wählen Sie „Löschen“, nicht " "beides." msgid "" @@ -732,6 +791,9 @@ msgstr "Bitte einen vollständigen Wert eingeben." msgid "Enter a valid UUID." msgstr "Bitte eine gültige UUID eingeben." +msgid "Enter a valid JSON." +msgstr "Bitte ein gültiges JSON-Objekt eingeben." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -740,20 +802,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Verstecktes Feld %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm-Daten fehlen oder wurden manipuliert." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Daten für das Management-Formular fehlen oder wurden manipuliert. Fehlende " +"Felder: %(field_names)s. Bitte erstellen Sie einen Bug-Report falls der " +"Fehler dauerhaft besteht." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Bitte höchstens %d Formular abschicken." -msgstr[1] "Bitte höchstens %d Formulare abschicken." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Bitte höchstens %(num)d Forumlar abschicken." +msgstr[1] "Bitte höchstens %(num)d Formulare abschicken." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Bitte %d oder mehr Formulare abschicken." -msgstr[1] "Bitte %d oder mehr Formulare abschicken." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Bitte mindestends %(num)d Formular abschicken." +msgstr[1] "Bitte mindestens %(num)d Formulare abschicken." msgid "Order" msgstr "Reihenfolge" @@ -817,15 +885,7 @@ msgstr "Ja" msgid "No" msgstr "Nein" -msgid "Year" -msgstr "Jahr" - -msgid "Month" -msgstr "Monat" - -msgid "Day" -msgstr "Tag" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "Ja,Nein,Vielleicht" @@ -1099,43 +1159,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d Jahr" -msgstr[1] "%d Jahre" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d Jahr" +msgstr[1] "%(num)d Jahre" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d Monat" -msgstr[1] "%d Monate" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d Monat" +msgstr[1] "%(num)d Monate" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d Woche" -msgstr[1] "%d Wochen" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d Woche" +msgstr[1] "%(num)d Wochen" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d Tag" -msgstr[1] "%d Tage" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d Tag" +msgstr[1] "%(num)d Tage" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d Stunde" -msgstr[1] "%d Stunden" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d Stunde" +msgstr[1] "%(num)d Stunden" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d Minute" -msgstr[1] "%d Minuten" - -msgid "0 minutes" -msgstr "0 Minuten" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d Minute" +msgstr[1] "%(num)d Minuten" msgid "Forbidden" msgstr "Verboten" @@ -1145,11 +1202,11 @@ msgstr "CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Sie sehen diese Fehlermeldung da diese HTTPS-Seite einen „Referer“-Header " +"Sie sehen diese Fehlermeldung, da diese HTTPS-Seite einen „Referer“-Header " "von Ihrem Webbrowser erwartet, aber keinen erhalten hat. Dieser Header ist " "aus Sicherheitsgründen notwendig, um sicherzustellen, dass Ihr Webbrowser " "nicht von Dritten missbraucht wird." @@ -1168,8 +1225,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Wenn der Tag „“ oder der " "„Referrer-Policy: no-referrer“-Header verwendet wird, entfernen Sie sie " @@ -1256,31 +1313,28 @@ msgstr "„%(path)s“ ist nicht vorhanden" msgid "Index of %(directory)s" msgstr "Verzeichnis %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Das Webframework für Perfektionisten mit Termindruck." +msgid "The install worked successfully! Congratulations!" +msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"Versionshinweise für Django %(version)s " -"anzeigen" - -msgid "The install worked successfully! Congratulations!" -msgstr "Die Installation war erfolgreich. Herzlichen Glückwunsch!" +"Versionshinweise für Django " +"%(version)s anzeigen" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Diese Seite ist sichtbar weil in der Settings-Datei DEBUG = True steht und die URLs noch nicht konfiguriert " +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG = True steht und die URLs noch nicht konfiguriert " "sind." msgid "Django Documentation" diff --git a/django/conf/locale/de/formats.py b/django/conf/locale/de/formats.py index 7bd5e0582b7a..45953ce23852 100644 --- a/django/conf/locale/de/formats.py +++ b/django/conf/locale/de/formats.py @@ -2,26 +2,28 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + # "%d. %B %Y", # '25. October 2006' + # "%d. %b. %Y", # '25. Oct. 2006' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/de_CH/formats.py b/django/conf/locale/de_CH/formats.py index 999feda2efa7..f42dd48739b0 100644 --- a/django/conf/locale/de_CH/formats.py +++ b/django/conf/locale/de_CH/formats.py @@ -2,32 +2,34 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + # "%d. %B %Y", # '25. October 2006' + # "%d. %b. %Y", # '25. Oct. 2006' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' ] # these are the separators for non-monetary numbers. For monetary numbers, # the DECIMAL_SEPARATOR is a . (decimal point) and the THOUSAND_SEPARATOR is a # ' (single quote). -# For details, please refer to http://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de -# (in German) and the documentation -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +# For details, please refer to the documentation and the following link: +# https://www.bk.admin.ch/bk/de/home/dokumentation/sprachen/hilfsmittel-textredaktion/schreibweisungen.html +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/dsb/LC_MESSAGES/django.mo b/django/conf/locale/dsb/LC_MESSAGES/django.mo index dd18b76d87be..4d70da4f1c88 100644 Binary files a/django/conf/locale/dsb/LC_MESSAGES/django.mo and b/django/conf/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/dsb/LC_MESSAGES/django.po b/django/conf/locale/dsb/LC_MESSAGES/django.po index d193eba8b932..4448d1a2d365 100644 --- a/django/conf/locale/dsb/LC_MESSAGES/django.po +++ b/django/conf/locale/dsb/LC_MESSAGES/django.po @@ -1,22 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Michael Wolf , 2016-2019 +# Michael Wolf , 2016-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Michael Wolf , 2016-2024\n" +"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" "language/dsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" msgid "Afrikaans" msgstr "Afrikaanšćina" @@ -24,6 +24,9 @@ msgstr "Afrikaanšćina" msgid "Arabic" msgstr "Arabšćina" +msgid "Algerian Arabic" +msgstr "Algeriska arabšćina" + msgid "Asturian" msgstr "Asturišćina" @@ -48,6 +51,9 @@ msgstr "Bosnišćina" msgid "Catalan" msgstr "Katalańšćina" +msgid "Central Kurdish (Sorani)" +msgstr "Centralna kurdišćina (Sorani)" + msgid "Czech" msgstr "Češćina" @@ -147,6 +153,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonešćina" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -177,6 +186,9 @@ msgstr "Kannadišćina" msgid "Korean" msgstr "Korejańšćina" +msgid "Kyrgyz" +msgstr "Kirgišćina" + msgid "Luxembourgish" msgstr "Luxemburgšćina" @@ -198,6 +210,9 @@ msgstr "Mongolšćina" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malayzišćina" + msgid "Burmese" msgstr "Myanmaršćina" @@ -261,9 +276,15 @@ msgstr "Tamilšćina" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tadźikišćina" + msgid "Thai" msgstr "Thaišćina" +msgid "Turkmen" +msgstr "Turkmeńšćina" + msgid "Turkish" msgstr "Turkojšćina" @@ -273,6 +294,9 @@ msgstr "Tataršćina" msgid "Udmurt" msgstr "Udmurtšćina" +msgid "Uyghur" +msgstr "Ujguršćina" + msgid "Ukrainian" msgstr "Ukrainšćina" @@ -280,7 +304,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbekšćina" msgid "Vietnamese" msgstr "Vietnamšćina" @@ -303,6 +327,11 @@ msgstr "Statiske dataje" msgid "Syndication" msgstr "Syndikacija" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Toś ten numer boka njejo ceła licba" @@ -315,6 +344,9 @@ msgstr "Toś ten bok njewopśimujo wuslědki" msgid "Enter a valid value." msgstr "Zapódajśo płaśiwu gódnotu." +msgid "Enter a valid domain name." +msgstr "Zapódajśo płaśiwe domenowe mě." + msgid "Enter a valid URL." msgstr "Zapódajśo płaśiwy URL." @@ -328,20 +360,28 @@ msgstr "Zapódajśo płaśiwu e-mailowu adresu." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo pismiki, licby, " +"pódsmužki abo wězawki." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Zapódajśo płaśiwe „adresowe mě“, kótarež jano wopśimujo unicodowe pismiki, " +"licby, pódmužki abo wězawki." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Zapódajśo płaśiwu %(protocol)s-adresu." -msgid "Enter a valid IPv4 address." -msgstr "Zapódajśo płaśiwu IPv4-adresu." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Zapódajśo płaśiwu IPv6-adresu." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Zapódajśo płaśiwu IPv4- abo IPv6-adresu." +msgid "IPv4 or IPv6" +msgstr "IPv4 abo IPv6" msgid "Enter only digits separated by commas." msgstr "Zapódajśo jano cyfry źělone pśez komy." @@ -360,6 +400,20 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Zawěsććo, až toś ta gódnota jo wětša ako abo to samske ako %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Zawěsććo, až toś gódnota jo wjelesere kšacoweje wjelikosći %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Zawěsććo, až toś ta gódnota jo wjele wót kšacoweje wjelikosći " +"%(limit_value)s, zachopinajucy z %(offset)s, na pś. %(offset)s, " +"%(valid_value1)s, %(valid_value2)s a tak dalej." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -434,6 +488,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Datajowy sufiks „%(extension)s“ njejo dowólony. Dowólone sufikse su: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Znamuška nul njejsu dowólone." @@ -445,6 +501,10 @@ msgstr "a" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s z toś tym %(field_labels)s južo eksistěrujo." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Wobranicowanje \"%(name)s\" jo pśestupjone." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Gódnota %(value)r njejo płaśiwa wóleńska móžnosć." @@ -459,8 +519,8 @@ msgstr "Toś to pólo njamóžo prozne byś." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s z toś tym %(field_label)s južo eksistěrujo." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -473,11 +533,11 @@ msgstr "Typ póla: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Gódnota „%(value)s“ musy pak True pak False byś." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Gódnota „%(value)s“ musy pak True, False pak None byś." msgid "Boolean (Either True or False)" msgstr "Boolean (pak True pak False)" @@ -486,6 +546,9 @@ msgstr "Boolean (pak True pak False)" msgid "String (up to %(max_length)s)" msgstr "Znamuškowy rjeśazk (až %(max_length)s)" +msgid "String (unlimited)" +msgstr "Znamuškowy rjeśazk (njewobgranicowany)" + msgid "Comma-separated integers" msgstr "Pśez komu źělone cełe licby" @@ -494,12 +557,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Gódnota „%(value)s“ ma njepłaśiwy datumowy format. Musy we formaśe DD.MM." +"YYYY byś." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY), ale jo njepłaśiwy datum." msgid "Date (without time)" msgstr "Datum (bźez casa)" @@ -509,19 +575,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe DD.MM.YYYY HH:MM[:" +"ss[.uuuuuu]][TZ] byś." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Gódnota „%(value)s“ ma korektny format (DD.MM.YYYY HH:MM[:ss[.uuuuuu]][TZ]), " +"ale jo njepłaśiwy datum/cas." msgid "Date (with time)" msgstr "Datum (z casom)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Gódnota „%(value)s“ musy decimalna licba byś." msgid "Decimal number" msgstr "Decimalna licba" @@ -531,6 +601,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Gódnota „%(value)s“ ma njepłaśiwy format. Musy we formaśe [DD] " +"[[HH:]MM:]ss[.uuuuuu] byś." msgid "Duration" msgstr "Traśe" @@ -543,14 +615,14 @@ msgstr "Datajowa sćažka" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Gódnota „%(value)s“ musy typ float měś." msgid "Floating point number" msgstr "Licba běžeceje komy" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Gódnota „%(value)s“ musy ceła licba byś." msgid "Integer" msgstr "Integer" @@ -558,6 +630,9 @@ msgstr "Integer" msgid "Big (8 byte) integer" msgstr "Big (8 bajtow) integer" +msgid "Small integer" +msgstr "Mała ceła licba" + msgid "IPv4 address" msgstr "IPv4-adresa" @@ -566,11 +641,14 @@ msgstr "IP-adresa" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Gódnota „%(value)s“ musy pak None, True pak False byś." msgid "Boolean (Either True, False or None)" msgstr "Boolean (pak True, False pak None)" +msgid "Positive big integer" +msgstr "Pozitiwna wjelika ceła licba" + msgid "Positive integer" msgstr "Pozitiwna ceła licba" @@ -581,9 +659,6 @@ msgstr "Pozitiwna mała ceła licba" msgid "Slug (up to %(max_length)s)" msgstr "Adresowe mě (až %(max_length)s)" -msgid "Small integer" -msgstr "Mała ceła licba" - msgid "Text" msgstr "Tekst" @@ -592,12 +667,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Gódnota „%(value)s“ ma njepłaśiwy format. Musy w formaśe HH:MM[:ss[." +"uuuuuu]] byś." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Gódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale jo " +"njepłaśiwy cas." msgid "Time" msgstr "Cas" @@ -610,7 +689,7 @@ msgstr "Gropne binarne daty" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "„%(value)s“ njejo płaśiwy UUID." msgid "Universally unique identifier" msgstr "Uniwerselnje jadnorazowy identifikator" @@ -621,6 +700,12 @@ msgstr "Dataja" msgid "Image" msgstr "Woraz" +msgid "A JSON object" +msgstr "JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Gódnota musy płaśiwy JSON byś." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Instanca %(model)s z %(field)s %(value)r njeeksistěrujo." @@ -724,6 +809,9 @@ msgstr "Zapódajśo dopołnu gódnotu." msgid "Enter a valid UUID." msgstr "Zapódajśo płaśiwy UUID." +msgid "Enter a valid JSON." +msgstr "Zapódajśo płaśiwy JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -732,24 +820,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Schowane pólo %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Daty ManagementForm feluju abo su sfalšowane" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Daty ManagementForm feluju abo su wobškóźone. Felujuce póla: " +"%(field_names)s. Móžośo zmólkowu rozpšawu pisaś, jolic problem dalej " +"eksistěrujo." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Pšosym wótposćelśo %d formular." -msgstr[1] "Pšosym wótposćelśo %d formulara abo mjenjej." -msgstr[2] "Pšosym wótposćelśo %d formulary abo mjenjej." -msgstr[3] "Pšosym wótposćelśo %d formularow abo mjenjej." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Pšosym wótposćelśo maksimalnje %(num)d formular." +msgstr[1] "Pšosym wótposćelśo maksimalnje %(num)d formulara." +msgstr[2] "Pšosym wótposćelśo maksimalnje %(num)d formulary." +msgstr[3] "Pšosym wótposćelśo maksimalnje %(num)d formularow." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Pšosym wótposćelśo %d formular abo wěcej." -msgstr[1] "Pšosym wótposćelśo %d formulara abo wěcej." -msgstr[2] "Pšosym wótposćelśo %d formulary abo wěcej." -msgstr[3] "Pšosym wótposćelśo %d formularow abo wěcej." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Pšosym wótposćelśo minimalnje %(num)d formular." +msgstr[1] "Pšosym wótposćelśo minimalnje %(num)d formulara." +msgstr[2] "Pšosym wótposćelśo minimalnje %(num)d formulary." +msgstr[3] "Pšosym wótposćelśo minimalnje %(num)d formularow." msgid "Order" msgstr "Rěd" @@ -787,13 +881,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "„%(pk)s“ njejo płaśiwa gódnota." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s njedajo se w casowej conje %(current_timezone)s " +"interpretěrowaś; jo dwójozmysłowy abo snaź njeeksistěrujo." msgid "Clear" msgstr "Lašowaś" @@ -813,15 +909,7 @@ msgstr "Jo" msgid "No" msgstr "Ně" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "jo,ně,snaź" @@ -1097,55 +1185,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d lěto" -msgstr[1] "%d lěśe" -msgstr[2] "%d lěta" -msgstr[3] "%d lět" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d lěto" +msgstr[1] "%(num)d lěśe" +msgstr[2] "%(num)d lěta" +msgstr[3] "%(num)d lět" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mjasec" -msgstr[1] "%d mjaseca" -msgstr[2] "%d mjasece" -msgstr[3] "%d mjasecow" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mjasec" +msgstr[1] "%(num)d mjaseca" +msgstr[2] "%(num)d mjasece" +msgstr[3] "%(num)dmjasecow" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tyźeń" -msgstr[1] "%d tyéznja" -msgstr[2] "%d tyźenje" -msgstr[3] "%d tyźenjow" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d tyźeń" +msgstr[1] "%(num)d tyźenja" +msgstr[2] "%(num)d tyźenje" +msgstr[3] "%(num)d tyźenjow" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d źeń" -msgstr[1] "%d dnja" -msgstr[2] "%d dny" -msgstr[3] "%d dnjow" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d źeń " +msgstr[1] "%(num)d dnja" +msgstr[2] "%(num)d dny" +msgstr[3] "%(num)d dnjow" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d góźina" -msgstr[1] "%d góźinje" -msgstr[2] "%d góźiny" -msgstr[3] "%d góźin" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d góźina" +msgstr[1] "%(num)d góźinje" +msgstr[2] "%(num)d góźiny" +msgstr[3] "%(num)d góźin" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuta" -msgstr[1] "%d minuśe" -msgstr[2] "%d minuty" -msgstr[3] "%d minutow" - -msgid "0 minutes" -msgstr "0 minutow" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuta" +msgstr[1] "%(num)d minuśe" +msgstr[2] "%(num)d minuty" +msgstr[3] "%(num)d minutow" msgid "Forbidden" msgstr "Zakazany" @@ -1155,24 +1240,36 @@ msgstr "CSRF-pśeglědanje njejo se raźiło. Napšašowanje jo se pśetergnuło msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Wiźiśo toś tu powěźeńku, dokulaž toś to HTTPS-sedło trjeba \"Referer " +"header\", aby se pśez waš webwobglědowak słało, ale žedna njejo se pósłała. " +"Toś ta głowa jo trěbna z pśicynow wěstoty, aby so zawěsćiło, až waš " +"wobglědowak njekaprujo se wót tśeśich." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Jolic sćo swój wobglědowak tak konfigurěrował, aby se głowy 'Referer' " +"znjemóžnili, zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło, za " +"HTTPS-zwiski abo za napšašowanja 'same-origin'." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Jolic woznamjenje wužywaśo " +"abo głowu „Referrer-Policy: no-referrer“ zapśimujośo, wótwónoźćo je. CSRF-" +"šćit pomina se głowu „Referer“, aby striktnu kontrolu referera pśewjasć. " +"Jolic se wó swóju priwatnosć staraśo, wužywajśo alternatiwy ako za wótkazy k sedłam tśeśich." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1187,6 +1284,9 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Jolic sćo swój wobglědowak tak konfigurěrował, aby cookieje znjemóžnili, " +"zmóžniśo je pšosym zasej, nanejmjenjej za toś to sedło abo za napšašowanja " +"„same-origin“." msgid "More information is available with DEBUG=True." msgstr "Dalšne informacije su k dispoziciji z DEBUG=True." @@ -1221,13 +1321,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Njepłaśiwy „%(format)s“ za datumowy znamuškowy rjeśazk „%(datestr)s“ pódany" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Žedno %(verbose_name)s namakane, kótarež wótpowědujo napšašowanjeju." msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Bok njejo „last“, ani njedajo se do „int“ konwertěrowaś." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1235,51 +1336,48 @@ msgstr "Njepłaśiwy bok (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Prozna lisćina a „%(class_name)s.allow_empty“ jo False." msgid "Directory indexes are not allowed here." msgstr "Zapisowe indekse njejsu how dowólone." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "„%(path)s“ njeeksistěrujo" #, python-format msgid "Index of %(directory)s" msgstr "Indeks %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django? Web-framework za perfekcionisty z terminami." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacija jo była wuspěšna! Gratulacija!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"Wersijowe informacije za Django %(version)s " -"pokazaś" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija jo była wuspěšna! Gratulacija!" +"Wersijowe informacije za Django " +"%(version)s pokazaś" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Wiźiśo toś ten bok, dokulaž DEBUG=True jo w swójej dataji nastajenjow a njejsćo konfigurěrował " -"URL." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True jo w swójej dataji nastajenjow a njejsćo " +"konfigurěrował URL." msgid "Django Documentation" msgstr "Dokumentacija Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temy, reference a rozpokazanja" msgid "Tutorial: A Polling App" msgstr "Rozpokazanje: Napšašowańske nałoženje" diff --git a/django/conf/locale/el/LC_MESSAGES/django.mo b/django/conf/locale/el/LC_MESSAGES/django.mo index 30fd8296119e..1b07550997aa 100644 Binary files a/django/conf/locale/el/LC_MESSAGES/django.mo and b/django/conf/locale/el/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/el/LC_MESSAGES/django.po b/django/conf/locale/el/LC_MESSAGES/django.po index 79d592aacecb..003a36cc09b2 100644 --- a/django/conf/locale/el/LC_MESSAGES/django.po +++ b/django/conf/locale/el/LC_MESSAGES/django.po @@ -3,9 +3,10 @@ # Translators: # Apostolis Bessas , 2013 # Dimitris Glezos , 2011,2013,2017 +# Fotis Athineos , 2021 # Giannis Meletakis , 2015 # Jannis Leidel , 2011 -# Nick Mavrakis , 2017-2019 +# Nick Mavrakis , 2017-2020 # Nikolas Demiridis , 2014 # Nick Mavrakis , 2016 # Pãnoș , 2014 @@ -17,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-18 21:19+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,6 +34,9 @@ msgstr "Αφρικάνς" msgid "Arabic" msgstr "Αραβικά" +msgid "Algerian Arabic" +msgstr "Αραβικά Αλγερίας" + msgid "Asturian" msgstr "Αστούριας" @@ -156,6 +160,9 @@ msgstr "Ιντερλίνγκουα" msgid "Indonesian" msgstr "Ινδονησιακά" +msgid "Igbo" +msgstr "Ίγκμπο" + msgid "Ido" msgstr "Ίντο" @@ -186,6 +193,9 @@ msgstr "Κανάντα" msgid "Korean" msgstr "Κορεάτικα" +msgid "Kyrgyz" +msgstr "Κιργιζικά" + msgid "Luxembourgish" msgstr "Λουξεμβουργιανά" @@ -207,6 +217,9 @@ msgstr "Μογγολικά" msgid "Marathi" msgstr "Μαράθι" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Βιρμανικά" @@ -270,9 +283,15 @@ msgstr "Διάλεκτος Ταμίλ" msgid "Telugu" msgstr "Τελούγκου" +msgid "Tajik" +msgstr "Τατζικικά" + msgid "Thai" msgstr "Ταϊλάνδης" +msgid "Turkmen" +msgstr "Τουρκμενικά" + msgid "Turkish" msgstr "Τουρκικά" @@ -289,7 +308,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Ουζμπεκικά" msgid "Vietnamese" msgstr "Βιετναμέζικα" @@ -312,6 +331,11 @@ msgstr "Στατικά Αρχεία" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "Ο αριθμός αυτής της σελίδας δεν είναι ακέραιος" @@ -337,11 +361,15 @@ msgstr "Εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδ msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Εισάγετε ένα 'slug' που να αποτελείται από γράμματα, αριθμούς, παύλες ή κάτω " +"παύλες." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Εισάγετε ένα 'slug' που να αποτελείται από Unicode γράμματα, παύλες ή κάτω " +"παύλες." msgid "Enter a valid IPv4 address." msgstr "Εισάγετε μια έγκυρη IPv4 διεύθυνση." @@ -429,6 +457,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Η επέκταση '%(extension)s' του αρχείου δεν επιτρέπεται. Οι επιτρεπόμενες " +"επεκτάσεις είναι: '%(allowed_extensions)s'." msgid "Null characters are not allowed." msgstr "Δεν επιτρέπονται null (μηδενικοί) χαρακτήρες" @@ -469,11 +499,11 @@ msgstr "Πεδίο τύπου: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Η τιμή '%(value)s' πρέπει να είναι True ή False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Η τιμή '%(value)s' πρέπει να είναι True, False, ή None." msgid "Boolean (Either True or False)" msgstr "Boolean (Είτε Αληθές ή Ψευδές)" @@ -490,12 +520,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή ημερομηνίας. Η ημερομηνία " +"θα πρέπει να είναι στην μορφή YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Η τιμή '%(value)s' είναι στην σωστή μορφή (YYYY-MM-DD) αλλά είναι μια " +"λανθασμένη ημερομηνία." msgid "Date (without time)" msgstr "Ημερομηνία (χωρίς την ώρα)" @@ -505,19 +539,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Η τιμή του '%(value)s' έχει μια λανθασμένη μορφή. Η ημερομηνία/ώρα θα πρέπει " +"να είναι στην μορφή YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Η τιμή '%(value)s' έχει τη σωστή μορφή (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"αλλά δεν αντιστοιχεί σε σωστή ημερομηνία και ώρα." msgid "Date (with time)" msgstr "Ημερομηνία (με ώρα)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Η τιμή '%(value)s' πρέπει να είναι δεκαδικός αριθμός." msgid "Decimal number" msgstr "Δεκαδικός αριθμός" @@ -527,6 +565,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής [DD] " +"[[HH:]MM:]ss[.uuuuuu]." msgid "Duration" msgstr "Διάρκεια" @@ -539,14 +579,14 @@ msgstr "Τοποθεσία αρχείου" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Η '%(value)s' τιμή πρέπει να είναι δεκαδικός." msgid "Floating point number" msgstr "Αριθμός κινητής υποδιαστολής" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Η τιμή '%(value)s' πρέπει να είναι ακέραιος." msgid "Integer" msgstr "Ακέραιος" @@ -554,6 +594,9 @@ msgstr "Ακέραιος" msgid "Big (8 byte) integer" msgstr "Μεγάλος ακέραιος - big integer (8 bytes)" +msgid "Small integer" +msgstr "Μικρός ακέραιος" + msgid "IPv4 address" msgstr "Διεύθυνση IPv4" @@ -562,11 +605,14 @@ msgstr "IP διεύθυνση" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Η τιμή '%(value)s' πρέπει να είναι None, True ή False." msgid "Boolean (Either True, False or None)" msgstr "Boolean (Αληθές, Ψευδές, ή τίποτα)" +msgid "Positive big integer" +msgstr "Μεγάλος θετικός ακέραιος" + msgid "Positive integer" msgstr "Θετικός ακέραιος" @@ -577,9 +623,6 @@ msgstr "Θετικός μικρός ακέραιος" msgid "Slug (up to %(max_length)s)" msgstr "Slug (μέχρι %(max_length)s)" -msgid "Small integer" -msgstr "Μικρός ακέραιος" - msgid "Text" msgstr "Κείμενο" @@ -588,12 +631,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Η τιμή '%(value)s' έχει εσφαλμένη μορφή. Πρέπει να είναι της μορφής HH:MM[:" +"ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Η τιμή '%(value)s' έχει τη σωστή μορφή (HH:MM[:ss[.uuuuuu]]) αλλά δεν " +"αντιστοιχή σε σωστή ώρα." msgid "Time" msgstr "Ώρα" @@ -606,7 +653,7 @@ msgstr "Δυαδικά δεδομένα" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "'%(value)s' δεν είναι ένα έγκυρο UUID." msgid "Universally unique identifier" msgstr "Καθολικά μοναδικό αναγνωριστικό" @@ -617,6 +664,12 @@ msgstr "Αρχείο" msgid "Image" msgstr "Εικόνα" +msgid "A JSON object" +msgstr "Ένα αντικείμενο JSON" + +msgid "Value must be valid JSON." +msgstr "Η τιμή πρέπει να είναι έγκυρο JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -716,6 +769,9 @@ msgstr "Εισάγετε μια πλήρης τιμή" msgid "Enter a valid UUID." msgstr "Εισάγετε μια έγκυρη UUID." +msgid "Enter a valid JSON." +msgstr "Εισάγετε ένα έγκυρο JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -724,20 +780,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Κρυφό πεδίο %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Τα δεδομένα του ManagementForm λείπουν ή έχουν αλλοιωθεί" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Παρακαλώ υποβάλλετε %d ή λιγότερες φόρμες." -msgstr[1] "Παρακαλώ υποβάλλετε %d ή λιγότερες φόρμες." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Παρακαλώ υποβάλλετε το πολύ %d φόρμα." +msgstr[1] "Παρακαλώ υποβάλλετε το πολύ %d φόρμες." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Παρακαλώ υποβάλλετε %d ή περισσότερες φόρμες." -msgstr[1] "Παρακαλώ υποβάλλετε %d ή περισσότερες φόρμες." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμα." +msgstr[1] "Παρακαλώ υποβάλλετε τουλάχιστον %d φόρμες." msgid "Order" msgstr "Ταξινόμηση" @@ -776,13 +835,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" δεν είναι έγκυρη τιμή." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"Η ημερομηνία %(datetime)s δεν μπόρεσε να μετατραπεί στην ζώνη ώρας " +"%(current_timezone)s. Ίσως να είναι ασαφής ή να μην υπάρχει." msgid "Clear" msgstr "Εκκαθάριση" @@ -802,15 +863,7 @@ msgstr "Ναι" msgid "No" msgstr "Όχι" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ναι,όχι,ίσως" @@ -1084,43 +1137,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d χρόνος" -msgstr[1] "%d χρόνια" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d μήνας" -msgstr[1] "%d μήνες" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d βδομάδα" -msgstr[1] "%d βδομάδες" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d μέρα" -msgstr[1] "%d μέρες" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ώρα" -msgstr[1] "%d ώρες" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d λεπτό" -msgstr[1] "%d λεπτά" - -msgid "0 minutes" -msgstr "0 λεπτά" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" msgstr "Απαγορευμένο" @@ -1130,7 +1180,7 @@ msgstr "Η πιστοποίηση CSRF απέτυχε. Το αίτημα ματ msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1140,6 +1190,9 @@ msgid "" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Αν οι 'Referer' headers είναι απενεργοποιημένοι στον browser σας από εσάς, " +"παρακαλούμε να τους ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για " +"τις συνδέσεις HTTPS ή για τα 'same-origin' requests." msgid "" "If you are using the tag or " @@ -1148,6 +1201,12 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Αν χρησιμοποιείτε την ετικέτα ή συμπεριλαμβάνετε την κεφαλίδα (header) 'Referrer-Policy: no-referrer', " +"παρακαλούμε αφαιρέστε τα. Η προστασία CSRF απαιτεί την κεφαλίδα 'Referer' να " +"κάνει αυστηρό έλεγχο στον referer. Αν κύριο μέλημα σας είναι η ιδιωτικότητα, " +"σκεφτείτε να χρησιμοποιήσετε εναλλακτικές μεθόδους όπως για συνδέσμους από άλλες ιστοσελίδες." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1162,6 +1221,9 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Αν τα cookies είναι απενεργοποιημένα στον browser σας από εσάς, παρακαλούμε " +"να τα ξανά-ενεργοποιήσετε, τουλάχιστον για αυτό το site ή για τα 'same-" +"origin' requests." msgid "More information is available with DEBUG=True." msgstr "Περισσότερες πληροφορίες είναι διαθέσιμες με DEBUG=True." @@ -1196,6 +1258,8 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Λανθασμένη μορφή ημερομηνίας '%(datestr)s' για την επιλεγμένη μορφή " +"'%(format)s'" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1203,6 +1267,8 @@ msgstr "Δεν βρέθηκαν %(verbose_name)s που να ικανοποιο msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Η σελίδα δεν έχει την τιμή 'last' υποδηλώνοντας την τελευταία σελίδα, ούτε " +"μπορεί να μετατραπεί σε ακέραιο." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1210,21 +1276,21 @@ msgstr "Άκυρη σελίδα (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Άδεια λίστα και το \"%(class_name)s.allow_empty\" είναι False." msgid "Directory indexes are not allowed here." msgstr "Τα ευρετήρια καταλόγων δεν επιτρέπονται εδώ." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "Το \"%(path)s\" δεν υπάρχει" #, python-format msgid "Index of %(directory)s" msgstr "Ευρετήριο του %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: το Web framework για τελειομανείς με προθεσμίες." +msgid "The install worked successfully! Congratulations!" +msgstr "Η εγκατάσταση δούλεψε με επιτυχία! Συγχαρητήρια!" #, python-format msgid "" @@ -1235,9 +1301,6 @@ msgstr "" "\" target=\"_blank\" rel=\"noopener\">σημειώσεις κυκλοφορίας για το " "Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Η εγκατάσταση δούλεψε με επιτυχία! Συγχαρητήρια!" - #, python-format msgid "" "You are seeing this page because \n" @@ -59,342 +59,362 @@ msgid "Catalan" msgstr "" #: conf/global_settings.py:63 -msgid "Czech" +msgid "Central Kurdish (Sorani)" msgstr "" #: conf/global_settings.py:64 -msgid "Welsh" +msgid "Czech" msgstr "" #: conf/global_settings.py:65 -msgid "Danish" +msgid "Welsh" msgstr "" #: conf/global_settings.py:66 -msgid "German" +msgid "Danish" msgstr "" #: conf/global_settings.py:67 -msgid "Lower Sorbian" +msgid "German" msgstr "" #: conf/global_settings.py:68 -msgid "Greek" +msgid "Lower Sorbian" msgstr "" #: conf/global_settings.py:69 -msgid "English" +msgid "Greek" msgstr "" #: conf/global_settings.py:70 -msgid "Australian English" +msgid "English" msgstr "" #: conf/global_settings.py:71 -msgid "British English" +msgid "Australian English" msgstr "" #: conf/global_settings.py:72 -msgid "Esperanto" +msgid "British English" msgstr "" #: conf/global_settings.py:73 -msgid "Spanish" +msgid "Esperanto" msgstr "" #: conf/global_settings.py:74 -msgid "Argentinian Spanish" +msgid "Spanish" msgstr "" #: conf/global_settings.py:75 -msgid "Colombian Spanish" +msgid "Argentinian Spanish" msgstr "" #: conf/global_settings.py:76 -msgid "Mexican Spanish" +msgid "Colombian Spanish" msgstr "" #: conf/global_settings.py:77 -msgid "Nicaraguan Spanish" +msgid "Mexican Spanish" msgstr "" #: conf/global_settings.py:78 -msgid "Venezuelan Spanish" +msgid "Nicaraguan Spanish" msgstr "" #: conf/global_settings.py:79 -msgid "Estonian" +msgid "Venezuelan Spanish" msgstr "" #: conf/global_settings.py:80 -msgid "Basque" +msgid "Estonian" msgstr "" #: conf/global_settings.py:81 -msgid "Persian" +msgid "Basque" msgstr "" #: conf/global_settings.py:82 -msgid "Finnish" +msgid "Persian" msgstr "" #: conf/global_settings.py:83 -msgid "French" +msgid "Finnish" msgstr "" #: conf/global_settings.py:84 -msgid "Frisian" +msgid "French" msgstr "" #: conf/global_settings.py:85 -msgid "Irish" +msgid "Frisian" msgstr "" #: conf/global_settings.py:86 -msgid "Scottish Gaelic" +msgid "Irish" msgstr "" #: conf/global_settings.py:87 -msgid "Galician" +msgid "Scottish Gaelic" msgstr "" #: conf/global_settings.py:88 -msgid "Hebrew" +msgid "Galician" msgstr "" #: conf/global_settings.py:89 -msgid "Hindi" +msgid "Hebrew" msgstr "" #: conf/global_settings.py:90 -msgid "Croatian" +msgid "Hindi" msgstr "" #: conf/global_settings.py:91 -msgid "Upper Sorbian" +msgid "Croatian" msgstr "" #: conf/global_settings.py:92 -msgid "Hungarian" +msgid "Upper Sorbian" msgstr "" #: conf/global_settings.py:93 -msgid "Armenian" +msgid "Hungarian" msgstr "" #: conf/global_settings.py:94 -msgid "Interlingua" +msgid "Armenian" msgstr "" #: conf/global_settings.py:95 -msgid "Indonesian" +msgid "Interlingua" msgstr "" #: conf/global_settings.py:96 -msgid "Ido" +msgid "Indonesian" msgstr "" #: conf/global_settings.py:97 -msgid "Icelandic" +msgid "Igbo" msgstr "" #: conf/global_settings.py:98 -msgid "Italian" +msgid "Ido" msgstr "" #: conf/global_settings.py:99 -msgid "Japanese" +msgid "Icelandic" msgstr "" #: conf/global_settings.py:100 -msgid "Georgian" +msgid "Italian" msgstr "" #: conf/global_settings.py:101 -msgid "Kabyle" +msgid "Japanese" msgstr "" #: conf/global_settings.py:102 -msgid "Kazakh" +msgid "Georgian" msgstr "" #: conf/global_settings.py:103 -msgid "Khmer" +msgid "Kabyle" msgstr "" #: conf/global_settings.py:104 -msgid "Kannada" +msgid "Kazakh" msgstr "" #: conf/global_settings.py:105 -msgid "Korean" +msgid "Khmer" msgstr "" #: conf/global_settings.py:106 +msgid "Kannada" +msgstr "" + +#: conf/global_settings.py:107 +msgid "Korean" +msgstr "" + +#: conf/global_settings.py:108 msgid "Kyrgyz" msgstr "" -#: conf/global_settings.py:106 +#: conf/global_settings.py:109 msgid "Luxembourgish" msgstr "" -#: conf/global_settings.py:107 +#: conf/global_settings.py:110 msgid "Lithuanian" msgstr "" -#: conf/global_settings.py:108 +#: conf/global_settings.py:111 msgid "Latvian" msgstr "" -#: conf/global_settings.py:109 +#: conf/global_settings.py:112 msgid "Macedonian" msgstr "" -#: conf/global_settings.py:110 +#: conf/global_settings.py:113 msgid "Malayalam" msgstr "" -#: conf/global_settings.py:111 +#: conf/global_settings.py:114 msgid "Mongolian" msgstr "" -#: conf/global_settings.py:112 +#: conf/global_settings.py:115 msgid "Marathi" msgstr "" -#: conf/global_settings.py:113 +#: conf/global_settings.py:116 +msgid "Malay" +msgstr "" + +#: conf/global_settings.py:117 msgid "Burmese" msgstr "" -#: conf/global_settings.py:114 +#: conf/global_settings.py:118 msgid "Norwegian Bokmål" msgstr "" -#: conf/global_settings.py:115 +#: conf/global_settings.py:119 msgid "Nepali" msgstr "" -#: conf/global_settings.py:116 +#: conf/global_settings.py:120 msgid "Dutch" msgstr "" -#: conf/global_settings.py:117 +#: conf/global_settings.py:121 msgid "Norwegian Nynorsk" msgstr "" -#: conf/global_settings.py:118 +#: conf/global_settings.py:122 msgid "Ossetic" msgstr "" -#: conf/global_settings.py:119 +#: conf/global_settings.py:123 msgid "Punjabi" msgstr "" -#: conf/global_settings.py:120 +#: conf/global_settings.py:124 msgid "Polish" msgstr "" -#: conf/global_settings.py:121 +#: conf/global_settings.py:125 msgid "Portuguese" msgstr "" -#: conf/global_settings.py:122 +#: conf/global_settings.py:126 msgid "Brazilian Portuguese" msgstr "" -#: conf/global_settings.py:123 +#: conf/global_settings.py:127 msgid "Romanian" msgstr "" -#: conf/global_settings.py:124 +#: conf/global_settings.py:128 msgid "Russian" msgstr "" -#: conf/global_settings.py:125 +#: conf/global_settings.py:129 msgid "Slovak" msgstr "" -#: conf/global_settings.py:126 +#: conf/global_settings.py:130 msgid "Slovenian" msgstr "" -#: conf/global_settings.py:127 +#: conf/global_settings.py:131 msgid "Albanian" msgstr "" -#: conf/global_settings.py:128 +#: conf/global_settings.py:132 msgid "Serbian" msgstr "" -#: conf/global_settings.py:129 +#: conf/global_settings.py:133 msgid "Serbian Latin" msgstr "" -#: conf/global_settings.py:130 +#: conf/global_settings.py:134 msgid "Swedish" msgstr "" -#: conf/global_settings.py:131 +#: conf/global_settings.py:135 msgid "Swahili" msgstr "" -#: conf/global_settings.py:132 +#: conf/global_settings.py:136 msgid "Tamil" msgstr "" -#: conf/global_settings.py:133 +#: conf/global_settings.py:137 msgid "Telugu" msgstr "" -#: conf/global_settings.py:133 +#: conf/global_settings.py:138 msgid "Tajik" msgstr "" -#: conf/global_settings.py:134 +#: conf/global_settings.py:139 msgid "Thai" msgstr "" -#: conf/global_settings.py:135 +#: conf/global_settings.py:140 +msgid "Turkmen" +msgstr "" + +#: conf/global_settings.py:141 msgid "Turkish" msgstr "" -#: conf/global_settings.py:136 +#: conf/global_settings.py:142 msgid "Tatar" msgstr "" -#: conf/global_settings.py:137 +#: conf/global_settings.py:143 msgid "Udmurt" msgstr "" -#: conf/global_settings.py:138 +#: conf/global_settings.py:144 +msgid "Uyghur" +msgstr "" + +#: conf/global_settings.py:145 msgid "Ukrainian" msgstr "" -#: conf/global_settings.py:139 +#: conf/global_settings.py:146 msgid "Urdu" msgstr "" -#: conf/global_settings.py:140 +#: conf/global_settings.py:147 msgid "Uzbek" msgstr "" -#: conf/global_settings.py:141 +#: conf/global_settings.py:148 msgid "Vietnamese" msgstr "" -#: conf/global_settings.py:142 +#: conf/global_settings.py:149 msgid "Simplified Chinese" msgstr "" -#: conf/global_settings.py:143 +#: conf/global_settings.py:150 msgid "Traditional Chinese" msgstr "" -#: contrib/messages/apps.py:7 +#: contrib/messages/apps.py:15 msgid "Messages" msgstr "" -#: contrib/sitemaps/apps.py:7 +#: contrib/sitemaps/apps.py:8 msgid "Site Maps" msgstr "" @@ -406,78 +426,106 @@ msgstr "" msgid "Syndication" msgstr "" -#: core/paginator.py:48 +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +#: core/paginator.py:30 +msgid "…" +msgstr "" + +#: core/paginator.py:32 msgid "That page number is not an integer" msgstr "" -#: core/paginator.py:50 +#: core/paginator.py:33 msgid "That page number is less than 1" msgstr "" -#: core/paginator.py:55 +#: core/paginator.py:34 msgid "That page contains no results" msgstr "" -#: core/validators.py:20 +#: core/validators.py:22 msgid "Enter a valid value." msgstr "" -#: core/validators.py:91 forms/fields.py:671 +#: core/validators.py:70 +msgid "Enter a valid domain name." +msgstr "" + +#: core/validators.py:104 forms/fields.py:759 msgid "Enter a valid URL." msgstr "" -#: core/validators.py:145 +#: core/validators.py:165 msgid "Enter a valid integer." msgstr "" -#: core/validators.py:156 +#: core/validators.py:176 msgid "Enter a valid email address." msgstr "" #. Translators: "letters" means latin letters: a-z and A-Z. -#: core/validators.py:230 +#: core/validators.py:259 msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -#: core/validators.py:237 +#: core/validators.py:267 msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" -#: core/validators.py:246 core/validators.py:266 -msgid "Enter a valid IPv4 address." +#: core/validators.py:327 core/validators.py:336 core/validators.py:350 +#: db/models/fields/__init__.py:2219 +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "" + +#: core/validators.py:329 +msgid "IPv4" msgstr "" -#: core/validators.py:251 core/validators.py:267 -msgid "Enter a valid IPv6 address." +#: core/validators.py:338 utils/ipv6.py:30 +msgid "IPv6" msgstr "" -#: core/validators.py:261 core/validators.py:265 -msgid "Enter a valid IPv4 or IPv6 address." +#: core/validators.py:352 +msgid "IPv4 or IPv6" msgstr "" -#: core/validators.py:295 +#: core/validators.py:341 msgid "Enter only digits separated by commas." msgstr "" -#: core/validators.py:301 +#: core/validators.py:347 #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "" -#: core/validators.py:334 +#: core/validators.py:382 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "" -#: core/validators.py:343 +#: core/validators.py:391 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" -#: core/validators.py:353 +#: core/validators.py:400 +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#: core/validators.py:407 +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + +#: core/validators.py:439 #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -488,7 +536,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: core/validators.py:368 +#: core/validators.py:457 #, python-format msgid "" "Ensure this value has at most %(limit_value)d character (it has " @@ -499,25 +547,25 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: core/validators.py:387 forms/fields.py:292 forms/fields.py:327 +#: core/validators.py:480 forms/fields.py:354 forms/fields.py:393 msgid "Enter a number." msgstr "" -#: core/validators.py:389 +#: core/validators.py:482 #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "" msgstr[1] "" -#: core/validators.py:394 +#: core/validators.py:487 #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "" msgstr[1] "" -#: core/validators.py:399 +#: core/validators.py:492 #, python-format msgid "" "Ensure that there are no more than %(max)s digit before the decimal point." @@ -526,334 +574,343 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: core/validators.py:461 +#: core/validators.py:563 #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" -#: core/validators.py:513 +#: core/validators.py:624 msgid "Null characters are not allowed." msgstr "" -#: db/models/base.py:1187 forms/models.py:760 +#: db/models/base.py:1465 forms/models.py:902 msgid "and" msgstr "" -#: db/models/base.py:1189 +#: db/models/base.py:1467 #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "" -#: db/models/fields/__init__.py:100 +#: db/models/constraints.py:20 +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + +#: db/models/fields/__init__.py:128 #, python-format msgid "Value %(value)r is not a valid choice." msgstr "" -#: db/models/fields/__init__.py:101 +#: db/models/fields/__init__.py:129 msgid "This field cannot be null." msgstr "" -#: db/models/fields/__init__.py:102 +#: db/models/fields/__init__.py:130 msgid "This field cannot be blank." msgstr "" -#: db/models/fields/__init__.py:103 +#: db/models/fields/__init__.py:131 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "" -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" -#: db/models/fields/__init__.py:107 +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#: db/models/fields/__init__.py:135 #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" -#: db/models/fields/__init__.py:126 +#: db/models/fields/__init__.py:174 #, python-format msgid "Field of type: %(field_type)s" msgstr "" -#: db/models/fields/__init__.py:939 +#: db/models/fields/__init__.py:1157 #, python-format msgid "“%(value)s” value must be either True or False." msgstr "" -#: db/models/fields/__init__.py:940 +#: db/models/fields/__init__.py:1158 #, python-format msgid "“%(value)s” value must be either True, False, or None." msgstr "" -#: db/models/fields/__init__.py:942 +#: db/models/fields/__init__.py:1160 msgid "Boolean (Either True or False)" msgstr "" -#: db/models/fields/__init__.py:983 +#: db/models/fields/__init__.py:1210 #, python-format msgid "String (up to %(max_length)s)" msgstr "" -#: db/models/fields/__init__.py:1047 +#: db/models/fields/__init__.py:1212 +msgid "String (unlimited)" +msgstr "" + +#: db/models/fields/__init__.py:1316 msgid "Comma-separated integers" msgstr "" -#: db/models/fields/__init__.py:1096 +#: db/models/fields/__init__.py:1417 #, python-format msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" -#: db/models/fields/__init__.py:1098 db/models/fields/__init__.py:1241 +#: db/models/fields/__init__.py:1421 db/models/fields/__init__.py:1556 #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" -#: db/models/fields/__init__.py:1101 +#: db/models/fields/__init__.py:1425 msgid "Date (without time)" msgstr "" -#: db/models/fields/__init__.py:1239 +#: db/models/fields/__init__.py:1552 #, python-format msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" -#: db/models/fields/__init__.py:1243 +#: db/models/fields/__init__.py:1560 #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" -#: db/models/fields/__init__.py:1247 +#: db/models/fields/__init__.py:1565 msgid "Date (with time)" msgstr "" -#: db/models/fields/__init__.py:1395 +#: db/models/fields/__init__.py:1689 #, python-format msgid "“%(value)s” value must be a decimal number." msgstr "" -#: db/models/fields/__init__.py:1397 +#: db/models/fields/__init__.py:1691 msgid "Decimal number" msgstr "" -#: db/models/fields/__init__.py:1536 +#: db/models/fields/__init__.py:1852 #, python-format msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" -#: db/models/fields/__init__.py:1539 +#: db/models/fields/__init__.py:1856 msgid "Duration" msgstr "" -#: db/models/fields/__init__.py:1589 +#: db/models/fields/__init__.py:1908 msgid "Email address" msgstr "" -#: db/models/fields/__init__.py:1612 +#: db/models/fields/__init__.py:1933 msgid "File path" msgstr "" -#: db/models/fields/__init__.py:1678 +#: db/models/fields/__init__.py:2011 #, python-format msgid "“%(value)s” value must be a float." msgstr "" -#: db/models/fields/__init__.py:1680 +#: db/models/fields/__init__.py:2013 msgid "Floating point number" msgstr "" -#: db/models/fields/__init__.py:1718 +#: db/models/fields/__init__.py:2053 #, python-format msgid "“%(value)s” value must be an integer." msgstr "" -#: db/models/fields/__init__.py:1720 +#: db/models/fields/__init__.py:2055 msgid "Integer" msgstr "" -#: db/models/fields/__init__.py:1803 +#: db/models/fields/__init__.py:2151 msgid "Big (8 byte) integer" msgstr "" -#: db/models/fields/__init__.py:1819 +#: db/models/fields/__init__.py:2168 +msgid "Small integer" +msgstr "" + +#: db/models/fields/__init__.py:2176 msgid "IPv4 address" msgstr "" -#: db/models/fields/__init__.py:1850 +#: db/models/fields/__init__.py:2207 msgid "IP address" msgstr "" -#: db/models/fields/__init__.py:1930 db/models/fields/__init__.py:1931 +#: db/models/fields/__init__.py:2300 db/models/fields/__init__.py:2301 #, python-format msgid "“%(value)s” value must be either None, True or False." msgstr "" -#: db/models/fields/__init__.py:1933 +#: db/models/fields/__init__.py:2303 msgid "Boolean (Either True, False or None)" msgstr "" -#: db/models/fields/__init__.py:1976 +#: db/models/fields/__init__.py:2354 msgid "Positive big integer" msgstr "" -#: db/models/fields/__init__.py:1989 +#: db/models/fields/__init__.py:2369 msgid "Positive integer" msgstr "" -#: db/models/fields/__init__.py:2002 +#: db/models/fields/__init__.py:2384 msgid "Positive small integer" msgstr "" -#: db/models/fields/__init__.py:2016 +#: db/models/fields/__init__.py:2400 #, python-format msgid "Slug (up to %(max_length)s)" msgstr "" -#: db/models/fields/__init__.py:2048 -msgid "Small integer" -msgstr "" - -#: db/models/fields/__init__.py:2055 +#: db/models/fields/__init__.py:2436 msgid "Text" msgstr "" -#: db/models/fields/__init__.py:2083 +#: db/models/fields/__init__.py:2511 #, python-format msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" -#: db/models/fields/__init__.py:2085 +#: db/models/fields/__init__.py:2515 #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" -#: db/models/fields/__init__.py:2088 +#: db/models/fields/__init__.py:2519 msgid "Time" msgstr "" -#: db/models/fields/__init__.py:2214 +#: db/models/fields/__init__.py:2627 msgid "URL" msgstr "" -#: db/models/fields/__init__.py:2236 +#: db/models/fields/__init__.py:2651 msgid "Raw binary data" msgstr "" -#: db/models/fields/__init__.py:2301 +#: db/models/fields/__init__.py:2716 #, python-format msgid "“%(value)s” is not a valid UUID." msgstr "" -#: db/models/fields/__init__.py:2303 +#: db/models/fields/__init__.py:2718 msgid "Universally unique identifier" msgstr "" -#: db/models/fields/files.py:231 +#: db/models/fields/files.py:232 msgid "File" msgstr "" -#: db/models/fields/files.py:377 +#: db/models/fields/files.py:393 msgid "Image" msgstr "" -#: db/models/fields/json.py:18 +#: db/models/fields/json.py:26 msgid "A JSON object" msgstr "" -#: db/models/fields/json.py:20 +#: db/models/fields/json.py:28 msgid "Value must be valid JSON." msgstr "" -#: db/models/fields/related.py:786 +#: db/models/fields/related.py:939 #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" -#: db/models/fields/related.py:788 +#: db/models/fields/related.py:941 msgid "Foreign Key (type determined by related field)" msgstr "" -#: db/models/fields/related.py:1041 +#: db/models/fields/related.py:1235 msgid "One-to-one relationship" msgstr "" -#: db/models/fields/related.py:1095 +#: db/models/fields/related.py:1292 #, python-format msgid "%(from)s-%(to)s relationship" msgstr "" -#: db/models/fields/related.py:1096 +#: db/models/fields/related.py:1294 #, python-format msgid "%(from)s-%(to)s relationships" msgstr "" -#: db/models/fields/related.py:1138 +#: db/models/fields/related.py:1342 msgid "Many-to-many relationship" msgstr "" #. Translators: If found as last label character, these punctuation #. characters will prevent the default label_suffix to be appended to the label -#: forms/boundfield.py:150 +#: forms/boundfield.py:185 msgid ":?.!" msgstr "" -#: forms/fields.py:54 +#: forms/fields.py:94 msgid "This field is required." msgstr "" -#: forms/fields.py:247 +#: forms/fields.py:303 msgid "Enter a whole number." msgstr "" -#: forms/fields.py:398 forms/fields.py:1139 +#: forms/fields.py:474 forms/fields.py:1246 msgid "Enter a valid date." msgstr "" -#: forms/fields.py:422 forms/fields.py:1140 +#: forms/fields.py:497 forms/fields.py:1247 msgid "Enter a valid time." msgstr "" -#: forms/fields.py:450 +#: forms/fields.py:524 msgid "Enter a valid date/time." msgstr "" -#: forms/fields.py:484 +#: forms/fields.py:558 msgid "Enter a valid duration." msgstr "" -#: forms/fields.py:485 +#: forms/fields.py:559 #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." msgstr "" -#: forms/fields.py:545 +#: forms/fields.py:628 msgid "No file was submitted. Check the encoding type on the form." msgstr "" -#: forms/fields.py:546 +#: forms/fields.py:629 msgid "No file was submitted." msgstr "" -#: forms/fields.py:547 +#: forms/fields.py:630 msgid "The submitted file is empty." msgstr "" -#: forms/fields.py:549 +#: forms/fields.py:632 #, python-format msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." msgid_plural "" @@ -861,467 +918,470 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: forms/fields.py:552 +#: forms/fields.py:637 msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" -#: forms/fields.py:613 +#: forms/fields.py:701 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -#: forms/fields.py:775 forms/fields.py:865 forms/models.py:1296 +#: forms/fields.py:868 forms/fields.py:954 forms/models.py:1581 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" -#: forms/fields.py:866 forms/fields.py:981 forms/models.py:1295 +#: forms/fields.py:956 forms/fields.py:1075 forms/models.py:1579 msgid "Enter a list of values." msgstr "" -#: forms/fields.py:982 +#: forms/fields.py:1076 msgid "Enter a complete value." msgstr "" -#: forms/fields.py:1198 +#: forms/fields.py:1315 msgid "Enter a valid UUID." msgstr "" -#: forms/fields.py:1228 +#: forms/fields.py:1345 msgid "Enter a valid JSON." msgstr "" #. Translators: This is the default suffix added to form field labels -#: forms/forms.py:78 +#: forms/forms.py:94 msgid ":" msgstr "" -#: forms/forms.py:205 +#: forms/forms.py:231 #, python-format msgid "(Hidden field %(name)s) %(error)s" msgstr "" -#: forms/formsets.py:93 -msgid "ManagementForm data is missing or has been tampered with" +#: forms/formsets.py:61 +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" -#: forms/formsets.py:345 +#: forms/formsets.py:65 #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." msgstr[0] "" msgstr[1] "" -#: forms/formsets.py:352 +#: forms/formsets.py:70 #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." msgstr[0] "" msgstr[1] "" -#: forms/formsets.py:379 forms/formsets.py:386 +#: forms/formsets.py:484 forms/formsets.py:491 msgid "Order" msgstr "" -#: forms/formsets.py:391 +#: forms/formsets.py:499 msgid "Delete" msgstr "" -#: forms/models.py:755 +#: forms/models.py:895 #, python-format msgid "Please correct the duplicate data for %(field)s." msgstr "" -#: forms/models.py:759 +#: forms/models.py:900 #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." msgstr "" -#: forms/models.py:765 +#: forms/models.py:907 #, python-format msgid "" "Please correct the duplicate data for %(field_name)s which must be unique " "for the %(lookup)s in %(date_field)s." msgstr "" -#: forms/models.py:774 +#: forms/models.py:916 msgid "Please correct the duplicate values below." msgstr "" -#: forms/models.py:1096 +#: forms/models.py:1353 msgid "The inline value did not match the parent instance." msgstr "" -#: forms/models.py:1180 +#: forms/models.py:1444 msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" -#: forms/models.py:1298 +#: forms/models.py:1583 #, python-format msgid "“%(pk)s” is not a valid value." msgstr "" -#: forms/utils.py:167 +#: forms/utils.py:227 #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" -#: forms/widgets.py:398 +#: forms/widgets.py:457 msgid "Clear" msgstr "" -#: forms/widgets.py:399 +#: forms/widgets.py:458 msgid "Currently" msgstr "" -#: forms/widgets.py:400 +#: forms/widgets.py:459 msgid "Change" msgstr "" -#: forms/widgets.py:709 +#: forms/widgets.py:796 msgid "Unknown" msgstr "" -#: forms/widgets.py:710 +#: forms/widgets.py:797 msgid "Yes" msgstr "" -#: forms/widgets.py:711 +#: forms/widgets.py:798 msgid "No" msgstr "" #. Translators: Please do not add spaces around commas. -#: template/defaultfilters.py:790 +#: template/defaultfilters.py:875 msgid "yes,no,maybe" msgstr "" -#: template/defaultfilters.py:819 template/defaultfilters.py:836 +#: template/defaultfilters.py:905 template/defaultfilters.py:922 #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "" msgstr[1] "" -#: template/defaultfilters.py:838 +#: template/defaultfilters.py:924 #, python-format msgid "%s KB" msgstr "" -#: template/defaultfilters.py:840 +#: template/defaultfilters.py:926 #, python-format msgid "%s MB" msgstr "" -#: template/defaultfilters.py:842 +#: template/defaultfilters.py:928 #, python-format msgid "%s GB" msgstr "" -#: template/defaultfilters.py:844 +#: template/defaultfilters.py:930 #, python-format msgid "%s TB" msgstr "" -#: template/defaultfilters.py:846 +#: template/defaultfilters.py:932 #, python-format msgid "%s PB" msgstr "" -#: utils/dateformat.py:65 +#: utils/dateformat.py:73 msgid "p.m." msgstr "" -#: utils/dateformat.py:66 +#: utils/dateformat.py:74 msgid "a.m." msgstr "" -#: utils/dateformat.py:71 +#: utils/dateformat.py:79 msgid "PM" msgstr "" -#: utils/dateformat.py:72 +#: utils/dateformat.py:80 msgid "AM" msgstr "" -#: utils/dateformat.py:149 +#: utils/dateformat.py:152 msgid "midnight" msgstr "" -#: utils/dateformat.py:151 +#: utils/dateformat.py:154 msgid "noon" msgstr "" -#: utils/dates.py:6 +#: utils/dates.py:7 msgid "Monday" msgstr "" -#: utils/dates.py:6 +#: utils/dates.py:8 msgid "Tuesday" msgstr "" -#: utils/dates.py:6 +#: utils/dates.py:9 msgid "Wednesday" msgstr "" -#: utils/dates.py:6 +#: utils/dates.py:10 msgid "Thursday" msgstr "" -#: utils/dates.py:6 +#: utils/dates.py:11 msgid "Friday" msgstr "" -#: utils/dates.py:7 +#: utils/dates.py:12 msgid "Saturday" msgstr "" -#: utils/dates.py:7 +#: utils/dates.py:13 msgid "Sunday" msgstr "" -#: utils/dates.py:10 +#: utils/dates.py:16 msgid "Mon" msgstr "" -#: utils/dates.py:10 +#: utils/dates.py:17 msgid "Tue" msgstr "" -#: utils/dates.py:10 +#: utils/dates.py:18 msgid "Wed" msgstr "" -#: utils/dates.py:10 +#: utils/dates.py:19 msgid "Thu" msgstr "" -#: utils/dates.py:10 +#: utils/dates.py:20 msgid "Fri" msgstr "" -#: utils/dates.py:11 +#: utils/dates.py:21 msgid "Sat" msgstr "" -#: utils/dates.py:11 +#: utils/dates.py:22 msgid "Sun" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:25 msgid "January" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:26 msgid "February" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:27 msgid "March" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:28 msgid "April" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:29 msgid "May" msgstr "" -#: utils/dates.py:14 +#: utils/dates.py:30 msgid "June" msgstr "" -#: utils/dates.py:15 +#: utils/dates.py:31 msgid "July" msgstr "" -#: utils/dates.py:15 +#: utils/dates.py:32 msgid "August" msgstr "" -#: utils/dates.py:15 +#: utils/dates.py:33 msgid "September" msgstr "" -#: utils/dates.py:15 +#: utils/dates.py:34 msgid "October" msgstr "" -#: utils/dates.py:15 +#: utils/dates.py:35 msgid "November" msgstr "" -#: utils/dates.py:16 +#: utils/dates.py:36 msgid "December" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:39 msgid "jan" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:40 msgid "feb" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:41 msgid "mar" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:42 msgid "apr" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:43 msgid "may" msgstr "" -#: utils/dates.py:19 +#: utils/dates.py:44 msgid "jun" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:45 msgid "jul" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:46 msgid "aug" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:47 msgid "sep" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:48 msgid "oct" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:49 msgid "nov" msgstr "" -#: utils/dates.py:20 +#: utils/dates.py:50 msgid "dec" msgstr "" -#: utils/dates.py:23 +#: utils/dates.py:53 msgctxt "abbrev. month" msgid "Jan." msgstr "" -#: utils/dates.py:24 +#: utils/dates.py:54 msgctxt "abbrev. month" msgid "Feb." msgstr "" -#: utils/dates.py:25 +#: utils/dates.py:55 msgctxt "abbrev. month" msgid "March" msgstr "" -#: utils/dates.py:26 +#: utils/dates.py:56 msgctxt "abbrev. month" msgid "April" msgstr "" -#: utils/dates.py:27 +#: utils/dates.py:57 msgctxt "abbrev. month" msgid "May" msgstr "" -#: utils/dates.py:28 +#: utils/dates.py:58 msgctxt "abbrev. month" msgid "June" msgstr "" -#: utils/dates.py:29 +#: utils/dates.py:59 msgctxt "abbrev. month" msgid "July" msgstr "" -#: utils/dates.py:30 +#: utils/dates.py:60 msgctxt "abbrev. month" msgid "Aug." msgstr "" -#: utils/dates.py:31 +#: utils/dates.py:61 msgctxt "abbrev. month" msgid "Sept." msgstr "" -#: utils/dates.py:32 +#: utils/dates.py:62 msgctxt "abbrev. month" msgid "Oct." msgstr "" -#: utils/dates.py:33 +#: utils/dates.py:63 msgctxt "abbrev. month" msgid "Nov." msgstr "" -#: utils/dates.py:34 +#: utils/dates.py:64 msgctxt "abbrev. month" msgid "Dec." msgstr "" -#: utils/dates.py:37 +#: utils/dates.py:67 msgctxt "alt. month" msgid "January" msgstr "" -#: utils/dates.py:38 +#: utils/dates.py:68 msgctxt "alt. month" msgid "February" msgstr "" -#: utils/dates.py:39 +#: utils/dates.py:69 msgctxt "alt. month" msgid "March" msgstr "" -#: utils/dates.py:40 +#: utils/dates.py:70 msgctxt "alt. month" msgid "April" msgstr "" -#: utils/dates.py:41 +#: utils/dates.py:71 msgctxt "alt. month" msgid "May" msgstr "" -#: utils/dates.py:42 +#: utils/dates.py:72 msgctxt "alt. month" msgid "June" msgstr "" -#: utils/dates.py:43 +#: utils/dates.py:73 msgctxt "alt. month" msgid "July" msgstr "" -#: utils/dates.py:44 +#: utils/dates.py:74 msgctxt "alt. month" msgid "August" msgstr "" -#: utils/dates.py:45 +#: utils/dates.py:75 msgctxt "alt. month" msgid "September" msgstr "" -#: utils/dates.py:46 +#: utils/dates.py:76 msgctxt "alt. month" msgid "October" msgstr "" -#: utils/dates.py:47 +#: utils/dates.py:77 msgctxt "alt. month" msgid "November" msgstr "" -#: utils/dates.py:48 +#: utils/dates.py:78 msgctxt "alt. month" msgid "December" msgstr "" @@ -1336,221 +1396,219 @@ msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" msgstr "" -#: utils/text.py:236 +#: utils/text.py:255 msgid "or" msgstr "" #. Translators: This string is used as a separator between list elements -#: utils/text.py:255 utils/timesince.py:83 +#: utils/text.py:274 utils/timesince.py:135 msgid ", " msgstr "" +#: utils/timesince.py:8 +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" + #: utils/timesince.py:9 #, python-format -msgid "%d year" -msgid_plural "%d years" +msgid "%(num)d month" +msgid_plural "%(num)d months" msgstr[0] "" msgstr[1] "" #: utils/timesince.py:10 #, python-format -msgid "%d month" -msgid_plural "%d months" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" msgstr[0] "" msgstr[1] "" #: utils/timesince.py:11 #, python-format -msgid "%d week" -msgid_plural "%d weeks" +msgid "%(num)d day" +msgid_plural "%(num)d days" msgstr[0] "" msgstr[1] "" #: utils/timesince.py:12 #, python-format -msgid "%d day" -msgid_plural "%d days" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" msgstr[0] "" msgstr[1] "" #: utils/timesince.py:13 #, python-format -msgid "%d hour" -msgid_plural "%d hours" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" msgstr[0] "" msgstr[1] "" -#: utils/timesince.py:14 -#, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -#: views/csrf.py:110 +#: views/csrf.py:29 msgid "Forbidden" msgstr "" -#: views/csrf.py:111 +#: views/csrf.py:30 msgid "CSRF verification failed. Request aborted." msgstr "" -#: views/csrf.py:115 +#: views/csrf.py:34 msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -#: views/csrf.py:120 +#: views/csrf.py:40 msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" -#: views/csrf.py:124 +#: views/csrf.py:45 msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" -#: views/csrf.py:132 +#: views/csrf.py:54 msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" -#: views/csrf.py:137 +#: views/csrf.py:60 msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" -#: views/csrf.py:142 +#: views/csrf.py:66 msgid "More information is available with DEBUG=True." msgstr "" -#: views/generic/dates.py:41 +#: views/generic/dates.py:44 msgid "No year specified" msgstr "" -#: views/generic/dates.py:61 views/generic/dates.py:111 -#: views/generic/dates.py:208 +#: views/generic/dates.py:64 views/generic/dates.py:115 +#: views/generic/dates.py:214 msgid "Date out of range" msgstr "" -#: views/generic/dates.py:90 +#: views/generic/dates.py:94 msgid "No month specified" msgstr "" -#: views/generic/dates.py:142 +#: views/generic/dates.py:147 msgid "No day specified" msgstr "" -#: views/generic/dates.py:188 +#: views/generic/dates.py:194 msgid "No week specified" msgstr "" -#: views/generic/dates.py:338 views/generic/dates.py:367 +#: views/generic/dates.py:349 views/generic/dates.py:380 #, python-format msgid "No %(verbose_name_plural)s available" msgstr "" -#: views/generic/dates.py:589 +#: views/generic/dates.py:652 #, python-format msgid "" "Future %(verbose_name_plural)s not available because %(class_name)s." "allow_future is False." msgstr "" -#: views/generic/dates.py:623 +#: views/generic/dates.py:692 #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" -#: views/generic/detail.py:54 +#: views/generic/detail.py:56 #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "" -#: views/generic/list.py:67 +#: views/generic/list.py:70 msgid "Page is not “last”, nor can it be converted to an int." msgstr "" -#: views/generic/list.py:72 +#: views/generic/list.py:77 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" msgstr "" -#: views/generic/list.py:154 +#: views/generic/list.py:169 #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" -#: views/static.py:40 +#: views/static.py:48 msgid "Directory indexes are not allowed here." msgstr "" -#: views/static.py:42 +#: views/static.py:50 #, python-format msgid "“%(path)s” does not exist" msgstr "" -#: views/static.py:80 +#: views/static.py:67 views/templates/directory_index.html:8 +#: views/templates/directory_index.html:11 #, python-format msgid "Index of %(directory)s" msgstr "" #: views/templates/default_urlconf.html:7 -msgid "Django: the Web framework for perfectionists with deadlines." +#: views/templates/default_urlconf.html:220 +msgid "The install worked successfully! Congratulations!" msgstr "" -#: views/templates/default_urlconf.html:346 +#: views/templates/default_urlconf.html:206 #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -#: views/templates/default_urlconf.html:368 -msgid "The install worked successfully! Congratulations!" -msgstr "" - -#: views/templates/default_urlconf.html:369 +#: views/templates/default_urlconf.html:221 #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -#: views/templates/default_urlconf.html:384 +#: views/templates/default_urlconf.html:229 msgid "Django Documentation" msgstr "" -#: views/templates/default_urlconf.html:385 +#: views/templates/default_urlconf.html:230 msgid "Topics, references, & how-to’s" msgstr "" -#: views/templates/default_urlconf.html:396 +#: views/templates/default_urlconf.html:238 msgid "Tutorial: A Polling App" msgstr "" -#: views/templates/default_urlconf.html:397 +#: views/templates/default_urlconf.html:239 msgid "Get started with Django" msgstr "" -#: views/templates/default_urlconf.html:408 +#: views/templates/default_urlconf.html:247 msgid "Django Community" msgstr "" -#: views/templates/default_urlconf.html:409 +#: views/templates/default_urlconf.html:248 msgid "Connect, get help, or contribute" msgstr "" diff --git a/django/conf/locale/en/formats.py b/django/conf/locale/en/formats.py index ccace3d2b364..f9d143b7170f 100644 --- a/django/conf/locale/en/formats.py +++ b/django/conf/locale/en/formats.py @@ -2,36 +2,64 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'N j, Y' -TIME_FORMAT = 'P' -DATETIME_FORMAT = 'N j, Y, P' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'F j' -SHORT_DATE_FORMAT = 'm/d/Y' -SHORT_DATETIME_FORMAT = 'm/d/Y P' -FIRST_DAY_OF_WEEK = 0 # Sunday +# Formatting for date objects. +DATE_FORMAT = "N j, Y" +# Formatting for time objects. +TIME_FORMAT = "P" +# Formatting for datetime objects. +DATETIME_FORMAT = "N j, Y, P" +# Formatting for date objects when only the year and month are relevant. +YEAR_MONTH_FORMAT = "F Y" +# Formatting for date objects when only the month and day are relevant. +MONTH_DAY_FORMAT = "F j" +# Short formatting for date objects. +SHORT_DATE_FORMAT = "m/d/Y" +# Short formatting for datetime objects. +SHORT_DATETIME_FORMAT = "m/d/Y P" +# First day of week, to be used on calendars. +# 0 means Sunday, 1 means Monday... +FIRST_DAY_OF_WEEK = 0 + +# Formats to be used when parsing dates from input boxes, in order. # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +# Note that these format strings are different from the ones to display dates. # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' - # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' + "%b %d %Y", # 'Oct 25 2006' + "%b %d, %Y", # 'Oct 25, 2006' + "%d %b %Y", # '25 Oct 2006' + "%d %b, %Y", # '25 Oct, 2006' + "%B %d %Y", # 'October 25 2006' + "%B %d, %Y", # 'October 25, 2006' + "%d %B %Y", # '25 October 2006' + "%d %B, %Y", # '25 October, 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' - '%m/%d/%y %H:%M', # '10/25/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' +] +TIME_INPUT_FORMATS = [ + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' + +# Decimal separator symbol. +DECIMAL_SEPARATOR = "." +# Thousand separator symbol. +THOUSAND_SEPARATOR = "," +# Number of digits that will be together, when splitting them by +# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands. NUMBER_GROUPING = 3 diff --git a/django/conf/locale/en_AU/LC_MESSAGES/django.mo b/django/conf/locale/en_AU/LC_MESSAGES/django.mo index 28504477624f..d31b977ad462 100644 Binary files a/django/conf/locale/en_AU/LC_MESSAGES/django.mo and b/django/conf/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/en_AU/LC_MESSAGES/django.po b/django/conf/locale/en_AU/LC_MESSAGES/django.po index a7e39e63219e..a0a3ed8ce4c3 100644 --- a/django/conf/locale/en_AU/LC_MESSAGES/django.po +++ b/django/conf/locale/en_AU/LC_MESSAGES/django.po @@ -2,13 +2,14 @@ # # Translators: # Tom Fifield , 2014 +# Tom Fifield , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-18 21:19+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: English (Australia) (http://www.transifex.com/django/django/" "language/en_AU/)\n" "MIME-Version: 1.0\n" @@ -23,8 +24,11 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabic" +msgid "Algerian Arabic" +msgstr "Algerian Arabic" + msgid "Asturian" -msgstr "" +msgstr "Asturian" msgid "Azerbaijani" msgstr "Azerbaijani" @@ -60,7 +64,7 @@ msgid "German" msgstr "German" msgid "Lower Sorbian" -msgstr "" +msgstr "Lower Sorbian" msgid "Greek" msgstr "Greek" @@ -69,7 +73,7 @@ msgid "English" msgstr "English" msgid "Australian English" -msgstr "" +msgstr "Australian English" msgid "British English" msgstr "British English" @@ -84,7 +88,7 @@ msgid "Argentinian Spanish" msgstr "Argentinian Spanish" msgid "Colombian Spanish" -msgstr "" +msgstr "Colombian Spanish" msgid "Mexican Spanish" msgstr "Mexican Spanish" @@ -117,7 +121,7 @@ msgid "Irish" msgstr "Irish" msgid "Scottish Gaelic" -msgstr "" +msgstr "Scottish Gaelic" msgid "Galician" msgstr "Galician" @@ -132,13 +136,13 @@ msgid "Croatian" msgstr "Croatian" msgid "Upper Sorbian" -msgstr "" +msgstr "Upper Sorbian" msgid "Hungarian" msgstr "Hungarian" msgid "Armenian" -msgstr "" +msgstr "Armenian" msgid "Interlingua" msgstr "Interlingua" @@ -146,8 +150,11 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesian" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" msgstr "Icelandic" @@ -162,7 +169,7 @@ msgid "Georgian" msgstr "Georgian" msgid "Kabyle" -msgstr "" +msgstr "Kabyle" msgid "Kazakh" msgstr "Kazakh" @@ -176,6 +183,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Korean" +msgid "Kyrgyz" +msgstr "Kyrgyz" + msgid "Luxembourgish" msgstr "Luxembourgish" @@ -195,13 +205,16 @@ msgid "Mongolian" msgstr "Mongolian" msgid "Marathi" +msgstr "Marathi" + +msgid "Malay" msgstr "" msgid "Burmese" msgstr "Burmese" msgid "Norwegian Bokmål" -msgstr "" +msgstr "Norwegian Bokmål" msgid "Nepali" msgstr "Nepali" @@ -260,9 +273,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tajik" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "Turkmen" + msgid "Turkish" msgstr "Turkish" @@ -279,7 +298,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Vietnamese" msgstr "Vietnamese" @@ -291,25 +310,30 @@ msgid "Traditional Chinese" msgstr "Traditional Chinese" msgid "Messages" -msgstr "" +msgstr "Messages" msgid "Site Maps" -msgstr "" +msgstr "Site Maps" msgid "Static Files" -msgstr "" +msgstr "Static Files" msgid "Syndication" -msgstr "" +msgstr "Syndication" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" msgid "That page number is not an integer" -msgstr "" +msgstr "That page number is not an integer" msgid "That page number is less than 1" -msgstr "" +msgstr "That page number is less than 1" msgid "That page contains no results" -msgstr "" +msgstr "That page contains no results" msgid "Enter a valid value." msgstr "Enter a valid value." @@ -318,7 +342,7 @@ msgid "Enter a valid URL." msgstr "Enter a valid URL." msgid "Enter a valid integer." -msgstr "" +msgstr "Enter a valid integer." msgid "Enter a valid email address." msgstr "Enter a valid email address." @@ -327,11 +351,14 @@ msgstr "Enter a valid email address." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." msgid "Enter a valid IPv4 address." msgstr "Enter a valid IPv4 address." @@ -415,20 +442,22 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Null characters are not allowed." msgid "and" msgstr "and" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" +msgstr "%(model_name)s with this %(field_labels)s already exists." #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "" +msgstr "Value %(value)r is not a valid choice." msgid "This field cannot be null." msgstr "This field cannot be null." @@ -446,6 +475,7 @@ msgstr "%(model_name)s with this %(field_label)s already exists." msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." #, python-format msgid "Field of type: %(field_type)s" @@ -453,11 +483,11 @@ msgstr "Field of type: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” value must be either True or False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” value must be either True, False, or None." msgid "Boolean (Either True or False)" msgstr "Boolean (Either True or False)" @@ -474,12 +504,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." msgid "Date (without time)" msgstr "Date (without time)" @@ -489,19 +523,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." msgid "Date (with time)" msgstr "Date (with time)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” value must be a decimal number." msgid "Decimal number" msgstr "Decimal number" @@ -511,9 +549,11 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." msgid "Duration" -msgstr "" +msgstr "Duration" msgid "Email address" msgstr "Email address" @@ -523,14 +563,14 @@ msgstr "File path" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s” value must be a float." msgid "Floating point number" msgstr "Floating point number" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” value must be an integer." msgid "Integer" msgstr "Integer" @@ -538,6 +578,9 @@ msgstr "Integer" msgid "Big (8 byte) integer" msgstr "Big (8 byte) integer" +msgid "Small integer" +msgstr "Small integer" + msgid "IPv4 address" msgstr "IPv4 address" @@ -546,11 +589,14 @@ msgstr "IP address" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s” value must be either None, True or False." msgid "Boolean (Either True, False or None)" msgstr "Boolean (Either True, False or None)" +msgid "Positive big integer" +msgstr "Positive big integer" + msgid "Positive integer" msgstr "Positive integer" @@ -561,9 +607,6 @@ msgstr "Positive small integer" msgid "Slug (up to %(max_length)s)" msgstr "Slug (up to %(max_length)s)" -msgid "Small integer" -msgstr "Small integer" - msgid "Text" msgstr "Text" @@ -572,12 +615,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." msgid "Time" msgstr "Time" @@ -590,10 +637,10 @@ msgstr "Raw binary data" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” is not a valid UUID." msgid "Universally unique identifier" -msgstr "" +msgstr "Universally unique identifier" msgid "File" msgstr "File" @@ -601,9 +648,15 @@ msgstr "File" msgid "Image" msgstr "Image" +msgid "A JSON object" +msgstr "A JSON object" + +msgid "Value must be valid JSON." +msgstr "Value must be valid JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "%(model)s instance with %(field)s %(value)r does not exist." msgid "Foreign Key (type determined by related field)" msgstr "Foreign Key (type determined by related field)" @@ -613,11 +666,11 @@ msgstr "One-to-one relationship" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "%(from)s-%(to)s relationship" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "%(from)s-%(to)s relationships" msgid "Many-to-many relationship" msgstr "Many-to-many relationship" @@ -644,11 +697,11 @@ msgid "Enter a valid date/time." msgstr "Enter a valid date/time." msgid "Enter a valid duration." -msgstr "" +msgstr "Enter a valid duration." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "The number of days must be between {min_days} and {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "No file was submitted. Check the encoding type on the form." @@ -686,10 +739,13 @@ msgid "Enter a list of values." msgstr "Enter a list of values." msgid "Enter a complete value." -msgstr "" +msgstr "Enter a complete value." msgid "Enter a valid UUID." -msgstr "" +msgstr "Enter a valid UUID." + +msgid "Enter a valid JSON." +msgstr "Enter a valid JSON." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -699,20 +755,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Hidden field %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Please submit %d or fewer forms." -msgstr[1] "Please submit %d or fewer forms." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Please submit at most %d form." +msgstr[1] "Please submit at most %d forms." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Please submit at least %d form." +msgstr[1] "Please submit at least %d forms." msgid "Order" msgstr "Order" @@ -740,7 +801,7 @@ msgid "Please correct the duplicate values below." msgstr "Please correct the duplicate values below." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "The inline value did not match the parent instance." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" @@ -748,13 +809,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” is not a valid value." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." msgid "Clear" msgstr "Clear" @@ -774,15 +837,7 @@ msgstr "Yes" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "yes,no,maybe" @@ -1041,12 +1096,12 @@ msgid "December" msgstr "December" msgid "This is not a valid IPv6 address." -msgstr "" +msgstr "This is not a valid IPv6 address." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "or" @@ -1056,53 +1111,50 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d year" -msgstr[1] "%d years" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d month" -msgstr[1] "%d months" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d week" -msgstr[1] "%d weeks" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d day" -msgstr[1] "%d days" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hour" -msgstr[1] "%d hours" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minute" -msgstr[1] "%d minutes" - -msgid "0 minutes" -msgstr "0 minutes" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" -msgstr "" +msgstr "Forbidden" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "CSRF verification failed. Request aborted." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1112,6 +1164,9 @@ msgid "" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." msgid "" "If you are using the tag or " @@ -1120,26 +1175,36 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." msgid "More information is available with DEBUG=True." -msgstr "" +msgstr "More information is available with DEBUG=True." msgid "No year specified" msgstr "No year specified" msgid "Date out of range" -msgstr "" +msgstr "Date out of range" msgid "No month specified" msgstr "No month specified" @@ -1164,14 +1229,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Invalid date string “%(datestr)s” given format “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "No %(verbose_name)s found matching the query" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Page is not “last”, nor can it be converted to an int." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1179,30 +1244,29 @@ msgstr "Invalid page (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Empty list and “%(class_name)s.allow_empty” is False." msgid "Directory indexes are not allowed here." msgstr "Directory indexes are not allowed here." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” does not exist" #, python-format msgid "Index of %(directory)s" msgstr "Index of %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "The install worked successfully! Congratulations!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"View release notes for Django %(version)s" #, python-format msgid "" @@ -1211,21 +1275,25 @@ msgid "" "\">DEBUG=True is in your settings file and you have not configured any " "URLs." msgstr "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." msgid "Django Documentation" -msgstr "" +msgstr "Django Documentation" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Topics, references, & how-to’s" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "Tutorial: A Polling App" msgid "Get started with Django" -msgstr "" +msgstr "Get started with Django" msgid "Django Community" -msgstr "" +msgstr "Django Community" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "Connect, get help, or contribute" diff --git a/django/conf/locale/en_AU/formats.py b/django/conf/locale/en_AU/formats.py index 310577cbd400..caa6f7201c3a 100644 --- a/django/conf/locale/en_AU/formats.py +++ b/django/conf/locale/en_AU/formats.py @@ -2,35 +2,40 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j M Y' # '25 Oct 2006' -TIME_FORMAT = 'P' # '2:30 p.m.' -DATETIME_FORMAT = 'j M Y, P' # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = 'F Y' # 'October 2006' -MONTH_DAY_FORMAT = 'j F' # '25 October' -SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006' -SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 0 # Sunday +DATE_FORMAT = "j M Y" # '25 Oct 2006' +TIME_FORMAT = "P" # '2:30 p.m.' +DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' +YEAR_MONTH_FORMAT = "F Y" # 'October 2006' +MONTH_DAY_FORMAT = "j F" # '25 October' +SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' +SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' +FIRST_DAY_OF_WEEK = 0 # Sunday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + # "%b %d %Y", # 'Oct 25 2006' + # "%b %d, %Y", # 'Oct 25, 2006' + # "%d %b %Y", # '25 Oct 2006' + # "%d %b, %Y", # '25 Oct, 2006' + # "%B %d %Y", # 'October 25 2006' + # "%B %d, %Y", # 'October 25, 2006' + # "%d %B %Y", # '25 October 2006' + # "%d %B, %Y", # '25 October, 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," NUMBER_GROUPING = 3 diff --git a/django/contrib/sitemaps/management/commands/__init__.py b/django/conf/locale/en_CA/__init__.py similarity index 100% rename from django/contrib/sitemaps/management/commands/__init__.py rename to django/conf/locale/en_CA/__init__.py diff --git a/django/conf/locale/en_CA/formats.py b/django/conf/locale/en_CA/formats.py new file mode 100644 index 000000000000..b34551de90bb --- /dev/null +++ b/django/conf/locale/en_CA/formats.py @@ -0,0 +1,31 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date + +DATE_FORMAT = "j M Y" # 25 Oct 2006 +TIME_FORMAT = "P" # 2:30 p.m. +DATETIME_FORMAT = "j M Y, P" # 25 Oct 2006, 2:30 p.m. +YEAR_MONTH_FORMAT = "F Y" # October 2006 +MONTH_DAY_FORMAT = "j F" # 25 October +SHORT_DATE_FORMAT = "Y-m-d" +SHORT_DATETIME_FORMAT = "Y-m-d P" +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%Y-%m-%d", # '2006-05-15' + "%y-%m-%d", # '06-05-15' +] +DATETIME_INPUT_FORMATS = [ + "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' + "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' + "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' + "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' + "%Y-%m-%d %H:%M", # '2006-05-15 14:30' + "%y-%m-%d %H:%M", # '06-05-15 14:30' +] +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "\xa0" # non-breaking space +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/en_GB/formats.py b/django/conf/locale/en_GB/formats.py index 8895179e9090..bc90da59bcc4 100644 --- a/django/conf/locale/en_GB/formats.py +++ b/django/conf/locale/en_GB/formats.py @@ -2,35 +2,40 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j M Y' # '25 Oct 2006' -TIME_FORMAT = 'P' # '2:30 p.m.' -DATETIME_FORMAT = 'j M Y, P' # '25 Oct 2006, 2:30 p.m.' -YEAR_MONTH_FORMAT = 'F Y' # 'October 2006' -MONTH_DAY_FORMAT = 'j F' # '25 October' -SHORT_DATE_FORMAT = 'd/m/Y' # '25/10/2006' -SHORT_DATETIME_FORMAT = 'd/m/Y P' # '25/10/2006 2:30 p.m.' -FIRST_DAY_OF_WEEK = 1 # Monday +DATE_FORMAT = "j M Y" # '25 Oct 2006' +TIME_FORMAT = "P" # '2:30 p.m.' +DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' +YEAR_MONTH_FORMAT = "F Y" # 'October 2006' +MONTH_DAY_FORMAT = "j F" # '25 October' +SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' +SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' +FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + # "%b %d %Y", # 'Oct 25 2006' + # "%b %d, %Y", # 'Oct 25, 2006' + # "%d %b %Y", # '25 Oct 2006' + # "%d %b, %Y", # '25 Oct, 2006' + # "%B %d %Y", # 'October 25 2006' + # "%B %d, %Y", # 'October 25, 2006' + # "%d %B %Y", # '25 October 2006' + # "%d %B, %Y", # '25 October, 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," NUMBER_GROUPING = 3 diff --git a/tests/gis_tests/maps/__init__.py b/django/conf/locale/en_IE/__init__.py similarity index 100% rename from tests/gis_tests/maps/__init__.py rename to django/conf/locale/en_IE/__init__.py diff --git a/django/conf/locale/en_IE/formats.py b/django/conf/locale/en_IE/formats.py new file mode 100644 index 000000000000..81b8324bbb92 --- /dev/null +++ b/django/conf/locale/en_IE/formats.py @@ -0,0 +1,37 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j M Y" # '25 Oct 2006' +TIME_FORMAT = "H:i" # '14:30' +DATETIME_FORMAT = "j M Y, H:i" # '25 Oct 2006, 14:30' +YEAR_MONTH_FORMAT = "F Y" # 'October 2006' +MONTH_DAY_FORMAT = "j F" # '25 October' +SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' +SHORT_DATETIME_FORMAT = "d/m/Y H:i" # '25/10/2006 14:30' +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + "%d %b %Y", # '25 Oct 2006' + "%d %b, %Y", # '25 Oct, 2006' + "%d %B %Y", # '25 October 2006' + "%d %B, %Y", # '25 October, 2006' +] +DATETIME_INPUT_FORMATS = [ + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' +] +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/eo/LC_MESSAGES/django.mo b/django/conf/locale/eo/LC_MESSAGES/django.mo index eb4dfc2801b9..05260e5b049f 100644 Binary files a/django/conf/locale/eo/LC_MESSAGES/django.mo and b/django/conf/locale/eo/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/eo/LC_MESSAGES/django.po b/django/conf/locale/eo/LC_MESSAGES/django.po index 05d9161fb64a..66a2f381505f 100644 --- a/django/conf/locale/eo/LC_MESSAGES/django.po +++ b/django/conf/locale/eo/LC_MESSAGES/django.po @@ -1,21 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Baptiste Darthenay , 2012-2013 -# Baptiste Darthenay , 2013-2019 +# Batist D 🐍 , 2012-2013 +# Batist D 🐍 , 2013-2019 # batisteo , 2011 # Dinu Gherman , 2011 # kristjan , 2011 -# Nikolay Korotkiy , 2017-2018 -# Robin van der Vliet , 2019 +# Matthieu Desplantes , 2021 +# Meiyer , 2022 +# Nikolay Korotkiy , 2017-2018 +# Robin van der Vliet , 2019 # Adamo Mesha , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2022-05-17 05:23-0500\n" +"PO-Revision-Date: 2022-05-25 06:49+0000\n" +"Last-Translator: Meiyer , 2022\n" "Language-Team: Esperanto (http://www.transifex.com/django/django/language/" "eo/)\n" "MIME-Version: 1.0\n" @@ -30,6 +32,9 @@ msgstr "Afrikansa" msgid "Arabic" msgstr "Araba" +msgid "Algerian Arabic" +msgstr "Alĝeria araba" + msgid "Asturian" msgstr "Asturia" @@ -153,6 +158,9 @@ msgstr "Interlingvaa" msgid "Indonesian" msgstr "Indoneza" +msgid "Igbo" +msgstr "Igba" + msgid "Ido" msgstr "Ido" @@ -183,8 +191,11 @@ msgstr "Kanara" msgid "Korean" msgstr "Korea" +msgid "Kyrgyz" +msgstr "Kirgiza" + msgid "Luxembourgish" -msgstr "Lukszemburga" +msgstr "Luksemburga" msgid "Lithuanian" msgstr "Litova" @@ -204,11 +215,14 @@ msgstr "Mongola" msgid "Marathi" msgstr "Marata" +msgid "Malay" +msgstr "Malaja" + msgid "Burmese" msgstr "Birma" msgid "Norwegian Bokmål" -msgstr "Norvega Bbokmål" +msgstr "Norvega (bokmål)" msgid "Nepali" msgstr "Nepala" @@ -267,9 +281,15 @@ msgstr "Tamila" msgid "Telugu" msgstr "Telugua" +msgid "Tajik" +msgstr "Taĝika" + msgid "Thai" msgstr "Taja" +msgid "Turkmen" +msgstr "Turkmena" + msgid "Turkish" msgstr "Turka" @@ -286,7 +306,7 @@ msgid "Urdu" msgstr "Urdua" msgid "Uzbek" -msgstr "" +msgstr "Uzbeka" msgid "Vietnamese" msgstr "Vjetnama" @@ -309,45 +329,54 @@ msgstr "Statikaj dosieroj" msgid "Syndication" msgstr "Abonrilato" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" -msgstr "Tuo paĝnumero ne estas entjero" +msgstr "Tia paĝnumero ne estas entjero" msgid "That page number is less than 1" -msgstr "Tuo paĝnumero estas malpli ol 1" +msgstr "La paĝnumero estas malpli ol 1" msgid "That page contains no results" msgstr "Tiu paĝo ne enhavas rezultojn" msgid "Enter a valid value." -msgstr "Enigu validan valoron." +msgstr "Enigu ĝustan valoron." msgid "Enter a valid URL." -msgstr "Enigu validan adreson." +msgstr "Enigu ĝustan retadreson." msgid "Enter a valid integer." -msgstr "Enigu validan entjero." +msgstr "Enigu ĝustaforman entjeron." msgid "Enter a valid email address." -msgstr "Enigu validan retpoŝtan adreson." +msgstr "Enigu ĝustaforman retpoŝtan adreson." #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Enigu ĝustan “ĵetonvorton” konsistantan el latinaj literoj, ciferoj, " +"substrekoj, aŭ dividstrekoj." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Enigu ĝustan “ĵetonvorton” konsistantan el Unikodaj literoj, ciferoj, " +"substrekoj, aŭ dividstrekoj." msgid "Enter a valid IPv4 address." -msgstr "Enigu validan IPv4-adreson." +msgstr "Enigu ĝustaforman IPv4-adreson." msgid "Enter a valid IPv6 address." -msgstr "Enigu validan IPv6-adreson." +msgstr "Enigu ĝustaforman IPv6-adreson." msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Enigu validan IPv4 aŭ IPv6-adreson." +msgstr "Enigu ĝustaforman IPv4- aŭ IPv6-adreson." msgid "Enter only digits separated by commas." msgstr "Enigu nur ciferojn apartigitajn per komoj." @@ -365,6 +394,10 @@ msgstr "Certigu ke ĉi tiu valoro estas malpli ol aŭ egala al %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Certigu ke ĉi tiu valoro estas pli ol aŭ egala al %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Certigu ke ĉi tiu valoro estas oblo de paŝo-grando %(limit_value)s." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -376,7 +409,7 @@ msgstr[0] "" "Certigu, ke tiu valoro havas %(limit_value)d signon (ĝi havas " "%(show_value)d)." msgstr[1] "" -"Certigu, ke tiu valoro havas %(limit_value)d signojn (ĝi havas " +"Certigu ke ĉi tiu valoro enhavas almenaŭ %(limit_value)d signojn (ĝi havas " "%(show_value)d)." #, python-format @@ -390,7 +423,7 @@ msgstr[0] "" "Certigu, ke tio valuto maksimume havas %(limit_value)d karakterojn (ĝi havas " "%(show_value)d)." msgstr[1] "" -"Certigu, ke tiu valoro maksimume havas %(limit_value)d signojn (ĝi havas " +"Certigu ke ĉi tiu valoro maksimume enhavas %(limit_value)d signojn (ĝi havas " "%(show_value)d)." msgid "Enter a number." @@ -421,6 +454,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Sufikso “%(extension)s” de dosiernomo ne estas permesita. Eblaj sufiksoj " +"estas: %(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Nulsignoj ne estas permesitaj." @@ -432,9 +467,13 @@ msgstr "kaj" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s kun tiuj %(field_labels)s jam ekzistas." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Limigo “%(name)s” estas malobservita." + #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "Valoro %(value)r ne estas valida elekto." +msgstr "Valoro %(value)r ne estas ebla elekto." msgid "This field cannot be null." msgstr "Tiu ĉi kampo ne povas esti senvalora (null)." @@ -446,8 +485,8 @@ msgstr "Tiu ĉi kampo ne povas esti malplena." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s kun tiu %(field_label)s jam ekzistas." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -460,11 +499,13 @@ msgstr "Kampo de tipo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "La valoro “%(value)s” devas esti aŭ Vera (True) aŭ Malvera (False)." #, python-format msgid "“%(value)s” value must be either True, False, or None." msgstr "" +"La valoro “%(value)s” devas esti Vera (True), Malvera (False), aŭ Nenia " +"(None)." msgid "Boolean (Either True or False)" msgstr "Bulea (Vera aŭ Malvera)" @@ -474,19 +515,23 @@ msgid "String (up to %(max_length)s)" msgstr "Ĉeno (ĝis %(max_length)s)" msgid "Comma-separated integers" -msgstr "Kom-apartigitaj entjeroj" +msgstr "Perkome disigitaj entjeroj" #, python-format msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"La valoro “%(value)s” havas malĝustan datformaton. Ĝi devas esti en la " +"formato JJJJ-MM-TT." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT), sed ĝi estas " +"neekzistanta dato." msgid "Date (without time)" msgstr "Dato (sen horo)" @@ -496,19 +541,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " +"JJJJ-MM-TT HH:MM[:ss[.µµµµµµ]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"La valoro “%(value)s” havas la ĝustan formaton (JJJJ-MM-TT HH:MM[:ss[." +"µµµµµµ]][TZ]), sed ĝi estas neekzistanta dato/tempo." msgid "Date (with time)" msgstr "Dato (kun horo)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "La valoro “%(value)s” devas esti dekuma frakcio." msgid "Decimal number" msgstr "Dekuma nombro" @@ -518,6 +567,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " +"[TT] [[HH:]MM:]ss[.µµµµµµ]." msgid "Duration" msgstr "Daŭro" @@ -526,24 +577,27 @@ msgid "Email address" msgstr "Retpoŝtadreso" msgid "File path" -msgstr "Dosiervojo" +msgstr "Dosierindiko" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "La valoro “%(value)s” devas esti glitpunkta nombro." msgid "Floating point number" -msgstr "Glitkoma nombro" +msgstr "Glitpunkta nombro" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "La valoro “%(value)s” devas esti entjero." msgid "Integer" msgstr "Entjero" msgid "Big (8 byte) integer" -msgstr "Granda (8 bitoka) entjero" +msgstr "Granda (8–bitoka) entjero" + +msgid "Small integer" +msgstr "Malgranda entjero" msgid "IPv4 address" msgstr "IPv4-adreso" @@ -554,9 +608,14 @@ msgstr "IP-adreso" #, python-format msgid "“%(value)s” value must be either None, True or False." msgstr "" +"La valoro “%(value)s” devas esti Nenia (None), Vera (True), aŭ Malvera " +"(False)." msgid "Boolean (Either True, False or None)" -msgstr "Buleo (Vera, Malvera aŭ Neniu)" +msgstr "Buleo (Vera, Malvera, aŭ Nenia)" + +msgid "Positive big integer" +msgstr "Pozitiva granda entjero" msgid "Positive integer" msgstr "Pozitiva entjero" @@ -568,9 +627,6 @@ msgstr "Pozitiva malgranda entjero" msgid "Slug (up to %(max_length)s)" msgstr "Ĵetonvorto (ĝis %(max_length)s)" -msgid "Small integer" -msgstr "Malgranda entjero" - msgid "Text" msgstr "Teksto" @@ -579,12 +635,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"La valoro “%(value)s” havas malĝustan formaton. Ĝi devas esti en la formato " +"HH:MM[:ss[.µµµµµµ]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"La valoro “%(value)s” havas la (HH:MM[:ss[.µµµµµµ]]), sed tio estas " +"neekzistanta tempo." msgid "Time" msgstr "Horo" @@ -593,14 +653,14 @@ msgid "URL" msgstr "URL" msgid "Raw binary data" -msgstr "Kruda binara datumo" +msgstr "Kruda duuma datumo" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” ne estas ĝustaforma UUID." msgid "Universally unique identifier" -msgstr "Universe unika identigilo" +msgstr "Universale unika identigilo" msgid "File" msgstr "Dosiero" @@ -608,9 +668,15 @@ msgstr "Dosiero" msgid "Image" msgstr "Bildo" +msgid "A JSON object" +msgstr "JSON-objekto" + +msgid "Value must be valid JSON." +msgstr "La valoro devas esti ĝustaforma JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "%(model)s kazo kun %(field)s %(value)r ne ekzistas." +msgstr "Ekzemplero de %(model)s kun %(field)s egala al %(value)r ne ekzistas." msgid "Foreign Key (type determined by related field)" msgstr "Fremda ŝlosilo (tipo determinita per rilata kampo)" @@ -642,20 +708,20 @@ msgid "Enter a whole number." msgstr "Enigu plenan nombron." msgid "Enter a valid date." -msgstr "Enigu validan daton." +msgstr "Enigu ĝustan daton." msgid "Enter a valid time." -msgstr "Enigu validan horon." +msgstr "Enigu ĝustan horon." msgid "Enter a valid date/time." -msgstr "Enigu validan daton/tempon." +msgstr "Enigu ĝustan daton/tempon." msgid "Enter a valid duration." -msgstr "Enigu validan daŭron." +msgstr "Enigu ĝustan daŭron." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "La nombro da tagoj devas esti inter {min_days} kaj {max_days}." +msgstr "La nombro de tagoj devas esti inter {min_days} kaj {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "" @@ -676,23 +742,23 @@ msgstr[0] "" "Certigu, ke tio dosiernomo maksimume havas %(max)d karakteron (ĝi havas " "%(length)d)." msgstr[1] "" -"Certigu, ke tiu dosiernomo maksimume havas %(max)d signojn (ĝi havas " +"Certigu ke la dosiernomo maksimume havas %(max)d signojn (ĝi havas " "%(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" -"Bonvolu aŭ alŝuti dosieron, aŭ elekti la malplenan markobutonon, ne ambaŭ." +"Bonvolu aŭ alŝuti dosieron, aŭ elekti la vakigan markobutonon, sed ne ambaŭ." msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." msgstr "" -"Alŝutu validan bildon. La alŝutita dosiero ne estas bildo, aŭ estas " +"Alŝutu ĝustaforman bildon. La alŝutita dosiero ne estas bildo aŭ estas " "difektita bildo." #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "Elektu validan elekton. %(value)s ne estas el la eblaj elektoj." +msgstr "Elektu ekzistantan opcion. %(value)s ne estas el la eblaj elektoj." msgid "Enter a list of values." msgstr "Enigu liston de valoroj." @@ -701,7 +767,10 @@ msgid "Enter a complete value." msgstr "Enigu kompletan valoron." msgid "Enter a valid UUID." -msgstr "Enigu validan UUID-n." +msgstr "Enigu ĝustaforman UUID." + +msgid "Enter a valid JSON." +msgstr "Enigu ĝustaforman JSON." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -711,20 +780,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Kaŝita kampo %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm datumoj mankas, aŭ estas tuŝaĉitaj kun" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"La datumoj de la mastruma ManagementForm mankas aŭ estis malice modifitaj. " +"Mankas la kampoj: %(field_names)s. Se la problemo plu okazas, vi poveble " +"devintus raporti cimon." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Bonvolu sendi %d aŭ malpli formularojn." -msgstr[1] "Bonvolu sendi %d aŭ malpli formularojn." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Bonvolu forsendi maksimume %(num)d formularon." +msgstr[1] "Bonvolu forsendi maksimume %(num)d formularojn." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Bonvolu sendi %d aŭ pli formularojn." -msgstr[1] "Bonvolu sendi %d aŭ pli formularojn." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Bonvolu forsendi almenaŭ %(num)d formularon." +msgstr[1] "Bonvolu forsendi almenaŭ %(num)d formularojn." msgid "Order" msgstr "Ordo" @@ -753,20 +828,22 @@ msgid "Please correct the duplicate values below." msgstr "Bonvolu ĝustigi la duoblan valoron sube." msgid "The inline value did not match the parent instance." -msgstr "La enteksta valoro ne egalas la patran aperon." +msgstr "La enteksta valoro ne egalas la patran ekzempleron." msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Elektu validan elekton. Ĉi tiu elekto ne estas el la eblaj elektoj." +msgstr "Elektu ekzistantan opcion. Ĉi tiu opcio ne estas el la eblaj elektoj." #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” estas neakceptebla valoro." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"Ne eblis interpreti %(datetime)s en la tempo-zono %(current_timezone)s. Ĝi " +"eble estas ambigua aŭ ne ekzistas en tiu tempo-zono." msgid "Clear" msgstr "Vakigi" @@ -786,15 +863,7 @@ msgstr "Jes" msgid "No" msgstr "Ne" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "jes,ne,eble" @@ -966,7 +1035,7 @@ msgstr "feb." msgctxt "abbrev. month" msgid "March" -msgstr "marto" +msgstr "mar." msgctxt "abbrev. month" msgid "April" @@ -1053,7 +1122,7 @@ msgid "December" msgstr "Decembro" msgid "This is not a valid IPv6 address." -msgstr "Tiu ne estas valida IPv6-adreso." +msgstr "Tio ne estas ĝustaforma IPv6-adreso." #, python-format msgctxt "String to return when truncating text" @@ -1068,147 +1137,161 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d jaro" -msgstr[1] "%d jaroj" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d jaro" +msgstr[1] "%(num)d jaroj" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d monato" -msgstr[1] "%d monatoj" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d monato" +msgstr[1] "%(num)d monatoj" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semajno" -msgstr[1] "%d semajnoj" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semajno" +msgstr[1] "%(num)d semajnoj" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d tago" -msgstr[1] "%d tagoj" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d tago" +msgstr[1] "%(num)d tagoj" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horo" -msgstr[1] "%d horoj" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d horo" +msgstr[1] "%(num)d horoj" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutoj" - -msgid "0 minutes" -msgstr "0 minutoj" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutoj" msgid "Forbidden" -msgstr "Malpermesa" +msgstr "Malpermesita" msgid "CSRF verification failed. Request aborted." -msgstr "CSRF konfirmo malsukcesis. Peto ĉesigita." +msgstr "Kontrolo de CSRF malsukcesis. Peto ĉesigita." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu HTTPS-retejo postulas ricevi la " +"kapinstrukcion “Referer” de via retumilo, sed neniu estis sendita. Tia " +"kapinstrukcio estas bezonata pro sekurecaj kialoj, por certigi ke via " +"retumilo ne agas laŭ nedezirataj instrukcioj de maliculoj." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Se la agordoj de via retumilo malebligas la kapinstrukciojn “Referer”, " +"bonvolu ebligi ilin por tiu ĉi retejo, aŭ por HTTPS-konektoj, aŭ por petoj " +"el sama fonto (“same-origin”)." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Se vi uzas la etikedon aŭ " +"sendas la kapinstrukcion “Referrer-Policy: no-referrer”, bonvolu forigi " +"ilin. La protekto kontraŭ CSRF postulas la ĉeeston de la kapinstrukcio " +"“Referer”, kaj strikte kontrolas la referencantan fonton. Se vi zorgas pri " +"privateco, uzu alternativojn kiajn por ligiloj al " +"eksteraj retejoj." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" -"Vi vidas tiun mesaĝon ĉar tiu-ĉi retejo postulas CSRF kuketon sendante " -"formojn. Tiu-ĉi kuketo estas bezonata pro motivoj de sekureco, por certigi " -"ke via retumilo ne esti forrabita de triaj partioj." +"Vi vidas tiun ĉi mesaĝon ĉar ĉi-tiu retejo postulas ke CSRF-kuketo estu " +"sendita kune kun la formularoj. Tia kuketo estas bezonata pro sekurecaj " +"kialoj, por certigi ke via retumilo ne agas laŭ nedezirataj instrukcioj de " +"maliculoj." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Se la agordoj de via retumilo malebligas kuketojn, bonvolu ebligi ilin por " +"tiu ĉi retejo aŭ por petoj el sama fonto (“same-origin”)." msgid "More information is available with DEBUG=True." msgstr "Pliaj informoj estas videblaj kun DEBUG=True." msgid "No year specified" -msgstr "Neniu jaro specifita" +msgstr "Neniu jaro indikita" msgid "Date out of range" msgstr "Dato ne en la intervalo" msgid "No month specified" -msgstr "Neniu monato specifita" +msgstr "Neniu monato indikita" msgid "No day specified" -msgstr "Neniu tago specifita" +msgstr "Neniu tago indikita" msgid "No week specified" -msgstr "Neniu semajno specifita" +msgstr "Neniu semajno indikita" #, python-format msgid "No %(verbose_name_plural)s available" -msgstr "Neniu %(verbose_name_plural)s disponeblaj" +msgstr "Neniuj %(verbose_name_plural)s estas disponeblaj" #, python-format msgid "" "Future %(verbose_name_plural)s not available because %(class_name)s." "allow_future is False." msgstr "" -"Estonta %(verbose_name_plural)s ne disponeblas ĉar %(class_name)s." +"Estontaj %(verbose_name_plural)s ne disponeblas ĉar %(class_name)s." "allow_future estas Malvera." #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Erarforma dato-ĉeno “%(datestr)s” se uzi la formaton “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" -msgstr "Neniu %(verbose_name)s trovita kongruas kun la informpeto" +msgstr "Neniu %(verbose_name)s trovita kongrua kun la informpeto" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Paĝo ne estas “lasta”, nek eblas konverti ĝin en entjeron." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "Nevalida paĝo (%(page_number)s): %(message)s" +msgstr "Malĝusta paĝo (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" +"La listo estas malplena dum “%(class_name)s.allow_empty” estas Malvera." msgid "Directory indexes are not allowed here." -msgstr "Dosierujaj indeksoj ne estas permesitaj tie." +msgstr "Dosierujaj indeksoj ne estas permesitaj ĉi tie." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” ne ekzistas" #, python-format msgid "Index of %(directory)s" msgstr "Indekso de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Dĵango: la retframo por perfektemuloj kun limdatoj" +msgid "The install worked successfully! Congratulations!" +msgstr "La instalado sukcesis! Gratulojn!" #, python-format msgid "" @@ -1218,25 +1301,22 @@ msgstr "" "Vidu eldonajn notojn por Dĵango %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "La instalado sukcesis! Gratulojn!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Vi vidas ĉi tiun paĝon ĉar DEBUG = " "True estas en via agorda dosiero kaj vi ne agordis ajnan URL." msgid "Django Documentation" -msgstr "Djanga dokumentaro" +msgstr "Dĵanga dokumentaro" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temoj, referencoj, kaj instruiloj" msgid "Tutorial: A Polling App" msgstr "Instruilo: apo pri enketoj" @@ -1245,7 +1325,7 @@ msgid "Get started with Django" msgstr "Komencu kun Dĵango" msgid "Django Community" -msgstr "Djanga komunumo" +msgstr "Dĵanga komunumo" msgid "Connect, get help, or contribute" msgstr "Konektiĝu, ricevu helpon aŭ kontribuu" diff --git a/django/conf/locale/eo/formats.py b/django/conf/locale/eo/formats.py index 604e5f5bfae2..d1346d1c3691 100644 --- a/django/conf/locale/eo/formats.py +++ b/django/conf/locale/eo/formats.py @@ -2,46 +2,43 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j\-\a \d\e F Y' # '26-a de julio 1887' -TIME_FORMAT = 'H:i' # '18:59' -DATETIME_FORMAT = r'j\-\a \d\e F Y\, \j\e H:i' # '26-a de julio 1887, je 18:59' -YEAR_MONTH_FORMAT = r'F \d\e Y' # 'julio de 1887' -MONTH_DAY_FORMAT = r'j\-\a \d\e F' # '26-a de julio' -SHORT_DATE_FORMAT = 'Y-m-d' # '1887-07-26' -SHORT_DATETIME_FORMAT = 'Y-m-d H:i' # '1887-07-26 18:59' +DATE_FORMAT = r"j\-\a \d\e F Y" # '26-a de julio 1887' +TIME_FORMAT = "H:i" # '18:59' +DATETIME_FORMAT = r"j\-\a \d\e F Y\, \j\e H:i" # '26-a de julio 1887, je 18:59' +YEAR_MONTH_FORMAT = r"F \d\e Y" # 'julio de 1887' +MONTH_DAY_FORMAT = r"j\-\a \d\e F" # '26-a de julio' +SHORT_DATE_FORMAT = "Y-m-d" # '1887-07-26' +SHORT_DATETIME_FORMAT = "Y-m-d H:i" # '1887-07-26 18:59' FIRST_DAY_OF_WEEK = 1 # Monday (lundo) # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%Y-%m-%d', # '1887-07-26' - '%y-%m-%d', # '87-07-26' - '%Y %m %d', # '1887 07 26' - '%Y.%m.%d', # '1887.07.26' - '%d-a de %b %Y', # '26-a de jul 1887' - '%d %b %Y', # '26 jul 1887' - '%d-a de %B %Y', # '26-a de julio 1887' - '%d %B %Y', # '26 julio 1887' - '%d %m %Y', # '26 07 1887' - '%d/%m/%Y', # '26/07/1887' + "%Y-%m-%d", # '1887-07-26' + "%y-%m-%d", # '87-07-26' + "%Y %m %d", # '1887 07 26' + "%Y.%m.%d", # '1887.07.26' + "%d-a de %b %Y", # '26-a de jul 1887' + "%d %b %Y", # '26 jul 1887' + "%d-a de %B %Y", # '26-a de julio 1887' + "%d %B %Y", # '26 julio 1887' + "%d %m %Y", # '26 07 1887' + "%d/%m/%Y", # '26/07/1887' ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '18:59:00' - '%H:%M', # '18:59' + "%H:%M:%S", # '18:59:00' + "%H:%M", # '18:59' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '1887-07-26 18:59:00' - '%Y-%m-%d %H:%M', # '1887-07-26 18:59' - - '%Y.%m.%d %H:%M:%S', # '1887.07.26 18:59:00' - '%Y.%m.%d %H:%M', # '1887.07.26 18:59' - - '%d/%m/%Y %H:%M:%S', # '26/07/1887 18:59:00' - '%d/%m/%Y %H:%M', # '26/07/1887 18:59' - - '%y-%m-%d %H:%M:%S', # '87-07-26 18:59:00' - '%y-%m-%d %H:%M', # '87-07-26 18:59' + "%Y-%m-%d %H:%M:%S", # '1887-07-26 18:59:00' + "%Y-%m-%d %H:%M", # '1887-07-26 18:59' + "%Y.%m.%d %H:%M:%S", # '1887.07.26 18:59:00' + "%Y.%m.%d %H:%M", # '1887.07.26 18:59' + "%d/%m/%Y %H:%M:%S", # '26/07/1887 18:59:00' + "%d/%m/%Y %H:%M", # '26/07/1887 18:59' + "%y-%m-%d %H:%M:%S", # '87-07-26 18:59:00' + "%y-%m-%d %H:%M", # '87-07-26 18:59' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo index 4db6a2b78c0e..20ea819b3c98 100644 Binary files a/django/conf/locale/es/LC_MESSAGES/django.mo and b/django/conf/locale/es/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/es/LC_MESSAGES/django.po b/django/conf/locale/es/LC_MESSAGES/django.po index d46654411886..77ec5f48345d 100644 --- a/django/conf/locale/es/LC_MESSAGES/django.po +++ b/django/conf/locale/es/LC_MESSAGES/django.po @@ -1,45 +1,63 @@ # This file is distributed under the same license as the Django package. # # Translators: +# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 # Abe Estrada, 2013 +# Abe Estrada, 2013 +# albertoalcolea , 2014 # albertoalcolea , 2014 # Amanda Copete, 2017 +# Amanda Copete, 2017 # Antoni Aloy , 2011-2014,2017,2019 +# Claude Paroz , 2020 # Diego Andres Sanabria Martin , 2012 # Diego Schulz , 2012 -# Ernesto Avilés, 2015-2016 -# Ernesto Avilés, 2014 -# Ernesto Avilés, 2020 -# Ernesto Rico Schmidt , 2017 -# franchukelly , 2011 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2014,2020 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2014 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2020 +# Ernesto Rico Schmidt , 2017 +# Ernesto Rico Schmidt , 2017 +# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 # Ignacio José Lizarán Rus , 2019 # Igor Támara , 2015 # Jannis Leidel , 2011 +# Jorge Andres Bravo Meza, 2024 +# José Luis , 2016 # José Luis , 2016 # Josue Naaman Nistal Guerra , 2014 # Leonardo J. Caballero G. , 2011,2013 # Luigy, 2019 +# Luigy, 2019 # Marc Garcia , 2011 +# Mariusz Felisiak , 2021 +# mpachas , 2022 # monobotsoft , 2012 +# Natalia, 2024 # ntrrgc , 2013 # ntrrgc , 2013 # Pablo, 2015 +# Pablo, 2015 +# Sebastián Magrí, 2013 # Sebastián Magrí, 2013 +# Uriel Medina , 2020-2021,2023 +# Veronicabh , 2015 # Veronicabh , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-08 08:24+0000\n" -"Last-Translator: Ernesto Avilés\n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Jorge Andres Bravo Meza, 2024\n" +"Language-Team: Spanish (http://app.transifex.com/django/django/language/" "es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " +"1 : 2;\n" msgid "Afrikaans" msgstr "Africano" @@ -47,6 +65,9 @@ msgstr "Africano" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "Árabe argelino" + msgid "Asturian" msgstr "Asturiano" @@ -71,6 +92,9 @@ msgstr "Bosnio" msgid "Catalan" msgstr "Catalán" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdo central (Sorani)" + msgid "Czech" msgstr "Checo" @@ -170,6 +194,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesio" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -200,6 +227,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "Kirguís" + msgid "Luxembourgish" msgstr "Luxenburgués" @@ -221,6 +251,9 @@ msgstr "Mongol" msgid "Marathi" msgstr "Maratí" +msgid "Malay" +msgstr "Malayo" + msgid "Burmese" msgstr "Birmano" @@ -284,9 +317,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tayiko" + msgid "Thai" msgstr "Tailandés" +msgid "Turkmen" +msgstr "Turcomanos" + msgid "Turkish" msgstr "Turco" @@ -296,6 +335,9 @@ msgstr "Tártaro" msgid "Udmurt" msgstr "Udmurt" +msgid "Uyghur" +msgstr "Uigur" + msgid "Ukrainian" msgstr "Ucraniano" @@ -303,7 +345,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeko" msgid "Vietnamese" msgstr "Vietnamita" @@ -326,6 +368,11 @@ msgstr "Archivos estáticos" msgid "Syndication" msgstr "Sindicación" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Este número de página no es un entero" @@ -338,6 +385,9 @@ msgstr "Esa página no contiene resultados" msgid "Enter a valid value." msgstr "Introduzca un valor válido." +msgid "Enter a valid domain name." +msgstr "Ingrese un nombre de dominio válido." + msgid "Enter a valid URL." msgstr "Introduzca una URL válida." @@ -358,15 +408,21 @@ msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Introduzca un 'slug' válido, consistente en letras, números, guiones bajos o " +"medios de Unicode." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Ingrese una dirección de %(protocol)s válida." -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Introduzca una dirección IPv6 válida." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduzca una dirección IPv4 o IPv6 válida." +msgid "IPv4 or IPv6" +msgstr "IPv4 o IPv6" msgid "Enter only digits separated by commas." msgstr "Introduzca sólo dígitos separados por comas." @@ -385,6 +441,19 @@ msgstr "Asegúrese de que este valor es menor o igual a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Asegúrese de que este valor es mayor o igual a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Asegúrese de que este valor es múltiplo de %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Asegúrese de que este valor sea un múltiplo del tamaño del " +"paso%(limit_value)s, comenzando en%(offset)s, p.ej. %(offset)s, " +"%(valid_value1)s, %(valid_value2)s, etcétera." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -396,8 +465,11 @@ msgstr[0] "" "Asegúrese de que este valor tenga al menos %(limit_value)d caracter (tiene " "%(show_value)d)." msgstr[1] "" -"Asegúrese de que este valor tenga al menos %(limit_value)d caracteres (tiene " -"%(show_value)d)." +"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " +"(tiene%(show_value)d)." +msgstr[2] "" +"Asegúrese de que este valor tenga al menos %(limit_value)d carácter(es) " +"(tiene%(show_value)d)." #, python-format msgid "" @@ -412,6 +484,9 @@ msgstr[0] "" msgstr[1] "" "Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " "%(show_value)d)." +msgstr[2] "" +"Asegúrese de que este valor tenga menos de %(limit_value)d caracteres (tiene " +"%(show_value)d)." msgid "Enter a number." msgstr "Introduzca un número." @@ -421,12 +496,14 @@ msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos en total." +msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos en total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "Asegúrese de que no haya más de %(max)s dígito decimal." msgstr[1] "Asegúrese de que no haya más de %(max)s dígitos decimales." +msgstr[2] "Asegúrese de que no haya más de %(max)s dígitos decimales." #, python-format msgid "" @@ -437,12 +514,16 @@ msgstr[0] "" "Asegúrese de que no haya más de %(max)s dígito antes del punto decimal" msgstr[1] "" "Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." +msgstr[2] "" +"Asegúrese de que no haya más de %(max)s dígitos antes del punto decimal." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"La extensión de archivo “%(extension)s” no esta permitida. Las extensiones " +"permitidas son: %(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Los caracteres nulos no están permitidos." @@ -454,6 +535,10 @@ msgstr "y" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s con este %(field_labels)s ya existe." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "No se cumple la restricción \"%(name)s\"." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Valor %(value)r no es una opción válida." @@ -468,8 +553,8 @@ msgstr "Este campo no puede estar vacío." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ya existe %(model_name)s con este %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -482,11 +567,11 @@ msgstr "Campo de tipo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s”: el valor debe ser Verdadero o Falso." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s”: el valor debe ser Verdadero, Falso o Nulo." msgid "Boolean (Either True or False)" msgstr "Booleano (Verdadero o Falso)" @@ -495,6 +580,9 @@ msgstr "Booleano (Verdadero o Falso)" msgid "String (up to %(max_length)s)" msgstr "Cadena (máximo %(max_length)s)" +msgid "String (unlimited)" +msgstr "Cadena (ilimitado)" + msgid "Comma-separated integers" msgstr "Enteros separados por coma" @@ -503,12 +591,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " +"el formato YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " +"fecha inválida." msgid "Date (without time)" msgstr "Fecha (sin hora)" @@ -518,19 +610,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " +"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s”: el valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ]) pero es una fecha inválida." msgid "Date (with time)" msgstr "Fecha (con hora)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s”: el valor debe ser un número decimal." msgid "Decimal number" msgstr "Número decimal" @@ -540,6 +636,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " +"[DD] [[HH:]MM:]ss[.uuuuuu]" msgid "Duration" msgstr "Duración" @@ -552,14 +650,14 @@ msgstr "Ruta de fichero" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s”: el valor debería ser un número de coma flotante." msgid "Floating point number" msgstr "Número en coma flotante" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s”: el valor debería ser un numero entero" msgid "Integer" msgstr "Entero" @@ -567,6 +665,9 @@ msgstr "Entero" msgid "Big (8 byte) integer" msgstr "Entero grande (8 bytes)" +msgid "Small integer" +msgstr "Entero corto" + msgid "IPv4 address" msgstr "Dirección IPv4" @@ -575,11 +676,14 @@ msgstr "Dirección IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s”: el valor debería ser None, Verdadero o Falso." msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" +msgid "Positive big integer" +msgstr "Entero grande positivo" + msgid "Positive integer" msgstr "Entero positivo" @@ -590,9 +694,6 @@ msgstr "Entero positivo corto" msgid "Slug (up to %(max_length)s)" msgstr "Slug (hasta %(max_length)s)" -msgid "Small integer" -msgstr "Entero corto" - msgid "Text" msgstr "Texto" @@ -601,12 +702,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s”: el valor tiene un formato inválido. Debería estar en el formato " +"HH:MM[:ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"“%(value)s” : el valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero " +"es un tiempo inválido." msgid "Time" msgstr "Hora" @@ -619,7 +724,7 @@ msgstr "Datos binarios en bruto" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” no es un UUID válido." msgid "Universally unique identifier" msgstr "Identificador universal único" @@ -630,6 +735,12 @@ msgstr "Archivo" msgid "Image" msgstr "Imagen" +msgid "A JSON object" +msgstr "Un objeto JSON" + +msgid "Value must be valid JSON." +msgstr "El valor debe ser un objeto JSON válido." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." @@ -698,8 +809,11 @@ msgstr[0] "" "Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracter " "(tiene %(length)d)." msgstr[1] "" -"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " -"(tiene %(length)d)." +"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " +"carácter(es) (tiene %(length)d)." +msgstr[2] "" +"Asegúrese de que este nombre de archivo tenga como máximo %(max)d " +"carácter(es) (tiene %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" @@ -726,6 +840,9 @@ msgstr "Introduzca un valor completo." msgid "Enter a valid UUID." msgstr "Introduzca un UUID válido." +msgid "Enter a valid JSON." +msgstr "Ingresa un JSON válido." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -734,20 +851,28 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Campo oculto %(name)s) *%(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Los datos de ManagementForm faltan o han sido manipulados" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Los datos de ManagementForm faltan o han sido alterados. Campos que faltan: " +"%(field_names)s. Es posible que deba presentar un informe de error si el " +"problema persiste." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor, envíe %d formulario o menos." -msgstr[1] "Por favor, envíe %d formularios o menos" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Por favor, envíe %(num)d formulario como máximo." +msgstr[1] "Por favor, envíe %(num)d formularios como máximo." +msgstr[2] "Por favor, envíe %(num)d formularios como máximo." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor, envíe %d formulario o más." -msgstr[1] "Por favor, envíe %d formularios o más." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Por favor, envíe %(num)d formulario como mínimo." +msgstr[1] "Por favor, envíe %(num)d formularios como mínimo." +msgstr[2] "Por favor, envíe %(num)d formularios como mínimo." msgid "Order" msgstr "Orden" @@ -783,13 +908,15 @@ msgstr "Escoja una opción válida. Esa opción no está entre las disponibles." #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” no es un valor válido." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s no pudo ser interpretado en la zona horaria " +"%(current_timezone)s; podría ser ambiguo o no existir." msgid "Clear" msgstr "Limpiar" @@ -809,23 +936,16 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "sí, no, quizás" +msgstr "sí,no,quizás" #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" +msgstr[2] "%(size)d bytes" #, python-format msgid "%s KB" @@ -866,82 +986,82 @@ msgid "noon" msgstr "mediodía" msgid "Monday" -msgstr "Lunes" +msgstr "lunes" msgid "Tuesday" -msgstr "Martes" +msgstr "martes" msgid "Wednesday" -msgstr "Miércoles" +msgstr "miércoles" msgid "Thursday" -msgstr "Jueves" +msgstr "jueves" msgid "Friday" -msgstr "Viernes" +msgstr "viernes" msgid "Saturday" -msgstr "Sábado" +msgstr "sábado" msgid "Sunday" -msgstr "Domingo" +msgstr "domingo" msgid "Mon" -msgstr "Lun" +msgstr "lun" msgid "Tue" -msgstr "Mar" +msgstr "mar" msgid "Wed" -msgstr "Mié" +msgstr "mié" msgid "Thu" -msgstr "Jue" +msgstr "jue" msgid "Fri" -msgstr "Vie" +msgstr "vie" msgid "Sat" -msgstr "Sáb" +msgstr "sáb" msgid "Sun" -msgstr "Dom" +msgstr "dom" msgid "January" -msgstr "Enero" +msgstr "enero" msgid "February" -msgstr "Febrero" +msgstr "febrero" msgid "March" -msgstr "Marzo" +msgstr "marzo" msgid "April" -msgstr "Abril" +msgstr "abril" msgid "May" -msgstr "Mayo" +msgstr "mayo" msgid "June" -msgstr "Junio" +msgstr "junio" msgid "July" -msgstr "Julio" +msgstr "julio" msgid "August" -msgstr "Agosto" +msgstr "agosto" msgid "September" -msgstr "Septiembre" +msgstr "septiembre" msgid "October" -msgstr "Octubre" +msgstr "octubre" msgid "November" -msgstr "Noviembre" +msgstr "noviembre" msgid "December" -msgstr "Diciembre" +msgstr "diciembre" msgid "jan" msgstr "ene" @@ -989,91 +1109,91 @@ msgstr "Feb." msgctxt "abbrev. month" msgid "March" -msgstr "Mar." +msgstr "marzo" msgctxt "abbrev. month" msgid "April" -msgstr "Abr." +msgstr "abril" msgctxt "abbrev. month" msgid "May" -msgstr "Mayo" +msgstr "mayo" msgctxt "abbrev. month" msgid "June" -msgstr "Jun." +msgstr "junio" msgctxt "abbrev. month" msgid "July" -msgstr "Jul." +msgstr "julio" msgctxt "abbrev. month" msgid "Aug." -msgstr "Ago." +msgstr "ago." msgctxt "abbrev. month" msgid "Sept." -msgstr "Sept." +msgstr "sept." msgctxt "abbrev. month" msgid "Oct." -msgstr "Oct." +msgstr "oct." msgctxt "abbrev. month" msgid "Nov." -msgstr "Nov." +msgstr "nov." msgctxt "abbrev. month" msgid "Dec." -msgstr "Dic." +msgstr "dic." msgctxt "alt. month" msgid "January" -msgstr "Enero" +msgstr "enero" msgctxt "alt. month" msgid "February" -msgstr "Febrero" +msgstr "febrero" msgctxt "alt. month" msgid "March" -msgstr "Marzo" +msgstr "marzo" msgctxt "alt. month" msgid "April" -msgstr "Abril" +msgstr "abril" msgctxt "alt. month" msgid "May" -msgstr "Mayo" +msgstr "mayo" msgctxt "alt. month" msgid "June" -msgstr "Junio" +msgstr "junio" msgctxt "alt. month" msgid "July" -msgstr "Julio" +msgstr "julio" msgctxt "alt. month" msgid "August" -msgstr "Agosto" +msgstr "agosto" msgctxt "alt. month" msgid "September" -msgstr "Septiembre" +msgstr "septiembre" msgctxt "alt. month" msgid "October" -msgstr "Octubre" +msgstr "octubre" msgctxt "alt. month" msgid "November" -msgstr "Noviembre" +msgstr "noviembre" msgctxt "alt. month" msgid "December" -msgstr "Diciembre" +msgstr "diciembre" msgid "This is not a valid IPv6 address." msgstr "No es una dirección IPv6 válida." @@ -1081,7 +1201,7 @@ msgstr "No es una dirección IPv6 válida." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "o" @@ -1091,43 +1211,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d año" +msgstr[1] "%(num)d años" +msgstr[2] "%(num)d años" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mes" +msgstr[1] "%(num)d meses" +msgstr[2] "%(num)d meses" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semana" +msgstr[1] "%(num)d semanas" +msgstr[2] "%(num)d semanas" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d día" +msgstr[1] "%(num)d días" +msgstr[2] "%(num)d días" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d horas" +msgstr[2] "%(num)d horas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutos" +msgstr[2] "%(num)d minutos" msgid "Forbidden" msgstr "Prohibido" @@ -1137,24 +1260,37 @@ msgstr "La verificación CSRF ha fallado. Solicitud abortada." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Estás viendo este mensaje porque este sitio HTTPS requiere que tu navegador " +"web envíe un \"encabezado de referencia\", pero no se envió ninguno. Este " +"encabezado es necesario por razones de seguridad, para garantizar que su " +"navegador no sea secuestrado por terceros." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Si ha configurado su navegador para deshabilitar los encabezados " +"\"Referer\", vuelva a habilitarlos, al menos para este sitio, o para " +"conexiones HTTPS, o para solicitudes del \"mismo origen\"." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Si esta utilizando la etiqueta o incluyendo el encabezado \"Referrer-Policy: no-referrer\", " +"elimínelos. La protección CSRF requiere que el encabezado \"Referer\" " +"realice una comprobación estricta del referente. Si le preocupa la " +"privacidad, utilice alternativas como para los " +"enlaces a sitios de terceros." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1169,9 +1305,12 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Si ha configurado su navegador para deshabilitar las cookies, vuelva a " +"habilitarlas, al menos para este sitio o para solicitudes del \"mismo " +"origen\"." msgid "More information is available with DEBUG=True." -msgstr "Se puede ver más información si se establece DEBUG=True." +msgstr "Más información disponible si se establece DEBUG=True." msgid "No year specified" msgstr "No se ha indicado el año" @@ -1202,14 +1341,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Cadena de fecha no valida “%(datestr)s” dado el formato “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "No se encontró ningún %(verbose_name)s coincidente con la consulta" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "La página no es la \"última\", ni se puede convertir a un entero." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1217,21 +1356,21 @@ msgstr "Página inválida (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Lista vacía y “%(class_name)s.allow_empty” es Falso" msgid "Directory indexes are not allowed here." msgstr "Los índices de directorio no están permitidos." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” no existe" #, python-format msgid "Index of %(directory)s" msgstr "Índice de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: el marco web para perfeccionistas con plazos." +msgid "The install worked successfully! Congratulations!" +msgstr "¡La instalación funcionó con éxito! ¡Felicitaciones!" #, python-format msgid "" @@ -1242,26 +1381,23 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">la notas de la versión de Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "¡La instalación funcionó con éxito! ¡Felicitaciones!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Estás viendo esta página porque DEBUG=True está en tu archivo de configuración y no has configurado " -"ningún URL." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True está en su archivo de configuración y no ha " +"configurado ninguna URL." msgid "Django Documentation" msgstr "Documentación de Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temas, referencias, & como hacer" msgid "Tutorial: A Polling App" msgstr "Tutorial: Una aplicación de encuesta" diff --git a/django/conf/locale/es/formats.py b/django/conf/locale/es/formats.py index b7aca789887d..f2716bb0f17b 100644 --- a/django/conf/locale/es/formats.py +++ b/django/conf/locale/es/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i' -YEAR_MONTH_FORMAT = r'F \d\e Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +DATE_FORMAT = r"j \d\e F \d\e Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" +YEAR_MONTH_FORMAT = r"F \d\e Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - # '31/12/2009', '31/12/09' - '%d/%m/%Y', '%d/%m/%y' + "%d/%m/%Y", # '31/12/2009' + "%d/%m/%y", # '31/12/09' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', - '%d/%m/%Y %H:%M:%S.%f', - '%d/%m/%Y %H:%M', - '%d/%m/%y %H:%M:%S', - '%d/%m/%y %H:%M:%S.%f', - '%d/%m/%y %H:%M', + "%d/%m/%Y %H:%M:%S", + "%d/%m/%Y %H:%M:%S.%f", + "%d/%m/%Y %H:%M", + "%d/%m/%y %H:%M:%S", + "%d/%m/%y %H:%M:%S.%f", + "%d/%m/%y %H:%M", ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/django/conf/locale/es_AR/LC_MESSAGES/django.mo index f9805adf194e..cdb8444a35e3 100644 Binary files a/django/conf/locale/es_AR/LC_MESSAGES/django.mo and b/django/conf/locale/es_AR/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/es_AR/LC_MESSAGES/django.po b/django/conf/locale/es_AR/LC_MESSAGES/django.po index 8991484d7ef9..17680c6f3f9e 100644 --- a/django/conf/locale/es_AR/LC_MESSAGES/django.po +++ b/django/conf/locale/es_AR/LC_MESSAGES/django.po @@ -3,16 +3,17 @@ # Translators: # Jannis Leidel , 2011 # lardissone , 2014 +# Natalia, 2023 # poli , 2014 -# Ramiro Morales, 2013-2019 +# Ramiro Morales, 2013-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-24 15:19+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Ramiro Morales, 2013-2024\n" +"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" "language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,6 +27,9 @@ msgstr "afrikáans" msgid "Arabic" msgstr "árabe" +msgid "Algerian Arabic" +msgstr "Árabe de Argelia" + msgid "Asturian" msgstr "asturiano" @@ -50,6 +54,9 @@ msgstr "bosnio" msgid "Catalan" msgstr "catalán" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdo central (Sorani)" + msgid "Czech" msgstr "checo" @@ -149,6 +156,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "indonesio" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "ido" @@ -179,6 +189,9 @@ msgstr "canarés" msgid "Korean" msgstr "coreano" +msgid "Kyrgyz" +msgstr "kirguís" + msgid "Luxembourgish" msgstr "luxemburgués" @@ -200,6 +213,9 @@ msgstr "mongol" msgid "Marathi" msgstr "maratí" +msgid "Malay" +msgstr "malayo" + msgid "Burmese" msgstr "burmés" @@ -263,9 +279,15 @@ msgstr "tamil" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tayiko" + msgid "Thai" msgstr "tailandés" +msgid "Turkmen" +msgstr "turcomano" + msgid "Turkish" msgstr "turco" @@ -275,6 +297,9 @@ msgstr "tártaro" msgid "Udmurt" msgstr "udmurto" +msgid "Uyghur" +msgstr "Uigur" + msgid "Ukrainian" msgstr "ucraniano" @@ -305,6 +330,11 @@ msgstr "Archivos estáticos" msgid "Syndication" msgstr "Sindicación" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "El número de página no es un entero" @@ -317,6 +347,9 @@ msgstr "Esa página no contiene resultados" msgid "Enter a valid value." msgstr "Introduzca un valor válido." +msgid "Enter a valid domain name." +msgstr "Introduzca un nombre de dominio válido." + msgid "Enter a valid URL." msgstr "Introduzca una URL válida." @@ -338,14 +371,18 @@ msgstr "" "Introduzca un “slug” compuesto por letras Unicode, números, guiones bajos o " "guiones." -msgid "Enter a valid IPv4 address." -msgstr "Introduzca una dirección IPv4 válida." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Introduzca una dirección de %(protocol)s válida." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Introduzca una dirección IPv6 válida." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Introduzca una dirección IPv4 o IPv6 válida." +msgid "IPv4 or IPv6" +msgstr "IPv4 o IPv6" msgid "Enter only digits separated by commas." msgstr "Introduzca sólo dígitos separados por comas." @@ -364,6 +401,19 @@ msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Asegúrese de que este valor sea múltiplo de %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Confirme que este valor sea un múltiplo del tamaño del paso %(limit_value)s, " +"empezando por %(offset)s, por ejemplo %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, y así sucesivamente." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -377,6 +427,9 @@ msgstr[0] "" msgstr[1] "" "Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " "(tiene %(show_value)d)." +msgstr[2] "" +"Asegúrese de que este valor tenga como mínimo %(limit_value)d caracteres " +"(tiene %(show_value)d)." #, python-format msgid "" @@ -391,6 +444,9 @@ msgstr[0] "" msgstr[1] "" "Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " "(tiene %(show_value)d)." +msgstr[2] "" +"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " +"(tiene %(show_value)d)." msgid "Enter a number." msgstr "Introduzca un número." @@ -400,12 +456,14 @@ msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Asegúrese de que no exista en total mas de %(max)s dígito." msgstr[1] "Asegúrese de que no existan en total mas de %(max)s dígitos." +msgstr[2] "Asegúrese de que no existan en total mas de %(max)s dígitos." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "Asegúrese de que no exista mas de %(max)s lugar decimal." msgstr[1] "Asegúrese de que no existan mas de %(max)s lugares decimales." +msgstr[2] "Asegúrese de que no existan mas de %(max)s lugares decimales." #, python-format msgid "" @@ -416,6 +474,8 @@ msgstr[0] "" "Asegúrese de que no exista mas de %(max)s dígito antes del punto decimal." msgstr[1] "" "Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." +msgstr[2] "" +"Asegúrese de que no existan mas de %(max)s dígitos antes del punto decimal." #, python-format msgid "" @@ -435,6 +495,10 @@ msgstr "y" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Ya existe un/a %(model_name)s con este/a %(field_labels)s." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "No se cumple la restricción “%(name)s”." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "El valor %(value)r no es una opción válida." @@ -449,8 +513,8 @@ msgstr "Este campo no puede estar en blanco." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -477,6 +541,9 @@ msgstr "Booleano (Verdadero o Falso)" msgid "String (up to %(max_length)s)" msgstr "Cadena (máximo %(max_length)s)" +msgid "String (unlimited)" +msgstr "Cadena (ilimitado)" + msgid "Comma-separated integers" msgstr "Enteros separados por comas" @@ -559,6 +626,9 @@ msgstr "Entero" msgid "Big (8 byte) integer" msgstr "Entero grande (8 bytes)" +msgid "Small integer" +msgstr "Entero pequeño" + msgid "IPv4 address" msgstr "Dirección IPv4" @@ -572,6 +642,9 @@ msgstr "El valor de “%(value)s” debe ser None, Verdadero o Falso." msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" +msgid "Positive big integer" +msgstr "Entero grande positivo" + msgid "Positive integer" msgstr "Entero positivo" @@ -582,9 +655,6 @@ msgstr "Entero pequeño positivo" msgid "Slug (up to %(max_length)s)" msgstr "Slug (de hasta %(max_length)s caracteres)" -msgid "Small integer" -msgstr "Entero pequeño" - msgid "Text" msgstr "Texto" @@ -626,6 +696,12 @@ msgstr "Archivo" msgid "Image" msgstr "Imagen" +msgid "A JSON object" +msgstr "Un objeto JSON" + +msgid "Value must be valid JSON." +msgstr "El valor debe ser JSON válido." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "No existe una instancia de %(model)s con %(field)s %(value)r." @@ -695,6 +771,9 @@ msgstr[0] "" msgstr[1] "" "Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " "(tiene %(length)d)." +msgstr[2] "" +"Asegúrese de que este nombre de archivo tenga como máximo %(max)d caracteres " +"(tiene %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "Por favor envíe un archivo o active el checkbox, pero no ambas cosas." @@ -721,6 +800,9 @@ msgstr "Introduzca un valor completo." msgid "Enter a valid UUID." msgstr "Introduzca un UUID válido." +msgid "Enter a valid JSON." +msgstr "Introduzca JSON válido." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -729,22 +811,28 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Campo oculto %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" -"Los datos correspondientes al ManagementForm no existen o han sido " -"modificados" +"Los datos de ManagementForm faltan o han sido alterados. Campos faltantes: " +"%(field_names)s. Si el problema persiste es posible que deba reportarlo como " +"un error." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor envíe cero o %d formularios." -msgstr[1] "Por favor envíe un máximo de %d formularios." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Por favor envíe un máximo de %(num)d formulario." +msgstr[1] "Por favor envíe un máximo de %(num)d formularios." +msgstr[2] "Por favor envíe un máximo de %(num)d formularios." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor envíe %d o mas formularios." -msgstr[1] "Por favor envíe %d o mas formularios." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Por favor envíe %(num)d o mas formularios." +msgstr[1] "Por favor envíe %(num)d o mas formularios." +msgstr[2] "Por favor envíe %(num)d o mas formularios." msgid "Order" msgstr "Ordenar" @@ -810,15 +898,7 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "Año" - -msgid "Month" -msgstr "Mes" - -msgid "Day" -msgstr "Día" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "si,no,talvez" @@ -827,6 +907,7 @@ msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" +msgstr[2] "%(size)d bytes" #, python-format msgid "%s KB" @@ -867,22 +948,22 @@ msgid "noon" msgstr "mediodía" msgid "Monday" -msgstr "Lunes" +msgstr "lunes" msgid "Tuesday" -msgstr "Martes" +msgstr "martes" msgid "Wednesday" -msgstr "Miércoles" +msgstr "miércoles" msgid "Thursday" -msgstr "Jueves" +msgstr "jueves" msgid "Friday" -msgstr "Viernes" +msgstr "viernes" msgid "Saturday" -msgstr "Sábado" +msgstr "sábado" msgid "Sunday" msgstr "Domingo" @@ -909,40 +990,40 @@ msgid "Sun" msgstr "Dom" msgid "January" -msgstr "Enero" +msgstr "enero" msgid "February" -msgstr "Febrero" +msgstr "febrero" msgid "March" -msgstr "Marzo" +msgstr "marzo" msgid "April" -msgstr "Abril" +msgstr "abril" msgid "May" -msgstr "Mayo" +msgstr "mayo" msgid "June" -msgstr "Junio" +msgstr "junio" msgid "July" -msgstr "Julio" +msgstr "julio" msgid "August" -msgstr "Agosto" +msgstr "agosto" msgid "September" -msgstr "Setiembre" +msgstr "setiembre" msgid "October" -msgstr "Octubre" +msgstr "octubre" msgid "November" -msgstr "Noviembre" +msgstr "noviembre" msgid "December" -msgstr "Diciembre" +msgstr "diciembre" msgid "jan" msgstr "ene" @@ -1092,43 +1173,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d año" +msgstr[1] "%(num)d años" +msgstr[2] "%(num)d años" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mes" +msgstr[1] "%(num)d meses" +msgstr[2] "%(num)d meses" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semana" +msgstr[1] "%(num)d semanas" +msgstr[2] "%(num)d semanas" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d día" +msgstr[1] "%(num)d días" +msgstr[2] "%(num)d días" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d horas" +msgstr[2] "%(num)d horas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutos" +msgstr[2] "%(num)d minutos" msgid "Forbidden" msgstr "Prohibido" @@ -1138,15 +1222,15 @@ msgstr "Verificación CSRF fallida. Petición abortada." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" "Ud. está viendo este mensaje porque este sitio HTTPS tiene como " -"requerimiento que su browser Web envíe una cabecera “Referer” pero el mismo " -"no ha enviado una. El hecho de que esta cabecera sea obligatoria es una " -"medida de seguridad para comprobar que su browser no está siendo controlado " -"por terceros." +"requerimiento que su navegador web envíe un encabezado “Referer” pero el " +"mismo no ha enviado uno. El hecho de que este encabezado sea obligatorio es " +"una medida de seguridad para comprobar que su navegador no está siendo " +"controlado por terceros." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1161,8 +1245,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Si está usando la etiqueta " "o está incluyendo el encabezado “Referrer-Policy: no-referrer” por favor " @@ -1251,8 +1335,8 @@ msgstr "“%(path)s” no existe" msgid "Index of %(directory)s" msgstr "Listado de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: El framework Web para perfeccionistas con deadlines." +msgid "The install worked successfully! Congratulations!" +msgstr "La instalación ha sido exitosa. ¡Felicitaciones!" #, python-format msgid "" @@ -1262,19 +1346,17 @@ msgstr "" "Ver las release notes de Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "La instalación ha sido exitosa. ¡Felicitaciones!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -"Está viendo esta página porque el archivo de configuración contiene DEBUG=True y no ha configurado ninguna URL." +"Está viendo esta página porque el archivo de configuración contiene DEBUG=True y no ha configurado " +"ninguna URL." msgid "Django Documentation" msgstr "Documentación de Django" diff --git a/django/conf/locale/es_AR/formats.py b/django/conf/locale/es_AR/formats.py index e856c4a26598..601b45843f36 100644 --- a/django/conf/locale/es_AR/formats.py +++ b/django/conf/locale/es_AR/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j N Y' -TIME_FORMAT = r'H:i' -DATETIME_FORMAT = r'j N Y H:i' -YEAR_MONTH_FORMAT = r'F Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = r'd/m/Y' -SHORT_DATETIME_FORMAT = r'd/m/Y H:i' +DATE_FORMAT = r"j N Y" +TIME_FORMAT = r"H:i" +DATETIME_FORMAT = r"j N Y H:i" +YEAR_MONTH_FORMAT = r"F Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = r"d/m/Y" +SHORT_DATETIME_FORMAT = r"d/m/Y H:i" FIRST_DAY_OF_WEEK = 0 # 0: Sunday, 1: Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', # '31/12/2009' - '%d/%m/%y', # '31/12/09' + "%d/%m/%Y", # '31/12/2009' + "%d/%m/%y", # '31/12/09' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', - '%d/%m/%Y %H:%M:%S.%f', - '%d/%m/%Y %H:%M', - '%d/%m/%y %H:%M:%S', - '%d/%m/%y %H:%M:%S.%f', - '%d/%m/%y %H:%M', + "%d/%m/%Y %H:%M:%S", + "%d/%m/%Y %H:%M:%S.%f", + "%d/%m/%Y %H:%M", + "%d/%m/%y %H:%M:%S", + "%d/%m/%y %H:%M:%S.%f", + "%d/%m/%y %H:%M", ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/es_CO/LC_MESSAGES/django.mo b/django/conf/locale/es_CO/LC_MESSAGES/django.mo index 2d7fee59cfa1..678fdc715bd2 100644 Binary files a/django/conf/locale/es_CO/LC_MESSAGES/django.mo and b/django/conf/locale/es_CO/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/es_CO/LC_MESSAGES/django.po b/django/conf/locale/es_CO/LC_MESSAGES/django.po index 8d939b523070..9f839fea5499 100644 --- a/django/conf/locale/es_CO/LC_MESSAGES/django.po +++ b/django/conf/locale/es_CO/LC_MESSAGES/django.po @@ -2,13 +2,14 @@ # # Translators: # Carlos Muñoz , 2015 +# Claude Paroz , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/" "language/es_CO/)\n" "MIME-Version: 1.0\n" @@ -23,6 +24,9 @@ msgstr "Afrikáans" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Asturiano" @@ -146,6 +150,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesio" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -176,6 +183,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreano" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luxenburgués" @@ -260,9 +270,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tailandés" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turco" @@ -552,6 +568,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Entero positivo" @@ -602,6 +621,12 @@ msgstr "Archivo" msgid "Image" msgstr "Imagen" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "La instancia del %(model)s con %(field)s %(value)r no existe." @@ -698,6 +723,9 @@ msgstr "Ingrese un valor completo." msgid "Enter a valid UUID." msgstr "Ingrese un UUID válido." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -781,17 +809,9 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "sí, no, quizás" +msgstr "sí,no,quizás" #, python-format msgid "%(size)d byte" @@ -1098,9 +1118,6 @@ msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" -msgid "0 minutes" -msgstr "0 minutos" - msgid "Forbidden" msgstr "Prohibido" diff --git a/django/conf/locale/es_CO/formats.py b/django/conf/locale/es_CO/formats.py index cefbe26dae5e..056d0adaf785 100644 --- a/django/conf/locale/es_CO/formats.py +++ b/django/conf/locale/es_CO/formats.py @@ -1,26 +1,26 @@ # This file is distributed under the same license as the Django package. # -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y \a \l\a\s H:i' -YEAR_MONTH_FORMAT = r'F \d\e Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +DATE_FORMAT = r"j \d\e F \d\e Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"j \d\e F \d\e Y \a \l\a\s H:i" +YEAR_MONTH_FORMAT = r"F \d\e Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" FIRST_DAY_OF_WEEK = 1 DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - '%Y%m%d', # '20061025' - + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + "%Y%m%d", # '20061025' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', - '%d/%m/%Y %H:%M:%S.%f', - '%d/%m/%Y %H:%M', - '%d/%m/%y %H:%M:%S', - '%d/%m/%y %H:%M:%S.%f', - '%d/%m/%y %H:%M', + "%d/%m/%Y %H:%M:%S", + "%d/%m/%Y %H:%M:%S.%f", + "%d/%m/%Y %H:%M", + "%d/%m/%y %H:%M:%S", + "%d/%m/%y %H:%M:%S.%f", + "%d/%m/%y %H:%M", ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/es_MX/LC_MESSAGES/django.mo b/django/conf/locale/es_MX/LC_MESSAGES/django.mo index 497ca815c9c4..42f269181b67 100644 Binary files a/django/conf/locale/es_MX/LC_MESSAGES/django.mo and b/django/conf/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/es_MX/LC_MESSAGES/django.po b/django/conf/locale/es_MX/LC_MESSAGES/django.po index 671b67abf432..93b81a439de1 100644 --- a/django/conf/locale/es_MX/LC_MESSAGES/django.po +++ b/django/conf/locale/es_MX/LC_MESSAGES/django.po @@ -2,15 +2,18 @@ # # Translators: # Abe Estrada, 2011-2013 +# Claude Paroz , 2020 +# Gustavo López Hernández, 2022 # Jesús Bautista , 2019-2020 +# Sergio Benitez , 2021 # zodman , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-13 02:18+0000\n" -"Last-Translator: Jesús Bautista \n" +"POT-Creation-Date: 2022-05-17 05:23-0500\n" +"PO-Revision-Date: 2022-07-25 06:49+0000\n" +"Last-Translator: Gustavo López Hernández\n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" "language/es_MX/)\n" "MIME-Version: 1.0\n" @@ -25,8 +28,11 @@ msgstr "afrikáans" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "Árabe argelino" + msgid "Asturian" -msgstr "" +msgstr "Asturiano" msgid "Azerbaijani" msgstr "Azerbaijani" @@ -62,7 +68,7 @@ msgid "German" msgstr "Alemán" msgid "Lower Sorbian" -msgstr "" +msgstr "Bajo sorbio" msgid "Greek" msgstr "Griego" @@ -71,7 +77,7 @@ msgid "English" msgstr "Inglés" msgid "Australian English" -msgstr "" +msgstr "Inglés australiano" msgid "British English" msgstr "Inglés británico" @@ -119,7 +125,7 @@ msgid "Irish" msgstr "Irlandés" msgid "Scottish Gaelic" -msgstr "" +msgstr "Gaélico escocés" msgid "Galician" msgstr "Gallego" @@ -134,13 +140,13 @@ msgid "Croatian" msgstr "Croata" msgid "Upper Sorbian" -msgstr "" +msgstr "Alto sorbio" msgid "Hungarian" msgstr "Húngaro" msgid "Armenian" -msgstr "" +msgstr "Armenio" msgid "Interlingua" msgstr "Interlingua" @@ -148,8 +154,11 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesio" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" msgstr "Islandés" @@ -164,7 +173,7 @@ msgid "Georgian" msgstr "Georgiano" msgid "Kabyle" -msgstr "" +msgstr "Cabilio" msgid "Kazakh" msgstr "Kazajstán" @@ -178,6 +187,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "luxemburgués" @@ -199,6 +211,9 @@ msgstr "Mongol" msgid "Marathi" msgstr "" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "burmés" @@ -262,9 +277,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tailandés" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turco" @@ -296,22 +317,27 @@ msgid "Messages" msgstr "Mensajes" msgid "Site Maps" -msgstr "" +msgstr "Mapas del sitio" msgid "Static Files" msgstr "Archivos Estáticos" msgid "Syndication" +msgstr "Sindicación" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" msgstr "" msgid "That page number is not an integer" -msgstr "" +msgstr "Ese número de página no es un número entero" msgid "That page number is less than 1" -msgstr "" +msgstr "Ese número de página es menor que 1" msgid "That page contains no results" -msgstr "" +msgstr "Esa página no contiene resultados" msgid "Enter a valid value." msgstr "Introduzca un valor válido." @@ -329,11 +355,15 @@ msgstr "Introduzca una dirección de correo electrónico válida." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Introduzca un \"slug\" válido que conste de letras, números, guiones bajos o " +"guiones." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Introduzca un \"slug\" válido que conste de letras Unicode, números, guiones " +"bajos o guiones." msgid "Enter a valid IPv4 address." msgstr "Introduzca una dirección IPv4 válida." @@ -359,6 +389,10 @@ msgstr "Asegúrese de que este valor sea menor o igual a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Asegúrese de que este valor sea mayor o igual a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -381,7 +415,11 @@ msgid_plural "" "Ensure this value has at most %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " +"(tiene %(show_value)d)." msgstr[1] "" +"Asegúrese de que este valor tenga como máximo %(limit_value)d caracteres " +"(tiene %(show_value)d)." msgid "Enter a number." msgstr "Introduzca un número." @@ -389,8 +427,8 @@ msgstr "Introduzca un número." #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Asegúrese de que no hay más de %(max)s dígito en total." +msgstr[1] "Asegúrese de que no hay más de %(max)s dígitos en total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." @@ -413,7 +451,7 @@ msgid "" msgstr "" msgid "Null characters are not allowed." -msgstr "" +msgstr "Caracteres nulos no están permitidos." msgid "and" msgstr "y" @@ -423,9 +461,13 @@ msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "" #, python-format -msgid "Value %(value)r is not a valid choice." +msgid "Constraint “%(name)s” is violated." msgstr "" +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "El valor %(value)r no es una opción válida." + msgid "This field cannot be null." msgstr "Este campo no puede ser nulo." @@ -436,8 +478,8 @@ msgstr "Este campo no puede estar en blanco." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ya existe un/a %(model_name)s con este/a %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -449,7 +491,7 @@ msgstr "Campo tipo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "El valor \"%(value)s\" debe ser Verdadero o Falso. " #, python-format msgid "“%(value)s” value must be either True, False, or None." @@ -470,12 +512,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” : el valor tiene un formato de fecha inválido. Debería estar en " +"el formato YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” : el valor tiene el formato correcto (YYYY-MM-DD) pero es una " +"fecha inválida." msgid "Date (without time)" msgstr "Fecha (sin hora)" @@ -485,6 +531,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"'%(value)s' tiene un formato de fecha no válido. Este valor debe estar en el " +"formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" @@ -534,6 +582,9 @@ msgstr "Entero" msgid "Big (8 byte) integer" msgstr "Entero grande (8 bytes)" +msgid "Small integer" +msgstr "Entero pequeño" + msgid "IPv4 address" msgstr "Dirección IPv4" @@ -547,6 +598,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Entero positivo" @@ -557,9 +611,6 @@ msgstr "Entero positivo pequeño" msgid "Slug (up to %(max_length)s)" msgstr "Slug (hasta %(max_length)s)" -msgid "Small integer" -msgstr "Entero pequeño" - msgid "Text" msgstr "Texto" @@ -582,7 +633,7 @@ msgid "URL" msgstr "URL" msgid "Raw binary data" -msgstr "" +msgstr "Los datos en bruto" #, python-format msgid "“%(value)s” is not a valid UUID." @@ -597,9 +648,15 @@ msgstr "Archivo" msgid "Image" msgstr "Imagen" +msgid "A JSON object" +msgstr "Un objeto JSON" + +msgid "Value must be valid JSON." +msgstr "El valor debe ser JSON válido" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "La instancia de %(model)s con %(field)s %(value)r no existe." msgid "Foreign Key (type determined by related field)" msgstr "Clave foránea (el tipo está determinado por el campo relacionado)" @@ -609,11 +666,11 @@ msgstr "Relación uno-a-uno" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "Relación %(from)s - %(to)s " #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "Relaciones %(from)s - %(to)s" msgid "Many-to-many relationship" msgstr "Relación muchos-a-muchos" @@ -640,11 +697,11 @@ msgid "Enter a valid date/time." msgstr "Introduzca una fecha/hora válida." msgid "Enter a valid duration." -msgstr "" +msgstr "Introduzca una duración válida." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "La cantidad de días debe tener valores entre {min_days} y {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "" @@ -686,7 +743,10 @@ msgid "Enter a complete value." msgstr "Ingrese un valor completo." msgid "Enter a valid UUID." -msgstr "" +msgstr "Ingrese un UUID válido." + +msgid "Enter a valid JSON." +msgstr "Ingresa un JSON válido." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -694,20 +754,23 @@ msgstr ":" #, python-format msgid "(Hidden field %(name)s) %(error)s" -msgstr "" +msgstr "(Campo oculto %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." msgstr[0] "" msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." msgstr[0] "" msgstr[1] "" @@ -773,17 +836,9 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "Año" - -msgid "Month" -msgstr "Mes" - -msgid "Day" -msgstr "Día" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "sí, no, tal vez" +msgstr "sí,no,tal vez" #, python-format msgid "%(size)d byte" @@ -1055,43 +1110,40 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d año" -msgstr[1] "%d años" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d horas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" msgstr "Prohibido" @@ -1101,7 +1153,7 @@ msgstr "" msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1170,7 +1222,7 @@ msgid "No %(verbose_name)s found matching the query" msgstr "No se han encontrado %(verbose_name)s que coincidan con la consulta" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "La página no es \"last\", ni puede ser convertido a un int." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1191,8 +1243,8 @@ msgstr "" msgid "Index of %(directory)s" msgstr "Índice de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "¡La instalación funcionó con éxito! ¡Felicidades!" #, python-format msgid "" @@ -1200,9 +1252,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2020 # Eduardo , 2017 # Leonardo J. Caballero G. , 2016 # Sebastián Magrí, 2011 @@ -9,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Spanish (Venezuela) (http://www.transifex.com/django/django/" "language/es_VE/)\n" "MIME-Version: 1.0\n" @@ -26,6 +27,9 @@ msgstr "Afrikáans" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Asturiano" @@ -149,6 +153,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesio" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -179,6 +186,9 @@ msgstr "Canarés" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luxenburgués" @@ -263,9 +273,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tailandés" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turco" @@ -555,6 +571,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadero, Falso o Nulo)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Entero positivo" @@ -605,6 +624,12 @@ msgstr "Archivo" msgid "Image" msgstr "Imagen" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "la instancia del %(model)s con %(field)s %(value)r no existe." @@ -699,6 +724,9 @@ msgstr "Ingrese un valor completo." msgid "Enter a valid UUID." msgstr "Ingrese un UUID válido." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -783,17 +811,9 @@ msgstr "Sí" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "sí, no, quizás" +msgstr "sí,no,quizás" #, python-format msgid "%(size)d byte" @@ -1100,9 +1120,6 @@ msgid_plural "%d minutes" msgstr[0] "%d minuto" msgstr[1] "%d minutos" -msgid "0 minutes" -msgstr "0 minutos" - msgid "Forbidden" msgstr "Prohibido" diff --git a/django/conf/locale/et/LC_MESSAGES/django.mo b/django/conf/locale/et/LC_MESSAGES/django.mo index 91b5e24393f4..3556bb11e870 100644 Binary files a/django/conf/locale/et/LC_MESSAGES/django.mo and b/django/conf/locale/et/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/et/LC_MESSAGES/django.po b/django/conf/locale/et/LC_MESSAGES/django.po index d934fd91159e..813f3ab71712 100644 --- a/django/conf/locale/et/LC_MESSAGES/django.po +++ b/django/conf/locale/et/LC_MESSAGES/django.po @@ -2,21 +2,22 @@ # # Translators: # eallik , 2011 +# Erlend Eelmets , 2020 # Jannis Leidel , 2011 # Janno Liivak , 2013-2015 # madisvain , 2011 -# Martin Pajuste , 2014-2015 -# Martin Pajuste , 2016-2017,2019 +# Martin , 2014-2015,2021-2024 +# Martin , 2016-2017,2019-2020 # Marti Raudsepp , 2014,2016 # Ragnar Rebase , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-12-28 02:29+0000\n" -"Last-Translator: Ragnar Rebase \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Martin , 2014-2015,2021-2024\n" +"Language-Team: Estonian (http://app.transifex.com/django/django/language/" "et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,6 +31,9 @@ msgstr "afrikaani" msgid "Arabic" msgstr "araabia" +msgid "Algerian Arabic" +msgstr "Alžeeria Araabia" + msgid "Asturian" msgstr "astuuria" @@ -54,6 +58,9 @@ msgstr "bosnia" msgid "Catalan" msgstr "katalaani" +msgid "Central Kurdish (Sorani)" +msgstr "Keskkurdi keel (sorani)" + msgid "Czech" msgstr "tšehhi" @@ -67,7 +74,7 @@ msgid "German" msgstr "saksa" msgid "Lower Sorbian" -msgstr " alamsorbi" +msgstr "alamsorbi" msgid "Greek" msgstr "kreeka" @@ -153,6 +160,9 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indoneesi" +msgid "Igbo" +msgstr "ibo" + msgid "Ido" msgstr "ido" @@ -183,6 +193,9 @@ msgstr "kannada" msgid "Korean" msgstr "korea" +msgid "Kyrgyz" +msgstr "kirgiisi" + msgid "Luxembourgish" msgstr "letseburgi" @@ -204,6 +217,9 @@ msgstr "mongoolia" msgid "Marathi" msgstr "marathi" +msgid "Malay" +msgstr "malai" + msgid "Burmese" msgstr "birma" @@ -267,9 +283,15 @@ msgstr "tamiili" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tadžiki" + msgid "Thai" msgstr "tai" +msgid "Turkmen" +msgstr "türkmeeni" + msgid "Turkish" msgstr "türgi" @@ -279,6 +301,9 @@ msgstr "tatari" msgid "Udmurt" msgstr "udmurdi" +msgid "Uyghur" +msgstr "Uiguuri" + msgid "Ukrainian" msgstr "ukrania" @@ -309,6 +334,11 @@ msgstr "Staatilised failid" msgid "Syndication" msgstr "Sündikeerimine" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "See lehe number ei ole täisarv" @@ -321,6 +351,9 @@ msgstr "See leht ei sisalda tulemusi" msgid "Enter a valid value." msgstr "Sisestage korrektne väärtus." +msgid "Enter a valid domain name." +msgstr "Sisestage korrektne domeeninimi." + msgid "Enter a valid URL." msgstr "Sisestage korrektne URL." @@ -344,14 +377,18 @@ msgstr "" "Sisestage korrektne “nälk”, mis koosneb Unicode tähtedest, numbritest, ala- " "või sidekriipsudest." -msgid "Enter a valid IPv4 address." -msgstr "Sisestage korrektne IPv4 aadress." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Sisestage korrektne %(protocol)s aadress." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Sisestage korrektne IPv6 aadress." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Sisestage korrektne IPv4 või IPv6 aadress." +msgid "IPv4 or IPv6" +msgstr "IPv4 või IPv6" msgid "Enter only digits separated by commas." msgstr "Sisestage ainult komaga eraldatud numbreid." @@ -368,6 +405,16 @@ msgstr "Veendu, et see väärtus on väiksem või võrdne kui %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Veendu, et see väärtus on suurem või võrdne kui %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Veendu, et see väärtus on arvu %(limit_value)s kordne." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -439,6 +486,10 @@ msgstr "ja" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s väljaga %(field_labels)s on juba olemas." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Kitsendust “%(name)s” on rikutud." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Väärtus %(value)r ei ole kehtiv valik." @@ -453,8 +504,8 @@ msgstr "See väli ei saa olla tühi." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Sellise %(field_label)s-väljaga %(model_name)s on juba olemas." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -481,6 +532,9 @@ msgstr "Tõeväärtus (Kas tõene või väär)" msgid "String (up to %(max_length)s)" msgstr "String (kuni %(max_length)s märki)" +msgid "String (unlimited)" +msgstr "String (piiramatu)" + msgid "Comma-separated integers" msgstr "Komaga eraldatud täisarvud" @@ -562,6 +616,9 @@ msgstr "Täisarv" msgid "Big (8 byte) integer" msgstr "Suur (8 baiti) täisarv" +msgid "Small integer" +msgstr "Väike täisarv" + msgid "IPv4 address" msgstr "IPv4 aadress" @@ -575,6 +632,9 @@ msgstr "“%(value)s” väärtus peab olema kas Tühi, Tõene või Väär." msgid "Boolean (Either True, False or None)" msgstr "Tõeväärtus (Kas tõene, väär või tühi)" +msgid "Positive big integer" +msgstr "Positiivne suur täisarv" + msgid "Positive integer" msgstr "Positiivne täisarv" @@ -585,9 +645,6 @@ msgstr "Positiivne väikene täisarv" msgid "Slug (up to %(max_length)s)" msgstr "Nälk (kuni %(max_length)s märki)" -msgid "Small integer" -msgstr "Väike täisarv" - msgid "Text" msgstr "Tekst" @@ -629,6 +686,12 @@ msgstr "Fail" msgid "Image" msgstr "Pilt" +msgid "A JSON object" +msgstr "JSON objekt" + +msgid "Value must be valid JSON." +msgstr "Väärtus peab olema korrektne JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s isendit %(field)s %(value)r ei leidu." @@ -721,6 +784,9 @@ msgstr "Sisestage täielik väärtus." msgid "Enter a valid UUID." msgstr "Sisestage korrektne UUID." +msgid "Enter a valid JSON." +msgstr "Sisestage korrektne JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -729,20 +795,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Peidetud väli %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm andmed on kadunud või nendega on keegi midagi teinud" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Palun kinnitage %d või vähem vormi." -msgstr[1] "Palun kinnitage %d või vähem vormi." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Palun kinnitage kõige rohkem %(num)d vormi." +msgstr[1] "Palun kinnitage kõige rohkem %(num)d vormi." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Palun kinnitage %d või rohkem vormi." -msgstr[1] "Palun kinnitage %d või rohkem vormi." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Palun kinnitage vähemalt %(num)d vormi." +msgstr[1] "Palun kinnitage vähemalt %(num)d vormi." msgid "Order" msgstr "Järjestus" @@ -806,15 +875,7 @@ msgstr "Jah" msgid "No" msgstr "Ei" -msgid "Year" -msgstr "Aasta" - -msgid "Month" -msgstr "Kuu" - -msgid "Day" -msgstr "Päev" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "jah,ei,võib-olla" @@ -1088,43 +1149,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d aasta" -msgstr[1] "%d aastat" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d aasta" +msgstr[1] "%(num)d aastat" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d kuu" -msgstr[1] "%d kuud" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d kuu" +msgstr[1] "%(num)d kuud" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d nädal" -msgstr[1] "%d nädalat" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d nädal" +msgstr[1] "%(num)d nädalat" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d päev" -msgstr[1] "%d päeva" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d päev" +msgstr[1] "%(num)d päeva" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d tund" -msgstr[1] "%d tundi" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d tund" +msgstr[1] "%(num)d tundi" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minutit" - -msgid "0 minutes" -msgstr "0 minutit" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minutit" msgid "Forbidden" msgstr "Keelatud" @@ -1134,7 +1192,7 @@ msgstr "CSRF verifitseerimine ebaõnnestus. Päring katkestati." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1156,8 +1214,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Kui kasutate silti või " "saadate päist “Referrer-Policy: no-referrer”, siis palun eemaldage need. " @@ -1241,8 +1299,8 @@ msgstr "“%(path)s” ei eksisteeri" msgid "Index of %(directory)s" msgstr "%(directory)s sisuloend" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Veebiraamistik tähtaegadega perfektsionistidele." +msgid "The install worked successfully! Congratulations!" +msgstr "Paigaldamine õnnestus! Palju õnne!" #, python-format msgid "" @@ -1252,19 +1310,17 @@ msgstr "" "Vaata release notes Djangole %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Paigaldamine õnnestus! Palju õnne!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Näete seda lehte, kuna teil on määratud DEBUG=True Django seadete failis ja te ei ole ühtki URLi seadistanud." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True Django seadete failis ja te ei ole ühtki " +"URLi seadistanud." msgid "Django Documentation" msgstr "Django dokumentatsioon" diff --git a/django/conf/locale/et/formats.py b/django/conf/locale/et/formats.py index 1e1e458e75ee..3b2d9ba44361 100644 --- a/django/conf/locale/et/formats.py +++ b/django/conf/locale/et/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'G:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "G:i" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = ' ' # Non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = " " # Non-breaking space # NUMBER_GROUPING = diff --git a/django/conf/locale/eu/LC_MESSAGES/django.mo b/django/conf/locale/eu/LC_MESSAGES/django.mo index 3394c40cf006..031ad4349655 100644 Binary files a/django/conf/locale/eu/LC_MESSAGES/django.mo and b/django/conf/locale/eu/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/eu/LC_MESSAGES/django.po b/django/conf/locale/eu/LC_MESSAGES/django.po index ffaa5502390c..f3e91a8677db 100644 --- a/django/conf/locale/eu/LC_MESSAGES/django.po +++ b/django/conf/locale/eu/LC_MESSAGES/django.po @@ -2,23 +2,25 @@ # # Translators: # Aitzol Naberan , 2013,2016 -# Ander Martínez , 2013-2014 -# Eneko Illarramendi , 2017-2019 +# Ander Martinez , 2013-2014 +# Eneko Illarramendi , 2017-2019,2021-2022,2024 # Jannis Leidel , 2011 # jazpillaga , 2011 # julen, 2011-2012 # julen, 2013,2015 +# Mikel Maldonado , 2021 # totorika93 , 2012 -# Unai Zalakain , 2013 +# 67feb0cba3962a6c9f09eb0e43697461_528661a , 2013 # Urtzi Odriozola , 2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Eneko Illarramendi , " +"2017-2019,2021-2022,2024\n" +"Language-Team: Basque (http://app.transifex.com/django/django/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -31,6 +33,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabiera" +msgid "Algerian Arabic" +msgstr "Algeriar Arabiera" + msgid "Asturian" msgstr "Asturiera" @@ -55,6 +60,9 @@ msgstr "Bosniera" msgid "Catalan" msgstr "Katalana" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Txekiera" @@ -154,6 +162,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesiera" +msgid "Igbo" +msgstr "Igboera" + msgid "Ido" msgstr "Ido" @@ -184,6 +195,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreera" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luxenburgera" @@ -205,6 +219,9 @@ msgstr "Mongoliera" msgid "Marathi" msgstr "Marathera" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Birmaniera" @@ -268,9 +285,15 @@ msgstr "Tamilera" msgid "Telugu" msgstr "Telugua" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Thailandiera" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turkiera" @@ -280,6 +303,9 @@ msgstr "Tatarera" msgid "Udmurt" msgstr "Udmurtera" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrainera" @@ -310,6 +336,11 @@ msgstr "Fitxategi estatikoak" msgid "Syndication" msgstr "Sindikazioa" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Orrialde hori ez da zenbaki bat" @@ -322,6 +353,9 @@ msgstr "Orrialde horrek ez du emaitzarik" msgid "Enter a valid value." msgstr "Idatzi baleko balio bat." +msgid "Enter a valid domain name." +msgstr "" + msgid "Enter a valid URL." msgstr "Idatzi baleko URL bat." @@ -341,14 +375,18 @@ msgid "" "hyphens." msgstr "" -msgid "Enter a valid IPv4 address." -msgstr "Idatzi baleko IPv4 sare-helbide bat." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "" + +msgid "IPv4" +msgstr "" -msgid "Enter a valid IPv6 address." -msgstr "Idatzi baleko IPv6 sare-helbide bat." +msgid "IPv6" +msgstr "" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Idatzi baleko IPv4 edo IPv6 sare-helbide bat." +msgid "IPv4 or IPv6" +msgstr "" msgid "Enter only digits separated by commas." msgstr "Idatzi komaz bereizitako digitoak soilik." @@ -366,6 +404,16 @@ msgstr "Ziurtatu balio hau %(limit_value)s baino txikiagoa edo berdina dela." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Ziurtatu balio hau %(limit_value)s baino handiagoa edo berdina dela." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -433,6 +481,10 @@ msgstr "eta" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s hauek dauzkan %(model_name)s dagoeneko existitzen da." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r balioa ez da baleko aukera bat." @@ -447,8 +499,8 @@ msgstr "Eremu honek ezin du hutsik egon." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(field_label)s hori daukan %(model_name)s dagoeneko existitzen da." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -461,11 +513,11 @@ msgstr "Eremuaren mota: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "\"%(value)s\" blioa True edo False izan behar da." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "\"%(value)s\" balioa, True, False edo None izan behar da." msgid "Boolean (Either True or False)" msgstr "Boolearra (True edo False)" @@ -474,6 +526,9 @@ msgstr "Boolearra (True edo False)" msgid "String (up to %(max_length)s)" msgstr "String-a (%(max_length)s gehienez)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Komaz bereiztutako zenbaki osoak" @@ -482,12 +537,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"\"%(value)s\" balioa data formatu okerra dauka. UUUU-HH-EE formatua izan " +"behar da." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"\"%(value)s\" balioa formatu egokia dauka (UUUU-HH-EE), baina data okerra." msgid "Date (without time)" msgstr "Data (ordurik gabe)" @@ -509,7 +567,7 @@ msgstr "Data (orduarekin)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "\"%(value)s\" balioa zenbaki hamartarra izan behar da." msgid "Decimal number" msgstr "Zenbaki hamartarra" @@ -519,6 +577,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"\"%(value)s\" balioa formatu okerra dauka. [EE][[OO:]MM:]ss[.uuuuuu] " +"formatua izan behar du." msgid "Duration" msgstr "Iraupena" @@ -531,14 +591,14 @@ msgstr "Fitxategiaren bidea" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "\"%(value)s\" float izan behar da." msgid "Floating point number" msgstr "Koma higikorreko zenbakia (float)" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "\"%(value)s\" zenbaki osoa izan behar da." msgid "Integer" msgstr "Zenbaki osoa" @@ -546,6 +606,9 @@ msgstr "Zenbaki osoa" msgid "Big (8 byte) integer" msgstr "Zenbaki osoa (handia 8 byte)" +msgid "Small integer" +msgstr "Osoko txikia" + msgid "IPv4 address" msgstr "IPv4 sare-helbidea" @@ -554,11 +617,14 @@ msgstr "IP helbidea" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "\"%(value)s\" None, True edo False izan behar da." msgid "Boolean (Either True, False or None)" msgstr "Boolearra (True, False edo None)" +msgid "Positive big integer" +msgstr "Zenbaki positivo osoa-handia" + msgid "Positive integer" msgstr "Osoko positiboa" @@ -569,9 +635,6 @@ msgstr "Osoko positibo txikia" msgid "Slug (up to %(max_length)s)" msgstr "Slug (gehienez %(max_length)s)" -msgid "Small integer" -msgstr "Osoko txikia" - msgid "Text" msgstr "Testua" @@ -609,6 +672,12 @@ msgstr "Fitxategia" msgid "Image" msgstr "Irudia" +msgid "A JSON object" +msgstr "JSON objektu bat" + +msgid "Value must be valid JSON." +msgstr "Balioa baliozko JSON bat izan behar da." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -703,6 +772,9 @@ msgstr "Sartu balio osoa." msgid "Enter a valid UUID." msgstr "Idatzi baleko UUID bat." +msgid "Enter a valid JSON." +msgstr "Sartu baliozko JSON bat" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -711,20 +783,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(%(name)s eremu ezkutua) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm daturik ez dago edo ez da balekoa." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Bidali formulario %d edo gutxiago, mesedez." -msgstr[1] "Bidali %d formulario edo gutxiago, mesedez." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Gehitu formulario %d edo gehiago" -msgstr[1] "Bidali %d formulario edo gehiago, mesedez." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" msgid "Order" msgstr "Ordena" @@ -785,15 +860,7 @@ msgstr "Bai" msgid "No" msgstr "Ez" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "bai,ez,agian" @@ -1067,43 +1134,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "urte %d" -msgstr[1] "%d urte" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "urte %(num)d" +msgstr[1] "%(num)d urte" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "hilabete %d" -msgstr[1] "%d hilabete" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "hilabete %(num)d" +msgstr[1] "%(num)d hilabete" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "aste %d" -msgstr[1] "%d aste" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "aste %(num)d" +msgstr[1] "%(num)d aste" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "egun %d" -msgstr[1] "%d egun" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "egun %(num)d" +msgstr[1] "%(num)d egun" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "ordu %d" -msgstr[1] "%d ordu" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "ordu %(num)d" +msgstr[1] "%(num)d ordu" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "minutu %d" -msgstr[1] "%d minutu" - -msgid "0 minutes" -msgstr "0 minutu" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "minutu %(num)d" +msgstr[1] "%(num)d minutu" msgid "Forbidden" msgstr "Debekatuta" @@ -1113,7 +1177,7 @@ msgstr "CSRF egiaztapenak huts egin du. Eskaera abortatu da." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1128,8 +1192,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" msgid "" @@ -1200,14 +1264,14 @@ msgstr "Direktorio zerrendak ez daude baimenduak." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" ez da existitzen" #, python-format msgid "Index of %(directory)s" msgstr "%(directory)s zerrenda" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: epeekin perfekzionistak direnentzat Web frameworka." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!" #, python-format msgid "" @@ -1218,20 +1282,17 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">argitaratze " "oharrak" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalazioak arrakastaz funtzionatu du! Zorionak!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Zure settings fitxategian DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako ari zara " -"ikusten orrialde hau." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True jarrita eta URLrik konfiguratu gabe duzulako " +"ari zara ikusten orrialde hau." msgid "Django Documentation" msgstr "Django dokumentazioa" diff --git a/django/conf/locale/eu/formats.py b/django/conf/locale/eu/formats.py index 33e6305352f4..61b16fbc6f69 100644 --- a/django/conf/locale/eu/formats.py +++ b/django/conf/locale/eu/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'Y\k\o N j\a' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'Y\k\o N j\a, H:i' -YEAR_MONTH_FORMAT = r'Y\k\o F' -MONTH_DAY_FORMAT = r'F\r\e\n j\a' -SHORT_DATE_FORMAT = 'Y-m-d' -SHORT_DATETIME_FORMAT = 'Y-m-d H:i' +DATE_FORMAT = r"Y\k\o N j\a" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"Y\k\o N j\a, H:i" +YEAR_MONTH_FORMAT = r"Y\k\o F" +MONTH_DAY_FORMAT = r"F\r\e\n j\a" +SHORT_DATE_FORMAT = "Y-m-d" +SHORT_DATETIME_FORMAT = "Y-m-d H:i" FIRST_DAY_OF_WEEK = 1 # Astelehena # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/fa/LC_MESSAGES/django.mo b/django/conf/locale/fa/LC_MESSAGES/django.mo index 0c539c5e13a8..c131325ee156 100644 Binary files a/django/conf/locale/fa/LC_MESSAGES/django.mo and b/django/conf/locale/fa/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/fa/LC_MESSAGES/django.po b/django/conf/locale/fa/LC_MESSAGES/django.po index d631951f0049..440cf8e3d0ac 100644 --- a/django/conf/locale/fa/LC_MESSAGES/django.po +++ b/django/conf/locale/fa/LC_MESSAGES/django.po @@ -1,15 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Ahmad Hosseini , 2020 +# alirezamastery , 2021 +# ali salehi, 2023 # Ali Vakilzade , 2015 # Arash Fazeli , 2012 # Eric Hamiter , 2019 +# Eshagh , 2022 +# Farshad Asadpour, 2021 # Jannis Leidel , 2011 +# Mariusz Felisiak , 2021 # Mazdak Badakhshan , 2014 # Milad Hazrati , 2019 # MJafar Mashhadi , 2018 # Mohammad Hossein Mojtahedi , 2013,2019 # Pouya Abbassi, 2016 +# Pouya Abbassi, 2016 +# rahim agh , 2020-2021 # Reza Mohammadi , 2013-2016 # Saeed , 2011 # Sina Cheraghi , 2011 @@ -17,10 +25,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: ali salehi, 2023\n" +"Language-Team: Persian (http://app.transifex.com/django/django/language/" "fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,6 +42,9 @@ msgstr "آفریکانس" msgid "Arabic" msgstr "عربی" +msgid "Algerian Arabic" +msgstr "عربی الجزایری" + msgid "Asturian" msgstr "آستوری" @@ -58,6 +69,9 @@ msgstr "بوسنیایی" msgid "Catalan" msgstr "کاتالونیایی" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "چکی" @@ -128,7 +142,7 @@ msgid "Irish" msgstr "ایرلندی" msgid "Scottish Gaelic" -msgstr "اسکاتلندی" +msgstr "گیلیک اسکاتلندی" msgid "Galician" msgstr "گالیسیایی" @@ -157,6 +171,9 @@ msgstr "اینترلینگوا" msgid "Indonesian" msgstr "اندونزیایی" +msgid "Igbo" +msgstr "ایگبو" + msgid "Ido" msgstr "ایدو" @@ -187,6 +204,9 @@ msgstr "کناده‌ای" msgid "Korean" msgstr "کره‌ای" +msgid "Kyrgyz" +msgstr "قرقیزی" + msgid "Luxembourgish" msgstr "لوگزامبورگی" @@ -208,6 +228,9 @@ msgstr "مغولی" msgid "Marathi" msgstr "مِراتی" +msgid "Malay" +msgstr "Malay" + msgid "Burmese" msgstr "برمه‌ای" @@ -271,9 +294,15 @@ msgstr "تامیلی" msgid "Telugu" msgstr "تلوگویی" +msgid "Tajik" +msgstr "تاجیک" + msgid "Thai" msgstr "تایلندی" +msgid "Turkmen" +msgstr "ترکمن" + msgid "Turkish" msgstr "ترکی" @@ -283,6 +312,9 @@ msgstr "تاتار" msgid "Udmurt" msgstr "ادمورت" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "اکراینی" @@ -290,7 +322,7 @@ msgid "Urdu" msgstr "اردو" msgid "Uzbek" -msgstr "" +msgstr "ازبکی" msgid "Vietnamese" msgstr "ویتنامی" @@ -313,11 +345,16 @@ msgstr "پرونده‌های استاتیک" msgid "Syndication" msgstr "پیوند" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" -msgstr "شمارهٔ صفحه باید یک عدد باشد" +msgstr "شمارهٔ صفحه یک عدد طبیعی نیست" msgid "That page number is less than 1" -msgstr "شمارهٔ صفحه باید بزرگتر از ۱ باشد" +msgstr "شمارهٔ صفحه کوچکتر از ۱ است" msgid "That page contains no results" msgstr "این صفحه خالی از اطلاعات است" @@ -338,11 +375,14 @@ msgstr "یک ایمیل آدرس معتبر وارد کنید." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"یک \"اسلاگ\" معتبر متشکل از حروف، اعداد، خط زیر یا خط فاصله، وارد کنید. " msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"یک \"اسلاگ\" معتبر وارد کنید که شامل حروف یونیکد، اعداد، خط زیر یا خط فاصله " +"باشد." msgid "Enter a valid IPv4 address." msgstr "یک نشانی IPv4 معتبر وارد کنید." @@ -368,6 +408,16 @@ msgstr "مطمئن شوید این مقدار کوچکتر و یا مساوی %( msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "مطمئن شوید این مقدار بزرگتر و یا مساوی %(limit_value)s است." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -424,6 +474,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"استفاده از پرونده با پسوند '%(extension)s' مجاز نیست. پسوند‌های مجاز عبارتند " +"از: '%(allowed_extensions)s'" msgid "Null characters are not allowed." msgstr "کاراکترهای تهی مجاز نیستند." @@ -435,6 +487,10 @@ msgstr "و" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "‏%(model_name)s با این %(field_labels)s وجود دارد." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "مقدار %(value)r انتخاب معتبری نیست. " @@ -449,8 +505,8 @@ msgstr "این فیلد نمی تواند خالی باشد." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s با این %(field_label)s از قبل موجود است." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -463,11 +519,11 @@ msgstr "فیلد با نوع: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "مقدار «%(value)s» باید True یا False باشد." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "مقدار «%(value)s» باید True یا False یا None باشد." msgid "Boolean (Either True or False)" msgstr "بولی (درست یا غلط)" @@ -476,6 +532,9 @@ msgstr "بولی (درست یا غلط)" msgid "String (up to %(max_length)s)" msgstr "رشته (تا %(max_length)s)" +msgid "String (unlimited)" +msgstr "رشته (بی نهایت)" + msgid "Comma-separated integers" msgstr "اعداد صحیح جدا-شده با ویلگول" @@ -484,12 +543,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"مقدار «%(value)s» در قالب نادرستی وارد شده است. تاریخ باید در قالب YYYY-MM-" +"DD باشد." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"مقدار تاریخ «%(value)s» با اینکه در قالب درستی (YYYY-MM-DD) است ولی تاریخ " +"ناممکنی را نشان می‌دهد." msgid "Date (without time)" msgstr "تاریخ (بدون زمان)" @@ -499,19 +562,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"مقدار \"%(value)s\" یک قالب نامعتبر دارد. باید در قالب YYYY-MM-DD HH:MM[:" +"ss[.uuuuuu]][TZ] باشد." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"مقدار \"%(value)s\" یک قالب معتبر دارد (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"اما یک تاریخ/زمان نامعتبر است." msgid "Date (with time)" msgstr "تاریخ (با زمان)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "مقدار '%(value)s' باید عدد دسیمال باشد." msgid "Decimal number" msgstr "عدد دهدهی" @@ -521,6 +588,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب ‎[DD] [HH:" +"[MM:]]ss[.uuuuuu]‎ باشد." msgid "Duration" msgstr "بازهٔ زمانی" @@ -533,14 +602,14 @@ msgstr "مسیر پرونده" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "مقدار «%(value)s» باید عدد اعشاری فلوت باشد." msgid "Floating point number" msgstr "عدد اعشاری" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "مقدار «%(value)s» باید عدد حقیقی باشد." msgid "Integer" msgstr "عدد صحیح" @@ -548,6 +617,9 @@ msgstr "عدد صحیح" msgid "Big (8 byte) integer" msgstr "بزرگ (8 بایت) عدد صحیح" +msgid "Small integer" +msgstr "عدد صحیح کوچک" + msgid "IPv4 address" msgstr "IPv4 آدرس" @@ -556,11 +628,14 @@ msgstr "نشانی IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "مقدار «%(value)s» باید True یا False یا None باشد." msgid "Boolean (Either True, False or None)" msgstr "‌بولی (درست، نادرست یا پوچ)" +msgid "Positive big integer" +msgstr "عدد صحیح مثبت" + msgid "Positive integer" msgstr "عدد صحیح مثبت" @@ -571,9 +646,6 @@ msgstr "مثبت عدد صحیح کوچک" msgid "Slug (up to %(max_length)s)" msgstr "تیتر (حداکثر %(max_length)s)" -msgid "Small integer" -msgstr "عدد صحیح کوچک" - msgid "Text" msgstr "متن" @@ -582,12 +654,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"مقدار «%(value)s» در قالب نادرستی وارد شده است. باید در قالب HH:MM[:ss[." +"uuuuuu]]‎ باشد." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"مقدار «%(value)s» با اینکه در قالب درستی (HH:MM[:ss[.uuuuuu]]‎) است ولی زمان " +"ناممکنی را نشان می‌دهد." msgid "Time" msgstr "زمان" @@ -600,7 +676,7 @@ msgstr "دادهٔ دودویی خام" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "\"%(value)s\" یک UUID معتبر نیست." msgid "Universally unique identifier" msgstr "شناسه منحصر به فرد سراسری" @@ -611,6 +687,12 @@ msgstr "پرونده" msgid "Image" msgstr "تصویر" +msgid "A JSON object" +msgstr "یک شیء JSON" + +msgid "Value must be valid JSON." +msgstr "مقدار، باید یک JSON معتبر باشد." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s با %(field)s %(value)r وجود ندارد." @@ -701,6 +783,9 @@ msgstr "یک مقدار کامل وارد کنید." msgid "Enter a valid UUID." msgstr "یک UUID معتبر وارد کنید." +msgid "Enter a valid JSON." +msgstr "یک JSON معتبر وارد کنید" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -709,20 +794,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(فیلد پنهان %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "اطلاعات ManagementForm ناقص است و یا دستکاری شده است." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"اطلاعات ManagementForm مفقود یا دستکاری شده است. ردیف های مفقود شده: " +"%(field_names)s. اگر این مشکل ادامه داشت، آن را گزارش کنید." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "لطفاً %d یا کمتر فرم بفرستید." -msgstr[1] "لطفاً %d یا کمتر فرم بفرستید." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "لطفاً %d یا بیشتر فرم بفرستید." -msgstr[1] "لطفاً %d یا بیشتر فرم بفرستید." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" msgid "Order" msgstr "ترتیب:" @@ -757,13 +847,15 @@ msgstr "یک گزینهٔ معتبر انتخاب کنید. آن گزینه از #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" یک مقدار معتبر نیست." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)sدر محدوده زمانی %(current_timezone)s، قابل تفسیر نیست؛ ممکن است " +"نامشخص باشد یا اصلاً وجود نداشته باشد." msgid "Clear" msgstr "پاک کردن" @@ -783,15 +875,7 @@ msgstr "بله" msgid "No" msgstr "خیر" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "بله،خیر،شاید" @@ -1055,7 +1139,7 @@ msgstr "این مقدار آدرس IPv6 معتبری نیست." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "یا" @@ -1065,43 +1149,40 @@ msgid ", " msgstr "،" #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d سال" -msgstr[1] "%d سال" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d سال" +msgstr[1] "%(num)d سال" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ماه" -msgstr[1] "%d ماه" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d ماه" +msgstr[1] "%(num)d ماه" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d هفته" -msgstr[1] "%d هفته" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d هفته" +msgstr[1] "%(num)d هفته" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d روز" -msgstr[1] "%d روز" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d روز" +msgstr[1] "%(num)d روز" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ساعت" -msgstr[1] "%d ساعت" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d ساعت" +msgstr[1] "%(num)d ساعت" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d دقیقه" -msgstr[1] "%d دقیقه" - -msgid "0 minutes" -msgstr "0 دقیقه" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d دقیقه" +msgstr[1] "%(num)d دقیقه" msgid "Forbidden" msgstr "ممنوع" @@ -1111,24 +1192,37 @@ msgstr "‏CSRF تأیید نشد. درخواست لغو شد." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"شما این پیغام را مشاهده میکنید برای اینکه این HTTPS site نیازمند یک " +"\"Referer header\" برای ارسال توسط مرورگر شما دارد،‌اما مقداری ارسال " +"نمیشود . این هدر الزامی میباشد برای امنیت ، در واقع برای اینکه مرورگر شما " +"مطمین شود hijack به عنوان نفر سوم (third parties) در میان نیست" msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"اگر در مرورگر خود سر تیتر \"Referer\" را غیرفعال کرده‌اید، لطفاً آن را فعال " +"کنید، یا حداقل برای این وب‌گاه یا برای ارتباطات HTTPS و یا برای درخواست‌های " +"\"Same-origin\" فعال کنید." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"اگر شما از تگ استفاده " +"می‌کنید یا سر تیتر \"Referrer-Policy: no-referrer\" را اضافه کرده‌اید، لطفاً " +"آن را حذف کنید. محافظ CSRF به سرتیتر \"Referer\" نیاز دارد تا بتواند بررسی " +"سخت‌گیرانه ارجاع دهنده را انجام دهد. اگر ملاحظاتی در مورد حریم خصوصی دارید از " +"روش‎‌های جایگزین مانند برای ارجاع دادن به وب‌گاه‌های " +"شخص ثالث استفاده کنید." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1143,6 +1237,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"اگر مرورگر خود را تنظیم کرده‌اید که کوکی غیرفعال باشد، لطفاً مجدداً آن را فعال " +"کنید؛ حداقل برای این وب‌گاه یا برای درخواست‌های \"same-origin\"." msgid "More information is available with DEBUG=True." msgstr "اطلاعات بیشتر با DEBUG=True ارائه خواهد شد." @@ -1176,14 +1272,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "نوشته تاریخ \"%(datestr)s\" در قالب \"%(format)s\" نامعتبر است" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "هیچ %(verbose_name)s ای مطابق جستجو پیدا نشد." msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "صفحه \"آخرین\" نیست یا شماره صفحه قابل ترجمه به یک عدد صحیح نیست." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1191,21 +1287,21 @@ msgstr "صفحه‌ی اشتباه (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "لیست خالی و \"%(class_name)s.allow_empty\" برابر False است." msgid "Directory indexes are not allowed here." msgstr "شاخص دایرکتوری اینجا قابل قبول نیست." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" وجود ندارد " #, python-format msgid "Index of %(directory)s" msgstr "فهرست %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "جنگو: فریمورک وب برای کمال گرایانی که محدودیت زمانی دارند." +msgid "The install worked successfully! Congratulations!" +msgstr "نصب درست کار کرد. تبریک می گویم!" #, python-format msgid "" @@ -1216,26 +1312,23 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">release notes برای نسخه %(version)s " "جنگو" -msgid "The install worked successfully! Congratulations!" -msgstr "نصب درست کار کرد. تبریک می گویم!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "شما این صفحه را به این دلیل مشاهده می کنید که DEBUG=True در فایل تنظیمات شما وجود دارد و شما هیچ URL " +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True در فایل تنظیمات شما وجود دارد و شما هیچ URL " "تنظیم نکرده اید." msgid "Django Documentation" msgstr "مستندات جنگو" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "سرفصل‌ها، منابع و دستورالعمل‌ها" msgid "Tutorial: A Polling App" msgstr "آموزش گام به گام: برنامکی برای رأی‌گیری" diff --git a/django/conf/locale/fa/formats.py b/django/conf/locale/fa/formats.py index c8666f7a035d..e7019bc7a67f 100644 --- a/django/conf/locale/fa/formats.py +++ b/django/conf/locale/fa/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j F Y، ساعت G:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'Y/n/j' -SHORT_DATETIME_FORMAT = 'Y/n/j،‏ G:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j F Y، ساعت G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y/n/j" +SHORT_DATETIME_FORMAT = "Y/n/j،‏ G:i" FIRST_DAY_OF_WEEK = 6 # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," # NUMBER_GROUPING = diff --git a/django/conf/locale/fi/LC_MESSAGES/django.mo b/django/conf/locale/fi/LC_MESSAGES/django.mo index 259e1d2792b0..1a15cef9182e 100644 Binary files a/django/conf/locale/fi/LC_MESSAGES/django.mo and b/django/conf/locale/fi/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/fi/LC_MESSAGES/django.po b/django/conf/locale/fi/LC_MESSAGES/django.po index c84aee9fbb4f..afea4268e407 100644 --- a/django/conf/locale/fi/LC_MESSAGES/django.po +++ b/django/conf/locale/fi/LC_MESSAGES/django.po @@ -1,20 +1,21 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Aarni Koskela, 2015,2017-2018,2020 +# Aarni Koskela, 2015,2017-2018,2020-2022 # Antti Kaihola , 2011 # Jannis Leidel , 2011 +# Jiri Grönroos , 2021,2023 # Lasse Liehu , 2015 # Mika Mäkelä , 2018 -# Klaus Dahlén , 2011 +# Klaus Dahlén, 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-21 09:38+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: Jiri Grönroos , 2021,2023\n" +"Language-Team: Finnish (http://app.transifex.com/django/django/language/" "fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,6 +29,9 @@ msgstr "afrikaans" msgid "Arabic" msgstr "arabia" +msgid "Algerian Arabic" +msgstr "Algerian arabia" + msgid "Asturian" msgstr "asturian kieli" @@ -52,6 +56,9 @@ msgstr "bosnia" msgid "Catalan" msgstr "katalaani" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "tšekki" @@ -122,7 +129,7 @@ msgid "Irish" msgstr "irlanti" msgid "Scottish Gaelic" -msgstr "Skottilainen gaeli" +msgstr "skottilainen gaeli" msgid "Galician" msgstr "galicia" @@ -151,6 +158,9 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indonesia" +msgid "Igbo" +msgstr "igbo" + msgid "Ido" msgstr "ido" @@ -173,7 +183,7 @@ msgid "Kazakh" msgstr "kazakin kieli" msgid "Khmer" -msgstr "khmer" +msgstr "khmerin kieli" msgid "Kannada" msgstr "kannada" @@ -181,6 +191,9 @@ msgstr "kannada" msgid "Korean" msgstr "korea" +msgid "Kyrgyz" +msgstr "kirgiisi" + msgid "Luxembourgish" msgstr "luxemburgin kieli" @@ -202,6 +215,9 @@ msgstr "mongolia" msgid "Marathi" msgstr "marathi" +msgid "Malay" +msgstr "malaiji" + msgid "Burmese" msgstr "burman kieli" @@ -265,9 +281,15 @@ msgstr "tamili" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tadžikki" + msgid "Thai" msgstr "thain kieli" +msgid "Turkmen" +msgstr "turkmeeni" + msgid "Turkish" msgstr "turkki" @@ -277,6 +299,9 @@ msgstr "tataarin kieli" msgid "Udmurt" msgstr "udmurtti" +msgid "Uyghur" +msgstr "uiguuri" + msgid "Ukrainian" msgstr "ukraina" @@ -307,6 +332,11 @@ msgstr "Staattiset tiedostot" msgid "Syndication" msgstr "Syndikointi" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Annettu sivunumero ei ole kokonaisluku" @@ -332,15 +362,15 @@ msgstr "Syötä kelvollinen sähköpostiosoite." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Tässä voidaan käyttää vain kirjaimia, numeroita sekä ala- ja tavuviivoja (_ " -"-)." +"Anna lyhytnimi joka koostuu vain kirjaimista, numeroista sekä ala- ja " +"tavuviivoista." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" -"Tässä voidaan käyttää vain Unicode-kirjaimia, numeroita sekä ala- ja " -"tavuviivoja." +"Anna lyhytnimi joka koostuu vain Unicode-kirjaimista, numeroista sekä ala- " +"ja tavuviivoista." msgid "Enter a valid IPv4 address." msgstr "Syötä kelvollinen IPv4-osoite." @@ -352,7 +382,7 @@ msgid "Enter a valid IPv4 or IPv6 address." msgstr "Syötä kelvollinen IPv4- tai IPv6-osoite." msgid "Enter only digits separated by commas." -msgstr "Vain pilkulla erotetut kokonaisluvut kelpaavat tässä." +msgstr "Vain pilkulla erotetut numeromerkit kelpaavat tässä." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." @@ -366,6 +396,16 @@ msgstr "Tämän arvon on oltava enintään %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Tämän luvun on oltava vähintään %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Varmista, että arvo on askelkoon %(limit_value)smonikerta. " + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -437,6 +477,10 @@ msgstr "ja" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s jolla on nämä %(field_labels)s on jo olemassa." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Rajoitetta \"%(name)s\" loukataan." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Arvo %(value)r ei kelpaa." @@ -451,8 +495,8 @@ msgstr "Tämä kenttä ei voi olla tyhjä." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s jolla on tämä %(field_label)s, on jo olemassa." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -479,6 +523,9 @@ msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)" msgid "String (up to %(max_length)s)" msgstr "Merkkijono (enintään %(max_length)s merkkiä)" +msgid "String (unlimited)" +msgstr "Merkkijono (rajoittamaton)" + msgid "Comma-separated integers" msgstr "Pilkulla erotetut kokonaisluvut" @@ -559,6 +606,9 @@ msgstr "Kokonaisluku" msgid "Big (8 byte) integer" msgstr "Suuri (8-tavuinen) kokonaisluku" +msgid "Small integer" +msgstr "Pieni kokonaisluku" + msgid "IPv4 address" msgstr "IPv4-osoite" @@ -572,6 +622,9 @@ msgstr "%(value)s-arvo tulee olla joko ei mitään, tosi tai epätosi." msgid "Boolean (Either True, False or None)" msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)" +msgid "Positive big integer" +msgstr "Suuri positiivinen kokonaisluku" + msgid "Positive integer" msgstr "Positiivinen kokonaisluku" @@ -582,9 +635,6 @@ msgstr "Pieni positiivinen kokonaisluku" msgid "Slug (up to %(max_length)s)" msgstr "Lyhytnimi (enintään %(max_length)s merkkiä)" -msgid "Small integer" -msgstr "Pieni kokonaisluku" - msgid "Text" msgstr "Tekstiä" @@ -624,6 +674,12 @@ msgstr "Tiedosto" msgid "Image" msgstr "Kuva" +msgid "A JSON object" +msgstr "JSON-tietue" + +msgid "Value must be valid JSON." +msgstr "Arvon pitää olla kelvollista JSONia." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s-tietuetta %(field)s-kentällä %(value)r ei ole olemassa." @@ -632,7 +688,7 @@ msgid "Foreign Key (type determined by related field)" msgstr "Vierasavain (tyyppi määräytyy liittyvän kentän mukaan)" msgid "One-to-one relationship" -msgstr "Yksi-yhteen relaatio" +msgstr "Yksi-yhteen -relaatio" #, python-format msgid "%(from)s-%(to)s relationship" @@ -643,7 +699,7 @@ msgid "%(from)s-%(to)s relationships" msgstr "%(from)s-%(to)s -suhteet" msgid "Many-to-many relationship" -msgstr "Moni-moneen relaatio" +msgstr "Moni-moneen -relaatio" #. Translators: If found as last label character, these punctuation #. characters will prevent the default label_suffix to be appended to the @@ -715,6 +771,9 @@ msgstr "Syötä kokonainen arvo." msgid "Enter a valid UUID." msgstr "Syötä oikea UUID." +msgid "Enter a valid JSON." +msgstr "Syötä oikea JSON-arvo." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -723,20 +782,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Piilokenttä %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm-tiedot puuttuvat tai niitä on muutettu" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-tiedot puuttuvat tai niitä on muutettu. Puuttuvat kentät ovat " +"%(field_names)s. Jos ongelma toistuu, voi olla että joudut raportoimaan " +"tämän bugina." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Lähetä enintään %d lomake." -msgstr[1] "Lähetä enintään %d lomaketta." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Lähetä enintään%(num)d lomake." +msgstr[1] "Lähetä enintään %(num)d lomaketta." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Lähetä vähintään %d lomake." -msgstr[1] "Lähetä vähintään %d lomaketta." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Lähetä vähintään %(num)d lomake." +msgstr[1] "Lähetä vähintään %(num)d lomaketta. " msgid "Order" msgstr "Järjestys" @@ -761,7 +826,7 @@ msgstr "" "for the %(lookup)s in %(date_field)s." msgid "Please correct the duplicate values below." -msgstr "Korjaa allaolevat kaksoisarvot." +msgstr "Korjaa alla olevat kaksoisarvot." msgid "The inline value did not match the parent instance." msgstr "Liittyvä arvo ei vastannut vanhempaa instanssia." @@ -799,15 +864,7 @@ msgstr "Kyllä" msgid "No" msgstr "Ei" -msgid "Year" -msgstr "Vuosi" - -msgid "Month" -msgstr "Kuukausi" - -msgid "Day" -msgstr "Päivä" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "kyllä,ei,ehkä" @@ -1081,43 +1138,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d vuosi" -msgstr[1] "%d vuotta" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d vuosi" +msgstr[1] "%(num)d vuotta" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d kuukausi" -msgstr[1] "%d kuukautta" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d kuukausi" +msgstr[1] "%(num)d kuukautta " #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d viikko" -msgstr[1] "%d viikkoa" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d viikko" +msgstr[1] "%(num)d viikkoa" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d päivä" -msgstr[1] "%d päivää" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d päivä" +msgstr[1] "%(num)d päivää" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d tunti" -msgstr[1] "%d tuntia" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d tunti" +msgstr[1] "%(num)d tuntia" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuutti" -msgstr[1] "%d minuuttia" - -msgid "0 minutes" -msgstr "0 minuuttia" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuutti" +msgstr[1] "%(num)d minuuttia" msgid "Forbidden" msgstr "Kielletty" @@ -1127,7 +1181,7 @@ msgstr "CSRF-vahvistus epäonnistui. Pyyntö hylätty." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1149,8 +1203,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Jos käytät -tagia tai " "\"Referrer-Policy: no-referrer\" -otsaketta, ole hyvä ja poista ne. CSRF-" @@ -1235,30 +1289,29 @@ msgstr "\"%(path)s\" ei ole olemassa" msgid "Index of %(directory)s" msgstr "Hakemistolistaus: %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "Asennus toimi! Onneksi olkoon!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"Katso Django %(version)s julkaisutiedot" - -msgid "The install worked successfully! Congratulations!" -msgstr "Asennus toimi! Onneksi olkoon!" +"Katso Djangon version %(version)s julkaisutiedot" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Näet tämän viestin, koska asetuksissasi on DEBUG = True etkä ole konfiguroinut yhtään URL-osoitetta." +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG = True etkä ole konfiguroinut yhtään URL-" +"osoitetta." msgid "Django Documentation" msgstr "Django-dokumentaatio" diff --git a/django/conf/locale/fi/formats.py b/django/conf/locale/fi/formats.py index 0a56b371858e..d9fb6d2f48f1 100644 --- a/django/conf/locale/fi/formats.py +++ b/django/conf/locale/fi/formats.py @@ -2,36 +2,35 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. E Y' -TIME_FORMAT = 'G.i' -DATETIME_FORMAT = r'j. E Y \k\e\l\l\o G.i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'j.n.Y' -SHORT_DATETIME_FORMAT = 'j.n.Y G.i' +DATE_FORMAT = "j. E Y" +TIME_FORMAT = "G.i" +DATETIME_FORMAT = r"j. E Y \k\e\l\l\o G.i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "j.n.Y" +SHORT_DATETIME_FORMAT = "j.n.Y G.i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '20.3.2014' - '%d.%m.%y', # '20.3.14' + "%d.%m.%Y", # '20.3.2014' + "%d.%m.%y", # '20.3.14' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H.%M.%S', # '20.3.2014 14.30.59' - '%d.%m.%Y %H.%M.%S.%f', # '20.3.2014 14.30.59.000200' - '%d.%m.%Y %H.%M', # '20.3.2014 14.30' - - '%d.%m.%y %H.%M.%S', # '20.3.14 14.30.59' - '%d.%m.%y %H.%M.%S.%f', # '20.3.14 14.30.59.000200' - '%d.%m.%y %H.%M', # '20.3.14 14.30' + "%d.%m.%Y %H.%M.%S", # '20.3.2014 14.30.59' + "%d.%m.%Y %H.%M.%S.%f", # '20.3.2014 14.30.59.000200' + "%d.%m.%Y %H.%M", # '20.3.2014 14.30' + "%d.%m.%y %H.%M.%S", # '20.3.14 14.30.59' + "%d.%m.%y %H.%M.%S.%f", # '20.3.14 14.30.59.000200' + "%d.%m.%y %H.%M", # '20.3.14 14.30' ] TIME_INPUT_FORMATS = [ - '%H.%M.%S', # '14.30.59' - '%H.%M.%S.%f', # '14.30.59.000200' - '%H.%M', # '14.30' + "%H.%M.%S", # '14.30.59' + "%H.%M.%S.%f", # '14.30.59.000200' + "%H.%M", # '14.30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # Non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # Non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/fr/LC_MESSAGES/django.mo b/django/conf/locale/fr/LC_MESSAGES/django.mo index 1c15e950dbed..bf4a0fe19f99 100644 Binary files a/django/conf/locale/fr/LC_MESSAGES/django.mo and b/django/conf/locale/fr/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/fr/LC_MESSAGES/django.po b/django/conf/locale/fr/LC_MESSAGES/django.po index 680002929191..253672ee44ae 100644 --- a/django/conf/locale/fr/LC_MESSAGES/django.po +++ b/django/conf/locale/fr/LC_MESSAGES/django.po @@ -1,8 +1,9 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Bruno Brouard , 2021 # Simon Charette , 2012 -# Claude Paroz , 2013-2019 +# Claude Paroz , 2013-2024 # Claude Paroz , 2011 # Jannis Leidel , 2011 # Jean-Baptiste Mora, 2014 @@ -12,10 +13,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-29 09:09+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Claude Paroz , 2013-2024\n" +"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,6 +29,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabe" +msgid "Algerian Arabic" +msgstr "Arabe algérien" + msgid "Asturian" msgstr "Asturien" @@ -41,7 +45,7 @@ msgid "Belarusian" msgstr "Biélorusse" msgid "Bengali" -msgstr "Bengalî" +msgstr "Bengali" msgid "Breton" msgstr "Breton" @@ -52,6 +56,9 @@ msgstr "Bosniaque" msgid "Catalan" msgstr "Catalan" +msgid "Central Kurdish (Sorani)" +msgstr "Kurde central (sorani)" + msgid "Czech" msgstr "Tchèque" @@ -59,7 +66,7 @@ msgid "Welsh" msgstr "Gallois" msgid "Danish" -msgstr "Dannois" +msgstr "Danois" msgid "German" msgstr "Allemand" @@ -116,7 +123,7 @@ msgid "French" msgstr "Français" msgid "Frisian" -msgstr "Frise" +msgstr "Frison" msgid "Irish" msgstr "Irlandais" @@ -151,6 +158,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonésien" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -181,6 +191,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Coréen" +msgid "Kyrgyz" +msgstr "Kirghiz" + msgid "Luxembourgish" msgstr "Luxembourgeois" @@ -194,7 +207,7 @@ msgid "Macedonian" msgstr "Macédonien" msgid "Malayalam" -msgstr "Malayâlam" +msgstr "Malayalam" msgid "Mongolian" msgstr "Mongole" @@ -202,20 +215,23 @@ msgstr "Mongole" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malais" + msgid "Burmese" msgstr "Birman" msgid "Norwegian Bokmål" -msgstr "Norvégien Bokmal" +msgstr "Norvégien bokmål" msgid "Nepali" msgstr "Népalais" msgid "Dutch" -msgstr "Hollandais" +msgstr "Néerlandais" msgid "Norwegian Nynorsk" -msgstr "Norvégien Nynorsk" +msgstr "Norvégien nynorsk" msgid "Ossetic" msgstr "Ossète" @@ -265,9 +281,15 @@ msgstr "Tamoul" msgid "Telugu" msgstr "Télougou" +msgid "Tajik" +msgstr "Tadjik" + msgid "Thai" msgstr "Thaï" +msgid "Turkmen" +msgstr "Turkmène" + msgid "Turkish" msgstr "Turc" @@ -277,6 +299,9 @@ msgstr "Tatar" msgid "Udmurt" msgstr "Oudmourte" +msgid "Uyghur" +msgstr "Ouïghour" + msgid "Ukrainian" msgstr "Ukrainien" @@ -299,7 +324,7 @@ msgid "Messages" msgstr "Messages" msgid "Site Maps" -msgstr "Plans de sites" +msgstr "Plans des sites" msgid "Static Files" msgstr "Fichiers statiques" @@ -307,6 +332,11 @@ msgstr "Fichiers statiques" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Ce numéro de page n’est pas un nombre entier" @@ -319,6 +349,9 @@ msgstr "Cette page ne contient aucun résultat" msgid "Enter a valid value." msgstr "Saisissez une valeur valide." +msgid "Enter a valid domain name." +msgstr "Saisissez un nom de domaine valide." + msgid "Enter a valid URL." msgstr "Saisissez une URL valide." @@ -332,8 +365,8 @@ msgstr "Saisissez une adresse de courriel valide." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _ et " -"des traits d’union." +"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas (_) " +"et des traits d’union." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " @@ -342,14 +375,18 @@ msgstr "" "Ce champ ne doit contenir que des caractères Unicode, des nombres, des " "tirets bas (_) et des traits d’union." -msgid "Enter a valid IPv4 address." -msgstr "Saisissez une adresse IPv4 valide." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Saisissez une adresse %(protocol)s valide." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Saisissez une adresse IPv6 valide." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Saisissez une adresse IPv4 ou IPv6 valide." +msgid "IPv4 or IPv6" +msgstr "IPv4 ou IPv6" msgid "Enter only digits separated by commas." msgstr "Saisissez uniquement des chiffres séparés par des virgules." @@ -370,6 +407,21 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Assurez-vous que cette valeur est supérieure ou égale à %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Assurez-vous que cette valeur est un multiple de la taille de pas " +"%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Assurez-vous que cette valeur est un multiple de la taille de pas " +"%(limit_value)s, débutant à %(offset)s, par ex. %(offset)s, " +"%(valid_value1)s, %(valid_value2)s, etc." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -383,6 +435,9 @@ msgstr[0] "" msgstr[1] "" "Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " "(actuellement %(show_value)d)." +msgstr[2] "" +"Assurez-vous que cette valeur comporte au moins %(limit_value)d caractères " +"(actuellement %(show_value)d)." #, python-format msgid "" @@ -397,6 +452,9 @@ msgstr[0] "" msgstr[1] "" "Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " "(actuellement %(show_value)d)." +msgstr[2] "" +"Assurez-vous que cette valeur comporte au plus %(limit_value)d caractères " +"(actuellement %(show_value)d)." msgid "Enter a number." msgstr "Saisissez un nombre." @@ -406,6 +464,7 @@ msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre au total." msgstr[1] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." +msgstr[2] "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres au total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." @@ -414,6 +473,8 @@ msgstr[0] "" "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre après la virgule." msgstr[1] "" "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." +msgstr[2] "" +"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres après la virgule." #, python-format msgid "" @@ -424,6 +485,8 @@ msgstr[0] "" "Assurez-vous qu'il n'y a pas plus de %(max)s chiffre avant la virgule." msgstr[1] "" "Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." +msgstr[2] "" +"Assurez-vous qu’il n’y a pas plus de %(max)s chiffres avant la virgule." #, python-format msgid "" @@ -443,6 +506,10 @@ msgstr "et" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Un objet %(model_name)s avec ces champs %(field_labels)s existe déjà." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "La contrainte « %(name)s » n’est pas respectée." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "La valeur « %(value)r » n’est pas un choix valide." @@ -457,8 +524,8 @@ msgstr "Ce champ ne peut pas être vide." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Un objet %(model_name)s avec ce champ %(field_label)s existe déjà." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -477,14 +544,17 @@ msgstr "La valeur « %(value)s » doit être soit True (vrai), soit False (fau #, python-format msgid "“%(value)s” value must be either True, False, or None." msgstr "" -"La valeur « %(value)s » doit être True (vrai), False (faux) ou None (aucun)." +"La valeur « %(value)s » doit être True (vrai), False (faux) ou None (vide)." msgid "Boolean (Either True or False)" -msgstr "Booléen (soit vrai ou faux)" +msgstr "Booléen (soit True (vrai) ou False (faux))" #, python-format msgid "String (up to %(max_length)s)" -msgstr "Chaîne de caractère (jusqu'à %(max_length)s)" +msgstr "Chaîne de caractères (jusqu'à %(max_length)s)" + +msgid "String (unlimited)" +msgstr "Chaîne de caractères (illimitée)" msgid "Comma-separated integers" msgstr "Des entiers séparés par une virgule" @@ -568,6 +638,9 @@ msgstr "Entier" msgid "Big (8 byte) integer" msgstr "Grand entier (8 octets)" +msgid "Small integer" +msgstr "Petit nombre entier" + msgid "IPv4 address" msgstr "Adresse IPv4" @@ -577,11 +650,13 @@ msgstr "Adresse IP" #, python-format msgid "“%(value)s” value must be either None, True or False." msgstr "" -"La valeur « %(value)s » doit valoir soit None (vide), True (vrai) ou False " -"(faux)." +"La valeur « %(value)s » doit être None (vide), True (vrai) ou False (faux)." msgid "Boolean (Either True, False or None)" -msgstr "Booléen (soit vrai, faux ou nul)" +msgstr "Booléen (soit None (vide), True (vrai) ou False (faux))" + +msgid "Positive big integer" +msgstr "Grand nombre entier positif" msgid "Positive integer" msgstr "Nombre entier positif" @@ -593,9 +668,6 @@ msgstr "Petit nombre entier positif" msgid "Slug (up to %(max_length)s)" msgstr "Slug (jusqu'à %(max_length)s car.)" -msgid "Small integer" -msgstr "Petit nombre entier" - msgid "Text" msgstr "Texte" @@ -637,6 +709,12 @@ msgstr "Fichier" msgid "Image" msgstr "Image" +msgid "A JSON object" +msgstr "Un objet JSON" + +msgid "Value must be valid JSON." +msgstr "La valeur doit respecter la syntaxe JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "L’instance %(model)s avec %(value)r dans %(field)s n’existe pas." @@ -706,6 +784,9 @@ msgstr[0] "" msgstr[1] "" "Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " "(actuellement %(length)d)." +msgstr[2] "" +"Assurez-vous que ce nom de fichier comporte au plus %(max)d caractères " +"(actuellement %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "Envoyez un fichier ou cochez la case d’effacement, mais pas les deux." @@ -730,6 +811,9 @@ msgstr "Saisissez une valeur complète." msgid "Enter a valid UUID." msgstr "Saisissez un UUID valide." +msgid "Enter a valid JSON." +msgstr "Saisissez du contenu JSON valide." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr " :" @@ -738,22 +822,28 @@ msgstr " :" msgid "(Hidden field %(name)s) %(error)s" msgstr "(champ masqué %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" -"Les données du formulaire ManagementForm sont manquantes ou ont été " -"manipulées" +"Des données du formulaire ManagementForm sont manquantes ou ont été " +"manipulées. Champs manquants : %(field_names)s. Vous pourriez créer un " +"rapport de bogue si le problème persiste." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Ne soumettez pas plus de %d formulaire." -msgstr[1] "Ne soumettez pas plus de %d formulaires." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Veuillez soumettre au plus %(num)d formulaire." +msgstr[1] "Veuillez soumettre au plus %(num)d formulaires." +msgstr[2] "Veuillez soumettre au plus %(num)d formulaires." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Veuillez soumettre au moins %d formulaire." -msgstr[1] "Veuillez soumettre au moins %d formulaires." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Veuillez soumettre au moins %(num)d formulaire." +msgstr[1] "Veuillez soumettre au moins %(num)d formulaires." +msgstr[2] "Veuillez soumettre au moins %(num)d formulaires." msgid "Order" msgstr "Ordre" @@ -763,12 +853,12 @@ msgstr "Supprimer" #, python-format msgid "Please correct the duplicate data for %(field)s." -msgstr "Corrigez les données à double dans %(field)s." +msgstr "Corrigez les données en double dans %(field)s." #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." msgstr "" -"Corrigez les données à double dans %(field)s qui doit contenir des valeurs " +"Corrigez les données en double dans %(field)s qui doit contenir des valeurs " "uniques." #, python-format @@ -776,11 +866,11 @@ msgid "" "Please correct the duplicate data for %(field_name)s which must be unique " "for the %(lookup)s in %(date_field)s." msgstr "" -"Corrigez les données à double dans %(field_name)s qui doit contenir des " +"Corrigez les données en double dans %(field_name)s qui doit contenir des " "valeurs uniques pour la partie %(lookup)s de %(date_field)s." msgid "Please correct the duplicate values below." -msgstr "Corrigez les valeurs à double ci-dessous." +msgstr "Corrigez les valeurs en double ci-dessous." msgid "The inline value did not match the parent instance." msgstr "La valeur en ligne ne correspond pas à l’instance parente." @@ -820,15 +910,7 @@ msgstr "Oui" msgid "No" msgstr "Non" -msgid "Year" -msgstr "Année" - -msgid "Month" -msgstr "Mois" - -msgid "Day" -msgstr "Jour" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "oui,non,peut-être" @@ -837,6 +919,7 @@ msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d octet" msgstr[1] "%(size)d octets" +msgstr[2] "%(size)d octets" #, python-format msgid "%s KB" @@ -1024,7 +1107,7 @@ msgstr "août" msgctxt "abbrev. month" msgid "Sept." -msgstr "sep." +msgstr "sept." msgctxt "abbrev. month" msgid "Oct." @@ -1102,43 +1185,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d année" -msgstr[1] "%d années" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d année" +msgstr[1] "%(num)d ans" +msgstr[2] "%(num)d ans" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mois" -msgstr[1] "%d mois" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mois" +msgstr[1] "%(num)d mois" +msgstr[2] "%(num)d mois" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semaine" -msgstr[1] "%d semaines" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semaine" +msgstr[1] "%(num)d semaines" +msgstr[2] "%(num)d semaines" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d jour" -msgstr[1] "%d jours" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d jour" +msgstr[1] "%(num)d jours" +msgstr[2] "%(num)d jours" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d heure" -msgstr[1] "%d heures" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d heure" +msgstr[1] "%(num)d heures" +msgstr[2] "%(num)d heures" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minute" -msgstr[1] "%d minutes" - -msgid "0 minutes" -msgstr "0 minute" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minute" +msgstr[1] "%(num)d minutes" +msgstr[2] "%(num)d minutes" msgid "Forbidden" msgstr "Interdit" @@ -1148,11 +1234,11 @@ msgstr "La vérification CSRF a échoué. La requête a été interrompue." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Vous voyez ce message parce que ce site HTTPS exige que le navigateur Web " +"Vous voyez ce message parce que ce site HTTPS exige que le navigateur web " "envoie un en-tête « Referer », ce qu’il n'a pas fait. Cet en-tête est exigé " "pour des raisons de sécurité, afin de s’assurer que le navigateur n’ait pas " "été piraté par un intervenant externe." @@ -1171,8 +1257,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Si vous utilisez la balise " "ou que vous incluez l’en-tête « Referrer-Policy: no-referrer », il est " @@ -1196,8 +1282,8 @@ msgid "" "them, at least for this site, or for “same-origin” requests." msgstr "" "Si vous avez désactivé l’envoi des cookies par votre navigateur, veuillez " -"les réactiver au moins pour ce site ou pour les requêtes de même origine (« " -"same-origin »)." +"les réactiver au moins pour ce site ou pour les requêtes de même origine " +"(« same-origin »)." msgid "More information is available with DEBUG=True." msgstr "" @@ -1265,8 +1351,8 @@ msgstr "« %(path)s » n’existe pas" msgid "Index of %(directory)s" msgstr "Index de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django : le cadriciel Web pour les perfectionnistes sous contrainte." +msgid "The install worked successfully! Congratulations!" +msgstr "L’installation s’est déroulée avec succès. Félicitations !" #, python-format msgid "" @@ -1277,20 +1363,17 @@ msgstr "" "releases/\" target=\"_blank\" rel=\"noopener\">notes de publication de " "Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "L’installation s’est déroulée avec succès. Félicitations !" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -"Vous voyez cette page parce que votre fichier de réglages contient DEBUG=True et que vous n’avez pas encore " -"configuré d’URL." +"Vous voyez cette page parce que votre fichier de réglages contient DEBUG=True et que vous n’avez pas " +"encore configuré d’URL." msgid "Django Documentation" msgstr "Documentation de Django" diff --git a/django/conf/locale/fr/formats.py b/django/conf/locale/fr/formats.py index f24e77f3e192..338d8ad3ee65 100644 --- a/django/conf/locale/fr/formats.py +++ b/django/conf/locale/fr/formats.py @@ -2,30 +2,26 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j N Y' -SHORT_DATETIME_FORMAT = 'j N Y H:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - '%d.%m.%Y', '%d.%m.%y', # Swiss [fr_CH), '25.10.2006', '25.10.06' - # '%d %B %Y', '%d %b %Y', # '25 octobre 2006', '25 oct. 2006' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d.%m.%Y %H:%M:%S', # Swiss [fr_CH), '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # Swiss (fr_CH), '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # Swiss (fr_CH), '25.10.2006 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/tests/requests/__init__.py b/django/conf/locale/fr_BE/__init__.py similarity index 100% rename from tests/requests/__init__.py rename to django/conf/locale/fr_BE/__init__.py diff --git a/django/conf/locale/fr_BE/formats.py b/django/conf/locale/fr_BE/formats.py new file mode 100644 index 000000000000..84f065713ee0 --- /dev/null +++ b/django/conf/locale/fr_BE/formats.py @@ -0,0 +1,32 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' +] +DATETIME_INPUT_FORMATS = [ + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' +] +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space +NUMBER_GROUPING = 3 diff --git a/tests/migrations/migrations_test_apps/without_init_file/migrations/.keep b/django/conf/locale/fr_CA/__init__.py similarity index 100% rename from tests/migrations/migrations_test_apps/without_init_file/migrations/.keep rename to django/conf/locale/fr_CA/__init__.py diff --git a/django/conf/locale/fr_CA/formats.py b/django/conf/locale/fr_CA/formats.py new file mode 100644 index 000000000000..4f1a017f168d --- /dev/null +++ b/django/conf/locale/fr_CA/formats.py @@ -0,0 +1,30 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" # 31 janvier 2024 +TIME_FORMAT = "H\xa0h\xa0i" # 13 h 40 +DATETIME_FORMAT = "j F Y, H\xa0h\xa0i" # 31 janvier 2024, 13 h 40 +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y-m-d" +SHORT_DATETIME_FORMAT = "Y-m-d H\xa0h\xa0i" +FIRST_DAY_OF_WEEK = 0 # Dimanche + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%Y-%m-%d", # '2006-05-15' + "%y-%m-%d", # '06-05-15' +] +DATETIME_INPUT_FORMATS = [ + "%Y-%m-%d %H:%M:%S", # '2006-05-15 14:30:57' + "%y-%m-%d %H:%M:%S", # '06-05-15 14:30:57' + "%Y-%m-%d %H:%M:%S.%f", # '2006-05-15 14:30:57.000200' + "%y-%m-%d %H:%M:%S.%f", # '06-05-15 14:30:57.000200' + "%Y-%m-%d %H:%M", # '2006-05-15 14:30' + "%y-%m-%d %H:%M", # '06-05-15 14:30' +] +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/fr_CH/__init__.py b/django/conf/locale/fr_CH/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/django/conf/locale/fr_CH/formats.py b/django/conf/locale/fr_CH/formats.py new file mode 100644 index 000000000000..84f065713ee0 --- /dev/null +++ b/django/conf/locale/fr_CH/formats.py @@ -0,0 +1,32 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' +] +DATETIME_INPUT_FORMATS = [ + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' +] +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ga/LC_MESSAGES/django.mo b/django/conf/locale/ga/LC_MESSAGES/django.mo index 31615b1aba95..e55658a32272 100644 Binary files a/django/conf/locale/ga/LC_MESSAGES/django.mo and b/django/conf/locale/ga/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ga/LC_MESSAGES/django.po b/django/conf/locale/ga/LC_MESSAGES/django.po index 420af4d636da..21a1e1971239 100644 --- a/django/conf/locale/ga/LC_MESSAGES/django.po +++ b/django/conf/locale/ga/LC_MESSAGES/django.po @@ -1,6 +1,8 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Aindriú Mac Giolla Eoin, 2024 +# Claude Paroz , 2020 # Jannis Leidel , 2011 # John Moylan , 2013 # John Stafford , 2013 @@ -12,10 +14,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" +"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -29,6 +31,9 @@ msgstr "Afracáinis" msgid "Arabic" msgstr "Araibis" +msgid "Algerian Arabic" +msgstr "Araibis na hAilgéire" + msgid "Asturian" msgstr "Astúiris" @@ -53,6 +58,9 @@ msgstr "Boisnis" msgid "Catalan" msgstr "Catalóinis" +msgid "Central Kurdish (Sorani)" +msgstr "Coirdis Láir (Sorani)" + msgid "Czech" msgstr "Seicis" @@ -66,7 +74,7 @@ msgid "German" msgstr "Gearmáinis" msgid "Lower Sorbian" -msgstr "" +msgstr "Sorbais Íochtarach" msgid "Greek" msgstr "Gréigis" @@ -90,7 +98,7 @@ msgid "Argentinian Spanish" msgstr "Spáinnis na hAirgintíne" msgid "Colombian Spanish" -msgstr "" +msgstr "Spáinnis na Colóime" msgid "Mexican Spanish" msgstr "Spáinnis Mheicsiceo " @@ -138,13 +146,13 @@ msgid "Croatian" msgstr "Cróitis" msgid "Upper Sorbian" -msgstr "" +msgstr "Sorbian Uachtarach" msgid "Hungarian" msgstr "Ungáiris" msgid "Armenian" -msgstr "" +msgstr "Airméinis" msgid "Interlingua" msgstr "Interlingua" @@ -152,6 +160,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indinéisis" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -168,7 +179,7 @@ msgid "Georgian" msgstr "Seoirsis" msgid "Kabyle" -msgstr "" +msgstr "Cabaill" msgid "Kazakh" msgstr "Casaicis" @@ -182,6 +193,9 @@ msgstr "Cannadais" msgid "Korean" msgstr "Cóiréis" +msgid "Kyrgyz" +msgstr "Chirgeastáin" + msgid "Luxembourgish" msgstr "Lucsamburgach" @@ -203,11 +217,14 @@ msgstr "Mongóilis" msgid "Marathi" msgstr "Maraitis" +msgid "Malay" +msgstr "Malaeis" + msgid "Burmese" msgstr "Burmais" msgid "Norwegian Bokmål" -msgstr "" +msgstr "Ioruais Bokmål" msgid "Nepali" msgstr "Neipeailis" @@ -258,7 +275,7 @@ msgid "Swedish" msgstr "Sualainnis" msgid "Swahili" -msgstr "" +msgstr "Svahaílis" msgid "Tamil" msgstr "Tamailis" @@ -266,17 +283,26 @@ msgstr "Tamailis" msgid "Telugu" msgstr "Teileagúis" +msgid "Tajik" +msgstr "Táidsíc" + msgid "Thai" msgstr "Téalainnis" +msgid "Turkmen" +msgstr "Tuircméinis" + msgid "Turkish" msgstr "Tuircis" msgid "Tatar" -msgstr "" +msgstr "Tatairis" msgid "Udmurt" -msgstr "" +msgstr "Udmurt" + +msgid "Uyghur" +msgstr "Uighur" msgid "Ukrainian" msgstr "Úcráinis" @@ -285,7 +311,7 @@ msgid "Urdu" msgstr "Urdais" msgid "Uzbek" -msgstr "" +msgstr "Úisbéicis" msgid "Vietnamese" msgstr "Vítneamais" @@ -300,7 +326,7 @@ msgid "Messages" msgstr "Teachtaireachtaí" msgid "Site Maps" -msgstr "" +msgstr "Léarscáileanna Suímh" msgid "Static Files" msgstr "Comhaid Statach" @@ -308,45 +334,61 @@ msgstr "Comhaid Statach" msgid "Syndication" msgstr "Sindeacáitiú" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" -msgstr "" +msgstr "Ní slánuimhir í an uimhir leathanaigh sin" msgid "That page number is less than 1" -msgstr "" +msgstr "Tá uimhir an leathanaigh sin níos lú ná 1" msgid "That page contains no results" -msgstr "" +msgstr "Níl aon torthaí ar an leathanach sin" msgid "Enter a valid value." msgstr "Iontráil luach bailí" +msgid "Enter a valid domain name." +msgstr "Cuir isteach ainm fearainn bailí." + msgid "Enter a valid URL." msgstr "Iontráil URL bailí." msgid "Enter a valid integer." -msgstr "" +msgstr "Cuir isteach slánuimhir bhailí." msgid "Enter a valid email address." -msgstr "" +msgstr "Cuir isteach seoladh ríomhphoist bailí." #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Cuir isteach “sluga” bailí ar a bhfuil litreacha, uimhreacha, foscórthaí nó " +"fleiscíní." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Cuir isteach “sluga” bailí ar a bhfuil litreacha Unicode, uimhreacha, fo-" +"scóranna, nó fleiscíní." -msgid "Enter a valid IPv4 address." -msgstr "Iontráil seoladh IPv4 bailí." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Cuir isteach seoladh bailí %(protocol)s." -msgid "Enter a valid IPv6 address." -msgstr "Cuir seoladh bailí IPv6 isteach." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Cuir seoladh bailí IPv4 nó IPv6 isteach." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 nó IPv6" msgid "Enter only digits separated by commas." msgstr "Ná hiontráil ach digití atá deighilte le camóga." @@ -366,6 +408,19 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Cinntigh go bhfuil an luach seo níos mó ná nó cothrom le %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Cinntigh gur iolraí de chéimmhéid %(limit_value)s an luach seo, ag tosú ó " +"%(offset)s, m.sh. %(offset)s, %(valid_value1)s, %(valid_value2)s, agus mar " +"sin de." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -374,10 +429,20 @@ msgid_plural "" "Ensure this value has at least %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " +"%(show_value)d aige)." msgstr[1] "" +"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " +"%(show_value)d aige)." msgstr[2] "" +"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " +"%(show_value)d aige)." msgstr[3] "" +"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " +"%(show_value)d aige)." msgstr[4] "" +"Cinntigh go bhfuil ar a laghad %(limit_value)d carachtar ag an luach seo (tá " +"%(show_value)d aige)." #, python-format msgid "" @@ -387,10 +452,20 @@ msgid_plural "" "Ensure this value has at most %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " +"%(show_value)d aige)." msgstr[1] "" +"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " +"%(show_value)d aige)." msgstr[2] "" +"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " +"%(show_value)d aige)." msgstr[3] "" +"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " +"%(show_value)d aige)." msgstr[4] "" +"Cinntigh go bhfuil %(limit_value)d carachtar ar a mhéad ag an luach seo (tá " +"%(show_value)d aige)." msgid "Enter a number." msgstr "Iontráil uimhir." @@ -398,20 +473,20 @@ msgstr "Iontráil uimhir." #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." +msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." +msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." +msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." +msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s digit san iomlán." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgstr[0] "Cinntigh nach bhfuil níos mó ná %(max)s ionad deachúlach ann." +msgstr[1] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." +msgstr[2] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." +msgstr[3] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." +msgstr[4] "Cinntigh nach bhfuil níos mó ná %(max)s de dheachúlacha ann." #, python-format msgid "" @@ -419,30 +494,41 @@ msgid "" msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." msgstr[0] "" +"Cinntigh nach bhfuil níos mó ná %(max)s digit ann roimh an bpointe deachúil." msgstr[1] "" +"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." msgstr[2] "" +"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." msgstr[3] "" +"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." msgstr[4] "" +"Cinntigh nach bhfuil níos mó ná %(max)s dhigit roimh an bpointe deachúil." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Ní cheadaítear iarmhír chomhaid “%(extension)s”. Is iad seo a leanas " +"eisínteachtaí ceadaithe: %(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Ní cheadaítear carachtair null." msgid "and" msgstr "agus" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" +msgstr "Tá %(model_name)s leis an %(field_labels)s seo ann cheana." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Tá srian “%(name)s” sáraithe." #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "" +msgstr "Ní rogha bhailí é luach %(value)r." msgid "This field cannot be null." msgstr "Ní cheadaítear luach nialasach sa réimse seo." @@ -454,12 +540,14 @@ msgstr "Ní cheadaítear luach nialasach sa réimse seo." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Tá %(model_name)s leis an %(field_label)s seo ann cheana." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" +"Caithfidh %(field_label)s a bheith uathúil le haghaidh %(date_field_label)s " +"%(lookup_type)s." #, python-format msgid "Field of type: %(field_type)s" @@ -467,11 +555,11 @@ msgstr "Réimse de Cineál: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Caithfidh luach “%(value)s” a bheith Fíor nó Bréagach." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Caithfidh luach “%(value)s” a bheith Fíor, Bréagach, nó Neamhní." msgid "Boolean (Either True or False)" msgstr "Boole" @@ -480,6 +568,9 @@ msgstr "Boole" msgid "String (up to %(max_length)s)" msgstr "Teaghrán (suas go %(max_length)s)" +msgid "String (unlimited)" +msgstr "Teaghrán (gan teorainn)" + msgid "Comma-separated integers" msgstr "Slánuimhireacha camóg-scartha" @@ -488,12 +579,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Tá formáid dáta neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " +"bhformáid BBBB-MM-LL." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Tá an fhormáid cheart ag luach “%(value)s” (BBBB-MM-DD) ach is dáta " +"neamhbhailí é." msgid "Date (without time)" msgstr "Dáta (gan am)" @@ -503,19 +598,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith san " +"fhormáid BBBB-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Tá an fhormáid cheart ag luach “%(value)s” (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) ach is dáta/am neamhbhailí é." msgid "Date (with time)" msgstr "Dáta (le am)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Caithfidh luach “%(value)s” a bheith ina uimhir dheachúil." msgid "Decimal number" msgstr "Uimhir deachúlach" @@ -525,6 +624,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " +"bhformáid [DD] [[HH:]MM:]ss[.uuuuuu]." msgid "Duration" msgstr "Fad" @@ -537,14 +638,14 @@ msgstr "Conair comhaid" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Caithfidh luach “%(value)s” a bheith ina shnámhán." msgid "Floating point number" msgstr "Snámhphointe" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Caithfidh luach “%(value)s” a bheith ina shlánuimhir." msgid "Integer" msgstr "Slánuimhir" @@ -552,6 +653,9 @@ msgstr "Slánuimhir" msgid "Big (8 byte) integer" msgstr "Mór (8 byte) slánuimhi" +msgid "Small integer" +msgstr "Slánuimhir beag" + msgid "IPv4 address" msgstr "Seoladh IPv4" @@ -560,11 +664,14 @@ msgstr "Seoladh IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Ní mór luach “%(value)s” a bheith Easpa, Fíor nó Bréagach." msgid "Boolean (Either True, False or None)" msgstr "Boole (Fíor, Bréagach nó Dada)" +msgid "Positive big integer" +msgstr "Slánuimhir mhór dhearfach" + msgid "Positive integer" msgstr "Slánuimhir dearfach" @@ -575,9 +682,6 @@ msgstr "Slánuimhir beag dearfach" msgid "Slug (up to %(max_length)s)" msgstr "Slug (suas go %(max_length)s)" -msgid "Small integer" -msgstr "Slánuimhir beag" - msgid "Text" msgstr "Téacs" @@ -586,12 +690,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Tá formáid neamhbhailí ag luach “%(value)s”. Caithfidh sé a bheith i " +"bhformáid HH:MM[:ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Tá an fhormáid cheart ag luach “%(value)s” (HH:MM[:ss[.uuuuuu]]) ach is am " +"neamhbhailí é." msgid "Time" msgstr "Am" @@ -600,14 +708,14 @@ msgid "URL" msgstr "URL" msgid "Raw binary data" -msgstr "" +msgstr "Sonraí dénártha amh" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "Ní UUID bailí é “%(value)s”." msgid "Universally unique identifier" -msgstr "" +msgstr "Aitheantóir uathúil uilíoch" msgid "File" msgstr "Comhaid" @@ -615,9 +723,15 @@ msgstr "Comhaid" msgid "Image" msgstr "Íomhá" +msgid "A JSON object" +msgstr "Réad JSON" + +msgid "Value must be valid JSON." +msgstr "Caithfidh an luach a bheith bailí JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "Níl sampla %(model)s le %(field)s %(value)r ann." msgid "Foreign Key (type determined by related field)" msgstr "Eochair Eachtracha (cineál a chinnfear de réir réimse a bhaineann)" @@ -627,11 +741,11 @@ msgstr "Duine-le-duine caidreamh" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "%(from)s-%(to)s caidreamh" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "%(from)s-%(to)s caidrimh" msgid "Many-to-many relationship" msgstr "Go leor le go leor caidreamh" @@ -658,11 +772,11 @@ msgid "Enter a valid date/time." msgstr "Iontráil dáta/am bailí." msgid "Enter a valid duration." -msgstr "" +msgstr "Cuir isteach ré bailí." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "Caithfidh líon na laethanta a bheith idir {min_days} agus {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "Níor seoladh comhad. Deimhnigh cineál an ionchódaithe ar an bhfoirm." @@ -678,10 +792,20 @@ msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." msgid_plural "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." msgstr[0] "" +"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " +"%(length)d aige)." msgstr[1] "" +"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " +"%(length)d aige)." msgstr[2] "" +"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " +"%(length)d aige)." msgstr[3] "" +"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " +"%(length)d aige)." msgstr[4] "" +"Cinntigh go bhfuil %(max)d carachtar ar a mhéad ag an gcomhadainm seo (tá " +"%(length)d aige)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" @@ -703,10 +827,13 @@ msgid "Enter a list of values." msgstr "Cuir liosta de luachanna isteach." msgid "Enter a complete value." -msgstr "" +msgstr "Cuir isteach luach iomlán." msgid "Enter a valid UUID." -msgstr "" +msgstr "Cuir isteach UUID bailí." + +msgid "Enter a valid JSON." +msgstr "Cuir isteach JSON bailí." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -714,28 +841,34 @@ msgstr ":" #, python-format msgid "(Hidden field %(name)s) %(error)s" -msgstr "" +msgstr "(Réimse folaithe %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" +"Tá sonraí ManagementForm in easnamh nó ar cuireadh isteach orthu. Réimsí ar " +"iarraidh: %(field_names)s. Seans go mbeidh ort tuairisc fhabht a chomhdú má " +"leanann an cheist." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Cuir isteach %(num)d foirm ar a mhéad." +msgstr[1] "Cuir isteach %(num)d foirm ar a mhéad." +msgstr[2] "Cuir isteach %(num)d foirm ar a mhéad." +msgstr[3] "Cuir isteach %(num)d foirm ar a mhéad." +msgstr[4] "Cuir isteach %(num)d foirm ar a mhéad." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Cuir isteach ar a laghad %(num)d foirm." +msgstr[1] "Cuir isteach %(num)d foirm ar a laghad." +msgstr[2] "Cuir isteach %(num)d foirm ar a laghad." +msgstr[3] "Cuir isteach %(num)d foirm ar a laghad." +msgstr[4] "Cuir isteach %(num)d foirm ar a laghad." msgid "Order" msgstr "Ord" @@ -765,20 +898,22 @@ msgid "Please correct the duplicate values below." msgstr "Le do thoil ceartaigh na luachanna dúbail thíos." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "Níor mheaitseáil an luach inlíne leis an gcás tuismitheora." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "Déan rogha bhailí. Ní ceann de na roghanna é do roghasa." #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "Ní luach bailí é “%(pk)s”." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"Níorbh fhéidir %(datetime)s a léirmhíniú i gcrios ama %(current_timezone)s; " +"d'fhéadfadh sé a bheith débhríoch nó b'fhéidir nach bhfuil sé ann." msgid "Clear" msgstr "Glan" @@ -798,17 +933,9 @@ msgstr "Tá" msgid "No" msgstr "Níl" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "tá, níl, b'fhéidir" +msgstr "tá,níl,b'fhéidir" #, python-format msgid "%(size)d byte" @@ -1068,12 +1195,12 @@ msgid "December" msgstr "Mí na Nollag" msgid "This is not a valid IPv6 address." -msgstr "" +msgstr "Ní seoladh IPv6 bailí é seo." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "nó" @@ -1083,99 +1210,117 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d bhliain" +msgstr[1] "%(num)d bliain" +msgstr[2] "%(num)d bliain" +msgstr[3] "%(num)d bliain" +msgstr[4] "%(num)d bliain" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mí" +msgstr[1] "%(num)d míonna" +msgstr[2] "%(num)d míonna" +msgstr[3] "%(num)d míonna" +msgstr[4] "%(num)d míonna" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d seachtain" +msgstr[1] "%(num)d seachtainí" +msgstr[2] "%(num)d seachtainí" +msgstr[3] "%(num)d seachtainí" +msgstr[4] "%(num)d seachtainí" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d lá" +msgstr[1] "%(num)d laethanta" +msgstr[2] "%(num)d laethanta" +msgstr[3] "%(num)d laethanta" +msgstr[4] "%(num)d laethanta" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d uair" +msgstr[1] "%(num)d huaireanta" +msgstr[2] "%(num)d huaireanta" +msgstr[3] "%(num)d huaireanta" +msgstr[4] "%(num)d huaireanta" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d nóiméad" -msgstr[1] "%d nóiméad" -msgstr[2] "%d nóiméad" -msgstr[3] "%d nóiméad" -msgstr[4] "%d nóiméad" - -msgid "0 minutes" -msgstr "0 nóiméad" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d nóiméad" +msgstr[1] "%(num)d nóiméad" +msgstr[2] "%(num)d nóiméad" +msgstr[3] "%(num)d nóiméad" +msgstr[4] "%(num)d nóiméad" msgid "Forbidden" msgstr "Toirmiscthe" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "Theip ar fhíorú CSRF. Cuireadh deireadh leis an iarratas." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil “ceanntásc " +"tarchuir” ag teastáil ón suíomh HTTPS seo le bheith seolta ag do bhrabhsálaí " +"gréasáin, ach níor seoladh aon cheann. Tá an ceanntásc seo ag teastáil ar " +"chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí á fuadach ag " +"tríú páirtithe." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Má tá do bhrabhsálaí cumraithe agat chun ceanntásca “Tagairtí” a dhíchumasú, " +"le do thoil déan iad a athchumasú, le do thoil don suíomh seo, nó do naisc " +"HTTPS, nó d’iarratais “ar an mbunús céanna”." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Má tá an chlib 1 á úsáid agat nó má tá an ceanntásc “Polasaí Atreoraithe: " +"gan atreorú” san áireamh, bain amach iad le do thoil. Éilíonn an chosaint " +"CSRF go bhfuil an ceanntásc “Tagairtí” chun seiceáil docht atreoraithe a " +"dhéanamh. Má tá imní ort faoi phríobháideachas, bain úsáid as roghanna eile " +"amhail le haghaidh naisc chuig láithreáin tríú " +"páirtí." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" +"Tá an teachtaireacht seo á fheiceáil agat toisc go bhfuil fianán CSRF ag " +"teastáil ón suíomh seo agus foirmeacha á gcur isteach agat. Tá an fianán seo " +"ag teastáil ar chúiseanna slándála, lena chinntiú nach bhfuil do bhrabhsálaí " +"á fuadach ag tríú páirtithe." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Má tá do bhrabhsálaí cumraithe agat chun fianáin a dhíchumasú, le do thoil " +"athchumasaigh iad, le do thoil, le haghaidh an tsuímh seo ar a laghad, nó le " +"haghaidh iarratais “ar an mbunús céanna”." msgid "More information is available with DEBUG=True." msgstr "Tá tuilleadh eolais ar fáil le DEBUG=True." @@ -1184,7 +1329,7 @@ msgid "No year specified" msgstr "Bliain gan sonrú" msgid "Date out of range" -msgstr "" +msgstr "Dáta as raon" msgid "No month specified" msgstr "Mí gan sonrú" @@ -1209,7 +1354,7 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Teaghrán dáta neamhbhailí “%(datestr)s” tugtha formáid “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1217,6 +1362,7 @@ msgstr "Níl bhfuarthas %(verbose_name)s le hadhaigh an iarratas" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Níl an leathanach “deireadh”, agus ní féidir é a thiontú go slánuimhir." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1224,53 +1370,57 @@ msgstr "Leathanach neamhbhailí (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Tá liosta folamh agus “%(class_name)s.allow_empty” bréagach." msgid "Directory indexes are not allowed here." msgstr "Níl innéacsanna chomhadlann cheadaítear anseo." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "Níl “%(path)s” ann" #, python-format msgid "Index of %(directory)s" msgstr "Innéacs de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "D'éirigh leis an suiteáil! Comhghairdeachas!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"Féach ar nótaí scaoilte le haghaidh Django " +"%(version)s" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" +"Tá an leathanach seo á fheiceáil agat toisc go bhfuil DEBUG=True i do chomhad socruithe agus nach bhfuil aon " +"URL cumraithe agat." msgid "Django Documentation" -msgstr "" +msgstr "Doiciméadú Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Ábhair, tagairtí, & conas atá" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "Teagaisc: A Vótaíocht Aip" msgid "Get started with Django" msgstr "Tosaigh le Django" msgid "Django Community" -msgstr "" +msgstr "Pobal Django" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "Ceangail, faigh cúnamh, nó ranníoc" diff --git a/django/conf/locale/ga/formats.py b/django/conf/locale/ga/formats.py index eb3614abd91c..7cde1a5689e1 100644 --- a/django/conf/locale/ga/formats.py +++ b/django/conf/locale/ga/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'H:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M Y' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," # NUMBER_GROUPING = diff --git a/django/conf/locale/gd/LC_MESSAGES/django.mo b/django/conf/locale/gd/LC_MESSAGES/django.mo index 8497b252cced..f177bbd99009 100644 Binary files a/django/conf/locale/gd/LC_MESSAGES/django.mo and b/django/conf/locale/gd/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/gd/LC_MESSAGES/django.po b/django/conf/locale/gd/LC_MESSAGES/django.po index 2b8feebf26e7..ba28564c04e5 100644 --- a/django/conf/locale/gd/LC_MESSAGES/django.po +++ b/django/conf/locale/gd/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ # # Translators: # Michael Bauer, 2014 -# GunChleoc, 2015-2017 +# GunChleoc, 2015-2017,2021 # GunChleoc, 2015 # GunChleoc, 2014-2015 # Michael Bauer, 2014 @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-12-13 12:46+0000\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-20 14:00+0000\n" "Last-Translator: GunChleoc\n" "Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" "language/gd/)\n" @@ -28,6 +28,9 @@ msgstr "Afraganais" msgid "Arabic" msgstr "Arabais" +msgid "Algerian Arabic" +msgstr "Arabais Aildireach" + msgid "Asturian" msgstr "Astùrais" @@ -151,6 +154,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Innd-Innsis" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -181,6 +187,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Coirèanais" +msgid "Kyrgyz" +msgstr "Cìorgasais" + msgid "Luxembourgish" msgstr "Lugsamburgais" @@ -202,6 +211,9 @@ msgstr "Mongolais" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malaidhis" + msgid "Burmese" msgstr "Burmais" @@ -265,9 +277,15 @@ msgstr "Taimilis" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Taidigis" + msgid "Thai" msgstr "Tàidh" +msgid "Turkmen" +msgstr "Turcmanais" + msgid "Turkish" msgstr "Turcais" @@ -307,6 +325,11 @@ msgstr "Faidhlichean stadastaireachd" msgid "Syndication" msgstr "Siondacaideadh" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Chan eil àireamh na duilleige seo 'na àireamh slàn" @@ -595,6 +618,9 @@ msgstr "Àireamh shlàn" msgid "Big (8 byte) integer" msgstr "Mòr-àireamh shlàn (8 baidht)" +msgid "Small integer" +msgstr "Beag-àireamh slàn" + msgid "IPv4 address" msgstr "Seòladh IPv4" @@ -608,6 +634,9 @@ msgstr "Feumaidh “%(value)s” a bhith None, True no False." msgid "Boolean (Either True, False or None)" msgstr "Booleach (True, False no None)" +msgid "Positive big integer" +msgstr "Àireamh shlàn dhearbh" + msgid "Positive integer" msgstr "Àireamh shlàn dhearbh" @@ -618,9 +647,6 @@ msgstr "Beag-àireamh shlàn dhearbh" msgid "Slug (up to %(max_length)s)" msgstr "Sluga (suas ri %(max_length)s)" -msgid "Small integer" -msgstr "Beag-àireamh slàn" - msgid "Text" msgstr "Teacsa" @@ -662,6 +688,12 @@ msgstr "Faidhle" msgid "Image" msgstr "Dealbh" +msgid "A JSON object" +msgstr "Oibseact JSON" + +msgid "Value must be valid JSON." +msgstr "Feumaidh an luach a bhith ’na JSON dligheach." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Chan eil ionstans dhe %(model)s le %(field)s %(value)r ann." @@ -674,11 +706,11 @@ msgstr "Dàimh aonan gu aonan" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "Daimh %(from)s-%(to)s" +msgstr "Dàimh %(from)s-%(to)s" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "Daimhean %(from)s-%(to)s" +msgstr "Dàimhean %(from)s-%(to)s" msgid "Many-to-many relationship" msgstr "Dàimh iomadh rud gu iomadh rud" @@ -765,6 +797,9 @@ msgstr "Cuir a-steach luach slàn." msgid "Enter a valid UUID." msgstr "Cuir a-steach UUID dligheach." +msgid "Enter a valid JSON." +msgstr "Cuir a-steach JSON dligheach." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -773,24 +808,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Raon falaichte %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Tha dàta an fhoirm stiùiridh a dhìth no chaidh beantainn ris" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Tha dàta an fhoirm stiùiridh a dhìth no chaidh beantainn ris. Seo na " +"raointean a tha a dhìth: %(field_names)s. Ma mhaireas an duilgheadas, saoil " +"an cuir thu aithris air buga thugainn?" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Cuir a-null %d fhoirm no nas lugha dhiubh." -msgstr[1] "Cuir a-null %d fhoirm no nas lugha dhiubh." -msgstr[2] "Cuir a-null %d foirmean no nas lugha dhiubh." -msgstr[3] "Cuir a-null %d foirm no nas lugha dhiubh." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Na cuir a-null barrachd air %d fhoirm." +msgstr[1] "Na cuir a-null barrachd air %d fhoirm." +msgstr[2] "Na cuir a-null barrachd air %d foirmean." +msgstr[3] "Na cuir a-null barrachd air %d foirm." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Cuir a-null %d fhoirm no barrachd dhiubh." -msgstr[1] "Cuir a-null %d fhoirm no barrachd dhiubh." -msgstr[2] "Cuir a-null %d foirmean no barrachd dhiubh." -msgstr[3] "Cuir a-null %d foirm no barrachd dhiubh." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Cuir a-null %d fhoirm air a char as lugha." +msgstr[1] "Cuir a-null %d fhoirm air a char as lugha." +msgstr[2] "Cuir a-null %d foirmichean air a char as lugha." +msgstr[3] "Cuir a-null %d foirm air a char as lugha." msgid "Order" msgstr "Òrdugh" @@ -856,15 +897,7 @@ msgstr "Tha" msgid "No" msgstr "Chan eil" -msgid "Year" -msgstr "Bliadhna" - -msgid "Month" -msgstr "Mìos" - -msgid "Day" -msgstr "Latha" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "yes,no,maybe" @@ -1140,55 +1173,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d bhliadhna" -msgstr[1] "%d bhliadhna" -msgstr[2] "%d bliadhnaichean" -msgstr[3] "%d bliadhna" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d bliadhna" +msgstr[1] "%(num)d bhliadhna" +msgstr[2] "%(num)d bliadhnaichean" +msgstr[3] "%(num)d bliadhna" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mhìos" -msgstr[1] "%d mhìos" -msgstr[2] "%d mìosan" -msgstr[3] "%d mìos" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mhìos" +msgstr[1] "%(num)d mhìos" +msgstr[2] "%(num)d mìosan" +msgstr[3] "%(num)d mìos" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d seachdain" -msgstr[1] "%d sheachdain" -msgstr[2] "%d seachdainean" -msgstr[3] "%d seachdain" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d seachdain" +msgstr[1] "%(num)d sheachdain" +msgstr[2] "%(num)d seachdainean" +msgstr[3] "%(num)d seachdain" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d latha" -msgstr[1] "%d latha" -msgstr[2] "%d làithean" -msgstr[3] "%d latha" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d latha" +msgstr[1] "%(num)d latha" +msgstr[2] "%(num)d làithean" +msgstr[3] "%(num)d latha" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d uair" -msgstr[1] "%d uair" -msgstr[2] "%d uairean" -msgstr[3] "%d uair" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d uair a thìde" +msgstr[1] "%(num)d uair a thìde" +msgstr[2] "%(num)d uairean a thìde" +msgstr[3] "%(num)d uair a thìde" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d mhionaid" -msgstr[1] "%d mhionaid" -msgstr[2] "%d mionaidean" -msgstr[3] "%d mionaid" - -msgid "0 minutes" -msgstr "0 mionaid" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d mhionaid" +msgstr[1] "%(num)d mhionaid" +msgstr[2] "%(num)d mionaidean" +msgstr[3] "%(num)d mionaid" msgid "Forbidden" msgstr "Toirmisgte" @@ -1198,7 +1228,7 @@ msgstr "Dh’fhàillig le dearbhadh CSRF. chaidh sgur dhen iarrtas." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1313,8 +1343,8 @@ msgstr "Chan eil “%(path)s” ann" msgid "Index of %(directory)s" msgstr "Clàr-amais dhe %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: am frèam-obrach-lìn leis a choileanas foirfichean cinn-ama." +msgid "The install worked successfully! Congratulations!" +msgstr "Chaidh a stàladh! Meal do naidheachd!" #, python-format msgid "" @@ -1325,9 +1355,6 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">nòtaichean sgaoilidh airson Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Chaidh a stàladh! Meal do naidheachd!" - #, python-format msgid "" "You are seeing this page because , 2017 # Jannis Leidel , 2011 # Leandro Regueiro , 2013 -# Oscar Carballal , 2012 +# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2012 +# X Bello , 2023-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: X Bello , 2023-2024\n" +"Language-Team: Galician (http://app.transifex.com/django/django/language/" "gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,16 +25,19 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Afrikaans" -msgstr "africáner" +msgstr "Africáner" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "Árabe Arxelino" + msgid "Asturian" msgstr "Asturiano" msgid "Azerbaijani" -msgstr "azerí" +msgstr "Azerí" msgid "Bulgarian" msgstr "Búlgaro" @@ -48,11 +52,14 @@ msgid "Breton" msgstr "Bretón" msgid "Bosnian" -msgstr "bosníaco" +msgstr "Bosníaco" msgid "Catalan" msgstr "Catalán" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdo Central (Sorani)" + msgid "Czech" msgstr "Checo" @@ -66,7 +73,7 @@ msgid "German" msgstr "Alemán" msgid "Lower Sorbian" -msgstr "" +msgstr "Baixo Sorabo" msgid "Greek" msgstr "Grego" @@ -84,34 +91,34 @@ msgid "Esperanto" msgstr "Esperanto" msgid "Spanish" -msgstr "español" +msgstr "Español" msgid "Argentinian Spanish" -msgstr "español da Arxentina" +msgstr "Español da Arxentina" msgid "Colombian Spanish" -msgstr "" +msgstr "Español de Colombia" msgid "Mexican Spanish" -msgstr "español de México" +msgstr "Español de México" msgid "Nicaraguan Spanish" -msgstr "español de Nicaragua" +msgstr "Español de Nicaragua" msgid "Venezuelan Spanish" -msgstr "español de Venezuela" +msgstr "Español de Venezuela" msgid "Estonian" -msgstr "estoniano" +msgstr "Estoniano" msgid "Basque" -msgstr "vasco" +msgstr "Vasco" msgid "Persian" msgstr "Persa" msgid "Finnish" -msgstr "finés" +msgstr "Finés" msgid "French" msgstr "Francés" @@ -120,10 +127,10 @@ msgid "Frisian" msgstr "Frisón" msgid "Irish" -msgstr "irlandés" +msgstr "Irlandés" msgid "Scottish Gaelic" -msgstr "" +msgstr "Gaélico Escocés" msgid "Galician" msgstr "Galego" @@ -135,196 +142,222 @@ msgid "Hindi" msgstr "Hindi" msgid "Croatian" -msgstr "croata" +msgstr "Croata" msgid "Upper Sorbian" -msgstr "" +msgstr "Alto Sorabo" msgid "Hungarian" msgstr "Húngaro" msgid "Armenian" -msgstr "" +msgstr "Armenio" msgid "Interlingua" -msgstr "interlingua" +msgstr "Interlingua" msgid "Indonesian" -msgstr "indonesio" +msgstr "Indonesio" + +msgid "Igbo" +msgstr "Ibo" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "islandés" +msgstr "Islandés" msgid "Italian" msgstr "Italiano" msgid "Japanese" -msgstr "xaponés" +msgstr "Xaponés" msgid "Georgian" -msgstr "xeorxiano" +msgstr "Xeorxiano" msgid "Kabyle" -msgstr "" +msgstr "Cabilio" msgid "Kazakh" -msgstr "casaco" +msgstr "Casaco" msgid "Khmer" -msgstr "camboxano" +msgstr "Camboxano" msgid "Kannada" -msgstr "canará" +msgstr "Canará" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "Kirguiz" + msgid "Luxembourgish" -msgstr "luxemburgués" +msgstr "Luxemburgués" msgid "Lithuanian" -msgstr "lituano" +msgstr "Lituano" msgid "Latvian" -msgstr "letón" +msgstr "Letón" msgid "Macedonian" -msgstr "macedonio" +msgstr "Macedonio" msgid "Malayalam" -msgstr "mala" +msgstr "Mala" msgid "Mongolian" -msgstr "mongol" +msgstr "Mongol" msgid "Marathi" -msgstr "" +msgstr "Marathi" + +msgid "Malay" +msgstr "Malaio" msgid "Burmese" -msgstr "birmano" +msgstr "Birmano" msgid "Norwegian Bokmål" -msgstr "" +msgstr "Bokmål Noruegués" msgid "Nepali" -msgstr "nepalés" +msgstr "Nepalés" msgid "Dutch" -msgstr "holandés" +msgstr "Holandés" msgid "Norwegian Nynorsk" -msgstr "noruegués (nynorsk)" +msgstr "Noruegués (nynorsk)" msgid "Ossetic" -msgstr "osetio" +msgstr "Osetio" msgid "Punjabi" -msgstr "panxabiano" +msgstr "Panxabiano" msgid "Polish" -msgstr "polaco" +msgstr "Polaco" msgid "Portuguese" -msgstr "portugués" +msgstr "Portugués" msgid "Brazilian Portuguese" -msgstr "portugués do Brasil" +msgstr "Portugués do Brasil" msgid "Romanian" -msgstr "romanés" +msgstr "Romanés" msgid "Russian" -msgstr "ruso" +msgstr "Ruso" msgid "Slovak" -msgstr "eslovaco" +msgstr "Eslovaco" msgid "Slovenian" -msgstr "esloveno" +msgstr "Esloveno" msgid "Albanian" -msgstr "albanés" +msgstr "Albanés" msgid "Serbian" -msgstr "serbio" +msgstr "Serbio" msgid "Serbian Latin" -msgstr "serbio (alfabeto latino)" +msgstr "Serbio (alfabeto latino)" msgid "Swedish" -msgstr "sueco" +msgstr "Sueco" msgid "Swahili" -msgstr "suahili" +msgstr "Suahili" msgid "Tamil" -msgstr "támil" +msgstr "Támil" msgid "Telugu" -msgstr "telugu" +msgstr "Telugu" + +msgid "Tajik" +msgstr "Taxico" msgid "Thai" -msgstr "tai" +msgstr "Tai" + +msgid "Turkmen" +msgstr "Turcomá" msgid "Turkish" -msgstr "turco" +msgstr "Turco" msgid "Tatar" -msgstr "tártaro" +msgstr "Tártaro" msgid "Udmurt" -msgstr "udmurt" +msgstr "Udmurt" + +msgid "Uyghur" +msgstr "Uigur" msgid "Ukrainian" -msgstr "ucraíno" +msgstr "Ucraíno" msgid "Urdu" -msgstr "urdu" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeco" msgid "Vietnamese" -msgstr "vietnamita" +msgstr "Vietnamita" msgid "Simplified Chinese" -msgstr "chinés simplificado" +msgstr "Chinés simplificado" msgid "Traditional Chinese" -msgstr "chinés tradicional" +msgstr "Chinés tradicional" msgid "Messages" -msgstr "" +msgstr "Mensaxes" msgid "Site Maps" -msgstr "" +msgstr "Mapas do sitio" msgid "Static Files" -msgstr "" +msgstr "Arquivos Estáticos" msgid "Syndication" -msgstr "" +msgstr "Sindicación" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" msgid "That page number is not an integer" -msgstr "" +msgstr "Ese número de páxina non é un enteiro" msgid "That page number is less than 1" -msgstr "" +msgstr "Ese número de páxina é menor que 1" msgid "That page contains no results" -msgstr "" +msgstr "Esa páxina non contén resultados" msgid "Enter a valid value." msgstr "Insira un valor válido." +msgid "Enter a valid domain name." +msgstr "Introduza un nome de dominio válido." + msgid "Enter a valid URL." msgstr "Insira un URL válido." msgid "Enter a valid integer." -msgstr "" +msgstr "Introduza un enteiro válido." msgid "Enter a valid email address." msgstr "Insira un enderezo de correo electrónico válido." @@ -333,20 +366,28 @@ msgstr "Insira un enderezo de correo electrónico válido." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Insira un “slug” valido composto por letras, números, guións baixos ou " +"medios." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Insira un “slug” valido composto por letras Unicode, números, guións baixos " +"ou medios." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Introduza unha dirección %(protocol)s válida." -msgid "Enter a valid IPv4 address." -msgstr "Insira unha dirección IPv4 válida." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Insira unha dirección IPv6 válida" +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Insira unha dirección IPv4 ou IPv6 válida" +msgid "IPv4 or IPv6" +msgstr "IPv4 ou IPv6" msgid "Enter only digits separated by commas." msgstr "Insira só díxitos separados por comas." @@ -364,6 +405,20 @@ msgstr "Asegure que este valor é menor ou igual a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Asegure que este valor é maior ou igual a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Asegúrese de que este valor é un múltiplo do tamaño do paso %(limit_value)s, " +"comezando por %(offset)s, p. ex. %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, e sucesivos." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -372,7 +427,11 @@ msgid_plural "" "Ensure this value has at least %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Asegúrese de que este valor ten polo menos %(limit_value)d caracter (agora " +"ten %(show_value)d)." msgstr[1] "" +"Asegúrese de que este valor ten polo menos %(limit_value)d caracteres (agora " +"ten %(show_value)d)." #, python-format msgid "" @@ -382,7 +441,11 @@ msgid_plural "" "Ensure this value has at most %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Asegúrese de que este valor ten como moito %(limit_value)d caracter (agora " +"ten %(show_value)d)." msgstr[1] "" +"Asegúrese de que este valor ten como moito %(limit_value)d caracteres (agora " +"ten %(show_value)d)." msgid "Enter a number." msgstr "Insira un número." @@ -396,8 +459,8 @@ msgstr[1] "Asegure que non hai mais de %(max)s díxitos en total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Asegúrese de que non hai máis de %(max)s lugar decimal." +msgstr[1] "Asegúrese de que non hai máis de %(max)s lugares decimais." #, python-format msgid "" @@ -405,23 +468,31 @@ msgid "" msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." msgstr[0] "" +"Asegúrese de que no hai máis de %(max)s díxito antes do punto decimal." msgstr[1] "" +"Asegúrese de que non hai máis de %(max)s díxitos antes do punto decimal." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Non se permite a extensión “%(extension)s”. As extensións permitidas son: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Non se permiten caracteres nulos." msgid "and" msgstr "e" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" +msgstr "Xa existe un %(model_name)s con este %(field_labels)s." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Viólase a restricción “%(name)s”." #, python-format msgid "Value %(value)r is not a valid choice." @@ -438,12 +509,14 @@ msgid "%(model_name)s with this %(field_label)s already exists." msgstr "" "Xa existe un modelo %(model_name)s coa etiqueta de campo %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" +"%(field_label)s ten que ser único para %(lookup_type)s en " +"%(date_field_label)s." #, python-format msgid "Field of type: %(field_type)s" @@ -451,11 +524,11 @@ msgstr "Campo de tipo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "O valor “%(value)s” ten que ser ou True ou False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "O valor “%(value)s” ten que ser True, False ou None." msgid "Boolean (Either True or False)" msgstr "Valor booleano (verdadeiro ou falso)" @@ -464,6 +537,9 @@ msgstr "Valor booleano (verdadeiro ou falso)" msgid "String (up to %(max_length)s)" msgstr "Cadea (máximo %(max_length)s)" +msgid "String (unlimited)" +msgstr "Texto (sin límite)" + msgid "Comma-separated integers" msgstr "Números enteiros separados por comas" @@ -472,12 +548,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"O valor “%(value)s” ten un formato inválido de data. Debe estar no formato " +"AAAA-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD) pero non é unha data " +"válida." msgid "Date (without time)" msgstr "Data (sen a hora)" @@ -487,19 +567,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"O valor “%(value)s” ten un formato non válido. Debe de ter o formato AAAA-MM-" +"DD HH:MM[:ss[.uuuuuu]][TZ]. " #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"O valor “%(value)s” ten o formato correcto (AAAA-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) pero non é unha data/hora válida." msgid "Date (with time)" msgstr "Data (coa hora)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” ten que ser un número en formato decimal." msgid "Decimal number" msgstr "Número decimal" @@ -509,9 +593,11 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"O valor “%(value)s” ten un formato non válido. Debe de ter o formato [DD] " +"[[HH:]MM:]ss[.uuuuuu]. " msgid "Duration" -msgstr "" +msgstr "Duración" msgid "Email address" msgstr "Enderezo electrónico" @@ -521,14 +607,14 @@ msgstr "Ruta de ficheiro" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "O valor “%(value)s” ten que ser un número en coma flotante." msgid "Floating point number" msgstr "Número en coma flotante" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "O valor “%(value)s” ten que ser un número enteiro." msgid "Integer" msgstr "Número enteiro" @@ -536,6 +622,9 @@ msgstr "Número enteiro" msgid "Big (8 byte) integer" msgstr "Enteiro grande (8 bytes)" +msgid "Small integer" +msgstr "Enteiro pequeno" + msgid "IPv4 address" msgstr "Enderezo IPv4" @@ -544,11 +633,14 @@ msgstr "Enderezo IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "O valor “%(value)s” ten que ser None, True ou False." msgid "Boolean (Either True, False or None)" msgstr "Booleano (verdadeiro, falso ou ningún)" +msgid "Positive big integer" +msgstr "Número enteiro positivo grande" + msgid "Positive integer" msgstr "Numero enteiro positivo" @@ -559,9 +651,6 @@ msgstr "Enteiro pequeno positivo" msgid "Slug (up to %(max_length)s)" msgstr "Slug (ata %(max_length)s)" -msgid "Small integer" -msgstr "Enteiro pequeno" - msgid "Text" msgstr "Texto" @@ -570,12 +659,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"O valor “%(value)s” ten un formato non válido. Ten que ter o formato HH:MM[:" +"ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"O valor “%(value)s” ten o formato correcto (HH:MM[:ss[.uuuuuu]]) pero non é " +"unha hora válida." msgid "Time" msgstr "Hora" @@ -584,14 +677,14 @@ msgid "URL" msgstr "URL" msgid "Raw binary data" -msgstr "Datos binarios en bruto" +msgstr "Datos binarios en crú" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” non é un UUID válido." msgid "Universally unique identifier" -msgstr "" +msgstr "Identificador único universal" msgid "File" msgstr "Ficheiro" @@ -599,23 +692,29 @@ msgstr "Ficheiro" msgid "Image" msgstr "Imaxe" +msgid "A JSON object" +msgstr "Un obxeto JSON" + +msgid "Value must be valid JSON." +msgstr "O valor ten que ser JSON válido." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "A instancia de %(model)s co %(field)s %(value)r non existe." msgid "Foreign Key (type determined by related field)" -msgstr "Clave Estranxeira (tipo determinado por un campo relacionado)" +msgstr "Clave Foránea (tipo determinado por un campo relacionado)" msgid "One-to-one relationship" msgstr "Relación un a un" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "Relación %(from)s-%(to)s" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "Relacións %(from)s-%(to)s" msgid "Many-to-many relationship" msgstr "Relación moitos a moitos" @@ -642,11 +741,11 @@ msgid "Enter a valid date/time." msgstr "Insira unha data/hora válida." msgid "Enter a valid duration." -msgstr "" +msgstr "Introduza unha duración válida." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "O número de días ten que estar entre {min_days} e {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "" @@ -663,7 +762,11 @@ msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." msgid_plural "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." msgstr[0] "" +"Asegúrese de que este nome de arquivo ten como moito %(max)d caracter (agora " +"ten %(length)d)." msgstr[1] "" +"Asegúrese de que este nome de arquivo ten como moito %(max)d caracteres " +"(agora ten %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" @@ -687,33 +790,41 @@ msgid "Enter a list of values." msgstr "Insira unha lista de valores." msgid "Enter a complete value." -msgstr "" +msgstr "Introduza un valor completo." msgid "Enter a valid UUID." msgstr "Insira un UUID válido." +msgid "Enter a valid JSON." +msgstr "Introduza un JSON válido." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" #, python-format msgid "(Hidden field %(name)s) %(error)s" -msgstr "" +msgstr "(Campo oculto %(name)s) %(error)s." -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" +"Faltan datos ou foron manipulados de ManagementForm. Campos afectados: " +"%(field_names)s. Debería abrir un informe de bug si o problema é persistente." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Por favor envíe como moito %(num)d formulario." +msgstr[1] "Por favor envíe como moito %(num)d formularios." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Por favor envíe polo menos %(num)d formulario." +msgstr[1] "Pro favor envíe polo menos %(num)d formularios." msgid "Order" msgstr "Orde" @@ -741,7 +852,7 @@ msgid "Please correct the duplicate values below." msgstr "Corrixa os valores duplicados de abaixo." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "O valor na liña non coincide ca instancia nai." msgid "Select a valid choice. That choice is not one of the available choices." msgstr "" @@ -750,13 +861,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” non é un valor válido." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s non se puido interpretar na zona hora horaria " +"%(current_timezone)s; pode ser ambiguo ou non existir." msgid "Clear" msgstr "Limpar" @@ -776,15 +889,7 @@ msgstr "Si" msgid "No" msgstr "Non" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "si,non,quizais" @@ -875,40 +980,40 @@ msgid "Sun" msgstr "dom" msgid "January" -msgstr "xaneiro" +msgstr "Xaneiro" msgid "February" -msgstr "febreiro" +msgstr "Febreiro" msgid "March" -msgstr "marzo" +msgstr "Marzo" msgid "April" -msgstr "abril" +msgstr "Abril" msgid "May" -msgstr "maio" +msgstr "Maio" msgid "June" -msgstr "xuño" +msgstr "Xuño" msgid "July" -msgstr "xullo" +msgstr "Xullo" msgid "August" -msgstr "agosto" +msgstr "Agosto" msgid "September" -msgstr "setembro" +msgstr "Setembro" msgid "October" -msgstr "outubro" +msgstr "Outubro" msgid "November" -msgstr "novembro" +msgstr "Novembro" msgid "December" -msgstr "decembro" +msgstr "Decembro" msgid "jan" msgstr "xan" @@ -948,107 +1053,107 @@ msgstr "dec" msgctxt "abbrev. month" msgid "Jan." -msgstr "xan." +msgstr "Xan." msgctxt "abbrev. month" msgid "Feb." -msgstr "feb." +msgstr "Feb." msgctxt "abbrev. month" msgid "March" -msgstr "mar." +msgstr "Marzo" msgctxt "abbrev. month" msgid "April" -msgstr "abr." +msgstr "Abril" msgctxt "abbrev. month" msgid "May" -msgstr "maio" +msgstr "Maio" msgctxt "abbrev. month" msgid "June" -msgstr "xuño" +msgstr "Xuño" msgctxt "abbrev. month" msgid "July" -msgstr "xul." +msgstr "Xullo" msgctxt "abbrev. month" msgid "Aug." -msgstr "ago." +msgstr "Ago." msgctxt "abbrev. month" msgid "Sept." -msgstr "set." +msgstr "Set." msgctxt "abbrev. month" msgid "Oct." -msgstr "out." +msgstr "Out." msgctxt "abbrev. month" msgid "Nov." -msgstr "nov." +msgstr "Nov." msgctxt "abbrev. month" msgid "Dec." -msgstr "dec." +msgstr "Dec." msgctxt "alt. month" msgid "January" -msgstr "xaneiro" +msgstr "Xaneiro" msgctxt "alt. month" msgid "February" -msgstr "febreiro" +msgstr "Febreiro" msgctxt "alt. month" msgid "March" -msgstr "marzo" +msgstr "Marzo" msgctxt "alt. month" msgid "April" -msgstr "abril" +msgstr "Abril" msgctxt "alt. month" msgid "May" -msgstr "maio" +msgstr "Maio" msgctxt "alt. month" msgid "June" -msgstr "xuño" +msgstr "Xuño" msgctxt "alt. month" msgid "July" -msgstr "xullo" +msgstr "Xullo" msgctxt "alt. month" msgid "August" -msgstr "agosto" +msgstr "Agosto" msgctxt "alt. month" msgid "September" -msgstr "setembro" +msgstr "Setembro" msgctxt "alt. month" msgid "October" -msgstr "outubro" +msgstr "Outubro" msgctxt "alt. month" msgid "November" -msgstr "novembro" +msgstr "Novembro" msgctxt "alt. month" msgid "December" -msgstr "decembro" +msgstr "Decembro" msgid "This is not a valid IPv6 address." -msgstr "" +msgstr "Isto non é un enderezo IPv6 válido." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "ou" @@ -1058,81 +1163,95 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ano" -msgstr[1] "%d anos" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d ano" +msgstr[1] "%(num)d anos" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mes" -msgstr[1] "%d meses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mes" +msgstr[1] "%(num)d meses" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semana" +msgstr[1] "%(num)d semanas" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d día" -msgstr[1] "%d días" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d día" +msgstr[1] "%(num)d días" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d horas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutos" msgid "Forbidden" -msgstr "" +msgstr "Denegado" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "Fallóu a verificación CSRF. Abortouse a petición." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Está vendo esta mensaxe porque este sitio HTTPS require que o navegador " +"envíe un \"Referer header\", pero non envióu ningún. Este encabezamento é " +"necesario por razóns de seguridade, para asegurar que o navegador non está " +"sendo suplantado por terceiros." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Se ten o navegador configurado para deshabilitar os encabezamentos " +"\"Referer\", por favor habilíteos polo menos para este sitio, ou para " +"conexións HTTPS, ou para peticións de \"mesmo-orixe\"." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Si está usando a etiqueta " +"ou incluíndo o encabezado “Referrer-Policy: no-referrer”, por favor quíteos. " +"A protección CSRF require o encabezado “Referer” para facer a comprobación " +"estricta de referer. Si lle preocupa a privacidade, use alternativas como para enlazar con sitios de terceiros." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" +"Está vendo esta mensaxe porque este sitio HTTPS require unha cookie CSRF ó " +"enviar formularios. Esta cookie é necesaria por razóns de seguridade, para " +"asegurar que o navegador non está sendo suplantado por terceiros." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Se ten o navegador configurado para deshabilitar as cookies, por favor " +"habilíteas, polo menos para este sitio, ou para peticións de “same-origin”." msgid "More information is available with DEBUG=True." msgstr "Pode ver máis información se establece DEBUG=True." @@ -1141,7 +1260,7 @@ msgid "No year specified" msgstr "Non se especificou ningún ano" msgid "Date out of range" -msgstr "" +msgstr "Data fora de rango" msgid "No month specified" msgstr "Non se especificou ningún mes" @@ -1166,14 +1285,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "A data “%(datestr)s” non é válida para o formato “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Non se atopou ningún/ha %(verbose_name)s que coincidise coa consulta" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "A páxina non é “last” nin se pode converter a int." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1181,53 +1300,57 @@ msgstr "Páxina non válida (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "A lista está baleira pero “%(class_name)s.allow_empty” é False." msgid "Directory indexes are not allowed here." msgstr "Os índices de directorio non están permitidos aquí." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” non existe" #, python-format msgid "Index of %(directory)s" msgstr "Índice de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "A instalación foi un éxito! Noraboa!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"Ver as notas de publicación para Django " +"%(version)s" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" +"Está vendo esta páxina porque no arquivo de axustes ten DEBUG=True e non hai ningunha URL " +"configurada." msgid "Django Documentation" -msgstr "" +msgstr "Documentación de Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temas, referencias, & guías de uso" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "Tutorial: aplicación de enquisas" msgid "Get started with Django" -msgstr "" +msgstr "Comenzar con Django" msgid "Django Community" -msgstr "" +msgstr "Comunidade de Django" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "Conectar, conseguir axuda, ou contribuir" diff --git a/django/conf/locale/gl/formats.py b/django/conf/locale/gl/formats.py index 9f29c239dfc8..73729355ffa8 100644 --- a/django/conf/locale/gl/formats.py +++ b/django/conf/locale/gl/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y \á\s H:i' -YEAR_MONTH_FORMAT = r'F \d\e Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd-m-Y' -SHORT_DATETIME_FORMAT = 'd-m-Y, H:i' +DATE_FORMAT = r"j \d\e F \d\e Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"j \d\e F \d\e Y \á\s H:i" +YEAR_MONTH_FORMAT = r"F \d\e Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = "d-m-Y" +SHORT_DATETIME_FORMAT = "d-m-Y, H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." # NUMBER_GROUPING = diff --git a/django/conf/locale/he/LC_MESSAGES/django.mo b/django/conf/locale/he/LC_MESSAGES/django.mo index 007e72f6c09f..e84ead52d11b 100644 Binary files a/django/conf/locale/he/LC_MESSAGES/django.mo and b/django/conf/locale/he/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/he/LC_MESSAGES/django.po b/django/conf/locale/he/LC_MESSAGES/django.po index a9aed4a8194f..630a99b6d18c 100644 --- a/django/conf/locale/he/LC_MESSAGES/django.po +++ b/django/conf/locale/he/LC_MESSAGES/django.po @@ -1,18 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Alex Gaynor , 2011-2012 +# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011-2012 # Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019 -# אורי רודברג , 2020 +# Meir Kriheli , 2011-2015,2017,2019-2020,2023 +# Menachem G., 2021 +# Menachem G., 2021 +# אורי רודברג , 2021 +# Yaron Shahrabani , 2021 +# אורי רודברג , 2020,2022-2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-19 11:47+0000\n" -"Last-Translator: אורי רודברג \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: Meir Kriheli , " +"2011-2015,2017,2019-2020,2023\n" +"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,6 +31,9 @@ msgstr "אפריקאנס" msgid "Arabic" msgstr "ערבית" +msgid "Algerian Arabic" +msgstr "ערבית אלג'ירית" + msgid "Asturian" msgstr "אסטורית" @@ -50,6 +58,9 @@ msgstr "בוסנית" msgid "Catalan" msgstr "קאטלונית" +msgid "Central Kurdish (Sorani)" +msgstr "כורדית מרכזית (סוראני)" + msgid "Czech" msgstr "צ'כית" @@ -149,6 +160,9 @@ msgstr "אינטרלינגואה" msgid "Indonesian" msgstr "אינדונזית" +msgid "Igbo" +msgstr "איגבו" + msgid "Ido" msgstr "אידו" @@ -179,6 +193,9 @@ msgstr "קאנאדה" msgid "Korean" msgstr "קוריאנית" +msgid "Kyrgyz" +msgstr "קירגיזית" + msgid "Luxembourgish" msgstr "לוקסמבורגית" @@ -200,6 +217,9 @@ msgstr "מונגולי" msgid "Marathi" msgstr "מראטהי" +msgid "Malay" +msgstr "מלאית" + msgid "Burmese" msgstr "בּוּרְמֶזִית" @@ -263,9 +283,15 @@ msgstr "טמילית" msgid "Telugu" msgstr "טלגו" +msgid "Tajik" +msgstr "טג'יקית" + msgid "Thai" msgstr "תאילנדית" +msgid "Turkmen" +msgstr "טורקמנית" + msgid "Turkish" msgstr "טורקית" @@ -275,6 +301,9 @@ msgstr "טטרית" msgid "Udmurt" msgstr "אודמורטית" +msgid "Uyghur" +msgstr "אויגורית" + msgid "Ukrainian" msgstr "אוקראינית" @@ -282,7 +311,7 @@ msgid "Urdu" msgstr "אורדו" msgid "Uzbek" -msgstr "" +msgstr "אוזבקית" msgid "Vietnamese" msgstr "וייטנאמית" @@ -305,6 +334,11 @@ msgstr "קבצים סטטיים" msgid "Syndication" msgstr "הפצת תכנים" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "מספר העמוד אינו מספר שלם" @@ -330,11 +364,13 @@ msgstr "נא להזין כתובת דוא\"ל חוקית" msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"יש להזין 'slug' חוקי המכיל אותיות לטיניות, ספרות, קווים תחתונים או מקפים." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"יש להזין 'slug' חוקי המכיל אותיות יוניקוד, ספרות, קווים תחתונים או מקפים." msgid "Enter a valid IPv4 address." msgstr "יש להזין כתובת IPv4 חוקית." @@ -354,11 +390,23 @@ msgstr "יש לוודא שערך זה הינו %(limit_value)s (כרגע %(show_ #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "יש לוודא שערך זה פחות מ או שווה ל־%(limit_value)s ." +msgstr "יש לוודא שערך זה פחות מ או שווה ל־%(limit_value)s." #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." -msgstr "יש לוודא שהערך גדול מ או שווה ל־%(limit_value)s." +msgstr "יש לוודא שערך זה גדול מ או שווה ל־%(limit_value)s." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "יש לוודא שערך זה מהווה מכפלה של %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"יש לוודא שערך זה מהווה מכפלה של צעד בגודל %(limit_value)s, החל מ־%(offset)s, " +"לדוגמה: %(offset)s, %(valid_value1)s, %(valid_value2)s וכו'." #, python-format msgid "" @@ -426,6 +474,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"סיומת הקובץ \"%(extension)s\" אסורה. הסיומות המותרות הן: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "תווי NULL אינם מותרים. " @@ -437,6 +487,10 @@ msgstr "ו" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s·עם·%(field_labels)s·אלו קיימים כבר." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "המגבלה \"%(name)s\" הופרה." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "ערך %(value)r אינו אפשרות חוקית." @@ -451,8 +505,8 @@ msgstr "שדה זה אינו יכול להיות ריק." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s·עם·%(field_label)s·זה קיימת כבר." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -465,11 +519,11 @@ msgstr "שדה מסוג: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "הערך \"%(value)s\" חייב להיות True או False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "\"%(value)s\" חייב להיות אחד מ־True‏, False, או None." msgid "Boolean (Either True or False)" msgstr "בוליאני (אמת או שקר)" @@ -478,6 +532,9 @@ msgstr "בוליאני (אמת או שקר)" msgid "String (up to %(max_length)s)" msgstr "מחרוזת (עד %(max_length)s תווים)" +msgid "String (unlimited)" +msgstr "מחרוזת (ללא הגבלה)." + msgid "Comma-separated integers" msgstr "מספרים שלמים מופרדים בפסיקים" @@ -486,12 +543,13 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"הערך \"%(value)s\" מכיל פורמט תאריך לא חוקי. חייב להיות בפורמט YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD), אך אינו תאריך חוקי." msgid "Date (without time)" msgstr "תאריך (ללא שעה)" @@ -501,19 +559,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמטYYYY-MM-DD HH:" +"MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"הערך \"%(value)s\" בפורמט הנכון (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) אך אינו " +"מהווה תאריך/שעה חוקיים." msgid "Date (with time)" msgstr "תאריך (כולל שעה)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "הערך \"%(value)s\" חייב להיות מספר עשרוני." msgid "Decimal number" msgstr "מספר עשרוני" @@ -523,6 +585,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"הערך \"%(value)s\" מכיל פורמט לא חוקי. הוא חייב להיות בפורמט [DD] " +"[[HH:]MM:]ss[.uuuuuu]." msgid "Duration" msgstr "משך" @@ -535,7 +599,7 @@ msgstr "נתיב קובץ" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s” חייב להיות מספר נקודה צפה." msgid "Floating point number" msgstr "מספר עשרוני" @@ -550,6 +614,9 @@ msgstr "מספר שלם" msgid "Big (8 byte) integer" msgstr "מספר שלם גדול (8 בתים)" +msgid "Small integer" +msgstr "מספר שלם קטן" + msgid "IPv4 address" msgstr "כתובת IPv4" @@ -558,11 +625,14 @@ msgstr "כתובת IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "\"%(value)s\" חייב להיות אחד מ־None‏, True, או False." msgid "Boolean (Either True, False or None)" msgstr "בוליאני (אמת, שקר או כלום)" +msgid "Positive big integer" +msgstr "מספר שלם גדול וחיובי" + msgid "Positive integer" msgstr "מספר שלם חיובי" @@ -573,9 +643,6 @@ msgstr "מספר שלם חיובי קטן" msgid "Slug (up to %(max_length)s)" msgstr "Slug (עד %(max_length)s תווים)" -msgid "Small integer" -msgstr "מספר שלם קטן" - msgid "Text" msgstr "טקסט" @@ -584,12 +651,15 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"הערך “%(value)s” מכיל פורמט לא חוקי. הוא חייב להיות בפורמט HH:MM[:ss[." +"uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"הערך “%(value)s” בפורמט הנכון (HH:MM[:ss[.uuuuuu]]) אך אינו מהווה שעה חוקית." msgid "Time" msgstr "זמן" @@ -602,7 +672,7 @@ msgstr "מידע בינארי גולמי" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "\"%(value)s\" אינו UUID חוקי." msgid "Universally unique identifier" msgstr "מזהה ייחודי אוניברסלי" @@ -613,6 +683,12 @@ msgstr "קובץ" msgid "Image" msgstr "תמונה" +msgid "A JSON object" +msgstr "אובייקט JSON" + +msgid "Value must be valid JSON." +msgstr "הערך חייב להיות JSON חוקי." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "פריט %(model)s עם %(field)s %(value)r אינו קיים." @@ -704,6 +780,9 @@ msgstr "יש להזין ערך שלם." msgid "Enter a valid UUID." msgstr "יש להזין UUID חוקי." +msgid "Enter a valid JSON." +msgstr "נא להזין JSON חוקי." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -712,24 +791,29 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(שדה מוסתר %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "מידע ManagementForm חסר או התעסקו איתו." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"המידע של ManagementForm חסר או שובש. שדות חסרים: %(field_names)s. יתכן " +"שתצטרך להגיש דיווח באג אם הבעיה נמשכת." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "נא לשלוח טופס %d לכל היותר." -msgstr[1] "נא לשלוח %d טפסים לכל היותר." -msgstr[2] "נא לשלוח %d טפסים לכל היותר." -msgstr[3] "נא לשלוח %d טפסים לכל היותר." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "נא לשלוח טופס %(num)d לכל היותר." +msgstr[1] "נא לשלוח %(num)d טפסים לכל היותר." +msgstr[2] "נא לשלוח %(num)d טפסים לכל היותר." +msgstr[3] "נא לשלוח %(num)d טפסים לכל היותר." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "נא לשלוח טופס %d או יותר." -msgstr[1] "נא לשלוח %d טפסים או יותר." -msgstr[2] "נא לשלוח %d טפסים או יותר." -msgstr[3] "נא לשלוח %d טפסים או יותר." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "נא לשלוח טופס %(num)dאו יותר." +msgstr[1] "נא לשלוח %(num)d טפסים או יותר." +msgstr[2] "נא לשלוח %(num)d טפסים או יותר." +msgstr[3] "נא לשלוח %(num)d טפסים או יותר." msgid "Order" msgstr "מיון" @@ -771,6 +855,8 @@ msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"לא ניתן לפרש את %(datetime)s באזור הזמן %(current_timezone)s; הוא עשוי להיות " +"דו־משמעי או לא קיים." msgid "Clear" msgstr "לסלק" @@ -790,15 +876,7 @@ msgstr "כן" msgid "No" msgstr "לא" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "כן,לא,אולי" @@ -1074,55 +1152,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "שנה %d" -msgstr[1] "%d שנים" -msgstr[2] "%d שנים" -msgstr[3] "%d שנים" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "שנה" +msgstr[1] "שנתיים" +msgstr[2] "%(num)d שנים" +msgstr[3] "%(num)d שנים" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "חודש %d" -msgstr[1] "%d חודשים" -msgstr[2] "%d חודשים" -msgstr[3] "%d חודשים" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "חודש" +msgstr[1] "חודשיים" +msgstr[2] "%(num)d חודשים" +msgstr[3] "%(num)d חודשים" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "שבוע %d" -msgstr[1] "%d שבועות" -msgstr[2] "%d שבועות" -msgstr[3] "%d שבועות" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "שבוע" +msgstr[1] "שבועיים" +msgstr[2] "%(num)d שבועות" +msgstr[3] "%(num)d שבועות" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "יום %d" -msgstr[1] "%d ימים" -msgstr[2] "%d ימים" -msgstr[3] "%d ימים" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "יום" +msgstr[1] "יומיים" +msgstr[2] "%(num)d ימים" +msgstr[3] "%(num)d ימים" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "שעה %d" -msgstr[1] "%d שעות" -msgstr[2] "%d שעות" -msgstr[3] "%d שעות" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "שעה" +msgstr[1] "שעתיים" +msgstr[2] "%(num)d שעות" +msgstr[3] "%(num)d שעות" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "דקה %d" -msgstr[1] "%d דקות" -msgstr[2] "%d דקות" -msgstr[3] "%d דקות" - -msgid "0 minutes" -msgstr "0 דקות" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "דקה" +msgstr[1] "%(num)d דקות" +msgstr[2] "%(num)d דקות" +msgstr[3] "%(num)d דקות" msgid "Forbidden" msgstr "אסור" @@ -1132,24 +1207,33 @@ msgstr "אימות CSRF נכשל. הבקשה בוטלה." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"הודעה זו מופיעה מאחר ואתר ה־HTTPS הזה דורש מהדפדפן שלך לשלוח \"Referer " +"header\", אך הוא לא נשלח. זה נדרש מסיבות אבטחה, כדי להבטיח שהדפדפן שלך לא " +"נחטף ע\"י צד שלישי." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"אם ביטלת \"Referer\" headers בדפדפן שלך, נא לאפשר אותם מחדש, לפחות עבור אתר " +"זה, חיבורי HTTPS או בקשות \"same-origin\"." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"אם השתמשת בתגאו הוספת header " +"של “Referrer-Policy: no-referrer”, נא להסיר אותם. הגנת ה־CSRF דורשת " +"‎“Referer” header לבדיקת ה־referer. אם פרטיות מדאיגה אותך, ניתן להשתמש " +"בתחליפים כמו לקישור אל אתרי צד שלישי." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1163,24 +1247,26 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"אם ביטלת עוגיות בדפדפן שלך, נא לאפשר אותם מחדש לפחות עבור אתר זה או בקשות " +"“same-origin”." msgid "More information is available with DEBUG=True." msgstr "מידע נוסף זמין עם " msgid "No year specified" -msgstr "לא צויינה שנה" +msgstr "לא צוינה שנה" msgid "Date out of range" msgstr "תאריך מחוץ לטווח" msgid "No month specified" -msgstr "לא צויין חודש" +msgstr "לא צוין חודש" msgid "No day specified" -msgstr "לא צויין יום" +msgstr "לא צוין יום" msgid "No week specified" -msgstr "לא צויין שבוע" +msgstr "לא צוין שבוע" #, python-format msgid "No %(verbose_name_plural)s available" @@ -1196,14 +1282,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "מחרוזת תאריך %(datestr)s אינה חוקית בפורמט %(format)s." #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "לא נמצא/ה %(verbose_name)s התואם/ת לשאילתה" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "העמוד אינו \"last\" או לא ניתן להמרה למספר שם." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1211,21 +1297,21 @@ msgstr "עמוד לא חוקי (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "רשימה ריקה ו־“%(class_name)s.allow_empty” הוא False." msgid "Directory indexes are not allowed here." msgstr "אינדקסים על תיקיה אסורים כאן." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" אינו קיים" #, python-format msgid "Index of %(directory)s" msgstr "אינדקס של %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: תשתית הווב לפרפקציוניסטים עם תאריכי יעד." +msgid "The install worked successfully! Congratulations!" +msgstr "ההתקנה עברה בהצלחה! מזל טוב!" #, python-format msgid "" @@ -1235,25 +1321,22 @@ msgstr "" "ראו הערות השחרור עבור Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "ההתקנה עברה בהצלחה! מזל טוב!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "עמוד זה מופיע בעקבות המצאות DEBUG=True בקובץ ההגדרות שלך ולא הגדרת שום URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True בקובץ ההגדרות שלך ולא הגדרת שום URLs." msgid "Django Documentation" msgstr "תיעוד Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "נושאים, הפניות ומדריכים לביצוע" msgid "Tutorial: A Polling App" msgstr "מדריך ללומד: יישום לסקרים." diff --git a/django/conf/locale/he/formats.py b/django/conf/locale/he/formats.py index 23145654429d..2cf9286555fa 100644 --- a/django/conf/locale/he/formats.py +++ b/django/conf/locale/he/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j בF Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j בF Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j בF' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +DATE_FORMAT = "j בF Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j בF Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j בF" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" # FIRST_DAY_OF_WEEK = # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," # NUMBER_GROUPING = diff --git a/django/conf/locale/hi/LC_MESSAGES/django.mo b/django/conf/locale/hi/LC_MESSAGES/django.mo index 870aaa65bfbd..2d535fb054e6 100644 Binary files a/django/conf/locale/hi/LC_MESSAGES/django.mo and b/django/conf/locale/hi/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/hi/LC_MESSAGES/django.po b/django/conf/locale/hi/LC_MESSAGES/django.po index 9d4557b65aa5..20da37666ac3 100644 --- a/django/conf/locale/hi/LC_MESSAGES/django.po +++ b/django/conf/locale/hi/LC_MESSAGES/django.po @@ -2,16 +2,18 @@ # # Translators: # alkuma , 2013 +# Bharat Toge, 2022 # Chandan kumar , 2012 +# Claude Paroz , 2020 # Jannis Leidel , 2011 # Pratik , 2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2022-05-17 05:23-0500\n" +"PO-Revision-Date: 2022-07-25 06:49+0000\n" +"Last-Translator: Bharat Toge\n" "Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +27,9 @@ msgstr "अफ़्रीकांस" msgid "Arabic" msgstr "अरबी" +msgid "Algerian Arabic" +msgstr "अल्जीरियाई अरब" + msgid "Asturian" msgstr "" @@ -71,7 +76,7 @@ msgid "English" msgstr "अंग्रेज़ी " msgid "Australian English" -msgstr "" +msgstr "ऑस्ट्रेलियाई अंग्रेज़ी " msgid "British English" msgstr "ब्रिटिश अंग्रेजी" @@ -86,7 +91,7 @@ msgid "Argentinian Spanish" msgstr "अर्जेंटीना स्पैनिश " msgid "Colombian Spanish" -msgstr "" +msgstr "कोलंबियाई स्पेनी" msgid "Mexican Spanish" msgstr "मेक्सिकन स्पैनिश" @@ -148,6 +153,9 @@ msgstr "इंतर्लिंगुआ" msgid "Indonesian" msgstr "इन्डोनेशियन " +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "" @@ -178,6 +186,9 @@ msgstr "कन्‍नड़" msgid "Korean" msgstr "कोरियन" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "लक्संबर्गी" @@ -197,7 +208,10 @@ msgid "Mongolian" msgstr "मंगोलियन" msgid "Marathi" -msgstr "" +msgstr "मराठी" + +msgid "Malay" +msgstr "मलय भाषा" msgid "Burmese" msgstr "बर्मीज़" @@ -262,9 +276,15 @@ msgstr "तमिल" msgid "Telugu" msgstr "तेलुगु" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "थाई" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "तुर्किश" @@ -281,7 +301,7 @@ msgid "Urdu" msgstr "उर्दू" msgid "Uzbek" -msgstr "" +msgstr "उज़्बेक" msgid "Vietnamese" msgstr "वियतनामी" @@ -293,25 +313,30 @@ msgid "Traditional Chinese" msgstr "पारम्परिक चीनी" msgid "Messages" -msgstr "" +msgstr "संदेश" msgid "Site Maps" -msgstr "" +msgstr "साइट मैप" msgid "Static Files" -msgstr "" +msgstr "स्थिर फ़ाइलें" msgid "Syndication" +msgstr "सिंडिकेशन" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" msgstr "" msgid "That page number is not an integer" -msgstr "" +msgstr "यह पृष्ठ संख्या पूर्णांक नहीं है" msgid "That page number is less than 1" -msgstr "" +msgstr "यह पृष्ठ संख्या 1 से कम है " msgid "That page contains no results" -msgstr "" +msgstr "उस पृष्ठ पर कोई परिणाम नहीं हैं" msgid "Enter a valid value." msgstr "एक मान्य मूल्य दर्ज करें" @@ -320,7 +345,7 @@ msgid "Enter a valid URL." msgstr "वैध यू.आर.एल भरें ।" msgid "Enter a valid integer." -msgstr "" +msgstr "एक मान्य पूर्ण संख्या दर्ज करें" msgid "Enter a valid email address." msgstr "वैध डाक पता प्रविष्ट करें।" @@ -361,6 +386,10 @@ msgstr "सुनिश्चित करें कि यह मान %(limi msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "सुनिश्चित करें यह मान %(limit_value)s से बड़ा या बराबर है ।" +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -420,6 +449,10 @@ msgstr "और" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "" +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "" @@ -434,8 +467,8 @@ msgstr "इस फ़ील्ड रिक्त नहीं हो सकत msgid "%(model_name)s with this %(field_label)s already exists." msgstr "इस %(field_label)s के साथ एक %(model_name)s पहले से ही उपस्थित है ।" -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -507,7 +540,7 @@ msgid "" msgstr "" msgid "Duration" -msgstr "" +msgstr "अवधि" msgid "Email address" msgstr "ईमेल पता" @@ -532,6 +565,9 @@ msgstr "पूर्णांक" msgid "Big (8 byte) integer" msgstr "बड़ा (8 बाइट) पूर्णांक " +msgid "Small integer" +msgstr "छोटा पूर्णांक" + msgid "IPv4 address" msgstr "IPv4 पता" @@ -545,6 +581,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "बूलियन (सही, गलत या कुछ नहीं)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "धनात्मक पूर्णांक" @@ -555,9 +594,6 @@ msgstr "धनात्मक छोटा पूर्णांक" msgid "Slug (up to %(max_length)s)" msgstr "स्लग (%(max_length)s तक)" -msgid "Small integer" -msgstr "छोटा पूर्णांक" - msgid "Text" msgstr "पाठ" @@ -595,6 +631,12 @@ msgstr "फाइल" msgid "Image" msgstr "छवि" +msgid "A JSON object" +msgstr "एक JSON डेटा object" + +msgid "Value must be valid JSON." +msgstr "दर्ज किया गया डेटा वैध JSON होना अनिवार्य है" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -638,11 +680,11 @@ msgid "Enter a valid date/time." msgstr "वैध तिथि/समय भरें ।" msgid "Enter a valid duration." -msgstr "" +msgstr "एक वैध अवधी दर्ज करें" #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "दिनों की संख्या {min_days} और {max_days} के बीच होना अनिवार्य है " msgid "No file was submitted. Check the encoding type on the form." msgstr "कोई संचिका निवेदित नहीं हुई । कृपया कूटलेखन की जाँच करें ।" @@ -679,7 +721,10 @@ msgid "Enter a complete value." msgstr "" msgid "Enter a valid UUID." -msgstr "" +msgstr "एक वैध UUID भरें " + +msgid "Enter a valid JSON." +msgstr "एक वैध JSON भरें " #. Translators: This is the default suffix added to form field labels msgid ":" @@ -689,18 +734,21 @@ msgstr "" msgid "(Hidden field %(name)s) %(error)s" msgstr "" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." msgstr[0] "" msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." msgstr[0] "" msgstr[1] "" @@ -763,17 +811,9 @@ msgstr "हाँ" msgid "No" msgstr "नहीं" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "हाँ, नहीं, शायद" +msgstr "हाँ,नहीं,शायद" #, python-format msgid "%(size)d byte" @@ -1045,53 +1085,50 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" +msgid "%(num)d year" +msgid_plural "%(num)d years" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" +msgid "%(num)d month" +msgid_plural "%(num)d months" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" +msgid "%(num)d day" +msgid_plural "%(num)d days" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" msgstr[0] "" msgstr[1] "" -msgid "0 minutes" -msgstr "" - msgid "Forbidden" msgstr "" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "CSRF सत्यापन असफल रहा. Request निरस्त की गई " msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1181,7 +1218,7 @@ msgstr "" msgid "Index of %(directory)s" msgstr "%(directory)s का अनुक्रमणिका" -msgid "Django: the Web framework for perfectionists with deadlines." +msgid "The install worked successfully! Congratulations!" msgstr "" #, python-format @@ -1190,9 +1227,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2016-2019 +# Michael Wolf , 2016-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Michael Wolf , 2016-2024\n" +"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" "language/hsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" msgid "Afrikaans" msgstr "Afrikaanšćina" @@ -24,6 +24,9 @@ msgstr "Afrikaanšćina" msgid "Arabic" msgstr "Arabšćina" +msgid "Algerian Arabic" +msgstr "Algeriska arabšćina" + msgid "Asturian" msgstr "Asturišćina" @@ -48,6 +51,9 @@ msgstr "Bosnišćina" msgid "Catalan" msgstr "Katalanšćina" +msgid "Central Kurdish (Sorani)" +msgstr "Centralna kurdišćina (Sorani)" + msgid "Czech" msgstr "Čěšćina" @@ -147,6 +153,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonezišćina" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -177,6 +186,9 @@ msgstr "Kannadšćina" msgid "Korean" msgstr "Korejšćina" +msgid "Kyrgyz" +msgstr "Kirgišćina" + msgid "Luxembourgish" msgstr "Luxemburgšćina" @@ -198,6 +210,9 @@ msgstr "Mongolšćina" msgid "Marathi" msgstr "Marathišćina" +msgid "Malay" +msgstr "Malajšćina" + msgid "Burmese" msgstr "Myanmaršćina" @@ -261,9 +276,15 @@ msgstr "Tamilšćina" msgid "Telugu" msgstr "Telugušćina" +msgid "Tajik" +msgstr "Tadźikišćina" + msgid "Thai" msgstr "Thaišćina" +msgid "Turkmen" +msgstr "Turkmenšćina" + msgid "Turkish" msgstr "Turkowšćina" @@ -273,6 +294,9 @@ msgstr "Tataršćina" msgid "Udmurt" msgstr "Udmurtšćina" +msgid "Uyghur" +msgstr "Ujguršćina" + msgid "Ukrainian" msgstr "Ukrainšćina" @@ -280,7 +304,7 @@ msgid "Urdu" msgstr "Urdušćina" msgid "Uzbek" -msgstr "" +msgstr "Uzbekšćina" msgid "Vietnamese" msgstr "Vietnamšćina" @@ -303,6 +327,11 @@ msgstr "Statiske dataje" msgid "Syndication" msgstr "Syndikacija" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Tute čisko strony cyła ličba njeje." @@ -315,6 +344,9 @@ msgstr "Tuta strona wuslědki njewobsahuje" msgid "Enter a valid value." msgstr "Zapodajće płaćiwu hódnotu." +msgid "Enter a valid domain name." +msgstr "Zapodajće płaćiwe domenowe mjeno." + msgid "Enter a valid URL." msgstr "Zapodajće płaćiwy URL." @@ -338,14 +370,18 @@ msgstr "" "Zapodajće płaćiwe „adresowe mjeno“, kotrež jenož pismiki, ličby, podsmužki " "abo wjazawki wobsahuje." -msgid "Enter a valid IPv4 address." -msgstr "Zapodajće płaćiwu IPv4-adresu." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Zapodajće płaćiwu %(protocol)s-adresu." -msgid "Enter a valid IPv6 address." -msgstr "Zapodajće płaćiwu IPv6-adresu." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Zapodajće płaćiwu IPv4- abo IPv6-adresu." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 abo IPv6" msgid "Enter only digits separated by commas." msgstr "Zapodajće jenož přez komy dźělene cyfry," @@ -362,6 +398,20 @@ msgstr "Zawěsćće, zo hódnota je mjeńša hač abo runja %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Zawěsćće, zo tuta hódnota je wjetša hač abo runja %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Zawěsćće, zo tuta hódnota je množina kročeloweje wulkosće %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Zawěsćće, zo tuta hódnota je mnoho króć kročeloweje wulkosće " +"%(limit_value)s, započinajo z %(offset)s, na př. %(offset)s, " +"%(valid_value1)s, %(valid_value2)s a tak dale." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -449,6 +499,10 @@ msgstr "a" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s z tutym %(field_labels)s hižo eksistuje." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Wobmjezowanje \"%(name)s\" je překročene." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Hódnota %(value)r płaćiwa wólba njeje." @@ -463,8 +517,8 @@ msgstr "Tute polo njesmě prózdne być." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s z tutym %(field_label)s hižo eksistuje." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -490,6 +544,9 @@ msgstr "Boolean (pak True pak False)" msgid "String (up to %(max_length)s)" msgstr "Znamješkowy rjećazk (hač %(max_length)s)" +msgid "String (unlimited)" +msgstr "Znamješkowy rjećazk (njewobmjezowany)" + msgid "Comma-separated integers" msgstr "Cyłe ličby dźělene přez komu" @@ -556,14 +613,14 @@ msgstr "Datajowa šćežka" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Hódnota „%(value)s“ dyrbi decimalna ličba być." msgid "Floating point number" msgstr "Komowa ličba typa float" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Hódnota „%(value)s“ dyrbi integer być." msgid "Integer" msgstr "Integer" @@ -571,6 +628,9 @@ msgstr "Integer" msgid "Big (8 byte) integer" msgstr "Big (8 byte) integer" +msgid "Small integer" +msgstr "Mała cyła ličba" + msgid "IPv4 address" msgstr "IPv4-adresa" @@ -579,11 +639,14 @@ msgstr "IP-adresa" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Hódnota „%(value)s“ dyrbi pak None, True pak False być." msgid "Boolean (Either True, False or None)" msgstr "Boolean (pak True, False pak None)" +msgid "Positive big integer" +msgstr "Pozitiwna wulka cyła ličba" + msgid "Positive integer" msgstr "Pozitiwna cyła ličba" @@ -594,9 +657,6 @@ msgstr "Pozitiwna mała cyła ličba" msgid "Slug (up to %(max_length)s)" msgstr "Adresowe mjeno (hač %(max_length)s)" -msgid "Small integer" -msgstr "Mała cyła ličba" - msgid "Text" msgstr "Tekst" @@ -605,12 +665,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Hódnota „%(value)s“ ma njepłaćiwy format. Dyrbi we formaće HH:MM[:ss[." +"uuuuuu]] być." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Hódnota „%(value)s“ ma korektny format (HH:MM[:ss[.uuuuuu]]), ale je " +"njepłaćiwy čas." msgid "Time" msgstr "Čas" @@ -623,7 +687,7 @@ msgstr "Hrube binarne daty" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "„%(value)s“ płaćiwy UUID njeje." msgid "Universally unique identifier" msgstr "Uniwerselnje jónkróćny identifikator" @@ -634,6 +698,12 @@ msgstr "Dataja" msgid "Image" msgstr "Wobraz" +msgid "A JSON object" +msgstr "JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Hódnota dyrbi płaćiwy JSON być." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Instanca %(model)s z %(field)s %(value)r njeeksistuje." @@ -735,6 +805,9 @@ msgstr "Zapodajće dospołnu hódnotu." msgid "Enter a valid UUID." msgstr "Zapodajće płaćiwy UUID." +msgid "Enter a valid JSON." +msgstr "Zapodajće płaćiwy JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -743,24 +816,29 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Schowane polo field %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Daty ManagementForm faluja abo su so sfalšowali" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Daty ManagementForm faluja abo su skepsane. Falowace pola: %(field_names)s. " +"Móžeće zmylkowu rozprawu spisać, jeli problem dale eksistuje." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Prošu wotpósćelće %d formular" -msgstr[1] "Prošu wotpósćelće %d formularaj abo mjenje" -msgstr[2] "Prošu wotpósćelće %d formulary abo mjenje" -msgstr[3] "Prošu wotpósćelće %d formularow abo mjenje" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Prošu wotposćelće maksimalnje %(num)d formular." +msgstr[1] "Prošu wotposćelće maksimalnje %(num)d formularaj." +msgstr[2] "Prošu wotposćelće maksimalnje %(num)d formulary." +msgstr[3] "Prošu wotposćelće maksimalnje %(num)d formularow." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Prošu wotpósćelće %d formular abo wjace" -msgstr[1] "Prošu wotpósćelće %d formularaj abo wjace" -msgstr[2] "Prošu wotpósćelće %d formulary abo wjace" -msgstr[3] "Prošu wotpósćelće %d formularow abo wjace" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Prošu zapodajće znajmjeńša %(num)d formu." +msgstr[1] "Prošu zapodajće znajmjeńša %(num)d formje." +msgstr[2] "Prošu zapodajće znajmjeńša %(num)d formy." +msgstr[3] "Prošu zapodajće znajmjeńša %(num)d formow." msgid "Order" msgstr "Porjad" @@ -797,13 +875,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" płaćiwa hódnota njeje." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s njeda so w časowym pasmje %(current_timezone)s interpretować; " +"je snano dwuzmyslny abo njeeksistuje." msgid "Clear" msgstr "Zhašeć" @@ -823,15 +903,7 @@ msgstr "Haj" msgid "No" msgstr "Ně" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "haj,ně,snano" @@ -1107,55 +1179,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d lěto" -msgstr[1] "%d lěće" -msgstr[2] "%d lěta" -msgstr[3] "%d lět" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d lěto" +msgstr[1] "%(num)dlěće" +msgstr[2] "%(num)d lěta" +msgstr[3] "%(num)d lět" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d měsac" -msgstr[1] "%d měsacaj" -msgstr[2] "%d měsacy" -msgstr[3] "%d měsacow" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d měsac" +msgstr[1] "%(num)d měsacaj" +msgstr[2] "%(num)d měsacy" +msgstr[3] "%(num)d měsacow" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tydźeń" -msgstr[1] "%d njedźeli" -msgstr[2] "%d njedźele" -msgstr[3] "%d njedźel" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d tydźeń" +msgstr[1] "%(num)d njedźeli" +msgstr[2] "%(num)d njedźele" +msgstr[3] "%(num)d njedźel" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dźeń" -msgstr[1] "%d njej" -msgstr[2] "%d dny" -msgstr[3] "%d dnjow" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dźeń" +msgstr[1] "%(num)d dnjej" +msgstr[2] "%(num)d dny" +msgstr[3] "%(num)d dnjow" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hodźina" -msgstr[1] "%d hodźinje" -msgstr[2] "%d hodźiny" -msgstr[3] "%d hodźin" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hodźina" +msgstr[1] "%(num)d hodźinje" +msgstr[2] "%(num)d hodźiny" +msgstr[3] "%(num)d hodźin" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d mjeńšina" -msgstr[1] "%d mjeńšinje" -msgstr[2] "%d mjeńšiny" -msgstr[3] "%d mjeńšin" - -msgid "0 minutes" -msgstr "0 mjeńšin" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d mjeńšina" +msgstr[1] "%(num)d mjeńšinje" +msgstr[2] "%(num)d mjeńšiny" +msgstr[3] "%(num)d mjeńšin" msgid "Forbidden" msgstr "Zakazany" @@ -1165,24 +1234,35 @@ msgstr "CSRF-přepruwowanje je so nimokuliło. Naprašowanje je so přetorhnył msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Widźiće tutu zdźělenku, dokelž tute HTTPS-sydło \"Referer header\" trjeba, " +"kotryž so ma na waš webwobhladowak pósłać, ale žadyn njeje so pósłał. Tutón " +"header je z wěstotnych přičinow trěbny, zo by so zawěsćiło, zo waš " +"wobhladowak so wot třećich njekapruje." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Jei sće swój wobhladowak tak konfigurował, zo su hłowy „Referer“ " +"znjemóžnjene, zmóžńće je, znajmjeńša za tute sydło abo za HTTPS-zwiski abo " +"za naprašowanja „sameorigin“." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Jeli značku wužiwaće abo hłowu „Referrer-Policy: no-referrer“ zapřijimaće, " +"wotstrońće je prošu. CSRF-škit trjeba hłowu „Referer“ , zo by striktnu " +"kontrolu referer přewjedźe. Jeli so wo priwatnosć staraće, wužiwajće " +"alternatiwy kaž za wotkazy k sydłam třećich." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1197,6 +1277,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Jeli sće swój wobhladowak tak konfigurował, zo su placki znjemóžnjene, " +"zmóžńće je zaso, znajmjeńša za tute sydło abo za naprašowanja „same-origin“." msgid "More information is available with DEBUG=True." msgstr "Z DEBUG=True su dalše informacije k dispoziciji." @@ -1231,13 +1313,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Njepłaćiwy „%(format)s“ za datumowy znamješkowy rjaćazk „%(datestr)s“ podaty" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Žane %(verbose_name)s namakane, kotrež naprašowanju wotpowěduje" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Strona „last“ njeje, ani njeda so do int konwertować." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1245,21 +1328,21 @@ msgstr "Njepłaćiwa strona (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Prózdna lisćina a „%(class_name)s.allow_empty“ je False." msgid "Directory indexes are not allowed here." msgstr "Zapisowe indeksy tu dowolone njejsu." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "„%(path)s“ njeeksistuje" #, python-format msgid "Index of %(directory)s" msgstr "Indeks %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Web framework za perfekcionistow z terminami." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacija bě wuspěšna! Zbožopřeće!" #, python-format msgid "" @@ -1270,25 +1353,23 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">wersijowe informacije za Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija bě wuspěšna! Zbožopřeće!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Widźiće tutu stronu, dokelž DEBUG=True je we wašej dataji nastajenjow a njejsće URL skonfigurował." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True je we wašej dataji nastajenjow a njejsće URL " +"skonfigurował." msgid "Django Documentation" msgstr "Dokumentacija Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temy, referency a nawody" msgid "Tutorial: A Polling App" msgstr "Nawod: Naprašowanske nałoženje" diff --git a/django/conf/locale/hu/LC_MESSAGES/django.mo b/django/conf/locale/hu/LC_MESSAGES/django.mo index 05cbb548797c..f55eb626b48e 100644 Binary files a/django/conf/locale/hu/LC_MESSAGES/django.mo and b/django/conf/locale/hu/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/hu/LC_MESSAGES/django.po b/django/conf/locale/hu/LC_MESSAGES/django.po index dfe97cf3e98f..117789e33e36 100644 --- a/django/conf/locale/hu/LC_MESSAGES/django.po +++ b/django/conf/locale/hu/LC_MESSAGES/django.po @@ -2,22 +2,25 @@ # # Translators: # Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016-2019 +# András Veres-Szentkirályi, 2016-2021,2023 # Attila Nagy <>, 2012 +# Balázs Meskó , 2024 +# Balázs R, 2023 # Dóra Szendrei , 2017 # Istvan Farkas , 2019 # Jannis Leidel , 2011 # János R, 2011-2012,2014 +# János R, 2022 # Máté Őry , 2013 # Szilveszter Farkas , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-18 10:10+0000\n" -"Last-Translator: Istvan Farkas \n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-12 06:49+0000\n" +"Last-Translator: Balázs Meskó , 2024\n" +"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" "hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,6 +34,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arab" +msgid "Algerian Arabic" +msgstr "algériai arab" + msgid "Asturian" msgstr "Asztúriai" @@ -55,6 +61,9 @@ msgstr "Bosnyák" msgid "Catalan" msgstr "Katalán" +msgid "Central Kurdish (Sorani)" +msgstr "Közép-kurd (szoráni)" + msgid "Czech" msgstr "Cseh" @@ -154,6 +163,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonéz" +msgid "Igbo" +msgstr "igbo" + msgid "Ido" msgstr "Ido" @@ -184,6 +196,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreai" +msgid "Kyrgyz" +msgstr "kirgiz" + msgid "Luxembourgish" msgstr "Luxemburgi" @@ -205,6 +220,9 @@ msgstr "Mongol" msgid "Marathi" msgstr "Maráthi" +msgid "Malay" +msgstr "Maláj" + msgid "Burmese" msgstr "Burmai" @@ -268,9 +286,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tádzsik" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "Türkmén" + msgid "Turkish" msgstr "Török" @@ -280,6 +304,9 @@ msgstr "Tatár" msgid "Udmurt" msgstr "Udmurt" +msgid "Uyghur" +msgstr "Ujgur" + msgid "Ukrainian" msgstr "Ukrán" @@ -310,6 +337,11 @@ msgstr "Statikus fájlok" msgid "Syndication" msgstr "Szindikáció" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Az oldalszám nem egész szám." @@ -371,6 +403,18 @@ msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy kisebb." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s, vagy nagyobb." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Bizonyosodjon meg arról, hogy az érték %(limit_value)s többszöröse." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Az érték %(limit_value)s többszörösével kell hogy eltérjen %(offset)s-hoz " +"képest, pl. %(offset)s, %(valid_value1)s, %(valid_value2)s, és így tovább. " + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -446,6 +490,10 @@ msgstr "és" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Már létezik %(model_name)s ilyennel: %(field_labels)s." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "„%(name)s” megszorítás megsértve." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r érték érvénytelen." @@ -460,8 +508,8 @@ msgstr "Ez a mező nem lehet üres." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Már létezik %(model_name)s ilyennel: %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -488,6 +536,9 @@ msgstr "Logikai (True vagy False)" msgid "String (up to %(max_length)s)" msgstr "Karakterlánc (%(max_length)s hosszig)" +msgid "String (unlimited)" +msgstr "Karakterlánc (korlátlan hosszúságú)" + msgid "Comma-separated integers" msgstr "Vesszővel elválasztott egészek" @@ -570,6 +621,9 @@ msgstr "Egész" msgid "Big (8 byte) integer" msgstr "Nagy egész szám (8 bájtos)" +msgid "Small integer" +msgstr "Kis egész" + msgid "IPv4 address" msgstr "IPv4 cím" @@ -583,6 +637,9 @@ msgstr "Az \"%(value)s\" értéke csak üres, True, vagy False lehet." msgid "Boolean (Either True, False or None)" msgstr "Logikai (True, False vagy None)" +msgid "Positive big integer" +msgstr "Pozitív nagy egész" + msgid "Positive integer" msgstr "Pozitív egész" @@ -593,9 +650,6 @@ msgstr "Pozitív kis egész" msgid "Slug (up to %(max_length)s)" msgstr "URL-barát cím (%(max_length)s hosszig)" -msgid "Small integer" -msgstr "Kis egész" - msgid "Text" msgstr "Szöveg" @@ -637,6 +691,12 @@ msgstr "Fájl" msgid "Image" msgstr "Kép" +msgid "A JSON object" +msgstr "Egy JSON objektum" + +msgid "Value must be valid JSON." +msgstr "Az érték érvényes JSON kell legyen." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s példány %(value)r %(field)s értékkel nem létezik." @@ -732,6 +792,9 @@ msgstr "Adjon meg egy teljes értéket." msgid "Enter a valid UUID." msgstr "Adjon meg egy érvényes UUID-t." +msgid "Enter a valid JSON." +msgstr "Adjon meg egy érvényes JSON-t." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -740,20 +803,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Rejtett mező: %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm adatok hiányoznak vagy belenyúltak" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm adatok hiányoznak vagy hamisításra kerültek. A hiányzó mezők: " +"%(field_names)s. Ha ez többször is előfordul, érdemes bejelenteni hibaként." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Legfeljebb %d űrlapot küldjön be." -msgstr[1] "Legfeljebb %d űrlapot küldjön be." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Legfeljebb %(num)d űrlapot küldjön be." +msgstr[1] "Legfeljebb %(num)d űrlapot küldjön be." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Legalább %d űrlapot küldjön be." -msgstr[1] "Legalább %d űrlapot küldjön be." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Legalább %(num)d űrlapot küldjön be." +msgstr[1] "Legalább %(num)d űrlapot küldjön be." msgid "Order" msgstr "Sorrend" @@ -820,15 +888,7 @@ msgstr "Igen" msgid "No" msgstr "Nem" -msgid "Year" -msgstr "Év" - -msgid "Month" -msgstr "Hónap" - -msgid "Day" -msgstr "Nap" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "igen,nem,talán" @@ -1102,53 +1162,50 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d év" -msgstr[1] "%d év" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d év" +msgstr[1] "%(num)d év" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d hónap" -msgstr[1] "%d hónap" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d hónap" +msgstr[1] "%(num)d hónap" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d hét" -msgstr[1] "%d hét" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d hét" +msgstr[1] "%(num)d hét" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d nap" -msgstr[1] "%d nap" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d nap" +msgstr[1] "%(num)d nap" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d óra" -msgstr[1] "%d óra" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d óra" +msgstr[1] "%(num)d óra" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d perc" -msgstr[1] "%d perc" - -msgid "0 minutes" -msgstr "0 perc" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d perc" +msgstr[1] "%(num)d perc" msgid "Forbidden" msgstr "Hozzáférés megtagadva" msgid "CSRF verification failed. Request aborted." -msgstr "CSRF ellenőrzés sikertelen. Kérést kiszolgálása megszakítva." +msgstr "CSRF ellenőrzés sikertelen. Kérés kiszolgálása megszakítva." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1170,8 +1227,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Ha a címkét használja, vagy " "a “Referrer-Policy: no-referrer” fejlécet, kérjük távolítsa el ezeket. A " @@ -1258,9 +1315,8 @@ msgstr "A(z) \"%(path)s\" útvonal nem létezik" msgid "Index of %(directory)s" msgstr "A %(directory)s könyvtár tartalma" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: webes keretrendszer azoknak, akiknek a tökéletesség határidőre kell." +msgid "The install worked successfully! Congratulations!" +msgstr "A telepítés sikeresen végződött! Gratulálunk!" #, python-format msgid "" @@ -1271,20 +1327,17 @@ msgstr "" "releases/\" target=\"_blank\" rel=\"noopener\">kiadási megjegyzéseinek " "megtekintése" -msgid "The install worked successfully! Congratulations!" -msgstr "A telepítés sikeresen végződött! Gratulálunk!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Azért látod ezt az oldalt, mert a DEBUG=True szerepel a settings fájlban, és még nem került beállításra " -"egy URL sem." +"en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True szerepel a settings fájlban, és még nem " +"került beállításra egy URL sem." msgid "Django Documentation" msgstr "Django Dokumentáció" diff --git a/django/conf/locale/hu/formats.py b/django/conf/locale/hu/formats.py index f0bfa2181089..c17f2c75f8ee 100644 --- a/django/conf/locale/hu/formats.py +++ b/django/conf/locale/hu/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'Y. F j.' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'Y. F j. H:i' -YEAR_MONTH_FORMAT = 'Y. F' -MONTH_DAY_FORMAT = 'F j.' -SHORT_DATE_FORMAT = 'Y.m.d.' -SHORT_DATETIME_FORMAT = 'Y.m.d. H:i' +DATE_FORMAT = "Y. F j." +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "Y. F j. H:i" +YEAR_MONTH_FORMAT = "Y. F" +MONTH_DAY_FORMAT = "F j." +SHORT_DATE_FORMAT = "Y.m.d." +SHORT_DATETIME_FORMAT = "Y.m.d. H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%Y.%m.%d.', # '2006.10.25.' + "%Y.%m.%d.", # '2006.10.25.' ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '14:30:59' - '%H:%M', # '14:30' + "%H:%M:%S", # '14:30:59' + "%H:%M", # '14:30' ] DATETIME_INPUT_FORMATS = [ - '%Y.%m.%d. %H:%M:%S', # '2006.10.25. 14:30:59' - '%Y.%m.%d. %H:%M:%S.%f', # '2006.10.25. 14:30:59.000200' - '%Y.%m.%d. %H:%M', # '2006.10.25. 14:30' + "%Y.%m.%d. %H:%M:%S", # '2006.10.25. 14:30:59' + "%Y.%m.%d. %H:%M:%S.%f", # '2006.10.25. 14:30:59.000200' + "%Y.%m.%d. %H:%M", # '2006.10.25. 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = ' ' # Non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = " " # Non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ia/LC_MESSAGES/django.mo b/django/conf/locale/ia/LC_MESSAGES/django.mo index 4ff3ff53d1f9..e22136f196ce 100644 Binary files a/django/conf/locale/ia/LC_MESSAGES/django.mo and b/django/conf/locale/ia/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ia/LC_MESSAGES/django.po b/django/conf/locale/ia/LC_MESSAGES/django.po index 46d8e54c2642..adb852fe9e34 100644 --- a/django/conf/locale/ia/LC_MESSAGES/django.po +++ b/django/conf/locale/ia/LC_MESSAGES/django.po @@ -1,14 +1,14 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Martijn Dekker , 2012,2014,2016 +# Martijn Dekker , 2012,2014,2016,2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-18 21:19+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Interlingua (http://www.transifex.com/django/django/language/" "ia/)\n" "MIME-Version: 1.0\n" @@ -23,6 +23,9 @@ msgstr "afrikaans" msgid "Arabic" msgstr "arabe" +msgid "Algerian Arabic" +msgstr "Arabe algerian" + msgid "Asturian" msgstr "asturiano" @@ -138,7 +141,7 @@ msgid "Hungarian" msgstr "hungaro" msgid "Armenian" -msgstr "" +msgstr "Armenio" msgid "Interlingua" msgstr "interlingua" @@ -146,6 +149,9 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indonesiano" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "ido" @@ -162,7 +168,7 @@ msgid "Georgian" msgstr "georgiano" msgid "Kabyle" -msgstr "" +msgstr "Kabyle" msgid "Kazakh" msgstr "kazakh" @@ -176,6 +182,9 @@ msgstr "kannada" msgid "Korean" msgstr "coreano" +msgid "Kyrgyz" +msgstr "Kyrgyz" + msgid "Luxembourgish" msgstr "luxemburgese" @@ -197,6 +206,9 @@ msgstr "mongolico" msgid "Marathi" msgstr "marathi" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "burmese" @@ -260,9 +272,15 @@ msgstr "tamil" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "Tadzhik" + msgid "Thai" msgstr "thailandese" +msgid "Turkmen" +msgstr "Turkmen" + msgid "Turkish" msgstr "turco" @@ -279,7 +297,7 @@ msgid "Urdu" msgstr "urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Vietnamese" msgstr "vietnamese" @@ -302,14 +320,19 @@ msgstr "Files static" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" -msgstr "" +msgstr "Le numero de pagina non es un numero integre" msgid "That page number is less than 1" -msgstr "" +msgstr "Le numero de pagina es minus de 1" msgid "That page contains no results" -msgstr "" +msgstr "Le pagina non contine resultatos" msgid "Enter a valid value." msgstr "Specifica un valor valide." @@ -327,11 +350,15 @@ msgstr "Specifica un adresse de e-mail valide." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Scribe un denotation (\"slug\") valide, consistente de litteras, numeros, " +"tractos de sublineamento o tractos de union." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Scribe un denotation (\"slug\") valide, consistente de litteras Unicode, " +"numeros, tractos de sublineamento o tractos de union." msgid "Enter a valid IPv4 address." msgstr "Specifica un adresse IPv4 valide." @@ -418,9 +445,11 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Le extension de nomine de file “%(extension)s” non es permittite. Le " +"extensiones permittite es: %(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Characteres nulle non es permittite." msgid "and" msgstr "e" @@ -457,11 +486,11 @@ msgstr "Campo de typo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Le valor “%(value)s” debe esser o True/Ver o False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Le valor “%(value)s” debe esser True/Ver, False o None/Necun." msgid "Boolean (Either True or False)" msgstr "Booleano (ver o false)" @@ -478,12 +507,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Le valor “%(value)s” ha un formato de data invalide. Debe esser in formato " +"AAAA-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Le valor “%(value)s” ha le formato correcte (AAAA-MM-DD) ma es un data " +"invalide." msgid "Date (without time)" msgstr "Data (sin hora)" @@ -493,19 +526,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Le valor “%(value)s” es in un formato invalide. Debe esser in formato AAAA-" +"MM-DD HH:MM[:ss[.uuuuuu]][FH]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Le valor “%(value)s” es in le formato correcte (YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][FH]) ma es un data/hora invalide." msgid "Date (with time)" msgstr "Data (con hora)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Le valor “%(value)s” debe esser un numero decimal." msgid "Decimal number" msgstr "Numero decimal" @@ -515,6 +552,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Le valor “%(value)s” es in un formato invalide. Debe esser in formato [DD] " +"[HH:[MM:]]ss[.uuuuuu]." msgid "Duration" msgstr "Duration" @@ -527,14 +566,14 @@ msgstr "Cammino de file" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Le valor “%(value)s” debe esser un numero a comma flottante." msgid "Floating point number" msgstr "Numero a comma flottante" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Le valor “%(value)s” debe esser un numero integre." msgid "Integer" msgstr "Numero integre" @@ -542,6 +581,9 @@ msgstr "Numero integre" msgid "Big (8 byte) integer" msgstr "Numero integre grande (8 bytes)" +msgid "Small integer" +msgstr "Parve numero integre" + msgid "IPv4 address" msgstr "Adresse IPv4" @@ -550,11 +592,14 @@ msgstr "Adresse IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Le valor “%(value)s” debe esser None/Nulle, True/Ver o False." msgid "Boolean (Either True, False or None)" msgstr "Booleano (ver, false o nulle)" +msgid "Positive big integer" +msgstr "Grande numero integre positive" + msgid "Positive integer" msgstr "Numero integre positive" @@ -565,9 +610,6 @@ msgstr "Parve numero integre positive" msgid "Slug (up to %(max_length)s)" msgstr "Denotation (longitude maxime: %(max_length)s)" -msgid "Small integer" -msgstr "Parve numero integre" - msgid "Text" msgstr "Texto" @@ -576,12 +618,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Le valor “%(value)s” es in un formato invalide. Debe esser in formato HH:MM[:" +"ss[.uuuuuu]] ." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Le valor “%(value)s” es in le formato correcte (HH:MM[:ss[.uuuuuu]]) ma es " +"un hora invalide." msgid "Time" msgstr "Hora" @@ -594,7 +640,7 @@ msgstr "Datos binari crude" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” non es un UUID valide." msgid "Universally unique identifier" msgstr "" @@ -605,6 +651,12 @@ msgstr "File" msgid "Image" msgstr "Imagine" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Le instantia de %(model)s con %(field)s %(value)r non existe." @@ -699,6 +751,9 @@ msgstr "Specifica un valor complete." msgid "Enter a valid UUID." msgstr "Specifica un UUID valide." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr "" @@ -707,20 +762,23 @@ msgstr "" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Campo celate %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Le datos ManagementForm manca o ha essite manipulate" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Per favor, submitte %d o minus formularios." -msgstr[1] "Per favor, submitte %d o minus formularios." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Per favor, submitte %d o plus formularios." -msgstr[1] "Per favor, submitte %d o plus formularios." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" msgid "Order" msgstr "Ordine" @@ -784,15 +842,7 @@ msgstr "Si" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "si,no,forsan" @@ -1066,43 +1116,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d anno" -msgstr[1] "%d annos" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mense" -msgstr[1] "%d menses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d septimana" -msgstr[1] "%d septimanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d die" -msgstr[1] "%d dies" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d horas" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuta" -msgstr[1] "%d minutas" - -msgid "0 minutes" -msgstr "0 minutas" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" msgstr "Prohibite" @@ -1112,7 +1159,7 @@ msgstr "Verification CSRF fallite. Requesta abortate." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1206,7 +1253,7 @@ msgstr "" msgid "Index of %(directory)s" msgstr "Indice de %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." +msgid "The install worked successfully! Congratulations!" msgstr "" #, python-format @@ -1215,9 +1262,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2017 +# Bayu Satiyo , 2024 # Claude Paroz , 2018 -# Fery Setiawan , 2015-2019 +# Fery Setiawan , 2015-2019,2021-2023 # Jannis Leidel , 2011 # M Asep Indrayana , 2015 -# oon arfiandwi , 2016 +# oon arfiandwi (OonID) , 2016,2020 # rodin , 2011 # rodin , 2013-2016 -# sage , 2018-2019 +# sag​e , 2018-2019 # Sutrisno Efendi , 2015,2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-18 04:50+0000\n" -"Last-Translator: sage \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2013-04-25 06:49+0000\n" +"Last-Translator: Bayu Satiyo , 2024\n" +"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" "id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,6 +33,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arab" +msgid "Algerian Arabic" +msgstr "Arab Aljazair" + msgid "Asturian" msgstr "Asturia" @@ -56,6 +60,9 @@ msgstr "Bosnia" msgid "Catalan" msgstr "Catalan" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdi Tengah (Sorani)" + msgid "Czech" msgstr "Ceska" @@ -155,6 +162,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesia" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -185,6 +195,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Korea" +msgid "Kyrgyz" +msgstr "Kirgis" + msgid "Luxembourgish" msgstr "Luksemburg" @@ -206,6 +219,9 @@ msgstr "Mongolia" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malaysia" + msgid "Burmese" msgstr "Burma" @@ -269,9 +285,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tajik" + msgid "Thai" msgstr "Thailand" +msgid "Turkmen" +msgstr "Turkmenistan" + msgid "Turkish" msgstr "Turki" @@ -281,6 +303,9 @@ msgstr "Tatar" msgid "Udmurt" msgstr "Udmurt" +msgid "Uyghur" +msgstr "Uyghur" + msgid "Ukrainian" msgstr "Ukrainia" @@ -311,6 +336,11 @@ msgstr "Berkas Statis" msgid "Syndication" msgstr "Sindikasi" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Nomor halaman itu bukan sebuah integer" @@ -323,6 +353,9 @@ msgstr "Tidak ada hasil untuk halaman tersebut" msgid "Enter a valid value." msgstr "Masukkan nilai yang valid." +msgid "Enter a valid domain name." +msgstr "" + msgid "Enter a valid URL." msgstr "Masukkan URL yang valid." @@ -346,14 +379,18 @@ msgstr "" "Masukkan sebuah “slug” valid yang terdiri dari huruf, angka, garis bawah, " "atau penghubung Unicode." -msgid "Enter a valid IPv4 address." -msgstr "Masukkan alamat IPv4 yang valid." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "" -msgid "Enter a valid IPv6 address." -msgstr "Masukkan alamat IPv6 yang valid" +msgid "IPv4" +msgstr "" + +msgid "IPv6" +msgstr "" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Masukkan alamat IPv4 atau IPv6 yang valid" +msgid "IPv4 or IPv6" +msgstr "" msgid "Enter only digits separated by commas." msgstr "Hanya masukkan angka yang dipisahkan dengan koma." @@ -370,6 +407,20 @@ msgstr "Pastikan nilai ini lebih kecil dari atau sama dengan %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Pastikan nilai ini lebih besar dari atau sama dengan %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Pastikan nilai ini adalah kelipatan dari ukuran langkah %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Pastikan nilai ini merupakan kelipatan ukuran langkah %(limit_value)s, " +"dimulai dari %(offset)s, misalnya %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, dan seterusnya." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -432,6 +483,10 @@ msgstr "dan" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s dengan %(field_labels)s ini tidak ada." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Batasan “%(name)s” dilanggar." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Nilai %(value)r bukan pilihan yang valid." @@ -446,8 +501,8 @@ msgstr "Field ini tidak boleh kosong." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s dengan %(field_label)s telah ada." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -473,6 +528,9 @@ msgstr "Nilai Boolean (Salah satu dari True atau False)" msgid "String (up to %(max_length)s)" msgstr "String (maksimum %(max_length)s)" +msgid "String (unlimited)" +msgstr "String (tidak terbatas)" + msgid "Comma-separated integers" msgstr "Bilangan asli yang dipisahkan dengan koma" @@ -555,6 +613,9 @@ msgstr "Bilangan Asli" msgid "Big (8 byte) integer" msgstr "Bilangan asli raksasa (8 byte)" +msgid "Small integer" +msgstr "Bilangan asli kecil" + msgid "IPv4 address" msgstr "Alamat IPv4" @@ -568,6 +629,9 @@ msgstr "Nilai “%(value)s” harus berupa None, True, atau False." msgid "Boolean (Either True, False or None)" msgstr "Boolean (Salah satu dari True, False, atau None)" +msgid "Positive big integer" +msgstr "Integer besar positif" + msgid "Positive integer" msgstr "Bilangan asli positif" @@ -578,9 +642,6 @@ msgstr "Bilangan asli kecil positif" msgid "Slug (up to %(max_length)s)" msgstr "Slug (hingga %(max_length)s karakter)" -msgid "Small integer" -msgstr "Bilangan asli kecil" - msgid "Text" msgstr "Teks" @@ -622,6 +683,12 @@ msgstr "Berkas" msgid "Image" msgstr "Gambar" +msgid "A JSON object" +msgstr "Objek JSON" + +msgid "Value must be valid JSON." +msgstr "Nilai harus JSON yang valid." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Salinan %(model)s dengan %(field)s %(value)r tidak ada." @@ -715,6 +782,9 @@ msgstr "Masukkan nilai yang komplet." msgid "Enter a valid UUID." msgstr "Masukan UUID yang benar." +msgid "Enter a valid JSON." +msgstr "Masukkan JSON yang valid." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -723,18 +793,24 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Bidang tersembunyi %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Data ManagementForm hilang atau telah dirusak " +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Data ManagementForm telah hilang atau telah dirusak. Bidang yang hilang: " +"%(field_names)s. Anda mungkin butuh memberkaskan laporan kesalahan jika " +"masalah masih ada." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Pastikan mengirim %d formulir atau lebih sedikit. " +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Harap ajukan paling banyak %(num)d formulir." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Kirimkan %d atau lebih formulir." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Harap ajukan setidaknya %(num)d formulir." msgid "Order" msgstr "Urutan" @@ -799,15 +875,7 @@ msgstr "Ya" msgid "No" msgstr "Tidak" -msgid "Year" -msgstr "Tahun" - -msgid "Month" -msgstr "Bulan" - -msgid "Day" -msgstr "Hari" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ya,tidak,mungkin" @@ -1080,37 +1148,34 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d tahun" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d tahun" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d bulan" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d bulan" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d minggu" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d minggu" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d hari" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d hari" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d jam" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d jam" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d menit" - -msgid "0 minutes" -msgstr "0 menit" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d menit" msgid "Forbidden" msgstr "Terlarang" @@ -1120,14 +1185,14 @@ msgstr "Verifikasi CSRF gagal, Permintaan dibatalkan." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Anda sedang melihat pesan ini karena situs HTTPS ini membutuhkan “Referer " -"header” dikirim oleh peramban Web Anda, tetapi tidak terkirim. Bagian kepala " -"tersebut dibutuhkan karena alasan keamanan, untuk memastikan bahwa peramban " -"Anda tidak sedang dibajak oleh pihak ketiga." +"Anda melihat pesan ini karena jaringan HTTPS ini membutuhkan “Referer " +"header” untuk dikirim oleh peramban jaringan anda, tetapi tidak ada yg " +"dikirim. Kepala ini diwajibkan untuk alasan keamanan, untuk memastikan bahwa " +"peramban anda tidak sedang dibajak oleh pihak ketiga." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1142,8 +1207,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Jika Anda menggunakan tag " "atau menyertakan bagian kepala 'Referrer-Policy: no-referrer', harap hapus " @@ -1231,9 +1296,8 @@ msgstr "“%(path)s” tidak ada" msgid "Index of %(directory)s" msgstr "Daftar isi %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" -"Django: kerangka kerja Web untuk para perfeksionis dengan tenggat waktu." +msgid "The install worked successfully! Congratulations!" +msgstr "Selamat! Instalasi berjalan lancar!" #, python-format msgid "" @@ -1243,20 +1307,17 @@ msgstr "" "Lihat catatan rilis untuk Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Selamat! Instalasi berjalan lancar!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Anda sedang melihat halaman ini karena DEBUG=True berada di berkas pengaturan Anda dan Anda belum " -"mengonfigurasi URL apa pun." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True berada di berkas pengaturan Anda dan Anda " +"belum mengonfigurasi URL apa pun." msgid "Django Documentation" msgstr "Dokumentasi Django" diff --git a/django/conf/locale/id/formats.py b/django/conf/locale/id/formats.py index b1e08f19a387..91a25590fa44 100644 --- a/django/conf/locale/id/formats.py +++ b/django/conf/locale/id/formats.py @@ -2,45 +2,48 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j N Y' +DATE_FORMAT = "j N Y" DATETIME_FORMAT = "j N Y, G.i" -TIME_FORMAT = 'G.i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd-m-Y' -SHORT_DATETIME_FORMAT = 'd-m-Y G.i' +TIME_FORMAT = "G.i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d-m-Y" +SHORT_DATETIME_FORMAT = "d-m-Y G.i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d-%m-%Y', '%d/%m/%Y', # '25-10-2009', 25/10/2009' - '%d-%m-%y', '%d/%m/%y', # '25-10-09', 25/10/09' - '%d %b %Y', # '25 Oct 2006', - '%d %B %Y', # '25 October 2006' - '%m/%d/%y', '%m/%d/%Y', # '10/25/06', '10/25/2009' + "%d-%m-%Y", # '25-10-2009' + "%d/%m/%Y", # '25/10/2009' + "%d-%m-%y", # '25-10-09' + "%d/%m/%y", # '25/10/09' + "%d %b %Y", # '25 Oct 2006', + "%d %B %Y", # '25 October 2006' + "%m/%d/%y", # '10/25/06' + "%m/%d/%Y", # '10/25/2009' ] TIME_INPUT_FORMATS = [ - '%H.%M.%S', # '14.30.59' - '%H.%M', # '14.30' + "%H.%M.%S", # '14.30.59' + "%H.%M", # '14.30' ] DATETIME_INPUT_FORMATS = [ - '%d-%m-%Y %H.%M.%S', # '25-10-2009 14.30.59' - '%d-%m-%Y %H.%M.%S.%f', # '25-10-2009 14.30.59.000200' - '%d-%m-%Y %H.%M', # '25-10-2009 14.30' - '%d-%m-%y %H.%M.%S', # '25-10-09' 14.30.59' - '%d-%m-%y %H.%M.%S.%f', # '25-10-09' 14.30.59.000200' - '%d-%m-%y %H.%M', # '25-10-09' 14.30' - '%m/%d/%y %H.%M.%S', # '10/25/06 14.30.59' - '%m/%d/%y %H.%M.%S.%f', # '10/25/06 14.30.59.000200' - '%m/%d/%y %H.%M', # '10/25/06 14.30' - '%m/%d/%Y %H.%M.%S', # '25/10/2009 14.30.59' - '%m/%d/%Y %H.%M.%S.%f', # '25/10/2009 14.30.59.000200' - '%m/%d/%Y %H.%M', # '25/10/2009 14.30' + "%d-%m-%Y %H.%M.%S", # '25-10-2009 14.30.59' + "%d-%m-%Y %H.%M.%S.%f", # '25-10-2009 14.30.59.000200' + "%d-%m-%Y %H.%M", # '25-10-2009 14.30' + "%d-%m-%y %H.%M.%S", # '25-10-09' 14.30.59' + "%d-%m-%y %H.%M.%S.%f", # '25-10-09' 14.30.59.000200' + "%d-%m-%y %H.%M", # '25-10-09' 14.30' + "%m/%d/%y %H.%M.%S", # '10/25/06 14.30.59' + "%m/%d/%y %H.%M.%S.%f", # '10/25/06 14.30.59.000200' + "%m/%d/%y %H.%M", # '10/25/06 14.30' + "%m/%d/%Y %H.%M.%S", # '25/10/2009 14.30.59' + "%m/%d/%Y %H.%M.%S.%f", # '25/10/2009 14.30.59.000200' + "%m/%d/%Y %H.%M", # '25/10/2009 14.30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ig/LC_MESSAGES/django.mo b/django/conf/locale/ig/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..8e689c80cf8f Binary files /dev/null and b/django/conf/locale/ig/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ig/LC_MESSAGES/django.po b/django/conf/locale/ig/LC_MESSAGES/django.po new file mode 100644 index 000000000000..19e47ed6a01f --- /dev/null +++ b/django/conf/locale/ig/LC_MESSAGES/django.po @@ -0,0 +1,1271 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Kelechi Precious Nwachukwu , 2020 +# Mariusz Felisiak , 2020 +# Okpala Olisa , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-30 12:26+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Igbo (http://www.transifex.com/django/django/language/ig/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ig\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arabici" + +msgid "Algerian Arabic" +msgstr "Arabici ndị Algeria " + +msgid "Asturian" +msgstr "Asturian" + +msgid "Azerbaijani" +msgstr "Azerbaijani" + +msgid "Bulgarian" +msgstr "Bulgaria" + +msgid "Belarusian" +msgstr "Belarusia" + +msgid "Bengali" +msgstr "Bengali" + +msgid "Breton" +msgstr "Breton" + +msgid "Bosnian" +msgstr "Bosnian" + +msgid "Catalan" +msgstr "Catalan" + +msgid "Czech" +msgstr "Czech" + +msgid "Welsh" +msgstr "Welsh" + +msgid "Danish" +msgstr "Danishi" + +msgid "German" +msgstr "Germani" + +msgid "Lower Sorbian" +msgstr "Sorbian nke Ala" + +msgid "Greek" +msgstr "Greeki" + +msgid "English" +msgstr "Bekee" + +msgid "Australian English" +msgstr "Bekee ndị Australia" + +msgid "British English" +msgstr "Bekee ndị Britain" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Spanishi" + +msgid "Argentinian Spanish" +msgstr "Spanishi ndị Argentina" + +msgid "Colombian Spanish" +msgstr "Spanishi ndị Colombia " + +msgid "Mexican Spanish" +msgstr "Spanishi ndị Mexico " + +msgid "Nicaraguan Spanish" +msgstr "Spanishi ndị Nicaraguan" + +msgid "Venezuelan Spanish" +msgstr "Spanishi ndị Venezuela " + +msgid "Estonian" +msgstr "Estonian" + +msgid "Basque" +msgstr "Basque" + +msgid "Persian" +msgstr "Persian" + +msgid "Finnish" +msgstr "Finnishi" + +msgid "French" +msgstr "Fụrenchị" + +msgid "Frisian" +msgstr "Frisian" + +msgid "Irish" +msgstr "Irishi" + +msgid "Scottish Gaelic" +msgstr "Scottish Gaelici" + +msgid "Galician" +msgstr "Galiciani" + +msgid "Hebrew" +msgstr "Hibru" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Croatian" + +msgid "Upper Sorbian" +msgstr "Sorbian nke Elu" + +msgid "Hungarian" +msgstr "Hungarian" + +msgid "Armenian" +msgstr "Armeniani" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonesian" + +msgid "Igbo" +msgstr "ìgbò" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Icelandici" + +msgid "Italian" +msgstr "Italian" + +msgid "Japanese" +msgstr "Japanisi " + +msgid "Georgian" +msgstr "Georgian" + +msgid "Kabyle" +msgstr "Kabyle" + +msgid "Kazakh" +msgstr "Kazakh" + +msgid "Khmer" +msgstr "Khmer" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Korean" + +msgid "Kyrgyz" +msgstr "Kyrgyz" + +msgid "Luxembourgish" +msgstr "Luxembourgish" + +msgid "Lithuanian" +msgstr "Lithuanian" + +msgid "Latvian" +msgstr "Latvian" + +msgid "Macedonian" +msgstr "Macedonian" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Mongolian" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Burmese" +msgstr "Burmese" + +msgid "Norwegian Bokmål" +msgstr "Bokmål ndị Norway" + +msgid "Nepali" +msgstr "Nepali" + +msgid "Dutch" +msgstr "Dutch" + +msgid "Norwegian Nynorsk" +msgstr "Nynorsk ndị Norway " + +msgid "Ossetic" +msgstr "Ossetici" + +msgid "Punjabi" +msgstr "Punjabi" + +msgid "Polish" +msgstr "Polishi" + +msgid "Portuguese" +msgstr "Portuguisi" + +msgid "Brazilian Portuguese" +msgstr "Portuguese ndị Brazil" + +msgid "Romanian" +msgstr "Romaniani" + +msgid "Russian" +msgstr "Russiani" + +msgid "Slovak" +msgstr "Slovaki" + +msgid "Slovenian" +msgstr "Sloveniani" + +msgid "Albanian" +msgstr "Albaniani" + +msgid "Serbian" +msgstr "Serbiani" + +msgid "Serbian Latin" +msgstr "Serbian Latini" + +msgid "Swedish" +msgstr "Swedishi" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamil" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Tajik" +msgstr "Tajik" + +msgid "Thai" +msgstr "Thai" + +msgid "Turkmen" +msgstr "Turkmen" + +msgid "Turkish" +msgstr "Turkishi" + +msgid "Tatar" +msgstr "Tatar" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Ukrainian" +msgstr "Ukrainiani" + +msgid "Urdu" +msgstr "Urdu" + +msgid "Uzbek" +msgstr "Uzbeki" + +msgid "Vietnamese" +msgstr "Vietnamesi" + +msgid "Simplified Chinese" +msgstr "Chinisi Ndị Mfe" + +msgid "Traditional Chinese" +msgstr "Odịnala Chinisi" + +msgid "Messages" +msgstr "Ozi" + +msgid "Site Maps" +msgstr "Maapụ Saịtị" + +msgid "Static Files" +msgstr "Faịlụ Nkwụsiri ike" + +msgid "Syndication" +msgstr "Nyefee Njikwa" + +msgid "That page number is not an integer" +msgstr "Nọmba peeji ahụ abụghị onu ogugu" + +msgid "That page number is less than 1" +msgstr "Nọmba peeji ahụ erughị 1" + +msgid "That page contains no results" +msgstr "Peeji ahụ enweghị nsonaazụ ọ bụla" + +msgid "Enter a valid value." +msgstr "Tinye uru zuru oke." + +msgid "Enter a valid URL." +msgstr "Tinye URL zuru oke." + +msgid "Enter a valid integer." +msgstr "Tinye nọmba zuru oke." + +msgid "Enter a valid email address." +msgstr "Tinye adreesị ozi ịntanetị n'zuru oke." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Tinye “slug” zuru oke nke mejupụtara mkpụrụedemede, ọnụọgụ, underscores ma ọ " +"bụ hyphens." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Tinye “slug” zuru oke nke mejupụtara Unicode mkpụrụedemede, ọnụọgụ, " +"underscores ma ọ bụ hyphens." + +msgid "Enter a valid IPv4 address." +msgstr "Tinye adreesị IPv4 zuru oke." + +msgid "Enter a valid IPv6 address." +msgstr "Tinye adreesị IPv6 zuru oke." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Tinye adreesị IPv4 ma obu IPv6 zuru oke." + +msgid "Enter only digits separated by commas." +msgstr "Tinye naanị ọnụọgụ kewapụrụ site na comma." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Gbaa mbọ hụ na %(limit_value)s (ọ bụ %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Gbaa mbọ hụ na orughị ma ọ bụ hara nhata %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Gbaa mbọ hụ na okarịa ma ọ bụ hara nhata%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Gbaa mbọ hụ na a nwere opekata mpe %(limit_value)d odide (o nwere " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Gbaa mbọ hụ na a nwere kacha %(limit_value)d odide (o nwere%(show_value)d)." + +msgid "Enter a number." +msgstr "Tinye nọmba." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba na mkpokọta." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s na ebe ntụpọ." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Gbaa mbọ hụ na ọ dighi karịrị %(max)s nọmba tupu akụkụ ebe ntụpọ." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"Ndọtị Faịlị “%(extension)s”anaghị anabata. Ndọtị nke kwere n'nabata bu: " +"%(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "Anabataghị ihe odide n'enweghị isi." + +msgid "and" +msgstr "na" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s ya na nke a %(field_labels)s dị adị." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Nọmba %(value)r abụghị ezigbo nhọrọ." + +msgid "This field cannot be null." +msgstr "Ebe a enweghị ike ịbụ ihe efu." + +msgid "This field cannot be blank." +msgstr "Ebe a enweghị ike ịbụ ohere efu." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s ya na nke a %(field_label)s dị adi." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s ga-abụ ihe pụrụ iche maka %(date_field_label)s " +"%(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Ebe a nke ụdị: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "“%(value)s” uru a ga-abụrịrị Eziokwu ma ọ bụ Ugha." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "“%(value)s”uru a ga-abụrịrị Eziokwu, Ugha, ma ọ bụ Onweghị." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (Eziokwu ma o bụ Ugha)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (ruo %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Rikom-kewapụrụ nomba" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" +"DD." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD) mana ọ bụ ụbọchị n'abaghị " +"uru." + +msgid "Date (without time)" +msgstr "Ubọchị (na-enweghị oge)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị YYYY-MM-" +"DD HH:MM[:ss[.uuuuuu]][TZ] usoro. " + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"“%(value)s”uru a nwere usoro ziri ezi (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ])mana ọ bụ ụbọchị n'abaghị uru." + +msgid "Date (with time)" +msgstr "Ubọchị (na oge)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "“%(value)s” uru a ga-abụrịrị nọmba ntụpọ." + +msgid "Decimal number" +msgstr "Nọmba ntụpọ." + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"“%(value)s”uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị [DD] " +"[[HH:]MM:]ss[.uuuuuu]usoro." + +msgid "Duration" +msgstr "Oge ole" + +msgid "Email address" +msgstr "Adreesị ozi ịntanetị" + +msgid "File path" +msgstr "Uzọ Faịlụ di" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "“%(value)s”uru a ga-abụrịrị float." + +msgid "Floating point number" +msgstr "Nọmba ebe floating no " + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "“%(value)s” uru a ga-abụrịrị onu ogugu" + +msgid "Integer" +msgstr "Onu ogugu" + +msgid "Big (8 byte) integer" +msgstr "Onu ogugu (8 byte) nnukwu" + +msgid "IPv4 address" +msgstr "Adreesị IPv4" + +msgid "IP address" +msgstr "Adreesị IP" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "“%(value)s”uru a ga-abụrịrị na Odighị, Eziokwu ma ọ bụ.Ugha." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (Ihe a ga abụriri eziokwu, ụgha ma ọ bu na onweghi)" + +msgid "Positive big integer" +msgstr "Nnukwu nomba nke oma" + +msgid "Positive integer" +msgstr "Nọmba nke oma" + +msgid "Positive small integer" +msgstr "Obere nọmba nke oma" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (ruo %(max_length)s)" + +msgid "Small integer" +msgstr "Onu ogugu nke obere" + +msgid "Text" +msgstr "Ederede" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"“%(value)s” uru a nwere usoro nke n'adịghị adị. Ọ ga-abụrịrị n'ụdị HH:MM[:" +"ss[.uuuuuu]]usoro." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"“%(value)s” uru a nwere usoro ziri ezi (HH:MM[:ss[.uuuuuu]]) mana ọ bu oge " +"n'abaghị uru." + +msgid "Time" +msgstr "Oge" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Raw binary data" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "“%(value)s”abụghị UUID n’kwesịrị ekwesị." + +msgid "Universally unique identifier" +msgstr "Universally unique identifier" + +msgid "File" +msgstr "Faịlụ" + +msgid "Image" +msgstr "Foto" + +msgid "A JSON object" +msgstr "Ihe JSON" + +msgid "Value must be valid JSON." +msgstr "Uru a ga-abụrịrị JSON n’kwesịrị ekwesị." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s dịka %(field)s %(value)r adịghị adị." + +msgid "Foreign Key (type determined by related field)" +msgstr "Foreign Key (ụdị kpebiri site na mpaghara metụtara)" + +msgid "One-to-one relationship" +msgstr "Mmekọrịta otu-na-otu" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s mmekọrịta" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s mmekọrịta" + +msgid "Many-to-many relationship" +msgstr "Mmekọrịta otutu-na-otutu" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Ebe a kwesiri ekwesi." + +msgid "Enter a whole number." +msgstr "Tinye nọmba onu ogugu." + +msgid "Enter a valid date." +msgstr "Tinye ụbọchị zuru oke." + +msgid "Enter a valid time." +msgstr "Tinye oge zuru oke." + +msgid "Enter a valid date/time." +msgstr "Tinye ụbọchị / oge zuru oke" + +msgid "Enter a valid duration." +msgstr "Tinye oge onuno zuru oke." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Onu ogugu ubochi a gha aburiri n’agbata {min_days} na {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Onweghi faịlụ a debanyere. Lee ụdị encoding a ntinye na ederede." + +msgid "No file was submitted." +msgstr "E nweghị faịlụ e watara" + +msgid "The submitted file is empty." +msgstr "O nweghị ihe dị n'ime faịlụ e wetara" + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Gbaa mbọ hụ na aha faịlụ a nwere kacha %(max)d odide (o nwere %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Biko nyefee faịlụ a ma ọ bụ tinye akara na igbe akara, ọ bụghị ha abụọ." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Bugote foto n’zuru oke. Faịlụ a ị bugoro abụghị foto ma ọ bụ foto rụrụ arụ." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Họrọ ezigbo nhọrọ. %(value)sabụghị otu nhọrọ n'ime nke dịnụ." + +msgid "Enter a list of values." +msgstr "Tinye ndepụta nke ụkpụrụ." + +msgid "Enter a complete value." +msgstr "Tinye uru zuru okè" + +msgid "Enter a valid UUID." +msgstr "Tinye UUID kwesịrị ekwesị" + +msgid "Enter a valid JSON." +msgstr "Tinye JSON kwesịrị ekwesị" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Ebe ezoro ezo%(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Data ManagementForm na-efu efu ma ọ bụ a kpara ya aka" + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Biko nyefee %d ma ọ bụ fomụ di ole na ole." + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Biko nyefee%d ma ọ bụ fomụ karịrị otu ahụ" + +msgid "Order" +msgstr "Usoro" + +msgid "Delete" +msgstr "Hichapụ" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Biko dozie data oji abuo a maka %(field)s." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Biko dozie data oji abuo a maka %(field)s, nke gha diriri iche." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Biko dozie data oji abuo a maka %(field_name)s nke gha diriri iche maka " +"%(lookup)s n'ime %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Biko dozie uru oji abuo nke no n'okpuru." + +msgid "The inline value did not match the parent instance." +msgstr "Uru inline a adabaghị na parent instance." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Họrọ ezigbo nhọrọ. Nhọrọ a abụghị otu nhọrọ dịnụ." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "%(pk)sabụghi uru kwesịrị ekwesị" + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s enweghị ike ịkọwa na mpaghara oge %(current_timezone)s; onwere " +"ike iju anya ma obu ọ gaghị adị." + +msgid "Clear" +msgstr "Kpochapu" + +msgid "Currently" +msgstr "Ugbu a" + +msgid "Change" +msgstr "Gbanwee" + +msgid "Unknown" +msgstr "Ihe N’amaghi" + +msgid "Yes" +msgstr "Ee" + +msgid "No" +msgstr "Mba" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "ee, mba, nwere ike" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bytes" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "etiti Abalị" + +msgid "noon" +msgstr "Ehihie" + +msgid "Monday" +msgstr "Mọnde" + +msgid "Tuesday" +msgstr "Tiuzdee" + +msgid "Wednesday" +msgstr "Wenezdee" + +msgid "Thursday" +msgstr "Tọọzdee" + +msgid "Friday" +msgstr "Fraịdee" + +msgid "Saturday" +msgstr "Satọdee" + +msgid "Sunday" +msgstr "Mbọsi Uka" + +msgid "Mon" +msgstr "Mọnde" + +msgid "Tue" +msgstr "Tiu" + +msgid "Wed" +msgstr "Wen" + +msgid "Thu" +msgstr "Tọọ" + +msgid "Fri" +msgstr "Fraị" + +msgid "Sat" +msgstr "Sat" + +msgid "Sun" +msgstr "Ụka" + +msgid "January" +msgstr "Jenụwarị" + +msgid "February" +msgstr "Febrụwarị" + +msgid "March" +msgstr "Maachị" + +msgid "April" +msgstr "Eprel" + +msgid "May" +msgstr "Mee" + +msgid "June" +msgstr "Juun" + +msgid "July" +msgstr "Julaị" + +msgid "August" +msgstr "Ọgọọst" + +msgid "September" +msgstr "Septemba" + +msgid "October" +msgstr "Ọktoba" + +msgid "November" +msgstr "Novemba" + +msgid "December" +msgstr "Disemba" + +msgid "jan" +msgstr "jen" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "maa" + +msgid "apr" +msgstr "epr" + +msgid "may" +msgstr "mee" + +msgid "jun" +msgstr "juu" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ọgọ" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "ọkt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dis" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jenụwarị" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Maachị" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Eprel" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mee" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Juun" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julaị" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ọgọ." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sep." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Ọkt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dis." + +msgctxt "alt. month" +msgid "January" +msgstr "Jenụwarị" + +msgctxt "alt. month" +msgid "February" +msgstr "Febrụwarị" + +msgctxt "alt. month" +msgid "March" +msgstr "Maachị" + +msgctxt "alt. month" +msgid "April" +msgstr "Eprel" + +msgctxt "alt. month" +msgid "May" +msgstr "Mee" + +msgctxt "alt. month" +msgid "June" +msgstr "Juun" + +msgctxt "alt. month" +msgid "July" +msgstr "Julaị" + +msgctxt "alt. month" +msgid "August" +msgstr "Ọgọọst" + +msgctxt "alt. month" +msgid "September" +msgstr "Septemba" + +msgctxt "alt. month" +msgid "October" +msgstr "Ọktoba" + +msgctxt "alt. month" +msgid "November" +msgstr "Novemba" + +msgctxt "alt. month" +msgid "December" +msgstr "Disemba" + +msgid "This is not a valid IPv6 address." +msgstr "Nke a abaghị adresị IPv6 zuru oke." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "ma obu" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d afọ" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%dọnwa" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d izu" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d ụbọchị" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d awa" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d nkeji" + +msgid "Forbidden" +msgstr "Amachibidoro" + +msgid "CSRF verification failed. Request aborted." +msgstr "Nyocha CSRF emeghị nke ọma. Ajuju atọrọ.." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"I na-ahụ ozi a n'ihi na saịtị HTTPS a chọrọ “Onye isi okwu” ka ihe nchọgharị " +"weebụ gị zitere gị, mana onweghi nke zitere. Achọrọ isi ihe a maka ebumnuche " +"nchekwa, iji jide n’aka na ndị ọzọ anaghị egbochi ihe nchọgharị gị." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Ọ bụrụ na ihazila ihe nchọgharị gị iji gbanyụọ ndị na-eji “ndị nnọchianya”, " +"biko jisie iketiachi ya, ma ọ dịkarịa maka saịtị a, ma ọ bụ maka njikọ " +"HTTPS, ma ọ bụ maka a arịrịọ “otu ụdị”." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Ọ bụrụ na ị na-eji akara " +"mmado ma ọ bụ gụnyere isi nke \"Iwu-Onye na gba ama: neweghị onye na-gba ama" +"\", biko wepu ha. Nchedo CSRF chọrọ ka isi “onye na gba ama” wee mee nyocha " +"ike nlele nke gbara ama. Ọ bụrụ na ihe gbasara gị gbasara nzuzo, jiri ụzọ " +"ọzọ dị ka njikọ maka saịtị ndị ọzọ." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"I na-ahụ ozi a n'ihi na saịtị a chọrọ CSRF cookie mgbe ị na-edobe akwụkwọ. " +"Achọrọ cookie a maka ebumnuche nchekwa, iji hụ na ndị ọzọ anaghị egbochi ihe " +"nchọgharị gị." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Ọ bụrụ na ịhazila ihe nchọgharị gị iji gbanyụọ kuki, biko tiachi ya ka o na " +"ruo oru, opekata mpe maka saịtị a, ma ọ bụ maka “otu ụdị\"." + +msgid "More information is available with DEBUG=True." +msgstr "Ihe omuma ndi ozo di na DEBUG = Eziokwu." + +msgid "No year specified" +msgstr "Ọ dịghị afọ akọwapụtara" + +msgid "Date out of range" +msgstr "Ubọchị a puru na usoro" + +msgid "No month specified" +msgstr "Onweghị ọnwa akọwapụtara" + +msgid "No day specified" +msgstr "Onweghi ụbọchị akọwapụtara" + +msgid "No week specified" +msgstr "Onweghi izu akọwapụtara" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr " %(verbose_name_plural)sadịghị" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Ọdịnihu %(verbose_name_plural)s adịghị adị n'ihi %(class_name)s.allow_future " +"bu ugha." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "String ụbọchị nabaghị uru “%(datestr)s” Ntọala enyere “%(format)s”" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Mba %(verbose_name)s hụrụ ihe dabara na ajụjụ a" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Peeji a a-abụghị “nke ikpeazụ”, a pụghị ịgbanwe ya na int." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Peeji na-abaghị uru (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "Tọgbọ chakoo ndepụta na “%(class_name)s.allow_empty” bụ Ugha." + +msgid "Directory indexes are not allowed here." +msgstr "Anaghị anabata directory indexes ebe a." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” a dịghị" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Index of %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" +"Django: usoro Ntanetị maka ndị na-achọkarị izu okè ya na oge edetu imecha." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Lee akwukwo e bipụtara maka Django" +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Nwụnye ahụ dabara nke ọma! Ị mere nke ọma!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"I na-ahụ peeji a n'ihi na DEBUG=True dị na faili setting gị mana ịhazibeghị URL ọ bụla." + +msgid "Django Documentation" +msgstr "Akwụkwọ Ederede Django" + +msgid "Topics, references, & how-to’s" +msgstr "Isiokwu, ntụaka, & otu esi-mee" + +msgid "Tutorial: A Polling App" +msgstr "Nkuzi: App Ntuli Aka" + +msgid "Get started with Django" +msgstr "Bido na Django" + +msgid "Django Community" +msgstr "Obodo Django" + +msgid "Connect, get help, or contribute" +msgstr "Jikọọ, nweta enyemaka, ma ọ bụ tinye aka." diff --git a/django/conf/locale/ig/__init__.py b/django/conf/locale/ig/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/django/conf/locale/ig/formats.py b/django/conf/locale/ig/formats.py new file mode 100644 index 000000000000..cb0b4de5ee03 --- /dev/null +++ b/django/conf/locale/ig/formats.py @@ -0,0 +1,32 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" +TIME_FORMAT = "P" +DATETIME_FORMAT = "j F Y P" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' +] +DATETIME_INPUT_FORMATS = [ + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d.%m.%y", # '25.10.06' +] +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/is/LC_MESSAGES/django.mo b/django/conf/locale/is/LC_MESSAGES/django.mo index 71e58361880d..951078f610fa 100644 Binary files a/django/conf/locale/is/LC_MESSAGES/django.mo and b/django/conf/locale/is/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/is/LC_MESSAGES/django.po b/django/conf/locale/is/LC_MESSAGES/django.po index 9b06ea364741..be73f3ddc7f6 100644 --- a/django/conf/locale/is/LC_MESSAGES/django.po +++ b/django/conf/locale/is/LC_MESSAGES/django.po @@ -1,20 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# gudmundur , 2011 +# db999e1e0e51ac90b00482cb5db0f98b_32999f5 <3ec5202d5df408dd2f95d8c361fed970_5926>, 2011 # Hafsteinn Einarsson , 2011-2012 # Jannis Leidel , 2011 # Matt R, 2018 # saevarom , 2011 # saevarom , 2013,2015 -# Thordur Sigurdsson , 2016-2019 +# Thordur Sigurdsson , 2016-2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-20 05:29+0000\n" -"Last-Translator: Thordur Sigurdsson \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-18 21:19+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Icelandic (http://www.transifex.com/django/django/language/" "is/)\n" "MIME-Version: 1.0\n" @@ -29,6 +29,9 @@ msgstr "Afríkanska" msgid "Arabic" msgstr "Arabíska" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Astúríska" @@ -152,6 +155,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indónesíska" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -182,6 +188,9 @@ msgstr "Kannadanska" msgid "Korean" msgstr "Kóreska" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Lúxemborgíska" @@ -203,6 +212,9 @@ msgstr "Mongólska" msgid "Marathi" msgstr "Maratí" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Búrmíska" @@ -266,9 +278,15 @@ msgstr "Tamílska" msgid "Telugu" msgstr "Telúgúska" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tælenska" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Tyrkneska" @@ -308,6 +326,11 @@ msgstr "" msgid "Syndication" msgstr "" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Þetta síðunúmer er ekki heiltala" @@ -562,6 +585,9 @@ msgstr "Heiltala" msgid "Big (8 byte) integer" msgstr "Stór (8 bæta) heiltala" +msgid "Small integer" +msgstr "Lítil heiltala" + msgid "IPv4 address" msgstr "IPv4 vistfang" @@ -575,6 +601,9 @@ msgstr "„%(value)s“ verður að vera eitt eftirtalinna: None, True eða Fals msgid "Boolean (Either True, False or None)" msgstr "Boole-gildi (True, False eða None)" +msgid "Positive big integer" +msgstr "Jákvæð stór heiltala" + msgid "Positive integer" msgstr "Jákvæð heiltala" @@ -585,9 +614,6 @@ msgstr "Jákvæð lítil heiltala" msgid "Slug (up to %(max_length)s)" msgstr "Slögg (allt að %(max_length)s)" -msgid "Small integer" -msgstr "Lítil heiltala" - msgid "Text" msgstr "Texti" @@ -629,6 +655,12 @@ msgstr "Skrá" msgid "Image" msgstr "Mynd" +msgid "A JSON object" +msgstr "JSON hlutur" + +msgid "Value must be valid JSON." +msgstr "Gildi verður að vera gilt JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s hlutur með %(field)s %(value)r er ekki til." @@ -720,6 +752,9 @@ msgstr "Sláðu inn heilt gildi." msgid "Enter a valid UUID." msgstr "Sláðu inn gilt UUID." +msgid "Enter a valid JSON." +msgstr "Sláðu inn gilt JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -728,20 +763,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Falinn reitur %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Gögn fyrir ManagementForm vantar eða hefur verið breytt" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Vinsamlegast sendu %d eða færri form." -msgstr[1] "Vinsamlegast sendu %d eða færri form." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Vinsamlegast sendu ekki meira en %d form." +msgstr[1] "Vinsamlegast sendu ekki meira en %d form." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Vinsamlegast sendu %d eða fleiri form." -msgstr[1] "Vinsamlegast sendu %d eða fleiri form." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Vinsamlegast sendu að minnsta kosta %d form." +msgstr[1] "Vinsamlegast sendu að minnsta kosta %d form." msgid "Order" msgstr "Röð" @@ -807,15 +845,7 @@ msgstr "Já" msgid "No" msgstr "Nei" -msgid "Year" -msgstr "Ár" - -msgid "Month" -msgstr "Mánuður" - -msgid "Day" -msgstr "Dagur" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "já,nei,kannski" @@ -1089,43 +1119,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ár" -msgstr[1] "%d ár" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mánuður" -msgstr[1] "%d mánuðir" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d vika" -msgstr[1] "%d vikur" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dagur" -msgstr[1] "%d dagar" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d klukkustund" -msgstr[1] "%d klukkustundir" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d mínúta" -msgstr[1] "%d mínútur" - -msgid "0 minutes" -msgstr "0 mínútur" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" msgstr "" @@ -1135,14 +1162,10 @@ msgstr "CSRF auðkenning tókst ekki." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Þú ert að fá þessi skilaboð því þetta HTTPS vefsvæði þarfnast að vafrinn " -"þinn sendi „Referer“ haus (e. referer header) sem var ekki sendur. Þessi " -"haus er nauðsynlegur af öryggisástæðum til að ganga úr skugga um að " -"utanaðkomandi aðili sé ekki að senda fyrirspurnir úr vafranum þínum." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1239,7 +1262,7 @@ msgstr "„%(path)s“ er ekki til" msgid "Index of %(directory)s" msgstr "Innihald %(directory)s " -msgid "Django: the Web framework for perfectionists with deadlines." +msgid "The install worked successfully! Congratulations!" msgstr "" #, python-format @@ -1248,9 +1271,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2011 -# Carlo Miron , 2014 -# Carlo Miron , 2018-2019 +# Carlo Miron , 2011 +# Carlo Miron , 2014 +# Carlo Miron , 2018-2019 +# Davide Targa , 2021 # Denis Darii , 2011 +# Emanuele Di Giacomo, 2021 # Flavio Curella , 2013,2016 # Jannis Leidel , 2011 # Themis Savvidis , 2013 # Luciano De Falco Alfano, 2016 # Marco Bonetti, 2014 -# Mirco Grillo , 2018 +# Mirco Grillo , 2018,2020 # Nicola Larosa , 2013 -# palmux , 2014-2015,2017 +# palmux , 2014-2015,2017,2021 +# Paolo Melchiorre , 2022-2023 # Mattia Procopio , 2015 # Riccardo Magliocchetti , 2017 # Stefano Brentegani , 2014-2017 @@ -21,9 +24,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 06:49+0000\n" +"Last-Translator: Paolo Melchiorre , 2022-2023\n" "Language-Team: Italian (http://www.transifex.com/django/django/language/" "it/)\n" "MIME-Version: 1.0\n" @@ -38,6 +41,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabo" +msgid "Algerian Arabic" +msgstr "Arabo Algerino" + msgid "Asturian" msgstr "Asturiano" @@ -62,6 +68,9 @@ msgstr "Bosniaco" msgid "Catalan" msgstr "Catalano" +msgid "Central Kurdish (Sorani)" +msgstr "Curdo centrale (Sorani)" + msgid "Czech" msgstr "Ceco" @@ -161,6 +170,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesiano" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -191,6 +203,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "Kirghiso" + msgid "Luxembourgish" msgstr "Lussemburghese" @@ -212,6 +227,9 @@ msgstr "Mongolo" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malese" + msgid "Burmese" msgstr "Birmano" @@ -275,9 +293,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tajik" + msgid "Thai" msgstr "Tailandese" +msgid "Turkmen" +msgstr "Turkmeno" + msgid "Turkish" msgstr "Turco" @@ -294,7 +318,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeko" msgid "Vietnamese" msgstr "Vietnamita" @@ -317,6 +341,11 @@ msgstr "File statici" msgid "Syndication" msgstr "Aggregazione" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Quel numero di pagina non è un integer" @@ -342,11 +371,15 @@ msgstr "Inserisci un indirizzo email valido." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Inserisci uno \"slug\" valido contenente lettere, cifre, sottolineati o " +"trattini." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Inserisci uno 'slug' valido contenente lettere, cifre, sottolineati o " +"trattini." msgid "Enter a valid IPv4 address." msgstr "Inserisci un indirizzo IPv4 valido." @@ -373,6 +406,12 @@ msgstr "Assicurati che questo valore sia minore o uguale a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Assicurati che questo valore sia maggiore o uguale a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Assicurarsi che questo valore sia un multiplo della dimensione di passo " +"%(limit_value)s." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -386,6 +425,9 @@ msgstr[0] "" msgstr[1] "" "Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " "ha %(show_value)d)." +msgstr[2] "" +"Assicurati che questo valore contenga almeno %(limit_value)d caratteri (ne " +"ha %(show_value)d)." #, python-format msgid "" @@ -400,6 +442,9 @@ msgstr[0] "" msgstr[1] "" "Assicurati che questo valore non contenga più di %(limit_value)d caratteri " "(ne ha %(show_value)d)." +msgstr[2] "" +"Assicurati che questo valore non contenga più di %(limit_value)d caratteri " +"(ne ha %(show_value)d)." msgid "Enter a number." msgstr "Inserisci un numero." @@ -409,12 +454,14 @@ msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Assicurati che non vi sia più di %(max)s cifra in totale." msgstr[1] "Assicurati che non vi siano più di %(max)s cifre in totale." +msgstr[2] "Assicurati che non vi siano più di %(max)s cifre in totale." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "Assicurati che non vi sia più di %(max)s cifra decimale." msgstr[1] "Assicurati che non vi siano più di %(max)s cifre decimali." +msgstr[2] "Assicurati che non vi siano più di %(max)s cifre decimali." #, python-format msgid "" @@ -424,12 +471,16 @@ msgid_plural "" msgstr[0] "Assicurati che non vi sia più di %(max)s cifra prima della virgola." msgstr[1] "" "Assicurati che non vi siano più di %(max)s cifre prima della virgola." +msgstr[2] "" +"Assicurati che non vi siano più di %(max)s cifre prima della virgola." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Il file con estensione \"%(extension)s\" non e' permesso. Le estensioni " +"permesse sono: %(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "I caratteri null non sono ammessi." @@ -441,6 +492,10 @@ msgstr "e" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s con questa %(field_labels)s esiste già." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Il vincolo “%(name)s” è stato violato." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Il valore %(value)r non è una scelta valida." @@ -455,8 +510,8 @@ msgstr "Questo campo non può essere vuoto." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s con questo %(field_label)s esiste già." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -469,11 +524,11 @@ msgstr "Campo di tipo: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Il valore \"%(value)s\" deve essere True oppure False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Il valore di \"%(value)s\" deve essere True, False o None" msgid "Boolean (Either True or False)" msgstr "Booleano (Vero o Falso)" @@ -482,6 +537,9 @@ msgstr "Booleano (Vero o Falso)" msgid "String (up to %(max_length)s)" msgstr "Stringa (fino a %(max_length)s)" +msgid "String (unlimited)" +msgstr "Stringa (illimitata)" + msgid "Comma-separated integers" msgstr "Interi separati da virgole" @@ -490,12 +548,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Il valore \"%(value)s\" ha un formato di data non valido. Deve essere nel " +"formato AAAA-MM-GG." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Il valore di \"%(value)s\" ha il corretto formato (AAAA-MM-GG) ma non è una " +"data valida." msgid "Date (without time)" msgstr "Data (senza ora)" @@ -505,19 +567,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " +"AAAA-MM-GG HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Il valore di \"%(value)s\" ha il formato corretto (AAAA-MM-GG HH:MM[:ss[." +"uuuuuu]][TZ]) ma non è una data/ora valida." msgid "Date (with time)" msgstr "Data (con ora)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Il valore \"%(value)s\" deve essere un numero decimale." msgid "Decimal number" msgstr "Numero decimale" @@ -527,6 +593,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Il valore \"%(value)s\" ha un formato non valido. Deve essere nel formato " +"[GG] [[HH:]MM:]ss[.uuuuuu]." msgid "Duration" msgstr "Durata" @@ -539,14 +607,14 @@ msgstr "Percorso file" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Il valore di \"%(value)s\" deve essere un numero a virgola mobile." msgid "Floating point number" msgstr "Numero in virgola mobile" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Il valore \"%(value)s\" deve essere un intero." msgid "Integer" msgstr "Intero" @@ -554,6 +622,9 @@ msgstr "Intero" msgid "Big (8 byte) integer" msgstr "Intero grande (8 byte)" +msgid "Small integer" +msgstr "Piccolo intero" + msgid "IPv4 address" msgstr "Indirizzo IPv4" @@ -562,11 +633,14 @@ msgstr "Indirizzo IP" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Il valore \"%(value)s\" deve essere None, True oppure False." msgid "Boolean (Either True, False or None)" msgstr "Booleano (True, False o None)" +msgid "Positive big integer" +msgstr "Intero positivo" + msgid "Positive integer" msgstr "Intero positivo" @@ -577,9 +651,6 @@ msgstr "Piccolo intero positivo" msgid "Slug (up to %(max_length)s)" msgstr "Slug (fino a %(max_length)s)" -msgid "Small integer" -msgstr "Piccolo intero" - msgid "Text" msgstr "Testo" @@ -588,12 +659,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Il valore di \"%(value)s\" ha un formato non valido. Deve essere nel formato " +"HH:MM[:ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Il valore di \"%(value)s\" ha il corretto formato (HH:MM[:ss[.uuuuuu]]) ma " +"non è un orario valido." msgid "Time" msgstr "Ora" @@ -606,7 +681,7 @@ msgstr "Dati binari grezzi" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "\"%(value)s\" non è uno UUID valido." msgid "Universally unique identifier" msgstr "Identificatore univoco universale" @@ -617,6 +692,12 @@ msgstr "File" msgid "Image" msgstr "Immagine" +msgid "A JSON object" +msgstr "Un oggetto JSON" + +msgid "Value must be valid JSON." +msgstr "Il valore deve essere un JSON valido." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "L'istanza del modello %(model)s con %(field)s %(value)r non esiste." @@ -685,6 +766,9 @@ msgstr[0] "" msgstr[1] "" "Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " "ha %(length)d)." +msgstr[2] "" +"Assicurati che questo nome di file non contenga più di %(max)d caratteri (ne " +"ha %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" @@ -711,6 +795,9 @@ msgstr "Inserisci un valore completo." msgid "Enter a valid UUID." msgstr "Inserire un UUID valido." +msgid "Enter a valid JSON." +msgstr "Inserisci un JSON valido." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -719,20 +806,28 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Campo nascosto %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "I dati del ManagementForm sono mancanti oppure sono stati manomessi" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Mancano i dati ManagementForm o sono stati manomessi. Campi mancanti: " +"%(field_names)s. Potrebbe essere necessario inviare una segnalazione di " +"errore se il problema persiste." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Inoltrare %d o meno form." -msgstr[1] "Si prega di inviare %d o meno form." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Si prega di inviare al massimo %(num)d form." +msgstr[1] "Si prega di inviare al massimo %(num)d form." +msgstr[2] "Si prega di inviare al massimo %(num)d form." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Inoltrare %d o più form." -msgstr[1] "Si prega di inviare %d o più form." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Si prega di inviare almeno %(num)d form." +msgstr[1] "Si prega di inviare almeno %(num)d form." +msgstr[2] "Si prega di inviare almeno %(num)d form." msgid "Order" msgstr "Ordine" @@ -770,13 +865,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" non è un valore valido." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +" %(datetime)s non può essere interpretato nel fuso orario " +"%(current_timezone)s: potrebbe essere ambiguo o non esistere." msgid "Clear" msgstr "Svuota" @@ -796,15 +893,7 @@ msgstr "Sì" msgid "No" msgstr "No" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "sì,no,forse" @@ -813,6 +902,7 @@ msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" +msgstr[2] "%(size)d bytes" #, python-format msgid "%s KB" @@ -1078,43 +1168,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d anno" -msgstr[1] "%d anni" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d anno" +msgstr[1] "%(num)d anni" +msgstr[2] "%(num)d anni" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mese" -msgstr[1] "%d mesi" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mese" +msgstr[1] "%(num)d mesi" +msgstr[2] "%(num)d mesi" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d settimana" -msgstr[1] "%d settimane" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d settimana" +msgstr[1] "%(num)d settimane" +msgstr[2] "%(num)d settimane" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d giorno" -msgstr[1] "%d giorni" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d giorno" +msgstr[1] "%(num)d giorni" +msgstr[2] "%(num)d giorni" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ora" -msgstr[1] "%d ore" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d ora" +msgstr[1] "%(num)d ore" +msgstr[2] "%(num)d ore" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minuti" - -msgid "0 minutes" -msgstr "0 minuti" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minuti" +msgstr[2] "%(num)d minuti" msgid "Forbidden" msgstr "Proibito" @@ -1124,24 +1217,36 @@ msgstr "Verifica CSRF fallita. Richiesta interrotta." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Vedi questo messaggio perchè questo sito HTTPS richiede l'invio da parte del " +"tuo browser del “Referer header”, che non è invece stato inviato. Questo " +"header è richiesto per motivi di sicurezza, per assicurare che il tuo " +"browser non sia stato sabotato da terzi." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Se hai configurato il tuo browser web per disattivare l'invio delle " +"intestazioni \"Referer\", riattiva questo invio, almeno per questo sito, o " +"per le connessioni HTTPS, o per le connessioni \"same-origin\"." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Se usi il tag o includi " +"header 'Referrer-Policy: no-referrer', per favore rimuovili. Per la " +"protezione CSRF è necessario eseguire un controllo rigoroso sull'header " +"'Referer'. Se ti preoccupano le ricadute sulla privacy, puoi ricorrere ad " +"alternative come per i link a siti di terze parti." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1156,6 +1261,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Se hai configurato il tuo browser web per disattivare l'invio dei cookies, " +"riattivalo almeno per questo sito, o per connessioni \"same-origin\"" msgid "More information is available with DEBUG=True." msgstr "Maggiorni informazioni sono disponibili con DEBUG=True" @@ -1189,14 +1296,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Data non valida \"%(datestr)s\" con il formato \"%(format)s\"" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Trovato nessun %(verbose_name)s corrispondente alla query" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "La pagina non è \"last\", né può essere convertita in un int." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1204,21 +1311,21 @@ msgstr "Pagina non valida (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Lista vuota e \"%(class_name)s.allow_empty\" è False." msgid "Directory indexes are not allowed here." msgstr "Indici di directory non sono consentiti qui." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" non esiste" #, python-format msgid "Index of %(directory)s" msgstr "Indice di %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: il framework Web per i perfezionisti con delle scadenze." +msgid "The install worked successfully! Congratulations!" +msgstr "Installazione completata con successo! Congratulazioni!" #, python-format msgid "" @@ -1229,26 +1336,23 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">note di rilascio per Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Installazione completata con successo! Congratulazioni!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Stai vedendo questa pagina perché hai impostato DEBUG=True nel tuo file di configurazione e non hai " +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True nel tuo file di configurazione e non hai " "configurato nessun URL." msgid "Django Documentation" msgstr "Documentazione di Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Temi, riferimenti, & guide" msgid "Tutorial: A Polling App" msgstr "Tutorial: un'app per sondaggi" diff --git a/django/conf/locale/it/formats.py b/django/conf/locale/it/formats.py index 8562aefb778a..bb9e0270bc22 100644 --- a/django/conf/locale/it/formats.py +++ b/django/conf/locale/it/formats.py @@ -2,39 +2,42 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd F Y' # 25 Ottobre 2006 -TIME_FORMAT = 'H:i' # 14:30 -DATETIME_FORMAT = 'l d F Y H:i' # Mercoledì 25 Ottobre 2006 14:30 -YEAR_MONTH_FORMAT = 'F Y' # Ottobre 2006 -MONTH_DAY_FORMAT = 'j F' # 25 Ottobre -SHORT_DATE_FORMAT = 'd/m/Y' # 25/12/2009 -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' # 25/10/2009 14:30 +DATE_FORMAT = "d F Y" # 25 Ottobre 2006 +TIME_FORMAT = "H:i" # 14:30 +DATETIME_FORMAT = "l d F Y H:i" # Mercoledì 25 Ottobre 2006 14:30 +YEAR_MONTH_FORMAT = "F Y" # Ottobre 2006 +MONTH_DAY_FORMAT = "j F" # 25 Ottobre +SHORT_DATE_FORMAT = "d/m/Y" # 25/12/2009 +SHORT_DATETIME_FORMAT = "d/m/Y H:i" # 25/10/2009 14:30 FIRST_DAY_OF_WEEK = 1 # Lunedì # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%Y/%m/%d', # '25/10/2006', '2008/10/25' - '%d-%m-%Y', '%Y-%m-%d', # '25-10-2006', '2008-10-25' - '%d-%m-%y', '%d/%m/%y', # '25-10-06', '25/10/06' + "%d/%m/%Y", # '25/10/2006' + "%Y/%m/%d", # '2006/10/25' + "%d-%m-%Y", # '25-10-2006' + "%Y-%m-%d", # '2006-10-25' + "%d-%m-%y", # '25-10-06' + "%d/%m/%y", # '25/10/06' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d-%m-%Y %H:%M:%S', # '25-10-2006 14:30:59' - '%d-%m-%Y %H:%M:%S.%f', # '25-10-2006 14:30:59.000200' - '%d-%m-%Y %H:%M', # '25-10-2006 14:30' - '%d-%m-%y %H:%M:%S', # '25-10-06 14:30:59' - '%d-%m-%y %H:%M:%S.%f', # '25-10-06 14:30:59.000200' - '%d-%m-%y %H:%M', # '25-10-06 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' + "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' + "%d-%m-%Y %H:%M", # '25-10-2006 14:30' + "%d-%m-%y %H:%M:%S", # '25-10-06 14:30:59' + "%d-%m-%y %H:%M:%S.%f", # '25-10-06 14:30:59.000200' + "%d-%m-%y %H:%M", # '25-10-06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ja/LC_MESSAGES/django.mo b/django/conf/locale/ja/LC_MESSAGES/django.mo index a2095327847e..d7dad0a5adfa 100644 Binary files a/django/conf/locale/ja/LC_MESSAGES/django.mo and b/django/conf/locale/ja/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ja/LC_MESSAGES/django.po b/django/conf/locale/ja/LC_MESSAGES/django.po index 3fac2c47729d..ca8a726ffb3d 100644 --- a/django/conf/locale/ja/LC_MESSAGES/django.po +++ b/django/conf/locale/ja/LC_MESSAGES/django.po @@ -2,22 +2,30 @@ # # Translators: # xiu1 , 2016 -# GOTO Hayato , 2019 +# tadasu , 2020 +# Goto Hayato , 2021 +# Goto Hayato , 2019 +# Hiroki Sawano, 2022 # Jannis Leidel , 2011 +# Kamiyama Satoshi, 2021 # Kentaro Matsuzaki , 2015 # Masashi SHIBATA , 2017 # Nikita K , 2019 # Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2019 +# Shinya Okano , 2012-2019,2021,2023-2024 +# TANIGUCHI Taichi, 2022 +# Takuro Onoue , 2020 +# Takuya N , 2020 # Tetsuya Morimoto , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Shinya Okano , " +"2012-2019,2021,2023-2024\n" +"Language-Team: Japanese (http://app.transifex.com/django/django/language/" "ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,6 +39,9 @@ msgstr "アフリカーンス語" msgid "Arabic" msgstr "アラビア語" +msgid "Algerian Arabic" +msgstr "アラビア語(アルジェリア)" + msgid "Asturian" msgstr "アストゥリアス語" @@ -55,6 +66,9 @@ msgstr "ボスニア語" msgid "Catalan" msgstr "カタロニア語" +msgid "Central Kurdish (Sorani)" +msgstr "中央クルド語 (ソラニー語)" + msgid "Czech" msgstr "チェコ語" @@ -154,6 +168,9 @@ msgstr "インターリングア" msgid "Indonesian" msgstr "インドネシア語" +msgid "Igbo" +msgstr "イグボ語" + msgid "Ido" msgstr "イド語" @@ -184,6 +201,9 @@ msgstr "カンナダ語" msgid "Korean" msgstr "韓国語" +msgid "Kyrgyz" +msgstr "キルギス語" + msgid "Luxembourgish" msgstr "ルクセンブルグ語" @@ -205,6 +225,9 @@ msgstr "モンゴル語" msgid "Marathi" msgstr "マラーティー語" +msgid "Malay" +msgstr "マレー語" + msgid "Burmese" msgstr "ビルマ語" @@ -268,9 +291,15 @@ msgstr "タミル語" msgid "Telugu" msgstr "テルグ語" +msgid "Tajik" +msgstr "タジク語" + msgid "Thai" msgstr "タイ語" +msgid "Turkmen" +msgstr "トルクメン語" + msgid "Turkish" msgstr "トルコ語" @@ -280,6 +309,9 @@ msgstr "タタール語" msgid "Udmurt" msgstr "ウドムルト語" +msgid "Uyghur" +msgstr "ウイグル語" + msgid "Ukrainian" msgstr "ウクライナ語" @@ -287,7 +319,7 @@ msgid "Urdu" msgstr "ウルドゥー語" msgid "Uzbek" -msgstr "" +msgstr "ウズベク語" msgid "Vietnamese" msgstr "ベトナム語" @@ -310,6 +342,11 @@ msgstr "静的ファイル" msgid "Syndication" msgstr "シンジケーション" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "このページ番号は整数ではありません。" @@ -322,6 +359,9 @@ msgstr "このページには結果が含まれていません。" msgid "Enter a valid value." msgstr "値を正しく入力してください。" +msgid "Enter a valid domain name." +msgstr "有効なドメイン名を入力してください。" + msgid "Enter a valid URL." msgstr "URLを正しく入力してください。" @@ -335,20 +375,27 @@ msgstr "有効なメールアドレスを入力してください。" msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"“slug” には半角の英数字、アンダースコア、ハイフン以外は使用できません。" msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"ユニコード文字、数字、アンダースコアまたはハイフンで構成された、有効なスラグ" +"を入力してください。" + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "有効な%(protocol)sアドレスを入力してください。" -msgid "Enter a valid IPv4 address." -msgstr "有効なIPアドレス (IPv4) を入力してください。" +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "IPv6の正しいアドレスを入力してください。" +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "IPv4またはIPv6の正しいアドレスを入力してください。" +msgid "IPv4 or IPv6" +msgstr "IPv4またはIPv6" msgid "Enter only digits separated by commas." msgstr "カンマ区切りの数字だけを入力してください。" @@ -367,6 +414,18 @@ msgstr "この値は %(limit_value)s 以下でなければなりません。" msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "この値は %(limit_value)s 以上でなければなりません。" +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "この値は %(limit_value)s の倍数でなければなりません。" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"この値は%(offset)s から始まる %(limit_value)s の倍数でなければなりません。" +"例. %(offset)s%(valid_value1)s%(valid_value2)s など。" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -375,8 +434,8 @@ msgid_plural "" "Ensure this value has at least %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" -"この値が少なくとも %(limit_value)d 文字以上であることを確認してください" -"( %(show_value)d 文字になっています)。" +"この値が少なくとも %(limit_value)d 文字以上であることを確認してください " +"(%(show_value)d 文字になっています)。" #, python-format msgid "" @@ -414,6 +473,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"ファイル拡張子 “%(extension)s” は許可されていません。許可されている拡張子は " +"%(allowed_extensions)s です。" msgid "Null characters are not allowed." msgstr "何か文字を入力してください。" @@ -425,6 +486,10 @@ msgstr "と" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "この %(field_labels)s を持った %(model_name)s が既に存在します。" +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "制約 “%(name)s” に違反しています。" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r は有効な選択肢ではありません。" @@ -439,8 +504,8 @@ msgstr "このフィールドは空ではいけません。" msgid "%(model_name)s with this %(field_label)s already exists." msgstr "この %(field_label)s を持った %(model_name)s が既に存在します。" -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -454,11 +519,11 @@ msgstr "タイプが %(field_type)s のフィールド" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” は True または False にしなければなりません。" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” は True 、 False または None の値でなければなりません。" msgid "Boolean (Either True or False)" msgstr "ブール値 (真: True または偽: False)" @@ -467,6 +532,9 @@ msgstr "ブール値 (真: True または偽: False)" msgid "String (up to %(max_length)s)" msgstr "文字列 ( %(max_length)s 字まで )" +msgid "String (unlimited)" +msgstr "文字列 (無制限)" + msgid "Comma-separated integers" msgstr "カンマ区切りの整数" @@ -475,12 +543,13 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” は無効な日付形式です。YYYY-MM-DD 形式にしなければなりません。" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "“%(value)s” は有効な日付形式(YYYY-MM-DD)ですが、不正な日付です。" msgid "Date (without time)" msgstr "日付" @@ -490,19 +559,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” は無効な形式の値です。 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 形式で" +"なければなりません。" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s” は正しい形式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) の値ですが、無" +"効な日時です。" msgid "Date (with time)" msgstr "日時" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” は10進浮動小数値にしなければなりません。" msgid "Decimal number" msgstr "10 進数 (小数可)" @@ -512,6 +585,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s” は無効な形式の値です。 [DD] [HH:[MM:]]ss[.uuuuuu] 形式でなければ" +"なりません。" msgid "Duration" msgstr "時間差分" @@ -524,14 +599,14 @@ msgstr "ファイルの場所" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s” は小数値にしなければなりません。" msgid "Floating point number" msgstr "浮動小数点" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” は整数値にしなければなりません。" msgid "Integer" msgstr "整数" @@ -539,6 +614,9 @@ msgstr "整数" msgid "Big (8 byte) integer" msgstr "大きな(8バイト)整数" +msgid "Small integer" +msgstr "小さな整数" + msgid "IPv4 address" msgstr "IPv4アドレス" @@ -547,11 +625,14 @@ msgstr "IP アドレス" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s” は None、True または False の値でなければなりません。" msgid "Boolean (Either True, False or None)" msgstr "ブール値 (真: True 、偽: False または None)" +msgid "Positive big integer" +msgstr "正の多倍長整数" + msgid "Positive integer" msgstr "正の整数" @@ -562,9 +643,6 @@ msgstr "小さな正の整数" msgid "Slug (up to %(max_length)s)" msgstr "スラグ(%(max_length)s文字以内)" -msgid "Small integer" -msgstr "小さな整数" - msgid "Text" msgstr "テキスト" @@ -573,12 +651,14 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s” は無効な形式の値です。 HH:MM[:ss[.uuuuuu]] 形式でなければなりませ" +"ん。" #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." -msgstr "" +msgstr "“%(value)s” は正しい形式(HH:MM[:ss[.uuuuuu]])ですが、無効な時刻です。" msgid "Time" msgstr "時刻" @@ -591,7 +671,7 @@ msgstr "生のバイナリデータ" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” は有効なUUIDではありません。" msgid "Universally unique identifier" msgstr "汎用一意識別子" @@ -602,6 +682,12 @@ msgstr "ファイル" msgid "Image" msgstr "画像" +msgid "A JSON object" +msgstr "JSONオブジェクト" + +msgid "Value must be valid JSON." +msgstr "JSONとして正しい値にしてください。" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s が %(value)r である %(model)s のインスタンスは存在しません。" @@ -694,6 +780,9 @@ msgstr "すべての値を入力してください。" msgid "Enter a valid UUID." msgstr "UUIDを正しく入力してください。" +msgid "Enter a valid JSON." +msgstr "JSONを正しく入力してください。" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -702,18 +791,24 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(隠しフィールド %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "マネジメントフォームのデータが見つからないか、改竄されています。" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm のデータが不足しているか改竄されています。不足するフィールドの" +"数: %(field_names)s 。問題が続くようならバグレポートを出す必要があるかもしれ" +"ません。" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "%d 個またはそれより少ないフォームを送信してください。" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "最大で %(num)d 個のフォームを送信してください。" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "%d 個またはそれより多いフォームを送信してください。" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "少なくとも %(num)d 個のフォームを送信してください。" msgid "Order" msgstr "並び変え" @@ -750,13 +845,15 @@ msgstr "正しく選択してください。選択したものは候補にあり #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” は無効な値です。" #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s は %(current_timezone)s のタイムゾーンでは解釈できませんでした。" +"それは曖昧であるか、存在しない可能性があります。" msgid "Clear" msgstr "クリア" @@ -776,15 +873,7 @@ msgstr "はい" msgid "No" msgstr "いいえ" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "はい,いいえ,たぶん" @@ -1057,37 +1146,34 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d 年" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d年" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ヶ月" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)dヶ月" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d 週間" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d週間" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d 日" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d日" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d 時間" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d時間" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d 分" - -msgid "0 minutes" -msgstr "0 分" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d分" msgid "Forbidden" msgstr "アクセス禁止" @@ -1097,24 +1183,35 @@ msgstr "CSRF検証に失敗したため、リクエストは中断されまし msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"このメッセージが表示されている理由は、このHTTPSのサイトはウェブブラウザからリ" +"ファラーヘッダが送信されることを必須としていますが、送信されなかったためで" +"す。このヘッダはセキュリティ上の理由(使用中のブラウザが第三者によってハイ" +"ジャックされていないことを確認するため)で必要です。" msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"もしブラウザのリファラーヘッダを無効に設定しているならば、HTTPS接続やsame-" +"originリクエストのために、少なくともこのサイトでは再度有効にしてください。" msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"もし タグを使用しているか " +"“Referrer-Policy: no-referrer” ヘッダを含んでいる場合は削除してください。" +"CSRF プロテクションは、厳密に “Referer” ヘッダが必要です。プライバシーが気に" +"なる場合は などの代替で第三者サイトと接続してくださ" +"い。" msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1129,6 +1226,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"もしブラウザのクッキーを無効に設定しているならば、same-originリクエストのため" +"に少なくともこのサイトでは再度有効にしてください。" msgid "More information is available with DEBUG=True." msgstr "詳細な情報は DEBUG=True を設定すると利用できます。" @@ -1162,14 +1261,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "指定された形式 “%(format)s” では “%(datestr)s” は無効な日付文字列です" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "クエリーに一致する %(verbose_name)s は見つかりませんでした" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "ページが 「最後」ではないか、数値に変換できる値ではありません。" #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1177,21 +1276,21 @@ msgstr "無効なページです (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "空の一覧かつ “%(class_name)s.allow_empty” が False です。" msgid "Directory indexes are not allowed here." msgstr "ここではディレクトリインデックスが許可されていません。" #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” が存在しません" #, python-format msgid "Index of %(directory)s" msgstr "%(directory)sのディレクトリインデックス" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: 納期を逃さない完璧主義者のためのWebフレームワーク" +msgid "The install worked successfully! Congratulations!" +msgstr "インストールは成功しました!おめでとうございます!" #, python-format msgid "" @@ -1201,25 +1300,23 @@ msgstr "" "Django%(version)sのリリースノートを見る。" -msgid "The install worked successfully! Congratulations!" -msgstr "インストールは成功しました!おめでとうございます!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "このページは、設定ファイルでDEBUG=Trueが指定され、何もURLが設定されていない時に表示されます。" +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=Trueが指定され、何もURLが設定されていない時に表示" +"されます。" msgid "Django Documentation" msgstr "Django ドキュメント" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "トピック、リファレンス、ハウツー" msgid "Tutorial: A Polling App" msgstr "チュートリアル: 投票アプリケーション" diff --git a/django/conf/locale/ja/formats.py b/django/conf/locale/ja/formats.py index 2f1faa69ad97..c0554d9f6187 100644 --- a/django/conf/locale/ja/formats.py +++ b/django/conf/locale/ja/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'Y年n月j日' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'Y年n月j日G:i' -YEAR_MONTH_FORMAT = 'Y年n月' -MONTH_DAY_FORMAT = 'n月j日' -SHORT_DATE_FORMAT = 'Y/m/d' -SHORT_DATETIME_FORMAT = 'Y/m/d G:i' +DATE_FORMAT = "Y年n月j日" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "Y年n月j日G:i" +YEAR_MONTH_FORMAT = "Y年n月" +MONTH_DAY_FORMAT = "n月j日" +SHORT_DATE_FORMAT = "Y/m/d" +SHORT_DATETIME_FORMAT = "Y/m/d G:i" # FIRST_DAY_OF_WEEK = # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' -# NUMBER_GROUPING = +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ka/formats.py b/django/conf/locale/ka/formats.py index 86308e352157..661b71e2c55c 100644 --- a/django/conf/locale/ka/formats.py +++ b/django/conf/locale/ka/formats.py @@ -2,41 +2,47 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'l, j F, Y' -TIME_FORMAT = 'h:i a' -DATETIME_FORMAT = 'j F, Y h:i a' -YEAR_MONTH_FORMAT = 'F, Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j.M.Y' -SHORT_DATETIME_FORMAT = 'j.M.Y H:i' +DATE_FORMAT = "l, j F, Y" +TIME_FORMAT = "h:i a" +DATETIME_FORMAT = "j F, Y h:i a" +YEAR_MONTH_FORMAT = "F, Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j.M.Y" +SHORT_DATETIME_FORMAT = "j.M.Y H:i" FIRST_DAY_OF_WEEK = 1 # (Monday) # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - # '%d %b %Y', '%d %b, %Y', '%d %b. %Y', # '25 Oct 2006', '25 Oct, 2006', '25 Oct. 2006' - # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + # "%d %b %Y", # '25 Oct 2006' + # "%d %b, %Y", # '25 Oct, 2006' + # "%d %b. %Y", # '25 Oct. 2006' + # "%d %B %Y", # '25 October 2006' + # "%d %B, %Y", # '25 October, 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' - '%m/%d/%y %H:%M', # '10/25/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' ] -DECIMAL_SEPARATOR = '.' +DECIMAL_SEPARATOR = "." THOUSAND_SEPARATOR = " " NUMBER_GROUPING = 3 diff --git a/django/conf/locale/km/formats.py b/django/conf/locale/km/formats.py index b704e9c62d60..5923437476ff 100644 --- a/django/conf/locale/km/formats.py +++ b/django/conf/locale/km/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j ខែ F ឆ្នាំ Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j ខែ F ឆ្នាំ Y, G:i' +DATE_FORMAT = "j ខែ F ឆ្នាំ Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j ខែ F ឆ្នាំ Y, G:i" # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M Y' -SHORT_DATETIME_FORMAT = 'j M Y, G:i' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M Y" +SHORT_DATETIME_FORMAT = "j M Y, G:i" # FIRST_DAY_OF_WEEK = # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." # NUMBER_GROUPING = diff --git a/django/conf/locale/kn/formats.py b/django/conf/locale/kn/formats.py index 5003c6441b0a..d212fd52d1c6 100644 --- a/django/conf/locale/kn/formats.py +++ b/django/conf/locale/kn/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'h:i A' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "h:i A" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M Y' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = diff --git a/django/conf/locale/ko/LC_MESSAGES/django.mo b/django/conf/locale/ko/LC_MESSAGES/django.mo index 3e67d282f6f7..02c61beb19c0 100644 Binary files a/django/conf/locale/ko/LC_MESSAGES/django.mo and b/django/conf/locale/ko/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ko/LC_MESSAGES/django.po b/django/conf/locale/ko/LC_MESSAGES/django.po index 35e0f7395f25..ef36cf19d988 100644 --- a/django/conf/locale/ko/LC_MESSAGES/django.po +++ b/django/conf/locale/ko/LC_MESSAGES/django.po @@ -4,29 +4,37 @@ # BJ Jang , 2014 # JunGu Kang , 2017 # Jiyoon, Ha , 2016 +# darjeeling , 2024 +# DONGHO JEONG , 2020 # Park Hyunwoo , 2017 # Geonho Kim / Leo Kim , 2019 # hoseung2 , 2017 # Ian Y. Choi , 2015 # Jaehong Kim , 2011 # Jannis Leidel , 2011 +# Jay Oh , 2020 # Le Tartuffe , 2014,2016 # Jonghwa Seo , 2019 +# Jubeen Lee , 2020 # JuneHyeon Bae , 2014 # JunGu Kang , 2015 # JunGu Kang , 2019 # Kagami Sascha Rosylight , 2017 -# Noh Seho , 2018 +# Mariusz Felisiak , 2021 +# Seho Noh , 2018 +# Seoeun(Sun☀️) Hong, 2023 +# 최소영, 2024 # Subin Choi , 2016 # Taesik Yoon , 2015 +# 정훈 이, 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: darjeeling , 2024\n" +"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -39,6 +47,9 @@ msgstr "아프리칸스어" msgid "Arabic" msgstr "아랍어" +msgid "Algerian Arabic" +msgstr "알제리 아랍어" + msgid "Asturian" msgstr "호주어" @@ -63,6 +74,9 @@ msgstr "보스니아어" msgid "Catalan" msgstr "카탈로니아어" +msgid "Central Kurdish (Sorani)" +msgstr "중부 쿠르드어 (소라니어)" + msgid "Czech" msgstr "체코어" @@ -162,6 +176,9 @@ msgstr "인테르링구아어" msgid "Indonesian" msgstr "인도네시아어" +msgid "Igbo" +msgstr "이그보어" + msgid "Ido" msgstr "이도어" @@ -192,6 +209,9 @@ msgstr "칸나다어" msgid "Korean" msgstr "한국어" +msgid "Kyrgyz" +msgstr "키르키즈 공화국어" + msgid "Luxembourgish" msgstr "룩셈부르크" @@ -205,7 +225,7 @@ msgid "Macedonian" msgstr "마케도니아어" msgid "Malayalam" -msgstr "말레이지아어" +msgstr "말라얄람어" msgid "Mongolian" msgstr "몽고어" @@ -213,6 +233,9 @@ msgstr "몽고어" msgid "Marathi" msgstr "마라티어" +msgid "Malay" +msgstr "말레이시아어" + msgid "Burmese" msgstr "룩셈부르크어" @@ -276,9 +299,15 @@ msgstr "타밀어" msgid "Telugu" msgstr "텔루구어" +msgid "Tajik" +msgstr "타지크어" + msgid "Thai" msgstr "태국어" +msgid "Turkmen" +msgstr "튀르크멘어" + msgid "Turkish" msgstr "터키어" @@ -288,6 +317,9 @@ msgstr "타타르" msgid "Udmurt" msgstr "이제프스크" +msgid "Uyghur" +msgstr "위구르" + msgid "Ukrainian" msgstr "우크라이나어" @@ -295,7 +327,7 @@ msgid "Urdu" msgstr "우르드어" msgid "Uzbek" -msgstr "" +msgstr "우즈베크어" msgid "Vietnamese" msgstr "베트남어" @@ -318,6 +350,11 @@ msgstr "정적 파일" msgid "Syndication" msgstr "신디케이션" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "페이지 번호가 정수가 아닙니다." @@ -330,6 +367,9 @@ msgstr "해당 페이지에 결과가 없습니다." msgid "Enter a valid value." msgstr "올바른 값을 입력하세요." +msgid "Enter a valid domain name." +msgstr "유효한 도메인 이름을 입력하세요." + msgid "Enter a valid URL." msgstr "올바른 URL을 입력하세요." @@ -342,21 +382,27 @@ msgstr "올바른 이메일 주소를 입력하세요." #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" +msgstr "문자, 숫자, '_', '-'만 가능합니다." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"유니코드 문자, 숫자, 언더스코어 또는 하이픈으로 구성된 올바른 내용을 입력하세" +"요." -msgid "Enter a valid IPv4 address." -msgstr "올바른 IPv4 주소를 입력하세요." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "유효한 %(protocol)s의 주소를 입력하세요." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "올바른 IPv6 주소를 입력하세요." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "올바른 IPv4 혹은 IPv6 주소를 입력하세요." +msgid "IPv4 or IPv6" +msgstr "IPv4 혹은 IPv6" msgid "Enter only digits separated by commas." msgstr "콤마로 구분된 숫자만 입력하세요." @@ -375,6 +421,18 @@ msgstr "%(limit_value)s 이하의 값을 입력해 주세요." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "%(limit_value)s 이상의 값을 입력해 주세요." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "단계 크기 %(limit_value)s의 배수를 입력해 주세요." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"예를 들어 %(offset)s, %(valid_value1)s, %(valid_value2)s 등, %(offset)s에서 " +"시작하는 %(limit_value)s의 배수를 입력해 주세요." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -422,6 +480,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"파일 확장자 '%(extension)s'는 허용되지 않습니다. 허용된 확장자: " +"'%(allowed_extensions)s'." msgid "Null characters are not allowed." msgstr "null 문자는 사용할 수 없습니다. " @@ -433,6 +493,10 @@ msgstr "또한" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s의 %(field_labels)s 은/는 이미 존재합니다." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "%(name)s을(를) 위반하였습니다." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r 은/는 올바른 선택사항이 아닙니다." @@ -447,8 +511,8 @@ msgstr "이 필드는 빈 칸으로 둘 수 없습니다." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s의 %(field_label)s은/는 이미 존재합니다." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -462,19 +526,22 @@ msgstr "%(field_type)s 형식 필드" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "'%(value)s' 값은 반드시 True 또는 False 중 하나여야만 합니다." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "'%(value)s'값은 반드시 True, False, None 중 하나여야만 합니다." msgid "Boolean (Either True or False)" -msgstr "boolean(참 또는 거짓)" +msgstr "boolean(True 또는 False)" #, python-format msgid "String (up to %(max_length)s)" msgstr "문자열(%(max_length)s 글자까지)" +msgid "String (unlimited)" +msgstr "문자열 (무제한의)" + msgid "Comma-separated integers" msgstr "정수(콤마로 구분)" @@ -482,13 +549,14 @@ msgstr "정수(콤마로 구분)" msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." -msgstr "" +msgstr "'%(value)s' 값은 날짜 형식이 아닙니다. YYYY-MM-DD 형식이어야 합니다." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"'%(value)s' 값은 올바른 형식(YYYY-MM-DD)이지만 유효하지 않은 날짜입니다." msgid "Date (without time)" msgstr "날짜(시간 제외)" @@ -498,19 +566,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"'%(value)s' 값은 올바르지 않은 형식입니다. YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ] 형식이어야 합니다." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"'%(value)s' 값은 올바른 형식이지만 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 유효" +"하지 않은 날짜/시간입니다." msgid "Date (with time)" msgstr "날짜(시간 포함)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "'%(value)s' 값은 10진수를 입력하여야 합니다." msgid "Decimal number" msgstr "10진수" @@ -520,6 +592,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"'%(value)s' 값은 올바르지 않은 형식입니다. [DD] [HH:[MM:]]ss[.uuuuuu] 형식이" +"어야 합니다." msgid "Duration" msgstr "지속시간" @@ -547,6 +621,9 @@ msgstr "정수" msgid "Big (8 byte) integer" msgstr "큰 정수 (8 byte)" +msgid "Small integer" +msgstr "작은 정수" + msgid "IPv4 address" msgstr "IPv4 주소" @@ -558,7 +635,10 @@ msgid "“%(value)s” value must be either None, True or False." msgstr "\"%(value)s\" 값은 반드시 None, True 또는 False이어야 합니다." msgid "Boolean (Either True, False or None)" -msgstr "boolean (참, 거짓 또는 none)" +msgstr "boolean (True, False 또는 None)" + +msgid "Positive big integer" +msgstr "큰 양의 정수" msgid "Positive integer" msgstr "양의 정수" @@ -570,9 +650,6 @@ msgstr "작은 양의 정수" msgid "Slug (up to %(max_length)s)" msgstr "슬러그(%(max_length)s 까지)" -msgid "Small integer" -msgstr "작은 정수" - msgid "Text" msgstr "텍스트" @@ -606,7 +683,7 @@ msgid "“%(value)s” is not a valid UUID." msgstr "\"%(value)s\"은 유효하지 않은 UUID입니다." msgid "Universally unique identifier" -msgstr "" +msgstr "범용 고유 식별 수단(UUID)" msgid "File" msgstr "파일" @@ -614,6 +691,12 @@ msgstr "파일" msgid "Image" msgstr "이미지" +msgid "A JSON object" +msgstr "JSON 객체" + +msgid "Value must be valid JSON." +msgstr "올바른 JSON 형식이여야 합니다." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s %(value)r 를 가지는 %(model)s 인스턴스가 존재하지 않습니다." @@ -702,6 +785,9 @@ msgstr "완전한 값을 입력하세요." msgid "Enter a valid UUID." msgstr "올바른 UUID를 입력하세요." +msgid "Enter a valid JSON." +msgstr "올바른 JSON을 입력하세요." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -710,18 +796,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(%(name)s hidden 필드) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "관리폼 데이터가 없거나 변조되었습니다." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm 데이터가 없거나 변경되었습니다. 현재 없는 필드: " +"%(field_names)s. 이런 이슈가 지속된다면 버그 리포트를 제출해주시기 바랍니다." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "%d 개 이하의 양식을 제출하세요." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "최대 %(num)d개의 양식을 제출하세요." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "%d 개 이상의 양식을 제출하세요." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "최소 %(num)d개의 양식을 제출하세요." msgid "Order" msgstr "순서:" @@ -756,13 +847,15 @@ msgstr "올바르게 선택해 주세요. 선택하신 것이 선택가능항목 #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" 은/는 유효한 값이 아닙니다." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s 은/는 %(current_timezone)s 시간대에서 해석될 수 없습니다; 정보" +"가 모호하거나 존재하지 않을 수 있습니다." msgid "Clear" msgstr "취소" @@ -782,15 +875,7 @@ msgstr "예" msgid "No" msgstr "아니오" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "예,아니오,아마도" @@ -1053,7 +1138,7 @@ msgstr "올바른 IPv6 주소가 아닙니다." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "또는" @@ -1063,37 +1148,34 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d년" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d년" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d개월" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d개월" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d주" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d주" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d일" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d일" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d시간" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d시간" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d분" - -msgid "0 minutes" -msgstr "0분" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d분" msgid "Forbidden" msgstr "Forbidden" @@ -1103,24 +1185,35 @@ msgstr "CSRF 검증에 실패했습니다. 요청을 중단하였습니다." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"이 메세지가 보이는 이유는 이 HTTPS 사이트가 당신의 웹 브라우저로부터 \"참조 " +"헤더\"를 요구하지만, 아무것도 받기 못하였기 때문입니다. 이 헤더는 보안상의 이" +"유로 필요하며, 당신의 웹 브라우저가 제3자에 의해 해킹당하고 있지 않다는 것을 " +"보장하기 위함입니다." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"만약 브라우저 설정에서 '참조' 헤더를 비활성화 시켰을 경우, 적어도 이 사이트" +"나 HTTPS 연결, '동일-출처' 요청에 대해서는 이를 다시 활성화 시키십시오. " msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"태그나 'Referrer-Policy: no-" +"referrer' 헤더를 포함하고 있다면, 제거해주시기 바랍니다. CSRF 방지를 위한 리" +"퍼러 검사를 위해 'Referer' 헤더가 필요합니다. 개인 정보에 대해 우려가 있는 경" +"우, 서드 파티 사이트에 대한 링크에 와 같은 대안을 사" +"용할 수 있습니다." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1135,6 +1228,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"만약 브라우저 설정에서 쿠키를 비활성화 시켰을 경우, 적어도 이 사이트나 '동일-" +"출처' 요청에 대해서는 활성화 시키십시오." msgid "More information is available with DEBUG=True." msgstr "DEBUG=True 로 더 많은 정보를 확인할 수 있습니다." @@ -1168,14 +1263,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "날짜 문자열 '%(datestr)s'이 표준 형식 '%(format)s'과 다릅니다." #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "쿼리 결과에 %(verbose_name)s가 없습니다." msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "'마지막' 페이지가 아니거나, 정수형으로 변환할 수 없습니다." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1183,21 +1278,21 @@ msgstr "Invalid page (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "빈 리스트이고 '%(class_name)s.allow_empty'가 False입니다." msgid "Directory indexes are not allowed here." msgstr "디렉토리 인덱스는 이곳에 사용할 수 없습니다." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" 이/가 존재하지 않습니다." #, python-format msgid "Index of %(directory)s" msgstr "Index of %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: 마감에 쫓기는 완벽주의자를 위한 웹 프레임워크" +msgid "The install worked successfully! Congratulations!" +msgstr "성공적으로 설치되었습니다! 축하합니다!" #, python-format msgid "" @@ -1207,25 +1302,23 @@ msgstr "" "Django %(version)s릴리스 노트 보기" -msgid "The install worked successfully! Congratulations!" -msgstr "성공적으로 설치되었습니다! 축하합니다!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "이 페이지는 어떤 URL도 지정되지 않았고, settings 파일에 DEBUG=True가 설정되어 있을 때 표시됩니다." +"docs.djangoproject.com/en/%(version)s/ref/settings/#debug\" " +"target=\"_blank\" rel=\"noopener\">DEBUG=True가 설정되어 있을 때 표시됩니" +"다." msgid "Django Documentation" msgstr "Django 문서" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "주제, 레퍼런스, & 입문참조하다" msgid "Tutorial: A Polling App" msgstr "튜토리얼: 폴링 애플리케이션" diff --git a/django/conf/locale/ko/formats.py b/django/conf/locale/ko/formats.py index 0e281e94c11b..1a0dffaf8692 100644 --- a/django/conf/locale/ko/formats.py +++ b/django/conf/locale/ko/formats.py @@ -2,48 +2,53 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'Y년 n월 j일' -TIME_FORMAT = 'A g:i' -DATETIME_FORMAT = 'Y년 n월 j일 g:i A' -YEAR_MONTH_FORMAT = 'Y년 n월' -MONTH_DAY_FORMAT = 'n월 j일' -SHORT_DATE_FORMAT = 'Y-n-j.' -SHORT_DATETIME_FORMAT = 'Y-n-j H:i' +DATE_FORMAT = "Y년 n월 j일" +TIME_FORMAT = "A g:i" +DATETIME_FORMAT = "Y년 n월 j일 g:i A" +YEAR_MONTH_FORMAT = "Y년 n월" +MONTH_DAY_FORMAT = "n월 j일" +SHORT_DATE_FORMAT = "Y-n-j" +SHORT_DATETIME_FORMAT = "Y-n-j H:i" # FIRST_DAY_OF_WEEK = # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' - # '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' - # '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006' - # '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006' - # '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' - '%Y년 %m월 %d일', # '2006년 10월 25일', with localized suffix. + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' + # "%b %d %Y", # 'Oct 25 2006' + # "%b %d, %Y", # 'Oct 25, 2006' + # "%d %b %Y", # '25 Oct 2006' + # "%d %b, %Y", #'25 Oct, 2006' + # "%B %d %Y", # 'October 25 2006' + # "%B %d, %Y", #'October 25, 2006' + # "%d %B %Y", # '25 October 2006' + # "%d %B, %Y", # '25 October, 2006' + "%Y년 %m월 %d일", # '2006년 10월 25일', with localized suffix. ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '14:30:59' - '%H:%M:%S.%f', # '14:30:59.000200' - '%H:%M', # '14:30' - '%H시 %M분 %S초', # '14시 30분 59초' - '%H시 %M분', # '14시 30분' + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' + "%H시 %M분 %S초", # '14시 30분 59초' + "%H시 %M분", # '14시 30분' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' - '%m/%d/%y %H:%M', # '10/25/06 14:30' - - '%Y년 %m월 %d일 %H시 %M분 %S초', # '2006년 10월 25일 14시 30분 59초' - '%Y년 %m월 %d일 %H시 %M분', # '2006년 10월 25일 14시 30분' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' + "%Y년 %m월 %d일 %H시 %M분 %S초", # '2006년 10월 25일 14시 30분 59초' + "%Y년 %m월 %d일 %H시 %M분", # '2006년 10월 25일 14시 30분' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ky/LC_MESSAGES/django.mo b/django/conf/locale/ky/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..f99fc908f772 Binary files /dev/null and b/django/conf/locale/ky/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ky/LC_MESSAGES/django.po b/django/conf/locale/ky/LC_MESSAGES/django.po new file mode 100644 index 000000000000..391196f711a7 --- /dev/null +++ b/django/conf/locale/ky/LC_MESSAGES/django.po @@ -0,0 +1,1279 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2021 +# Soyuzbek Orozbek uulu , 2020-2021 +# Soyuzbek Orozbek uulu , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-27 14:11+0000\n" +"Last-Translator: Soyuzbek Orozbek uulu \n" +"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ky\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "Африканча" + +msgid "Arabic" +msgstr "Арабча" + +msgid "Algerian Arabic" +msgstr "Алжир арабчасы" + +msgid "Asturian" +msgstr "Австрийче" + +msgid "Azerbaijani" +msgstr "Азерче" + +msgid "Bulgarian" +msgstr "Болгарча" + +msgid "Belarusian" +msgstr "Белорусча" + +msgid "Bengali" +msgstr "Бенгалча" + +msgid "Breton" +msgstr "Бретончо" + +msgid "Bosnian" +msgstr "Босния" + +msgid "Catalan" +msgstr "Каталан" + +msgid "Czech" +msgstr "Чехче" + +msgid "Welsh" +msgstr "Валлий" + +msgid "Danish" +msgstr "Данчийче" + +msgid "German" +msgstr "Немисче" + +msgid "Lower Sorbian" +msgstr "Сорб" + +msgid "Greek" +msgstr "Грекче" + +msgid "English" +msgstr "Англисче" + +msgid "Australian English" +msgstr "Авс. Англисчеси" + +msgid "British English" +msgstr "Бр. Англ." + +msgid "Esperanto" +msgstr "Есперанто" + +msgid "Spanish" +msgstr "Испанча" + +msgid "Argentinian Spanish" +msgstr "Арг. исп" + +msgid "Colombian Spanish" +msgstr "Колумб Испанчасы" + +msgid "Mexican Spanish" +msgstr "Мекс. исп" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуа испанчасы" + +msgid "Venezuelan Spanish" +msgstr "Венесуела Испанчасы" + +msgid "Estonian" +msgstr "Эстон" + +msgid "Basque" +msgstr "Баск" + +msgid "Persian" +msgstr "Персче" + +msgid "Finnish" +msgstr "Финче" + +msgid "French" +msgstr "Французча" + +msgid "Frisian" +msgstr "Фризче" + +msgid "Irish" +msgstr "Ирланча" + +msgid "Scottish Gaelic" +msgstr "Шотланча" + +msgid "Galician" +msgstr "Галицианча" + +msgid "Hebrew" +msgstr "Жөөтчө" + +msgid "Hindi" +msgstr "Хиндче" + +msgid "Croatian" +msgstr "Хорватча" + +msgid "Upper Sorbian" +msgstr "Жогорку Сорбчо" + +msgid "Hungarian" +msgstr "Венгрче" + +msgid "Armenian" +msgstr "Арменче" + +msgid "Interlingua" +msgstr "Эл аралык" + +msgid "Indonesian" +msgstr "Индонезче" + +msgid "Igbo" +msgstr "Игбо" + +msgid "Ido" +msgstr "идо" + +msgid "Icelandic" +msgstr "Исландча" + +msgid "Italian" +msgstr "Итальянча" + +msgid "Japanese" +msgstr "Жапончо" + +msgid "Georgian" +msgstr "Грузинче" + +msgid "Kabyle" +msgstr "Кабилче" + +msgid "Kazakh" +msgstr "Казакча" + +msgid "Khmer" +msgstr "Кхмер" + +msgid "Kannada" +msgstr "Канадча" + +msgid "Korean" +msgstr "Корейче" + +msgid "Kyrgyz" +msgstr "Кыргызча" + +msgid "Luxembourgish" +msgstr "Люкцембургча" + +msgid "Lithuanian" +msgstr "Литвача" + +msgid "Latvian" +msgstr "Латвияча" + +msgid "Macedonian" +msgstr "Македончо" + +msgid "Malayalam" +msgstr "Малаяламча" + +msgid "Mongolian" +msgstr "Монголчо" + +msgid "Marathi" +msgstr "Марати" + +msgid "Malay" +msgstr "Малай" + +msgid "Burmese" +msgstr "Бурмача" + +msgid "Norwegian Bokmål" +msgstr "Норвег Бокмолчо" + +msgid "Nepali" +msgstr "Непалча" + +msgid "Dutch" +msgstr "Голландча" + +msgid "Norwegian Nynorsk" +msgstr "Норвегиялык нюнор" + +msgid "Ossetic" +msgstr "Оссетче" + +msgid "Punjabi" +msgstr "Пенжабча" + +msgid "Polish" +msgstr "Полякча" + +msgid "Portuguese" +msgstr "Португалча" + +msgid "Brazilian Portuguese" +msgstr "Бразилиялык португалчасы" + +msgid "Romanian" +msgstr "Румынча" + +msgid "Russian" +msgstr "Орусча" + +msgid "Slovak" +msgstr "Словакча" + +msgid "Slovenian" +msgstr "Словенияча" + +msgid "Albanian" +msgstr "Албанча" + +msgid "Serbian" +msgstr "Сербче" + +msgid "Serbian Latin" +msgstr "Серб латынчасы" + +msgid "Swedish" +msgstr "Шведче" + +msgid "Swahili" +msgstr "Свахилче" + +msgid "Tamil" +msgstr "Тамиль" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Tajik" +msgstr "Тажикче" + +msgid "Thai" +msgstr "Тайча" + +msgid "Turkmen" +msgstr "Түркмөнчө" + +msgid "Turkish" +msgstr "Түркчө" + +msgid "Tatar" +msgstr "Татарча" + +msgid "Udmurt" +msgstr "Удмурча" + +msgid "Ukrainian" +msgstr "Украинче" + +msgid "Urdu" +msgstr "Урду" + +msgid "Uzbek" +msgstr "Өзбекче" + +msgid "Vietnamese" +msgstr "Вьетнамча" + +msgid "Simplified Chinese" +msgstr "Жеңилдетилген кытайча" + +msgid "Traditional Chinese" +msgstr "салттык кытайча" + +msgid "Messages" +msgstr "Билдирүүлөр" + +msgid "Site Maps" +msgstr "сайт картасы" + +msgid "Static Files" +msgstr "Туруктуу файлдар" + +msgid "Syndication" +msgstr "Синдикат" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + +msgid "That page number is not an integer" +msgstr "Бул барактын номуру сан эмес" + +msgid "That page number is less than 1" +msgstr "Бул барактын номуру 1 ден кичине" + +msgid "That page contains no results" +msgstr "Бул баракта жыйынтык жок" + +msgid "Enter a valid value." +msgstr "Туура маани киргиз" + +msgid "Enter a valid URL." +msgstr "Туура URL киргиз" + +msgid "Enter a valid integer." +msgstr "Туура натурал сан тер." + +msgid "Enter a valid email address." +msgstr "Туура эдарек тер." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"ариптер, цифралар, дефис же астыңкы сызык камтыган туура слаг киргизиңиз." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Юникод символдор, цифралар, астыңкы сызыктар же дефис камтыган туурга слаг " +"киргизиңиз." + +msgid "Enter a valid IPv4 address." +msgstr "Туура IPv4 тер." + +msgid "Enter a valid IPv6 address." +msgstr "Туура IPv6 тер." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Туура IPv4 же IPv6 тер." + +msgid "Enter only digits separated by commas." +msgstr "Жалаң үтүр менен бөлүнгөн сан тер." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Бул маани %(limit_value)s ашпоосун текшериңиз (азыр %(show_value)s)" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "%(limit_value)s карата кичине же барабар маани болгонун текшериңиз" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "%(limit_value)s карата чоң же барабар маани болгонун текшериңиз" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Бул маани жок дегенде %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " +"%(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Бул маани эң көп %(limit_value)dсимвол камтыганын текшериңиз (азыркысы " +"%(show_value)d)." + +msgid "Enter a number." +msgstr "Сан киргизиңиз." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Жалпысынан %(max)sорундан ашпоосун текшериңиз." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Жалпысынан ондук сандын%(max)s ашпоосун текшериңиз." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Жалпысынан үтүргө чейин%(max)s ашпоосун текшериңиз." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"%(extension)sфайл кеңейтүүсү кабыл алынбайт. Кабыл алынгандар: " +"%(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "Боштук кабыл алынбайт" + +msgid "and" +msgstr "жана" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s бул %(field_labels)s менен мурдатан эле бар" + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r мааниси туура эмес тандоо." + +msgid "This field cannot be null." +msgstr "Бул аймак жок маани албашы керек" + +msgid "This field cannot be blank." +msgstr "Бул аймак бош калбашы керек" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s бул %(field_label)s менен мурдатан эле бар" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s %(date_field_label)s %(lookup_type)s үчүн уникал болуусу " +"керек." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "аймактын түрү: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "“%(value)s” мааниси же True же False болуусу керек." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "“%(value)s” мааниси же True же False же None болуусу керек." + +msgid "Boolean (Either True or False)" +msgstr "Булен (Туура же Ката)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Сап (%(max_length)s чейин)" + +msgid "Comma-separated integers" +msgstr "үтүр менен бөлүнгөн сан" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК форматта болуусу " +"керек." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "%(value)sмааниси туура (ЖЖЖЖ-АА-КК) форматта бирок ал күн туура эмес." + +msgid "Date (without time)" +msgstr "Күн (убакытсыз)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"“%(value)s” мааниси туура эмес форматта. Ал ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]]" +"[УЗ] форматта болуусу керек." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"“%(value)s” мааниси туура форматта (ЖЖЖЖ-АА-КК СС:ММ[сс[.дддддд]][УЗ] ) " +"бирок ал күн/убакыт туура эмес." + +msgid "Date (with time)" +msgstr "Күн(убакыттуу)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "“%(value)s” мааниси ондук сан болушу керек." + +msgid "Decimal number" +msgstr "ондук сан" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"“%(value)s” мааниси туура эмес форматта. Ал [КК][[CC:]MM:]cc[.дддддд] " +"форматта болуусу керек." + +msgid "Duration" +msgstr "Мөөнөт" + +msgid "Email address" +msgstr "электрондук дарек" + +msgid "File path" +msgstr "файл жайгашуусу" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "“%(value)s” мааниси калкыган чекиттүү болуусу керек." + +msgid "Floating point number" +msgstr "калкыган чекит саны" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "“%(value)s” мааниси натуралдык сан болуусу керек." + +msgid "Integer" +msgstr "Натурал сан" + +msgid "Big (8 byte) integer" +msgstr "Чоң ( 8 байт) натурал сан" + +msgid "Small integer" +msgstr "кичине натурал сан" + +msgid "IPv4 address" +msgstr "IPv4 дареги" + +msgid "IP address" +msgstr "IP дареги" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "“%(value)s” мааниси же None же True же False болуусу керек." + +msgid "Boolean (Either True, False or None)" +msgstr "Булен(Туура же Жалган же Куру)" + +msgid "Positive big integer" +msgstr "Оң чоң натуралдык сан." + +msgid "Positive integer" +msgstr "оң сан" + +msgid "Positive small integer" +msgstr "кичине оң сан" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "слаг ( %(max_length)s чейин)" + +msgid "Text" +msgstr "сап" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"“%(value)s” мааниси туура эмес форматта. Ал СС:ММ[:сс[.ддддддд]] форматта " +"болуусу керек." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"“%(value)s” мааниси туура форматта (СС:ММ[:cc[.дддддд]]) бирок ал убакыт " +"туура эмес." + +msgid "Time" +msgstr "Убакыт" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "жалаң экилик берилиш" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "“%(value)s” туура эмес UUID." + +msgid "Universally unique identifier" +msgstr "универсал уникал көрсөтүүчү" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Сүрөт" + +msgid "A JSON object" +msgstr "JSON обектиси" + +msgid "Value must be valid JSON." +msgstr "Маани туура JSON болушу керек." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s нерсеси %(field)s аймагы %(value)r маани менен табылбады." + +msgid "Foreign Key (type determined by related field)" +msgstr "Бөтөн Ачкыч (байланышкан аймак менен аныкталат)" + +msgid "One-to-one relationship" +msgstr "Бирге-бир байланышы" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s байланышы" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s байланыштары" + +msgid "Many-to-many relationship" +msgstr "көпкө-көп байланышы" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Бул талаа керектүү." + +msgid "Enter a whole number." +msgstr "Толук сан киргиз." + +msgid "Enter a valid date." +msgstr "туура күн киргиз." + +msgid "Enter a valid time." +msgstr "Туура убакыт киргиз." + +msgid "Enter a valid date/time." +msgstr "Туура күн/убакыт киргиз." + +msgid "Enter a valid duration." +msgstr "Туура мөөнөт киргиз." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Күндөрдүн саны {min_days} жана {max_days} арасында болуусу керек." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Файл жиберилген жок. Формдун бекитүү түрүн текшер." + +msgid "No file was submitted." +msgstr "Файл жиберилген жок." + +msgid "The submitted file is empty." +msgstr "Жиберилген файл бош." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Бул файлдын аты эң көп %(max)dсимвол ала алат. (азыркысы %(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Сураныч же файл жибериңиз же тандоону бош калтырыңыз. Экөөн тең эмес." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "Туура сүрөт жөнөтүңүз. Сиз жүктөгөн же сүрөт эмес же бузулган сүрөт." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Туура тандоону танда. %(value)s мүмкүн болгон тандоо эмес." + +msgid "Enter a list of values." +msgstr "Туура маанилер тизмесин киргиз." + +msgid "Enter a complete value." +msgstr "Толук маани киргиз." + +msgid "Enter a valid UUID." +msgstr "Туура UUID киргиз." + +msgid "Enter a valid JSON." +msgstr "Туура JSON киргиз." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(жашырылган аймак %(name)s) %(error)s" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm берилиши жетишпей атат же жасалма болуп атат. Жетишпеген " +"талаалар: %(field_names)s. Эгер көйгөй чечилбей атса сиз баг билдирүү " +"жөнөтсөңүз болот." + +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Сураныч, эң көп %d форм жөнөтүңүз." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Сураныч, эң аз %dформ жөнөтүңүз." + +msgid "Order" +msgstr "Тартип" + +msgid "Delete" +msgstr "Өчүрүү" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s үчүн кайталанган маанилерди оңдоңуз." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s үчүн кайталанган маанилерди оңдоңуз алар уникал болуусу керек." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s %(date_field)s да %(lookup)s үчүн уникал болусу керек. " +"Берилиштерди оңдоңуз." + +msgid "Please correct the duplicate values below." +msgstr "Төмөндө кайталанган маанилерди оңдоңуз." + +msgid "The inline value did not match the parent instance." +msgstr "Катардагы маани энелик нерсеге туура келбей жатат." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Туура тандоо кылыңыз. Ал тандоо мүмкүнчүлүктөн сырткары." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr " “%(pk)s”туура эмес маани." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)sкүнү %(current_timezone)sубактысы боюнча чечмелене албай атат. " +"Ал экианжы же жок болушу мүмкүн." + +msgid "Clear" +msgstr "Тазалоо" + +msgid "Currently" +msgstr "Азыркы" + +msgid "Change" +msgstr "өзгөртүү" + +msgid "Unknown" +msgstr "Белгисиз" + +msgid "Yes" +msgstr "Ооба" + +msgid "No" +msgstr "Жок" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "ооба, жок, балким" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)dбит" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s мегабайт" + +#, python-format +msgid "%s GB" +msgstr "%s гигабайт" + +#, python-format +msgid "%s TB" +msgstr "%s терабайт" + +#, python-format +msgid "%s PB" +msgstr "%s пикабайт" + +msgid "p.m." +msgstr "түштөн кийин" + +msgid "a.m." +msgstr "түшкө чейин" + +msgid "PM" +msgstr "Түштөн кийин" + +msgid "AM" +msgstr "Түшкө чейин" + +msgid "midnight" +msgstr "Түнүчү" + +msgid "noon" +msgstr "ай" + +msgid "Monday" +msgstr "Дүйшөмбү" + +msgid "Tuesday" +msgstr "Шейшемби" + +msgid "Wednesday" +msgstr "Шаршемби" + +msgid "Thursday" +msgstr "Бейшемби" + +msgid "Friday" +msgstr "Жума" + +msgid "Saturday" +msgstr "Ишемби" + +msgid "Sunday" +msgstr "Жекшемби" + +msgid "Mon" +msgstr "Дүйш" + +msgid "Tue" +msgstr "Шей" + +msgid "Wed" +msgstr "Шар" + +msgid "Thu" +msgstr "Бей" + +msgid "Fri" +msgstr "Жума" + +msgid "Sat" +msgstr "Ише" + +msgid "Sun" +msgstr "Жек" + +msgid "January" +msgstr "Январь" + +msgid "February" +msgstr "Февраль" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрель" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июнь" + +msgid "July" +msgstr "Июль" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябрь" + +msgid "October" +msgstr "Октябрь" + +msgid "November" +msgstr "Ноябрь" + +msgid "December" +msgstr "Декабрь" + +msgid "jan" +msgstr "янв" + +msgid "feb" +msgstr "фев" + +msgid "mar" +msgstr "мар" + +msgid "apr" +msgstr "апр" + +msgid "may" +msgstr "май" + +msgid "jun" +msgstr "июн" + +msgid "jul" +msgstr "июл" + +msgid "aug" +msgstr "авг" + +msgid "sep" +msgstr "сен" + +msgid "oct" +msgstr "окт" + +msgid "nov" +msgstr "ноя" + +msgid "dec" +msgstr "дек" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Янв." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Фев." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Март" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Апрель" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Июнь" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Июль" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Сен." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Ноя." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дек." + +msgctxt "alt. month" +msgid "January" +msgstr "Январь" + +msgctxt "alt. month" +msgid "February" +msgstr "Февраль" + +msgctxt "alt. month" +msgid "March" +msgstr "Март" + +msgctxt "alt. month" +msgid "April" +msgstr "Апрель" + +msgctxt "alt. month" +msgid "May" +msgstr "Май" + +msgctxt "alt. month" +msgid "June" +msgstr "Июнь" + +msgctxt "alt. month" +msgid "July" +msgstr "Июль" + +msgctxt "alt. month" +msgid "August" +msgstr "Август" + +msgctxt "alt. month" +msgid "September" +msgstr "Сентябрь" + +msgctxt "alt. month" +msgid "October" +msgstr "Октябрь" + +msgctxt "alt. month" +msgid "November" +msgstr "Ноябрь" + +msgctxt "alt. month" +msgid "December" +msgstr "Декабрь" + +msgid "This is not a valid IPv6 address." +msgstr "Бул туура эмес IPv6 дареги" + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "же" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d жыл" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d ай" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d апта" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d күн" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d саат" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d мүнөт" + +msgid "Forbidden" +msgstr "Тыйылган" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF текшерүү кыйрады. Суроо четке кагылды." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Браузер тараптан \"Referer header\" HTTPS сайтына жиберилбей калгандыгы үчүн " +"бул билдирүүнү көрүп турасыз. Бул хэдэр сиздин браузер үчүнчү жактан " +"чабуулга учурабаганын текшерүүгө коопсуздук үчүн керек." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Эгер сиз броузерден “Referer” хэдерин өчүрүп салсаңыз, аны күйгүзүп коюңуз. " +"Жок дегенде ушул сайт үчүн же жок дегенде HTTPS байланышуу үчүн. Же болбосо " +"“same-origin” суроолору үчүн." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Эгер сиз тегин же “Referrer-" +"Policy: no-referrer” хэдерин колдонуп жатсаңыз, аларды өчүрүп салыңыз. CSRF " +"коргоосу “Referer” хэдерин талап кылат. Эгер сиз коопсуздук жөнүндө " +"кабатырланып атсаңыз үчүнчү жактар үчүн шилтемесин " +"колдонуңуз." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Сиз бул билдирүүнү бул сайт форм жиберүүдө CSRF кукини талап кылгандыгы үчүн " +"көрүп жатасыз. Бул куки коопсуздуктан улам сиздин сайтыңыз үчүнчү жактан " +"чабуулга кабылбаганын текшерүү үчүн талап кылынат. " + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Эгер сиз броузерде кукиледи өчүрүп койсоңуз, аларды кайра күйгүзүп коюңуз. " +"Жок дегенде ушул сайтка же “same-origin” суроолоруна." + +msgid "More information is available with DEBUG=True." +msgstr "Сиз бул маалыматты DEBUG=True болгону үчүн көрүп жатасыз." + +msgid "No year specified" +msgstr "Жыл көрсөтүлгөн эмес" + +msgid "Date out of range" +msgstr "Күн чектен сырткары" + +msgid "No month specified" +msgstr "Ай көрсөтүлгөн эмес" + +msgid "No day specified" +msgstr "Апта күнү көрсөтүлгөн эмес" + +msgid "No week specified" +msgstr "Апта көрсөтүлгө эмес" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s жок" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s future си тейленбейт. Себеби %(class_name)s." +"allow_future си False маани алган." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "Туура эмес күн сабы “%(datestr)s” берилген формат болсо “%(format)s”." + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "суроого эч бир %(verbose_name)s табылбады" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Барак акыркы эмес. Же натуралдык санга өткөрүлө албай атат." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Туура эмес (%(page_number)s) барак: %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "Бош тизме жана “%(class_name)s.allow_empty” = False болуп калган." + +msgid "Directory indexes are not allowed here." +msgstr "Папка индекстери бул жерде иштей албайт." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” жашабайт" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s индексттери" + +msgid "The install worked successfully! Congratulations!" +msgstr "Орнотуу ийгиликтүү аяктады! Куттуу болсун!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Жанго %(version)s үчүн чыгарылыш " +"эскертмелерин кара." + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Сиз бул бетти сиздин тууралоо файлыңызда DEBUG=True жана эчбир урл тууралабагандыгыңыз үчүн көрүп " +"жататсыз." + +msgid "Django Documentation" +msgstr "Жанго Түшүндүрмөсү" + +msgid "Topics, references, & how-to’s" +msgstr "Темалар, Сурамжылар, & кантип.. тер" + +msgid "Tutorial: A Polling App" +msgstr "Колдонмо:" + +msgid "Get started with Django" +msgstr "Жангону башта" + +msgid "Django Community" +msgstr "Жанго жамааты" + +msgid "Connect, get help, or contribute" +msgstr "Туташ, жардам ал, же салым кош" diff --git a/django/conf/locale/ky/formats.py b/django/conf/locale/ky/formats.py index 1dc42c41e417..25a092872a9e 100644 --- a/django/conf/locale/ky/formats.py +++ b/django/conf/locale/ky/formats.py @@ -2,31 +2,31 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j E Y ж.' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j E Y ж. G:i' -YEAR_MONTH_FORMAT = 'F Y ж.' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j E Y ж." +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j E Y ж. G:i" +YEAR_MONTH_FORMAT = "F Y ж." +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Дүйшөмбү, Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d.%m.%y", # '25.10.06' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/lt/LC_MESSAGES/django.mo b/django/conf/locale/lt/LC_MESSAGES/django.mo index aa88229eee75..ee14fecb9b7a 100644 Binary files a/django/conf/locale/lt/LC_MESSAGES/django.mo and b/django/conf/locale/lt/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/lt/LC_MESSAGES/django.po b/django/conf/locale/lt/LC_MESSAGES/django.po index 66e31a94ebcb..0c055a2757db 100644 --- a/django/conf/locale/lt/LC_MESSAGES/django.po +++ b/django/conf/locale/lt/LC_MESSAGES/django.po @@ -4,6 +4,7 @@ # Jannis Leidel , 2011 # Kostas , 2011 # lauris , 2011 +# Mariusz Felisiak , 2021 # Matas Dailyda , 2015-2019 # naktinis , 2012 # Nikolajus Krauklis , 2013 @@ -14,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-24 16:28+0000\n" +"Last-Translator: Mariusz Felisiak \n" "Language-Team: Lithuanian (http://www.transifex.com/django/django/language/" "lt/)\n" "MIME-Version: 1.0\n" @@ -33,6 +34,9 @@ msgstr "Afrikiečių" msgid "Arabic" msgstr "Arabų" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Austrų" @@ -156,6 +160,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indoneziečių" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -186,6 +193,9 @@ msgstr "Dravidų" msgid "Korean" msgstr "Korėjiečių" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Liuksemburgų" @@ -207,6 +217,9 @@ msgstr "Mongolų" msgid "Marathi" msgstr "Marati" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Mjanmų" @@ -270,9 +283,15 @@ msgstr "Tamilų" msgid "Telugu" msgstr "Telugų" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tailando" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turkų" @@ -312,6 +331,11 @@ msgstr "Statiniai failai" msgid "Syndication" msgstr "Sindikacija" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "To puslapio numeris nėra sveikasis skaičius." @@ -570,6 +594,9 @@ msgstr "Sveikas skaičius" msgid "Big (8 byte) integer" msgstr "Didelis (8 baitų) sveikas skaičius" +msgid "Small integer" +msgstr "Nedidelis sveikasis skaičius" + msgid "IPv4 address" msgstr "IPv4 adresas" @@ -583,6 +610,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Loginė reikšmė (Tiesa, Netiesa arba Nieko)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Teigiamas sveikasis skaičius" @@ -593,9 +623,6 @@ msgstr "Nedidelis teigiamas sveikasis skaičius" msgid "Slug (up to %(max_length)s)" msgstr "Unikalus adresas (iki %(max_length)s ženklų)" -msgid "Small integer" -msgstr "Nedidelis sveikasis skaičius" - msgid "Text" msgstr "Tekstas" @@ -633,6 +660,12 @@ msgstr "Failas" msgid "Image" msgstr "Paveiksliukas" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s objektas su %(field)s %(value)r neegzistuoja." @@ -731,6 +764,9 @@ msgstr "Įveskite pilną reikšmę." msgid "Enter a valid UUID." msgstr "Įveskite tinkamą UUID." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -739,24 +775,27 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Paslėptas laukelis %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm duomenys buvo sugadinti arba neegzistuoja" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Prašome pateikti %d arba mažiau formų." -msgstr[1] "Prašome pateikti %d arba mažiau formų." -msgstr[2] "Prašome pateikti %d arba mažiau formų." -msgstr[3] "Prašome pateikti %d arba mažiau formų." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Prašome pateikti %d arba daugiau formų." -msgstr[1] "Prašome pateikti %d arba daugiau formų." -msgstr[2] "Prašome pateikti %d arba daugiau formų." -msgstr[3] "Prašome pateikti %d arba daugiau formų." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Order" msgstr "Nurodyti" @@ -819,15 +858,7 @@ msgstr "Taip" msgid "No" msgstr "Ne" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "taip,ne,galbūt" @@ -1093,7 +1124,7 @@ msgstr "Tai nėra teisingas IPv6 adresas." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "arba" @@ -1103,55 +1134,52 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d metas" -msgstr[1] "%d metai" -msgstr[2] "%d metų" -msgstr[3] "%d metų" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mėnuo" -msgstr[1] "%d mėnesiai" -msgstr[2] "%d mėnesių" -msgstr[3] "%d mėnesių" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d savaitė" -msgstr[1] "%d savaitės" -msgstr[2] "%d savaičių" -msgstr[3] "%d savaičių" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d diena" -msgstr[1] "%d dienos" -msgstr[2] "%d dienų" -msgstr[3] "%d dienų" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d valanda" -msgstr[1] "%d valandos" -msgstr[2] "%d valandų" -msgstr[3] "%d valandų" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutė" -msgstr[1] "%d minutės" -msgstr[2] "%d minučių" -msgstr[3] "%d minučių" - -msgid "0 minutes" -msgstr "0 minučių" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Forbidden" msgstr "Uždrausta" @@ -1161,7 +1189,7 @@ msgstr "Nepavyko CSRF patvirtinimas. Užklausa nutraukta." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1254,8 +1282,8 @@ msgstr "" msgid "Index of %(directory)s" msgstr "%(directory)s indeksas" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Žiniatinklio karkasas perfekcionistams su terminais." +msgid "The install worked successfully! Congratulations!" +msgstr "Diegimas pavyko! Sveikiname!" #, python-format msgid "" @@ -1266,9 +1294,6 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">išleidimo " "pastabas" -msgid "The install worked successfully! Congratulations!" -msgstr "Diegimas pavyko! Sveikiname!" - #, python-format msgid "" "You are seeing this page because , 2011 -# NullIsNot0 , 2017 -# NullIsNot0 , 2017-2018 +# Edgars Voroboks , 2023-2024 +# Edgars Voroboks , 2017,2022 +# Edgars Voroboks , 2017-2018 # Jannis Leidel , 2011 # krikulis , 2014 # Māris Nartišs , 2016 +# Mariusz Felisiak , 2021 # Mārtiņš Šulcs , 2018 -# NullIsNot0 , 2018-2019 +# Edgars Voroboks , 2018-2021 # peterisb , 2016-2017 +# Pēteris Caune, 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-07 07:15+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Edgars Voroboks , 2023-2024\n" +"Language-Team: Latvian (http://app.transifex.com/django/django/language/" "lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,6 +35,9 @@ msgstr "afrikāņu" msgid "Arabic" msgstr "arābu" +msgid "Algerian Arabic" +msgstr "Alžīrijas arābu" + msgid "Asturian" msgstr "asturiešu" @@ -56,6 +62,9 @@ msgstr "bosniešu" msgid "Catalan" msgstr "katalāņu" +msgid "Central Kurdish (Sorani)" +msgstr "centrālā kurdu (sorani)" + msgid "Czech" msgstr "čehu" @@ -147,14 +156,17 @@ msgid "Hungarian" msgstr "ungāru" msgid "Armenian" -msgstr "Armēņu" +msgstr "armēņu" msgid "Interlingua" -msgstr "modernā latīņu valoda" +msgstr "modernā latīņu" msgid "Indonesian" msgstr "indonēziešu" +msgid "Igbo" +msgstr "igbo" + msgid "Ido" msgstr "ido" @@ -165,10 +177,10 @@ msgid "Italian" msgstr "itāļu" msgid "Japanese" -msgstr "Japāņu" +msgstr "japāņu" msgid "Georgian" -msgstr "vācu" +msgstr "gruzīnu" msgid "Kabyle" msgstr "kabiliešu" @@ -185,6 +197,9 @@ msgstr "kannādiešu" msgid "Korean" msgstr "korejiešu" +msgid "Kyrgyz" +msgstr "kirgīzu" + msgid "Luxembourgish" msgstr "luksemburgiešu" @@ -206,6 +221,9 @@ msgstr "mongoļu" msgid "Marathi" msgstr "maratiešu" +msgid "Malay" +msgstr "malajiešu" + msgid "Burmese" msgstr "birmiešu" @@ -269,9 +287,15 @@ msgstr "tamilu" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tadžiku" + msgid "Thai" msgstr "taizemiešu" +msgid "Turkmen" +msgstr "turkmēņu" + msgid "Turkish" msgstr "turku" @@ -281,6 +305,9 @@ msgstr "tatāru" msgid "Udmurt" msgstr "udmurtu" +msgid "Uyghur" +msgstr "uiguru" + msgid "Ukrainian" msgstr "ukraiņu" @@ -311,6 +338,11 @@ msgstr "Statiski faili" msgid "Syndication" msgstr "Sindikācija" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Lapas numurs nav cipars" @@ -323,6 +355,9 @@ msgstr "Lapa nesatur rezultātu" msgid "Enter a valid value." msgstr "Ievadiet korektu vērtību." +msgid "Enter a valid domain name." +msgstr "Ievadiet derīgu domēna vārdu." + msgid "Enter a valid URL." msgstr "Ievadiet korektu URL adresi." @@ -336,24 +371,28 @@ msgstr "Ievadiet korektu e-pasta adresi" msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Ievadiet korektu \"vienkāršotā teksta\" vērtību, kas satur tikai burtus, " +"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai burtus, " "ciparus, apakšsvītras vai defises." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" -"Ievadiet korektu \"vienkāršotā teksta\" vērtību, kas satur tikai Unikoda " -"burtus, ciparus, apakšsvītras vai defises." +"Ievadiet korektu \"identifikatora\" vērtību, kas satur tikai Unikoda burtus, " +"ciparus, apakšsvītras vai defises." -msgid "Enter a valid IPv4 address." -msgstr "Ievadiet korektu IPv4 adresi." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Ievadiet derīgu %(protocol)s adresi." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Ievadiet korektu IPv6 adresi" +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ievadiet korektu IPv4 vai IPv6 adresi" +msgid "IPv4 or IPv6" +msgstr "IPv4 vai IPv6" msgid "Enter only digits separated by commas." msgstr "Ievadiet tikai numurus, atdalītus ar komatiem." @@ -370,6 +409,19 @@ msgstr "Šai vērtībai jabūt mazākai vai vienādai ar %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Vērtībai jābūt lielākai vai vienādai ar %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Vērtībai jābūt reizinājumam no %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Pārliecinieties, ka šī vērtība ir soļa lieluma %(limit_value)s reizinājums, " +"sākot no %(offset)s, piem. %(offset)s, %(valid_value1)s, %(valid_value2)s, " +"un tā tālāk." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -448,6 +500,10 @@ msgstr "un" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s ar šādu lauka %(field_labels)s vērtību jau eksistē." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Ierobežojums “%(name)s” ir pārkāpts." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Vērtība %(value)r ir nederīga izvēle." @@ -462,8 +518,8 @@ msgstr "Šis lauks nevar būt tukšs" msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s ar šādu lauka %(field_label)s vērtību jau eksistē." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -482,12 +538,15 @@ msgid "“%(value)s” value must be either True, False, or None." msgstr "“%(value)s” vērtībai ir jābūt True, False vai None." msgid "Boolean (Either True or False)" -msgstr "Boolean (True vai False)" +msgstr "Boolean (vai nu True, vai False)" #, python-format msgid "String (up to %(max_length)s)" msgstr "Simbolu virkne (līdz pat %(max_length)s)" +msgid "String (unlimited)" +msgstr "Simbolu virkne (neierobežota)" + msgid "Comma-separated integers" msgstr "Ar komatu atdalīti veselie skaitļi" @@ -557,7 +616,7 @@ msgid "“%(value)s” value must be a float." msgstr "“%(value)s” vērtībai ir jābūt daļskaitlim." msgid "Floating point number" -msgstr "Plūstošā punkta skaitlis" +msgstr "Peldošā komata skaitlis" #, python-format msgid "“%(value)s” value must be an integer." @@ -569,6 +628,9 @@ msgstr "Vesels skaitlis" msgid "Big (8 byte) integer" msgstr "Liels (8 baitu) vesels skaitlis" +msgid "Small integer" +msgstr "Mazs vesels skaitlis" + msgid "IPv4 address" msgstr "IPv4 adrese" @@ -580,7 +642,10 @@ msgid "“%(value)s” value must be either None, True or False." msgstr "“%(value)s” vērtībai ir jābūt None, True vai False." msgid "Boolean (Either True, False or None)" -msgstr "Boolean (jā, nē vai neviens)" +msgstr "Boolean (vai nu True, False, vai None)" + +msgid "Positive big integer" +msgstr "Liels pozitīvs vesels skaitlis" msgid "Positive integer" msgstr "Naturāls skaitlis" @@ -592,9 +657,6 @@ msgstr "Mazs pozitīvs vesels skaitlis" msgid "Slug (up to %(max_length)s)" msgstr "Identifikators (līdz %(max_length)s)" -msgid "Small integer" -msgstr "Mazs vesels skaitlis" - msgid "Text" msgstr "Teksts" @@ -636,6 +698,12 @@ msgstr "Fails" msgid "Image" msgstr "Attēls" +msgid "A JSON object" +msgstr "JSON objekts" + +msgid "Value must be valid JSON." +msgstr "Vērtībai ir jābūt derīgam JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s instance ar %(field)s %(value)r neeksistē." @@ -727,7 +795,10 @@ msgid "Enter a complete value." msgstr "Ievadiet pilnu vērtību." msgid "Enter a valid UUID." -msgstr "Ievadi derīgu UUID." +msgstr "Ievadiet derīgu UUID." + +msgid "Enter a valid JSON." +msgstr "Ievadiet korektu JSON." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -737,25 +808,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Slēpts lauks %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Trūkst ManagementForm dati vai arī tie ir bojāti" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm trūkst datu vai tie ir mainīti. Trūkstošie lauki: " +"%(field_names)s. Paziņojiet par kļūdu, ja problēma atkārtojas." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Lūdzu ievadiet %d vai mazāk formas." -msgstr[1] "Lūdzu ievadiet %d vai mazāk formas." -msgstr[2] "Lūdzu ievadiet %d vai mazāk formas." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Lūdzu iesniedziet ne vairāk par %(num)d formām." +msgstr[1] "Lūdzu iesniedziet ne vairāk par %(num)d formu." +msgstr[2] "Lūdzu iesniedziet ne vairāk par %(num)d formām." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Lūdzu ievadiet %d vai vairāk formas " -msgstr[1] "Lūdzu ievadiet %d vai vairāk formas " -msgstr[2] "Lūdzu ievadiet %d vai vairāk formas " +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Lūdzu iesniedziet vismaz %(num)d formas." +msgstr[1] "Lūdzu iesniedziet vismaz %(num)d formu." +msgstr[2] "Lūdzu iesniedziet vismaz %(num)d formas." msgid "Order" -msgstr "Sakārtojums" +msgstr "Kārtība" msgid "Delete" msgstr "Dzēst" @@ -805,7 +881,7 @@ msgid "Currently" msgstr "Pašlaik" msgid "Change" -msgstr "Izmainīt" +msgstr "Mainīt" msgid "Unknown" msgstr "Nezināms" @@ -816,15 +892,7 @@ msgstr "Jā" msgid "No" msgstr "Nē" -msgid "Year" -msgstr "Gads" - -msgid "Month" -msgstr "Mēnesis" - -msgid "Day" -msgstr "Diena" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "jā,nē,varbūt" @@ -989,11 +1057,11 @@ msgstr "dec" msgctxt "abbrev. month" msgid "Jan." -msgstr "Jan." +msgstr "jan." msgctxt "abbrev. month" msgid "Feb." -msgstr "Feb." +msgstr "feb." msgctxt "abbrev. month" msgid "March" @@ -1017,23 +1085,23 @@ msgstr "jūlijs" msgctxt "abbrev. month" msgid "Aug." -msgstr "Aug." +msgstr "aug." msgctxt "abbrev. month" msgid "Sept." -msgstr "Sept." +msgstr "sept." msgctxt "abbrev. month" msgid "Oct." -msgstr "Okt." +msgstr "okt." msgctxt "abbrev. month" msgid "Nov." -msgstr "Nov." +msgstr "nov." msgctxt "abbrev. month" msgid "Dec." -msgstr "Dec." +msgstr "dec." msgctxt "alt. month" msgid "January" @@ -1089,7 +1157,7 @@ msgstr "Šī nav derīga IPv6 adrese." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "vai" @@ -1099,49 +1167,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d gadi" -msgstr[1] "%d gads" -msgstr[2] "%d gadi" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d gadi" +msgstr[1] "%(num)d gads" +msgstr[2] "%(num)d gadi" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mēneši" -msgstr[1] "%d mēnesis" -msgstr[2] "%d mēneši" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mēneši" +msgstr[1] "%(num)d mēnesis" +msgstr[2] "%(num)d mēneši" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d nedēļas" -msgstr[1] "%d nedēļa" -msgstr[2] "%d nedēļas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d nedēļas" +msgstr[1] "%(num)d nedēļa" +msgstr[2] "%(num)d nedēļas" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dienas" -msgstr[1] "%d diena" -msgstr[2] "%d dienas" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dienas" +msgstr[1] "%(num)d diena" +msgstr[2] "%(num)d dienas" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d stundas" -msgstr[1] "%d stunda" -msgstr[2] "%d stundas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d stundas" +msgstr[1] "%(num)d stunda" +msgstr[2] "%(num)d stubdas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minūtes" -msgstr[1] "%d minūte" -msgstr[2] "%d minūtes" - -msgid "0 minutes" -msgstr "0 minūšu" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minūtes" +msgstr[1] "%(num)d minūte" +msgstr[2] "%(num)d minūtes" msgid "Forbidden" msgstr "Aizliegts" @@ -1151,14 +1216,14 @@ msgstr "CSRF pārbaude neizdevās. Pieprasījums pārtrauks." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Jūs redzat šo ziņojumu, jo šai HTTPS vietnei nepieciešams “Referer header”, " -"kuru bija paredzēts, ka nosūtīs jūsu tīmekļa pārlūkprogramma, bet tas netika " -"nosūtīts. Šis headeris ir vajadzīgs drošības apsvērumu dēļ, lai " -"pārliecinātos, ka trešās puses nepārņems kontroli pār jūsu pārlūkprogrammu." +"Jūs redzat šo paziņojumu, jo jūsu pārlūkprogrammai ir jānosūta “Referer " +"header” šai HTTPS vietnei, taču tā netika nosūtīta. Šī galvene ir " +"nepieciešama drošības apsvērumu dēļ, lai pārliecinātos, ka jūsu " +"pārlūkprogrammas komunikācijas datus nepārtver trešās puses." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1173,8 +1238,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Ja jūs izmantojat tagu vai " "iekļaujat “Referrer-Policy: no-referrer” headeri, lūdzu noņemiet tos. CSRF " @@ -1260,8 +1325,8 @@ msgstr "\"%(path)s\" neeksistē" msgid "Index of %(directory)s" msgstr "%(directory)s saturs" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Web izstrādes ietvars perfekcionistiem ar izpildes termiņiem." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalācija veiksmīga! Apsveicam!" #, python-format msgid "" @@ -1271,20 +1336,17 @@ msgstr "" "Apskatīt laidiena piezīmes Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalācija veiksmīga! Apsveicam!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Jūs redziet šo lapu, jo DEBUG=True ir iestatījumu failā un Jūs neesiet konfigurējis nevienu " -"saiti." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True ir iestatījumu failā un Jūs neesiet " +"konfigurējis nevienu saiti." msgid "Django Documentation" msgstr "Django Dokumentācija" @@ -1302,4 +1364,4 @@ msgid "Django Community" msgstr "Django Komūna" msgid "Connect, get help, or contribute" -msgstr "Pievienojaties, saņemiet palīdzību vai dodiet ieguldījumu" +msgstr "Sazinieties, saņemiet palīdzību vai sniedziet ieguldījumu" diff --git a/django/conf/locale/lv/formats.py b/django/conf/locale/lv/formats.py index bc5f3b2eb846..bb3444433857 100644 --- a/django/conf/locale/lv/formats.py +++ b/django/conf/locale/lv/formats.py @@ -2,43 +2,45 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'Y. \g\a\d\a j. F' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'Y. \g\a\d\a j. F, H:i' -YEAR_MONTH_FORMAT = r'Y. \g. F' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = r'j.m.Y' -SHORT_DATETIME_FORMAT = 'j.m.Y H:i' +DATE_FORMAT = r"Y. \g\a\d\a j. F" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"Y. \g\a\d\a j. F, H:i" +YEAR_MONTH_FORMAT = r"Y. \g. F" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = r"j.m.Y" +SHORT_DATETIME_FORMAT = "j.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' + "%Y-%m-%d", # '2006-10-25' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '14:30:59' - '%H:%M:%S.%f', # '14:30:59.000200' - '%H:%M', # '14:30' - '%H.%M.%S', # '14.30.59' - '%H.%M.%S.%f', # '14.30.59.000200' - '%H.%M', # '14.30' + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' + "%H.%M.%S", # '14.30.59' + "%H.%M.%S.%f", # '14.30.59.000200' + "%H.%M", # '14.30' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' - '%d.%m.%y %H.%M.%S', # '25.10.06 14.30.59' - '%d.%m.%y %H.%M.%S.%f', # '25.10.06 14.30.59.000200' - '%d.%m.%y %H.%M', # '25.10.06 14.30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d.%m.%y %H.%M.%S", # '25.10.06 14.30.59' + "%d.%m.%y %H.%M.%S.%f", # '25.10.06 14.30.59.000200' + "%d.%m.%y %H.%M", # '25.10.06 14.30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = ' ' # Non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = " " # Non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/mk/LC_MESSAGES/django.mo b/django/conf/locale/mk/LC_MESSAGES/django.mo index 9f91bb0f9df6..798ca7e2878c 100644 Binary files a/django/conf/locale/mk/LC_MESSAGES/django.mo and b/django/conf/locale/mk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/mk/LC_MESSAGES/django.po b/django/conf/locale/mk/LC_MESSAGES/django.po index 69eec2e2f26e..ecd62ceb3a09 100644 --- a/django/conf/locale/mk/LC_MESSAGES/django.po +++ b/django/conf/locale/mk/LC_MESSAGES/django.po @@ -1,6 +1,8 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Bojan Drangovski , 2021 +# Claude Paroz , 2020 # dekomote , 2015 # Jannis Leidel , 2011 # Vasil Vangelovski , 2016-2017 @@ -10,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-05-12 22:47+0000\n" +"Last-Translator: Bojan Drangovski \n" "Language-Team: Macedonian (http://www.transifex.com/django/django/language/" "mk/)\n" "MIME-Version: 1.0\n" @@ -27,6 +29,9 @@ msgstr "Африканс" msgid "Arabic" msgstr "Арапски" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Астуриски" @@ -142,7 +147,7 @@ msgid "Hungarian" msgstr "Унгарски" msgid "Armenian" -msgstr "" +msgstr "Ерменски" msgid "Interlingua" msgstr "Интерлингва" @@ -150,6 +155,9 @@ msgstr "Интерлингва" msgid "Indonesian" msgstr "Индонезиски" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Идо" @@ -180,6 +188,9 @@ msgstr "Канада" msgid "Korean" msgstr "Корејски" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Луксембуршки" @@ -264,9 +275,15 @@ msgstr "Тамил" msgid "Telugu" msgstr "Телугу" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Тајландски" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Турски" @@ -306,6 +323,11 @@ msgstr "Статички датотеки" msgid "Syndication" msgstr "Синдикација" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "Тој број на страна не е цел број" @@ -425,7 +447,7 @@ msgid "" msgstr "" msgid "Null characters are not allowed." -msgstr "" +msgstr "Null карактери не се дозволени." msgid "and" msgstr "и" @@ -463,7 +485,7 @@ msgstr "Поле од тип: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Вредноста '%(value)s' мора да биде точно или неточно." #, python-format msgid "“%(value)s” value must be either True, False, or None." @@ -548,6 +570,9 @@ msgstr "Цел број" msgid "Big (8 byte) integer" msgstr "Голем (8 бајти) цел број" +msgid "Small integer" +msgstr "Мал цел број" + msgid "IPv4 address" msgstr "IPv4 адреса" @@ -561,6 +586,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Логичка вредност (точно,неточно или ништо)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Позитивен цел број" @@ -571,9 +599,6 @@ msgstr "Позитивен мал цел број" msgid "Slug (up to %(max_length)s)" msgstr "Скратено име (до %(max_length)s знаци)" -msgid "Small integer" -msgstr "Мал цел број" - msgid "Text" msgstr "Текст" @@ -611,6 +636,12 @@ msgstr "Датотека" msgid "Image" msgstr "Слика" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s инстанца со %(field)s %(value)r не постои." @@ -705,6 +736,9 @@ msgstr "Внесете целосна вредност." msgid "Enter a valid UUID." msgstr "Внесете валиден UUID (единствен идентификатор)." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -713,20 +747,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Скриено поле %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Недостасуваат податоци од ManagementForm или некој ги менувал" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Ве молиме поднесете %d или помалку форми." -msgstr[1] "Ве молиме поднесете %d или помалку форми." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Ве молиме поднесете %d или повеќе форми." -msgstr[1] "Ве молиме поднесете %d или повеќе форми." +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" msgid "Order" msgstr "Редослед" @@ -789,17 +826,9 @@ msgstr "Да" msgid "No" msgstr "Не" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "да, не, можеби" +msgstr "да,не,можеби" #, python-format msgid "%(size)d byte" @@ -1106,9 +1135,6 @@ msgid_plural "%d minutes" msgstr[0] "%d минута" msgstr[1] "%d минути" -msgid "0 minutes" -msgstr "0 минути" - msgid "Forbidden" msgstr "Забрането" @@ -1211,7 +1237,7 @@ msgstr "" msgid "Index of %(directory)s" msgstr "Индекс на %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." +msgid "The install worked successfully! Congratulations!" msgstr "" #, python-format @@ -1220,9 +1246,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "" - #, python-format msgid "" "You are seeing this page because , 2019 +# Claude Paroz , 2020 +# Hrishikesh , 2019-2020 # Jannis Leidel , 2011 # Jaseem KM , 2019 # Jeffy , 2012 # Jibin Mathew , 2019 +# Mariusz Felisiak , 2021 # Rag sagar , 2016 # Rajeesh Nair , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-24 16:29+0000\n" +"Last-Translator: Mariusz Felisiak \n" "Language-Team: Malayalam (http://www.transifex.com/django/django/language/" "ml/)\n" "MIME-Version: 1.0\n" @@ -28,7 +30,10 @@ msgid "Afrikaans" msgstr "ആഫ്രിക്കാന്‍സ്" msgid "Arabic" -msgstr "അറബിക്" +msgstr "അറബിൿ" + +msgid "Algerian Arabic" +msgstr "അൾഗേരിയൻ അറബിൿ" msgid "Asturian" msgstr "ആസ്ടൂറിയൻ" @@ -153,6 +158,9 @@ msgstr "ഇന്റര്‍ലിംഗ്വാ" msgid "Indonesian" msgstr "ഇന്തൊനേഷ്യന്‍" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "ഈടോ" @@ -183,6 +191,9 @@ msgstr "കന്നഡ" msgid "Korean" msgstr "കൊറിയന്‍" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "ലക്സംബര്‍ഗിഷ് " @@ -204,6 +215,9 @@ msgstr "മംഗോളിയന്‍" msgid "Marathi" msgstr "മറാത്തി" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "ബര്‍മീസ്" @@ -267,9 +281,15 @@ msgstr "തമിഴ്" msgid "Telugu" msgstr "തെലുങ്ക്" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "തായ്" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "ടര്‍ക്കിഷ്" @@ -286,7 +306,7 @@ msgid "Urdu" msgstr "ഉര്‍ദു" msgid "Uzbek" -msgstr "" +msgstr "ഉസ്ബെൿ" msgid "Vietnamese" msgstr "വിയറ്റ്നാമീസ്" @@ -309,6 +329,11 @@ msgstr " സ്റ്റാറ്റിൿ ഫയലുകൾ" msgid "Syndication" msgstr "വിതരണം " +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "ആ പേജ് നമ്പർ ഒരു ഇന്റിജറല്ല" @@ -334,11 +359,14 @@ msgstr "ശരിയായ ഇമെയില്‍ വിലാസം നല് msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"അക്ഷരങ്ങള്‍, അക്കങ്ങള്‍, അണ്ടര്‍സ്കോര്‍, ഹൈഫന്‍ എന്നിവ മാത്രം അടങ്ങിയ ശരിയായ ഒരു 'സ്ലഗ്ഗ്' നൽകുക. " msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"യൂണികോഡ് അക്ഷരങ്ങൾ, അക്കങ്ങൾ, ഹൈഫണുകൾ, അണ്ടർസ്കോറുക‌‌ൾ എന്നിവമാത്രം അടങ്ങിയ ശെരിയായ ‌ഒരു " +"“സ്ലഗ്” എഴുതുക ." msgid "Enter a valid IPv4 address." msgstr "ശരിയായ IPv4 വിലാസം നൽകുക." @@ -420,6 +448,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"“%(extension)s” എന്ന ഫയൽ എക്സ്റ്റൻഷൻ അനുവദനീയമല്ല. അനുവദനീയമായ എക്സ്റ്റൻഷനുകൾ ഇവയാണ്: " +"%(allowed_extensions)s" msgid "Null characters are not allowed." msgstr "Null ക്യാരക്ടറുകൾ അനുവദനീയമല്ല." @@ -459,11 +489,13 @@ msgstr "%(field_type)s എന്ന തരത്തിലുള്ള കളം #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” മൂല്യം ഒന്നുകിൽ True, False എന്നിവയിലേതെങ്കിലുമേ ആവാൻ പാടുള്ളൂ." #, python-format msgid "“%(value)s” value must be either True, False, or None." msgstr "" +"“%(value)s” മൂല്യം ഒന്നുകിൽ True, False അല്ലെങ്കിൽ None എന്നിവയിലേതെങ്കിലുമേ ആവാൻ " +"പാടുള്ളൂ." msgid "Boolean (Either True or False)" msgstr "ശരിയോ തെറ്റോ (True അഥവാ False)" @@ -544,6 +576,9 @@ msgstr "പൂര്‍ണ്ണസംഖ്യ" msgid "Big (8 byte) integer" msgstr "8 ബൈറ്റ് പൂര്‍ണസംഖ്യ." +msgid "Small integer" +msgstr "ഹ്രസ്വ പൂര്‍ണസംഖ്യ" + msgid "IPv4 address" msgstr "IPv4 വിലാസം" @@ -557,6 +592,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "ശരിയോ തെറ്റോ എന്നു മാത്രം (True, False, None എന്നിവയില്‍ ഏതെങ്കിലും ഒന്ന്)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "ധന പൂര്‍ണസംഖ്യ" @@ -567,9 +605,6 @@ msgstr "ധന ഹ്രസ്വ പൂര്‍ണസംഖ്യ" msgid "Slug (up to %(max_length)s)" msgstr "സ്ലഗ് (%(max_length)s വരെ)" -msgid "Small integer" -msgstr "ഹ്രസ്വ പൂര്‍ണസംഖ്യ" - msgid "Text" msgstr "ടെക്സ്റ്റ്" @@ -607,6 +642,12 @@ msgstr "ഫയല്‍" msgid "Image" msgstr "ചിത്രം" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s%(value)r ഉള്ള%(model)s ഇൻസ്റ്റൻസ് നിലവിൽ ഇല്ല." @@ -699,6 +740,9 @@ msgstr "പൂർണ്ണമായ വാല്യൂ നല്കുക." msgid "Enter a valid UUID." msgstr "സാധുവായ യു യു ഐ ഡി നല്കുക." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -707,20 +751,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(ഹിഡൻ ഫീൽഡ് %(name)s)%(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm ടാറ്റ കാണ്മാനില്ല അല്ലെങ്കിൽ തിരിമറി നടത്തപ്പെട്ടു ." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "ദയവായി%d അല്ലെങ്കിൽ കുറവ് ഫോമുകൾ സമർപ്പിക്കുക." -msgstr[1] "ദയവായി%d അല്ലെങ്കിൽ കുറവ് ഫോമുകൾ സമർപ്പിക്കുക." +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "ദയവായി %d അല്ലെങ്കിൽ കൂടുതൽ ഫോമുകൾ സമർപ്പിക്കുക. " -msgstr[1] "ദയവായി%d അല്ലെങ്കിൽ കൂടുതൽ ഫോമുകൾ സമർപ്പിക്കുക. " +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "" +msgstr[1] "" msgid "Order" msgstr "ക്രമം" @@ -781,17 +828,9 @@ msgstr "അതെ" msgid "No" msgstr "അല്ല" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "ഉണ്ട്, ഇല്ല, ഉണ്ടായേക്കാം" +msgstr "ഉണ്ട്,ഇല്ല,ഉണ്ടായേക്കാം" #, python-format msgid "%(size)d byte" @@ -1053,7 +1092,7 @@ msgstr "ഇതു സാധുവായ IPv6 വിലാസമല്ല." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "അഥവാ" @@ -1063,43 +1102,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d വർഷം" -msgstr[1] "%d വർഷങ്ങൾ " +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d മാസം" -msgstr[1] "%d മാസങ്ങൾ" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d ആഴ്ച" -msgstr[1] "%d ആഴ്ചകൾ" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ദിവസം" -msgstr[1] "%d ദിവസങ്ങൾ" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d മണിക്കൂർ" -msgstr[1] "%d മണിക്കൂറുകൾ" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d മിനിറ്റ്" -msgstr[1] "%d മിനിറ്റുകൾ" - -msgid "0 minutes" -msgstr "0 മിനിറ്റ്" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" msgid "Forbidden" msgstr "വിലക്കപ്പെട്ടത്" @@ -1109,7 +1145,7 @@ msgstr "സി എസ് ആർ എഫ് പരിശോധന പരാജയ msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1202,8 +1238,8 @@ msgstr "" msgid "Index of %(directory)s" msgstr "%(directory)s യുടെ സൂചിക" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "ജാംഗോ: സമയപരിമിതികളുള്ള പൂർണ്ണതാമോഹികൾക്കായുള്ള വെബ് ഫ്രെയിംവർക്ക്. " +msgid "The install worked successfully! Congratulations!" +msgstr "ഇൻസ്ടാൾ ഭംഗിയായി നടന്നു! അഭിനന്ദനങ്ങൾ !" #, python-format msgid "" @@ -1211,9 +1247,6 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" -msgid "The install worked successfully! Congratulations!" -msgstr "ഇൻസ്ടാൾ ഭംഗിയായി നടന്നു! അഭിനന്ദനങ്ങൾ !" - #, python-format msgid "" "You are seeing this page because , 2011 # jargalan , 2011 # Tsolmon , 2011 +# Turmunkh Batkhuyag, 2023 # Zorig, 2013-2014,2016,2018 # Zorig, 2019 # Анхбаяр Анхаа , 2013-2016,2018-2019 @@ -16,10 +17,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 07:28+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 06:49+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,6 +34,9 @@ msgstr "Африк" msgid "Arabic" msgstr "Араб" +msgid "Algerian Arabic" +msgstr "Алжир Араб" + msgid "Asturian" msgstr "Астури" @@ -57,6 +61,9 @@ msgstr "Босни" msgid "Catalan" msgstr "Каталан" +msgid "Central Kurdish (Sorani)" +msgstr "Төв Курд (Сорани)" + msgid "Czech" msgstr "Чех" @@ -156,6 +163,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Индонези" +msgid "Igbo" +msgstr "Игбо" + msgid "Ido" msgstr "Идо" @@ -186,6 +196,9 @@ msgstr "Канад" msgid "Korean" msgstr "Солонгос" +msgid "Kyrgyz" +msgstr "Киргиз" + msgid "Luxembourgish" msgstr "Лүксенбүргиш" @@ -207,6 +220,9 @@ msgstr "Монгол" msgid "Marathi" msgstr "маратхи" +msgid "Malay" +msgstr "Малай" + msgid "Burmese" msgstr "Бирм" @@ -270,9 +286,15 @@ msgstr "Тамил" msgid "Telugu" msgstr "Тэлүгү" +msgid "Tajik" +msgstr "Тажик" + msgid "Thai" msgstr "Тайланд" +msgid "Turkmen" +msgstr "Турк хүн" + msgid "Turkish" msgstr "Турк" @@ -282,6 +304,9 @@ msgstr "Татар" msgid "Udmurt" msgstr "Удмурт" +msgid "Uyghur" +msgstr "Уйгур" + msgid "Ukrainian" msgstr "Украйн" @@ -312,6 +337,11 @@ msgstr "Статик файлууд" msgid "Syndication" msgstr "Нэгтгэл" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Хуудасны дугаар бүхэл тоо / Integer / биш байна" @@ -337,11 +367,15 @@ msgstr "Зөв имэйл хаяг оруулна уу" msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Үсэг, тоо, доогуур зураас эсвэл зурааснаас бүрдсэн хүчинтэй \"slug\" оруулна " +"уу." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Юникод үсэг, тоо, доогуур зураас, зурааснаас бүрдсэн хүчинтэй \"slug\" " +"оруулна уу." msgid "Enter a valid IPv4 address." msgstr "Зөв IPv4 хаяг оруулна уу. " @@ -369,6 +403,20 @@ msgstr "Энэ утга %(limit_value)s -с бага эсвэл тэнцүү б msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Энэ утга %(limit_value)s -с их эсвэл тэнцүү байх нөхцлийг хангана уу." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Утга нь алхамын хэмжээнд %(limit_value)s-ээс олон байхыг " +"баталгаажуулна уу." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Энэ утга нь алхмын хэмжээнд %(limit_value)s, %(offset)s-с эхлэн %(offset)s, " +"%(valid_value1)s, %(valid_value2)s гэх мэт утга байхыг баталгаажуулна уу." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -425,6 +473,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Файлын өргөтгөл “%(extension)s” зөвшөөрөгдөөгүй байна. Боломжит өргөтгөлүүд: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Хоосон тэмдэгт зөвшөөрөгдөхгүй." @@ -436,6 +486,10 @@ msgstr "ба" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s талбар бүхий %(model_name)s аль хэдийн орсон байна." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "“%(name)s” хязгаарлалтыг зөрчсөн." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r буруу сонголт байна." @@ -450,8 +504,8 @@ msgstr "Энэ хэсэг хоосон байж болохгүй." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(field_label)s-тэй %(model_name)s-ийг аль хэдийнэ оруулсан байна." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -465,11 +519,11 @@ msgstr "Талбарийн төрөл нь : %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "\"“%(value)s” утга True эсвэл False байх ёстой.\"" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” утга True, False, эсвэл None байх ёстой." msgid "Boolean (Either True or False)" msgstr "Boolean (Үнэн худлын аль нэг нь)" @@ -478,6 +532,9 @@ msgstr "Boolean (Үнэн худлын аль нэг нь)" msgid "String (up to %(max_length)s)" msgstr "Бичвэр (%(max_length)s хүртэл)" +msgid "String (unlimited)" +msgstr "Тэмдэг мөр (хязгааргүй)" + msgid "Comma-separated integers" msgstr "Таслалаар тусгаарлагдсан бүхэл тоо" @@ -486,12 +543,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” утга нь буруу огнооны форматтай байна. Энэ нь YYYY-MM-DD " +"форматтай байх ёстой." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” утга зөв (YYYY-MM-DD) форматтай байна, гэхдээ буруу огноо байна." msgid "Date (without time)" msgstr "Огноо (цаггүй)" @@ -501,19 +561,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ] форматтай байх ёстой." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s” утгын формат зөв байна (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"гэхдээ буруу огноо/цаг байна." msgid "Date (with time)" msgstr "Огноо (цагтай)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” утга нь бодит тоо байх ёстой." msgid "Decimal number" msgstr "Аравтын бутархайт тоо" @@ -523,6 +587,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь [DD] [[HH:]MM:]ss[.uuuuuu] " +"форматтай байх ёстой." msgid "Duration" msgstr "Үргэлжлэх хугацаа" @@ -542,7 +608,7 @@ msgstr "Хөвөгч таслалтай тоо" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” утга нь бүхэл тоо байх ёстой." msgid "Integer" msgstr "Бүхэл тоо" @@ -550,6 +616,9 @@ msgstr "Бүхэл тоо" msgid "Big (8 byte) integer" msgstr "Том (8 байт) бүхэл тоо" +msgid "Small integer" +msgstr "Бага тоон утна" + msgid "IPv4 address" msgstr "IPv4 хаяг" @@ -558,11 +627,14 @@ msgstr "IP хаяг" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "\"“%(value)s” утга нь None, True эсвэл False байх ёстой.\"" msgid "Boolean (Either True, False or None)" msgstr "Boolean (Үнэн, худал, эсвэл юу ч биш)" +msgid "Positive big integer" +msgstr "Эерэг том бүхэл тоо" + msgid "Positive integer" msgstr "Бүхэл тоох утга" @@ -573,9 +645,6 @@ msgstr "Бага бүхэл тоон утга" msgid "Slug (up to %(max_length)s)" msgstr "Слаг (ихдээ %(max_length)s )" -msgid "Small integer" -msgstr "Бага тоон утна" - msgid "Text" msgstr "Текст" @@ -584,12 +653,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь HH:MM[:ss[.uuuuuu]] форматтай " +"байх ёстой." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"“%(value)s” утга зөв форматтай байна (HH:MM[:ss[.uuuuuu]]) гэхдээ буруу цаг " +"байна." msgid "Time" msgstr "Цаг" @@ -602,7 +675,7 @@ msgstr "Бинари өгөгдөл" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” нь хүчинтэй UUID биш." msgid "Universally unique identifier" msgstr "UUID" @@ -613,6 +686,12 @@ msgstr "Файл" msgid "Image" msgstr "Зураг" +msgid "A JSON object" +msgstr "JSON объект " + +msgid "Value must be valid JSON." +msgstr "JSON утга байх боломжтой." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s %(value)r утгатай %(model)s байхгүй байна." @@ -705,6 +784,9 @@ msgstr "Бүрэн утга оруулна уу." msgid "Enter a valid UUID." msgstr "Зөв UUID оруулна уу." +msgid "Enter a valid JSON." +msgstr "JSON-ийн бүтцээр оруулна уу." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -713,20 +795,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Нууц талбар%(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "УдирдахФормын мэдээлэл олдсонгүй эсвэл өөрчлөгдсөн байна" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-ын өгөгдөл дутуу эсвэл өөрчилсөн байна. Дутуу талбарууд: " +"%(field_names)s. Хэрэв асуудал хэвээр байвал та алдааны тайлан гаргах " +"шаардлагатай байж магадгүй." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "%d ихгүй форм илгээн үү" -msgstr[1] "%d ихгүй форм илгээн үү" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." +msgstr[1] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "%d эсвэл их форм илгээнэ үү" -msgstr[1] "%d эсвэл их форм илгээнэ үү" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Та хамгийн багадаа %(num)d форм илгээнэ үү." +msgstr[1] "Та хамгийн багадаа %(num)d форм илгээнэ үү." msgid "Order" msgstr "Эрэмбэлэх" @@ -763,13 +851,15 @@ msgstr "Зөв сонголт хийнэ үү. Энэ утга сонголто #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” нь шаардлага хангаагүй утга байна." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s нь %(current_timezone)s цагийн бүсэд хөрвүүлэх боломжгүй байна; " +"энэ нь хоёрдмол утгатай эсвэл байхгүй байж болно." msgid "Clear" msgstr "Цэвэрлэх" @@ -789,15 +879,7 @@ msgstr "Тийм" msgid "No" msgstr "Үгүй" -msgid "Year" -msgstr "Жил" - -msgid "Month" -msgstr "Сар" - -msgid "Day" -msgstr "Өдөр" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "тийм,үгүй,магадгүй" @@ -1071,43 +1153,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d жил" -msgstr[1] "%d жил" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d жил" +msgstr[1] "%(num)d жил" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d сар" -msgstr[1] "%d сар" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d сар" +msgstr[1] "%(num)d сар" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d долоо хоног" -msgstr[1] "%d долоо хоног" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d долоо хоног" +msgstr[1] "%(num)d долоо хоног" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d өдөр" -msgstr[1] "%d өдөр" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d өдөр" +msgstr[1] "%(num)d өдөр" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d цаг" -msgstr[1] "%d цаг" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d цаг" +msgstr[1] "%(num)d цаг" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минут" - -msgid "0 minutes" -msgstr "0 минут" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минут" +msgstr[1] "%(num)d минут" msgid "Forbidden" msgstr "Хориотой" @@ -1117,24 +1196,34 @@ msgstr "CSRF дээр уналаа. Хүсэлт таслагдсан." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Та энэ мэдэгдлийг харж байгаа нь таны веб хөтөчөөс 'Referer header'-ийг " +"HTTPS хуудасд илгээх шаардлагатай байгаатай холбоотой. Энэ нь гуравдагч " +"этгээдээс хамгаалахын тулд шаардлагатай." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Хэрвээ та веб хөтөчөө 'Referer' толгойг идэвхигүй болгосон бол энэ хуудас, " +"HTTPS холболт эсвэл 'same-origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Хэрвээ та таг ашиглаж " +"байгаа бол эсвэл 'Referrer-Policy: no-referrer' толгойг нэмсэн бол, " +"эдгээрийг устгана уу. CSRF хамгаалалт 'Referer' толгойг чанд шалгалт хийхийг " +"шаарддаг. Хэрвээ та аюулгүй байдлыг чухалчилж байгаа бол гуравдагч сайтыг " +"холбохдоо ашиглана уу." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1149,6 +1238,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Хэрвээ та веб хөтөчийн \"cookies\"-г хаасан бол энэ хуудас эсвэл 'same-" +"origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." msgid "More information is available with DEBUG=True." msgstr "DEBUG=True үед дэлгэрэнгүй мэдээлэл харах боломжтой." @@ -1183,13 +1274,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Буруу огноо. '%(datestr)s' огноо '%(format)s' хэлбэрт тохирохгүй байна." #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Шүүлтүүрт таарах %(verbose_name)s олдсонгүй " msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Хуудас \"сүүлчийн\" биш бөгөөд үүнийг int болгон хувиргах боломжгүй." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1197,7 +1289,7 @@ msgstr "Буруу хуудас (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Хоосон жагсаалт ба “%(class_name)s.allow_empty” нь False байна." msgid "Directory indexes are not allowed here." msgstr "Файлын жагсаалтыг энд зөвшөөрөөгүй." @@ -1210,8 +1302,8 @@ msgstr "“%(path)s” хуудас байхгүй байна." msgid "Index of %(directory)s" msgstr "%(directory)s ийн жагсаалт" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Джанго: Чанартай бөгөөд хугацаанд нь хийхэд зориулсан Web framework." +msgid "The install worked successfully! Congratulations!" +msgstr "Амжилттай суулгалаа! Баяр хүргэе!" #, python-format msgid "" @@ -1222,26 +1314,23 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">тэмдэглэл харах " -msgid "The install worked successfully! Congratulations!" -msgstr "Амжилттай суулгалаа! Баяр хүргэе!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Таний тохиргооны файл дээр DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо хийгээгүй учраас " -"энэ хуудасыг харж байна." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо " +"хийгээгүй учраас энэ хуудасыг харж байна." msgid "Django Documentation" msgstr "Джанго баримтжуулалт" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Сэдэв, лавлахууд болон зааврууд" msgid "Tutorial: A Polling App" msgstr "Хичээл: Санал асуулга App" diff --git a/django/conf/locale/mn/formats.py b/django/conf/locale/mn/formats.py index 24c7dec8a768..589c24cf66f3 100644 --- a/django/conf/locale/mn/formats.py +++ b/django/conf/locale/mn/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd F Y' -TIME_FORMAT = 'g:i A' +DATE_FORMAT = "d F Y" +TIME_FORMAT = "g:i A" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = # MONTH_DAY_FORMAT = -SHORT_DATE_FORMAT = 'j M Y' +SHORT_DATE_FORMAT = "j M Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = diff --git a/django/conf/locale/mr/LC_MESSAGES/django.mo b/django/conf/locale/mr/LC_MESSAGES/django.mo index 46c9f342103c..8cf9a708eacb 100644 Binary files a/django/conf/locale/mr/LC_MESSAGES/django.mo and b/django/conf/locale/mr/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/mr/LC_MESSAGES/django.po b/django/conf/locale/mr/LC_MESSAGES/django.po index ab6908514f9d..fe4c6ebb2b86 100644 --- a/django/conf/locale/mr/LC_MESSAGES/django.po +++ b/django/conf/locale/mr/LC_MESSAGES/django.po @@ -1,15 +1,16 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 # Suraj Kawade, 2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Marathi (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-20 06:49+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,8 +24,11 @@ msgstr "अफ्रिकान्स" msgid "Arabic" msgstr "अरेबिक" +msgid "Algerian Arabic" +msgstr "अल्जेरियन अरेबिक" + msgid "Asturian" -msgstr "" +msgstr "अस्टूरियन" msgid "Azerbaijani" msgstr "अझरबैजानी" @@ -33,7 +37,7 @@ msgid "Bulgarian" msgstr "बल्गेरियन" msgid "Belarusian" -msgstr "बेलारूसी" +msgstr "बेलारशियन" msgid "Bengali" msgstr "बंगाली" @@ -47,6 +51,9 @@ msgstr "बोस्नियन" msgid "Catalan" msgstr "कॅटलान" +msgid "Central Kurdish (Sorani)" +msgstr "मध्य कुर्दिश (सोरानी)" + msgid "Czech" msgstr "झेक" @@ -60,7 +67,7 @@ msgid "German" msgstr "जर्मन" msgid "Lower Sorbian" -msgstr "" +msgstr "लोअर सोर्बियन" msgid "Greek" msgstr "ग्रीक" @@ -69,7 +76,7 @@ msgid "English" msgstr "इंग्रजी" msgid "Australian English" -msgstr "" +msgstr "ऑस्ट्रेलियन इंग्रजी" msgid "British English" msgstr "ब्रिटिश इंग्रजी" @@ -84,277 +91,310 @@ msgid "Argentinian Spanish" msgstr "अर्जेन्टिनाची स्पॅनिश" msgid "Colombian Spanish" -msgstr "" +msgstr "कोलंबियन स्पॅनिश" msgid "Mexican Spanish" msgstr "मेक्सिकन स्पॅनिश" msgid "Nicaraguan Spanish" -msgstr "" +msgstr "निकारागुआन स्पॅनिश" msgid "Venezuelan Spanish" -msgstr "" +msgstr "व्हेनेझुएलन स्पॅनिश" msgid "Estonian" -msgstr "" +msgstr "एस्टोनियन" msgid "Basque" -msgstr "" +msgstr "बास्क" msgid "Persian" -msgstr "" +msgstr "पर्शियन" msgid "Finnish" -msgstr "" +msgstr "फिनिश" msgid "French" -msgstr "" +msgstr "फ्रेंच" msgid "Frisian" -msgstr "" +msgstr "फ्रिसियन" msgid "Irish" -msgstr "" +msgstr "आयरिश" msgid "Scottish Gaelic" -msgstr "" +msgstr "स्कॉटिश गेलिक" msgid "Galician" -msgstr "" +msgstr "गॅलिशियन" msgid "Hebrew" -msgstr "" +msgstr "हिब्रू" msgid "Hindi" -msgstr "" +msgstr "हिंदी" msgid "Croatian" -msgstr "" +msgstr "क्रोएशियन" msgid "Upper Sorbian" -msgstr "" +msgstr "अप्पर सोर्बियन" msgid "Hungarian" -msgstr "" +msgstr "हंगेरियन" msgid "Armenian" -msgstr "" +msgstr "अर्मेनियन" msgid "Interlingua" -msgstr "" +msgstr "इंटरलिंगुआ" msgid "Indonesian" -msgstr "" +msgstr "इंडोनेशियन" + +msgid "Igbo" +msgstr "इग्बो" msgid "Ido" -msgstr "" +msgstr "इदो" msgid "Icelandic" -msgstr "" +msgstr "आयलँडिक" msgid "Italian" -msgstr "" +msgstr "इटालियन" msgid "Japanese" -msgstr "" +msgstr "जपानी" msgid "Georgian" -msgstr "" +msgstr "जॉर्जियन" msgid "Kabyle" -msgstr "" +msgstr "कबायल" msgid "Kazakh" -msgstr "" +msgstr "कझाक" msgid "Khmer" -msgstr "" +msgstr "ख्मेर" msgid "Kannada" -msgstr "" +msgstr "कन्नड" msgid "Korean" -msgstr "" +msgstr "कोरियन" + +msgid "Kyrgyz" +msgstr "किर्गिझ" msgid "Luxembourgish" -msgstr "" +msgstr "लक्झेंबर्गिश" msgid "Lithuanian" -msgstr "" +msgstr "लिथुआनियन" msgid "Latvian" -msgstr "" +msgstr "लाटव्हिअन" msgid "Macedonian" -msgstr "" +msgstr "मॅसेडोनिअन" msgid "Malayalam" -msgstr "" +msgstr "मल्याळम" msgid "Mongolian" -msgstr "" +msgstr "मंगोलियन" msgid "Marathi" -msgstr "" +msgstr "मराठी" + +msgid "Malay" +msgstr "मलय" msgid "Burmese" -msgstr "" +msgstr "बर्मीस" msgid "Norwegian Bokmål" -msgstr "" +msgstr "नॉर्वेजियन बोकमाल" msgid "Nepali" -msgstr "" +msgstr "नेपाळी" msgid "Dutch" -msgstr "" +msgstr "डच" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "नॉर्वेजिअन निनॉर्स्क " msgid "Ossetic" -msgstr "" +msgstr "ओस्सेटिक" msgid "Punjabi" -msgstr "" +msgstr "पंजाबी" msgid "Polish" -msgstr "" +msgstr "पॉलिश" msgid "Portuguese" -msgstr "" +msgstr "पोर्तुगीज" msgid "Brazilian Portuguese" -msgstr "" +msgstr "ब्रझिलियन पोर्तुगीज" msgid "Romanian" -msgstr "" +msgstr "रोमेनियन" msgid "Russian" -msgstr "" +msgstr "रशियन" msgid "Slovak" -msgstr "" +msgstr "स्लोवाक" msgid "Slovenian" -msgstr "" +msgstr "स्लोवेनियन" msgid "Albanian" -msgstr "" +msgstr "अल्बेनियन" msgid "Serbian" -msgstr "" +msgstr "सर्बियन" msgid "Serbian Latin" -msgstr "" +msgstr "सर्बियन लॅटिन" msgid "Swedish" -msgstr "" +msgstr "स्वीडिश" msgid "Swahili" -msgstr "" +msgstr "स्वाहिली" msgid "Tamil" -msgstr "" +msgstr "तमिळ" msgid "Telugu" -msgstr "" +msgstr "तेलुगु" + +msgid "Tajik" +msgstr "ताजिक" msgid "Thai" -msgstr "" +msgstr "थाई" + +msgid "Turkmen" +msgstr "तुर्कमेन" msgid "Turkish" -msgstr "" +msgstr "तुर्की" msgid "Tatar" -msgstr "" +msgstr "टाटर" msgid "Udmurt" -msgstr "" +msgstr "उदमर्त" + +msgid "Uyghur" +msgstr "उईघुर" msgid "Ukrainian" -msgstr "" +msgstr "युक्रेनियन" msgid "Urdu" -msgstr "" +msgstr "उर्दू" msgid "Uzbek" -msgstr "" +msgstr "उझबेक" msgid "Vietnamese" -msgstr "" +msgstr "व्हिएतनामी" msgid "Simplified Chinese" -msgstr "" +msgstr "सोपी चायनिज" msgid "Traditional Chinese" -msgstr "" +msgstr "पारंपारिक चायनिज" msgid "Messages" -msgstr "" +msgstr "संदेश" msgid "Site Maps" -msgstr "" +msgstr "संकेतस्थळ नकाशे" msgid "Static Files" -msgstr "" +msgstr "स्थिर फाइल्स" msgid "Syndication" -msgstr "" +msgstr "सिंडिकेशन" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." msgid "That page number is not an integer" -msgstr "" +msgstr "तो पान क्रमांक पूर्णांक नाही." msgid "That page number is less than 1" -msgstr "" +msgstr "तो पान क्रमांक 1 पेक्षा कमी आहे" msgid "That page contains no results" -msgstr "" +msgstr "त्या पानावर कोणतेही परिणाम नाहीत." msgid "Enter a valid value." -msgstr "" +msgstr "वैध मूल्य टाका." msgid "Enter a valid URL." -msgstr "" +msgstr "एक योग्य युआरएल टाका करा." msgid "Enter a valid integer." -msgstr "" +msgstr "योग्य पूर्णांक टाका." msgid "Enter a valid email address." -msgstr "" +msgstr "योग्य विपत्र पत्ता टाका." #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" +msgstr "अक्षरे, संख्या, अंडरस्कोर किंवा हायफनसह असलेला योग्य \"स्लग\" टाका." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." -msgstr "" +msgstr "योग्य \"स्लग\" टाका ज्यामध्ये यूनिकोड अक्षरे, अंक, अंडरस्कोर किंवा हायफन असतात." msgid "Enter a valid IPv4 address." -msgstr "" +msgstr "योग्य IPv4 पत्ता टाका." msgid "Enter a valid IPv6 address." -msgstr "" +msgstr "योग्य IPv6 पत्ता टाका." msgid "Enter a valid IPv4 or IPv6 address." -msgstr "" +msgstr "योग्य IPv4 किंवा IPv6 पत्ता नमूद करा." msgid "Enter only digits separated by commas." -msgstr "" +msgstr "स्वल्पविरामाने वेगळे केलेले अंकच फक्त नमूद करा." #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -msgstr "" +msgstr "हे मूल्य%(limit_value)s(%(show_value)s) आहे याची खात्री करा." #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." -msgstr "" +msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा कमी आहे याची काळजी घ्या." #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "हे मूल्य %(limit_value)sया मर्यादेइतके किंवा त्यापेक्षा जास्त आहे याची काळजी घ्या." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "हे मूल्य पायरी आकार %(limit_value)s चा गुणाकार असल्याची खात्री करा." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." msgstr "" #, python-format @@ -378,7 +418,7 @@ msgstr[0] "" msgstr[1] "" msgid "Enter a number." -msgstr "" +msgstr "अंक टाका." #, python-format msgid "Ensure that there are no more than %(max)s digit in total." @@ -407,31 +447,35 @@ msgid "" msgstr "" msgid "Null characters are not allowed." -msgstr "" +msgstr "शून्य वर्णांना परवानगी नाही." msgid "and" -msgstr "" +msgstr "आणि" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" +msgstr "%(model_name)s सह %(field_labels)s हे अगोदरच अस्तित्वात आहे." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "\"%(name)s\" च्या मर्यादेचं उल्लंघन आहे." #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "" +msgstr "Value %(value)r हा योग्य पर्याय नाही." msgid "This field cannot be null." -msgstr "" +msgstr "हे क्षेत्र रिक्त असू शकत नाही." msgid "This field cannot be blank." -msgstr "" +msgstr "हे क्षेत्र रिक्त असू शकत नाही." #, python-format msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "" +msgstr "%(model_name)s %(field_label)s ने अगोदरच अस्तित्वात आहे." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -439,26 +483,29 @@ msgstr "" #, python-format msgid "Field of type: %(field_type)s" -msgstr "" +msgstr "क्षेत्राचा प्रकार: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” मूल्य सत्य किंवा असत्य असावा." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” मूल्य सत्य, असत्य किंवा कोणतेही नसावेत." msgid "Boolean (Either True or False)" -msgstr "" +msgstr "बूलियन (सत्य किंवा असत्य)" #, python-format msgid "String (up to %(max_length)s)" msgstr "" -msgid "Comma-separated integers" +msgid "String (unlimited)" msgstr "" +msgid "Comma-separated integers" +msgstr "स्वल्पविरामाने वेगळे केलेले पूर्णांक" + #, python-format msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " @@ -472,7 +519,7 @@ msgid "" msgstr "" msgid "Date (without time)" -msgstr "" +msgstr "दिनांक (वेळेशिवाय)" #, python-format msgid "" @@ -487,7 +534,7 @@ msgid "" msgstr "" msgid "Date (with time)" -msgstr "" +msgstr "दिनांक (वेळेसह)" #, python-format msgid "“%(value)s” value must be a decimal number." @@ -503,13 +550,13 @@ msgid "" msgstr "" msgid "Duration" -msgstr "" +msgstr "कालावधी" msgid "Email address" -msgstr "" +msgstr "विपत्र पत्ता" msgid "File path" -msgstr "" +msgstr "दस्तऐवज मार्ग" #, python-format msgid "“%(value)s” value must be a float." @@ -523,39 +570,42 @@ msgid "“%(value)s” value must be an integer." msgstr "" msgid "Integer" -msgstr "" +msgstr "पूर्णांक" msgid "Big (8 byte) integer" msgstr "" +msgid "Small integer" +msgstr "लहान पूर्णांक" + msgid "IPv4 address" -msgstr "" +msgstr "IPv4 पत्ता" msgid "IP address" -msgstr "" +msgstr "IP पत्ता" #, python-format msgid "“%(value)s” value must be either None, True or False." msgstr "" msgid "Boolean (Either True, False or None)" -msgstr "" +msgstr "बुलियन (एकतर खरे, असत्य किंवा काहीही नाही)" + +msgid "Positive big integer" +msgstr "सकारात्मक मोठा पूर्णांक" msgid "Positive integer" -msgstr "" +msgstr "सकारात्मक पूर्णांक" msgid "Positive small integer" -msgstr "" +msgstr "सकारात्मक लहान पूर्णांक" #, python-format msgid "Slug (up to %(max_length)s)" msgstr "" -msgid "Small integer" -msgstr "" - msgid "Text" -msgstr "" +msgstr "मजकूर" #, python-format msgid "" @@ -570,27 +620,33 @@ msgid "" msgstr "" msgid "Time" -msgstr "" +msgstr "वेळ" msgid "URL" msgstr "" msgid "Raw binary data" -msgstr "" +msgstr "कच्चा बायनरी डेटा" #, python-format msgid "“%(value)s” is not a valid UUID." msgstr "" msgid "Universally unique identifier" -msgstr "" +msgstr "सार्वत्रिक अद्वितीय ओळखकर्ता" msgid "File" -msgstr "" +msgstr "फाइल" msgid "Image" +msgstr "चित्र " + +msgid "A JSON object" msgstr "" +msgid "Value must be valid JSON." +msgstr "मूल्य योग्य JSON असणे आवश्यक." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -619,35 +675,35 @@ msgid ":?.!" msgstr ":?.!" msgid "This field is required." -msgstr "" +msgstr "हे क्षेत्र आवश्यक आहे." msgid "Enter a whole number." -msgstr "" +msgstr "पूर्ण संख्या प्रविष्ट करा." msgid "Enter a valid date." -msgstr "" +msgstr "योग्य दिनांक नमूद करा." msgid "Enter a valid time." -msgstr "" +msgstr "योग्य वेळ नमूद करा." msgid "Enter a valid date/time." -msgstr "" +msgstr "योग्य दिनांक/वेळ नमूद करा." msgid "Enter a valid duration." -msgstr "" +msgstr "योग्य कालावधी नमूद करा." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "दिवसांची संख्या {min_days} आणि {max_days} च्या मधे असावी." msgid "No file was submitted. Check the encoding type on the form." -msgstr "" +msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही. अर्जावरील एन्कोडिंग प्रकार तपासा." msgid "No file was submitted." -msgstr "" +msgstr "कोणताही दस्तऐवज सुपूर्त केलेला नाही." msgid "The submitted file is empty." -msgstr "" +msgstr "सुपूर्त केलेला दस्तऐवज रिकामी आहे." #, python-format msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." @@ -657,25 +713,28 @@ msgstr[0] "" msgstr[1] "" msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "" +msgstr "कृपया एकतर फाइल सबमिट करा किंवा स्पष्ट चेकबॉक्स चेक करा, दोन्ही नाही." msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" +msgstr "एक वैध प्रतिमा अपलोड करा. तुम्ही अपलोड केलेली फाइल चित्र किंवा दूषित चित्र नव्हते." #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." msgstr "" msgid "Enter a list of values." -msgstr "" +msgstr "मूल्यांची यादी नमूद करा." msgid "Enter a complete value." -msgstr "" +msgstr "पूर्ण मूल्य नमूद करा." msgid "Enter a valid UUID." -msgstr "" +msgstr "योग्य UUID नमूद करा." + +msgid "Enter a valid JSON." +msgstr "योग्य JSON नमूद करा." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -685,30 +744,33 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." msgstr[0] "" msgstr[1] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." msgstr[0] "" msgstr[1] "" msgid "Order" -msgstr "" +msgstr "क्रम" msgid "Delete" -msgstr "" +msgstr "घालवा" #, python-format msgid "Please correct the duplicate data for %(field)s." -msgstr "" +msgstr "कृपया %(field)s साठी दुय्यम माहिती प्रत सुधारा." #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." @@ -721,17 +783,17 @@ msgid "" msgstr "" msgid "Please correct the duplicate values below." -msgstr "" +msgstr "कृपया खालील नकली मूल्ये सुधारा." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "इनलाइन मूल्य मूळ उदाहरणाशी जुळत नाही." msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "" +msgstr "तो पर्याय उपलब्ध पर्यायांपैकी एक नाही. योग्य पर्याय निवडा. " #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” हे वैध मूल्य नाही." #, python-format msgid "" @@ -740,34 +802,26 @@ msgid "" msgstr "" msgid "Clear" -msgstr "" +msgstr "साफ करा" msgid "Currently" -msgstr "" +msgstr "सध्या" msgid "Change" -msgstr "" +msgstr "बदला" msgid "Unknown" -msgstr "" +msgstr "अज्ञात" msgid "Yes" -msgstr "" +msgstr "होय" msgid "No" -msgstr "" - -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" +msgstr "नाही" +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "" +msgstr "होय,नाही,कदाचित" #, python-format msgid "%(size)d byte" @@ -777,254 +831,254 @@ msgstr[1] "" #, python-format msgid "%s KB" -msgstr "" +msgstr "%s केबी" #, python-format msgid "%s MB" -msgstr "" +msgstr "%s एमबी" #, python-format msgid "%s GB" -msgstr "" +msgstr "%s जीबी" #, python-format msgid "%s TB" -msgstr "" +msgstr "%s टिबी" #, python-format msgid "%s PB" -msgstr "" +msgstr "%s पीबी" msgid "p.m." -msgstr "" +msgstr "म.उ." msgid "a.m." -msgstr "" +msgstr "म.पू." msgid "PM" -msgstr "" +msgstr "मउ" msgid "AM" -msgstr "" +msgstr "मपू" msgid "midnight" -msgstr "" +msgstr "मध्यरात्री" msgid "noon" -msgstr "" +msgstr "दुपारी" msgid "Monday" -msgstr "" +msgstr "सोमवार" msgid "Tuesday" -msgstr "" +msgstr "मंगळवार" msgid "Wednesday" -msgstr "" +msgstr "बुधवार" msgid "Thursday" -msgstr "" +msgstr "गुरुवार" msgid "Friday" -msgstr "" +msgstr "शुक्रवार" msgid "Saturday" -msgstr "" +msgstr "शनिवार" msgid "Sunday" -msgstr "" +msgstr "रविवार" msgid "Mon" -msgstr "" +msgstr "सोम" msgid "Tue" -msgstr "" +msgstr "मंगळ" msgid "Wed" -msgstr "" +msgstr "बुध" msgid "Thu" -msgstr "" +msgstr "गुरु" msgid "Fri" -msgstr "" +msgstr "शुक्र" msgid "Sat" -msgstr "" +msgstr "शनि" msgid "Sun" -msgstr "" +msgstr "रवि" msgid "January" -msgstr "" +msgstr "जानेवारी" msgid "February" -msgstr "" +msgstr "फेब्रुवारी" msgid "March" -msgstr "" +msgstr "मार्च" msgid "April" -msgstr "" +msgstr "एप्रिल" msgid "May" -msgstr "" +msgstr "मे" msgid "June" -msgstr "" +msgstr "जून" msgid "July" -msgstr "" +msgstr "जुलै" msgid "August" -msgstr "" +msgstr "ऑगस्ट" msgid "September" -msgstr "" +msgstr "सप्टेंबर" msgid "October" -msgstr "" +msgstr "ऑक्टोबर" msgid "November" -msgstr "" +msgstr "नोव्हेंबर" msgid "December" -msgstr "" +msgstr "डिसेंबर" msgid "jan" -msgstr "" +msgstr "जान" msgid "feb" -msgstr "" +msgstr "फेब" msgid "mar" -msgstr "" +msgstr "मार" msgid "apr" -msgstr "" +msgstr "एप्रि" msgid "may" -msgstr "" +msgstr "मे" msgid "jun" -msgstr "" +msgstr "जून" msgid "jul" -msgstr "" +msgstr "जुल" msgid "aug" -msgstr "" +msgstr "ऑग" msgid "sep" -msgstr "" +msgstr "सप" msgid "oct" -msgstr "" +msgstr "ऑक्ट" msgid "nov" -msgstr "" +msgstr "नोव्ह" msgid "dec" -msgstr "" +msgstr "डिस" msgctxt "abbrev. month" msgid "Jan." -msgstr "" +msgstr "जान." msgctxt "abbrev. month" msgid "Feb." -msgstr "" +msgstr "फेब." msgctxt "abbrev. month" msgid "March" -msgstr "" +msgstr "मार्च" msgctxt "abbrev. month" msgid "April" -msgstr "" +msgstr "एप्रिल" msgctxt "abbrev. month" msgid "May" -msgstr "" +msgstr "मे" msgctxt "abbrev. month" msgid "June" -msgstr "" +msgstr "जून" msgctxt "abbrev. month" msgid "July" -msgstr "" +msgstr "जुलै" msgctxt "abbrev. month" msgid "Aug." -msgstr "" +msgstr "ऑग." msgctxt "abbrev. month" msgid "Sept." -msgstr "" +msgstr "सप्ट." msgctxt "abbrev. month" msgid "Oct." -msgstr "" +msgstr "ऑक्ट." msgctxt "abbrev. month" msgid "Nov." -msgstr "" +msgstr "नोव्ह." msgctxt "abbrev. month" msgid "Dec." -msgstr "" +msgstr "डिस." msgctxt "alt. month" msgid "January" -msgstr "" +msgstr "जानेवारी" msgctxt "alt. month" msgid "February" -msgstr "" +msgstr "फेब्रुवारी" msgctxt "alt. month" msgid "March" -msgstr "" +msgstr "मार्च" msgctxt "alt. month" msgid "April" -msgstr "" +msgstr "एप्रिल" msgctxt "alt. month" msgid "May" -msgstr "" +msgstr "मे" msgctxt "alt. month" msgid "June" -msgstr "" +msgstr "जून" msgctxt "alt. month" msgid "July" -msgstr "" +msgstr "जुलै" msgctxt "alt. month" msgid "August" -msgstr "" +msgstr "ऑगस्ट" msgctxt "alt. month" msgid "September" -msgstr "" +msgstr "सप्टेंबर" msgctxt "alt. month" msgid "October" -msgstr "" +msgstr "ऑक्टोबर" msgctxt "alt. month" msgid "November" -msgstr "" +msgstr "नोव्हेंबर" msgctxt "alt. month" msgid "December" -msgstr "" +msgstr "डिसेंबर" msgid "This is not a valid IPv6 address." -msgstr "" +msgstr "हा योग्य IPv6 पत्ता नाही." #, python-format msgctxt "String to return when truncating text" @@ -1032,110 +1086,121 @@ msgid "%(truncated_text)s…" msgstr "" msgid "or" -msgstr "" +msgstr "किंवा" #. Translators: This string is used as a separator between list elements msgid ", " -msgstr "" +msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" +msgid "%(num)d year" +msgid_plural "%(num)d years" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d month" -msgid_plural "%d months" +msgid "%(num)d month" +msgid_plural "%(num)d months" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d week" -msgid_plural "%d weeks" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d day" -msgid_plural "%d days" +msgid "%(num)d day" +msgid_plural "%(num)d days" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d hour" -msgid_plural "%d hours" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" msgstr[0] "" msgstr[1] "" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" msgstr[0] "" msgstr[1] "" -msgid "0 minutes" -msgstr "" - msgid "Forbidden" -msgstr "" +msgstr "निषिद्ध" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "CSRF चाचणी अयशस्वी झाली. विनंती रद्द केली." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"तुम्हाला हा सनदेश दिसत आहे कारण या HTTPS संकेतस्थळाला तुमच्या वेब ब्राउझरद्वारे \"रेफरर " +"हेडर\" पाठवण्याची आवश्यकता आहे, परंतु कोणतेही पाठवले नाही. तुमचा ब्राउझर तृतीय पक्षांकडून " +"हायजॅक केला जात नाही याची खात्री करण्यासाठी सुरक्षिततेच्या दृष्टीने हे शीर्षलेख आवश्यक आहे." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"किमान या साइटसाठी किंवा HTTPS कनेक्शनसाठी किंवा “समान-मूळ” विनंत्यांसाठी, तुम्ही तुमचे " +"ब्राउझर “रेफरर” हेडर अक्षम केले असल्यास, कृपया ते पुन्हा-सक्षम करा." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"तुम्ही जोडणी वापरत असल्यास किंवा \"रेफरर-पॉलिसी: नो-रेफरर\" हेडर समाविष्ट करत " +"असल्यास, कृपया ते काढून टाका. CSRF संरक्षणासाठी \"रेफरर\" हेडर कठोर रेफरर तपासणी करणे " +"आवश्यक आहे. तुम्हाला गोपनीयतेबद्दल काळजी वाटत असल्यास, तृतीय-पक्ष स्थळाच्या दुव्यासाठी सारखे पर्याय वापरा." msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" +"तुम्हाला हा संदेश दिसत आहे कारण अर्ज सुपूर्त करताना या स्थळाला CSRF कुकी आवश्यक आहे. तुमचा " +"ब्राउझर तृतीय पक्षांकडून हायजॅक केला जात नाही याची खात्री करण्यासाठी ही कुकी " +"सुरक्षिततेच्या कारणांसाठी आवश्यक आहे." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"किमान या साइटसाठी किंवा \"समान-मूळ\" विनंत्यांसाठी, कृपया अक्षम केलेल्या ब्राउझर कुकीज " +"पुन्हा सक्षम करा." msgid "More information is available with DEBUG=True." -msgstr "" +msgstr "अधिक माहिती DEBUG=True सह उपलब्ध आहे." msgid "No year specified" -msgstr "" +msgstr "कोणतेही वर्ष नमूद केलेले नाही" msgid "Date out of range" -msgstr "" +msgstr "पल्ल्याच्या बाहेरची दिनांक" msgid "No month specified" -msgstr "" +msgstr "कोणताही महिना निर्दिष्ट केलेला नाही" msgid "No day specified" -msgstr "" +msgstr "कोणताही दिवस निर्दिष्ट केलेला नाही" msgid "No week specified" -msgstr "" +msgstr "कोणताही आठवडा निर्दिष्ट केलेला नाही" #, python-format msgid "No %(verbose_name_plural)s available" -msgstr "" +msgstr "कोणतेही %(verbose_name_plural)s उपलब्ध नाहीत" #, python-format msgid "" @@ -1149,64 +1214,67 @@ msgstr "" #, python-format msgid "No %(verbose_name)s found matching the query" -msgstr "" +msgstr "क्वेरीसह जुळणारे कोणतेही %(verbose_name)s सापडले नाही" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" +msgstr "अवैध पान (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" msgid "Directory indexes are not allowed here." -msgstr "" +msgstr "डिरेक्टरी निर्देशकांना येथे परवानगी नाही." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” अस्तित्वात नाही" #, python-format msgid "Index of %(directory)s" -msgstr "" +msgstr "%(directory)s चे निर्देशांक" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "इंस्टॉलेशनने यशस्वीरित्या कार्य केले! अभिनंदन!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"डिजांगो %(version)s साठी प्रदर्शित संदेश पहा" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" +"तुम्ही हे पान पाहत आहात कारण तुमच्या सेटिंग्ज फाइलमध्ये DEBUG=True आहे आणि तुम्ही कोणतीही URL कॉन्फिगर केलेली नाही." msgid "Django Documentation" -msgstr "" +msgstr "जांगो दस्तऐवजीकरण" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "विषय, संदर्भ, आणि कसे करावे" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "शिकवणी: मतदान अ‍ॅप" msgid "Get started with Django" -msgstr "" +msgstr "जॅंगो सोबत सुरवात करा" msgid "Django Community" -msgstr "" +msgstr "जॅंगो समुदाय" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "जोडा, मदत मिळवा किंवा हातभार लावा" diff --git a/django/conf/locale/ms/LC_MESSAGES/django.mo b/django/conf/locale/ms/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..90813401bb76 Binary files /dev/null and b/django/conf/locale/ms/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ms/LC_MESSAGES/django.po b/django/conf/locale/ms/LC_MESSAGES/django.po new file mode 100644 index 000000000000..58847456cc3f --- /dev/null +++ b/django/conf/locale/ms/LC_MESSAGES/django.po @@ -0,0 +1,1286 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jafry Hisham, 2021 +# Mariusz Felisiak , 2021 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-12-06 07:43+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "Afrikaans" +msgstr "Bahasa Afrikaans" + +msgid "Arabic" +msgstr "Bahasa Arab" + +msgid "Algerian Arabic" +msgstr "Bahasa Arab Algeria" + +msgid "Asturian" +msgstr "Bahasa Asturia" + +msgid "Azerbaijani" +msgstr "Bahasa Azerbaijan" + +msgid "Bulgarian" +msgstr "Bahasa Bulgaria" + +msgid "Belarusian" +msgstr "Bahasa Belarus" + +msgid "Bengali" +msgstr "Bahasa Benggali" + +msgid "Breton" +msgstr "Bahasa Breton" + +msgid "Bosnian" +msgstr "Bahasa Bosnia" + +msgid "Catalan" +msgstr "Bahasa Catalonia" + +msgid "Czech" +msgstr "Bahasa Czech" + +msgid "Welsh" +msgstr "Bahasa Wales" + +msgid "Danish" +msgstr "Bahasa Denmark" + +msgid "German" +msgstr "Bahasa Jerman" + +msgid "Lower Sorbian" +msgstr "Bahasa Sorbian Rendah" + +msgid "Greek" +msgstr "Bahasa Yunani" + +msgid "English" +msgstr "Bahasa Inggeris" + +msgid "Australian English" +msgstr "Bahasa Inggeris Australia" + +msgid "British English" +msgstr "Bahasa Inggeris British" + +msgid "Esperanto" +msgstr "Bahasa Esperanto" + +msgid "Spanish" +msgstr "Bahasa Sepanyol" + +msgid "Argentinian Spanish" +msgstr "Bahasa Sepanyol Argentina" + +msgid "Colombian Spanish" +msgstr "Bahasa Sepanyol Kolumbia" + +msgid "Mexican Spanish" +msgstr "Bahasa Sepanyol Mexico" + +msgid "Nicaraguan Spanish" +msgstr "Bahasa Sepanyol Nicaragua" + +msgid "Venezuelan Spanish" +msgstr "Bahasa Sepanyol Venezuela" + +msgid "Estonian" +msgstr "Bahasa Estonia" + +msgid "Basque" +msgstr "Bahasa Bask" + +msgid "Persian" +msgstr "Bahasa Farsi" + +msgid "Finnish" +msgstr "Bahassa Finland" + +msgid "French" +msgstr "Bahasa Perancis" + +msgid "Frisian" +msgstr "Bahasa Frisia" + +msgid "Irish" +msgstr "Bahasa Ireland" + +msgid "Scottish Gaelic" +msgstr "Bahasa Gael Scotland" + +msgid "Galician" +msgstr "Bahasa Galisia" + +msgid "Hebrew" +msgstr "Bahasa Ibrani" + +msgid "Hindi" +msgstr "Bahasa Hindi" + +msgid "Croatian" +msgstr "Bahasa Kroatia" + +msgid "Upper Sorbian" +msgstr "Bahasa Sorbia Atasan" + +msgid "Hungarian" +msgstr "Bahasa Hungary" + +msgid "Armenian" +msgstr "Bahasa Armenia" + +msgid "Interlingua" +msgstr "Bahasa Interlingua" + +msgid "Indonesian" +msgstr "Bahasa Indonesia" + +msgid "Igbo" +msgstr "Bahasa Igbo" + +msgid "Ido" +msgstr "Bahasa Ido" + +msgid "Icelandic" +msgstr "Bahasa Iceland" + +msgid "Italian" +msgstr "Bahasa Itali" + +msgid "Japanese" +msgstr "Bahasa Jepun" + +msgid "Georgian" +msgstr "Bahasa Georgia" + +msgid "Kabyle" +msgstr "Bahasa Kabylia" + +msgid "Kazakh" +msgstr "Bahasa Kazakhstan" + +msgid "Khmer" +msgstr "Bahasa Kambodia" + +msgid "Kannada" +msgstr "Bahasa Kannada" + +msgid "Korean" +msgstr "Bahasa Korea" + +msgid "Kyrgyz" +msgstr "Bahasa Kyrgyzstan" + +msgid "Luxembourgish" +msgstr "Bahasa Luxemborg" + +msgid "Lithuanian" +msgstr "Bahasa Lithuania" + +msgid "Latvian" +msgstr "Bahasa Latvia" + +msgid "Macedonian" +msgstr "Bahasa Masedonia" + +msgid "Malayalam" +msgstr "Malayalam" + +msgid "Mongolian" +msgstr "Bahasa Mongol" + +msgid "Marathi" +msgstr "Marathi" + +msgid "Malay" +msgstr "Bahasa Melayu" + +msgid "Burmese" +msgstr "Bahasa Burma" + +msgid "Norwegian Bokmål" +msgstr "Bahasa Bokmal Norway" + +msgid "Nepali" +msgstr "Bahasa Nepal" + +msgid "Dutch" +msgstr "Belanda" + +msgid "Norwegian Nynorsk" +msgstr "Bahasa Nynorsk Norway" + +msgid "Ossetic" +msgstr "Bahasa Ossetic" + +msgid "Punjabi" +msgstr "Bahasa Punjab" + +msgid "Polish" +msgstr "Bahasa Poland" + +msgid "Portuguese" +msgstr "Bahasa Portugal" + +msgid "Brazilian Portuguese" +msgstr "Bahasa Portugal Brazil" + +msgid "Romanian" +msgstr "Bahasa Romania" + +msgid "Russian" +msgstr "Bahasa Rusia" + +msgid "Slovak" +msgstr "Bahasa Slovakia" + +msgid "Slovenian" +msgstr "Bahasa Slovenia" + +msgid "Albanian" +msgstr "Bahasa Albania" + +msgid "Serbian" +msgstr "Bahasa Serbia" + +msgid "Serbian Latin" +msgstr "Bahasa Latin Serbia" + +msgid "Swedish" +msgstr "Bahasa Sweden" + +msgid "Swahili" +msgstr "Bahasa Swahili" + +msgid "Tamil" +msgstr "Bahasa Tamil" + +msgid "Telugu" +msgstr "Bahasa Telugu" + +msgid "Tajik" +msgstr "Bahasa Tajik" + +msgid "Thai" +msgstr "Bahasa Siam" + +msgid "Turkmen" +msgstr "Bahasa Turkmenistan" + +msgid "Turkish" +msgstr "Bahasa Turki" + +msgid "Tatar" +msgstr "Bahasa Tatar" + +msgid "Udmurt" +msgstr "Bahasa Udmurt" + +msgid "Ukrainian" +msgstr "Bahasa Ukraine" + +msgid "Urdu" +msgstr "Bahasa Urdu" + +msgid "Uzbek" +msgstr "Bahasa Uzbekistan" + +msgid "Vietnamese" +msgstr "Bahasa Vietnam" + +msgid "Simplified Chinese" +msgstr "Bahasa Cina (Dipermudahkan)" + +msgid "Traditional Chinese" +msgstr "Bahasa Cina Tradisional" + +msgid "Messages" +msgstr "Mesej" + +msgid "Site Maps" +msgstr "Peta Laman" + +msgid "Static Files" +msgstr "Fail Statik" + +msgid "Syndication" +msgstr "Sindikasi" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + +msgid "That page number is not an integer" +msgstr "Nombor ruangan itu bukanlah integer" + +msgid "That page number is less than 1" +msgstr "Nombor ruangan itu kurang daripada 1" + +msgid "That page contains no results" +msgstr "Ruangan itu tiada keputusan" + +msgid "Enter a valid value." +msgstr "Masukkan nilai yang sah." + +msgid "Enter a valid URL." +msgstr "Masukkan URL yang sah." + +msgid "Enter a valid integer." +msgstr "Masukkan integer yang sah." + +msgid "Enter a valid email address." +msgstr "Masukkan alamat emel yang sah." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Masukkan \"slug\" yang sah yang mengandungi huruf, nombor, garisan atau " +"tanda sempang." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Masukkan \"slug\" yang sah yang mengandungi huruf Unicode, nombor, garisan, " +"atau tanda sempang." + +msgid "Enter a valid IPv4 address." +msgstr "Masukkan alamat IPv4 yang sah." + +msgid "Enter a valid IPv6 address." +msgstr "Masukkan alamat IPv6 yang sah." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Masukkan alamat IPv4 atau IPv6 yang sah." + +msgid "Enter only digits separated by commas." +msgstr "Hanya masukkan digit yang dipisahkan oleh koma." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Pastikan nilai ini adalah %(limit_value)s (ia adalah %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Pastikan nilai ini kurang daripada atau sama dengan %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Pastikan nilai ini lebih daripada atau sama dengan %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Pastikan nilai ini mempunyai sekurang-kurangnya %(limit_value)d karater (ia " +"mempunyai %(show_value)d)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Pastikan nilai ini mempunyai sepalingnya %(limit_value)d karakter (ia " +"mempunyai %(show_value)d)." + +msgid "Enter a number." +msgstr "Masukkan nombor." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Pastikan jumlah tidak melebihi %(max)s digit." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Pastikan titik perpuluhan tidak melebihi %(max)s." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Pastikan jumlah digit tidak melebihi %(max)s sebelum titik perpuluhan." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"Sambungan fail \"%(extension)s\" tidak dibenarkan. Sambungan yang dibenarkan " +"adalah: %(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "Karakter Null tidak dibenarkan." + +msgid "and" +msgstr "dan" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s dengan %(field_labels)s ini sudah wujud." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Nilai %(value)r bukan pilihan yang sah." + +msgid "This field cannot be null." +msgstr "Medan ini tidak boleh null." + +msgid "This field cannot be blank." +msgstr "Medan ini tidak boleh dibiarkan kosong." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s dengan %(field_label)s ini sudah wujud." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "%(field_label)s mesti unik untuk %(date_field_label)s %(lookup_type)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Jenis medan: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "Nilai \"%(value)s\" mesti samada True atau False." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "Nilai \"%(value)s\" mesti samada True, False, atau None." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (Samada True atau False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "String (sehingga %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Integer dipisahkan dengan koma" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"Nilai \"%(value)s\" mempunyai format tarikh yang tidak sah. Format harus " +"berbentuk YYYY-MM-DD." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD) tetapi ia " +"adalah tarikh yang tidak sah." + +msgid "Date (without time)" +msgstr "Tarikh (tanpa masa)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " +"YYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang betul (YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ]) tetapi ia adalah tarikh/masa yang tidak sah." + +msgid "Date (with time)" +msgstr "Tarikh (dengan masa)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "Nilai \"%(value)s\" mesti dalam bentuk nombor titik perpuluhan." + +msgid "Decimal number" +msgstr "Nombor titik perpuluhan" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " +"[DD] [[HH:]MM:]ss[.uuuuuu]." + +msgid "Duration" +msgstr "Jangka-masa" + +msgid "Email address" +msgstr "Alama emel" + +msgid "File path" +msgstr "Laluan fail" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "Nilai \"%(value)s\" mesti dalam bentuk titik terapung." + +msgid "Floating point number" +msgstr "Nombor titik terapung" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "Nilai \"%(value)s\" mesti dalam bentuk integer." + +msgid "Integer" +msgstr "Integer" + +msgid "Big (8 byte) integer" +msgstr "Integer besar (8 bait)" + +msgid "Small integer" +msgstr "Integer kecil" + +msgid "IPv4 address" +msgstr "Alamat IPv4" + +msgid "IP address" +msgstr "Alamat IP" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "Nilai \"%(value)s\" mesti samada None, True, atau False." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (samada True, False, None)" + +msgid "Positive big integer" +msgstr "Integer besar positif" + +msgid "Positive integer" +msgstr "Integer positif" + +msgid "Positive small integer" +msgstr "Integer kecil positif" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (sehingga %(max_length)s)" + +msgid "Text" +msgstr "Teks" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang tidak sah. Format harus berbentuk " +"HH:MM[:ss[.uuuuuu]]." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"Nilai \"%(value)s\" mempunyai format yang betul (HH:MM[:ss[.uuuuuu]]) tetapi " +"ia mempunyai masa yang tidak sah." + +msgid "Time" +msgstr "Masa" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Data binari mentah" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "UUID \"%(value)s\" tidak sah." + +msgid "Universally unique identifier" +msgstr "Pengecam unik universal" + +msgid "File" +msgstr "Fail" + +msgid "Image" +msgstr "Imej" + +msgid "A JSON object" +msgstr "Objek JSON" + +msgid "Value must be valid JSON." +msgstr "Nilai harus dalam bentuk JSON yang sah." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s dengan %(field)s %(value)r tidak wujud." + +msgid "Foreign Key (type determined by related field)" +msgstr "Kunci Asing (jenis ditentukan oleh medan yang berkaitan)" + +msgid "One-to-one relationship" +msgstr "Hubungan satu-ke-satu" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Hubungan %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Hubungan %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Hubungan banyak-ke-banyak" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Medan ini diperlukan." + +msgid "Enter a whole number." +msgstr "Masukkan nombor bulat." + +msgid "Enter a valid date." +msgstr "Masukkan tarikh yang sah." + +msgid "Enter a valid time." +msgstr "Masukkan masa yang sah." + +msgid "Enter a valid date/time." +msgstr "Masukkan tarikh/masa yang sah." + +msgid "Enter a valid duration." +msgstr "Masukkan jangka-masa yang sah." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Jumlah hari mesti diantara {min_days} ke {max_days}." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Tiada fail yang dihantar. Periksa jenis encoding pada borang." + +msgid "No file was submitted." +msgstr "Tiada fail yang dihantar." + +msgid "The submitted file is empty." +msgstr "Fail yang dihantar kosong." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Pastikan nama fial ini tidak melebihi %(max)d karakter (ia mempunyai " +"%(length)d)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Sila hantar fail atau tandakan pada kotak, bukan kedua-duanya sekali. " + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Muatnaik imej yang sah. Fail yang anda muatnaik samada bukan imej atau imej " +"yang rosak." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Pilih pilihan yang sah. %(value)s bukan pilihan yang tersedia." + +msgid "Enter a list of values." +msgstr "Masukkan senarai nilai." + +msgid "Enter a complete value." +msgstr "Masukkan nilai yang lengkap." + +msgid "Enter a valid UUID." +msgstr "Masukkan UUID yang sah." + +msgid "Enter a valid JSON." +msgstr "Masukkan JSON yang sah." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "%(error)s (Medan tersorok %(name)s)" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Data ManagementForm tidak dijumpai atau telah diusik. Medan yang hilang: " +"%(field_names)s. Anda mungkin perlu menghantar laporan pepijat sekiranya " +"masalah masih berterusan." + +#, python-format +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Sila hantar tidak lebih dari %d borang." + +#, python-format +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Sila hantar sekurang-kurangnya %d borang." + +msgid "Order" +msgstr "Susunan" + +msgid "Delete" +msgstr "Padam" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Sila betulkan data duplikasi bagi %(field)s" + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Sila betulkan data duplikasi bagi %(field)s, yang mana mestilah unik." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Sila betulkan data duplikasi bagi %(field_name)s yang mana mestilah unik " +"untuk %(lookup)s didalam %(date_field)s." + +msgid "Please correct the duplicate values below." +msgstr "Sila betulkan nilai-nilai duplikasi dibawah." + +msgid "The inline value did not match the parent instance." +msgstr "Nilai didalam barisan tidak sepadan dengan parent instance." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Pilih pilihan yang sah. Pilihan itu tidak ada didalam senarai pilihan." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "\"%(pk)s\" bukan nilai yang sah." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s tidak dapat diterjemahkan ke dalam zon masa " +"%(current_timezone)s; ia mungkin samar-samar atau tidak wujud." + +msgid "Clear" +msgstr "Kosongkan" + +msgid "Currently" +msgstr "Kini" + +msgid "Change" +msgstr "Tukar" + +msgid "Unknown" +msgstr "Tidak diketahui" + +msgid "Yes" +msgstr "Ya" + +msgid "No" +msgstr "Tidak" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "ya,tidak,mungkin" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d bait" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "malam" + +msgid "a.m." +msgstr "pagi" + +msgid "PM" +msgstr "MALAM" + +msgid "AM" +msgstr "PAGI" + +msgid "midnight" +msgstr "tengah malam" + +msgid "noon" +msgstr "tengahari" + +msgid "Monday" +msgstr "Isnin" + +msgid "Tuesday" +msgstr "Selasa" + +msgid "Wednesday" +msgstr "Rabu" + +msgid "Thursday" +msgstr "Khamis" + +msgid "Friday" +msgstr "Jumaat" + +msgid "Saturday" +msgstr "Sabtu" + +msgid "Sunday" +msgstr "Ahad" + +msgid "Mon" +msgstr "Isn" + +msgid "Tue" +msgstr "Sel" + +msgid "Wed" +msgstr "Rab" + +msgid "Thu" +msgstr "Kha" + +msgid "Fri" +msgstr "Jum" + +msgid "Sat" +msgstr "Sab" + +msgid "Sun" +msgstr "Aha" + +msgid "January" +msgstr "Januari" + +msgid "February" +msgstr "Februari" + +msgid "March" +msgstr "Mac" + +msgid "April" +msgstr "April" + +msgid "May" +msgstr "Mei" + +msgid "June" +msgstr "Jun" + +msgid "July" +msgstr "Julai" + +msgid "August" +msgstr "Ogos" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "Oktober" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "Disember" + +msgid "jan" +msgstr "jan" + +msgid "feb" +msgstr "feb" + +msgid "mar" +msgstr "mar" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "mei" + +msgid "jun" +msgstr "jun" + +msgid "jul" +msgstr "jul" + +msgid "aug" +msgstr "ogo" + +msgid "sep" +msgstr "sep" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "nov" + +msgid "dec" +msgstr "dis" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Jan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Feb" + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mac" + +msgctxt "abbrev. month" +msgid "April" +msgstr "April" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Mei" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Jun" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Julai" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Ogo." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sept." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Nov." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dis." + +msgctxt "alt. month" +msgid "January" +msgstr "Januari" + +msgctxt "alt. month" +msgid "February" +msgstr "Februari" + +msgctxt "alt. month" +msgid "March" +msgstr "Mac" + +msgctxt "alt. month" +msgid "April" +msgstr "April" + +msgctxt "alt. month" +msgid "May" +msgstr "Mei" + +msgctxt "alt. month" +msgid "June" +msgstr "Jun" + +msgctxt "alt. month" +msgid "July" +msgstr "Julai" + +msgctxt "alt. month" +msgid "August" +msgstr "Ogos" + +msgctxt "alt. month" +msgid "September" +msgstr "September" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktober" + +msgctxt "alt. month" +msgid "November" +msgstr "November" + +msgctxt "alt. month" +msgid "December" +msgstr "Disember" + +msgid "This is not a valid IPv6 address." +msgstr "Alamat IPv6 ini tidak sah." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s ..." + +msgid "or" +msgstr "atau" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "," + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d tahun" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d bulan" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d minggu " + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d hari" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d jam" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minit" + +msgid "Forbidden" +msgstr "Dilarang" + +msgid "CSRF verification failed. Request aborted." +msgstr "Verifikasi VSRF gagal. Permintaan dihentikan." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Anda melihat mesej ini kerana laman HTTPS ini memerlukan \"Referer header\" " +"dihantar ke pelayar sesawang anda, tetapi ia tidak dihantar. Header ini " +"diperlukan bagi tujuan keselamatan, agar dapat memastikan pelayar anda tidak " +"dirampas oleh pihak ketiga." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Sekiranya anda telah menetapkan pelayar anda untuk mematikan header \"Referer" +"\", sila hidupkannya semula, sekurang-kurangya bagi laman ini, atau bagi " +"sambungan HTTPS, atau bagi permintaan \"same-origin\"." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Sekiranya anda menggunakan tag atau memasukkan header \"Referer-Policy: no-referrer\", sila buangkan " +"ia. Perlindungan CSRF memerlukan header \"Referer\" untuk melakukan " +"penyemakan referer yang ketat. Sekiranya anda risau tentang privasi anda, " +"gunakan alternatif seperti bagi pautan laman pihak " +"ketiga." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Anda melihat mesej ini kerana laman ini memerlukan cookie CSRF apabila " +"menghantar borang. Cookie ini diperlukan bagi tujuan keselamatan, bagi " +"memastikan pelayar anda tidak dirampas oleh pihak ketiga." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Sekiranya anda telah menetapkan pelayar anda untuk tidak menerima cookie, " +"sila hidupkannya semula, sekurang-kurangnya bagi laman ini, atau bagi " +"permintaan \"same-origin\"." + +msgid "More information is available with DEBUG=True." +msgstr "Maklumat lanjut boleh didapati dengan menetapkan DEBUG=True." + +msgid "No year specified" +msgstr "Tiada tahun diberikan" + +msgid "Date out of range" +msgstr "Tarikh diluar julat" + +msgid "No month specified" +msgstr "Tiada bulan diberikan" + +msgid "No day specified" +msgstr "Tiada hari diberikan" + +msgid "No week specified" +msgstr "Tiada minggu diberikan" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s tiada" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s masa depan tiada kerana %(class_name)s.allow_future " +"adalah False. " + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" +"\"%(datestr)s\" tarikh yang diberikan tidak sah mengikut format \"%(format)s" +"\"" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Tiada %(verbose_name)s mengikut pertanyaan yang dimasukkan" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Ruangan ini bukan \"last\", dan tidak boleh ditukar kepada int." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Ruangan tidak sah (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "Senarai kosong dan \"%(class_name)s.allow_empty\" adalah False." + +msgid "Directory indexes are not allowed here." +msgstr "Indeks Direktori tidak dibenarkan disini." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "\"%(path)s\" tidak wujud" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Indeks %(directory)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Pemasangan berjaya dilakukan! Tahniah!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Lihat nota pelepasan bagi Django %(version)s" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Anda melihat ruangan ini kerana DEBUG=True terdapat didalam fail tetapan anda dan anda tidak " +"menetapkan sebarang URL." + +msgid "Django Documentation" +msgstr "Dokumentasi Django" + +msgid "Topics, references, & how-to’s" +msgstr "Topik, rujukan, & bagaimana-cara" + +msgid "Tutorial: A Polling App" +msgstr "Tutorial: App Soal-Selidik" + +msgid "Get started with Django" +msgstr "Mulakan dengan Django" + +msgid "Django Community" +msgstr "Komuniti Django" + +msgid "Connect, get help, or contribute" +msgstr "Sambung, minta bantuan, atau sumbang" diff --git a/django/conf/locale/ms/__init__.py b/django/conf/locale/ms/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/django/conf/locale/ms/formats.py b/django/conf/locale/ms/formats.py new file mode 100644 index 000000000000..d06719fee3a0 --- /dev/null +++ b/django/conf/locale/ms/formats.py @@ -0,0 +1,38 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j M Y" # '25 Oct 2006' +TIME_FORMAT = "P" # '2:30 p.m.' +DATETIME_FORMAT = "j M Y, P" # '25 Oct 2006, 2:30 p.m.' +YEAR_MONTH_FORMAT = "F Y" # 'October 2006' +MONTH_DAY_FORMAT = "j F" # '25 October' +SHORT_DATE_FORMAT = "d/m/Y" # '25/10/2006' +SHORT_DATETIME_FORMAT = "d/m/Y P" # '25/10/2006 2:30 p.m.' +FIRST_DAY_OF_WEEK = 0 # Sunday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%Y-%m-%d", # '2006-10-25' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + "%d %b %Y", # '25 Oct 2006' + "%d %b, %Y", # '25 Oct, 2006' + "%d %B %Y", # '25 October 2006' + "%d %B, %Y", # '25 October, 2006' +] +DATETIME_INPUT_FORMATS = [ + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' +] +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/nb/LC_MESSAGES/django.mo b/django/conf/locale/nb/LC_MESSAGES/django.mo index 7f721bcefa77..c4ebbae42c7f 100644 Binary files a/django/conf/locale/nb/LC_MESSAGES/django.mo and b/django/conf/locale/nb/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/nb/LC_MESSAGES/django.po b/django/conf/locale/nb/LC_MESSAGES/django.po index 0010309bc634..cb2932b6fd65 100644 --- a/django/conf/locale/nb/LC_MESSAGES/django.po +++ b/django/conf/locale/nb/LC_MESSAGES/django.po @@ -5,20 +5,20 @@ # Eirik Krogstad , 2014 # Jannis Leidel , 2011 # jensadne , 2014-2015 -# Jon , 2015-2016 -# Jon , 2014 -# Jon , 2017-2020 -# Jon , 2013 -# Jon , 2011 +# Jon, 2015-2016 +# Jon, 2014 +# Jon, 2017-2022 +# Jon, 2013 +# Jon, 2011 # Sigurd Gartmann , 2012 # Tommy Strand , 2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-21 12:28+0000\n" -"Last-Translator: Jon \n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 06:49+0000\n" +"Last-Translator: Jon, 2017-2022\n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" "language/nb/)\n" "MIME-Version: 1.0\n" @@ -33,6 +33,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabisk" +msgid "Algerian Arabic" +msgstr "Algerisk arabisk" + msgid "Asturian" msgstr "Asturiansk" @@ -57,6 +60,9 @@ msgstr "Bosnisk" msgid "Catalan" msgstr "Katalansk" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Tsjekkisk" @@ -156,6 +162,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesisk" +msgid "Igbo" +msgstr "Ibo" + msgid "Ido" msgstr "Ido" @@ -186,6 +195,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreansk" +msgid "Kyrgyz" +msgstr "Kirgisisk" + msgid "Luxembourgish" msgstr "Luxembourgsk" @@ -207,6 +219,9 @@ msgstr "Mongolsk" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malayisk" + msgid "Burmese" msgstr "Burmesisk" @@ -270,9 +285,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tadsjikisk" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "Turkmensk" + msgid "Turkish" msgstr "Tyrkisk" @@ -312,6 +333,11 @@ msgstr "Statiske filer" msgid "Syndication" msgstr "Syndikering" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Sidenummeret er ikke et heltall" @@ -371,6 +397,10 @@ msgstr "Verdien må være mindre enn eller lik %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Verdien må være større enn eller lik %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Verdien må være et multiplum av trinnstørrelse %(limit_value)s." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -439,6 +469,10 @@ msgstr "og" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s med denne %(field_labels)s finnes allerede." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Begrensning \"%(name)s\" er brutt." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Verdien %(value)r er ikke et gyldig valg." @@ -453,8 +487,8 @@ msgstr "Feltet kan ikke være blankt." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s med %(field_label)s finnes allerede." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -479,6 +513,9 @@ msgstr "Boolsk (True eller False)" msgid "String (up to %(max_length)s)" msgstr "Tekst (opp til %(max_length)s tegn)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Heltall adskilt med komma" @@ -561,6 +598,9 @@ msgstr "Heltall" msgid "Big (8 byte) integer" msgstr "Stort (8 byte) heltall" +msgid "Small integer" +msgstr "Lite heltall" + msgid "IPv4 address" msgstr "IPv4-adresse" @@ -574,6 +614,9 @@ msgstr "Verdien \"%(value)s\" må være enten None, True eller False." msgid "Boolean (Either True, False or None)" msgstr "Boolsk (True, False eller None)" +msgid "Positive big integer" +msgstr "Positivt stort heltall" + msgid "Positive integer" msgstr "Positivt heltall" @@ -584,9 +627,6 @@ msgstr "Positivt lite heltall" msgid "Slug (up to %(max_length)s)" msgstr "Slug (opp til %(max_length)s)" -msgid "Small integer" -msgstr "Lite heltall" - msgid "Text" msgstr "Tekst" @@ -628,6 +668,12 @@ msgstr "Fil" msgid "Image" msgstr "Bilde" +msgid "A JSON object" +msgstr "Et JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Verdi må være gyldig JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s-instansen med %(field)s %(value)r finnes ikke." @@ -717,6 +763,9 @@ msgstr "Skriv inn en fullstendig verdi." msgid "Enter a valid UUID." msgstr "Oppgi en gyldig UUID." +msgid "Enter a valid JSON." +msgstr "Oppgi gyldig JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -725,20 +774,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Skjult felt %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm-data mangler eller har blitt endret." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-data mangler eller har blitt tuklet med. Felt som mangler: " +"%(field_names)s. Du må muligens rapportere en bug hvis problemet vedvarer." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Vennligst oppgi %d skjema." -msgstr[1] "Vennligst oppgi %d eller færre skjema." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Vennligst send inn maks %(num)d skjema." +msgstr[1] "Vennligst send inn maks %(num)d skjemaer." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Vennligst send inn %d eller flere skjemaer." -msgstr[1] "Vennligst send inn %d eller flere skjemaer." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Vennligst send inn minst %(num)d skjema." +msgstr[1] "Vennligst send inn minst %(num)d skjemaer." msgid "Order" msgstr "Rekkefølge" @@ -801,15 +855,7 @@ msgstr "Ja" msgid "No" msgstr "Nei" -msgid "Year" -msgstr "År" - -msgid "Month" -msgstr "Måned" - -msgid "Day" -msgstr "Dag" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nei,kanskje" @@ -1083,43 +1129,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d år" -msgstr[1] "%d år" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d år" +msgstr[1] "%(num)d år" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d måned" -msgstr[1] "%d måneder" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d måned" +msgstr[1] "%(num)d måneder" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d uke" -msgstr[1] "%d uker" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d uke" +msgstr[1] "%(num)d uker" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dager" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dager" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d time" -msgstr[1] "%d timer" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d time" +msgstr[1] "%(num)d timer" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutt" -msgstr[1] "%d minutter" - -msgid "0 minutes" -msgstr "0 minutter" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minutt" +msgstr[1] "%(num)d minutter" msgid "Forbidden" msgstr "Forbudt" @@ -1129,12 +1172,12 @@ msgstr "CSRF-verifisering feilet. Forespørsel avbrutt." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" "Du ser denne meldingen fordi dette HTTPS-nettstedet krever en 'Referer'-" -"header for å bli sendt av nettleseren, men ingen ble sendt. Denne headeren " +"header til å bli sendt av nettleseren, men ingen ble sendt. Denne headeren " "er nødvendig av sikkerhetsmessige årsaker, for å sikre at nettleseren din " "ikke blir kapret av tredjeparter." @@ -1151,14 +1194,14 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Hvis du bruker -taggen eller " "inkluderer 'Referrer-Policy: no-referrer'-header, vennligst fjern dem. CSRF-" "beskyttelsen krever 'Referer'-headeren for å utføre streng kontroll av " -"referanser. Hvis du er bekymret for personvern, bruk alternativer som for koblinger til tredjeparts nettsteder." +"referanser. Hvis du er bekymret for personvern, bruk alternativer som for koblinger til tredjeparts nettsteder." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1238,8 +1281,8 @@ msgstr "\"%(path)s\" finnes ikke" msgid "Index of %(directory)s" msgstr "Innhold i %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: web-rammeverket for perfeksjonister med tidsfrister." +msgid "The install worked successfully! Congratulations!" +msgstr "Installasjonen var vellykket! Gratulerer!" #, python-format msgid "" @@ -1250,20 +1293,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">produktmerknader for Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Installasjonen var vellykket! Gratulerer!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Du ser denne siden fordi DEBUG=True er i din Django-innstillingsfil og du ikke har konfigurert " -"noen URL-er." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True er i din Django-innstillingsfil og du ikke " +"har konfigurert noen URL-er." msgid "Django Documentation" msgstr "Django-dokumentasjon" diff --git a/django/conf/locale/nb/formats.py b/django/conf/locale/nb/formats.py index 91dd9e6bb70e..0ddb8fef604f 100644 --- a/django/conf/locale/nb/formats.py +++ b/django/conf/locale/nb/formats.py @@ -2,35 +2,40 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' - # '%d. %b %Y', '%d %b %Y', # '25. okt 2006', '25 okt 2006' - # '%d. %b. %Y', '%d %b. %Y', # '25. okt. 2006', '25 okt. 2006' - # '%d. %B %Y', '%d %B %Y', # '25. oktober 2006', '25 oktober 2006' + "%Y-%m-%d", # '2006-10-25' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + # "%d. %b %Y", # '25. okt 2006' + # "%d %b %Y", # '25 okt 2006' + # "%d. %b. %Y", # '25. okt. 2006' + # "%d %b. %Y", # '25 okt. 2006' + # "%d. %B %Y", # '25. oktober 2006' + # "%d %B %Y", # '25 oktober 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ne/LC_MESSAGES/django.mo b/django/conf/locale/ne/LC_MESSAGES/django.mo index 9d1ae0b33dab..2a10814b1be0 100644 Binary files a/django/conf/locale/ne/LC_MESSAGES/django.mo and b/django/conf/locale/ne/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ne/LC_MESSAGES/django.po b/django/conf/locale/ne/LC_MESSAGES/django.po index 33a5d2825d37..6882466349a2 100644 --- a/django/conf/locale/ne/LC_MESSAGES/django.po +++ b/django/conf/locale/ne/LC_MESSAGES/django.po @@ -1,6 +1,7 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 # Jannis Leidel , 2014 # Paras Nath Chaudhary , 2012 # Sagar Chalise , 2011-2012,2015,2018 @@ -9,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-12-07 12:11+0000\n" -"Last-Translator: Sagar Chalise \n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +26,9 @@ msgstr "अफ्रिकन" msgid "Arabic" msgstr "अरबिक" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "अस्टुरियन" @@ -148,6 +152,9 @@ msgstr "ईन्टरलिन्गुवा" msgid "Indonesian" msgstr "इन्डोनेसियाली" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "आइडु" @@ -178,6 +185,9 @@ msgstr "कन्नड" msgid "Korean" msgstr "कोरियाली" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "लक्जेमबर्गेली" @@ -262,9 +272,15 @@ msgstr "तामिल" msgid "Telugu" msgstr "तेलुगु" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "थाई" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "टर्किस" @@ -552,6 +568,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "बुलियन (True, False अथवा None)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "सकारात्मक पूर्णांक" @@ -602,6 +621,12 @@ msgstr "फाइल" msgid "Image" msgstr "चित्र" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -694,6 +719,9 @@ msgstr "पुरा मान राख्नु होस ।" msgid "Enter a valid UUID." msgstr "उपयुक्त UUID राख्नु होस ।" +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -776,17 +804,9 @@ msgstr "हुन्छ" msgid "No" msgstr "होइन" -msgid "Year" -msgstr "वर्ष" - -msgid "Month" -msgstr "महिना" - -msgid "Day" -msgstr "दिन" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "हो, होइन, सायद" +msgstr "हो,होइन,सायद" #, python-format msgid "%(size)d byte" @@ -1093,9 +1113,6 @@ msgid_plural "%d minutes" msgstr[0] "%d मिनट" msgstr[1] "%d मिनटहरु" -msgid "0 minutes" -msgstr "० मिनट" - msgid "Forbidden" msgstr "निषेधित" diff --git a/django/conf/locale/nl/LC_MESSAGES/django.mo b/django/conf/locale/nl/LC_MESSAGES/django.mo index 29e363b48ee2..7bb3da3fc29c 100644 Binary files a/django/conf/locale/nl/LC_MESSAGES/django.mo and b/django/conf/locale/nl/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/nl/LC_MESSAGES/django.po b/django/conf/locale/nl/LC_MESSAGES/django.po index 6bc7ab5f2a23..85fe2403aec1 100644 --- a/django/conf/locale/nl/LC_MESSAGES/django.po +++ b/django/conf/locale/nl/LC_MESSAGES/django.po @@ -10,20 +10,20 @@ # Harro van der Klauw , 2011-2012 # Ilja Maas , 2015 # Jannis Leidel , 2011 -# Jeffrey Gelens , 2011-2012,2014 +# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012,2014 # Michiel Overtoom , 2014 -# Meteor 0id, 2019 -# Sander Steffann , 2014-2015 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 # Tino de Bruijn , 2013 -# Tonnes , 2017,2019 +# Tonnes , 2017,2019-2020,2022-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 11:26+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Tonnes , 2017,2019-2020,2022-2024\n" +"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -36,6 +36,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabisch" +msgid "Algerian Arabic" +msgstr "Algerijns Arabisch" + msgid "Asturian" msgstr "Asturisch" @@ -60,6 +63,9 @@ msgstr "Bosnisch" msgid "Catalan" msgstr "Catalaans" +msgid "Central Kurdish (Sorani)" +msgstr "Centraal-Koerdisch (Sorani)" + msgid "Czech" msgstr "Tsjechisch" @@ -159,6 +165,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesisch" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -189,6 +198,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreaans" +msgid "Kyrgyz" +msgstr "Kirgizisch" + msgid "Luxembourgish" msgstr "Luxemburgs" @@ -210,6 +222,9 @@ msgstr "Mongools" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Maleis" + msgid "Burmese" msgstr "Birmaans" @@ -273,9 +288,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telegu" +msgid "Tajik" +msgstr "Tadzjieks" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "Turkmeens" + msgid "Turkish" msgstr "Turks" @@ -285,6 +306,9 @@ msgstr "Tataars" msgid "Udmurt" msgstr "Oedmoerts" +msgid "Uyghur" +msgstr "Oeigoers" + msgid "Ukrainian" msgstr "Oekraïens" @@ -315,6 +339,11 @@ msgstr "Statische bestanden" msgid "Syndication" msgstr "Syndicatie" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Dat paginanummer is geen geheel getal" @@ -327,6 +356,9 @@ msgstr "Die pagina bevat geen resultaten" msgid "Enter a valid value." msgstr "Voer een geldige waarde in." +msgid "Enter a valid domain name." +msgstr "Voer een geldige domeinnaam in." + msgid "Enter a valid URL." msgstr "Voer een geldige URL in." @@ -350,14 +382,18 @@ msgstr "" "Voer een geldige ‘slug’ in, bestaande uit Unicode-letters, cijfers, liggende " "streepjes en verbindingsstreepjes." -msgid "Enter a valid IPv4 address." -msgstr "Voer een geldig IPv4-adres in." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Voer een geldig %(protocol)s-adres in." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Voer een geldig IPv6-adres in." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Voer een geldig IPv4- of IPv6-adres in." +msgid "IPv4 or IPv6" +msgstr "IPv4- of IPv6" msgid "Enter only digits separated by commas." msgstr "Voer alleen cijfers in, gescheiden door komma's." @@ -376,6 +412,20 @@ msgstr "Zorg ervoor dat deze waarde hoogstens %(limit_value)s is." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Zorg ervoor dat deze waarde minstens %(limit_value)s is." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Zorg ervoor dat deze waarde een veelvoud is van stapgrootte %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Zorg dat deze waarde een veelvoud is van stapgrootte %(limit_value)s, " +"beginnend bij %(offset)s, bv. %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, enzovoort." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -445,6 +495,10 @@ msgstr "en" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s met deze %(field_labels)s bestaat al." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Beperking ‘%(name)s’ is geschonden." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Waarde %(value)r is geen geldige keuze." @@ -459,8 +513,8 @@ msgstr "Dit veld kan niet leeg zijn" msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Er bestaat al een %(model_name)s met eenzelfde %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -486,6 +540,9 @@ msgstr "Boolean (True of False)" msgid "String (up to %(max_length)s)" msgstr "Tekenreeks (hooguit %(max_length)s)" +msgid "String (unlimited)" +msgstr "Tekenreeks (onbeperkt)" + msgid "Comma-separated integers" msgstr "Komma-gescheiden gehele getallen" @@ -568,6 +625,9 @@ msgstr "Geheel getal" msgid "Big (8 byte) integer" msgstr "Groot (8 byte) geheel getal" +msgid "Small integer" +msgstr "Klein geheel getal" + msgid "IPv4 address" msgstr "IPv4-adres" @@ -581,6 +641,9 @@ msgstr "Waarde van ‘%(value)s’ moet None, True of False zijn." msgid "Boolean (Either True, False or None)" msgstr "Boolean (True, False of None)" +msgid "Positive big integer" +msgstr "Positief groot geheel getal" + msgid "Positive integer" msgstr "Positief geheel getal" @@ -591,9 +654,6 @@ msgstr "Postitief klein geheel getal" msgid "Slug (up to %(max_length)s)" msgstr "Slug (max. lengte %(max_length)s)" -msgid "Small integer" -msgstr "Klein geheel getal" - msgid "Text" msgstr "Tekst" @@ -635,6 +695,12 @@ msgstr "Bestand" msgid "Image" msgstr "Afbeelding" +msgid "A JSON object" +msgstr "Een JSON-object" + +msgid "Value must be valid JSON." +msgstr "Waarde moet geldige JSON zijn." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s-instantie met %(field)s %(value)r bestaat niet." @@ -728,6 +794,9 @@ msgstr "Voer een volledige waarde in." msgid "Enter a valid UUID." msgstr "Voer een geldige UUID in." +msgid "Enter a valid JSON." +msgstr "Voer een geldige JSON in." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -736,20 +805,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Verborgen veld %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm-gegevens ontbreken, of er is mee geknoeid" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-gegevens ontbreken of er is mee geknoeid. Ontbrekende velden: " +"%(field_names)s. Mogelijk dient u een bug te melden als het probleem " +"aanhoudt." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Verstuur niet meer dan %d formulier." -msgstr[1] "Verstuur niet meer dan %d formulieren." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Verstuur maximaal %(num)d formulier." +msgstr[1] "Verstuur maximaal %(num)d formulieren." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Verstuur %d of meer formulieren." -msgstr[1] "Verstuur %d of meer formulieren." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Verstuur minimaal %(num)d formulier." +msgstr[1] "Verstuur minimaal %(num)d formulieren." msgid "Order" msgstr "Volgorde" @@ -812,15 +887,7 @@ msgstr "Ja" msgid "No" msgstr "Nee" -msgid "Year" -msgstr "Jaar" - -msgid "Month" -msgstr "Maand" - -msgid "Day" -msgstr "Dag" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nee,misschien" @@ -1094,43 +1161,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d jaar" -msgstr[1] "%d jaar" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d jaar" +msgstr[1] "%(num)d jaar" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d maand" -msgstr[1] "%d maanden" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d maand" +msgstr[1] "%(num)d maanden" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d week" -msgstr[1] "%d weken" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d week" +msgstr[1] "%(num)d weken" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dagen" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dagen" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d uur" -msgstr[1] "%d uur" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d uur" +msgstr[1] "%(num)d uur" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuut" -msgstr[1] "%d minuten" - -msgid "0 minutes" -msgstr "0 minuten" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuut" +msgstr[1] "%(num)d minuten" msgid "Forbidden" msgstr "Verboden" @@ -1140,7 +1204,7 @@ msgstr "CSRF-verificatie mislukt. Aanvraag afgebroken." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1162,14 +1226,14 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Als u de tag gebruikt of de " "header ‘Referrer-Policy: no-referrer’ opneemt, verwijder deze dan. De CSRF-" "bescherming vereist de ‘Referer’-header voor strenge referer-controle. Als u " -"bezorgd bent om privacy, gebruik dan alternatieven zoals voor koppelingen naar websites van derden." +"bezorgd bent om privacy, gebruik dan alternatieven zoals voor koppelingen naar websites van derden." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1250,31 +1314,28 @@ msgstr "‘%(path)s’ bestaat niet" msgid "Index of %(directory)s" msgstr "Index van %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: het webframework voor perfectionisten met deadlines." +msgid "The install worked successfully! Congratulations!" +msgstr "De installatie is gelukt! Gefeliciteerd!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"Uitgaveopmerkingen voor Django %(version)s " -"weergeven" - -msgid "The install worked successfully! Congratulations!" -msgstr "De installatie is gelukt! Gefeliciteerd!" +"Uitgaveopmerkingen voor Django " +"%(version)s weergeven" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "U ziet deze pagina, omdat uw instellingenbestand DEBUG=True bevat en u geen URL's hebt geconfigureerd." +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True bevat en u geen URL's hebt geconfigureerd." msgid "Django Documentation" msgstr "Django-documentatie" diff --git a/django/conf/locale/nl/formats.py b/django/conf/locale/nl/formats.py index afadb9f1d77e..e9f52b9bd3a5 100644 --- a/django/conf/locale/nl/formats.py +++ b/django/conf/locale/nl/formats.py @@ -2,65 +2,91 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' # '20 januari 2009' -TIME_FORMAT = 'H:i' # '15:23' -DATETIME_FORMAT = 'j F Y H:i' # '20 januari 2009 15:23' -YEAR_MONTH_FORMAT = 'F Y' # 'januari 2009' -MONTH_DAY_FORMAT = 'j F' # '20 januari' -SHORT_DATE_FORMAT = 'j-n-Y' # '20-1-2009' -SHORT_DATETIME_FORMAT = 'j-n-Y H:i' # '20-1-2009 15:23' -FIRST_DAY_OF_WEEK = 1 # Monday (in Dutch 'maandag') +DATE_FORMAT = "j F Y" # '20 januari 2009' +TIME_FORMAT = "H:i" # '15:23' +DATETIME_FORMAT = "j F Y H:i" # '20 januari 2009 15:23' +YEAR_MONTH_FORMAT = "F Y" # 'januari 2009' +MONTH_DAY_FORMAT = "j F" # '20 januari' +SHORT_DATE_FORMAT = "j-n-Y" # '20-1-2009' +SHORT_DATETIME_FORMAT = "j-n-Y H:i" # '20-1-2009 15:23' +FIRST_DAY_OF_WEEK = 1 # Monday (in Dutch 'maandag') # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d-%m-%Y', '%d-%m-%y', # '20-01-2009', '20-01-09' - '%d/%m/%Y', '%d/%m/%y', # '20/01/2009', '20/01/09' - '%Y/%m/%d', # '2009/01/20' - # '%d %b %Y', '%d %b %y', # '20 jan 2009', '20 jan 09' - # '%d %B %Y', '%d %B %y', # '20 januari 2009', '20 januari 09' + "%d-%m-%Y", # '20-01-2009' + "%d-%m-%y", # '20-01-09' + "%d/%m/%Y", # '20/01/2009' + "%d/%m/%y", # '20/01/09' + "%Y/%m/%d", # '2009/01/20' + # "%d %b %Y", # '20 jan 2009' + # "%d %b %y", # '20 jan 09' + # "%d %B %Y", # '20 januari 2009' + # "%d %B %y", # '20 januari 09' ] # Kept ISO formats as one is in first position TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '15:23:35' - '%H:%M:%S.%f', # '15:23:35.000200' - '%H.%M:%S', # '15.23:35' - '%H.%M:%S.%f', # '15.23:35.000200' - '%H.%M', # '15.23' - '%H:%M', # '15:23' + "%H:%M:%S", # '15:23:35' + "%H:%M:%S.%f", # '15:23:35.000200' + "%H.%M:%S", # '15.23:35' + "%H.%M:%S.%f", # '15.23:35.000200' + "%H.%M", # '15.23' + "%H:%M", # '15:23' ] DATETIME_INPUT_FORMATS = [ # With time in %H:%M:%S : - '%d-%m-%Y %H:%M:%S', '%d-%m-%y %H:%M:%S', '%Y-%m-%d %H:%M:%S', - # '20-01-2009 15:23:35', '20-01-09 15:23:35', '2009-01-20 15:23:35' - '%d/%m/%Y %H:%M:%S', '%d/%m/%y %H:%M:%S', '%Y/%m/%d %H:%M:%S', - # '20/01/2009 15:23:35', '20/01/09 15:23:35', '2009/01/20 15:23:35' - # '%d %b %Y %H:%M:%S', '%d %b %y %H:%M:%S', # '20 jan 2009 15:23:35', '20 jan 09 15:23:35' - # '%d %B %Y %H:%M:%S', '%d %B %y %H:%M:%S', # '20 januari 2009 15:23:35', '20 januari 2009 15:23:35' + "%d-%m-%Y %H:%M:%S", # '20-01-2009 15:23:35' + "%d-%m-%y %H:%M:%S", # '20-01-09 15:23:35' + "%Y-%m-%d %H:%M:%S", # '2009-01-20 15:23:35' + "%d/%m/%Y %H:%M:%S", # '20/01/2009 15:23:35' + "%d/%m/%y %H:%M:%S", # '20/01/09 15:23:35' + "%Y/%m/%d %H:%M:%S", # '2009/01/20 15:23:35' + # "%d %b %Y %H:%M:%S", # '20 jan 2009 15:23:35' + # "%d %b %y %H:%M:%S", # '20 jan 09 15:23:35' + # "%d %B %Y %H:%M:%S", # '20 januari 2009 15:23:35' + # "%d %B %y %H:%M:%S", # '20 januari 2009 15:23:35' # With time in %H:%M:%S.%f : - '%d-%m-%Y %H:%M:%S.%f', '%d-%m-%y %H:%M:%S.%f', '%Y-%m-%d %H:%M:%S.%f', - # '20-01-2009 15:23:35.000200', '20-01-09 15:23:35.000200', '2009-01-20 15:23:35.000200' - '%d/%m/%Y %H:%M:%S.%f', '%d/%m/%y %H:%M:%S.%f', '%Y/%m/%d %H:%M:%S.%f', - # '20/01/2009 15:23:35.000200', '20/01/09 15:23:35.000200', '2009/01/20 15:23:35.000200' + "%d-%m-%Y %H:%M:%S.%f", # '20-01-2009 15:23:35.000200' + "%d-%m-%y %H:%M:%S.%f", # '20-01-09 15:23:35.000200' + "%Y-%m-%d %H:%M:%S.%f", # '2009-01-20 15:23:35.000200' + "%d/%m/%Y %H:%M:%S.%f", # '20/01/2009 15:23:35.000200' + "%d/%m/%y %H:%M:%S.%f", # '20/01/09 15:23:35.000200' + "%Y/%m/%d %H:%M:%S.%f", # '2009/01/20 15:23:35.000200' # With time in %H.%M:%S : - '%d-%m-%Y %H.%M:%S', '%d-%m-%y %H.%M:%S', # '20-01-2009 15.23:35', '20-01-09 15.23:35' - '%d/%m/%Y %H.%M:%S', '%d/%m/%y %H.%M:%S', # '20/01/2009 15.23:35', '20/01/09 15.23:35' - # '%d %b %Y %H.%M:%S', '%d %b %y %H.%M:%S', # '20 jan 2009 15.23:35', '20 jan 09 15.23:35' - # '%d %B %Y %H.%M:%S', '%d %B %y %H.%M:%S', # '20 januari 2009 15.23:35', '20 januari 2009 15.23:35' + "%d-%m-%Y %H.%M:%S", # '20-01-2009 15.23:35' + "%d-%m-%y %H.%M:%S", # '20-01-09 15.23:35' + "%d/%m/%Y %H.%M:%S", # '20/01/2009 15.23:35' + "%d/%m/%y %H.%M:%S", # '20/01/09 15.23:35' + # "%d %b %Y %H.%M:%S", # '20 jan 2009 15.23:35' + # "%d %b %y %H.%M:%S", # '20 jan 09 15.23:35' + # "%d %B %Y %H.%M:%S", # '20 januari 2009 15.23:35' + # "%d %B %y %H.%M:%S", # '20 januari 2009 15.23:35' # With time in %H.%M:%S.%f : - '%d-%m-%Y %H.%M:%S.%f', '%d-%m-%y %H.%M:%S.%f', # '20-01-2009 15.23:35.000200', '20-01-09 15.23:35.000200' - '%d/%m/%Y %H.%M:%S.%f', '%d/%m/%y %H.%M:%S.%f', # '20/01/2009 15.23:35.000200', '20/01/09 15.23:35.000200' + "%d-%m-%Y %H.%M:%S.%f", # '20-01-2009 15.23:35.000200' + "%d-%m-%y %H.%M:%S.%f", # '20-01-09 15.23:35.000200' + "%d/%m/%Y %H.%M:%S.%f", # '20/01/2009 15.23:35.000200' + "%d/%m/%y %H.%M:%S.%f", # '20/01/09 15.23:35.000200' # With time in %H:%M : - '%d-%m-%Y %H:%M', '%d-%m-%y %H:%M', '%Y-%m-%d %H:%M', # '20-01-2009 15:23', '20-01-09 15:23', '2009-01-20 15:23' - '%d/%m/%Y %H:%M', '%d/%m/%y %H:%M', '%Y/%m/%d %H:%M', # '20/01/2009 15:23', '20/01/09 15:23', '2009/01/20 15:23' - # '%d %b %Y %H:%M', '%d %b %y %H:%M', # '20 jan 2009 15:23', '20 jan 09 15:23' - # '%d %B %Y %H:%M', '%d %B %y %H:%M', # '20 januari 2009 15:23', '20 januari 2009 15:23' + "%d-%m-%Y %H:%M", # '20-01-2009 15:23' + "%d-%m-%y %H:%M", # '20-01-09 15:23' + "%Y-%m-%d %H:%M", # '2009-01-20 15:23' + "%d/%m/%Y %H:%M", # '20/01/2009 15:23' + "%d/%m/%y %H:%M", # '20/01/09 15:23' + "%Y/%m/%d %H:%M", # '2009/01/20 15:23' + # "%d %b %Y %H:%M", # '20 jan 2009 15:23' + # "%d %b %y %H:%M", # '20 jan 09 15:23' + # "%d %B %Y %H:%M", # '20 januari 2009 15:23' + # "%d %B %y %H:%M", # '20 januari 2009 15:23' # With time in %H.%M : - '%d-%m-%Y %H.%M', '%d-%m-%y %H.%M', # '20-01-2009 15.23', '20-01-09 15.23' - '%d/%m/%Y %H.%M', '%d/%m/%y %H.%M', # '20/01/2009 15.23', '20/01/09 15.23' - # '%d %b %Y %H.%M', '%d %b %y %H.%M', # '20 jan 2009 15.23', '20 jan 09 15.23' - # '%d %B %Y %H.%M', '%d %B %y %H.%M', # '20 januari 2009 15.23', '20 januari 2009 15.23' + "%d-%m-%Y %H.%M", # '20-01-2009 15.23' + "%d-%m-%y %H.%M", # '20-01-09 15.23' + "%d/%m/%Y %H.%M", # '20/01/2009 15.23' + "%d/%m/%y %H.%M", # '20/01/09 15.23' + # "%d %b %Y %H.%M", # '20 jan 2009 15.23' + # "%d %b %y %H.%M", # '20 jan 09 15.23' + # "%d %B %Y %H.%M", # '20 januari 2009 15.23' + # "%d %B %y %H.%M", # '20 januari 2009 15.23' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/nn/LC_MESSAGES/django.mo b/django/conf/locale/nn/LC_MESSAGES/django.mo index 5629ceae99a2..7698eda113e5 100644 Binary files a/django/conf/locale/nn/LC_MESSAGES/django.mo and b/django/conf/locale/nn/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/nn/LC_MESSAGES/django.po b/django/conf/locale/nn/LC_MESSAGES/django.po index b95b0b0e0555..04b872e30b70 100644 --- a/django/conf/locale/nn/LC_MESSAGES/django.po +++ b/django/conf/locale/nn/LC_MESSAGES/django.po @@ -5,14 +5,16 @@ # Jannis Leidel , 2011 # jensadne , 2013 # Sigurd Gartmann , 2012 +# Sivert Olstad, 2021 # velmont , 2012 +# Vibeke Uthaug, 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-25 14:49+0000\n" +"Last-Translator: Sivert Olstad\n" "Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" "language/nn/)\n" "MIME-Version: 1.0\n" @@ -27,8 +29,11 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabisk" +msgid "Algerian Arabic" +msgstr "Arabisk (algersk)" + msgid "Asturian" -msgstr "" +msgstr "Asturiansk" msgid "Azerbaijani" msgstr "Aserbajansk" @@ -64,7 +69,7 @@ msgid "German" msgstr "Tysk" msgid "Lower Sorbian" -msgstr "" +msgstr "Lågsorbisk" msgid "Greek" msgstr "Gresk" @@ -73,7 +78,7 @@ msgid "English" msgstr "Engelsk" msgid "Australian English" -msgstr "" +msgstr "Engelsk (australsk)" msgid "British English" msgstr "Engelsk (britisk)" @@ -88,7 +93,7 @@ msgid "Argentinian Spanish" msgstr "Spansk (argentinsk)" msgid "Colombian Spanish" -msgstr "" +msgstr "Spansk (kolombiansk)" msgid "Mexican Spanish" msgstr "Spansk (meksikansk)" @@ -121,7 +126,7 @@ msgid "Irish" msgstr "Irsk" msgid "Scottish Gaelic" -msgstr "" +msgstr "Skotsk-gaelisk" msgid "Galician" msgstr "Galisisk" @@ -136,22 +141,25 @@ msgid "Croatian" msgstr "Kroatisk" msgid "Upper Sorbian" -msgstr "" +msgstr "Høgsorbisk" msgid "Hungarian" msgstr "Ungarsk" msgid "Armenian" -msgstr "" +msgstr "Armensk" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesisk" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" msgstr "Islandsk" @@ -166,7 +174,7 @@ msgid "Georgian" msgstr "Georgisk" msgid "Kabyle" -msgstr "" +msgstr "Kabylsk" msgid "Kazakh" msgstr "Kasakhisk" @@ -180,6 +188,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreansk" +msgid "Kyrgyz" +msgstr "Kirgisisk" + msgid "Luxembourgish" msgstr "Luxembourgsk" @@ -199,13 +210,16 @@ msgid "Mongolian" msgstr "Mongolsk" msgid "Marathi" -msgstr "" +msgstr "Marathi" + +msgid "Malay" +msgstr "Malayisk" msgid "Burmese" msgstr "Burmesisk" msgid "Norwegian Bokmål" -msgstr "" +msgstr "Norsk (bokmål)" msgid "Nepali" msgstr "Nepali" @@ -264,9 +278,15 @@ msgstr "Tamil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tadsjikisk" + msgid "Thai" msgstr "Thai" +msgid "Turkmen" +msgstr "Turkmensk" + msgid "Turkish" msgstr "Tyrkisk" @@ -283,7 +303,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Usbekisk" msgid "Vietnamese" msgstr "Vietnamesisk" @@ -295,25 +315,30 @@ msgid "Traditional Chinese" msgstr "Tradisjonell kinesisk" msgid "Messages" -msgstr "" +msgstr "Meldingar" msgid "Site Maps" -msgstr "" +msgstr "Sidekart" msgid "Static Files" -msgstr "" +msgstr "Statiske Filer" msgid "Syndication" -msgstr "" +msgstr "Syndikering" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" msgid "That page number is not an integer" -msgstr "" +msgstr "Sidenummeret er ikkje eit heiltal" msgid "That page number is less than 1" -msgstr "" +msgstr "Sidenummeret er mindre enn 1" msgid "That page contains no results" -msgstr "" +msgstr "Sida har ingen resultat" msgid "Enter a valid value." msgstr "Oppgje ein gyldig verdi." @@ -322,7 +347,7 @@ msgid "Enter a valid URL." msgstr "Oppgje ei gyldig nettadresse." msgid "Enter a valid integer." -msgstr "" +msgstr "Oppgje eit gyldig heiltal." msgid "Enter a valid email address." msgstr "Oppgje ei gyldig e-postadresse." @@ -331,11 +356,15 @@ msgstr "Oppgje ei gyldig e-postadresse." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Oppgje ein gyldig \"slug\" som består av bokstavar, nummer, understrekar " +"eller bindestrekar." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Oppgje ein gyldig \"slug\" som består av Unicode bokstavar, nummer, " +"understrekar eller bindestrekar." msgid "Enter a valid IPv4 address." msgstr "Oppgje ei gyldig IPv4-adresse." @@ -379,50 +408,56 @@ msgid_plural "" "Ensure this value has at most %(limit_value)d characters (it has " "%(show_value)d)." msgstr[0] "" +"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " +"%(show_value)d)." msgstr[1] "" +"Verdien kan ikkje ha fleire enn %(limit_value)d teikn (den har " +"%(show_value)d)." msgid "Enter a number." -msgstr "Oppgje eit tall." +msgstr "Oppgje eit tal." #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." +msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer totalt." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Verdien kan ikkie ha meir enn %(max)s desimal." +msgstr[1] "Verdien kan ikkie ha meir enn %(max)s desimalar." #, python-format msgid "" "Ensure that there are no more than %(max)s digit before the decimal point." msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." +msgstr[1] "Verdien kan ikkje ha meir enn %(max)s siffer framanfor komma." #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Filtypen “%(extension)s” er ikkje tillate. Tillate filtypar er: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." -msgstr "" +msgstr "Null-teikn er ikkje tillate." msgid "and" msgstr "og" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "" +msgstr "%(model_name)s med %(field_labels)s fins allereie." #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "" +msgstr "Verdi %(value)r er eit ugyldig val." msgid "This field cannot be null." msgstr "Feltet kan ikkje vere tomt." @@ -439,7 +474,7 @@ msgstr "%(model_name)s med %(field_label)s fins allereie." #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" +msgstr "%(field_label)s må vere unik for %(date_field_label)s %(lookup_type)s." #, python-format msgid "Field of type: %(field_type)s" @@ -447,11 +482,11 @@ msgstr "Felt av typen: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Verdien “%(value)s” må vere anten True eller False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Verdien “%(value)s” må vere anten True, False, eller None." msgid "Boolean (Either True or False)" msgstr "Boolsk (True eller False)" @@ -468,12 +503,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Verdien “%(value)s” har eit ugyldig datoformat. Det må vere på formen YYYY-" +"MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Verdien “%(value)s” har rett format (YYYY-MM-DD) men er ein ugyldig dato." msgid "Date (without time)" msgstr "Dato (utan tid)" @@ -483,31 +521,37 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Verdien “%(value)s” har rett format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) men " +"er ein ugyldig dato eller klokkeslett." msgid "Date (with time)" msgstr "Dato (med tid)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Verdien “%(value)s” må vere eit desimaltal." msgid "Decimal number" -msgstr "Desimaltall" +msgstr "Desimaltal" #, python-format msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen [DD] " +"[[HH:]MM:]ss[.uuuuuu]." msgid "Duration" -msgstr "" +msgstr "Varigskap" msgid "Email address" msgstr "E-postadresse" @@ -517,14 +561,14 @@ msgstr "Filsti" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Verdien “%(value)s” må vere eit flyttal." msgid "Floating point number" -msgstr "Flyttall" +msgstr "Flyttal" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Verdien “%(value)s” må vere eit heiltal." msgid "Integer" msgstr "Heiltal" @@ -532,6 +576,9 @@ msgstr "Heiltal" msgid "Big (8 byte) integer" msgstr "Stort (8 bitar) heiltal" +msgid "Small integer" +msgstr "Lite heiltal" + msgid "IPv4 address" msgstr "IPv4-adresse" @@ -540,11 +587,14 @@ msgstr "IP-adresse" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Verdien “%(value)s” må vere anten None, True, eller False." msgid "Boolean (Either True, False or None)" msgstr "Boolsk (True, False eller None)" +msgid "Positive big integer" +msgstr "Positivt stort heiltal" + msgid "Positive integer" msgstr "Positivt heiltal" @@ -555,9 +605,6 @@ msgstr "Positivt lite heiltal" msgid "Slug (up to %(max_length)s)" msgstr "Slug (opp til %(max_length)s)" -msgid "Small integer" -msgstr "Lite heiltal" - msgid "Text" msgstr "Tekst" @@ -566,12 +613,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Verdien “%(value)s” har eit ugyldig format. Det må vere på formen HH:MM[:ss[." +"uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Verdien “%(value)s” har rett format (HH:MM[:ss[.uuuuuu]]), men er eit " +"ugyldig klokkeslett." msgid "Time" msgstr "Tid" @@ -580,14 +631,14 @@ msgid "URL" msgstr "Nettadresse" msgid "Raw binary data" -msgstr "" +msgstr "Rå binærdata" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” er ikkje ein gyldig UUID." msgid "Universally unique identifier" -msgstr "" +msgstr "Universelt unik identifikator." msgid "File" msgstr "Fil" @@ -595,23 +646,29 @@ msgstr "Fil" msgid "Image" msgstr "Bilete" +msgid "A JSON object" +msgstr "Eit JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Verdi må vere gyldig JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "%(model)s-instans med %(field)s %(value)r eksisterer ikkje." msgid "Foreign Key (type determined by related field)" -msgstr "Primærnøkkel (type bestemt av relatert felt)" +msgstr "Fremmednøkkel (type bestemt av relatert felt)" msgid "One-to-one relationship" msgstr "Ein-til-ein-forhold" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "%(from)s-%(to)s-relasjon" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "%(from)s-%(to)s-relasjonar" msgid "Many-to-many relationship" msgstr "Mange-til-mange-forhold" @@ -620,13 +677,13 @@ msgstr "Mange-til-mange-forhold" #. characters will prevent the default label_suffix to be appended to the #. label msgid ":?.!" -msgstr "" +msgstr ":?.!" msgid "This field is required." msgstr "Feltet er påkravd." msgid "Enter a whole number." -msgstr "Oppgje eit heiltall." +msgstr "Oppgje eit heiltal." msgid "Enter a valid date." msgstr "Oppgje ein gyldig dato." @@ -638,11 +695,11 @@ msgid "Enter a valid date/time." msgstr "Oppgje gyldig dato og tidspunkt." msgid "Enter a valid duration." -msgstr "" +msgstr "Oppgje ein gyldig varigskap." #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "Antal dagar må vere mellom {min_days} og {max_days}." msgid "No file was submitted. Check the encoding type on the form." msgstr "Inga fil vart sendt. Sjekk \"encoding\"-typen på skjemaet." @@ -658,7 +715,9 @@ msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." msgid_plural "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." msgstr[0] "" +"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." msgstr[1] "" +"Filnamnet kan ikkje ha fleire enn %(max)d teikn (det har %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "Last enten opp ei fil eller huk av i avkryssingsboksen." @@ -679,33 +738,42 @@ msgid "Enter a list of values." msgstr "Oppgje ei liste med verdiar." msgid "Enter a complete value." -msgstr "" +msgstr "Oppgje ein fullstendig verdi." msgid "Enter a valid UUID." -msgstr "" +msgstr "Oppgje ein gyldig UUID." + +msgid "Enter a valid JSON." +msgstr "Oppgje gyldig JSON." #. Translators: This is the default suffix added to form field labels msgid ":" -msgstr "" +msgstr ":" #, python-format msgid "(Hidden field %(name)s) %(error)s" -msgstr "" +msgstr "(Gøymt felt %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." msgstr "" +"ManagementForm data manglar eller har blitt tukla med. Felt som manglar: " +"%(field_names)s. Du burde kanskje sende ein feilrapport dersom problemet " +"fortset. " #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" +msgid "Please submit at most %d form." +msgid_plural "Please submit at most %d forms." +msgstr[0] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " +msgstr[1] "Ver vennleg å ikkje sende inn fleire enn %d skjema. " #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" +msgid "Please submit at least %d form." +msgid_plural "Please submit at least %d forms." +msgstr[0] "Ver vennleg å sende inn minst %d skjema. " +msgstr[1] "Ver vennleg å sende inn minst %d skjema. " msgid "Order" msgstr "Rekkefølge" @@ -733,20 +801,22 @@ msgid "Please correct the duplicate values below." msgstr "Korriger dei dupliserte verdiane nedanfor." msgid "The inline value did not match the parent instance." -msgstr "" +msgstr "Inline verdien stemmer ikkje overeins med forelder-instansen.  " msgid "Select a valid choice. That choice is not one of the available choices." msgstr "Velg eit gyldig valg. Valget er ikkje eit av dei tilgjengelege valga." #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” er ikkje ein gyldig verdi." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s kunne ikkje bli tolka i tidssona %(current_timezone)s; Verdien " +"er anten tvetydig eller ugyldig." msgid "Clear" msgstr "Tøm" @@ -766,15 +836,7 @@ msgstr "Ja" msgid "No" msgstr "Nei" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nei,kanskje" @@ -1033,12 +1095,12 @@ msgid "December" msgstr "Desember" msgid "This is not a valid IPv6 address." -msgstr "" +msgstr "Dette er ikkje ei gyldig IPv6-adresse." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "eller" @@ -1048,62 +1110,66 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d år" -msgstr[1] "%d år" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d år" +msgstr[1] "%(num)d år" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d månad" -msgstr[1] "%d månader" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d månad" +msgstr[1] "%(num)d månader" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d veke" -msgstr[1] "%d veker" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d veke" +msgstr[1] "%(num)d veker" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dagar" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dagar" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d time" -msgstr[1] "%d timar" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d time" +msgstr[1] "%(num)d timar" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" - -msgid "0 minutes" -msgstr "0 minutt" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minutt" +msgstr[1] "%(num)d minutt" msgid "Forbidden" -msgstr "" +msgstr "Forbydd" msgid "CSRF verification failed. Request aborted." -msgstr "" +msgstr "CSRF-verifikasjon feila. Førespurnad avbrote." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Du ser denne meldinga på grunn av at det ikkje blei sendt nokon \"Referer\" " +"hovud frå din nettlesar, noko denne HTTPS-sida krev. Dette hovudet er eit " +"krav på grunn av sikkerheit, for å hindre at din nettlesar er kapra av " +"tredjepartar. " msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Dersom du har konfigurert nettlesaren din til å deaktiverere \"Referer\"-" +"hovud må du aktivere dei på nytt, i det minste for denne nettsida, eller for " +"HTTPS-tilkoplingar eller for førespurnadar av same opphav. " msgid "" "If you are using the tag or " @@ -1112,26 +1178,38 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Dersom du brukar -taggen " +"eller inkludera \"Referrer-Policy: no-referrer\" hovud, ver vennleg å fjerne " +"dei. CSRF-vern krev \"Referer\" hovud for å gjennomføre strenge kontrollar " +"av referer. Dersom du har bekymringar for personvern bruk alternativ som for lenkjer til tredepartssider" msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." msgstr "" +"Du ser denne meldinga fordi denne nettsida krev ein CSRF informasjonskapsel " +"når du sender inn skjema. Denne informasjonskapselen er eit krav på grunn av " +"sikkerheit, for å forsikre at nettlesaren din ikkje er kapra av " +"tredjepartar. " msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Dersom du har konfigurert nettlesaren din til å deaktivere " +"informasjonskapslar, ver vennleg å aktiver dei på nytt, i det minste for " +"denne nettsida, eller for førespurnader av same opphav. " msgid "More information is available with DEBUG=True." -msgstr "" +msgstr "Meir informasjon er tilgjengeleg med DEBUG=True." msgid "No year specified" msgstr "Årstal ikkje spesifisert" msgid "Date out of range" -msgstr "" +msgstr "Dato er utanfor rekkjevidde" msgid "No month specified" msgstr "Månad ikkje spesifisert" @@ -1156,7 +1234,7 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Ugyldig datostreng \"%(datestr)s\" grunna format \"%(format)s\"" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1164,37 +1242,37 @@ msgstr "Fann ingen %(verbose_name)s som korresponderte med spørringa" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Sida er ikkje \"last\" og den kan heller ikkje konverterast til eit heiltal. " #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" +msgstr "Ugyldig side (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Tom liste og \"%(class_name)s.allow_empty\" er False." msgid "Directory indexes are not allowed here." msgstr "Mappeindeksar er ikkje tillate her." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" eksisterer ikkje" #, python-format msgid "Index of %(directory)s" msgstr "Indeks for %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "Installasjonen var vellykka! Gratulerer!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"Sjå utgjevingsnotat for Django %(version)s" #, python-format msgid "" @@ -1203,21 +1281,25 @@ msgid "" "\">DEBUG=True is in your settings file and you have not configured any " "URLs." msgstr "" +"Du ser denne sida fordi DEBUG=True er i innstillingsfila di og du ikkje har konfigurert noka " +"nettadresser." msgid "Django Documentation" -msgstr "" +msgstr "Django-dokumentasjon" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Tema, referansar, & how-tos" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "Opplæring: Ein avstemmingsapp" msgid "Get started with Django" -msgstr "" +msgstr "Kom i gang med Django" msgid "Django Community" -msgstr "" +msgstr "Django Nettsamfunn" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "Koble, få hjelp, eller bidra" diff --git a/django/conf/locale/nn/formats.py b/django/conf/locale/nn/formats.py index 91dd9e6bb70e..0ddb8fef604f 100644 --- a/django/conf/locale/nn/formats.py +++ b/django/conf/locale/nn/formats.py @@ -2,35 +2,40 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%d.%m.%Y', '%d.%m.%y', # '2006-10-25', '25.10.2006', '25.10.06' - # '%d. %b %Y', '%d %b %Y', # '25. okt 2006', '25 okt 2006' - # '%d. %b. %Y', '%d %b. %Y', # '25. okt. 2006', '25 okt. 2006' - # '%d. %B %Y', '%d %B %Y', # '25. oktober 2006', '25 oktober 2006' + "%Y-%m-%d", # '2006-10-25' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + # "%d. %b %Y", # '25. okt 2006' + # "%d %b %Y", # '25 okt 2006' + # "%d. %b. %Y", # '25. okt. 2006' + # "%d %b. %Y", # '25 okt. 2006' + # "%d. %B %Y", # '25. oktober 2006' + # "%d %B %Y", # '25 oktober 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/pl/LC_MESSAGES/django.mo b/django/conf/locale/pl/LC_MESSAGES/django.mo index 502ffb84d649..56a969979b28 100644 Binary files a/django/conf/locale/pl/LC_MESSAGES/django.mo and b/django/conf/locale/pl/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/pl/LC_MESSAGES/django.po b/django/conf/locale/pl/LC_MESSAGES/django.po index bd13e2c6ce57..7dc17ae2db2e 100644 --- a/django/conf/locale/pl/LC_MESSAGES/django.po +++ b/django/conf/locale/pl/LC_MESSAGES/django.po @@ -1,46 +1,50 @@ # This file is distributed under the same license as the Django package. # # Translators: -# sidewinder , 2014 -# Saibamen , 2015 +# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 +# Adam Stachowicz , 2015 # angularcircle, 2011,2013 # angularcircle, 2011,2013 # angularcircle, 2014 # Dariusz Paluch , 2015 +# Darek, 2022 # Jannis Leidel , 2011 # Janusz Harkot , 2014-2015 # Kacper Krupa , 2013 # Karol , 2012 -# konryd , 2011 -# konryd , 2011 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 # Łukasz Rekucki (lqc) , 2011 -# m_aciek , 2016-2020 -# m_aciek , 2015 +# Maciej Olko , 2016-2021 +# Maciej Olko , 2023 +# Maciej Olko , 2015 +# Mariusz Felisiak , 2020-2021,2023-2024 # Michał Pasternak , 2013 -# p , 2012 +# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 # Piotr Meuś , 2014 -# p , 2012 +# c10516f0462e552b4c3672569f0745a7_cc5cca2 <841826256cd8f47d0e443806a8e56601_19204>, 2012 # Quadric , 2014 # Radek Czajka , 2013 # Radek Czajka , 2013 # Roman Barczyński, 2012 -# sidewinder , 2014 +# 8ffa075ab2f53c280beb2c066769d1ac_169beb5 <462ee687bbf3107fab5af73e8cc690d0_217822>, 2014 # Tomasz Kajtoch , 2016-2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-01 22:45+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Mariusz Felisiak , " +"2020-2021,2023-2024\n" +"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " +"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " +"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" msgid "Afrikaans" msgstr "afrykanerski" @@ -48,6 +52,9 @@ msgstr "afrykanerski" msgid "Arabic" msgstr "arabski" +msgid "Algerian Arabic" +msgstr "algierski arabski" + msgid "Asturian" msgstr "asturyjski" @@ -72,6 +79,9 @@ msgstr "bośniacki" msgid "Catalan" msgstr "kataloński" +msgid "Central Kurdish (Sorani)" +msgstr "sorani" + msgid "Czech" msgstr "czeski" @@ -171,6 +181,9 @@ msgstr "interlingua" msgid "Indonesian" msgstr "indonezyjski" +msgid "Igbo" +msgstr "igbo" + msgid "Ido" msgstr "ido" @@ -201,6 +214,9 @@ msgstr "kannada" msgid "Korean" msgstr "koreański" +msgid "Kyrgyz" +msgstr "kirgiski" + msgid "Luxembourgish" msgstr "luksemburski" @@ -222,6 +238,9 @@ msgstr "mongolski" msgid "Marathi" msgstr "marathi" +msgid "Malay" +msgstr "malajski" + msgid "Burmese" msgstr "birmański" @@ -285,9 +304,15 @@ msgstr "tamilski" msgid "Telugu" msgstr "telugu" +msgid "Tajik" +msgstr "tadżycki" + msgid "Thai" msgstr "tajski" +msgid "Turkmen" +msgstr "turkmeński" + msgid "Turkish" msgstr "turecki" @@ -297,6 +322,9 @@ msgstr "tatarski" msgid "Udmurt" msgstr "udmurcki" +msgid "Uyghur" +msgstr "ujgurski" + msgid "Ukrainian" msgstr "ukraiński" @@ -327,6 +355,11 @@ msgstr "Pliki statyczne" msgid "Syndication" msgstr "Syndykacja treści" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Ten numer strony nie jest liczbą całkowitą" @@ -339,6 +372,9 @@ msgstr "Ta strona nie zawiera wyników" msgid "Enter a valid value." msgstr "Wpisz poprawną wartość." +msgid "Enter a valid domain name." +msgstr "Wpisz poprawną nazwę domeny." + msgid "Enter a valid URL." msgstr "Wpisz poprawny URL." @@ -361,14 +397,18 @@ msgstr "" "Wpisz poprawny „slug” zawierający litery Unicode, cyfry, podkreślenia i " "myślniki." -msgid "Enter a valid IPv4 address." -msgstr "Wprowadź poprawny adres IPv4." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Wpisz poprawny adres %(protocol)s. " -msgid "Enter a valid IPv6 address." -msgstr "Wprowadź poprawny adres IPv6." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Wprowadź poprawny adres IPv4 lub IPv6." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 lub IPv6" msgid "Enter only digits separated by commas." msgstr "Wpisz tylko cyfry oddzielone przecinkami." @@ -385,6 +425,21 @@ msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %(limit_value)s. msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Upewnij się, że ta wartość jest większa lub równa %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Upewnij się, że ta wartość jest wielokrotnością wielkości " +"kroku%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Upewnij się, że ta wartość jest wielokrotnością %(limit_value)s, zaczynają " +"od %(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s i tak " +"dalej." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -478,6 +533,10 @@ msgstr "i" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s z tymi %(field_labels)s już istnieje." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Ograniczenie \"%(name)s\" zostało naruszone." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Wartość %(value)r nie jest poprawnym wyborem." @@ -492,8 +551,8 @@ msgstr "To pole nie może być puste." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Istnieje już %(model_name)s z tą wartością pola %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -520,6 +579,9 @@ msgstr "Wartość logiczna (True lub False – prawda lub fałsz)" msgid "String (up to %(max_length)s)" msgstr "Ciąg znaków (do %(max_length)s znaków)" +msgid "String (unlimited)" +msgstr "Ciąg znaków (bez limitu)" + msgid "Comma-separated integers" msgstr "Liczby całkowite rozdzielone przecinkami" @@ -602,6 +664,9 @@ msgstr "Liczba całkowita" msgid "Big (8 byte) integer" msgstr "Duża liczba całkowita (8 bajtów)" +msgid "Small integer" +msgstr "Mała liczba całkowita" + msgid "IPv4 address" msgstr "adres IPv4" @@ -615,6 +680,9 @@ msgstr "Wartością „%(value)s” musi być None, True lub False." msgid "Boolean (Either True, False or None)" msgstr "Wartość logiczna (True, False, None – prawda, fałsz lub nic)" +msgid "Positive big integer" +msgstr "Dodatnia duża liczba całkowita" + msgid "Positive integer" msgstr "Dodatnia liczba całkowita" @@ -625,9 +693,6 @@ msgstr "Dodatnia mała liczba całkowita" msgid "Slug (up to %(max_length)s)" msgstr "Slug (do %(max_length)s znaków)" -msgid "Small integer" -msgstr "Mała liczba całkowita" - msgid "Text" msgstr "Tekst" @@ -669,6 +734,12 @@ msgstr "Plik" msgid "Image" msgstr "Plik graficzny" +msgid "A JSON object" +msgstr "Obiekt JSON" + +msgid "Value must be valid JSON." +msgstr "Wartość musi być poprawnym JSON-em." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s z polem %(field)s o wartości %(value)r nie istnieje." @@ -767,6 +838,9 @@ msgstr "Wprowadź kompletną wartość." msgid "Enter a valid UUID." msgstr "Wpisz poprawny UUID." +msgid "Enter a valid JSON." +msgstr "Wpisz poprawny JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -775,24 +849,29 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Ukryte pole %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Brakuje danych ManagementForm lub zostały one zmodyfikowane." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Brakuje danych ManagementForm lub zostały one naruszone. Brakujące pola: " +"%(field_names)s. Złóż zgłoszenie błędu, jeśli problem się powtarza." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Proszę wysłać %d lub mniej formularzy." -msgstr[1] "Proszę wysłać %d lub mniej formularze." -msgstr[2] "Proszę wysłać %d lub mniej formularzy." -msgstr[3] "Proszę wysłać %d lub mniej formularzy." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Proszę wysłać co najwyżej %(num)dformularz." +msgstr[1] "Proszę wysłać co najwyżej %(num)d formularze." +msgstr[2] "Proszę wysłać co najwyżej %(num)dformularzy." +msgstr[3] "Proszę wysłać co najwyżej %(num)dformularzy." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Proszę wysłać %d lub więcej formularzy." -msgstr[1] "Proszę wysłać %d lub więcej formularze." -msgstr[2] "Proszę wysłać %d lub więcej formularzy." -msgstr[3] "Proszę wysłać %d lub więcej formularzy." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Proszę wysłać co najmniej %(num)d formularz." +msgstr[1] "Proszę wysłać co najmniej %(num)dformularze." +msgstr[2] "Proszę wysłać co najmniej %(num)d formularzy." +msgstr[3] "Proszę wysłać co najmniej %(num)d formularzy." msgid "Order" msgstr "Kolejność" @@ -855,15 +934,7 @@ msgstr "Tak" msgid "No" msgstr "Nie" -msgid "Year" -msgstr "Rok" - -msgid "Month" -msgstr "Miesiąc" - -msgid "Day" -msgstr "Dzień" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "tak,nie,może" @@ -1139,55 +1210,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d rok" -msgstr[1] "%d lata" -msgstr[2] "%d lat" -msgstr[3] "%d lat" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d rok" +msgstr[1] "%(num)d lata" +msgstr[2] "%(num)d lat" +msgstr[3] "%(num)d roku" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d miesiąc" -msgstr[1] "%d miesiące" -msgstr[2] "%d miesięcy" -msgstr[3] "%d miesięcy" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d miesiąc" +msgstr[1] "%(num)d miesiące" +msgstr[2] "%(num)d miesięcy" +msgstr[3] "%(num)d miesiąca" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d tydzień" -msgstr[1] "%d tygodnie" -msgstr[2] "%d tygodni" -msgstr[3] "%d tygodni" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d tydzień" +msgstr[1] "%(num)d tygodnie" +msgstr[2] "%(num)d tygodni" +msgstr[3] "%(num)d tygodnia" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dzień" -msgstr[1] "%d dni" -msgstr[2] "%d dni" -msgstr[3] "%d dni" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dzień" +msgstr[1] "%(num)d dni" +msgstr[2] "%(num)d dni" +msgstr[3] "%(num)d dnia" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d godzina" -msgstr[1] "%d godziny" -msgstr[2] "%d godzin" -msgstr[3] "%d godzin" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d godzina" +msgstr[1] "%(num)d godziny" +msgstr[2] "%(num)d godzin" +msgstr[3] "%(num)d godziny" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuta" -msgstr[1] "%d minuty" -msgstr[2] "%d minut" -msgstr[3] "%d minut" - -msgid "0 minutes" -msgstr "0 minut" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuta" +msgstr[1] "%(num)d minuty" +msgstr[2] "%(num)d minut" +msgstr[3] "%(num)d minut" msgid "Forbidden" msgstr "Dostęp zabroniony" @@ -1197,14 +1265,14 @@ msgstr "Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" "Widzisz tę wiadomość, ponieważ ta witryna HTTPS wymaga, aby przeglądarka " -"wysłała nagłówek „Referer header”, a żaden nie został wysłany. Nagłówek ten " -"jest wymagany ze względów bezpieczeństwa, aby upewnić się, że Twoja " -"przeglądarka nie została przechwycona przez osoby trzecie." +"wysłała „nagłówek Referer”, a żaden nie został wysłany. Nagłówek ten jest " +"wymagany ze względów bezpieczeństwa, aby upewnić się, że twoja przeglądarka " +"nie została przechwycona przez osoby trzecie." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1219,8 +1287,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Jeśli używasz taga lub " "umieszczasz nagłówek „Referrer-Policy: no-referrer”, prosimy je usunąć. " @@ -1311,8 +1379,8 @@ msgstr "„%(path)s” nie istnieje" msgid "Index of %(directory)s" msgstr "Zawartość %(directory)s " -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: framework WWW dla perfekcjonistów z deadline'ami." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacja przebiegła pomyślnie! Gratulacje!" #, python-format msgid "" @@ -1323,19 +1391,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">informacje o wydaniu dla Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacja przebiegła pomyślnie! Gratulacje!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Widzisz tę stronę, ponieważ w swoim pliku ustawień masz DEBUG=True i nie skonfigurowałeś żadnych URL-i." +"docs.djangoproject.com/en/%(version)s/ref/settings/#debug\" " +"target=\"_blank\" rel=\"noopener\">DEBUG=True i nie skonfigurowałeś " +"żadnych URL-i." msgid "Django Documentation" msgstr "Dokumentacja Django" diff --git a/django/conf/locale/pl/formats.py b/django/conf/locale/pl/formats.py index e66654474725..2ad1bfee4221 100644 --- a/django/conf/locale/pl/formats.py +++ b/django/conf/locale/pl/formats.py @@ -2,27 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j E Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j E Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j E' -SHORT_DATE_FORMAT = 'd-m-Y' -SHORT_DATETIME_FORMAT = 'd-m-Y H:i' +DATE_FORMAT = "j E Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j E Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j E" +SHORT_DATE_FORMAT = "d-m-Y" +SHORT_DATETIME_FORMAT = "d-m-Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - '%y-%m-%d', # '06-10-25' - # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + "%y-%m-%d", # '06-10-25' + # "%d. %B %Y", # '25. października 2006' + # "%d. %b. %Y", # '25. paź. 2006' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = ' ' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = " " NUMBER_GROUPING = 3 diff --git a/django/conf/locale/pt/formats.py b/django/conf/locale/pt/formats.py index b0fbbad903e4..bb4b3f50fb1e 100644 --- a/django/conf/locale/pt/formats.py +++ b/django/conf/locale/pt/formats.py @@ -2,34 +2,38 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y à\s H:i' -YEAR_MONTH_FORMAT = r'F \d\e Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +DATE_FORMAT = r"j \d\e F \d\e Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" +YEAR_MONTH_FORMAT = r"F \d\e Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" FIRST_DAY_OF_WEEK = 0 # Sunday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06' - # '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' - # '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '25 de Outubro, 2006' + "%Y-%m-%d", # '2006-10-25' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + # "%d de %b de %Y", # '25 de Out de 2006' + # "%d de %b, %Y", # '25 Out, 2006' + # "%d de %B de %Y", # '25 de Outubro de 2006' + # "%d de %B, %Y", # '25 de Outubro, 2006' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo index 4531a66ea34d..41fb5016338e 100644 Binary files a/django/conf/locale/pt_BR/LC_MESSAGES/django.mo and b/django/conf/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/django/conf/locale/pt_BR/LC_MESSAGES/django.po index 36c32caeaca1..11ee807b9361 100644 --- a/django/conf/locale/pt_BR/LC_MESSAGES/django.po +++ b/django/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -2,39 +2,52 @@ # # Translators: # Allisson Azevedo , 2014 +# Amanda Savluchinske , 2019 # amcorreia , 2018 # andrewsmedina , 2014-2015 # Arthur Silva , 2017 # bruno.devpod , 2014 # Camilo B. Moreira , 2017 -# Carlos E C Leite - Cadu , 2016,2019 -# Filipe Cifali Stangler , 2016 +# Carlos Cadu “Cadu” Leite , 2020 +# Carlos Cadu “Cadu” Leite , 2016,2019 +# Filipe Cifali , 2016 +# Claudio Rogerio Carvalho Filho , 2020 # dudanogueira , 2012 # dudanogueira , 2019 +# Eduardo Felipe Castegnaro , 2024 # Elyézer Rezende , 2013 # Fábio C. Barrionuevo da Luz , 2014-2015 # Felipe Rodrigues , 2016 -# Filipe Cifali Stangler , 2019 +# Filipe Cifali , 2019 # Gladson , 2013 -# semente, 2011-2014 +# fa9e10542e458baef0599ae856e43651_13d2225, 2011-2014 +# Guilherme , 2022 +# Heron Fonsaca, 2022 +# Hugo Tácito , 2024 # Igor Cavalcante , 2017 # Jannis Leidel , 2011 +# Jonas Rodrigues, 2023 +# Leonardo Gregianin, 2023 # Lucas Infante , 2015 # Luiz Boaretto , 2017 +# Marssal Jr. , 2022 # Marcelo Moro Brondani , 2018 +# Mariusz Felisiak , 2021 +# Rafael Fontenelle , 2021-2022 +# Samuel Nogueira Bacelar , 2020 # Sandro , 2011 # Sergio Garcia , 2015 # Tânia Andrea , 2017 # Wiliam Souza , 2015 -# Xico Petry , 2018 +# Francisco Petry Rauber , 2018 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" +"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" "language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -48,6 +61,9 @@ msgstr "Africânder" msgid "Arabic" msgstr "Árabe" +msgid "Algerian Arabic" +msgstr "Árabe Argelino" + msgid "Asturian" msgstr "Asturiano" @@ -72,6 +88,9 @@ msgstr "Bósnio" msgid "Catalan" msgstr "Catalão" +msgid "Central Kurdish (Sorani)" +msgstr "Curdo Central (Sorâni)" + msgid "Czech" msgstr "Tcheco" @@ -171,6 +190,9 @@ msgstr "Interlíngua" msgid "Indonesian" msgstr "Indonésio" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -201,6 +223,9 @@ msgstr "Canarês" msgid "Korean" msgstr "Coreano" +msgid "Kyrgyz" +msgstr "Quirguiz" + msgid "Luxembourgish" msgstr "Luxemburguês" @@ -222,6 +247,9 @@ msgstr "Mongol" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malaia" + msgid "Burmese" msgstr "Birmanês" @@ -285,9 +313,15 @@ msgstr "Tâmil" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tadjique" + msgid "Thai" msgstr "Tailandês" +msgid "Turkmen" +msgstr "Turcomano" + msgid "Turkish" msgstr "Turco" @@ -297,6 +331,9 @@ msgstr "Tatar" msgid "Udmurt" msgstr "Udmurt" +msgid "Uyghur" +msgstr "Uigur" + msgid "Ukrainian" msgstr "Ucraniano" @@ -304,7 +341,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeque" msgid "Vietnamese" msgstr "Vietnamita" @@ -327,6 +364,11 @@ msgstr "Arquivos Estáticos" msgid "Syndication" msgstr "Syndication" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Esse número de página não é um número inteiro" @@ -339,6 +381,9 @@ msgstr "Essa página não contém resultados" msgid "Enter a valid value." msgstr "Informe um valor válido." +msgid "Enter a valid domain name." +msgstr "Informe um domínio válido." + msgid "Enter a valid URL." msgstr "Informe uma URL válida." @@ -361,14 +406,18 @@ msgstr "" "Informe um “slug” válido tendo letras em Unicode, números, \"underscores\" e " "hífens." -msgid "Enter a valid IPv4 address." -msgstr "Insira um endereço IPv4 válido." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Insira um endereço %(protocol)s válido." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Insira um endereço IPv6 válido." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Insira um endereço IPv4 ou IPv6 válido." +msgid "IPv4 or IPv6" +msgstr "IPv4 ou IPv6" msgid "Enter only digits separated by commas." msgstr "Insira apenas dígitos separados por vírgulas." @@ -385,6 +434,21 @@ msgstr "Certifique-se que este valor seja menor ou igual a %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Certifique-se que este valor seja maior ou igual a %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Certifique-se que este valor seja múltiplo do tamanho do passo " +"%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Certifique-se que este valor seja múltiplo do tamanho do passo " +"%(limit_value)s, começando por %(offset)s, por exemplo %(offset)s, " +"%(valid_value1)s, %(valid_value2)s, e assim por diante." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -398,6 +462,9 @@ msgstr[0] "" msgstr[1] "" "Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " "possui %(show_value)d)." +msgstr[2] "" +"Certifique-se de que o valor tenha no mínimo %(limit_value)d caracteres (ele " +"possui %(show_value)d)." #, python-format msgid "" @@ -412,6 +479,9 @@ msgstr[0] "" msgstr[1] "" "Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " "possui %(show_value)d)." +msgstr[2] "" +"Certifique-se de que o valor tenha no máximo %(limit_value)d caracteres (ele " +"possui %(show_value)d)." msgid "Enter a number." msgstr "Informe um número." @@ -421,12 +491,14 @@ msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." msgstr[0] "Certifique-se de que não tenha mais de %(max)s dígito no total." msgstr[1] "Certifique-se de que não tenha mais de %(max)s dígitos no total." +msgstr[2] "Certifique-se de que não tenha mais de %(max)s dígitos no total." #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." msgstr[0] "Certifique-se de que não tenha mais de %(max)s casa decimal." msgstr[1] "Certifique-se de que não tenha mais de %(max)s casas decimais." +msgstr[2] "Certifique-se de que não tenha mais de %(max)s casas decimais." #, python-format msgid "" @@ -438,6 +510,9 @@ msgstr[0] "" msgstr[1] "" "Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " "decimal." +msgstr[2] "" +"Certifique-se de que não tenha mais de %(max)s dígitos antes do ponto " +"decimal." #, python-format msgid "" @@ -457,6 +532,10 @@ msgstr "e" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s com este %(field_labels)s já existe." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Restrição \"%(name)s\" foi violada." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Valor %(value)r não é uma opção válida." @@ -471,8 +550,8 @@ msgstr "Este campo não pode estar vazio." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s com este %(field_label)s já existe." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -498,6 +577,9 @@ msgstr "Booleano (Verdadeiro ou Falso)" msgid "String (up to %(max_length)s)" msgstr "String (até %(max_length)s)" +msgid "String (unlimited)" +msgstr "String (ilimitado)" + msgid "Comma-separated integers" msgstr "Inteiros separados por vírgula" @@ -505,7 +587,9 @@ msgstr "Inteiros separados por vírgula" msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." -msgstr "%(value)s" +msgstr "" +"O valor \"%(value)s\" tem um formato de data inválido. Deve ser no formato " +"YYYY-MM-DD." #, python-format msgid "" @@ -531,7 +615,7 @@ msgid "" "[TZ]) but it is an invalid date/time." msgstr "" "O valor “%(value)s” está no formato correto. (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) mas em um date/time inválido." +"[TZ]) mas é uma data/hora inválida" msgid "Date (with time)" msgstr "Data (com hora)" @@ -548,7 +632,7 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" -"O valor “%(value)s” está em um formato inválido. IDeve ser no formato [DD] " +"O valor “%(value)s” está em um formato inválido. Deve ser no formato [DD] " "[[HH:]MM:]ss[.uuuuuu]." msgid "Duration" @@ -577,6 +661,9 @@ msgstr "Inteiro" msgid "Big (8 byte) integer" msgstr "Inteiro grande (8 byte)" +msgid "Small integer" +msgstr "Inteiro curto" + msgid "IPv4 address" msgstr "Endereço IPv4" @@ -590,6 +677,9 @@ msgstr "O valor “%(value)s” deve ser None, True ou False." msgid "Boolean (Either True, False or None)" msgstr "Booleano (Verdadeiro, Falso ou Nada)" +msgid "Positive big integer" +msgstr "Inteiro grande positivo" + msgid "Positive integer" msgstr "Inteiro positivo" @@ -600,9 +690,6 @@ msgstr "Inteiro curto positivo" msgid "Slug (up to %(max_length)s)" msgstr "Slug (até %(max_length)s)" -msgid "Small integer" -msgstr "Inteiro curto" - msgid "Text" msgstr "Texto" @@ -644,6 +731,12 @@ msgstr "Arquivo" msgid "Image" msgstr "Imagem" +msgid "A JSON object" +msgstr "Um objeto JSON" + +msgid "Value must be valid JSON." +msgstr "O valor deve ser um JSON válido." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "A instância de %(model)s com %(field)s %(value)r não existe." @@ -712,6 +805,9 @@ msgstr[0] "" msgstr[1] "" "Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " "possui %(length)d)." +msgstr[2] "" +"Certifique-se de que o arquivo tenha no máximo %(max)d caracteres (ele " +"possui %(length)d)." msgid "Please either submit a file or check the clear checkbox, not both." msgstr "Por favor, envie um arquivo ou marque o checkbox, mas não ambos." @@ -736,6 +832,9 @@ msgstr "Insira um valor completo." msgid "Enter a valid UUID." msgstr "Insira um UUID válido." +msgid "Enter a valid JSON." +msgstr "Insira um JSON válido" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -744,20 +843,28 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Campo oculto %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Os dados do ManagementForm não foram encontrados ou foram adulterados" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Dados de ManagementForm estão faltando ou foram adulterados. Campos " +"ausentes: %(field_names)s. Você pode precisar enviar um relatório de bug se " +"o problema persistir." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Por favor envie %d ou menos formulário." -msgstr[1] "Por favor envie %d ou menos formulários." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Por favor, envie no máximo %(num)d formulário." +msgstr[1] "Por favor, envie no máximo %(num)d formulários." +msgstr[2] "Por favor, envie no máximo %(num)d formulários." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Por favor envie %d ou mais formulários." -msgstr[1] "Por favor envie %d ou mais formulários." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Por favor, envie ao menos %(num)d formulário." +msgstr[1] "Por favor, envie ao menos %(num)d formulários." +msgstr[2] "Por favor, envie ao menos %(num)d formulários." msgid "Order" msgstr "Ordem" @@ -821,15 +928,7 @@ msgstr "Sim" msgid "No" msgstr "Não" -msgid "Year" -msgstr "Ano" - -msgid "Month" -msgstr "Mês" - -msgid "Day" -msgstr "Dia" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "sim,não,talvez" @@ -838,6 +937,7 @@ msgid "%(size)d byte" msgid_plural "%(size)d bytes" msgstr[0] "%(size)d byte" msgstr[1] "%(size)d bytes" +msgstr[2] "%(size)d bytes" #, python-format msgid "%s KB" @@ -1093,7 +1193,7 @@ msgstr "Este não é um endereço IPv6 válido." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr " %(truncated_text)s..." +msgstr " %(truncated_text)s…" msgid "or" msgstr "ou" @@ -1103,43 +1203,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d ano" -msgstr[1] "%d anos" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d ano" +msgstr[1] "%(num)d anos" +msgstr[2] "%(num)d anos" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mês" -msgstr[1] "%d meses" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mês" +msgstr[1] "%(num)d meses" +msgstr[2] "%(num)d meses" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d semana" -msgstr[1] "%d semanas" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d semana" +msgstr[1] "%(num)d semanas" +msgstr[2] "%(num)d semanas" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dia" -msgstr[1] "%d dias" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dia" +msgstr[1] "%(num)d dias" +msgstr[2] "%(num)d dias" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hora" -msgstr[1] "%d horas" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hora" +msgstr[1] "%(num)d horas" +msgstr[2] "%(num)d horas" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuto" -msgstr[1] "%d minutos" - -msgid "0 minutes" -msgstr "0 minutos" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutos" +msgstr[2] "%(num)d minutos" msgid "Forbidden" msgstr "Proibido" @@ -1149,14 +1252,14 @@ msgstr "Verificação CSRF falhou. Pedido cancelado." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Você está vendo esta mensagem porque este site HTTPS requer que um “Referer " -"header” seja enviado pelo seu Web browser, mas nenhum foi enviado. Este " -"cabeçalho é requierido por razões de segurança, para assegurar que seu " -"browser não foi sequestrado por terceiros." +"Você está vendo esta mensagem porque este site HTTPS requer que um " +"“cabeçalho Refer” seja enviado pelo seu navegador da web, mas nenhum foi " +"enviado. Este cabeçalho é necessário por motivos de segurança, para garantir " +"que seu navegador não seja invadido por terceiros." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1164,20 +1267,20 @@ msgid "" "origin” requests." msgstr "" "Se você configurou seu browser para desabilitar os cabeçalhos “Referer”, por " -"favor remova-os, ao menos para este site, ou para conexões HTTPS, ou para " +"favor reabilite-os, ao menos para este site, ou para conexões HTTPS, ou para " "requisições “same-origin”." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Se estiver usando a tag ou " "incluindo o cabeçalho “Referrer-Policy: no-referrer”, por favor remova-os. A " "proteção CSRF requer o cabeçalho “Referer” para fazer a checagem de " -"referência. Se estiver preocupado com privacidade, use alternatica como para links de sites de terceiros." msgid "" @@ -1193,9 +1296,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" -"Se você configurou seu browser para desabilitar os cookies, por favor " -"reabilite-os, ao menos para este site ou para requisições do tipo \"same-" -"origin\" (de mesma origem)." +"Se você configurou seu browser para desabilitar cookies, por favor reabilite-" +"os, ao menos para este site ou para requisições do tipo \"same-origin\"." msgid "More information is available with DEBUG=True." msgstr "Mais informações estão disponíveis com DEBUG=True." @@ -1245,7 +1347,7 @@ msgstr "Página inválida (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "Lista vazia e \"%(class_name)s.allow_empty está como False." +msgstr "Lista vazia e o \"%(class_name)s.allow_empty\" está como False." msgid "Directory indexes are not allowed here." msgstr "Índices de diretório não são permitidos aqui." @@ -1258,8 +1360,8 @@ msgstr "\"%(path)s\" não existe" msgid "Index of %(directory)s" msgstr "Índice de %(directory)s " -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: o framework web para perfeccionistas com prazo de entrega." +msgid "The install worked successfully! Congratulations!" +msgstr "A instalação foi com sucesso! Parabéns!" #, python-format msgid "" @@ -1270,20 +1372,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">notas de lançamento do Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "A instalação foi com sucesso! Parabéns!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Você está vendo esta página pois possui DEBUG=True no seu arquivo de configurações e não configurou nenhuma " -"URL." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True no seu arquivo de configurações e não " +"configurou nenhuma URL." msgid "Django Documentation" msgstr "Documentação do Django" diff --git a/django/conf/locale/pt_BR/formats.py b/django/conf/locale/pt_BR/formats.py index ed0c09fc7bf0..96a49b48c7c8 100644 --- a/django/conf/locale/pt_BR/formats.py +++ b/django/conf/locale/pt_BR/formats.py @@ -2,30 +2,33 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j \d\e F \d\e Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'j \d\e F \d\e Y à\s H:i' -YEAR_MONTH_FORMAT = r'F \d\e Y' -MONTH_DAY_FORMAT = r'j \d\e F' -SHORT_DATE_FORMAT = 'd/m/Y' -SHORT_DATETIME_FORMAT = 'd/m/Y H:i' +DATE_FORMAT = r"j \d\e F \d\e Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"j \d\e F \d\e Y à\s H:i" +YEAR_MONTH_FORMAT = r"F \d\e Y" +MONTH_DAY_FORMAT = r"j \d\e F" +SHORT_DATE_FORMAT = "d/m/Y" +SHORT_DATETIME_FORMAT = "d/m/Y H:i" FIRST_DAY_OF_WEEK = 0 # Sunday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - # '%d de %b de %Y', '%d de %b, %Y', # '25 de Out de 2006', '25 Out, 2006' - # '%d de %B de %Y', '%d de %B, %Y', # '25 de Outubro de 2006', '25 de Outubro, 2006' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + # "%d de %b de %Y", # '24 de Out de 2006' + # "%d de %b, %Y", # '25 Out, 2006' + # "%d de %B de %Y", # '25 de Outubro de 2006' + # "%d de %B, %Y", # '25 de Outubro, 2006' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' - '%d/%m/%y %H:%M:%S', # '25/10/06 14:30:59' - '%d/%m/%y %H:%M:%S.%f', # '25/10/06 14:30:59.000200' - '%d/%m/%y %H:%M', # '25/10/06 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' + "%d/%m/%y %H:%M:%S", # '25/10/06 14:30:59' + "%d/%m/%y %H:%M:%S.%f", # '25/10/06 14:30:59.000200' + "%d/%m/%y %H:%M", # '25/10/06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ro/LC_MESSAGES/django.mo b/django/conf/locale/ro/LC_MESSAGES/django.mo index 6d863c2974bf..37e80b0b4ec3 100644 Binary files a/django/conf/locale/ro/LC_MESSAGES/django.mo and b/django/conf/locale/ro/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ro/LC_MESSAGES/django.po b/django/conf/locale/ro/LC_MESSAGES/django.po index 49dc82806071..3b833072aebf 100644 --- a/django/conf/locale/ro/LC_MESSAGES/django.po +++ b/django/conf/locale/ro/LC_MESSAGES/django.po @@ -2,21 +2,21 @@ # # Translators: # Abel Radac , 2017 -# Bogdan Mateescu, 2018-2019 +# Bogdan Mateescu, 2018-2019,2021 # mihneasim , 2011 # Daniel Ursache-Dogariu, 2011 # Denis Darii , 2011,2014 # Ionel Cristian Mărieș , 2012 # Jannis Leidel , 2011 -# Răzvan Ionescu , 2015 +# razvan ionescu , 2015 # Razvan Stefanescu , 2016-2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 05:57+0000\n" -"Last-Translator: Bogdan Mateescu\n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 06:49+0000\n" +"Last-Translator: Bogdan Mateescu, 2018-2019,2021\n" "Language-Team: Romanian (http://www.transifex.com/django/django/language/" "ro/)\n" "MIME-Version: 1.0\n" @@ -32,6 +32,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabă" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Asturiană" @@ -56,6 +59,9 @@ msgstr "Bosniacă" msgid "Catalan" msgstr "Catalană" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Cehă" @@ -155,6 +161,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indoneză" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -185,6 +194,9 @@ msgstr "Limba kannada" msgid "Korean" msgstr "Koreană" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luxemburgheză" @@ -206,6 +218,9 @@ msgstr "Mongolă" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Burmeză" @@ -269,9 +284,15 @@ msgstr "Limba tamila" msgid "Telugu" msgstr "Limba telugu" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tailandeză" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turcă" @@ -311,6 +332,11 @@ msgstr "Fișiere statice" msgid "Syndication" msgstr "Sindicalizare" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "Numărul de pagină nu este întreg" @@ -371,6 +397,10 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Asiguraţi-vă că această valoare este mai mare sau egală cu %(limit_value)s ." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -451,6 +481,10 @@ msgstr "și" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s cu acest %(field_labels)s există deja." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Valoarea %(value)r nu este o opțiune validă." @@ -465,8 +499,8 @@ msgstr "Acest câmp nu poate fi gol." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s cu %(field_label)s deja există." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -493,6 +527,9 @@ msgstr "Boolean (adevărat sau fals)" msgid "String (up to %(max_length)s)" msgstr "Şir de caractere (cel mult %(max_length)s caractere)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Numere întregi separate de virgule" @@ -565,6 +602,9 @@ msgstr "Întreg" msgid "Big (8 byte) integer" msgstr "Întreg mare (8 octeți)" +msgid "Small integer" +msgstr "Întreg mic" + msgid "IPv4 address" msgstr "Adresă IPv4" @@ -578,6 +618,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Boolean (adevărat, fals sau niciuna)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Întreg pozitiv" @@ -588,9 +631,6 @@ msgstr "Întreg pozitiv mic" msgid "Slug (up to %(max_length)s)" msgstr "Slug (până la %(max_length)s)" -msgid "Small integer" -msgstr "Întreg mic" - msgid "Text" msgstr "Text" @@ -628,6 +668,12 @@ msgstr "Fișier" msgid "Image" msgstr "Imagine" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Instanța %(model)s cu %(field)s %(value)r inexistentă." @@ -725,6 +771,9 @@ msgstr "Introduceți o valoare completă." msgid "Enter a valid UUID." msgstr "Introduceți un UUID valid." +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -733,22 +782,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Câmp ascuns %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Datele pentru ManagementForm lipsesc sau au fost alterate" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Trimiteți maxim %d formular." -msgstr[1] "Trimiteți maxim %d formulare." -msgstr[2] "Trimiteți maxim %d de formulare." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Trimiteți minim %d formular." -msgstr[1] "Trimiteți minim %d formulare." -msgstr[2] "Trimiteți minim %d de formulare." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Order" msgstr "Ordine" @@ -811,15 +863,7 @@ msgstr "Da" msgid "No" msgstr "Nu" -msgid "Year" -msgstr "Anul" - -msgid "Month" -msgstr "Luna" - -msgid "Day" -msgstr "Ziua" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "da,nu,poate" @@ -1094,49 +1138,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d an" -msgstr[1] "%d ani" -msgstr[2] "%d de ani" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d an" +msgstr[1] "%(num)d ani" +msgstr[2] "%(num)d de ani" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d lună" -msgstr[1] "%d luni" -msgstr[2] "%d de luni" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d lună" +msgstr[1] "%(num)d luni" +msgstr[2] "%(num)d de luni" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d săptămână" -msgstr[1] "%d săptămâni" -msgstr[2] "%d de săptămâni" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d săptămână" +msgstr[1] "%(num)d săptămâni" +msgstr[2] "%(num)d de săptămâni" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d zi" -msgstr[1] "%d zile" -msgstr[2] "%d de zile" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d zi" +msgstr[1] "%(num)d zile" +msgstr[2] "%(num)d de zile" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d oră" -msgstr[1] "%d ore" -msgstr[2] "%d de ore" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d oră" +msgstr[1] "%(num)d ore" +msgstr[2] "%(num)d de ore" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minute" -msgstr[2] "%d de minute" - -msgid "0 minutes" -msgstr "0 minute" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minute" +msgstr[2] "%(num)d de minute" msgid "Forbidden" msgstr "Interzis" @@ -1146,7 +1187,7 @@ msgstr "Verificarea CSRF nereușită. Cerere eșuată." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1161,8 +1202,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" msgid "" @@ -1239,8 +1280,8 @@ msgstr "" msgid "Index of %(directory)s" msgstr "Index pentru %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Framework-ul web pentru perfecționiști cu termene limită." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalarea a funcționat cu succes! Felicitări!" #, python-format msgid "" @@ -1251,19 +1292,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">notele de lansare pentru Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalarea a funcționat cu succes! Felicitări!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Vedeți această pagină deoarece DEBUG=True este în fișierul de setări și nu ați configurat niciun URL." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True este în fișierul de setări și nu ați " +"configurat niciun URL." msgid "Django Documentation" msgstr "Documentația Django" diff --git a/django/conf/locale/ro/formats.py b/django/conf/locale/ro/formats.py index 8cefeb839595..5a0c173f0b99 100644 --- a/django/conf/locale/ro/formats.py +++ b/django/conf/locale/ro/formats.py @@ -2,34 +2,34 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j F Y, H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y, H:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y, H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y, H:i" FIRST_DAY_OF_WEEK = 1 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', - '%d.%b.%Y', - '%d %B %Y', - '%A, %d %B %Y', + "%d.%m.%Y", + "%d.%b.%Y", + "%d %B %Y", + "%A, %d %B %Y", ] TIME_INPUT_FORMATS = [ - '%H:%M', - '%H:%M:%S', - '%H:%M:%S.%f', + "%H:%M", + "%H:%M:%S", + "%H:%M:%S.%f", ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y, %H:%M', - '%d.%m.%Y, %H:%M:%S', - '%d.%B.%Y, %H:%M', - '%d.%B.%Y, %H:%M:%S', + "%d.%m.%Y, %H:%M", + "%d.%m.%Y, %H:%M:%S", + "%d.%B.%Y, %H:%M", + "%d.%B.%Y, %H:%M:%S", ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ru/LC_MESSAGES/django.mo b/django/conf/locale/ru/LC_MESSAGES/django.mo index 6874630380b6..138118e11aa2 100644 Binary files a/django/conf/locale/ru/LC_MESSAGES/django.mo and b/django/conf/locale/ru/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ru/LC_MESSAGES/django.po b/django/conf/locale/ru/LC_MESSAGES/django.po index a41a807487f3..1766d19521b6 100644 --- a/django/conf/locale/ru/LC_MESSAGES/django.po +++ b/django/conf/locale/ru/LC_MESSAGES/django.po @@ -7,32 +7,37 @@ # Dimmus , 2011 # eigrad , 2012 # Eugene , 2013 +# Eugene Morozov , 2021 # eXtractor , 2015 +# crazyzubr , 2020 # Igor Melnyk, 2014 # Ivan Khomutov , 2017 # Jannis Leidel , 2011 # lilo.panic, 2016 # Mikhail Zholobov , 2013 -# Nikolay Korotkiy , 2018 +# Nikolay Korotkiy , 2018 +# Panasoft, 2021 # Вася Аникин , 2017 -# Алексей Борискин , 2013-2017,2019 -# Дмитрий Шатера , 2016,2018 +# SeryiMysh , 2020 +# Алексей Борискин , 2013-2017,2019-2020,2022-2024 +# Bobsans , 2016,2018 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Алексей Борискин , " +"2013-2017,2019-2020,2022-2024\n" +"Language-Team: Russian (http://app.transifex.com/django/django/language/" "ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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" +"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" msgid "Afrikaans" msgstr "Бурский" @@ -40,6 +45,9 @@ msgstr "Бурский" msgid "Arabic" msgstr "Арабский" +msgid "Algerian Arabic" +msgstr "Алжирский арабский" + msgid "Asturian" msgstr "Астурийский" @@ -64,6 +72,9 @@ msgstr "Боснийский" msgid "Catalan" msgstr "Каталанский" +msgid "Central Kurdish (Sorani)" +msgstr "Центральнокурдский (Сорани)" + msgid "Czech" msgstr "Чешский" @@ -163,6 +174,9 @@ msgstr "Интерлингва" msgid "Indonesian" msgstr "Индонезийский" +msgid "Igbo" +msgstr "Игбо" + msgid "Ido" msgstr "Идо" @@ -193,6 +207,9 @@ msgstr "Каннада" msgid "Korean" msgstr "Корейский" +msgid "Kyrgyz" +msgstr "Киргизский" + msgid "Luxembourgish" msgstr "Люксембургский" @@ -214,6 +231,9 @@ msgstr "Монгольский" msgid "Marathi" msgstr "Маратхи" +msgid "Malay" +msgstr "Малайский" + msgid "Burmese" msgstr "Бирманский" @@ -277,9 +297,15 @@ msgstr "Тамильский" msgid "Telugu" msgstr "Телугу" +msgid "Tajik" +msgstr "Таджикский" + msgid "Thai" msgstr "Тайский" +msgid "Turkmen" +msgstr "Туркменский" + msgid "Turkish" msgstr "Турецкий" @@ -289,6 +315,9 @@ msgstr "Татарский" msgid "Udmurt" msgstr "Удмуртский" +msgid "Uyghur" +msgstr "Уйгурский" + msgid "Ukrainian" msgstr "Украинский" @@ -296,7 +325,7 @@ msgid "Urdu" msgstr "Урду" msgid "Uzbek" -msgstr "" +msgstr "Узбекский" msgid "Vietnamese" msgstr "Вьетнамский" @@ -319,6 +348,11 @@ msgstr "Статические файлы" msgid "Syndication" msgstr "Ленты новостей" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Номер страницы не является натуральным числом" @@ -331,6 +365,9 @@ msgstr "Страница не содержит результатов" msgid "Enter a valid value." msgstr "Введите правильное значение." +msgid "Enter a valid domain name." +msgstr "Введите правильное имя домена." + msgid "Enter a valid URL." msgstr "Введите правильный URL." @@ -344,20 +381,28 @@ msgstr "Введите правильный адрес электронной п msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Значение должно состоять только из латинских букв, цифр, знаков " +"подчеркивания или дефиса." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Значение должно состоять только из символов входящих в стандарт Юникод, " +"цифр, символов подчёркивания или дефисов." -msgid "Enter a valid IPv4 address." -msgstr "Введите правильный IPv4 адрес." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Введите правильный адрес %(protocol)s." -msgid "Enter a valid IPv6 address." -msgstr "Введите действительный IPv6 адрес." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Введите действительный IPv4 или IPv6 адрес." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 или IPv6" msgid "Enter only digits separated by commas." msgstr "Введите цифры, разделенные запятыми." @@ -375,6 +420,19 @@ msgstr "Убедитесь, что это значение меньше либо msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Убедитесь, что это значение больше либо равно %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Убедитесь, что это значение кратно числу %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Убедитесь, что данное значение отстоит от %(offset)s на число, кратное шагу " +"%(limit_value)s, например: %(offset)s, %(valid_value1)s, %(valid_value2)s и " +"так далее." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -449,6 +507,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Расширение файлов “%(extension)s” не поддерживается. Разрешенные расширения: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Данные содержат запрещённый символ: ноль-байт" @@ -461,6 +521,10 @@ msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "" "%(model_name)s с такими значениями полей %(field_labels)s уже существует." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Нарушено ограничение \"%(name)s\"." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Значения %(value)r нет среди допустимых вариантов." @@ -475,8 +539,8 @@ msgstr "Это поле не может быть пустым." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s с таким %(field_label)s уже существует." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -490,11 +554,11 @@ msgstr "Поле типа %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Значение “%(value)s” должно быть True или False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Значение “%(value)s” должно быть True, False или None." msgid "Boolean (Either True or False)" msgstr "Логическое (True или False)" @@ -503,6 +567,9 @@ msgstr "Логическое (True или False)" msgid "String (up to %(max_length)s)" msgstr "Строка (до %(max_length)s)" +msgid "String (unlimited)" +msgstr "Строка (неограниченной длины)" + msgid "Comma-separated integers" msgstr "Целые, разделенные запятыми" @@ -511,12 +578,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Значение “%(value)s” имеет неверный формат даты. Оно должно быть в формате " +"YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD), но это " +"недействительная дата." msgid "Date (without time)" msgstr "Дата (без указания времени)" @@ -526,19 +597,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате YYYY-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Значение “%(value)s” имеет корректный формат (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), но это недействительные дата/время." msgid "Date (with time)" msgstr "Дата (с указанием времени)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Значение “%(value)s” должно быть десятичным числом." msgid "Decimal number" msgstr "Число с фиксированной запятой" @@ -548,6 +623,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате [DD] " +"[HH:[MM:]]ss[.uuuuuu]." msgid "Duration" msgstr "Продолжительность" @@ -560,14 +637,14 @@ msgstr "Путь к файлу" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Значение “%(value)s” должно быть числом с плавающей точкой." msgid "Floating point number" msgstr "Число с плавающей запятой" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Значение “%(value)s” должно быть целым числом." msgid "Integer" msgstr "Целое" @@ -575,6 +652,9 @@ msgstr "Целое" msgid "Big (8 byte) integer" msgstr "Длинное целое (8 байт)" +msgid "Small integer" +msgstr "Малое целое число" + msgid "IPv4 address" msgstr "IPv4 адрес" @@ -583,11 +663,14 @@ msgstr "IP-адрес" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Значение “%(value)s” должно быть None, True или False." msgid "Boolean (Either True, False or None)" msgstr "Логическое (True, False или None)" +msgid "Positive big integer" +msgstr "Положительное большое целое число" + msgid "Positive integer" msgstr "Положительное целое число" @@ -598,9 +681,6 @@ msgstr "Положительное малое целое число" msgid "Slug (up to %(max_length)s)" msgstr "Слаг (до %(max_length)s)" -msgid "Small integer" -msgstr "Малое целое число" - msgid "Text" msgstr "Текст" @@ -609,12 +689,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Значение “%(value)s” имеет неверный формат. Оно должно быть в формате HH:MM[:" +"ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Значение “%(value)s” имеет корректный формат (HH:MM[:ss[.uuuuuu]]), но это " +"недействительное время." msgid "Time" msgstr "Время" @@ -627,7 +711,7 @@ msgstr "Необработанные двоичные данные" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "Значение “%(value)s” не является верным UUID-ом." msgid "Universally unique identifier" msgstr "Поле для UUID, универсального уникального идентификатора" @@ -638,6 +722,12 @@ msgstr "Файл" msgid "Image" msgstr "Изображение" +msgid "A JSON object" +msgstr "JSON-объект" + +msgid "Value must be valid JSON." +msgstr "Значение должно быть корректным JSON-ом." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -656,7 +746,7 @@ msgstr "Связь %(from)s-%(to)s" #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "Связьи %(from)s-%(to)s" +msgstr "Связи %(from)s-%(to)s" msgid "Many-to-many relationship" msgstr "Связь \"многие ко многим\"" @@ -740,6 +830,9 @@ msgstr "Введите весь список значений." msgid "Enter a valid UUID." msgstr "Введите правильный UUID." +msgid "Enter a valid JSON." +msgstr "Введите корректный JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -748,24 +841,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Скрытое поле %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Данные управляющей формы отсутствуют или были повреждены" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Данные ManagementForm отсутствуют или были подделаны. Отсутствующие поля: " +"%(field_names)s. Если проблема не исчезнет, вам может потребоваться " +"отправить отчет об ошибке." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Пожалуйста, заполните не более %d формы." -msgstr[1] "Пожалуйста, заполните не более %d форм." -msgstr[2] "Пожалуйста, заполните не более %d форм." -msgstr[3] "Пожалуйста, заполните не более %d форм." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Пожалуйста, отправьте не больше %(num)d формы." +msgstr[1] "Пожалуйста, отправьте не больше %(num)d форм." +msgstr[2] "Пожалуйста, отправьте не больше %(num)d форм." +msgstr[3] "Пожалуйста, отправьте не больше %(num)d форм." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Пожалуйста, отправьте как минимум %d форму." -msgstr[1] "Пожалуйста, отправьте как минимум %d формы." -msgstr[2] "Пожалуйста, отправьте как минимум %d форм." -msgstr[3] "Пожалуйста, отправьте как минимум %d форм." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Пожалуйста, отправьте %(num)d форму." +msgstr[1] "Пожалуйста, отправьте %(num)d формы." +msgstr[2] "Пожалуйста, отправьте %(num)d форм." +msgstr[3] "Пожалуйста, отправьте %(num)d форм." msgid "Order" msgstr "Порядок" @@ -802,13 +901,16 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” является неверным значением." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s не может быть интерпретирована в часовом поясе " +"%(current_timezone)s; дата может быть неоднозначной или оказаться " +"несуществующей." msgid "Clear" msgstr "Очистить" @@ -828,15 +930,7 @@ msgstr "Да" msgid "No" msgstr "Нет" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "да,нет,может быть" @@ -1112,55 +1206,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d год" -msgstr[1] "%d года" -msgstr[2] "%d лет" -msgstr[3] "%d лет" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d год" +msgstr[1] "%(num)d года" +msgstr[2] "%(num)d лет" +msgstr[3] "%(num)d лет" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месяц" -msgstr[1] "%d месяца" -msgstr[2] "%d месяцев" -msgstr[3] "%d месяцев" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d месяц" +msgstr[1] "%(num)d месяца" +msgstr[2] "%(num)d месяцев" +msgstr[3] "%(num)d месяцев" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d неделя" -msgstr[1] "%d недели" -msgstr[2] "%d недель" -msgstr[3] "%d недель" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d неделя" +msgstr[1] "%(num)d недели" +msgstr[2] "%(num)d недель" +msgstr[3] "%(num)d недель" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d день" -msgstr[1] "%d дня" -msgstr[2] "%d дней" -msgstr[3] "%d дней" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d день" +msgstr[1] "%(num)d дня" +msgstr[2] "%(num)d дней" +msgstr[3] "%(num)d дней" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d час" -msgstr[1] "%d часа" -msgstr[2] "%d часов" -msgstr[3] "%d часов" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d час" +msgstr[1] "%(num)d часа" +msgstr[2] "%(num)d часов" +msgstr[3] "%(num)d часов" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минута" -msgstr[1] "%d минуты" -msgstr[2] "%d минут" -msgstr[3] "%d минут" - -msgid "0 minutes" -msgstr "0 минут" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минута" +msgstr[1] "%(num)d минуты" +msgstr[2] "%(num)d минут" +msgstr[3] "%(num)d минут" msgid "Forbidden" msgstr "Ошибка доступа" @@ -1170,24 +1261,40 @@ msgstr "Ошибка проверки CSRF. Запрос отклонён." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Вы видите это сообщение потому что этот сайт работает по защищённому " +"протоколу HTTPS и требует, чтобы при запросе вашим браузером был передан " +"заголовок \"Referer\", но он не был передан. Этот заголовок необходим из " +"соображений безопасности: мы должны убедиться что запрос оправляете именно " +"вы." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Если вы настроили свой браузер таким образом, чтобы запретить ему передавать " +"заголовок “Referer”, пожалуйста, разрешите ему отсылать данный заголовок по " +"крайней мере для данного сайта, или для всех HTTPS-соединений, или для " +"запросов, домен и порт назначения совпадают с доменом и портом текущей " +"страницы." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Если Вы используете HTML-тэг или добавили HTTP-заголовок “Referrer-Policy: no-referrer”, " +"пожалуйста удалите их. CSRF защите необходим заголовок “Referer” для строгой " +"проверки адреса ссылающейся страницы. Если Вы беспокоитесь о приватности, " +"используйте альтернативы, например , для ссылок на " +"сайты третьих лиц." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1203,6 +1310,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Если в вашем браузере отключены cookie, пожалуйста, включите эту функцию " +"вновь, по крайней мере для этого сайта, или для \"same-orign\" запросов." msgid "More information is available with DEBUG=True." msgstr "" @@ -1239,6 +1348,8 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Не удалось распознать строку с датой “%(datestr)s”, в заданном формате " +"“%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1246,6 +1357,8 @@ msgstr "Не найден ни один %(verbose_name)s, соответству msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Номер страницы не содержит особое значение “last” и его не удалось " +"преобразовать к целому числу." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1254,20 +1367,22 @@ msgstr "Неправильная страница (%(page_number)s): %(message)s #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" +"Список пуст, но “%(class_name)s.allow_empty” выставлено в значение \"Ложь\", " +"что запрещает показывать пустые списки." msgid "Directory indexes are not allowed here." msgstr "Просмотр списка файлов директории здесь не разрешен." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” не существует" #, python-format msgid "Index of %(directory)s" msgstr "Список файлов директории %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: веб-фреймворк для перфекционистов с дедлайнами." +msgid "The install worked successfully! Congratulations!" +msgstr "Установка прошла успешно! Поздравляем!" #, python-format msgid "" @@ -1275,29 +1390,26 @@ msgid "" "target=\"_blank\" rel=\"noopener\">release notes for Django %(version)s" msgstr "" "Посмотреть замечания к выпуску для Django " +"\" target=\"_blank\" rel=\"noopener\">примечания к выпуску для Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Установка прошла успешно! Поздравляем!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Вы видите данную страницу, потому что указали DEBUG=True в файле настроек и не настроили ни одного " +"djangoproject.com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True в файле настроек и не настроили ни одного " "обработчика URL-адресов." msgid "Django Documentation" msgstr "Документация Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Разделы, справочник, & примеры" msgid "Tutorial: A Polling App" msgstr "Руководство: Приложение для голосования" diff --git a/django/conf/locale/ru/formats.py b/django/conf/locale/ru/formats.py index c601c3e51a3a..212e5267d04c 100644 --- a/django/conf/locale/ru/formats.py +++ b/django/conf/locale/ru/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j E Y г.' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j E Y г. G:i' -YEAR_MONTH_FORMAT = 'F Y г.' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j E Y г." +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j E Y г. G:i" +YEAR_MONTH_FORMAT = "F Y г." +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sk/LC_MESSAGES/django.mo b/django/conf/locale/sk/LC_MESSAGES/django.mo index b5793704a9af..ddfe767cc944 100644 Binary files a/django/conf/locale/sk/LC_MESSAGES/django.mo and b/django/conf/locale/sk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sk/LC_MESSAGES/django.po b/django/conf/locale/sk/LC_MESSAGES/django.po index 106b5f29d695..e245cb14c577 100644 --- a/django/conf/locale/sk/LC_MESSAGES/django.po +++ b/django/conf/locale/sk/LC_MESSAGES/django.po @@ -1,19 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Adam Zahradník, 2023-2024 # Jannis Leidel , 2011 -# Juraj Bubniak , 2012-2013 +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 # Marian Andre , 2013,2015,2017-2018 -# Martin Kosír, 2011 -# Martin Tóth , 2017 +# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 +# Martin Tóth , 2017,2023 +# Miroslav Bendik , 2023 +# Peter Kuma, 2021 +# Peter Stríž , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Adam Zahradník, 2023-2024\n" +"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -27,6 +31,9 @@ msgstr "afrikánsky" msgid "Arabic" msgstr "arabský" +msgid "Algerian Arabic" +msgstr "alžírsky arabsky" + msgid "Asturian" msgstr "astúrsky" @@ -51,6 +58,9 @@ msgstr "bosniansky" msgid "Catalan" msgstr "katalánsky" +msgid "Central Kurdish (Sorani)" +msgstr "stredná kurdčina (Sorani)" + msgid "Czech" msgstr "česky" @@ -142,7 +152,7 @@ msgid "Hungarian" msgstr "maďarsky" msgid "Armenian" -msgstr "" +msgstr "arménsky" msgid "Interlingua" msgstr "interlinguánsky" @@ -150,6 +160,9 @@ msgstr "interlinguánsky" msgid "Indonesian" msgstr "indonézsky" +msgid "Igbo" +msgstr "igbožsky" + msgid "Ido" msgstr "ido" @@ -180,6 +193,9 @@ msgstr "kannadsky" msgid "Korean" msgstr "kórejsky" +msgid "Kyrgyz" +msgstr "kirgizsky" + msgid "Luxembourgish" msgstr "luxembursky" @@ -201,6 +217,9 @@ msgstr "mongolsky" msgid "Marathi" msgstr "maráthsky" +msgid "Malay" +msgstr "malajčina" + msgid "Burmese" msgstr "barmsky" @@ -264,9 +283,15 @@ msgstr "tamilsky" msgid "Telugu" msgstr "telugsky" +msgid "Tajik" +msgstr "tadžiksky" + msgid "Thai" msgstr "thajsky" +msgid "Turkmen" +msgstr "turkménsky" + msgid "Turkish" msgstr "turecky" @@ -276,6 +301,9 @@ msgstr "tatársky" msgid "Udmurt" msgstr "udmurtsky" +msgid "Uyghur" +msgstr "ujgursky" + msgid "Ukrainian" msgstr "ukrajinsky" @@ -283,7 +311,7 @@ msgid "Urdu" msgstr "urdsky" msgid "Uzbek" -msgstr "" +msgstr "uzbecky" msgid "Vietnamese" msgstr "vietnamsky" @@ -306,6 +334,11 @@ msgstr "Statické Súbory" msgid "Syndication" msgstr "Syndikácia" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Číslo stránky nie je celé číslo" @@ -318,6 +351,9 @@ msgstr "Stránka neobsahuje žiadne výsledky" msgid "Enter a valid value." msgstr "Zadajte platnú hodnotu." +msgid "Enter a valid domain name." +msgstr "Zadajte platný názov domény." + msgid "Enter a valid URL." msgstr "Zadajte platnú URL adresu." @@ -331,20 +367,28 @@ msgstr "Zadajte platnú e-mailovú adresu." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Zadajte platnú skratku pozostávajúcu z písmen, čísel, podčiarkovníkov alebo " +"pomlčiek." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Zadajte platnú skratku pozostávajúcu z písmen Unicode, čísel, " +"podčiarkovníkov alebo pomlčiek." -msgid "Enter a valid IPv4 address." -msgstr "Zadajte platnú IPv4 adresu." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Zadajte platnú %(protocol)s adresu." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Zadajte platnú IPv6 adresu." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Zadajte platnú IPv4 alebo IPv6 adresu." +msgid "IPv4 or IPv6" +msgstr "IPv4 alebo IPv6" msgid "Enter only digits separated by commas." msgstr "Zadajte len číslice oddelené čiarkami." @@ -361,6 +405,18 @@ msgstr "Uistite sa, že táto hodnota je menšia alebo rovná %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Uistite sa, že hodnota je väčšia alebo rovná %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Uistite sa, že táto hodnota je násobkom %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Uistite sa, že táto hodnota je násobkom %(limit_value)s, začínajúc od " +"%(offset)s, t.j. %(offset)s, %(valid_value1)s, %(valid_value2)s, atď." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -443,6 +499,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Prípona súboru „%(extension)s“ nie je povolená. Povolené prípony sú: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Znaky NULL nie sú povolené." @@ -454,6 +512,10 @@ msgstr "a" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s s týmto %(field_labels)s už existuje." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Obmedzenie „%(name)s“ je porušené." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Hodnota %(value)r nie je platná možnosť." @@ -468,13 +530,13 @@ msgstr "Toto pole nemôže byť prázdne." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s s týmto %(field_label)s už existuje." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." msgstr "" -"%(field_label)s musí byť unikátne pre %(date_field_label)s %(lookup_type)s." +"%(field_label)s musí byť jedinečné pre %(date_field_label)s %(lookup_type)s." #, python-format msgid "Field of type: %(field_type)s" @@ -482,11 +544,11 @@ msgstr "Pole typu: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť True alebo False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť True, False alebo None." msgid "Boolean (Either True or False)" msgstr "Logická hodnota (buď True alebo False)" @@ -495,6 +557,9 @@ msgstr "Logická hodnota (buď True alebo False)" msgid "String (up to %(max_length)s)" msgstr "Reťazec (až do %(max_length)s)" +msgid "String (unlimited)" +msgstr "Reťazec (neobmedzený)" + msgid "Comma-separated integers" msgstr "Celé čísla oddelené čiarkou" @@ -503,12 +568,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"Hodnota „%(value)s“ má neplatný tvar dátumu. Musí byť v tvare YYYY-MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD), ale je to neplatný " +"dátum." msgid "Date (without time)" msgstr "Dátum (bez času)" @@ -518,19 +586,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare YYYY-MM-DD HH:MM[:" +"ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"Hodnota „%(value)s“ je v správnom tvare (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]), ale je to neplatný dátum/čas." msgid "Date (with time)" msgstr "Dátum (a čas)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." msgid "Decimal number" msgstr "Desatinné číslo" @@ -540,6 +612,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare [DD] [[HH:]MM:]ss[." +"uuuuuu]." msgid "Duration" msgstr "Doba trvania" @@ -552,14 +626,14 @@ msgstr "Cesta k súboru" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť desatinné číslo." msgid "Floating point number" msgstr "Číslo s plávajúcou desatinnou čiarkou" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť celé číslo." msgid "Integer" msgstr "Celé číslo" @@ -567,6 +641,9 @@ msgstr "Celé číslo" msgid "Big (8 byte) integer" msgstr "Veľké celé číslo (8 bajtov)" +msgid "Small integer" +msgstr "Malé celé číslo" + msgid "IPv4 address" msgstr "IPv4 adresa" @@ -575,11 +652,14 @@ msgstr "IP adresa" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Hodnota „%(value)s“ musí byť buď None, True alebo False." msgid "Boolean (Either True, False or None)" msgstr "Logická hodnota (buď True, False alebo None)" +msgid "Positive big integer" +msgstr "Veľké kladné celé číslo" + msgid "Positive integer" msgstr "Kladné celé číslo" @@ -590,9 +670,6 @@ msgstr "Malé kladné celé číslo" msgid "Slug (up to %(max_length)s)" msgstr "Identifikátor (najviac %(max_length)s)" -msgid "Small integer" -msgstr "Malé celé číslo" - msgid "Text" msgstr "Text" @@ -601,12 +678,15 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Hodnota „%(value)s“ má neplatný tvar. Musí byť v tvare HH:MM[:ss[.uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Hodnota „%(value)s“ je v správnom tvare (HH:MM[:ss[.uuuuuu]]), ale je to " +"neplatný čas." msgid "Time" msgstr "Čas" @@ -619,10 +699,10 @@ msgstr "Binárne údaje" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "„%(value)s“ nie je platné UUID." msgid "Universally unique identifier" -msgstr "" +msgstr "Všeobecne jedinečný identifikátor" msgid "File" msgstr "Súbor" @@ -630,6 +710,12 @@ msgstr "Súbor" msgid "Image" msgstr "Obrázok" +msgid "A JSON object" +msgstr "Objekt typu JSON" + +msgid "Value must be valid JSON." +msgstr "Hodnota musí byť v platnom formáte JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Inštancia modelu %(model)s s %(field)s %(value)r neexistuje." @@ -642,7 +728,7 @@ msgstr "Typ relácie: jedna k jednej" #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "vzťah: %(from)s-%(to)s " +msgstr "vzťah: %(from)s-%(to)s" #, python-format msgid "%(from)s-%(to)s relationships" @@ -726,6 +812,9 @@ msgstr "Zadajte úplnú hodnotu." msgid "Enter a valid UUID." msgstr "Zadajte platné UUID." +msgid "Enter a valid JSON." +msgstr "Zadajte platný JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -734,24 +823,30 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Skryté pole %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Údaje ManagementForm chýbajú alebo boli sfalšované" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Dáta ManagementForm chýbajú alebo boli zmanipulované. Chýbajúce polia: " +"%(field_names)s. Možno budete musieť túto chybu nahlásiť, ak sa bude naďalej " +"vyskytovať." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Prosím odošlite %d alebo menej formulárov." -msgstr[1] "Prosím odošlite %d alebo menej formulárov." -msgstr[2] "Prosím odošlite %d alebo menej formulárov." -msgstr[3] "Prosím odošlite %d alebo menej formulárov." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Prosím, odošlite najviac %(num)d formulár." +msgstr[1] "Prosím, odošlite najviac %(num)d formuláre." +msgstr[2] "Prosím, odošlite najviac %(num)d formulárov." +msgstr[3] "Prosím, odošlite najviac %(num)d formulárov." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Prosím odošlite %d alebo viac formulárov." -msgstr[1] "Prosím odošlite %d alebo viac formulárov." -msgstr[2] "Prosím odošlite %d alebo viac formulárov." -msgstr[3] "Prosím odošlite %d alebo viac formulárov." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Prosím, odošlite aspoň %(num)d formulár." +msgstr[1] "Prosím, odošlite aspoň %(num)d formuláre." +msgstr[2] "Prosím, odošlite aspoň %(num)d formulárov." +msgstr[3] "Prosím, odošlite aspoň %(num)d formulárov." msgid "Order" msgstr "Poradie" @@ -765,15 +860,15 @@ msgstr "Prosím, opravte duplicitné údaje pre %(field)s." #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "Údaje pre %(field)s musia byť unikátne, prosím, opravte duplikáty." +msgstr "Údaje pre %(field)s musia byť jedinečné, prosím, opravte duplikáty." #, python-format msgid "" "Please correct the duplicate data for %(field_name)s which must be unique " "for the %(lookup)s in %(date_field)s." msgstr "" -"Údaje pre %(field_name)s musia byť unikátne pre %(lookup)s v %(date_field)s, " -"prosím, opravte duplikáty." +"Údaje pre %(field_name)s musia byť jedinečné pre %(lookup)s v " +"%(date_field)s, prosím, opravte duplikáty." msgid "Please correct the duplicate values below." msgstr "Prosím, opravte nižšie uvedené duplicitné hodnoty. " @@ -787,13 +882,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "„%(pk)s“ nie je platná hodnota." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"Hodnota %(datetime)s v časovej zóne %(current_timezone)s sa nedá " +"interpretovať; môže byť nejednoznačná alebo nemusí existovať." msgid "Clear" msgstr "Vymazať" @@ -813,15 +910,7 @@ msgstr "Áno" msgid "No" msgstr "Nie" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "áno,nie,možno" @@ -1087,7 +1176,7 @@ msgstr "Toto nieje platná IPv6 adresa." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "alebo" @@ -1097,55 +1186,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d rok" -msgstr[1] "%d roky" -msgstr[2] "%d rokov" -msgstr[3] "%d rokov" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d rok" +msgstr[1] "%(num)d roky" +msgstr[2] "%(num)d rokov" +msgstr[3] "%(num)d rokov" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mesiac" -msgstr[1] "%d mesiace" -msgstr[2] "%d mesiacov" -msgstr[3] "%d mesiacov" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mesiac" +msgstr[1] "%(num)d mesiace" +msgstr[2] "%(num)d mesiacov" +msgstr[3] "%(num)d mesiacov" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d týždeň" -msgstr[1] "%d týždne" -msgstr[2] "%d týždňov" -msgstr[3] "%d týždňov" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d týždeň" +msgstr[1] "%(num)d týždne" +msgstr[2] "%(num)d týždňov" +msgstr[3] "%(num)d týždňov" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d deň" -msgstr[1] "%d dni" -msgstr[2] "%d dní" -msgstr[3] "%d dní" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d deň" +msgstr[1] "%(num)d dni" +msgstr[2] "%(num)d dní" +msgstr[3] "%(num)d dní" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d hodina" -msgstr[1] "%d hodiny" -msgstr[2] "%d hodín" -msgstr[3] "%d hodín" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d hodina" +msgstr[1] "%(num)d hodiny" +msgstr[2] "%(num)d hodín" +msgstr[3] "%(num)d hodiny" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minúta" -msgstr[1] "%d minúty" -msgstr[2] "%d minút" -msgstr[3] "%d minút" - -msgid "0 minutes" -msgstr "0 minút" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minúta" +msgstr[1] "%(num)d minúty" +msgstr[2] "%(num)d minút" +msgstr[3] "%(num)d minúty" msgid "Forbidden" msgstr "Zakázané (Forbidden)" @@ -1155,24 +1241,36 @@ msgstr "CSRF verifikázia zlyhala. Požiadavka bola prerušená." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Túto správu vidíte, pretože táto stránka na protokole HTTPS vyžaduje, aby " +"váš prehliadač zaslal hlavičku „Referer„, k čomu nedošlo. Táto hlavička je " +"vyžadovaná z bezpečnostných dôvodov pre kontrolu toho, že sa prehliadača " +"nezmocnila tretia strana." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Ak ste vo vašom prehliadači vypli hlavičky „Referer“, tak ich prosím " +"zapnite, alebo aspoň pre túto stránku, alebo pre HTTPS pripojenia, alebo pre " +"požiadavky „same-origin“." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Ak používate tag , alebo " +"vkladáte hlavičku „Referrer-Policy: no-referrer“, prosím odstránte ich. " +"Ochrana CSRF vyžaduje hlavičku „Referer“ na striktnú kontrolu. Ak máte obavy " +"o súkromie, použite alternatívy ako pre linky na " +"iné stránky." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1181,12 +1279,14 @@ msgid "" msgstr "" "Túto správu vidíte, pretože táto lokalita vyžaduje CSRF cookie pri " "odosielaní formulárov. Toto cookie je potrebné na zabezpečenie toho, že váš " -"prehliadač nie je zneužitý - \"hijack\"." +"prehliadač nie je zneužitý - „hijack“." msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Ak ste vypli cookies vo vašom prehliadači, tak ich prosím zapnite, aspoň pre " +"túto stránku, alebo pre požiadavky „same-origin“." msgid "More information is available with DEBUG=True." msgstr "Viac informácií bude dostupných s DEBUG=True." @@ -1220,7 +1320,7 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Neplatný dátumový reťazec „%(datestr)s“ pre formát „%(format)s“" #, python-format msgid "No %(verbose_name)s found matching the query" @@ -1229,6 +1329,8 @@ msgstr "" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Stránka nemá hodnotu „last“ a taktiež nie je možné prekonvertovať hodnotu na " +"celé číslo." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1236,21 +1338,21 @@ msgstr "Nesprávna stránka (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Zoznam je prázdny a hodnota „%(class_name)s.allow_empty“ je False." msgid "Directory indexes are not allowed here." msgstr "Výpis adresárov tu nieje povolený." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "„%(path)s“ neexistuje" #, python-format msgid "Index of %(directory)s" msgstr "Výpis %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: Webový framework pre pedantov s termínmi" +msgid "The install worked successfully! Congratulations!" +msgstr "Inštalácia prebehla úspešne! Gratulujeme!" #, python-format msgid "" @@ -1261,29 +1363,26 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">poznámky k vydaniu pre Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Inštalácia prebehla úspešne! Gratulujeme!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Táto stránka sa zobrazuje pretože máte DEBUG=True v súbore s nastaveniami a nie sú nakonfigurované žiadne " -"URL." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True v súbore s nastaveniami a nie sú " +"nakonfigurované žiadne URL." msgid "Django Documentation" msgstr "Dokumentácia Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Témy, referencie a návody" msgid "Tutorial: A Polling App" -msgstr "Tutoriál: Aplikácia \"Hlasovania\"" +msgstr "Tutoriál: Aplikácia „Hlasovania“" msgid "Get started with Django" msgstr "Začíname s Django" diff --git a/django/conf/locale/sk/formats.py b/django/conf/locale/sk/formats.py index 20526419f8b4..31d49122567b 100644 --- a/django/conf/locale/sk/formats.py +++ b/django/conf/locale/sk/formats.py @@ -2,27 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j. F Y G:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y G:i' +DATE_FORMAT = "j. F Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j. F Y G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y G:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - '%y-%m-%d', # '06-10-25' - # '%d. %B %Y', '%d. %b. %Y', # '25. October 2006', '25. Oct. 2006' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + "%y-%m-%d", # '06-10-25' + # "%d. %B %Y", # '25. October 2006' + # "%d. %b. %Y", # '25. Oct. 2006' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sl/LC_MESSAGES/django.mo b/django/conf/locale/sl/LC_MESSAGES/django.mo index e01103d3af96..10e198e53145 100644 Binary files a/django/conf/locale/sl/LC_MESSAGES/django.mo and b/django/conf/locale/sl/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sl/LC_MESSAGES/django.po b/django/conf/locale/sl/LC_MESSAGES/django.po index ff3cbc5a6a53..4b5f932ba1ce 100644 --- a/django/conf/locale/sl/LC_MESSAGES/django.po +++ b/django/conf/locale/sl/LC_MESSAGES/django.po @@ -1,28 +1,29 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Andrej Marsetič, 2022-2023 # iElectric , 2011-2012 # Jannis Leidel , 2011 # Jure Cuhalev , 2012-2013 # Marko Zabreznik , 2016 -# Primož Verdnik , 2017 -# zejn , 2013,2016-2017 -# zejn , 2011-2013 +# Primoz Verdnik , 2017 +# zejn , 2013,2016-2017 +# zejn , 2011-2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 06:49+0000\n" +"Last-Translator: Andrej Marsetič, 2022-2023\n" +"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" "sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" msgid "Afrikaans" msgstr "Afrikanščina" @@ -30,6 +31,9 @@ msgstr "Afrikanščina" msgid "Arabic" msgstr "Arabščina" +msgid "Algerian Arabic" +msgstr "alžirska arabščina" + msgid "Asturian" msgstr "Asturijski jezik" @@ -54,6 +58,9 @@ msgstr "Bosanščina" msgid "Catalan" msgstr "Katalonščina" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Češčina" @@ -145,7 +152,7 @@ msgid "Hungarian" msgstr "Madžarščina" msgid "Armenian" -msgstr "" +msgstr "armenščina" msgid "Interlingua" msgstr "Interlingua" @@ -153,6 +160,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonezijski" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Jezik Ido" @@ -183,6 +193,9 @@ msgstr "Kanareščina" msgid "Korean" msgstr "Korejščina" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Luksemburščina" @@ -204,6 +217,9 @@ msgstr "Mongolščina" msgid "Marathi" msgstr "Jezik Marathi" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Burmanski jezik" @@ -267,9 +283,15 @@ msgstr "Tamilščina" msgid "Telugu" msgstr "Teluščina" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tajski jezik" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Turščina" @@ -279,6 +301,9 @@ msgstr "Tatarščina" msgid "Udmurt" msgstr "Udmurski jezik" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrajinščina" @@ -309,6 +334,11 @@ msgstr "Statične datoteke" msgid "Syndication" msgstr "Sindiciranje" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Število te strani ni naravno število" @@ -365,6 +395,16 @@ msgstr "Poskrbite, da bo ta vrednost manj kot ali natanko %(limit_value)s." msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Poskrbite, da bo ta vrednost večja ali enaka %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -454,6 +494,10 @@ msgstr "in" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s s tem %(field_labels)s že obstaja." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Vrednost %(value)r ni veljavna izbira." @@ -468,8 +512,8 @@ msgstr "To polje ne more biti prazno." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s s tem %(field_label)s že obstaja." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -482,7 +526,7 @@ msgstr "Polje tipa: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” vrednost mora biti Da ali Ne." #, python-format msgid "“%(value)s” value must be either True, False, or None." @@ -495,6 +539,9 @@ msgstr "Boolova vrednost (True ali False)" msgid "String (up to %(max_length)s)" msgstr "Niz znakov (vse do %(max_length)s)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Z vejico ločena cela števila (integer)" @@ -503,12 +550,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” vrednost ima neveljavno obliko datuma. Biti mora v obliki LLLL-" +"MM-DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” vrednost ima pravilno obliko (LLLL-MM-DD), vendar je neveljaven " +"datum." msgid "Date (without time)" msgstr "Datum (brez ure)" @@ -552,14 +603,14 @@ msgstr "Pot do datoteke" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s” vrednost mora biti decimalno število." msgid "Floating point number" msgstr "Število s plavajočo vejico" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” vrednost mora biti celo število." msgid "Integer" msgstr "Celo število (integer)" @@ -567,6 +618,9 @@ msgstr "Celo število (integer)" msgid "Big (8 byte) integer" msgstr "Velika (8 bajtna) cela števila " +msgid "Small integer" +msgstr "Celo število" + msgid "IPv4 address" msgstr "IPv4 naslov" @@ -575,11 +629,14 @@ msgstr "IP naslov" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s” vrednost mora biti Nič, Da ali Ne." msgid "Boolean (Either True, False or None)" msgstr "Boolova vrednost (True, False ali None)" +msgid "Positive big integer" +msgstr "Pozitivno veliko celo število" + msgid "Positive integer" msgstr "Pozitivno celo število" @@ -590,9 +647,6 @@ msgstr "Pozitivno celo število (do 64 tisoč)" msgid "Slug (up to %(max_length)s)" msgstr "Okrajšava naslova (do največ %(max_length)s znakov)" -msgid "Small integer" -msgstr "Celo število" - msgid "Text" msgstr "Besedilo" @@ -630,6 +684,12 @@ msgstr "Datoteka" msgid "Image" msgstr "Slika" +msgid "A JSON object" +msgstr "JSON objekt" + +msgid "Value must be valid JSON." +msgstr "Vrednost mora biti veljaven JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -729,6 +789,9 @@ msgstr "Vnesite popolno vrednost." msgid "Enter a valid UUID." msgstr "Vnesite veljaven UUID." +msgid "Enter a valid JSON." +msgstr "Vnesite veljaven JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -737,24 +800,27 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Skrito polje %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Podatki iz ManagementForm manjkajo ali pa so bili spreminjani." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Pošljite največ %d obrazec." -msgstr[1] "Pošljite največ %d obrazca." -msgstr[2] "Pošljite največ %d obrazce." -msgstr[3] "Pošljite največ %d obrazcev." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Prosimo vnesite %d ali več vnosov." -msgstr[1] "Prosimo vnesite %d ali več vnosov." -msgstr[2] "Prosimo vnesite %d ali več vnosov." -msgstr[3] "Prosimo vnesite %d ali več vnosov." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Order" msgstr "Razvrsti" @@ -816,15 +882,7 @@ msgstr "Da" msgid "No" msgstr "Ne" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "da,ne,morda" @@ -1100,55 +1158,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d leto" -msgstr[1] "%d leti" -msgstr[2] "%d leta" -msgstr[3] "%d let" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d leto" +msgstr[1] "%(num)d leti" +msgstr[2] "%(num)d let" +msgstr[3] "%(num)d let" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d mesec" -msgstr[1] "%d meseca" -msgstr[2] "%d mesece" -msgstr[3] "%d mesecev" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mesec" +msgstr[1] "%(num)d meseca " +msgstr[2] "%(num)d mesecev" +msgstr[3] "%(num)d mesecev" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d teden" -msgstr[1] "%d tedna" -msgstr[2] "%d tedne" -msgstr[3] "%d tednov" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d teden" +msgstr[1] "%(num)d tedna" +msgstr[2] "%(num)d tednov" +msgstr[3] "%(num)d tednov" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dan" -msgstr[1] "%d dneva" -msgstr[2] "%d dni" -msgstr[3] "%d dni" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dan" +msgstr[1] "%(num)d dneva" +msgstr[2] "%(num)d dni" +msgstr[3] "%(num)d dni" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d ura" -msgstr[1] "%d uri" -msgstr[2] "%d ure" -msgstr[3] "%d ur" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d uro" +msgstr[1] "%(num)d uri" +msgstr[2] "%(num)d ure" +msgstr[3] "%(num)d ur" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minuta" -msgstr[1] "%d minuti" -msgstr[2] "%d minute" -msgstr[3] "%d minut" - -msgid "0 minutes" -msgstr "0 minut" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minuti" +msgstr[2] "%(num)d minute" +msgstr[3] "%(num)d minut" msgid "Forbidden" msgstr "Prepovedano" @@ -1158,7 +1213,7 @@ msgstr "CSRF preverjanje ni uspelo. Zahtevek preklican." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1173,8 +1228,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" msgid "" @@ -1190,6 +1245,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Če ste brskalnik konfigurirali tako, da onemogoča piškotke, jih znova " +"omogočite za to spletno mesto ali za zahteve »istega izvora«." msgid "More information is available with DEBUG=True." msgstr "Več informacij je na voljo, če nastavite DEBUG=True." @@ -1230,7 +1287,7 @@ msgid "No %(verbose_name)s found matching the query" msgstr "Noben %(verbose_name)s ne ustreza poizvedbi" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Stran ni »zadnja«, niti je ni mogoče pretvoriti v število." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1245,14 +1302,14 @@ msgstr "Prikaz vsebine mape ni dovoljen." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” ne obstaja" #, python-format msgid "Index of %(directory)s" msgstr "Vsebina mape %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: spletno ogrodje za perfekcioniste s časovnimi roki." +msgid "The install worked successfully! Congratulations!" +msgstr "Namestitev se je uspešno izvedla! Čestitke!" #, python-format msgid "" @@ -1263,20 +1320,17 @@ msgstr "" "\" target=\"_blank\" rel=\"noopener\">obvestila ob izdaji za Django " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Namestitev se je uspešno izvedla! Čestitke!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "To stran vidite, ker imate nastavljeno DEBUG=True v vaši settings.py datoteki in ker nimate nastavljenih URL-" -"jev." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True v vaši settings.py datoteki in ker nimate " +"nastavljenih URL-jev." msgid "Django Documentation" msgstr "Django Dokumentacija" diff --git a/django/conf/locale/sl/formats.py b/django/conf/locale/sl/formats.py index 35de5adface6..c3e96bb2fb35 100644 --- a/django/conf/locale/sl/formats.py +++ b/django/conf/locale/sl/formats.py @@ -2,41 +2,43 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd. F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y. H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'j. M. Y' -SHORT_DATETIME_FORMAT = 'j.n.Y. H:i' +DATE_FORMAT = "d. F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y. H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "j. M. Y" +SHORT_DATETIME_FORMAT = "j.n.Y. H:i" FIRST_DAY_OF_WEEK = 0 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', '%d.%m.%y', # '25.10.2006', '25.10.06' - '%d-%m-%Y', # '25-10-2006' - '%d. %m. %Y', '%d. %m. %y', # '25. 10. 2006', '25. 10. 06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' + "%d-%m-%Y", # '25-10-2006' + "%d. %m. %Y", # '25. 10. 2006' + "%d. %m. %y", # '25. 10. 06' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' - '%d-%m-%Y %H:%M:%S', # '25-10-2006 14:30:59' - '%d-%m-%Y %H:%M:%S.%f', # '25-10-2006 14:30:59.000200' - '%d-%m-%Y %H:%M', # '25-10-2006 14:30' - '%d. %m. %Y %H:%M:%S', # '25. 10. 2006 14:30:59' - '%d. %m. %Y %H:%M:%S.%f', # '25. 10. 2006 14:30:59.000200' - '%d. %m. %Y %H:%M', # '25. 10. 2006 14:30' - '%d. %m. %y %H:%M:%S', # '25. 10. 06 14:30:59' - '%d. %m. %y %H:%M:%S.%f', # '25. 10. 06 14:30:59.000200' - '%d. %m. %y %H:%M', # '25. 10. 06 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d-%m-%Y %H:%M:%S", # '25-10-2006 14:30:59' + "%d-%m-%Y %H:%M:%S.%f", # '25-10-2006 14:30:59.000200' + "%d-%m-%Y %H:%M", # '25-10-2006 14:30' + "%d. %m. %Y %H:%M:%S", # '25. 10. 2006 14:30:59' + "%d. %m. %Y %H:%M:%S.%f", # '25. 10. 2006 14:30:59.000200' + "%d. %m. %Y %H:%M", # '25. 10. 2006 14:30' + "%d. %m. %y %H:%M:%S", # '25. 10. 06 14:30:59' + "%d. %m. %y %H:%M:%S.%f", # '25. 10. 06 14:30:59.000200' + "%d. %m. %y %H:%M", # '25. 10. 06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sq/LC_MESSAGES/django.mo b/django/conf/locale/sq/LC_MESSAGES/django.mo index 00d162420d33..b6de2d0425bd 100644 Binary files a/django/conf/locale/sq/LC_MESSAGES/django.mo and b/django/conf/locale/sq/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sq/LC_MESSAGES/django.po b/django/conf/locale/sq/LC_MESSAGES/django.po index b7ee71f5daf4..37142f53c93c 100644 --- a/django/conf/locale/sq/LC_MESSAGES/django.po +++ b/django/conf/locale/sq/LC_MESSAGES/django.po @@ -1,17 +1,18 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Besnik , 2011-2014 -# Besnik , 2015-2019 +# Besnik Bleta , 2011-2014 +# Besnik Bleta , 2020-2024 +# Besnik Bleta , 2015-2019 # Jannis Leidel , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 07:39+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Besnik Bleta , 2020-2024\n" +"Language-Team: Albanian (http://app.transifex.com/django/django/language/" "sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +26,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabe" +msgid "Algerian Arabic" +msgstr "Arabishte Algjeriane" + msgid "Asturian" msgstr "Asturiase" @@ -49,6 +53,9 @@ msgstr "Boshnjake" msgid "Catalan" msgstr "Katalane" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdishte e Qendrës (Sorani)" + msgid "Czech" msgstr "Çeke" @@ -148,6 +155,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indoneziane" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -178,6 +188,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreane" +msgid "Kyrgyz" +msgstr "Kirgize" + msgid "Luxembourgish" msgstr "Luksemburgase" @@ -199,6 +212,9 @@ msgstr "Mongoliane" msgid "Marathi" msgstr "Marati" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Burmeze" @@ -262,9 +278,15 @@ msgstr "Tamileze" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Taxhike" + msgid "Thai" msgstr "Tajlandeze" +msgid "Turkmen" +msgstr "Turkmene" + msgid "Turkish" msgstr "Turke" @@ -274,6 +296,9 @@ msgstr "Tatare" msgid "Udmurt" msgstr "Udmurt" +msgid "Uyghur" +msgstr "Ujgure" + msgid "Ukrainian" msgstr "Ukrainase" @@ -304,6 +329,11 @@ msgstr "Kartela Statike" msgid "Syndication" msgstr "" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Ai numër faqeje s’është numër i plotë" @@ -316,6 +346,9 @@ msgstr "Ajo faqe s’përmban përfundime" msgid "Enter a valid value." msgstr "Jepni një vlerë të vlefshme." +msgid "Enter a valid domain name." +msgstr "Jepni një emër të vlefshëm përkatësie." + msgid "Enter a valid URL." msgstr "Jepni një URL të vlefshme." @@ -339,14 +372,18 @@ msgstr "" "Jepni një “slug” të vlefshëm, të përbërë nga shkronja, numra, nënvija ose " "vija ndarëse Unikod." -msgid "Enter a valid IPv4 address." -msgstr "Jepni një adresë IPv4 të vlefshme." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Jepni një adresë %(protocol)s të vlefshme." -msgid "Enter a valid IPv6 address." -msgstr "Jepni një adresë IPv6 të vlefshme." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Jepni një adresë IPv4 ose IPv6 të vlefshme." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4, ose IPv6" msgid "Enter only digits separated by commas." msgstr "Jepni vetëm shifra të ndara nga presje." @@ -363,6 +400,21 @@ msgstr "Siguroni që kjo vlerë të jetë më e vogël ose baras me %(limit_valu msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Siguroni që kjo vlerë është më e madhe ose baras me %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Garantoni që vlera të jetë një shumëfish i madhësisë së hapit " +"%(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Garantoni që kjo vlerë të jetë një shumëfish i madhësisë %(limit_value)s, " +"duke filluar nga %(offset)s, p.sh., %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, e me radhë." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -434,6 +486,10 @@ msgstr "dhe " msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Ka tashmë %(model_name)s me këtë %(field_labels)s." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Është cenuar kufizimi “%(name)s”." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Vlera %(value)r s’është zgjedhje e vlefshme." @@ -448,8 +504,8 @@ msgstr "Kjo fushë s’mund të jetë e paplotësuar." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Ka tashmë një %(model_name)s me këtë %(field_label)s." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -475,6 +531,9 @@ msgstr "Buleane (Ose True, ose False)" msgid "String (up to %(max_length)s)" msgstr "Varg (deri në %(max_length)s)" +msgid "String (unlimited)" +msgstr "Varg (i pakufizuar)" + msgid "Comma-separated integers" msgstr "Numra të plotë të ndarë me presje" @@ -557,6 +616,9 @@ msgstr "Numër i plotë" msgid "Big (8 byte) integer" msgstr "Numër i plotë i madh (8 bajte)" +msgid "Small integer" +msgstr "Numër i plotë i vogël" + msgid "IPv4 address" msgstr "Adresë IPv4" @@ -570,6 +632,9 @@ msgstr "Vlera “%(value)s” duhet të jetë ose None, ose True, ose False." msgid "Boolean (Either True, False or None)" msgstr "Buleane (Ose True, ose False, ose None)" +msgid "Positive big integer" +msgstr "Numër i plotë pozitiv i madh" + msgid "Positive integer" msgstr "Numër i plotë pozitiv" @@ -580,9 +645,6 @@ msgstr "Numër i plotë pozitiv i vogël" msgid "Slug (up to %(max_length)s)" msgstr "Identifikues (deri në %(max_length)s)" -msgid "Small integer" -msgstr "Numër i plotë i vogël" - msgid "Text" msgstr "Tekst" @@ -624,6 +686,12 @@ msgstr "Kartelë" msgid "Image" msgstr "Figurë" +msgid "A JSON object" +msgstr "Objekt JSON" + +msgid "Value must be valid JSON." +msgstr "Vlera duhet të jetë JSON i vlefshëm." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Instanca %(model)s me %(field)s %(value)r s’ekziston." @@ -697,7 +765,7 @@ msgstr[1] "" msgid "Please either submit a file or check the clear checkbox, not both." msgstr "" "Ju lutemi, ose parashtroni një kartelë, ose i vini shenjë kutizës për " -"pastrim, jo që të dyja." +"spastrim, jo që të dyja." msgid "" "Upload a valid image. The file you uploaded was either not an image or a " @@ -721,6 +789,9 @@ msgstr "Jepni një vlerë të plotë." msgid "Enter a valid UUID." msgstr "Jepni një UUID të vlefshëm." +msgid "Enter a valid JSON." +msgstr "Jepni një JSON të vlefshëm." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -729,20 +800,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Fushë e fshehur %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Të dhënat ManagementForm mungojnë ose është vënë dorë mbi to" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Mungojnë të dhëna ManagementForm, ose në to janë futur hundët. Fusha që " +"mungojnë: %(field_names)s. Nëse problemi vazhdon, mund të duhet të " +"parashtroni një raport të mete." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Ju lutemi, parashtroni %d ose më pak formularë." -msgstr[1] "Ju lutemi, parashtroni %d ose më pak formularë." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Ju lutemi, parashtroni e shumta %(num)d formular." +msgstr[1] "Ju lutemi, parashtroni e shumta %(num)d formularë." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Ju lutemi, parashtroni %d ose më shumë formularë." -msgstr[1] "Ju lutemi, parashtroni %d ose më shumë formularë." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Ju lutemi, parashtroni të paktën %(num)d formular." +msgstr[1] "Ju lutemi, parashtroni të paktën %(num)d formularë." msgid "Order" msgstr "Renditi" @@ -792,7 +869,7 @@ msgstr "" "mund të jetë e dykuptimtë, ose mund të mos ekzistojë." msgid "Clear" -msgstr "Pastroje" +msgstr "Spastroje" msgid "Currently" msgstr "Tani" @@ -809,15 +886,7 @@ msgstr "Po" msgid "No" msgstr "Jo" -msgid "Year" -msgstr "Vit" - -msgid "Month" -msgstr "Muaj" - -msgid "Day" -msgstr "Ditë" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "po,jo,ndoshta" @@ -1091,43 +1160,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d vit" -msgstr[1] "%d vjet" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d vit" +msgstr[1] "%(num)d vjet" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d muaj" -msgstr[1] "%d muaj" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d muaj" +msgstr[1] "%(num)d muaj" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d javë" -msgstr[1] "%d javë" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d javë" +msgstr[1] "%(num)d javë" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d ditë" -msgstr[1] "%d ditë" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d ditë" +msgstr[1] "%(num)d ditë" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d orë" -msgstr[1] "%d orë" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d orë" +msgstr[1] "%(num)d orë" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minutë" -msgstr[1] "%d minuta" - -msgid "0 minutes" -msgstr "0 minuta" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minutë" +msgstr[1] "%(num)d minuta" msgid "Forbidden" msgstr "E ndaluar" @@ -1137,7 +1203,7 @@ msgstr "Verifikimi CSRF dështoi. Kërkesa u ndërpre." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1158,8 +1224,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Nëse përdorni etiketën " "etiketën ose përfshini kryet “Referrer-Policy: no-referrer”, ju lutemi, " @@ -1244,8 +1310,8 @@ msgstr "“%(path)s” s’ekziston" msgid "Index of %(directory)s" msgstr "Tregues i %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: platforma Web për perfeksionistë me afate." +msgid "The install worked successfully! Congratulations!" +msgstr "Instalimi funksionoi me sukses! Përgëzime!" #, python-format msgid "" @@ -1256,19 +1322,17 @@ msgstr "" "target=\"_blank\" rel=\"noopener\">shënimet për hedhjen në qarkullim të " "Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Instalimi funksionoi me sukses! Përgëzime!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -"Po e shihni këtë faqe ngaqë te kartela juaj e rregullimeve gjendet DEBUG=True dhe s’keni formësuar ndonjë URL." +"Po e shihni këtë faqe ngaqë te kartela juaj e rregullimeve gjendet DEBUG=True dhe s’keni formësuar " +"ndonjë URL." msgid "Django Documentation" msgstr "Dokumentim i Django-s" diff --git a/django/conf/locale/sq/formats.py b/django/conf/locale/sq/formats.py index 2f0da0d40022..c7ed92e12fb3 100644 --- a/django/conf/locale/sq/formats.py +++ b/django/conf/locale/sq/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd F Y' -TIME_FORMAT = 'g.i.A' +DATE_FORMAT = "d F Y" +TIME_FORMAT = "g.i.A" # DATETIME_FORMAT = -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'Y-m-d' +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y-m-d" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." # NUMBER_GROUPING = diff --git a/django/conf/locale/sr/LC_MESSAGES/django.mo b/django/conf/locale/sr/LC_MESSAGES/django.mo index 0f05b624d086..ce850cd15eec 100644 Binary files a/django/conf/locale/sr/LC_MESSAGES/django.mo and b/django/conf/locale/sr/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sr/LC_MESSAGES/django.po b/django/conf/locale/sr/LC_MESSAGES/django.po index 617fbc43d730..aee578af78af 100644 --- a/django/conf/locale/sr/LC_MESSAGES/django.po +++ b/django/conf/locale/sr/LC_MESSAGES/django.po @@ -2,24 +2,25 @@ # # Translators: # Branko Kokanovic , 2018-2019 -# Igor Jerosimić, 2019-2020 +# Igor Jerosimić, 2019-2021,2023-2024 # Jannis Leidel , 2011 # Janos Guljas , 2011-2012 +# Mariusz Felisiak , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-21 20:36+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Igor Jerosimić, 2019-2021,2023-2024\n" +"Language-Team: Serbian (http://app.transifex.com/django/django/language/" "sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" msgid "Afrikaans" msgstr "африкански" @@ -27,6 +28,9 @@ msgstr "африкански" msgid "Arabic" msgstr "арапски" +msgid "Algerian Arabic" +msgstr "Алжирски арапски" + msgid "Asturian" msgstr "астуријски" @@ -51,6 +55,9 @@ msgstr "босански" msgid "Catalan" msgstr "каталонски" +msgid "Central Kurdish (Sorani)" +msgstr "централнокурдски (сорани)" + msgid "Czech" msgstr "чешки" @@ -150,6 +157,9 @@ msgstr "интерлингва" msgid "Indonesian" msgstr "индонежански" +msgid "Igbo" +msgstr "Игбо" + msgid "Ido" msgstr "идо" @@ -180,6 +190,9 @@ msgstr "канада" msgid "Korean" msgstr "корејски" +msgid "Kyrgyz" +msgstr "Киргиски" + msgid "Luxembourgish" msgstr "луксембуршки" @@ -201,6 +214,9 @@ msgstr "монголски" msgid "Marathi" msgstr "маратхи" +msgid "Malay" +msgstr "малајски" + msgid "Burmese" msgstr "бурмански" @@ -264,9 +280,15 @@ msgstr "тамилски" msgid "Telugu" msgstr "телугу" +msgid "Tajik" +msgstr "Таџики" + msgid "Thai" msgstr "тајландски" +msgid "Turkmen" +msgstr "Туркменски" + msgid "Turkish" msgstr "турски" @@ -276,6 +298,9 @@ msgstr "татарски" msgid "Udmurt" msgstr "удмуртски" +msgid "Uyghur" +msgstr "Ујгури" + msgid "Ukrainian" msgstr "украјински" @@ -306,6 +331,11 @@ msgstr "Статички фајлови" msgid "Syndication" msgstr "Удруживање садржаја" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Задати број стране није цео број" @@ -318,6 +348,9 @@ msgstr "Тражена страна не садржи резултате" msgid "Enter a valid value." msgstr "Унесите исправну вредност." +msgid "Enter a valid domain name." +msgstr "Унесите исправно име домена." + msgid "Enter a valid URL." msgstr "Унесите исправан URL." @@ -341,14 +374,18 @@ msgstr "" "Унесите исправан \"слаг\", који се састоји од Уникод слова, бројки, доњих " "црта или цртица." -msgid "Enter a valid IPv4 address." -msgstr "Унесите исправну IPv4 адресу." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Унесите исправну адресу %(protocol)s." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Унесите исправну IPv6 адресу." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Унесите исправну IPv4 или IPv6 адресу." +msgid "IPv4 or IPv6" +msgstr "IPv4 или IPv6" msgid "Enter only digits separated by commas." msgstr "Унесите само цифре раздвојене запетама." @@ -365,6 +402,19 @@ msgstr "Ова вредност мора да буде мања од %(limit_val msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Ова вредност мора бити већа од %(limit_value)s или тачно толико." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Ова вредност мора да умножак величине корака %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Уверите се да је ова вредност вишекратник величине корака %(limit_value)s, " +"почевши од %(offset)s, нпр. %(offset)s, %(valid_value1)s, %(valid_value2)s, " +"и тако даље." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -443,6 +493,10 @@ msgstr "и" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s са пољем %(field_labels)s већ постоји." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Ограничење „%(name)s“ је прекршено." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Вредност %(value)r није валидна." @@ -457,8 +511,8 @@ msgstr "Ово поље не може да остане празно." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s са пољем %(field_label)s већ постоји." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -485,6 +539,9 @@ msgstr "Булова вредност (True или False)" msgid "String (up to %(max_length)s)" msgstr "Стринг са макс. дужином %(max_length)s" +msgid "String (unlimited)" +msgstr "Стринг (неограниченo)" + msgid "Comma-separated integers" msgstr "Цели бројеви раздвојени запетама" @@ -567,6 +624,9 @@ msgstr "Цео број" msgid "Big (8 byte) integer" msgstr "Велики (8 бајтова) цео број" +msgid "Small integer" +msgstr "Мали цео број" + msgid "IPv4 address" msgstr "IPv4 адреса" @@ -580,6 +640,9 @@ msgstr "Вредност \"%(value)s\" мора бити None, True или False msgid "Boolean (Either True, False or None)" msgstr "Булова вредност (True, False или None)" +msgid "Positive big integer" +msgstr "Велик позитиван цео број" + msgid "Positive integer" msgstr "Позитиван цео број" @@ -590,9 +653,6 @@ msgstr "Позитиван мали цео број" msgid "Slug (up to %(max_length)s)" msgstr "Слаг са макс. дужином %(max_length)s" -msgid "Small integer" -msgstr "Мали цео број" - msgid "Text" msgstr "Текст" @@ -634,6 +694,12 @@ msgstr "Фајл" msgid "Image" msgstr "Слика" +msgid "A JSON object" +msgstr "JSON објекат" + +msgid "Value must be valid JSON." +msgstr "Вредност мора бити исправан JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(model)s инстанца са вредношћу %(value)r у пољу %(field)s не постоји." @@ -727,6 +793,9 @@ msgstr "Унесите комплетну вредност." msgid "Enter a valid UUID." msgstr "Унесите исправан UUID." +msgid "Enter a valid JSON." +msgstr "Унесите исправан JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -735,22 +804,28 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Скривено поље %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm недостаје или је измењена на погрешан начин." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"Подаци од ManagementForm недостају или су покварени. Поља која недостају: " +"%(field_names)s. Можда ће бити потребно да пријавите грешку ако се проблем " +"настави." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Попуните и проследите највише %d форму." -msgstr[1] "Попуните и проследите највише %d форме." -msgstr[2] "Попуните и проследите највише %d форми." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Молим проследите највише %(num)d форму." +msgstr[1] "Молим проследите највише %(num)d форме." +msgstr[2] "Молим проследите највише %(num)d форми." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Попуните и проследите најмање %d форму." -msgstr[1] "Попуните и проследите највише %d форме." -msgstr[2] "Попуните и проследите највише %d форми." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Молим проследите најмање %(num)d форму." +msgstr[1] "Молим проследите најмање %(num)d форме." +msgstr[2] "Молим проследите најмање %(num)d форми." msgid "Order" msgstr "Редослед" @@ -815,15 +890,7 @@ msgstr "Да" msgid "No" msgstr "Не" -msgid "Year" -msgstr "Година" - -msgid "Month" -msgstr "Месец" - -msgid "Day" -msgstr "Дан" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "да,не,можда" @@ -1088,7 +1155,7 @@ msgstr "Ово није валидна IPv6 адреса." #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s..." +msgstr "%(truncated_text)s…" msgid "or" msgstr "или" @@ -1098,49 +1165,46 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d година" -msgstr[1] "%d године" -msgstr[2] "%d година" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d година" +msgstr[1] "%(num)d године" +msgstr[2] "%(num)d година" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d месец" -msgstr[1] "%d месеца" -msgstr[2] "%d месеци" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d месец" +msgstr[1] "%(num)d месеца" +msgstr[2] "%(num)d месеци" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d недеља" -msgstr[1] "%d недеље" -msgstr[2] "%d недеља" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d недеља" +msgstr[1] "%(num)d недеље" +msgstr[2] "%(num)d недеља" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d дан" -msgstr[1] "%d дана" -msgstr[2] "%d дана" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d дан" +msgstr[1] "%(num)d дана" +msgstr[2] "%(num)d дана" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d час" -msgstr[1] "%d часа" -msgstr[2] "%d часова" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d сат" +msgstr[1] "%(num)d сата" +msgstr[2] "%(num)d сати" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минута" -msgstr[2] "%d минута" - -msgid "0 minutes" -msgstr "0 минута" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минут" +msgstr[1] "%(num)d минута" +msgstr[2] "%(num)d минута" msgid "Forbidden" msgstr "Забрањено" @@ -1150,7 +1214,7 @@ msgstr "CSRF верификација није прошла. Захтев одб msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1165,21 +1229,21 @@ msgid "" "origin” requests." msgstr "" "Ако сте подесили интернет прегледач да не шаље \"Referer\" заглавља, поново " -"их укључите, барем за овај сајт, или за HTTPS конекције, или за \"same-origin" -"\" захтеве." +"их укључите, барем за овај сајт, или за HTTPS конекције, или за \"same-" +"origin\" захтеве." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Ако користите таг или " "\"Referrer-Policy: no-referrer\" заглавље, молимо да их уклоните. CSRF " "заштита захтева \"Referer\" заглавље да би се обавила стриктна \"referrer\" " -"провера. Уколико вас брине приватност, користите алтернативе као за линкове ка другим сајтовима." +"провера. Уколико вас брине приватност, користите алтернативе као за линкове ка другим сајтовима." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1257,8 +1321,8 @@ msgstr "„%(path)s“ не постоји" msgid "Index of %(directory)s" msgstr "Индекс директоријума %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Ђанго: веб окружење за перфекционисте са строгим роковима." +msgid "The install worked successfully! Congratulations!" +msgstr "Инсталација је прошла успешно. Честитке!" #, python-format msgid "" @@ -1269,19 +1333,17 @@ msgstr "" "\" target=\"_blank\" rel=\"noopener\">напомене уз издање за Ђанго " "%(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Инсталација је прошла успешно. Честитке!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Ова страна је приказана јер је DEBUG=True у вашим подешавањима и нисте конфигурисали ниједан URL." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True у вашим подешавањима и нисте конфигурисали " +"ниједан URL." msgid "Django Documentation" msgstr "Ђанго документација" diff --git a/django/conf/locale/sr/formats.py b/django/conf/locale/sr/formats.py index 937a40925785..423f86d75c2c 100644 --- a/django/conf/locale/sr/formats.py +++ b/django/conf/locale/sr/formats.py @@ -2,38 +2,43 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y.' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y. H:i' -YEAR_MONTH_FORMAT = 'F Y.' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'j.m.Y.' -SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' +DATE_FORMAT = "j. F Y." +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y. H:i" +YEAR_MONTH_FORMAT = "F Y." +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "j.m.Y." +SHORT_DATETIME_FORMAT = "j.m.Y. H:i" FIRST_DAY_OF_WEEK = 1 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' - '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' - # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' - # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' - # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' + "%d.%m.%Y.", # '25.10.2006.' + "%d.%m.%y.", # '25.10.06.' + "%d. %m. %Y.", # '25. 10. 2006.' + "%d. %m. %y.", # '25. 10. 06.' + # "%d. %b %y.", # '25. Oct 06.' + # "%d. %B %y.", # '25. October 06.' + # "%d. %b '%y.", # '25. Oct '06.' + # "%d. %B '%y.", # '25. October '06.' + # "%d. %b %Y.", # '25. Oct 2006.' + # "%d. %B %Y.", # '25. October 2006.' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59' - '%d.%m.%Y. %H:%M:%S.%f', # '25.10.2006. 14:30:59.000200' - '%d.%m.%Y. %H:%M', # '25.10.2006. 14:30' - '%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59' - '%d.%m.%y. %H:%M:%S.%f', # '25.10.06. 14:30:59.000200' - '%d.%m.%y. %H:%M', # '25.10.06. 14:30' - '%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59' - '%d. %m. %Y. %H:%M:%S.%f', # '25. 10. 2006. 14:30:59.000200' - '%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30' - '%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59' - '%d. %m. %y. %H:%M:%S.%f', # '25. 10. 06. 14:30:59.000200' - '%d. %m. %y. %H:%M', # '25. 10. 06. 14:30' + "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' + "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' + "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' + "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' + "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' + "%d.%m.%y. %H:%M", # '25.10.06. 14:30' + "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' + "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' + "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' + "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' + "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' + "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo b/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo index 53ceaf93e518..4a4ffa80dc8f 100644 Binary files a/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo and b/django/conf/locale/sr_Latn/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sr_Latn/LC_MESSAGES/django.po b/django/conf/locale/sr_Latn/LC_MESSAGES/django.po index ea5aa68013c1..5f5bc7790a91 100644 --- a/django/conf/locale/sr_Latn/LC_MESSAGES/django.po +++ b/django/conf/locale/sr_Latn/LC_MESSAGES/django.po @@ -1,369 +1,537 @@ # This file is distributed under the same license as the Django package. -# +# # Translators: -# Igor Jerosimić, 2019-2020 +# Aleksa Cukovic` , 2020 +# Danijela Popović, 2022 +# Igor Jerosimić, 2019-2021,2023-2024 # Jannis Leidel , 2011 # Janos Guljas , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2020-01-23 22:15+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Igor Jerosimić, 2019-2021,2023-2024\n" +"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: conf/global_settings.py:52 msgid "Afrikaans" msgstr "afrikanski" +#: conf/global_settings.py:53 msgid "Arabic" msgstr "arapski" +#: conf/global_settings.py:54 +msgid "Algerian Arabic" +msgstr "Alžirski arapski" + +#: conf/global_settings.py:55 msgid "Asturian" msgstr "asturijski" +#: conf/global_settings.py:56 msgid "Azerbaijani" msgstr "azerbejdžanski" +#: conf/global_settings.py:57 msgid "Bulgarian" msgstr "bugarski" +#: conf/global_settings.py:58 msgid "Belarusian" msgstr "beloruski" +#: conf/global_settings.py:59 msgid "Bengali" msgstr "bengalski" +#: conf/global_settings.py:60 msgid "Breton" msgstr "bretonski" +#: conf/global_settings.py:61 msgid "Bosnian" msgstr "bosanski" +#: conf/global_settings.py:62 msgid "Catalan" msgstr "katalonski" +#: conf/global_settings.py:63 +msgid "Central Kurdish (Sorani)" +msgstr "centralnokurdski (sorani)" + +#: conf/global_settings.py:64 msgid "Czech" msgstr "češki" +#: conf/global_settings.py:65 msgid "Welsh" msgstr "velški" +#: conf/global_settings.py:66 msgid "Danish" msgstr "danski" +#: conf/global_settings.py:67 msgid "German" msgstr "nemački" +#: conf/global_settings.py:68 msgid "Lower Sorbian" msgstr "donjolužičkosrpski" +#: conf/global_settings.py:69 msgid "Greek" msgstr "grčki" +#: conf/global_settings.py:70 msgid "English" msgstr "engleski" +#: conf/global_settings.py:71 msgid "Australian English" msgstr "australijski engleski" +#: conf/global_settings.py:72 msgid "British English" msgstr "britanski engleski" +#: conf/global_settings.py:73 msgid "Esperanto" msgstr "esperanto" +#: conf/global_settings.py:74 msgid "Spanish" msgstr "španski" +#: conf/global_settings.py:75 msgid "Argentinian Spanish" msgstr "argentinski španski" +#: conf/global_settings.py:76 msgid "Colombian Spanish" msgstr "kolumbijski španski" +#: conf/global_settings.py:77 msgid "Mexican Spanish" msgstr "meksički španski" +#: conf/global_settings.py:78 msgid "Nicaraguan Spanish" msgstr "nikaragvanski španski" +#: conf/global_settings.py:79 msgid "Venezuelan Spanish" msgstr "venecuelanski španski" +#: conf/global_settings.py:80 msgid "Estonian" msgstr "estonski" +#: conf/global_settings.py:81 msgid "Basque" msgstr "baskijski" +#: conf/global_settings.py:82 msgid "Persian" msgstr "persijski" +#: conf/global_settings.py:83 msgid "Finnish" msgstr "finski" +#: conf/global_settings.py:84 msgid "French" msgstr "francuski" +#: conf/global_settings.py:85 msgid "Frisian" msgstr "frizijski" +#: conf/global_settings.py:86 msgid "Irish" msgstr "irski" +#: conf/global_settings.py:87 msgid "Scottish Gaelic" msgstr "škotski galski" +#: conf/global_settings.py:88 msgid "Galician" msgstr "galski" +#: conf/global_settings.py:89 msgid "Hebrew" msgstr "hebrejski" +#: conf/global_settings.py:90 msgid "Hindi" msgstr "hindu" +#: conf/global_settings.py:91 msgid "Croatian" msgstr "hrvatski" +#: conf/global_settings.py:92 msgid "Upper Sorbian" msgstr "gornjolužičkosrpski" +#: conf/global_settings.py:93 msgid "Hungarian" msgstr "mađarski" +#: conf/global_settings.py:94 msgid "Armenian" msgstr "jermenski" +#: conf/global_settings.py:95 msgid "Interlingua" msgstr "interlingva" +#: conf/global_settings.py:96 msgid "Indonesian" msgstr "indonežanski" +#: conf/global_settings.py:97 +msgid "Igbo" +msgstr "Igbo" + +#: conf/global_settings.py:98 msgid "Ido" msgstr "ido" +#: conf/global_settings.py:99 msgid "Icelandic" msgstr "islandski" +#: conf/global_settings.py:100 msgid "Italian" msgstr "italijanski" +#: conf/global_settings.py:101 msgid "Japanese" msgstr "japanski" +#: conf/global_settings.py:102 msgid "Georgian" msgstr "gruzijski" +#: conf/global_settings.py:103 msgid "Kabyle" msgstr "kabilski" +#: conf/global_settings.py:104 msgid "Kazakh" msgstr "kazaški" +#: conf/global_settings.py:105 msgid "Khmer" msgstr "kambodijski" +#: conf/global_settings.py:106 msgid "Kannada" msgstr "kanada" +#: conf/global_settings.py:107 msgid "Korean" msgstr "korejski" +#: conf/global_settings.py:108 +msgid "Kyrgyz" +msgstr "Kirgiski" + +#: conf/global_settings.py:109 msgid "Luxembourgish" msgstr "luksemburški" +#: conf/global_settings.py:110 msgid "Lithuanian" msgstr "litvanski" +#: conf/global_settings.py:111 msgid "Latvian" msgstr "latvijski" +#: conf/global_settings.py:112 msgid "Macedonian" msgstr "makedonski" +#: conf/global_settings.py:113 msgid "Malayalam" msgstr "malajalamski" +#: conf/global_settings.py:114 msgid "Mongolian" msgstr "mongolski" +#: conf/global_settings.py:115 msgid "Marathi" msgstr "marathi" +#: conf/global_settings.py:116 +msgid "Malay" +msgstr "malajski" + +#: conf/global_settings.py:117 msgid "Burmese" msgstr "burmanski" +#: conf/global_settings.py:118 msgid "Norwegian Bokmål" msgstr "norveški književni" +#: conf/global_settings.py:119 msgid "Nepali" msgstr "nepalski" +#: conf/global_settings.py:120 msgid "Dutch" msgstr "holandski" +#: conf/global_settings.py:121 msgid "Norwegian Nynorsk" msgstr "norveški novi" +#: conf/global_settings.py:122 msgid "Ossetic" msgstr "osetinski" +#: conf/global_settings.py:123 msgid "Punjabi" msgstr "Pandžabi" +#: conf/global_settings.py:124 msgid "Polish" msgstr "poljski" +#: conf/global_settings.py:125 msgid "Portuguese" msgstr "portugalski" +#: conf/global_settings.py:126 msgid "Brazilian Portuguese" msgstr "brazilski portugalski" +#: conf/global_settings.py:127 msgid "Romanian" msgstr "rumunski" +#: conf/global_settings.py:128 msgid "Russian" msgstr "ruski" +#: conf/global_settings.py:129 msgid "Slovak" msgstr "slovački" +#: conf/global_settings.py:130 msgid "Slovenian" msgstr "slovenački" +#: conf/global_settings.py:131 msgid "Albanian" msgstr "albanski" +#: conf/global_settings.py:132 msgid "Serbian" msgstr "srpski" +#: conf/global_settings.py:133 msgid "Serbian Latin" msgstr "srpski (latinica)" +#: conf/global_settings.py:134 msgid "Swedish" msgstr "švedski" +#: conf/global_settings.py:135 msgid "Swahili" msgstr "svahili" +#: conf/global_settings.py:136 msgid "Tamil" msgstr "tamilski" +#: conf/global_settings.py:137 msgid "Telugu" msgstr "telugu" +#: conf/global_settings.py:138 +msgid "Tajik" +msgstr "Tadžiki" + +#: conf/global_settings.py:139 msgid "Thai" msgstr "tajlandski" +#: conf/global_settings.py:140 +msgid "Turkmen" +msgstr "Turkmenski" + +#: conf/global_settings.py:141 msgid "Turkish" msgstr "turski" +#: conf/global_settings.py:142 msgid "Tatar" msgstr "tatarski" +#: conf/global_settings.py:143 msgid "Udmurt" msgstr "udmurtski" +#: conf/global_settings.py:144 +msgid "Uyghur" +msgstr "Ujgur" + +#: conf/global_settings.py:145 msgid "Ukrainian" msgstr "ukrajinski" +#: conf/global_settings.py:146 msgid "Urdu" msgstr "Urdu" +#: conf/global_settings.py:147 msgid "Uzbek" msgstr "Uzbekistanski" +#: conf/global_settings.py:148 msgid "Vietnamese" msgstr "vijetnamski" +#: conf/global_settings.py:149 msgid "Simplified Chinese" msgstr "novokineski" +#: conf/global_settings.py:150 msgid "Traditional Chinese" msgstr "starokineski" +#: contrib/messages/apps.py:15 msgid "Messages" msgstr "Poruke" +#: contrib/sitemaps/apps.py:8 msgid "Site Maps" msgstr "Mape sajta" +#: contrib/staticfiles/apps.py:9 msgid "Static Files" msgstr "Statičke datoteke" +#: contrib/syndication/apps.py:7 msgid "Syndication" msgstr "Udruživanje sadržaja" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +#: core/paginator.py:30 +msgid "…" +msgstr "…" + +#: core/paginator.py:32 msgid "That page number is not an integer" msgstr "Zadati broj strane nije ceo broj" +#: core/paginator.py:33 msgid "That page number is less than 1" msgstr "Zadati broj strane je manji od 1" +#: core/paginator.py:34 msgid "That page contains no results" msgstr "Tražena strana ne sadrži rezultate" +#: core/validators.py:22 msgid "Enter a valid value." msgstr "Unesite ispravnu vrednost." +#: core/validators.py:70 +msgid "Enter a valid domain name." +msgstr "Unesite ispravno ime domena." + +#: core/validators.py:104 forms/fields.py:759 msgid "Enter a valid URL." msgstr "Unesite ispravan URL." +#: core/validators.py:165 msgid "Enter a valid integer." msgstr "Unesite ispravan ceo broj." +#: core/validators.py:176 msgid "Enter a valid email address." msgstr "Unesite ispravnu e-mail adresu." #. Translators: "letters" means latin letters: a-z and A-Z. +#: core/validators.py:259 msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" -"Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili " -"cirtica." +msgstr "Unesite isrpavan „slag“, koji se sastoji od slova, brojki, donjih crta ili cirtica." +#: core/validators.py:267 msgid "" -"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " -"hyphens." -msgstr "" -"Unesite ispravan \"slag\", koji se sastoji od Unikod slova, brojki, donjih " -"crta ili crtica." +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or" +" hyphens." +msgstr "Unesite ispravan \"slag\", koji se sastoji od Unikod slova, brojki, donjih crta ili crtica." -msgid "Enter a valid IPv4 address." -msgstr "Unesite ispravnu IPv4 adresu." +#: core/validators.py:327 core/validators.py:336 core/validators.py:350 +#: db/models/fields/__init__.py:2219 +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Unesite ispravnu adresu %(protocol)s." + +#: core/validators.py:329 +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Unesite ispravnu IPv6 adresu." +#: core/validators.py:338 utils/ipv6.py:30 +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Unesite ispravnu IPv4 ili IPv6 adresu." +#: core/validators.py:352 +msgid "IPv4 or IPv6" +msgstr "IPv4 ili IPv6" +#: core/validators.py:341 msgid "Enter only digits separated by commas." msgstr "Unesite samo brojke razdvojene zapetama." +#: core/validators.py:347 #, python-format msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." msgstr "Ovo polje mora da bude %(limit_value)s (trenutno ima %(show_value)s)." +#: core/validators.py:382 #, python-format msgid "Ensure this value is less than or equal to %(limit_value)s." msgstr "Ova vrednost mora da bude manja od %(limit_value)s. ili tačno toliko." +#: core/validators.py:391 #, python-format msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Ova vrednost mora biti veća od %(limit_value)s ili tačno toliko." +#: core/validators.py:400 +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Ova vrednost mora da umnožak veličine koraka %(limit_value)s." + +#: core/validators.py:407 +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "Uverite se da je ova vrednost višestruka od veličine koraka %(limit_value)s, počevši od %(offset)s, npr. %(offset)s, %(valid_value1)s, %(valid_value2)s, itd." + +#: core/validators.py:439 #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -371,16 +539,11 @@ msgid "" msgid_plural "" "Ensure this value has at least %(limit_value)d characters (it has " "%(show_value)d)." -msgstr[0] "" -"Ovo polje mora da ima najmanje %(limit_value)d karakter (trenutno ima " -"%(show_value)d)." -msgstr[1] "" -"Ovo polje mora da ima najmanje %(limit_value)d karaktera (trenutno ima " -"%(show_value)d)." -msgstr[2] "" -"Ovo polje mora da ima %(limit_value)d najmanje karaktera (trenutno ima " -"%(show_value)d )." +msgstr[0] "Ovo polje mora da ima najmanje %(limit_value)d karakter (trenutno ima %(show_value)d)." +msgstr[1] "Ovo polje mora da ima najmanje %(limit_value)d karaktera (trenutno ima %(show_value)d)." +msgstr[2] "Ovo polje mora da ima %(limit_value)d najmanje karaktera (trenutno ima %(show_value)d )." +#: core/validators.py:457 #, python-format msgid "" "Ensure this value has at most %(limit_value)d character (it has " @@ -388,414 +551,531 @@ msgid "" msgid_plural "" "Ensure this value has at most %(limit_value)d characters (it has " "%(show_value)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." +msgstr[1] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." +msgstr[2] "Ovo polje ne sme da ima više od %(limit_value)d karaktera (trenutno ima %(show_value)d)." +#: core/validators.py:480 forms/fields.py:354 forms/fields.py:393 msgid "Enter a number." msgstr "Unesite broj." +#: core/validators.py:482 #, python-format msgid "Ensure that there are no more than %(max)s digit in total." msgid_plural "Ensure that there are no more than %(max)s digits in total." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Ukupno ne može biti više od %(max)s cifre." +msgstr[1] "Ukupno ne može biti više od %(max)s cifre." +msgstr[2] "Ukupno ne može biti više od %(max)s cifara." +#: core/validators.py:487 #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Ne može biti više od %(max)s decimale." +msgstr[1] "Ne može biti više od %(max)s decimale." +msgstr[2] "Ne može biti više od %(max)s decimala." +#: core/validators.py:492 #, python-format msgid "" "Ensure that there are no more than %(max)s digit before the decimal point." msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." +msgstr[1] "Ne može biti više od %(max)s cifre pre decimalnog zapisa." +msgstr[2] "Ne može biti više od %(max)s cifara pre decimalnog zapisa." +#: core/validators.py:563 #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." -msgstr "" +msgstr "Ekstenzija datoteke \"%(extension)s\" nije dozvoljena. Dozvoljene su sledeće ekstenzije: %(allowed_extensions)s." +#: core/validators.py:624 msgid "Null characters are not allowed." msgstr "'Null' karakteri nisu dozvoljeni." +#: db/models/base.py:1465 forms/models.py:902 msgid "and" msgstr "i" +#: db/models/base.py:1467 #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "%(model_name)ssa poljem %(field_labels)sveć postoji." +msgstr "%(model_name)s sa poljem %(field_labels)s već postoji." +#: db/models/constraints.py:20 +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Ograničenje „%(name)s“ je prekršeno." + +#: db/models/fields/__init__.py:128 #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Vrednost %(value)r nije validna." +#: db/models/fields/__init__.py:129 msgid "This field cannot be null." msgstr "Ovo polje ne može da ostane prazno." +#: db/models/fields/__init__.py:130 msgid "This field cannot be blank." msgstr "Ovo polje ne može da ostane prazno." +#: db/models/fields/__init__.py:131 #, python-format msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s sa ovom vrednošću %(field_label)s već postoji." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#: db/models/fields/__init__.py:135 #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -msgstr "" +msgstr "%(field_label)s mora biti jedinstven(a) za %(date_field_label)s %(lookup_type)s." +#: db/models/fields/__init__.py:174 #, python-format msgid "Field of type: %(field_type)s" -msgstr "Ponje tipa: %(field_type)s" +msgstr "Polje tipa: %(field_type)s" +#: db/models/fields/__init__.py:1157 #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Vrednost \"%(value)s\" mora biti True ili False." +#: db/models/fields/__init__.py:1158 #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "\"%(value)s\" vrednost mora biti True, False ili None." +#: db/models/fields/__init__.py:1160 msgid "Boolean (Either True or False)" msgstr "Bulova vrednost (True ili False)" +#: db/models/fields/__init__.py:1210 #, python-format msgid "String (up to %(max_length)s)" msgstr "String (najviše %(max_length)s znakova)" +#: db/models/fields/__init__.py:1212 +msgid "String (unlimited)" +msgstr "String (neograničeno)" + +#: db/models/fields/__init__.py:1316 msgid "Comma-separated integers" msgstr "Celi brojevi razdvojeni zapetama" +#: db/models/fields/__init__.py:1417 #, python-format msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." -msgstr "" +msgstr "Vrednost \"%(value)s\" nema ispravan format datuma. Mora biti u formatu GGGG-MM-DD." +#: db/models/fields/__init__.py:1421 db/models/fields/__init__.py:1556 #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "Vrednost “%(value)s” ima odgovarajući format (GGGG-MM-DD), ali nije validan datum." +#: db/models/fields/__init__.py:1425 msgid "Date (without time)" msgstr "Datum (bez vremena)" +#: db/models/fields/__init__.py:1552 #, python-format msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." -msgstr "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ] format." +msgstr "Vrednost “%(value)s” je u nevažećem formatu. Mora se uneti u formatu YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." +#: db/models/fields/__init__.py:1560 #, python-format msgid "" -"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" -"[TZ]) but it is an invalid date/time." -msgstr "" +"“%(value)s” value has the correct format (YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time." +msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]), ali nije validna vrednost za datum i vreme." +#: db/models/fields/__init__.py:1565 msgid "Date (with time)" msgstr "Datum (sa vremenom)" +#: db/models/fields/__init__.py:1689 #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Vrednost “%(value)s” mora biti decimalni broj." +#: db/models/fields/__init__.py:1691 msgid "Decimal number" msgstr "Decimalni broj" +#: db/models/fields/__init__.py:1852 #, python-format msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." -msgstr "" +"“%(value)s” value has an invalid format. It must be in [DD] " +"[[HH:]MM:]ss[.uuuuuu] format." +msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu [DD] [[HH:]MM:]ss[.uuuuuu]." +#: db/models/fields/__init__.py:1856 msgid "Duration" msgstr "Vremenski interval" +#: db/models/fields/__init__.py:1908 msgid "Email address" msgstr "Imejl adresa" +#: db/models/fields/__init__.py:1933 msgid "File path" msgstr "Putanja fajla" +#: db/models/fields/__init__.py:2011 #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Vrednost “%(value)s” value mora biti tipa float." +#: db/models/fields/__init__.py:2013 msgid "Floating point number" msgstr "Broj sa pokrenom zapetom" +#: db/models/fields/__init__.py:2053 #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Vrednost “%(value)s” mora biti ceo broj." +#: db/models/fields/__init__.py:2055 msgid "Integer" msgstr "Ceo broj" +#: db/models/fields/__init__.py:2151 msgid "Big (8 byte) integer" msgstr "Veliki ceo broj" +#: db/models/fields/__init__.py:2168 +msgid "Small integer" +msgstr "Mali ceo broj" + +#: db/models/fields/__init__.py:2176 msgid "IPv4 address" msgstr "IPv4 adresa" +#: db/models/fields/__init__.py:2207 msgid "IP address" msgstr "IP adresa" +#: db/models/fields/__init__.py:2300 db/models/fields/__init__.py:2301 #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Vrednost “%(value)s” mora biti None, True ili False." +#: db/models/fields/__init__.py:2303 msgid "Boolean (Either True, False or None)" msgstr "Bulova vrednost (True, False ili None)" +#: db/models/fields/__init__.py:2354 +msgid "Positive big integer" +msgstr "Velik pozitivan celi broj" + +#: db/models/fields/__init__.py:2369 msgid "Positive integer" msgstr "Pozitivan ceo broj" +#: db/models/fields/__init__.py:2384 msgid "Positive small integer" msgstr "Pozitivan mali ceo broj" +#: db/models/fields/__init__.py:2400 #, python-format msgid "Slug (up to %(max_length)s)" msgstr "Slag (ne duži od %(max_length)s)" -msgid "Small integer" -msgstr "Mali ceo broj" - +#: db/models/fields/__init__.py:2436 msgid "Text" msgstr "Tekst" +#: db/models/fields/__init__.py:2511 #, python-format msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." -msgstr "" +msgstr "Vrednost “%(value)s” nije u odgovarajućem formatu. Mora biti u formatu HH:MM[:ss[.uuuuuu]]." +#: db/models/fields/__init__.py:2515 #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." -msgstr "" +msgstr "Vrednost “%(value)s” je u odgovarajućem formatu (HH:MM[:ss[.uuuuuu]]), ali nije validna vrednost za vreme." +#: db/models/fields/__init__.py:2519 msgid "Time" msgstr "Vreme" +#: db/models/fields/__init__.py:2627 msgid "URL" msgstr "URL" +#: db/models/fields/__init__.py:2651 msgid "Raw binary data" msgstr "Sirovi binarni podaci" +#: db/models/fields/__init__.py:2716 #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "Vrednost “%(value)s” nije validan UUID (jedinstveni ID)." +#: db/models/fields/__init__.py:2718 msgid "Universally unique identifier" -msgstr "" +msgstr "Univerzalno jedinstveni identifikator" +#: db/models/fields/files.py:232 msgid "File" msgstr "Fajl" +#: db/models/fields/files.py:393 msgid "Image" msgstr "Slika" +#: db/models/fields/json.py:26 +msgid "A JSON object" +msgstr "JSON objekat" + +#: db/models/fields/json.py:28 +msgid "Value must be valid JSON." +msgstr "Vrednost mora biti ispravni JSON." + +#: db/models/fields/related.py:939 #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." -msgstr "" +msgstr "Instanca modela %(model)s sa vrednošću %(field)s %(value)r ne postoji." +#: db/models/fields/related.py:941 msgid "Foreign Key (type determined by related field)" msgstr "Strani ključ (tip određuje referentno polje)" +#: db/models/fields/related.py:1235 msgid "One-to-one relationship" msgstr "Relacija jedan na jedan" +#: db/models/fields/related.py:1292 #, python-format msgid "%(from)s-%(to)s relationship" -msgstr "" +msgstr "Relacija %(from)s-%(to)s" +#: db/models/fields/related.py:1294 #, python-format msgid "%(from)s-%(to)s relationships" -msgstr "" +msgstr "Relacije %(from)s-%(to)s" +#: db/models/fields/related.py:1342 msgid "Many-to-many relationship" msgstr "Relacija više na više" #. Translators: If found as last label character, these punctuation #. characters will prevent the default label_suffix to be appended to the #. label +#: forms/boundfield.py:185 msgid ":?.!" msgstr ":?.!" +#: forms/fields.py:94 msgid "This field is required." msgstr "Ovo polje se mora popuniti." +#: forms/fields.py:303 msgid "Enter a whole number." msgstr "Unesite ceo broj." +#: forms/fields.py:474 forms/fields.py:1246 msgid "Enter a valid date." msgstr "Unesite ispravan datum." +#: forms/fields.py:497 forms/fields.py:1247 msgid "Enter a valid time." msgstr "Unesite ispravno vreme" +#: forms/fields.py:524 msgid "Enter a valid date/time." msgstr "Unesite ispravan datum/vreme." +#: forms/fields.py:558 msgid "Enter a valid duration." -msgstr "" +msgstr "Unesite ispravno trajanje." +#: forms/fields.py:559 #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "Broj dana mora biti između {min_days} i {max_days}." +#: forms/fields.py:628 msgid "No file was submitted. Check the encoding type on the form." msgstr "Fajl nije prebačen. Proverite tip enkodiranja formulara." +#: forms/fields.py:629 msgid "No file was submitted." msgstr "Fajl nije prebačen." +#: forms/fields.py:630 msgid "The submitted file is empty." msgstr "Prebačen fajl je prazan." +#: forms/fields.py:632 #, python-format -msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid "" +"Ensure this filename has at most %(max)d character (it has %(length)d)." msgid_plural "" "Ensure this filename has at most %(max)d characters (it has %(length)d)." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." +msgstr[1] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." +msgstr[2] "Ime fajla ne može imati više od %(max)d karaktera (trenutno ima %(length)d)." +#: forms/fields.py:637 msgid "Please either submit a file or check the clear checkbox, not both." msgstr "Može se samo poslati fajl ili izbrisati, ne oba." +#: forms/fields.py:701 msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "" -"Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je " -"oštećen." +msgstr "Prebacite ispravan fajl. Fajl koji je prebačen ili nije slika, ili je oštećen." +#: forms/fields.py:868 forms/fields.py:954 forms/models.py:1581 #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "" -"%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." +msgstr "%(value)s nije među ponuđenim vrednostima. Odaberite jednu od ponuđenih." +#: forms/fields.py:956 forms/fields.py:1075 forms/models.py:1579 msgid "Enter a list of values." msgstr "Unesite listu vrednosti." +#: forms/fields.py:1076 msgid "Enter a complete value." msgstr "Unesite kompletnu vrednost." +#: forms/fields.py:1315 msgid "Enter a valid UUID." msgstr "Unesite ispravan UUID." +#: forms/fields.py:1345 +msgid "Enter a valid JSON." +msgstr "Unesite ispravan JSON." + #. Translators: This is the default suffix added to form field labels +#: forms/forms.py:94 msgid ":" msgstr ":" +#: forms/forms.py:231 #, python-format msgid "(Hidden field %(name)s) %(error)s" -msgstr "" +msgstr "(Skriveno polje %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm nedostaje ili je izmenjena na pogrešan način." +#: forms/formsets.py:61 +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "Podaci od ManagementForm nedostaju ili su pokvareni. Polja koja nedostaju: %(field_names)s. Možda će biti potrebno da prijavite grešku ako se problem nastavi." +#: forms/formsets.py:65 #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Molim prosledite najviše %(num)d formular." +msgstr[1] "Molim prosledite najviše %(num)d formulara." +msgstr[2] "Molim prosledite najviše %(num)d formulara." +#: forms/formsets.py:70 #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] " Molim prosledite najmanje %(num)d formular." +msgstr[1] " Molim prosledite najmanje %(num)d formulara." +msgstr[2] " Molim prosledite najmanje %(num)d formulara." +#: forms/formsets.py:484 forms/formsets.py:491 msgid "Order" msgstr "Redosled" +#: forms/formsets.py:499 msgid "Delete" msgstr "Obriši" +#: forms/models.py:895 #, python-format msgid "Please correct the duplicate data for %(field)s." msgstr "Ispravite dupliran sadržaj za polja: %(field)s." +#: forms/models.py:900 #, python-format msgid "Please correct the duplicate data for %(field)s, which must be unique." -msgstr "" -"Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." +msgstr "Ispravite dupliran sadržaj za polja: %(field)s, koji mora da bude jedinstven." +#: forms/models.py:907 #, python-format msgid "" "Please correct the duplicate data for %(field_name)s which must be unique " "for the %(lookup)s in %(date_field)s." -msgstr "" -"Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude " -"jedinstven za %(lookup)s u %(date_field)s." +msgstr "Ispravite dupliran sadržaj za polja: %(field_name)s, koji mora da bude jedinstven za %(lookup)s u %(date_field)s." +#: forms/models.py:916 msgid "Please correct the duplicate values below." msgstr "Ispravite duplirane vrednosti dole." +#: forms/models.py:1353 msgid "The inline value did not match the parent instance." msgstr "Direktno uneta vrednost ne odgovara instanci roditelja." -msgid "Select a valid choice. That choice is not one of the available choices." +#: forms/models.py:1444 +msgid "" +"Select a valid choice. That choice is not one of the available choices." msgstr "Odabrana vrednost nije među ponuđenima. Odaberite jednu od ponuđenih." +#: forms/models.py:1583 #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "\"%(pk)s\" nije ispravna vrednost." +#: forms/utils.py:227 #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." -msgstr "" +msgstr "Vreme %(datetime)s se ne može protumačiti u vremenskoj zoni %(current_timezone)s; možda je dvosmisleno ili ne postoji." +#: forms/widgets.py:457 msgid "Clear" msgstr "Očisti" +#: forms/widgets.py:458 msgid "Currently" msgstr "Trenutno" +#: forms/widgets.py:459 msgid "Change" msgstr "Izmeni" +#: forms/widgets.py:796 msgid "Unknown" msgstr "Nepoznato" +#: forms/widgets.py:797 msgid "Yes" msgstr "Da" +#: forms/widgets.py:798 msgid "No" msgstr "Ne" -msgid "Year" -msgstr "Godina" - -msgid "Month" -msgstr "Mesec" - -msgid "Day" -msgstr "Dan" - +#. Translators: Please do not add spaces around commas. +#: template/defaultfilters.py:875 msgid "yes,no,maybe" msgstr "da,ne,možda" +#: template/defaultfilters.py:905 template/defaultfilters.py:922 #, python-format msgid "%(size)d byte" msgid_plural "%(size)d bytes" @@ -803,464 +1083,556 @@ msgstr[0] "%(size)d bajt" msgstr[1] "%(size)d bajta" msgstr[2] "%(size)d bajtova" +#: template/defaultfilters.py:924 #, python-format msgid "%s KB" msgstr "%s KB" +#: template/defaultfilters.py:926 #, python-format msgid "%s MB" msgstr "%s MB" +#: template/defaultfilters.py:928 #, python-format msgid "%s GB" msgstr "%s GB" +#: template/defaultfilters.py:930 #, python-format msgid "%s TB" msgstr "%s TB" +#: template/defaultfilters.py:932 #, python-format msgid "%s PB" msgstr "%s PB" +#: utils/dateformat.py:73 msgid "p.m." msgstr "po p." +#: utils/dateformat.py:74 msgid "a.m." msgstr "pre p." +#: utils/dateformat.py:79 msgid "PM" msgstr "PM" +#: utils/dateformat.py:80 msgid "AM" msgstr "AM" +#: utils/dateformat.py:152 msgid "midnight" msgstr "ponoć" +#: utils/dateformat.py:154 msgid "noon" msgstr "podne" +#: utils/dates.py:7 msgid "Monday" msgstr "ponedeljak" +#: utils/dates.py:8 msgid "Tuesday" msgstr "utorak" +#: utils/dates.py:9 msgid "Wednesday" msgstr "sreda" +#: utils/dates.py:10 msgid "Thursday" msgstr "četvrtak" +#: utils/dates.py:11 msgid "Friday" msgstr "petak" +#: utils/dates.py:12 msgid "Saturday" msgstr "subota" +#: utils/dates.py:13 msgid "Sunday" msgstr "nedelja" +#: utils/dates.py:16 msgid "Mon" msgstr "pon." +#: utils/dates.py:17 msgid "Tue" msgstr "uto." +#: utils/dates.py:18 msgid "Wed" msgstr "sre." +#: utils/dates.py:19 msgid "Thu" msgstr "čet." +#: utils/dates.py:20 msgid "Fri" msgstr "pet." +#: utils/dates.py:21 msgid "Sat" msgstr "sub." +#: utils/dates.py:22 msgid "Sun" msgstr "ned." +#: utils/dates.py:25 msgid "January" msgstr "januar" +#: utils/dates.py:26 msgid "February" msgstr "februar" +#: utils/dates.py:27 msgid "March" msgstr "mart" +#: utils/dates.py:28 msgid "April" msgstr "april" +#: utils/dates.py:29 msgid "May" msgstr "maj" +#: utils/dates.py:30 msgid "June" msgstr "jun" +#: utils/dates.py:31 msgid "July" msgstr "jul" +#: utils/dates.py:32 msgid "August" msgstr "avgust" +#: utils/dates.py:33 msgid "September" msgstr "septembar" +#: utils/dates.py:34 msgid "October" msgstr "oktobar" +#: utils/dates.py:35 msgid "November" msgstr "novembar" +#: utils/dates.py:36 msgid "December" msgstr "decembar" +#: utils/dates.py:39 msgid "jan" msgstr "jan." +#: utils/dates.py:40 msgid "feb" msgstr "feb." +#: utils/dates.py:41 msgid "mar" msgstr "mar." +#: utils/dates.py:42 msgid "apr" msgstr "apr." +#: utils/dates.py:43 msgid "may" msgstr "maj." +#: utils/dates.py:44 msgid "jun" msgstr "jun." +#: utils/dates.py:45 msgid "jul" msgstr "jul." +#: utils/dates.py:46 msgid "aug" msgstr "aug." +#: utils/dates.py:47 msgid "sep" msgstr "sep." +#: utils/dates.py:48 msgid "oct" msgstr "okt." +#: utils/dates.py:49 msgid "nov" msgstr "nov." +#: utils/dates.py:50 msgid "dec" msgstr "dec." +#: utils/dates.py:53 msgctxt "abbrev. month" msgid "Jan." msgstr "Jan." +#: utils/dates.py:54 msgctxt "abbrev. month" msgid "Feb." msgstr "Feb." +#: utils/dates.py:55 msgctxt "abbrev. month" msgid "March" msgstr "Mart" +#: utils/dates.py:56 msgctxt "abbrev. month" msgid "April" msgstr "April" +#: utils/dates.py:57 msgctxt "abbrev. month" msgid "May" msgstr "Maj" +#: utils/dates.py:58 msgctxt "abbrev. month" msgid "June" msgstr "Jun" +#: utils/dates.py:59 msgctxt "abbrev. month" msgid "July" msgstr "Jul" +#: utils/dates.py:60 msgctxt "abbrev. month" msgid "Aug." msgstr "Avg." +#: utils/dates.py:61 msgctxt "abbrev. month" msgid "Sept." msgstr "Sept." +#: utils/dates.py:62 msgctxt "abbrev. month" msgid "Oct." msgstr "Okt." +#: utils/dates.py:63 msgctxt "abbrev. month" msgid "Nov." msgstr "Nov." +#: utils/dates.py:64 msgctxt "abbrev. month" msgid "Dec." msgstr "Dec." +#: utils/dates.py:67 msgctxt "alt. month" msgid "January" msgstr "Januar" +#: utils/dates.py:68 msgctxt "alt. month" msgid "February" msgstr "Februar" +#: utils/dates.py:69 msgctxt "alt. month" msgid "March" msgstr "Mart" +#: utils/dates.py:70 msgctxt "alt. month" msgid "April" msgstr "April" +#: utils/dates.py:71 msgctxt "alt. month" msgid "May" msgstr "Maj" +#: utils/dates.py:72 msgctxt "alt. month" msgid "June" msgstr "Jun" +#: utils/dates.py:73 msgctxt "alt. month" msgid "July" msgstr "Jul" +#: utils/dates.py:74 msgctxt "alt. month" msgid "August" msgstr "Avgust" +#: utils/dates.py:75 msgctxt "alt. month" msgid "September" msgstr "Septembar" +#: utils/dates.py:76 msgctxt "alt. month" msgid "October" msgstr "Oktobar" +#: utils/dates.py:77 msgctxt "alt. month" msgid "November" msgstr "Novembar" +#: utils/dates.py:78 msgctxt "alt. month" msgid "December" msgstr "Decembar" +#: utils/ipv6.py:8 msgid "This is not a valid IPv6 address." msgstr "Ovo nije ispravna IPv6 adresa." +#: utils/text.py:70 #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s..." +#: utils/text.py:255 msgid "or" msgstr "ili" #. Translators: This string is used as a separator between list elements +#: utils/text.py:274 utils/timesince.py:135 msgid ", " msgstr "," +#: utils/timesince.py:8 #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d godina" +msgstr[1] "%(num)d godine" +msgstr[2] "%(num)d godina" +#: utils/timesince.py:9 #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d mesec" +msgstr[1] "%(num)d meseca" +msgstr[2] "%(num)d meseci" +#: utils/timesince.py:10 #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d nedelja" +msgstr[1] "%(num)d nedelje" +msgstr[2] "%(num)d nedelja" +#: utils/timesince.py:11 #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dan" +msgstr[1] "%(num)d dana" +msgstr[2] "%(num)d dana" +#: utils/timesince.py:12 #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d sat" +msgstr[1] "%(num)d sata" +msgstr[2] "%(num)d sati" +#: utils/timesince.py:13 #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -msgid "0 minutes" -msgstr "0 minuta" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minuta" +msgstr[2] "%(num)d minuta" +#: views/csrf.py:29 msgid "Forbidden" msgstr "Zabranjeno" +#: views/csrf.py:30 msgid "CSRF verification failed. Request aborted." msgstr "CSRF verifikacija nije prošla. Zahtev odbijen." +#: views/csrf.py:34 msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." -msgstr "" -"Ova poruka je prikazana jer ovaj HTTPS sajt zahteva da \"Referer header\" " -"bude poslat od strane vašeg internet pregledača, što trenutno nije slučaj. " -"Pomenuto zaglavlje je potrebno iz bezbedonosnih razloga, da bi se osiguralo " -"da vaš pregledač nije pod kontrolom trećih lica." +msgstr "Ova poruka je prikazana jer ovaj HTTPS sajt zahteva da \"Referer header\" bude poslat od strane vašeg internet pregledača, što trenutno nije slučaj. Pomenuto zaglavlje je potrebno iz bezbedonosnih razloga, da bi se osiguralo da vaš pregledač nije pod kontrolom trećih lica." +#: views/csrf.py:40 msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." -msgstr "" -"Ako ste podesili internet pregledač da ne šalje \"Referer\" zaglavlja, " -"ponovo ih uključite, barem za ovaj sajt, ili za HTTPS konekcije, ili za " -"\"same-origin\" zahteve." +msgstr "Ako ste podesili internet pregledač da ne šalje \"Referer\" zaglavlja, ponovo ih uključite, barem za ovaj sajt, ili za HTTPS konekcije, ili za \"same-origin\" zahteve." +#: views/csrf.py:45 msgid "" -"If you are using the tag or " -"including the “Referrer-Policy: no-referrer” header, please remove them. The " -"CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." -msgstr "" - +"If you are using the tag or" +" including the “Referrer-Policy: no-referrer” header, please remove them. " +"The CSRF protection requires the “Referer” header to do strict referer " +"checking. If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "Ako koristite tag ili \"Referrer-Policy: no-referrer\" zaglavlje, molimo da ih uklonite. CSRF zaštita zahteva \"Referer\" zaglavlje da bi se obavila striktna \"referrer\" provera. Ukoliko vas brine privatnost, koristite alternative kao za linkove ka drugim sajtovima." + +#: views/csrf.py:54 msgid "" "You are seeing this message because this site requires a CSRF cookie when " "submitting forms. This cookie is required for security reasons, to ensure " "that your browser is not being hijacked by third parties." -msgstr "" -"Ova poruka je prikazana jer ovaj sajt zahteva CSRF kuki kada se prosleđuju " -"podaci iz formi. Ovaj kuki je potreban iz sigurnosnih razloga, da bi se " -"osiguralo da vaš pretraživač nije pod kontrolom trećih lica." +msgstr "Ova poruka je prikazana jer ovaj sajt zahteva CSRF kuki kada se prosleđuju podaci iz formi. Ovaj kuki je potreban iz sigurnosnih razloga, da bi se osiguralo da vaš pretraživač nije pod kontrolom trećih lica." +#: views/csrf.py:60 msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." -msgstr "" -"Ako je vaš internet pregedač podešen da onemogući kolačiće, molimo da ih " -"uključite, barem za ovaj sajt, ili za \"same-origin\" zahteve." +msgstr "Ako je vaš internet pregedač podešen da onemogući kolačiće, molimo da ih uključite, barem za ovaj sajt, ili za \"same-origin\" zahteve." +#: views/csrf.py:66 msgid "More information is available with DEBUG=True." msgstr "Više informacija je dostupno sa DEBUG=True." +#: views/generic/dates.py:44 msgid "No year specified" msgstr "Godina nije naznačena" +#: views/generic/dates.py:64 views/generic/dates.py:115 +#: views/generic/dates.py:214 msgid "Date out of range" msgstr "Datum van opsega" +#: views/generic/dates.py:94 msgid "No month specified" msgstr "Mesec nije naznačen" +#: views/generic/dates.py:147 msgid "No day specified" msgstr "Dan nije naznačen" +#: views/generic/dates.py:194 msgid "No week specified" msgstr "Nedelja nije naznačena" +#: views/generic/dates.py:349 views/generic/dates.py:380 #, python-format msgid "No %(verbose_name_plural)s available" msgstr "Nedostupni objekti %(verbose_name_plural)s" +#: views/generic/dates.py:652 #, python-format msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." -msgstr "" -"Opcija „future“ nije dostupna za „%(verbose_name_plural)s“ jer " -"%(class_name)s.allow_future ima vrednost False." +"Future %(verbose_name_plural)s not available because " +"%(class_name)s.allow_future is False." +msgstr "Opcija „future“ nije dostupna za „%(verbose_name_plural)s“ jer %(class_name)s.allow_future ima vrednost False." +#: views/generic/dates.py:692 #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Neispravan datum \"%(datestr)s\" za format \"%(format)s\"" +#: views/generic/detail.py:56 #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Nijedan objekat klase %(verbose_name)s nije nađen datim upitom." +#: views/generic/list.py:70 msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Stranica nije poslednja, niti može biti konvertovana u tip \"int\"." +#: views/generic/list.py:77 #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" +msgstr "Neispravna strana (%(page_number)s): %(message)s" +#: views/generic/list.py:169 #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "Prazna lista i „%(class_name)s.allow_empty“ ima vrednost False." +#: views/static.py:48 msgid "Directory indexes are not allowed here." msgstr "Indeksi direktorijuma nisu dozvoljeni ovde." +#: views/static.py:50 #, python-format msgid "“%(path)s” does not exist" msgstr "„%(path)s“ ne postoji" +#: views/static.py:67 views/templates/directory_index.html:8 +#: views/templates/directory_index.html:11 #, python-format msgid "Index of %(directory)s" msgstr "Indeks direktorijuma %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Đango: veb okruženje za perfekcioniste sa strogim rokovima." +#: views/templates/default_urlconf.html:7 +#: views/templates/default_urlconf.html:220 +msgid "The install worked successfully! Congratulations!" +msgstr "Instalacija je prošla uspešno. Čestitke!" +#: views/templates/default_urlconf.html:206 #, python-format msgid "" "View release notes for Django %(version)s" -msgstr "" -"Pogledajte napomene uz izdanje za Đango " -"%(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Instalacija je prošla uspešno. Čestitke!" +msgstr "Pogledajte napomene uz izdanje za Đango %(version)s" +#: views/templates/default_urlconf.html:221 #, python-format msgid "" -"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." -msgstr "" -"Ova strana je prikazana jer je DEBUG=True u vašim podešavanjima i niste konfigurisali nijedan URL." +"You are seeing this page because DEBUG=True is in your settings file " +"and you have not configured any URLs." +msgstr "Ova strana je prikazana jer je DEBUG=True u vašim podešavanjima i niste konfigurisali nijedan URL." +#: views/templates/default_urlconf.html:229 msgid "Django Documentation" msgstr "Đango dokumentacija" +#: views/templates/default_urlconf.html:230 msgid "Topics, references, & how-to’s" msgstr "Teme, reference, & kako-da" +#: views/templates/default_urlconf.html:238 msgid "Tutorial: A Polling App" msgstr "Uputstvo: aplikacija za glasanje" +#: views/templates/default_urlconf.html:239 msgid "Get started with Django" msgstr "Počnite sa Đangom" +#: views/templates/default_urlconf.html:247 msgid "Django Community" msgstr "Đango zajednica" +#: views/templates/default_urlconf.html:248 msgid "Connect, get help, or contribute" msgstr "Povežite se, potražite pomoć ili dajte doprinos" diff --git a/django/conf/locale/sr_Latn/formats.py b/django/conf/locale/sr_Latn/formats.py index 937a40925785..0078895923d1 100644 --- a/django/conf/locale/sr_Latn/formats.py +++ b/django/conf/locale/sr_Latn/formats.py @@ -2,38 +2,43 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j. F Y.' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j. F Y. H:i' -YEAR_MONTH_FORMAT = 'F Y.' -MONTH_DAY_FORMAT = 'j. F' -SHORT_DATE_FORMAT = 'j.m.Y.' -SHORT_DATETIME_FORMAT = 'j.m.Y. H:i' +DATE_FORMAT = "j. F Y." +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j. F Y. H:i" +YEAR_MONTH_FORMAT = "F Y." +MONTH_DAY_FORMAT = "j. F" +SHORT_DATE_FORMAT = "j.m.Y." +SHORT_DATETIME_FORMAT = "j.m.Y. H:i" FIRST_DAY_OF_WEEK = 1 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y.', '%d.%m.%y.', # '25.10.2006.', '25.10.06.' - '%d. %m. %Y.', '%d. %m. %y.', # '25. 10. 2006.', '25. 10. 06.' - # '%d. %b %y.', '%d. %B %y.', # '25. Oct 06.', '25. October 06.' - # '%d. %b \'%y.', '%d. %B \'%y.', # '25. Oct '06.', '25. October '06.' - # '%d. %b %Y.', '%d. %B %Y.', # '25. Oct 2006.', '25. October 2006.' + "%d.%m.%Y.", # '25.10.2006.' + "%d.%m.%y.", # '25.10.06.' + "%d. %m. %Y.", # '25. 10. 2006.' + "%d. %m. %y.", # '25. 10. 06.' + # "%d. %b %y.", # '25. Oct 06.' + # "%d. %B %y.", # '25. October 06.' + # "%d. %b '%y.", # '25. Oct '06.' + # "%d. %B '%y.", #'25. October '06.' + # "%d. %b %Y.", # '25. Oct 2006.' + # "%d. %B %Y.", # '25. October 2006.' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y. %H:%M:%S', # '25.10.2006. 14:30:59' - '%d.%m.%Y. %H:%M:%S.%f', # '25.10.2006. 14:30:59.000200' - '%d.%m.%Y. %H:%M', # '25.10.2006. 14:30' - '%d.%m.%y. %H:%M:%S', # '25.10.06. 14:30:59' - '%d.%m.%y. %H:%M:%S.%f', # '25.10.06. 14:30:59.000200' - '%d.%m.%y. %H:%M', # '25.10.06. 14:30' - '%d. %m. %Y. %H:%M:%S', # '25. 10. 2006. 14:30:59' - '%d. %m. %Y. %H:%M:%S.%f', # '25. 10. 2006. 14:30:59.000200' - '%d. %m. %Y. %H:%M', # '25. 10. 2006. 14:30' - '%d. %m. %y. %H:%M:%S', # '25. 10. 06. 14:30:59' - '%d. %m. %y. %H:%M:%S.%f', # '25. 10. 06. 14:30:59.000200' - '%d. %m. %y. %H:%M', # '25. 10. 06. 14:30' + "%d.%m.%Y. %H:%M:%S", # '25.10.2006. 14:30:59' + "%d.%m.%Y. %H:%M:%S.%f", # '25.10.2006. 14:30:59.000200' + "%d.%m.%Y. %H:%M", # '25.10.2006. 14:30' + "%d.%m.%y. %H:%M:%S", # '25.10.06. 14:30:59' + "%d.%m.%y. %H:%M:%S.%f", # '25.10.06. 14:30:59.000200' + "%d.%m.%y. %H:%M", # '25.10.06. 14:30' + "%d. %m. %Y. %H:%M:%S", # '25. 10. 2006. 14:30:59' + "%d. %m. %Y. %H:%M:%S.%f", # '25. 10. 2006. 14:30:59.000200' + "%d. %m. %Y. %H:%M", # '25. 10. 2006. 14:30' + "%d. %m. %y. %H:%M:%S", # '25. 10. 06. 14:30:59' + "%d. %m. %y. %H:%M:%S.%f", # '25. 10. 06. 14:30:59.000200' + "%d. %m. %y. %H:%M", # '25. 10. 06. 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/sv/LC_MESSAGES/django.mo b/django/conf/locale/sv/LC_MESSAGES/django.mo index fa908eb93be3..060ef0963c39 100644 Binary files a/django/conf/locale/sv/LC_MESSAGES/django.mo and b/django/conf/locale/sv/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/sv/LC_MESSAGES/django.po b/django/conf/locale/sv/LC_MESSAGES/django.po index 7af1f532852c..d2f455d5147c 100644 --- a/django/conf/locale/sv/LC_MESSAGES/django.po +++ b/django/conf/locale/sv/LC_MESSAGES/django.po @@ -1,11 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Albin Larsson , 2022 # Alex Nordlund , 2012 -# Andreas Pelme , 2014 +# Anders Hovmöller , 2023 +# Anders Jonsson , 2022 +# Andreas Pelme , 2014,2021 +# Elias Johnstone , 2022 # Gustaf Hansen , 2015 # Jannis Leidel , 2011 # Jonathan Lindén, 2015 +# Jörgen Olofsson, 2024 +# Ken Lewerentz, 2022 # Jonathan Lindén, 2014 # Mattias Hansson , 2016 # Mattias Benjaminsson , 2011 @@ -13,14 +19,15 @@ # Rasmus Précenth , 2014 # Samuel Linde , 2011 # Thomas Lundqvist, 2013,2016 +# Tomas Lööw , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Jörgen Olofsson, 2024\n" +"Language-Team: Swedish (http://app.transifex.com/django/django/language/" "sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,6 +41,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Arabiska" +msgid "Algerian Arabic" +msgstr "Algerisk arabiska" + msgid "Asturian" msgstr "Asturiska" @@ -58,6 +68,9 @@ msgstr "Bosniska" msgid "Catalan" msgstr "Katalanska" +msgid "Central Kurdish (Sorani)" +msgstr "Kurdiska (Sorani)" + msgid "Czech" msgstr "Tjeckiska" @@ -98,7 +111,7 @@ msgid "Colombian Spanish" msgstr "Colombiansk spanska" msgid "Mexican Spanish" -msgstr "Mexikansk Spanska" +msgstr "Mexikansk spanska" msgid "Nicaraguan Spanish" msgstr "Nicaraguansk spanska" @@ -157,6 +170,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesiska" +msgid "Igbo" +msgstr "Igbo" + msgid "Ido" msgstr "Ido" @@ -187,6 +203,9 @@ msgstr "Kannada" msgid "Korean" msgstr "Koreanska" +msgid "Kyrgyz" +msgstr "Kirgiziska" + msgid "Luxembourgish" msgstr "Luxemburgiska" @@ -208,6 +227,9 @@ msgstr "Mongoliska" msgid "Marathi" msgstr "Marathi" +msgid "Malay" +msgstr "Malajiska" + msgid "Burmese" msgstr "Burmesiska" @@ -271,9 +293,15 @@ msgstr "Tamilska" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "Tadzjikiska" + msgid "Thai" msgstr "Thailändska" +msgid "Turkmen" +msgstr "Turkmeniska" + msgid "Turkish" msgstr "Turkiska" @@ -283,6 +311,9 @@ msgstr "Tatariska" msgid "Udmurt" msgstr "Udmurtiska" +msgid "Uyghur" +msgstr "Uiguriska" + msgid "Ukrainian" msgstr "Ukrainska" @@ -290,7 +321,7 @@ msgid "Urdu" msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbekiska" msgid "Vietnamese" msgstr "Vietnamesiska" @@ -313,6 +344,11 @@ msgstr "Statiska filer" msgid "Syndication" msgstr "Syndikering" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + msgid "That page number is not an integer" msgstr "Sidnumret är inte ett heltal" @@ -325,6 +361,9 @@ msgstr "Sidan innehåller inga resultat" msgid "Enter a valid value." msgstr "Fyll i ett giltigt värde." +msgid "Enter a valid domain name." +msgstr "Fyll i ett giltigt domännamn." + msgid "Enter a valid URL." msgstr "Fyll i en giltig URL." @@ -338,20 +377,28 @@ msgstr "Fyll i en giltig e-postadress." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " +"bindestreck i Unicode." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Fyll i en giltig 'slug', beståendes av bokstäver, siffror, understreck eller " +"bindestreck i Unicode." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Fyll i en giltig %(protocol)s adress." -msgid "Enter a valid IPv4 address." -msgstr "Fyll i en giltig IPv4 adress." +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Ange en giltig IPv6-adress." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Ange en giltig IPv4 eller IPv6-adress." +msgid "IPv4 or IPv6" +msgstr "IPv4 eller IPv6" msgid "Enter only digits separated by commas." msgstr "Fyll enbart i siffror separerade med kommatecken." @@ -371,6 +418,20 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Kontrollera att detta värde är större än eller lika med %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Kontrollera att detta värde är multipel av stegstorlek %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Kontrollera att detta värde är en multipel med stegstorlek %(limit_value)s, " +"med början från %(offset)s, t ex. %(offset)s, %(valid_value1)s, " +"%(valid_value2)s och så vidare" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -429,6 +490,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Filändelsen “%(extension)s” är inte giltig. Giltiga filändelser är: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Null-tecken är inte tillåtna." @@ -440,6 +503,10 @@ msgstr "och" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s med samma %(field_labels)s finns redan." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Begränsningen “%(name)s” överträds." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Värdet %(value)r är inget giltigt alternativ." @@ -454,8 +521,8 @@ msgstr "Detta fält får inte vara tomt." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s med detta %(field_label)s finns redan." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -468,11 +535,11 @@ msgstr "Fält av typ: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "Värdet \"%(value)s\" måste vara antingen True eller False." #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Värdet ”%(value)s” måste vara antingen True, False eller None." msgid "Boolean (Either True or False)" msgstr "Boolesk (antingen True eller False)" @@ -481,6 +548,9 @@ msgstr "Boolesk (antingen True eller False)" msgid "String (up to %(max_length)s)" msgstr "Sträng (upp till %(max_length)s)" +msgid "String (unlimited)" +msgstr "Sträng (obegränsad)" + msgid "Comma-separated integers" msgstr "Komma-separerade heltal" @@ -489,12 +559,16 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” har ett ogiltigt datumformat. Det måste vara i formatet YYYY-MM-" +"DD." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"Värdet “%(value)s” har det giltiga formatet (YYYY-MM-DD) men det är ett " +"ogiltigt datum." msgid "Date (without time)" msgstr "Datum (utan tid)" @@ -504,19 +578,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” har ett ogiltigt format. Det måste vara i formatet YYYY-MM-DD HH:" +"MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s” har det giltiga formatet (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"men ett ogiltigt datum/tid." msgid "Date (with time)" msgstr "Datum (med tid)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "Värdet “%(value)s” måste vara ett decimaltal." msgid "Decimal number" msgstr "Decimaltal" @@ -526,6 +604,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s” har ett ogiltigt format. Det måste vara i formatet [DD] " +"[[HH:]MM:]ss[.uuuuuu]." msgid "Duration" msgstr "Tidsspann" @@ -538,14 +618,14 @@ msgstr "Sökväg till fil" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "Värdet \"%(value)s\" måste vara ett flyttal." msgid "Floating point number" msgstr "Flyttal" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "Värdet \"%(value)s\" måste vara ett heltal." msgid "Integer" msgstr "Heltal" @@ -553,6 +633,9 @@ msgstr "Heltal" msgid "Big (8 byte) integer" msgstr "Stort (8 byte) heltal" +msgid "Small integer" +msgstr "Litet heltal" + msgid "IPv4 address" msgstr "IPv4-adress" @@ -561,11 +644,14 @@ msgstr "IP-adress" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "Värdet ”%(value)s” måste vara antingen None, True eller False." msgid "Boolean (Either True, False or None)" msgstr "Boolesk (antingen True, False eller None)" +msgid "Positive big integer" +msgstr "Positivt stort heltal" + msgid "Positive integer" msgstr "Positivt heltal" @@ -576,9 +662,6 @@ msgstr "Positivt litet heltal" msgid "Slug (up to %(max_length)s)" msgstr "Slug (upp till %(max_length)s)" -msgid "Small integer" -msgstr "Litet heltal" - msgid "Text" msgstr "Text" @@ -587,12 +670,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s” har ett ogiltigt format. Det måste vara i formatet HH:MM[:ss[." +"uuuuuu]]." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"Värdet “%(value)s” har det giltiga formatet (HH:MM[:ss[.uuuuuu]]) men det är " +"en ogiltig tid." msgid "Time" msgstr "Tid" @@ -605,7 +692,7 @@ msgstr "Rå binärdata" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” är inget giltigt UUID." msgid "Universally unique identifier" msgstr "Globalt unik identifierare" @@ -616,6 +703,12 @@ msgstr "Fil" msgid "Image" msgstr "Bild" +msgid "A JSON object" +msgstr "Ett JSON-objekt" + +msgid "Value must be valid JSON." +msgstr "Värdet måste vara giltig JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Modell %(model)s med %(field)s %(value)r finns inte." @@ -710,6 +803,9 @@ msgstr "Fyll i ett fullständigt värde." msgid "Enter a valid UUID." msgstr "Fyll i ett giltigt UUID." +msgid "Enter a valid JSON." +msgstr "Fyll i ett giltigt JSON." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -718,20 +814,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Gömt fält %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm data saknas eller har manipulerats" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm-data saknas eller har manipulerats. Saknade fält: " +"%(field_names)s. Du kan behöva lämna in en felrapport om problemet kvarstår." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Vänligen lämna %d eller färre formulär." -msgstr[1] "Vänligen lämna %d eller färre formulär." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Vänligen skicka som mest %(num)d formulär." +msgstr[1] "Vänligen skicka som mest %(num)d formulär." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Vänligen skicka %d eller fler formulär." -msgstr[1] "Vänligen skicka %d eller fler formulär." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Vänligen skicka minst %(num)d formulär." +msgstr[1] "Vänligen skicka minst %(num)d formulär." msgid "Order" msgstr "Sortering" @@ -768,13 +869,15 @@ msgstr "" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” är inte ett giltigt värde." #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s kunde inte tolkas i tidszonen %(current_timezone)s; det kan " +"vara en ogiltig eller tvetydigt tidpunkt." msgid "Clear" msgstr "Rensa" @@ -794,15 +897,7 @@ msgstr "Ja" msgid "No" msgstr "Nej" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "ja,nej,kanske" @@ -1076,70 +1171,78 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d år" -msgstr[1] "%d år" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d år" +msgstr[1] "%(num)d år" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d månad" -msgstr[1] "%d månader" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d månad" +msgstr[1] "%(num)d månader" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d vecka" -msgstr[1] "%d veckor" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d vecka" +msgstr[1] "%(num)d veckor" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d dag" -msgstr[1] "%d dagar" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d dag" +msgstr[1] "%(num)d dagar" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d timme" -msgstr[1] "%d timmar" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d timme" +msgstr[1] "%(num)d timmar" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d minut" -msgstr[1] "%d minuter" - -msgid "0 minutes" -msgstr "0 minuter" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minuter" msgid "Forbidden" -msgstr "Ottillåtet" +msgstr "Otillåtet" msgid "CSRF verification failed. Request aborted." msgstr "CSRF-verifikation misslyckades. Förfrågan avbröts." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"Du ser detta meddelande eftersom denna HTTPS-sida kräver att en “Referer " +"header” skickas från din webbläsare, men ingen skickades. Denna header krävs " +"av säkerhetsskäl, för att säkerställa att din webbläsare inte kapats." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Om 'Referer' headers är inaktiverade i din webbläsare, vänligen återaktivera " +"dem, åtminstone för denna sida, eller för HTTPS-anslutningar eller för 'same-" +"origin'-förfrågningar." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Om du använder -taggen eller " +"har med ”Referrer-Policy: no-referrer”, ta bort dem. CSRF-skyddet kräver " +"”Referer” för att kunna göra sin strikta kontroll. Om du oroar dig över din " +"integritet, använd alternativ såsom för länkar " +"till tredjepart." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1154,6 +1257,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"Om cookies är inaktiverade i din webbläsare, vänligen återaktivera dem, " +"åtminstone för denna sida eller för “same-origin”-förfrågningar." msgid "More information is available with DEBUG=True." msgstr "Mer information är tillgänglig med DEBUG=True." @@ -1187,14 +1292,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "Ogiltig datumsträng “%(datestr)s” med givet format “%(format)s”" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Hittade inga %(verbose_name)s som matchar frågan" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Sidan är inte 'last', och kan inte heller omvandlas till en int." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1202,21 +1307,21 @@ msgstr "Ogiltig sida (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Tom lista och '%(class_name)s.allow_empty' är False." msgid "Directory indexes are not allowed here." msgstr "Kataloglistningar är inte tillåtna här." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "\"%(path)s\" finns inte" #, python-format msgid "Index of %(directory)s" msgstr "Innehåll i %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: webb-ramverket för perfektionister med deadlines." +msgid "The install worked successfully! Congratulations!" +msgstr "Installationen lyckades! Grattis!" #, python-format msgid "" @@ -1226,26 +1331,23 @@ msgstr "" "Visa release notes för Django %(version)s" -msgid "The install worked successfully! Congratulations!" -msgstr "Installationen lyckades! Grattis!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Du ser den här sidan eftersom DEBUG=True i din settings-fil och du har inte konfigurerat några URL:" -"er." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True i din settings-fil och du har inte " +"konfigurerat några URL:er." msgid "Django Documentation" msgstr "Djangodokumentation" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Ämnen, referenser och how-to’s" msgid "Tutorial: A Polling App" msgstr "Tutorial: En undersöknings-app" diff --git a/django/conf/locale/sv/formats.py b/django/conf/locale/sv/formats.py index 94675268933b..29e63173921d 100644 --- a/django/conf/locale/sv/formats.py +++ b/django/conf/locale/sv/formats.py @@ -2,34 +2,34 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'j F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'Y-m-d' -SHORT_DATETIME_FORMAT = 'Y-m-d H:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "j F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y-m-d" +SHORT_DATETIME_FORMAT = "Y-m-d H:i" FIRST_DAY_OF_WEEK = 1 # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior # Kept ISO formats as they are in first position DATE_INPUT_FORMATS = [ - '%Y-%m-%d', # '2006-10-25' - '%m/%d/%Y', # '10/25/2006' - '%m/%d/%y', # '10/25/06' + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' ] DATETIME_INPUT_FORMATS = [ - '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' - '%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200' - '%Y-%m-%d %H:%M', # '2006-10-25 14:30' - '%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' - '%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200' - '%m/%d/%Y %H:%M', # '10/25/2006 14:30' - '%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' - '%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200' - '%m/%d/%y %H:%M', # '10/25/06 14:30' + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ta/LC_MESSAGES/django.mo b/django/conf/locale/ta/LC_MESSAGES/django.mo index ccea32eeed01..1c684f8b7f79 100644 Binary files a/django/conf/locale/ta/LC_MESSAGES/django.mo and b/django/conf/locale/ta/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ta/LC_MESSAGES/django.po b/django/conf/locale/ta/LC_MESSAGES/django.po index b7733c110969..ad7bf714c15f 100644 --- a/django/conf/locale/ta/LC_MESSAGES/django.po +++ b/django/conf/locale/ta/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 # Jannis Leidel , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Tamil (http://www.transifex.com/django/django/language/ta/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +23,9 @@ msgstr "" msgid "Arabic" msgstr "அரபிக்" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "" @@ -145,6 +149,9 @@ msgstr "" msgid "Indonesian" msgstr "" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "" @@ -175,6 +182,9 @@ msgstr "" msgid "Korean" msgstr "" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "" @@ -259,9 +269,15 @@ msgstr "தமிழ்" msgid "Telugu" msgstr "" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "துருக்கிஷ்" @@ -540,6 +556,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "இலக்கு முறை (சரி, தவறு அல்லது ஒன்றும் இல்லை)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "" @@ -590,6 +609,12 @@ msgstr "" msgid "Image" msgstr "" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -678,6 +703,9 @@ msgstr "" msgid "Enter a valid UUID." msgstr "" +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr "" @@ -758,17 +786,9 @@ msgstr "ஆம்" msgid "No" msgstr "இல்லை" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "ஆம், இல்லை, இருக்கலாம்" +msgstr "ஆம்,இல்லை,இருக்கலாம்" #, python-format msgid "%(size)d byte" @@ -1075,9 +1095,6 @@ msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" -msgid "0 minutes" -msgstr "" - msgid "Forbidden" msgstr "" diff --git a/django/conf/locale/ta/formats.py b/django/conf/locale/ta/formats.py index 61810e3fa737..d023608ca224 100644 --- a/django/conf/locale/ta/formats.py +++ b/django/conf/locale/ta/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F, Y' -TIME_FORMAT = 'g:i A' +DATE_FORMAT = "j F, Y" +TIME_FORMAT = "g:i A" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M, Y' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M, Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = diff --git a/django/conf/locale/te/LC_MESSAGES/django.mo b/django/conf/locale/te/LC_MESSAGES/django.mo index fec1b9200b6e..1366ff278543 100644 Binary files a/django/conf/locale/te/LC_MESSAGES/django.mo and b/django/conf/locale/te/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/te/LC_MESSAGES/django.po b/django/conf/locale/te/LC_MESSAGES/django.po index 73f1b9a691e7..168ffa4d42aa 100644 --- a/django/conf/locale/te/LC_MESSAGES/django.po +++ b/django/conf/locale/te/LC_MESSAGES/django.po @@ -2,6 +2,7 @@ # # Translators: # bhaskar teja yerneni , 2011 +# Claude Paroz , 2020 # Jannis Leidel , 2011 # ప్రవీణ్ ఇళ్ళ , 2013 # వీవెన్ , 2011 @@ -9,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Telugu (http://www.transifex.com/django/django/language/te/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +26,9 @@ msgstr "ఆఫ్రికాన్స్" msgid "Arabic" msgstr "ఆరబిక్" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "" @@ -148,6 +152,9 @@ msgstr "ఇంటర్లింగ్వా" msgid "Indonesian" msgstr "ఇండోనేషియన్" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "" @@ -178,6 +185,9 @@ msgstr "కన్నడ" msgid "Korean" msgstr "కొరియన్" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "లగ్జెంబర్గిష్" @@ -262,9 +272,15 @@ msgstr "తమిళం" msgid "Telugu" msgstr "తెలుగు" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "థాయి" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "టర్కిష్" @@ -545,6 +561,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "" @@ -595,6 +614,12 @@ msgstr "దస్త్రం" msgid "Image" msgstr "బొమ్మ" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -681,6 +706,9 @@ msgstr "" msgid "Enter a valid UUID." msgstr "" +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr "" @@ -761,17 +789,9 @@ msgstr "అవును" msgid "No" msgstr "కాదు" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "అవును, కాదు , ఏమొ" +msgstr "అవును,కాదు,ఏమొ" #, python-format msgid "%(size)d byte" @@ -1078,9 +1098,6 @@ msgid_plural "%d minutes" msgstr[0] "" msgstr[1] "" -msgid "0 minutes" -msgstr "" - msgid "Forbidden" msgstr "" diff --git a/django/conf/locale/te/formats.py b/django/conf/locale/te/formats.py index 8fb98cf72021..bb7f2d13d280 100644 --- a/django/conf/locale/te/formats.py +++ b/django/conf/locale/te/formats.py @@ -2,12 +2,12 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'g:i A' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "g:i A" # DATETIME_FORMAT = # YEAR_MONTH_FORMAT = -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M Y' +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M Y" # SHORT_DATETIME_FORMAT = # FIRST_DAY_OF_WEEK = diff --git a/django/conf/locale/tg/LC_MESSAGES/django.mo b/django/conf/locale/tg/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..e93dc87f2299 Binary files /dev/null and b/django/conf/locale/tg/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/tg/LC_MESSAGES/django.po b/django/conf/locale/tg/LC_MESSAGES/django.po new file mode 100644 index 000000000000..05a4ca96b098 --- /dev/null +++ b/django/conf/locale/tg/LC_MESSAGES/django.po @@ -0,0 +1,1299 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2020 +# Surush Sufiew , 2020 +# Siroj Sufiew , 2020 +# Surush Sufiew , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-30 18:50+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Ҳолландӣ" + +msgid "Arabic" +msgstr "Арабӣ" + +msgid "Algerian Arabic" +msgstr "Арабӣ" + +msgid "Asturian" +msgstr "Астурӣ" + +msgid "Azerbaijani" +msgstr "Озарбойҷонӣ" + +msgid "Bulgarian" +msgstr "Булғорӣ" + +msgid "Belarusian" +msgstr "Белорусӣ" + +msgid "Bengali" +msgstr "Бенгалӣ" + +msgid "Breton" +msgstr "Бретонӣ" + +msgid "Bosnian" +msgstr "Боснӣ" + +msgid "Catalan" +msgstr "Каталанӣ" + +msgid "Czech" +msgstr "Чехӣ" + +msgid "Welsh" +msgstr "Уэлсӣ" + +msgid "Danish" +msgstr "Даниягӣ" + +msgid "German" +msgstr "Олмонӣ" + +msgid "Lower Sorbian" +msgstr "Сербиягӣ" + +msgid "Greek" +msgstr "Юнонӣ" + +msgid "English" +msgstr "Англисӣ" + +msgid "Australian English" +msgstr "Англисии австралиёӣ" + +msgid "British English" +msgstr "Ангилисии бритониёӣ" + +msgid "Esperanto" +msgstr "Эсперантоӣ" + +msgid "Spanish" +msgstr "Испанӣ" + +msgid "Argentinian Spanish" +msgstr "Испании аргентиноӣ" + +msgid "Colombian Spanish" +msgstr "Испании колумбигӣ" + +msgid "Mexican Spanish" +msgstr "Испании мексикоӣ" + +msgid "Nicaraguan Spanish" +msgstr "Никарагуанский испанский" + +msgid "Venezuelan Spanish" +msgstr "Испании венесуэлӣ" + +msgid "Estonian" +msgstr "Эстонӣ" + +msgid "Basque" +msgstr "Баскувӣ" + +msgid "Persian" +msgstr "Форсӣ" + +msgid "Finnish" +msgstr "Финикӣ" + +msgid "French" +msgstr "Фаронсавӣ" + +msgid "Frisian" +msgstr "Фризӣ" + +msgid "Irish" +msgstr "Ирландӣ" + +msgid "Scottish Gaelic" +msgstr "Шотландӣ" + +msgid "Galician" +msgstr "" + +msgid "Hebrew" +msgstr "Ивритӣ" + +msgid "Hindi" +msgstr "Ҳиндӣ" + +msgid "Croatian" +msgstr "Хорватӣ" + +msgid "Upper Sorbian" +msgstr "Себриягӣ" + +msgid "Hungarian" +msgstr "" + +msgid "Armenian" +msgstr "Арманӣ" + +msgid "Interlingua" +msgstr "" + +msgid "Indonesian" +msgstr "Индонезӣ" + +msgid "Igbo" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "Исландӣ" + +msgid "Italian" +msgstr "Итолиёвӣ" + +msgid "Japanese" +msgstr "Японӣ" + +msgid "Georgian" +msgstr "Грузӣ" + +msgid "Kabyle" +msgstr "Кабилӣ" + +msgid "Kazakh" +msgstr "Қазоқӣ" + +msgid "Khmer" +msgstr "" + +msgid "Kannada" +msgstr "" + +msgid "Korean" +msgstr "Кореӣ" + +msgid "Kyrgyz" +msgstr "" + +msgid "Luxembourgish" +msgstr "Люксембургӣ" + +msgid "Lithuanian" +msgstr "Литвигӣ" + +msgid "Latvian" +msgstr "Латвигӣ" + +msgid "Macedonian" +msgstr "Македонӣ" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "Монголӣ" + +msgid "Marathi" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Norwegian Bokmål" +msgstr "Норвежский (Букмол)" + +msgid "Nepali" +msgstr "Непалӣ" + +msgid "Dutch" +msgstr "Голландӣ" + +msgid "Norwegian Nynorsk" +msgstr "Норвегӣ" + +msgid "Ossetic" +msgstr "Осетинӣ" + +msgid "Punjabi" +msgstr "Панҷобӣ" + +msgid "Polish" +msgstr "Полякӣ" + +msgid "Portuguese" +msgstr "Португалӣ" + +msgid "Brazilian Portuguese" +msgstr "Португалии бразилиёгӣ" + +msgid "Romanian" +msgstr "Руминӣ" + +msgid "Russian" +msgstr "Руссӣ" + +msgid "Slovak" +msgstr "Словакӣ" + +msgid "Slovenian" +msgstr "Словенӣ" + +msgid "Albanian" +msgstr "Албанӣ" + +msgid "Serbian" +msgstr "Сербӣ" + +msgid "Serbian Latin" +msgstr "Сербӣ" + +msgid "Swedish" +msgstr "Шведӣ" + +msgid "Swahili" +msgstr "Суахили" + +msgid "Tamil" +msgstr "Тамилӣ" + +msgid "Telugu" +msgstr "Телугу" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "Тайский" + +msgid "Turkmen" +msgstr "" + +msgid "Turkish" +msgstr "Туркӣ" + +msgid "Tatar" +msgstr "Тоторӣ" + +msgid "Udmurt" +msgstr "Удмуртӣ" + +msgid "Ukrainian" +msgstr "Украинӣ" + +msgid "Urdu" +msgstr "Урдуӣ" + +msgid "Uzbek" +msgstr "Узбекӣ" + +msgid "Vietnamese" +msgstr "Вэтнамӣ" + +msgid "Simplified Chinese" +msgstr "Хитоӣ" + +msgid "Traditional Chinese" +msgstr "Хитоӣ" + +msgid "Messages" +msgstr "Маълумот" + +msgid "Site Maps" +msgstr "Харитаи сайт" + +msgid "Static Files" +msgstr "Файлҳои статикӣ" + +msgid "Syndication" +msgstr "Тасмаи хабарҳо" + +msgid "That page number is not an integer" +msgstr "Рақами саҳифа бояд адади натуралӣ бошад" + +msgid "That page number is less than 1" +msgstr "Рақами саҳифа камтар аз 1" + +msgid "That page contains no results" +msgstr "Саҳифа холӣ аст" + +msgid "Enter a valid value." +msgstr "Қимматро дуруст ворид созед." + +msgid "Enter a valid URL." +msgstr "Суроға(URL)-ро дуруст ворид созед." + +msgid "Enter a valid integer." +msgstr "Ададро дуруст ворид созед." + +msgid "Enter a valid email address." +msgstr "Суроғаи почтаи электрониро дуруст ворид созед." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Қимати “slug”-ро дуруст ворид созед, бояд аз ҳарфҳо (“a-z ва A-Z”), рақамҳо, " +"зердефисҳо(_) ва дефисҳо иборат бошад." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Қимати “slug”-ро дуруст ворид созед, бояд аз Unicode-ҳарфҳо (“a-z ва A-Z”), " +"рақамҳо, зердефисҳо(_) ва дефисҳо иборат бошад." + +msgid "Enter a valid IPv4 address." +msgstr "Шакли дурусти IPv4-суроғаро ворид созед." + +msgid "Enter a valid IPv6 address." +msgstr "Шакли ҳақиқии IPv4-суроғаро ворид кунед." + +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Шакли ҳақиқии IPv4 ё IPv6 -суроғаро ворид кунед." + +msgid "Enter only digits separated by commas." +msgstr "Рақамҳои бо вергул шудокардашударо ворид созед." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"Боварӣ ҳосил кунед, ки қиммати — %(limit_value)s (ҳоло шакли — " +"%(show_value)s -ро дорад)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Боварӣ ҳосил кунед, ки ин қиммат хурд ё баробар аст ба %(limit_value)s." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Боварӣ ҳосил кунед, ки ин қиммат калон ё баробар аст ба %(limit_value)s." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Enter a number." +msgstr "Ададро ворид созед." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +msgid "Null characters are not allowed." +msgstr "Маълумот символӣ мамнӯъро дар бар мегирад: 0-байт" + +msgid "and" +msgstr "ва" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" +"%(model_name)s бо ин гуна майдонӣ қиматдор %(field_labels)s алакай вуҷуд " +"дорад." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "Қимати %(value)r дар байни вариантҳои омадашуда вуҷуд надорад." + +msgid "This field cannot be null." +msgstr "Ин майдон наметавонад қимати NULL дошта бошад." + +msgid "This field cannot be blank." +msgstr "Ин майдон наметавонад холӣ бошад." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(model_name)s бо ин гуна %(field_label)s алакай вуҷуд дорад." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"Қимат дар майдони «%(field_label)s» бояд барои фрагменти«%(lookup_type)s» " +"ягона бошад, санаҳо барои майдон %(date_field_label)s." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Майдони намуди %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "Қимати “%(value)s” бояд True ё False бошад." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "Қимати “%(value)s” бояд True, False ё None бошад." + +msgid "Boolean (Either True or False)" +msgstr "Мантиқан (True ё False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Сатр (то %(max_length)s)" + +msgid "Comma-separated integers" +msgstr "Яклухт, бо вергул ҷудокардашуда" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз, аст" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "“%(value)s” шакли дуруст (сол.моҳ.рӯз) дорад, аммо сана нодуруст аст" + +msgid "Date (without time)" +msgstr "Сана (бе ишораи вақт)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"“%(value)s” шакли нодуруст дорад. Шакли дуруст: сол.моҳ.рӯз соат.дақ[:сония[." +"uuuuuu]][TZ] аст" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"“%(value)s” шакли дуруст дорад (сол.моҳ.рӯз соат.дақ[:сония[.uuuuuu]][TZ]), " +"аммо 'сана/вақт'' нодуруст аст" + +msgid "Date (with time)" +msgstr "Сана (бо ишораи вақт)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "“%(value)s” бояд адади даҳӣ бошад" + +msgid "Decimal number" +msgstr "Адади 'даҳӣ' ." + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"“%(value)s” шакли нодуруст дорад. Шакли дуруст [рӯз] [[соат:]дақ:]сония[." +"uuuuuu]" + +msgid "Duration" +msgstr "Давомнокӣ" + +msgid "Email address" +msgstr "Суроғаи почтаи электронӣ" + +msgid "File path" +msgstr "Суроғаи файл" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "Қимати “%(value)s” бояд бутун бошад" + +msgid "Floating point number" +msgstr "Адади бутун." + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "Қимати “%(value)s” бояд яклухт бошад" + +msgid "Integer" +msgstr "Яклухт" + +msgid "Big (8 byte) integer" +msgstr "Адади калони яклухт (8 байт)" + +msgid "IPv4 address" +msgstr "IPv4 - суроға" + +msgid "IP address" +msgstr "IP-суроға" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "Қимати “%(value)s” бояд 'None', 'True' ё 'False' бошад" + +msgid "Boolean (Either True, False or None)" +msgstr "Мантиқӣ (True, False ё None)" + +msgid "Positive big integer" +msgstr "" + +msgid "Positive integer" +msgstr "Адади яклухти мусбат" + +msgid "Positive small integer" +msgstr "дади яклухти мусбати хурд" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Слаг (то %(max_length)s)" + +msgid "Small integer" +msgstr "Адади яклухти хурд" + +msgid "Text" +msgstr "Матн" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"“%(value)s” шакли нодуруст дорад. Шакли дуруст соат:дақ[:сония[.uuuuuu]" + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"“%(value)s” шакли дуруст дорад (соат:моҳ[:сония[.uuuuuu, аммо 'вақт' " +"нодуруст қайд шудааст " + +msgid "Time" +msgstr "Вақт" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Маълумоти бинари(дуи)-и коркарднашуда" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "Қимати “%(value)s” барои UUID номувофиқ аст." + +msgid "Universally unique identifier" +msgstr "Майдони UUID, идентификатори универсалии ягона" + +msgid "File" +msgstr "Файл" + +msgid "Image" +msgstr "Тасвир" + +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" +"Объекти модели %(model)s бо майдони %(field)s, -и дорои қимати %(value)r, " +"вуҷқд надорад." + +msgid "Foreign Key (type determined by related field)" +msgstr "" +"Калиди беруна(Foreign Key) (Шакл муайян шудаст аз рӯи майдони алоқамандшуда.)" + +msgid "One-to-one relationship" +msgstr "Алоқаи \"як ба як\"" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "Алоқаи %(from)s-%(to)s" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "Алоқаи %(from)s-%(to)s" + +msgid "Many-to-many relationship" +msgstr "Алоқаи \\'бисёр ба бисёр\\'" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Майдони ҳатмӣ." + +msgid "Enter a whole number." +msgstr "Адади яклухтро ворид кунед." + +msgid "Enter a valid date." +msgstr "Санаи дурстро ворид кунед." + +msgid "Enter a valid time." +msgstr "Вақтро дуруст ворид кунед.." + +msgid "Enter a valid date/time." +msgstr "Сана ва вақтро дуруст ворид кунед." + +msgid "Enter a valid duration." +msgstr "авомнокии дурустро ворид кунед." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" +"Миқдори рӯзҳо бояд доираи аз {min_days} то {max_days} -ро дарбар гирад." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Файл равон карда нашуд. Шакли кодировкаи формаро тафтиш кунед." + +msgid "No file was submitted." +msgstr "Ягон файл равон карда нашуд" + +msgid "The submitted file is empty." +msgstr "Файли равонкардашуда холӣ аст." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" +"Хоҳиш мекунем файлро бор кунед ё байрақчаи ишоратӣ гузоред \"Тоза кардан\", " +"вале ҳарду амалро дар якҷоягӣ иҷро накунед." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Тасвири дурустро бор кунед. Файли боркардаи шумо нуқсон дорад ва ё 'тасвира' " +"нест" + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Варианти дурустро интихоб кунед. %(value)s дар байни варианҳои дастрас вуҷуд " +"надорад." + +msgid "Enter a list of values." +msgstr "Рӯйхати қиматҳоро ворид кунед." + +msgid "Enter a complete value." +msgstr "Рӯйхати ҳамаи қиматҳоро ворид кунед." + +msgid "Enter a valid UUID." +msgstr "Шакли дурусти UUID -ро ворид кунед." + +msgid "Enter a valid JSON." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Майдони махфии %(name)s) %(error)s" + +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Маълумоти идоракунандаи форма вуҷуд надорад ё ин ки осеб дидааст." + +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +msgid "Order" +msgstr "Тартиб" + +msgid "Delete" +msgstr "Нест кардан" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" +"Илтимос қимати такроршудаистодаи майдони \"%(field)s\" ро тағйир диҳед." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Илтимос, қимати майдони %(field)s ро тағйир диҳед, вай бояд 'ягона' бошад." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Илтимос, қимати майдони %(field_name)s ро тағйир диҳед, вай бояд барои " +"%(lookup)s дар майдони %(date_field)s ягона бошад (Ягона будан маънои " +"такрорнашавандагиро дорад)." + +msgid "Please correct the duplicate values below." +msgstr "Хоҳиш мекунам, қимати такроршудаистодаи зеринро иваз кунед." + +msgid "The inline value did not match the parent instance." +msgstr "" +"Қимати дар форма воридкардашуда бо қимати формаи база мутобиқат намекунад." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Варианти дурустро интихоб кунед. Варианти шумо дар қатори қиматҳои " +"овардашуда вуҷуд надорад." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "" + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +msgid "Clear" +msgstr "Тоза кардан" + +msgid "Currently" +msgstr "Дар айни замон" + +msgid "Change" +msgstr "Тағйир додан" + +msgid "Unknown" +msgstr "Номаълум" + +msgid "Yes" +msgstr "Ҳа" + +msgid "No" +msgstr "Не" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "ҳа,не,шояд" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%s KB" +msgstr "%s КБ" + +#, python-format +msgid "%s MB" +msgstr "%s МБ" + +#, python-format +msgid "%s GB" +msgstr "%s ГБ" + +#, python-format +msgid "%s TB" +msgstr "%s ТБ" + +#, python-format +msgid "%s PB" +msgstr "%s ПБ" + +msgid "p.m." +msgstr "н.ш." + +msgid "a.m." +msgstr "н.р." + +msgid "PM" +msgstr "НШ" + +msgid "AM" +msgstr "НР" + +msgid "midnight" +msgstr "нимашабӣ" + +msgid "noon" +msgstr "нисфирузӣ" + +msgid "Monday" +msgstr "Душанбе" + +msgid "Tuesday" +msgstr "Сешанбе" + +msgid "Wednesday" +msgstr "Чоршанбе" + +msgid "Thursday" +msgstr "Панҷшанбе" + +msgid "Friday" +msgstr "Ҷумъа" + +msgid "Saturday" +msgstr "Шанбе" + +msgid "Sunday" +msgstr "Якшанбе" + +msgid "Mon" +msgstr "Дш" + +msgid "Tue" +msgstr "Яш" + +msgid "Wed" +msgstr "Чш" + +msgid "Thu" +msgstr "Пш" + +msgid "Fri" +msgstr "Ҷ" + +msgid "Sat" +msgstr "Ш" + +msgid "Sun" +msgstr "Яш" + +msgid "January" +msgstr "Январ" + +msgid "February" +msgstr "Феврал" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрел" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июн" + +msgid "July" +msgstr "Июл" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябр" + +msgid "October" +msgstr "Октябр" + +msgid "November" +msgstr "Ноябр" + +msgid "December" +msgstr "Декабр" + +msgid "jan" +msgstr "янв" + +msgid "feb" +msgstr "фев" + +msgid "mar" +msgstr "мар" + +msgid "apr" +msgstr "апр" + +msgid "may" +msgstr "май" + +msgid "jun" +msgstr "июн" + +msgid "jul" +msgstr "июл" + +msgid "aug" +msgstr "авг" + +msgid "sep" +msgstr "сен" + +msgid "oct" +msgstr "окт" + +msgid "nov" +msgstr "ноя" + +msgid "dec" +msgstr "дек" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Янв." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Фев." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Март" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Апрел" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Июн" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Июл" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Авг." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Сен." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Окт." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Ноя." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Дек." + +msgctxt "alt. month" +msgid "January" +msgstr "январ" + +msgctxt "alt. month" +msgid "February" +msgstr "феврал" + +msgctxt "alt. month" +msgid "March" +msgstr "март" + +msgctxt "alt. month" +msgid "April" +msgstr "апрел" + +msgctxt "alt. month" +msgid "May" +msgstr "май" + +msgctxt "alt. month" +msgid "June" +msgstr "июн" + +msgctxt "alt. month" +msgid "July" +msgstr "июл" + +msgctxt "alt. month" +msgid "August" +msgstr "август" + +msgctxt "alt. month" +msgid "September" +msgstr "сентябр" + +msgctxt "alt. month" +msgid "October" +msgstr "октябр" + +msgctxt "alt. month" +msgid "November" +msgstr "ноябр" + +msgctxt "alt. month" +msgid "December" +msgstr "декабр" + +msgid "This is not a valid IPv6 address." +msgstr "Қиммат суроғаи дурусти IPv6 нест." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "ё" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr ", " + +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +msgid "Forbidden" +msgstr "Мушкилӣ дар воридшавӣ" + +msgid "CSRF verification failed. Request aborted." +msgstr "Мушкили дар тафтиши CSRF. Дархост рад шуд." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Шумо ин хабарро барои он мебинед, ки ин HTTPS -сомона, тавассути браузери " +"шумо дархости равон кардани 'Referer' 'header' -ро дорад. Вале ягон дархост " +"равон нашудааст.Иҷрои ин амал аз ҷиҳати бехатарӣ барои мутмаин шудани он, ки " +"браузери шумо аз тарафи шахси сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ " +"мебошад." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Агар шумо браузери худро ба таври 'Referer'-сархатҳояшон дастнорас ба танзим " +"даровада бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои " +"пайсшавии таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " +"азнавбатанзимдарориро иҷро намоед." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Шумо ин хабарро барои он мебинед, ки сомонаи мазкур талаб менамояд, то амали " +"равонкунииформа ва CSRF cookie дар якҷоягӣ сурат гирад. Ин намуди 'cookie' " +"аз ҷиҳати бехатарӣбарои мутмаин шудани он, ки браузери шумо аз тарафи шахси " +"сеюм 'шикаста'' (взлом)нашудааст, ҳатмӣ мебошад." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Агар шумо браузери худро ба таври дастнораси ба cookies' ба танзим даровада " +"бошед,хоҳиш мекунем, ки ҳадди ақал барои сомонаи мазкур ё барои пайсшавии " +"таввассути HTTPS ё ин ки бароидархостҳои манбаашон якхела, амали " +"азнавбатанзимдарориро иҷро намоед." + +msgid "More information is available with DEBUG=True." +msgstr "" +"Маълумоти бештар дар режими 'танзимдарорӣ'(отладчика), бо фаъолсозии " +"DEBUG=True." + +msgid "No year specified" +msgstr "Сол ишора нашудааст" + +msgid "Date out of range" +msgstr "сана аз доираи муайян берун аст" + +msgid "No month specified" +msgstr "Моҳ ишора нашудааст" + +msgid "No day specified" +msgstr "Рӯз ишора нашудааст" + +msgid "No week specified" +msgstr "Ҳафта ишора нашудааст" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s дастнорас аст" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s навбатӣ дастнорасанд барои он ки %(class_name)s." +"allow_future бо қимати \" False\" гузошта шудааст." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "Санаи нодурусти “%(datestr)s” шакли “%(format)s” гирифтааст" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Ягон %(verbose_name)s, мувофиқ бо дархости шумо ёфт нашуд" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Саҳифа 'охирин' нест ва ё ки бо адади яклухт(int) ишора нашудааст" + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Саҳифаи нодуруст (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +msgid "Directory indexes are not allowed here." +msgstr "Азназаргузаронии рӯёхати файлҳо дар директорияи зерин номумкин аст." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” вуҷуд надорад" + +#, python-format +msgid "Index of %(directory)s" +msgstr "Рӯёхати файлҳои директорияи %(directory)s" + +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" +"Django: веб-фреймворк барои перфектсионистҳо бо дедлайнҳо. Бисёр фреймворки " +"табъи дилва хастанакунанда ҳангоми кор." + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Инҷо андешаҳо оиди баромади Django " +"%(version)s" + +msgid "The install worked successfully! Congratulations!" +msgstr "Ҷобаҷогузорӣ муваффақона анҷом ёфт! Табрик!" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Шумо ин хабарро барои он мебинед, ки дар ишора намудед: DEBUG=True ва дар файли " +"ҷобаҷогузорӣ(settings)ягонто танзимгари URL-суроғаҳоро ишора нанамудед." + +msgid "Django Documentation" +msgstr "Ҳуҷҷатгузории Django" + +msgid "Topics, references, & how-to’s" +msgstr "" + +msgid "Tutorial: A Polling App" +msgstr "Роҳбарият: Барнома барои овоздиҳӣ" + +msgid "Get started with Django" +msgstr "оғози кор бо Django" + +msgid "Django Community" +msgstr "Иттиҳоди Django" + +msgid "Connect, get help, or contribute" +msgstr "Бо мо ҳамкорӣ намуда имкониятҳои навро пайдо намоед." diff --git a/django/conf/locale/tg/formats.py b/django/conf/locale/tg/formats.py index 3e7651d7552f..0ab7d49ae596 100644 --- a/django/conf/locale/tg/formats.py +++ b/django/conf/locale/tg/formats.py @@ -2,31 +2,31 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j E Y г.' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j E Y г. G:i' -YEAR_MONTH_FORMAT = 'F Y г.' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "j E Y г." +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j E Y г. G:i" +YEAR_MONTH_FORMAT = "F Y г." +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d.%m.%Y', # '25.10.2006' - '%d.%m.%y %H:%M:%S', # '25.10.06 14:30:59' - '%d.%m.%y %H:%M:%S.%f', # '25.10.06 14:30:59.000200' - '%d.%m.%y %H:%M', # '25.10.06 14:30' - '%d.%m.%y', # '25.10.06' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d.%m.%y", # '25.10.06' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/th/formats.py b/django/conf/locale/th/formats.py index d7394eb69c31..190e6d196ce4 100644 --- a/django/conf/locale/th/formats.py +++ b/django/conf/locale/th/formats.py @@ -2,32 +2,32 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'j F Y' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = 'j F Y, G:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'j M Y' -SHORT_DATETIME_FORMAT = 'j M Y, G:i' +DATE_FORMAT = "j F Y" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j F Y, G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "j M Y" +SHORT_DATETIME_FORMAT = "j M Y, G:i" FIRST_DAY_OF_WEEK = 0 # Sunday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', # 25/10/2006 - '%d %b %Y', # 25 ต.ค. 2006 - '%d %B %Y', # 25 ตุลาคม 2006 + "%d/%m/%Y", # 25/10/2006 + "%d %b %Y", # 25 ต.ค. 2006 + "%d %B %Y", # 25 ตุลาคม 2006 ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # 14:30:59 - '%H:%M:%S.%f', # 14:30:59.000200 - '%H:%M', # 14:30 + "%H:%M:%S", # 14:30:59 + "%H:%M:%S.%f", # 14:30:59.000200 + "%H:%M", # 14:30 ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # 25/10/2006 14:30:59 - '%d/%m/%Y %H:%M:%S.%f', # 25/10/2006 14:30:59.000200 - '%d/%m/%Y %H:%M', # 25/10/2006 14:30 + "%d/%m/%Y %H:%M:%S", # 25/10/2006 14:30:59 + "%d/%m/%Y %H:%M:%S.%f", # 25/10/2006 14:30:59.000200 + "%d/%m/%Y %H:%M", # 25/10/2006 14:30 ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = ',' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," NUMBER_GROUPING = 3 diff --git a/django/conf/locale/tk/LC_MESSAGES/django.mo b/django/conf/locale/tk/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..2858350fa107 Binary files /dev/null and b/django/conf/locale/tk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/tk/LC_MESSAGES/django.po b/django/conf/locale/tk/LC_MESSAGES/django.po new file mode 100644 index 000000000000..ad0002618b71 --- /dev/null +++ b/django/conf/locale/tk/LC_MESSAGES/django.po @@ -0,0 +1,1337 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2020-2021 +# Resul , 2020 +# Resul , 2022-2024 +# Welbeck Garli , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: Resul , 2022-2024\n" +"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" +"tk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "Afrikaans" + +msgid "Arabic" +msgstr "Arapça" + +msgid "Algerian Arabic" +msgstr "Alžir Arapçasy" + +msgid "Asturian" +msgstr "Asturian" + +msgid "Azerbaijani" +msgstr "Azeri Türkçesi" + +msgid "Bulgarian" +msgstr "Bolgar" + +msgid "Belarusian" +msgstr "Belarusça" + +msgid "Bengali" +msgstr "Bengali" + +msgid "Breton" +msgstr "Breton" + +msgid "Bosnian" +msgstr "Bosniýaça" + +msgid "Catalan" +msgstr "Katalan" + +msgid "Central Kurdish (Sorani)" +msgstr "Merkezi Kürtçe (Soraniçe)" + +msgid "Czech" +msgstr "Çehçe" + +msgid "Welsh" +msgstr "Uelsçe" + +msgid "Danish" +msgstr "Daniýaça" + +msgid "German" +msgstr "Nemesçe" + +msgid "Lower Sorbian" +msgstr "Aşaky Sorbian" + +msgid "Greek" +msgstr "Grekçe" + +msgid "English" +msgstr "Iňlisçe" + +msgid "Australian English" +msgstr "Awstraliýa Iňlisçesi" + +msgid "British English" +msgstr "Britan Iňlisçesi" + +msgid "Esperanto" +msgstr "Esperanto" + +msgid "Spanish" +msgstr "Ispança" + +msgid "Argentinian Spanish" +msgstr "Argentina Ispançasy" + +msgid "Colombian Spanish" +msgstr "Kolumbiýa Ispançasy" + +msgid "Mexican Spanish" +msgstr "Meksika Ispançasy" + +msgid "Nicaraguan Spanish" +msgstr "Nikaragua Ispançasy" + +msgid "Venezuelan Spanish" +msgstr "Wenezuela Ispançasy" + +msgid "Estonian" +msgstr "Estonça" + +msgid "Basque" +msgstr "Baskça" + +msgid "Persian" +msgstr "Parsça" + +msgid "Finnish" +msgstr "Finçe" + +msgid "French" +msgstr "Fransuzça" + +msgid "Frisian" +msgstr "Frisça" + +msgid "Irish" +msgstr "Irlandça" + +msgid "Scottish Gaelic" +msgstr "Şotlandiýa Gaelçasy" + +msgid "Galician" +msgstr "Galisiýaça" + +msgid "Hebrew" +msgstr "Ýewreýçe" + +msgid "Hindi" +msgstr "Hindi" + +msgid "Croatian" +msgstr "Horwatça" + +msgid "Upper Sorbian" +msgstr "Ýokarky Sorbian" + +msgid "Hungarian" +msgstr "Wengerçe" + +msgid "Armenian" +msgstr "Ermeniçe" + +msgid "Interlingua" +msgstr "Interlingua" + +msgid "Indonesian" +msgstr "Indonezça" + +msgid "Igbo" +msgstr "Igbo" + +msgid "Ido" +msgstr "Ido" + +msgid "Icelandic" +msgstr "Islandça" + +msgid "Italian" +msgstr "Italýança" + +msgid "Japanese" +msgstr "Ýaponça" + +msgid "Georgian" +msgstr "Gruzinçe" + +msgid "Kabyle" +msgstr "Kabyle" + +msgid "Kazakh" +msgstr "Gazakça" + +msgid "Khmer" +msgstr "Hmerçe" + +msgid "Kannada" +msgstr "Kannada" + +msgid "Korean" +msgstr "Koreýçe" + +msgid "Kyrgyz" +msgstr "Gyrgyzça" + +msgid "Luxembourgish" +msgstr "Lýuksemburgça" + +msgid "Lithuanian" +msgstr "Litwança" + +msgid "Latvian" +msgstr "Latwiýaça" + +msgid "Macedonian" +msgstr "Makedonça" + +msgid "Malayalam" +msgstr "Malaýalam" + +msgid "Mongolian" +msgstr "Mongolça" + +msgid "Marathi" +msgstr "Marasi" + +msgid "Malay" +msgstr "Malaý" + +msgid "Burmese" +msgstr "Birma" + +msgid "Norwegian Bokmål" +msgstr "Norwegiýa Bokmaly" + +msgid "Nepali" +msgstr "Nepali" + +msgid "Dutch" +msgstr "Gollandça" + +msgid "Norwegian Nynorsk" +msgstr "Norwegiýa Nynorskçasy" + +msgid "Ossetic" +msgstr "Osetikçe" + +msgid "Punjabi" +msgstr "Penjebiçe" + +msgid "Polish" +msgstr "Polýakça" + +msgid "Portuguese" +msgstr "Portugalça" + +msgid "Brazilian Portuguese" +msgstr "Braziliýa Portugalçasy" + +msgid "Romanian" +msgstr "Rumynça" + +msgid "Russian" +msgstr "Rusça" + +msgid "Slovak" +msgstr "Slowakça" + +msgid "Slovenian" +msgstr "Slowençe" + +msgid "Albanian" +msgstr "Albança" + +msgid "Serbian" +msgstr "Serbçe" + +msgid "Serbian Latin" +msgstr "Serb Latynçasy" + +msgid "Swedish" +msgstr "Şwedçe" + +msgid "Swahili" +msgstr "Swahili" + +msgid "Tamil" +msgstr "Tamil" + +msgid "Telugu" +msgstr "Telugu" + +msgid "Tajik" +msgstr "Täjik" + +msgid "Thai" +msgstr "Taýça" + +msgid "Turkmen" +msgstr "Türkmençe" + +msgid "Turkish" +msgstr "Türkçe" + +msgid "Tatar" +msgstr "Tatarça" + +msgid "Udmurt" +msgstr "Udmurt" + +msgid "Uyghur" +msgstr "Uýgur" + +msgid "Ukrainian" +msgstr "Ukrainçe" + +msgid "Urdu" +msgstr "Urduça" + +msgid "Uzbek" +msgstr "Özbekçe" + +msgid "Vietnamese" +msgstr "Wýetnamça" + +msgid "Simplified Chinese" +msgstr "Ýönekeýleşdirilen Hytaýça" + +msgid "Traditional Chinese" +msgstr "Adaty Hytaýça" + +msgid "Messages" +msgstr "Habarlar" + +msgid "Site Maps" +msgstr "Saýt Kartalary" + +msgid "Static Files" +msgstr "Statik Faýllar" + +msgid "Syndication" +msgstr "Syndikasiýa" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "..." + +msgid "That page number is not an integer" +msgstr "Ol sahypanyň sany bitewi san däl" + +msgid "That page number is less than 1" +msgstr "Ol sahypanyň belgisi 1-den az" + +msgid "That page contains no results" +msgstr "Ol sahypada hiç hili netije ýok" + +msgid "Enter a valid value." +msgstr "Dogry baha giriziň." + +msgid "Enter a valid domain name." +msgstr "Dogry domen adyny giriziň." + +msgid "Enter a valid URL." +msgstr "Dogry URL giriziň." + +msgid "Enter a valid integer." +msgstr "Dogry bitewi san giriziň." + +msgid "Enter a valid email address." +msgstr "Dogry e-poçta salgysyny giriziň." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Harplardan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat dogry " +"“slug” giriziň." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Unikod harplaryndan, sanlardan, aşaky çyzyklardan ýa-da defislerden ybarat " +"dogry “slug” giriziň." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Dogry %(protocol)s adresi giriziň." + +msgid "IPv4" +msgstr "IPv4" + +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 ýa IPv6" + +msgid "Enter only digits separated by commas." +msgstr "Diňe otur bilen aýrylan sanlary giriziň." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"%(limit_value)s bahasynyň dogry bolmagyny üpjün ediň (şuwagt %(show_value)s)." + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"Maglumatyň %(limit_value)s bahasyndan az ýa-da deň bolmagyny üpjün ediň." + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"Maglumatyň %(limit_value)s bahasyndan köp ýa-da deň bolmagyny üpjün ediň." + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "Bu baha %(limit_value)s-nyň essesi bolmaly." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Bu maglumatda iň az %(limit_value)d harp bardygyna göz ýetiriň (munda " +"%(show_value)d bar)." +msgstr[1] "" +"Bu maglumatda azyndan %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " +"%(show_value)d sany bar)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Bu maglumatda köpünden %(limit_value)d harp bardygyna göz ýetiriň (bunda " +"%(show_value)d bar)" +msgstr[1] "" +"Bu maglumatda iň köp %(limit_value)d nyşanyň bolmagyny üpjün ediň (şuwagt " +"%(show_value)d sany bar)" + +msgid "Enter a number." +msgstr "San giriziň" + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Bu ýerde jemi %(max)s'dan köp san ýokduguna göz ýetiriň." +msgstr[1] "Bu ýerde jemi %(max)s sanydan köp sifriň bolmazlygyny üpjün ediň." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Bu ýerde %(max)s'dan köp nokatly san ýokdugyna göz ýetiriň" +msgstr[1] "Bu ýerde %(max)s sanydan köp nokatly san ýoklugyny üpjün ediň." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "Nokatdan öň %(max)s'dan köp san ýokdugyna göz ýetiriň" +msgstr[1] "Nokatdan öň %(max)s sanydan köp sifriň ýoklugyny üpjün ediň." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"\"%(extension)s\" faýl görnüşine rugsat edilmeýär. Rugsat berilýän faýl " +"görnüşleri şulardan ybarat: %(allowed_extensions)s" + +msgid "Null characters are not allowed." +msgstr "Null nyşanlara rugsat berilmeýär." + +msgid "and" +msgstr "we" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(field_labels)s bilen baglanyşykly %(model_name)s eýýäm bar." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "Çäklendirme “%(name)s” bozuldy." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)r dogry saýlaw däl." + +msgid "This field cannot be null." +msgstr "Bu meýdan null bilmez." + +msgid "This field cannot be blank." +msgstr "Bu meýdan boş bolup bilmez." + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "%(field_label)s bilen baglanyşykly %(model_name)s eýýäm bar." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(lookup_type)s %(date_field_label)s üçin %(field_label)s özboluşly " +"bolmalydyr." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Meýdan görnüşi: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "\"%(value)s\" hökman True ýa-da False bolmalydyr." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "\"%(value)s\" hökman True, False ýa-da None bolmalydyr." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (True ýa-da False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Setir (iň köp %(max_length)s)" + +msgid "String (unlimited)" +msgstr "String (limitsiz)" + +msgid "Comma-separated integers" +msgstr "Otur bilen bölünen bitewi sanlar" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"\"%(value)s\" bahasynyň nädogry sene formaty bar. ÝÝÝÝ-AA-GG görnüşinde " +"bolmaly." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"\"%(value)s\" dogry yazylyş usuluna (ÝÝÝÝ-AA-GG) eýe, ýöne, sene nädogry." + +msgid "Date (without time)" +msgstr "Sene (wagtsyz)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"\"%(value)s\" ýalňyş görnüşde ýazylan. Bu baha hökmany suratda ÝÝÝÝ-AA-GG SS:" +"MM[:ss[.uuuuuu]][TZ] görnüşde bolmalydyr." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"\"%(value)s\" dogry sene görnüşine eýe (ÝÝÝÝ-AA-GG SS:MM[:ss[.uuuuuu]][TZ]). " +"Ýöne bu nädogry sene/wagt." + +msgid "Date (with time)" +msgstr "Sene (wagty bilen)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "\"%(value)s\" hökman nokatly san bolmalydyr." + +msgid "Decimal number" +msgstr "Onluk san" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"\"%(value)s\" ýalňyş sene görnüşine eýe. Bu hökman [GG] [[SS:]AA:]ss[." +"uuuuuu] görnüşinde bolmalydyr." + +msgid "Duration" +msgstr "Dowamlylyk" + +msgid "Email address" +msgstr "Email adres" + +msgid "File path" +msgstr "Faýl ýoly" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "\"%(value)s float san bolmaly." + +msgid "Floating point number" +msgstr "Float san" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "\"%(value)s\" bitewi san bolmaly." + +msgid "Integer" +msgstr "Bitewi san" + +msgid "Big (8 byte) integer" +msgstr "Uly (8 baýt) bitewi san" + +msgid "Small integer" +msgstr "Kiçi bitewi san" + +msgid "IPv4 address" +msgstr "IPv4 salgy" + +msgid "IP address" +msgstr "IP salgy" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "\"%(value)s\" None, True ýa-da False bolmaly." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (True, False ýa-da None)" + +msgid "Positive big integer" +msgstr "Pozitiw uly bitewi san" + +msgid "Positive integer" +msgstr "Pozitiw bitewi san" + +msgid "Positive small integer" +msgstr "Pozitiw kiçi bitewi san" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (iň köp %(max_length)s)" + +msgid "Text" +msgstr "Tekst" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"\"%(value)s\" bahasy nädogry formata eýe. SS:MM[:ss[.uuuuuu]] formatda " +"bolmaly." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"\"%(value)s\" bahasy dogry formata eýe (SS:MM[:ss[.uuuuuu]]) ýöne bu nädogry " +"wagt." + +msgid "Time" +msgstr "Wagt" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "Çig ikilik maglumat" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "\"%(value)s\" dogry UUID däl." + +msgid "Universally unique identifier" +msgstr "Ähliumumy özboluşly kesgitleýji" + +msgid "File" +msgstr "Faýl" + +msgid "Image" +msgstr "Surat" + +msgid "A JSON object" +msgstr "JSON obýekti" + +msgid "Value must be valid JSON." +msgstr "Bahasy JSON bolmaly." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(field)s%(value)r bolan %(model)s ýok." + +msgid "Foreign Key (type determined by related field)" +msgstr "Daşary açary (baglanyşykly meýdança bilen kesgitlenýär)" + +msgid "One-to-one relationship" +msgstr "Bire-bir gatnaşyk" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s gatnaşyk" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s gatnaşyklar" + +msgid "Many-to-many relationship" +msgstr "Köp-köp gatnaşyk" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "Bu meýdança hökman gerekli." + +msgid "Enter a whole number." +msgstr "Bitin san giriziň." + +msgid "Enter a valid date." +msgstr "Dogry senäni giriziň." + +msgid "Enter a valid time." +msgstr "Dogry wagt giriziň." + +msgid "Enter a valid date/time." +msgstr "Dogry senäni/wagty giriziň." + +msgid "Enter a valid duration." +msgstr "Dogry dowamlylygy giriziň." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "Günleriň sany {min_days} bilen {max_days} arasynda bolmaly." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Hiç hili faýl tabşyrylmady. Formadaky enkodiň görnüşini barlaň." + +msgid "No file was submitted." +msgstr "Hiç hili faýl tabşyrylmady." + +msgid "The submitted file is empty." +msgstr "Tabşyrylan faýl boş." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " +"%(length)d sany bar)." +msgstr[1] "" +"Bu faýl adynyň iň köp %(max)d nyşanynyň bolmagyny üpjin ediň (şuwagt " +"%(length)d sany bar)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Bir faýl iberiň ýa-da arassala gutyjygyny belläň, ikisini bile däl." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Dogry surat ýükläň. Ýüklän faýlyňyz ýa surat däldi ýa-da zaýalanan suratdy." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Dogry saýlawy saýlaň. %(value)s elýeterli saýlawlaryň biri däl." + +msgid "Enter a list of values." +msgstr "Bahalaryň sanawyny giriziň." + +msgid "Enter a complete value." +msgstr "Doly bahany giriziň." + +msgid "Enter a valid UUID." +msgstr "Dogry UUID giriziň." + +msgid "Enter a valid JSON." +msgstr "Dogry JSON giriziň." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Gizlin meýdan %(name)s) %(error)s" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm maglumatlary ýok ýa-da bozulan. Tapylmadyk meýdança: " +"%(field_names)s. Mesele dowam etse, \"bug report\" açmaly bolmagyňyz mümkin." + +#, python-format +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Haýyş, iň köp %(num)d form tabşyryň." +msgstr[1] "Haýyş, iň köp %(num)d form tabşyryň." + +#, python-format +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Haýyş, azyndan %(num)d form tabşyryň." +msgstr[1] "Haýyş, azyndan %(num)d form tabşyryň." + +msgid "Order" +msgstr "Tertip" + +msgid "Delete" +msgstr "Poz" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s üçin dublikat maglumatlary düzediň." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "Özboluşly bolmaly %(field)s üçin dublikat maglumatlary düzediň." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(date_field)s meýdanynda %(lookup)süçin özboluşly bolmaly %(field_name)s " +"üçin dublikat maglumatlary düzediň." + +msgid "Please correct the duplicate values below." +msgstr "Aşakdaky dublikat bahalary düzediň." + +msgid "The inline value did not match the parent instance." +msgstr "Giriş bahasy esasy mysal bilen gabat gelmedi." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Dogry saýlawy saýlaň. Bu saýlaw, elýeterli saýlawlaryň biri däl." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "\"%(pk)s\" dogry baha däl." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s wagty %(current_timezone)s wagt zolagy bilen düşündirip " +"bolmady; garyşyk bolup biler ýa-da ýok bolmagy mümkin." + +msgid "Clear" +msgstr "Arassala" + +msgid "Currently" +msgstr "Häzirki wagtda" + +msgid "Change" +msgstr "Üýtget" + +msgid "Unknown" +msgstr "Näbelli" + +msgid "Yes" +msgstr "Hawa" + +msgid "No" +msgstr "Ýok" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "hawa,ýok,belki" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d baýt" +msgstr[1] "%(size)d baýt" + +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#, python-format +msgid "%s PB" +msgstr "%s PB" + +msgid "p.m." +msgstr "p.m" + +msgid "a.m." +msgstr "a.m" + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "ýary gije" + +msgid "noon" +msgstr "günortan" + +msgid "Monday" +msgstr "Duşenbe" + +msgid "Tuesday" +msgstr "Sişenbe" + +msgid "Wednesday" +msgstr "Çarşenbe" + +msgid "Thursday" +msgstr "Penşenbe" + +msgid "Friday" +msgstr "Anna" + +msgid "Saturday" +msgstr "Şenbe" + +msgid "Sunday" +msgstr "Ýekşenbe" + +msgid "Mon" +msgstr "Duş" + +msgid "Tue" +msgstr "Siş" + +msgid "Wed" +msgstr "Çarş" + +msgid "Thu" +msgstr "Pen" + +msgid "Fri" +msgstr "Anna" + +msgid "Sat" +msgstr "Şen" + +msgid "Sun" +msgstr "Ýek" + +msgid "January" +msgstr "Ýanwar" + +msgid "February" +msgstr "Fewral" + +msgid "March" +msgstr "Mart" + +msgid "April" +msgstr "Aprel" + +msgid "May" +msgstr "Maý" + +msgid "June" +msgstr "Iýun" + +msgid "July" +msgstr "Iýul" + +msgid "August" +msgstr "Awgust" + +msgid "September" +msgstr "Sentýabr" + +msgid "October" +msgstr "Oktýabr" + +msgid "November" +msgstr "Noýabr" + +msgid "December" +msgstr "Dekabr" + +msgid "jan" +msgstr "ýan" + +msgid "feb" +msgstr "few" + +msgid "mar" +msgstr "mart" + +msgid "apr" +msgstr "apr" + +msgid "may" +msgstr "maý" + +msgid "jun" +msgstr "iýun" + +msgid "jul" +msgstr "iýul" + +msgid "aug" +msgstr "awg" + +msgid "sep" +msgstr "sent" + +msgid "oct" +msgstr "okt" + +msgid "nov" +msgstr "noý" + +msgid "dec" +msgstr "dek" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "Ýan." + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "Few." + +msgctxt "abbrev. month" +msgid "March" +msgstr "Mart" + +msgctxt "abbrev. month" +msgid "April" +msgstr "Aprel" + +msgctxt "abbrev. month" +msgid "May" +msgstr "Maý" + +msgctxt "abbrev. month" +msgid "June" +msgstr "Iýun" + +msgctxt "abbrev. month" +msgid "July" +msgstr "Iýul" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "Awg." + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "Sent." + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "Okt." + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "Noý." + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "Dek." + +msgctxt "alt. month" +msgid "January" +msgstr "Ýanwar" + +msgctxt "alt. month" +msgid "February" +msgstr "Fewral" + +msgctxt "alt. month" +msgid "March" +msgstr "Mart" + +msgctxt "alt. month" +msgid "April" +msgstr "Aprel" + +msgctxt "alt. month" +msgid "May" +msgstr "Maý" + +msgctxt "alt. month" +msgid "June" +msgstr "Iýun" + +msgctxt "alt. month" +msgid "July" +msgstr "Iýul" + +msgctxt "alt. month" +msgid "August" +msgstr "Awgust" + +msgctxt "alt. month" +msgid "September" +msgstr "Sentýabr" + +msgctxt "alt. month" +msgid "October" +msgstr "Oktýabr" + +msgctxt "alt. month" +msgid "November" +msgstr "Noýabr" + +msgctxt "alt. month" +msgid "December" +msgstr "Dekabr" + +msgid "This is not a valid IPv6 address." +msgstr "Bu dogry IPv6 salgy däl." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "ýa" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "\"" + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d ýyl" +msgstr[1] "%(num)d ýyl" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d aý" +msgstr[1] "%(num)d aý" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d hepde" +msgstr[1] "%(num)d hepde" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d gün" +msgstr[1] "%(num)d gün" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d sagat" +msgstr[1] "%(num)d sagat" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d minut" +msgstr[1] "%(num)d minut" + +msgid "Forbidden" +msgstr "Gadagan " + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF dogrylamak şowsuz. Talap ýatyryldy." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Bu haty görýärsiňiz, sebäbi bu HTTPS sahypasy web brauzeriňiz tarapyndan " +"iberilmeli \"Referer header\" talap edýär, ýöne hiç biri iberilmedi. Bu " +"sözbaşy, brauzeriňiziň üçünji şahyslar tarapyndan ogurlanmazlygy üçin " +"howpsuzlyk sebäpli talap edilýär." + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Brauzeriňizde \"Referer\" sözbaşylaryny öçüren bolsaňyz, iň bolmanda bu " +"sahypa ýa-da HTTPS birikmeleri ýa-da \"meňzeş\" talaplar üçin täzeden açyň." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Egerde siz diýen bellik " +"ýada \"Referrer-Policy: no-referrer\" header ulanýan bolsaňyz, olary " +"aýyrmagyňyzy haýyş edýäris. CSRF goragy üçin \"Referer\" header-i dogry " +"salgylanma üçin gereklidir. Eger siz gizlinlik üçin alada etseňiz, üçinji " +"şahs sahypalara baglanyşyklar üçin ýaly " +"alternatiwalary ulanyp bilersiňiz." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Bu sahypa formalary tabşyranda CSRF kukisini talap edýäligi sebäpli bu " +"habary görýärsiňiz. Bu kuki, brauzeriňiziň üçünji taraplar tarapyndan " +"ogurlanmazlygy üçin howpsuzlyk sebäpli talap edilýär." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Brauzeriňizde kukileri öçüren bolsaňyz, iň bolmanda şu sahypa ýa-da " +"\"meňzeş\" talaplar üçin olary täzeden açyň." + +msgid "More information is available with DEBUG=True." +msgstr "Has giňişleýin maglumat DEBUG=True bilen elýeterlidir." + +msgid "No year specified" +msgstr "Ýyl görkezilmedi" + +msgid "Date out of range" +msgstr "Sene çägiň daşynda" + +msgid "No month specified" +msgstr "Aý görkezilmedi" + +msgid "No day specified" +msgstr "Gün görkezilmedi" + +msgid "No week specified" +msgstr "Hepde görkezilmedi" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "Elýeterli %(verbose_name_plural)s ýok" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"Gelejek %(verbose_name_plural)s elýeterli däl sebäbi %(class_name)s." +"allow_future bahasy False" + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "Nädogry sene setiri \"%(datestr)s\" berlen format \"%(format)s\"" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "Talap bilen gabat gelýän %(verbose_name)s tapylmady" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Sahypa “iň soňky” däl, ony int-ede öwrüp bolmaz." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Nädogry sahypa (%(page_number)s ): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "Boş list we \"%(class_name)s.allow_empty\" bahasy False" + +msgid "Directory indexes are not allowed here." +msgstr "Bu ýerde katalog indekslerine rugsat berilmeýär." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "\"%(path)s\" beýle ýol ýok" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s indeksi" + +msgid "The install worked successfully! Congratulations!" +msgstr "Üstünlikli guruldy! Gutlaýarys!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Django %(version)s üçin goýberiş " +"belliklerini görüň" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not " +"configured any URLs." +msgstr "" +"Bu sahypany görýärsiňiz, sebäbi sazlamalar faýlyňyzda DEBUG=True we hiç hili URL düzmediňiz." + +msgid "Django Documentation" +msgstr "Django resminamalary" + +msgid "Topics, references, & how-to’s" +msgstr "Mowzuklar, salgylanmalar, & how-to-lar" + +msgid "Tutorial: A Polling App" +msgstr "Gollanma: Ses beriş programmasy" + +msgid "Get started with Django" +msgstr "Django bilen başlaň" + +msgid "Django Community" +msgstr "Django jemgyýeti" + +msgid "Connect, get help, or contribute" +msgstr "Birikiň, kömek alyň ýa-da goşant goşuň" diff --git a/django/conf/locale/tk/__init__.py b/django/conf/locale/tk/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/django/conf/locale/tk/formats.py b/django/conf/locale/tk/formats.py new file mode 100644 index 000000000000..0ab7d49ae596 --- /dev/null +++ b/django/conf/locale/tk/formats.py @@ -0,0 +1,32 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j E Y г." +TIME_FORMAT = "G:i" +DATETIME_FORMAT = "j E Y г. G:i" +YEAR_MONTH_FORMAT = "F Y г." +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" +FIRST_DAY_OF_WEEK = 1 # Monday + +# The *_INPUT_FORMATS strings use the Python strftime format syntax, +# see https://docs.python.org/library/datetime.html#strftime-strptime-behavior +DATE_INPUT_FORMATS = [ + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y", # '25.10.06' +] +DATETIME_INPUT_FORMATS = [ + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d.%m.%Y", # '25.10.2006' + "%d.%m.%y %H:%M:%S", # '25.10.06 14:30:59' + "%d.%m.%y %H:%M:%S.%f", # '25.10.06 14:30:59.000200' + "%d.%m.%y %H:%M", # '25.10.06 14:30' + "%d.%m.%y", # '25.10.06' +] +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/tr/LC_MESSAGES/django.mo b/django/conf/locale/tr/LC_MESSAGES/django.mo index 1a7bdf118b6b..70f6520400c3 100644 Binary files a/django/conf/locale/tr/LC_MESSAGES/django.mo and b/django/conf/locale/tr/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/tr/LC_MESSAGES/django.po b/django/conf/locale/tr/LC_MESSAGES/django.po index 66f12b0237c9..be5fa56bcbbb 100644 --- a/django/conf/locale/tr/LC_MESSAGES/django.po +++ b/django/conf/locale/tr/LC_MESSAGES/django.po @@ -2,25 +2,25 @@ # # Translators: # Ahmet Emre Aladağ , 2013 -# BouRock, 2015-2019 +# BouRock, 2015-2024 # BouRock, 2014-2015 -# Caner Başaran , 2013 +# Caner Başaran , 2013 # Cihad GÜNDOĞDU , 2012 # Cihad GÜNDOĞDU , 2013-2014 # Gökmen Görgen , 2013 # Jannis Leidel , 2011 # Mesut Can Gürle , 2013 -# Murat Çorlu , 2012 +# Murat Çorlu , 2012 # Murat Sahin , 2011-2012 # Türker Sezer , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 17:42+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: BouRock, 2015-2024\n" +"Language-Team: Turkish (http://app.transifex.com/django/django/language/" "tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,6 +34,9 @@ msgstr "Afrikanca" msgid "Arabic" msgstr "Arapça" +msgid "Algerian Arabic" +msgstr "Cezayir Arapçası" + msgid "Asturian" msgstr "Asturyaca" @@ -58,6 +61,9 @@ msgstr "Boşnakça" msgid "Catalan" msgstr "Katalanca" +msgid "Central Kurdish (Sorani)" +msgstr "Orta Kürtçe (Sorani)" + msgid "Czech" msgstr "Çekçe" @@ -83,7 +89,7 @@ msgid "Australian English" msgstr "Avusturya İngilizcesi" msgid "British English" -msgstr "İngiliz İngilizce" +msgstr "İngiliz İngilizcesi" msgid "Esperanto" msgstr "Esperanto dili" @@ -157,6 +163,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Endonezce" +msgid "Igbo" +msgstr "Igbo dili" + msgid "Ido" msgstr "Ido dili" @@ -187,6 +196,9 @@ msgstr "Kannada dili" msgid "Korean" msgstr "Korece" +msgid "Kyrgyz" +msgstr "Kırgızca" + msgid "Luxembourgish" msgstr "Lüksemburgca" @@ -208,6 +220,9 @@ msgstr "Moğolca" msgid "Marathi" msgstr "Marathi dili" +msgid "Malay" +msgstr "Malayca" + msgid "Burmese" msgstr "Birmanca" @@ -271,9 +286,15 @@ msgstr "Tamilce" msgid "Telugu" msgstr "Telugu dili" +msgid "Tajik" +msgstr "Tacikçe" + msgid "Thai" msgstr "Tayca" +msgid "Turkmen" +msgstr "Türkmence" + msgid "Turkish" msgstr "Türkçe" @@ -283,6 +304,9 @@ msgstr "Tatarca" msgid "Udmurt" msgstr "Udmurtça" +msgid "Uyghur" +msgstr "Uygur" + msgid "Ukrainian" msgstr "Ukraynaca" @@ -313,6 +337,11 @@ msgstr "Sabit Dosyalar" msgid "Syndication" msgstr "Dağıtım" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Bu sayfa numarası bir tamsayı değil" @@ -325,6 +354,9 @@ msgstr "Bu sayfa hiç sonuç içermiyor" msgid "Enter a valid value." msgstr "Geçerli bir değer girin." +msgid "Enter a valid domain name." +msgstr "Geçerli bir etki alanı adı girin." + msgid "Enter a valid URL." msgstr "Geçerli bir URL girin." @@ -348,14 +380,18 @@ msgstr "" "Evrensel kod harflerden, sayılardan, altçizgilerden veya tirelerden oluşan " "geçerli bir “kısaltma” girin." -msgid "Enter a valid IPv4 address." -msgstr "Geçerli bir IPv4 adresi girin." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "Geçerli bir %(protocol)s adresi girin." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "Geçerli bir IPv6 adresi girin." +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Geçerli bir IPv4 veya IPv6 adresi girin." +msgid "IPv4 or IPv6" +msgstr "IPv4 veya IPv6" msgid "Enter only digits separated by commas." msgstr "Sadece virgülle ayrılmış rakamlar girin." @@ -373,6 +409,20 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Bu değerin %(limit_value)s değerinden büyük veya eşit olduğuna emin olun." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Bu değerin %(limit_value)s adım boyutunun katları olduğundan emin olun." + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"Bu değerin %(offset)s değerinden başlayarak %(limit_value)s adım boyutunun " +"katı olduğundan emin olun, örn. %(offset)s, %(valid_value1)s, " +"%(valid_value2)s, vb." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -444,6 +494,10 @@ msgstr "ve" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "Bu %(field_labels)s alanına sahip %(model_name)s zaten mevcut." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "\"%(name)s\" kısıtlaması ihlal edildi." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r değeri geçerli bir seçim değil." @@ -458,8 +512,8 @@ msgstr "Bu alan boş olamaz." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "Bu %(field_label)s alanına sahip %(model_name)s zaten mevcut." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -486,6 +540,9 @@ msgstr "Boolean (Ya True ya da False)" msgid "String (up to %(max_length)s)" msgstr "Dizgi (%(max_length)s karaktere kadar)" +msgid "String (unlimited)" +msgstr "Dizgi (sınırsız)" + msgid "Comma-separated integers" msgstr "Virgülle ayrılmış tamsayılar" @@ -568,6 +625,9 @@ msgstr "Tamsayı" msgid "Big (8 byte) integer" msgstr "Büyük (8 bayt) tamsayı" +msgid "Small integer" +msgstr "Küçük tamsayı" + msgid "IPv4 address" msgstr "IPv4 adresi" @@ -581,6 +641,9 @@ msgstr "“%(value)s” değeri ya None, True ya da False olmak zorundadır." msgid "Boolean (Either True, False or None)" msgstr "Booleanl (Ya True, False, ya da None)" +msgid "Positive big integer" +msgstr "Pozitif büyük tamsayı" + msgid "Positive integer" msgstr "Pozitif tamsayı" @@ -591,9 +654,6 @@ msgstr "Pozitif küçük tamsayı" msgid "Slug (up to %(max_length)s)" msgstr "Kısaltma (%(max_length)s karaktere kadar)" -msgid "Small integer" -msgstr "Küçük tamsayı" - msgid "Text" msgstr "Metin" @@ -635,6 +695,12 @@ msgstr "Dosya" msgid "Image" msgstr "Resim" +msgid "A JSON object" +msgstr "JSON nesnesi" + +msgid "Value must be valid JSON." +msgstr "Değer geçerli JSON olmak zorundadır." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s %(value)r olan %(model)s benzeri mevcut değil." @@ -729,6 +795,9 @@ msgstr "Tam bir değer girin." msgid "Enter a valid UUID." msgstr "Geçerli bir UUID girin." +msgid "Enter a valid JSON." +msgstr "Geçerli bir JSON girin." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -737,20 +806,25 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Gizli alan %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm verisi eksik ya da kurcalanmış." +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm verileri eksik veya değiştirilmiş. Eksik alanlar: " +"%(field_names)s. Sorun devam ederse bir hata raporu dosyalamanız gerekebilir." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Lütfen %d ya da daha az form gönderin." -msgstr[1] "Lütfen %d ya da daha az form gönderin." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Lütfen en fazla %(num)d form gönderin." +msgstr[1] "Lütfen en fazla %(num)d form gönderin." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Lütfen %d ya da daha fazla form gönderin." -msgstr[1] "Lütfen %d ya da daha fazla form gönderin." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Lütfen en az %(num)d form gönderin." +msgstr[1] "Lütfen en az %(num)d form gönderin." msgid "Order" msgstr "Sıralama" @@ -815,15 +889,7 @@ msgstr "Evet" msgid "No" msgstr "Hayır" -msgid "Year" -msgstr "Yıl" - -msgid "Month" -msgstr "Ay" - -msgid "Day" -msgstr "Gün" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "evet,hayır,olabilir" @@ -1097,43 +1163,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d yıl" -msgstr[1] "%d yıl" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d yıl" +msgstr[1] "%(num)d yıl" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d ay" -msgstr[1] "%d ay" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d ay" +msgstr[1] "%(num)d ay" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d hafta" -msgstr[1] "%d hafta" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d hafta" +msgstr[1] "%(num)d hafta" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d gün" -msgstr[1] "%d gün" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d gün" +msgstr[1] "%(num)d gün" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d saat" -msgstr[1] "%d saat" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d saat" +msgstr[1] "%(num)d saat" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d dakika" -msgstr[1] "%d dakika" - -msgid "0 minutes" -msgstr "0 dakika" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d dakika" +msgstr[1] "%(num)d dakika" msgid "Forbidden" msgstr "Yasak" @@ -1143,11 +1206,11 @@ msgstr "CSRF doğrulaması başarısız oldu. İstek iptal edildi." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Bu iletiyi görüyorsunuz çünkü bu HTTPS sitesi, Web tarayıcınız tarafından " +"Bu iletiyi görüyorsunuz çünkü bu HTTPS sitesi, web tarayıcınız tarafından " "gönderilen “Referer üstbilgisi”ni gerektirir, ancak hiçbir şey gönderilmedi. " "Bu üstbilgi güvenlik nedenleri için gerekir, tarayıcınızın üçüncü taraf " "uygulamalar tarafından ele geçirilmediğinden emin olun." @@ -1165,8 +1228,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Eğer etiketi " "kullanıyorsanız ya da “Referrer-Policy: no-referrer” üstbilgisini dahil " @@ -1253,8 +1316,8 @@ msgstr "“%(path)s” mevcut değil" msgid "Index of %(directory)s" msgstr "%(directory)s indeksi" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: bitiş tarihleri olan mükemmelliyetçiler için Web yapısı." +msgid "The install worked successfully! Congratulations!" +msgstr "Yükleme başarılı olarak çalıştı! Tebrikler!" #, python-format msgid "" @@ -1265,20 +1328,17 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">yayım notlarını göster" -msgid "The install worked successfully! Congratulations!" -msgstr "Yükleme başarılı olarak çalıştı! Tebrikler!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Bu sayfayı görüyorsunuz çünkü DEBUG=True parametresi ayarlar dosyanızın içindedir ve herhangi bir " -"URL yapılandırmadınız." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True parametresi ayarlar dosyanızın içindedir ve " +"herhangi bir URL yapılandırmadınız." msgid "Django Documentation" msgstr "Django Belgeleri" diff --git a/django/conf/locale/tr/formats.py b/django/conf/locale/tr/formats.py index 1be5ac51afdc..806f4428d1fc 100644 --- a/django/conf/locale/tr/formats.py +++ b/django/conf/locale/tr/formats.py @@ -2,27 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd F Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'd F Y H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'd F' -SHORT_DATE_FORMAT = 'd M Y' -SHORT_DATETIME_FORMAT = 'd M Y H:i' +DATE_FORMAT = "d F Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "d F Y H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "d F" +SHORT_DATE_FORMAT = "d M Y" +SHORT_DATETIME_FORMAT = "d M Y H:i" FIRST_DAY_OF_WEEK = 1 # Pazartesi # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d/%m/%Y', '%d/%m/%y', # '25/10/2006', '25/10/06' - '%y-%m-%d', # '06-10-25' - # '%d %B %Y', '%d %b. %Y', # '25 Ekim 2006', '25 Eki. 2006' + "%d/%m/%Y", # '25/10/2006' + "%d/%m/%y", # '25/10/06' + "%y-%m-%d", # '06-10-25' + # "%d %B %Y", # '25 Ekim 2006' + # "%d %b. %Y", # '25 Eki. 2006' ] DATETIME_INPUT_FORMATS = [ - '%d/%m/%Y %H:%M:%S', # '25/10/2006 14:30:59' - '%d/%m/%Y %H:%M:%S.%f', # '25/10/2006 14:30:59.000200' - '%d/%m/%Y %H:%M', # '25/10/2006 14:30' + "%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59' + "%d/%m/%Y %H:%M:%S.%f", # '25/10/2006 14:30:59.000200' + "%d/%m/%Y %H:%M", # '25/10/2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." NUMBER_GROUPING = 3 diff --git a/django/conf/locale/ug/LC_MESSAGES/django.mo b/django/conf/locale/ug/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..ce10d7df7f52 Binary files /dev/null and b/django/conf/locale/ug/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/ug/LC_MESSAGES/django.po b/django/conf/locale/ug/LC_MESSAGES/django.po new file mode 100644 index 000000000000..daa3973d8d6d --- /dev/null +++ b/django/conf/locale/ug/LC_MESSAGES/django.po @@ -0,0 +1,1353 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# abdl erkin <84247764@qq.com>, 2018 +# Abduqadir Abliz , 2023-2024 +# Abduqadir Abliz , 2023 +# Azat, 2023 +# Murat Orhun , 2023 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Abduqadir Abliz , 2023-2024\n" +"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Afrikaans" +msgstr "ئافرىكانسچە" + +msgid "Arabic" +msgstr "ئەرەبچە" + +msgid "Algerian Arabic" +msgstr "ئالجىرىيە ئەرەپچىسى" + +msgid "Asturian" +msgstr "ئاستۇرىچە" + +msgid "Azerbaijani" +msgstr "ئەزەربەيجانچە" + +msgid "Bulgarian" +msgstr "بۇلغارچە" + +msgid "Belarusian" +msgstr "بېلورۇسىچە" + +msgid "Bengali" +msgstr "بېنگالچە" + +msgid "Breton" +msgstr "بىرېتونچە" + +msgid "Bosnian" +msgstr "بوسنىيەچە" + +msgid "Catalan" +msgstr "كاتالانچە" + +msgid "Central Kurdish (Sorani)" +msgstr "مەركىزى كۇردچە ( سورانى) " + +msgid "Czech" +msgstr "چېخچە" + +msgid "Welsh" +msgstr "ۋېلشچە" + +msgid "Danish" +msgstr "دانىشچە" + +msgid "German" +msgstr "گىرمانچە" + +msgid "Lower Sorbian" +msgstr "تۆۋەن سوربچە" + +msgid "Greek" +msgstr "گىرېكچە" + +msgid "English" +msgstr "ئىنگلىزچە" + +msgid "Australian English" +msgstr "" +"ئاۋىستىرالىيە ئىنگلزچىسى\n" +" " + +msgid "British English" +msgstr "ئەنگىلىيە ئىنگىلىزچىسى" + +msgid "Esperanto" +msgstr "دۇنيا تىلى" + +msgid "Spanish" +msgstr "ئىسپانچە" + +msgid "Argentinian Spanish" +msgstr "ئارگېنتىنا ئىسپانچىسى" + +msgid "Colombian Spanish" +msgstr "كولۇمبىيە ئىسپانچىسى" + +msgid "Mexican Spanish" +msgstr "مېكسىكا ئىسپانچىسى" + +msgid "Nicaraguan Spanish" +msgstr "نىكاراگۇئا ئىسپاچىسى" + +msgid "Venezuelan Spanish" +msgstr "ۋېنېزۇئېلا ئىسپانچىسى" + +msgid "Estonian" +msgstr "ئېستونىيەچە" + +msgid "Basque" +msgstr "بەسىكچە" + +msgid "Persian" +msgstr "پارىسچە" + +msgid "Finnish" +msgstr "ڧىنلانىدچە" + +msgid "French" +msgstr "ڧىرانسۇزچە" + +msgid "Frisian" +msgstr "فىرىزىيەچە" + +msgid "Irish" +msgstr "ئىرېلاندىيەچە" + +msgid "Scottish Gaelic" +msgstr "شوتلاندىيەچە" + +msgid "Galician" +msgstr "گالىچىيەچە" + +msgid "Hebrew" +msgstr "ئىبرانىچە" + +msgid "Hindi" +msgstr "ھىندىچە" + +msgid "Croatian" +msgstr "كىرودىيەچە" + +msgid "Upper Sorbian" +msgstr "يۇقىرى سوربچە" + +msgid "Hungarian" +msgstr "ماجارچە" + +msgid "Armenian" +msgstr "ئارمىنىيەچە" + +msgid "Interlingua" +msgstr "خەلقئارالىق تىل" + +msgid "Indonesian" +msgstr "ھىندىنوزىيەچە" + +msgid "Igbo" +msgstr "ئىبوچە" + +msgid "Ido" +msgstr "ئىيدوچە" + +msgid "Icelandic" +msgstr "ئىسلاندىيەچە" + +msgid "Italian" +msgstr "ئىتالىيەچە" + +msgid "Japanese" +msgstr "ياپونچە" + +msgid "Georgian" +msgstr "گرۇزىيەچە" + +msgid "Kabyle" +msgstr "كەبىيلچە" + +msgid "Kazakh" +msgstr "قازاقچە" + +msgid "Khmer" +msgstr "كامىيرچە" + +msgid "Kannada" +msgstr "كانناداچە" + +msgid "Korean" +msgstr "كورىيەچە" + +msgid "Kyrgyz" +msgstr "قىرغىزچە" + +msgid "Luxembourgish" +msgstr "لىيۇكسېمبۇرگچە" + +msgid "Lithuanian" +msgstr "لىتۋاچە" + +msgid "Latvian" +msgstr "لاتۋىيەچە" + +msgid "Macedonian" +msgstr "ماكېدونىيەچە" + +msgid "Malayalam" +msgstr "مالىيالامچە" + +msgid "Mongolian" +msgstr "مۇڭغۇلچە" + +msgid "Marathi" +msgstr "ماراتىچە" + +msgid "Malay" +msgstr "مالايچە" + +msgid "Burmese" +msgstr "بېرمىچە" + +msgid "Norwegian Bokmål" +msgstr "نورۋېگىيە بوكمىلچىسى" + +msgid "Nepali" +msgstr "نېپالچە" + +msgid "Dutch" +msgstr "گوللاندىيەچە" + +msgid "Norwegian Nynorsk" +msgstr "نورۋېگىيە نىنورسكچىسى" + +msgid "Ossetic" +msgstr "ئوسېتچە" + +msgid "Punjabi" +msgstr "پۇنجابىچە" + +msgid "Polish" +msgstr "پولشاچە" + +msgid "Portuguese" +msgstr "پورتۇگالچە" + +msgid "Brazilian Portuguese" +msgstr "بىرازىلىيە پورتۇگالچىسى" + +msgid "Romanian" +msgstr "رومەينىيەچە" + +msgid "Russian" +msgstr "رۇسچە" + +msgid "Slovak" +msgstr "سلوۋاكىيەچە" + +msgid "Slovenian" +msgstr "سىلوۋېنىيەچە" + +msgid "Albanian" +msgstr "ئالبانىيەچە" + +msgid "Serbian" +msgstr "سېربىيەچە" + +msgid "Serbian Latin" +msgstr "سېربىيە لاتىنچىسى" + +msgid "Swedish" +msgstr "شىۋىتسىيەچە" + +msgid "Swahili" +msgstr "سۋاھىلچە" + +msgid "Tamil" +msgstr "تامىلچە" + +msgid "Telugu" +msgstr "تېلۇگۇ" + +msgid "Tajik" +msgstr "تاجىكچە" + +msgid "Thai" +msgstr "تايلاندچە" + +msgid "Turkmen" +msgstr "تۈركمەنچە" + +msgid "Turkish" +msgstr "تۈركچە" + +msgid "Tatar" +msgstr "تاتارچە" + +msgid "Udmurt" +msgstr "ئۇدمۇرتچە" + +msgid "Uyghur" +msgstr "ئۇيغۇرچە" + +msgid "Ukrainian" +msgstr "ئۇكرائىنچە" + +msgid "Urdu" +msgstr "ئوردۇچە" + +msgid "Uzbek" +msgstr "ئۆزبەكچە" + +msgid "Vietnamese" +msgstr "ۋېيتنامچە" + +msgid "Simplified Chinese" +msgstr "خەنزۇچە" + +msgid "Traditional Chinese" +msgstr "ئەنئەنىۋى خەنزۇچىسى" + +msgid "Messages" +msgstr "قىسقا ئۇچۇر" + +msgid "Site Maps" +msgstr "بېكەت خەرىتىسى" + +msgid "Static Files" +msgstr "سىتاتىك ھۆججەت" + +msgid "Syndication" +msgstr "تەشكىللىنىش" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + +msgid "That page number is not an integer" +msgstr "بەت نومۇرى پۈتۈن سان ئەمەس" + +msgid "That page number is less than 1" +msgstr "بەت نومۇرى 1 دىن كىچىك" + +msgid "That page contains no results" +msgstr "ئۇ بەتتە ھېچقانداق نەتىجە يوق" + +msgid "Enter a valid value." +msgstr "بىر ئىناۋەتلىك قىممەتنى تولدۇرۇڭ" + +msgid "Enter a valid domain name." +msgstr "ئىناۋەتلىك دائىرە ئىسمى كىرگۈزۈلىدۇ." + +msgid "Enter a valid URL." +msgstr "ئىناۋەتلىك URL نى تولدۇرۇڭ" + +msgid "Enter a valid integer." +msgstr "ئىناۋەتلىك پۈتۈن سان تولدۇرۇڭ" + +msgid "Enter a valid email address." +msgstr "ئىناۋەتلىك ئېلخەت ئادرېسىنى كىرگۈزۈڭ." + +#. Translators: "letters" means latin letters: a-z and A-Z. +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"ھەرپ ، سان ، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك «سىلاگ» " +"نى كىرگۈزۈڭ." + +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"يۇنىكودلۇق ھەرپ، سان، ئاستى سىزىق ياكى سىزىقچىلاردىن تەركىب تاپقان ئۈنۈملۈك " +"«slug» نى كىرگۈزۈڭ." + +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "ئىناۋەتلىك %(protocol)sئادرېسى كىرگۈزۈلىدۇ." + +msgid "IPv4" +msgstr "IPv4" + +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 ياكى IPv6" + +msgid "Enter only digits separated by commas." +msgstr "پەش ئارقىلىق ئايرىلغان رەقەملەرنىلا كىرگۈزۈڭ." + +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" +"بۇ قىممەتنىڭ %(limit_value)s بولىشىغا كاپالەتلىك قىلىڭ ( ھازىر " +"%(show_value)s)" + +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" +"بۇ قىممەتنىڭ %(limit_value)s دىن تۆۋەن ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" + +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" +"بۇ قىممەتنىڭ %(limit_value)s دىن چوڭ ياكى تەڭ بولۇشىغا كاپالەتلىك قىلىڭ" + +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "بۇ قىممەتنىڭ %(limit_value)s نىڭ كۆپەيتمىسى بولىشىغا كاپالەتلىك قىلىڭ" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"بۇ قىممەت كۆپ قەدەم باسقۇچلۇق بولسۇن %(limit_value)s، %(offset)s دىن " +"باشلىنىپ، مەسىلەن %(offset)s، %(valid_value1)s، %(valid_value2)s ۋە باشقىلار." + +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ھازىر %(show_value)d بار)." +msgstr[1] "" +"بۇ قىممەتنىڭ كەم دېگەندە %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ھازىر %(show_value)d بار)." + +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ھازىر %(show_value)d بار)." +msgstr[1] "" +"بۇ قىممەتنىڭ ئەڭ كۆپ بولغاندا %(limit_value)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ئۇنىڭدا %(show_value)d بار). " + +msgid "Enter a number." +msgstr "سان كىرگۈزۈڭ." + +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "جەمى 4%(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." +msgstr[1] "جەمى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." + +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." +msgstr[1] "%(max)s ئونلۇق ئورۇندىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." + +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." +msgstr[1] "" +"ئونلۇق نۇقتىدىن ئىلگىرى %(max)s خانىدىن ئېشىپ كەتمەسلىكىگە كاپالەتلىك قىلىڭ." + +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"ھۆججەت كېڭەيتىشكە «%(extension)s» رۇخسەت قىلىنمايدۇ. رۇخسەت قىلىنغان " +"كېڭەيتىلمە: %(allowed_extensions)s." + +msgid "Null characters are not allowed." +msgstr "بوش ھەرپلەرگە رۇخسەت قىلىنمايدۇ." + +msgid "and" +msgstr "ۋە" + +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "%(model_name)s بىلەن بۇ %(field_labels)s مەۋجۇت." + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "«%(name)s» چەكلىمىسى بۇزۇلدى." + +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "قىممەت %(value)r ئىناۋەتسىز." + +msgid "This field cannot be null." +msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" + +msgid "This field cannot be blank." +msgstr "بۇ ئورۇننى بوش قويۇشقا بولمايدۇ" + +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "بۇ %(field_label)s بىلەن %(model_name)s مەۋجۇت." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s چوقۇم %(date_field_label)s %(lookup_type)s ئۈچۈن بىردىنبىر " +"بولۇشى كېرەك." + +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "تىپ تۈرى: %(field_type)s" + +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "«%(value)s» قىممىتى چوقۇم True ياكى False بولۇشى كېرەك." + +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." + +msgid "Boolean (Either True or False)" +msgstr "Boolean (True ياكى False)" + +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "(%(max_length)s گە قەدەر ئۇزۇنلۇقتىكى) ھەرپ-بەلگە" + +msgid "String (unlimited)" +msgstr "ھەرپ-بەلگە ( ئۇزۇنلۇققا چەكلىمە يوق)" + +msgid "Comma-separated integers" +msgstr "پەش بىلەن ئايرىلغان پۈتۈن سان" + +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"«%(value)s» قىممىتى ئىناۋەتسىز ۋاقىت فورماتىدا. ئۇ چوقۇم YYYY-MM-DD شەكلىدە " +"بولۇشى كېرەك." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"«%(value)s» قىممىتىنىڭ توغرا فورماتى (YYYY-MM-DD) بار ، ئەمما ئۇ ۋاقىت " +"ئىناۋەتسىز." + +msgid "Date (without time)" +msgstr "چېسلا (سائەت مىنۇت يوق)" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " +"[TZ] شەكلىدە بولۇشى كېرەك." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (YYYY-MM-DD HH: MM [: ss [.uuuuuu]] " +"[TZ]) ئەمما ئۇ ئىناۋەتسىز كۈن / ۋاقىت." + +msgid "Date (with time)" +msgstr "چېسلا (ۋاقىت بىلەن)" + +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." + +msgid "Decimal number" +msgstr "ئونلۇق سان" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم [DD] [[HH:] MM:] ss [.uuuuuu] " +"شەكلىدە بولۇشى كېرەك." + +msgid "Duration" +msgstr "داۋاملىشىش ۋاقتى" + +msgid "Email address" +msgstr "ئېلخەت ئادرېسى" + +msgid "File path" +msgstr "ھۆججەت يولى" + +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "«%(value)s» قىممىتى چوقۇم لەيلىمە چېكىتلىك مىقتار بولۇشى كېرەك." + +msgid "Floating point number" +msgstr "كەسرىلىك سان نومۇر" + +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "«%(value)s» قىممىتى چوقۇم پۈتۈن سان بولۇشى كېرەك." + +msgid "Integer" +msgstr "پۈتۈن سان" + +msgid "Big (8 byte) integer" +msgstr "چوڭ (8 بايىت) پۈتۈن سان" + +msgid "Small integer" +msgstr "كىچىك پۈتۈن سان" + +msgid "IPv4 address" +msgstr "IPv4 ئادرېسى" + +msgid "IP address" +msgstr "IP ئادرېسى" + +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "«%(value)s» قىممىتى چوقۇم True ، False ياكى None بولۇشى كېرەك." + +msgid "Boolean (Either True, False or None)" +msgstr "Boolean (True ياكى False)" + +msgid "Positive big integer" +msgstr "مۇسبەت چوڭ پۈتۈن سان" + +msgid "Positive integer" +msgstr "مۇسبەت پۈتۈن سان" + +msgid "Positive small integer" +msgstr "مۇسبەت كىچىك پۈتۈن سان" + +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (كۆپ بولغاندا %(max_length)s)" + +msgid "Text" +msgstr "تېكىست" + +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"«%(value)s» قىممىتى ئىناۋەتسىز. ئۇ چوقۇم HH: MM [: ss [.uuuuuu]] شەكلىدە " +"بولۇشى كېرەك." + +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"«%(value)s» قىممىتىنىڭ توغرا فورماتى بار (HH: MM [: ss [.uuuuuu]]) ئەمما ئۇ " +"ئىناۋەتسىز ۋاقىت." + +msgid "Time" +msgstr "ۋاقىت" + +msgid "URL" +msgstr "URL" + +msgid "Raw binary data" +msgstr "خام ئىككىلىك سان" + +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "«%(value)s» ئىناۋەتلىك UUID ئەمەس." + +msgid "Universally unique identifier" +msgstr "ئۇنىۋېرسال بىردىنبىر كىملىك" + +msgid "File" +msgstr "ھۆججەت" + +msgid "Image" +msgstr "رەسىم" + +msgid "A JSON object" +msgstr "JSON ئوبيېكتى" + +msgid "Value must be valid JSON." +msgstr "چوقۇم ئىناۋەتلىك JSON بولۇشى كېرەك." + +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "مىسال %(value)r %(field)s قىممىتى بولغان %(model)s مەۋجۇت ئەمەس." + +msgid "Foreign Key (type determined by related field)" +msgstr "سىرتقى ئاچقۇچ (تىپى مۇناسىۋەتلىك مەيدان تەرىپىدىن بېكىتىلگەن)" + +msgid "One-to-one relationship" +msgstr "بىرمۇبىر مۇناسىۋەت" + +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "%(from)s-%(to)s مۇناسىۋەت" + +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "%(from)s-%(to)s مۇناسىۋەتلەر" + +msgid "Many-to-many relationship" +msgstr "كۆپكە كۆب مۇناسىۋىتى" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the +#. label +msgid ":?.!" +msgstr ":?.!" + +msgid "This field is required." +msgstr "بۇ رايون تەلەپ قىلىنىدۇ." + +msgid "Enter a whole number." +msgstr "پۈتۈن ساننى كىرگۈزۈڭ." + +msgid "Enter a valid date." +msgstr "ئىناۋەتلىك چېسلانى كىرگۈزۈڭ." + +msgid "Enter a valid time." +msgstr "ئىناۋەتلىك ۋاقىت كىرگۈزۈڭ." + +msgid "Enter a valid date/time." +msgstr "ئىناۋەتلىك چېسلا / ۋاقىت كىرگۈزۈڭ." + +msgid "Enter a valid duration." +msgstr "ئىناۋەتلىك مۇددىتىنى كىرگۈزۈڭ." + +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "كۈن سانى چوقۇم {min_days} بىلەن {max_days} ئارىسىدا بولۇشى كېرەك." + +msgid "No file was submitted. Check the encoding type on the form." +msgstr "ھېچقانداق ھۆججەت يوللانمىدى. جەدۋەلدىكى كودلاش تۈرىنى تەكشۈرۈڭ." + +msgid "No file was submitted." +msgstr "ھېچقانداق ھۆججەت يوللانمىدى." + +msgid "The submitted file is empty." +msgstr "يوللانغان ھۆججەت قۇرۇق." + +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ئۇنىڭدا %(length)d بار)." +msgstr[1] "" +"بۇ ھۆججەت نامىنىڭ ئەڭ كۆپ بولغاندا %(max)d ھەرپ بولۇشىغا كاپالەتلىك قىلىڭ " +"(ئۇنىڭدا %(length)d بار)." + +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "ھۆججەت يوللاڭ ياكى تەكشۈرۈش رامكىسىنى تەكشۈرۈڭ ، ھەر ئىككىسىنى ئەمەس." + +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"ئىناۋەتلىك رەسىم يۈكلەڭ. سىز يۈكلىگەن ھۆججەت يا رەسىم ئەمەس ۋەياكى بۇزۇلغان." + +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "ئۈنۈملۈك تاللاشنى تاللاڭ. %(value)s تاللاشلارنىڭ بىرى ئەمەس." + +msgid "Enter a list of values." +msgstr "قىممەت تىزىملىكىنى كىرگۈزۈڭ." + +msgid "Enter a complete value." +msgstr "تولۇق قىممەت كىرگۈزۈڭ." + +msgid "Enter a valid UUID." +msgstr "ئىناۋەتلىك UUID نى كىرگۈزۈڭ." + +msgid "Enter a valid JSON." +msgstr "ئىناۋەتلىك JSON نى كىرگۈزۈڭ." + +#. Translators: This is the default suffix added to form field labels +msgid ":" +msgstr ":" + +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(يوشۇرۇن مەيدان %(name)s) %(error)s" + +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm سانلىق مەلۇماتلىرى يوقاپ كەتتى ياكى ئۆزگەرتىلدى. يوقاپ كەتكەن " +"ساھە: %(field_names)s. ئەگەر مەسىلە ساقلىنىپ قالسا ، خاتالىق دوكلاتىنى " +"تاپشۇرۇشىڭىز كېرەك." + +#, python-format +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." +msgstr[1] "ئەڭ كۆپ بولغاندا %(num)d جەدۋەلنى يوللاڭ." + +#, python-format +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." +msgstr[1] "كەم دېگەندە %(num)d جەدۋەلنى يوللاڭ." + +msgid "Order" +msgstr "زاكاز" + +msgid "Delete" +msgstr "ئۆچۈرۈش" + +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "%(field)s نىڭ قايتىلانغان سانلىق مەلۇماتلىرىنى تۈزىتىڭ." + +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"%(field)s نىڭ كۆپەيتىلگەن سانلىق مەلۇماتلىرىنى تۈزىتىڭ ، بۇ چوقۇم ئۆزگىچە " +"بولۇشى كېرەك." + +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"%(field_name)s دىكى قايتىلانغان سانلىق مەلۇماتنى تۈزىتىڭ ، بۇ چوقۇم " +"%(date_field)s دىكى %(lookup)s غا خاس بولۇشى كېرەك." + +msgid "Please correct the duplicate values below." +msgstr "تۆۋەندىكى قايتىلانغان قىممەتنى تۈزىتىڭ." + +msgid "The inline value did not match the parent instance." +msgstr "ئىچكى قىممەت ئاتا مىسالغا ماس كەلمىدى." + +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"ئۈنۈملۈك تاللاشنى تاللاڭ. بۇ تاللاش ئىشلەتكىلى بولىدىغان تاللاشلارنىڭ بىرى " +"ئەمەس." + +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "«%(pk)s» ئىناۋەتلىك قىممەت ئەمەس." + +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s نى %(current_timezone)s ۋاقىت رايونىدا ئىزاھلاشقا بولمايدۇ ئۇ " +"مۈجمەل بولۇشى مۇمكىن ياكى ئۇ مەۋجۇت بولماسلىقى مۇمكىن." + +msgid "Clear" +msgstr "تازىلاش" + +msgid "Currently" +msgstr "نۆۋەتتە" + +msgid "Change" +msgstr "ئۆزگەرتىش" + +msgid "Unknown" +msgstr "نامەلۇم" + +msgid "Yes" +msgstr "ھەئە" + +msgid "No" +msgstr "ياق" + +#. Translators: Please do not add spaces around commas. +msgid "yes,no,maybe" +msgstr "ھەئە، ياق، بەلكىىم" + +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d بايىت" +msgstr[1] "%(size)d بايىت" + +#, python-format +msgid "%s KB" +msgstr "%s كىلوبايت" + +#, python-format +msgid "%s MB" +msgstr "%sمېگا بايىت" + +#, python-format +msgid "%s GB" +msgstr "%sگىگا بايىت" + +#, python-format +msgid "%s TB" +msgstr "%s تېرا بايت" + +#, python-format +msgid "%s PB" +msgstr "%s پېتا بايىت" + +msgid "p.m." +msgstr "p.m." + +msgid "a.m." +msgstr "a.m." + +msgid "PM" +msgstr "PM" + +msgid "AM" +msgstr "AM" + +msgid "midnight" +msgstr "يېرىم كېچىدە" + +msgid "noon" +msgstr "چۈشتە" + +msgid "Monday" +msgstr "دۈشەنبە" + +msgid "Tuesday" +msgstr "سەيشەنبە" + +msgid "Wednesday" +msgstr "چارشەمبە" + +msgid "Thursday" +msgstr "پەيشەمبە" + +msgid "Friday" +msgstr "جۈمە" + +msgid "Saturday" +msgstr "شەنبە" + +msgid "Sunday" +msgstr "يەكشەنبە" + +msgid "Mon" +msgstr "دۈش" + +msgid "Tue" +msgstr "سەي" + +msgid "Wed" +msgstr "چار" + +msgid "Thu" +msgstr "پەي" + +msgid "Fri" +msgstr "جۈ" + +msgid "Sat" +msgstr "شەن" + +msgid "Sun" +msgstr "يەك" + +msgid "January" +msgstr "يانۋار" + +msgid "February" +msgstr "فېۋرال" + +msgid "March" +msgstr "مارت" + +msgid "April" +msgstr "ئاپرىل" + +msgid "May" +msgstr "ماي" + +msgid "June" +msgstr "ئىيۇن" + +msgid "July" +msgstr "ئىيۇل" + +msgid "August" +msgstr "ئاۋغۇست" + +msgid "September" +msgstr "سىنتەبىر" + +msgid "October" +msgstr "ئۆكتەبىر" + +msgid "November" +msgstr "نويابىر" + +msgid "December" +msgstr "دىكابىر" + +msgid "jan" +msgstr "يان" + +msgid "feb" +msgstr "فېۋ" + +msgid "mar" +msgstr "مار" + +msgid "apr" +msgstr "ئاپ" + +msgid "may" +msgstr "ماي" + +msgid "jun" +msgstr "ئ‍ىيۇن" + +msgid "jul" +msgstr "ئىيۇل" + +msgid "aug" +msgstr "ئاۋ" + +msgid "sep" +msgstr "سېن" + +msgid "oct" +msgstr "ئۆك" + +msgid "nov" +msgstr "نوي" + +msgid "dec" +msgstr "دىك" + +msgctxt "abbrev. month" +msgid "Jan." +msgstr "يانۋار" + +msgctxt "abbrev. month" +msgid "Feb." +msgstr "فېۋرال" + +msgctxt "abbrev. month" +msgid "March" +msgstr "مارت" + +msgctxt "abbrev. month" +msgid "April" +msgstr "ئاپرىل" + +msgctxt "abbrev. month" +msgid "May" +msgstr "ماي" + +msgctxt "abbrev. month" +msgid "June" +msgstr "ئىيۇن" + +msgctxt "abbrev. month" +msgid "July" +msgstr "ئىيۇل" + +msgctxt "abbrev. month" +msgid "Aug." +msgstr "ئاۋغۇست" + +msgctxt "abbrev. month" +msgid "Sept." +msgstr "سېنتەبىر" + +msgctxt "abbrev. month" +msgid "Oct." +msgstr "ئۆكتەبىر" + +msgctxt "abbrev. month" +msgid "Nov." +msgstr "نويابىر" + +msgctxt "abbrev. month" +msgid "Dec." +msgstr "دىكابىر" + +msgctxt "alt. month" +msgid "January" +msgstr "يانۋار" + +msgctxt "alt. month" +msgid "February" +msgstr "فېۋرال" + +msgctxt "alt. month" +msgid "March" +msgstr "مارت" + +msgctxt "alt. month" +msgid "April" +msgstr "ئاپرىل" + +msgctxt "alt. month" +msgid "May" +msgstr "ماي" + +msgctxt "alt. month" +msgid "June" +msgstr "ئىيۇن" + +msgctxt "alt. month" +msgid "July" +msgstr "ئىيۇل" + +msgctxt "alt. month" +msgid "August" +msgstr "ئاۋغۇست" + +msgctxt "alt. month" +msgid "September" +msgstr "سىنتەبىر" + +msgctxt "alt. month" +msgid "October" +msgstr "ئۆكتەبىر" + +msgctxt "alt. month" +msgid "November" +msgstr "نويابىر" + +msgctxt "alt. month" +msgid "December" +msgstr "دىكابىر" + +msgid "This is not a valid IPv6 address." +msgstr "بۇ ئىناۋەتلىك IPv6 ئادرېس ئەمەس." + +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +msgid "or" +msgstr "ياكى" + +#. Translators: This string is used as a separator between list elements +msgid ", " +msgstr "،" + +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d يىل" +msgstr[1] "%(num)d يىل" + +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d ئاي" +msgstr[1] "%(num)d ئاي" + +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d ھەپتە" +msgstr[1] "%(num)d ھەپتە" + +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d كۈن" +msgstr[1] "%(num)d كۈن" + +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d سائەت" +msgstr[1] "%(num)d سائەت" + +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d مىنۇت" +msgstr[1] "%(num)d مىنۇت" + +msgid "Forbidden" +msgstr "چەكلەنگەن" + +msgid "CSRF verification failed. Request aborted." +msgstr "CSRF دەلىللەش مەغلۇپ بولدى. تەلەپ ئەمەلدىن قالدۇرۇلدى." + +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"چۈنكى بۇ HTTPS تور بېكىتى توركۆرگۈڭىز تەرىپىدىن پايدىلانما ئۇچۇرلىرىنى " +"ئەۋەتىشنى تەلەب قىلىدۇ، ئەمما ھېچقايسىسى ئەۋەتىلمىدى، شۇ سەۋەبتىن سىز بۇ " +"ئۇچۇرنى كۆرىۋاتىسىز.\n" +"بۇ ئۇچۇرلار سىزنىڭ بىخەتەرلىكڭىز ۋە تور كۆرگۈڭىزنىڭ ئۈچۈنجى شەخىس تەرىپىدىن " +"تۇتقۇن قىلىنىشىنىڭ ئالدىنى ئېلىش ئۈچۈندۇر. " + +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"ئەگەر سىز توركۆرگۈچىڭىزنى “Referer” بېكەت سېكىرتكۈچىنى چەكلەپ تەڭشىسىڭىز، بۇ " +"تور بېكەت، ياكى HTTPS ئۇلىنىشى، ياكى “ئوخشاش-مەنبە” ئىلتىماسلىرى ئۈچۈن ئۇنى " +"قايتا ئىچىپ قويۇڭ." + +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"ئەگەر سىز تەگىنى ياكى " +"“Referrer-Policy: no-referrer” بېكەت سېكىرتكۈچىنى ئىشلىتىۋاتىسىز، ئۇلارنى " +"ئۆچۈرۈڭ. CSRF قوغداش تەلەپ قىلىدۇ “Referer” بېكەت سېكىرتكۈچى قاتتىق " +"سېكىرتىشنى ئېلىپ بېرىشى كېرەك. ئەگەر سىز شەخسىيەتىڭىزگە قاراشقا ئۆزىڭىزنى " +"ئۆزىڭىز قارغىلى بولسىڭىز، ئۈچىنچى تەرەپ تور بېكەتلىرىگە ئۇلىنىشلاردا قاتارلىق ئالتۇرناتىۋىلارنى ئىشلىتىڭ." + +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +" بۇ تور بېكەت جەدۋەل يوللىغاندا CSRF ساقلانمىسىنى تەلەپ قىلىدۇ. بۇ " +"ساقلانمىلار بىخەتەرلىكنى كۆزدە تۇتۇپ ، تور كۆرگۈچىڭىزنىڭ ئۈچىنچى تەرەپ " +"تەرىپىدىن ئوغرىلانماسلىقىغا كاپالەتلىك قىلىدۇ." + +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"ئەگەر توركۆرگۈڭىزنى ساقلانمىلارنى چەكلەش ئۈچۈن تەڭشىگەن بولسىڭىز ، ھېچ " +"بولمىغاندا بۇ تور بېكەت ياكى «ئوخشاش مەنبە» تەلەپلىرى ئۈچۈن ئۇلارنى قايتا " +"قوزغىتىڭ." + +msgid "More information is available with DEBUG=True." +msgstr "DEBUG = True بىلەن تېخىمۇ كۆپ ئۇچۇرلارغا ئېرىشكىلى بولىدۇ." + +msgid "No year specified" +msgstr "يىل بەلگىلەنمىدى" + +msgid "Date out of range" +msgstr "ۋاقىت چەكلىمىسىدىن ئېشىب كەتتى" + +msgid "No month specified" +msgstr "ئاي بەلگىلەنمىدى" + +msgid "No day specified" +msgstr "كۈن بەلگىلەنمىدى" + +msgid "No week specified" +msgstr "ھەپتە بەلگىلەنمىدى" + +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "%(verbose_name_plural)s يوق" + +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"كەلگۈسى %(verbose_name_plural)s ئىشلەتكىلى بولمايدۇ ، چۈنكى %(class_name)s." +"allow_future بولسا False." + +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "ئىناۋەتسىز چېسلا تىزمىسى «%(datestr)s» بېرىلگەن فورمات «%(format)s»" + +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "بۇ سوئالغا ماس كېلىدىغان %(verbose_name)s تېپىلمىدى" + +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "بەت «ئاخىرقى» ئەمەس ،ياكى ئۇنى int غا ئايلاندۇرغىلى بولمىدى." + +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "ئىناۋەتسىز بەت (%(page_number)s): %(message)s" + +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "بوش تىزىملىك %(class_name)s ۋە «.allow_empty» بولسا False." + +msgid "Directory indexes are not allowed here." +msgstr "ھۆججەت مۇندەرىجىسى بۇ يەردە رۇخسەت قىلىنمايدۇ." + +#, python-format +msgid "“%(path)s” does not exist" +msgstr "%(path)s مەۋجۇت ئەمەس" + +#, python-format +msgid "Index of %(directory)s" +msgstr "%(directory)s نىڭ كۆرسەتكۈچىسى" + +msgid "The install worked successfully! Congratulations!" +msgstr "قاچىلاش مۇۋەپپەقىيەتلىك بولدى! مۇبارەك بولسۇن!" + +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +" Django %(version)s ئۈچۈن ئېلان قىلىش " +"خاتىرىسى نى كۆرۈڭ" + +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not " +"configured any URLs." +msgstr "" +"سىز بۇ بەتنى كۆرۈۋاتىسىز ، چۈنكى DEBUG = " +"True سىزنىڭ تەڭشەك ھۆججىتىڭىزدە ،شۇنداقلا ھېچقانداق URL تەڭشەلىمىگەن." + +msgid "Django Documentation" +msgstr " Django قوللانمىسى" + +msgid "Topics, references, & how-to’s" +msgstr "تېما ، پايدىلانما ، & amp; قانداق قىلىش " + +msgid "Tutorial: A Polling App" +msgstr "دەرسلىك: بىر بېلەت تاشلاش دىتالى" + +msgid "Get started with Django" +msgstr "Django بىلەن تونۇشۇش" + +msgid "Django Community" +msgstr "Django جەمىيىتى" + +msgid "Connect, get help, or contribute" +msgstr "قوشۇلۇش ، ياردەمگە ئېرىشىش ياكى تۆھپە قوشۇش" diff --git a/django/conf/locale/ug/__init__.py b/django/conf/locale/ug/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/django/conf/locale/ug/formats.py b/django/conf/locale/ug/formats.py new file mode 100644 index 000000000000..92f01342e965 --- /dev/null +++ b/django/conf/locale/ug/formats.py @@ -0,0 +1,14 @@ +# This file is distributed under the same license as the Django package. +# +# The *_FORMAT strings use the Django date format syntax, +# see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "j F Y" +TIME_FORMAT = "G:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "Y/m/d" +SHORT_DATETIME_FORMAT = "Y/m/d G:i" +FIRST_DAY_OF_WEEK = 1 +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "," +NUMBER_GROUPING = 3 diff --git a/django/conf/locale/uk/LC_MESSAGES/django.mo b/django/conf/locale/uk/LC_MESSAGES/django.mo index 2d081ea90f40..0e9dc9f0794b 100644 Binary files a/django/conf/locale/uk/LC_MESSAGES/django.mo and b/django/conf/locale/uk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/uk/LC_MESSAGES/django.po b/django/conf/locale/uk/LC_MESSAGES/django.po index 39b8d5931910..b2a71874be78 100644 --- a/django/conf/locale/uk/LC_MESSAGES/django.po +++ b/django/conf/locale/uk/LC_MESSAGES/django.po @@ -2,15 +2,16 @@ # # Translators: # Oleksandr Chernihov , 2014 -# Boryslav Larin , 2011 -# Денис Подлесный , 2016 +# Boryslav Larin , 2011,2022 +# Denis Podlesniy , 2016 # Igor Melnyk, 2014-2015,2017 -# Illia Volochii , 2019 +# Illia Volochii , 2019,2021-2023 # Jannis Leidel , 2011 # Kirill Gagarski , 2014 # Max V. Stotsky , 2014 # Mikhail Kolesnik , 2015 # Mykola Zamkovoi , 2014 +# Natalia, 2024 # Alex Bolotov , 2013-2014 # Roman Kozlovskyi , 2012 # Sergiy Kuzmenko , 2011 @@ -21,10 +22,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-12-26 20:22+0000\n" -"Last-Translator: Illia Volochii \n" -"Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: Natalia, 2024\n" +"Language-Team: Ukrainian (http://app.transifex.com/django/django/language/" "uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,6 +42,9 @@ msgstr "Африканська" msgid "Arabic" msgstr "Арабська" +msgid "Algerian Arabic" +msgstr "Алжирська арабська" + msgid "Asturian" msgstr "Астурійська" @@ -65,6 +69,9 @@ msgstr "Боснійська" msgid "Catalan" msgstr "Каталонська" +msgid "Central Kurdish (Sorani)" +msgstr "Центральнокурдська (сорані)" + msgid "Czech" msgstr "Чеська" @@ -164,6 +171,9 @@ msgstr "Інтерлінгва" msgid "Indonesian" msgstr "Індонезійська" +msgid "Igbo" +msgstr "Ігбо" + msgid "Ido" msgstr "Ідо" @@ -194,6 +204,9 @@ msgstr "Каннадська" msgid "Korean" msgstr "Корейська" +msgid "Kyrgyz" +msgstr "Киргизька" + msgid "Luxembourgish" msgstr "Люксембурзька" @@ -215,6 +228,9 @@ msgstr "Монгольська" msgid "Marathi" msgstr "Маратхі" +msgid "Malay" +msgstr "Малайська" + msgid "Burmese" msgstr "Бірманська" @@ -278,9 +294,15 @@ msgstr "Тамільська" msgid "Telugu" msgstr "Телугу" +msgid "Tajik" +msgstr "Таджицька" + msgid "Thai" msgstr "Тайська" +msgid "Turkmen" +msgstr "Туркменська" + msgid "Turkish" msgstr "Турецька" @@ -290,6 +312,9 @@ msgstr "Татарська" msgid "Udmurt" msgstr "Удмуртська" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Українська" @@ -320,6 +345,11 @@ msgstr "Статичні файли" msgid "Syndication" msgstr "Об'єднання" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Номер сторінки не є цілим числом" @@ -332,6 +362,9 @@ msgstr "Сторінка не містить результатів" msgid "Enter a valid value." msgstr "Введіть коректне значення." +msgid "Enter a valid domain name." +msgstr "" + msgid "Enter a valid URL." msgstr "Введіть коректний URL." @@ -350,15 +383,21 @@ msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Введіть коректне значення 'slug' (короткого заголовку), що може містити " +"тільки літери, числа, символи підкреслювання або дефіси." -msgid "Enter a valid IPv4 address." -msgstr "Введіть коректну IPv4 адресу." +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "" -msgid "Enter a valid IPv6 address." -msgstr "Введіть дійсну IPv6 адресу." +msgid "IPv4" +msgstr "" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "Введіть дійсну IPv4 чи IPv6 адресу." +msgid "IPv6" +msgstr "" + +msgid "IPv4 or IPv6" +msgstr "" msgid "Enter only digits separated by commas." msgstr "Введіть тільки цифри, що розділені комами." @@ -377,6 +416,16 @@ msgstr "Переконайтеся, що це значення менше чи msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Переконайтеся, що це значення більше чи дорівнює %(limit_value)s." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -459,6 +508,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Розширення файлу '%(extension)s' не дозволено. Дозволені розширення: ' " +"%(allowed_extensions)s'." msgid "Null characters are not allowed." msgstr "Символи Null не дозволені." @@ -470,6 +521,10 @@ msgstr "та" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(model_name)s з таким %(field_labels)s вже існує." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "Значення %(value)r не є дозволеним вибором." @@ -484,8 +539,8 @@ msgstr "Це поле не може бути порожнім." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(model_name)s з таким %(field_label)s вже існує." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -503,7 +558,7 @@ msgstr "" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "Значення \"%(value)s\" повинне бути True, False, або None." msgid "Boolean (Either True or False)" msgstr "Булеве значення (True або False)" @@ -512,6 +567,9 @@ msgstr "Булеве значення (True або False)" msgid "String (up to %(max_length)s)" msgstr "Рядок (до %(max_length)s)" +msgid "String (unlimited)" +msgstr "Рядок (необмежений)" + msgid "Comma-separated integers" msgstr "Цілі, розділені комою" @@ -535,6 +593,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі YYYY-" +"MM-DD HH:MM[:ss[.uuuuuu]][TZ]." #, python-format msgid "" @@ -584,6 +644,9 @@ msgstr "Ціле число" msgid "Big (8 byte) integer" msgstr "Велике (8 байтів) ціле число" +msgid "Small integer" +msgstr "Мале ціле число" + msgid "IPv4 address" msgstr "IPv4 адреса" @@ -597,6 +660,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Булеве значення (включаючи True, False або None)" +msgid "Positive big integer" +msgstr "Додатнє велике ціле число" + msgid "Positive integer" msgstr "Додатнє ціле число" @@ -607,9 +673,6 @@ msgstr "Додатнє мале ціле число" msgid "Slug (up to %(max_length)s)" msgstr "Slug (до %(max_length)s)" -msgid "Small integer" -msgstr "Мале ціле число" - msgid "Text" msgstr "Текст" @@ -618,6 +681,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"Значення \"%(value)s\" має невірний формат. Воно повинне бути у форматі HH:" +"MM[:ss[.uuuuuu]]." #, python-format msgid "" @@ -636,7 +701,7 @@ msgstr "Необроблені двійкові дані" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” не є валідним UUID." msgid "Universally unique identifier" msgstr "Універсальний унікальний ідентифікатор" @@ -647,6 +712,12 @@ msgstr "Файл" msgid "Image" msgstr "Зображення" +msgid "A JSON object" +msgstr "JSON-об'єкт" + +msgid "Value must be valid JSON." +msgstr "Значення має бути коректним JSON." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "Екземпляр %(model)s з %(field)s %(value)r не існує." @@ -745,7 +816,10 @@ msgid "Enter a complete value." msgstr "Введіть значення повністю." msgid "Enter a valid UUID." -msgstr "Введіть коректне значення UUID," +msgstr "Введіть коректне значення UUID." + +msgid "Enter a valid JSON." +msgstr "Введіть коректний JSON." #. Translators: This is the default suffix added to form field labels msgid ":" @@ -755,24 +829,27 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Приховане поле %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "Дані ManagementForm відсутні або були пошкоджені" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Будь ласка, відправте %d або менше форм." -msgstr[1] "Будь ласка, відправте %d або менше форм." -msgstr[2] "Будь ласка, відправте %d або менше форм." -msgstr[3] "Будь ласка, відправте %d або менше форм." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Будь ласка, відправте як мінімум %d форму." -msgstr[1] "Будь ласка, відправте як мінімум %d форми." -msgstr[2] "Будь ласка, відправте як мінімум %d форм." -msgstr[3] "Будь ласка, відправте як мінімум %d форм." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Order" msgstr "Послідовність" @@ -835,15 +912,7 @@ msgstr "Так" msgid "No" msgstr "Ні" -msgid "Year" -msgstr "Рік" - -msgid "Month" -msgstr "Місяць" - -msgid "Day" -msgstr "День" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "так,ні,можливо" @@ -1119,55 +1188,52 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d рік" -msgstr[1] "%d роки" -msgstr[2] "%d років" -msgstr[3] "%d років" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d рік" +msgstr[1] "%(num)d роки" +msgstr[2] "%(num)d років" +msgstr[3] "%(num)d років" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d місяць" -msgstr[1] "%d місяці" -msgstr[2] "%d місяців" -msgstr[3] "%d місяців" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d місяць" +msgstr[1] "%(num)d місяці" +msgstr[2] "%(num)d місяців" +msgstr[3] "%(num)d місяців" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d тиждень" -msgstr[1] "%d тижні" -msgstr[2] "%d тижнів" -msgstr[3] "%d тижнів" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d тиждень" +msgstr[1] "%(num)d тижні" +msgstr[2] "%(num)d тижнів" +msgstr[3] "%(num)d тижнів" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d день" -msgstr[1] "%d дня" -msgstr[2] "%d днів" -msgstr[3] "%d днів" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d день" +msgstr[1] "%(num)d дні" +msgstr[2] "%(num)d днів" +msgstr[3] "%(num)d днів" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d година" -msgstr[1] "%d години" -msgstr[2] "%d годин" -msgstr[3] "%d годин" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d година" +msgstr[1] "%(num)d години" +msgstr[2] "%(num)d годин" +msgstr[3] "%(num)d годин" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d хвилина" -msgstr[1] "%d хвилини" -msgstr[2] "%d хвилин" -msgstr[3] "%d хвилин" - -msgid "0 minutes" -msgstr "0 хвилин" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d хвилина" +msgstr[1] "%(num)d хвилини" +msgstr[2] "%(num)d хвилин" +msgstr[3] "%(num)d хвилин" msgid "Forbidden" msgstr "Заборонено" @@ -1177,7 +1243,7 @@ msgstr "Помилка перевірки CSRF. Запит відхилений. msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" @@ -1187,13 +1253,17 @@ msgid "" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"Якщо ви налаштували свій браузер таким чином, щоб заборонити йому передавати " +"заголовок «Referer», будь ласка, дозвольте йому відсилати даний заголовок " +"принаймні для даного сайту, або для всіх HTTPS-з'єднань, або для подібних " +"запитів." msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" msgid "" @@ -1270,37 +1340,34 @@ msgstr "\"%(path)s\" не існує" msgid "Index of %(directory)s" msgstr "Вміст директорії %(directory)s" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: веб-фреймворк для перфекціоністів з реченцями." +msgid "The install worked successfully! Congratulations!" +msgstr "Вітаємо, команда install завершилась успішно!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"Нотатки релізу for Django %(version)s" - -msgid "The install worked successfully! Congratulations!" -msgstr "Вітаємо, команда install завершилась успішно!" +"Нотатки релізу for Django %(version)s" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Ви бачите цю сторінку тому що змінна DEBUG встановлена на True у вашому файлі конфігурації і ви не " -"налаштували жодного URL." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG встановлена на True у вашому файлі " +"конфігурації і ви не налаштували жодного URL." msgid "Django Documentation" msgstr "Документація Django" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Статті, довідки та інструкції" msgid "Tutorial: A Polling App" msgstr "Посібник: програма голосування" diff --git a/django/conf/locale/uk/formats.py b/django/conf/locale/uk/formats.py index ca2593beba46..0f28831af5da 100644 --- a/django/conf/locale/uk/formats.py +++ b/django/conf/locale/uk/formats.py @@ -2,34 +2,34 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'd E Y р.' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = 'd E Y р. H:i' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'd F' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = "d E Y р." +TIME_FORMAT = "H:i" +DATETIME_FORMAT = "d E Y р. H:i" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "d F" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d %B %Y', # '25 October 2006' + "%d.%m.%Y", # '25.10.2006' + "%d %B %Y", # '25 October 2006' ] TIME_INPUT_FORMATS = [ - '%H:%M:%S', # '14:30:59' - '%H:%M:%S.%f', # '14:30:59.000200' - '%H:%M', # '14:30' + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d %B %Y %H:%M:%S', # '25 October 2006 14:30:59' - '%d %B %Y %H:%M:%S.%f', # '25 October 2006 14:30:59.000200' - '%d %B %Y %H:%M', # '25 October 2006 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d %B %Y %H:%M:%S", # '25 October 2006 14:30:59' + "%d %B %Y %H:%M:%S.%f", # '25 October 2006 14:30:59.000200' + "%d %B %Y %H:%M", # '25 October 2006 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/uz/LC_MESSAGES/django.mo b/django/conf/locale/uz/LC_MESSAGES/django.mo index 6ef799a55119..b003df83ef1d 100644 Binary files a/django/conf/locale/uz/LC_MESSAGES/django.mo and b/django/conf/locale/uz/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/uz/LC_MESSAGES/django.po b/django/conf/locale/uz/LC_MESSAGES/django.po index f527776035fe..ad57ba91b7a2 100644 --- a/django/conf/locale/uz/LC_MESSAGES/django.po +++ b/django/conf/locale/uz/LC_MESSAGES/django.po @@ -1,16 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Abdulaminkhon Khaydarov , 2020 # Bedilbek Khamidov , 2019 +# Claude Paroz , 2020 +# Shukrullo Turgunov , 2023 # Sukhrobbek Ismatov , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-12 06:31+0000\n" -"Last-Translator: Bedilbek Khamidov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 06:49+0000\n" +"Last-Translator: Shukrullo Turgunov , 2023\n" +"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -23,6 +26,9 @@ msgstr "Afrika tili" msgid "Arabic" msgstr "Arab tili" +msgid "Algerian Arabic" +msgstr "Jazoir arab tili" + msgid "Asturian" msgstr "Asturiya tili" @@ -47,6 +53,9 @@ msgstr "Bosniya tili" msgid "Catalan" msgstr "Katalon tili" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Chex tili" @@ -146,6 +155,9 @@ msgstr "Interlingua tili" msgid "Indonesian" msgstr "Indoneziya tili" +msgid "Igbo" +msgstr "Igbo tili" + msgid "Ido" msgstr "Ido tili" @@ -176,6 +188,9 @@ msgstr "Kannada tili" msgid "Korean" msgstr "Koreys tili" +msgid "Kyrgyz" +msgstr "Qirg'iz tili" + msgid "Luxembourgish" msgstr "Lyuksemburg tili" @@ -197,6 +212,9 @@ msgstr "Mo'g'ul tili" msgid "Marathi" msgstr "Marati tili" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Birma tili" @@ -260,9 +278,15 @@ msgstr "Tamil tili" msgid "Telugu" msgstr "Telugu tili" +msgid "Tajik" +msgstr "Tojik tili" + msgid "Thai" msgstr "Tay tili" +msgid "Turkmen" +msgstr "Turkman tili" + msgid "Turkish" msgstr "Turk tili" @@ -272,6 +296,9 @@ msgstr "Tatar tili" msgid "Udmurt" msgstr "Udmurt tili" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrain tili" @@ -302,6 +329,11 @@ msgstr "Statik fayllar" msgid "Syndication" msgstr "Sindikatsiya" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "Bu sahifa raqami butun son emas" @@ -327,8 +359,8 @@ msgstr "To'g'ri elektron pochta manzilini kiriting." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri \"slug" -"\" ni kiriting." +"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri " +"\"slug\" ni kiriting." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " @@ -365,6 +397,16 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Ushbu qiymat %(limit_value)s dan katta yoki unga teng ekanligini tekshiring." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -429,6 +471,10 @@ msgstr "va" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s bilan %(model_name)s allaqachon mavjud." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r qiymati to'g'ri tanlov emas." @@ -443,8 +489,8 @@ msgstr "Bu maydon bo‘sh bo‘lishi mumkin emas." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "\"%(field_label)s\" %(model_name)s allaqachon mavjud." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -473,6 +519,9 @@ msgstr "Mantiqiy (Rost yoki Yolg'on)" msgid "String (up to %(max_length)s)" msgstr "Birikma uzunligi (%(max_length)s gacha)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Vergul bilan ajratilgan butun sonlar" @@ -555,6 +604,9 @@ msgstr "Butun son" msgid "Big (8 byte) integer" msgstr "Katta (8 bayt) butun son" +msgid "Small integer" +msgstr "Kichik butun son" + msgid "IPv4 address" msgstr "IPv4 manzili" @@ -568,6 +620,9 @@ msgstr "\"%(value)s\" qiymati Yo‘q, To‘g‘ri yoki Noto'g'ri bo'lishi kerak. msgid "Boolean (Either True, False or None)" msgstr "Boolean (To'g'ri, Yolg'on yoki Hech biri)" +msgid "Positive big integer" +msgstr "Musbat katta butun son" + msgid "Positive integer" msgstr "Ijobiy butun son" @@ -578,9 +633,6 @@ msgstr "Musbat kichik butun son" msgid "Slug (up to %(max_length)s)" msgstr "Slug uzunligi (%(max_length)s gacha)" -msgid "Small integer" -msgstr "Kichik butun son" - msgid "Text" msgstr "Matn" @@ -622,6 +674,12 @@ msgstr "Fayl" msgid "Image" msgstr "Rasm" +msgid "A JSON object" +msgstr "JSON ob'ekti" + +msgid "Value must be valid JSON." +msgstr "Qiymat yaroqli JSON bo'lishi kerak." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s %(value)r lari bilan %(model)s namunasi uchun mavjud emas." @@ -712,6 +770,9 @@ msgstr "To'liq qiymatni kiriting." msgid "Enter a valid UUID." msgstr "To'g'ri UUID kiriting." +msgid "Enter a valid JSON." +msgstr "Yaroqli JSONni kiriting." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -720,18 +781,21 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Yashirilgan maydon %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm ma'lumotlari yo'q yoki o'zgartirilgan" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Iltimos, %d ta yoki kamroq forma topshiring." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Iltimos, %d ta yoki ko'proq forma topshiring." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" msgid "Order" msgstr "Buyurtma" @@ -796,17 +860,9 @@ msgstr "Ha" msgid "No" msgstr "Yo'q" -msgid "Year" -msgstr "Yil" - -msgid "Month" -msgstr "Oy" - -msgid "Day" -msgstr "Kun" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "ha, yo'q, ehtimol" +msgstr "ha,yo'q,ehtimol" #, python-format msgid "%(size)d byte" @@ -1077,37 +1133,34 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%dyil" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d yil" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%doy" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)doy" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%dhafta" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d hafta" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%dkun" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d kun" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%dsoat" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d soat" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%dminut" - -msgid "0 minutes" -msgstr "0 daqiqa" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d daqiqa" msgid "Forbidden" msgstr "Taqiqlangan" @@ -1117,15 +1170,10 @@ msgstr "CSRF tekshiruvi amalga oshmadi. So‘rov bekor qilindi." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" -"Siz ushbu xabarni ko'rmoqdasiz, chunki bu HTTPS saytida veb-brauzeringiz " -"tomonidan \"Referer header\" yuborilishi talab qilinadi, ammo hech biri " -"yuborilmadi. Ushbu sarlavha xavfsizlik nuqtai nazaridan, brauzeringizni " -"uchinchi shaxslar tomonidan o'g'irlanmasligini ta'minlash uchun talab " -"qilinadi." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1141,8 +1189,8 @@ msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Agar siz yorlig'idan yoki " "\"Referrer-Policy: no-referer\" sarlavhasidan foydalanayotgan bo'lsangiz, " @@ -1231,8 +1279,8 @@ msgstr "\"%(path)s\" mavjud emas" msgid "Index of %(directory)s" msgstr "%(directory)s indeksi" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: muddati chegaralangan perfektsionistlar uchun veb freymvork." +msgid "The install worked successfully! Congratulations!" +msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" #, python-format msgid "" @@ -1243,20 +1291,17 @@ msgstr "" "com/en/%(version)s/releases/\" target=\"_blank\" rel=\"noopener\"> " "nashrlarni ko'rish" -msgid "The install worked successfully! Congratulations!" -msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Siz ushbu sahifani ko'rmoqdasiz, chunki DEBUG = True ifodasi sizning sozlamalar faylingizda ko'rsatilgan va " -"siz biron bir URL manzilini to'gri sozlamagansiz." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG = True ifodasi sizning sozlamalar faylingizda " +"ko'rsatilgan va siz biron bir URL manzilini to'gri sozlamagansiz." msgid "Django Documentation" msgstr "Django Hujjatlari" diff --git a/django/conf/locale/uz/formats.py b/django/conf/locale/uz/formats.py index 14af096f96d6..2c7ee73a1764 100644 --- a/django/conf/locale/uz/formats.py +++ b/django/conf/locale/uz/formats.py @@ -2,29 +2,29 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'j-E, Y-\y\i\l' -TIME_FORMAT = 'G:i' -DATETIME_FORMAT = r'j-E, Y-\y\i\l G:i' -YEAR_MONTH_FORMAT = r'F Y-\y\i\l' -MONTH_DAY_FORMAT = 'j-E' -SHORT_DATE_FORMAT = 'd.m.Y' -SHORT_DATETIME_FORMAT = 'd.m.Y H:i' +DATE_FORMAT = r"j-E, Y-\y\i\l" +TIME_FORMAT = "G:i" +DATETIME_FORMAT = r"j-E, Y-\y\i\l G:i" +YEAR_MONTH_FORMAT = r"F Y-\y\i\l" +MONTH_DAY_FORMAT = "j-E" +SHORT_DATE_FORMAT = "d.m.Y" +SHORT_DATETIME_FORMAT = "d.m.Y H:i" FIRST_DAY_OF_WEEK = 1 # Monday # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%d.%m.%Y', # '25.10.2006' - '%d-%B, %Y-yil', # '25-Oktabr, 2006-yil' + "%d.%m.%Y", # '25.10.2006' + "%d-%B, %Y-yil", # '25-Oktabr, 2006-yil' ] DATETIME_INPUT_FORMATS = [ - '%d.%m.%Y %H:%M:%S', # '25.10.2006 14:30:59' - '%d.%m.%Y %H:%M:%S.%f', # '25.10.2006 14:30:59.000200' - '%d.%m.%Y %H:%M', # '25.10.2006 14:30' - '%d-%B, %Y-yil %H:%M:%S', # '25-Oktabr, 2006-yil 14:30:59' - '%d-%B, %Y-yil %H:%M:%S.%f', # '25-Oktabr, 2006-yil 14:30:59.000200' - '%d-%B, %Y-yil %H:%M', # '25-Oktabr, 2006-yil 14:30' + "%d.%m.%Y %H:%M:%S", # '25.10.2006 14:30:59' + "%d.%m.%Y %H:%M:%S.%f", # '25.10.2006 14:30:59.000200' + "%d.%m.%Y %H:%M", # '25.10.2006 14:30' + "%d-%B, %Y-yil %H:%M:%S", # '25-Oktabr, 2006-yil 14:30:59' + "%d-%B, %Y-yil %H:%M:%S.%f", # '25-Oktabr, 2006-yil 14:30:59.000200' + "%d-%B, %Y-yil %H:%M", # '25-Oktabr, 2006-yil 14:30' ] -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '\xa0' # non-breaking space +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "\xa0" # non-breaking space NUMBER_GROUPING = 3 diff --git a/django/conf/locale/vi/LC_MESSAGES/django.mo b/django/conf/locale/vi/LC_MESSAGES/django.mo index a849ea4446ca..43a2a61928d7 100644 Binary files a/django/conf/locale/vi/LC_MESSAGES/django.mo and b/django/conf/locale/vi/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/vi/LC_MESSAGES/django.po b/django/conf/locale/vi/LC_MESSAGES/django.po index d2a1a0fb0a52..a0e6eb43f39f 100644 --- a/django/conf/locale/vi/LC_MESSAGES/django.po +++ b/django/conf/locale/vi/LC_MESSAGES/django.po @@ -1,6 +1,7 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 # Jannis Leidel , 2011 # Anh Phan , 2013 # Thanh Le Viet , 2013 @@ -12,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2020-05-19 20:23+0200\n" +"PO-Revision-Date: 2020-07-14 21:42+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" "vi/)\n" "MIME-Version: 1.0\n" @@ -29,6 +30,9 @@ msgstr "Afrikaans" msgid "Arabic" msgstr "Tiếng Ả Rập" +msgid "Algerian Arabic" +msgstr "" + msgid "Asturian" msgstr "Asturian" @@ -152,6 +156,9 @@ msgstr "Tiếng Khoa học Quốc tế" msgid "Indonesian" msgstr "Tiếng In-đô-nê-xi-a" +msgid "Igbo" +msgstr "" + msgid "Ido" msgstr "Ido" @@ -182,6 +189,9 @@ msgstr "Tiếng Kannada" msgid "Korean" msgstr "Tiếng Hàn Quốc" +msgid "Kyrgyz" +msgstr "" + msgid "Luxembourgish" msgstr "Tiếng Luxembourg" @@ -266,9 +276,15 @@ msgstr "Tiếng Ta-min" msgid "Telugu" msgstr "Telugu" +msgid "Tajik" +msgstr "" + msgid "Thai" msgstr "Tiếng Thái" +msgid "Turkmen" +msgstr "" + msgid "Turkish" msgstr "Tiếng Thổ Nhĩ Kỳ" @@ -546,6 +562,9 @@ msgstr "" msgid "Boolean (Either True, False or None)" msgstr "Luận lý (Có thể Đúng, Sai hoặc Không cái nào đúng)" +msgid "Positive big integer" +msgstr "" + msgid "Positive integer" msgstr "Số nguyên dương" @@ -596,6 +615,12 @@ msgstr "File" msgid "Image" msgstr "Image" +msgid "A JSON object" +msgstr "" + +msgid "Value must be valid JSON." +msgstr "" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "" @@ -685,6 +710,9 @@ msgstr "" msgid "Enter a valid UUID." msgstr "" +msgid "Enter a valid JSON." +msgstr "" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -767,17 +795,9 @@ msgstr "Có" msgid "No" msgstr "Không" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" -msgstr "Có, Không, Có thể" +msgstr "Có,Không,Có thể" #, python-format msgid "%(size)d byte" @@ -1077,9 +1097,6 @@ msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d phút" -msgid "0 minutes" -msgstr "0 phút" - msgid "Forbidden" msgstr "" diff --git a/django/conf/locale/vi/formats.py b/django/conf/locale/vi/formats.py index 495b6f7993d1..7b7602044ae0 100644 --- a/django/conf/locale/vi/formats.py +++ b/django/conf/locale/vi/formats.py @@ -2,13 +2,13 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = r'\N\gà\y d \t\há\n\g n \nă\m Y' -TIME_FORMAT = 'H:i' -DATETIME_FORMAT = r'H:i \N\gà\y d \t\há\n\g n \nă\m Y' -YEAR_MONTH_FORMAT = 'F Y' -MONTH_DAY_FORMAT = 'j F' -SHORT_DATE_FORMAT = 'd-m-Y' -SHORT_DATETIME_FORMAT = 'H:i d-m-Y' +DATE_FORMAT = r"\N\gà\y d \t\há\n\g n \nă\m Y" +TIME_FORMAT = "H:i" +DATETIME_FORMAT = r"H:i \N\gà\y d \t\há\n\g n \nă\m Y" +YEAR_MONTH_FORMAT = "F Y" +MONTH_DAY_FORMAT = "j F" +SHORT_DATE_FORMAT = "d-m-Y" +SHORT_DATETIME_FORMAT = "H:i d-m-Y" # FIRST_DAY_OF_WEEK = # The *_INPUT_FORMATS strings use the Python strftime format syntax, @@ -16,6 +16,6 @@ # DATE_INPUT_FORMATS = # TIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS = -DECIMAL_SEPARATOR = ',' -THOUSAND_SEPARATOR = '.' +DECIMAL_SEPARATOR = "," +THOUSAND_SEPARATOR = "." # NUMBER_GROUPING = diff --git a/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo b/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo index 77ea0d7a94c1..c68035c84dd3 100644 Binary files a/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo and b/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/zh_Hans/LC_MESSAGES/django.po b/django/conf/locale/zh_Hans/LC_MESSAGES/django.po index 6cfabd650535..012741fb5af3 100644 --- a/django/conf/locale/zh_Hans/LC_MESSAGES/django.po +++ b/django/conf/locale/zh_Hans/LC_MESSAGES/django.po @@ -1,38 +1,51 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Bai HuanCheng , 2017-2018 +# HuanCheng Bai白宦成(Bestony) , 2017-2018 +# lanbla , 2021 # Daniel Duan , 2013 +# Fan Xu , 2022 +# Ford Guo , 2022 +# Huanqun Yang, 2022 +# jack yang, 2023 # jamin M , 2019 # Jannis Leidel , 2011 # Kevin Sze , 2012 # Lele Long , 2011,2015,2017 # Le Yang , 2018 +# li beite , 2020 # Liping Wang , 2016-2017 +# L., 2024 +# matthew Yip , 2020 # mozillazg , 2016 # Ronald White , 2014 -# pylemon , 2013 +# Lemon Li , 2013 # Ray Wang , 2017 # slene , 2011 # Sun Liwen , 2014 # Suntravel Chris , 2019 +# Veoco , 2021 # Liping Wang , 2016 # Wentao Han , 2018 +# wolf ice , 2020 # Xiang Yu , 2014 # Jeff Yin , 2013 # Zhengyang Wang , 2017 # ced773123cfad7b4e8b79ca80f736af9, 2011-2012 # Ziya Tang , 2018 # 付峥 , 2018 +# L., 2024 +# LatteFang <370358679@qq.com>, 2020 # Kevin Sze , 2012 +# 高乐喆 , 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 06:49+0000\n" +"Last-Translator: L., 2024\n" +"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -46,6 +59,9 @@ msgstr "南非荷兰语" msgid "Arabic" msgstr "阿拉伯语" +msgid "Algerian Arabic" +msgstr "阿尔及利亚的阿拉伯语" + msgid "Asturian" msgstr "阿斯图里亚斯" @@ -70,6 +86,9 @@ msgstr "波斯尼亚语" msgid "Catalan" msgstr "加泰罗尼亚语" +msgid "Central Kurdish (Sorani)" +msgstr "中部库尔德语(Sorani)" + msgid "Czech" msgstr "捷克语" @@ -169,6 +188,9 @@ msgstr "国际语" msgid "Indonesian" msgstr "印尼语" +msgid "Igbo" +msgstr "伊博" + msgid "Ido" msgstr "简化伊多语" @@ -199,6 +221,9 @@ msgstr "埃纳德语" msgid "Korean" msgstr "韩语" +msgid "Kyrgyz" +msgstr "吉尔吉斯坦语" + msgid "Luxembourgish" msgstr "卢森堡语" @@ -220,6 +245,9 @@ msgstr "蒙古语" msgid "Marathi" msgstr "马拉地语" +msgid "Malay" +msgstr "马来语" + msgid "Burmese" msgstr "缅甸语" @@ -283,9 +311,15 @@ msgstr "泰米尔语" msgid "Telugu" msgstr "泰卢固语" +msgid "Tajik" +msgstr "塔吉克语" + msgid "Thai" msgstr "泰语" +msgid "Turkmen" +msgstr "土库曼人" + msgid "Turkish" msgstr "土耳其语" @@ -295,6 +329,9 @@ msgstr "鞑靼语" msgid "Udmurt" msgstr "乌德穆尔特语" +msgid "Uyghur" +msgstr "维吾尔语" + msgid "Ukrainian" msgstr "乌克兰语" @@ -302,7 +339,7 @@ msgid "Urdu" msgstr "乌尔都语" msgid "Uzbek" -msgstr "" +msgstr "乌兹别克语" msgid "Vietnamese" msgstr "越南语" @@ -325,6 +362,11 @@ msgstr "静态文件" msgid "Syndication" msgstr "联合" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "页码不是整数" @@ -337,6 +379,9 @@ msgstr "本页结果为空" msgid "Enter a valid value." msgstr "输入一个有效的值。" +msgid "Enter a valid domain name." +msgstr "输入一个有效的域名。" + msgid "Enter a valid URL." msgstr "输入一个有效的 URL。" @@ -349,21 +394,25 @@ msgstr "输入一个有效的 Email 地址。" #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" +msgstr "输入由字母,数字,下划线或连字符号组成的有效“字段”。" msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." -msgstr "" +msgstr "输入由Unicode字母,数字,下划线或连字符号组成的有效“字段”。" -msgid "Enter a valid IPv4 address." -msgstr "输入一个有效的 IPv4 地址。" +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "输入一个有效的 %(protocol)s 地址。" -msgid "Enter a valid IPv6 address." -msgstr "输入一个有效的 IPv6 地址。" +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "输入一个有效的 IPv4 或 IPv6 地址." +msgid "IPv6" +msgstr "IPv6" + +msgid "IPv4 or IPv6" +msgstr "IPv4 或 IPv6" msgid "Enter only digits separated by commas." msgstr "只能输入用逗号分隔的数字。" @@ -380,6 +429,18 @@ msgstr "确保该值小于或等于%(limit_value)s。" msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "确保该值大于或等于%(limit_value)s。" +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "确保该值是步长的倍数%(limit_value)s" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"确保此值是步长 %(limit_value)s 的倍数,从 %(offset)s 开始,例如 " +"%(offset)s、%(valid_value1)s、%(valid_value2)s 等等。" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -425,6 +486,7 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"文件扩展“%(extension)s”是不被允许。允许的扩展为:%(allowed_extensions)s。" msgid "Null characters are not allowed." msgstr "不允许是用空字符串。" @@ -436,6 +498,10 @@ msgstr "和" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "包含 %(field_labels)s 的 %(model_name)s 已经存在。" +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "约束 “%(name)s” 是无效的" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "值 %(value)r 不是有效选项。" @@ -450,8 +516,8 @@ msgstr "此字段不能为空。" msgid "%(model_name)s with this %(field_label)s already exists." msgstr "具有 %(field_label)s 的 %(model_name)s 已存在。" -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -465,11 +531,11 @@ msgstr "字段类型:%(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s”的值应该为True或False" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s”的值应该为True,False或None" msgid "Boolean (Either True or False)" msgstr "布尔值( True或False )" @@ -478,6 +544,9 @@ msgstr "布尔值( True或False )" msgid "String (up to %(max_length)s)" msgstr "字符串(最长 %(max_length)s 位)" +msgid "String (unlimited)" +msgstr "字符串(无限)" + msgid "Comma-separated integers" msgstr "逗号分隔的整数" @@ -485,13 +554,13 @@ msgstr "逗号分隔的整数" msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." -msgstr "" +msgstr "“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "“%(value)s”的值有正确的格式(YYYY-MM-DD)但它是一个错误的日期" msgid "Date (without time)" msgstr "日期(不带时分)" @@ -501,19 +570,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s”的值有一个错误的日期格式。它的格式应该是YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] " #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s”的值有正确的格式 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但它是一个错" +"误的日期/时间" msgid "Date (with time)" msgstr "日期(带时分)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s”的值应该是一个十进制数字。" msgid "Decimal number" msgstr "小数" @@ -523,6 +596,7 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s”的值有一个错误的格式。它的格式应该是[DD] [[HH:]MM:]ss[.uuuuuu] " msgid "Duration" msgstr "时长" @@ -535,14 +609,14 @@ msgstr "文件路径" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s”的值应该是一个浮点数" msgid "Floating point number" msgstr "浮点数" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s”的值应该是一个整型" msgid "Integer" msgstr "整数" @@ -550,6 +624,9 @@ msgstr "整数" msgid "Big (8 byte) integer" msgstr "大整数(8字节)" +msgid "Small integer" +msgstr "小整数" + msgid "IPv4 address" msgstr "IPv4 地址" @@ -558,11 +635,14 @@ msgstr "IP 地址" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s”的值应该是None、True或False" msgid "Boolean (Either True, False or None)" msgstr "布尔值(True、False或None)" +msgid "Positive big integer" +msgstr "正大整数" + msgid "Positive integer" msgstr "正整数" @@ -573,9 +653,6 @@ msgstr "正小整数" msgid "Slug (up to %(max_length)s)" msgstr "Slug (多达 %(max_length)s)" -msgid "Small integer" -msgstr "小整数" - msgid "Text" msgstr "文本" @@ -583,13 +660,13 @@ msgstr "文本" msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." -msgstr "" +msgstr "“%(value)s”的值有一个错误的格式。它的格式应该是HH:MM[:ss[.uuuuuu]]" #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." -msgstr "" +msgstr "“%(value)s”的值有正确的格式(HH:MM[:ss[.uuuuuu]]),但它是一个错误的时间" msgid "Time" msgstr "时间" @@ -602,7 +679,7 @@ msgstr "原始二进制数据" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s”不是一个有效的UUID" msgid "Universally unique identifier" msgstr "通用唯一识别码" @@ -613,6 +690,12 @@ msgstr "文件" msgid "Image" msgstr "图像" +msgid "A JSON object" +msgstr "一个JSON对象" + +msgid "Value must be valid JSON." +msgstr "值必须是有效的JSON。" + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "包含%(field)s %(value)r的%(model)s实例不存在。" @@ -698,6 +781,9 @@ msgstr "请输入完整的值。" msgid "Enter a valid UUID." msgstr "请输入有效UUID。" +msgid "Enter a valid JSON." +msgstr "输入一个有效的JSON。" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -706,18 +792,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(隐藏字段 %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "管理表单的数据缺失或者已被篡改" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm 数据缺失或被篡改。缺少的字段: %(field_names)s。如果问题持续存" +"在,你可能需要提交错误报告。" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "请提交不超过 %d 个表格。" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "请最多提交 %(num)d 个表单。" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "请至少提交 %d 个表单。" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "请至少提交 %(num)d 个表单。" msgid "Order" msgstr "排序" @@ -752,13 +843,15 @@ msgstr "选择一个有效的选项: 该选择不在可用的选项中。" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s”不是一个有效的值" #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s无法在时区%(current_timezone)s被解析;它可能是模糊的,也可能是不" +"存在的。" msgid "Clear" msgstr "清除" @@ -778,15 +871,7 @@ msgstr "是" msgid "No" msgstr "否" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "是、否、也许" @@ -1049,7 +1134,7 @@ msgstr "该值不是合法的IPv6地址。" #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "%(truncated_text)s" +msgstr "%(truncated_text)s..." msgid "or" msgstr "或" @@ -1059,37 +1144,34 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d 年" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d 年" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d 月" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d 月" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d 周" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d 周" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d 日" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d 日" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d 小时" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d 小时" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d 分钟" - -msgid "0 minutes" -msgstr "0 分钟" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d 分钟" msgid "Forbidden" msgstr "禁止访问" @@ -1099,24 +1181,32 @@ msgstr "CSRF验证失败. 请求被中断." msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"您看到此消息是由于HTTPS站点需要您的浏览器发送 'Referer header',但是该信息并" +"未被发送。出于安全原因,此HTTP头是必需的,以确保您的浏览器不会被第三方劫持。" msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"如果您已将浏览器配置为禁用“ Referer”头,请重新启用它们,至少针对此站点,或" +"HTTPS连接或“同源”请求。" msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"如果您使用的是标签或包" +"含“Referrer-Policy: no-referrer”的HTTP头,请将其删除。CSRF保护要求“Referer”头" +"执行严格的Referer检查。如果你担心隐私问题,可以使用类似这样的替代方法链接到第三方网站。" msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1130,6 +1220,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"如果您已将浏览器配置为禁用cookie,请重新启用它们,至少针对此站点或“同源”请" +"求。" msgid "More information is available with DEBUG=True." msgstr "更多可用信息请设置选项DEBUG=True。" @@ -1163,14 +1255,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "日期字符串“%(datestr)s”与格式“%(format)s”不匹配" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "没有找到符合查询的 %(verbose_name)s" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "页面不是最后一页,也不能被转为整数型" #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1178,21 +1270,23 @@ msgstr "非法页面 (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "列表是空的并且“%(class_name)s.allow_empty”是False" msgid "Directory indexes are not allowed here." msgstr "这里不允许目录索引" #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "”%(path)s\"不存在" #, python-format msgid "Index of %(directory)s" msgstr "%(directory)s的索引" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django:按时交付完美主义者的 Web 框架" +msgid "The install worked successfully! Congratulations!" +msgstr "" +"安装成功!\n" +"祝贺!" #, python-format msgid "" @@ -1202,27 +1296,22 @@ msgstr "" "查看 Django %(version)s 的 release notes " -msgid "The install worked successfully! Congratulations!" -msgstr "" -"安装成功!\n" -"祝贺!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "您现在看见这个页面,因为您设置了 DEBUG=True 并且您还没有配置任何URLs。" +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True 并且您还没有配置任何URLs。" msgid "Django Documentation" msgstr "Django 文档" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "主题,参考资料和操作方法" msgid "Tutorial: A Polling App" msgstr "教程:投票应用" diff --git a/django/conf/locale/zh_Hans/formats.py b/django/conf/locale/zh_Hans/formats.py index 018b9b17f449..79936f8a343f 100644 --- a/django/conf/locale/zh_Hans/formats.py +++ b/django/conf/locale/zh_Hans/formats.py @@ -2,41 +2,41 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'Y年n月j日' # 2016年9月5日 -TIME_FORMAT = 'H:i' # 20:45 -DATETIME_FORMAT = 'Y年n月j日 H:i' # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = 'Y年n月' # 2016年9月 -MONTH_DAY_FORMAT = 'm月j日' # 9月5日 -SHORT_DATE_FORMAT = 'Y年n月j日' # 2016年9月5日 -SHORT_DATETIME_FORMAT = 'Y年n月j日 H:i' # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) +DATE_FORMAT = "Y年n月j日" # 2016年9月5日 +TIME_FORMAT = "H:i" # 20:45 +DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 +YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 +MONTH_DAY_FORMAT = "m月j日" # 9月5日 +SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 +SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 +FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%Y/%m/%d', # '2016/09/05' - '%Y-%m-%d', # '2016-09-05' - '%Y年%n月%j日', # '2016年9月5日' + "%Y/%m/%d", # '2016/09/05' + "%Y-%m-%d", # '2016-09-05' + "%Y年%n月%j日", # '2016年9月5日' ] TIME_INPUT_FORMATS = [ - '%H:%M', # '20:45' - '%H:%M:%S', # '20:45:29' - '%H:%M:%S.%f', # '20:45:29.000200' + "%H:%M", # '20:45' + "%H:%M:%S", # '20:45:29' + "%H:%M:%S.%f", # '20:45:29.000200' ] DATETIME_INPUT_FORMATS = [ - '%Y/%m/%d %H:%M', # '2016/09/05 20:45' - '%Y-%m-%d %H:%M', # '2016-09-05 20:45' - '%Y年%n月%j日 %H:%M', # '2016年9月5日 14:45' - '%Y/%m/%d %H:%M:%S', # '2016/09/05 20:45:29' - '%Y-%m-%d %H:%M:%S', # '2016-09-05 20:45:29' - '%Y年%n月%j日 %H:%M:%S', # '2016年9月5日 20:45:29' - '%Y/%m/%d %H:%M:%S.%f', # '2016/09/05 20:45:29.000200' - '%Y-%m-%d %H:%M:%S.%f', # '2016-09-05 20:45:29.000200' - '%Y年%n月%j日 %H:%n:%S.%f', # '2016年9月5日 20:45:29.000200' + "%Y/%m/%d %H:%M", # '2016/09/05 20:45' + "%Y-%m-%d %H:%M", # '2016-09-05 20:45' + "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' + "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' + "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' + "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' + "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' + "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' + "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = '' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "" NUMBER_GROUPING = 4 diff --git a/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo b/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo index b6726c558528..c9be56e3c503 100644 Binary files a/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo and b/django/conf/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/zh_Hant/LC_MESSAGES/django.po b/django/conf/locale/zh_Hant/LC_MESSAGES/django.po index 61d827a15b76..1671ebd942bf 100644 --- a/django/conf/locale/zh_Hant/LC_MESSAGES/django.po +++ b/django/conf/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,23 +2,26 @@ # # Translators: # Chen Chun-Chia , 2015 +# yubike, 2024 # Eric Ho , 2013 # ilay , 2012 # Jannis Leidel , 2011 # mail6543210 , 2013 -# ming hsien tzang , 2011 +# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 # tcc , 2011 # Tzu-ping Chung , 2016-2017 +# YAO WEN LIANG, 2024 # Yeh-Yung , 2013 +# yubike, 2024 # Yeh-Yung , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 00:38+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 06:49+0000\n" +"Last-Translator: YAO WEN LIANG, 2024\n" +"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" "language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -32,6 +35,9 @@ msgstr "南非語" msgid "Arabic" msgstr "阿拉伯語" +msgid "Algerian Arabic" +msgstr "阿爾及利亞式阿拉伯語" + msgid "Asturian" msgstr "阿斯圖里亞斯語" @@ -56,6 +62,9 @@ msgstr "波士尼亞語" msgid "Catalan" msgstr "加泰隆語" +msgid "Central Kurdish (Sorani)" +msgstr "中部庫爾德語 (Sorani)" + msgid "Czech" msgstr "捷克語" @@ -147,7 +156,7 @@ msgid "Hungarian" msgstr "匈牙利語" msgid "Armenian" -msgstr "" +msgstr "亞美尼亞語" msgid "Interlingua" msgstr "國際語" @@ -155,6 +164,9 @@ msgstr "國際語" msgid "Indonesian" msgstr "印尼語" +msgid "Igbo" +msgstr "伊博語" + msgid "Ido" msgstr "伊多語" @@ -185,6 +197,9 @@ msgstr "康納達語" msgid "Korean" msgstr "韓語" +msgid "Kyrgyz" +msgstr "吉爾吉斯語" + msgid "Luxembourgish" msgstr "盧森堡語" @@ -206,6 +221,9 @@ msgstr "蒙古語" msgid "Marathi" msgstr "馬拉提語" +msgid "Malay" +msgstr "馬來語" + msgid "Burmese" msgstr "緬甸語" @@ -269,9 +287,15 @@ msgstr "坦米爾語" msgid "Telugu" msgstr "泰盧固語" +msgid "Tajik" +msgstr "塔吉克語" + msgid "Thai" msgstr "泰語" +msgid "Turkmen" +msgstr "土庫曼語" + msgid "Turkish" msgstr "土耳其語" @@ -281,6 +305,9 @@ msgstr "韃靼語" msgid "Udmurt" msgstr "烏德穆爾特語" +msgid "Uyghur" +msgstr "維吾爾語" + msgid "Ukrainian" msgstr "烏克蘭語" @@ -288,7 +315,7 @@ msgid "Urdu" msgstr "烏爾都語" msgid "Uzbek" -msgstr "" +msgstr "烏茲別克語" msgid "Vietnamese" msgstr "越南語" @@ -311,6 +338,11 @@ msgstr "靜態文件" msgid "Syndication" msgstr "聯播" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "該頁碼並非整數" @@ -323,6 +355,9 @@ msgstr "該頁未包含任何內容" msgid "Enter a valid value." msgstr "請輸入有效的值。" +msgid "Enter a valid domain name." +msgstr "輸入有效的網域名稱。" + msgid "Enter a valid URL." msgstr "請輸入有效的 URL。" @@ -335,21 +370,25 @@ msgstr "請輸入有效的電子郵件地址。" #. Translators: "letters" means latin letters: a-z and A-Z. msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -msgstr "" +msgstr "輸入合適的 \"slug\" 字串,由字母、數字、底線與連字號組成。" msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." -msgstr "" +msgstr "輸入合適的 \"slug\" 字串,內含 Unicode 字元、數字、底線或減號。" -msgid "Enter a valid IPv4 address." -msgstr "請輸入有效的 IPv4 位址。" +#, python-format +msgid "Enter a valid %(protocol)s address." +msgstr "輸入正確的 %(protocol)s 位址。." + +msgid "IPv4" +msgstr "IPv4" -msgid "Enter a valid IPv6 address." -msgstr "請輸入有效的 IPv6 位址。" +msgid "IPv6" +msgstr "IPv6" -msgid "Enter a valid IPv4 or IPv6 address." -msgstr "請輸入有效的 IPv4 或 IPv6 位址。" +msgid "IPv4 or IPv6" +msgstr "IPv4 或 IPv6" msgid "Enter only digits separated by commas." msgstr "請輸入以逗號分隔的數字。" @@ -366,6 +405,18 @@ msgstr "請確認此數值是否小於或等於 %(limit_value)s。" msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "請確認此數值是否大於或等於 %(limit_value)s。" +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "請確認此數值是 %(limit_value)s 的倍數。" + +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" +"請確認此數值是 %(limit_value)s的倍數。從 %(offset)s 起始,例如 %(offset)s, " +"%(valid_value1)s, %(valid_value2)s,以此類推。" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -397,20 +448,20 @@ msgstr[0] "請確認數字全長不超過 %(max)s 位。" #, python-format msgid "Ensure that there are no more than %(max)s decimal place." msgid_plural "Ensure that there are no more than %(max)s decimal places." -msgstr[0] "請確認十進位數字不多於 %(max)s 位。" +msgstr[0] "確認小數不超過 %(max)s 位。" #, python-format msgid "" "Ensure that there are no more than %(max)s digit before the decimal point." msgid_plural "" "Ensure that there are no more than %(max)s digits before the decimal point." -msgstr[0] "請確認小數點前不多於 %(max)s 位。" +msgstr[0] "請確認小數點前不超過 %(max)s 位。" #, python-format msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." -msgstr "" +msgstr "不允許副檔名為 “%(extension)s” 。可用的像是: %(allowed_extensions)s。" msgid "Null characters are not allowed." msgstr "不允許空(null)字元。" @@ -420,24 +471,28 @@ msgstr "和" #, python-format msgid "%(model_name)s with this %(field_labels)s already exists." -msgstr "這個 %(field_labels)s 在 %(model_name)s 已經存在。" +msgstr "包含 %(field_labels)s 的 %(model_name)s 已經存在。" + +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "約束條件 “%(name)s” 被違反。" #, python-format msgid "Value %(value)r is not a valid choice." -msgstr "數值 %(value)r 不是有效的選擇。" +msgstr "數值 %(value)r 不是有效的選項。" msgid "This field cannot be null." msgstr "這個值不能是 null。" msgid "This field cannot be blank." -msgstr "這個欄位不能留白。" +msgstr "這個欄位不能為空。" #, python-format msgid "%(model_name)s with this %(field_label)s already exists." -msgstr "這個 %(field_label)s 在 %(model_name)s 已經存在。" +msgstr "包含 %(field_label)s 的 %(model_name)s 已經存在。" -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -445,15 +500,15 @@ msgstr "%(field_label)s 在 %(date_field_label)s %(lookup_type)s 上必須唯一 #, python-format msgid "Field of type: %(field_type)s" -msgstr "欄位型態: %(field_type)s" +msgstr "欄位類型: %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "“%(value)s” 只能是 True 或 False。" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” 只能是 True 或 False 或 None 。" msgid "Boolean (Either True or False)" msgstr "布林值 (True 或 False)" @@ -462,6 +517,9 @@ msgstr "布林值 (True 或 False)" msgid "String (up to %(max_length)s)" msgstr "字串 (至多 %(max_length)s 個字)" +msgid "String (unlimited)" +msgstr "字串 (無限)" + msgid "Comma-separated integers" msgstr "逗號分隔的整數" @@ -469,13 +527,13 @@ msgstr "逗號分隔的整數" msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." -msgstr "" +msgstr "“%(value)s” 的日期格式錯誤。應該是 YYYY-MM-DD 才對。" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." -msgstr "" +msgstr "“%(value)s” 的格式正確 (YYYY-MM-DD) 但日期有誤。" msgid "Date (without time)" msgstr "日期 (不包括時間)" @@ -485,19 +543,21 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” 的格式錯誤。應該是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 才對。" #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" "[TZ]) but it is an invalid date/time." msgstr "" +"“%(value)s” 的格式正確 (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) 但日期/時間有誤。" msgid "Date (with time)" msgstr "日期 (包括時間)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” 必須是十進位數。" msgid "Decimal number" msgstr "十進位數" @@ -506,10 +566,10 @@ msgstr "十進位數" msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." -msgstr "" +msgstr "“%(value)s” 的格式錯誤。格式必須為 [DD] [[HH:]MM:]ss[.uuuuuu] 。" msgid "Duration" -msgstr "時間長" +msgstr "時長" msgid "Email address" msgstr "電子郵件地址" @@ -519,20 +579,23 @@ msgstr "檔案路徑" #, python-format msgid "“%(value)s” value must be a float." -msgstr "" +msgstr "“%(value)s” 必須是浮點小數。" msgid "Floating point number" msgstr "浮點數" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” 必須是整數。" msgid "Integer" msgstr "整數" msgid "Big (8 byte) integer" -msgstr "大整數 (8 位元組)" +msgstr "大整數 (8位元組)" + +msgid "Small integer" +msgstr "小整數" msgid "IPv4 address" msgstr "IPv4 地址" @@ -542,11 +605,14 @@ msgstr "IP 位址" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "“%(value)s” 必須是 None, True 或 False。" msgid "Boolean (Either True, False or None)" msgstr "布林值 (True, False 或 None)" +msgid "Positive big integer" +msgstr "大的正整數" + msgid "Positive integer" msgstr "正整數" @@ -555,10 +621,7 @@ msgstr "正小整數" #, python-format msgid "Slug (up to %(max_length)s)" -msgstr "可讀網址 (長度最多 %(max_length)s)" - -msgid "Small integer" -msgstr "小整數" +msgstr "Slug (最多 %(max_length)s個字)" msgid "Text" msgstr "文字" @@ -567,42 +630,48 @@ msgstr "文字" msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." -msgstr "" +msgstr "“%(value)s” 格式錯誤。格式必須為 HH:MM[:ss[.uuuuuu]] 。" #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." -msgstr "" +msgstr "“%(value)s” 的格式正確 (HH:MM[:ss[.uuuuuu]]),但時間有誤。" msgid "Time" msgstr "時間" msgid "URL" -msgstr "URL" +msgstr "網址" msgid "Raw binary data" msgstr "原始二進制數據" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” 不是有效的 UUID。" msgid "Universally unique identifier" -msgstr "" +msgstr "通用唯一識別碼" msgid "File" msgstr "檔案" msgid "Image" -msgstr "影像" +msgstr "圖像" + +msgid "A JSON object" +msgstr "JSON 物件" + +msgid "Value must be valid JSON." +msgstr "必須是有效的 JSON 值" #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s 為 %(value)r 的 %(model)s 物件不存在。" msgid "Foreign Key (type determined by related field)" -msgstr "外鍵 (型態由關連欄位決定)" +msgstr "外鍵(類型由相關欄位決定)" msgid "One-to-one relationship" msgstr "一對一關連" @@ -644,7 +713,7 @@ msgstr "輸入有效的時間長。" #, python-brace-format msgid "The number of days must be between {min_days} and {max_days}." -msgstr "" +msgstr "天數必須介於 {min_days} 到 {max_days} 天" msgid "No file was submitted. Check the encoding type on the form." msgstr "沒有檔案被送出。請檢查表單的編碼類型。" @@ -662,16 +731,16 @@ msgid_plural "" msgstr[0] "請確認這個檔名至多包含 %(max)d 個字 (目前為 %(length)d)。" msgid "Please either submit a file or check the clear checkbox, not both." -msgstr "請提交一個檔案或確認清除核可項, 不能兩者都做。" +msgstr "請提交一個檔案或勾選清除選項,但不能同時進行。" msgid "" "Upload a valid image. The file you uploaded was either not an image or a " "corrupted image." -msgstr "上傳一個有效的圖檔。你上傳的檔案為非圖片,不然就是損壞的圖檔。" +msgstr "請上傳一個有效的圖檔。你上傳的檔案不是圖片或是已損壞的圖檔。" #, python-format msgid "Select a valid choice. %(value)s is not one of the available choices." -msgstr "請選擇有效的項目, %(value)s 不是一個可用的選擇。" +msgstr "請選擇有效的選項, %(value)s 不是一個可用的選項。" msgid "Enter a list of values." msgstr "請輸入一個列表的值。" @@ -682,6 +751,9 @@ msgstr "請輸入完整的值。" msgid "Enter a valid UUID." msgstr "請輸入有效的 UUID。" +msgid "Enter a valid JSON." +msgstr "輸入有效的 JSON。" + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -690,18 +762,23 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(隱藏欄位 %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm 資料缺失或遭竄改" +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" +"ManagementForm 資料遺失或被篡改。缺少欄位:%(field_names)s。如果問題持續存" +"在,您可能需要提交錯誤報告。" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "請送出不多於 %d 個表單。" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "請送出最多 %(num)d 個表單。" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "請送出多於 %d 個表單。" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "請送出最少 %(num)d 個表單。" msgid "Order" msgstr "排序" @@ -735,13 +812,15 @@ msgstr "選擇有效的選項: 此選擇不在可用的選項中。" #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” 不是一個有效的值。" #, python-format msgid "" "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " "may be ambiguous or it may not exist." msgstr "" +"%(datetime)s 無法被轉換成 %(current_timezone)s時區格式; 可能內容有誤或不存" +"在。" msgid "Clear" msgstr "清除" @@ -761,15 +840,7 @@ msgstr "是" msgid "No" msgstr "否" -msgid "Year" -msgstr "" - -msgid "Month" -msgstr "" - -msgid "Day" -msgstr "" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "是、否、也許" @@ -1032,7 +1103,7 @@ msgstr "這是無效的 IPv6 位址。" #, python-format msgctxt "String to return when truncating text" msgid "%(truncated_text)s…" -msgstr "" +msgstr "%(truncated_text)s…" msgid "or" msgstr "或" @@ -1042,37 +1113,34 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d 年" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d 年" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d 月" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d 月" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d 週" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d 週" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d 日" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d 日" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d 時" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d 小時" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d 分" - -msgid "0 minutes" -msgstr "0 分" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d 分" msgid "Forbidden" msgstr "禁止" @@ -1082,24 +1150,32 @@ msgstr "CSRF 驗證失敗。已中止請求。" msgid "" "You are seeing this message because this HTTPS site requires a “Referer " -"header” to be sent by your Web browser, but none was sent. This header is " +"header” to be sent by your web browser, but none was sent. This header is " "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"您看到此消息是因為這個 HTTPS 網站要求您的網路瀏覽器發送一個“Referer header”," +"但並沒有被發送。出於安全原因,需要此標頭來確保您的瀏覽器沒有被第三方劫持。" msgid "" "If you have configured your browser to disable “Referer” headers, please re-" "enable them, at least for this site, or for HTTPS connections, or for “same-" "origin” requests." msgstr "" +"若您的瀏覽器設定為將「Referer」標頭關閉,請重新為這個網站、HTTPS 連線、或" +"「same-origin」請求啟用它。" msgid "" "If you are using the tag or " "including the “Referrer-Policy: no-referrer” header, please remove them. The " "CSRF protection requires the “Referer” header to do strict referer checking. " -"If you’re concerned about privacy, use alternatives like for links to third-party sites." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"若您使用 標籤或包含" +"「Referrer-Policy: no-referrer」標頭,請將其移除。 CSRF 保護要求「Referer」標" +"頭進行嚴格參照檢查。若你擔心隱私問題,可使用如 來連" +"結到第三方網站。" msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1113,6 +1189,8 @@ msgid "" "If you have configured your browser to disable cookies, please re-enable " "them, at least for this site, or for “same-origin” requests." msgstr "" +"若你的瀏覽器設定為將 cookie 關閉,請重新為這個網站或「same-origin」請求啟用" +"它。" msgid "More information is available with DEBUG=True." msgstr "設定 DEBUG=True 以獲得更多資訊。" @@ -1124,13 +1202,13 @@ msgid "Date out of range" msgstr "日期超過範圍" msgid "No month specified" -msgstr "不指定月份" +msgstr "沒有指定月份" msgid "No day specified" -msgstr "不指定日期" +msgstr "沒有指定日期" msgid "No week specified" -msgstr "不指定週數" +msgstr "沒有指定週數" #, python-format msgid "No %(verbose_name_plural)s available" @@ -1141,19 +1219,19 @@ msgid "" "Future %(verbose_name_plural)s not available because %(class_name)s." "allow_future is False." msgstr "" -"未來的 %(verbose_name_plural)s 不可用,因 %(class_name)s.allow_future 為 " -"False." +"未來的 %(verbose_name_plural)s 不可用,因為 %(class_name)s.allow_future 設置" +"為 False." #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -msgstr "" +msgstr "日期字串 “%(datestr)s” 不符合 “%(format)s” 格式。" #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "無 %(verbose_name)s 符合本次搜尋" msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "頁面不是最後一頁,也無法被轉換為整數。" #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1161,49 +1239,46 @@ msgstr "無效的頁面 (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "列表是空的,並且 “%(class_name)s.allow_empty” 是 False 。" msgid "Directory indexes are not allowed here." msgstr "這裡不允許目錄索引。" #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” 不存在。" #, python-format msgid "Index of %(directory)s" msgstr "%(directory)s 的索引" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django:為有時間壓力的完美主義者設計的網站框架。" +msgid "The install worked successfully! Congratulations!" +msgstr "安裝成功!恭喜!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" -"查看 Django %(version)s 的發行筆記" - -msgid "The install worked successfully! Congratulations!" -msgstr "安裝成功!恭喜!" +"查看 Django %(version)s 的 發行版本說明 " #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" -"你看到這個訊息,是因為你在 Django 設定檔中包含 DEBUG = True,且尚未配置任何網址。開始工作吧!" +"你現在看到這個頁面,是因為在設定檔中設置了 DEBUG = True,且尚未配置任何網址。" msgid "Django Documentation" msgstr "Django 文件" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "主題、參考、教學" msgid "Tutorial: A Polling App" msgstr "教學:投票應用" @@ -1215,4 +1290,4 @@ msgid "Django Community" msgstr "Django 社群" msgid "Connect, get help, or contribute" -msgstr "聯繫、求助、貢獻" +msgstr "聯繫、獲得幫助、貢獻" diff --git a/django/conf/locale/zh_Hant/formats.py b/django/conf/locale/zh_Hant/formats.py index 018b9b17f449..79936f8a343f 100644 --- a/django/conf/locale/zh_Hant/formats.py +++ b/django/conf/locale/zh_Hant/formats.py @@ -2,41 +2,41 @@ # # The *_FORMAT strings use the Django date format syntax, # see https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date -DATE_FORMAT = 'Y年n月j日' # 2016年9月5日 -TIME_FORMAT = 'H:i' # 20:45 -DATETIME_FORMAT = 'Y年n月j日 H:i' # 2016年9月5日 20:45 -YEAR_MONTH_FORMAT = 'Y年n月' # 2016年9月 -MONTH_DAY_FORMAT = 'm月j日' # 9月5日 -SHORT_DATE_FORMAT = 'Y年n月j日' # 2016年9月5日 -SHORT_DATETIME_FORMAT = 'Y年n月j日 H:i' # 2016年9月5日 20:45 -FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) +DATE_FORMAT = "Y年n月j日" # 2016年9月5日 +TIME_FORMAT = "H:i" # 20:45 +DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 +YEAR_MONTH_FORMAT = "Y年n月" # 2016年9月 +MONTH_DAY_FORMAT = "m月j日" # 9月5日 +SHORT_DATE_FORMAT = "Y年n月j日" # 2016年9月5日 +SHORT_DATETIME_FORMAT = "Y年n月j日 H:i" # 2016年9月5日 20:45 +FIRST_DAY_OF_WEEK = 1 # 星期一 (Monday) # The *_INPUT_FORMATS strings use the Python strftime format syntax, # see https://docs.python.org/library/datetime.html#strftime-strptime-behavior DATE_INPUT_FORMATS = [ - '%Y/%m/%d', # '2016/09/05' - '%Y-%m-%d', # '2016-09-05' - '%Y年%n月%j日', # '2016年9月5日' + "%Y/%m/%d", # '2016/09/05' + "%Y-%m-%d", # '2016-09-05' + "%Y年%n月%j日", # '2016年9月5日' ] TIME_INPUT_FORMATS = [ - '%H:%M', # '20:45' - '%H:%M:%S', # '20:45:29' - '%H:%M:%S.%f', # '20:45:29.000200' + "%H:%M", # '20:45' + "%H:%M:%S", # '20:45:29' + "%H:%M:%S.%f", # '20:45:29.000200' ] DATETIME_INPUT_FORMATS = [ - '%Y/%m/%d %H:%M', # '2016/09/05 20:45' - '%Y-%m-%d %H:%M', # '2016-09-05 20:45' - '%Y年%n月%j日 %H:%M', # '2016年9月5日 14:45' - '%Y/%m/%d %H:%M:%S', # '2016/09/05 20:45:29' - '%Y-%m-%d %H:%M:%S', # '2016-09-05 20:45:29' - '%Y年%n月%j日 %H:%M:%S', # '2016年9月5日 20:45:29' - '%Y/%m/%d %H:%M:%S.%f', # '2016/09/05 20:45:29.000200' - '%Y-%m-%d %H:%M:%S.%f', # '2016-09-05 20:45:29.000200' - '%Y年%n月%j日 %H:%n:%S.%f', # '2016年9月5日 20:45:29.000200' + "%Y/%m/%d %H:%M", # '2016/09/05 20:45' + "%Y-%m-%d %H:%M", # '2016-09-05 20:45' + "%Y年%n月%j日 %H:%M", # '2016年9月5日 14:45' + "%Y/%m/%d %H:%M:%S", # '2016/09/05 20:45:29' + "%Y-%m-%d %H:%M:%S", # '2016-09-05 20:45:29' + "%Y年%n月%j日 %H:%M:%S", # '2016年9月5日 20:45:29' + "%Y/%m/%d %H:%M:%S.%f", # '2016/09/05 20:45:29.000200' + "%Y-%m-%d %H:%M:%S.%f", # '2016-09-05 20:45:29.000200' + "%Y年%n月%j日 %H:%n:%S.%f", # '2016年9月5日 20:45:29.000200' ] -DECIMAL_SEPARATOR = '.' -THOUSAND_SEPARATOR = '' +DECIMAL_SEPARATOR = "." +THOUSAND_SEPARATOR = "" NUMBER_GROUPING = 4 diff --git a/django/conf/project_template/project_name/settings.py-tpl b/django/conf/project_template/project_name/settings.py-tpl index 64d32d7059fd..5631ec9a3162 100644 --- a/django/conf/project_template/project_name/settings.py-tpl +++ b/django/conf/project_template/project_name/settings.py-tpl @@ -13,7 +13,7 @@ https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/ from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve(strict=True).parent.parent +BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production @@ -58,7 +58,6 @@ TEMPLATES = [ 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ - 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', @@ -109,12 +108,15 @@ TIME_ZONE = 'UTC' USE_I18N = True -USE_L10N = True - USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/{{ docs_version }}/howto/static-files/ -STATIC_URL = '/static/' +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/django/conf/project_template/project_name/urls.py-tpl b/django/conf/project_template/project_name/urls.py-tpl index e23d6a92babb..622f79ef4a18 100644 --- a/django/conf/project_template/project_name/urls.py-tpl +++ b/django/conf/project_template/project_name/urls.py-tpl @@ -1,4 +1,5 @@ -"""{{ project_name }} URL Configuration +""" +URL configuration for {{ project_name }} project. The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/{{ docs_version }}/topics/http/urls/ diff --git a/django/conf/urls/__init__.py b/django/conf/urls/__init__.py index c58e581cd933..302f68dd07b4 100644 --- a/django/conf/urls/__init__.py +++ b/django/conf/urls/__init__.py @@ -1,22 +1,9 @@ -import warnings - -from django.urls import include, re_path -from django.utils.deprecation import RemovedInDjango40Warning +from django.urls import include from django.views import defaults -__all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url'] +__all__ = ["handler400", "handler403", "handler404", "handler500", "include"] handler400 = defaults.bad_request handler403 = defaults.permission_denied handler404 = defaults.page_not_found handler500 = defaults.server_error - - -def url(regex, view, kwargs=None, name=None): - warnings.warn( - 'django.conf.urls.url() is deprecated in favor of ' - 'django.urls.re_path().', - RemovedInDjango40Warning, - stacklevel=2, - ) - return re_path(regex, view, kwargs, name) diff --git a/django/conf/urls/i18n.py b/django/conf/urls/i18n.py index 256c247491ed..6b3fe702ae69 100644 --- a/django/conf/urls/i18n.py +++ b/django/conf/urls/i18n.py @@ -20,7 +20,7 @@ def i18n_patterns(*urls, prefix_default_language=True): ] -@functools.lru_cache(maxsize=None) +@functools.cache def is_language_prefix_patterns_used(urlconf): """ Return a tuple of two booleans: ( @@ -35,5 +35,5 @@ def is_language_prefix_patterns_used(urlconf): urlpatterns = [ - path('setlang/', set_language, name='set_language'), + path("setlang/", set_language, name="set_language"), ] diff --git a/django/conf/urls/static.py b/django/conf/urls/static.py index fa83645b9dd8..8e7816e77238 100644 --- a/django/conf/urls/static.py +++ b/django/conf/urls/static.py @@ -24,5 +24,7 @@ def static(prefix, view=serve, **kwargs): # No-op if not in debug mode or a non-local prefix. return [] return [ - re_path(r'^%s(?P.*)$' % re.escape(prefix.lstrip('/')), view, kwargs=kwargs), + re_path( + r"^%s(?P.*)$" % re.escape(prefix.lstrip("/")), view, kwargs=kwargs + ), ] diff --git a/django/contrib/admin/__init__.py b/django/contrib/admin/__init__.py index f9bf6543f9d1..0d9189f6b17b 100644 --- a/django/contrib/admin/__init__.py +++ b/django/contrib/admin/__init__.py @@ -1,27 +1,52 @@ -from django.contrib.admin.decorators import register +from django.contrib.admin.decorators import action, display, register from django.contrib.admin.filters import ( - AllValuesFieldListFilter, BooleanFieldListFilter, ChoicesFieldListFilter, - DateFieldListFilter, EmptyFieldListFilter, FieldListFilter, ListFilter, - RelatedFieldListFilter, RelatedOnlyFieldListFilter, SimpleListFilter, + AllValuesFieldListFilter, + BooleanFieldListFilter, + ChoicesFieldListFilter, + DateFieldListFilter, + EmptyFieldListFilter, + FieldListFilter, + ListFilter, + RelatedFieldListFilter, + RelatedOnlyFieldListFilter, + SimpleListFilter, ) from django.contrib.admin.options import ( - HORIZONTAL, VERTICAL, ModelAdmin, StackedInline, TabularInline, + HORIZONTAL, + VERTICAL, + ModelAdmin, + ShowFacets, + StackedInline, + TabularInline, ) from django.contrib.admin.sites import AdminSite, site from django.utils.module_loading import autodiscover_modules __all__ = [ - "register", "ModelAdmin", "HORIZONTAL", "VERTICAL", "StackedInline", - "TabularInline", "AdminSite", "site", "ListFilter", "SimpleListFilter", - "FieldListFilter", "BooleanFieldListFilter", "RelatedFieldListFilter", - "ChoicesFieldListFilter", "DateFieldListFilter", - "AllValuesFieldListFilter", "EmptyFieldListFilter", - "RelatedOnlyFieldListFilter", "autodiscover", + "action", + "display", + "register", + "ModelAdmin", + "HORIZONTAL", + "VERTICAL", + "StackedInline", + "TabularInline", + "AdminSite", + "site", + "ListFilter", + "SimpleListFilter", + "FieldListFilter", + "BooleanFieldListFilter", + "RelatedFieldListFilter", + "ChoicesFieldListFilter", + "DateFieldListFilter", + "AllValuesFieldListFilter", + "EmptyFieldListFilter", + "RelatedOnlyFieldListFilter", + "ShowFacets", + "autodiscover", ] def autodiscover(): - autodiscover_modules('admin', register_to=site) - - -default_app_config = 'django.contrib.admin.apps.AdminConfig' + autodiscover_modules("admin", register_to=site) diff --git a/django/contrib/admin/actions.py b/django/contrib/admin/actions.py index 1e1c3bd384f3..865c16aff237 100644 --- a/django/contrib/admin/actions.py +++ b/django/contrib/admin/actions.py @@ -4,12 +4,18 @@ from django.contrib import messages from django.contrib.admin import helpers +from django.contrib.admin.decorators import action from django.contrib.admin.utils import model_ngettext from django.core.exceptions import PermissionDenied from django.template.response import TemplateResponse -from django.utils.translation import gettext as _, gettext_lazy +from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy +@action( + permissions=["delete"], + description=gettext_lazy("Delete selected %(verbose_name_plural)s"), +) def delete_selected(modeladmin, request, queryset): """ Default action which deletes the selected objects. @@ -25,22 +31,28 @@ def delete_selected(modeladmin, request, queryset): # Populate deletable_objects, a data structure of all related objects that # will also be deleted. - deletable_objects, model_count, perms_needed, protected = modeladmin.get_deleted_objects(queryset, request) + ( + deletable_objects, + model_count, + perms_needed, + protected, + ) = modeladmin.get_deleted_objects(queryset, request) # The user has already confirmed the deletion. # Do the deletion and return None to display the change list view again. - if request.POST.get('post') and not protected: + if request.POST.get("post") and not protected: if perms_needed: raise PermissionDenied - n = queryset.count() + n = len(queryset) if n: - for obj in queryset: - obj_display = str(obj) - modeladmin.log_deletion(request, obj, obj_display) + modeladmin.log_deletions(request, queryset) modeladmin.delete_queryset(request, queryset) - modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % { - "count": n, "items": model_ngettext(modeladmin.opts, n) - }, messages.SUCCESS) + modeladmin.message_user( + request, + _("Successfully deleted %(count)d %(items)s.") + % {"count": n, "items": model_ngettext(modeladmin.opts, n)}, + messages.SUCCESS, + ) # Return None to display the change list page again. return None @@ -49,31 +61,34 @@ def delete_selected(modeladmin, request, queryset): if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} else: - title = _("Are you sure?") + title = _("Delete multiple objects") context = { **modeladmin.admin_site.each_context(request), - 'title': title, - 'objects_name': str(objects_name), - 'deletable_objects': [deletable_objects], - 'model_count': dict(model_count).items(), - 'queryset': queryset, - 'perms_lacking': perms_needed, - 'protected': protected, - 'opts': opts, - 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, - 'media': modeladmin.media, + "title": title, + "subtitle": None, + "objects_name": str(objects_name), + "deletable_objects": [deletable_objects], + "model_count": dict(model_count).items(), + "queryset": queryset, + "perms_lacking": perms_needed, + "protected": protected, + "opts": opts, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + "media": modeladmin.media, } request.current_app = modeladmin.admin_site.name # Display the confirmation page - return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [ - "admin/%s/%s/delete_selected_confirmation.html" % (app_label, opts.model_name), - "admin/%s/delete_selected_confirmation.html" % app_label, - "admin/delete_selected_confirmation.html" - ], context) - - -delete_selected.allowed_permissions = ('delete',) -delete_selected.short_description = gettext_lazy("Delete selected %(verbose_name_plural)s") + return TemplateResponse( + request, + modeladmin.delete_selected_confirmation_template + or [ + "admin/%s/%s/delete_selected_confirmation.html" + % (app_label, opts.model_name), + "admin/%s/delete_selected_confirmation.html" % app_label, + "admin/delete_selected_confirmation.html", + ], + context, + ) diff --git a/django/contrib/admin/apps.py b/django/contrib/admin/apps.py index 36c157683ddf..08a9e0d832ba 100644 --- a/django/contrib/admin/apps.py +++ b/django/contrib/admin/apps.py @@ -7,8 +7,9 @@ class SimpleAdminConfig(AppConfig): """Simple AppConfig which does not do automatic discovery.""" - default_site = 'django.contrib.admin.sites.AdminSite' - name = 'django.contrib.admin' + default_auto_field = "django.db.models.AutoField" + default_site = "django.contrib.admin.sites.AdminSite" + name = "django.contrib.admin" verbose_name = _("Administration") def ready(self): @@ -19,6 +20,8 @@ def ready(self): class AdminConfig(SimpleAdminConfig): """The default AppConfig for admin which does autodiscovery.""" + default = True + def ready(self): super().ready() self.module.autodiscover() diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index a18ba22b463e..a4d7066d10b8 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -3,17 +3,14 @@ from django.apps import apps from django.conf import settings -from django.contrib.admin.utils import ( - NotRelationField, flatten, get_fields_from_path, -) +from django.contrib.admin.exceptions import NotRegistered +from django.contrib.admin.utils import NotRelationField, flatten, get_fields_from_path from django.core import checks from django.core.exceptions import FieldDoesNotExist from django.db import models from django.db.models.constants import LOOKUP_SEP from django.db.models.expressions import Combinable -from django.forms.models import ( - BaseModelForm, BaseModelFormSet, _get_foreign_key, -) +from django.forms.models import BaseModelForm, BaseModelFormSet, _get_foreign_key from django.template import engines from django.template.backends.django import DjangoTemplates from django.utils.module_loading import import_string @@ -49,6 +46,7 @@ def _contains_subclass(class_path, candidate_paths): def check_admin_app(app_configs, **kwargs): from django.contrib.admin.sites import all_sites + errors = [] for site in all_sites: errors.extend(site.check(app_configs)) @@ -60,21 +58,24 @@ def check_dependencies(**kwargs): Check that the admin's dependencies are correctly installed. """ from django.contrib.admin.sites import all_sites - if not apps.is_installed('django.contrib.admin'): + + if not apps.is_installed("django.contrib.admin"): return [] errors = [] app_dependencies = ( - ('django.contrib.contenttypes', 401), - ('django.contrib.auth', 405), - ('django.contrib.messages', 406), + ("django.contrib.contenttypes", 401), + ("django.contrib.auth", 405), + ("django.contrib.messages", 406), ) for app_name, error_code in app_dependencies: if not apps.is_installed(app_name): - errors.append(checks.Error( - "'%s' must be in INSTALLED_APPS in order to use the admin " - "application." % app_name, - id='admin.E%d' % error_code, - )) + errors.append( + checks.Error( + "'%s' must be in INSTALLED_APPS in order to use the admin " + "application." % app_name, + id="admin.E%d" % error_code, + ) + ) for engine in engines.all(): if isinstance(engine, DjangoTemplates): django_templates_instance = engine.engine @@ -82,69 +83,98 @@ def check_dependencies(**kwargs): else: django_templates_instance = None if not django_templates_instance: - errors.append(checks.Error( - "A 'django.template.backends.django.DjangoTemplates' instance " - "must be configured in TEMPLATES in order to use the admin " - "application.", - id='admin.E403', - )) + errors.append( + checks.Error( + "A 'django.template.backends.django.DjangoTemplates' instance " + "must be configured in TEMPLATES in order to use the admin " + "application.", + id="admin.E403", + ) + ) else: - if ('django.contrib.auth.context_processors.auth' - not in django_templates_instance.context_processors and - _contains_subclass('django.contrib.auth.backends.ModelBackend', settings.AUTHENTICATION_BACKENDS)): - errors.append(checks.Error( - "'django.contrib.auth.context_processors.auth' must be " - "enabled in DjangoTemplates (TEMPLATES) if using the default " - "auth backend in order to use the admin application.", - id='admin.E402', - )) - if ('django.contrib.messages.context_processors.messages' - not in django_templates_instance.context_processors): - errors.append(checks.Error( - "'django.contrib.messages.context_processors.messages' must " - "be enabled in DjangoTemplates (TEMPLATES) in order to use " - "the admin application.", - id='admin.E404', - )) + if ( + "django.contrib.auth.context_processors.auth" + not in django_templates_instance.context_processors + and _contains_subclass( + "django.contrib.auth.backends.ModelBackend", + settings.AUTHENTICATION_BACKENDS, + ) + ): + errors.append( + checks.Error( + "'django.contrib.auth.context_processors.auth' must be " + "enabled in DjangoTemplates (TEMPLATES) if using the default " + "auth backend in order to use the admin application.", + id="admin.E402", + ) + ) + if ( + "django.contrib.messages.context_processors.messages" + not in django_templates_instance.context_processors + ): + errors.append( + checks.Error( + "'django.contrib.messages.context_processors.messages' must " + "be enabled in DjangoTemplates (TEMPLATES) in order to use " + "the admin application.", + id="admin.E404", + ) + ) sidebar_enabled = any(site.enable_nav_sidebar for site in all_sites) - if (sidebar_enabled and 'django.template.context_processors.request' - not in django_templates_instance.context_processors): - errors.append(checks.Warning( - "'django.template.context_processors.request' must be enabled " - "in DjangoTemplates (TEMPLATES) in order to use the admin " - "navigation sidebar.", - id='admin.W411', - )) - - if not _contains_subclass('django.contrib.auth.middleware.AuthenticationMiddleware', settings.MIDDLEWARE): - errors.append(checks.Error( - "'django.contrib.auth.middleware.AuthenticationMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id='admin.E408', - )) - if not _contains_subclass('django.contrib.messages.middleware.MessageMiddleware', settings.MIDDLEWARE): - errors.append(checks.Error( - "'django.contrib.messages.middleware.MessageMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - id='admin.E409', - )) - if not _contains_subclass('django.contrib.sessions.middleware.SessionMiddleware', settings.MIDDLEWARE): - errors.append(checks.Error( - "'django.contrib.sessions.middleware.SessionMiddleware' must " - "be in MIDDLEWARE in order to use the admin application.", - hint=( - "Insert " - "'django.contrib.sessions.middleware.SessionMiddleware' " - "before " - "'django.contrib.auth.middleware.AuthenticationMiddleware'." - ), - id='admin.E410', - )) + if ( + sidebar_enabled + and "django.template.context_processors.request" + not in django_templates_instance.context_processors + ): + errors.append( + checks.Warning( + "'django.template.context_processors.request' must be enabled " + "in DjangoTemplates (TEMPLATES) in order to use the admin " + "navigation sidebar.", + id="admin.W411", + ) + ) + + if not _contains_subclass( + "django.contrib.auth.middleware.AuthenticationMiddleware", settings.MIDDLEWARE + ): + errors.append( + checks.Error( + "'django.contrib.auth.middleware.AuthenticationMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id="admin.E408", + ) + ) + if not _contains_subclass( + "django.contrib.messages.middleware.MessageMiddleware", settings.MIDDLEWARE + ): + errors.append( + checks.Error( + "'django.contrib.messages.middleware.MessageMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + id="admin.E409", + ) + ) + if not _contains_subclass( + "django.contrib.sessions.middleware.SessionMiddleware", settings.MIDDLEWARE + ): + errors.append( + checks.Error( + "'django.contrib.sessions.middleware.SessionMiddleware' must " + "be in MIDDLEWARE in order to use the admin application.", + hint=( + "Insert " + "'django.contrib.sessions.middleware.SessionMiddleware' " + "before " + "'django.contrib.auth.middleware.AuthenticationMiddleware'." + ), + id="admin.E410", + ) + ) return errors class BaseModelAdminChecks: - def check(self, admin_obj, **kwargs): return [ *self._check_autocomplete_fields(admin_obj), @@ -167,12 +197,23 @@ def _check_autocomplete_fields(self, obj): Check that `autocomplete_fields` is a list or tuple of model fields. """ if not isinstance(obj.autocomplete_fields, (list, tuple)): - return must_be('a list or tuple', option='autocomplete_fields', obj=obj, id='admin.E036') + return must_be( + "a list or tuple", + option="autocomplete_fields", + obj=obj, + id="admin.E036", + ) else: - return list(chain.from_iterable([ - self._check_autocomplete_fields_item(obj, field_name, 'autocomplete_fields[%d]' % index) - for index, field_name in enumerate(obj.autocomplete_fields) - ])) + return list( + chain.from_iterable( + [ + self._check_autocomplete_fields_item( + obj, field_name, "autocomplete_fields[%d]" % index + ) + for index, field_name in enumerate(obj.autocomplete_fields) + ] + ) + ) def _check_autocomplete_fields_item(self, obj, field_name, label): """ @@ -183,82 +224,111 @@ def _check_autocomplete_fields_item(self, obj, field_name, label): try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E037') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E037" + ) else: if not field.many_to_many and not isinstance(field, models.ForeignKey): return must_be( - 'a foreign key or a many-to-many field', - option=label, obj=obj, id='admin.E038' + "a foreign key or a many-to-many field", + option=label, + obj=obj, + id="admin.E038", ) - related_admin = obj.admin_site._registry.get(field.remote_field.model) - if related_admin is None: + try: + related_admin = obj.admin_site.get_model_admin(field.remote_field.model) + except NotRegistered: return [ checks.Error( 'An admin for model "%s" has to be registered ' - 'to be referenced by %s.autocomplete_fields.' % ( + "to be referenced by %s.autocomplete_fields." + % ( field.remote_field.model.__name__, type(obj).__name__, ), obj=obj.__class__, - id='admin.E039', - ) - ] - elif not related_admin.search_fields: - return [ - checks.Error( - '%s must define "search_fields", because it\'s ' - 'referenced by %s.autocomplete_fields.' % ( - related_admin.__class__.__name__, - type(obj).__name__, - ), - obj=obj.__class__, - id='admin.E040', + id="admin.E039", ) ] + else: + if not related_admin.search_fields: + return [ + checks.Error( + '%s must define "search_fields", because it\'s ' + "referenced by %s.autocomplete_fields." + % ( + related_admin.__class__.__name__, + type(obj).__name__, + ), + obj=obj.__class__, + id="admin.E040", + ) + ] return [] def _check_raw_id_fields(self, obj): - """ Check that `raw_id_fields` only contains field names that are listed - on the model. """ + """Check that `raw_id_fields` only contains field names that are listed + on the model.""" if not isinstance(obj.raw_id_fields, (list, tuple)): - return must_be('a list or tuple', option='raw_id_fields', obj=obj, id='admin.E001') + return must_be( + "a list or tuple", option="raw_id_fields", obj=obj, id="admin.E001" + ) else: - return list(chain.from_iterable( - self._check_raw_id_fields_item(obj, field_name, 'raw_id_fields[%d]' % index) - for index, field_name in enumerate(obj.raw_id_fields) - )) + return list( + chain.from_iterable( + self._check_raw_id_fields_item( + obj, field_name, "raw_id_fields[%d]" % index + ) + for index, field_name in enumerate(obj.raw_id_fields) + ) + ) def _check_raw_id_fields_item(self, obj, field_name, label): - """ Check an item of `raw_id_fields`, i.e. check that field named + """Check an item of `raw_id_fields`, i.e. check that field named `field_name` exists in model `model` and is a ForeignKey or a - ManyToManyField. """ + ManyToManyField.""" try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E002') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E002" + ) else: + # Using attname is not supported. + if field.name != field_name: + return refer_to_missing_field( + field=field_name, + option=label, + obj=obj, + id="admin.E002", + ) if not field.many_to_many and not isinstance(field, models.ForeignKey): - return must_be('a foreign key or a many-to-many field', option=label, obj=obj, id='admin.E003') + return must_be( + "a foreign key or a many-to-many field", + option=label, + obj=obj, + id="admin.E003", + ) else: return [] def _check_fields(self, obj): - """ Check that `fields` only refer to existing fields, doesn't contain + """Check that `fields` only refer to existing fields, doesn't contain duplicates. Check if at most one of `fields` and `fieldsets` is defined. """ if obj.fields is None: return [] elif not isinstance(obj.fields, (list, tuple)): - return must_be('a list or tuple', option='fields', obj=obj, id='admin.E004') + return must_be("a list or tuple", option="fields", obj=obj, id="admin.E004") elif obj.fieldsets: return [ checks.Error( "Both 'fieldsets' and 'fields' are specified.", obj=obj.__class__, - id='admin.E005', + id="admin.E005", ) ] fields = flatten(obj.fields) @@ -267,75 +337,96 @@ def _check_fields(self, obj): checks.Error( "The value of 'fields' contains duplicate field(s).", obj=obj.__class__, - id='admin.E006', + id="admin.E006", ) ] - return list(chain.from_iterable( - self._check_field_spec(obj, field_name, 'fields') - for field_name in obj.fields - )) + return list( + chain.from_iterable( + self._check_field_spec(obj, field_name, "fields") + for field_name in obj.fields + ) + ) def _check_fieldsets(self, obj): - """ Check that fieldsets is properly formatted and doesn't contain - duplicates. """ + """Check that fieldsets is properly formatted and doesn't contain + duplicates.""" if obj.fieldsets is None: return [] elif not isinstance(obj.fieldsets, (list, tuple)): - return must_be('a list or tuple', option='fieldsets', obj=obj, id='admin.E007') + return must_be( + "a list or tuple", option="fieldsets", obj=obj, id="admin.E007" + ) else: seen_fields = [] - return list(chain.from_iterable( - self._check_fieldsets_item(obj, fieldset, 'fieldsets[%d]' % index, seen_fields) - for index, fieldset in enumerate(obj.fieldsets) - )) + return list( + chain.from_iterable( + self._check_fieldsets_item( + obj, fieldset, "fieldsets[%d]" % index, seen_fields + ) + for index, fieldset in enumerate(obj.fieldsets) + ) + ) def _check_fieldsets_item(self, obj, fieldset, label, seen_fields): - """ Check an item of `fieldsets`, i.e. check that this is a pair of a - set name and a dictionary containing "fields" key. """ + """Check an item of `fieldsets`, i.e. check that this is a pair of a + set name and a dictionary containing "fields" key.""" if not isinstance(fieldset, (list, tuple)): - return must_be('a list or tuple', option=label, obj=obj, id='admin.E008') + return must_be("a list or tuple", option=label, obj=obj, id="admin.E008") elif len(fieldset) != 2: - return must_be('of length 2', option=label, obj=obj, id='admin.E009') + return must_be("of length 2", option=label, obj=obj, id="admin.E009") elif not isinstance(fieldset[1], dict): - return must_be('a dictionary', option='%s[1]' % label, obj=obj, id='admin.E010') - elif 'fields' not in fieldset[1]: + return must_be( + "a dictionary", option="%s[1]" % label, obj=obj, id="admin.E010" + ) + elif "fields" not in fieldset[1]: return [ checks.Error( "The value of '%s[1]' must contain the key 'fields'." % label, obj=obj.__class__, - id='admin.E011', + id="admin.E011", ) ] - elif not isinstance(fieldset[1]['fields'], (list, tuple)): - return must_be('a list or tuple', option="%s[1]['fields']" % label, obj=obj, id='admin.E008') - - seen_fields.extend(flatten(fieldset[1]['fields'])) + elif not isinstance(fieldset[1]["fields"], (list, tuple)): + return must_be( + "a list or tuple", + option="%s[1]['fields']" % label, + obj=obj, + id="admin.E008", + ) + + seen_fields.extend(flatten(fieldset[1]["fields"])) if len(seen_fields) != len(set(seen_fields)): return [ checks.Error( "There are duplicate field(s) in '%s[1]'." % label, obj=obj.__class__, - id='admin.E012', + id="admin.E012", ) ] - return list(chain.from_iterable( - self._check_field_spec(obj, fieldset_fields, '%s[1]["fields"]' % label) - for fieldset_fields in fieldset[1]['fields'] - )) + return list( + chain.from_iterable( + self._check_field_spec(obj, fieldset_fields, '%s[1]["fields"]' % label) + for fieldset_fields in fieldset[1]["fields"] + ) + ) def _check_field_spec(self, obj, fields, label): - """ `fields` should be an item of `fields` or an item of + """`fields` should be an item of `fields` or an item of fieldset[1]['fields'] for any `fieldset` in `fieldsets`. It should be a - field name or a tuple of field names. """ + field name or a tuple of field names.""" if isinstance(fields, tuple): - return list(chain.from_iterable( - self._check_field_spec_item(obj, field_name, "%s[%d]" % (label, index)) - for index, field_name in enumerate(fields) - )) + return list( + chain.from_iterable( + self._check_field_spec_item( + obj, field_name, "%s[%d]" % (label, index) + ) + for index, field_name in enumerate(fields) + ) + ) else: return self._check_field_spec_item(obj, fields, label) @@ -353,125 +444,164 @@ def _check_field_spec_item(self, obj, field_name, label): # be an extra field on the form. return [] else: - if (isinstance(field, models.ManyToManyField) and - not field.remote_field.through._meta.auto_created): + if ( + isinstance(field, models.ManyToManyField) + and not field.remote_field.through._meta.auto_created + ): return [ checks.Error( - "The value of '%s' cannot include the ManyToManyField '%s', " - "because that field manually specifies a relationship model." - % (label, field_name), + "The value of '%s' cannot include the ManyToManyField " + "'%s', because that field manually specifies a " + "relationship model." % (label, field_name), obj=obj.__class__, - id='admin.E013', + id="admin.E013", ) ] else: return [] def _check_exclude(self, obj): - """ Check that exclude is a sequence without duplicates. """ + """Check that exclude is a sequence without duplicates.""" if obj.exclude is None: # default value is None return [] elif not isinstance(obj.exclude, (list, tuple)): - return must_be('a list or tuple', option='exclude', obj=obj, id='admin.E014') + return must_be( + "a list or tuple", option="exclude", obj=obj, id="admin.E014" + ) elif len(obj.exclude) > len(set(obj.exclude)): return [ checks.Error( "The value of 'exclude' contains duplicate field(s).", obj=obj.__class__, - id='admin.E015', + id="admin.E015", ) ] else: return [] def _check_form(self, obj): - """ Check that form subclasses BaseModelForm. """ + """Check that form subclasses BaseModelForm.""" if not _issubclass(obj.form, BaseModelForm): - return must_inherit_from(parent='BaseModelForm', option='form', - obj=obj, id='admin.E016') + return must_inherit_from( + parent="BaseModelForm", option="form", obj=obj, id="admin.E016" + ) else: return [] def _check_filter_vertical(self, obj): - """ Check that filter_vertical is a sequence of field names. """ + """Check that filter_vertical is a sequence of field names.""" if not isinstance(obj.filter_vertical, (list, tuple)): - return must_be('a list or tuple', option='filter_vertical', obj=obj, id='admin.E017') + return must_be( + "a list or tuple", option="filter_vertical", obj=obj, id="admin.E017" + ) else: - return list(chain.from_iterable( - self._check_filter_item(obj, field_name, "filter_vertical[%d]" % index) - for index, field_name in enumerate(obj.filter_vertical) - )) + return list( + chain.from_iterable( + self._check_filter_item( + obj, field_name, "filter_vertical[%d]" % index + ) + for index, field_name in enumerate(obj.filter_vertical) + ) + ) def _check_filter_horizontal(self, obj): - """ Check that filter_horizontal is a sequence of field names. """ + """Check that filter_horizontal is a sequence of field names.""" if not isinstance(obj.filter_horizontal, (list, tuple)): - return must_be('a list or tuple', option='filter_horizontal', obj=obj, id='admin.E018') + return must_be( + "a list or tuple", option="filter_horizontal", obj=obj, id="admin.E018" + ) else: - return list(chain.from_iterable( - self._check_filter_item(obj, field_name, "filter_horizontal[%d]" % index) - for index, field_name in enumerate(obj.filter_horizontal) - )) + return list( + chain.from_iterable( + self._check_filter_item( + obj, field_name, "filter_horizontal[%d]" % index + ) + for index, field_name in enumerate(obj.filter_horizontal) + ) + ) def _check_filter_item(self, obj, field_name, label): - """ Check one item of `filter_vertical` or `filter_horizontal`, i.e. - check that given field exists and is a ManyToManyField. """ + """Check one item of `filter_vertical` or `filter_horizontal`, i.e. + check that given field exists and is a ManyToManyField.""" try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E019') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E019" + ) else: - if not field.many_to_many: - return must_be('a many-to-many field', option=label, obj=obj, id='admin.E020') + if not field.many_to_many or isinstance(field, models.ManyToManyRel): + return must_be( + "a many-to-many field", option=label, obj=obj, id="admin.E020" + ) + elif not field.remote_field.through._meta.auto_created: + return [ + checks.Error( + f"The value of '{label}' cannot include the ManyToManyField " + f"'{field_name}', because that field manually specifies a " + f"relationship model.", + obj=obj.__class__, + id="admin.E013", + ) + ] else: return [] def _check_radio_fields(self, obj): - """ Check that `radio_fields` is a dictionary. """ + """Check that `radio_fields` is a dictionary.""" if not isinstance(obj.radio_fields, dict): - return must_be('a dictionary', option='radio_fields', obj=obj, id='admin.E021') + return must_be( + "a dictionary", option="radio_fields", obj=obj, id="admin.E021" + ) else: - return list(chain.from_iterable( - self._check_radio_fields_key(obj, field_name, 'radio_fields') + - self._check_radio_fields_value(obj, val, 'radio_fields["%s"]' % field_name) - for field_name, val in obj.radio_fields.items() - )) + return list( + chain.from_iterable( + self._check_radio_fields_key(obj, field_name, "radio_fields") + + self._check_radio_fields_value( + obj, val, 'radio_fields["%s"]' % field_name + ) + for field_name, val in obj.radio_fields.items() + ) + ) def _check_radio_fields_key(self, obj, field_name, label): - """ Check that a key of `radio_fields` dictionary is name of existing - field and that the field is a ForeignKey or has `choices` defined. """ + """Check that a key of `radio_fields` dictionary is name of existing + field and that the field is a ForeignKey or has `choices` defined.""" try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E022') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E022" + ) else: if not (isinstance(field, models.ForeignKey) or field.choices): return [ checks.Error( "The value of '%s' refers to '%s', which is not an " - "instance of ForeignKey, and does not have a 'choices' definition." % ( - label, field_name - ), + "instance of ForeignKey, and does not have a 'choices' " + "definition." % (label, field_name), obj=obj.__class__, - id='admin.E023', + id="admin.E023", ) ] else: return [] def _check_radio_fields_value(self, obj, val, label): - """ Check type of a value of `radio_fields` dictionary. """ + """Check type of a value of `radio_fields` dictionary.""" from django.contrib.admin.options import HORIZONTAL, VERTICAL if val not in (HORIZONTAL, VERTICAL): return [ checks.Error( - "The value of '%s' must be either admin.HORIZONTAL or admin.VERTICAL." % label, + "The value of '%s' must be either admin.HORIZONTAL or " + "admin.VERTICAL." % label, obj=obj.__class__, - id='admin.E024', + id="admin.E024", ) ] else: @@ -481,87 +611,111 @@ def _check_view_on_site_url(self, obj): if not callable(obj.view_on_site) and not isinstance(obj.view_on_site, bool): return [ checks.Error( - "The value of 'view_on_site' must be a callable or a boolean value.", + "The value of 'view_on_site' must be a callable or a boolean " + "value.", obj=obj.__class__, - id='admin.E025', + id="admin.E025", ) ] else: return [] def _check_prepopulated_fields(self, obj): - """ Check that `prepopulated_fields` is a dictionary containing allowed - field types. """ + """Check that `prepopulated_fields` is a dictionary containing allowed + field types.""" if not isinstance(obj.prepopulated_fields, dict): - return must_be('a dictionary', option='prepopulated_fields', obj=obj, id='admin.E026') + return must_be( + "a dictionary", option="prepopulated_fields", obj=obj, id="admin.E026" + ) else: - return list(chain.from_iterable( - self._check_prepopulated_fields_key(obj, field_name, 'prepopulated_fields') + - self._check_prepopulated_fields_value(obj, val, 'prepopulated_fields["%s"]' % field_name) - for field_name, val in obj.prepopulated_fields.items() - )) + return list( + chain.from_iterable( + self._check_prepopulated_fields_key( + obj, field_name, "prepopulated_fields" + ) + + self._check_prepopulated_fields_value( + obj, val, 'prepopulated_fields["%s"]' % field_name + ) + for field_name, val in obj.prepopulated_fields.items() + ) + ) def _check_prepopulated_fields_key(self, obj, field_name, label): - """ Check a key of `prepopulated_fields` dictionary, i.e. check that it + """Check a key of `prepopulated_fields` dictionary, i.e. check that it is a name of existing field and the field is one of the allowed types. """ try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E027') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E027" + ) else: - if isinstance(field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField)): + if isinstance( + field, (models.DateTimeField, models.ForeignKey, models.ManyToManyField) + ): return [ checks.Error( - "The value of '%s' refers to '%s', which must not be a DateTimeField, " - "a ForeignKey, a OneToOneField, or a ManyToManyField." % (label, field_name), + "The value of '%s' refers to '%s', which must not be a " + "DateTimeField, a ForeignKey, a OneToOneField, or a " + "ManyToManyField." % (label, field_name), obj=obj.__class__, - id='admin.E028', + id="admin.E028", ) ] else: return [] def _check_prepopulated_fields_value(self, obj, val, label): - """ Check a value of `prepopulated_fields` dictionary, i.e. it's an - iterable of existing fields. """ + """Check a value of `prepopulated_fields` dictionary, i.e. it's an + iterable of existing fields.""" if not isinstance(val, (list, tuple)): - return must_be('a list or tuple', option=label, obj=obj, id='admin.E029') + return must_be("a list or tuple", option=label, obj=obj, id="admin.E029") else: - return list(chain.from_iterable( - self._check_prepopulated_fields_value_item(obj, subfield_name, "%s[%r]" % (label, index)) - for index, subfield_name in enumerate(val) - )) + return list( + chain.from_iterable( + self._check_prepopulated_fields_value_item( + obj, subfield_name, "%s[%r]" % (label, index) + ) + for index, subfield_name in enumerate(val) + ) + ) def _check_prepopulated_fields_value_item(self, obj, field_name, label): - """ For `prepopulated_fields` equal to {"slug": ("title",)}, - `field_name` is "title". """ + """For `prepopulated_fields` equal to {"slug": ("title",)}, + `field_name` is "title".""" try: obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E030') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E030" + ) else: return [] def _check_ordering(self, obj): - """ Check that ordering refers to existing fields or is random. """ + """Check that ordering refers to existing fields or is random.""" # ordering = None if obj.ordering is None: # The default value is None return [] elif not isinstance(obj.ordering, (list, tuple)): - return must_be('a list or tuple', option='ordering', obj=obj, id='admin.E031') + return must_be( + "a list or tuple", option="ordering", obj=obj, id="admin.E031" + ) else: - return list(chain.from_iterable( - self._check_ordering_item(obj, field_name, 'ordering[%d]' % index) - for index, field_name in enumerate(obj.ordering) - )) + return list( + chain.from_iterable( + self._check_ordering_item(obj, field_name, "ordering[%d]" % index) + for index, field_name in enumerate(obj.ordering) + ) + ) def _check_ordering_item(self, obj, field_name, label): - """ Check that `ordering` refers to existing fields. """ + """Check that `ordering` refers to existing fields.""" if isinstance(field_name, (Combinable, models.OrderBy)): if not isinstance(field_name, models.OrderBy): field_name = field_name.asc() @@ -569,46 +723,53 @@ def _check_ordering_item(self, obj, field_name, label): field_name = field_name.expression.name else: return [] - if field_name == '?' and len(obj.ordering) != 1: + if field_name == "?" and len(obj.ordering) != 1: return [ checks.Error( "The value of 'ordering' has the random ordering marker '?', " "but contains other fields as well.", hint='Either remove the "?", or remove the other fields.', obj=obj.__class__, - id='admin.E032', + id="admin.E032", ) ] - elif field_name == '?': + elif field_name == "?": return [] elif LOOKUP_SEP in field_name: # Skip ordering in the format field1__field2 (FIXME: checking # this format would be nice, but it's a little fiddly). return [] else: - if field_name.startswith('-'): - field_name = field_name[1:] - if field_name == 'pk': + field_name = field_name.removeprefix("-") + if field_name == "pk": return [] try: obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E033') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E033" + ) else: return [] def _check_readonly_fields(self, obj): - """ Check that readonly_fields refers to proper attribute or field. """ + """Check that readonly_fields refers to proper attribute or field.""" if obj.readonly_fields == (): return [] elif not isinstance(obj.readonly_fields, (list, tuple)): - return must_be('a list or tuple', option='readonly_fields', obj=obj, id='admin.E034') + return must_be( + "a list or tuple", option="readonly_fields", obj=obj, id="admin.E034" + ) else: - return list(chain.from_iterable( - self._check_readonly_fields_item(obj, field_name, "readonly_fields[%d]" % index) - for index, field_name in enumerate(obj.readonly_fields) - )) + return list( + chain.from_iterable( + self._check_readonly_fields_item( + obj, field_name, "readonly_fields[%d]" % index + ) + for index, field_name in enumerate(obj.readonly_fields) + ) + ) def _check_readonly_fields_item(self, obj, field_name, label): if callable(field_name): @@ -623,12 +784,16 @@ def _check_readonly_fields_item(self, obj, field_name, label): except FieldDoesNotExist: return [ checks.Error( - "The value of '%s' is not a callable, an attribute of " - "'%s', or an attribute of '%s'." % ( - label, obj.__class__.__name__, obj.model._meta.label, + "The value of '%s' refers to '%s', which is not a callable, " + "an attribute of '%s', or an attribute of '%s'." + % ( + label, + field_name, + obj.__class__.__name__, + obj.model._meta.label, ), obj=obj.__class__, - id='admin.E035', + id="admin.E035", ) ] else: @@ -636,7 +801,6 @@ def _check_readonly_fields_item(self, obj, field_name, label): class ModelAdminChecks(BaseModelAdminChecks): - def check(self, admin_obj, **kwargs): return [ *super().check(admin_obj), @@ -652,49 +816,50 @@ def check(self, admin_obj, **kwargs): *self._check_list_editable(admin_obj), *self._check_search_fields(admin_obj), *self._check_date_hierarchy(admin_obj), - *self._check_action_permission_methods(admin_obj), - *self._check_actions_uniqueness(admin_obj), + *self._check_actions(admin_obj), ] def _check_save_as(self, obj): - """ Check save_as is a boolean. """ + """Check save_as is a boolean.""" if not isinstance(obj.save_as, bool): - return must_be('a boolean', option='save_as', - obj=obj, id='admin.E101') + return must_be("a boolean", option="save_as", obj=obj, id="admin.E101") else: return [] def _check_save_on_top(self, obj): - """ Check save_on_top is a boolean. """ + """Check save_on_top is a boolean.""" if not isinstance(obj.save_on_top, bool): - return must_be('a boolean', option='save_on_top', - obj=obj, id='admin.E102') + return must_be("a boolean", option="save_on_top", obj=obj, id="admin.E102") else: return [] def _check_inlines(self, obj): - """ Check all inline model admin classes. """ + """Check all inline model admin classes.""" if not isinstance(obj.inlines, (list, tuple)): - return must_be('a list or tuple', option='inlines', obj=obj, id='admin.E103') + return must_be( + "a list or tuple", option="inlines", obj=obj, id="admin.E103" + ) else: - return list(chain.from_iterable( - self._check_inlines_item(obj, item, "inlines[%d]" % index) - for index, item in enumerate(obj.inlines) - )) + return list( + chain.from_iterable( + self._check_inlines_item(obj, item, "inlines[%d]" % index) + for index, item in enumerate(obj.inlines) + ) + ) def _check_inlines_item(self, obj, inline, label): - """ Check one inline model admin. """ + """Check one inline model admin.""" try: - inline_label = inline.__module__ + '.' + inline.__name__ + inline_label = inline.__module__ + "." + inline.__name__ except AttributeError: return [ checks.Error( "'%s' must inherit from 'InlineModelAdmin'." % obj, obj=obj.__class__, - id='admin.E104', + id="admin.E104", ) ] @@ -705,7 +870,7 @@ def _check_inlines_item(self, obj, inline, label): checks.Error( "'%s' must inherit from 'InlineModelAdmin'." % inline_label, obj=obj.__class__, - id='admin.E104', + id="admin.E104", ) ] elif not inline.model: @@ -713,25 +878,30 @@ def _check_inlines_item(self, obj, inline, label): checks.Error( "'%s' must have a 'model' attribute." % inline_label, obj=obj.__class__, - id='admin.E105', + id="admin.E105", ) ] elif not _issubclass(inline.model, models.Model): - return must_be('a Model', option='%s.model' % inline_label, obj=obj, id='admin.E106') + return must_be( + "a Model", option="%s.model" % inline_label, obj=obj, id="admin.E106" + ) else: return inline(obj.model, obj.admin_site).check() def _check_list_display(self, obj): - """ Check that list_display only contains fields or usable attributes. - """ + """Check that list_display only contains fields or usable attributes.""" if not isinstance(obj.list_display, (list, tuple)): - return must_be('a list or tuple', option='list_display', obj=obj, id='admin.E107') + return must_be( + "a list or tuple", option="list_display", obj=obj, id="admin.E107" + ) else: - return list(chain.from_iterable( - self._check_list_display_item(obj, item, "list_display[%d]" % index) - for index, item in enumerate(obj.list_display) - )) + return list( + chain.from_iterable( + self._check_list_display_item(obj, item, "list_display[%d]" % index) + for index, item in enumerate(obj.list_display) + ) + ) def _check_list_display_item(self, obj, item, label): if callable(item): @@ -744,54 +914,66 @@ def _check_list_display_item(self, obj, item, label): try: field = getattr(obj.model, item) except AttributeError: - return [ - checks.Error( - "The value of '%s' refers to '%s', which is not a " - "callable, an attribute of '%s', or an attribute or " - "method on '%s'." % ( - label, item, obj.__class__.__name__, - obj.model._meta.label, - ), - obj=obj.__class__, - id='admin.E108', - ) - ] - if isinstance(field, models.ManyToManyField): + try: + field = get_fields_from_path(obj.model, item)[-1] + except (FieldDoesNotExist, NotRelationField): + return [ + checks.Error( + f"The value of '{label}' refers to '{item}', which is not " + f"a callable or attribute of '{obj.__class__.__name__}', " + "or an attribute, method, or field on " + f"'{obj.model._meta.label}'.", + obj=obj.__class__, + id="admin.E108", + ) + ] + if ( + getattr(field, "is_relation", False) + and (field.many_to_many or field.one_to_many) + ) or (getattr(field, "rel", None) and field.rel.field.many_to_one): return [ checks.Error( - "The value of '%s' must not be a ManyToManyField." % label, + f"The value of '{label}' must not be a many-to-many field or a " + f"reverse foreign key.", obj=obj.__class__, - id='admin.E109', + id="admin.E109", ) ] return [] def _check_list_display_links(self, obj): - """ Check that list_display_links is a unique subset of list_display. - """ + """Check that list_display_links is a unique subset of list_display.""" from django.contrib.admin.options import ModelAdmin if obj.list_display_links is None: return [] elif not isinstance(obj.list_display_links, (list, tuple)): - return must_be('a list, a tuple, or None', option='list_display_links', obj=obj, id='admin.E110') + return must_be( + "a list, a tuple, or None", + option="list_display_links", + obj=obj, + id="admin.E110", + ) # Check only if ModelAdmin.get_list_display() isn't overridden. elif obj.get_list_display.__func__ is ModelAdmin.get_list_display: - return list(chain.from_iterable( - self._check_list_display_links_item(obj, field_name, "list_display_links[%d]" % index) - for index, field_name in enumerate(obj.list_display_links) - )) + return list( + chain.from_iterable( + self._check_list_display_links_item( + obj, field_name, "list_display_links[%d]" % index + ) + for index, field_name in enumerate(obj.list_display_links) + ) + ) return [] def _check_list_display_links_item(self, obj, field_name, label): if field_name not in obj.list_display: return [ checks.Error( - "The value of '%s' refers to '%s', which is not defined in 'list_display'." % ( - label, field_name - ), + "The value of '%s' refers to '%s', which is not defined in " + "'list_display'." % (label, field_name), obj=obj.__class__, - id='admin.E111', + id="admin.E111", ) ] else: @@ -799,12 +981,16 @@ def _check_list_display_links_item(self, obj, field_name, label): def _check_list_filter(self, obj): if not isinstance(obj.list_filter, (list, tuple)): - return must_be('a list or tuple', option='list_filter', obj=obj, id='admin.E112') + return must_be( + "a list or tuple", option="list_filter", obj=obj, id="admin.E112" + ) else: - return list(chain.from_iterable( - self._check_list_filter_item(obj, item, "list_filter[%d]" % index) - for index, item in enumerate(obj.list_filter) - )) + return list( + chain.from_iterable( + self._check_list_filter_item(obj, item, "list_filter[%d]" % index) + for index, item in enumerate(obj.list_filter) + ) + ) def _check_list_filter_item(self, obj, item, label): """ @@ -814,21 +1000,22 @@ def _check_list_filter_item(self, obj, item, label): 2. ('field', SomeFieldListFilter) - a field-based list filter class 3. SomeListFilter - a non-field list filter class """ - - from django.contrib.admin import ListFilter, FieldListFilter + from django.contrib.admin import FieldListFilter, ListFilter if callable(item) and not isinstance(item, models.Field): # If item is option 3, it should be a ListFilter... if not _issubclass(item, ListFilter): - return must_inherit_from(parent='ListFilter', option=label, - obj=obj, id='admin.E113') + return must_inherit_from( + parent="ListFilter", option=label, obj=obj, id="admin.E113" + ) # ... but not a FieldListFilter. elif issubclass(item, FieldListFilter): return [ checks.Error( - "The value of '%s' must not inherit from 'FieldListFilter'." % label, + "The value of '%s' must not inherit from 'FieldListFilter'." + % label, obj=obj.__class__, - id='admin.E114', + id="admin.E114", ) ] else: @@ -837,7 +1024,12 @@ def _check_list_filter_item(self, obj, item, label): # item is option #2 field, list_filter_class = item if not _issubclass(list_filter_class, FieldListFilter): - return must_inherit_from(parent='FieldListFilter', option='%s[1]' % label, obj=obj, id='admin.E115') + return must_inherit_from( + parent="FieldListFilter", + option="%s[1]" % label, + obj=obj, + id="admin.E115", + ) else: return [] else: @@ -850,55 +1042,73 @@ def _check_list_filter_item(self, obj, item, label): except (NotRelationField, FieldDoesNotExist): return [ checks.Error( - "The value of '%s' refers to '%s', which does not refer to a Field." % (label, field), + "The value of '%s' refers to '%s', which does not refer to a " + "Field." % (label, field), obj=obj.__class__, - id='admin.E116', + id="admin.E116", ) ] else: return [] def _check_list_select_related(self, obj): - """ Check that list_select_related is a boolean, a list or a tuple. """ + """Check that list_select_related is a boolean, a list or a tuple.""" if not isinstance(obj.list_select_related, (bool, list, tuple)): - return must_be('a boolean, tuple or list', option='list_select_related', obj=obj, id='admin.E117') + return must_be( + "a boolean, tuple or list", + option="list_select_related", + obj=obj, + id="admin.E117", + ) else: return [] def _check_list_per_page(self, obj): - """ Check that list_per_page is an integer. """ + """Check that list_per_page is an integer.""" if not isinstance(obj.list_per_page, int): - return must_be('an integer', option='list_per_page', obj=obj, id='admin.E118') + return must_be( + "an integer", option="list_per_page", obj=obj, id="admin.E118" + ) else: return [] def _check_list_max_show_all(self, obj): - """ Check that list_max_show_all is an integer. """ + """Check that list_max_show_all is an integer.""" if not isinstance(obj.list_max_show_all, int): - return must_be('an integer', option='list_max_show_all', obj=obj, id='admin.E119') + return must_be( + "an integer", option="list_max_show_all", obj=obj, id="admin.E119" + ) else: return [] def _check_list_editable(self, obj): - """ Check that list_editable is a sequence of editable fields from - list_display without first element. """ + """Check that list_editable is a sequence of editable fields from + list_display without first element.""" if not isinstance(obj.list_editable, (list, tuple)): - return must_be('a list or tuple', option='list_editable', obj=obj, id='admin.E120') + return must_be( + "a list or tuple", option="list_editable", obj=obj, id="admin.E120" + ) else: - return list(chain.from_iterable( - self._check_list_editable_item(obj, item, "list_editable[%d]" % index) - for index, item in enumerate(obj.list_editable) - )) + return list( + chain.from_iterable( + self._check_list_editable_item( + obj, item, "list_editable[%d]" % index + ) + for index, item in enumerate(obj.list_editable) + ) + ) def _check_list_editable_item(self, obj, field_name, label): try: field = obj.model._meta.get_field(field_name) except FieldDoesNotExist: - return refer_to_missing_field(field=field_name, option=label, obj=obj, id='admin.E121') + return refer_to_missing_field( + field=field_name, option=label, obj=obj, id="admin.E121" + ) else: if field_name not in obj.list_display: return [ @@ -906,54 +1116,58 @@ def _check_list_editable_item(self, obj, field_name, label): "The value of '%s' refers to '%s', which is not " "contained in 'list_display'." % (label, field_name), obj=obj.__class__, - id='admin.E122', + id="admin.E122", ) ] elif obj.list_display_links and field_name in obj.list_display_links: return [ checks.Error( - "The value of '%s' cannot be in both 'list_editable' and 'list_display_links'." % field_name, + "The value of '%s' cannot be in both 'list_editable' and " + "'list_display_links'." % field_name, obj=obj.__class__, - id='admin.E123', + id="admin.E123", ) ] # If list_display[0] is in list_editable, check that # list_display_links is set. See #22792 and #26229 for use cases. - elif (obj.list_display[0] == field_name and not obj.list_display_links and - obj.list_display_links is not None): + elif ( + obj.list_display[0] == field_name + and not obj.list_display_links + and obj.list_display_links is not None + ): return [ checks.Error( - "The value of '%s' refers to the first field in 'list_display' ('%s'), " - "which cannot be used unless 'list_display_links' is set." % ( - label, obj.list_display[0] - ), + "The value of '%s' refers to the first field in 'list_display' " + "('%s'), which cannot be used unless 'list_display_links' is " + "set." % (label, obj.list_display[0]), obj=obj.__class__, - id='admin.E124', + id="admin.E124", ) ] - elif not field.editable: + elif not field.editable or field.primary_key: return [ checks.Error( - "The value of '%s' refers to '%s', which is not editable through the admin." % ( - label, field_name - ), + "The value of '%s' refers to '%s', which is not editable " + "through the admin." % (label, field_name), obj=obj.__class__, - id='admin.E125', + id="admin.E125", ) ] else: return [] def _check_search_fields(self, obj): - """ Check search_fields is a sequence. """ + """Check search_fields is a sequence.""" if not isinstance(obj.search_fields, (list, tuple)): - return must_be('a list or tuple', option='search_fields', obj=obj, id='admin.E126') + return must_be( + "a list or tuple", option="search_fields", obj=obj, id="admin.E126" + ) else: return [] def _check_date_hierarchy(self, obj): - """ Check that date_hierarchy refers to DateField or DateTimeField. """ + """Check that date_hierarchy refers to DateField or DateTimeField.""" if obj.date_hierarchy is None: return [] @@ -966,61 +1180,64 @@ def _check_date_hierarchy(self, obj): "The value of 'date_hierarchy' refers to '%s', which " "does not refer to a Field." % obj.date_hierarchy, obj=obj.__class__, - id='admin.E127', + id="admin.E127", ) ] else: - if not isinstance(field, (models.DateField, models.DateTimeField)): - return must_be('a DateField or DateTimeField', option='date_hierarchy', obj=obj, id='admin.E128') + if field.get_internal_type() not in {"DateField", "DateTimeField"}: + return must_be( + "a DateField or DateTimeField", + option="date_hierarchy", + obj=obj, + id="admin.E128", + ) else: return [] - def _check_action_permission_methods(self, obj): - """ - Actions with an allowed_permission attribute require the ModelAdmin to - implement a has__permission() method for each permission. - """ - actions = obj._get_base_actions() + def _check_actions(self, obj): errors = [] + actions = obj._get_base_actions() + + # Actions with an allowed_permission attribute require the ModelAdmin + # to implement a has__permission() method for each permission. for func, name, _ in actions: - if not hasattr(func, 'allowed_permissions'): + if not hasattr(func, "allowed_permissions"): continue for permission in func.allowed_permissions: - method_name = 'has_%s_permission' % permission + method_name = "has_%s_permission" % permission if not hasattr(obj, method_name): errors.append( checks.Error( - '%s must define a %s() method for the %s action.' % ( + "%s must define a %s() method for the %s action." + % ( obj.__class__.__name__, method_name, func.__name__, ), obj=obj.__class__, - id='admin.E129', + id="admin.E129", ) ) - return errors - - def _check_actions_uniqueness(self, obj): - """Check that every action has a unique __name__.""" - errors = [] - names = collections.Counter(name for _, name, _ in obj._get_base_actions()) + # Names need to be unique. + names = collections.Counter(name for _, name, _ in actions) for name, count in names.items(): if count > 1: - errors.append(checks.Error( - '__name__ attributes of actions defined in %s must be ' - 'unique. Name %r is not unique.' % ( - obj.__class__.__name__, - name, - ), - obj=obj.__class__, - id='admin.E130', - )) + errors.append( + checks.Error( + "__name__ attributes of actions defined in %s must be " + "unique. Name %r is not unique." + % ( + obj.__class__.__name__, + name, + ), + obj=obj.__class__, + id="admin.E130", + ) + ) return errors class InlineModelAdminChecks(BaseModelAdminChecks): - def check(self, inline_obj, **kwargs): parent_model = inline_obj.parent_model return [ @@ -1052,11 +1269,13 @@ def _check_exclude_of_parent_model(self, obj, parent_model): return [ checks.Error( "Cannot exclude the field '%s', because it is the foreign key " - "to the parent model '%s'." % ( - fk.name, parent_model._meta.label, + "to the parent model '%s'." + % ( + fk.name, + parent_model._meta.label, ), obj=obj.__class__, - id='admin.E201', + id="admin.E201", ) ] else: @@ -1066,43 +1285,45 @@ def _check_relation(self, obj, parent_model): try: _get_foreign_key(parent_model, obj.model, fk_name=obj.fk_name) except ValueError as e: - return [checks.Error(e.args[0], obj=obj.__class__, id='admin.E202')] + return [checks.Error(e.args[0], obj=obj.__class__, id="admin.E202")] else: return [] def _check_extra(self, obj): - """ Check that extra is an integer. """ + """Check that extra is an integer.""" if not isinstance(obj.extra, int): - return must_be('an integer', option='extra', obj=obj, id='admin.E203') + return must_be("an integer", option="extra", obj=obj, id="admin.E203") else: return [] def _check_max_num(self, obj): - """ Check that max_num is an integer. """ + """Check that max_num is an integer.""" if obj.max_num is None: return [] elif not isinstance(obj.max_num, int): - return must_be('an integer', option='max_num', obj=obj, id='admin.E204') + return must_be("an integer", option="max_num", obj=obj, id="admin.E204") else: return [] def _check_min_num(self, obj): - """ Check that min_num is an integer. """ + """Check that min_num is an integer.""" if obj.min_num is None: return [] elif not isinstance(obj.min_num, int): - return must_be('an integer', option='min_num', obj=obj, id='admin.E205') + return must_be("an integer", option="min_num", obj=obj, id="admin.E205") else: return [] def _check_formset(self, obj): - """ Check formset is a subclass of BaseModelFormSet. """ + """Check formset is a subclass of BaseModelFormSet.""" if not _issubclass(obj.formset, BaseModelFormSet): - return must_inherit_from(parent='BaseModelFormSet', option='formset', obj=obj, id='admin.E206') + return must_inherit_from( + parent="BaseModelFormSet", option="formset", obj=obj, id="admin.E206" + ) else: return [] @@ -1130,8 +1351,8 @@ def must_inherit_from(parent, option, obj, id): def refer_to_missing_field(field, option, obj, id): return [ checks.Error( - "The value of '%s' refers to '%s', which is not an attribute of " - "'%s'." % (option, field, obj.model._meta.label), + "The value of '%s' refers to '%s', which is not a field of '%s'." + % (option, field, obj.model._meta.label), obj=obj.__class__, id=id, ), diff --git a/django/contrib/admin/decorators.py b/django/contrib/admin/decorators.py index 0c2e35c2b213..d3ff56a59a0c 100644 --- a/django/contrib/admin/decorators.py +++ b/django/contrib/admin/decorators.py @@ -1,3 +1,82 @@ +def action(function=None, *, permissions=None, description=None): + """ + Conveniently add attributes to an action function:: + + @admin.action( + permissions=['publish'], + description='Mark selected stories as published', + ) + def make_published(self, request, queryset): + queryset.update(status='p') + + This is equivalent to setting some attributes (with the original, longer + names) on the function directly:: + + def make_published(self, request, queryset): + queryset.update(status='p') + make_published.allowed_permissions = ['publish'] + make_published.short_description = 'Mark selected stories as published' + """ + + def decorator(func): + if permissions is not None: + func.allowed_permissions = permissions + if description is not None: + func.short_description = description + return func + + if function is None: + return decorator + else: + return decorator(function) + + +def display( + function=None, *, boolean=None, ordering=None, description=None, empty_value=None +): + """ + Conveniently add attributes to a display function:: + + @admin.display( + boolean=True, + ordering='-publish_date', + description='Is Published?', + ) + def is_published(self, obj): + return obj.publish_date is not None + + This is equivalent to setting some attributes (with the original, longer + names) on the function directly:: + + def is_published(self, obj): + return obj.publish_date is not None + is_published.boolean = True + is_published.admin_order_field = '-publish_date' + is_published.short_description = 'Is Published?' + """ + + def decorator(func): + if boolean is not None and empty_value is not None: + raise ValueError( + "The boolean and empty_value arguments to the @display " + "decorator are mutually exclusive." + ) + if boolean is not None: + func.boolean = boolean + if ordering is not None: + func.admin_order_field = ordering + if description is not None: + func.short_description = description + if empty_value is not None: + func.empty_value_display = empty_value + return func + + if function is None: + return decorator + else: + return decorator(function) + + def register(*models, site=None): """ Register the given model(s) classes and wrapped ModelAdmin class with @@ -10,21 +89,23 @@ class AuthorAdmin(admin.ModelAdmin): The `site` kwarg is an admin site to use instead of the default admin site. """ from django.contrib.admin import ModelAdmin - from django.contrib.admin.sites import site as default_site, AdminSite + from django.contrib.admin.sites import AdminSite + from django.contrib.admin.sites import site as default_site def _model_admin_wrapper(admin_class): if not models: - raise ValueError('At least one model must be passed to register.') + raise ValueError("At least one model must be passed to register.") admin_site = site or default_site if not isinstance(admin_site, AdminSite): - raise ValueError('site must subclass AdminSite') + raise ValueError("site must subclass AdminSite") if not issubclass(admin_class, ModelAdmin): - raise ValueError('Wrapped class must subclass ModelAdmin.') + raise ValueError("Wrapped class must subclass ModelAdmin.") admin_site.register(models, admin_class=admin_class) return admin_class + return _model_admin_wrapper diff --git a/django/contrib/admin/exceptions.py b/django/contrib/admin/exceptions.py index f619bc225286..6105eef42492 100644 --- a/django/contrib/admin/exceptions.py +++ b/django/contrib/admin/exceptions.py @@ -3,9 +3,23 @@ class DisallowedModelAdminLookup(SuspiciousOperation): """Invalid filter was passed to admin view via URL querystring""" + pass class DisallowedModelAdminToField(SuspiciousOperation): """Invalid to_field was passed to admin view via URL query string""" + + pass + + +class AlreadyRegistered(Exception): + """The model is already registered.""" + + pass + + +class NotRegistered(Exception): + """The model is not registered.""" + pass diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py index 3e02cd89d77e..10a039af2a49 100644 --- a/django/contrib/admin/filters.py +++ b/django/contrib/admin/filters.py @@ -5,11 +5,17 @@ Each filter subclass knows how to display a filter for a field that passes a certain test -- e.g. being a DateField or ForeignKey. """ + import datetime +from django.contrib.admin.exceptions import NotRegistered from django.contrib.admin.options import IncorrectLookupParameters from django.contrib.admin.utils import ( - get_model_from_relation, prepare_lookup_value, reverse_field_path, + build_q_object_from_lookup_parameters, + get_last_value_from_parameters, + get_model_from_relation, + prepare_lookup_value, + reverse_field_path, ) from django.core.exceptions import ImproperlyConfigured, ValidationError from django.db import models @@ -19,9 +25,10 @@ class ListFilter: title = None # Human-readable title to appear in the right sidebar. - template = 'admin/filter.html' + template = "admin/filter.html" def __init__(self, request, params, model, model_admin): + self.request = request # This dictionary will eventually contain the request's query string # parameters actually used by this filter. self.used_parameters = {} @@ -35,7 +42,9 @@ def has_output(self): """ Return True if some choices would be output for this filter. """ - raise NotImplementedError('subclasses of ListFilter must provide a has_output() method') + raise NotImplementedError( + "subclasses of ListFilter must provide a has_output() method" + ) def choices(self, changelist): """ @@ -43,23 +52,44 @@ def choices(self, changelist): `changelist` is the ChangeList to be displayed. """ - raise NotImplementedError('subclasses of ListFilter must provide a choices() method') + raise NotImplementedError( + "subclasses of ListFilter must provide a choices() method" + ) def queryset(self, request, queryset): """ Return the filtered queryset. """ - raise NotImplementedError('subclasses of ListFilter must provide a queryset() method') + raise NotImplementedError( + "subclasses of ListFilter must provide a queryset() method" + ) def expected_parameters(self): """ Return the list of parameter names that are expected from the request's query string and that will be used by this filter. """ - raise NotImplementedError('subclasses of ListFilter must provide an expected_parameters() method') + raise NotImplementedError( + "subclasses of ListFilter must provide an expected_parameters() method" + ) + + +class FacetsMixin: + def get_facet_counts(self, pk_attname, filtered_qs): + raise NotImplementedError( + "subclasses of FacetsMixin must provide a get_facet_counts() method." + ) + + def get_facet_queryset(self, changelist): + filtered_qs = changelist.get_queryset( + self.request, exclude_parameters=self.expected_parameters() + ) + return filtered_qs.aggregate( + **self.get_facet_counts(changelist.pk_attname, filtered_qs) + ) -class SimpleListFilter(ListFilter): +class SimpleListFilter(FacetsMixin, ListFilter): # The parameter that should be used in the query string for that filter. parameter_name = None @@ -72,7 +102,7 @@ def __init__(self, request, params, model, model_admin): ) if self.parameter_name in params: value = params.pop(self.parameter_name) - self.used_parameters[self.parameter_name] = value + self.used_parameters[self.parameter_name] = value[-1] lookup_choices = self.lookups(request, model_admin) if lookup_choices is None: lookup_choices = () @@ -94,47 +124,74 @@ def lookups(self, request, model_admin): Must be overridden to return a list of tuples (value, verbose value) """ raise NotImplementedError( - 'The SimpleListFilter.lookups() method must be overridden to ' - 'return a list of tuples (value, verbose value).' + "The SimpleListFilter.lookups() method must be overridden to " + "return a list of tuples (value, verbose value)." ) def expected_parameters(self): return [self.parameter_name] + def get_facet_counts(self, pk_attname, filtered_qs): + original_value = self.used_parameters.get(self.parameter_name) + counts = {} + for i, choice in enumerate(self.lookup_choices): + self.used_parameters[self.parameter_name] = choice[0] + lookup_qs = self.queryset(self.request, filtered_qs) + if lookup_qs is not None: + counts[f"{i}__c"] = models.Count( + pk_attname, + filter=models.Q(pk__in=lookup_qs), + ) + self.used_parameters[self.parameter_name] = original_value + return counts + def choices(self, changelist): + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None yield { - 'selected': self.value() is None, - 'query_string': changelist.get_query_string(remove=[self.parameter_name]), - 'display': _('All'), + "selected": self.value() is None, + "query_string": changelist.get_query_string(remove=[self.parameter_name]), + "display": _("All"), } - for lookup, title in self.lookup_choices: + for i, (lookup, title) in enumerate(self.lookup_choices): + if add_facets: + if (count := facet_counts.get(f"{i}__c", -1)) != -1: + title = f"{title} ({count})" + else: + title = f"{title} (-)" yield { - 'selected': self.value() == str(lookup), - 'query_string': changelist.get_query_string({self.parameter_name: lookup}), - 'display': title, + "selected": self.value() == str(lookup), + "query_string": changelist.get_query_string( + {self.parameter_name: lookup} + ), + "display": title, } -class FieldListFilter(ListFilter): +class FieldListFilter(FacetsMixin, ListFilter): _field_list_filters = [] _take_priority_index = 0 + list_separator = "," def __init__(self, field, request, params, model, model_admin, field_path): self.field = field self.field_path = field_path - self.title = getattr(field, 'verbose_name', field_path) + self.title = getattr(field, "verbose_name", field_path) super().__init__(request, params, model, model_admin) for p in self.expected_parameters(): if p in params: value = params.pop(p) - self.used_parameters[p] = prepare_lookup_value(p, value) + self.used_parameters[p] = prepare_lookup_value( + p, value, self.list_separator + ) def has_output(self): return True def queryset(self, request, queryset): try: - return queryset.filter(**self.used_parameters) + q_object = build_q_object_from_lookup_parameters(self.used_parameters) + return queryset.filter(q_object) except (ValueError, ValidationError) as e: # Fields may raise a ValueError or ValidationError when converting # the parameters to the correct type. @@ -147,7 +204,8 @@ def register(cls, test, list_filter_class, take_priority=False): # of fields with some custom filters. The first found in the list # is used in priority. cls._field_list_filters.insert( - cls._take_priority_index, (test, list_filter_class)) + cls._take_priority_index, (test, list_filter_class) + ) cls._take_priority_index += 1 else: cls._field_list_filters.append((test, list_filter_class)) @@ -156,19 +214,23 @@ def register(cls, test, list_filter_class, take_priority=False): def create(cls, field, request, params, model, model_admin, field_path): for test, list_filter_class in cls._field_list_filters: if test(field): - return list_filter_class(field, request, params, model, model_admin, field_path=field_path) + return list_filter_class( + field, request, params, model, model_admin, field_path=field_path + ) class RelatedFieldListFilter(FieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): other_model = get_model_from_relation(field) - self.lookup_kwarg = '%s__%s__exact' % (field_path, field.target_field.name) - self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_kwarg = "%s__%s__exact" % (field_path, field.target_field.name) + self.lookup_kwarg_isnull = "%s__isnull" % field_path self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + self.lookup_val_isnull = get_last_value_from_parameters( + params, self.lookup_kwarg_isnull + ) super().__init__(field, request, params, model, model_admin, field_path) self.lookup_choices = self.field_choices(field, request, model_admin) - if hasattr(field, 'verbose_name'): + if hasattr(field, "verbose_name"): self.lookup_title = field.verbose_name else: self.lookup_title = other_model._meta.verbose_name @@ -197,32 +259,66 @@ def field_admin_ordering(self, field, request, model_admin): """ Return the model admin's ordering for related field, if provided. """ - related_admin = model_admin.admin_site._registry.get(field.remote_field.model) - if related_admin is not None: + try: + related_admin = model_admin.admin_site.get_model_admin( + field.remote_field.model + ) + except NotRegistered: + return () + else: return related_admin.get_ordering(request) - return () def field_choices(self, field, request, model_admin): ordering = self.field_admin_ordering(field, request, model_admin) return field.get_choices(include_blank=False, ordering=ordering) + def get_facet_counts(self, pk_attname, filtered_qs): + counts = { + f"{pk_val}__c": models.Count( + pk_attname, filter=models.Q(**{self.lookup_kwarg: pk_val}) + ) + for pk_val, _ in self.lookup_choices + } + if self.include_empty_choice: + counts["__c"] = models.Count( + pk_attname, filter=models.Q(**{self.lookup_kwarg_isnull: True}) + ) + return counts + def choices(self, changelist): + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None yield { - 'selected': self.lookup_val is None and not self.lookup_val_isnull, - 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), - 'display': _('All'), + "selected": self.lookup_val is None and not self.lookup_val_isnull, + "query_string": changelist.get_query_string( + remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] + ), + "display": _("All"), } + count = None for pk_val, val in self.lookup_choices: + if add_facets: + count = facet_counts[f"{pk_val}__c"] + val = f"{val} ({count})" yield { - 'selected': self.lookup_val == str(pk_val), - 'query_string': changelist.get_query_string({self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull]), - 'display': val, + "selected": self.lookup_val is not None + and str(pk_val) in self.lookup_val, + "query_string": changelist.get_query_string( + {self.lookup_kwarg: pk_val}, [self.lookup_kwarg_isnull] + ), + "display": val, } + empty_title = self.empty_value_display if self.include_empty_choice: + if add_facets: + count = facet_counts["__c"] + empty_title = f"{empty_title} ({count})" yield { - 'selected': bool(self.lookup_val_isnull), - 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), - 'display': self.empty_value_display, + "selected": bool(self.lookup_val_isnull), + "query_string": changelist.get_query_string( + {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] + ), + "display": empty_title, } @@ -231,71 +327,134 @@ def choices(self, changelist): class BooleanFieldListFilter(FieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = '%s__exact' % field_path - self.lookup_kwarg2 = '%s__isnull' % field_path - self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val2 = params.get(self.lookup_kwarg2) + self.lookup_kwarg = "%s__exact" % field_path + self.lookup_kwarg2 = "%s__isnull" % field_path + self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) + self.lookup_val2 = get_last_value_from_parameters(params, self.lookup_kwarg2) super().__init__(field, request, params, model, model_admin, field_path) - if (self.used_parameters and self.lookup_kwarg in self.used_parameters and - self.used_parameters[self.lookup_kwarg] in ('1', '0')): - self.used_parameters[self.lookup_kwarg] = bool(int(self.used_parameters[self.lookup_kwarg])) + if ( + self.used_parameters + and self.lookup_kwarg in self.used_parameters + and self.used_parameters[self.lookup_kwarg] in ("1", "0") + ): + self.used_parameters[self.lookup_kwarg] = bool( + int(self.used_parameters[self.lookup_kwarg]) + ) def expected_parameters(self): return [self.lookup_kwarg, self.lookup_kwarg2] + def get_facet_counts(self, pk_attname, filtered_qs): + return { + "true__c": models.Count( + pk_attname, filter=models.Q(**{self.field_path: True}) + ), + "false__c": models.Count( + pk_attname, filter=models.Q(**{self.field_path: False}) + ), + "null__c": models.Count( + pk_attname, filter=models.Q(**{self.lookup_kwarg2: True}) + ), + } + def choices(self, changelist): - for lookup, title in ( - (None, _('All')), - ('1', _('Yes')), - ('0', _('No'))): + field_choices = dict(self.field.flatchoices) + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None + for lookup, title, count_field in ( + (None, _("All"), None), + ("1", field_choices.get(True, _("Yes")), "true__c"), + ("0", field_choices.get(False, _("No")), "false__c"), + ): + if add_facets: + if count_field is not None: + count = facet_counts[count_field] + title = f"{title} ({count})" yield { - 'selected': self.lookup_val == lookup and not self.lookup_val2, - 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}, [self.lookup_kwarg2]), - 'display': title, + "selected": self.lookup_val == lookup and not self.lookup_val2, + "query_string": changelist.get_query_string( + {self.lookup_kwarg: lookup}, [self.lookup_kwarg2] + ), + "display": title, } if self.field.null: + display = field_choices.get(None, _("Unknown")) + if add_facets: + count = facet_counts["null__c"] + display = f"{display} ({count})" yield { - 'selected': self.lookup_val2 == 'True', - 'query_string': changelist.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]), - 'display': _('Unknown'), + "selected": self.lookup_val2 == "True", + "query_string": changelist.get_query_string( + {self.lookup_kwarg2: "True"}, [self.lookup_kwarg] + ), + "display": display, } -FieldListFilter.register(lambda f: isinstance(f, models.BooleanField), BooleanFieldListFilter) +FieldListFilter.register( + lambda f: isinstance(f, models.BooleanField), BooleanFieldListFilter +) class ChoicesFieldListFilter(FieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): - self.lookup_kwarg = '%s__exact' % field_path - self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_kwarg = "%s__exact" % field_path + self.lookup_kwarg_isnull = "%s__isnull" % field_path self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + self.lookup_val_isnull = get_last_value_from_parameters( + params, self.lookup_kwarg_isnull + ) super().__init__(field, request, params, model, model_admin, field_path) def expected_parameters(self): return [self.lookup_kwarg, self.lookup_kwarg_isnull] + def get_facet_counts(self, pk_attname, filtered_qs): + return { + f"{i}__c": models.Count( + pk_attname, + filter=models.Q( + (self.lookup_kwarg, value) + if value is not None + else (self.lookup_kwarg_isnull, True) + ), + ) + for i, (value, _) in enumerate(self.field.flatchoices) + } + def choices(self, changelist): + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None yield { - 'selected': self.lookup_val is None, - 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), - 'display': _('All') + "selected": self.lookup_val is None, + "query_string": changelist.get_query_string( + remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] + ), + "display": _("All"), } - none_title = '' - for lookup, title in self.field.flatchoices: + none_title = "" + for i, (lookup, title) in enumerate(self.field.flatchoices): + if add_facets: + count = facet_counts[f"{i}__c"] + title = f"{title} ({count})" if lookup is None: none_title = title continue yield { - 'selected': str(lookup) == self.lookup_val, - 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}, [self.lookup_kwarg_isnull]), - 'display': title, + "selected": self.lookup_val is not None + and str(lookup) in self.lookup_val, + "query_string": changelist.get_query_string( + {self.lookup_kwarg: lookup}, [self.lookup_kwarg_isnull] + ), + "display": title, } if none_title: yield { - 'selected': bool(self.lookup_val_isnull), - 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), - 'display': none_title, + "selected": bool(self.lookup_val_isnull), + "query_string": changelist.get_query_string( + {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] + ), + "display": none_title, } @@ -304,8 +463,10 @@ def choices(self, changelist): class DateFieldListFilter(FieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): - self.field_generic = '%s__' % field_path - self.date_params = {k: v for k, v in params.items() if k.startswith(self.field_generic)} + self.field_generic = "%s__" % field_path + self.date_params = { + k: v[-1] for k, v in params.items() if k.startswith(self.field_generic) + } now = timezone.now() # When time zone support is enabled, convert "now" to the user's time @@ -315,7 +476,7 @@ def __init__(self, field, request, params, model, model_admin, field_path): if isinstance(field, models.DateTimeField): today = now.replace(hour=0, minute=0, second=0, microsecond=0) - else: # field is a models.DateField + else: # field is a models.DateField today = now.date() tomorrow = today + datetime.timedelta(days=1) if today.month == 12: @@ -324,32 +485,44 @@ def __init__(self, field, request, params, model, model_admin, field_path): next_month = today.replace(month=today.month + 1, day=1) next_year = today.replace(year=today.year + 1, month=1, day=1) - self.lookup_kwarg_since = '%s__gte' % field_path - self.lookup_kwarg_until = '%s__lt' % field_path + self.lookup_kwarg_since = "%s__gte" % field_path + self.lookup_kwarg_until = "%s__lt" % field_path self.links = ( - (_('Any date'), {}), - (_('Today'), { - self.lookup_kwarg_since: str(today), - self.lookup_kwarg_until: str(tomorrow), - }), - (_('Past 7 days'), { - self.lookup_kwarg_since: str(today - datetime.timedelta(days=7)), - self.lookup_kwarg_until: str(tomorrow), - }), - (_('This month'), { - self.lookup_kwarg_since: str(today.replace(day=1)), - self.lookup_kwarg_until: str(next_month), - }), - (_('This year'), { - self.lookup_kwarg_since: str(today.replace(month=1, day=1)), - self.lookup_kwarg_until: str(next_year), - }), + (_("Any date"), {}), + ( + _("Today"), + { + self.lookup_kwarg_since: today, + self.lookup_kwarg_until: tomorrow, + }, + ), + ( + _("Past 7 days"), + { + self.lookup_kwarg_since: today - datetime.timedelta(days=7), + self.lookup_kwarg_until: tomorrow, + }, + ), + ( + _("This month"), + { + self.lookup_kwarg_since: today.replace(day=1), + self.lookup_kwarg_until: next_month, + }, + ), + ( + _("This year"), + { + self.lookup_kwarg_since: today.replace(month=1, day=1), + self.lookup_kwarg_until: next_year, + }, + ), ) if field.null: - self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_kwarg_isnull = "%s__isnull" % field_path self.links += ( - (_('No date'), {self.field_generic + 'isnull': 'True'}), - (_('Has date'), {self.field_generic + 'isnull': 'False'}), + (_("No date"), {self.field_generic + "isnull": True}), + (_("Has date"), {self.field_generic + "isnull": False}), ) super().__init__(field, request, params, model, model_admin, field_path) @@ -359,17 +532,30 @@ def expected_parameters(self): params.append(self.lookup_kwarg_isnull) return params + def get_facet_counts(self, pk_attname, filtered_qs): + return { + f"{i}__c": models.Count(pk_attname, filter=models.Q(**param_dict)) + for i, (_, param_dict) in enumerate(self.links) + } + def choices(self, changelist): - for title, param_dict in self.links: + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None + for i, (title, param_dict) in enumerate(self.links): + param_dict_str = {key: str(value) for key, value in param_dict.items()} + if add_facets: + count = facet_counts[f"{i}__c"] + title = f"{title} ({count})" yield { - 'selected': self.date_params == param_dict, - 'query_string': changelist.get_query_string(param_dict, [self.field_generic]), - 'display': title, + "selected": self.date_params == param_dict_str, + "query_string": changelist.get_query_string( + param_dict_str, [self.field_generic] + ), + "display": title, } -FieldListFilter.register( - lambda f: isinstance(f, models.DateField), DateFieldListFilter) +FieldListFilter.register(lambda f: isinstance(f, models.DateField), DateFieldListFilter) # This should be registered last, because it's a last resort. For example, @@ -378,9 +564,11 @@ def choices(self, changelist): class AllValuesFieldListFilter(FieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): self.lookup_kwarg = field_path - self.lookup_kwarg_isnull = '%s__isnull' % field_path + self.lookup_kwarg_isnull = "%s__isnull" % field_path self.lookup_val = params.get(self.lookup_kwarg) - self.lookup_val_isnull = params.get(self.lookup_kwarg_isnull) + self.lookup_val_isnull = get_last_value_from_parameters( + params, self.lookup_kwarg_isnull + ) self.empty_value_display = model_admin.get_empty_value_display() parent_model, reverse_path = reverse_field_path(model, field_path) # Obey parent ModelAdmin queryset when deciding which options to show @@ -388,34 +576,62 @@ def __init__(self, field, request, params, model, model_admin, field_path): queryset = model_admin.get_queryset(request) else: queryset = parent_model._default_manager.all() - self.lookup_choices = queryset.distinct().order_by(field.name).values_list(field.name, flat=True) + self.lookup_choices = ( + queryset.distinct().order_by(field.name).values_list(field.name, flat=True) + ) super().__init__(field, request, params, model, model_admin, field_path) def expected_parameters(self): return [self.lookup_kwarg, self.lookup_kwarg_isnull] + def get_facet_counts(self, pk_attname, filtered_qs): + return { + f"{i}__c": models.Count( + pk_attname, + filter=models.Q( + (self.lookup_kwarg, value) + if value is not None + else (self.lookup_kwarg_isnull, True) + ), + ) + for i, value in enumerate(self.lookup_choices) + } + def choices(self, changelist): + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None yield { - 'selected': self.lookup_val is None and self.lookup_val_isnull is None, - 'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]), - 'display': _('All'), + "selected": self.lookup_val is None and self.lookup_val_isnull is None, + "query_string": changelist.get_query_string( + remove=[self.lookup_kwarg, self.lookup_kwarg_isnull] + ), + "display": _("All"), } include_none = False - for val in self.lookup_choices: + count = None + empty_title = self.empty_value_display + for i, val in enumerate(self.lookup_choices): + if add_facets: + count = facet_counts[f"{i}__c"] if val is None: include_none = True + empty_title = f"{empty_title} ({count})" if add_facets else empty_title continue val = str(val) yield { - 'selected': self.lookup_val == val, - 'query_string': changelist.get_query_string({self.lookup_kwarg: val}, [self.lookup_kwarg_isnull]), - 'display': val, + "selected": self.lookup_val is not None and val in self.lookup_val, + "query_string": changelist.get_query_string( + {self.lookup_kwarg: val}, [self.lookup_kwarg_isnull] + ), + "display": f"{val} ({count})" if add_facets else val, } if include_none: yield { - 'selected': bool(self.lookup_val_isnull), - 'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]), - 'display': self.empty_value_display, + "selected": bool(self.lookup_val_isnull), + "query_string": changelist.get_query_string( + {self.lookup_kwarg_isnull: "True"}, [self.lookup_kwarg] + ), + "display": empty_title, } @@ -424,9 +640,15 @@ def choices(self, changelist): class RelatedOnlyFieldListFilter(RelatedFieldListFilter): def field_choices(self, field, request, model_admin): - pk_qs = model_admin.get_queryset(request).distinct().values_list('%s__pk' % self.field_path, flat=True) + pk_qs = ( + model_admin.get_queryset(request) + .distinct() + .values_list("%s__pk" % self.field_path, flat=True) + ) ordering = self.field_admin_ordering(field, request, model_admin) - return field.get_choices(include_blank=False, limit_choices_to={'pk__in': pk_qs}, ordering=ordering) + return field.get_choices( + include_blank=False, limit_choices_to={"pk__in": pk_qs}, ordering=ordering + ) class EmptyFieldListFilter(FieldListFilter): @@ -434,41 +656,61 @@ def __init__(self, field, request, params, model, model_admin, field_path): if not field.empty_strings_allowed and not field.null: raise ImproperlyConfigured( "The list filter '%s' cannot be used with field '%s' which " - "doesn't allow empty strings and nulls." % ( + "doesn't allow empty strings and nulls." + % ( self.__class__.__name__, field.name, ) ) - self.lookup_kwarg = '%s__isempty' % field_path - self.lookup_val = params.get(self.lookup_kwarg) + self.lookup_kwarg = "%s__isempty" % field_path + self.lookup_val = get_last_value_from_parameters(params, self.lookup_kwarg) super().__init__(field, request, params, model, model_admin, field_path) + def get_lookup_condition(self): + lookup_conditions = [] + if self.field.empty_strings_allowed: + lookup_conditions.append((self.field_path, "")) + if self.field.null: + lookup_conditions.append((f"{self.field_path}__isnull", True)) + return models.Q.create(lookup_conditions, connector=models.Q.OR) + def queryset(self, request, queryset): if self.lookup_kwarg not in self.used_parameters: return queryset - if self.lookup_val not in ('0', '1'): + if self.lookup_val not in ("0", "1"): raise IncorrectLookupParameters - lookup_condition = models.Q() - if self.field.empty_strings_allowed: - lookup_condition |= models.Q(**{self.field_path: ''}) - if self.field.null: - lookup_condition |= models.Q(**{'%s__isnull' % self.field_path: True}) - if self.lookup_val == '1': + lookup_condition = self.get_lookup_condition() + if self.lookup_val == "1": return queryset.filter(lookup_condition) return queryset.exclude(lookup_condition) def expected_parameters(self): return [self.lookup_kwarg] + def get_facet_counts(self, pk_attname, filtered_qs): + lookup_condition = self.get_lookup_condition() + return { + "empty__c": models.Count(pk_attname, filter=lookup_condition), + "not_empty__c": models.Count(pk_attname, filter=~lookup_condition), + } + def choices(self, changelist): - for lookup, title in ( - (None, _('All')), - ('1', _('Empty')), - ('0', _('Not empty')), + add_facets = changelist.add_facets + facet_counts = self.get_facet_queryset(changelist) if add_facets else None + for lookup, title, count_field in ( + (None, _("All"), None), + ("1", _("Empty"), "empty__c"), + ("0", _("Not empty"), "not_empty__c"), ): + if add_facets: + if count_field is not None: + count = facet_counts[count_field] + title = f"{title} ({count})" yield { - 'selected': self.lookup_val == lookup, - 'query_string': changelist.get_query_string({self.lookup_kwarg: lookup}), - 'display': title, + "selected": self.lookup_val == lookup, + "query_string": changelist.get_query_string( + {self.lookup_kwarg: lookup} + ), + "display": title, } diff --git a/django/contrib/admin/forms.py b/django/contrib/admin/forms.py index ee275095e30d..bbb072bdb213 100644 --- a/django/contrib/admin/forms.py +++ b/django/contrib/admin/forms.py @@ -7,24 +7,25 @@ class AdminAuthenticationForm(AuthenticationForm): """ A custom authentication form used in the admin app. """ + error_messages = { **AuthenticationForm.error_messages, - 'invalid_login': _( + "invalid_login": _( "Please enter the correct %(username)s and password for a staff " "account. Note that both fields may be case-sensitive." ), } - required_css_class = 'required' + required_css_class = "required" def confirm_login_allowed(self, user): super().confirm_login_allowed(user) if not user.is_staff: raise ValidationError( - self.error_messages['invalid_login'], - code='invalid_login', - params={'username': self.username_field.verbose_name} + self.error_messages["invalid_login"], + code="invalid_login", + params={"username": self.username_field.verbose_name}, ) class AdminPasswordChangeForm(PasswordChangeForm): - required_css_class = 'required' + required_css_class = "required" diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py index 56d7970d2a59..51450d1d9e09 100644 --- a/django/contrib/admin/helpers.py +++ b/django/contrib/admin/helpers.py @@ -2,52 +2,75 @@ from django import forms from django.contrib.admin.utils import ( - display_for_field, flatten_fieldsets, help_text_for_field, label_for_field, + display_for_field, + flatten_fieldsets, + help_text_for_field, + label_for_field, lookup_field, + quote, ) from django.core.exceptions import ObjectDoesNotExist -from django.db.models import ManyToManyRel +from django.db.models.fields.related import ( + ForeignObjectRel, + ManyToManyRel, + OneToOneField, +) from django.forms.utils import flatatt from django.template.defaultfilters import capfirst, linebreaksbr +from django.urls import NoReverseMatch, reverse +from django.utils.functional import cached_property from django.utils.html import conditional_escape, format_html from django.utils.safestring import mark_safe -from django.utils.translation import gettext, gettext_lazy as _ +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ -ACTION_CHECKBOX_NAME = '_selected_action' +ACTION_CHECKBOX_NAME = "_selected_action" class ActionForm(forms.Form): - action = forms.ChoiceField(label=_('Action:')) + action = forms.ChoiceField(label=_("Action:")) select_across = forms.BooleanField( - label='', + label="", required=False, initial=0, - widget=forms.HiddenInput({'class': 'select-across'}), + widget=forms.HiddenInput({"class": "select-across"}), ) -checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False) - - class AdminForm: - def __init__(self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None): + def __init__( + self, + form, + fieldsets, + prepopulated_fields, + readonly_fields=None, + model_admin=None, + ): self.form, self.fieldsets = form, fieldsets - self.prepopulated_fields = [{ - 'field': form[field_name], - 'dependencies': [form[f] for f in dependencies] - } for field_name, dependencies in prepopulated_fields.items()] + self.prepopulated_fields = [ + {"field": form[field_name], "dependencies": [form[f] for f in dependencies]} + for field_name, dependencies in prepopulated_fields.items() + ] self.model_admin = model_admin if readonly_fields is None: readonly_fields = () self.readonly_fields = readonly_fields + def __repr__(self): + return ( + f"<{self.__class__.__qualname__}: " + f"form={self.form.__class__.__qualname__} " + f"fieldsets={self.fieldsets!r}>" + ) + def __iter__(self): for name, options in self.fieldsets: yield Fieldset( - self.form, name, + self.form, + name, readonly_fields=self.readonly_fields, model_admin=self.model_admin, - **options + **options, ) @property @@ -58,33 +81,55 @@ def errors(self): def non_field_errors(self): return self.form.non_field_errors + @property + def fields(self): + return self.form.fields + + @property + def is_bound(self): + return self.form.is_bound + @property def media(self): media = self.form.media for fs in self: - media = media + fs.media + media += fs.media return media class Fieldset: - def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(), - description=None, model_admin=None): + def __init__( + self, + form, + name=None, + readonly_fields=(), + fields=(), + classes=(), + description=None, + model_admin=None, + ): self.form = form self.name, self.fields = name, fields - self.classes = ' '.join(classes) + self.classes = " ".join(classes) self.description = description self.model_admin = model_admin self.readonly_fields = readonly_fields @property def media(self): - if 'collapse' in self.classes: - return forms.Media(js=['admin/js/collapse.js']) return forms.Media() + @cached_property + def is_collapsible(self): + if any(field in self.fields for field in self.form.errors): + return False + return "collapse" in self.classes + def __iter__(self): for field in self.fields: - yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin) + yield Fieldline( + self.form, field, self.readonly_fields, model_admin=self.model_admin + ) class Fieldline: @@ -106,15 +151,19 @@ def __init__(self, form, field, readonly_fields=None, model_admin=None): def __iter__(self): for i, field in enumerate(self.fields): if field in self.readonly_fields: - yield AdminReadonlyField(self.form, field, is_first=(i == 0), model_admin=self.model_admin) + yield AdminReadonlyField( + self.form, field, is_first=(i == 0), model_admin=self.model_admin + ) else: yield AdminField(self.form, field, is_first=(i == 0)) def errors(self): return mark_safe( - '\n'.join( - self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields - ).strip('\n') + "\n".join( + self.form[f].errors.as_ul() + for f in self.fields + if f not in self.readonly_fields + ).strip("\n") ) @@ -129,18 +178,19 @@ def label_tag(self): classes = [] contents = conditional_escape(self.field.label) if self.is_checkbox: - classes.append('vCheckboxLabel') + classes.append("vCheckboxLabel") if self.field.field.required: - classes.append('required') + classes.append("required") if not self.is_first: - classes.append('inline') - attrs = {'class': ' '.join(classes)} if classes else {} + classes.append("inline") + attrs = {"class": " ".join(classes)} if classes else {} # checkboxes should not have a label suffix as the checkbox appears # to the left of the label. return self.field.label_tag( - contents=mark_safe(contents), attrs=attrs, - label_suffix='' if self.is_checkbox else None, + contents=mark_safe(contents), + attrs=attrs, + label_suffix="" if self.is_checkbox else None, ) def errors(self): @@ -153,7 +203,7 @@ def __init__(self, form, field, is_first, model_admin=None): # {{ field.name }} must be a useful class name to identify the field. # For convenience, store other field-related data here too. if callable(field): - class_name = field.__name__ if field.__name__ != '' else '' + class_name = field.__name__ if field.__name__ != "" else "" else: class_name = field @@ -167,11 +217,17 @@ def __init__(self, form, field, is_first, model_admin=None): else: help_text = help_text_for_field(class_name, form._meta.model) + if field in form.fields: + is_hidden = form.fields[field].widget.is_hidden + else: + is_hidden = False + self.field = { - 'name': class_name, - 'label': label, - 'help_text': help_text, - 'field': field, + "name": class_name, + "label": label, + "help_text": help_text, + "field": field, + "is_hidden": is_hidden, } self.form = form self.model_admin = model_admin @@ -184,12 +240,37 @@ def label_tag(self): attrs = {} if not self.is_first: attrs["class"] = "inline" - label = self.field['label'] - return format_html('{}{}', flatatt(attrs), capfirst(label), self.form.label_suffix) + label = self.field["label"] + return format_html( + "{}{}", + flatatt(attrs), + capfirst(label), + self.form.label_suffix, + ) + + def get_admin_url(self, remote_field, remote_obj): + url_name = "admin:%s_%s_change" % ( + remote_field.model._meta.app_label, + remote_field.model._meta.model_name, + ) + try: + url = reverse( + url_name, + args=[quote(remote_obj.pk)], + current_app=self.model_admin.admin_site.name, + ) + return format_html('{}', url, remote_obj) + except NoReverseMatch: + return str(remote_obj) def contents(self): from django.contrib.admin.templatetags.admin_list import _boolean_icon - field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin + + field, obj, model_admin = ( + self.field["field"], + self.form.instance, + self.model_admin, + ) try: f, attr, value = lookup_field(field, obj, model_admin) except (AttributeError, ValueError, ObjectDoesNotExist): @@ -199,10 +280,10 @@ def contents(self): widget = self.form[field].field.widget # This isn't elegant but suffices for contrib.auth's # ReadOnlyPasswordHashWidget. - if getattr(widget, 'read_only', False): + if getattr(widget, "read_only", False): return widget.render(field, value) if f is None: - if getattr(attr, 'boolean', False): + if getattr(attr, "boolean", False): result_repr = _boolean_icon(value) else: if hasattr(value, "__html__"): @@ -212,6 +293,11 @@ def contents(self): else: if isinstance(f.remote_field, ManyToManyRel) and value is not None: result_repr = ", ".join(map(str, value.all())) + elif ( + isinstance(f.remote_field, (ForeignObjectRel, OneToOneField)) + and value is not None + ): + result_repr = self.get_admin_url(f.remote_field, value) else: result_repr = display_for_field(value, f, self.empty_value_display) result_repr = linebreaksbr(result_repr) @@ -222,10 +308,20 @@ class InlineAdminFormSet: """ A wrapper around an inline formset for use in the admin system. """ - def __init__(self, inline, formset, fieldsets, prepopulated_fields=None, - readonly_fields=None, model_admin=None, has_add_permission=True, - has_change_permission=True, has_delete_permission=True, - has_view_permission=True): + + def __init__( + self, + inline, + formset, + fieldsets, + prepopulated_fields=None, + readonly_fields=None, + model_admin=None, + has_add_permission=True, + has_change_permission=True, + has_delete_permission=True, + has_view_permission=True, + ): self.opts = inline self.formset = formset self.fieldsets = fieldsets @@ -236,7 +332,7 @@ def __init__(self, inline, formset, fieldsets, prepopulated_fields=None, if prepopulated_fields is None: prepopulated_fields = {} self.prepopulated_fields = prepopulated_fields - self.classes = ' '.join(inline.classes) if inline.classes else '' + self.classes = " ".join(inline.classes) if inline.classes else "" self.has_add_permission = has_add_permission self.has_change_permission = has_change_permission self.has_delete_permission = has_delete_permission @@ -246,25 +342,43 @@ def __iter__(self): if self.has_change_permission: readonly_fields_for_editing = self.readonly_fields else: - readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets(self.fieldsets) + readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets( + self.fieldsets + ) - for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()): + for form, original in zip( + self.formset.initial_forms, self.formset.get_queryset() + ): view_on_site_url = self.opts.get_view_on_site_url(original) yield InlineAdminForm( - self.formset, form, self.fieldsets, self.prepopulated_fields, - original, readonly_fields_for_editing, model_admin=self.opts, + self.formset, + form, + self.fieldsets, + self.prepopulated_fields, + original, + readonly_fields_for_editing, + model_admin=self.opts, view_on_site_url=view_on_site_url, ) for form in self.formset.extra_forms: yield InlineAdminForm( - self.formset, form, self.fieldsets, self.prepopulated_fields, - None, self.readonly_fields, model_admin=self.opts, + self.formset, + form, + self.fieldsets, + self.prepopulated_fields, + None, + self.readonly_fields, + model_admin=self.opts, ) if self.has_add_permission: yield InlineAdminForm( - self.formset, self.formset.empty_form, - self.fieldsets, self.prepopulated_fields, None, - self.readonly_fields, model_admin=self.opts, + self.formset, + self.formset.empty_form, + self.fieldsets, + self.prepopulated_fields, + None, + self.readonly_fields, + model_admin=self.opts, ) def fields(self): @@ -276,57 +390,81 @@ def fields(self): if fk and fk.name == field_name: continue if not self.has_change_permission or field_name in self.readonly_fields: + form_field = empty_form.fields.get(field_name) + widget_is_hidden = False + if form_field is not None: + widget_is_hidden = form_field.widget.is_hidden yield { - 'name': field_name, - 'label': meta_labels.get(field_name) or label_for_field( + "name": field_name, + "label": meta_labels.get(field_name) + or label_for_field( field_name, self.opts.model, self.opts, form=empty_form, ), - 'widget': {'is_hidden': False}, - 'required': False, - 'help_text': meta_help_texts.get(field_name) or help_text_for_field(field_name, self.opts.model), + "widget": {"is_hidden": widget_is_hidden}, + "required": False, + "help_text": meta_help_texts.get(field_name) + or help_text_for_field(field_name, self.opts.model), } else: form_field = empty_form.fields[field_name] label = form_field.label if label is None: - label = label_for_field(field_name, self.opts.model, self.opts, form=empty_form) + label = label_for_field( + field_name, self.opts.model, self.opts, form=empty_form + ) yield { - 'name': field_name, - 'label': label, - 'widget': form_field.widget, - 'required': form_field.required, - 'help_text': form_field.help_text, + "name": field_name, + "label": label, + "widget": form_field.widget, + "required": form_field.required, + "help_text": form_field.help_text, } def inline_formset_data(self): verbose_name = self.opts.verbose_name - return json.dumps({ - 'name': '#%s' % self.formset.prefix, - 'options': { - 'prefix': self.formset.prefix, - 'addText': gettext('Add another %(verbose_name)s') % { - 'verbose_name': capfirst(verbose_name), + return json.dumps( + { + "name": "#%s" % self.formset.prefix, + "options": { + "prefix": self.formset.prefix, + "addText": gettext("Add another %(verbose_name)s") + % { + "verbose_name": capfirst(verbose_name), + }, + "deleteText": gettext("Remove"), }, - 'deleteText': gettext('Remove'), } - }) + ) @property def forms(self): return self.formset.forms - @property + @cached_property + def is_collapsible(self): + if any(self.formset.errors): + return False + return "collapse" in self.classes + def non_form_errors(self): - return self.formset.non_form_errors + return self.formset.non_form_errors() + + @property + def is_bound(self): + return self.formset.is_bound + + @property + def total_form_count(self): + return self.formset.total_form_count @property def media(self): media = self.opts.media + self.formset.media for fs in self: - media = media + fs.media + media += fs.media return media @@ -334,31 +472,56 @@ class InlineAdminForm(AdminForm): """ A wrapper around an inline form for use in the admin system. """ - def __init__(self, formset, form, fieldsets, prepopulated_fields, original, - readonly_fields=None, model_admin=None, view_on_site_url=None): + + def __init__( + self, + formset, + form, + fieldsets, + prepopulated_fields, + original, + readonly_fields=None, + model_admin=None, + view_on_site_url=None, + ): self.formset = formset self.model_admin = model_admin self.original = original self.show_url = original and view_on_site_url is not None self.absolute_url = view_on_site_url - super().__init__(form, fieldsets, prepopulated_fields, readonly_fields, model_admin) + super().__init__( + form, fieldsets, prepopulated_fields, readonly_fields, model_admin + ) def __iter__(self): for name, options in self.fieldsets: yield InlineFieldset( - self.formset, self.form, name, self.readonly_fields, - model_admin=self.model_admin, **options + self.formset, + self.form, + name, + self.readonly_fields, + model_admin=self.model_admin, + **options, ) def needs_explicit_pk_field(self): return ( # Auto fields are editable, so check for auto or non-editable pk. - self.form._meta.model._meta.auto_field or not self.form._meta.model._meta.pk.editable or + self.form._meta.model._meta.auto_field + or not self.form._meta.model._meta.pk.editable + # The pk can be editable, but excluded from the inline. + or ( + self.form._meta.exclude + and self.form._meta.model._meta.pk.name in self.form._meta.exclude + ) + or # Also search any parents for an auto field. (The pk info is # propagated to child models so that does not need to be checked # in parents.) - any(parent._meta.auto_field or not parent._meta.model._meta.pk.editable - for parent in self.form._meta.model._meta.get_parent_list()) + any( + parent._meta.auto_field or not parent._meta.model._meta.pk.editable + for parent in self.form._meta.model._meta.all_parents + ) ) def pk_field(self): @@ -373,11 +536,8 @@ def fk_field(self): def deletion_field(self): from django.forms.formsets import DELETION_FIELD_NAME - return AdminField(self.form, DELETION_FIELD_NAME, False) - def ordering_field(self): - from django.forms.formsets import ORDERING_FIELD_NAME - return AdminField(self.form, ORDERING_FIELD_NAME, False) + return AdminField(self.form, DELETION_FIELD_NAME, False) class InlineFieldset(Fieldset): @@ -389,11 +549,14 @@ def __iter__(self): fk = getattr(self.formset, "fk", None) for field in self.fields: if not fk or fk.name != field: - yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin) + yield Fieldline( + self.form, field, self.readonly_fields, model_admin=self.model_admin + ) class AdminErrorList(forms.utils.ErrorList): """Store errors for the form/formsets in an add/change view.""" + def __init__(self, form, inline_formsets): super().__init__() diff --git a/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/django/contrib/admin/locale/af/LC_MESSAGES/django.mo index 0e5afe06b21e..bb91c2e475f5 100644 Binary files a/django/contrib/admin/locale/af/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/af/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/af/LC_MESSAGES/django.po b/django/contrib/admin/locale/af/LC_MESSAGES/django.po index 1843123da5d9..ff97eaecd249 100644 --- a/django/contrib/admin/locale/af/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/af/LC_MESSAGES/django.po @@ -3,17 +3,17 @@ # Translators: # Christopher Penkin, 2012 # Christopher Penkin, 2012 -# F Wolff , 2019 +# F Wolff , 2019-2020,2023 # Pi Delport , 2012 # Pi Delport , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-06-03 14:32+0000\n" -"Last-Translator: F Wolff \n" -"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: F Wolff , 2019-2020,2023\n" +"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" "af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +21,10 @@ msgstr "" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Skrap gekose %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Het %(count)d %(items)s suksesvol geskrap." @@ -32,10 +36,6 @@ msgstr "Kan %(name)s nie skrap nie" msgid "Are you sure?" msgstr "Is u seker?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Skrap gekose %(verbose_name_plural)s" - msgid "Administration" msgstr "Administrasie" @@ -72,6 +72,12 @@ msgstr "Geen datum" msgid "Has date" msgstr "Het datum" +msgid "Empty" +msgstr "Leeg" + +msgid "Not empty" +msgstr "Nie leeg nie" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -129,22 +135,22 @@ msgid "log entries" msgstr "log-inskrywingings" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "Het “%(object)s” bygevoeg." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Het “%(object)s” verander — %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Het “%(object)s” gewysig — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Het “%(object)s” verwyder." +msgid "Deleted “%(object)s.”" +msgstr "Het “%(object)s” geskrap." msgid "LogEntry Object" msgstr "LogEntry-objek" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "Het {name} “{object}” bygevoeg." msgid "Added." @@ -154,15 +160,15 @@ msgid "and" msgstr "en" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Het {fields} vir {name} “{object}” gewysig." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Het {fields} vir {name} “{object}” bygevoeg." #, python-brace-format msgid "Changed {fields}." msgstr "Het {fields} verander." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "Het {name} “{object}” geskrap." msgid "No fields changed." @@ -171,12 +177,14 @@ msgstr "Geen velde het verander nie." msgid "None" msgstr "Geen" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "Hou “Ctrl” in (of “⌘” op ’n Mac) om meer as een te kies." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "Hou “Control” in (of “Command” op ’n Mac) om meer as een te kies." + +msgid "Select this object for an action - {}" +msgstr "Kies dié objek vir ’n aksie - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "Die {name} “{obj}” is suksesvol bygevoeg." msgid "You may edit it again below." @@ -184,35 +192,30 @@ msgstr "Dit kan weer hieronder gewysig word." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Nog ’n {name} kan onder bygevoeg " -"word." +"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"Die {name} “{obj}” is suksesvol gewysig. Dit kan weer hieronder gewysig word." +"Die {name} “{obj}” is suksesvol gewysig. Redigeer dit gerus weer onder." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"Die {name} “{obj}” is suksesvol bygevoeg. Dit kan weer hieronder gewysig " -"word." +"Die {name} “{obj}” is suksesvol bygevoeg. Redigeer dit gerus weer onder." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Die {name} “{obj}” is suksesvol gewysig. Nog ’n {name} kan onder bygevoeg " -"word." +"Die {name} “{obj}” is suksesvol bygevoeg. Voeg gerus nog ’n {name} onder by." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "Die {name} “{obj}” is suksesvol gewysig." msgid "" @@ -226,12 +229,12 @@ msgid "No action selected." msgstr "Geen aksie gekies nie." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "Die %(name)s “%(obj)s” is suksesvol geskrap." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "Die %(name)s met ID “%(key)s” bestaan nie. Miskien is dit geskrap?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s met ID “%(key)s” bestaan nie. Is dit dalk geskrap?" #, python-format msgid "Add %s" @@ -268,8 +271,9 @@ msgstr "0 uit %(cnt)s gekies" msgid "Change history: %s" msgstr "Verander geskiedenis: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -301,8 +305,8 @@ msgstr "%(app)s-administrasie" msgid "Page not found" msgstr "Bladsy nie gevind nie" -msgid "We're sorry, but the requested page could not be found." -msgstr "Jammer, maar die aangevraagde bladsy kon nie gevind word nie." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Jammer! Die aangevraagde bladsy kon nie gevind word nie." msgid "Home" msgstr "Tuis" @@ -317,12 +321,11 @@ msgid "Server Error (500)" msgstr "Bedienerfout (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"’n Fout het voorgekom. Dit is per e-pos gerapporteer aan die " -"werfadministrateurs en behoort binnekort reggestel te word. Dankie vir u " -"geduld." +"’n Fout het voorgekom Dit is via e-pos aan die werfadministrateurs " +"gerapporteer en behoort binnekort reggestel te word. Dankie vir u geduld." msgid "Run the selected action" msgstr "Voer die gekose aksie uit" @@ -340,12 +343,28 @@ msgstr "Kies al %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Verwyder keuses" +msgid "Breadcrumbs" +msgstr "Broodkrummels" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelle in die %(name)s-toepassing" + +msgid "Add" +msgstr "Voeg by" + +msgid "View" +msgstr "Bekyk" + +msgid "You don’t have permission to view or edit anything." +msgstr "U het nie regte om enigiets te sien of te redigeer nie." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Vul eers ’n gebruikersnaam en wagwoord in. Daarna kan mens meer " -"gebruikersopsies wysig." +"Gee eerstens ’n gebruikernaam en wagwoord. Daarna kan meer gebruikervelde " +"geredigeer word." msgid "Enter a username and password." msgstr "Vul ’n gebruikersnaam en wagwoord in." @@ -354,15 +373,17 @@ msgid "Change password" msgstr "Verander wagwoord" msgid "Please correct the error below." -msgstr "Maak die onderstaande fout asb. reg." - -msgid "Please correct the errors below." -msgstr "Maak die onderstaande foute asb. reg." +msgid_plural "Please correct the errors below." +msgstr[0] "Korrigeer asb. die fout hier onder." +msgstr[1] "Korrigeer asb. die foute hier onder." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Vul ’n nuwe wagwoord vir gebruiker %(username)s in." +msgid "Skip to main content" +msgstr "Gaan direk na hoofinhoud" + msgid "Welcome," msgstr "Welkom," @@ -388,6 +409,15 @@ msgstr "Bekyk op werf" msgid "Filter" msgstr "Filtreer" +msgid "Hide counts" +msgstr "Versteek tellings" + +msgid "Show counts" +msgstr "Wys tellings" + +msgid "Clear all filters" +msgstr "Verwyder alle filters" + msgid "Remove from sorting" msgstr "Verwyder uit sortering" @@ -398,6 +428,15 @@ msgstr "Sorteerprioriteit: %(priority_number)s" msgid "Toggle sorting" msgstr "Wissel sortering" +msgid "Toggle theme (current theme: auto)" +msgstr "Wissel tema (tans: outomaties)" + +msgid "Toggle theme (current theme: light)" +msgstr "Wissel tema (tans: lig)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Wissel tema (tans: donker)" + msgid "Delete" msgstr "Skrap" @@ -430,7 +469,7 @@ msgstr "" msgid "Objects" msgstr "Objekte" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Ja, ek is seker" msgid "No, take me back" @@ -464,9 +503,6 @@ msgstr "" "Wil u definitief die gekose %(objects_name)s skrap? Al die volgende objekte " "en hul verwante items sal geskrap word:" -msgid "View" -msgstr "Bekyk" - msgid "Delete?" msgstr "Skrap?" @@ -477,16 +513,6 @@ msgstr " Volgens %(filter_title)s " msgid "Summary" msgstr "Opsomming" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle in die %(name)s-toepassing" - -msgid "Add" -msgstr "Voeg by" - -msgid "You don't have permission to view or edit anything." -msgstr "U het nie toestemming om enigiets te sien of te wysig nie." - msgid "Recent actions" msgstr "Onlangse aksies" @@ -496,17 +522,26 @@ msgstr "My aksies" msgid "None available" msgstr "Niks beskikbaar nie" +msgid "Added:" +msgstr "Bygevoeg:" + +msgid "Changed:" +msgstr "Gewysig:" + +msgid "Deleted:" +msgstr "Geskrap:" + msgid "Unknown content" msgstr "Onbekende inhoud" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Iets is verkeerd met die databasisinstallasie. Maak seker dat die gepaste " -"databasistabelle geskep is, en maak seker dat die databasis leesbaar is deur " -"die gepaste gebruiker." +"Iets is fout met die databasisinstallasie. Maak seker die gepaste " +"databasistabelle is geskep en maak seker die databasis is leesbaar deur die " +"gepaste gebruiker." #, python-format msgid "" @@ -519,6 +554,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Wagwoord of gebruikersnaam vergeet?" +msgid "Toggle navigation" +msgstr "" + +msgid "Sidebar" +msgstr "Kantbalk" + +msgid "Start typing to filter…" +msgstr "Tik om te filtreer..." + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Datum/tyd" @@ -528,12 +575,17 @@ msgstr "Gebruiker" msgid "Action" msgstr "Aksie" +msgid "entry" +msgid_plural "entries" +msgstr[0] "inskrywing" +msgstr[1] "inskrywings" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Hierdie item het nie ’n veranderingsgeskiedenis nie. Dit is waarskynlik nie " -"deur middel van hierdie adminwerf bygevoeg nie." +"Dié objek het nie 'n wysigingsgeskiedenis. Dit is waarskynlik nie deur dié " +"adminwerf bygevoeg nie." msgid "Show all" msgstr "Wys almal" @@ -584,7 +636,11 @@ msgstr "Voeg nog ’n %(model)s by" msgid "Delete selected %(model)s" msgstr "Skrap gekose %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Wys gekose %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "" "Dankie vir die kwaliteittyd wat u met die webwerf deurgebring het vandag." @@ -598,11 +654,11 @@ msgid "Your password was changed." msgstr "Die wagwoord is verander." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Tik die ou wagwoord ter wille van sekuriteit, en dan die nuwe wagwoord twee " -"keer so dat ons kan seker wees dat dit korrek ingetik is." +"Gee asb. die ou wagwoord t.w.v. sekuriteit, en gee dan die nuwe wagwoord " +"twee keer sodat ons kan verifieer dat dit korrek getik is." msgid "Change my password" msgstr "Verander my wagwoord" @@ -637,19 +693,18 @@ msgstr "" "is. Vra gerus ’n nuwe een aan." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Instruksies vir die instel van u wagwoord is per e-pos gestuur as ’n " -"rekening bestaan met die e-posadres wat u gegee het. Die e-pos behoort " -"binnekort daar te wees." +"Ons het instruksies gestuur om ’n wagwoord in te stel as ’n rekening bestaan " +"met die gegewe e-posadres. Dit behoort binnekort afgelewer te word." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Indien u nie ’n e-pos ontvang nie, maak seker dat die getikte adres die een " -"is waarmee u geregistreer het, en kontroleer ook u gemorspos." +"As u geen e-pos ontvang nie, kontroleer dat die e-posadres waarmee " +"geregistreer is, gegee is, en kontroleer die gemorspos." #, python-format msgid "" @@ -662,8 +717,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Gaan asseblief na die volgende bladsy en kies ’n nuwe wagwoord:" -msgid "Your username, in case you've forgotten:" -msgstr "Jou gebruikersnaam, in geval jy vergeet het:" +msgid "Your username, in case you’ve forgotten:" +msgstr "U gebruikernaam vir ingeval u vergeet het:" msgid "Thanks for using our site!" msgstr "Dankie vir die gebruik van ons webwerf!" @@ -673,11 +728,11 @@ msgid "The %(site_name)s team" msgstr "Die %(site_name)s span" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Wagwoord vergeet? Tik u e-posadres hieronder in, en ons pos instruksies vir " -"die instel van ’n nuwe een." +"Die wagwoord vergeet? Tik u e-posadres hieronder en ons sal instruksies vir " +"die instel van ’n nuwe wagwoord stuur." msgid "Email address:" msgstr "E-posadres:" @@ -685,6 +740,9 @@ msgstr "E-posadres:" msgid "Reset my password" msgstr "Herstel my wagwoord" +msgid "Select all objects on this page for an action" +msgstr "Kies alle objekte op dié bladsy vir ’n aksie" + msgid "All dates" msgstr "Alle datums" diff --git a/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo index 896cad2d697e..603fc26cf06e 100644 Binary files a/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po index 816ef6e7f0a8..de1f88cfc59e 100644 --- a/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/af/LC_MESSAGES/djangojs.po @@ -1,17 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# F Wolff , 2019 +# F Wolff , 2019,2023 # Pi Delport , 2013 # Pi Delport , 2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-01-04 18:43+0000\n" -"Last-Translator: F Wolff \n" -"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: F Wolff , 2019,2023\n" +"Language-Team: Afrikaans (http://app.transifex.com/django/django/language/" "af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -63,6 +63,10 @@ msgstr "" "Hierdie is die lys gekose %s. Verwyder gerus deur hulle in die boksie " "hieronder te merk en dan die “Verwyder”-knoppie tussen die boksies te klik." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Tik in hierdie blokkie om die lys gekose %s te filtreer." + msgid "Remove all" msgstr "Verwyder almal" @@ -70,6 +74,12 @@ msgstr "Verwyder almal" msgid "Click to remove all chosen %s at once." msgstr "Klik om al die %s gelyktydig te verwyder." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "" +msgstr[1] "" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s van %(cnt)s gekies" @@ -83,22 +93,20 @@ msgstr "" "’n aksie uit te voer, sal ongestoorde veranderinge verlore gaan." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"U het ’n aksie gekies, maar nog nie die veranderinge aan individuele velde " -"gestoor nie. Klik asb. OK om te stoor. Dit sal nodig wees om weer die aksie " -"uit te voer." +"’n Aksie is gekies, maar die veranderinge aan individuele velde is nog nie " +"gestoor nie. Klik OK om te stoor. Die aksie sal weer uitgevoer moet word." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"U het ’n aksie gekies en het nie enige veranderinge aan individuele velde " -"aangebring nie. U soek waarskynlik na die Gaan-knoppie eerder as die Stoor-" -"knoppie." +"’n Aksie is gekies en geen veranderinge aan individuele velde is gemaak nie. " +"Dalk op soek na die Gaan-knoppie in plaas van die Stoor-knoppie?" msgid "Now" msgstr "Nou" @@ -184,6 +192,103 @@ msgstr "November" msgid "December" msgstr "Desember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mrt" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mei" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" + +msgid "Sunday" +msgstr "Sondag" + +msgid "Monday" +msgstr "Maandag" + +msgid "Tuesday" +msgstr "Dinsdag" + +msgid "Wednesday" +msgstr "Woensdag" + +msgid "Thursday" +msgstr "Donderdag" + +msgid "Friday" +msgstr "Vrydag" + +msgid "Saturday" +msgstr "Saterdag" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Son" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Ma" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Di" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Wo" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Do" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Vr" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sa" + msgctxt "one letter Sunday" msgid "S" msgstr "S" diff --git a/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo index 51148aa86e7a..1e0d68032d41 100644 Binary files a/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ar/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ar/LC_MESSAGES/django.po b/django/contrib/admin/locale/ar/LC_MESSAGES/django.po index 80f4ce3947a5..f1b1725eb76a 100644 --- a/django/contrib/admin/locale/ar/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ar/LC_MESSAGES/django.po @@ -1,17 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Bashar Al-Abdulhadi, 2015-2016,2018 +# Bashar Al-Abdulhadi, 2015-2016,2018,2020-2021 # Bashar Al-Abdulhadi, 2014 # Eyad Toma , 2013 # Jannis Leidel , 2011 +# Muaaz Alsaied, 2020 +# Tony xD , 2020 +# صفا الفليج , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-10-15 21:11+0000\n" +"Last-Translator: Bashar Al-Abdulhadi\n" "Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,21 +23,21 @@ msgstr "" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "احذف %(verbose_name_plural)s المحدّدة" + #, python-format msgid "Successfully deleted %(count)d %(items)s." -msgstr "تم حذف %(count)d %(items)s بنجاح." +msgstr "نجح حذف %(count)d من %(items)s." #, python-format msgid "Cannot delete %(name)s" -msgstr "لا يمكن حذف %(name)s" +msgstr "تعذّر حذف %(name)s" msgid "Are you sure?" msgstr "هل أنت متأكد؟" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف سجلات %(verbose_name_plural)s المحددة" - msgid "Administration" msgstr "الإدارة" @@ -71,29 +74,35 @@ msgstr "لا يوجد أي تاريخ" msgid "Has date" msgstr "به تاريخ" +msgid "Empty" +msgstr "فارغ" + +msgid "Not empty" +msgstr "غير فارغ" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"الرجاء إدخال ال%(username)s و كلمة المرور الصحيحين لحساب الطاقم. الحقلين " -"حساسين وضعية الاحرف." +"من فضلك أدخِل قيمة %(username)s الصحيحة وكلمة السر لحساب الطاقم الإداري. " +"الحقلين حسّاسين لحالة الأحرف." msgid "Action:" -msgstr "إجراء:" +msgstr "الإجراء:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "إضافة سجل %(verbose_name)s آخر" +msgstr "أضِف %(verbose_name)s آخر" msgid "Remove" -msgstr "أزل" +msgstr "أزِل" msgid "Addition" msgstr "إضافة" msgid "Change" -msgstr "عدّل" +msgstr "تعديل" msgid "Deletion" msgstr "حذف" @@ -108,134 +117,130 @@ msgid "content type" msgstr "نوع المحتوى" msgid "object id" -msgstr "معرف العنصر" +msgstr "معرّف الكائن" #. Translators: 'repr' means representation #. (https://docs.python.org/library/functions.html#repr) msgid "object repr" -msgstr "ممثل العنصر" +msgstr "التمثيل البصري للكائن" msgid "action flag" -msgstr "علامة الإجراء" +msgstr "راية الإجراء" msgid "change message" -msgstr "غيّر الرسالة" +msgstr "رسالة التغيير" msgid "log entry" -msgstr "مُدخل السجل" +msgstr "مدخلة سجلات" msgid "log entries" -msgstr "مُدخلات السجل" +msgstr "مدخلات السجلات" #, python-format -msgid "Added \"%(object)s\"." -msgstr "تم إضافة العناصر \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "أُضيف ”%(object)s“." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "تم تعديل العناصر \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "عُدّل ”%(object)s“ — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "تم حذف العناصر \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "حُذف ”%(object)s“." msgid "LogEntry Object" msgstr "كائن LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "تم إضافة {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "أُضيف {name} ‏”{object}“." msgid "Added." -msgstr "تمت الإضافة." +msgstr "أُضيف." msgid "and" msgstr "و" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "تم تغيير {fields} لـ {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "تغيّرت {fields} ‏{name} ‏”{object}“." #, python-brace-format msgid "Changed {fields}." -msgstr "تم تغيير {fields}." +msgstr "تغيّرت {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "تم حذف {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "حُذف {name} ‏”{object}“." msgid "No fields changed." -msgstr "لم يتم تغيير أية حقول." +msgstr "لم يتغيّر أي حقل." msgid "None" -msgstr "لاشيء" +msgstr "بلا" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"استمر بالضغط على مفتاح \"Control\", او \"Command\" على أجهزة الماك, لإختيار " -"أكثر من أختيار واحد." +"اضغط مفتاح ”Contrl“ (أو ”Command“ على أجهزة ماك) مطوّلًا لتحديد أكثر من عنصر." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" +msgid "The {name} “{obj}” was added successfully." +msgstr "نجحت إضافة {name} ‏”{obj}“." msgid "You may edit it again below." -msgstr "" +msgstr "يمكنك تعديله ثانيةً أسفله." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك إضافة {name} آخر أسفله." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "نجح تعديل {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "نجحت إضافة {name} ‏”{obj}“. يمكنك تعديله ثانيةً أسفله." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "" +msgstr "تمت إضافة {name} “{obj}” بنجاح، يمكنك إضافة {name} أخر بالأسفل." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "نجحت إضافة {name} ‏”{obj}“." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." -msgstr "يجب تحديد العناصر لتطبيق الإجراءات عليها. لم يتم تغيير أية عناصر." +msgstr "عليك تحديد العناصر لتطبيق الإجراءات عليها. لم يتغيّر أيّ عنصر." msgid "No action selected." -msgstr "لم يحدد أي إجراء." +msgstr "لا إجراء محدّد." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "تم حذف %(name)s \"%(obj)s\" بنجاح." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "نجح حذف %(name)s ‏”%(obj)s“." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "ما من %(name)s له المعرّف ”%(key)s“. لربّما حُذف أساسًا؟" #, python-format msgid "Add %s" -msgstr "أضف %s" +msgstr "إضافة %s" #, python-format msgid "Change %s" -msgstr "عدّل %s" +msgstr "تعديل %s" #, python-format msgid "View %s" -msgstr "" +msgstr "عرض %s" msgid "Database error" msgstr "خطـأ في قاعدة البيانات" @@ -301,7 +306,7 @@ msgstr "إدارة %(app)s " msgid "Page not found" msgstr "تعذر العثور على الصفحة" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة." msgid "Home" @@ -317,11 +322,11 @@ msgid "Server Error (500)" msgstr "خطأ في المزود (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"كان هناك خطأ. تم إعلام المسؤولين عن الموقع عبر البريد الإلكتروني وسوف يتم " -"إصلاح الخطأ قريباً. شكراً على صبركم." +"لقد حدث خطأ. تم إبلاغ مسؤولي الموقع عبر البريد الإلكتروني وسيتم إصلاحه " +"قريبًا. شكرا لصبرك." msgid "Run the selected action" msgstr "نفذ الإجراء المحدّد" @@ -339,12 +344,25 @@ msgstr "اختيار %(total_count)s %(module_name)s جميعها" msgid "Clear selection" msgstr "إزالة الاختيار" +#, python-format +msgid "Models in the %(name)s application" +msgstr "النماذج في تطبيق %(name)s" + +msgid "Add" +msgstr "أضف" + +msgid "View" +msgstr "استعراض" + +msgid "You don’t have permission to view or edit anything." +msgstr "ليست لديك الصلاحية لاستعراض أو لتعديل أي شيء." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"أولاً، أدخل اسم مستخدم وكلمة مرور. ومن ثم تستطيع تعديل المزيد من خيارات " -"المستخدم." +"أولاً ، أدخل اسم المستخدم وكلمة المرور. بعد ذلك ، ستتمكن من تعديل المزيد من " +"خيارات المستخدم." msgid "Enter a username and password." msgstr "أدخل اسم مستخدم وكلمة مرور." @@ -353,7 +371,7 @@ msgid "Change password" msgstr "غيّر كلمة المرور" msgid "Please correct the error below." -msgstr "" +msgstr "الرجاء تصحيح الأخطاء أدناه." msgid "Please correct the errors below." msgstr "الرجاء تصحيح الأخطاء أدناه." @@ -372,7 +390,7 @@ msgid "Documentation" msgstr "الوثائق" msgid "Log out" -msgstr "اخرج" +msgstr "تسجيل الخروج" #, python-format msgid "Add %(name)s" @@ -387,6 +405,9 @@ msgstr "مشاهدة على الموقع" msgid "Filter" msgstr "مرشّح" +msgid "Clear all filters" +msgstr "مسح جميع المرشحات" + msgid "Remove from sorting" msgstr "إزالة من الترتيب" @@ -428,7 +449,7 @@ msgstr "" msgid "Objects" msgstr "عناصر" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "نعم، أنا متأكد" msgid "No, take me back" @@ -462,9 +483,6 @@ msgstr "" "أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " "والعناصر المرتبطة بها سيتم حذفها:" -msgid "View" -msgstr "" - msgid "Delete?" msgstr "احذفه؟" @@ -475,16 +493,6 @@ msgstr " حسب %(filter_title)s " msgid "Summary" msgstr "ملخص" -#, python-format -msgid "Models in the %(name)s application" -msgstr "النماذج في تطبيق %(name)s" - -msgid "Add" -msgstr "أضف" - -msgid "You don't have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "آخر الإجراءات" @@ -498,7 +506,7 @@ msgid "Unknown content" msgstr "مُحتوى مجهول" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -516,6 +524,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" +msgid "Toggle navigation" +msgstr "تغيير التصفّح" + +msgid "Start typing to filter…" +msgstr "ابدأ الكتابة للتصفية ..." + +msgid "Filter navigation items" +msgstr "تصفية عناصر التصفح" + msgid "Date/time" msgstr "التاريخ/الوقت" @@ -526,7 +543,7 @@ msgid "Action" msgstr "إجراء" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " @@ -539,7 +556,7 @@ msgid "Save" msgstr "احفظ" msgid "Popup closing…" -msgstr "" +msgstr "جاري إغلاق النافذة المنبثقة..." msgid "Search" msgstr "ابحث" @@ -568,10 +585,10 @@ msgid "Save and continue editing" msgstr "احفظ واستمر بالتعديل" msgid "Save and view" -msgstr "" +msgstr "احفظ واستعرض" msgid "Close" -msgstr "" +msgstr "إغلاق" #, python-format msgid "Change selected %(model)s" @@ -585,8 +602,8 @@ msgstr "أضف %(model)s آخر" msgid "Delete selected %(model)s" msgstr "حذف %(model)s المختارة" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "شكراً لك على قضائك بعض الوقت مع الموقع اليوم." +msgid "Thanks for spending some quality time with the web site today." +msgstr "شكرا لقضاء بعض الوقت الجيد في الموقع اليوم." msgid "Log in again" msgstr "ادخل مجدداً" @@ -598,11 +615,11 @@ msgid "Your password was changed." msgstr "تمّ تغيير كلمة مرورك." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"رجاءً أدخل كلمة مرورك القديمة، للأمان، ثم أدخل كلمة مرور الجديدة مرتين كي " -"تتأكّد من كتابتها بشكل صحيح." +"رجاءً أدخل كلمة المرور القديمة، للأمان، ثم أدخل كلمة المرور الجديدة مرتين " +"لنتأكد بأنك قمت بإدخالها بشكل صحيح." msgid "Change my password" msgstr "غيّر كلمة مروري" @@ -635,18 +652,19 @@ msgstr "" "استعادة كلمة المرور مرة أخرى." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك, في حال تواجد " -"حساب بنفس البريد الإلكتروني الذي ادخلته. سوف تستقبل البريد الإلكتروني قريباً" +"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك، وذلك في حال " +"تواجد حساب بنفس البريد الإلكتروني الذي أدخلته. سوف تستقبل البريد الإلكتروني " +"قريباً" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " -"الإلكتروني بشكل صحيح ومراجعة مجلد الرسائل غير المرغوب فيها." +"الإلكتروني الخاص بحسابك ومراجعة مجلد الرسائل غير المرغوب بها." #, python-format msgid "" @@ -659,7 +677,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" msgid "Thanks for using our site!" @@ -670,10 +688,10 @@ msgid "The %(site_name)s team" msgstr "فريق %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"هل فقدت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " +"هل نسيت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " "تعليمات للحصول على كلمة مرور جديدة." msgid "Email address:" @@ -695,7 +713,7 @@ msgstr "اختر %s لتغييره" #, python-format msgid "Select %s to view" -msgstr "" +msgstr "اختر %s للاستعراض" msgid "Date:" msgstr "التاريخ:" diff --git a/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo index b6c0a802d58c..00605736e24c 100644 Binary files a/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po index 577951ff36d9..f7570b51098f 100644 --- a/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ar/LC_MESSAGES/djangojs.po @@ -1,16 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Bashar Al-Abdulhadi, 2015 +# Bashar Al-Abdulhadi, 2015,2020-2021 # Bashar Al-Abdulhadi, 2014 # Jannis Leidel , 2011 +# Omar Lajam, 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-10-15 21:27+0000\n" +"Last-Translator: Bashar Al-Abdulhadi\n" "Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -36,7 +37,7 @@ msgid "Type into this box to filter down the list of available %s." msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." msgid "Filter" -msgstr "انتقاء" +msgstr "تصفية" msgid "Choose all" msgstr "اختر الكل" @@ -87,18 +88,35 @@ msgstr "" "فسوف تخسر تعديلاتك." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة " -"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء." +"لقد حددت إجراءً ، لكنك لم تحفظ تغييراتك في الحقول الفردية حتى الآن. يرجى " +"النقر فوق موافق للحفظ. ستحتاج إلى إعادة تشغيل الإجراء." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." -msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ." +msgstr "" +"لقد حددت إجراء ، ولم تقم بإجراء أي تغييرات على الحقول الفردية. من المحتمل " +"أنك تبحث عن الزر أذهب بدلاً من الزر حفظ." + +msgid "Now" +msgstr "الآن" + +msgid "Midnight" +msgstr "منتصف الليل" + +msgid "6 a.m." +msgstr "6 ص." + +msgid "Noon" +msgstr "الظهر" + +msgid "6 p.m." +msgstr "6 مساءً" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -120,27 +138,12 @@ msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخا msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." -msgid "Now" -msgstr "الآن" - msgid "Choose a Time" msgstr "إختر وقت" msgid "Choose a time" msgstr "اختر وقتاً" -msgid "Midnight" -msgstr "منتصف الليل" - -msgid "6 a.m." -msgstr "6 ص." - -msgid "Noon" -msgstr "الظهر" - -msgid "6 p.m." -msgstr "6 مساءً" - msgid "Cancel" msgstr "ألغ" @@ -157,68 +160,116 @@ msgid "Tomorrow" msgstr "غداً" msgid "January" -msgstr "" +msgstr "يناير" msgid "February" -msgstr "" +msgstr "فبراير" msgid "March" -msgstr "" +msgstr "مارس" msgid "April" -msgstr "" +msgstr "أبريل" msgid "May" -msgstr "" +msgstr "مايو" msgid "June" -msgstr "" +msgstr "يونيو" msgid "July" -msgstr "" +msgstr "يوليو" msgid "August" -msgstr "" +msgstr "أغسطس" msgid "September" -msgstr "" +msgstr "سبتمبر" msgid "October" -msgstr "" +msgstr "أكتوبر" msgid "November" -msgstr "" +msgstr "نوفمبر" msgid "December" -msgstr "" +msgstr "ديسمبر" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "يناير" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "فبراير" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "مارس" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "إبريل" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "مايو" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "يونيو" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "يوليو" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "أغسطس" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "سبتمبر" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "أكتوبر" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "نوفمبر" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "ديسمبر" msgctxt "one letter Sunday" msgid "S" -msgstr "" +msgstr "أحد" msgctxt "one letter Monday" msgid "M" -msgstr "" +msgstr "إثنين" msgctxt "one letter Tuesday" msgid "T" -msgstr "" +msgstr "ثلاثاء" msgctxt "one letter Wednesday" msgid "W" -msgstr "" +msgstr "أربعاء" msgctxt "one letter Thursday" msgid "T" -msgstr "" +msgstr "خميس" msgctxt "one letter Friday" msgid "F" -msgstr "" +msgstr "جمعة" msgctxt "one letter Saturday" msgid "S" -msgstr "" +msgstr "سبت" msgid "Show" msgstr "أظهر" diff --git a/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..5f75b277974e Binary files /dev/null and b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po new file mode 100644 index 000000000000..8608584f44fb --- /dev/null +++ b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/django.po @@ -0,0 +1,738 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jihad Bahmaid Al-Halki, 2022 +# Riterix , 2019-2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: Jihad Bahmaid Al-Halki\n" +"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" +"language/ar_DZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_DZ\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "حذف سجلات %(verbose_name_plural)s المحددة" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "تم حذف %(count)d %(items)s بنجاح." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "لا يمكن حذف %(name)s" + +msgid "Are you sure?" +msgstr "هل أنت متأكد؟" + +msgid "Administration" +msgstr "الإدارة" + +msgid "All" +msgstr "الكل" + +msgid "Yes" +msgstr "نعم" + +msgid "No" +msgstr "لا" + +msgid "Unknown" +msgstr "مجهول" + +msgid "Any date" +msgstr "أي تاريخ" + +msgid "Today" +msgstr "اليوم" + +msgid "Past 7 days" +msgstr "الأيام السبعة الماضية" + +msgid "This month" +msgstr "هذا الشهر" + +msgid "This year" +msgstr "هذه السنة" + +msgid "No date" +msgstr "لا يوجد أي تاريخ" + +msgid "Has date" +msgstr "به تاريخ" + +msgid "Empty" +msgstr "فارغة" + +msgid "Not empty" +msgstr "ليست فارغة" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"الرجاء إدخال ال%(username)s و كلمة المرور الصحيحين لحساب الطاقم. الحقلين " +"حساسين وضعية الاحرف." + +msgid "Action:" +msgstr "إجراء:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "إضافة سجل %(verbose_name)s آخر" + +msgid "Remove" +msgstr "أزل" + +msgid "Addition" +msgstr "إضافة" + +msgid "Change" +msgstr "عدّل" + +msgid "Deletion" +msgstr "حذف" + +msgid "action time" +msgstr "وقت الإجراء" + +msgid "user" +msgstr "المستخدم" + +msgid "content type" +msgstr "نوع المحتوى" + +msgid "object id" +msgstr "معرف العنصر" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "ممثل العنصر" + +msgid "action flag" +msgstr "علامة الإجراء" + +msgid "change message" +msgstr "غيّر الرسالة" + +msgid "log entry" +msgstr "مُدخل السجل" + +msgid "log entries" +msgstr "مُدخلات السجل" + +#, python-format +msgid "Added “%(object)s”." +msgstr "تم إضافة العناصر \\\"%(object)s\\\"." + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "تم تعديل العناصر \\\"%(object)s\\\" - %(changes)s" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "تم حذف العناصر \\\"%(object)s.\\\"" + +msgid "LogEntry Object" +msgstr "كائن LogEntry" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "تم إضافة {name} \\\"{object}\\\"." + +msgid "Added." +msgstr "تمت الإضافة." + +msgid "and" +msgstr "و" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "تم تغيير {fields} لـ {name} \\\"{object}\\\"." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "تم تغيير {fields}." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "تم حذف {name} \\\"{object}\\\"." + +msgid "No fields changed." +msgstr "لم يتم تغيير أية حقول." + +msgid "None" +msgstr "لاشيء" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" +"استمر بالضغط على مفتاح \\\"Control\\\", او \\\"Command\\\" على أجهزة الماك, " +"لإختيار أكثر من أختيار واحد." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح." + +msgid "You may edit it again below." +msgstr "يمكن تعديله مرة أخرى أدناه." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "تمت إضافة {name} \\\"{obj}\\\" بنجاح. يمكنك تعديله مرة أخرى أدناه." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح. يمكنك إضافة {name} آخر أدناه." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "تم تغيير {name} \\\"{obj}\\\" بنجاح." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "يجب تحديد العناصر لتطبيق الإجراءات عليها. لم يتم تغيير أية عناصر." + +msgid "No action selected." +msgstr "لم يحدد أي إجراء." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "تم حذف %(name)s \\\"%(obj)s\\\" بنجاح." + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s ب ID \\\"%(key)s\\\" غير موجود. ربما تم حذفه؟" + +#, python-format +msgid "Add %s" +msgstr "أضف %s" + +#, python-format +msgid "Change %s" +msgstr "عدّل %s" + +#, python-format +msgid "View %s" +msgstr "عرض %s" + +msgid "Database error" +msgstr "خطـأ في قاعدة البيانات" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "تم تغيير %(count)s %(name)s بنجاح." +msgstr[1] "تم تغيير %(count)s %(name)s بنجاح." +msgstr[2] "تم تغيير %(count)s %(name)s بنجاح." +msgstr[3] "تم تغيير %(count)s %(name)s بنجاح." +msgstr[4] "تم تغيير %(count)s %(name)s بنجاح." +msgstr[5] "تم تغيير %(count)s %(name)s بنجاح." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "تم تحديد %(total_count)s" +msgstr[1] "تم تحديد %(total_count)s" +msgstr[2] "تم تحديد %(total_count)s" +msgstr[3] "تم تحديد %(total_count)s" +msgstr[4] "تم تحديد %(total_count)s" +msgstr[5] "تم تحديد %(total_count)s" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "لا شيء محدد من %(cnt)s" + +#, python-format +msgid "Change history: %s" +msgstr "تاريخ التغيير: %s" + +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"حذف %(class_name)s %(instance)s سيتسبب أيضاً بحذف العناصر المرتبطة التالية: " +"%(related_objects)s" + +msgid "Django site admin" +msgstr "إدارة موقع جانغو" + +msgid "Django administration" +msgstr "إدارة جانغو" + +msgid "Site administration" +msgstr "إدارة الموقع" + +msgid "Log in" +msgstr "ادخل" + +#, python-format +msgid "%(app)s administration" +msgstr "إدارة %(app)s " + +msgid "Page not found" +msgstr "تعذر العثور على الصفحة" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة.\"" + +msgid "Home" +msgstr "الرئيسية" + +msgid "Server error" +msgstr "خطأ في المزود" + +msgid "Server error (500)" +msgstr "خطأ في المزود (500)" + +msgid "Server Error (500)" +msgstr "خطأ في المزود (500)" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"كان هناك خطأ. تم إعلام المسؤولين عن الموقع عبر البريد الإلكتروني وسوف يتم " +"إصلاح الخطأ قريباً. شكراً على صبركم." + +msgid "Run the selected action" +msgstr "نفذ الإجراء المحدّد" + +msgid "Go" +msgstr "نفّذ" + +msgid "Click here to select the objects across all pages" +msgstr "اضغط هنا لتحديد جميع العناصر في جميع الصفحات" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "اختيار %(total_count)s %(module_name)s جميعها" + +msgid "Clear selection" +msgstr "إزالة الاختيار" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "النماذج في تطبيق %(name)s" + +msgid "Add" +msgstr "أضف" + +msgid "View" +msgstr "عرض" + +msgid "You don’t have permission to view or edit anything." +msgstr "ليس لديك الصلاحية لعرض أو تعديل أي شيء." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"أولاً، أدخل اسم مستخدم وكلمة مرور. ومن ثم تستطيع تعديل المزيد من خيارات " +"المستخدم." + +msgid "Enter a username and password." +msgstr "أدخل اسم مستخدم وكلمة مرور." + +msgid "Change password" +msgstr "غيّر كلمة المرور" + +msgid "Please correct the error below." +msgstr "يرجى تصحيح الخطأ أدناه." + +msgid "Please correct the errors below." +msgstr "الرجاء تصحيح الأخطاء أدناه." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "أدخل كلمة مرور جديدة للمستخدم %(username)s." + +msgid "Welcome," +msgstr "أهلا، " + +msgid "View site" +msgstr "عرض الموقع" + +msgid "Documentation" +msgstr "الوثائق" + +msgid "Log out" +msgstr "اخرج" + +#, python-format +msgid "Add %(name)s" +msgstr "أضف %(name)s" + +msgid "History" +msgstr "تاريخ" + +msgid "View on site" +msgstr "مشاهدة على الموقع" + +msgid "Filter" +msgstr "مرشّح" + +msgid "Clear all filters" +msgstr "مسح جميع المرشحات" + +msgid "Remove from sorting" +msgstr "إزالة من الترتيب" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "أولوية الترتيب: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "عكس الترتيب" + +msgid "Delete" +msgstr "احذف" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"حذف العنصر %(object_name)s '%(escaped_object)s' سيتسبب بحذف العناصر المرتبطة " +"به، إلا أنك لا تملك صلاحية حذف العناصر التالية:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"حذف %(object_name)s '%(escaped_object)s' سيتسبب أيضاً بحذف العناصر المرتبطة، " +"إلا أن حسابك ليس لديه صلاحية حذف أنواع العناصر التالية:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"متأكد أنك تريد حذف العنصر %(object_name)s \\\"%(escaped_object)s\\\"؟ سيتم " +"حذف جميع العناصر التالية المرتبطة به:" + +msgid "Objects" +msgstr "عناصر" + +msgid "Yes, I’m sure" +msgstr "نعم، أنا متأكد" + +msgid "No, take me back" +msgstr "لا, تراجع للخلف" + +msgid "Delete multiple objects" +msgstr "حذف عدّة عناصر" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"حذف عناصر %(objects_name)s المُحدّدة سيتسبب بحذف العناصر المرتبطة، إلا أن " +"حسابك ليس له صلاحية حذف أنواع العناصر التالية:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"حذف عناصر %(objects_name)s المحدّدة قد يتطلب حذف العناصر المحميّة المرتبطة " +"التالية:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"أأنت متأكد أنك تريد حذف عناصر %(objects_name)s المحددة؟ جميع العناصر التالية " +"والعناصر المرتبطة بها سيتم حذفها:" + +msgid "Delete?" +msgstr "احذفه؟" + +#, python-format +msgid " By %(filter_title)s " +msgstr " حسب %(filter_title)s " + +msgid "Summary" +msgstr "ملخص" + +msgid "Recent actions" +msgstr "آخر الإجراءات" + +msgid "My actions" +msgstr "إجراءاتي" + +msgid "None available" +msgstr "لا يوجد" + +msgid "Unknown content" +msgstr "مُحتوى مجهول" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة " +"البيانات الملائمة، وأن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"أنت مسجل الدخول بإسم المستخدم %(username)s, ولكنك غير مخول للوصول لهذه " +"الصفحة. هل ترغب بتسجيل الدخول بحساب آخر؟" + +msgid "Forgotten your password or username?" +msgstr "نسيت كلمة المرور أو اسم المستخدم الخاص بك؟" + +msgid "Toggle navigation" +msgstr "تغيير التنقل" + +msgid "Start typing to filter…" +msgstr "ابدأ بالكتابة لبدء التصفية(الفلترة)..." + +msgid "Filter navigation items" +msgstr "تصفية عناصر التنقل" + +msgid "Date/time" +msgstr "التاريخ/الوقت" + +msgid "User" +msgstr "المستخدم" + +msgid "Action" +msgstr "إجراء" + +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" +"ليس لهذا العنصر سجلّ تغييرات، على الأغلب أنه لم يُنشأ من خلال نظام إدارة " +"الموقع." + +msgid "Show all" +msgstr "أظهر الكل" + +msgid "Save" +msgstr "احفظ" + +msgid "Popup closing…" +msgstr "إغلاق المنبثقة ..." + +msgid "Search" +msgstr "ابحث" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s نتيجة" +msgstr[1] "%(counter)s نتيجة" +msgstr[2] "%(counter)s نتيجة" +msgstr[3] "%(counter)s نتائج" +msgstr[4] "%(counter)s نتيجة" +msgstr[5] "%(counter)s نتيجة" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "المجموع %(full_result_count)s" + +msgid "Save as new" +msgstr "احفظ كجديد" + +msgid "Save and add another" +msgstr "احفظ وأضف آخر" + +msgid "Save and continue editing" +msgstr "احفظ واستمر بالتعديل" + +msgid "Save and view" +msgstr "احفظ ثم اعرض" + +msgid "Close" +msgstr "أغلق" + +#, python-format +msgid "Change selected %(model)s" +msgstr "تغيير %(model)s المختارة" + +#, python-format +msgid "Add another %(model)s" +msgstr "أضف %(model)s آخر" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "حذف %(model)s المختارة" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "شكرا لأخذك بعض الوقت في الموقع اليوم." + +msgid "Log in again" +msgstr "ادخل مجدداً" + +msgid "Password change" +msgstr "غيّر كلمة مرورك" + +msgid "Your password was changed." +msgstr "تمّ تغيير كلمة مرورك." + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"رجاءً أدخل كلمة مرورك القديمة، للأمان، ثم أدخل كلمة مرور الجديدة مرتين كي " +"تتأكّد من كتابتها بشكل صحيح." + +msgid "Change my password" +msgstr "غيّر كلمة مروري" + +msgid "Password reset" +msgstr "استعادة كلمة المرور" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "تم تعيين كلمة مرورك. يمكن الاستمرار وتسجيل دخولك الآن." + +msgid "Password reset confirmation" +msgstr "تأكيد استعادة كلمة المرور" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "رجاءً أدخل كلمة مرورك الجديدة مرتين كي تتأكّد من كتابتها بشكل صحيح." + +msgid "New password:" +msgstr "كلمة المرور الجديدة:" + +msgid "Confirm password:" +msgstr "أكّد كلمة المرور:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"رابط استعادة كلمة المرور غير صحيح، ربما لأنه استُخدم من قبل. رجاءً اطلب " +"استعادة كلمة المرور مرة أخرى." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"تم إرسال بريد إلكتروني بالتعليمات لضبط كلمة المرور الخاصة بك, في حال تواجد " +"حساب بنفس البريد الإلكتروني الذي ادخلته. سوف تستقبل البريد الإلكتروني قريباً" + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" +"في حال عدم إستقبال البريد الإلكتروني، الرجاء التأكد من إدخال عنوان بريدك " +"الإلكتروني بشكل صحيح ومراجعة مجلد الرسائل غير المرغوب فيها." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"لقد قمت بتلقى هذه الرسالة لطلبك بإعادة تعين كلمة المرور لحسابك الشخصي على " +"%(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "رجاءً اذهب إلى الصفحة التالية واختر كلمة مرور جديدة:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:" + +msgid "Thanks for using our site!" +msgstr "شكراً لاستخدامك موقعنا!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "فريق %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" +"هل فقدت كلمة المرور؟ أدخل عنوان بريدك الإلكتروني أدناه وسوف نقوم بإرسال " +"تعليمات للحصول على كلمة مرور جديدة." + +msgid "Email address:" +msgstr "عنوان البريد الإلكتروني:" + +msgid "Reset my password" +msgstr "استعد كلمة مروري" + +msgid "All dates" +msgstr "كافة التواريخ" + +#, python-format +msgid "Select %s" +msgstr "اختر %s" + +#, python-format +msgid "Select %s to change" +msgstr "اختر %s لتغييره" + +#, python-format +msgid "Select %s to view" +msgstr "حدد %s للعرض" + +msgid "Date:" +msgstr "التاريخ:" + +msgid "Time:" +msgstr "الوقت:" + +msgid "Lookup" +msgstr "ابحث" + +msgid "Currently:" +msgstr "حالياً:" + +msgid "Change:" +msgstr "تغيير:" diff --git a/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..6b419f003c46 Binary files /dev/null and b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..9e8a4ad1c84f --- /dev/null +++ b/django/contrib/admin/locale/ar_DZ/LC_MESSAGES/djangojs.po @@ -0,0 +1,280 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jihad Bahmaid Al-Halki, 2022 +# Riterix , 2019-2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-05-17 05:26-0500\n" +"PO-Revision-Date: 2022-07-25 07:59+0000\n" +"Last-Translator: Jihad Bahmaid Al-Halki\n" +"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/" +"language/ar_DZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar_DZ\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s المتوفرة" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"هذه قائمة %s المتوفرة. يمكنك اختيار بعضها بانتقائها في الصندوق أدناه ثم " +"الضغط على سهم الـ\\\"اختيار\\\" بين الصندوقين." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "اكتب في هذا الصندوق لتصفية قائمة %s المتوفرة." + +msgid "Filter" +msgstr "انتقاء" + +msgid "Choose all" +msgstr "اختر الكل" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "اضغط لاختيار جميع %s جملة واحدة." + +msgid "Choose" +msgstr "اختيار" + +msgid "Remove" +msgstr "احذف" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s المختارة" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"هذه قائمة %s المحددة. يمكنك إزالة بعضها باختيارها في الصندوق أدناه ثم اضغط " +"على سهم الـ\\\"إزالة\\\" بين الصندوقين." + +msgid "Remove all" +msgstr "إزالة الكل" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "اضغط لإزالة جميع %s المحددة جملة واحدة." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "لا شي محدد" +msgstr[1] "%(sel)s من %(cnt)s محدد" +msgstr[2] "%(sel)s من %(cnt)s محدد" +msgstr[3] "%(sel)s من %(cnt)s محددة" +msgstr[4] "%(sel)s من %(cnt)s محدد" +msgstr[5] "%(sel)s من %(cnt)s محدد" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"لديك تعديلات غير محفوظة على بعض الحقول القابلة للتعديل. إن نفذت أي إجراء " +"فسوف تخسر تعديلاتك." + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"اخترت إجراءً لكن دون أن تحفظ تغييرات التي قمت بها. رجاء اضغط زر الموافقة " +"لتحفظ تعديلاتك. ستحتاج إلى إعادة تنفيذ الإجراء." + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "اخترت إجراءً دون تغيير أي حقل. لعلك تريد زر التنفيذ بدلاً من زر الحفظ." + +msgid "Now" +msgstr "الآن" + +msgid "Midnight" +msgstr "منتصف الليل" + +msgid "6 a.m." +msgstr "6 ص." + +msgid "Noon" +msgstr "الظهر" + +msgid "6 p.m." +msgstr "6 مساء" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[1] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[2] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[3] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[4] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." +msgstr[5] "ملاحظة: أنت متقدم بـ %s ساعة من وقت الخادم." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[1] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[2] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[3] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[4] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." +msgstr[5] "ملاحظة: أنت متأخر بـ %s ساعة من وقت الخادم." + +msgid "Choose a Time" +msgstr "إختر وقت " + +msgid "Choose a time" +msgstr "إختر وقت " + +msgid "Cancel" +msgstr "ألغ" + +msgid "Today" +msgstr "اليوم" + +msgid "Choose a Date" +msgstr "إختر تاريخ " + +msgid "Yesterday" +msgstr "أمس" + +msgid "Tomorrow" +msgstr "غداً" + +msgid "January" +msgstr "جانفي" + +msgid "February" +msgstr "فيفري" + +msgid "March" +msgstr "مارس" + +msgid "April" +msgstr "أفريل" + +msgid "May" +msgstr "ماي" + +msgid "June" +msgstr "جوان" + +msgid "July" +msgstr "جويليه" + +msgid "August" +msgstr "أوت" + +msgid "September" +msgstr "سبتمبر" + +msgid "October" +msgstr "أكتوبر" + +msgid "November" +msgstr "نوفمبر" + +msgid "December" +msgstr "ديسمبر" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "يناير" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "فبراير" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "مارس" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "أبريل" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "مايو" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "يونيو" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "يوليو" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "أغسطس" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "سبتمبر" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "أكتوبر" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "نوفمبر" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "ديسمبر" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "ح" + +msgctxt "one letter Monday" +msgid "M" +msgstr "ن" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "ث" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "ع" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "خ" + +msgctxt "one letter Friday" +msgid "F" +msgstr "ج" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "س" + +msgid "" +"You have already submitted this form. Are you sure you want to submit it " +"again?" +msgstr "" + +msgid "Show" +msgstr "أظهر" + +msgid "Hide" +msgstr "اخف" diff --git a/django/contrib/admin/locale/az/LC_MESSAGES/django.mo b/django/contrib/admin/locale/az/LC_MESSAGES/django.mo index 557d95d4a0da..7c6990af6c66 100644 Binary files a/django/contrib/admin/locale/az/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/az/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/az/LC_MESSAGES/django.po b/django/contrib/admin/locale/az/LC_MESSAGES/django.po index e4932f1df68a..929b2945ba2f 100644 --- a/django/contrib/admin/locale/az/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/az/LC_MESSAGES/django.po @@ -4,15 +4,18 @@ # Emin Mastizada , 2018,2020 # Emin Mastizada , 2016 # Konul Allahverdiyeva , 2016 +# Nicat Məmmədov , 2022 +# Nijat Mammadov, 2024 +# Sevdimali , 2024 # Zulfugar Ismayilzadeh , 2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-12 07:34+0000\n" -"Last-Translator: Emin Mastizada \n" -"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Sevdimali , 2024\n" +"Language-Team: Azerbaijani (http://app.transifex.com/django/django/language/" "az/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,20 +23,20 @@ msgstr "" "Language: az\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Seçilmiş \"%(verbose_name_plural)s\"ləri/ları sil" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s uğurla silindi." #, python-format msgid "Cannot delete %(name)s" -msgstr "%(name)s silinmir" +msgstr "%(name)s silinə bilməz" msgid "Are you sure?" -msgstr "Əminsiniz?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçilmiş %(verbose_name_plural)s-ləri sil" +msgstr "Əminsinizmi?" msgid "Administration" msgstr "Administrasiya" @@ -48,7 +51,7 @@ msgid "No" msgstr "Yox" msgid "Unknown" -msgstr "Bilinmir" +msgstr "Naməlum" msgid "Any date" msgstr "İstənilən tarix" @@ -71,13 +74,19 @@ msgstr "Tarixi yoxdur" msgid "Has date" msgstr "Tarixi mövcuddur" +msgid "Empty" +msgstr "Boş" + +msgid "Not empty" +msgstr "Boş deyil" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Lütfən, istifadəçi hesabı üçün doğru %(username)s və parol daxil olun. " -"Nəzərə alın ki, hər iki sahə böyük/kiçik hərflərə həssasdırlar." +"Lütfən, istifadəçi hesabı üçün doğru %(username)s və şifrə daxil edin. " +"Nəzərə alın ki, hər iki xana böyük-kiçik hərflərə həssasdırlar." msgid "Action:" msgstr "Əməliyyat:" @@ -116,7 +125,7 @@ msgid "object repr" msgstr "obyekt repr" msgid "action flag" -msgstr "bayraq" +msgstr "əməliyyat bayrağı" msgid "change message" msgstr "dəyişmə mesajı" @@ -144,7 +153,7 @@ msgstr "LogEntry obyekti" #, python-brace-format msgid "Added {name} “{object}”." -msgstr "" +msgstr "{name} “{object}” əlavə edildi." msgid "Added." msgstr "Əlavə edildi." @@ -154,7 +163,7 @@ msgstr "və" #, python-brace-format msgid "Changed {fields} for {name} “{object}”." -msgstr "" +msgstr "{name} “{object}” üçün {fields} dəyişdirildi." #, python-brace-format msgid "Changed {fields}." @@ -162,20 +171,25 @@ msgstr "{fields} dəyişdirildi." #, python-brace-format msgid "Deleted {name} “{object}”." -msgstr "" +msgstr "{name} “{object}” silindi." msgid "No fields changed." msgstr "Heç bir sahə dəyişmədi." msgid "None" -msgstr "Heç nə" +msgstr "Heç biri" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +"Birdən çox seçmək üçün “Control” və ya Mac üçün “Command” düyməsini basılı " +"tutun." + +msgid "Select this object for an action - {}" +msgstr "Əməliyyat üçün bu obyekti seçin - {}" #, python-brace-format msgid "The {name} “{obj}” was added successfully." -msgstr "" +msgstr "{name} “{obj}” uğurla əlavə edildi." msgid "You may edit it again below." msgstr "Bunu aşağıda təkrar redaktə edə bilərsiz." @@ -184,43 +198,44 @@ msgstr "Bunu aşağıda təkrar redaktə edə bilərsiz." msgid "" "The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} “{obj}” uğurla əlavə edildi. Aşağıdan başqa bir {name} əlavə edə " +"bilərsiz." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" +"{name} “{obj}” uğurla dəyişdirildi. Təkrar aşağıdan dəyişdirə bilərsiz." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"{name} “{obj}” uğurla dəyişdirildi. Aşağıdan başqa bir {name} əlavə edə " +"bilərsiz." #, python-brace-format msgid "The {name} “{obj}” was changed successfully." -msgstr "" +msgstr "{name} “{obj}” uğurla dəyişdirildi." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -"Biz elementlər üzərində nəsə əməliyyat aparmaq üçün siz onları seçməlisiniz. " -"Heç bir element dəyişmədi." +"Elementlər üzərində əməliyyat aparmaq üçün, siz onları seçməlisiniz. Heç bir " +"element dəyişmədi." msgid "No action selected." msgstr "Heç bir əməliyyat seçilmədi." #, python-format msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" +msgstr "%(name)s “%(obj)s” uğurla silindi." #, python-format msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" +msgstr "“%(key)s” ID nömrəli %(name)s mövcud deyil. Bəlkə silinib?" #, python-format msgid "Add %s" @@ -235,30 +250,31 @@ msgid "View %s" msgstr "%s gör" msgid "Database error" -msgstr "Bazada xəta" +msgstr "Verilənlər bazası xətası" #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s uğurlu dəyişdirildi." -msgstr[1] "%(count)s %(name)s uğurlu dəyişdirildi." +msgstr[1] "%(count)s %(name)s uğurla dəyişdirildi." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s seçili" -msgstr[1] "Bütün %(total_count)s seçili" +msgstr[1] "Bütün %(total_count)s seçildi" #, python-format msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s-dan 0 seçilib" +msgstr "%(cnt)s-dan/dən 0 seçilib" #, python-format msgid "Change history: %s" msgstr "Dəyişmə tarixi: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -268,8 +284,8 @@ msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" -"%(class_name)s %(instance)s silmə əlaqəli qorunmalı obyektləri silməyi tələb " -"edir: %(related_objects)s" +"%(class_name)s %(instance)s silinməsi %(related_objects)s obyektlərinin də " +"silinməsinə gətirib çıxaracaq" msgid "Django site admin" msgstr "Django sayt administratoru" @@ -291,7 +307,7 @@ msgid "Page not found" msgstr "Səhifə tapılmadı" msgid "We’re sorry, but the requested page could not be found." -msgstr "" +msgstr "Üzr istəyirik, amma sorğulanan səhifə tapılmadı." msgid "Home" msgstr "Ev" @@ -309,52 +325,91 @@ msgid "" "There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"Xəta baş verdi. Problem sayt administratorlarına e-poçt vasitəsi ilə " +"bildirildi və qısa bir zamanda həll olunacaq. Anlayışınız üçün təşəkkür " +"edirik." msgid "Run the selected action" -msgstr "Seçdiyim əməliyyatı yerinə yetir" +msgstr "Seçilən əməliyyatı yerinə yetir" msgid "Go" -msgstr "Getdik" +msgstr "İrəli" msgid "Click here to select the objects across all pages" -msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura tıqlayın" +msgstr "Bütün səhifələr üzrə obyektləri seçmək üçün bura klikləyin" #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "Bütün %(total_count)s sayda %(module_name)s seç" +msgstr "Hamısını seç (%(total_count)s %(module_name)s) " msgid "Clear selection" msgstr "Seçimi təmizlə" +msgid "Breadcrumbs" +msgstr "Menyu sətri" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s tətbiqetməsindəki modellər" + +msgid "Add" +msgstr "Əlavə et" + +msgid "View" +msgstr "Bax" + +msgid "You don’t have permission to view or edit anything." +msgstr "Heç nəyə baxmağa və ya dəyişməyə icazəniz yoxdur." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"Əvvəlcə istifacəçi adı və şifrəni daxil edin. Daha sonra siz daha çox " +"istifadəçi seçimlərinə düzəliş edə biləcəksiniz." msgid "Enter a username and password." -msgstr "İstifadəçi adını və parolu daxil edin." +msgstr "İstifadəçi adını və şifrəni daxil edin." msgid "Change password" -msgstr "Parolu dəyiş" +msgstr "Şifrəni dəyiş" -msgid "Please correct the error below." -msgstr "Lütfən aşağıdakı xətanı düzəldin." +msgid "Set password" +msgstr "Şifrə təyin et" -msgid "Please correct the errors below." -msgstr "Lütfən aşağıdakı səhvləri düzəldin." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Lütfən, aşağıdakı xətanı düzəldin." +msgstr[1] "Lütfən, aşağıdakı xətaları düzəldin." #, python-format msgid "Enter a new password for the user %(username)s." -msgstr "%(username)s üçün yeni parol daxil edin." +msgstr "%(username)s istifadəçisi üçün yeni şifrə daxil edin." + +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Bu əməliyyat bu istifadəçi üçün şifrə əsaslı autentifikasiyanı aktiv " +"edəcək." + +msgid "Disable password-based authentication" +msgstr "Şifrə əsaslı autentifikasiyanı ləğv elə." + +msgid "Enable password-based authentication" +msgstr "Şifrə əsaslı autentifikasiyanı aktivləşdir." + +msgid "Skip to main content" +msgstr "Əsas məzmuna keç" msgid "Welcome," msgstr "Xoş gördük," msgid "View site" -msgstr "Saytı ziyarət et" +msgstr "Sayta bax" msgid "Documentation" -msgstr "Sənədləşdirmə" +msgstr "Dokumentasiya" msgid "Log out" msgstr "Çıx" @@ -367,11 +422,20 @@ msgid "History" msgstr "Tarix" msgid "View on site" -msgstr "Saytda göstər" +msgstr "Saytda bax" msgid "Filter" msgstr "Süzgəc" +msgid "Hide counts" +msgstr "Sayı gizlət" + +msgid "Show counts" +msgstr "Sayı göstər" + +msgid "Clear all filters" +msgstr "Bütün filterləri təmizlə" + msgid "Remove from sorting" msgstr "Sıralamadan çıxar" @@ -382,6 +446,15 @@ msgstr "Sıralama prioriteti: %(priority_number)s" msgid "Toggle sorting" msgstr "Sıralamanı çevir" +msgid "Toggle theme (current theme: auto)" +msgstr "Görünüşü dəyiş (halhazırkı: avtomatik)" + +msgid "Toggle theme (current theme: light)" +msgstr "Görünüşü dəyiş (halhazırkı: aydın)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Görünüşü dəyiş (halhazırkı: qaranlıq)" + msgid "Delete" msgstr "Sil" @@ -415,10 +488,10 @@ msgid "Objects" msgstr "Obyektlər" msgid "Yes, I’m sure" -msgstr "" +msgstr "Bəli, əminəm" msgid "No, take me back" -msgstr "Xeyr, məni geri götür" +msgstr "Xeyr, geri qayıt" msgid "Delete multiple objects" msgstr "Bir neçə obyekt sil" @@ -449,11 +522,8 @@ msgstr "" "Seçdiyiniz %(objects_name)s obyektini silməkdə əminsiniz? Aşağıdakı bütün " "obyektlər və ona bağlı digər obyektlər də silinəcək:" -msgid "View" -msgstr "Gör" - msgid "Delete?" -msgstr "Silək?" +msgstr "Silinsin?" #, python-format msgid " By %(filter_title)s " @@ -462,16 +532,6 @@ msgstr " %(filter_title)s görə " msgid "Summary" msgstr "İcmal" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s proqramındakı modellər" - -msgid "Add" -msgstr "Əlavə et" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "Son əməliyyatlar" @@ -481,14 +541,26 @@ msgstr "Mənim əməliyyatlarım" msgid "None available" msgstr "Heç nə yoxdur" +msgid "Added:" +msgstr "Əlavə olunub:" + +msgid "Changed:" +msgstr "Dəyişdirilib:" + +msgid "Deleted:" +msgstr "Silinib:" + msgid "Unknown content" -msgstr "Naməlum" +msgstr "Naməlum məzmun" msgid "" "Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"Verilənlər bazanızın quraşdırılması ilə bağlı problem var. Müvafiq " +"cədvəllərinin yaradıldığından və verilənlər bazasının müvafiq istifadəçi " +"tərəfindən oxuna biləcəyindən əmin olun." #, python-format msgid "" @@ -499,7 +571,19 @@ msgstr "" "bir hesaba daxil olmaq istərdiniz?" msgid "Forgotten your password or username?" -msgstr "Parol və ya istifadəçi adını unutmusan?" +msgstr "Şifrə və ya istifadəçi adını unutmusuz?" + +msgid "Toggle navigation" +msgstr "Naviqasiyanı dəyiş" + +msgid "Sidebar" +msgstr "Yan panel" + +msgid "Start typing to filter…" +msgstr "Filterləmək üçün yazın..." + +msgid "Filter navigation items" +msgstr "Naviqasiya elementlərini filterlə" msgid "Date/time" msgstr "Tarix/vaxt" @@ -510,10 +594,17 @@ msgstr "İstifadəçi" msgid "Action" msgstr "Əməliyyat" +msgid "entry" +msgid_plural "entries" +msgstr[0] "daxiletmə" +msgstr[1] "daxiletmələr" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" +"Bu obyektin dəyişiklik tarixçəsi yoxdur. Yəqin ki, bu admin saytı vasitəsilə " +"əlavə olunmayıb." msgid "Show all" msgstr "Hamısını göstər" @@ -522,7 +613,7 @@ msgid "Save" msgstr "Yadda saxla" msgid "Popup closing…" -msgstr "" +msgstr "Qəfil pəncərə qapadılır…" msgid "Search" msgstr "Axtar" @@ -547,10 +638,10 @@ msgid "Save and continue editing" msgstr "Yadda saxla və redaktəyə davam et" msgid "Save and view" -msgstr "Saxla və gör" +msgstr "Yadda saxla və bax" msgid "Close" -msgstr "Qapat" +msgstr "Bağla" #, python-format msgid "Change selected %(model)s" @@ -564,76 +655,87 @@ msgstr "Başqa %(model)s əlavə et" msgid "Delete selected %(model)s" msgstr "Seçilmiş %(model)s sil" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Sayt ilə səmərəli vaxt keçirdiyiniz üçün təşəkkür." +#, python-format +msgid "View selected %(model)s" +msgstr "Bax: seçilmiş %(model)s " + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Bu gün veb saytla keyfiyyətli vaxt keçirdiyiniz üçün təşəkkür edirik." msgid "Log in again" msgstr "Yenidən daxil ol" msgid "Password change" -msgstr "Parol dəyişmək" +msgstr "Şifrəni dəyişmək" msgid "Your password was changed." -msgstr "Sizin parolunuz dəyişdi." +msgstr "Sizin şifrəniz dəyişdirildi." msgid "" "Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" +"Zəhmət olmasa təhlükəsizlik naminə köhnə şifrənizi daxil edin və sonra yeni " +"şifrənizi iki dəfə daxil edin ki, düzgün daxil yazdığınızı yoxlaya bilək." msgid "Change my password" -msgstr "Mənim parolumu dəyiş" +msgstr "Şifrəmi dəyiş" msgid "Password reset" -msgstr "Parolun sıfırlanması" +msgstr "Şifrənin sıfırlanması" msgid "Your password has been set. You may go ahead and log in now." -msgstr "Yeni parol artıq qüvvədədir. Yenidən daxil ola bilərsiniz." +msgstr "Yeni şifrə artıq qüvvədədir. Yenidən daxil ola bilərsiniz." msgid "Password reset confirmation" -msgstr "Parolun sıfırlanması üçün təsdiq" +msgstr "Şifrə sıfırlanmasının təsdiqi" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." -msgstr "Yeni parolu iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." +msgstr "Yeni şifrəni iki dəfə daxil edin ki, səhv etmədiyinizə əmin olaq." msgid "New password:" -msgstr "Yeni parol:" +msgstr "Yeni şifrə:" msgid "Confirm password:" -msgstr "Yeni parol (bir daha):" +msgstr "Yeni şifrə (bir daha):" msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" -"Parolun sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " -"Parolu sıfırlamaq üçün yenə müraciət edin." +"Şifrənin sıfırlanması üçün olan keçid, yəqin ki, artıq istifadə olunub. " +"Şifrəni sıfırlamaq üçün yenə müraciət edin." msgid "" "We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Şifrəni təyin etmək üçün lazım olan addımlar sizə göndərildi (əgər bu e-poçt " +"ünvanı ilə hesab varsa təbii ki). Elektron məktub qısa bir müddət ərzində " +"sizə çatacaq." msgid "" "If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"E-poçt gəlməsə, qeydiyyatdan keçdiyiniz e-poçt ünvanını doğru daxil " +"etdiyinizə əmin olun və spam qovluğunuzu yoxlayın." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" -"%(site_name)s saytında parolu yeniləmək istədiyinizə görə bu məktubu " +"%(site_name)s saytında şifrəni yeniləmək istədiyinizə görə bu məktubu " "göndərdik." msgid "Please go to the following page and choose a new password:" -msgstr "Növbəti səhifəyə keçid alın və yeni parolu seçin:" +msgstr "Növbəti səhifəyə keçid alın və yeni şifrəni seçin:" msgid "Your username, in case you’ve forgotten:" -msgstr "" +msgstr "İstifadəçi adınız, əgər unutmusunuzsa:" msgid "Thanks for using our site!" msgstr "Bizim saytdan istifadə etdiyiniz üçün təşəkkür edirik!" @@ -646,12 +748,17 @@ msgid "" "Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Şifrəni unutmusuz? Epoçt ünvanınızı daxil edin və biz sizə yeni şifrə təyin " +"etmək üçün nə etmək lazım olduğunu göndərəcəyik." msgid "Email address:" msgstr "E-poçt:" msgid "Reset my password" -msgstr "Parolumu sıfırla" +msgstr "Şifrəmi sıfırla" + +msgid "Select all objects on this page for an action" +msgstr "Əməliyyat üçün bu səhifədəki bütün obyektləri seçin" msgid "All dates" msgstr "Bütün tarixlərdə" diff --git a/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo index 32272d65ba40..dfe8ff49a1ca 100644 Binary files a/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po index 266153591f52..78bafce70997 100644 --- a/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/az/LC_MESSAGES/djangojs.po @@ -2,15 +2,16 @@ # # Translators: # Ali Ismayilov , 2011-2012 +# Emin Mastizada , 2016,2020 # Emin Mastizada , 2016 -# Emin Mastizada , 2016 +# Nicat Məmmədov , 2022 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Emin Mastizada \n" +"POT-Creation-Date: 2022-05-17 05:26-0500\n" +"PO-Revision-Date: 2022-07-25 07:59+0000\n" +"Last-Translator: Nicat Məmmədov \n" "Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/" "az/)\n" "MIME-Version: 1.0\n" @@ -83,21 +84,36 @@ msgstr "" "əməliyyatı işə salsanız, dəyişikliklər əldən gedəcək." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Əməliyyatı seçmisiniz, amma bəzi sahələrdəki dəyişiklikləri hələ yadda " -"saxlamamışıq. Bunun üçün OK seçməlisiniz. Ondan sonra əməliyyatı yenidən işə " -"salmağa cəhd edin." +"Əməliyyat seçmisiniz, amma fərdi sahələrdəki dəyişiklikləriniz hələ də yadda " +"saxlanılmayıb. Saxlamaq üçün lütfən Tamam düyməsinə klikləyin. Əməliyyatı " +"təkrar işlətməli olacaqsınız." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Siz əməliyyatı seçmisiniz və heç bir sahəyə dəyişiklik etməmisiniz. Siz " -"yəqin ki, Yadda saxla düyməsini deyil, Getdik düyməsini axtarırsınız." +"Əməliyyat seçmisiniz və fərdi sahələrdə dəyişiklər etməmisiniz. Böyük " +"ehtimal Saxla düyməsi yerinə Get düyməsinə ehtiyyacınız var." + +msgid "Now" +msgstr "İndi" + +msgid "Midnight" +msgstr "Gecə yarısı" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Günorta" + +msgid "6 p.m." +msgstr "6 p.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -111,27 +127,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Diqqət: Server vaxtından %s saat geridəsiniz." msgstr[1] "Diqqət: Server vaxtından %s saat geridəsiniz." -msgid "Now" -msgstr "İndi" - msgid "Choose a Time" msgstr "Vaxt Seçin" msgid "Choose a time" msgstr "Vaxtı seçin" -msgid "Midnight" -msgstr "Gecə yarısı" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Günorta" - -msgid "6 p.m." -msgstr "6 p.m." - msgid "Cancel" msgstr "Ləğv et" @@ -183,6 +184,54 @@ msgstr "Noyabr" msgid "December" msgstr "Dekabr" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Yan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Fev" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "İyn" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "İyl" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Avq" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sen" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Noy" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dek" + msgctxt "one letter Sunday" msgid "S" msgstr "B" @@ -211,6 +260,11 @@ msgctxt "one letter Saturday" msgid "S" msgstr "Ş" +msgid "" +"You have already submitted this form. Are you sure you want to submit it " +"again?" +msgstr "" + msgid "Show" msgstr "Göstər" diff --git a/django/contrib/admin/locale/be/LC_MESSAGES/django.mo b/django/contrib/admin/locale/be/LC_MESSAGES/django.mo index 2552fa0a8991..f23565c180ee 100644 Binary files a/django/contrib/admin/locale/be/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/be/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/be/LC_MESSAGES/django.po b/django/contrib/admin/locale/be/LC_MESSAGES/django.po index 7a81c25941d2..4904d355c219 100644 --- a/django/contrib/admin/locale/be/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/be/LC_MESSAGES/django.po @@ -2,23 +2,28 @@ # # Translators: # Viktar Palstsiuk , 2015 -# znotdead , 2016-2017,2019 +# znotdead , 2016-2017,2019-2021,2023-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-16 19:04+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: znotdead , " +"2016-2017,2019-2021,2023-2024\n" +"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" "be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\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" +"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" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Выдаліць абраныя %(verbose_name_plural)s" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -31,10 +36,6 @@ msgstr "Не ўдаецца выдаліць %(name)s" msgid "Are you sure?" msgstr "Ці ўпэўненыя вы?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Выдаліць абраныя %(verbose_name_plural)s" - msgid "Administration" msgstr "Адміністрацыя" @@ -71,6 +72,12 @@ msgstr "Няма даты" msgid "Has date" msgstr "Мае дату" +msgid "Empty" +msgstr "Пусты" + +msgid "Not empty" +msgstr "Не пусты" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -175,6 +182,9 @@ msgstr "" "Утрымлівайце націснутай кнопку“Control”, або “Command” на Mac, каб вылучыць " "больш за адзін." +msgid "Select this object for an action - {}" +msgstr "Абярыце гэты аб'ект для дзеяньня - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "Пасьпяхова дадалі {name} “{obj}”." @@ -192,10 +202,6 @@ msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "Пасьпяхова зьмянілі {name} \"{obj}\". Ніжэй яго можна зноўку правіць." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "Пасьпяхова дадалі {name} \"{obj}\". Ніжэй яго можна зноўку правіць." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -263,8 +269,9 @@ msgstr "Абралі 0 аб’ектаў з %(cnt)s" msgid "Change history: %s" msgstr "Гісторыя зьменаў: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -335,6 +342,22 @@ msgstr "Абраць усе %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Не абіраць нічога" +msgid "Breadcrumbs" +msgstr "Навігацыйны ланцужок" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Мадэлі ў %(name)s праграме" + +msgid "Add" +msgstr "Дадаць" + +msgid "View" +msgstr "Праглядзець" + +msgid "You don’t have permission to view or edit anything." +msgstr "Вы ня маеце дазволу праглядаць ці нешта зьмяняць." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -348,16 +371,36 @@ msgstr "Пазначце імя карыстальніка ды пароль." msgid "Change password" msgstr "Зьмяніць пароль" -msgid "Please correct the error below." -msgstr "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." +msgid "Set password" +msgstr "Усталяваць пароль" -msgid "Please correct the errors below." -msgstr "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Калі ласка, выпраўце памылкy, адзначаную ніжэй." +msgstr[1] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." +msgstr[2] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." +msgstr[3] "Калі ласка, выпраўце памылкі, адзначаныя ніжэй." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Пазначце пароль для карыстальніка «%(username)s»." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Гэта дзеянне ўключыць аўтэнтыфікацыю на аснове пароля для " +"гэтага карыстальніка." + +msgid "Disable password-based authentication" +msgstr "Адключыць аўтэнтыфікацыю на аснове пароля" + +msgid "Enable password-based authentication" +msgstr "Уключыць аўтэнтыфікацыю на аснове пароля" + +msgid "Skip to main content" +msgstr "Перайсці да асноўнага зместу" + msgid "Welcome," msgstr "Вітаем," @@ -383,6 +426,15 @@ msgstr "Зірнуць на пляцоўцы" msgid "Filter" msgstr "Прасеяць" +msgid "Hide counts" +msgstr "Схаваць падлік" + +msgid "Show counts" +msgstr "Паказаць падлік" + +msgid "Clear all filters" +msgstr "Ачысьціць усе фільтры" + msgid "Remove from sorting" msgstr "Прыбраць з упарадкаванага" @@ -393,6 +445,15 @@ msgstr "Парадак: %(priority_number)s" msgid "Toggle sorting" msgstr "Парадкаваць наадварот" +msgid "Toggle theme (current theme: auto)" +msgstr "Пераключыць тэму (бягучая тэма: аўтаматычная)" + +msgid "Toggle theme (current theme: light)" +msgstr "Пераключыць тэму (бягучая тэма: светлая)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Пераключыць тэму (бягучая тэма: цёмная)" + msgid "Delete" msgstr "Выдаліць" @@ -458,9 +519,6 @@ msgstr "" "Ці выдаліць абранае (%(objects_name)s)? Усе наступныя аб’екты ды зьвязаныя " "зь імі складнікі выдаляцца:" -msgid "View" -msgstr "Праглядзець" - msgid "Delete?" msgstr "Ці выдаліць?" @@ -471,16 +529,6 @@ msgstr " %(filter_title)s " msgid "Summary" msgstr "Рэзюмэ" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Мадэлі ў %(name)s праграме" - -msgid "Add" -msgstr "Дадаць" - -msgid "You don’t have permission to view or edit anything." -msgstr "Вы ня маеце дазволу праглядаць ці нешта зьмяняць." - msgid "Recent actions" msgstr "Нядаўнія дзеянні" @@ -490,6 +538,15 @@ msgstr "Мае дзеяньні" msgid "None available" msgstr "Недаступнае" +msgid "Added:" +msgstr "Дадалі:" + +msgid "Changed:" +msgstr "Зьмянілі:" + +msgid "Deleted:" +msgstr "Выдалены:" + msgid "Unknown content" msgstr "Невядомае зьмесьціва" @@ -512,6 +569,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Забыліся на імя ці пароль?" +msgid "Toggle navigation" +msgstr "Пераключыць навігацыю" + +msgid "Sidebar" +msgstr "бакавая панэль" + +msgid "Start typing to filter…" +msgstr "Пачніце ўводзіць, каб адфільтраваць..." + +msgid "Filter navigation items" +msgstr "Фільтраваць элементы навігацыі" + msgid "Date/time" msgstr "Час, дата" @@ -521,6 +590,13 @@ msgstr "Карыстальнік" msgid "Action" msgstr "Дзеяньне" +msgid "entry" +msgid_plural "entries" +msgstr[0] "запіс" +msgstr[1] "запісы" +msgstr[2] "запісы" +msgstr[3] "запісы" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -579,7 +655,11 @@ msgstr "Дадаць яшчэ %(model)s" msgid "Delete selected %(model)s" msgstr "Выдаліць абраныя %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Праглядзець абраныя %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Дзякуем за час, які вы сёньня правялі на гэтай пляцоўцы." msgid "Log in again" @@ -677,6 +757,9 @@ msgstr "Адрас электроннай пошты:" msgid "Reset my password" msgstr "Узнавіць пароль" +msgid "Select all objects on this page for an action" +msgstr "Абяраць усе аб'екты на гэтай старонцы для дзеяньня" + msgid "All dates" msgstr "Усе даты" diff --git a/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo index 14ff528d8aa8..ac8377e421a3 100644 Binary files a/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po index 12ee1a42970d..484af859fa81 100644 --- a/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/be/LC_MESSAGES/djangojs.po @@ -2,23 +2,23 @@ # # Translators: # Viktar Palstsiuk , 2015 -# znotdead , 2016 +# znotdead , 2016,2020-2021,2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: znotdead \n" -"Language-Team: Belarusian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: znotdead , 2016,2020-2021,2023\n" +"Language-Team: Belarusian (http://app.transifex.com/django/django/language/" "be/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be\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" +"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" #, javascript-format msgid "Available %s" @@ -64,6 +64,10 @@ msgstr "" "Сьпіс абраных %s. Каб нешта прыбраць, пазначце патрэбнае ў полі ніжэй і " "пстрыкніце па стрэлцы «Прыбраць» між двума палямі." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Друкуйце ў гэтым полі, каб прасеяць спіс выбраных %s." + msgid "Remove all" msgstr "Прыбраць усё" @@ -71,6 +75,14 @@ msgstr "Прыбраць усё" msgid "Click to remove all chosen %s at once." msgstr "Каб прыбраць усе %s, пстрыкніце тут." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s абраная можнасьць нябачна" +msgstr[1] "%s абраныя можнасьці нябачны" +msgstr[2] "%s абраныя можнасьці нябачны" +msgstr[3] "%s абраныя можнасьці нябачны" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "Абралі %(sel)s з %(cnt)s" @@ -86,16 +98,16 @@ msgstr "" "незахаванае страціцца." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Абралі дзеяньне, але не захавалі зьмены ў пэўных палях. Каб захаваць, " +"Абралі дзеяньне, але не захавалі зьмены ў пэўных палях. Каб захаваць, " "націсьніце «Добра». Дзеяньне потым трэба будзе запусьціць нанова." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Абралі дзеяньне, а ў палях нічога не зьмянялі. Мажліва, вы хацелі націснуць " @@ -189,6 +201,103 @@ msgstr "Лістапад" msgid "December" msgstr "Снежань" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Сту" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Лют" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Сак" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Кра" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Чэр" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Ліп" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Жні" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Вер" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Кас" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Ліс" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Сне" + +msgid "Sunday" +msgstr "Нядзеля" + +msgid "Monday" +msgstr "Панядзелак" + +msgid "Tuesday" +msgstr "Аўторак" + +msgid "Wednesday" +msgstr "Серада" + +msgid "Thursday" +msgstr "Чацьвер" + +msgid "Friday" +msgstr "Пятніца" + +msgid "Saturday" +msgstr "Субота" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Нд" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Пн" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Аўт" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Ср" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Чц" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Пт" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Сб" + msgctxt "one letter Sunday" msgid "S" msgstr "Н" diff --git a/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo b/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo index 143965723d9f..3e89f3e437f2 100644 Binary files a/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/bg/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/bg/LC_MESSAGES/django.po b/django/contrib/admin/locale/bg/LC_MESSAGES/django.po index 73bce75b06d2..d8e8dc8a1e5c 100644 --- a/django/contrib/admin/locale/bg/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/bg/LC_MESSAGES/django.po @@ -1,20 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: +# arneatec , 2022-2024 # Boris Chervenkov , 2012 # Claude Paroz , 2014 # Jannis Leidel , 2011 # Lyuboslav Petrov , 2014 -# Todor Lubenov , 2014-2015 +# Todor Lubenov , 2020 +# Todor Lubenov , 2014-2015 # Venelin Stoykov , 2015-2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-11-17 08:33+0000\n" -"Last-Translator: Venelin Stoykov \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: arneatec , 2022-2024\n" +"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" "bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +24,10 @@ msgstr "" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Изтриване на избраните %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Успешно изтрити %(count)d %(items)s ." @@ -33,10 +39,6 @@ msgstr "Не можете да изтриете %(name)s" msgid "Are you sure?" msgstr "Сигурни ли сте?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Изтриване на избраните %(verbose_name_plural)s" - msgid "Administration" msgstr "Администрация" @@ -73,13 +75,19 @@ msgstr "Няма дата" msgid "Has date" msgstr "Има дата" +msgid "Empty" +msgstr "Празно" + +msgid "Not empty" +msgstr "Не е празно" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" "Моля въведете правилния %(username)s и парола за администраторски акаунт. " -"Моля забележете, че и двете полета са с главни и малки букви." +"Моля забележете, че и двете полета могат да са с главни и малки букви." msgid "Action:" msgstr "Действие:" @@ -91,6 +99,15 @@ msgstr "Добави друг %(verbose_name)s" msgid "Remove" msgstr "Премахване" +msgid "Addition" +msgstr "Добавка" + +msgid "Change" +msgstr "Промени" + +msgid "Deletion" +msgstr "Изтриване" + msgid "action time" msgstr "време на действие" @@ -104,7 +121,7 @@ msgid "object id" msgstr "id на обекта" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "repr на обекта" @@ -115,29 +132,29 @@ msgid "change message" msgstr "промени съобщение" msgid "log entry" -msgstr "записка" +msgstr "записка в журнала" msgid "log entries" -msgstr "записки" +msgstr "записки в журнала" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Добавен \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Добавен “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Променени \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Променени “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Изтрит \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Изтрити “%(object)s.”" msgid "LogEntry Object" msgstr "LogEntry обект" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Добавено {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Добавен {name} “{object}”." msgid "Added." msgstr "Добавено." @@ -146,16 +163,16 @@ msgid "and" msgstr "и" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Променени {fields} за {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Променени {fields} за {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "Променени {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Изтрит {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Изтрит {name} “{object}”." msgid "No fields changed." msgstr "Няма променени полета." @@ -163,48 +180,45 @@ msgstr "Няма променени полета." msgid "None" msgstr "Празно" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Задръжте \"Control\", или \"Command\" на Mac, за да изберете повече от един." +"Задръжте “Control”, или “Command” на Mac, за да изберете повече от едно." + +msgid "Select this object for an action - {}" +msgstr "Изберете този обект за действие - {}" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"Обектът {name} \"{obj}\" бе успешно добавен. Може да го редактирате по-" -"долу. " +msgid "The {name} “{obj}” was added successfully." +msgstr "Обектът {name} “{obj}” бе успешно добавен." + +msgid "You may edit it again below." +msgstr "Можете отново да го промените по-долу." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Обектът {name} \"{obj}\" бе успешно добавен. Можете да добавите още един " -"обект {name} по-долу." - -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Обектът {name} \"{obj}\" бе успешно добавен. " +"Обектът {name} “{obj}” бе успешно добавен. Можете да добавите друг {name} по-" +"долу." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"Обектът {name} \"{obj}\" бе успешно променен. Може да го редактирате по-" -"долу. " +"Обектът {name} “{obj}” бе успешно променен. Можете да го промените отново по-" +"долу." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Обектът {name} \"{obj}\" бе успешно променен. Можете да добавите още един " -"обект {name} по-долу." +"Обектът {name} “{obj}” бе успешно променен. Можете да добавите друг {name} " +"по-долу." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "Обектът {name} \"{obj}\" бе успешно променен." +msgid "The {name} “{obj}” was changed successfully." +msgstr "Обектът {name} “{obj}” бе успешно променен." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -214,15 +228,15 @@ msgstr "" "променени елементи." msgid "No action selected." -msgstr "Няма избрани действия." +msgstr "Няма избрано действие." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Обектът %(name)s \"%(obj)s\" бе успешно изтрит. " +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” беше успешно изтрит." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s с ИД \"%(key)s\" несъществува. Може би е изтрито?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s с ID “%(key)s” не съществува. Може би е изтрит?" #, python-format msgid "Add %s" @@ -232,6 +246,10 @@ msgstr "Добави %s" msgid "Change %s" msgstr "Промени %s" +#, python-format +msgid "View %s" +msgstr "Изглед %s" + msgid "Database error" msgstr "Грешка в базата данни" @@ -239,24 +257,25 @@ msgstr "Грешка в базата данни" msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s беше променено успешно." -msgstr[1] "%(count)s %(name)s бяха променени успешно." +msgstr[1] "%(count)s %(name)s бяха успешно променени." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s е избран" -msgstr[1] "Всички %(total_count)s са избрани" +msgstr[1] "Избрани са всички %(total_count)s" #, python-format msgid "0 of %(cnt)s selected" -msgstr "0 от %(cnt)s са избрани" +msgstr "Избрани са 0 от %(cnt)s" #, python-format msgid "Change history: %s" msgstr "История на промените: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -270,10 +289,10 @@ msgstr "" "на следните защитени и свързани обекти: %(related_objects)s" msgid "Django site admin" -msgstr "Административен панел" +msgstr "Django административен сайт" msgid "Django administration" -msgstr "Административен панел" +msgstr "Django администрация" msgid "Site administration" msgstr "Администрация на сайта" @@ -288,8 +307,8 @@ msgstr "%(app)s администрация" msgid "Page not found" msgstr "Страница не е намерена" -msgid "We're sorry, but the requested page could not be found." -msgstr "Съжалявам, но исканата страница не е намерена." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Съжаляваме, но поисканата страница не може да бъде намерена." msgid "Home" msgstr "Начало" @@ -304,14 +323,15 @@ msgid "Server Error (500)" msgstr "Сървърна грешка (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Станала е грешка. Съобщава се на администраторите на сайта по електронна " -"поща и трябва да бъде поправено скоро. Благодарим ви за търпението." +"Получи се грешка. Администраторите на сайта са уведомени за това чрез " +"електронна поща и грешката трябва да бъде поправена скоро. Благодарим ви за " +"търпението." msgid "Run the selected action" -msgstr "Стартирай избраните действия" +msgstr "Изпълни избраното действие" msgid "Go" msgstr "Напред" @@ -324,14 +344,30 @@ msgid "Select all %(total_count)s %(module_name)s" msgstr "Избери всички %(total_count)s %(module_name)s" msgid "Clear selection" -msgstr "Изтрий избраното" +msgstr "Изчисти избраното" + +msgid "Breadcrumbs" +msgstr "Трохи" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Модели в приложението %(name)s " + +msgid "Add" +msgstr "Добави" + +msgid "View" +msgstr "Изглед" + +msgid "You don’t have permission to view or edit anything." +msgstr "Нямате права да разглеждате или редактирате каквото и да е." msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Първо въведете потребител и парола. След това ще можете да редактирате " -"повече детайли. " +"повече детайли. " msgid "Enter a username and password." msgstr "Въведете потребителско име и парола." @@ -339,16 +375,34 @@ msgstr "Въведете потребителско име и парола." msgid "Change password" msgstr "Промени парола" -msgid "Please correct the error below." -msgstr "Моля, поправете грешките по-долу." +msgid "Set password" +msgstr "Задайте парола" -msgid "Please correct the errors below." -msgstr "Моля поправете грешките по-долу." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Моля, поправете грешката по-долу." +msgstr[1] "Моля, поправете грешките по-долу." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Въведете нова парола за потребител %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Това действие ще включи автентикация чрез парола за този " +"потребител." + +msgid "Disable password-based authentication" +msgstr "Деактивиране на автентикация чрез парола." + +msgid "Enable password-based authentication" +msgstr "Разрешаване на автентикация чрез парола." + +msgid "Skip to main content" +msgstr "Пропуснете към основното съдържание" + msgid "Welcome," msgstr "Добре дошли," @@ -374,6 +428,15 @@ msgstr "Разгледай в сайта" msgid "Filter" msgstr "Филтър" +msgid "Hide counts" +msgstr "Скрий брояча" + +msgid "Show counts" +msgstr "Покажи брояча" + +msgid "Clear all filters" +msgstr "Изчисти всички филтри" + msgid "Remove from sorting" msgstr "Премахни от подреждането" @@ -382,7 +445,16 @@ msgid "Sorting priority: %(priority_number)s" msgstr "Ред на подреждане: %(priority_number)s" msgid "Toggle sorting" -msgstr "Обърни подреждането" +msgstr "Превключи подреждането" + +msgid "Toggle theme (current theme: auto)" +msgstr "Смени темата (настояща тема: автоматична)" + +msgid "Toggle theme (current theme: light)" +msgstr "Смени темата (настояща тема: светла)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Смени темата (настояща тема: тъмна)" msgid "Delete" msgstr "Изтрий" @@ -393,30 +465,30 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Изтриването на обекта %(object_name)s '%(escaped_object)s' не може да бъде " -"извършено без да се изтрият и някои свързани обекти, върху които обаче " -"нямате права: " +"Изтриването на %(object_name)s '%(escaped_object)s' би причинило изтриване " +"на свързани обекти, но вашият потребител няма право да изтрива следните " +"видове обекти:" #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -"Изтриването на %(object_name)s '%(escaped_object)s' ще доведе до " -"заличаването на следните защитени свързани обекти:" +"Изтриването на %(object_name)s '%(escaped_object)s' изисква изтриването на " +"следните защитени свързани обекти:" #, python-format msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Наистина ли искате да изтриете обектите %(object_name)s \"%(escaped_object)s" -"\"? Следните свързани елементи също ще бъдат изтрити:" +"Наистина ли искате да изтриете %(object_name)s \"%(escaped_object)s\"? " +"Следните свързани елементи също ще бъдат изтрити:" msgid "Objects" msgstr "Обекти" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Да, сигурен съм" msgid "No, take me back" @@ -432,15 +504,15 @@ msgid "" "types of objects:" msgstr "" "Изтриването на избраните %(objects_name)s ще доведе до изтриване на свързани " -"обекти. Вашият профил няма права за изтриване на следните типове обекти:" +"обекти, но вашият потребител няма право да изтрива следните типове обекти:" #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" -"Изтриването на избраните %(objects_name)s ще доведе до заличаването на " -"следните защитени свързани обекти:" +"Изтриването на избраните %(objects_name)s изисква изтриването на следните " +"защитени свързани обекти:" #, python-format msgid "" @@ -450,9 +522,6 @@ msgstr "" "Наистина ли искате да изтриете избраните %(objects_name)s? Всички изброени " "обекти и свързаните с тях ще бъдат изтрити:" -msgid "Change" -msgstr "Промени" - msgid "Delete?" msgstr "Изтриване?" @@ -463,16 +532,6 @@ msgstr " По %(filter_title)s " msgid "Summary" msgstr "Резюме" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделите в %(name)s приложение" - -msgid "Add" -msgstr "Добави" - -msgid "You don't have permission to edit anything." -msgstr "Нямате права да редактирате каквото и да е." - msgid "Recent actions" msgstr "Последни действия" @@ -482,28 +541,49 @@ msgstr "Моите действия" msgid "None available" msgstr "Няма налични" +msgid "Added:" +msgstr "Добавени:" + +msgid "Changed:" +msgstr "Променени:" + +msgid "Deleted:" +msgstr "Изтрити:" + msgid "Unknown content" msgstr "Неизвестно съдържание" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Проблем с базата данни. Проверете дали необходимите таблици са създадени и " -"дали съответния потребител има необходимите права за достъп. " +"Проблем с вашата база данни. Убедете се, че необходимите таблици в базата са " +"създадени и че съответния потребител има необходимите права за достъп. " #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" -"Вие сте се автентикиран като %(username)s, но не сте оторизиран да достъпите " -"тази страница. Бихте ли желали да влезе с друг профил." +"Вие сте се удостоверен като %(username)s, но не сте оторизиран да достъпите " +"тази страница. Бихте ли желали да влезе с друг профил?" msgid "Forgotten your password or username?" msgstr "Забравена парола или потребителско име?" +msgid "Toggle navigation" +msgstr "Превключи навигацията" + +msgid "Sidebar" +msgstr "Страничната лента" + +msgid "Start typing to filter…" +msgstr "Започнете да пишете за филтър..." + +msgid "Filter navigation items" +msgstr "Филтриране на навигационните елементи" + msgid "Date/time" msgstr "Дата/час" @@ -513,12 +593,17 @@ msgstr "Потребител" msgid "Action" msgstr "Действие" +msgid "entry" +msgid_plural "entries" +msgstr[0] "запис" +msgstr[1] "записа" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Този обект няма исторя на промените. Вероятно не е добавен чрез " -"административния панел. " +"Този обект няма история на промените. Вероятно не е бил добавен чрез този " +"административен сайт." msgid "Show all" msgstr "Покажи всички" @@ -526,20 +611,8 @@ msgstr "Покажи всички" msgid "Save" msgstr "Запис" -msgid "Popup closing..." -msgstr "Затваряне на изкачащ прозорец..." - -#, python-format -msgid "Change selected %(model)s" -msgstr "Променете избрания %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Добавяне на друг %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Изтриване на избрания %(model)s" +msgid "Popup closing…" +msgstr "Изскачащият прозорец се затваря..." msgid "Search" msgstr "Търсене" @@ -555,16 +628,38 @@ msgid "%(full_result_count)s total" msgstr "%(full_result_count)s общо" msgid "Save as new" -msgstr "Запис като нов" +msgstr "Запиши като нов" msgid "Save and add another" -msgstr "Запис и нов" +msgstr "Запиши и добави нов" msgid "Save and continue editing" -msgstr "Запис и продължение" +msgstr "Запиши и продължи" + +msgid "Save and view" +msgstr "Запиши и прегледай" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Благодарим Ви, че използвахте този сайт днес." +msgid "Close" +msgstr "Затвори" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Променете избрания %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Добавяне на друг %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Изтриване на избрания %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "Виж избраните %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Благодарим ви за добре прекараното време с този сайт днес." msgid "Log in again" msgstr "Влез пак" @@ -576,30 +671,30 @@ msgid "Your password was changed." msgstr "Паролата ви е променена." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Въведете старата си парола /за сигурност/. След това въведете желаната нова " -"парола два пъти от съображения за сигурност" +"Въведете старата си парола /от съображения за сигурност/. След това въведете " +"желаната нова парола два пъти, за да сверим дали е написана правилно." msgid "Change my password" -msgstr "Промяна на парола" +msgstr "Промяна на паролата ми" msgid "Password reset" msgstr "Нова парола" msgid "Your password has been set. You may go ahead and log in now." -msgstr "Паролата е променена. Вече можете да се впишете" +msgstr "Паролата е променена. Вече можете да се впишете." msgid "Password reset confirmation" -msgstr "Парола за потвърждение" +msgstr "Потвърждение за смяна на паролата" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." msgstr "" -"Моля, въведете новата парола два пъти, за да може да се потвърди, че сте я " -"написали правилно." +"Моля, въведете новата парола два пъти, за да се уверим, че сте я написали " +"правилно." msgid "New password:" msgstr "Нова парола:" @@ -615,32 +710,32 @@ msgstr "" "използвана. Моля, поискайте нова промяна на паролата." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Ние ви пратихме мейл с инструкции за настройка на вашата парола, ако " -"съществува профил с имейла, който сте въвели. Вие трябва да ги получат скоро." +"По имейл изпратихме инструкции за смяна на паролата, ако съществува профил с " +"въведения от вас адрес. Би трябвало скоро да ги получите. " msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Ако не получите имейл, моля подсигурете се, че сте въвели правилно адреса с " -"който сте се регистрирал/a и/или проверете спам папката във вашата поща." +"Ако не получите имейл, моля уверете се, че сте попълнили правилно адреса, с " +"който сте се регистрирали, също проверете спам папката във вашата поща." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" -"Вие сте получили този имейл, защото сте поискали да промените паролата за " +"Вие получавати този имейл, защото сте поискали да промените паролата за " "вашия потребителски акаунт в %(site_name)s." msgid "Please go to the following page and choose a new password:" msgstr "Моля, отидете на следната страница и изберете нова парола:" -msgid "Your username, in case you've forgotten:" -msgstr "Вашето потребителско име, в случай, че сте го забравили:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Вашето потребителско име, в случай че сте го забравили:" msgid "Thanks for using our site!" msgstr "Благодарим, че ползвате сайта ни!" @@ -650,17 +745,20 @@ msgid "The %(site_name)s team" msgstr "Екипът на %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Забравили сте си паролата? Въведете своя имейл адрес по-долу, а ние ще ви " -"изпратим инструкции за създаване на нова." +"Забравили сте си паролата? Въведете своя имейл адрес по-долу, и ние ще ви " +"изпратим инструкции как да я смените с нова." msgid "Email address:" -msgstr "E-mail адреси:" +msgstr "Имейл адреси:" msgid "Reset my password" -msgstr "Нова парола" +msgstr "Задай новата ми парола" + +msgid "Select all objects on this page for an action" +msgstr "Изберете всички обекти на този страница за действие" msgid "All dates" msgstr "Всички дати" @@ -673,6 +771,10 @@ msgstr "Изберете %s" msgid "Select %s to change" msgstr "Изберете %s за промяна" +#, python-format +msgid "Select %s to view" +msgstr "Избери %s за преглед" + msgid "Date:" msgstr "Дата:" @@ -686,4 +788,4 @@ msgid "Currently:" msgstr "Сега:" msgid "Change:" -msgstr "Промени" +msgstr "Промяна:" diff --git a/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo index 4940bb9f4e71..a3eab438aa55 100644 Binary files a/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po index ded64ac3d036..4ec3a50a15a2 100644 --- a/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/bg/LC_MESSAGES/djangojs.po @@ -1,16 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: +# arneatec , 2022-2024 # Jannis Leidel , 2011 # Venelin Stoykov , 2015-2016 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Venelin Stoykov \n" -"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:59+0000\n" +"Last-Translator: arneatec , 2022-2024\n" +"Language-Team: Bulgarian (http://app.transifex.com/django/django/language/" "bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,8 +29,8 @@ msgid "" "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" "Това е списък на наличните %s . Можете да изберете някои, като ги изберете в " -"полето по-долу и след това кликнете върху \"Избор\" стрелка между двете " -"кутии." +"полето по-долу и след това кликнете върху стрелката \"Избери\" между двете " +"полета." #, javascript-format msgid "Type into this box to filter down the list of available %s." @@ -46,7 +47,7 @@ msgid "Click to choose all %s at once." msgstr "Кликнете, за да изберете всички %s наведнъж." msgid "Choose" -msgstr "Избирам" +msgstr "Избери" msgid "Remove" msgstr "Премахни" @@ -60,9 +61,13 @@ msgid "" "This is the list of chosen %s. You may remove some by selecting them in the " "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" -"Това е списък на избрания %s. Можете да премахнете някои, като ги изберете в " -"полето по-долу и след това щракнете върху \"Премахни\" стрелка между двете " -"кутии." +"Това е списък на избраните %s. Можете да премахнете някои, като ги изберете " +"в полето по-долу и след това щракнете върху стрелката \"Премахни\" между " +"двете полета." + +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Въведете в това поле, за да филтрирате списъка на избраните %s." msgid "Remove all" msgstr "Премахване на всички" @@ -71,6 +76,12 @@ msgstr "Премахване на всички" msgid "Click to remove all chosen %s at once." msgstr "Кликнете, за да премахнете всички избрани %s наведнъж." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s избрана опция не е видима" +msgstr[1] "%s selected options not visible" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s на %(cnt)s е избран" @@ -80,57 +91,57 @@ msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." msgstr "" -"Имате незапазени промени по отделни полета за редактиране. Ако започнете " -"друго, незаписаните промени ще бъдат загубени." +"Имате незапазени промени по отделни полета за редактиране. Ако изпълните " +"действие, незаписаните промени ще бъдат загубени." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Вие сте избрали действие, но не сте записали промените по полета. Моля, " -"кликнете ОК, за да се запишат. Трябва отново да започнете действие." +"кликнете ОК, за да се запишат. Трябва отново да изпълните действието." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Вие сте избрали дадена дейност, а не сте направили някакви промени по " -"полетата. Вероятно търсите Go бутон, а не бутона Save." +"Вие сте избрали действие, но не сте направили промени по полетата. Вероятно " +"търсите Изпълни бутона, а не бутона Запис." + +msgid "Now" +msgstr "Сега" + +msgid "Midnight" +msgstr "Полунощ" + +msgid "6 a.m." +msgstr "6 сутринта" + +msgid "Noon" +msgstr "По обяд" + +msgid "6 p.m." +msgstr "6 след обяд" #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Бележка: Вие сте %s час напред от времето на сървъра." -msgstr[1] "Бележка: Вие сте %s часа напред от времето на сървъра" +msgstr[1] "Бележка: Вие сте с %s часа напред от времето на сървъра" #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Внимание: Вие сте %s час назад от времето на сървъра." -msgstr[1] "Внимание: Вие сте %s часа назад от времето на сървъра." - -msgid "Now" -msgstr "Сега" +msgstr[1] "Внимание: Вие сте с %s часа назад от времето на сървъра." msgid "Choose a Time" msgstr "Изберете време" msgid "Choose a time" -msgstr "Избери време" - -msgid "Midnight" -msgstr "Полунощ" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "По обяд" - -msgid "6 p.m." -msgstr "6 след обяд" +msgstr "Изберете време" msgid "Cancel" msgstr "Отказ" @@ -183,6 +194,103 @@ msgstr "Ноември" msgid "December" msgstr "Декември" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "ян." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "февр." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "март" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "апр." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "май" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "юни" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "юли" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "авг." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "септ." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "окт." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "ноем." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "дек." + +msgid "Sunday" +msgstr "неделя" + +msgid "Monday" +msgstr "понеделник" + +msgid "Tuesday" +msgstr "вторник" + +msgid "Wednesday" +msgstr "сряда" + +msgid "Thursday" +msgstr "четвъртък" + +msgid "Friday" +msgstr "петък" + +msgid "Saturday" +msgstr "събота" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "нед" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "пон" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "вт" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "ср" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "чет" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "пет" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "съб" + msgctxt "one letter Sunday" msgid "S" msgstr "Н" @@ -210,9 +318,3 @@ msgstr "П" msgctxt "one letter Saturday" msgid "S" msgstr "С" - -msgid "Show" -msgstr "Покажи" - -msgid "Hide" -msgstr "Скрий" diff --git a/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo b/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo index ab1d7ee1b792..b742fd89c72f 100644 Binary files a/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/bn/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/bn/LC_MESSAGES/django.po b/django/contrib/admin/locale/bn/LC_MESSAGES/django.po index e36fb616799b..ef7e14bdac29 100644 --- a/django/contrib/admin/locale/bn/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/bn/LC_MESSAGES/django.po @@ -3,14 +3,15 @@ # Translators: # Anubhab Baksi, 2013 # Jannis Leidel , 2011 +# Md Arshad Hussain, 2022 # Tahmid Rafi , 2012-2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: Md Arshad Hussain\n" "Language-Team: Bengali (http://www.transifex.com/django/django/language/" "bn/)\n" "MIME-Version: 1.0\n" @@ -19,6 +20,10 @@ msgstr "" "Language: bn\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d টি %(items)s সফলভাবে মুছে ফেলা হয়েছে" @@ -30,12 +35,8 @@ msgstr "%(name)s ডিলিট করা সম্ভব নয়" msgid "Are you sure?" msgstr "আপনি কি নিশ্চিত?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "চিহ্নিত অংশটি %(verbose_name_plural)s মুছে ফেলুন" - msgid "Administration" -msgstr "" +msgstr "প্রয়োগ" msgid "All" msgstr "সকল" @@ -65,10 +66,16 @@ msgid "This year" msgstr "এ বছরে" msgid "No date" -msgstr "" +msgstr "কোন তারিখ নেই" msgid "Has date" -msgstr "" +msgstr "তারিখ আছে" + +msgid "Empty" +msgstr "খালি" + +msgid "Not empty" +msgstr "খালি নেই" #, python-format msgid "" @@ -86,11 +93,20 @@ msgstr "আরো একটি %(verbose_name)s যোগ করুন" msgid "Remove" msgstr "মুছে ফেলুন" +msgid "Addition" +msgstr "" + +msgid "Change" +msgstr "পরিবর্তন" + +msgid "Deletion" +msgstr "" + msgid "action time" msgstr "কার্য সময়" msgid "user" -msgstr "" +msgstr "ব্যবহারকারী" msgid "content type" msgstr "" @@ -99,7 +115,7 @@ msgid "object id" msgstr "অবজেক্ট আইডি" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "অবজেক্ট উপস্থাপক" @@ -116,32 +132,32 @@ msgid "log entries" msgstr "লগ এন্ট্রিসমূহ" #, python-format -msgid "Added \"%(object)s\"." -msgstr "%(object)s অ্যাড করা হয়েছে" +msgid "Added “%(object)s”." +msgstr "“%(object)s” যোগ করা হয়েছে। " #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” — %(changes)s পরিবর্তন করা হয়েছে" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" ডিলিট করা হয়েছে" +msgid "Deleted “%(object)s.”" +msgstr "“%(object)s.” মুছে ফেলা হয়েছে" msgid "LogEntry Object" msgstr "লগ-এন্ট্রি দ্রব্য" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "" msgid "Added." -msgstr "" +msgstr "যুক্ত করা হয়েছে" msgid "and" msgstr "এবং" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "" #, python-brace-format @@ -149,7 +165,7 @@ msgid "Changed {fields}." msgstr "" #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "" msgid "No fields changed." @@ -158,38 +174,39 @@ msgstr "কোন ফিল্ড পরিবর্তন হয়নি।" msgid "None" msgstr "কিছু না" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully." msgstr "" +msgid "You may edit it again below." +msgstr "নিম্নে আপনি আবার তা সম্পাদনা/পরিবর্তন করতে পারেন।" + #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} \"{obj}\" সফলভাবে যুক্ত হয়েছে৷ নিম্নে আপনি আরেকটি {name} যুক্ত করতে পারেন।" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "" msgid "" @@ -201,11 +218,11 @@ msgid "No action selected." msgstr "কোনো কাজ " #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" সফলতার সাথে মুছে ফেলা হয়েছে।" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" #, python-format @@ -216,6 +233,10 @@ msgstr "%s যোগ করুন" msgid "Change %s" msgstr "%s পরিবর্তন করুন" +#, python-format +msgid "View %s" +msgstr "" + msgid "Database error" msgstr "ডাটাবেস সমস্যা" @@ -239,8 +260,9 @@ msgstr "%(cnt)s টি থেকে ০ টি সিলেক্ট করা msgid "Change history: %s" msgstr "ইতিহাস পরিবর্তনঃ %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -270,8 +292,8 @@ msgstr "" msgid "Page not found" msgstr "পৃষ্ঠা পাওয়া যায়নি" -msgid "We're sorry, but the requested page could not be found." -msgstr "দুঃখিত, অনুরোধকৃত পাতাটি পাওয়া যায়নি।" +msgid "We’re sorry, but the requested page could not be found." +msgstr "আমরা দুঃখিত, কিন্তু অনুরোধকৃত পাতা খুঁজে পাওয়া যায়নি।" msgid "Home" msgstr "নীড়পাতা" @@ -286,7 +308,7 @@ msgid "Server Error (500)" msgstr "সার্ভার সমস্যা (৫০০)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" @@ -306,12 +328,25 @@ msgstr "%(total_count)s টি %(module_name)s এর সবগুলোই স msgid "Clear selection" msgstr "চিহ্নিত অংশের চিহ্ন মুছে ফেলুন" +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো" + +msgid "Add" +msgstr "যোগ করুন" + +msgid "View" +msgstr "দেখুন" + +msgid "You don’t have permission to view or edit anything." +msgstr "কোন কিছু দেখার বা সম্পাদনা/পরিবর্তন করার আপনার কোন অনুমতি নেই।" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"প্রথমে একটি সদস্যনাম ও পাসওয়ার্ড প্রবেশ করান। তারপরে আপনি ‍আরও সদস্য-অপশন যুক্ত করতে " -"পারবেন।" +"প্রথমে, একজন ব্যবহারকারীর নাম এবং পাসওয়ার্ড লিখুন। তাহলে, আপনি ব্যবহারকারীর " +"অন্যান্য অনেক অপশনগুলো পরিবর্তন করতে সক্ষম হবেন। " msgid "Enter a username and password." msgstr "ইউজার নেইম এবং পাসওয়ার্ড টাইপ করুন।" @@ -320,10 +355,10 @@ msgid "Change password" msgstr "পাসওয়ার্ড বদলান" msgid "Please correct the error below." -msgstr "অনুগ্রহ করে নিচের ভুলগুলো সংশোধন করুন।" +msgstr "দয়া করে নিম্নবর্ণিত ভুলটি সংশোধন করুন।" msgid "Please correct the errors below." -msgstr "" +msgstr "দয়া করে নিম্নবর্ণিত ভুলগুলো সংশোধন করুন।" #, python-format msgid "Enter a new password for the user %(username)s." @@ -354,6 +389,9 @@ msgstr "সাইটে দেখুন" msgid "Filter" msgstr "ফিল্টার" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "ক্রমানুসারে সাজানো থেকে বিরত হোন" @@ -393,11 +431,11 @@ msgstr "" msgid "Objects" msgstr "" -msgid "Yes, I'm sure" -msgstr "হ্যা়ঁ, আমি নিশ্চিত" +msgid "Yes, I’m sure" +msgstr "হ্যাঁ, আমি নিশ্চিত" msgid "No, take me back" -msgstr "" +msgstr "না, আমাক পূর্বের জায়গায় ফিরিয়ে নাও" msgid "Delete multiple objects" msgstr "একাধিক জিনিস মুছে ফেলুন" @@ -421,9 +459,6 @@ msgid "" "following objects and their related items will be deleted:" msgstr "" -msgid "Change" -msgstr "পরিবর্তন" - msgid "Delete?" msgstr "মুছে ফেলুন?" @@ -432,23 +467,13 @@ msgid " By %(filter_title)s " msgstr " %(filter_title)s অনুযায়ী " msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s এপ্লিকেশন এর মডেল গুলো" - -msgid "Add" -msgstr "যোগ করুন" - -msgid "You don't have permission to edit anything." -msgstr "কোন কিছু পরিবর্তনে আপনার অধিকার নেই।" +msgstr "সারসংক্ষেপ" msgid "Recent actions" msgstr "" msgid "My actions" -msgstr "" +msgstr "আমার করনীয়" msgid "None available" msgstr "কিছুই পাওয়া যায়নি" @@ -457,12 +482,13 @@ msgid "Unknown content" msgstr "অজানা বিষয়" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"আপনার ডাটাবেস ইনস্টলে সমস্যা হয়েছে। নিশ্চিত করুন যে, ডাটাবেস টেবিলগুলো সঠিকভাবে " -"তৈরী হয়েছে, এবং যথাযথ সদস্যের ডাটাবেস পড়ার অধিকার রয়েছে।" +"আপনার ড্যাটাবেস ইন্সটলেশন করার ক্ষেত্রে কিছু সমস্যা রয়েছে। নিশ্চিত করুন যে আপনি " +"যথাযথ ড্যাটাবেস টেবিলগুলো তৈরী করেছেন এবং নিশ্চিত করুন যে উক্ত ড্যাটাবেসটি অন্যান্য " +"ব্যবহারকারী দ্বারা ব্যবহারযোগ্য হবে। " #, python-format msgid "" @@ -473,6 +499,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "ইউজার নেইম অথবা পাসওয়ার্ড ভুলে গেছেন?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "তারিখ/সময়" @@ -482,10 +517,16 @@ msgstr "সদস্য" msgid "Action" msgstr "কার্য" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." -msgstr "এই অবজেক্টের কোন ইতিহাস নেই। সম্ভবত এটি প্রশাসন সাইট দিয়ে তৈরী করা হয়নি।" +msgstr "" msgid "Show all" msgstr "সব দেখান" @@ -493,19 +534,7 @@ msgstr "সব দেখান" msgid "Save" msgstr "সংরক্ষণ করুন" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" +msgid "Popup closing…" msgstr "" msgid "Search" @@ -530,8 +559,30 @@ msgstr "সংরক্ষণ করুন এবং আরেকটি যে msgid "Save and continue editing" msgstr "সংরক্ষণ করুন এবং সম্পাদনা চালিয়ে যান" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ওয়েবসাইটে কিছু সময় কাটানোর জন্য আপনাকে আন্তরিক ধন্যবাদ।" +msgid "Save and view" +msgstr "সংরক্ষণ করুন এবং দেখুন" + +msgid "Close" +msgstr "বন্ধ করুন" + +#, python-format +msgid "Change selected %(model)s" +msgstr "%(model)s নির্বাচিত অংশটি পরিবর্তন করুন" + +#, python-format +msgid "Add another %(model)s" +msgstr "আরো একটি%(model)s যুক্ত করুন" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "%(model)s নির্বাচিত অংশটি মুছুন " + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "আজকে ওয়েব সাইট আপনার গুনগত সময় দেয়ার জন্য আপনাকে ধন্যবাদ।" msgid "Log in again" msgstr "পুনরায় প্রবেশ করুন" @@ -543,11 +594,12 @@ msgid "Your password was changed." msgstr "আপনার পাসওয়ার্ড বদলানো হয়েছে।" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"অনুগ্রহ করে আপনার পুরনো পাসওয়ার্ড প্রবেশ করান, নিরাপত্তার কাতিরে, এবং পরপর দু’বার " -"নতুন পাসওয়ার্ড প্রবেশ করান, যাচাই করার জন্য।" +"দয়া করে নিরাপত্তার জন্য আপনার পুরানো পাসওয়ার্ডটি লিখুন, এবং তারপর নতুন পাসওয়ার্ডটি " +"দুইবার লিখুন যাতে করে আপনি সঠিক পাসওয়ার্ডটি লিখেছেন কি না তা আমরা যাচাই করতে " +"পারি। " msgid "Change my password" msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন" @@ -582,14 +634,19 @@ msgstr "" "রিসেটের জন্য অনুগ্রহ করে নতুনভাবে আবেদন করুন।" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"আপনার পাসওয়ার্ড সংযোজন করার জন্য আমরা আপনাকে নির্দেশাবলী সম্বলিত একটি ই-মেইল " +"পাঠাবো, যদি আপনার দেয়া ই-মেইলে আইডিটি এখানে বিদ্যমান থাকে। আপনি খুব দ্রুত তা " +"পেয়ে যাবেন। " msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"আপনি যদি কোন ই-মেইল না পেয়ে থাকে, তবে দয়া করে নিশ্চিত করুন আপনি যে ই-মেইল আইডি " +"দিয়ে নিবন্ধন করেছিলেন তা এখানে লিখেছেন, এবং আপনার স্পাম ফোল্ডার চেক করুন। " #, python-format msgid "" @@ -602,8 +659,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "অনুগ্রহ করে নিচের পাতাটিতে যান এবং নতুন পাসওয়ার্ড বাছাই করুনঃ" -msgid "Your username, in case you've forgotten:" -msgstr "আপনার সদস্যনাম, যদি ভুলে গিয়ে থাকেনঃ" +msgid "Your username, in case you’ve forgotten:" +msgstr "আপনার ব্যবহারকারীর নাম, যদি আপনি ভুলে গিয়ে থাকেন:" msgid "Thanks for using our site!" msgstr "আমাদের সাইট ব্যবহারের জন্য ধন্যবাদ!" @@ -613,11 +670,11 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s দল" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"পাসওয়ার্ড ভুলে গেছেন? নিচে আপনার ইমেইল এড্রেস দিন, এবং আমরা নতুন পাসওয়ার্ড সেট " -"করার নিয়ম-কানুন আপনাকে ই-মেইল করব।" +"আপনার পাসওয়ার্ড ভুলে গিয়েছেন? নিম্নে আপনার ই-মেইল আইডি লিখুন, এবং আমরা আপনাকে " +"নতুন পাসওয়ার্ড সংযোজন করার জন্য নির্দেশাবলী সম্বলিত ই-মেইল পাঠাবো।" msgid "Email address:" msgstr "ইমেইল ঠিকানা:" @@ -636,6 +693,10 @@ msgstr "%s বাছাই করুন" msgid "Select %s to change" msgstr "%s পরিবর্তনের জন্য বাছাই করুন" +#, python-format +msgid "Select %s to view" +msgstr "দেখার জন্য %s নির্বাচন করুন" + msgid "Date:" msgstr "তারিখঃ" diff --git a/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo index 868da26cf68b..46df4b0cde53 100644 Binary files a/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ca/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ca/LC_MESSAGES/django.po b/django/contrib/admin/locale/ca/LC_MESSAGES/django.po index 092a3d5125fc..c89550d341ac 100644 --- a/django/contrib/admin/locale/ca/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ca/LC_MESSAGES/django.po @@ -1,21 +1,24 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Antoni Aloy , 2014-2015,2017 +# Antoni Aloy , 2014-2015,2017,2021 # Carles Barrobés , 2011-2012,2014 # duub qnnp, 2015 +# Emilio Carrion, 2022 # GerardoGa , 2018 # Gil Obradors Via , 2019 # Gil Obradors Via , 2019 # Jannis Leidel , 2011 +# Manel Clos , 2020 +# Marc Compte , 2021 # Roger Pons , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-03 20:46+0000\n" -"Last-Translator: Gil Obradors Via \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: Emilio Carrion\n" "Language-Team: Catalan (http://www.transifex.com/django/django/language/" "ca/)\n" "MIME-Version: 1.0\n" @@ -24,6 +27,10 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar els %(verbose_name_plural)s seleccionats" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Eliminat/s %(count)d %(items)s satisfactòriament." @@ -35,10 +42,6 @@ msgstr "No es pot esborrar %(name)s" msgid "Are you sure?" msgstr "N'esteu segur?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar els %(verbose_name_plural)s seleccionats" - msgid "Administration" msgstr "Administració" @@ -75,12 +78,18 @@ msgstr "Sense data" msgid "Has date" msgstr "Té data" +msgid "Empty" +msgstr "Buit" + +msgid "Not empty" +msgstr "No buit" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Si us plau, introduïu un %(username)s i contrasenya correcta per un compte " +"Si us plau, introduïu un %(username)s i contrasenya correctes per un compte " "de personal. Observeu que ambdós camps són sensibles a majúscules." msgid "Action:" @@ -184,34 +193,32 @@ msgid "The {name} “{obj}” was added successfully." msgstr "El {name} \"{obj}\" fou afegit amb èxit." msgid "You may edit it again below." -msgstr "Hauria d'editar de nou a sota." +msgstr "Podeu editar-lo de nou a sota." #, python-brace-format msgid "" "The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Pots afegir un altre {name} a " +"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu afegir un altre {name} a " "sota." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Pots editar-ho un altra vegada a " -"sota." +"El {name} \"{obj}\" fou canviat amb èxit. Podeu editar-lo de nou a sota." #, python-brace-format msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"El {name} \"{obj}\" s'ha afegit amb èxit. Pots editar-lo altra vegada a " -"sota." +"El {name} \"{obj}\" s'ha afegit amb èxit. Podeu editar-lo de nou a sota." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"El {name} \"{obj}\" fou canviat amb èxit. Pots afegir un altre {name} a " +"El {name} \"{obj}\" fou canviat amb èxit. Podeu afegir un altre {name} a " "sota." #, python-brace-format @@ -271,8 +278,9 @@ msgstr "0 de %(cnt)s seleccionats" msgid "Change history: %s" msgstr "Modificar històric: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -343,6 +351,19 @@ msgstr "Seleccioneu tots %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Netejar la selecció" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models en l'aplicació %(name)s" + +msgid "Add" +msgstr "Afegir" + +msgid "View" +msgstr "Visualitza" + +msgid "You don’t have permission to view or edit anything." +msgstr "No teniu permisos per veure o editar" + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -357,7 +378,7 @@ msgid "Change password" msgstr "Canviar contrasenya" msgid "Please correct the error below." -msgstr "Si us plau, corregeix l'error de sota" +msgstr "Si us plau, corregiu l'error de sota." msgid "Please correct the errors below." msgstr "Si us plau, corregiu els errors mostrats a sota." @@ -391,6 +412,9 @@ msgstr "Veure al lloc" msgid "Filter" msgstr "Filtre" +msgid "Clear all filters" +msgstr "Netejar tots els filtres" + msgid "Remove from sorting" msgstr "Treure de la ordenació" @@ -468,9 +492,6 @@ msgstr "" "N'esteu segur de voler esborrar els %(objects_name)s seleccionats? " "S'esborraran tots els objects següents i els seus elements relacionats:" -msgid "View" -msgstr "Visualitza" - msgid "Delete?" msgstr "Eliminar?" @@ -481,16 +502,6 @@ msgstr "Per %(filter_title)s " msgid "Summary" msgstr "Resum" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models en l'aplicació %(name)s" - -msgid "Add" -msgstr "Afegir" - -msgid "You don’t have permission to view or edit anything." -msgstr "No teniu permisos per veure o editar" - msgid "Recent actions" msgstr "Accions recents" @@ -523,6 +534,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Heu oblidat la vostra contrasenya o nom d'usuari?" +msgid "Toggle navigation" +msgstr "Canviar mode de navegació" + +msgid "Start typing to filter…" +msgstr "Comença a teclejar per filtrar ..." + +msgid "Filter navigation items" +msgstr "Filtrar els items de navegació" + msgid "Date/time" msgstr "Data/hora" @@ -532,6 +552,12 @@ msgstr "Usuari" msgid "Action" msgstr "Acció" +msgid "entry" +msgstr "entrada" + +msgid "entries" +msgstr "entrades" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -578,7 +604,7 @@ msgstr "Tanca" #, python-format msgid "Change selected %(model)s" -msgstr "Canviea el %(model)s seleccionat" +msgstr "Canvieu el %(model)s seleccionat" #, python-format msgid "Add another %(model)s" @@ -588,8 +614,12 @@ msgstr "Afegeix un altre %(model)s" msgid "Delete selected %(model)s" msgstr "Esborra el %(model)s seleccionat" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gràcies per passar una estona de qualitat al web durant el dia d'avui." +#, python-format +msgid "View selected %(model)s" +msgstr "Vista seleccionada %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Gràcies per dedicar temps de qualitat avui a aquesta web." msgid "Log in again" msgstr "Iniciar sessió de nou" @@ -702,7 +732,7 @@ msgstr "Seleccioneu %s per modificar" #, python-format msgid "Select %s to view" -msgstr "Selecciona %sper a veure" +msgstr "Selecciona %s per a veure" msgid "Date:" msgstr "Data:" diff --git a/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo index 7b6e4dea0a8c..44b9c4b6de23 100644 Binary files a/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po index 5fbbab8d75ec..29795f2012ef 100644 --- a/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ca/LC_MESSAGES/djangojs.po @@ -1,18 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Antoni Aloy , 2017 +# Antoni Aloy , 2017,2021 # Carles Barrobés , 2011-2012,2014 +# Carlton Gibson , 2023 +# Emilio Carrion, 2022 # Jannis Leidel , 2011 # Roger Pons , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Antoni Aloy \n" -"Language-Team: Catalan (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Carlton Gibson , 2023\n" +"Language-Team: Catalan (http://app.transifex.com/django/django/language/" "ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,6 +68,10 @@ msgstr "" "los a la caixa de sota i fent clic a la fletxa \"Eliminar\" entre les dues " "caixes." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Escriviu en aquesta caixa per a filtrar la llista de %s seleccionats." + msgid "Remove all" msgstr "Esborrar-los tots" @@ -73,6 +79,12 @@ msgstr "Esborrar-los tots" msgid "Click to remove all chosen %s at once." msgstr "Feu clic per eliminar tots els %s escollits d'un cop." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opcion seleccionada no visible" +msgstr[1] "%s opcions seleccionades no visibles" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s seleccionat" @@ -86,21 +98,21 @@ msgstr "" "acció, es perdran aquests canvis no desats." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Heu seleccionat una acció, però encara no heu desat els vostres canvis a " -"camps individuals. Si us plau premeu OK per desar. Haureu de tornar a " -"executar l'acció." +"Has seleccionat una acció, però encara no l'has desat els canvis dels camps " +"individuals. Si us plau clica OK per desar. Necessitaràs tornar a executar " +"l'acció." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Heu seleccionat una acció i no heu fet cap canvi a camps individuals. " -"Probablement esteu cercant el botó 'Anar' enlloc de 'Desar'." +"Has seleccionat una acció i no has fet cap canvi als camps individuals. " +"Probablement estàs cercant el botó Anar enlloc del botó de Desar." msgid "Now" msgstr "Ara" @@ -186,6 +198,103 @@ msgstr "Novembre" msgid "December" msgstr "Desembre" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Gen" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Oct" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" + +msgid "Sunday" +msgstr "Diumenge" + +msgid "Monday" +msgstr "Dilluns" + +msgid "Tuesday" +msgstr "Dimarts" + +msgid "Wednesday" +msgstr "Dimecres" + +msgid "Thursday" +msgstr "Dijous" + +msgid "Friday" +msgstr "Divendres" + +msgid "Saturday" +msgstr "Dissabte" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "dg." + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "dl." + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "dt." + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "dc." + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "dj." + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "dv." + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "ds." + msgctxt "one letter Sunday" msgid "S" msgstr "D" diff --git a/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..686f0925f3cb Binary files /dev/null and b/django/contrib/admin/locale/ckb/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po b/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po new file mode 100644 index 000000000000..b3157f5b2e6b --- /dev/null +++ b/django/contrib/admin/locale/ckb/LC_MESSAGES/django.po @@ -0,0 +1,792 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abdulla Dlshad, 2023 +# Bakhtawar Barzan, 2021 +# Bakhtawar Barzan, 2021 +# Kosar Tofiq Saeed , 2020 +# pejar hewrami , 2020 +# Swara , 2022,2024 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Swara , 2022,2024\n" +"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" +"language/ckb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ckb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)sە هەڵبژێردراوەکان بسڕەوە" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "سەرکەوتووانە %(count)d %(items)sی سڕییەوە." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "ناتوانرێت %(name)s بسڕێتەوە" + +msgid "Are you sure?" +msgstr "ئایا تۆ دڵنیایت؟" + +msgid "Administration" +msgstr "بەڕێوەبەرایەتی" + +msgid "All" +msgstr "هەمووی" + +msgid "Yes" +msgstr "بەڵێ" + +msgid "No" +msgstr "نەخێر" + +msgid "Unknown" +msgstr "نەزانراو" + +msgid "Any date" +msgstr "هەر بەروارێک" + +msgid "Today" +msgstr "ئەمڕۆ" + +msgid "Past 7 days" +msgstr "7 ڕۆژی ڕابردوو" + +msgid "This month" +msgstr "ئەم مانگە" + +msgid "This year" +msgstr "ئەمساڵ" + +msgid "No date" +msgstr "بەروار نییە" + +msgid "Has date" +msgstr "بەرواری هەیە" + +msgid "Empty" +msgstr "بەتاڵ" + +msgid "Not empty" +msgstr "بەتاڵ نییە" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"تکایە %(username)s و تێپەڕەوشە دروستەکە بنوسە بۆ هەژمارێکی ستاف. تێبینی بکە " +"لەوانەیە هەردوو خانەکە دۆخی هەستیار بێت بۆ پیتەکان." + +msgid "Action:" +msgstr "کردار:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "زیادکردنی %(verbose_name)sی تر" + +msgid "Remove" +msgstr "لابردن" + +msgid "Addition" +msgstr "خستنەسەر" + +msgid "Change" +msgstr "گۆڕین" + +msgid "Deletion" +msgstr "سڕینەوە" + +msgid "action time" +msgstr "کاتی کردار" + +msgid "user" +msgstr "بەکارهێنەر" + +msgid "content type" +msgstr "جۆری ناوەڕۆک" + +msgid "object id" +msgstr "ناسنامەی ئۆبجێکت" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "نوێنەرایەتی ئۆبجێکت" + +msgid "action flag" +msgstr "ئاڵای کردار" + +msgid "change message" +msgstr "گۆڕینی پەیام" + +msgid "log entry" +msgstr "ڕاپۆرتی تۆمار" + +msgid "log entries" +msgstr "ڕاپۆرتی تۆمارەکان" + +#, python-format +msgid "Added “%(object)s”." +msgstr "\"%(object)s\"ی زیادکرد." + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "\"%(object)s\"— %(changes)s گۆڕدرا" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" سڕایەوە." + +msgid "LogEntry Object" +msgstr "ئۆبجێکتی ڕاپۆرتی تۆمار" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "{name} \"{object}\" زیادکرا." + +msgid "Added." +msgstr "زیادکرا." + +msgid "and" +msgstr "و" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "{fields} بۆ {name} “{object}” گۆڕدرا." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} گۆڕدرا." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "{name} “{object}” سڕایەوە." + +msgid "No fields changed." +msgstr "هیچ خانەیەک نەگۆڕاوە." + +msgid "None" +msgstr "هیچ" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" +"پەنجە داگرە لەسەر “Control”، یاخود “Command” لەسەر ماک، بۆ هەڵبژاردنی " +"دانەیەک زیاتر." + +msgid "Select this object for an action - {}" +msgstr "ئەم تەنە هەڵبژێرە بۆ کردارێک - {}" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” بەسەرکەوتوویی زیادکرا." + +msgid "You may edit it again below." +msgstr "دەگونجێت تۆ دووبارە لەخوارەوە دەستکاری بکەیت." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" +"{name} “{obj}” بەسەرکەوتوویی زیادکرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " +"زیادبکەیت." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" +"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە دووبارە دەستکاری " +"بکەیتەوە." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} “{obj}” بەسەرکەوتوویی گۆڕدرا. دەگونجێت تۆ لە خوارەوە {name}یەکی تر " +"زیاد بکەیت." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name}ی “{obj}” بەسەرکەوتوویی گۆڕدرا." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"دەبێت بڕگەکان هەڵبژێردرابن تاوەکو کرداریان لەسەر ئەنجام بدەیت. هیچ بڕگەیەک " +"نەگۆڕدراوە." + +msgid "No action selected." +msgstr "هیچ کردارێک هەڵنەبژێردراوە." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s\"%(obj)s\" بەسەرکەوتوویی سڕدرایەوە." + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s بە ناسنامەی \"%(key)s\" بوونی نییە. لەوانەیە سڕدرابێتەوە؟" + +#, python-format +msgid "Add %s" +msgstr "زیادکردنی %s" + +#, python-format +msgid "Change %s" +msgstr "گۆڕینی %s" + +#, python-format +msgid "View %s" +msgstr "بینینی %s" + +msgid "Database error" +msgstr "هەڵەی بنکەدراوە" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدرا." +msgstr[1] "%(count)s %(name)s بەسەرکەوتوویی گۆڕدران." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "%(total_count)s هەڵبژێردراوە" +msgstr[1] "هەمووی %(total_count)s هەڵبژێردراون" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 لە %(cnt)s هەڵبژێردراوە" + +#, python-format +msgid "Change history: %s" +msgstr "مێژووی گۆڕین: %s" + +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(instance)sی %(class_name)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"سڕینەوەی %(instance)sی %(class_name)s پێویستی بە سڕینەوەی ئەم ئۆبجێکتە " +"پەیوەندیدارە پارێزراوانەیە: %(related_objects)s" + +msgid "Django site admin" +msgstr "بەڕێوەبەری پێگەی جەنگۆ" + +msgid "Django administration" +msgstr "بەڕێوەبەرایەتی جەنگۆ" + +msgid "Site administration" +msgstr "بەڕێوەبەرایەتی پێگە" + +msgid "Log in" +msgstr "چوونەژوورەوە" + +#, python-format +msgid "%(app)s administration" +msgstr "بەڕێوەبەرایەتی %(app)s" + +msgid "Page not found" +msgstr "پەڕە نەدۆزرایەوە" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "داوای لێبوردن ئەکەین، بەڵام ناتوانرێت پەڕەی داواکراو بدۆزرێتەوە." + +msgid "Home" +msgstr "ماڵەوە" + +msgid "Server error" +msgstr "هەڵەی ڕاژەکار" + +msgid "Server error (500)" +msgstr "هەڵەی ڕاژەکار (500)" + +msgid "Server Error (500)" +msgstr "هەڵەی ڕاژەکار (500)" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"هەڵەیەک بوونی هەبووە. ڕاپۆرت دراوە بە پێگەی بەڕێوەبەرایەتی لەڕێی ئیمەیڵەوە و " +"دەبێت بەزوویی چاکبکرێت. سوپاس بۆ ئارامگرتنت." + +msgid "Run the selected action" +msgstr "کرداری هەڵبژێردراو جێبەجێ بکە" + +msgid "Go" +msgstr "بڕۆ" + +msgid "Click here to select the objects across all pages" +msgstr "کرتە لێرە بکە بۆ هەڵبژاردنی ئۆبجێکتەکان لە تەواوی هەموو پەڕەکان" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "هەموو %(total_count)s %(module_name)s هەڵبژێرە" + +msgid "Clear selection" +msgstr "پاککردنەوەی هەڵبژاردن" + +msgid "Breadcrumbs" +msgstr "وردەنان" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "مۆدێلەکان لە بەرنامەی %(name)s" + +msgid "Add" +msgstr "زیادکردن" + +msgid "View" +msgstr "بینین" + +msgid "You don’t have permission to view or edit anything." +msgstr "تۆ ڕێگەپێدراو نیت بۆ بینین یان دەستکاری هیچ شتێک." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"سەرەتا، ناوی بەکارهێنەر و تێپەڕەوشە بنوسە. پاشان دەتوانیت دەستکاری زیاتری " +"هەڵبژاردنەکانی بەکارهێنەر بکەیت." + +msgid "Enter a username and password." +msgstr "ناوی بەکارهێنەر و تێپەڕەوشە بنوسە" + +msgid "Change password" +msgstr "گۆڕینی تێپەڕەوشە" + +msgid "Set password" +msgstr "دانانی تێپەڕەوشە" + +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "تکایە ئەم هەڵەیەی خوارەوە ڕاست بکەرەوە." +msgstr[1] "تکایە هەڵەکانی خوارەوە ڕاست بکەرەوە." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "تێپەڕەوشەی نوێ بۆ بەکارهێنەری %(username)s بنوسە" + +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"ئەم کردارە چالاک دەکات لەسەر بنەمای تێپەڕەوشەی ئەم " +"بەکارهێنەرە." + +msgid "Disable password-based authentication" +msgstr "ناچالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" + +msgid "Enable password-based authentication" +msgstr "چالاککردنی ڕەسەنایەتی لەسەر بنەمای تێپەڕەوشە" + +msgid "Skip to main content" +msgstr "تێیپەڕێنە بۆ ناوەڕۆکی سەرەکی" + +msgid "Welcome," +msgstr "بەخێربێیت،" + +msgid "View site" +msgstr "بینینی پێگە" + +msgid "Documentation" +msgstr "بەڵگەنامە" + +msgid "Log out" +msgstr "چوونەدەرەوە" + +#, python-format +msgid "Add %(name)s" +msgstr "زیادکردنی %(name)s" + +msgid "History" +msgstr "مێژوو" + +msgid "View on site" +msgstr "بینین لەسەر پێگە" + +msgid "Filter" +msgstr "پاڵاوتن" + +msgid "Hide counts" +msgstr "ژماردن بشارەوە" + +msgid "Show counts" +msgstr "ژماردن پیشانبدە" + +msgid "Clear all filters" +msgstr "پاکردنەوەی هەموو پاڵاوتنەکان" + +msgid "Remove from sorting" +msgstr "لابردن لە ڕیزکردن" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "ڕیزکردنی لە پێشینە: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "ڕیزکردنی پێچەوانە" + +msgid "Toggle theme (current theme: auto)" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: خۆکار)" + +msgid "Toggle theme (current theme: light)" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: ڕووناک)" + +msgid "Toggle theme (current theme: dark)" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: تاریک)" + +msgid "Delete" +msgstr "سڕینەوە" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"سڕینەوەی %(object_name)s ‘%(escaped_object)s‘ دەبێتە هۆی سڕینەوەی ئۆبجێکتی " +"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " +"ئۆبجێکتانەی تر:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"سڕینەوەی %(object_name)sی ‘%(escaped_object)s‘ پێویستیی بە سڕینەوەی ئەم " +"ئۆبجێکتە پەیوەندیدارە پارێزراوانەیە:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"ئایا تۆ دڵنیایت کە دەتەوێت %(object_name)sی \"%(escaped_object)s\" بسڕیتەوە؟ " +"هەموو ئەم ئۆبجێکتە پەیوەندیدارانەش دەسڕێتەوە:" + +msgid "Objects" +msgstr "ئۆبجێکتەکان" + +msgid "Yes, I’m sure" +msgstr "بەڵێ، من دڵنیام" + +msgid "No, take me back" +msgstr "نەخێر، من بگەڕێنەرەوە دواوە" + +msgid "Delete multiple objects" +msgstr "سڕینەوەی چەندین ئۆبجێکت" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"سڕینەوەی %(objects_name)sی هەڵبژێردراو دەبێتە هۆی سڕینەوەی ئۆبجێکتی " +"پەیوەندیدار، بەڵام هەژمارەکەت ڕێگەپێدراو نییە بۆ سڕینەوەی ئەم جۆرە " +"ئۆبجێکتانەی تر:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"سڕینەوەی %(objects_name)sی هەڵبژێردراو پێویستیی بە سڕینەوەی ئەم ئۆبجێکتە " +"پەیوەندیدارە پارێزراوانەیە:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"ئایا تۆ دڵنیایت دەتەوێت %(objects_name)sی هەڵبژێردراو بسڕیتەوە؟ هەموو ئەم " +"ئۆبجێکت و بڕگە پەیوەندیدارەکانیان دەسڕێنەوە:" + +msgid "Delete?" +msgstr "سڕینەوە؟" + +#, python-format +msgid " By %(filter_title)s " +msgstr "بەپێی %(filter_title)s" + +msgid "Summary" +msgstr "پوختە" + +msgid "Recent actions" +msgstr "کردارە نوێیەکان" + +msgid "My actions" +msgstr "کردارەکانم" + +msgid "None available" +msgstr "هیچ شتيک بەردەست نییە" + +msgid "Added:" +msgstr "زیادکرا:" + +msgid "Changed:" +msgstr "گۆڕدرا:" + +msgid "Deleted:" +msgstr "سڕایەوە:" + +msgid "Unknown content" +msgstr "ناوەڕۆکی نەزانراو" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"هەڵەیەک هەیە لە دامەزراندنی بنکەدراوەکەت. دڵنیاببەرەوە لەوەی خشتە گونجاوەکان " +"دروستکراون، دڵنیاببەرەوە بنکەدراوەکە ئەخوێندرێتەوە لەلایەن بەکارهێنەری " +"گونجاوەوە." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"تۆ ڕەسەنایەتیت هەیە وەکو %(username)s, بەڵام ڕێگەپێدراو نیت بۆ ئەم لاپەڕەیە. " +"دەتەوێت بە هەژمارێکی تر بچیتەژوورەوە؟" + +msgid "Forgotten your password or username?" +msgstr "تێپەڕەوشە یان ناوی بەکارهێنەرەکەت بیرچۆتەوە؟" + +msgid "Toggle navigation" +msgstr "کردنەوەو داخستنی ڕێنیشاندەر" + +msgid "Sidebar" +msgstr "شریتی لاتەنیشت" + +msgid "Start typing to filter…" +msgstr "دەست بکە بە نوسین بۆ پاڵاوتن..." + +msgid "Filter navigation items" +msgstr "بڕگەکانی ڕێنیشاندەر بپاڵێوە" + +msgid "Date/time" +msgstr "بەروار/کات" + +msgid "User" +msgstr "بەکارهێنەر" + +msgid "Action" +msgstr "کردار" + +msgid "entry" +msgid_plural "entries" +msgstr[0] "تۆمار" +msgstr[1] "تۆمارەکان" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" +"ئەم ئۆبجێکتە مێژووی گۆڕانکاری نییە. ڕەنگە لە ڕێگەی بەڕێەوەبەری ئەم پێگەیەوە " +"زیادنەکرابێت." + +msgid "Show all" +msgstr "پیشاندانی هەمووی" + +msgid "Save" +msgstr "پاشەکەوتکردن" + +msgid "Popup closing…" +msgstr "پەنجەرەکە دادەخرێت..." + +msgid "Search" +msgstr "گەڕان" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s ئەنجام" +msgstr[1] "%(counter)s ئەنجام" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)sگشتی" + +msgid "Save as new" +msgstr "پاشەکەوتکردن وەک نوێ" + +msgid "Save and add another" +msgstr "پاشەکەوتی بکەو دانەیەکی تر زیاد بکە" + +msgid "Save and continue editing" +msgstr "پاشەکەوتی بکەو بەردەوامبە لە گۆڕنکاری" + +msgid "Save and view" +msgstr "پاشەکەوتی بکەو پیشانی بدە" + +msgid "Close" +msgstr "داخستن" + +#, python-format +msgid "Change selected %(model)s" +msgstr "هەڵبژێردراوەکان بگۆڕە %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "زیادکردنی %(model)sی تر" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "هەڵبژێردراوەکان بسڕەوە %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "سەیری %(model)s هەڵبژێردراوەکان بکە" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "سوپاس بۆ بەسەربردنی هەندێک کاتێکی ئەمڕۆ لەگەڵ ماڵپەڕەکەدا." + +msgid "Log in again" +msgstr "دووبارە چوونەژوورەوە" + +msgid "Password change" +msgstr "گۆڕینی تێپەڕەوشە" + +msgid "Your password was changed." +msgstr "تێپەڕەوشەت گۆڕدرا." + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"لەپێناو پاراستندا تکایە تێپەڕەوشە کۆنەکەت بنووسە، پاشان دووجار تێپەڕەوشە " +"نوێیەکەت بنووسە بۆ ئەوەی بتوانین پشتڕاستی بکەینەوە کە بە دروستی نووسیوتە." + +msgid "Change my password" +msgstr "گۆڕینی تێپەڕەوشەکەم" + +msgid "Password reset" +msgstr "دانانەوەی تێپەڕەوشە" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "تێپەڕەوشەکەت دانرایەوە. لەوانەیە ئێستا بچیتە سەرەوە و بچیتەژوورەوە." + +msgid "Password reset confirmation" +msgstr "دووپاتکردنەوەی دانانەوەی تێپەڕەوشە" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"تکایە دووجار تێپەڕەوشە نوێیەکەت بنوسە، پاشان دەتوانین دڵنیابین کە بە دروستی " +"نوسراوە." + +msgid "New password:" +msgstr "تێپەڕەوشەی نوێ:" + +msgid "Confirm password:" +msgstr "دووپاتکردنەوەی تێپەڕەوشە:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"بەستەری دانانەوەی تێپەڕەوشە نادروست بوو، لەوانەیە لەبەر ئەوەی پێشتر " +"بەکارهاتووە. تکایە داوای دانانەوەی تێپەڕەوشەی نوێ بکە." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"ئێمە ڕێنماییەکانمان بۆ دانانی تێپەڕەوشەکەت ئیمەیڵ بۆت ناردووە، ئەگەر " +"هەژمارێک هەبێت لەگەڵ ئەو ئیمەیڵەی کە نوسیوتە. پێویستە بەم زووانە بەدەستت " +"بگات." + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" +"ئەگەر تۆ نامەی ئەلیکترۆنیت بەدەست نەگەیشت، ئەوا دڵنیا ببەرەوە کە تۆ ئەو " +"ناونیشانەت داخڵکردووە کە پێی تۆمار بوویت، وە فۆڵدەری سپامەکەت بپشکنە." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"تۆ ئەم نامە ئەلیکترۆنیەت بەدەست گەیشتووە لەبەرئەوەی داواکاری دوبارە " +"دانانەوەی تێپەڕە ووشەت کردبوو بۆ هەژماری بەکارهێنەرەکەت لە %(site_name)s." + +msgid "Please go to the following page and choose a new password:" +msgstr "تکایە بڕۆ بۆ پەڕەی دیاریکراو و تێپەڕەوشەیەکی نوێ هەڵبژێرە:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "ناوی بەکارهێنەری تۆ، لە کاتێکدا بیرت چووبێتەوە:" + +msgid "Thanks for using our site!" +msgstr "سوپاس بۆ بەکارهێنانی پێگەکەمان!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "دەستەی %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" +"تێپەڕەوشەکەت بیرچووەتەوە؟ ئیمەیڵەکەت لەخوارەوە بنوسە، پاشان ئێمە ئێمەیڵی " +"ڕێنمایت بۆ دەنێرین بۆ دانانی دانەیەکی نوێ." + +msgid "Email address:" +msgstr "ناونیشانی ئیمەیڵ:" + +msgid "Reset my password" +msgstr "دانانەوەی تێپەڕەوشەکەم" + +msgid "Select all objects on this page for an action" +msgstr "هەموو تەنەکان لەم لاپەڕەیە بۆ کردارێک هەڵبژێرە" + +msgid "All dates" +msgstr "هەموو بەروارەکان" + +#, python-format +msgid "Select %s" +msgstr "%s هەڵبژێرە" + +#, python-format +msgid "Select %s to change" +msgstr "%s هەڵبژێرە بۆ گۆڕین" + +#, python-format +msgid "Select %s to view" +msgstr "%s هەڵبژێرە بۆ بینین" + +msgid "Date:" +msgstr "بەروار:" + +msgid "Time:" +msgstr "کات:" + +msgid "Lookup" +msgstr "گەڕان" + +msgid "Currently:" +msgstr "ئێستاکە:" + +msgid "Change:" +msgstr "گۆڕین:" diff --git a/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..95cbda79074a Binary files /dev/null and b/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..23b1fd0f87a9 --- /dev/null +++ b/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.po @@ -0,0 +1,329 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Bakhtawar Barzan, 2021 +# Bakhtawar Barzan, 2021 +# Mariusz Felisiak , 2023 +# Swara , 2022-2024 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2024-01-20 07:59+0000\n" +"Last-Translator: Swara , 2022-2024\n" +"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" +"language/ckb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ckb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "%sە بەردەستەکان" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"ئەمە لیستی بەردەستی %s . دەتوانیت هەندێکیان هەڵبژێریت بە هەڵبژاردنییان لەم " +"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"هەڵبژێرە\" لە نێوان هەردوو " +"بوخچەکەدا." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی بەردەستەکان بپاڵێویت %s." + +msgid "Filter" +msgstr "پاڵاوتن" + +msgid "Choose all" +msgstr "هەمووی هەڵبژێرە" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "کرتە بکە بۆ هەڵبژاردنی هەموو %s بەیەکجار." + +msgid "Choose" +msgstr "‌هەڵبژاردن" + +msgid "Remove" +msgstr "لابردن" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s هەڵبژێردراوەکان" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"ئەمە لیستی هەڵبژێردراوی %s. دەتوانیت هەندێکیان لاببەیت بە هەڵبژاردنییان لەم " +"بوخچەی خوارەوە و پاشان کرتەکردن لەسەر ئاراستەی \"لابردن\" لە نێوان هەردوو " +"بوخچەکەدا." + +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی هەڵبژێردراوەکان بپاڵێویت %s." + +msgid "Remove all" +msgstr "لابردنی هەمووی" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "کرتە بکە بۆ لابردنی هەموو ئەوانەی هەڵبژێردراون %sبە یەکجار." + +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%sبژاردەی هەڵبژێردراو نابینرێت" +msgstr[1] "%s هەڵبژاردە هەڵبژێردراوەکان نابینرێن" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" +msgstr[1] "‫%(sel)s لە %(cnt)s هەڵبژێردراوە" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"گۆڕانکاریی پاشەکەوتنەکراوت هەیە لەسەر خانەی یەکلایەنەی شیاوی دەستکاریی. " +"ئەگەر کردارێک ئەنجام بدەیت، گۆڕانکارییە پاشەکەوتنەکراوەکانت لەدەست دەچن." + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"چالاکییەکی هەڵبژێردراوت هەیە، بەڵام خانە تاکلایەنەکانت تا ئێستا پاشەکەوت " +"نەکردووە. تکایە کردتە لەسەر باشە بکە بۆ پاشەکەوتکردن. پێویستە دووبارە " +"چالاکییەکە ئەنجام بدەیتەوە." + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "" +"چالاکییەکی هەڵبژێردراوت هەیە، هەروەها هیچ گۆڕانکارییەکت لەسەر خانە " +"تاکلایەنەکانت نیە. ڕەنگە تۆ بەدوای دوگمەی بڕۆدا بگەڕێیت نەک دوگمەی " +"پاشەکەوتکردن." + +msgid "Now" +msgstr "ئێستا" + +msgid "Midnight" +msgstr "نیوەشەو" + +msgid "6 a.m." +msgstr "6ی بەیانی" + +msgid "Noon" +msgstr "نیوەڕۆ" + +msgid "6 p.m." +msgstr "6ی ئێوارە." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." +msgstr[1] "تێبینی: تۆ %s کاتژمێر لەپێش کاتی ڕاژەوەیت." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." +msgstr[1] "تێبینی: تۆ %s کاتژمێر لەدوای کاتی ڕاژەوەیت." + +msgid "Choose a Time" +msgstr "کاتێک دیاریبکە" + +msgid "Choose a time" +msgstr "کاتێک دیاریبکە" + +msgid "Cancel" +msgstr "پاشگەزبوونەوە" + +msgid "Today" +msgstr "ئەمڕۆ" + +msgid "Choose a Date" +msgstr "ڕۆژێک دیاریبکە" + +msgid "Yesterday" +msgstr "دوێنێ" + +msgid "Tomorrow" +msgstr "سبەینێ" + +msgid "January" +msgstr "‎ڕێبەندان" + +msgid "February" +msgstr "‎ڕەشەمە" + +msgid "March" +msgstr "نەورۆز" + +msgid "April" +msgstr "‎گوڵان" + +msgid "May" +msgstr "جۆزەردان" + +msgid "June" +msgstr "‎پوشپەڕ" + +msgid "July" +msgstr "گەلاوێژ " + +msgid "August" +msgstr "‎خەرمانان" + +msgid "September" +msgstr "‎ڕەزبەر" + +msgid "October" +msgstr "‎گەڵاڕێزان" + +msgid "November" +msgstr "‎سەرماوەرز" + +msgid "December" +msgstr "‎بەفرانبار" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "‎ڕێبەندان" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "ڕەشەمە" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "نەورۆز" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "گوڵان" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "‎جۆزەردان" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "پوشپەڕ" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "‎گەلاوێژ" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "خەرمانان" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "‎ڕەزبەر" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "‎گەڵاڕێزان" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "‎سەرماوەرز" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "‎بەفرانبار" + +msgid "Sunday" +msgstr "یەکشەممە" + +msgid "Monday" +msgstr "دووشەممە" + +msgid "Tuesday" +msgstr "سێشەممە" + +msgid "Wednesday" +msgstr "چوارشەممە" + +msgid "Thursday" +msgstr "پێنجشەممە" + +msgid "Friday" +msgstr "هەینی" + +msgid "Saturday" +msgstr "شەممە" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "یەک" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "دوو" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "سێ" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "چوار" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "پێنج" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "هەینی" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "شەم" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "ی" + +msgctxt "one letter Monday" +msgid "M" +msgstr "د" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "س" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "چ" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "پ" + +msgctxt "one letter Friday" +msgid "F" +msgstr "هە" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "ش" + +msgid "Show" +msgstr "پیشاندان" + +msgid "Hide" +msgstr "شاردنەوە" diff --git a/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo b/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo index abaa75826ecc..0dc5f9abc908 100644 Binary files a/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/cs/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/cs/LC_MESSAGES/django.po b/django/contrib/admin/locale/cs/LC_MESSAGES/django.po index 474d93ef25f7..39c3679cafa5 100644 --- a/django/contrib/admin/locale/cs/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/cs/LC_MESSAGES/django.po @@ -2,19 +2,22 @@ # # Translators: # Jannis Leidel , 2011 +# Jan Papež , 2024 +# Jiří Podhorecký , 2024 +# Jiří Podhorecký , 2022 # Jirka Vejrazka , 2011 # Tomáš Ehrlich , 2015 # Vláďa Macek , 2013-2014 -# Vláďa Macek , 2015-2019 +# Vláďa Macek , 2015-2020,2022 # yedpodtrzitko , 2016 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-19 09:23+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Jan Papež , 2024\n" +"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,6 +25,10 @@ msgstr "" "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" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Úspěšně odstraněno: %(count)d %(items)s." @@ -33,10 +40,6 @@ msgstr "Nelze smazat %(name)s" msgid "Are you sure?" msgstr "Jste si jisti?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Odstranit vybrané položky typu %(verbose_name_plural)s" - msgid "Administration" msgstr "Správa" @@ -73,6 +76,12 @@ msgstr "Bez data" msgid "Has date" msgstr "Má datum" +msgid "Empty" +msgstr "Prázdná hodnota" + +msgid "Not empty" +msgstr "Neprázdná hodnota" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -177,6 +186,9 @@ msgstr "" "Výběr více než jedné položky je možný přidržením klávesy \"Control\", na " "Macu \"Command\"." +msgid "Select this object for an action - {}" +msgstr "Vyberte tento objekt pro akci - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "Položka typu {name} \"{obj}\" byla úspěšně přidána." @@ -198,12 +210,6 @@ msgstr "" "Položka typu {name} \"{obj}\" byla úspěšně změněna. Níže ji můžete dále " "upravovat." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"Položka \"{obj}\" typu {name} byla úspěšně přidána. Níže ji můžete dále " -"upravovat." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -273,8 +279,9 @@ msgstr "Vybraných je 0 položek z celkem %(cnt)s." msgid "Change history: %s" msgstr "Historie změn: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s: %(instance)s" @@ -344,6 +351,22 @@ msgstr "Vybrat všechny položky typu %(module_name)s, celkem %(total_count)s." msgid "Clear selection" msgstr "Zrušit výběr" +msgid "Breadcrumbs" +msgstr "Drobečky" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modely v aplikaci %(name)s" + +msgid "Add" +msgstr "Přidat" + +msgid "View" +msgstr "Zobrazit" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nemáte oprávnění k zobrazení ani úpravám." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -357,16 +380,36 @@ msgstr "Zadejte uživatelské jméno a heslo." msgid "Change password" msgstr "Změnit heslo" -msgid "Please correct the error below." -msgstr "Opravte níže uvedenou chybu." +msgid "Set password" +msgstr "Nastavit heslo" -msgid "Please correct the errors below." -msgstr "Opravte níže uvedené chyby." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Opravte prosím níže uvedenou chybu." +msgstr[1] "Opravte prosím níže uvedené chyby." +msgstr[2] "Opravte prosím níže uvedené chyby." +msgstr[3] "Opravte prosím níže uvedené chyby." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Zadejte nové heslo pro uživatele %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Tato akce povolí pro tohoto uživatele ověřování na základě " +"hesla." + +msgid "Disable password-based authentication" +msgstr "Zakázat ověřování pomocí hesla" + +msgid "Enable password-based authentication" +msgstr "Povolit ověřování pomocí hesla" + +msgid "Skip to main content" +msgstr "Přeskočit na hlavní obsah" + msgid "Welcome," msgstr "Vítejte, uživateli" @@ -392,6 +435,15 @@ msgstr "Zobrazení na webu" msgid "Filter" msgstr "Filtr" +msgid "Hide counts" +msgstr "Skrýt počty" + +msgid "Show counts" +msgstr "Zobrazit počty" + +msgid "Clear all filters" +msgstr "Zrušit všechny filtry" + msgid "Remove from sorting" msgstr "Přestat řadit" @@ -402,6 +454,15 @@ msgstr "Priorita řazení: %(priority_number)s" msgid "Toggle sorting" msgstr "Přehodit řazení" +msgid "Toggle theme (current theme: auto)" +msgstr "Přepnout motiv (aktuální motiv: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Přepnout motiv (aktuální motiv: světlý)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Přepnout motiv (aktuální motiv: tmavý)" + msgid "Delete" msgstr "Odstranit" @@ -469,9 +530,6 @@ msgstr "" "Opravdu má být odstraněny vybrané položky typu %(objects_name)s? Všechny " "vybrané a s nimi související položky budou odstraněny:" -msgid "View" -msgstr "Zobrazit" - msgid "Delete?" msgstr "Odstranit?" @@ -482,16 +540,6 @@ msgstr " Dle: %(filter_title)s " msgid "Summary" msgstr "Shrnutí" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v aplikaci %(name)s" - -msgid "Add" -msgstr "Přidat" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nemáte oprávnění k zobrazení ani úpravám." - msgid "Recent actions" msgstr "Nedávné akce" @@ -501,6 +549,15 @@ msgstr "Moje akce" msgid "None available" msgstr "Nic" +msgid "Added:" +msgstr "Přidáno:" + +msgid "Changed:" +msgstr "Změněno:" + +msgid "Deleted:" +msgstr "Smazáno:" + msgid "Unknown content" msgstr "Neznámý obsah" @@ -524,6 +581,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Zapomněli jste heslo nebo uživatelské jméno?" +msgid "Toggle navigation" +msgstr "Přehodit navigaci" + +msgid "Sidebar" +msgstr "Boční panel" + +msgid "Start typing to filter…" +msgstr "Filtrovat začnete vepsáním textu..." + +msgid "Filter navigation items" +msgstr "Filtrace položek navigace" + msgid "Date/time" msgstr "Datum a čas" @@ -533,6 +602,13 @@ msgstr "Uživatel" msgid "Action" msgstr "Operace" +msgid "entry" +msgid_plural "entries" +msgstr[0] "položka" +msgstr[1] "položky" +msgstr[2] "položek" +msgstr[3] "položek" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -591,8 +667,12 @@ msgstr "Přidat další %(model)s" msgid "Delete selected %(model)s" msgstr "Odstranit vybrané položky typu %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Děkujeme za čas strávený s tímto webem." +#, python-format +msgid "View selected %(model)s" +msgstr "Zobrazení vybraných %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Děkujeme za dnešní čas strávený s tímto neobyčejným webem." msgid "Log in again" msgstr "Přihlaste se znovu" @@ -689,6 +769,9 @@ msgstr "E-mailová adresa:" msgid "Reset my password" msgstr "Obnovit heslo" +msgid "Select all objects on this page for an action" +msgstr "Vyberte všechny objekty na této stránce pro akci" + msgid "All dates" msgstr "Všechna data" diff --git a/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo index 098d82a37126..db715bc9fcda 100644 Binary files a/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po index 7785061dc26f..1e8fa7373946 100644 --- a/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/cs/LC_MESSAGES/djangojs.po @@ -2,17 +2,20 @@ # # Translators: # Jannis Leidel , 2011 +# Jan Papež , 2024 +# Jiří Podhorecký , 2024 +# Jiří Podhorecký , 2022 # Jirka Vejrazka , 2011 # Vláďa Macek , 2012,2014 -# Vláďa Macek , 2015-2016 +# Vláďa Macek , 2015-2016,2020-2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Vláďa Macek \n" -"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:59+0000\n" +"Last-Translator: Jan Papež , 2024\n" +"Language-Team: Czech (http://app.transifex.com/django/django/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -66,6 +69,10 @@ msgstr "" "Seznam vybraných položek %s. Jednotlivě je lze odebrat tak, že na ně v " "rámečku klepnete a pak klepnete na šipku \"Odebrat mezi rámečky." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Zadáním do tohoto pole vyfiltrujete seznam vybraných %s." + msgid "Remove all" msgstr "Odebrat vše" @@ -73,6 +80,14 @@ msgstr "Odebrat vše" msgid "Click to remove all chosen %s at once." msgstr "Chcete-li najednou odebrat všechny vybrané položky %s, klepněte sem." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s vybraná volba není viditelná" +msgstr[1] "%s vybrané volby nejsou viditelné" +msgstr[2] "%s vybrané volby nejsou viditelné" +msgstr[3] "%s vybrané volby nejsou viditelné" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "Vybrána je %(sel)s položka z celkem %(cnt)s." @@ -88,20 +103,20 @@ msgstr "" "operaci provedete." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " "Uložíte klepnutím na tlačítko OK. Pak bude třeba operaci spustit znovu." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Byla vybrána operace a jednotlivá pole nejsou změněná. Patrně hledáte " -"tlačítko Provést spíše než Uložit." +"Byla vybrána operace, ale dosud nedošlo k uložení změn jednotlivých polí. " +"Patrně využijete tlačítko Provést spíše než tlačítko Uložit." msgid "Now" msgstr "Nyní" @@ -123,7 +138,7 @@ msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Poznámka: Váš čas o %s hodinu předstihuje čas na serveru." msgstr[1] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." -msgstr[2] "Poznámka: Váš čas o %s hodin předstihuje čas na serveru." +msgstr[2] "Poznámka: Váš čas o %s hodiny předstihuje čas na serveru." msgstr[3] "Poznámka: Váš čas o %s hodin předstihuje čas na serveru." #, javascript-format @@ -131,7 +146,7 @@ msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Poznámka: Váš čas se o %s hodinu zpožďuje za časem na serveru." msgstr[1] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." -msgstr[2] "Poznámka: Váš čas se o %s hodin zpožďuje za časem na serveru." +msgstr[2] "Poznámka: Váš čas se o %s hodiny zpožďuje za časem na serveru." msgstr[3] "Poznámka: Váš čas se o %s hodin zpožďuje za časem na serveru." msgid "Choose a Time" @@ -191,6 +206,103 @@ msgstr "listopad" msgid "December" msgstr "prosinec" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Led" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Úno" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Bře" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Dub" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Kvě" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Čvn" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Čvc" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Srp" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Zář" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Říj" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Lis" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Pro" + +msgid "Sunday" +msgstr "Neděle" + +msgid "Monday" +msgstr "Pondělí" + +msgid "Tuesday" +msgstr "Úterý" + +msgid "Wednesday" +msgstr "Středa" + +msgid "Thursday" +msgstr "Čtvrtek" + +msgid "Friday" +msgstr "Pátek" + +msgid "Saturday" +msgstr "Sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Ned" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pon" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Úte" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Stř" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Čtv" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pát" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sob" + msgctxt "one letter Sunday" msgid "S" msgstr "N" @@ -218,9 +330,3 @@ msgstr "P" msgctxt "one letter Saturday" msgid "S" msgstr "S" - -msgid "Show" -msgstr "Zobrazit" - -msgid "Hide" -msgstr "Skrýt" diff --git a/django/contrib/admin/locale/da/LC_MESSAGES/django.mo b/django/contrib/admin/locale/da/LC_MESSAGES/django.mo index ad12abba866c..f909706469ab 100644 Binary files a/django/contrib/admin/locale/da/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/da/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/da/LC_MESSAGES/django.po b/django/contrib/admin/locale/da/LC_MESSAGES/django.po index fecb82ed7d1a..293030a1c9f8 100644 --- a/django/contrib/admin/locale/da/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/da/LC_MESSAGES/django.po @@ -3,7 +3,8 @@ # Translators: # Christian Joergensen , 2012 # Dimitris Glezos , 2012 -# Erik Wognsen , 2013,2015-2019 +# Erik Ramsgaard Wognsen , 2020-2024 +# Erik Ramsgaard Wognsen , 2013,2015-2020 # Finn Gruwier Larsen, 2011 # Jannis Leidel , 2011 # valberg , 2014-2015 @@ -11,16 +12,20 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 19:58+0000\n" -"Last-Translator: Erik Wognsen \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen , 2020-2024\n" +"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Slet valgte %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s blev slettet." @@ -32,10 +37,6 @@ msgstr "Kan ikke slette %(name)s " msgid "Are you sure?" msgstr "Er du sikker?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slet valgte %(verbose_name_plural)s" - msgid "Administration" msgstr "Administration" @@ -72,6 +73,12 @@ msgstr "Ingen dato" msgid "Has date" msgstr "Har dato" +msgid "Empty" +msgstr "Tom" + +msgid "Not empty" +msgstr "Ikke tom" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -174,6 +181,9 @@ msgstr "Ingen" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "Hold “Ctrl”, eller “Æbletasten” på Mac, nede for at vælge mere end én." +msgid "Select this object for an action - {}" +msgstr "Vælg dette objekt for en handling - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” blev tilføjet." @@ -192,10 +202,6 @@ msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "{name} “{obj}” blev ændret. Du kan redigere den/det igen herunder." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” blev tilføjet. Du kan redigere den/det igen herunder." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -261,8 +267,9 @@ msgstr "0 af %(cnt)s valgt" msgid "Change history: %s" msgstr "Ændringshistorik: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -332,6 +339,22 @@ msgstr "Vælg alle %(total_count)s %(module_name)s " msgid "Clear selection" msgstr "Ryd valg" +msgid "Breadcrumbs" +msgstr "Sti" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i applikationen %(name)s" + +msgid "Add" +msgstr "Tilføj" + +msgid "View" +msgstr "Vis" + +msgid "You don’t have permission to view or edit anything." +msgstr "Du har ikke rettigheder til at se eller redigere noget." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -345,16 +368,34 @@ msgstr "Indtast et brugernavn og en adgangskode." msgid "Change password" msgstr "Skift adgangskode" -msgid "Please correct the error below." -msgstr "Ret venligst fejlen herunder." +msgid "Set password" +msgstr "Sæt adgangskode" -msgid "Please correct the errors below." -msgstr "Ret venligst fejlene herunder." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ret venligst fejlen herunder." +msgstr[1] "Ret venligst fejlene herunder." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Indtast en ny adgangskode for brugeren %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Denne handling vil aktivere adgangskodebaseret " +"autentificering for denne bruger." + +msgid "Disable password-based authentication" +msgstr "Deaktivér adgangskodebaseret autentificering." + +msgid "Enable password-based authentication" +msgstr "Aktivér adgangskodebaseret autentificering." + +msgid "Skip to main content" +msgstr "Gå til hovedindhold" + msgid "Welcome," msgstr "Velkommen," @@ -380,6 +421,15 @@ msgstr "Se på website" msgid "Filter" msgstr "Filtrer" +msgid "Hide counts" +msgstr "Skjul antal" + +msgid "Show counts" +msgstr "Vis antal" + +msgid "Clear all filters" +msgstr "Nulstil alle filtre" + msgid "Remove from sorting" msgstr "Fjern fra sortering" @@ -390,6 +440,15 @@ msgstr "Sorteringsprioritet: %(priority_number)s" msgid "Toggle sorting" msgstr "Skift sortering" +msgid "Toggle theme (current theme: auto)" +msgstr "Skift tema (nuværende tema: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Skift tema (nuværende tema: lyst)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Skift tema (nuværende tema: mørkt)" + msgid "Delete" msgstr "Slet" @@ -457,9 +516,6 @@ msgstr "" "Er du sikker på du vil slette de valgte %(objects_name)s? Alle de følgende " "objekter og deres relaterede emner vil blive slettet:" -msgid "View" -msgstr "Vis" - msgid "Delete?" msgstr "Slet?" @@ -470,16 +526,6 @@ msgstr " Efter %(filter_title)s " msgid "Summary" msgstr "Sammendrag" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Add" -msgstr "Tilføj" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke rettigheder til at se eller redigere noget." - msgid "Recent actions" msgstr "Seneste handlinger" @@ -489,6 +535,15 @@ msgstr "Mine handlinger" msgid "None available" msgstr "Ingen tilgængelige" +msgid "Added:" +msgstr "Tilføjede:" + +msgid "Changed:" +msgstr "Ændrede:" + +msgid "Deleted:" +msgstr "Slettede:" + msgid "Unknown content" msgstr "Ukendt indhold" @@ -510,7 +565,19 @@ msgstr "" "denne site. Vil du logge ind med en anden brugerkonto?" msgid "Forgotten your password or username?" -msgstr "Har du glemt dit password eller brugernavn?" +msgstr "Har du glemt din adgangskode eller dit brugernavn?" + +msgid "Toggle navigation" +msgstr "Vis/skjul navigation" + +msgid "Sidebar" +msgstr "Sidebjælke" + +msgid "Start typing to filter…" +msgstr "Skriv for at filtrere…" + +msgid "Filter navigation items" +msgstr "Filtrer navigationsemner" msgid "Date/time" msgstr "Dato/tid" @@ -521,6 +588,11 @@ msgstr "Bruger" msgid "Action" msgstr "Funktion" +msgid "entry" +msgid_plural "entries" +msgstr[0] "post" +msgstr[1] "poster" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -577,7 +649,11 @@ msgstr "Tilføj endnu en %(model)s" msgid "Delete selected %(model)s" msgstr "Slet valgte %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Vis valgte %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Tak for den kvalitetstid du brugte på websitet i dag." msgid "Log in again" @@ -678,6 +754,9 @@ msgstr "E-mail-adresse:" msgid "Reset my password" msgstr "Nulstil min adgangskode" +msgid "Select all objects on this page for an action" +msgstr "Vælg alle objekter på denne side for en handling" + msgid "All dates" msgstr "Alle datoer" diff --git a/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo index a16a583f108c..452684951fb8 100644 Binary files a/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po index d278b3487354..064355dc340f 100644 --- a/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/da/LC_MESSAGES/djangojs.po @@ -2,7 +2,8 @@ # # Translators: # Christian Joergensen , 2012 -# Erik Wognsen , 2012,2015-2016 +# Erik Ramsgaard Wognsen , 2021-2023 +# Erik Ramsgaard Wognsen , 2012,2015-2016,2020 # Finn Gruwier Larsen, 2011 # Jannis Leidel , 2011 # Mathias Rav , 2017 @@ -11,10 +12,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Mathias Rav \n" -"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Erik Ramsgaard Wognsen , 2021-2023\n" +"Language-Team: Danish (http://app.transifex.com/django/django/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -67,6 +68,10 @@ msgstr "" "dem i kassen nedenfor og derefter klikke på \"Fjern\"-pilen mellem de to " "kasser." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Skriv i dette felt for at filtrere listen af valgte %s." + msgid "Remove all" msgstr "Fjern alle" @@ -74,6 +79,12 @@ msgstr "Fjern alle" msgid "Click to remove all chosen %s at once." msgstr "Klik for at fjerne alle valgte %s med det samme." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s valgt mulighed ikke vist" +msgstr[1] "%s valgte muligheder ikke vist" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s af %(cnt)s valgt" @@ -87,20 +98,20 @@ msgstr "" "udfører en handling fra drop-down-menuen, vil du miste disse ændringer." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Du har valgt en handling, men du har ikke gemt dine ændringer til et eller " "flere felter. Klik venligst OK for at gemme og vælg dernæst handlingen igen." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Du har valgt en handling, og du har ikke udført nogen ændringer på felter. " -"Det, du søger er formentlig Udfør-knappen i stedet for Gem-knappen." +"Du søger formentlig Udfør-knappen i stedet for Gem-knappen." msgid "Now" msgstr "Nu" @@ -186,6 +197,103 @@ msgstr "November" msgid "December" msgstr "December" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec" + +msgid "Sunday" +msgstr "søndag" + +msgid "Monday" +msgstr "mandag" + +msgid "Tuesday" +msgstr "tirsdag" + +msgid "Wednesday" +msgstr "onsdag" + +msgid "Thursday" +msgstr "torsdag" + +msgid "Friday" +msgstr "fredag" + +msgid "Saturday" +msgstr "lørdag" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "søn" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "man" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "tir" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "ons" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "tor" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "fre" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "lør" + msgctxt "one letter Sunday" msgid "S" msgstr "S" diff --git a/django/contrib/admin/locale/de/LC_MESSAGES/django.mo b/django/contrib/admin/locale/de/LC_MESSAGES/django.mo index 270fb3a69f99..c260e8d8bc20 100644 Binary files a/django/contrib/admin/locale/de/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/de/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/de/LC_MESSAGES/django.po b/django/contrib/admin/locale/de/LC_MESSAGES/django.po index 0baf5169e9f9..205d7973788f 100644 --- a/django/contrib/admin/locale/de/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/de/LC_MESSAGES/django.po @@ -4,25 +4,30 @@ # André Hagenbruch, 2012 # Florian Apolloner , 2011 # Dimitris Glezos , 2012 -# Jannis Vajen, 2013 +# Florian Apolloner , 2020-2023 +# jnns, 2013 # Jannis Leidel , 2013-2018,2020 -# Jannis Vajen, 2016 -# Markus Holtermann , 2020 +# jnns, 2016 +# Markus Holtermann , 2020,2023 # Markus Holtermann , 2013,2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-17 22:40+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: Markus Holtermann , 2020,2023\n" +"Language-Team: German (http://app.transifex.com/django/django/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" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ausgewählte %(verbose_name_plural)s löschen" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Erfolgreich %(count)d %(items)s gelöscht." @@ -34,10 +39,6 @@ msgstr "Kann %(name)s nicht löschen" msgid "Are you sure?" msgstr "Sind Sie sicher?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ausgewählte %(verbose_name_plural)s löschen" - msgid "Administration" msgstr "Administration" @@ -74,6 +75,12 @@ msgstr "Kein Datum" msgid "Has date" msgstr "Besitzt Datum" +msgid "Empty" +msgstr "Leer" + +msgid "Not empty" +msgstr "Nicht leer" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -178,6 +185,9 @@ msgstr "" "Halten Sie die Strg-Taste (⌘ für Mac) während des Klickens gedrückt, um " "mehrere Einträge auszuwählen." +msgid "Select this object for an action - {}" +msgstr "Dieses Objekt für eine Aktion auswählen - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} „{obj}“ wurde erfolgreich hinzugefügt." @@ -252,8 +262,8 @@ msgstr "Datenbankfehler" #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s \"%(name)s\" wurde erfolgreich geändert." -msgstr[1] "%(count)s \"%(name)s\" wurden erfolgreich geändert." +msgstr[0] "%(count)s %(name)s wurde erfolgreich geändert." +msgstr[1] "%(count)s %(name)s wurden erfolgreich geändert." #, python-format msgid "%(total_count)s selected" @@ -269,8 +279,9 @@ msgstr "0 von %(cnt)s ausgewählt" msgid "Change history: %s" msgstr "Änderungsgeschichte: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -341,6 +352,24 @@ msgstr "Alle %(total_count)s %(module_name)s auswählen" msgid "Clear selection" msgstr "Auswahl widerrufen" +msgid "Breadcrumbs" +msgstr "„Brotkrümel“" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelle der %(name)s-Anwendung" + +msgid "Add" +msgstr "Hinzufügen" + +msgid "View" +msgstr "Ansehen" + +msgid "You don’t have permission to view or edit anything." +msgstr "" +"Das Benutzerkonto besitzt nicht die nötigen Rechte, um etwas anzusehen oder " +"zu ändern." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -355,10 +384,9 @@ msgid "Change password" msgstr "Passwort ändern" msgid "Please correct the error below." -msgstr "Bitte den unten aufgeführten Fehler korrigieren." - -msgid "Please correct the errors below." -msgstr "Bitte die unten aufgeführten Fehler korrigieren." +msgid_plural "Please correct the errors below." +msgstr[0] "Bitte den unten aufgeführten Fehler korrigieren." +msgstr[1] "Bitte die unten aufgeführten Fehler korrigieren." #, python-format msgid "Enter a new password for the user %(username)s." @@ -366,11 +394,14 @@ msgstr "" "Bitte geben Sie ein neues Passwort für den Benutzer %(username)s ein." +msgid "Skip to main content" +msgstr "Zum Hauptinhalt springen" + msgid "Welcome," msgstr "Willkommen," msgid "View site" -msgstr "Auf der Website anzeigen" +msgstr "Website anzeigen" msgid "Documentation" msgstr "Dokumentation" @@ -391,6 +422,15 @@ msgstr "Auf der Website anzeigen" msgid "Filter" msgstr "Filter" +msgid "Hide counts" +msgstr "Anzahl verstecken" + +msgid "Show counts" +msgstr "Anzahl anzeigen" + +msgid "Clear all filters" +msgstr "Alle Filter zurücksetzen" + msgid "Remove from sorting" msgstr "Aus der Sortierung entfernen" @@ -401,6 +441,15 @@ msgstr "Sortierung: %(priority_number)s" msgid "Toggle sorting" msgstr "Sortierung ein-/ausschalten" +msgid "Toggle theme (current theme: auto)" +msgstr "Design wechseln (aktuelles Design: automatisch)" + +msgid "Toggle theme (current theme: light)" +msgstr "Design wechseln (aktuelles Design: hell)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Design wechseln (aktuelles Design: dunkel)" + msgid "Delete" msgstr "Löschen" @@ -410,9 +459,9 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Das Löschen des %(object_name)s \"%(escaped_object)s\" hätte das Löschen " -"davon abhängiger Daten zur Folge, aber Sie haben nicht die nötigen Rechte, " -"um die folgenden davon abhängigen Daten zu löschen:" +"Das Löschen des %(object_name)s „%(escaped_object)s“ hätte das Löschen davon " +"abhängiger Daten zur Folge, aber Sie haben nicht die nötigen Rechte, um die " +"folgenden davon abhängigen Daten zu löschen:" #, python-format msgid "" @@ -427,7 +476,7 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen " +"Sind Sie sicher, dass Sie %(object_name)s „%(escaped_object)s“ löschen " "wollen? Es werden zusätzlich die folgenden davon abhängigen Daten gelöscht:" msgid "Objects" @@ -468,9 +517,6 @@ msgstr "" "Sind Sie sicher, dass Sie die ausgewählten %(objects_name)s löschen wollen? " "Alle folgenden Objekte und ihre verwandten Objekte werden gelöscht:" -msgid "View" -msgstr "Ansehen" - msgid "Delete?" msgstr "Löschen?" @@ -481,18 +527,6 @@ msgstr " Nach %(filter_title)s " msgid "Summary" msgstr "Zusammenfassung" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelle der %(name)s-Anwendung" - -msgid "Add" -msgstr "Hinzufügen" - -msgid "You don’t have permission to view or edit anything." -msgstr "" -"Das Benutzerkonto besitzt nicht die nötigen Rechte, um etwas anzusehen oder " -"zu ändern." - msgid "Recent actions" msgstr "Neueste Aktionen" @@ -502,6 +536,15 @@ msgstr "Meine Aktionen" msgid "None available" msgstr "Keine vorhanden" +msgid "Added:" +msgstr "Hinzugefügt:" + +msgid "Changed:" +msgstr "Geändert:" + +msgid "Deleted:" +msgstr "Gelöscht:" + msgid "Unknown content" msgstr "Unbekannter Inhalt" @@ -525,6 +568,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Benutzername oder Passwort vergessen?" +msgid "Toggle navigation" +msgstr "Navigation ein-/ausblenden" + +msgid "Sidebar" +msgstr "Seitenleiste" + +msgid "Start typing to filter…" +msgstr "Eingabe beginnen um zu filtern…" + +msgid "Filter navigation items" +msgstr "Navigationselemente filtern" + msgid "Date/time" msgstr "Datum/Zeit" @@ -534,6 +589,11 @@ msgstr "Benutzer" msgid "Action" msgstr "Aktion" +msgid "entry" +msgid_plural "entries" +msgstr[0] "Eintrag" +msgstr[1] "Einträge" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -590,8 +650,14 @@ msgstr "%(model)s hinzufügen" msgid "Delete selected %(model)s" msgstr "Ausgewählte %(model)s löschen" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten verbracht haben." +#, python-format +msgid "View selected %(model)s" +msgstr "Ausgewählte %(model)s ansehen" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Vielen Dank, dass Sie heute ein paar nette Minuten auf dieser Webseite " +"verbracht haben." msgid "Log in again" msgstr "Erneut anmelden" @@ -691,6 +757,9 @@ msgstr "E-Mail-Adresse:" msgid "Reset my password" msgstr "Mein Passwort zurücksetzen" +msgid "Select all objects on this page for an action" +msgstr "Alle Objekte auf dieser Seite für eine Aktion auswählen" + msgid "All dates" msgstr "Alle Daten" diff --git a/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo index d30346a4b338..c579ef5af97b 100644 Binary files a/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po index ba4f0cb2232b..2fe140ffe8f2 100644 --- a/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/de/LC_MESSAGES/djangojs.po @@ -2,16 +2,18 @@ # # Translators: # André Hagenbruch, 2011-2012 -# Jannis Leidel , 2011,2013-2016 -# Jannis, 2016 +# Florian Apolloner , 2020-2023 +# Jannis Leidel , 2011,2013-2016,2023 +# jnns, 2016 +# Markus Holtermann , 2020,2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Markus Holtermann , 2020,2023\n" +"Language-Team: German (http://app.transifex.com/django/django/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,7 +30,7 @@ msgid "" "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" "Dies ist die Liste der verfügbaren %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des \"Auswählen\"-Pfeils auswählen." +"markieren und mithilfe des „Auswählen“-Pfeils auswählen." #, javascript-format msgid "Type into this box to filter down the list of available %s." @@ -62,7 +64,12 @@ msgid "" "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" "Dies ist die Liste der ausgewählten %s. Einfach im unten stehenden Feld " -"markieren und mithilfe des \"Entfernen\"-Pfeils wieder entfernen." +"markieren und mithilfe des „Entfernen“-Pfeils wieder entfernen." + +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"In diesem Feld tippen, um die Liste der ausgewählten %s einzuschränken." msgid "Remove all" msgstr "Alle entfernen" @@ -71,6 +78,12 @@ msgstr "Alle entfernen" msgid "Click to remove all chosen %s at once." msgstr "Klicken, um alle ausgewählten %s auf einmal zu entfernen." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s ausgewählte Option nicht sichtbar" +msgstr[1] "%s ausgewählte Optionen nicht sichtbar" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s von %(cnt)s ausgewählt" @@ -85,22 +98,37 @@ msgstr "" "verwerfen?" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Sie haben eine Aktion ausgewählt, aber ihre vorgenommenen Änderungen nicht " +"Sie haben eine Aktion ausgewählt, aber Ihre vorgenommenen Änderungen nicht " "gespeichert. Klicken Sie OK, um dennoch zu speichern. Danach müssen Sie die " "Aktion erneut ausführen." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Sie haben eine Aktion ausgewählt, aber keine Änderungen an bearbeitbaren " -"Feldern vorgenommen. Sie wollten wahrscheinlich auf \"Ausführen\" und nicht " -"auf \"Speichern\" klicken." +"Feldern vorgenommen. Sie wollten wahrscheinlich auf „Ausführen“ und nicht " +"auf „Speichern“ klicken." + +msgid "Now" +msgstr "Jetzt" + +msgid "Midnight" +msgstr "Mitternacht" + +msgid "6 a.m." +msgstr "6 Uhr" + +msgid "Noon" +msgstr "Mittag" + +msgid "6 p.m." +msgstr "18 Uhr" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -114,27 +142,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Achtung: Sie sind %s Stunde hinter der Serverzeit." msgstr[1] "Achtung: Sie sind %s Stunden hinter der Serverzeit." -msgid "Now" -msgstr "Jetzt" - msgid "Choose a Time" msgstr "Uhrzeit wählen" msgid "Choose a time" msgstr "Uhrzeit" -msgid "Midnight" -msgstr "Mitternacht" - -msgid "6 a.m." -msgstr "6 Uhr" - -msgid "Noon" -msgstr "Mittag" - -msgid "6 p.m." -msgstr "18 Uhr" - msgid "Cancel" msgstr "Abbrechen" @@ -186,6 +199,103 @@ msgstr "November" msgid "December" msgstr "Dezember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mrz" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dez" + +msgid "Sunday" +msgstr "Sonntag" + +msgid "Monday" +msgstr "Montag" + +msgid "Tuesday" +msgstr "Dienstag" + +msgid "Wednesday" +msgstr "Mittwoch" + +msgid "Thursday" +msgstr "Donnerstag" + +msgid "Friday" +msgstr "Freitag" + +msgid "Saturday" +msgstr "Samstag" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "So" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Mo" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Di" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Mi" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Do" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Fr" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sa" + msgctxt "one letter Sunday" msgid "S" msgstr "So" diff --git a/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo b/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo index e4a2a95501d3..cc67569f5460 100644 Binary files a/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/dsb/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po b/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po index af7598aa14eb..31cbbba1e0af 100644 --- a/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/dsb/LC_MESSAGES/django.po @@ -1,22 +1,26 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Michael Wolf , 2016-2019 +# Michael Wolf , 2016-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 10:13+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Michael Wolf , 2016-2024\n" +"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" "language/dsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Wubrane %(verbose_name_plural)s lašowaś" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -29,10 +33,6 @@ msgstr "%(name)s njedajo se lašowaś" msgid "Are you sure?" msgstr "Sćo se wěsty?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s lašowaś" - msgid "Administration" msgstr "Administracija" @@ -69,6 +69,12 @@ msgstr "Žeden datum" msgid "Has date" msgstr "Ma datum" +msgid "Empty" +msgstr "Prozny" + +msgid "Not empty" +msgstr "Njeprozny" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -126,23 +132,23 @@ msgid "log entries" msgstr "protokolowe zapiski" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "„%(object)s“ pśidane." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" msgstr "„%(object)s“ změnjone - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "„%(object)s“ wulašowane." msgid "LogEntry Object" msgstr "Objekt LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "{name} „{object} pśidany." +msgid "Added {name} “{object}”." +msgstr "{name} „{object}“ pśidany." msgid "Added." msgstr "Pśidany." @@ -151,16 +157,16 @@ msgid "and" msgstr "a" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{fields} za {name} „{object} změnjone." +msgid "Changed {fields} for {name} “{object}”." +msgstr "{fields} za {name} „{object}“ změnjone." #, python-brace-format msgid "Changed {fields}." msgstr "{fields} změnjone." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Deleted {name} „{object} wulašowane." +msgid "Deleted {name} “{object}”." +msgstr "Deleted {name} „{object}“ wulašowane." msgid "No fields changed." msgstr "Žedne póla změnjone." @@ -168,48 +174,41 @@ msgstr "Žedne póla změnjone." msgid "None" msgstr "Žeden" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "´Źaržćo „ctrl“ abo „cmd“ na Mac tłocony, aby wusej jadnogo wubrał." +msgid "Select this object for an action - {}" +msgstr "Wubjeŕśo toś ten objekt za akciju – {}" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" jo se wuspěšnje pśidał." +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} „{obj}“ jo se wuspěšnje pśidał." msgid "You may edit it again below." msgstr "Móźośo dołojce znowego wobźěłaś." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" jo se wuspěšnje pśidał. Móžośo dołojce dalšne {name} pśidaś." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"{name} \"{obj}\" jo se wuspěšnje změnił. Móžośo jen dołojce znowego " -"wobźěłowaś." +"{name} „{obj}“ jo se wuspěšnje pśidał. Móžośo dołojce dalšne {name} pśidaś." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"{name} \"{obj}\" jo se wuspěšnje pśidał. Móžośo jen dołojce znowego " -"wobźěłowaś." +"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo jen dołojce znowego wobźěłowaś." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"{name} \"{obj}\" jo se wuspěšnje změnił. Móžośo dołojce dalšne {name} pśidaś." +"{name} „{obj}“ jo se wuspěšnje změnił. Móžośo dołojce dalšne {name} pśidaś." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" jo se wuspěšnje změnił." +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} „{obj}“ jo se wuspěšnje změnił." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -222,12 +221,12 @@ msgid "No action selected." msgstr "Žedna akcija wubrana." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" jo se wuspěšnje wulašował." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s „%(obj)s“ jo se wuspěšnje wulašował." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s z ID \" %(key)s\" njeeksistěrujo. Jo se snaź wulašowało?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s z ID „%(key)s“ njeeksistěrujo. Jo se snaź wulašowało?" #, python-format msgid "Add %s" @@ -268,8 +267,9 @@ msgstr "0 z %(cnt)s wubranych" msgid "Change history: %s" msgstr "Změnowa historija: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -301,7 +301,7 @@ msgstr "Administracija %(app)s" msgid "Page not found" msgstr "Bok njejo se namakał" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Jo nam luto, ale pominany bok njedajo se namakaś." msgid "Home" @@ -317,11 +317,11 @@ msgid "Server Error (500)" msgstr "Serwerowa zmólka (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Zmólka jo nastała. Jo se sedłowym administratoram pśez e-mail k wěsći dała a " -"by dejała se skóro wótpóraś. Źěkujomse za wašu sćerpmosć." +"by dejała se skóro wótpóraś. Źěkujom se za wašu sćerpmosć." msgid "Run the selected action" msgstr "Wubranu akciju wuwjasć" @@ -339,8 +339,24 @@ msgstr "Wubjeŕśo wšykne %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Wuběrk lašowaś" +msgid "Breadcrumbs" +msgstr "Klěbowe srjodki" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w nałoženju %(name)s" + +msgid "Add" +msgstr "Pśidaś" + +msgid "View" +msgstr "Pokazaś" + +msgid "You don’t have permission to view or edit anything." +msgstr "Njamaśo pšawo něco pokazaś abo wobźěłaś" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Zapódajśo nejpjerwjej wužywarske mě a gronidło. Pótom móžośo dalšne " @@ -352,16 +368,36 @@ msgstr "Zapódajśo wužywarske mě a gronidło." msgid "Change password" msgstr "Gronidło změniś" -msgid "Please correct the error below." -msgstr "Pšosym korigěrujśo slědujucu zmólku." +msgid "Set password" +msgstr "Gronidło póstajiś" -msgid "Please correct the errors below." -msgstr "Pšosym skorigěrujśo slědujuce zmólki." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Pšosym korigěrujśo slědujucu zmólku." +msgstr[1] "Pšosym korigěrujśo slědujucej zmólce." +msgstr[2] "Pšosym korigěrujśo slědujuce zmólki." +msgstr[3] "Pšosym korigěrujśo slědujuce zmólki." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Zapódajśo nowe gronidło za wužywarja %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Toś ta akcija awtentifikaciju na zakłaźe gronidła za toś togo wužywarja " +" zmóžnijo ." + +msgid "Disable password-based authentication" +msgstr "Awtentifikaciju na zakłaźe gronidła znjemóžniś" + +msgid "Enable password-based authentication" +msgstr "Awtentifikaciju na zakłaźe gronidła zmóžniś" + +msgid "Skip to main content" +msgstr "Dalej ku głownemu wopśimjeśeju" + msgid "Welcome," msgstr "Witajśo," @@ -387,6 +423,15 @@ msgstr "Na sedle pokazaś" msgid "Filter" msgstr "Filtrowaś" +msgid "Hide counts" +msgstr "Licby schowaś" + +msgid "Show counts" +msgstr "Licby pokazaś" + +msgid "Clear all filters" +msgstr "Wšykne filtry lašowaś" + msgid "Remove from sorting" msgstr "Ze sortěrowanja wótpóraś" @@ -397,6 +442,15 @@ msgstr "Sortěrowański rěd: %(priority_number)s" msgid "Toggle sorting" msgstr "Sortěrowanje pśešaltowaś" +msgid "Toggle theme (current theme: auto)" +msgstr "Drastwu změniś (auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Drastwu změniś (swětły)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Drastwu změniś (śamny)" + msgid "Delete" msgstr "Lašowaś" @@ -428,7 +482,7 @@ msgstr "" msgid "Objects" msgstr "Objekty" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Jo, som se wěsty" msgid "No, take me back" @@ -462,9 +516,6 @@ msgstr "" "Cośo napšawdu wubrany %(objects_name)s lašowaś? Wšykne slědujuce objekty a " "jich pśisłušne zapiski se wulašuju:" -msgid "View" -msgstr "Pokazaś" - msgid "Delete?" msgstr "Lašowaś?" @@ -475,16 +526,6 @@ msgstr " Pó %(filter_title)s " msgid "Summary" msgstr "Zespominanje" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Add" -msgstr "Pśidaś" - -msgid "You don't have permission to view or edit anything." -msgstr "Njamaśo pšawo něco pokazaś abo wobźěłaś" - msgid "Recent actions" msgstr "Nejnowše akcije" @@ -494,11 +535,20 @@ msgstr "Móje akcije" msgid "None available" msgstr "Žeden k dispoziciji" +msgid "Added:" +msgstr "Pśidany:" + +msgid "Changed:" +msgstr "Změnjony:" + +msgid "Deleted:" +msgstr "Wulašowany:" + msgid "Unknown content" msgstr "Njeznate wopśimjeśe" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -517,6 +567,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Sćo swójo gronidło abo wužywarske mě zabył?" +msgid "Toggle navigation" +msgstr "Nawigaciju pśešaltowaś" + +msgid "Sidebar" +msgstr "Bocnica" + +msgid "Start typing to filter…" +msgstr "Pišćo, aby filtrował …" + +msgid "Filter navigation items" +msgstr "Nawigaciske zapiski filtrowaś" + msgid "Date/time" msgstr "Datum/cas" @@ -526,8 +588,15 @@ msgstr "Wužywaŕ" msgid "Action" msgstr "Akcija" +msgid "entry" +msgid_plural "entries" +msgstr[0] "zapisk" +msgstr[1] "zapiska" +msgstr[2] "zapiski" +msgstr[3] "zapiskow" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Toś ten objekt njama změnowu historiju. Jo se nejskerjej pśez toś to " @@ -584,8 +653,13 @@ msgstr "Dalšny %(model)s pśidaś" msgid "Delete selected %(model)s" msgstr "Wubrane %(model)s lašowaś" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Źěkujomy se, až sćo źinsa wěsty cas na websedle pśebywał." +#, python-format +msgid "View selected %(model)s" +msgstr "Wubrany %(model)s pokazaś" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Wjeliki źěk, až sćo sebje brał źinsa cas za pśeglědowanje kwality websedła." msgid "Log in again" msgstr "Hyšći raz pśizjawiś" @@ -597,7 +671,7 @@ msgid "Your password was changed." msgstr "Wašo gronidło jo se změniło." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Pšosym zapódajśo k swójej wěstośe swójo stare gronidło a pótom swójo nowe " @@ -636,7 +710,7 @@ msgstr "" "wužył. Pšosym pšosćo wó nowe slědkstajenje gronidła." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "Smy wam instrukcije za nastajenje wašogo gronidła pśez e-mail pósłali, jolic " @@ -644,7 +718,7 @@ msgstr "" "dostaś." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "Jolic mejlku njedostawaśo, pśeznańśo se, až sćo adresu zapódał, z kótarejuž " @@ -661,7 +735,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Pšosym źiśo k slědujucemu bokoju a wubjeŕśo nowe gronidło:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Wašo wužywarske mě, jolic sćo jo zabył:" msgid "Thanks for using our site!" @@ -672,7 +746,7 @@ msgid "The %(site_name)s team" msgstr "Team %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Sćo swójo gronidło zabył? Zapódajśo dołojce swóju e-mailowu adresu a " @@ -684,6 +758,9 @@ msgstr "E-mailowa adresa:" msgid "Reset my password" msgstr "Mójo gronidło slědk stajiś" +msgid "Select all objects on this page for an action" +msgstr "Wubjeŕśo wšykne objekty na toś tom boku za akciju" + msgid "All dates" msgstr "Wšykne daty" diff --git a/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo index 185749c4a913..b97684825e5c 100644 Binary files a/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po index 3dbda729bd68..3d4a444c1db5 100644 --- a/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/dsb/LC_MESSAGES/djangojs.po @@ -1,22 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Michael Wolf , 2016 +# Michael Wolf , 2016,2020-2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Michael Wolf , 2016,2020-2023\n" +"Language-Team: Lower Sorbian (http://app.transifex.com/django/django/" "language/dsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: dsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" #, javascript-format msgid "Available %s" @@ -64,6 +64,11 @@ msgstr "" "To jo lisćina wubranych %s. Klikniśo na šypku „Wótpóraś“ mjazy kašćikoma, " "aby někotare z nich w slědujucem kašćiku wótpórał." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"Zapišćo do toś togo póla, aby zapiski z lisćiny wubranych %s wufiltrował. " + msgid "Remove all" msgstr "Wšykne wótpóraś" @@ -71,6 +76,14 @@ msgstr "Wšykne wótpóraś" msgid "Click to remove all chosen %s at once." msgstr "Klikniśo, aby wšykne wubrane %s naraz wótpórał." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s wubrane nastajenje njewidobne" +msgstr[1] "%s wubranej nastajeni njewidobnej" +msgstr[2] "%s wubrane nastajenja njewidobne" +msgstr[3] "%s wubranych nastajenjow njewidobne" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s z %(cnt)s wubrany" @@ -86,8 +99,8 @@ msgstr "" "wuwjeźośo, se waše njeskładowane změny zgubiju." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Sćo akciju wubrał, ale njejsćo hyšći swóje změny za jadnotliwe póla " @@ -95,8 +108,8 @@ msgstr "" "wuwjasć." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Sćo akciju wubrał, ale njejsćo jadnotliwe póla změnił. Nejskerjej pytaśo " @@ -190,6 +203,103 @@ msgstr "Nowember" msgid "December" msgstr "December" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Měr." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun." + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul." + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Awg." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Now." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec." + +msgid "Sunday" +msgstr "Njeźela" + +msgid "Monday" +msgstr "Pónjeźele" + +msgid "Tuesday" +msgstr "Wałtora" + +msgid "Wednesday" +msgstr "Srjoda" + +msgid "Thursday" +msgstr "Stwórtk" + +msgid "Friday" +msgstr "Pětk" + +msgid "Saturday" +msgstr "Sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Nje" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pón" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Wał" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Srj" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Stw" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pět" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sob" + msgctxt "one letter Sunday" msgid "S" msgstr "Nj" diff --git a/django/contrib/admin/locale/el/LC_MESSAGES/django.mo b/django/contrib/admin/locale/el/LC_MESSAGES/django.mo index 0ae1e1650972..0f888163e61a 100644 Binary files a/django/contrib/admin/locale/el/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/el/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/el/LC_MESSAGES/django.po b/django/contrib/admin/locale/el/LC_MESSAGES/django.po index 1574e80751a5..ec1dc945a64f 100644 --- a/django/contrib/admin/locale/el/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/el/LC_MESSAGES/django.po @@ -1,21 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Antonis Christofides , 2021 # Dimitris Glezos , 2011 # Giannis Meletakis , 2015 # Jannis Leidel , 2011 -# Nick Mavrakis , 2017-2018 +# Nick Mavrakis , 2016-2018,2021 # Nick Mavrakis , 2016 # Pãnoș , 2014 -# Pãnoș , 2016,2019 +# Pãnoș , 2014,2016,2019-2020 # Yorgos Pagles , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-25 19:38+0000\n" -"Last-Translator: Pãnoș \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-30 03:21+0000\n" +"Last-Translator: Antonis Christofides \n" "Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,6 +24,10 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s: Διαγραφή επιλεγμένων" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Επιτυχώς διεγράφησαν %(count)d %(items)s." @@ -32,11 +37,7 @@ msgid "Cannot delete %(name)s" msgstr "Αδύνατη η διαγραφή του %(name)s" msgid "Are you sure?" -msgstr "Είστε σίγουροι;" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Διαγραφή επιλεγμένων %(verbose_name_plural)s" +msgstr "Είστε σίγουρος;" msgid "Administration" msgstr "Διαχείριση" @@ -63,10 +64,10 @@ msgid "Past 7 days" msgstr "Τελευταίες 7 ημέρες" msgid "This month" -msgstr "Αυτόν το μήνα" +msgstr "Αυτό το μήνα" msgid "This year" -msgstr "Αυτόν το χρόνο" +msgstr "Αυτό το χρόνο" msgid "No date" msgstr "Καθόλου ημερομηνία" @@ -74,21 +75,27 @@ msgstr "Καθόλου ημερομηνία" msgid "Has date" msgstr "Έχει ημερομηνία" +msgid "Empty" +msgstr "Χωρίς τιμή" + +msgid "Not empty" +msgstr "Με τιμή" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Παρακαλώ εισάγετε το σωστό %(username)s και κωδικό για λογαριασμό " -"προσωπικού. Σημειώστε οτι και στα δύο πεδία μπορεί να έχει σημασία αν είναι " -"κεφαλαία ή μικρά. " +"Παρακαλώ δώστε το σωστό %(username)s και συνθηματικό για λογαριασμό " +"προσωπικού. Και στα δύο πεδία μπορεί να έχει σημασία η διάκριση κεφαλαίων/" +"μικρών." msgid "Action:" msgstr "Ενέργεια:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "Προσθήκη και άλλου %(verbose_name)s" +msgstr "Να προστεθεί %(verbose_name)s" msgid "Remove" msgstr "Αφαίρεση" @@ -123,50 +130,50 @@ msgid "action flag" msgstr "σημαία ενέργειας" msgid "change message" -msgstr "αλλαγή μηνύματος" +msgstr "μήνυμα τροποποίησης" msgid "log entry" -msgstr "εγγραφή καταγραφής" +msgstr "καταχώριση αρχείου καταγραφής" msgid "log entries" -msgstr "εγγραφές καταγραφής" +msgstr "καταχωρίσεις αρχείου καταγραφής" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Προστέθηκαν \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Προστέθηκε «%(object)s»." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Αλλάχθηκαν \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Τροποποιήθηκε «%(object)s» — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Διαγράφηκαν \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Διαγράφηκε «%(object)s»." msgid "LogEntry Object" msgstr "Αντικείμενο LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Προστέθηκε {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Προστέθηκε {name} “{object}”." msgid "Added." -msgstr "Προστέθηκε" +msgstr "Προστέθηκε." msgid "and" msgstr "και" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Αλλαγή του {fields} για {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "{name} «{object}»: Αλλαγή {fields}." #, python-brace-format msgid "Changed {fields}." -msgstr "Αλλαγή του {fields}." +msgstr "Αλλαγή {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Διαγραφή {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Διεγράφη {name} «{object}»." msgid "No fields changed." msgstr "Δεν άλλαξε κανένα πεδίο." @@ -174,86 +181,82 @@ msgstr "Δεν άλλαξε κανένα πεδίο." msgid "None" msgstr "Κανένα" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Κρατήστε πατημένο το \"Control\", ή το \"Command\" αν έχετε Mac, για να " -"επιλέξετε παραπάνω από ένα." +"Κρατήστε πατημένο το «Control» («Command» σε Mac) για να επιλέξετε " +"περισσότερα από ένα αντικείμενα." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Το {name} \"{obj}\" αποθηκεύτηκε με επιτυχία." +msgid "The {name} “{obj}” was added successfully." +msgstr "Προστέθηκε {name} «{obj}»." msgid "You may edit it again below." -msgstr "Μπορείτε να το επεξεργαστείτε ξανά παρακάτω." +msgstr "Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία παρακάτω." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Το {name} \"{obj}\" προστέθηκε με επιτυχία. Μπορείτε να προσθέσετε και άλλο " -"{name} παρακάτω." +"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί νέα πρόσθεση παρακάτω." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"Το {name} \"{obj}\" αλλάχθηκε επιτυχώς. Μπορείτε να το επεξεργαστείτε ξανά " -"παρακάτω." +"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να πραγματοποιηθεί " +"περαιτέρω επεξεργασία παρακάτω." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"Το {name} \"{obj}\" προστέθηκε με επιτυχία. Μπορείτε να το επεξεργαστείτε " -"πάλι παρακάτω." +"Προστέθηκε {name} «{obj}». Μπορεί να πραγματοποιηθεί περαιτέρω επεξεργασία " +"παρακάτω." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Το {name} \"{obj}\" αλλάχθηκε με επιτυχία. Μπορείτε να προσθέσετε και άλλο " +"Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε. Μπορεί να προστεθεί επιπλέον " "{name} παρακάτω." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "Το {name} \"{obj}\" αλλάχθηκε με επιτυχία." +msgid "The {name} “{obj}” was changed successfully." +msgstr "Το αντικείμενο ({name}) «{obj}» τροποποιήθηκε." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -"Καμμία αλλαγή δεν έχει πραγματοποιηθεί ακόμα γιατί δεν έχετε επιλέξει κανένα " -"αντικείμενο. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα για να " -"πραγματοποιήσετε ενέργειες σε αυτά." +"Καμία αλλαγή δεν πραγματοποιήθηκε γιατί δεν έχετε επιλέξει αντικείμενο. " +"Επιλέξτε ένα ή περισσότερα αντικείμενα για να πραγματοποιήσετε ενέργειες σ' " +"αυτά." msgid "No action selected." msgstr "Δεν έχει επιλεγεί ενέργεια." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Το %(name)s \"%(obj)s\" διαγράφηκε με επιτυχία." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "Διεγράφη το αντικείμενο (%(name)s) «%(obj)s»" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s με το ID \"%(key)s\" δεν υπάρχει. Μήπως διαγράφηκε;" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "Δεν υπάρχει %(name)s με ID «%(key)s». Ίσως να έχει διαγραφεί." #, python-format msgid "Add %s" -msgstr "Προσθήκη %s" +msgstr "Να προστεθεί %s" #, python-format msgid "Change %s" -msgstr "Αλλαγή του %s" +msgstr "%s: Τροποποίηση" #, python-format msgid "View %s" -msgstr "Προβολή %s" +msgstr "%s: Προβολή" msgid "Database error" -msgstr "Σφάλμα βάσεως δεδομένων" +msgstr "Σφάλμα στη βάση δεδομένων" #, python-format msgid "%(count)s %(name)s was changed successfully." @@ -269,7 +272,7 @@ msgstr[1] "Επιλέχθηκαν και τα %(total_count)s" #, python-format msgid "0 of %(cnt)s selected" -msgstr "Επιλέγησαν 0 από %(cnt)s" +msgstr "Επιλέχθηκαν 0 από %(cnt)s" #, python-format msgid "Change history: %s" @@ -286,8 +289,9 @@ msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" -"Η διαγραφή %(class_name)s %(instance)s θα απαιτούσε την διαγραφή των " -"ακόλουθων προστατευόμενων συγγενεύων αντικειμένων: %(related_objects)s" +"Η διαγραφή του αντικειμένου (%(class_name)s) %(instance)s θα απαιτούσε τη " +"διαγραφή των παρακάτω προστατευόμενων συσχετισμένων αντικειμένων: " +"%(related_objects)s" msgid "Django site admin" msgstr "Ιστότοπος διαχείρισης Django" @@ -306,29 +310,29 @@ msgid "%(app)s administration" msgstr "Διαχείριση %(app)s" msgid "Page not found" -msgstr "Η σελίδα δε βρέθηκε" +msgstr "Η σελίδα δεν βρέθηκε" -msgid "We're sorry, but the requested page could not be found." -msgstr "Λυπόμαστε, αλλά η σελίδα που ζητήθηκε δε μπόρεσε να βρεθεί." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Λυπούμαστε, αλλά η σελίδα που ζητήθηκε δεν βρέθηκε." msgid "Home" msgstr "Αρχική" msgid "Server error" -msgstr "Σφάλμα εξυπηρετητή" +msgstr "Σφάλμα στο server" msgid "Server error (500)" -msgstr "Σφάλμα εξυπηρετητή (500)" +msgstr "Σφάλμα στο server (500)" msgid "Server Error (500)" -msgstr "Σφάλμα εξυπηρετητή (500)" +msgstr "Σφάλμα στο server (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Υπήρξε ένα σφάλμα. Έχει αναφερθεί στους διαχειριστές της σελίδας μέσω email, " -"και λογικά θα διορθωθεί αμεσα. Ευχαριστούμε για την υπομονή σας." +"Παρουσιάστηκε σφάλμα. Εστάλη στους διαχειριστές με email και πιθανότατα θα " +"διορθωθεί σύντομα. Ευχαριστούμε για την υπομονή σας." msgid "Run the selected action" msgstr "Εκτέλεση της επιλεγμένης ενέργειας" @@ -341,21 +345,33 @@ msgstr "Κάντε κλικ εδώ για να επιλέξετε τα αντι #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "Επιλέξτε και τα %(total_count)s %(module_name)s" +msgstr "Επιλέξτε και τα %(total_count)s αντικείμενα (%(module_name)s)" msgid "Clear selection" msgstr "Καθαρισμός επιλογής" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Μοντέλα στην εφαρμογή %(name)s" + +msgid "Add" +msgstr "Προσθήκη" + +msgid "View" +msgstr "Προβολή" + +msgid "You don’t have permission to view or edit anything." +msgstr "Δεν έχετε δικαίωμα να δείτε ή να επεξεργαστείτε κάτι." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Αρχικά εισάγετε το όνομα χρήστη και τον κωδικό πρόσβασης. Μετά την " -"ολοκλήρωση αυτού του βήματος θα έχετε την επιλογή να προσθέσετε όλα τα " -"υπόλοιπα στοιχεία για τον χρήστη." +"Καταρχήν προσδιορίστε όνομα χρήστη και συνθηματικό. Κατόπιν θα σας δοθεί η " +"δυνατότητα να εισαγάγετε περισσότερες πληροφορίες για το χρήστη." msgid "Enter a username and password." -msgstr "Εισάγετε όνομα χρήστη και συνθηματικό." +msgstr "Προσδιορίστε όνομα χρήστη και συνθηματικό." msgid "Change password" msgstr "Αλλαγή συνθηματικού" @@ -369,14 +385,13 @@ msgstr "Παρακαλοϋμε διορθώστε τα παρακάτω λάθη #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" -"Εισάγετε ένα νέο κωδικό πρόσβασης για τον χρήστη %(username)s." +"Προσδιορίστε νέο συνθηματικό για το χρήστη %(username)s." msgid "Welcome," -msgstr "Καλωσήρθατε," +msgstr "Καλώς ήρθατε," msgid "View site" -msgstr "Δες την εφαρμογή" +msgstr "Μετάβαση στην εφαρμογή" msgid "Documentation" msgstr "Τεκμηρίωση" @@ -386,7 +401,7 @@ msgstr "Αποσύνδεση" #, python-format msgid "Add %(name)s" -msgstr "Προσθήκη %(name)s" +msgstr "%(name)s: προσθήκη" msgid "History" msgstr "Ιστορικό" @@ -397,6 +412,9 @@ msgstr "Προβολή στον ιστότοπο" msgid "Filter" msgstr "Φίλτρο" +msgid "Clear all filters" +msgstr "Καθαρισμός όλων των φίλτρων" + msgid "Remove from sorting" msgstr "Αφαίρεση από την ταξινόμηση" @@ -416,36 +434,35 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Επιλέξατε την διαγραφή του αντικειμένου '%(escaped_object)s' είδους " -"%(object_name)s. Αυτό συνεπάγεται την διαγραφή συσχετισμένων αντικειμενων " -"για τα οποία δεν έχετε δικάιωμα διαγραφής. Τα είδη των αντικειμένων αυτών " -"είναι:" +"Επιλέξατε τη διαγραφή του αντικειμένου '%(escaped_object)s' τύπου " +"%(object_name)s. Αυτό συνεπάγεται τη διαγραφή συσχετισμένων αντικειμενων για " +"τα οποία δεν έχετε δικάιωμα διαγραφής. Οι τύποι των αντικειμένων αυτών είναι:" #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -"Η διαγραφή του %(object_name)s '%(escaped_object)s' απαιτεί την διαγραφή " -"των παρακάτω προστατευμένων αντικειμένων:" +"Η διαγραφή του αντικειμένου (%(object_name)s) «%(escaped_object)s» απαιτεί " +"τη διαγραφή των παρακάτω προστατευόμενων αντικειμένων:" #, python-format msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Επιβεβαιώστε ότι επιθημείτε την διαγραφή του %(object_name)s " -"\"%(escaped_object)s\". Αν προχωρήσετε με την διαγραφή όλα τα παρακάτω " -"συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" +"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων " +"(%(object_name)s \"%(escaped_object)s\"). Αν προχωρήσετε με τη διαγραφή, όλα " +"τα παρακάτω συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" msgid "Objects" msgstr "Αντικείμενα" -msgid "Yes, I'm sure" -msgstr "Ναι, είμαι βέβαιος" +msgid "Yes, I’m sure" +msgstr "Ναι" msgid "No, take me back" -msgstr "Όχι, επέστρεψε με πίσω." +msgstr "Όχι" msgid "Delete multiple objects" msgstr "Διαγραφή πολλαπλών αντικειμένων" @@ -456,29 +473,26 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Η διαγραφή των επιλεγμένων %(objects_name)s θα είχε σαν αποτέλεσμα την " -"διαγραφή συσχετισμένων αντικειμένων για τα οποία δεν έχετε το διακαίωμα " -"διαγραφής:" +"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» θα είχε " +"αποτέλεσμα τη διαγραφή των ακόλουθων συσχετισμένων αντικειμένων για τα οποία " +"δεν έχετε το διακαίωμα διαγραφής:" #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" -"Η διαγραφή των επιλεγμένων %(objects_name)s απαιτεί την διαγραφή των " -"παρακάτω προστατευμένων αντικειμένων:" +"Η διαγραφή των επιλεγμένων αντικειμένων τύπου «%(objects_name)s» απαιτεί τη " +"διαγραφή των παρακάτω προστατευμένων συσχετισμένων αντικειμένων:" #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"Επιβεβαιώστε ότι επιθημείτε την διαγραφή των επιλεγμένων %(objects_name)s . " -"Αν προχωρήσετε με την διαγραφή όλα τα παρακάτω συσχετισμένα αντικείμενα θα " -"διαγραφούν επίσης:" - -msgid "View" -msgstr "Προβολή" +"Επιβεβαιώστε ότι επιθυμείτε τη διαγραφή των επιλεγμένων αντικειμένων τύπου " +"«%(objects_name)s». Αν προχωρήσετε με τη διαγραφή, όλα τα παρακάτω " +"συσχετισμένα αντικείμενα θα διαγραφούν επίσης:" msgid "Delete?" msgstr "Διαγραφή;" @@ -490,21 +504,11 @@ msgstr " Ανά %(filter_title)s " msgid "Summary" msgstr "Περίληψη" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Μοντέλα στην εφαρμογή %(name)s" - -msgid "Add" -msgstr "Προσθήκη" - -msgid "You don't have permission to view or edit anything." -msgstr "Δεν έχετε δικαίωμα να δείτε ή να επεξεργαστείτε τίποτα." - msgid "Recent actions" msgstr "Πρόσφατες ενέργειες" msgid "My actions" -msgstr "Οι ενέργειες μου" +msgstr "Οι ενέργειές μου" msgid "None available" msgstr "Κανένα διαθέσιμο" @@ -513,25 +517,28 @@ msgid "Unknown content" msgstr "Άγνωστο περιεχόμενο" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Φαίνεται να υπάρχει πρόβλημα με την εγκατάσταση της βάσης σας. Θα πρέπει να " -"βεβαιωθείτε ότι οι απαραίτητοι πίνακες έχουν δημιουργηθεί και ότι η βάση " -"είναι προσβάσιμη από τον αντίστοιχο χρήστη που έχετε δηλώσει." +"Υπάρχει κάποιο πρόβλημα στη βάση δεδομένων. Βεβαιωθείτε πως οι κατάλληλοι " +"πίνακες έχουν δημιουργηθεί και πως υπάρχουν τα κατάλληλα δικαιώματα " +"πρόσβασης." #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" -"Επικυρωθήκατε ως %(username)s, αλλά δεν έχετε εξουσιοδότηση για αυτή την " -"σελίδα. Θέλετε να συνδεθείτε με άλλο λογαριασμό;" +"Έχετε ταυτοποιηθεί ως %(username)s, αλλά δεν έχετε δικαίωμα πρόσβασης σ' " +"αυτή τη σελίδα. Θέλετε να συνδεθείτε με άλλο λογαριασμό;" msgid "Forgotten your password or username?" msgstr "Ξεχάσατε το συνθηματικό ή το όνομα χρήστη σας;" +msgid "Toggle navigation" +msgstr "Εναλλαγή προβολής πλοήγησης" + msgid "Date/time" msgstr "Ημερομηνία/ώρα" @@ -542,11 +549,11 @@ msgid "Action" msgstr "Ενέργεια" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Δεν υπάρχει ιστορικό αλλαγών γι' αυτό το αντικείμενο. Είναι πιθανό η " -"προσθήκη του να μην πραγματοποιήθηκε χρησιμοποιώντας το διαχειριστικό." +"Αυτό το αντικείμενο δεν έχει ιστορικό αλλαγών. Πιθανότατα δεν προστέθηκε " +"μέσω του παρόντος διαχειριστικού ιστότοπου." msgid "Show all" msgstr "Εμφάνιση όλων" @@ -571,10 +578,10 @@ msgid "%(full_result_count)s total" msgstr "%(full_result_count)s συνολικά" msgid "Save as new" -msgstr "Αποθήκευση ως νέο" +msgstr "Αποθήκευση ως νέου" msgid "Save and add another" -msgstr "Αποθήκευση και προσθήκη καινούριου" +msgstr "Αποθήκευση και προσθήκη καινούργιου" msgid "Save and continue editing" msgstr "Αποθήκευση και συνέχεια επεξεργασίας" @@ -587,18 +594,18 @@ msgstr "Κλείσιμο" #, python-format msgid "Change selected %(model)s" -msgstr "Άλλαξε το επιλεγμένο %(model)s" +msgstr "Να τροποποιηθεί το επιλεγμένο αντικείμενο (%(model)s)" #, python-format msgid "Add another %(model)s" -msgstr "Πρόσθεσε άλλο ένα %(model)s" +msgstr "Να προστεθεί %(model)s" #, python-format msgid "Delete selected %(model)s" -msgstr "Διέγραψε το επιλεγμένο %(model)s" +msgstr "Να διαγραφεί το επιλεγμένο αντικείμενο (%(model)s)" msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ευχαριστούμε που διαθέσατε κάποιο ποιοτικό χρόνο στον ιστότοπο σήμερα." +msgstr "Ευχαριστούμε που διαθέσατε χρόνο στον ιστότοπο." msgid "Log in again" msgstr "Επανασύνδεση" @@ -610,12 +617,11 @@ msgid "Your password was changed." msgstr "Το συνθηματικό σας αλλάχθηκε." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Παρακαλούμε εισάγετε το παλιό σας συνθηματικό, για λόγους ασφάλειας, και " -"κατόπιν εισάγετε το νέο σας συνθηματικό δύο φορές ούτως ώστε να " -"πιστοποιήσουμε ότι το πληκτρολογήσατε σωστά." +"Δώστε το παλιό σας συνθηματικό και ακολούθως το νέο σας συνθηματικό δύο " +"φορές ώστε να ελέγξουμε ότι το πληκτρολογήσατε σωστά." msgid "Change my password" msgstr "Αλλαγή του συνθηματικού μου" @@ -624,19 +630,17 @@ msgid "Password reset" msgstr "Επαναφορά συνθηματικού" msgid "Your password has been set. You may go ahead and log in now." -msgstr "" -"Ορίσατε επιτυχώς έναν κωδικό πρόσβασής. Πλέον έχετε την δυνατότητα να " -"συνδεθήτε." +msgstr "Το συνθηματικό σας ορίστηκε. Μπορείτε τώρα να συνδεθείτε." msgid "Password reset confirmation" -msgstr "Επιβεβαίωση επαναφοράς κωδικού πρόσβασης" +msgstr "Επιβεβαίωση επαναφοράς συνθηματικού" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." msgstr "" -"Παρακαλούμε πληκτρολογήστε το νέο κωδικό πρόσβασης δύο φορές ώστε να " -"βεβαιωθούμε ότι δεν πληκτρολογήσατε κάποιον χαρακτήρα λανθασμένα." +"Δώστε το νέο συνθηματικό σας δύο φορές ώστε να ελέγξουμε ότι το " +"πληκτρολογήσατε σωστά." msgid "New password:" msgstr "Νέο συνθηματικό:" @@ -648,61 +652,56 @@ msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" -"Ο σύνδεσμος που χρησιμοποιήσατε για την επαναφορά του κωδικού πρόσβασης δεν " -"είναι πλεόν διαθέσιμος. Πιθανώς έχει ήδη χρησιμοποιηθεί. Θα χρειαστεί να " -"πραγματοποιήσετε και πάλι την διαδικασία αίτησης επαναφοράς του κωδικού " -"πρόσβασης." +"Ο σύνδεσμος που χρησιμοποιήσατε για την επαναφορά του συνθηματικού δεν είναι " +"σωστός, ίσως γιατί έχει ήδη χρησιμοποιηθεί. Πραγματοποιήστε εξαρχής τη " +"διαδικασία αίτησης επαναφοράς του συνθηματικού." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Σας έχουμε αποστείλει οδηγίες σχετικά με τον ορισμό του κωδικού σας, αν " -"υπάρχει ήδη κάποιος λογαριασμός με την διεύθυνση ηλεκτρονικού ταχυδρομείου " -"που δηλώσατε. Θα λάβετε τις οδηγίες σύντομα." +"Σας στείλαμε email με οδηγίες ορισμού συνθηματικού. Θα πρέπει να το λάβετε " +"σύντομα." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Εάν δεν λάβετε email, παρακαλούμε σιγουρευτείτε οτί έχετε εισάγει την " -"διεύθυνση με την οποία έχετε εγγραφεί, και ελέγξτε τον φάκελο με τα " -"ανεπιθύμητα." +"Εάν δεν λάβετε email, παρακαλούμε σιγουρευτείτε ότι έχετε εισαγάγει τη " +"διεύθυνση με την οποία έχετε εγγραφεί, και ελέγξτε το φάκελο ανεπιθύμητης " +"αλληλογραφίας." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" -"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά κωδικού για τον λογαριασμό " -"σας στο %(site_name)s." +"Λαμβάνετε αυτό το email επειδή ζητήσατε επαναφορά συνθηματικού για το " +"λογαριασμό σας στον ιστότοπο %(site_name)s." msgid "Please go to the following page and choose a new password:" msgstr "" -"Παρακαλούμε επισκεφθήτε την ακόλουθη σελίδα και επιλέξτε ένα νέο κωδικό " -"πρόσβασης: " +"Παρακαλούμε επισκεφθείτε την ακόλουθη σελίδα και επιλέξτε νέο συνθηματικό: " -msgid "Your username, in case you've forgotten:" -msgstr "" -"Το όνομα χρήστη με το οποίο είστε καταχωρημένος για την περίπτωση στην οποία " -"το έχετε ξεχάσει:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Το όνομα χρήστη, σε περίπτωση που δεν το θυμάστε:" msgid "Thanks for using our site!" -msgstr "Ευχαριστούμε που χρησιμοποιήσατε τον ιστότοπο μας!" +msgstr "Ευχαριστούμε που χρησιμοποιήσατε τον ιστότοπό μας!" #, python-format msgid "The %(site_name)s team" -msgstr "Η ομάδα του %(site_name)s" +msgstr "Η ομάδα του ιστότοπου %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Ξεχάσατε τον κωδικό σας; Εισάγετε το email σας παρακάτω, και θα σας " -"αποστείλουμε οδηγίες για να ρυθμίσετε εναν καινούργιο." +"Ξεχάσατε το συνθηματικό σας; Εισαγάγετε το email σας και θα σας στείλουμε " +"οδηγίες για να ορίσετε καινούργιο." msgid "Email address:" -msgstr "Ηλεκτρονική διεύθυνση:" +msgstr "Διεύθυνση email:" msgid "Reset my password" msgstr "Επαναφορά του συνθηματικού μου" @@ -712,15 +711,15 @@ msgstr "Όλες οι ημερομηνίες" #, python-format msgid "Select %s" -msgstr "Επιλέξτε %s" +msgstr "Επιλέξτε αντικείμενο (%s)" #, python-format msgid "Select %s to change" -msgstr "Επιλέξτε %s προς αλλαγή" +msgstr "Επιλέξτε αντικείμενο (%s) προς αλλαγή" #, python-format msgid "Select %s to view" -msgstr "Επιλέξτε %s για προβολή" +msgstr "Επιλέξτε αντικείμενο (%s) για προβολή" msgid "Date:" msgstr "Ημ/νία:" diff --git a/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo index 5da3e88499ed..5548ab048a95 100644 Binary files a/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po index 223eccb88816..1ffee5dd3a15 100644 --- a/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/el/LC_MESSAGES/djangojs.po @@ -2,6 +2,7 @@ # # Translators: # Dimitris Glezos , 2011 +# Fotis Athineos , 2021 # glogiotatidis , 2011 # Jannis Leidel , 2011 # Nikolas Demiridis , 2014 @@ -12,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 19:47+0000\n" -"Last-Translator: Nick Mavrakis \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-08-04 06:47+0000\n" +"Last-Translator: Fotis Athineos \n" "Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -88,8 +89,8 @@ msgstr "" "εκτελέσετε μια ενέργεια, οι μη αποθηκευμένες αλλάγες θα χαθούν" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Έχετε επιλέξει μια ενέργεια, αλλά δεν έχετε αποθηκεύσει τις αλλαγές στα " @@ -97,13 +98,28 @@ msgstr "" "χρειαστεί να εκτελέσετε ξανά την ενέργεια." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Έχετε επιλέξει μια ενέργεια, και δεν έχετε κάνει καμία αλλαγή στα εκάστοτε " "πεδία. Πιθανών θέλετε το κουμπί Go αντί του κουμπιού Αποθήκευσης." +msgid "Now" +msgstr "Τώρα" + +msgid "Midnight" +msgstr "Μεσάνυχτα" + +msgid "6 a.m." +msgstr "6 π.μ." + +msgid "Noon" +msgstr "Μεσημέρι" + +msgid "6 p.m." +msgstr "6 μ.μ." + #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." @@ -116,27 +132,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Σημείωση: Είστε %s ώρα πίσω από την ώρα του εξυπηρετητή" msgstr[1] "Σημείωση: Είστε %s ώρες πίσω από την ώρα του εξυπηρετητή." -msgid "Now" -msgstr "Τώρα" - msgid "Choose a Time" msgstr "Επιλέξτε Χρόνο" msgid "Choose a time" msgstr "Επιλέξτε χρόνο" -msgid "Midnight" -msgstr "Μεσάνυχτα" - -msgid "6 a.m." -msgstr "6 π.μ." - -msgid "Noon" -msgstr "Μεσημέρι" - -msgid "6 p.m." -msgstr "6 μ.μ." - msgid "Cancel" msgstr "Ακύρωση" @@ -188,6 +189,54 @@ msgstr "Νοέμβριος" msgid "December" msgstr "Δεκέμβριος" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Ιαν" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Φεβ" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Μάρ" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Απρ" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Μάι" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Ιούν" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Ιούλ" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Αύγ" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Σεπ" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Οκτ" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Νοέ" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Δεκ" + msgctxt "one letter Sunday" msgid "S" msgstr "Κ" diff --git a/django/contrib/admin/locale/en/LC_MESSAGES/django.po b/django/contrib/admin/locale/en/LC_MESSAGES/django.po index 15d30ebfe431..c216532a0364 100644 --- a/django/contrib/admin/locale/en/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/en/LC_MESSAGES/django.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" "PO-Revision-Date: 2010-05-13 15:35+0200\n" "Last-Translator: Django team\n" "Language-Team: English \n" @@ -14,348 +14,348 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: contrib/admin/actions.py:41 +#: contrib/admin/actions.py:17 +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "" + +#: contrib/admin/actions.py:54 #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "" -#: contrib/admin/actions.py:50 contrib/admin/options.py:1883 +#: contrib/admin/actions.py:64 contrib/admin/options.py:2177 #, python-format msgid "Cannot delete %(name)s" msgstr "" -#: contrib/admin/actions.py:52 contrib/admin/options.py:1885 +#: contrib/admin/actions.py:66 contrib/admin/options.py:2179 msgid "Are you sure?" msgstr "" -#: contrib/admin/actions.py:79 -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" - -#: contrib/admin/apps.py:12 +#: contrib/admin/apps.py:13 msgid "Administration" msgstr "" -#: contrib/admin/filters.py:108 contrib/admin/filters.py:213 -#: contrib/admin/filters.py:248 contrib/admin/filters.py:282 -#: contrib/admin/filters.py:401 contrib/admin/filters.py:466 +#: contrib/admin/filters.py:153 contrib/admin/filters.py:295 +#: contrib/admin/filters.py:364 contrib/admin/filters.py:432 +#: contrib/admin/filters.py:607 contrib/admin/filters.py:701 msgid "All" msgstr "" -#: contrib/admin/filters.py:249 +#: contrib/admin/filters.py:365 msgid "Yes" msgstr "" -#: contrib/admin/filters.py:250 +#: contrib/admin/filters.py:366 msgid "No" msgstr "" -#: contrib/admin/filters.py:260 +#: contrib/admin/filters.py:380 msgid "Unknown" msgstr "" -#: contrib/admin/filters.py:330 +#: contrib/admin/filters.py:490 msgid "Any date" msgstr "" -#: contrib/admin/filters.py:331 +#: contrib/admin/filters.py:492 msgid "Today" msgstr "" -#: contrib/admin/filters.py:335 +#: contrib/admin/filters.py:499 msgid "Past 7 days" msgstr "" -#: contrib/admin/filters.py:339 +#: contrib/admin/filters.py:506 msgid "This month" msgstr "" -#: contrib/admin/filters.py:343 +#: contrib/admin/filters.py:513 msgid "This year" msgstr "" -#: contrib/admin/filters.py:351 +#: contrib/admin/filters.py:523 msgid "No date" msgstr "" -#: contrib/admin/filters.py:352 +#: contrib/admin/filters.py:524 msgid "Has date" msgstr "" -#: contrib/admin/filters.py:467 +#: contrib/admin/filters.py:702 msgid "Empty" msgstr "" -#: contrib/admin/filters.py:468 +#: contrib/admin/filters.py:703 msgid "Not empty" msgstr "" -#: contrib/admin/forms.py:13 +#: contrib/admin/forms.py:14 #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -#: contrib/admin/helpers.py:21 +#: contrib/admin/helpers.py:30 msgid "Action:" msgstr "" -#: contrib/admin/helpers.py:312 +#: contrib/admin/helpers.py:428 #, python-format msgid "Add another %(verbose_name)s" msgstr "" -#: contrib/admin/helpers.py:315 +#: contrib/admin/helpers.py:432 msgid "Remove" msgstr "" -#: contrib/admin/models.py:17 +#: contrib/admin/models.py:18 msgid "Addition" msgstr "" -#: contrib/admin/models.py:18 contrib/admin/templates/admin/app_list.html:28 -#: contrib/admin/templates/admin/edit_inline/stacked.html:12 -#: contrib/admin/templates/admin/edit_inline/tabular.html:34 -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 +#: contrib/admin/models.py:19 contrib/admin/templates/admin/app_list.html:28 +#: contrib/admin/templates/admin/edit_inline/stacked.html:16 +#: contrib/admin/templates/admin/edit_inline/tabular.html:36 msgid "Change" msgstr "" -#: contrib/admin/models.py:19 +#: contrib/admin/models.py:20 msgid "Deletion" msgstr "" -#: contrib/admin/models.py:41 +#: contrib/admin/models.py:50 msgid "action time" msgstr "" -#: contrib/admin/models.py:48 +#: contrib/admin/models.py:57 msgid "user" msgstr "" -#: contrib/admin/models.py:53 +#: contrib/admin/models.py:62 msgid "content type" msgstr "" -#: contrib/admin/models.py:56 +#: contrib/admin/models.py:66 msgid "object id" msgstr "" -#. Translators: 'repr' means representation (https://docs.python.org/library/functions.html#repr) -#: contrib/admin/models.py:58 +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +#: contrib/admin/models.py:69 msgid "object repr" msgstr "" -#: contrib/admin/models.py:59 +#: contrib/admin/models.py:71 msgid "action flag" msgstr "" -#: contrib/admin/models.py:61 +#: contrib/admin/models.py:74 msgid "change message" msgstr "" -#: contrib/admin/models.py:66 +#: contrib/admin/models.py:79 msgid "log entry" msgstr "" -#: contrib/admin/models.py:67 +#: contrib/admin/models.py:80 msgid "log entries" msgstr "" -#: contrib/admin/models.py:76 +#: contrib/admin/models.py:89 #, python-format msgid "Added “%(object)s”." msgstr "" -#: contrib/admin/models.py:78 +#: contrib/admin/models.py:91 #, python-format msgid "Changed “%(object)s” — %(changes)s" msgstr "" -#: contrib/admin/models.py:83 +#: contrib/admin/models.py:96 #, python-format msgid "Deleted “%(object)s.”" msgstr "" -#: contrib/admin/models.py:85 +#: contrib/admin/models.py:98 msgid "LogEntry Object" msgstr "" -#: contrib/admin/models.py:111 +#: contrib/admin/models.py:127 #, python-brace-format msgid "Added {name} “{object}”." msgstr "" -#: contrib/admin/models.py:113 +#: contrib/admin/models.py:132 msgid "Added." msgstr "" -#: contrib/admin/models.py:117 contrib/admin/options.py:2109 +#: contrib/admin/models.py:140 contrib/admin/options.py:2433 msgid "and" msgstr "" -#: contrib/admin/models.py:121 +#: contrib/admin/models.py:147 #, python-brace-format msgid "Changed {fields} for {name} “{object}”." msgstr "" -#: contrib/admin/models.py:125 +#: contrib/admin/models.py:153 #, python-brace-format msgid "Changed {fields}." msgstr "" -#: contrib/admin/models.py:129 +#: contrib/admin/models.py:163 #, python-brace-format msgid "Deleted {name} “{object}”." msgstr "" -#: contrib/admin/models.py:132 +#: contrib/admin/models.py:169 msgid "No fields changed." msgstr "" -#: contrib/admin/options.py:201 contrib/admin/options.py:233 +#: contrib/admin/options.py:243 contrib/admin/options.py:287 msgid "None" msgstr "" -#: contrib/admin/options.py:279 +#: contrib/admin/options.py:339 msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -#: contrib/admin/options.py:1217 contrib/admin/options.py:1241 +#: contrib/admin/options.py:995 +msgid "Select this object for an action - {}" +msgstr "" + +#: contrib/admin/options.py:1405 contrib/admin/options.py:1434 #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "" -#: contrib/admin/options.py:1219 +#: contrib/admin/options.py:1407 msgid "You may edit it again below." msgstr "" -#: contrib/admin/options.py:1231 +#: contrib/admin/options.py:1420 #, python-brace-format msgid "" "The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -#: contrib/admin/options.py:1281 +#: contrib/admin/options.py:1482 #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -#: contrib/admin/options.py:1291 -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" - -#: contrib/admin/options.py:1304 +#: contrib/admin/options.py:1516 #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -#: contrib/admin/options.py:1316 +#: contrib/admin/options.py:1533 #, python-brace-format msgid "The {name} “{obj}” was changed successfully." msgstr "" -#: contrib/admin/options.py:1393 contrib/admin/options.py:1725 +#: contrib/admin/options.py:1611 contrib/admin/options.py:1996 msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -#: contrib/admin/options.py:1412 +#: contrib/admin/options.py:1631 msgid "No action selected." msgstr "" -#: contrib/admin/options.py:1437 +#: contrib/admin/options.py:1662 #, python-format msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "" -#: contrib/admin/options.py:1523 +#: contrib/admin/options.py:1764 #, python-format msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" -#: contrib/admin/options.py:1618 +#: contrib/admin/options.py:1875 #, python-format msgid "Add %s" msgstr "" -#: contrib/admin/options.py:1620 +#: contrib/admin/options.py:1877 #, python-format msgid "Change %s" msgstr "" -#: contrib/admin/options.py:1622 +#: contrib/admin/options.py:1879 #, python-format msgid "View %s" msgstr "" -#: contrib/admin/options.py:1703 +#: contrib/admin/options.py:1966 msgid "Database error" msgstr "" -#: contrib/admin/options.py:1772 +#: contrib/admin/options.py:2056 #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "" msgstr[1] "" -#: contrib/admin/options.py:1803 +#: contrib/admin/options.py:2087 #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "" msgstr[1] "" -#: contrib/admin/options.py:1811 +#: contrib/admin/options.py:2093 #, python-format msgid "0 of %(cnt)s selected" msgstr "" -#: contrib/admin/options.py:1928 +#: contrib/admin/options.py:2235 #, python-format msgid "Change history: %s" msgstr "" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. -#: contrib/admin/options.py:2102 +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. +#: contrib/admin/options.py:2427 #, python-format msgid "%(class_name)s %(instance)s" msgstr "" -#: contrib/admin/options.py:2111 +#: contrib/admin/options.py:2436 #, python-format msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" -#: contrib/admin/sites.py:42 contrib/admin/templates/admin/base_site.html:3 +#: contrib/admin/sites.py:39 contrib/admin/templates/admin/base_site.html:3 msgid "Django site admin" msgstr "" -#: contrib/admin/sites.py:45 contrib/admin/templates/admin/base_site.html:6 +#: contrib/admin/sites.py:42 contrib/admin/templates/admin/base_site.html:6 msgid "Django administration" msgstr "" -#: contrib/admin/sites.py:48 +#: contrib/admin/sites.py:45 msgid "Site administration" msgstr "" -#: contrib/admin/sites.py:395 contrib/admin/templates/admin/login.html:63 -#: contrib/admin/templates/registration/password_reset_complete.html:18 -#: contrib/admin/tests.py:135 +#: contrib/admin/sites.py:422 contrib/admin/templates/admin/login.html:63 +#: contrib/admin/templates/registration/password_reset_complete.html:15 +#: contrib/admin/tests.py:143 msgid "Log in" msgstr "" -#: contrib/admin/sites.py:524 +#: contrib/admin/sites.py:577 #, python-format msgid "%(app)s administration" msgstr "" @@ -370,18 +370,18 @@ msgid "We’re sorry, but the requested page could not be found." msgstr "" #: contrib/admin/templates/admin/500.html:6 -#: contrib/admin/templates/admin/app_index.html:9 -#: contrib/admin/templates/admin/auth/user/change_password.html:13 -#: contrib/admin/templates/admin/base.html:64 +#: contrib/admin/templates/admin/app_index.html:10 +#: contrib/admin/templates/admin/auth/user/change_password.html:10 +#: contrib/admin/templates/admin/base.html:76 #: contrib/admin/templates/admin/change_form.html:18 -#: contrib/admin/templates/admin/change_list.html:31 +#: contrib/admin/templates/admin/change_list.html:32 #: contrib/admin/templates/admin/delete_confirmation.html:14 #: contrib/admin/templates/admin/delete_selected_confirmation.html:14 #: contrib/admin/templates/admin/invalid_setup.html:6 #: contrib/admin/templates/admin/object_history.html:6 #: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_change_done.html:6 -#: contrib/admin/templates/registration/password_change_form.html:7 +#: contrib/admin/templates/registration/password_change_done.html:13 +#: contrib/admin/templates/registration/password_change_form.html:14 #: contrib/admin/templates/registration/password_reset_complete.html:6 #: contrib/admin/templates/registration/password_reset_confirm.html:7 #: contrib/admin/templates/registration/password_reset_done.html:6 @@ -428,19 +428,23 @@ msgstr "" msgid "Clear selection" msgstr "" +#: contrib/admin/templates/admin/app_index.html:8 +#: contrib/admin/templates/admin/base.html:73 +msgid "Breadcrumbs" +msgstr "" + #: contrib/admin/templates/admin/app_list.html:8 #, python-format msgid "Models in the %(name)s application" msgstr "" #: contrib/admin/templates/admin/app_list.html:19 -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:18 msgid "Add" msgstr "" #: contrib/admin/templates/admin/app_list.html:26 -#: contrib/admin/templates/admin/edit_inline/stacked.html:12 -#: contrib/admin/templates/admin/edit_inline/tabular.html:34 +#: contrib/admin/templates/admin/edit_inline/stacked.html:16 +#: contrib/admin/templates/admin/edit_inline/tabular.html:36 msgid "View" msgstr "" @@ -458,52 +462,68 @@ msgstr "" msgid "Enter a username and password." msgstr "" -#: contrib/admin/templates/admin/auth/user/change_password.html:17 -#: contrib/admin/templates/admin/auth/user/change_password.html:55 -#: contrib/admin/templates/admin/base.html:52 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admin/templates/admin/auth/user/change_password.html:14 +#: contrib/admin/templates/admin/auth/user/change_password.html:52 +#: contrib/admin/templates/admin/base.html:57 +#: contrib/admin/templates/registration/password_change_done.html:4 +#: contrib/admin/templates/registration/password_change_form.html:5 msgid "Change password" msgstr "" -#: contrib/admin/templates/admin/auth/user/change_password.html:28 -#: contrib/admin/templates/admin/change_form.html:43 -#: contrib/admin/templates/admin/change_list.html:51 -#: contrib/admin/templates/admin/login.html:23 -#: contrib/admin/templates/registration/password_change_form.html:21 -msgid "Please correct the error below." +#: contrib/admin/templates/admin/auth/user/change_password.html:18 +msgid "Set password" msgstr "" -#: contrib/admin/templates/admin/auth/user/change_password.html:28 +#: contrib/admin/templates/admin/auth/user/change_password.html:25 #: contrib/admin/templates/admin/change_form.html:43 -#: contrib/admin/templates/admin/change_list.html:51 +#: contrib/admin/templates/admin/change_list.html:52 #: contrib/admin/templates/admin/login.html:23 -#: contrib/admin/templates/registration/password_change_form.html:21 -msgid "Please correct the errors below." -msgstr "" +#: contrib/admin/templates/registration/password_change_form.html:25 +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" -#: contrib/admin/templates/admin/auth/user/change_password.html:32 +#: contrib/admin/templates/admin/auth/user/change_password.html:29 #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" -#: contrib/admin/templates/admin/base.html:38 -msgid "Welcome," +#: contrib/admin/templates/admin/auth/user/change_password.html:35 +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:71 +msgid "Disable password-based authentication" +msgstr "" + +#: contrib/admin/templates/admin/auth/user/change_password.html:73 +msgid "Enable password-based authentication" +msgstr "" + +#: contrib/admin/templates/admin/base.html:28 +msgid "Skip to main content" msgstr "" #: contrib/admin/templates/admin/base.html:43 -msgid "View site" +msgid "Welcome," msgstr "" #: contrib/admin/templates/admin/base.html:48 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:4 +msgid "View site" +msgstr "" + +#: contrib/admin/templates/admin/base.html:53 +#: contrib/admin/templates/registration/password_change_done.html:4 +#: contrib/admin/templates/registration/password_change_form.html:5 msgid "Documentation" msgstr "" -#: contrib/admin/templates/admin/base.html:54 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/admin/templates/registration/password_change_form.html:4 +#: contrib/admin/templates/admin/base.html:61 +#: contrib/admin/templates/registration/password_change_done.html:7 +#: contrib/admin/templates/registration/password_change_form.html:8 msgid "Log out" msgstr "" @@ -519,39 +539,58 @@ msgid "History" msgstr "" #: contrib/admin/templates/admin/change_form_object_tools.html:7 -#: contrib/admin/templates/admin/edit_inline/stacked.html:14 -#: contrib/admin/templates/admin/edit_inline/tabular.html:36 +#: contrib/admin/templates/admin/edit_inline/stacked.html:18 +#: contrib/admin/templates/admin/edit_inline/tabular.html:38 msgid "View on site" msgstr "" -#: contrib/admin/templates/admin/change_list.html:62 +#: contrib/admin/templates/admin/change_list.html:77 msgid "Filter" msgstr "" -#: contrib/admin/templates/admin/change_list.html:64 +#: contrib/admin/templates/admin/change_list.html:80 +msgid "Hide counts" +msgstr "" + +#: contrib/admin/templates/admin/change_list.html:81 +msgid "Show counts" +msgstr "" + +#: contrib/admin/templates/admin/change_list.html:84 msgid "Clear all filters" msgstr "" -#: contrib/admin/templates/admin/change_list_results.html:17 +#: contrib/admin/templates/admin/change_list_results.html:16 msgid "Remove from sorting" msgstr "" -#: contrib/admin/templates/admin/change_list_results.html:18 +#: contrib/admin/templates/admin/change_list_results.html:17 #, python-format msgid "Sorting priority: %(priority_number)s" msgstr "" -#: contrib/admin/templates/admin/change_list_results.html:19 +#: contrib/admin/templates/admin/change_list_results.html:18 msgid "Toggle sorting" msgstr "" +#: contrib/admin/templates/admin/color_theme_toggle.html:3 +msgid "Toggle theme (current theme: auto)" +msgstr "" + +#: contrib/admin/templates/admin/color_theme_toggle.html:4 +msgid "Toggle theme (current theme: light)" +msgstr "" + +#: contrib/admin/templates/admin/color_theme_toggle.html:5 +msgid "Toggle theme (current theme: dark)" +msgstr "" + #: contrib/admin/templates/admin/delete_confirmation.html:18 -#: contrib/admin/templates/admin/submit_line.html:7 -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:25 +#: contrib/admin/templates/admin/submit_line.html:14 msgid "Delete" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:24 +#: contrib/admin/templates/admin/delete_confirmation.html:25 #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " @@ -559,32 +598,32 @@ msgid "" "following types of objects:" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:31 +#: contrib/admin/templates/admin/delete_confirmation.html:30 #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:38 +#: contrib/admin/templates/admin/delete_confirmation.html:35 #, python-format msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:40 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:39 +#: contrib/admin/templates/admin/delete_confirmation.html:37 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:31 msgid "Objects" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:47 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:50 +#: contrib/admin/templates/admin/delete_confirmation.html:44 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:42 msgid "Yes, I’m sure" msgstr "" -#: contrib/admin/templates/admin/delete_confirmation.html:48 -#: contrib/admin/templates/admin/delete_selected_confirmation.html:51 +#: contrib/admin/templates/admin/delete_confirmation.html:45 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:43 msgid "No, take me back" msgstr "" @@ -600,25 +639,25 @@ msgid "" "types of objects:" msgstr "" -#: contrib/admin/templates/admin/delete_selected_confirmation.html:30 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:26 #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" -#: contrib/admin/templates/admin/delete_selected_confirmation.html:37 +#: contrib/admin/templates/admin/delete_selected_confirmation.html:29 #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -#: contrib/admin/templates/admin/edit_inline/tabular.html:20 +#: contrib/admin/templates/admin/edit_inline/tabular.html:22 msgid "Delete?" msgstr "" -#: contrib/admin/templates/admin/filter.html:2 +#: contrib/admin/templates/admin/filter.html:4 #, python-format msgid " By %(filter_title)s " msgstr "" @@ -639,7 +678,19 @@ msgstr "" msgid "None available" msgstr "" -#: contrib/admin/templates/admin/index.html:42 +#: contrib/admin/templates/admin/index.html:33 +msgid "Added:" +msgstr "" + +#: contrib/admin/templates/admin/index.html:33 +msgid "Changed:" +msgstr "" + +#: contrib/admin/templates/admin/index.html:33 +msgid "Deleted:" +msgstr "" + +#: contrib/admin/templates/admin/index.html:43 msgid "Unknown content" msgstr "" @@ -661,6 +712,22 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "" +#: contrib/admin/templates/admin/nav_sidebar.html:2 +msgid "Toggle navigation" +msgstr "" + +#: contrib/admin/templates/admin/nav_sidebar.html:3 +msgid "Sidebar" +msgstr "" + +#: contrib/admin/templates/admin/nav_sidebar.html:5 +msgid "Start typing to filter…" +msgstr "" + +#: contrib/admin/templates/admin/nav_sidebar.html:6 +msgid "Filter navigation items" +msgstr "" + #: contrib/admin/templates/admin/object_history.html:22 msgid "Date/time" msgstr "" @@ -673,7 +740,13 @@ msgstr "" msgid "Action" msgstr "" -#: contrib/admin/templates/admin/object_history.html:38 +#: contrib/admin/templates/admin/object_history.html:49 +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" + +#: contrib/admin/templates/admin/object_history.html:52 msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -709,66 +782,71 @@ msgstr[1] "" msgid "%(full_result_count)s total" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:9 +#: contrib/admin/templates/admin/submit_line.html:5 msgid "Save as new" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:10 +#: contrib/admin/templates/admin/submit_line.html:6 msgid "Save and add another" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:11 +#: contrib/admin/templates/admin/submit_line.html:7 msgid "Save and continue editing" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:11 +#: contrib/admin/templates/admin/submit_line.html:7 msgid "Save and view" msgstr "" -#: contrib/admin/templates/admin/submit_line.html:12 +#: contrib/admin/templates/admin/submit_line.html:10 msgid "Close" msgstr "" -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:10 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:11 #, python-format msgid "Change selected %(model)s" msgstr "" -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:17 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:19 #, python-format msgid "Add another %(model)s" msgstr "" -#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:24 +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:27 #, python-format msgid "Delete selected %(model)s" msgstr "" +#: contrib/admin/templates/admin/widgets/related_widget_wrapper.html:34 +#, python-format +msgid "View selected %(model)s" +msgstr "" + #: contrib/admin/templates/registration/logged_out.html:10 -msgid "Thanks for spending some quality time with the Web site today." +msgid "Thanks for spending some quality time with the web site today." msgstr "" #: contrib/admin/templates/registration/logged_out.html:12 msgid "Log in again" msgstr "" -#: contrib/admin/templates/registration/password_change_done.html:7 -#: contrib/admin/templates/registration/password_change_form.html:8 +#: contrib/admin/templates/registration/password_change_done.html:14 +#: contrib/admin/templates/registration/password_change_form.html:15 msgid "Password change" msgstr "" -#: contrib/admin/templates/registration/password_change_done.html:14 +#: contrib/admin/templates/registration/password_change_done.html:19 msgid "Your password was changed." msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:26 +#: contrib/admin/templates/registration/password_change_form.html:30 msgid "" "Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -#: contrib/admin/templates/registration/password_change_form.html:54 -#: contrib/admin/templates/registration/password_reset_confirm.html:32 +#: contrib/admin/templates/registration/password_change_form.html:58 +#: contrib/admin/templates/registration/password_reset_confirm.html:37 msgid "Change my password" msgstr "" @@ -778,7 +856,7 @@ msgstr "" msgid "Password reset" msgstr "" -#: contrib/admin/templates/registration/password_reset_complete.html:16 +#: contrib/admin/templates/registration/password_reset_complete.html:13 msgid "Your password has been set. You may go ahead and log in now." msgstr "" @@ -786,7 +864,7 @@ msgstr "" msgid "Password reset confirmation" msgstr "" -#: contrib/admin/templates/registration/password_reset_confirm.html:18 +#: contrib/admin/templates/registration/password_reset_confirm.html:16 msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." @@ -796,23 +874,23 @@ msgstr "" msgid "New password:" msgstr "" -#: contrib/admin/templates/registration/password_reset_confirm.html:29 +#: contrib/admin/templates/registration/password_reset_confirm.html:31 msgid "Confirm password:" msgstr "" -#: contrib/admin/templates/registration/password_reset_confirm.html:38 +#: contrib/admin/templates/registration/password_reset_confirm.html:43 msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" -#: contrib/admin/templates/registration/password_reset_done.html:15 +#: contrib/admin/templates/registration/password_reset_done.html:13 msgid "" "We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -#: contrib/admin/templates/registration/password_reset_done.html:17 +#: contrib/admin/templates/registration/password_reset_done.html:15 msgid "" "If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." @@ -842,55 +920,59 @@ msgstr "" msgid "The %(site_name)s team" msgstr "" -#: contrib/admin/templates/registration/password_reset_form.html:16 +#: contrib/admin/templates/registration/password_reset_form.html:14 msgid "" "Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -#: contrib/admin/templates/registration/password_reset_form.html:22 +#: contrib/admin/templates/registration/password_reset_form.html:21 msgid "Email address:" msgstr "" -#: contrib/admin/templates/registration/password_reset_form.html:25 +#: contrib/admin/templates/registration/password_reset_form.html:27 msgid "Reset my password" msgstr "" -#: contrib/admin/templatetags/admin_list.py:423 +#: contrib/admin/templatetags/admin_list.py:100 +msgid "Select all objects on this page for an action" +msgstr "" + +#: contrib/admin/templatetags/admin_list.py:434 msgid "All dates" msgstr "" -#: contrib/admin/views/main.py:100 +#: contrib/admin/views/main.py:147 #, python-format msgid "Select %s" msgstr "" -#: contrib/admin/views/main.py:102 +#: contrib/admin/views/main.py:149 #, python-format msgid "Select %s to change" msgstr "" -#: contrib/admin/views/main.py:104 +#: contrib/admin/views/main.py:151 #, python-format msgid "Select %s to view" msgstr "" -#: contrib/admin/widgets.py:87 +#: contrib/admin/widgets.py:98 msgid "Date:" msgstr "" -#: contrib/admin/widgets.py:88 +#: contrib/admin/widgets.py:99 msgid "Time:" msgstr "" -#: contrib/admin/widgets.py:150 +#: contrib/admin/widgets.py:163 msgid "Lookup" msgstr "" -#: contrib/admin/widgets.py:340 +#: contrib/admin/widgets.py:389 msgid "Currently:" msgstr "" -#: contrib/admin/widgets.py:341 +#: contrib/admin/widgets.py:390 msgid "Change:" msgstr "" diff --git a/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po index ed5ee8d920ee..443c0b9558d6 100644 --- a/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/en/LC_MESSAGES/djangojs.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: Django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-11 20:56+0200\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" "PO-Revision-Date: 2010-05-13 15:35+0200\n" "Last-Translator: Django team\n" "Language-Team: English \n" @@ -31,6 +31,7 @@ msgid "Type into this box to filter down the list of available %s." msgstr "" #: contrib/admin/static/admin/js/SelectFilter2.js:65 +#: contrib/admin/static/admin/js/SelectFilter2.js:110 msgid "Filter" msgstr "" @@ -63,39 +64,47 @@ msgid "" "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" -#: contrib/admin/static/admin/js/SelectFilter2.js:99 +#: contrib/admin/static/admin/js/SelectFilter2.js:105 +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" + +#: contrib/admin/static/admin/js/SelectFilter2.js:120 msgid "Remove all" msgstr "" -#: contrib/admin/static/admin/js/SelectFilter2.js:99 +#: contrib/admin/static/admin/js/SelectFilter2.js:120 #, javascript-format msgid "Click to remove all chosen %s at once." msgstr "" -#: contrib/admin/static/admin/js/actions.js:49 -#: contrib/admin/static/admin/js/actions.min.js:2 +#: contrib/admin/static/admin/js/SelectFilter2.js:211 +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "" +msgstr[1] "" + +#: contrib/admin/static/admin/js/actions.js:67 msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "" msgstr[1] "" -#: contrib/admin/static/admin/js/actions.js:118 -#: contrib/admin/static/admin/js/actions.min.js:5 +#: contrib/admin/static/admin/js/actions.js:161 msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." msgstr "" -#: contrib/admin/static/admin/js/actions.js:130 -#: contrib/admin/static/admin/js/actions.min.js:5 +#: contrib/admin/static/admin/js/actions.js:174 msgid "" "You have selected an action, but you haven’t saved your changes to " "individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -#: contrib/admin/static/admin/js/actions.js:132 -#: contrib/admin/static/admin/js/actions.min.js:6 +#: contrib/admin/static/admin/js/actions.js:175 msgid "" "You have selected an action, and you haven’t made any changes on individual " "fields. You’re probably looking for the Go button rather than the Save " @@ -103,7 +112,7 @@ msgid "" msgstr "" #: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:13 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:113 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:110 msgid "Now" msgstr "" @@ -123,47 +132,47 @@ msgstr "" msgid "6 p.m." msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:80 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:78 #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "" msgstr[1] "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:88 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:86 #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "" msgstr[1] "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:131 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:128 msgid "Choose a Time" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:161 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:158 msgid "Choose a time" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:178 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:336 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:175 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:333 msgid "Cancel" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:241 -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:321 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:238 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:318 msgid "Today" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:258 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:255 msgid "Choose a Date" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:315 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:312 msgid "Yesterday" msgstr "" -#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:327 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:324 msgid "Tomorrow" msgstr "" @@ -216,48 +225,159 @@ msgid "December" msgstr "" #: contrib/admin/static/admin/js/calendar.js:25 +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:26 +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:27 +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:28 +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:29 +msgctxt "abbrev. month May" +msgid "May" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:30 +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:31 +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:32 +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:33 +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:34 +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:35 +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:36 +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:39 +msgid "Sunday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:40 +msgid "Monday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:41 +msgid "Tuesday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:42 +msgid "Wednesday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:43 +msgid "Thursday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:44 +msgid "Friday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:45 +msgid "Saturday" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:48 +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:49 +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:50 +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:51 +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:52 +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:53 +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:54 +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "" + +#: contrib/admin/static/admin/js/calendar.js:57 msgctxt "one letter Sunday" msgid "S" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:26 +#: contrib/admin/static/admin/js/calendar.js:58 msgctxt "one letter Monday" msgid "M" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:27 +#: contrib/admin/static/admin/js/calendar.js:59 msgctxt "one letter Tuesday" msgid "T" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:28 +#: contrib/admin/static/admin/js/calendar.js:60 msgctxt "one letter Wednesday" msgid "W" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:29 +#: contrib/admin/static/admin/js/calendar.js:61 msgctxt "one letter Thursday" msgid "T" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:30 +#: contrib/admin/static/admin/js/calendar.js:62 msgctxt "one letter Friday" msgid "F" msgstr "" -#: contrib/admin/static/admin/js/calendar.js:31 +#: contrib/admin/static/admin/js/calendar.js:63 msgctxt "one letter Saturday" msgid "S" msgstr "" - -#: contrib/admin/static/admin/js/collapse.js:16 -#: contrib/admin/static/admin/js/collapse.js:34 -#: contrib/admin/static/admin/js/collapse.min.js:1 -#: contrib/admin/static/admin/js/collapse.min.js:2 -msgid "Show" -msgstr "" - -#: contrib/admin/static/admin/js/collapse.js:30 -#: contrib/admin/static/admin/js/collapse.min.js:2 -msgid "Hide" -msgstr "" diff --git a/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo b/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo index a19397e2ffb8..c86ec5d03092 100644 Binary files a/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po b/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po index 111eb3817724..dfe62a07c5f0 100644 --- a/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/en_AU/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Tom Fifield , 2014 +# Tom Fifield , 2014 +# Tom Fifield , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 21:09+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-09-22 07:21+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: English (Australia) (http://www.transifex.com/django/django/" "language/en_AU/)\n" "MIME-Version: 1.0\n" @@ -17,6 +18,10 @@ msgstr "" "Language: en_AU\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Delete selected %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Successfully deleted %(count)d %(items)s." @@ -28,18 +33,14 @@ msgstr "Cannot delete %(name)s" msgid "Are you sure?" msgstr "Are you sure?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Delete selected %(verbose_name_plural)s" - msgid "Administration" -msgstr "" +msgstr "Administration" msgid "All" msgstr "All" msgid "Yes" -msgstr "" +msgstr "Yes" msgid "No" msgstr "No" @@ -63,10 +64,16 @@ msgid "This year" msgstr "This year" msgid "No date" -msgstr "" +msgstr "No date" msgid "Has date" -msgstr "" +msgstr "Has date" + +msgid "Empty" +msgstr "Empty" + +msgid "Not empty" +msgstr "Not empty" #, python-format msgid "" @@ -81,25 +88,34 @@ msgstr "Action:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "" +msgstr "Add another %(verbose_name)s" msgid "Remove" -msgstr "" +msgstr "Remove" + +msgid "Addition" +msgstr "Addition" + +msgid "Change" +msgstr "Change" + +msgid "Deletion" +msgstr "Deletion" msgid "action time" msgstr "action time" msgid "user" -msgstr "" +msgstr "user" msgid "content type" -msgstr "" +msgstr "content type" msgid "object id" msgstr "object id" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "object repr" @@ -116,41 +132,41 @@ msgid "log entries" msgstr "log entries" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Added \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Added “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Changed “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Deleted “%(object)s.”" msgid "LogEntry Object" msgstr "LogEntry Object" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" +msgid "Added {name} “{object}”." +msgstr "Added {name} “{object}”." msgid "Added." -msgstr "" +msgstr "Added." msgid "and" msgstr "and" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" +msgid "Changed {fields} for {name} “{object}”." +msgstr "Changed {fields} for {name} “{object}”." #, python-brace-format msgid "Changed {fields}." -msgstr "" +msgstr "Changed {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" +msgid "Deleted {name} “{object}”." +msgstr "Deleted {name} “{object}”." msgid "No fields changed." msgstr "No fields changed." @@ -158,39 +174,44 @@ msgstr "No fields changed." msgid "None" msgstr "None" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "Hold down “Control”, or “Command” on a Mac, to select more than one." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" +msgid "The {name} “{obj}” was added successfully." +msgstr "The {name} “{obj}” was added successfully." + +msgid "You may edit it again below." +msgstr "You may edit it again below." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"The {name} “{obj}” was added successfully. You may add another {name} below." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" +"The {name} “{obj}” was changed successfully. You may edit it again below." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" +"The {name} “{obj}” was added successfully. You may edit it again below." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "The {name} “{obj}” was changed successfully." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -203,12 +224,12 @@ msgid "No action selected." msgstr "No action selected." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "The %(name)s “%(obj)s” was deleted successfully." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" #, python-format msgid "Add %s" @@ -218,6 +239,10 @@ msgstr "Add %s" msgid "Change %s" msgstr "Change %s" +#, python-format +msgid "View %s" +msgstr "View %s" + msgid "Database error" msgstr "Database error" @@ -239,133 +264,155 @@ msgstr "0 of %(cnt)s selected" #, python-format msgid "Change history: %s" -msgstr "" +msgstr "Change history: %s" #. Translators: Model verbose name and instance representation, #. suitable to be an item in a list. #, python-format msgid "%(class_name)s %(instance)s" -msgstr "" +msgstr "%(class_name)s %(instance)s" #, python-format msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" msgid "Django site admin" -msgstr "" +msgstr "Django site admin" msgid "Django administration" -msgstr "" +msgstr "Django administration" msgid "Site administration" -msgstr "" +msgstr "Site administration" msgid "Log in" -msgstr "" +msgstr "Log in" #, python-format msgid "%(app)s administration" -msgstr "" +msgstr "%(app)s administration" msgid "Page not found" -msgstr "" +msgstr "Page not found" -msgid "We're sorry, but the requested page could not be found." -msgstr "" +msgid "We’re sorry, but the requested page could not be found." +msgstr "We’re sorry, but the requested page could not be found." msgid "Home" -msgstr "" +msgstr "Home" msgid "Server error" -msgstr "" +msgstr "Server error" msgid "Server error (500)" -msgstr "" +msgstr "Server error (500)" msgid "Server Error (500)" -msgstr "" +msgstr "Server Error (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." msgid "Run the selected action" -msgstr "" +msgstr "Run the selected action" msgid "Go" -msgstr "" +msgstr "Go" msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "Click here to select the objects across all pages" #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "" +msgstr "Select all %(total_count)s %(module_name)s" msgid "Clear selection" -msgstr "" +msgstr "Clear selection" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models in the %(name)s application" + +msgid "Add" +msgstr "Add" + +msgid "View" +msgstr "View" + +msgid "You don’t have permission to view or edit anything." +msgstr "You don’t have permission to view or edit anything." msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." msgid "Enter a username and password." -msgstr "" +msgstr "Enter a username and password." msgid "Change password" -msgstr "" +msgstr "Change password" msgid "Please correct the error below." -msgstr "" +msgstr "Please correct the error below." msgid "Please correct the errors below." -msgstr "" +msgstr "Please correct the errors below." #, python-format msgid "Enter a new password for the user %(username)s." -msgstr "" +msgstr "Enter a new password for the user %(username)s." msgid "Welcome," -msgstr "" +msgstr "Welcome," msgid "View site" -msgstr "" +msgstr "View site" msgid "Documentation" -msgstr "" +msgstr "Documentation" msgid "Log out" -msgstr "" +msgstr "Log out" #, python-format msgid "Add %(name)s" -msgstr "" +msgstr "Add %(name)s" msgid "History" -msgstr "" +msgstr "History" msgid "View on site" -msgstr "" +msgstr "View on site" msgid "Filter" -msgstr "" +msgstr "Filter" + +msgid "Clear all filters" +msgstr "Clear all filters" msgid "Remove from sorting" -msgstr "" +msgstr "Remove from sorting" #, python-format msgid "Sorting priority: %(priority_number)s" -msgstr "" +msgstr "Sorting priority: %(priority_number)s" msgid "Toggle sorting" -msgstr "" +msgstr "Toggle sorting" msgid "Delete" -msgstr "" +msgstr "Delete" #, python-format msgid "" @@ -373,30 +420,37 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" #, python-format msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" #, python-format msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" msgid "Objects" -msgstr "" +msgstr "Objects" -msgid "Yes, I'm sure" -msgstr "" +msgid "Yes, I’m sure" +msgstr "Yes, I’m sure" msgid "No, take me back" -msgstr "" +msgstr "No, take me back" msgid "Delete multiple objects" -msgstr "" +msgstr "Delete multiple objects" #, python-format msgid "" @@ -404,233 +458,267 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" - -msgid "Change" -msgstr "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" msgid "Delete?" -msgstr "" +msgstr "Delete?" #, python-format msgid " By %(filter_title)s " -msgstr "" +msgstr " By %(filter_title)s " msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "" - -msgid "You don't have permission to edit anything." -msgstr "" +msgstr "Summary" msgid "Recent actions" -msgstr "" +msgstr "Recent actions" msgid "My actions" -msgstr "" +msgstr "My actions" msgid "None available" -msgstr "" +msgstr "None available" msgid "Unknown content" -msgstr "" +msgstr "Unknown content" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" +"You are authenticated as %(username)s, but are not authorised to access this " +"page. Would you like to login to a different account?" msgid "Forgotten your password or username?" +msgstr "Forgotten your password or username?" + +msgid "Toggle navigation" +msgstr "Toggle navigation" + +msgid "Start typing to filter…" msgstr "" -msgid "Date/time" +msgid "Filter navigation items" msgstr "" +msgid "Date/time" +msgstr "Date/time" + msgid "User" -msgstr "" +msgstr "User" msgid "Action" -msgstr "" +msgstr "Action" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." msgid "Show all" -msgstr "" +msgstr "Show all" msgid "Save" -msgstr "" +msgstr "Save" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" +msgid "Popup closing…" +msgstr "Popup closing…" msgid "Search" -msgstr "" +msgstr "Search" #, python-format msgid "%(counter)s result" msgid_plural "%(counter)s results" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(counter)s result" +msgstr[1] "%(counter)s results" #, python-format msgid "%(full_result_count)s total" -msgstr "" +msgstr "%(full_result_count)s total" msgid "Save as new" -msgstr "" +msgstr "Save as new" msgid "Save and add another" -msgstr "" +msgstr "Save and add another" msgid "Save and continue editing" -msgstr "" +msgstr "Save and continue editing" -msgid "Thanks for spending some quality time with the Web site today." +msgid "Save and view" +msgstr "Save and view" + +msgid "Close" +msgstr "Close" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Change selected %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Add another %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Delete selected %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "" msgid "Log in again" -msgstr "" +msgstr "Log in again" msgid "Password change" -msgstr "" +msgstr "Password change" msgid "Your password was changed." -msgstr "" +msgstr "Your password was changed." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." msgid "Change my password" -msgstr "" +msgstr "Change my password" msgid "Password reset" -msgstr "" +msgstr "Password reset" msgid "Your password has been set. You may go ahead and log in now." -msgstr "" +msgstr "Your password has been set. You may go ahead and log in now." msgid "Password reset confirmation" -msgstr "" +msgstr "Password reset confirmation" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." msgstr "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." msgid "New password:" -msgstr "" +msgstr "New password:" msgid "Confirm password:" -msgstr "" +msgstr "Confirm password:" msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." msgid "Please go to the following page and choose a new password:" -msgstr "" +msgstr "Please go to the following page and choose a new password:" -msgid "Your username, in case you've forgotten:" -msgstr "" +msgid "Your username, in case you’ve forgotten:" +msgstr "Your username, in case you’ve forgotten:" msgid "Thanks for using our site!" -msgstr "" +msgstr "Thanks for using our site!" #, python-format msgid "The %(site_name)s team" -msgstr "" +msgstr "The %(site_name)s team" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." msgid "Email address:" -msgstr "" +msgstr "Email address:" msgid "Reset my password" -msgstr "" +msgstr "Reset my password" msgid "All dates" -msgstr "" +msgstr "All dates" #, python-format msgid "Select %s" -msgstr "" +msgstr "Select %s" #, python-format msgid "Select %s to change" -msgstr "" +msgstr "Select %s to change" + +#, python-format +msgid "Select %s to view" +msgstr "Select %s to view" msgid "Date:" -msgstr "" +msgstr "Date:" msgid "Time:" -msgstr "" +msgstr "Time:" msgid "Lookup" -msgstr "" +msgstr "Lookup" msgid "Currently:" -msgstr "" +msgstr "Currently:" msgid "Change:" -msgstr "" +msgstr "Change:" diff --git a/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo index 775077fa0e93..077e7840fa67 100644 Binary files a/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po index fe991ffac808..c4e52eb1477f 100644 --- a/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/en_AU/LC_MESSAGES/djangojs.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Tom Fifield , 2014 +# Tom Fifield , 2014 +# Tom Fifield , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 21:09+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-11 13:13+0000\n" +"Last-Translator: Tom Fifield \n" "Language-Team: English (Australia) (http://www.transifex.com/django/django/" "language/en_AU/)\n" "MIME-Version: 1.0\n" @@ -70,140 +71,196 @@ msgstr "Click to remove all chosen %s at once." msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(sel)s of %(cnt)s selected" +msgstr[1] "%(sel)s of %(cnt)s selected" msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." msgstr "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." + +msgid "Now" +msgstr "Now" + +msgid "Midnight" +msgstr "Midnight" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Noon" + +msgid "6 p.m." +msgstr "6 p.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Note: You are %s hour ahead of server time." +msgstr[1] "Note: You are %s hours ahead of server time." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - -msgid "Now" -msgstr "" +msgstr[0] "Note: You are %s hour behind server time." +msgstr[1] "Note: You are %s hours behind server time." msgid "Choose a Time" -msgstr "" +msgstr "Choose a Time" msgid "Choose a time" -msgstr "" - -msgid "Midnight" -msgstr "" - -msgid "6 a.m." -msgstr "" - -msgid "Noon" -msgstr "" - -msgid "6 p.m." -msgstr "" +msgstr "Choose a time" msgid "Cancel" -msgstr "" +msgstr "Cancel" msgid "Today" -msgstr "" +msgstr "Today" msgid "Choose a Date" -msgstr "" +msgstr "Choose a Date" msgid "Yesterday" -msgstr "" +msgstr "Yesterday" msgid "Tomorrow" -msgstr "" +msgstr "Tomorrow" msgid "January" -msgstr "" +msgstr "January" msgid "February" -msgstr "" +msgstr "February" msgid "March" -msgstr "" +msgstr "March" msgid "April" -msgstr "" +msgstr "April" msgid "May" -msgstr "" +msgstr "May" msgid "June" -msgstr "" +msgstr "June" msgid "July" -msgstr "" +msgstr "July" msgid "August" -msgstr "" +msgstr "August" msgid "September" -msgstr "" +msgstr "September" msgid "October" -msgstr "" +msgstr "October" msgid "November" -msgstr "" +msgstr "November" msgid "December" -msgstr "" +msgstr "December" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Oct" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec" msgctxt "one letter Sunday" msgid "S" -msgstr "" +msgstr "S" msgctxt "one letter Monday" msgid "M" -msgstr "" +msgstr "M" msgctxt "one letter Tuesday" msgid "T" -msgstr "" +msgstr "T" msgctxt "one letter Wednesday" msgid "W" -msgstr "" +msgstr "W" msgctxt "one letter Thursday" msgid "T" -msgstr "" +msgstr "T" msgctxt "one letter Friday" msgid "F" -msgstr "" +msgstr "F" msgctxt "one letter Saturday" msgid "S" -msgstr "" +msgstr "S" msgid "Show" -msgstr "" +msgstr "Show" msgid "Hide" -msgstr "" +msgstr "Hide" diff --git a/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo b/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo index b61dbe6af2a3..b05f1212def7 100644 Binary files a/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/eo/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/eo/LC_MESSAGES/django.po b/django/contrib/admin/locale/eo/LC_MESSAGES/django.po index ffab5e1e580d..ddc5901fddd7 100644 --- a/django/contrib/admin/locale/eo/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/eo/LC_MESSAGES/django.po @@ -1,20 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Baptiste Darthenay , 2012-2013 -# Baptiste Darthenay , 2013-2019 +# Batist D 🐍 , 2012-2013 +# Batist D 🐍 , 2013-2019 # Claude Paroz , 2016 # Dinu Gherman , 2011 # kristjan , 2012 -# Nikolay Korotkiy , 2017 +# Matthieu Desplantes , 2021 +# Meiyer , 2022 +# Nikolay Korotkiy , 2017 # Adamo Mesha , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 12:48+0000\n" -"Last-Translator: Baptiste Darthenay \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-05-25 07:05+0000\n" +"Last-Translator: Meiyer , 2022\n" "Language-Team: Esperanto (http://www.transifex.com/django/django/language/" "eo/)\n" "MIME-Version: 1.0\n" @@ -23,6 +25,10 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Forigi elektitajn %(verbose_name_plural)sn" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Sukcese forigis %(count)d %(items)s." @@ -34,10 +40,6 @@ msgstr "Ne povas forigi %(name)s" msgid "Are you sure?" msgstr "Ĉu vi certas?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Forigi elektitajn %(verbose_name_plural)sn" - msgid "Administration" msgstr "Administrado" @@ -74,13 +76,19 @@ msgstr "Neniu dato" msgid "Has date" msgstr "Havas daton" +msgid "Empty" +msgstr "Malplena" + +msgid "Not empty" +msgstr "Ne malplena" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Bonvolu eniri la ĝustan %(username)s-n kaj pasvorton por personara konto. " -"Notu, ke ambaŭ kampoj povas esti usklecodistinga." +"Bonvolu enigi la ĝustajn %(username)sn kaj pasvorton por personara konto. " +"Notu, ke ambaŭ kampoj povas esti uskleco-distingaj." msgid "Action:" msgstr "Ago:" @@ -90,7 +98,7 @@ msgid "Add another %(verbose_name)s" msgstr "Aldoni alian %(verbose_name)sn" msgid "Remove" -msgstr "Forigu" +msgstr "Forigi" msgid "Addition" msgstr "Aldono" @@ -131,23 +139,23 @@ msgid "log entries" msgstr "protokoleroj" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" aldonita." +msgid "Added “%(object)s”." +msgstr "Aldono de “%(object)s”" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Ŝanĝita \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Ŝanĝo de “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Forigita \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Forigo de “%(object)s”" msgid "LogEntry Object" msgstr "Protokolera objekto" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Aldonita {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Aldonita(j) {name} “{object}”." msgid "Added." msgstr "Aldonita." @@ -156,16 +164,16 @@ msgid "and" msgstr "kaj" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Ŝanĝita {fields} por {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Ŝanĝita(j) {fields} por {name} “{object}”." #, python-brace-format msgid "Changed {fields}." -msgstr "Ŝanĝita {fields}." +msgstr "Ŝanĝita(j) {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Forigita {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Forigita(j) {name} “{object}”." msgid "No fields changed." msgstr "Neniu kampo ŝanĝita." @@ -173,68 +181,56 @@ msgstr "Neniu kampo ŝanĝita." msgid "None" msgstr "Neniu" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Premadu la stirklavon, aŭ Komando-klavon ĉe Mac, por elekti pli ol unu." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "La {name} \"{obj}\" estis aldonita sukcese." +msgid "The {name} “{obj}” was added successfully." +msgstr "La {name} “{obj}” estis sukcese aldonita(j)." msgid "You may edit it again below." msgstr "Eblas redakti ĝin sube." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"La {name} \"{obj}\" estis sukcese aldonita. Vi povas sube aldoni alian {name}" -"n." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"La {name} \"{obj}\" estis sukcese ŝanĝita. Vi povas sube redakti ĝin denove." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"La {name} \"{obj}\" estis aldonita sukcese. Vi rajtas ĝin redakti denove " -"sube." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"La {name} \"{obj}\" estis sukcese ŝanĝita. Vi povas sube aldoni alian {name}" -"n." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "La {name} \"{obj}\" estis ŝanĝita sukcese." +msgid "The {name} “{obj}” was changed successfully." +msgstr "" msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -"Elementoj devas esti elektitaj por elfari agojn sur ilin. Neniu elemento " -"estis ŝanĝita." +"Elementoj devas esti elektitaj por agi je ili. Neniu elemento estis ŝanĝita." msgid "No action selected." msgstr "Neniu ago elektita." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "La %(name)s \"%(obj)s\" estis forigita sukcese." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "La %(name)s “%(obj)s” estis sukcese forigita(j)." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s kun ID \"%(key)s\" ne ekzistas. Eble tio estis forigita?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" #, python-format msgid "Add %s" @@ -271,8 +267,9 @@ msgstr "0 el %(cnt)s elektita" msgid "Change history: %s" msgstr "Ŝanĝa historio: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -286,10 +283,10 @@ msgstr "" "protektitajn rilatajn objektojn: %(related_objects)s" msgid "Django site admin" -msgstr "Djanga reteja administrado" +msgstr "Dĵanga reteja administrado" msgid "Django administration" -msgstr "Djanga administrado" +msgstr "Dĵanga administrado" msgid "Site administration" msgstr "Reteja administrado" @@ -299,13 +296,13 @@ msgstr "Ensaluti" #, python-format msgid "%(app)s administration" -msgstr "%(app)s administrado" +msgstr "Administrado de %(app)s" msgid "Page not found" msgstr "Paĝo ne trovita" -msgid "We're sorry, but the requested page could not be found." -msgstr "Bedaŭrinde la petitan paĝon ne povas esti trovita." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Bedaŭrinde la petita paĝo ne estis trovita." msgid "Home" msgstr "Ĉefpaĝo" @@ -320,14 +317,12 @@ msgid "Server Error (500)" msgstr "Servila eraro (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Okazis eraro. Ĝi estis raportita al la retejaj administrantoj tra retpoŝto " -"kaj baldaŭ devus esti riparita. Dankon por via pacienco." msgid "Run the selected action" -msgstr "Lanĉi la elektita agon" +msgstr "Lanĉi la elektitan agon" msgid "Go" msgstr "Ek" @@ -342,12 +337,23 @@ msgstr "Elekti ĉiuj %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Viŝi elekton" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeloj en la aplikaĵo “%(name)s”" + +msgid "Add" +msgstr "Aldoni" + +msgid "View" +msgstr "Vidi" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Unue, bovolu tajpi salutnomon kaj pasvorton. Tiam, vi povos redakti pli da " -"uzantaj agordoj." msgid "Enter a username and password." msgstr "Enigu salutnomon kaj pasvorton." @@ -390,6 +396,9 @@ msgstr "Vidi sur retejo" msgid "Filter" msgstr "Filtri" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "Forigi el ordigado" @@ -432,7 +441,7 @@ msgstr "" msgid "Objects" msgstr "Objektoj" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Jes, mi certas" msgid "No, take me back" @@ -466,9 +475,6 @@ msgstr "" "Ĉu vi certas, ke vi volas forigi la elektitajn %(objects_name)s? Ĉiuj el la " "sekvaj objektoj kaj iliaj rilataj eroj estos forigita:" -msgid "View" -msgstr "Vidi" - msgid "Delete?" msgstr "Forviŝi?" @@ -479,16 +485,6 @@ msgstr " Laŭ %(filter_title)s " msgid "Summary" msgstr "Resumo" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeloj en la %(name)s aplikaĵo" - -msgid "Add" -msgstr "Aldoni" - -msgid "You don't have permission to view or edit anything." -msgstr "Vi havas nenian permeson por vidi aŭ redakti." - msgid "Recent actions" msgstr "Lastaj agoj" @@ -502,13 +498,10 @@ msgid "Unknown content" msgstr "Nekonata enhavo" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Io malbonas en via datumbaza instalo. Bonvolu certigi ke la konvenaj tabeloj " -"de datumbazo estis kreitaj, kaj ke la datumbazo estas legebla per la ĝusta " -"uzanto." #, python-format msgid "" @@ -519,7 +512,16 @@ msgstr "" "paĝon. Ĉu vi ŝatus ensaluti per alia konto?" msgid "Forgotten your password or username?" -msgstr "Ĉu vi forgesis vian pasvorton aŭ salutnomo?" +msgstr "Ĉu vi forgesis vian pasvorton aŭ vian salutnomon?" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" msgid "Date/time" msgstr "Dato/horo" @@ -530,12 +532,18 @@ msgstr "Uzanto" msgid "Action" msgstr "Ago" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Ĉi tiu objekto ne havas ŝanĝ-historion. Eble ĝi ne estis aldonita per la " -"administranta retejo." +"Ĉi tiu objekto ne havas historion de ŝanĝoj. Ĝi verŝajne ne estis aldonita " +"per ĉi tiu administrejo." msgid "Show all" msgstr "Montri ĉion" @@ -586,8 +594,12 @@ msgstr "Aldoni alian %(model)sn" msgid "Delete selected %(model)s" msgstr "Forigi elektitan %(model)sn" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Dankon pro pasigo de kvalita tempon kun la retejo hodiaŭ." +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "Ensaluti denove" @@ -599,11 +611,11 @@ msgid "Your password was changed." msgstr "Via pasvorto estis sukcese ŝanĝita." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Bonvolu enigi vian malnovan pasvorton, pro sekureco, kaj tiam enigi vian " -"novan pasvorton dufoje, tiel ni povas konfirmi ke vi ĝuste tajpis ĝin." +"Bonvolu entajpi vian malnovan pasvorton pro sekureco, kaj entajpi vian novan " +"pasvorton dufoje, por ke ni estu certaj, ke vi tajpis ĝin ĝuste." msgid "Change my password" msgstr "Ŝanĝi mian passvorton" @@ -612,10 +624,10 @@ msgid "Password reset" msgstr "Pasvorta rekomencigo" msgid "Your password has been set. You may go ahead and log in now." -msgstr "Via pasvorto estis ŝanĝita. Vi povas iri antaŭen kaj ensaluti nun." +msgstr "Via pasvorto estis ŝanĝita. Vi povas ensaluti nun." msgid "Password reset confirmation" -msgstr "Pasvorta rekomenciga konfirmo" +msgstr "Konfirmo de restarigo de pasvorto" msgid "" "Please enter your new password twice so we can verify you typed it in " @@ -634,23 +646,22 @@ msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" -"La pasvorta rekomenciga ligo malvalidis, eble ĉar ĝi jam estis uzata. " -"Bonvolu peti novan pasvortan rekomencigon." +"La ligilo por restarigi pasvorton estis malvalida, eble ĉar ĝi jam estis " +"uzita. Bonvolu denove peti restarigon de pasvorto." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Ni retpoŝte sendis al vi instrukciojn por agordi la pasvorton, se la " -"koncerna konto ekzistas, al la retpoŝta adreso kiun vi sendis. Vi baldaŭ " -"devus ĝin ricevi." +"Ni sendis al vi instrukciojn por starigi vian pasvorton, se ekzistas konto " +"kun la retadreso, kiun vi provizis. Vi devus ricevi ilin post mallonge." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Se vi ne ricevas retpoŝton, bonvolu certigi ke vi metis la adreson per kiu " -"vi registris, kaj kontroli vian spaman dosierujon." +"Se vi ne ricevas retmesaĝon, bonvole certiĝu ke vi entajpis la adreson per " +"kiu vi registriĝis, kaj kontrolu en via spamujo." #, python-format msgid "" @@ -663,8 +674,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Bonvolu iri al la sekvanta paĝo kaj elekti novan pasvorton:" -msgid "Your username, in case you've forgotten:" -msgstr "Via salutnomo, se vi forgesis:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Via uzantnomo, se vi forgesis ĝin:" msgid "Thanks for using our site!" msgstr "Dankon pro uzo de nia retejo!" @@ -674,11 +685,11 @@ msgid "The %(site_name)s team" msgstr "La %(site_name)s teamo" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Vi forgesis vian pasvorton? Malsupre enigu vian retpoŝtan adreson kaj ni " -"retpoŝte sendos instrukciojn por agordi novan." +"Ĉu vi forgesis vian pasvorton? Entajpu vian retpoŝtadreson sube kaj ni " +"sendos al vi retpoŝte instrukciojn por ŝanĝi ĝin." msgid "Email address:" msgstr "Retpoŝto:" diff --git a/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo index 9b6aa8f21ec0..6e86ac2d4e48 100644 Binary files a/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po index f101319a4c42..db9991387cef 100644 --- a/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/eo/LC_MESSAGES/djangojs.po @@ -1,17 +1,18 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Baptiste Darthenay , 2012 -# Baptiste Darthenay , 2014-2016 -# Jaffa McNeill , 2011 +# Batist D 🐍 , 2012 +# Batist D 🐍 , 2014-2016 +# 977db45bb2d7151f88325d4fbeca189e_848074d <3d1ba07956d05291bf7c987ecea0a7ef_13052>, 2011 +# Meiyer , 2022 # Adamo Mesha , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Baptiste Darthenay \n" +"POT-Creation-Date: 2022-05-17 05:26-0500\n" +"PO-Revision-Date: 2022-05-25 07:05+0000\n" +"Last-Translator: Meiyer , 2022\n" "Language-Team: Esperanto (http://www.transifex.com/django/django/language/" "eo/)\n" "MIME-Version: 1.0\n" @@ -22,61 +23,59 @@ msgstr "" #, javascript-format msgid "Available %s" -msgstr "Disponebla %s" +msgstr "Disponeblaj %s" #, javascript-format msgid "" "This is the list of available %s. You may choose some by selecting them in " "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" -"Tio ĉi estas la listo de disponeblaj %s. Vi povas forigi kelkajn elektante " -"ilin en la suba skatolo kaj tiam klakante la \"Elekti\" sagon inter la du " -"skatoloj." +"Tio ĉi estas la listo de disponeblaj %s. Vi povas aktivigi kelkajn markante " +"ilin en la suba kesto kaj klakante la sagon “Elekti” inter la du kestoj." #, javascript-format msgid "Type into this box to filter down the list of available %s." -msgstr "Entipu en ĉi-tiu skatolo por filtri la liston de haveblaj %s." +msgstr "Tajpu en ĉi-tiu skatolo por filtri la liston de haveblaj %s." msgid "Filter" msgstr "Filtru" msgid "Choose all" -msgstr "Elekti ĉiuj" +msgstr "Elekti ĉiujn" #, javascript-format msgid "Click to choose all %s at once." -msgstr "Klaku por tuj elekti ĉiuj %s." +msgstr "Klaku por tuj elekti ĉiujn %sn." msgid "Choose" msgstr "Elekti" msgid "Remove" -msgstr "Forigu" +msgstr "Forigi" #, javascript-format msgid "Chosen %s" -msgstr "Elektita %s" +msgstr "Elektitaj %s" #, javascript-format msgid "" "This is the list of chosen %s. You may remove some by selecting them in the " "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" -"Tio ĉi estas la listo de elektitaj %s. Vi povas forigi kelkajn elektante " -"ilin en la suba skatolo kaj tiam klakante la \"Forigi\" sagon inter la du " -"skatoloj." +"Tio ĉi estas la listo de elektitaj %s. Vi povas malaktivigi kelkajn markante " +"ilin en la suba kesto kaj klakante la sagon “Forigi” inter la du kestoj." msgid "Remove all" -msgstr "Forigu ĉiujn" +msgstr "Forigi ĉiujn" #, javascript-format msgid "Click to remove all chosen %s at once." -msgstr "Klaku por tuj forigi ĉiujn %s elektitajn." +msgstr "Klaku por tuj forigi ĉiujn %sn elektitajn." msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s elektita" -msgstr[1] "%(sel)s de %(cnt)s elektitaj" +msgstr[1] "%(sel)s el %(cnt)s elektitaj" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -86,47 +85,43 @@ msgstr "" "agon, viaj neŝirmitaj ŝanĝoj perdiĝos." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Vi elektas agon, sed vi ne ŝirmis viajn ŝanĝojn al individuaj kampoj ĝis " -"nun. Bonvolu klaku BONA por ŝirmi. Vi devos ripeton la agon" msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Vi elektas agon, kaj vi ne faris ajnajn ŝanĝojn ĉe unuopaj kampoj. Vi " -"verŝajne serĉas la Iru-butonon prefere ol la Ŝirmu-butono." msgid "Now" msgstr "Nun" msgid "Midnight" -msgstr "Noktomezo" +msgstr "Noktomeze" msgid "6 a.m." msgstr "6 a.t.m." msgid "Noon" -msgstr "Tagmezo" +msgstr "Tagmeze" msgid "6 p.m." -msgstr "6 ptm" +msgstr "6 p.t.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "Noto: Vi estas %s horo antaŭ la servila horo." -msgstr[1] "Noto: Vi estas %s horoj antaŭ la servila horo." +msgstr[0] "Noto: Vi estas %s horon post la servila horo." +msgstr[1] "Noto: Vi estas %s horojn post la servila horo." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "Noto: Vi estas %s horo post la servila horo." -msgstr[1] "Noto: Vi estas %s horoj post la servila horo." +msgstr[0] "Noto: Vi estas %s horon antaŭ la servila horo." +msgstr[1] "Noto: Vi estas %s horojn antaŭ la servila horo." msgid "Choose a Time" msgstr "Elektu horon" @@ -135,7 +130,7 @@ msgid "Choose a time" msgstr "Elektu tempon" msgid "Cancel" -msgstr "Malmendu" +msgstr "Nuligi" msgid "Today" msgstr "Hodiaŭ" @@ -185,6 +180,54 @@ msgstr "novembro" msgid "December" msgstr "decembro" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "maj." + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun." + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jul." + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aŭg." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec." + msgctxt "one letter Sunday" msgid "S" msgstr "d" @@ -213,8 +256,13 @@ msgctxt "one letter Saturday" msgid "S" msgstr "s" +msgid "" +"You have already submitted this form. Are you sure you want to submit it " +"again?" +msgstr "Vi jam forsendis tiun ĉi formularon. Ĉu vi certe volas resendi ĝin?" + msgid "Show" -msgstr "Montru" +msgstr "Montri" msgid "Hide" -msgstr "Kaŝu" +msgstr "Kaŝi" diff --git a/django/contrib/admin/locale/es/LC_MESSAGES/django.mo b/django/contrib/admin/locale/es/LC_MESSAGES/django.mo index f4c502ec187e..379f20424b85 100644 Binary files a/django/contrib/admin/locale/es/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/es/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/es/LC_MESSAGES/django.po b/django/contrib/admin/locale/es/LC_MESSAGES/django.po index 949e20400fc8..76348412b802 100644 --- a/django/contrib/admin/locale/es/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/es/LC_MESSAGES/django.po @@ -4,28 +4,33 @@ # abraham.martin , 2014 # Antoni Aloy , 2011-2014 # Claude Paroz , 2014 -# Ernesto Avilés Vázquez , 2015-2016 -# franchukelly , 2011 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 +# 8cb2d5a716c3c9a99b6d20472609a4d5_6d03802 , 2011 # guillem , 2012 # Ignacio José Lizarán Rus , 2019 # Igor Támara , 2013 # Jannis Leidel , 2011 +# Jorge Andres Bravo Meza, 2024 # Jorge Puente Sarrín , 2014-2015 # José Luis , 2016 # Josue Naaman Nistal Guerra , 2014 # Luigy, 2019 # Marc Garcia , 2011 # Miguel Angel Tribaldos , 2017 +# Miguel Gonzalez , 2023 +# Natalia, 2024 # Pablo, 2015 +# Salomon Herrera, 2023 +# Uriel Medina , 2020-2024 # Veronicabh , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 08:44+0000\n" -"Last-Translator: Ignacio José Lizarán Rus \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Uriel Medina , 2020-2024\n" +"Language-Team: Spanish (http://app.transifex.com/django/django/language/" "es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,6 +38,10 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Eliminado/s %(count)d %(items)s satisfactoriamente." @@ -44,10 +53,6 @@ msgstr "No se puede eliminar %(name)s" msgid "Are you sure?" msgstr "¿Está seguro?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionado/s" - msgid "Administration" msgstr "Administración" @@ -84,6 +89,12 @@ msgstr "Sin fecha" msgid "Has date" msgstr "Tiene fecha" +msgid "Empty" +msgstr "Vacío" + +msgid "Not empty" +msgstr "No vacío" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -141,23 +152,23 @@ msgid "log entries" msgstr "entradas de registro" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Agregado “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiados \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Modificado “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminado/a \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Eliminado “%(object)s.”" msgid "LogEntry Object" msgstr "Objeto de registro de Log" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Añadido {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Agregado {name} “{object}”." msgid "Added." msgstr "Añadido." @@ -166,16 +177,16 @@ msgid "and" msgstr "y" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Modificado {fields} por {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Cambios en {fields} para {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "Modificado {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Eliminado {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Eliminado {name} “{object}”." msgid "No fields changed." msgstr "No ha cambiado ningún campo." @@ -183,52 +194,46 @@ msgstr "No ha cambiado ningún campo." msgid "None" msgstr "Ninguno" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar " -"más de una opción." +"Mantenga presionado \"Control\" o \"Comando\" en una Mac, para seleccionar " +"más de uno." + +msgid "Select this object for an action - {}" +msgstr "Seleccione este objeto para una acción - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Se añadió con éxito el {name} \"{obj}\"." +msgid "The {name} “{obj}” was added successfully." +msgstr "El {name} “{obj}” fue agregado correctamente." msgid "You may edit it again below." msgstr "Puede volverlo a editar otra vez a continuación." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Se añadió con éxito el {name} \"{obj}\". Puede añadir otro {name} a " +"El {name} “{obj}” se agregó correctamente. Puede agregar otro {name} a " "continuación." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"Se modificó con éxito el {name} \"{obj}\". Puede editarlo otra vez a " +"El {name} “{obj}” se cambió correctamente. Puede editarlo nuevamente a " "continuación." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"Se añadió con éxito el {name} \"{obj}\". Puede editarlo otra vez a " -"continuación." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Se modificó con éxito el {name} \"{obj}\". Puede añadir otro {name} a " +"El {name} “{obj}” se cambió correctamente. Puede agregar otro {name} a " "continuación." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "Se modificó con éxito el {name} \"{obj}\"." +msgid "The {name} “{obj}” was changed successfully." +msgstr "El {name} “{obj}” se cambió correctamente." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -241,12 +246,12 @@ msgid "No action selected." msgstr "No se seleccionó ninguna acción." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "El%(name)s “%(obj)s” fue eliminado con éxito." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s con ID \"%(key)s\" no existe. ¿Fue quizá eliminado?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s con el ID “%(key)s” no existe. ¿Quizás fue eliminado?" #, python-format msgid "Add %s" @@ -258,7 +263,7 @@ msgstr "Modificar %s" #, python-format msgid "View %s" -msgstr "Vistas %s" +msgstr "Vista %s" msgid "Database error" msgstr "Error en la base de datos" @@ -268,12 +273,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s fué modificado con éxito." msgstr[1] "%(count)s %(name)s fueron modificados con éxito." +msgstr[2] "%(count)s %(name)s fueron modificados con éxito." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s seleccionado" msgstr[1] "%(total_count)s seleccionados en total" +msgstr[2] "%(total_count)s seleccionados en total" #, python-format msgid "0 of %(cnt)s selected" @@ -283,8 +290,9 @@ msgstr "seleccionados 0 de %(cnt)s" msgid "Change history: %s" msgstr "Histórico de modificaciones: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -316,8 +324,8 @@ msgstr "Administración de %(app)s " msgid "Page not found" msgstr "Página no encontrada" -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Lo sentimos, pero no se pudo encontrar la página solicitada." msgid "Home" msgstr "Inicio" @@ -332,12 +340,11 @@ msgid "Server Error (500)" msgstr "Error de servidor (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Ha habido un error. Ha sido comunicado al administrador del sitio por correo " -"electrónico y debería solucionarse a la mayor brevedad. Gracias por su " -"paciencia y comprensión." +"Hubo un error. Se ha informado a los administradores del sitio por correo " +"electrónico y debería solucionarse en breve. Gracias por su paciencia." msgid "Run the selected action" msgstr "Ejecutar la acción seleccionada" @@ -355,12 +362,28 @@ msgstr "Seleccionar todos los %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Limpiar selección" +msgid "Breadcrumbs" +msgstr "Migas de pan" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Añadir" + +msgid "View" +msgstr "Vista" + +msgid "You don’t have permission to view or edit anything." +msgstr "No cuenta con permiso para ver ni editar nada." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar " -"el resto de opciones del usuario." +"Primero, ingrese un nombre de usuario y contraseña. Luego, podrá editar más " +"opciones del usuario." msgid "Enter a username and password." msgstr "Introduzca un nombre de usuario y contraseña" @@ -368,11 +391,14 @@ msgstr "Introduzca un nombre de usuario y contraseña" msgid "Change password" msgstr "Cambiar contraseña" -msgid "Please correct the error below." -msgstr "Por Favor corrija el siguiente error." +msgid "Set password" +msgstr "Establecer contraseña" -msgid "Please correct the errors below." -msgstr "Por favor, corrija los siguientes errores." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor, corrija el siguiente error." +msgstr[1] "Por favor, corrija los siguientes errores." +msgstr[2] "Por favor, corrija los siguientes errores." #, python-format msgid "Enter a new password for the user %(username)s." @@ -380,8 +406,24 @@ msgstr "" "Introduzca una nueva contraseña para el usuario %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Esta acción habilitará la autenticación basada en " +"contraseña para este usuario." + +msgid "Disable password-based authentication" +msgstr "Deshabilitar la autenticación basada en contraseña" + +msgid "Enable password-based authentication" +msgstr "Habilitar la autenticación basada en contraseña" + +msgid "Skip to main content" +msgstr "Saltar al contenido principal" + msgid "Welcome," -msgstr "Bienvenido/a," +msgstr "Bienvenidos," msgid "View site" msgstr "Ver el sitio" @@ -390,7 +432,7 @@ msgid "Documentation" msgstr "Documentación" msgid "Log out" -msgstr "Terminar sesión" +msgstr "Cerrar sesión" #, python-format msgid "Add %(name)s" @@ -405,8 +447,17 @@ msgstr "Ver en el sitio" msgid "Filter" msgstr "Filtro" +msgid "Hide counts" +msgstr "Ocultar recuentos" + +msgid "Show counts" +msgstr "Mostrar recuentos" + +msgid "Clear all filters" +msgstr "Borrar todos los filtros" + msgid "Remove from sorting" -msgstr "Elimina de la ordenación" +msgstr "Eliminar del ordenación" #, python-format msgid "Sorting priority: %(priority_number)s" @@ -415,6 +466,15 @@ msgstr "Prioridad de la ordenación: %(priority_number)s" msgid "Toggle sorting" msgstr "Activar la ordenación" +msgid "Toggle theme (current theme: auto)" +msgstr "Cambiar tema (tema actual: automático)" + +msgid "Toggle theme (current theme: light)" +msgstr "Cambiar tema (tema actual: claro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Cambiar tema (tema actual: oscuro)" + msgid "Delete" msgstr "Eliminar" @@ -441,14 +501,14 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s" -"\"? Se borrarán los siguientes objetos relacionados:" +"¿Está seguro de que quiere borrar los %(object_name)s " +"\"%(escaped_object)s\"? Se borrarán los siguientes objetos relacionados:" msgid "Objects" msgstr "Objetos" -msgid "Yes, I'm sure" -msgstr "Sí, estoy seguro" +msgid "Yes, I’m sure" +msgstr "Si, estoy seguro" msgid "No, take me back" msgstr "No, llévame atrás" @@ -482,9 +542,6 @@ msgstr "" "¿Está usted seguro que quiere eliminar el %(objects_name)s seleccionado? " "Todos los siguientes objetos y sus elementos relacionados serán borrados:" -msgid "View" -msgstr "Vista" - msgid "Delete?" msgstr "¿Eliminar?" @@ -495,16 +552,6 @@ msgstr " Por %(filter_title)s " msgid "Summary" msgstr "Resumen" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Añadir" - -msgid "You don't have permission to view or edit anything." -msgstr "No tiene permisos para ver o editar nada" - msgid "Recent actions" msgstr "Acciones recientes" @@ -514,17 +561,26 @@ msgstr "Mis acciones" msgid "None available" msgstr "Ninguno disponible" +msgid "Added:" +msgstr "Agregado:" + +msgid "Changed:" +msgstr "Modificado:" + +msgid "Deleted:" +msgstr "Eliminado:" + msgid "Unknown content" msgstr "Contenido desconocido" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Algo va mal con la instalación de la base de datos. Asegúrese de que las " -"tablas necesarias han sido creadas, y de que la base de datos puede ser " -"leída por el usuario apropiado." +"Algo anda mal con la instalación de su base de datos. Asegúrese de que se " +"hayan creado las tablas de base de datos adecuadas y asegúrese de que el " +"usuario adecuado pueda leer la base de datos." #, python-format msgid "" @@ -537,6 +593,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "¿Ha olvidado la contraseña o el nombre de usuario?" +msgid "Toggle navigation" +msgstr "Activar navegación" + +msgid "Sidebar" +msgstr "Barra lateral" + +msgid "Start typing to filter…" +msgstr "Empiece a escribir para filtrar…" + +msgid "Filter navigation items" +msgstr "Filtrar elementos de navegación" + msgid "Date/time" msgstr "Fecha/hora" @@ -546,18 +614,24 @@ msgstr "Usuario" msgid "Action" msgstr "Acción" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrada" +msgstr[1] "entradas" +msgstr[2] "entradas" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Este objeto no tiene histórico de cambios. Probablemente no fue añadido " -"usando este sitio de administración." +"Este objeto no tiene un historial de cambios. Probablemente no se agregó a " +"través de este sitio de administración." msgid "Show all" msgstr "Mostrar todo" msgid "Save" -msgstr "Grabar" +msgstr "Guardar" msgid "Popup closing…" msgstr "Cerrando ventana emergente..." @@ -570,19 +644,20 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s resultado" msgstr[1] "%(counter)s resultados" +msgstr[2] "%(counter)s resultados" #, python-format msgid "%(full_result_count)s total" msgstr "%(full_result_count)s total" msgid "Save as new" -msgstr "Grabar como nuevo" +msgstr "Guardar como nuevo" msgid "Save and add another" -msgstr "Grabar y añadir otro" +msgstr "Guardar y añadir otro" msgid "Save and continue editing" -msgstr "Grabar y continuar editando" +msgstr "Guardar y continuar editando" msgid "Save and view" msgstr "Guardar y ver" @@ -592,7 +667,7 @@ msgstr "Cerrar" #, python-format msgid "Change selected %(model)s" -msgstr "Cambiar %(model)s seleccionado" +msgstr "Cambiar %(model)s seleccionados" #, python-format msgid "Add another %(model)s" @@ -602,8 +677,12 @@ msgstr "Añadir otro %(model)s" msgid "Delete selected %(model)s" msgstr "Eliminar %(model)s seleccionada/o" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web." +#, python-format +msgid "View selected %(model)s" +msgstr "Ver seleccionado %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Gracias por pasar un buen rato con el sitio web hoy." msgid "Log in again" msgstr "Iniciar sesión de nuevo" @@ -615,11 +694,11 @@ msgid "Your password was changed." msgstr "Su contraseña ha sido cambiada." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Por favor, introduzca su contraseña antigua, por seguridad, y después " -"introduzca la nueva contraseña dos veces para verificar que la ha escrito " +"Ingrese su contraseña anterior, por razones de seguridad, y luego ingrese su " +"nueva contraseña dos veces para que podamos verificar que la ingresó " "correctamente." msgid "Change my password" @@ -630,8 +709,7 @@ msgstr "Restablecer contraseña" msgid "Your password has been set. You may go ahead and log in now." msgstr "" -"Su contraseña ha sido establecida. Ahora puede seguir adelante e iniciar " -"sesión." +"Su contraseña ha sido establecida. Ahora puede continuar e iniciar sesión." msgid "Password reset confirmation" msgstr "Confirmación de restablecimiento de contraseña" @@ -658,19 +736,19 @@ msgstr "" "contraseña." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Le hemos enviado por email las instrucciones para restablecer la contraseña, " -"si es que existe una cuenta con la dirección electrónica que indicó. Debería " -"recibirlas en breve." +"Le enviamos instrucciones por correo electrónico para configurar su " +"contraseña, si existe una cuenta con el correo electrónico que ingresó. " +"Debería recibirlos en breve." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Si no recibe un correo, por favor asegúrese de que ha introducido la " -"dirección de correo con la que se registró y verifique su carpeta de spam." +"Si no recibe un correo electrónico, asegúrese de haber ingresado la " +"dirección con la que se registró y verifique su carpeta de correo no deseado." #, python-format msgid "" @@ -683,8 +761,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Por favor, vaya a la página siguiente y escoja una nueva contraseña." -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Su nombre de usuario, en caso de que lo haya olvidado:" msgid "Thanks for using our site!" msgstr "¡Gracias por usar nuestro sitio!" @@ -694,12 +772,11 @@ msgid "The %(site_name)s team" msgstr "El equipo de %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"¿Ha olvidado su clave? Introduzca su dirección de correo a continuación y le " -"enviaremos por correo electrónico las instrucciones para establecer una " -"nueva." +"¿Olvidaste tu contraseña? Ingrese su dirección de correo electrónico a " +"continuación y le enviaremos las instrucciones para configurar una nueva." msgid "Email address:" msgstr "Correo electrónico:" @@ -707,16 +784,19 @@ msgstr "Correo electrónico:" msgid "Reset my password" msgstr "Restablecer mi contraseña" +msgid "Select all objects on this page for an action" +msgstr "Seleccione todos los objetos de esta página para una acción" + msgid "All dates" msgstr "Todas las fechas" #, python-format msgid "Select %s" -msgstr "Escoja %s" +msgstr "Seleccione %s" #, python-format msgid "Select %s to change" -msgstr "Escoja %s a modificar" +msgstr "Seleccione %s a modificar" #, python-format msgid "Select %s to view" diff --git a/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo index a953b628cfc2..76616108bbfc 100644 Binary files a/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po index 6ac954a2d3fb..e2c5567f89f4 100644 --- a/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/es/LC_MESSAGES/djangojs.po @@ -2,19 +2,20 @@ # # Translators: # Antoni Aloy , 2011-2012 -# Ernesto Avilés Vázquez , 2015-2016 +# e4db27214f7e7544f2022c647b585925_bb0e321, 2015-2016 # Jannis Leidel , 2011 # Josue Naaman Nistal Guerra , 2014 # Leonardo J. Caballero G. , 2011 +# Uriel Medina , 2020-2023 # Veronicabh , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Ernesto Avilés Vázquez \n" -"Language-Team: Spanish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Uriel Medina , 2020-2023\n" +"Language-Team: Spanish (http://app.transifex.com/django/django/language/" "es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,6 +69,10 @@ msgstr "" "seleccionándolos en la caja inferior y luego haciendo click en la flecha " "\"Eliminar\" que hay entre las dos cajas." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados." + msgid "Remove all" msgstr "Eliminar todos" @@ -75,10 +80,18 @@ msgstr "Eliminar todos" msgid "Click to remove all chosen %s at once." msgstr "Haz clic para eliminar todos los %s elegidos" +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opción seleccionada no visible" +msgstr[1] "%s opciones seleccionadas no visibles" +msgstr[2] "%s opciones seleccionadas no visibles" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s seleccionado" msgstr[1] "%(sel)s de %(cnt)s seleccionados" +msgstr[2] "%(sel)s de %(cnt)s seleccionados" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -88,56 +101,58 @@ msgstr "" "acción, los cambios no guardados se perderán." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Ha seleccionado una acción, pero no ha guardado los cambios en los campos " -"individuales todavía. Pulse OK para guardar. Tendrá que volver a ejecutar la " -"acción." +"Ha seleccionado una acción, pero aún no ha guardado los cambios en los " +"campos individuales. Haga clic en Aceptar para guardar. Deberá volver a " +"ejecutar la acción." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Ha seleccionado una acción y no hs hecho ningún cambio en campos " -"individuales. Probablemente esté buscando el botón Ejecutar en lugar del " -"botón Guardar." +"Ha seleccionado una acción y no ha realizado ningún cambio en campos " +"individuales. Probablemente esté buscando el botón 'Ir' en lugar del botón " +"'Guardar'." + +msgid "Now" +msgstr "Ahora" + +msgid "Midnight" +msgstr "Medianoche" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Mediodía" + +msgid "6 p.m." +msgstr "6 p.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Nota: Usted esta a %s horas por delante de la hora del servidor." msgstr[1] "Nota: Usted va %s horas por delante de la hora del servidor." +msgstr[2] "Nota: Usted va %s horas por delante de la hora del servidor." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Nota: Usted esta a %s hora de retraso de tiempo de servidor." msgstr[1] "Nota: Usted va %s horas por detrás de la hora del servidor." - -msgid "Now" -msgstr "Ahora" +msgstr[2] "Nota: Usted va %s horas por detrás de la hora del servidor." msgid "Choose a Time" -msgstr "Elija una hora" +msgstr "Elija una Hora" msgid "Choose a time" msgstr "Elija una hora" -msgid "Midnight" -msgstr "Medianoche" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Mediodía" - -msgid "6 p.m." -msgstr "6 p.m." - msgid "Cancel" msgstr "Cancelar" @@ -145,7 +160,7 @@ msgid "Today" msgstr "Hoy" msgid "Choose a Date" -msgstr "Elija una fecha" +msgstr "Elija una Fecha" msgid "Yesterday" msgstr "Ayer" @@ -189,6 +204,103 @@ msgstr "Noviembre" msgid "December" msgstr "Diciembre" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Ene" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Oct" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dic" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Monday" +msgstr "Lunes" + +msgid "Tuesday" +msgstr "Martes" + +msgid "Wednesday" +msgstr "Miércoles" + +msgid "Thursday" +msgstr "Jueves" + +msgid "Friday" +msgstr "Viernes" + +msgid "Saturday" +msgstr "Sábado" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Dom" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Lun" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Mar" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Mie" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Jue" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Vie" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sáb" + msgctxt "one letter Sunday" msgid "S" msgstr "D" @@ -221,4 +333,4 @@ msgid "Show" msgstr "Mostrar" msgid "Hide" -msgstr "Esconder" +msgstr "Ocultar" diff --git a/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo b/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo index 9af1d279bf7c..6ffb9267c6e4 100644 Binary files a/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po b/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po index e394eadc759c..67a4918604fc 100644 --- a/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/es_AR/LC_MESSAGES/django.po @@ -3,15 +3,17 @@ # Translators: # Jannis Leidel , 2011 # Leonardo José Guzmán , 2013 -# Ramiro Morales, 2013-2019 +# Natalia, 2023 +# Natalia, 2023 +# Ramiro Morales, 2013-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-01 10:11+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Ramiro Morales, 2013-2024\n" +"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" "language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +21,10 @@ msgstr "" "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Se eliminaron con éxito %(count)d %(items)s." @@ -30,10 +36,6 @@ msgstr "No se puede eliminar %(name)s" msgid "Are you sure?" msgstr "¿Está seguro?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - msgid "Administration" msgstr "Administración" @@ -70,6 +72,12 @@ msgstr "Sin fecha" msgid "Has date" msgstr "Tiene fecha" +msgid "Empty" +msgstr "Vacío/a" + +msgid "Not empty" +msgstr "No vacío/a" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -175,6 +183,9 @@ msgstr "" "Mantenga presionada \"Control” (\"Command” en una Mac) para seleccionar más " "de uno." +msgid "Select this object for an action - {}" +msgstr "Seleccione este objeto para una acción - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "Se agregó con éxito {name} \"{obj}”." @@ -194,10 +205,6 @@ msgid "" msgstr "" "Se modificó con éxito {name} \"{obj}”. Puede modificarlo/a nuevamente abajo." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "Se agregó con éxito {name} \"{obj}”. Puede modificarlo/a abajo." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -247,12 +254,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "Se ha modificado con éxito %(count)s %(name)s." msgstr[1] "Se han modificado con éxito %(count)s %(name)s." +msgstr[2] "Se han modificado con éxito %(count)s %(name)s." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s seleccionados/as" msgstr[1] "Todos/as (%(total_count)s en total) han sido seleccionados/as" +msgstr[2] "Todos/as (%(total_count)s en total) han sido seleccionados/as" #, python-format msgid "0 of %(cnt)s selected" @@ -262,8 +271,9 @@ msgstr "0 de %(cnt)s seleccionados/as" msgid "Change history: %s" msgstr "Historia de modificaciones: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -334,6 +344,22 @@ msgstr "Seleccionar lo(s)/a(s) %(total_count)s %(module_name)s existentes" msgid "Clear selection" msgstr "Borrar selección" +msgid "Breadcrumbs" +msgstr "Breadcrumbs" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Agregar" + +msgid "View" +msgstr "Ver" + +msgid "You don’t have permission to view or edit anything." +msgstr "No tiene permiso para ver o modificar nada." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -347,11 +373,14 @@ msgstr "Introduzca un nombre de usuario y una contraseña." msgid "Change password" msgstr "Cambiar contraseña" -msgid "Please correct the error below." -msgstr "Por favor, corrija el error detallado mas abajo." +msgid "Set password" +msgstr "Establecer contraseña" -msgid "Please correct the errors below." -msgstr "Por favor corrija los errores detallados abajo." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor, corrija el siguiente error." +msgstr[1] "Por favor, corrija los siguientes errores." +msgstr[2] "Por favor, corrija los siguientes errores." #, python-format msgid "Enter a new password for the user %(username)s." @@ -359,6 +388,22 @@ msgstr "" "Introduzca una nueva contraseña para el usuario %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Esta acción activará la autenticación basada en contraseñas " +"para este usuario." + +msgid "Disable password-based authentication" +msgstr "Desactivar la autenticación basada en contraseñas" + +msgid "Enable password-based authentication" +msgstr "Activar la autenticación basada en contraseñas" + +msgid "Skip to main content" +msgstr "Ir al contenido principal" + msgid "Welcome," msgstr "Bienvenido/a," @@ -384,6 +429,15 @@ msgstr "Ver en el sitio" msgid "Filter" msgstr "Filtrar" +msgid "Hide counts" +msgstr "Ocultar recuentos" + +msgid "Show counts" +msgstr "Mostrar recuentos" + +msgid "Clear all filters" +msgstr "Limpiar todos los filtros" + msgid "Remove from sorting" msgstr "Remover de ordenamiento" @@ -392,7 +446,16 @@ msgid "Sorting priority: %(priority_number)s" msgstr "Prioridad de ordenamiento: %(priority_number)s" msgid "Toggle sorting" -msgstr "(des)activar ordenamiento" +msgstr "Alternar ordenamiento" + +msgid "Toggle theme (current theme: auto)" +msgstr "Cambiar tema (tema actual: automático)" + +msgid "Toggle theme (current theme: light)" +msgstr "Cambiar tema (tema actual: claro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Cambiar tema (tema actual: oscuro)" msgid "Delete" msgstr "Eliminar" @@ -420,8 +483,8 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"¿Está seguro de que desea eliminar los %(object_name)s \"%(escaped_object)s" -"\"? Se eliminarán los siguientes objetos relacionados:" +"¿Está seguro de que desea eliminar los %(object_name)s " +"\"%(escaped_object)s\"? Se eliminarán los siguientes objetos relacionados:" msgid "Objects" msgstr "Objectos" @@ -463,9 +526,6 @@ msgstr "" "los siguientes objetos e ítems relacionados a los mismos también serán " "eliminados:" -msgid "View" -msgstr "Ver" - msgid "Delete?" msgstr "¿Eliminar?" @@ -476,16 +536,6 @@ msgstr " Por %(filter_title)s " msgid "Summary" msgstr "Resumen" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Agregar" - -msgid "You don’t have permission to view or edit anything." -msgstr "No tiene permiso para ver o modificar nada." - msgid "Recent actions" msgstr "Acciones recientes" @@ -495,6 +545,15 @@ msgstr "Mis acciones" msgid "None available" msgstr "Ninguna disponible" +msgid "Added:" +msgstr "Agregado:" + +msgid "Changed:" +msgstr "Cambiado:" + +msgid "Deleted:" +msgstr "Eliminado:" + msgid "Unknown content" msgstr "Contenido desconocido" @@ -518,6 +577,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "¿Olvidó su contraseña o nombre de usuario?" +msgid "Toggle navigation" +msgstr "Alternar navegación" + +msgid "Sidebar" +msgstr "Barra lateral" + +msgid "Start typing to filter…" +msgstr "Empiece a escribir para filtrar…" + +msgid "Filter navigation items" +msgstr "Filtrar elementos de navegación" + msgid "Date/time" msgstr "Fecha/hora" @@ -527,6 +598,12 @@ msgstr "Usuario" msgid "Action" msgstr "Acción" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrada" +msgstr[1] "entradas" +msgstr[2] "entradas" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -535,13 +612,13 @@ msgstr "" "añadido usando este sitio de administración." msgid "Show all" -msgstr "Mostrar todos/as" +msgstr "Mostrar todos" msgid "Save" msgstr "Guardar" msgid "Popup closing…" -msgstr "Cerrando ventana amergente…" +msgstr "Cerrando ventana emergente…" msgid "Search" msgstr "Buscar" @@ -551,6 +628,7 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s resultado" msgstr[1] "%(counter)s resultados" +msgstr[2] "%(counter)s resultados" #, python-format msgid "%(full_result_count)s total" @@ -583,7 +661,11 @@ msgstr "Agregar otro/a %(model)s" msgid "Delete selected %(model)s" msgstr "Eliminar %(model)s seleccionados/as" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Ver %(model)s seleccionado/a" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy." msgid "Log in again" @@ -687,6 +769,9 @@ msgstr "Dirección de email:" msgid "Reset my password" msgstr "Recuperar mi contraseña" +msgid "Select all objects on this page for an action" +msgstr "Seleccione todos los objetos de esta página para una acción" + msgid "All dates" msgstr "Todas las fechas" diff --git a/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo index bac48d8653d1..168ea55d65c2 100644 Binary files a/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po index ed9155d51b98..3425126cfd72 100644 --- a/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/es_AR/LC_MESSAGES/djangojs.po @@ -2,15 +2,15 @@ # # Translators: # Jannis Leidel , 2011 -# Ramiro Morales, 2014-2016 +# Ramiro Morales, 2014-2016,2020-2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Ramiro Morales, 2014-2016,2020-2023\n" +"Language-Team: Spanish (Argentina) (http://app.transifex.com/django/django/" "language/es_AR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -64,6 +64,10 @@ msgstr "" "activándolos en la lista de abajo y luego haciendo click en la flecha " "\"Eliminar\" ubicada entre las dos listas." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Escriba en este cuadro para filtrar la lista de %s seleccionados/as." + msgid "Remove all" msgstr "Eliminar todos/as" @@ -71,10 +75,18 @@ msgstr "Eliminar todos/as" msgid "Click to remove all chosen %s at once." msgstr "Haga clic para deselecionar todos/as los/as %s." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opción seleccionada no visible" +msgstr[1] "%s opciones seleccionadas no visibles" +msgstr[2] "%s opciones seleccionadas no visibles" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s seleccionado/a" msgstr[1] "%(sel)s de %(cnt)s seleccionados/as" +msgstr[2] "%(sel)s de %(cnt)s seleccionados/as" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -84,22 +96,22 @@ msgstr "" "ejecuta una acción las mismas se perderán." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Ha seleccionado una acción, pero todavía no ha grabado las modificaciones " -"que ha realizado en campos individuales. Por favor haga click en Aceptar " -"para grabarlas. Necesitará ejecutar la acción nuevamente." +"Ha seleccionado una acción pero todavía no ha grabado sus cambios en campos " +"individuales. Por favor haga click en Ok para grabarlos. Luego necesitará re-" +"ejecutar la acción." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Ha seleccionado una acción pero no ha realizado ninguna modificación en " -"campos individuales. Es probable que lo que necesite usar en realidad sea el " -"botón Ejecutar y no el botón Guardar." +"Ha seleccionado una acción y no ha realizado ninguna modificación de campos " +"individuales. Es probable que deba usar el botón 'Ir' y no el botón " +"'Grabar'." msgid "Now" msgstr "Ahora" @@ -125,6 +137,9 @@ msgstr[0] "" msgstr[1] "" "Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " "respecto a la del servidor." +msgstr[2] "" +"Nota: Ud. se encuentra en una zona horaria que está %s horas adelantada " +"respecto a la del servidor." #, javascript-format msgid "Note: You are %s hour behind server time." @@ -135,6 +150,9 @@ msgstr[0] "" msgstr[1] "" "Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " "respecto a la del servidor." +msgstr[2] "" +"Nota: Ud. se encuentra en una zona horaria que está %s horas atrasada " +"respecto a la del servidor." msgid "Choose a Time" msgstr "Seleccione una Hora" @@ -158,40 +176,137 @@ msgid "Tomorrow" msgstr "Mañana" msgid "January" -msgstr "Enero" +msgstr "enero" msgid "February" -msgstr "Febrero" +msgstr "febrero" msgid "March" -msgstr "Marzo" +msgstr "marzo" msgid "April" -msgstr "Abril" +msgstr "abril" msgid "May" -msgstr "Mayo" +msgstr "mayo" msgid "June" -msgstr "Junio" +msgstr "junio" msgid "July" -msgstr "Julio" +msgstr "julio" msgid "August" -msgstr "Agosto" +msgstr "agosto" msgid "September" -msgstr "Setiembre" +msgstr "setiembre" msgid "October" -msgstr "Octubre" +msgstr "octubre" msgid "November" -msgstr "Noviembre" +msgstr "noviembre" msgid "December" -msgstr "Diciembre" +msgstr "diciembre" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Ene" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Set" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Oct" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dic" + +msgid "Sunday" +msgstr "domingo" + +msgid "Monday" +msgstr "lunes" + +msgid "Tuesday" +msgstr "martes" + +msgid "Wednesday" +msgstr "miércoles" + +msgid "Thursday" +msgstr "jueves" + +msgid "Friday" +msgstr "viernes" + +msgid "Saturday" +msgstr "sábado" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "dom" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "lun" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "mar" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "mié" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "jue" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "vie" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "sáb" msgctxt "one letter Sunday" msgid "S" diff --git a/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo b/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo index 43e182482730..8b88505d9e18 100644 Binary files a/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po b/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po index 1a424f203506..416df6ae1345 100644 --- a/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/es_MX/LC_MESSAGES/django.po @@ -1,15 +1,18 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Abraham Estrada, 2011-2013 +# Abe Estrada, 2011-2013 # Alex Dzul , 2015 +# Gustavo Jimenez , 2020 +# Jesús Bautista , 2020 +# José Rosso, 2022 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: José Rosso\n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/" "language/es_MX/)\n" "MIME-Version: 1.0\n" @@ -18,6 +21,10 @@ msgstr "" "Language: es_MX\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Se eliminaron con éxito %(count)d %(items)s." @@ -29,10 +36,6 @@ msgstr "No se puede eliminar %(name)s " msgid "Are you sure?" msgstr "¿Está seguro?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Eliminar %(verbose_name_plural)s seleccionados/as" - msgid "Administration" msgstr "Administración" @@ -64,9 +67,15 @@ msgid "This year" msgstr "Este año" msgid "No date" -msgstr "" +msgstr "Sin fecha" msgid "Has date" +msgstr "Tiene fecha" + +msgid "Empty" +msgstr "Vacío" + +msgid "Not empty" msgstr "" #, python-format @@ -88,20 +97,29 @@ msgstr "Agregar otro/a %(verbose_name)s" msgid "Remove" msgstr "Eliminar" +msgid "Addition" +msgstr "Adición" + +msgid "Change" +msgstr "Modificar" + +msgid "Deletion" +msgstr "Eliminación" + msgid "action time" msgstr "hora de la acción" msgid "user" -msgstr "" +msgstr "usuario" msgid "content type" -msgstr "" +msgstr "tipo de contenido" msgid "object id" msgstr "id de objeto" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "repr de objeto" @@ -118,32 +136,32 @@ msgid "log entries" msgstr "entradas de registro" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Añadidos \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Modificados \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Eliminados \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "" msgid "LogEntry Object" msgstr "Objeto de registro de Log" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "" msgid "Added." -msgstr "" +msgstr "Agregado." msgid "and" msgstr "y" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "" #, python-brace-format @@ -151,7 +169,7 @@ msgid "Changed {fields}." msgstr "" #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "" msgid "No fields changed." @@ -160,40 +178,38 @@ msgstr "No ha modificado ningún campo." msgid "None" msgstr "Ninguno" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Mantenga presionado \"Control, o \"Command\" en una Mac, para seleccionar " -"más de uno." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully." +msgstr "El {name} \"{obj}\" se agregó correctamente." + +msgid "You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "" msgid "" @@ -207,11 +223,11 @@ msgid "No action selected." msgstr "No se ha seleccionado ninguna acción." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" #, python-format @@ -222,6 +238,10 @@ msgstr "Agregar %s" msgid "Change %s" msgstr "Modificar %s" +#, python-format +msgid "View %s" +msgstr "" + msgid "Database error" msgstr "Error en la base de datos" @@ -245,8 +265,9 @@ msgstr "0 de %(cnt)s seleccionados/as" msgid "Change history: %s" msgstr "Historia de modificaciones: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -278,8 +299,8 @@ msgstr "Administración de %(app)s " msgid "Page not found" msgstr "Página no encontrada" -msgid "We're sorry, but the requested page could not be found." -msgstr "Lo sentimos, pero no se encuentra la página solicitada." +msgid "We’re sorry, but the requested page could not be found." +msgstr "" msgid "Home" msgstr "Inicio" @@ -294,11 +315,9 @@ msgid "Server Error (500)" msgstr "Error de servidor (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Ha habido un error. Se ha informado a los administradores del sitio a través " -"de correo electrónico y debe ser reparado en breve. Gracias por su paciencia." msgid "Run the selected action" msgstr "Ejecutar la acción seleccionada" @@ -316,12 +335,23 @@ msgstr "Seleccionar lo(s)/a(s) %(total_count)s de %(module_name)s" msgid "Clear selection" msgstr "Borrar selección" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos en la aplicación %(name)s" + +msgid "Add" +msgstr "Agregar" + +msgid "View" +msgstr "Vista" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Primero introduzca un nombre de usuario y una contraseña. Luego podrá " -"configurar opciones adicionales acerca del usuario." msgid "Enter a username and password." msgstr "Introduzca un nombre de usuario y una contraseña." @@ -330,7 +360,7 @@ msgid "Change password" msgstr "Cambiar contraseña" msgid "Please correct the error below." -msgstr "Por favor, corrija los siguientes errores." +msgstr "" msgid "Please correct the errors below." msgstr "Por favor, corrija los siguientes errores." @@ -345,7 +375,7 @@ msgid "Welcome," msgstr "Bienvenido," msgid "View site" -msgstr "" +msgstr "Ver sitio" msgid "Documentation" msgstr "Documentación" @@ -366,6 +396,9 @@ msgstr "Ver en el sitio" msgid "Filter" msgstr "Filtrar" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "Elimina de la clasificación" @@ -406,10 +439,10 @@ msgstr "" "\"? Se eliminarán los siguientes objetos relacionados:" msgid "Objects" -msgstr "" +msgstr "Objetos" -msgid "Yes, I'm sure" -msgstr "Sí, estoy seguro" +msgid "Yes, I’m sure" +msgstr "" msgid "No, take me back" msgstr "" @@ -443,9 +476,6 @@ msgstr "" "¿Está seguro que desea eliminar el seleccionado %(objects_name)s ? Todos los " "objetos siguientes y sus elementos asociados serán eliminados:" -msgid "Change" -msgstr "Modificar" - msgid "Delete?" msgstr "Eliminar?" @@ -454,23 +484,13 @@ msgid " By %(filter_title)s " msgstr "Por %(filter_title)s" msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos en la aplicación %(name)s" - -msgid "Add" -msgstr "Agregar" - -msgid "You don't have permission to edit anything." -msgstr "No tiene permiso para editar nada" +msgstr "Resúmen" msgid "Recent actions" msgstr "" msgid "My actions" -msgstr "" +msgstr "Mis acciones" msgid "None available" msgstr "Ninguna disponible" @@ -479,13 +499,10 @@ msgid "Unknown content" msgstr "Contenido desconocido" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Hay algún problema con su instalación de base de datos. Asegúrese de que las " -"tablas de la misma hayan sido creadas, y asegúrese de que el usuario " -"apropiado tenga permisos de lectura en la base de datos." #, python-format msgid "" @@ -496,6 +513,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "¿Ha olvidado su contraseña o nombre de usuario?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Fecha/hora" @@ -505,12 +531,16 @@ msgstr "Usuario" msgid "Action" msgstr "Acción" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Este objeto no tiene historia de modificaciones. Probablemente no fue " -"añadido usando este sitio de administración." msgid "Show all" msgstr "Mostrar todos/as" @@ -518,19 +548,7 @@ msgstr "Mostrar todos/as" msgid "Save" msgstr "Guardar" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" +msgid "Popup closing…" msgstr "" msgid "Search" @@ -555,8 +573,30 @@ msgstr "Guardar y agregar otro" msgid "Save and continue editing" msgstr "Guardar y continuar editando" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy." +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "Cerrar" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "Identificarse de nuevo" @@ -568,12 +608,9 @@ msgid "Your password was changed." msgstr "Su contraseña ha sido cambiada." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Por favor, por razones de seguridad, introduzca primero su contraseña " -"antigua y luego introduzca la nueva contraseña dos veces para verificar que " -"la ha escrito correctamente." msgid "Change my password" msgstr "Cambiar mi contraseña" @@ -609,16 +646,14 @@ msgstr "" "contraseña." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Si usted no recibe un correo electrónico, por favor, asegúrese de que ha " -"introducido la dirección con la que se registró, y revise su carpeta de spam." #, python-format msgid "" @@ -633,8 +668,8 @@ msgstr "" "Por favor visite la página que se muestra a continuación y elija una nueva " "contraseña:" -msgid "Your username, in case you've forgotten:" -msgstr "Su nombre de usuario, en caso de haberlo olvidado:" +msgid "Your username, in case you’ve forgotten:" +msgstr "" msgid "Thanks for using our site!" msgstr "¡Gracias por usar nuestro sitio!" @@ -644,11 +679,9 @@ msgid "The %(site_name)s team" msgstr "El equipo de %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"¿Olvidó su contraseña? Ingrese su dirección de correo electrónico, y le " -"enviaremos las instrucciones para establecer una nueva." msgid "Email address:" msgstr "Correo electrónico:" @@ -667,6 +700,10 @@ msgstr "Seleccione %s" msgid "Select %s to change" msgstr "Seleccione %s a modificar" +#, python-format +msgid "Select %s to view" +msgstr "" + msgid "Date:" msgstr "Fecha:" diff --git a/django/contrib/admin/locale/et/LC_MESSAGES/django.mo b/django/contrib/admin/locale/et/LC_MESSAGES/django.mo index 195ac375b74a..0a51b4a9b7b0 100644 Binary files a/django/contrib/admin/locale/et/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/et/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/et/LC_MESSAGES/django.po b/django/contrib/admin/locale/et/LC_MESSAGES/django.po index f0feb715bd08..a689289e7a35 100644 --- a/django/contrib/admin/locale/et/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/et/LC_MESSAGES/django.po @@ -2,20 +2,21 @@ # # Translators: # eallik , 2011 +# Erlend Eelmets , 2020 # Jannis Leidel , 2011 # Janno Liivak , 2013-2015 -# Martin Pajuste , 2015 -# Martin Pajuste , 2016,2019 +# Martin , 2015,2022-2024 +# Martin , 2016,2019-2020 # Marti Raudsepp , 2016 # Ragnar Rebase , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-28 01:34+0000\n" -"Last-Translator: Ragnar Rebase \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Martin , 2015,2022-2024\n" +"Language-Team: Estonian (http://app.transifex.com/django/django/language/" "et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,6 +24,10 @@ msgstr "" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Kustuta valitud %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s kustutamine õnnestus." @@ -34,10 +39,6 @@ msgstr "Ei saa kustutada %(name)s" msgid "Are you sure?" msgstr "Kas olete kindel?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kustuta valitud %(verbose_name_plural)s" - msgid "Administration" msgstr "Administreerimine" @@ -74,6 +75,12 @@ msgstr "Kuupäev puudub" msgid "Has date" msgstr "Kuupäev olemas" +msgid "Empty" +msgstr "Tühi" + +msgid "Not empty" +msgstr "Täidetud" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -176,6 +183,9 @@ msgstr "Puudub" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "Hoia all “Control” või “Command” Macil, et valida rohkem kui üks." +msgid "Select this object for an action - {}" +msgstr "Vali toiminguks käesolev objekt - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” lisamine õnnestus." @@ -194,10 +204,6 @@ msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "{name} “{obj}” muutmine õnnestus. Allpool saate seda uuesti muuta." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” lisamine õnnestus. Allpool saate seda uuesti muuta." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -261,8 +267,9 @@ msgstr "valitud 0/%(cnt)s" msgid "Change history: %s" msgstr "Muudatuste ajalugu: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -332,6 +339,22 @@ msgstr "Märgista kõik %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Tühjenda valik" +msgid "Breadcrumbs" +msgstr "Lingirivi" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Rakenduse %(name)s moodulid" + +msgid "Add" +msgstr "Lisa" + +msgid "View" +msgstr "Vaata" + +msgid "You don’t have permission to view or edit anything." +msgstr "Teil pole õigust midagi vaadata ega muuta." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -345,16 +368,32 @@ msgstr "Sisestage kasutajanimi ja salasõna." msgid "Change password" msgstr "Muuda salasõna" -msgid "Please correct the error below." -msgstr "Palun parandage allolev viga." +msgid "Set password" +msgstr "Määra parool" -msgid "Please correct the errors below." -msgstr "Palun parandage allolevad vead." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Palun parandage allolev viga." +msgstr[1] "Palun parandage allolevad vead." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Sisestage uus salasõna kasutajale %(username)s" +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" + +msgid "Disable password-based authentication" +msgstr "" + +msgid "Enable password-based authentication" +msgstr "" + +msgid "Skip to main content" +msgstr "Liigu põhisisu juurde" + msgid "Welcome," msgstr "Tere tulemast," @@ -380,6 +419,15 @@ msgstr "Näita lehel" msgid "Filter" msgstr "Filtreeri" +msgid "Hide counts" +msgstr "Peida loendused" + +msgid "Show counts" +msgstr "Näita loendusi" + +msgid "Clear all filters" +msgstr "Tühjenda kõik filtrid" + msgid "Remove from sorting" msgstr "Eemalda sorteerimisest" @@ -390,6 +438,15 @@ msgstr "Sorteerimisjärk: %(priority_number)s" msgid "Toggle sorting" msgstr "Sorteerimine" +msgid "Toggle theme (current theme: auto)" +msgstr "Teema lülitamine (hetkel: automaatne)" + +msgid "Toggle theme (current theme: light)" +msgstr "Teema lülitamine (hetkel: hele)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Teema lülitamine (hetkel: tume)" + msgid "Delete" msgstr "Kustuta" @@ -457,9 +514,6 @@ msgstr "" "Kas oled kindel, et soovid kustutada valitud %(objects_name)s? Kõik " "järgnevad objektid ja seotud objektid kustutatakse:" -msgid "View" -msgstr "Vaata" - msgid "Delete?" msgstr "Kustutan?" @@ -470,16 +524,6 @@ msgstr " %(filter_title)s " msgid "Summary" msgstr "Kokkuvõte" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Rakenduse %(name)s moodulid" - -msgid "Add" -msgstr "Lisa" - -msgid "You don’t have permission to view or edit anything." -msgstr "Teil pole õigust midagi vaadata ega muuta." - msgid "Recent actions" msgstr "Hiljutised toimingud" @@ -489,6 +533,15 @@ msgstr "Minu toimingud" msgid "None available" msgstr "Ei leitud ühtegi" +msgid "Added:" +msgstr "Lisatud:" + +msgid "Changed:" +msgstr "Muudetud:" + +msgid "Deleted:" +msgstr "Kustutatud:" + msgid "Unknown content" msgstr "Tundmatu sisu" @@ -511,6 +564,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Unustasite oma parooli või kasutajanime?" +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Sidebar" +msgstr "Külgriba" + +msgid "Start typing to filter…" +msgstr "Filtreerimiseks alusta trükkimist..." + +msgid "Filter navigation items" +msgstr "Filtreeri navigatsioonielemente" + msgid "Date/time" msgstr "Kuupäev/kellaaeg" @@ -520,6 +585,11 @@ msgstr "Kasutaja" msgid "Action" msgstr "Toiming" +msgid "entry" +msgid_plural "entries" +msgstr[0] "sissekanne" +msgstr[1] "sissekanded" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -576,7 +646,11 @@ msgstr "Lisa veel üks %(model)s" msgid "Delete selected %(model)s" msgstr "Kustuta valitud %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Vaata valitud %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Tänan, et veetsite aega meie lehel." msgid "Log in again" @@ -674,7 +748,10 @@ msgid "Email address:" msgstr "E-posti aadress:" msgid "Reset my password" -msgstr "Reseti parool" +msgstr "Lähtesta mu parool" + +msgid "Select all objects on this page for an action" +msgstr "Vali toiminguks kõik objektid sellel lehel" msgid "All dates" msgstr "Kõik kuupäevad" diff --git a/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo index 1c8e66387a30..aa460cd7690b 100644 Binary files a/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po index 21e137f4c4b1..4762c478d581 100644 --- a/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/et/LC_MESSAGES/djangojs.po @@ -4,16 +4,17 @@ # eallik , 2011 # Jannis Leidel , 2011 # Janno Liivak , 2013-2015 -# Martin Pajuste , 2016 +# Martin , 2021,2023 +# Martin , 2016,2020 # Ragnar Rebase , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-12-28 01:38+0000\n" -"Last-Translator: Ragnar Rebase \n" -"Language-Team: Estonian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Martin , 2021,2023\n" +"Language-Team: Estonian (http://app.transifex.com/django/django/language/" "et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -67,6 +68,10 @@ msgstr "" "allolevast kastist ning vajutades noolt \"Eemalda\" liigutada neid ühest " "kastist teise." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Filtreeri selle kasti abil valitud \"%s\" nimekirja." + msgid "Remove all" msgstr "Eemalda kõik" @@ -74,6 +79,12 @@ msgstr "Eemalda kõik" msgid "Click to remove all chosen %s at once." msgstr "Kliki, et eemaldada kõik valitud %s korraga." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s valik ei ole nähtaval" +msgstr[1] "%s valikut ei ole nähtaval" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s %(cnt)sst valitud" @@ -87,16 +98,16 @@ msgstr "" "toimingu, lähevad salvestamata muudatused kaotsi." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Valisite toimingu, kuid pole salvestanud muudatusi lahtrites. Salvestamiseks " "palun vajutage OK. Peate toimingu uuesti käivitama." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Valisite toimingu, kuid ei muutnud ühtegi lahtrit. Tõenäoliselt otsite Mine " @@ -186,6 +197,103 @@ msgstr "november" msgid "December" msgstr "detsember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jaan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "veebr" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "märts" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "juuni" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "juuli" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sept" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dets" + +msgid "Sunday" +msgstr "pühapäev" + +msgid "Monday" +msgstr "esmaspäev" + +msgid "Tuesday" +msgstr "teisipäev" + +msgid "Wednesday" +msgstr "kolmapäev" + +msgid "Thursday" +msgstr "neljapäev" + +msgid "Friday" +msgstr "reede" + +msgid "Saturday" +msgstr "laupäev" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "pühap." + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "esmasp." + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "teisip." + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "kolmap." + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "neljap." + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "reede" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "laup." + msgctxt "one letter Sunday" msgid "S" msgstr "P" diff --git a/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo b/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo index e3c840f91661..a2c9933017d4 100644 Binary files a/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/eu/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/eu/LC_MESSAGES/django.po b/django/contrib/admin/locale/eu/LC_MESSAGES/django.po index 9176368484fd..3aba9f806c29 100644 --- a/django/contrib/admin/locale/eu/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/eu/LC_MESSAGES/django.po @@ -2,17 +2,18 @@ # # Translators: # Aitzol Naberan , 2013,2016 -# Eneko Illarramendi , 2017-2019 +# Eneko Illarramendi , 2017-2019,2022 # Jannis Leidel , 2011 # julen, 2012-2013 # julen, 2013 # Urtzi Odriozola , 2017 +# Yoaira García , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-22 09:57+0000\n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" "Last-Translator: Eneko Illarramendi \n" "Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" "MIME-Version: 1.0\n" @@ -21,6 +22,10 @@ msgstr "" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ezabatu aukeratutako %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s elementu ezabatu dira." @@ -32,10 +37,6 @@ msgstr "Ezin da %(name)s ezabatu" msgid "Are you sure?" msgstr "Ziur al zaude?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ezabatu aukeratutako %(verbose_name_plural)s" - msgid "Administration" msgstr "Kudeaketa" @@ -72,6 +73,12 @@ msgstr "Datarik ez" msgid "Has date" msgstr "Data dauka" +msgid "Empty" +msgstr "Hutsik" + +msgid "Not empty" +msgstr "" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -129,23 +136,23 @@ msgid "log entries" msgstr "log sarrerak" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "\"%(object)s\" gehituta." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" aldatuta - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "\"%(object)s\" ezabatuta." msgid "LogEntry Object" msgstr "LogEntry objetua" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "{name} \"{object}\" gehitu." +msgid "Added {name} “{object}”." +msgstr "{name} \"{object}\" gehituta." msgid "Added." msgstr "Gehituta" @@ -154,15 +161,15 @@ msgid "and" msgstr "eta" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{fields}-(e)tik {name} \"{object}\" aldatatuta." +msgid "Changed {fields} for {name} “{object}”." +msgstr "" #, python-brace-format msgid "Changed {fields}." msgstr "{fields} aldatuta." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "{name} \"{object}\" ezabatuta." msgid "No fields changed." @@ -171,48 +178,44 @@ msgstr "Ez da eremurik aldatu." msgid "None" msgstr "Bat ere ez" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" "Bat baino gehiago hautatzeko, sakatu \"Kontrol\" tekla edo \"Command\" Mac " "batean." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" ondo gehitu da." +msgid "The {name} “{obj}” was added successfully." +msgstr "" msgid "You may edit it again below." msgstr "Aldaketa gehiago egin ditzazkezu jarraian." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" "{name} \"{obj}\" ondo gehitu da. Beste {name} bat gehitu dezakezu jarraian." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" "{name} \"{obj}\" ondo aldatu da. Aldaketa gehiago egin ditzazkezu jarraian." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" "{name} \"{obj}\" ondo gehitu da. Aldaketa gehiago egin ditzazkezu jarraian." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"{name} \"{obj}\" ondo aldatu da. Beste {name} bat gehitu dezakezu jarraian." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" ondo aldatu da." +msgid "The {name} “{obj}” was changed successfully." +msgstr "" msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -225,13 +228,13 @@ msgid "No action selected." msgstr "Ez dago ekintzarik aukeratuta." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "%(name)s \"%(obj)s\" ondo ezabatu da." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" -"\"%(key)s\" ID dun %(name)s ez dira existitzen. Agian ezabatua izan da?" +"\"%(key)s\" ID-a duen %(name)s ez da existitzen. Agian ezabatua izan da?" #, python-format msgid "Add %s" @@ -268,8 +271,9 @@ msgstr "Guztira %(cnt)s, 0 aukeratuta" msgid "Change history: %s" msgstr "Aldaketen historia: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -302,8 +306,8 @@ msgstr "%(app)s kudeaketa" msgid "Page not found" msgstr "Ez da orririk aurkitu" -msgid "We're sorry, but the requested page could not be found." -msgstr "Barkatu, eskatutako orria ezin daiteke aurkitu" +msgid "We’re sorry, but the requested page could not be found." +msgstr "Sentitzen dugu, baina eskatutako orria ezin da aurkitu." msgid "Home" msgstr "Hasiera" @@ -318,11 +322,9 @@ msgid "Server Error (500)" msgstr "Zerbitzariaren errorea (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Errore bat gertatu da. Errorea guneko kudeatzaileari jakinarazi zaio email " -"bidez eta laster egon beharko luke konponduta. Barkatu eragozpenak." msgid "Run the selected action" msgstr "Burutu aukeratutako ekintza" @@ -340,12 +342,25 @@ msgstr "Hautatu %(total_count)s %(module_name)s guztiak" msgid "Clear selection" msgstr "Garbitu hautapena" +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s aplikazioaren modeloak" + +msgid "Add" +msgstr "Gehitu" + +msgid "View" +msgstr "Ikusi" + +msgid "You don’t have permission to view or edit anything." +msgstr "Ez duzu ezer ikusteko edo editatzeko baimenik." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Lehenik idatzi erabiltzaile-izena eta pasahitza. Gero erabiltzaile-aukera " -"gehiago aldatu ahal izango dituzu." +"Lehenik, sartu erabiltzailea eta pasahitza bat. Gero, editatzeko aukera " +"gehiago izango dituzu. " msgid "Enter a username and password." msgstr "Sartu erabiltzaile izen eta pasahitz bat." @@ -389,6 +404,9 @@ msgstr "Webgunean ikusi" msgid "Filter" msgstr "Iragazkia" +msgid "Clear all filters" +msgstr "Garbitu filtro guztiak." + msgid "Remove from sorting" msgstr "Kendu ordenaziotik" @@ -430,8 +448,8 @@ msgstr "" msgid "Objects" msgstr "Objetuak" -msgid "Yes, I'm sure" -msgstr "Bai, ziur nago" +msgid "Yes, I’m sure" +msgstr "bai, ziur nago " msgid "No, take me back" msgstr "Ez, itzuli atzera" @@ -465,9 +483,6 @@ msgstr "" "Ziur zaude aukeratutako %(objects_name)s ezabatu nahi duzula? Objektu guzti " "hauek eta erlazionatutako elementu guztiak ezabatuko dira:" -msgid "View" -msgstr "Ikusi" - msgid "Delete?" msgstr "Ezabatu?" @@ -478,16 +493,6 @@ msgstr "Irizpidea: %(filter_title)s" msgid "Summary" msgstr "Laburpena" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s aplikazioaren modeloak" - -msgid "Add" -msgstr "Gehitu" - -msgid "You don't have permission to view or edit anything." -msgstr "Ez duzu ezer ikusi edo ezabatzeko baimenik." - msgid "Recent actions" msgstr "Azken ekintzak" @@ -501,12 +506,10 @@ msgid "Unknown content" msgstr "Eduki ezezaguna" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Zerbait gaizki dago zure datu-basearen instalazioan. Ziurtatu datu-baseko " -"taulak sortu direla eta dagokion erabiltzaileak irakurtzeko baimena duela." #, python-format msgid "" @@ -519,6 +522,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Pasahitza edo erabiltzaile-izena ahaztu duzu?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "Hasi idazten filtratzeko..." + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Data/ordua" @@ -528,12 +540,16 @@ msgstr "Erabiltzailea" msgid "Action" msgstr "Ekintza" +msgid "entry" +msgstr "sarrera" + +msgid "entries" +msgstr "sarrerak" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Objektu honek ez dauka aldaketen historiarik. Ziurrenik kudeaketa gunetik " -"kanpo gehituko zen." msgid "Show all" msgstr "Erakutsi dena" @@ -584,8 +600,12 @@ msgstr "Gehitu beste %(model)s" msgid "Delete selected %(model)s" msgstr "Ezabatu aukeratutako %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Eskerrik asko webguneari zure probetxuzko denbora eskaintzeagatik." +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "Hasi saioa berriro" @@ -597,11 +617,11 @@ msgid "Your password was changed." msgstr "Zure pasahitza aldatu egin da." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Idatzi pasahitz zaharra segurtasun arrazoiengatik eta gero pasahitz berria " -"bi aldiz, akatsik egiten ez duzula ziurta dezagun." +"Mesedez, sartu zure pasahitza zaharra segurtasunagatik, gero sartu berria bi " +"aldiz, ondo idatzita dagoela ziurtatzeko. " msgid "Change my password" msgstr "Nire pasahitza aldatu" @@ -634,19 +654,18 @@ msgstr "" "erabilita egotea. Eskatu berriro pasahitza berrezartzea." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Zure pasahitza ezartzeko jarraibideak bidali dizkizugu email bidez, sartu " -"duzun helbide elektronikoa kontu bati lotuta badago. Laster jaso beharko " -"zenituzke." +"Zure pasahitza jartzeko aginduak bidali dizkizugu... sartu duzun posta " +"elektronikoarekin konturen bat baldin badago. Laster jasoko dituzu." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Ez baduzu mezurik jasotzen, ziurtatu izena ematean erabilitako helbide " -"berdina idatzi duzula eta egiaztatu spam karpeta." +"Posta elektronikorik jasotzen ez baduzu, ziurtatu erregistratu duzun " +"helbidean sartu zarela, eta zure spam horria begiratu. " #, python-format msgid "" @@ -659,8 +678,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Zoaz hurrengo orrira eta aukeratu pasahitz berria:" -msgid "Your username, in case you've forgotten:" -msgstr "Zure erabiltzaile-izena (ahaztu baduzu):" +msgid "Your username, in case you’ve forgotten:" +msgstr "Zure erabiltzaile-izena, ahaztu baduzu:" msgid "Thanks for using our site!" msgstr "Mila esker gure webgunea erabiltzeagatik!" @@ -670,11 +689,11 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s webguneko taldea" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Pasahitza ahaztu duzu? Idatzi zure helbide elektronikoa eta berri bat " -"ezartzeko jarraibideak bidaliko dizkizugu." +"Pasahitza ahaztu zaizu? Sartu zure helbidea behean, eta berria jartzeko " +"argibideak bidaliko dizkizugu " msgid "Email address:" msgstr "Helbide elektronikoa:" diff --git a/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo index 6b9adaa92c9b..234bff63c360 100644 Binary files a/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po index 40d86fae8350..e7d3ae5494c1 100644 --- a/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/eu/LC_MESSAGES/djangojs.po @@ -2,15 +2,15 @@ # # Translators: # Aitzol Naberan , 2011 -# Eneko Illarramendi , 2017 +# Eneko Illarramendi , 2017,2022 # Jannis Leidel , 2011 -# julen , 2012-2013 +# julen, 2012-2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" +"POT-Creation-Date: 2022-05-17 05:26-0500\n" +"PO-Revision-Date: 2022-07-25 07:59+0000\n" "Last-Translator: Eneko Illarramendi \n" "Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n" "MIME-Version: 1.0\n" @@ -84,20 +84,31 @@ msgstr "" "gorde gabeko aldaketak galduko dira." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Ekintza bat hautatu duzu, baina oraindik ez duzu eremuetako aldaketak gorde. " -"Mesedez, sakatu OK gordetzeko. Ekintza berriro exekutatu beharko duzu." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Ekintza bat hautatu duzu, baina ez duzu inongo aldaketarik egin eremuetan. " -"Litekeena da, Gorde botoia beharrean Aurrera botoiaren bila aritzea." + +msgid "Now" +msgstr "Orain" + +msgid "Midnight" +msgstr "Gauerdia" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Eguerdia" + +msgid "6 p.m." +msgstr "6 p.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -111,27 +122,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Oharra: zerbitzariaren denborarekiko ordu %s atzerago zaude. " msgstr[1] "Oharra: zerbitzariaren denborarekiko %s ordu atzerago zaude. " -msgid "Now" -msgstr "Orain" - msgid "Choose a Time" msgstr "Aukeratu ordu bat" msgid "Choose a time" msgstr "Aukeratu ordu bat" -msgid "Midnight" -msgstr "Gauerdia" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Eguerdia" - -msgid "6 p.m." -msgstr "6 p.m." - msgid "Cancel" msgstr "Atzera" @@ -148,68 +144,121 @@ msgid "Tomorrow" msgstr "Bihar" msgid "January" -msgstr "Urtarrila" +msgstr "urtarrila" msgid "February" -msgstr "Otsaila" +msgstr "otsaila" msgid "March" -msgstr "Martxoa" +msgstr "martxoa" msgid "April" -msgstr "Apirila" +msgstr "apirila" msgid "May" -msgstr "Maiatza" +msgstr "maiatza" msgid "June" -msgstr "Ekaina" +msgstr "ekaina" msgid "July" -msgstr "Uztaila" +msgstr "uztaila" msgid "August" -msgstr "Abuztua" +msgstr "abuztua" msgid "September" -msgstr "Iraila" +msgstr "iraila" msgid "October" -msgstr "Urria" +msgstr "urria" msgid "November" -msgstr "Azaroa" +msgstr "azaroa" msgid "December" -msgstr "Abendua" +msgstr "abendua" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "urt." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "ots." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "api." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "mai." + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "eka." + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "uzt." + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "abu." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "ira." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "urr." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "aza." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "abe." msgctxt "one letter Sunday" msgid "S" -msgstr "I" +msgstr "ig." msgctxt "one letter Monday" msgid "M" -msgstr "A" +msgstr "al." msgctxt "one letter Tuesday" msgid "T" -msgstr "A" +msgstr "ar." msgctxt "one letter Wednesday" msgid "W" -msgstr "A" +msgstr "az." msgctxt "one letter Thursday" msgid "T" -msgstr "O" +msgstr "og." msgctxt "one letter Friday" msgid "F" -msgstr "O" +msgstr "ol." msgctxt "one letter Saturday" msgid "S" -msgstr "L" +msgstr "lr." + +msgid "" +"You have already submitted this form. Are you sure you want to submit it " +"again?" +msgstr "" msgid "Show" msgstr "Erakutsi" diff --git a/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo b/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo index 85b2dbf67648..86d3ee652241 100644 Binary files a/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/fa/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/fa/LC_MESSAGES/django.po b/django/contrib/admin/locale/fa/LC_MESSAGES/django.po index 2d64609052d7..56a01609b801 100644 --- a/django/contrib/admin/locale/fa/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/fa/LC_MESSAGES/django.po @@ -1,22 +1,30 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Ali Nikneshan , 2015 +# Ahmad Hosseini , 2020 +# Ali Nikneshan , 2015,2020 +# ali salehi, 2023 # Ali Vakilzade , 2015 +# Aly Ahmady , 2022 +# Amir Ajorloo , 2020 # Arash Fazeli , 2012 +# Farshad Asadpour, 2021 # Jannis Leidel , 2011 # MJafar Mashhadi , 2018 # Mohammad Hossein Mojtahedi , 2017,2019 +# Peyman Salehi , 2023 # Pouya Abbassi, 2016 +# rahim agh , 2021 # Reza Mohammadi , 2013-2014 +# Sajad Rahimi , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-23 12:01+0000\n" -"Last-Translator: Mohammad Hossein Mojtahedi \n" -"Language-Team: Persian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: ali salehi, 2023\n" +"Language-Team: Persian (http://app.transifex.com/django/django/language/" "fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,6 +32,10 @@ msgstr "" "Language: fa\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "حذف %(verbose_name_plural)s های انتخاب شده" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d تا %(items)s با موفقیت حذف شدند." @@ -35,10 +47,6 @@ msgstr "امکان حذف %(name)s نیست." msgid "Are you sure?" msgstr "آیا مطمئن هستید؟" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "حذف %(verbose_name_plural)s های انتخاب شده" - msgid "Administration" msgstr "مدیریت" @@ -75,6 +83,12 @@ msgstr "بدون تاریخ" msgid "Has date" msgstr "دارای تاریخ" +msgid "Empty" +msgstr "خالی" + +msgid "Not empty" +msgstr "غیر خالی" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -132,23 +146,23 @@ msgid "log entries" msgstr "موارد اتفاقات" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "\"%(object)s\" افروده شد." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "تغییر \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "تغییر یافت \"%(object)s\" - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "\"%(object)s\" حدف شد." msgid "LogEntry Object" msgstr "شئ LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "اضافه شد {name} «{object}»." +msgid "Added {name} “{object}”." +msgstr "{name} \"{object}\" اضافه شد." msgid "Added." msgstr "اضافه شد" @@ -157,7 +171,7 @@ msgid "and" msgstr "و" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "{fields} برای {name} \"{object}\" تغییر یافتند." #, python-brace-format @@ -165,7 +179,7 @@ msgid "Changed {fields}." msgstr "{fields} تغییر یافتند." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "{name} \"{object}\" حذف شد." msgid "No fields changed." @@ -174,14 +188,16 @@ msgstr "فیلدی تغییر نیافته است." msgid "None" msgstr "هیچ" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"برای انتخاب بیش از یکی \"Control\"، یا \"Command\" روی Mac، را پایین نگه " +"برای انتخاب بیش از یکی، کلید \"Control\"، یا \"Command\" روی Mac، را نگه " "دارید." +msgid "Select this object for an action - {}" +msgstr "" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "{name} \"{obj}\" با موفقیت اضافه شد." msgid "You may edit it again below." @@ -189,36 +205,34 @@ msgstr "می‌توانید مجدداً ویرایش کنید." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" "{name} \"{obj}\" با موفقیت اضافه شد. شما میتوانید {name} دیگری در قسمت پایین " "اضافه کنید." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" "{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید دوباره آنرا در قسمت " "پایین ویرایش کنید." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -" {name} \"{obj}\" به موفقیت اضافه شد. شما میتوانید در قسمت پایین، آنرا " -"ویرایش کنید." +" {name} \"{obj}\" به موفقیت اضافه شد. شما میتوانید در قسمت پایین، دوباره آن " +"را ویرایش کنید." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" "{name} \"{obj}\" با موفقیت تغییر یافت. شما میتوانید {name} دیگری در قسمت " "پایین اضافه کنید." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "{name} \"{obj}\" با موفقیت تغییر یافت." msgid "" @@ -232,11 +246,11 @@ msgid "No action selected." msgstr "فعالیتی انتخاب نشده" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "%(name)s·\"%(obj)s\" با موفقیت حذف شد." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "%(name)s با کلید «%(key)s» وجود ندارد. ممکن است حذف شده باشد." #, python-format @@ -274,8 +288,9 @@ msgstr "0 از %(cnt)s انتخاب شده‌اند" msgid "Change history: %s" msgstr "تاریخچهٔ تغییر: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -307,7 +322,7 @@ msgstr "مدیریت ‎%(app)s‎" msgid "Page not found" msgstr "صفحه یافت نشد" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "شرمنده، صفحه مورد تقاضا یافت نشد." msgid "Home" @@ -323,11 +338,11 @@ msgid "Server Error (500)" msgstr "خطای سرور (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"مشکلی پیش آمده. این مشکل از طریق ایمیل به مدیران سایت اطلاع داده شد و به " -"زودی اصلاح میگردد. از صبر شما ممنونیم" +"مشکلی پیش آمده. این مشکل از طریق ایمیل به مدیران وب‌گاه اطلاع داده شد و به " +"زودی اصلاح می‌گردد. از صبر شما متشکریم." msgid "Run the selected action" msgstr "اجرای حرکت انتخاب شده" @@ -345,8 +360,24 @@ msgstr "انتخاب تمامی %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "لغو انتخاب‌ها" +msgid "Breadcrumbs" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "مدلها در برنامه %(name)s " + +msgid "Add" +msgstr "اضافه کردن" + +msgid "View" +msgstr "مشاهده" + +msgid "You don’t have permission to view or edit anything." +msgstr "شما اجازهٔ مشاهده یا ویرایش چیزی را ندارید." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "ابتدا یک نام کاربری و گذرواژه وارد کنید. سپس می توانید مشخصات دیگر کاربر را " @@ -359,15 +390,17 @@ msgid "Change password" msgstr "تغییر گذرواژه" msgid "Please correct the error below." -msgstr "لطفاً خطای زیر را تصحیح کنید." - -msgid "Please correct the errors below." -msgstr "لطفاً خطاهای زیر را تصحیح کنید." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "برای کابر %(username)s یک گذرنامهٔ جدید وارد کنید." +msgid "Skip to main content" +msgstr "انتقال به محتوای اصلی" + msgid "Welcome," msgstr "خوش آمدید،" @@ -393,6 +426,15 @@ msgstr "مشاهده در وب‌گاه" msgid "Filter" msgstr "فیلتر" +msgid "Hide counts" +msgstr "" + +msgid "Show counts" +msgstr "نمایش تعداد" + +msgid "Clear all filters" +msgstr "پاک کردن همه فیلترها" + msgid "Remove from sorting" msgstr "حذف از مرتب سازی" @@ -403,6 +445,15 @@ msgstr "اولویت مرتب‌سازی: %(priority_number)s" msgid "Toggle sorting" msgstr "تعویض مرتب سازی" +msgid "Toggle theme (current theme: auto)" +msgstr "تغییر رنگ پوسته (حالت کنونی: خودکار)" + +msgid "Toggle theme (current theme: light)" +msgstr "تغییر رنگ پوسته (حالت کنونی: روشن)" + +msgid "Toggle theme (current theme: dark)" +msgstr "تغییر رنگ پوسته (حالت کنونی: تیره)" + msgid "Delete" msgstr "حذف" @@ -434,7 +485,7 @@ msgstr "" msgid "Objects" msgstr "اشیاء" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "بله، مطمئن هستم." msgid "No, take me back" @@ -468,9 +519,6 @@ msgstr "" "آیا در خصوص حذف %(objects_name)s انتخاب شده اطمینان دارید؟ تمام موجودیت‌های " "ذیل به همراه موارد مرتبط با آنها حذف خواهند شد:" -msgid "View" -msgstr "مشاهده" - msgid "Delete?" msgstr "حذف؟" @@ -481,16 +529,6 @@ msgstr "براساس %(filter_title)s " msgid "Summary" msgstr "خلاصه" -#, python-format -msgid "Models in the %(name)s application" -msgstr "مدلها در برنامه %(name)s " - -msgid "Add" -msgstr "اضافه کردن" - -msgid "You don't have permission to view or edit anything." -msgstr "شما اجازهٔ مشاهده یا ویرایش چیزی را ندارید." - msgid "Recent actions" msgstr "فعالیتهای اخیر" @@ -500,11 +538,20 @@ msgstr "فعالیتهای من" msgid "None available" msgstr "چیزی در دسترس نیست" +msgid "Added:" +msgstr "اضافه شده:" + +msgid "Changed:" +msgstr "ویرایش شده:" + +msgid "Deleted:" +msgstr "حذف شده:" + msgid "Unknown content" msgstr "محتوا ناشناخته" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -523,6 +570,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "گذرواژه یا نام کاربری خود را فراموش کرده‌اید؟" +msgid "Toggle navigation" +msgstr "تعویض جهت یابی" + +msgid "Sidebar" +msgstr "ستون کناری" + +msgid "Start typing to filter…" +msgstr "آغار به کار نوشتن برای فیلترکردن ..." + +msgid "Filter navigation items" +msgstr "فیلتر کردن آیتم های مسیریابی" + msgid "Date/time" msgstr "تاریخ/ساعت" @@ -532,12 +591,17 @@ msgstr "کاربر" msgid "Action" msgstr "عمل" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"این شیء تاریخچهٔ تغییرات ندارد. احتمالا این شیء توسط وب‌گاه مدیریت ایجاد نشده " -"است." +"این شیء هنوز تاریخچه تغییرات ندارد. ممکن است توسط این وب‌گاه مدیر ساخته نشده " +"باشد." msgid "Show all" msgstr "نمایش همه" @@ -588,8 +652,13 @@ msgstr "افزدون %(model)s دیگر" msgid "Delete selected %(model)s" msgstr "حذف کردن %(model)s انتخاب شده" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "متشکر از اینکه مدتی از وقت خود را به ما اختصاص دادید." +#, python-format +msgid "View selected %(model)s" +msgstr "نمایش %(model)sهای انتخاب شده" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"از شما ممنون هستیم که زمان با ارزش خود را برای این تارنما امروز صرف کرده اید" msgid "Log in again" msgstr "ورود دوباره" @@ -601,11 +670,11 @@ msgid "Your password was changed." msgstr "گذرواژهٔ شما تغییر یافت." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"گذرواژهٔ قدیمی خود را، برای امنیت بیشتر، وارد کنید و سپس گذرواژهٔ جدیدتان را " -"دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید." +"برای امنیت بیشتر٬ لطفا گذرواژه قدیمی خود را وارد کنید٬ سپس گذرواژه جدیدتان " +"را دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید. " msgid "Change my password" msgstr "تغییر گذرواژهٔ من" @@ -640,14 +709,14 @@ msgstr "" "استفاده شده است. لطفاً برای یک گذرواژهٔ جدید درخواست دهید." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "دستورالعمل تنظیم گذرواژه را برایتان ایمیل کردیم. اگر با ایمیلی که وارد کردید " -"اکانتی وجود داشت باشد باید به زودی این دستورالعمل‌ها را دریافت کنید." +"اکانتی وجود داشته باشد باید به زودی این دستورالعمل‌ها را دریافت کنید." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "اگر ایمیلی دریافت نمی‌کنید، لطفاً بررسی کنید که آدرسی که وارد کرده‌اید همان است " @@ -664,7 +733,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "لطفاً به صفحهٔ زیر بروید و یک گذرواژهٔ جدید انتخاب کنید:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "نام کاربری‌تان، چنانچه احیاناً یادتان رفته است:" msgid "Thanks for using our site!" @@ -675,11 +744,11 @@ msgid "The %(site_name)s team" msgstr "گروه %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"رمز خود را فراموش کرده اید؟ آدرس ایمیل خود را در زیر وارد کنید، و ما روش " -"تنظیم رمز جدید را برایتان می فرستیم." +"گذرواژه خود را فراموش کرده اید؟ آدرس ایمیل خود را وارد کنید و ما مراحل تعیین " +"کلمه عبور جدید را برای شما ایمیل می‌کنیم." msgid "Email address:" msgstr "آدرس ایمیل:" @@ -687,6 +756,9 @@ msgstr "آدرس ایمیل:" msgid "Reset my password" msgstr "ایجاد گذرواژهٔ جدید" +msgid "Select all objects on this page for an action" +msgstr "" + msgid "All dates" msgstr "همهٔ تاریخ‌ها" diff --git a/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo index 7c6fa113bca6..2add5c779c5c 100644 Binary files a/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po index 5f8db3b153d4..f082b60eddd9 100644 --- a/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/fa/LC_MESSAGES/djangojs.po @@ -6,15 +6,16 @@ # Ali Vakilzade , 2015 # Jannis Leidel , 2011 # Pouya Abbassi, 2016 +# rahim agh , 2020-2021 # Reza Mohammadi , 2014 # Sina Cheraghi , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Mohammad Hossein Mojtahedi \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-03 13:56+0000\n" +"Last-Translator: rahim agh \n" "Language-Team: Persian (http://www.transifex.com/django/django/language/" "fa/)\n" "MIME-Version: 1.0\n" @@ -87,21 +88,21 @@ msgstr "" "دهید، تغییرات از دست خواهند رفت" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"شما کاری را انتخاب کرده اید، ولی هنوز تغییرات بعضی فیلد ها را ذخیره نکرده " -"اید. لطفا OK را فشار دهید تا ذخیره شود.\n" -"شما باید عملیات را دوباره انجام دهید." +"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی که در فیلدهای شخصی وارد کرده‌اید " +"هنوز ذخیره نشده‌اند. لطفاً کلید OK را برای ذخیره کردن تغییرات بزنید. لازم است " +"که اقدام را دوباره اجرا کنید." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"شما عملی را انجام داده اید، ولی تغییری انجام نداده اید. احتمالا دنبال کلید " -"Go به جای Save میگردید." +"شما یک اقدام را انتخاب کرده‌اید، ولی تغییراتی در فیلدهای شخصی وارد نکرده‌اید. " +"احتمالاً به جای کلید Save به دنبال کلید Go می‌گردید." msgid "Now" msgstr "اکنون" @@ -187,6 +188,54 @@ msgstr "نوامبر" msgid "December" msgstr "دسامبر" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "ژانویه" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "فوریه" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "مارس" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "آوریل" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "می" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "ژوئن" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "ژوئیه" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "اوت" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "سپتامبر" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "اکتبر" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "نوامبر" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "دسامبر" + msgctxt "one letter Sunday" msgid "S" msgstr "ی" diff --git a/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo b/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo index b65ffeff53f9..86ef000b47b6 100644 Binary files a/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/fi/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/fi/LC_MESSAGES/django.po b/django/contrib/admin/locale/fi/LC_MESSAGES/django.po index a2c0a3806e10..00556e040029 100644 --- a/django/contrib/admin/locale/fi/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/fi/LC_MESSAGES/django.po @@ -1,19 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Aarni Koskela, 2015,2017 +# Aarni Koskela, 2015,2017,2020-2022 # Antti Kaihola , 2011 # Jannis Leidel , 2011 -# Klaus Dahlén , 2012 -# Nikolay Korotkiy , 2018 +# Jiri Grönroos , 2021,2023 +# Klaus Dahlén, 2012 +# Nikolay Korotkiy , 2018 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: Jiri Grönroos , 2021,2023\n" +"Language-Team: Finnish (http://app.transifex.com/django/django/language/" "fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,6 +22,10 @@ msgstr "" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d \"%(items)s\"-kohdetta poistettu." @@ -32,10 +37,6 @@ msgstr "Ei voida poistaa: %(name)s" msgid "Are you sure?" msgstr "Oletko varma?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Poista valitut \"%(verbose_name_plural)s\"-kohteet" - msgid "Administration" msgstr "Hallinta" @@ -72,6 +73,12 @@ msgstr "Ei päivämäärää" msgid "Has date" msgstr "On päivämäärä" +msgid "Empty" +msgstr "Tyhjä" + +msgid "Not empty" +msgstr "Ei tyhjä" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -129,22 +136,22 @@ msgid "log entries" msgstr "lokimerkinnät" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "Lisätty \"%(object)s\"." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" msgstr "Muokattu \"%(object)s\" - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "Poistettu \"%(object)s.\"" msgid "LogEntry Object" msgstr "Lokimerkintätietue" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "Lisätty {name} \"{object}\"." msgid "Added." @@ -154,7 +161,7 @@ msgid "and" msgstr "ja" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "Muutettu {fields} {name}-kohteelle \"{object}\"." #, python-brace-format @@ -162,7 +169,7 @@ msgid "Changed {fields}." msgstr "Muutettu {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "Poistettu {name} \"{object}\"." msgid "No fields changed." @@ -171,43 +178,43 @@ msgstr "Ei muutoksia kenttiin." msgid "None" msgstr "Ei arvoa" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" " Pidä \"Ctrl\" (tai Macin \"Command\") pohjassa valitaksesi useita " "vaihtoehtoja." +msgid "Select this object for an action - {}" +msgstr "" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "{name} \"{obj}\" on lisätty." msgid "You may edit it again below." -msgstr "" +msgstr "Voit muokata sitä jälleen alla." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" on lisätty. Voit lisätä toisen {name} alla." +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "{name} \"{obj}\" on lisätty. Voit lisätä toisen {name}-kohteen alla." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "{name} \"{obj}\" on muokattu. Voit muokata sitä edelleen alla." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" on lisätty. Voit muokata sitä uudelleen alla." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" on lisätty. Voit muokata sitä edelleen alla." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} \"{obj}\" on muokattu. Voit lisätä toisen alla." +msgstr "{name} \"{obj}\" on muokattu. Voit lisätä toisen {name}-kohteen alla." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "{name} \"{obj}\" on muokattu." msgid "" @@ -221,12 +228,12 @@ msgid "No action selected." msgstr "Ei toimintoa valittuna." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "%(name)s \"%(obj)s\" on poistettu." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s tunnisteella %(key)s puuttuu. Se on voitu poistaa." +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s tunnisteella \"%(key)s\" puuttuu. Se on voitu poistaa." #, python-format msgid "Add %s" @@ -238,7 +245,7 @@ msgstr "Muokkaa %s" #, python-format msgid "View %s" -msgstr "" +msgstr "Näytä %s" msgid "Database error" msgstr "Tietokantavirhe" @@ -263,8 +270,9 @@ msgstr "0 valittuna %(cnt)s mahdollisesta" msgid "Change history: %s" msgstr "Muokkaushistoria: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -296,7 +304,7 @@ msgstr "%(app)s-ylläpito" msgid "Page not found" msgstr "Sivua ei löydy" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt." msgid "Home" @@ -312,7 +320,7 @@ msgid "Server Error (500)" msgstr "Palvelinvirhe (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Sattui virhe. Virheestä on huomautettu sivuston ylläpitäjille sähköpostitse " @@ -334,8 +342,24 @@ msgstr "Valitse kaikki %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Tyhjennä valinta" +msgid "Breadcrumbs" +msgstr "Murupolut" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Sovelluksen %(name)s mallit" + +msgid "Add" +msgstr "Lisää" + +msgid "View" +msgstr "Näytä" + +msgid "You don’t have permission to view or edit anything." +msgstr "Sinulla ei ole oikeutta näyttää tai muokata mitään." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita " @@ -348,15 +372,17 @@ msgid "Change password" msgstr "Vaihda salasana" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "Korjaa allaolevat virheet." +msgid_plural "Please correct the errors below." +msgstr[0] "Korjaa alla oleva virhe." +msgstr[1] "Korjaa alla olevat virheet." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Syötä käyttäjän %(username)s uusi salasana." +msgid "Skip to main content" +msgstr "Siirry pääsisältöön" + msgid "Welcome," msgstr "Tervetuloa," @@ -364,7 +390,7 @@ msgid "View site" msgstr "Näytä sivusto" msgid "Documentation" -msgstr "Ohjeita" +msgstr "Dokumentaatio" msgid "Log out" msgstr "Kirjaudu ulos" @@ -382,6 +408,15 @@ msgstr "Näytä lopputulos" msgid "Filter" msgstr "Suodatin" +msgid "Hide counts" +msgstr "Piilota lukumäärät" + +msgid "Show counts" +msgstr "Näytä lukumäärät" + +msgid "Clear all filters" +msgstr "Tyhjennä kaikki suodattimet" + msgid "Remove from sorting" msgstr "Poista järjestämisestä" @@ -392,6 +427,15 @@ msgstr "Järjestysprioriteetti: %(priority_number)s" msgid "Toggle sorting" msgstr "Kytke järjestäminen" +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + msgid "Delete" msgstr "Poista" @@ -424,7 +468,7 @@ msgstr "" msgid "Objects" msgstr "Kohteet" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Kyllä, olen varma" msgid "No, take me back" @@ -456,12 +500,9 @@ msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"Haluatki varmasti poistaa valitut %(objects_name)s? Samalla poistetaan " +"Haluatko varmasti poistaa valitut %(objects_name)s? Samalla poistetaan " "kaikki alla mainitut ja niihin liittyvät kohteet:" -msgid "View" -msgstr "" - msgid "Delete?" msgstr "Poista?" @@ -472,16 +513,6 @@ msgstr " %(filter_title)s " msgid "Summary" msgstr "Yhteenveto" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s -applikaation mallit" - -msgid "Add" -msgstr "Lisää" - -msgid "You don't have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "Viimeisimmät tapahtumat" @@ -491,11 +522,20 @@ msgstr "Omat tapahtumat" msgid "None available" msgstr "Ei yhtään" +msgid "Added:" +msgstr "Lisätty:" + +msgid "Changed:" +msgstr "Muutettu:" + +msgid "Deleted:" +msgstr "Poistettu:" + msgid "Unknown content" msgstr "Tuntematon sisältö" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -513,6 +553,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Unohditko salasanasi tai käyttäjätunnuksesi?" +msgid "Toggle navigation" +msgstr "Kytke navigaatio" + +msgid "Sidebar" +msgstr "Sivupalkki" + +msgid "Start typing to filter…" +msgstr "Kirjoita suodattaaksesi..." + +msgid "Filter navigation items" +msgstr "Suodata navigaatiovaihtoehtoja" + msgid "Date/time" msgstr "Pvm/klo" @@ -522,8 +574,13 @@ msgstr "Käyttäjä" msgid "Action" msgstr "Tapahtuma" +msgid "entry" +msgid_plural "entries" +msgstr[0] "merkintä" +msgstr[1] "merkintää" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole ilmeisesti lisätty tämän " @@ -536,7 +593,7 @@ msgid "Save" msgstr "Tallenna ja poistu" msgid "Popup closing…" -msgstr "" +msgstr "Ponnahdusikkuna sulkeutuu..." msgid "Search" msgstr "Haku" @@ -561,7 +618,7 @@ msgid "Save and continue editing" msgstr "Tallenna välillä ja jatka muokkaamista" msgid "Save and view" -msgstr "" +msgstr "Tallenna ja näytä" msgid "Close" msgstr "Sulje" @@ -578,7 +635,11 @@ msgstr "Lisää toinen %(model)s" msgid "Delete selected %(model)s" msgstr "Poista valitut %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Näytä valitut %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Kiitos sivuillamme viettämästäsi ajasta." msgid "Log in again" @@ -591,7 +652,7 @@ msgid "Your password was changed." msgstr "Salasanasi on vaihdettu." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi kaksi " @@ -630,14 +691,14 @@ msgstr "" "käytetty. Ole hyvä ja pyydä uusi salasanan nollaus." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "Sinulle on lähetetty sähköpostitse ohjeet salasanasi asettamiseen, mikäli " "antamallasi sähköpostiosoitteella on olemassa tili." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "Jos viestiä ei näy, ole hyvä ja varmista syöttäneesi oikea sähköpostiosoite " @@ -654,7 +715,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Määrittele uusi salasanasi oheisella sivulla:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:" msgid "Thanks for using our site!" @@ -662,10 +723,10 @@ msgstr "Kiitos vierailustasi sivuillamme!" #, python-format msgid "The %(site_name)s team" -msgstr "%(site_name)s -sivuston ylläpitäjät" +msgstr "Sivuston %(site_name)s ylläpitäjät" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Unohditko salasanasi? Syötä sähköpostiosoitteesi alle ja lähetämme sinulle " @@ -677,6 +738,9 @@ msgstr "Sähköpostiosoite:" msgid "Reset my password" msgstr "Nollaa salasanani" +msgid "Select all objects on this page for an action" +msgstr "" + msgid "All dates" msgstr "Kaikki päivät" @@ -690,7 +754,7 @@ msgstr "Valitse muokattava %s" #, python-format msgid "Select %s to view" -msgstr "" +msgstr "Valitse näytettävä %s" msgid "Date:" msgstr "Pvm:" diff --git a/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo index 10d6422a4d22..e05b815d66ef 100644 Binary files a/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po index bf775c864486..3cc3fbcb6024 100644 --- a/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/fi/LC_MESSAGES/djangojs.po @@ -1,17 +1,18 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Aarni Koskela, 2015,2017 +# Aarni Koskela, 2015,2017,2020-2022 # Antti Kaihola , 2011 # Jannis Leidel , 2011 +# Jiri Grönroos , 2021,2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Aarni Koskela\n" -"Language-Team: Finnish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Jiri Grönroos , 2021,2023\n" +"Language-Team: Finnish (http://app.transifex.com/django/django/language/" "fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +29,7 @@ msgid "" "This is the list of available %s. You may choose some by selecting them in " "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" -"Tämä on lista saatavillaolevista %s. Valitse allaolevasta laatikosta " +"Tämä on lista saatavilla olevista %s. Valitse alla olevasta laatikosta " "haluamasi ja siirrä ne valittuihin klikkamalla \"Valitse\"-nuolta " "laatikoiden välillä." @@ -65,6 +66,10 @@ msgstr "" "allaolevasta laatikosta ja siirtämällä ne takaisin valitsemattomiin " "klikkamalla \"Poista\"-nuolta laatikoiden välillä." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" + msgid "Remove all" msgstr "Poista kaikki" @@ -72,6 +77,12 @@ msgstr "Poista kaikki" msgid "Click to remove all chosen %s at once." msgstr "Klikkaa poistaaksesi kaikki valitut %s kerralla." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "" +msgstr[1] "" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s valittuna %(cnt)s mahdollisesta" @@ -85,8 +96,8 @@ msgstr "" "Jos suoritat toiminnon, tallentamattomat muutoksesi katoavat." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Olet valinnut toiminnon, mutta et ole vielä tallentanut muutoksiasi " @@ -94,12 +105,28 @@ msgstr "" "toiminto uudelleen." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Olet valinnut toiminnon etkä ole tehnyt yhtään muutosta yksittäisissä " -"kentissä. Etsit todennäköisesti Suorita-nappia Tallenna-napin sijaan." +"kentissä. Etsit todennäköisesti Suorita-painiketta Tallenna-painikkeen " +"sijaan." + +msgid "Now" +msgstr "Nyt" + +msgid "Midnight" +msgstr "24" + +msgid "6 a.m." +msgstr "06" + +msgid "Noon" +msgstr "12" + +msgid "6 p.m." +msgstr "18:00" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -113,27 +140,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Huom: Olet %s tunnin palvelinaikaa jäljessä." msgstr[1] "Huom: Olet %s tuntia palvelinaikaa jäljessä." -msgid "Now" -msgstr "Nyt" - msgid "Choose a Time" msgstr "Valitse kellonaika" msgid "Choose a time" msgstr "Valitse kellonaika" -msgid "Midnight" -msgstr "24" - -msgid "6 a.m." -msgstr "06" - -msgid "Noon" -msgstr "12" - -msgid "6 p.m." -msgstr "18:00" - msgid "Cancel" msgstr "Peruuta" @@ -185,6 +197,103 @@ msgstr "marraskuu" msgid "December" msgstr "joulukuu" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Tammi" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Helmi" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Maalis" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Huhti" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Touko" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Kesä" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Heinä" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Elo" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Syys" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Loka" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Marras" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Joulu" + +msgid "Sunday" +msgstr "Sunnuntai" + +msgid "Monday" +msgstr "Maanantai" + +msgid "Tuesday" +msgstr "Tiistai" + +msgid "Wednesday" +msgstr "Keskiviikko" + +msgid "Thursday" +msgstr "Torstai" + +msgid "Friday" +msgstr "Perjantai" + +msgid "Saturday" +msgstr "Lauantai" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Su" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Ma" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Ti" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Ke" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "To" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pe" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "La" + msgctxt "one letter Sunday" msgid "S" msgstr "Su" diff --git a/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo b/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo index 0eee0beac29c..2607e2777caf 100644 Binary files a/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/fr/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/fr/LC_MESSAGES/django.po b/django/contrib/admin/locale/fr/LC_MESSAGES/django.po index d8b7cd17f891..2e768e33aabe 100644 --- a/django/contrib/admin/locale/fr/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/fr/LC_MESSAGES/django.po @@ -1,23 +1,28 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Claude Paroz , 2013-2019 +# Bruno Brouard , 2021 +# Claude Paroz , 2013-2024 # Claude Paroz , 2011,2013 # Jannis Leidel , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 16:24+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Claude Paroz , 2013-2024\n" +"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Supprimer les %(verbose_name_plural)s sélectionnés" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "La suppression de %(count)d %(items)s a réussi." @@ -29,10 +34,6 @@ msgstr "Impossible de supprimer %(name)s" msgid "Are you sure?" msgstr "Êtes-vous sûr ?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Supprimer les %(verbose_name_plural)s sélectionnés" - msgid "Administration" msgstr "Administration" @@ -69,6 +70,12 @@ msgstr "Aucune date" msgid "Has date" msgstr "Possède une date" +msgid "Empty" +msgstr "Vide" + +msgid "Not empty" +msgstr "Non vide" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -86,19 +93,19 @@ msgid "Add another %(verbose_name)s" msgstr "Ajouter un objet %(verbose_name)s supplémentaire" msgid "Remove" -msgstr "Supprimer" +msgstr "Enlever" msgid "Addition" msgstr "Ajout" msgid "Change" -msgstr "Modifier" +msgstr "Modification" msgid "Deletion" msgstr "Suppression" msgid "action time" -msgstr "heure de l’action" +msgstr "date de l’action" msgid "user" msgstr "utilisateur" @@ -174,6 +181,9 @@ msgstr "" "Maintenez appuyé « Ctrl », ou « Commande (touche pomme) » sur un Mac, pour " "en sélectionner plusieurs." +msgid "Select this object for an action - {}" +msgstr "Choisir cet objet pour une action - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "L'objet {name} « {obj} » a été ajouté avec succès." @@ -192,14 +202,8 @@ msgstr "" msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez continuer " -"l’édition ci-dessous." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"L’objet {name} « {obj} » a été ajouté avec succès. Vous pouvez continuer " -"l’édition ci-dessous." +"L’objet {name} « {obj} » a été modifié avec succès. Vous pouvez l’éditer à " +"nouveau ci-dessous." #, python-brace-format msgid "" @@ -253,12 +257,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s objet %(name)s a été modifié avec succès." msgstr[1] "%(count)s objets %(name)s ont été modifiés avec succès." +msgstr[2] "%(count)s objets %(name)s ont été modifiés avec succès." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s sélectionné" msgstr[1] "Tous les %(total_count)s sélectionnés" +msgstr[2] "Tous les %(total_count)s sélectionnés" #, python-format msgid "0 of %(cnt)s selected" @@ -268,8 +274,9 @@ msgstr "0 sur %(cnt)s sélectionné" msgid "Change history: %s" msgstr "Historique des changements : %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -289,7 +296,7 @@ msgid "Django administration" msgstr "Administration de Django" msgid "Site administration" -msgstr "Administration du site" +msgstr "Site d’administration" msgid "Log in" msgstr "Connexion" @@ -299,7 +306,7 @@ msgid "%(app)s administration" msgstr "Administration de %(app)s" msgid "Page not found" -msgstr "Cette page n’a pas été trouvée" +msgstr "Page non trouvée" msgid "We’re sorry, but the requested page could not be found." msgstr "Nous sommes désolés, mais la page demandée est introuvable." @@ -340,6 +347,22 @@ msgstr "Sélectionner tous les %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Effacer la sélection" +msgid "Breadcrumbs" +msgstr "Fil d'Ariane" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modèles de l’application %(name)s" + +msgid "Add" +msgstr "Ajouter" + +msgid "View" +msgstr "Afficher" + +msgid "You don’t have permission to view or edit anything." +msgstr "Vous n’avez pas la permission de voir ou de modifier quoi que ce soit." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -353,11 +376,14 @@ msgstr "Saisissez un nom d’utilisateur et un mot de passe." msgid "Change password" msgstr "Modifier le mot de passe" -msgid "Please correct the error below." -msgstr "Corrigez l’erreur ci-dessous." +msgid "Set password" +msgstr "Définir un mot de passe" -msgid "Please correct the errors below." -msgstr "Corrigez les erreurs ci-dessous." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Corrigez l’erreur ci-dessous." +msgstr[1] "Corrigez les erreurs ci-dessous." +msgstr[2] "Corrigez les erreurs ci-dessous." #, python-format msgid "Enter a new password for the user %(username)s." @@ -365,6 +391,22 @@ msgstr "" "Saisissez un nouveau mot de passe pour l’utilisateur %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Cette action va activer l'authentification par mot de passe " +"pour cet utilisateur." + +msgid "Disable password-based authentication" +msgstr "Désactiver l'authentification par mot de passe" + +msgid "Enable password-based authentication" +msgstr "Activer l'authentification par mot de passe" + +msgid "Skip to main content" +msgstr "Passer au contenu principal" + msgid "Welcome," msgstr "Bienvenue," @@ -390,6 +432,15 @@ msgstr "Voir sur le site" msgid "Filter" msgstr "Filtre" +msgid "Hide counts" +msgstr "Masquer les nombres" + +msgid "Show counts" +msgstr "Afficher les nombres" + +msgid "Clear all filters" +msgstr "Effacer tous les filtres" + msgid "Remove from sorting" msgstr "Enlever du tri" @@ -400,6 +451,15 @@ msgstr "Priorité de tri : %(priority_number)s" msgid "Toggle sorting" msgstr "Inverser le tri" +msgid "Toggle theme (current theme: auto)" +msgstr "Changer de thème (actuellement : automatique)" + +msgid "Toggle theme (current theme: light)" +msgstr "Changer de thème (actuellement : clair)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Changer de thème (actuellement : sombre)" + msgid "Delete" msgstr "Supprimer" @@ -468,9 +528,6 @@ msgstr "" "Voulez-vous vraiment supprimer les objets %(objects_name)s sélectionnés ? " "Tous les objets suivants et les éléments liés seront supprimés :" -msgid "View" -msgstr "Afficher" - msgid "Delete?" msgstr "Supprimer ?" @@ -481,16 +538,6 @@ msgstr " Par %(filter_title)s " msgid "Summary" msgstr "Résumé" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modèles de l’application %(name)s" - -msgid "Add" -msgstr "Ajouter" - -msgid "You don’t have permission to view or edit anything." -msgstr "Vous n’avez pas la permission de voir ou de modifier quoi que ce soit." - msgid "Recent actions" msgstr "Actions récentes" @@ -500,6 +547,15 @@ msgstr "Mes actions" msgid "None available" msgstr "Aucun(e) disponible" +msgid "Added:" +msgstr "Ajout :" + +msgid "Changed:" +msgstr "Modif. :" + +msgid "Deleted:" +msgstr "Suppr. :" + msgid "Unknown content" msgstr "Contenu inconnu" @@ -524,6 +580,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Mot de passe ou nom d’utilisateur oublié ?" +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Sidebar" +msgstr "Barre latérale" + +msgid "Start typing to filter…" +msgstr "Écrivez ici pour filtrer…" + +msgid "Filter navigation items" +msgstr "Filtrer les éléments de navigation" + msgid "Date/time" msgstr "Date/heure" @@ -533,6 +601,12 @@ msgstr "Utilisateur" msgid "Action" msgstr "Action" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrée" +msgstr[1] "entrées" +msgstr[2] "entrées" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -557,6 +631,7 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s résultat" msgstr[1] "%(counter)s résultats" +msgstr[2] "%(counter)s résultats" #, python-format msgid "%(full_result_count)s total" @@ -589,7 +664,11 @@ msgstr "Ajouter un autre objet %(model)s" msgid "Delete selected %(model)s" msgstr "Supprimer l’objet %(model)s sélectionné" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Afficher l'objet %(model)s sélectionné" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Merci pour le temps que vous avez accordé à ce site aujourd’hui." msgid "Log in again" @@ -694,6 +773,9 @@ msgstr "Adresse électronique :" msgid "Reset my password" msgstr "Réinitialiser mon mot de passe" +msgid "Select all objects on this page for an action" +msgstr "Sélectionner tous les objets de cette page en vue d’une action" + msgid "All dates" msgstr "Toutes les dates" diff --git a/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo index 2b0b2cb8258d..613deeb2f04f 100644 Binary files a/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po index 4b17b0ccf5cc..1fe647a3a8ad 100644 --- a/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/fr/LC_MESSAGES/djangojs.po @@ -1,17 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Claude Paroz , 2014-2017 +# Claude Paroz , 2014-2017,2020-2023 # Claude Paroz , 2011-2012 # Jannis Leidel , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-10-21 13:28+0000\n" -"Last-Translator: Claude Paroz \n" -"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Claude Paroz , 2014-2017,2020-2023\n" +"Language-Team: French (http://app.transifex.com/django/django/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -64,6 +64,11 @@ msgstr "" "sélectionnant dans la zone ci-dessous, puis en cliquant sur la flèche « " "Enlever » entre les deux zones." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"Écrivez dans cette zone pour filtrer la liste des « %s » sélectionné·e·s." + msgid "Remove all" msgstr "Tout enlever" @@ -71,10 +76,18 @@ msgstr "Tout enlever" msgid "Click to remove all chosen %s at once." msgstr "Cliquez pour enlever tous les « %s » en une seule opération." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s option sélectionnée invisible" +msgstr[1] "%s options sélectionnées invisibles" +msgstr[2] "%s options sélectionnées invisibles" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s sur %(cnt)s sélectionné" msgstr[1] "%(sel)s sur %(cnt)s sélectionnés" +msgstr[2] "%(sel)s sur %(cnt)s sélectionnés" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -84,17 +97,17 @@ msgstr "" "Si vous lancez une action, ces modifications vont être perdues." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Vous avez sélectionné une action, mais vous n'avez pas encore sauvegardé " -"certains champs modifiés. Cliquez sur OK pour sauver. Vous devrez " +"Vous avez sélectionné une action, mais vous n'avez pas encore enregistré " +"certains champs modifiés. Cliquez sur OK pour enregistrer. Vous devrez " "réappliquer l'action." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Vous avez sélectionné une action, et vous n'avez fait aucune modification " @@ -121,12 +134,14 @@ msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Note : l'heure du serveur précède votre heure de %s heure." msgstr[1] "Note : l'heure du serveur précède votre heure de %s heures." +msgstr[2] "Note : l'heure du serveur précède votre heure de %s heures." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Note : votre heure précède l'heure du serveur de %s heure." msgstr[1] "Note : votre heure précède l'heure du serveur de %s heures." +msgstr[2] "Note : votre heure précède l'heure du serveur de %s heures." msgid "Choose a Time" msgstr "Choisir une heure" @@ -185,6 +200,103 @@ msgstr "Novembre" msgid "December" msgstr "Décembre" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "fév" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "avr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jui" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aoû" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "oct" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "déc" + +msgid "Sunday" +msgstr "dimanche" + +msgid "Monday" +msgstr "lundi" + +msgid "Tuesday" +msgstr "mardi" + +msgid "Wednesday" +msgstr "mercredi" + +msgid "Thursday" +msgstr "jeudi" + +msgid "Friday" +msgstr "vendredi" + +msgid "Saturday" +msgstr "samedi" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "dim" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "lun" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "mar" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "mer" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "jeu" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "ven" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "sam" + msgctxt "one letter Sunday" msgid "S" msgstr "D" diff --git a/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo index 8c029af57b53..4f4d2865003a 100644 Binary files a/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ga/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ga/LC_MESSAGES/django.po b/django/contrib/admin/locale/ga/LC_MESSAGES/django.po index 252e50d06556..bc55f3353129 100644 --- a/django/contrib/admin/locale/ga/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ga/LC_MESSAGES/django.po @@ -1,6 +1,7 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Aindriú Mac Giolla Eoin, 2024 # Jannis Leidel , 2011 # Luke Blaney , 2019 # Michael Thornhill , 2011-2012,2015 @@ -8,10 +9,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-06-22 21:17+0000\n" -"Last-Translator: Luke Blaney \n" -"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" +"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,6 +20,10 @@ msgstr "" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " "4);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Scrios %(verbose_name_plural) roghnaithe" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "D'éirigh le scriosadh %(count)d %(items)s." @@ -30,10 +35,6 @@ msgstr "Ní féidir scriosadh %(name)s " msgid "Are you sure?" msgstr "An bhfuil tú cinnte?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Scrios %(verbose_name_plural) roghnaithe" - msgid "Administration" msgstr "Riarachán" @@ -70,6 +71,12 @@ msgstr "Gan dáta" msgid "Has date" msgstr "Le dáta" +msgid "Empty" +msgstr "Folamh" + +msgid "Not empty" +msgstr "Gan folamh" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -89,7 +96,7 @@ msgid "Remove" msgstr "Tóg amach" msgid "Addition" -msgstr "" +msgstr "Suimiú" msgid "Change" msgstr "Athraigh" @@ -104,7 +111,7 @@ msgid "user" msgstr "úsáideoir" msgid "content type" -msgstr "" +msgstr "cineál ábhair" msgid "object id" msgstr "id oibiacht" @@ -127,23 +134,23 @@ msgid "log entries" msgstr "loga iontrálacha" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" curtha isteach." +msgid "Added “%(object)s”." +msgstr "Curtha leis “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" - %(changes)s aithrithe" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Athraithe “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s.\" scrioste" +msgid "Deleted “%(object)s.”" +msgstr "Scriosta “%(object)s.”" msgid "LogEntry Object" msgstr "Oibiacht LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "{name} curtha leis \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Cuireadh {name} “{object}”." msgid "Added." msgstr "Curtha leis." @@ -152,16 +159,16 @@ msgid "and" msgstr "agus" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{fields} athrithe don {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Athraíodh {fields} le haghaidh {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "{fields} athrithe." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "{name} scrioste: \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Scriosadh {name} “{object}”." msgid "No fields changed." msgstr "Dada réimse aithraithe" @@ -169,48 +176,46 @@ msgstr "Dada réimse aithraithe" msgid "None" msgstr "Dada" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Coinnigh síos \"Control\", nó \"Command\" ar Mac chun níos mó ná ceann " -"amháin a roghnú." +"Coinnigh síos “Rialú”, nó “Ordú” ar Mac, chun níos mó ná ceann amháin a " +"roghnú." + +msgid "Select this object for an action - {}" +msgstr "Roghnaigh an réad seo le haghaidh gnímh - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Bhí {name} \"{obj}\" curtha leis go rathúil" +msgid "The {name} “{obj}” was added successfully." +msgstr "Cuireadh an {name} “{obj}” leis go rathúil." msgid "You may edit it again below." msgstr "Thig leat é a athrú arís faoi seo." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"D'athraigh {name} \"{obj}\" go rathúil.\n" -"Thig leat é a athrú arís faoi seo." +"Cuireadh an {name} “{obj}” leis go rathúil. Is féidir leat {name} eile a " +"chur leis thíos." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" +"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat é a chur in eagar " +"arís thíos." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"D'athraigh {name} \"{obj}\" go rathúil.\n" -"Thig leat {name} eile a chuir leis." +"Athraíodh an {name} “{obj}” go rathúil. Is féidir leat {name} eile a chur " +"leis thíos." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "D'athraigh {name} \"{obj}\" go rathúil." +msgid "The {name} “{obj}” was changed successfully." +msgstr "Athraíodh an {name} “{obj}” go rathúil." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -223,12 +228,12 @@ msgid "No action selected." msgstr "Uimh gníomh roghnaithe." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Bhí %(name)s \"%(obj)s\" scrioste go rathúil." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "D'éirigh le scriosadh %(name)s \"%(obj)s\"." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "Níl%(name)s ann le aitheantais \"%(key)s\". B'fhéidir gur scriosadh é?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "Níl %(name)s le haitheantas “%(key)s” ann. B'fhéidir gur scriosadh é?" #, python-format msgid "Add %s" @@ -271,8 +276,9 @@ msgstr "0 as %(cnt)s roghnaithe." msgid "Change history: %s" msgstr "Athraigh stáir %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -304,8 +310,8 @@ msgstr "%(app)s riaracháin" msgid "Page not found" msgstr "Ní bhfuarthas an leathanach" -msgid "We're sorry, but the requested page could not be found." -msgstr "Tá brón orainn, ach ní bhfuarthas an leathanach iarraite." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Ár leithscéal, ach níorbh fhéidir an leathanach iarrtha a aimsiú." msgid "Home" msgstr "Baile" @@ -320,11 +326,11 @@ msgid "Server Error (500)" msgstr "Botún Freastalaí (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Tharla earráid. Tuairiscíodh don riarthóirí suíomh tríd an ríomhphost agus " -"ba chóir a shocrú go luath. Go raibh maith agat as do foighne." +"Tharla earráid. Tuairiscíodh do riarthóirí an tsuímh trí ríomhphost agus ba " +"cheart é a shocrú go luath. Go raibh maith agat as do foighne." msgid "Run the selected action" msgstr "Rith an gníomh roghnaithe" @@ -343,12 +349,26 @@ msgstr "Roghnaigh gach %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Scroiseadh modhnóir" +msgid "Breadcrumbs" +msgstr "Brioscáin aráin" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Samhlacha ins an %(name)s iarratais" + +msgid "Add" +msgstr "Cuir le" + +msgid "View" +msgstr "Amharc ar" + +msgid "You don’t have permission to view or edit anything." +msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." -msgstr "" -"Ar dtús, iontráil ainm úsaideoir agus focal faire. Ansin, beidh tú in ann " -"cuir in eagar níos mó roghaí úsaideoira." +msgstr "Níl cead agat aon rud a fheiceáil ná a chur in eagar." msgid "Enter a username and password." msgstr "Cuir isteach ainm úsáideora agus focal faire." @@ -356,11 +376,16 @@ msgstr "Cuir isteach ainm úsáideora agus focal faire." msgid "Change password" msgstr "Athraigh focal faire" -msgid "Please correct the error below." -msgstr "Ceartaigh an botún thíos le do thoil." +msgid "Set password" +msgstr "Socraigh pasfhocal" -msgid "Please correct the errors below." -msgstr "Le do thoil cheartú earráidí thíos." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ceartaigh an earráid thíos le do thoil." +msgstr[1] "Ceartaigh na hearráidí thíos le do thoil." +msgstr[2] "Ceartaigh na hearráidí thíos le do thoil." +msgstr[3] "Ceartaigh na hearráidí thíos le do thoil." +msgstr[4] "Ceartaigh na hearráidí thíos le do thoil." #, python-format msgid "Enter a new password for the user %(username)s." @@ -368,6 +393,22 @@ msgstr "" "Iontráil focal faire nua le hadhaigh an úsaideor %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Cumasóidh an gníomh seo fhíordheimhniú pasfhocal-bhunaithe " +"don úsáideoir seo." + +msgid "Disable password-based authentication" +msgstr "Díchumasaigh fíordheimhniú pasfhocal-bhunaithe" + +msgid "Enable password-based authentication" +msgstr "Cumasaigh fíordheimhniú pasfhocal-bhunaithe" + +msgid "Skip to main content" +msgstr "Téigh ar aghaidh chuig an bpríomhábhar" + msgid "Welcome," msgstr "Fáilte" @@ -393,6 +434,15 @@ msgstr "Breath ar suíomh" msgid "Filter" msgstr "Scagaire" +msgid "Hide counts" +msgstr "Folaigh comhaireamh" + +msgid "Show counts" +msgstr "Taispeáin comhaireamh" + +msgid "Clear all filters" +msgstr "Glan na scagairí go léir" + msgid "Remove from sorting" msgstr "Bain as sórtáil" @@ -403,6 +453,15 @@ msgstr "Sórtáil tosaíocht: %(priority_number)s" msgid "Toggle sorting" msgstr "Toggle sórtáil" +msgid "Toggle theme (current theme: auto)" +msgstr "Scoránaigh an téama (téama reatha: uathoibríoch)" + +msgid "Toggle theme (current theme: light)" +msgstr "Scoránaigh an téama (téama reatha: solas)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Scoránaigh an téama (téama reatha: dorcha)" + msgid "Delete" msgstr "Cealaigh" @@ -434,8 +493,8 @@ msgstr "" msgid "Objects" msgstr "Oibiachtaí" -msgid "Yes, I'm sure" -msgstr "Táim cinnte" +msgid "Yes, I’m sure" +msgstr "Sea, táim cinnte" msgid "No, take me back" msgstr "Ní hea, tóg ar ais mé" @@ -469,9 +528,6 @@ msgstr "" "An bhfuil tú cinnte gur mian leat a scriosadh %(objects_name)s roghnaithe? " "Beidh gach ceann de na nithe seo a leanas agus a n-ítimí gaolta scroiste:" -msgid "View" -msgstr "Amharc ar" - msgid "Delete?" msgstr "Cealaigh?" @@ -482,46 +538,59 @@ msgstr " Trí %(filter_title)s " msgid "Summary" msgstr "Achoimre" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Samhlacha ins an %(name)s iarratais" - -msgid "Add" -msgstr "Cuir le" - -msgid "You don't have permission to view or edit anything." -msgstr "" - msgid "Recent actions" -msgstr "" +msgstr "Gníomhartha le déanaí" msgid "My actions" -msgstr "" +msgstr "Mo ghníomhartha" msgid "None available" msgstr "Dada ar fáil" +msgid "Added:" +msgstr "Curtha leis:" + +msgid "Changed:" +msgstr "Athraithe:" + +msgid "Deleted:" +msgstr "Scriosta:" + msgid "Unknown content" msgstr "Inneachair anaithnid" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Tá rud éigin mícheart le suitéail do bunachar sonraí. Déan cinnte go bhfuil " -"boird an bunachar sonraI cruthaithe cheana, agus déan cinnte go bhfuil do " -"úsaideoir in ann an bunacchar sonraí a léamh." +"Tá rud éigin cearr le suiteáil do bhunachar sonraí. Cinntigh go bhfuil na " +"táblaí bunachar sonraí cuí cruthaithe, agus cinntigh go bhfuil an bunachar " +"sonraí inléite ag an úsáideoir cuí." #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" +"Tá tú fíordheimhnithe mar %(username)s, ach níl cead agat an leathanach seo " +"a rochtain. Ar mhaith leat logáil isteach i gcuntas eile?" msgid "Forgotten your password or username?" msgstr "Dearmad déanta ar do focal faire nó ainm úsaideora" +msgid "Toggle navigation" +msgstr "Scoránaigh an nascleanúint" + +msgid "Sidebar" +msgstr "Barra Taoibh" + +msgid "Start typing to filter…" +msgstr "Tosaigh ag clóscríobh chun an scagaire…" + +msgid "Filter navigation items" +msgstr "Scag míreanna nascleanúna" + msgid "Date/time" msgstr "Dáta/am" @@ -531,12 +600,20 @@ msgstr "Úsaideoir" msgid "Action" msgstr "Aicsean" +msgid "entry" +msgid_plural "entries" +msgstr[0] "iontráil" +msgstr[1] "iontrálacha" +msgstr[2] "iontrálacha" +msgstr[3] "iontrálacha" +msgstr[4] "iontrálacha" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Níl stáir aitraithe ag an oibiacht seo agús is dócha ná cuir le tríd an an " -"suíomh riarachán." +"Níl stair athruithe ag an réad seo. Is dócha nár cuireadh leis tríd an " +"suíomh riaracháin seo." msgid "Show all" msgstr "Taispéan gach rud" @@ -545,7 +622,7 @@ msgid "Save" msgstr "Sábháil" msgid "Popup closing…" -msgstr "" +msgstr "Preabfhuinneog ag dúnadh…" msgid "Search" msgstr "Cuardach" @@ -590,8 +667,14 @@ msgstr "Cuir le %(model)s" msgid "Delete selected %(model)s" msgstr "Scrios roghnaithe %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Go raibh maith agat le hadhaigh do cuairt ar an suíomh idirlínn inniú." +#, python-format +msgid "View selected %(model)s" +msgstr "Féach ar %(model)s roghnaithe" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Go raibh maith agat as roinnt ama ardchaighdeáin a chaitheamh leis an suíomh " +"Gréasáin inniu." msgid "Log in again" msgstr "Logáil isteacj arís" @@ -603,12 +686,12 @@ msgid "Your password was changed." msgstr "Bhí do focal faire aithraithe." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Le do thoil, iontráil do sean-focal faire, ar son slándáil, agus ansin " -"iontráil do focal faire dhá uaire cé go mbeimid in ann a seiceal go bhfuil " -"sé scríobhte isteach i gceart." +"Cuir isteach do sheanphasfhocal, ar mhaithe le slándáil, agus ansin cuir " +"isteach do phasfhocal nua faoi dhó ionas gur féidir linn a fhíorú gur " +"chlóscríobh tú i gceart é." msgid "Change my password" msgstr "Athraigh mo focal faire" @@ -643,28 +726,35 @@ msgstr "" "úsaidte cheana. Le do thoil, iarr ar athsocraigh focal faire nua." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Chuireamar ríomhphost chugat treoracha maidir le do phasfhocal a shocrú, má " +"tá cuntas ann leis an ríomhphost a chuir tú isteach. Ba cheart duit iad a " +"fháil go luath." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"Mura bhfaigheann tú ríomhphost, cinntigh le do thoil gur chuir tú isteach an " +"seoladh ar chláraigh tú leis, agus seiceáil d’fhillteán turscair." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" +"Tá an ríomhphost seo á fháil agat toisc gur iarr tú athshocrú pasfhocail do " +"do chuntas úsáideora ag %(site_name)s." msgid "Please go to the following page and choose a new password:" msgstr "" "Le do thoil té go dtí an leathanach a leanúint agus roghmaigh focal faire " "nua:" -msgid "Your username, in case you've forgotten:" -msgstr "Do ainm úsaideoir, má tá dearmad déanta agat." +msgid "Your username, in case you’ve forgotten:" +msgstr "D’ainm úsáideora, ar eagla go bhfuil dearmad déanta agat ar:" msgid "Thanks for using our site!" msgstr "Go raibh maith agat le hadhaigh do cuairt!" @@ -674,9 +764,11 @@ msgid "The %(site_name)s team" msgstr "Foireann an %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Dearmad déanta agat ar do phasfhocal? Cuir isteach do sheoladh ríomhphoist " +"thíos, agus seolfaimid treoracha ríomhphoist chun ceann nua a shocrú." msgid "Email address:" msgstr "Seoladh ríomhphoist:" @@ -684,6 +776,9 @@ msgstr "Seoladh ríomhphoist:" msgid "Reset my password" msgstr "Athsocraigh mo focal faire" +msgid "Select all objects on this page for an action" +msgstr "Roghnaigh gach oibiacht ar an leathanach seo le haghaidh gnímh" + msgid "All dates" msgstr "Gach dáta" @@ -697,7 +792,7 @@ msgstr "Roghnaigh %s a athrú" #, python-format msgid "Select %s to view" -msgstr "" +msgstr "Roghnaigh %s le féachaint" msgid "Date:" msgstr "Dáta:" diff --git a/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo index ee000e278fc1..e46bd504c65c 100644 Binary files a/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po index ce0a412d1072..6f6e50dcc21a 100644 --- a/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ga/LC_MESSAGES/djangojs.po @@ -1,6 +1,7 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Aindriú Mac Giolla Eoin, 2024 # Jannis Leidel , 2011 # Luke Blaney , 2019 # Michael Thornhill , 2011-2012,2015 @@ -8,10 +9,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-06-22 21:36+0000\n" -"Last-Translator: Luke Blaney \n" -"Language-Team: Irish (http://www.transifex.com/django/django/language/ga/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:59+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin, 2024\n" +"Language-Team: Irish (http://app.transifex.com/django/django/language/ga/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -66,6 +67,11 @@ msgstr "" "roghnaionn tú cuid acu sa bhosca thíos agus ansin cliceáil ar an saighead " "\"Bain\" idir an dá boscaí." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"Clóscríobh isteach sa bhosca seo chun liosta na %s roghnaithe a scagadh." + msgid "Remove all" msgstr "Scrois gach ceann" @@ -73,6 +79,15 @@ msgstr "Scrois gach ceann" msgid "Click to remove all chosen %s at once." msgstr "Cliceáil anseo chun %s go léir roghnaithe a scroiseadh." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "Níl an rogha roghnaithe %s le feiceáil" +msgstr[1] "Níl %s roghanna roghnaithe le feiceáil" +msgstr[2] "Níl %s roghanna roghnaithe le feiceáil" +msgstr[3] "Níl %s roghanna roghnaithe le feiceáil" +msgstr[4] "Níl %s roghanna roghnaithe le feiceáil" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s roghnaithe" @@ -89,20 +104,21 @@ msgstr "" "gníomh, caillfidh tú do chuid aithrithe." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Tá gníomh roghnaithe agat, ach níl do aithrithe sabhailte ar cuid de na " -"réímse. Clic OK chun iad a sábháil. Caithfidh tú an gníomh a rith arís." +"Tá gníomh roghnaithe agat, ach níor shábháil tú d'athruithe ar réimsí aonair " +"fós. Cliceáil OK le do thoil a shábháil. Beidh ort an t-aicsean a rith arís." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Tá gníomh roghnaithe agat, ach níl do aithrithe sabhailte ar cuid de na " -"réímse. Is dócha go bhfuil tú ag iarraidh an cnaipe Té ná an cnaipe Sábháil." +"Tá gníomh roghnaithe agat, agus níl aon athruithe déanta agat ar réimsí " +"aonair. Is dócha go bhfuil an cnaipe Téigh á lorg agat seachas an cnaipe " +"Sábháil." msgid "Now" msgstr "Anois" @@ -199,6 +215,103 @@ msgstr "Samhain" msgid "December" msgstr "Nollaig" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Ean" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feabh" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Már" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Aib" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Beal" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Meith" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Lúil" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Lún" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Meán Fóm" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Deireadh Fóm" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Sam" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Noll" + +msgid "Sunday" +msgstr "Domhnach" + +msgid "Monday" +msgstr "Dé Luain" + +msgid "Tuesday" +msgstr "Dé Máirt" + +msgid "Wednesday" +msgstr "Dé Céadaoin" + +msgid "Thursday" +msgstr "Déardaoin" + +msgid "Friday" +msgstr "Dé hAoine" + +msgid "Saturday" +msgstr "Dé Sathairn" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Dom" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Lua" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Mái" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Céa" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Déa" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Aoi" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sat" + msgctxt "one letter Sunday" msgid "S" msgstr "D" @@ -226,9 +339,3 @@ msgstr "A" msgctxt "one letter Saturday" msgid "S" msgstr "S" - -msgid "Show" -msgstr "Taispeán" - -msgid "Hide" -msgstr "Folaigh" diff --git a/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo b/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo index cc210211c84e..3807caa45aec 100644 Binary files a/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/gd/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/gd/LC_MESSAGES/django.po b/django/contrib/admin/locale/gd/LC_MESSAGES/django.po index 9fd3338d2346..030f4b64ccd7 100644 --- a/django/contrib/admin/locale/gd/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/gd/LC_MESSAGES/django.po @@ -1,15 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: -# GunChleoc, 2015-2017 +# GunChleoc, 2015-2017,2021 # GunChleoc, 2015 # GunChleoc, 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-13 12:51+0000\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-10-27 12:57+0000\n" "Last-Translator: GunChleoc\n" "Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" "language/gd/)\n" @@ -20,6 +20,10 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " "(n > 2 && n < 20) ? 2 : 3;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Sguab às na %(verbose_name_plural)s a chaidh a thaghadh" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Chaidh %(count)d %(items)s a sguabadh às." @@ -31,10 +35,6 @@ msgstr "Chan urrainn dhuinn %(name)s a sguabadh às" msgid "Are you sure?" msgstr "A bheil thu cinnteach?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Sguab às na %(verbose_name_plural)s a chaidh a thaghadh" - msgid "Administration" msgstr "Rianachd" @@ -71,6 +71,12 @@ msgstr "Gun cheann-là" msgid "Has date" msgstr "Tha ceann-là aige" +msgid "Empty" +msgstr "Falamh" + +msgid "Not empty" +msgstr "Neo-fhalamh" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -345,6 +351,19 @@ msgstr "Tagh a h-uile %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Falamhaich an taghadh" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modailean ann an aplacaid %(name)s" + +msgid "Add" +msgstr "Cuir ris" + +msgid "View" +msgstr "Seall" + +msgid "You don’t have permission to view or edit anything." +msgstr "Chan eil cead agad gus dad a shealltainn no a dheasachadh." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -395,6 +414,9 @@ msgstr "Seall e air an làrach" msgid "Filter" msgstr "Criathraich" +msgid "Clear all filters" +msgstr "Falamhaich gach crithrag" + msgid "Remove from sorting" msgstr "Thoir air falbh on t-seòrsachadh" @@ -474,9 +496,6 @@ msgstr "" "sguabadh às? Thèid a h-uile oibseact seo ’s na nithean dàimheach aca a " "sguabadh às:" -msgid "View" -msgstr "Seall" - msgid "Delete?" msgstr "A bheil thu airson a sguabadh às?" @@ -487,16 +506,6 @@ msgstr " le %(filter_title)s " msgid "Summary" msgstr "Gearr-chunntas" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modailean ann an aplacaid %(name)s" - -msgid "Add" -msgstr "Cuir ris" - -msgid "You don’t have permission to view or edit anything." -msgstr "Chan eil cead agad gus dad a shealltainn no a dheasachadh." - msgid "Recent actions" msgstr "Gnìomhan o chionn goirid" @@ -530,6 +539,15 @@ msgid "Forgotten your password or username?" msgstr "" "An do dhìochuimhnich thu am facal-faire no an t-ainm-cleachdaiche agad?" +msgid "Toggle navigation" +msgstr "Toglaich an t-seòladaireachd" + +msgid "Start typing to filter…" +msgstr "Tòisich air sgrìobhadh airson criathradh…" + +msgid "Filter navigation items" +msgstr "Criathraich nithean na seòladaireachd" + msgid "Date/time" msgstr "Ceann-là ’s àm" @@ -597,7 +615,7 @@ msgstr "Cuir %(model)s eile ris" msgid "Delete selected %(model)s" msgstr "Sguab às a’ %(model)s a thagh thu" -msgid "Thanks for spending some quality time with the Web site today." +msgid "Thanks for spending some quality time with the web site today." msgstr "" "Mòran taing gun do chuir thu seachad deagh-àm air an làrach-lìn an-diugh." diff --git a/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo index e7c0103c2285..661e42e282d6 100644 Binary files a/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po index f198aa452e31..f8b6c1f73820 100644 --- a/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/gd/LC_MESSAGES/djangojs.po @@ -3,12 +3,13 @@ # Translators: # GunChleoc, 2015-2016 # GunChleoc, 2015 +# GunChleoc, 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-22 17:29+0000\n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-07-15 10:43+0000\n" "Last-Translator: GunChleoc\n" "Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/" "language/gd/)\n" @@ -89,8 +90,8 @@ msgstr "" "shàbhaladh air chall." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Thagh thu gnìomh ach cha do shàbhail thu na dh’atharraich thu ann an " @@ -98,8 +99,8 @@ msgstr "" "tu an gnìomh a ruith a-rithist." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Thagh thu gnìomh agus cha do rinn thu atharrachadh air ran fa leth sam bith. " @@ -202,6 +203,54 @@ msgstr "An t-Samhain" msgid "December" msgstr "An Dùbhlachd" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Faoi" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Gearr" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Màrt" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Gibl" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Cèit" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Ògmh" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Iuch" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Lùna" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sult" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Dàmh" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Samh" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dùbh" + msgctxt "one letter Sunday" msgid "S" msgstr "Dò" diff --git a/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo b/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo index 7cf4d84c7880..daddcd3ea4ce 100644 Binary files a/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/gl/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/gl/LC_MESSAGES/django.po b/django/contrib/admin/locale/gl/LC_MESSAGES/django.po index 47f1115c9c9f..0e4facab49dd 100644 --- a/django/contrib/admin/locale/gl/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/gl/LC_MESSAGES/django.po @@ -1,21 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Denís Bermúdez Delgado , 2021 # fasouto , 2011-2012 # fonso , 2011,2013 # fasouto , 2017 # Jannis Leidel , 2011 # Leandro Regueiro , 2013 -# Oscar Carballal , 2011-2012 +# 948a55bc37dd6d642f1875bb84258fff_07a28cc , 2011-2012 # Pablo, 2015 +# X Bello , 2023-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: fasouto \n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: X Bello , 2023-2024\n" +"Language-Team: Galician (http://app.transifex.com/django/django/language/" "gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,21 +25,21 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Borrar %(verbose_name_plural)s seleccionados." + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Borrado exitosamente %(count)d %(items)s" #, python-format msgid "Cannot delete %(name)s" -msgstr "Non foi posíbel eliminar %(name)s" +msgstr "Non foi posíble eliminar %(name)s" msgid "Are you sure?" msgstr "¿Está seguro?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Borrar %(verbose_name_plural)s seleccionados." - msgid "Administration" msgstr "Administración" @@ -74,6 +76,12 @@ msgstr "Sen data" msgid "Has date" msgstr "Ten data" +msgid "Empty" +msgstr "Baleiro" + +msgid "Not empty" +msgstr "Non baleiro" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -92,6 +100,15 @@ msgstr "Engadir outro %(verbose_name)s" msgid "Remove" msgstr "Retirar" +msgid "Addition" +msgstr "Engadido" + +msgid "Change" +msgstr "Modificar" + +msgid "Deletion" +msgstr "Borrado" + msgid "action time" msgstr "hora da acción" @@ -99,13 +116,13 @@ msgid "user" msgstr "usuario" msgid "content type" -msgstr "" +msgstr "tipo de contido" msgid "object id" msgstr "id do obxecto" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "repr do obxecto" @@ -122,41 +139,41 @@ msgid "log entries" msgstr "entradas de rexistro" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Engadido \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Engadido %(object)s" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Modificados \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Cambiado “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Borrados \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Eliminado “%(object)s.”" msgid "LogEntry Object" msgstr "Obxecto LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" +msgid "Added {name} “{object}”." +msgstr "Engadido {name} “{object}”." msgid "Added." -msgstr "Engadido" +msgstr "Engadido." msgid "and" msgstr "e" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" +msgid "Changed {fields} for {name} “{object}”." +msgstr "Cambiados {fields} por {name} “{object}”." #, python-brace-format msgid "Changed {fields}." -msgstr "" +msgstr "Cambiados {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" +msgid "Deleted {name} “{object}”." +msgstr "Eliminado {name} “{object}”." msgid "No fields changed." msgstr "Non se modificou ningún campo." @@ -164,57 +181,60 @@ msgstr "Non se modificou ningún campo." msgid "None" msgstr "Ningún" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +" Para seleccionar máis dunha entrada, manteña premida a tecla “Control”, ou " +"“Comando” nun Mac." -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" +msgid "Select this object for an action - {}" +msgstr "Seleccione este obxeto para unha acción - {}" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" +msgid "The {name} “{obj}” was added successfully." +msgstr "Engadiuse correctamente {name} “{obj}”." + +msgid "You may edit it again below." +msgstr "Pode editalo outra vez abaixo." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"Engadiuse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "Modificouse correctamente {name} “{obj}”. Pode editalo de novo abaixo." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"Modificouse correctamente {name} “{obj}”. Pode engadir outro {name} abaixo." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "Modificouse correctamente {name} “{obj}”." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" -"Deb seleccionar ítems para poder facer accións con eles. Ningún ítem foi " +"Debe seleccionar ítems para poder facer accións con eles. Ningún ítem foi " "cambiado." msgid "No action selected." msgstr "Non se elixiu ningunha acción." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Eliminouse correctamente o/a %(name)s \"%(obj)s\"." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "Eliminouse correctamente %(name)s “%(obj)s”." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "Non existe %(name)s ca ID “%(key)s”. Ó mellor foi borrado?" #, python-format msgid "Add %s" @@ -224,6 +244,10 @@ msgstr "Engadir %s" msgid "Change %s" msgstr "Modificar %s" +#, python-format +msgid "View %s" +msgstr "Ver %s" + msgid "Database error" msgstr "Erro da base de datos" @@ -247,17 +271,20 @@ msgstr "0 de %(cnt)s seleccionados." msgid "Change history: %s" msgstr "Histórico de cambios: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" -msgstr "" +msgstr "%(class_name)s %(instance)s" #, python-format msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" +"O borrado de %(class_name)s %(instance)s precisaría borrar os seguintes " +"obxetos relacionados: %(related_objects)s" msgid "Django site admin" msgstr "Administración de sitio Django" @@ -278,7 +305,7 @@ msgstr "administración de %(app)s " msgid "Page not found" msgstr "Páxina non atopada" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Sentímolo, pero non se atopou a páxina solicitada." msgid "Home" @@ -294,7 +321,7 @@ msgid "Server Error (500)" msgstr "Erro no servidor (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Ocorreu un erro. Os administradores do sitio foron informados por email e " @@ -316,8 +343,24 @@ msgstr "Seleccionar todos os %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Limpar selección" +msgid "Breadcrumbs" +msgstr "Migas de pan" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos na aplicación %(name)s" + +msgid "Add" +msgstr "Engadir" + +msgid "View" +msgstr "Vista" + +msgid "You don’t have permission to view or edit anything." +msgstr "Non ten permiso para ver ou editar nada." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Primeiro insira un nome de usuario e un contrasinal. Despois poderá editar " @@ -329,17 +372,35 @@ msgstr "Introduza un nome de usuario e contrasinal." msgid "Change password" msgstr "Cambiar contrasinal" -msgid "Please correct the error below." -msgstr "Corrixa os erros de embaixo." +msgid "Set password" +msgstr "Configurar contrasinal" -msgid "Please correct the errors below." -msgstr "Por favor, corrixa os erros de embaixo" +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor corrixa o erro de abaixo." +msgstr[1] "Por favor corrixa o erro de abaixo." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Insira un novo contrasinal para o usuario %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Esta acción vai habilitar a autentificación basada en " +"contrasinal para este usuario." + +msgid "Disable password-based authentication" +msgstr "Deshabilitar a autentificación basada en contrasinal" + +msgid "Enable password-based authentication" +msgstr "Habilitar a autentificación basada en contrasinal" + +msgid "Skip to main content" +msgstr "Saltar ó contido principal" + msgid "Welcome," msgstr "Benvido," @@ -365,6 +426,15 @@ msgstr "Ver no sitio" msgid "Filter" msgstr "Filtro" +msgid "Hide counts" +msgstr "Agochar contas" + +msgid "Show counts" +msgstr "Amosar contas" + +msgid "Clear all filters" +msgstr "Borrar tódolos filtros" + msgid "Remove from sorting" msgstr "Eliminar da clasificación" @@ -375,6 +445,15 @@ msgstr "Prioridade de clasificación: %(priority_number)s" msgid "Toggle sorting" msgstr "Activar clasificación" +msgid "Toggle theme (current theme: auto)" +msgstr "Escoller tema (tema actual: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Escoller tema (tema actual: claro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Escoller tema (tema actual: escuro)" + msgid "Delete" msgstr "Eliminar" @@ -407,11 +486,11 @@ msgstr "" msgid "Objects" msgstr "Obxectos" -msgid "Yes, I'm sure" -msgstr "Si, estou seguro" +msgid "Yes, I’m sure" +msgstr "Sí, estou seguro" msgid "No, take me back" -msgstr "" +msgstr "Non, lévame de volta" msgid "Delete multiple objects" msgstr "Eliminar múltiples obxectos" @@ -443,9 +522,6 @@ msgstr "" "Serán eliminados todos os seguintes obxectos e elementos relacionados on " "eles:" -msgid "Change" -msgstr "Modificar" - msgid "Delete?" msgstr "¿Eliminar?" @@ -454,17 +530,7 @@ msgid " By %(filter_title)s " msgstr " Por %(filter_title)s " msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicación %(name)s" - -msgid "Add" -msgstr "Engadir" - -msgid "You don't have permission to edit anything." -msgstr "Non ten permiso para editar nada." +msgstr "Sumario" msgid "Recent actions" msgstr "Accións recentes" @@ -475,11 +541,20 @@ msgstr "As miñas accións" msgid "None available" msgstr "Ningunha dispoñíbel" +msgid "Added:" +msgstr "Engadido:" + +msgid "Changed:" +msgstr "Modificado:" + +msgid "Deleted:" +msgstr "Eliminado:" + msgid "Unknown content" msgstr "Contido descoñecido" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -492,10 +567,24 @@ msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" +"Está identificado como %(username)s, pero non está autorizado para acceder a " +"esta páxina. Gustaríalle identificarse con una conta diferente?" msgid "Forgotten your password or username?" msgstr "¿Olvidou o usuario ou contrasinal?" +msgid "Toggle navigation" +msgstr "Activar navegación" + +msgid "Sidebar" +msgstr "Barra lateral" + +msgid "Start typing to filter…" +msgstr "Comece a escribir para filtrar…" + +msgid "Filter navigation items" +msgstr "Filtrar ítems de navegación" + msgid "Date/time" msgstr "Data/hora" @@ -505,8 +594,13 @@ msgstr "Usuario" msgid "Action" msgstr "Acción" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrada" +msgstr[1] "entradas" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Este obxecto non ten histórico de cambios. Posibelmente non se creou usando " @@ -518,20 +612,8 @@ msgstr "Amosar todo" msgid "Save" msgstr "Gardar" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "Engadir outro %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" +msgid "Popup closing…" +msgstr "Pechando popup…" msgid "Search" msgstr "Busca" @@ -555,7 +637,29 @@ msgstr "Gardar e engadir outro" msgid "Save and continue editing" msgstr "Gardar e seguir modificando" -msgid "Thanks for spending some quality time with the Web site today." +msgid "Save and view" +msgstr "Gardar e ver" + +msgid "Close" +msgstr "Pechar" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Cambiar %(model)s seleccionado" + +#, python-format +msgid "Add another %(model)s" +msgstr "Engadir outro %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Eliminar %(model)s seleccionado" + +#, python-format +msgid "View selected %(model)s" +msgstr "Ver %(model)s seleccionado" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Grazas polo tempo que dedicou ao sitio web." msgid "Log in again" @@ -568,11 +672,12 @@ msgid "Your password was changed." msgstr "Cambiouse o seu contrasinal." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Por razóns de seguridade, introduza o contrasinal actual. Despois introduza " -"dúas veces o contrasinal para verificarmos que o escribiu correctamente." +"Por razóns de seguridade, introduza o contrasinal actual, e despois " +"introduza o novo contrasinal dúas veces para verificar que o escribiu " +"correctamente." msgid "Change my password" msgstr "Cambiar o contrasinal" @@ -609,14 +714,18 @@ msgstr "" "usada. Por favor pida un novo reseteo da contrasinal." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Acabamos de enviarlle as instrucións para configurar o contrasinal ao " +"enderezo de email que nos indicou. Debería recibilas axiña." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"Se non recibe un email, por favor asegúrese de que escribiu a dirección ca " +"que se rexistrou, e comprobe a carpeta de spam." #, python-format msgid "" @@ -629,7 +738,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Por favor vaia á seguinte páxina e elixa una nova contrasinal:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "No caso de que o esquecese, o seu nome de usuario é:" msgid "Thanks for using our site!" @@ -640,7 +749,7 @@ msgid "The %(site_name)s team" msgstr "O equipo de %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Esqueceu o contrasinal? Insira o seu enderezo de email embaixo e " @@ -652,6 +761,9 @@ msgstr "Enderezo de correo electrónico:" msgid "Reset my password" msgstr "Recuperar o meu contrasinal" +msgid "Select all objects on this page for an action" +msgstr "Seleccione tódolos obxetos desta páxina para unha acción" + msgid "All dates" msgstr "Todas as datas" @@ -663,6 +775,10 @@ msgstr "Seleccione un/unha %s" msgid "Select %s to change" msgstr "Seleccione %s que modificar" +#, python-format +msgid "Select %s to view" +msgstr "Seleccione %s para ver" + msgid "Date:" msgstr "Data:" diff --git a/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo index fefbe0d1af3b..0fcb774aa8dd 100644 Binary files a/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po index 2df9fa03df57..b414adc8de35 100644 --- a/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/gl/LC_MESSAGES/djangojs.po @@ -5,14 +5,15 @@ # fonso , 2011,2013 # Jannis Leidel , 2011 # Leandro Regueiro , 2013 +# X Bello , 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Galician (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: X Bello , 2023\n" +"Language-Team: Galician (http://app.transifex.com/django/django/language/" "gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,6 +67,10 @@ msgstr "" "caixa inferior e a continuación facendo clic na frecha \"Eliminar\" situada " "entre as dúas caixas." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Escriba nesta caixa para filtrar a lista de %s seleccionados." + msgid "Remove all" msgstr "Retirar todos" @@ -73,6 +78,12 @@ msgstr "Retirar todos" msgid "Click to remove all chosen %s at once." msgstr "Faga clic para eliminar da lista todos/as os/as '%s' escollidos/as." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opción seleccionada non visible" +msgstr[1] "%s opcións seleccionadas non visibles" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s escollido" @@ -86,43 +97,25 @@ msgstr "" "acción, os cambios non gardados perderanse." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Escolleu unha acción, pero aínda non gardou os cambios nos campos " "individuais. Prema OK para gardar. Despois terá que volver executar a acción." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Escolleu unha acción, pero aínda non gardou os cambios nos campos " -"individuais. Probabelmente estea buscando o botón Ir no canto do botón " +"individuais. Probablemente estea buscando o botón Ir no canto do botón " "Gardar." -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - msgid "Now" msgstr "Agora" -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Escolla unha hora" - msgid "Midnight" msgstr "Medianoite" @@ -133,7 +126,25 @@ msgid "Noon" msgstr "Mediodía" msgid "6 p.m." -msgstr "" +msgstr "6 da tarde" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Nota: Está %s hora por diante da hora do servidor." +msgstr[1] "Nota: Está %s horas por diante da hora do servidor." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Nota: Está %s hora por detrás da hora do servidor." +msgstr[1] "Nota: Está %s horas por detrás da hora do servidor." + +msgid "Choose a Time" +msgstr "Escolla unha Hora" + +msgid "Choose a time" +msgstr "Escolla unha hora" msgid "Cancel" msgstr "Cancelar" @@ -142,7 +153,7 @@ msgid "Today" msgstr "Hoxe" msgid "Choose a Date" -msgstr "" +msgstr "Escolla unha Data" msgid "Yesterday" msgstr "Onte" @@ -151,68 +162,165 @@ msgid "Tomorrow" msgstr "Mañá" msgid "January" -msgstr "" +msgstr "Xaneiro" msgid "February" -msgstr "" +msgstr "Febreiro" msgid "March" -msgstr "" +msgstr "Marzo" msgid "April" -msgstr "" +msgstr "Abril" msgid "May" -msgstr "" +msgstr "Maio" msgid "June" -msgstr "" +msgstr "Xuño" msgid "July" -msgstr "" +msgstr "Xullo" msgid "August" -msgstr "" +msgstr "Agosto" msgid "September" -msgstr "" +msgstr "Setembro" msgid "October" -msgstr "" +msgstr "Outubro" msgid "November" -msgstr "" +msgstr "Novembro" msgid "December" -msgstr "" +msgstr "Decembro" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Xan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maio" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Xuñ" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Xul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Set" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Out" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Monday" +msgstr "Luns" + +msgid "Tuesday" +msgstr "Martes" + +msgid "Wednesday" +msgstr "Mércores" + +msgid "Thursday" +msgstr "Xoves" + +msgid "Friday" +msgstr "Venres" + +msgid "Saturday" +msgstr "Sábado" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Domingo" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Lun" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Mar" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Mér" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Xov" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Ven" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sáb" msgctxt "one letter Sunday" msgid "S" -msgstr "" +msgstr "D" msgctxt "one letter Monday" msgid "M" -msgstr "" +msgstr "L" msgctxt "one letter Tuesday" msgid "T" -msgstr "" +msgstr "M" msgctxt "one letter Wednesday" msgid "W" -msgstr "" +msgstr "M" msgctxt "one letter Thursday" msgid "T" -msgstr "" +msgstr "X" msgctxt "one letter Friday" msgid "F" -msgstr "" +msgstr "V" msgctxt "one letter Saturday" msgid "S" -msgstr "" +msgstr "S" msgid "Show" msgstr "Amosar" diff --git a/django/contrib/admin/locale/he/LC_MESSAGES/django.mo b/django/contrib/admin/locale/he/LC_MESSAGES/django.mo index 6803b9cf7592..d0993f171c3f 100644 Binary files a/django/contrib/admin/locale/he/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/he/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/he/LC_MESSAGES/django.po b/django/contrib/admin/locale/he/LC_MESSAGES/django.po index e5315484b917..136ffff288c7 100644 --- a/django/contrib/admin/locale/he/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/he/LC_MESSAGES/django.po @@ -1,17 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Alex Gaynor , 2011 +# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2011 # Jannis Leidel , 2011 -# Meir Kriheli , 2011-2015,2017,2019 +# Meir Kriheli , 2011-2015,2017,2019-2020,2023 +# Menachem G., 2021 +# Yaron Shahrabani , 2020-2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-03-19 16:40+0000\n" -"Last-Translator: Meir Kriheli \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: Meir Kriheli , " +"2011-2015,2017,2019-2020,2023\n" +"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,6 +22,10 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % " "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "מחק %(verbose_name_plural)s שנבחרו" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s נמחקו בהצלחה." @@ -28,17 +35,13 @@ msgid "Cannot delete %(name)s" msgstr "לא ניתן למחוק %(name)s" msgid "Are you sure?" -msgstr "האם את/ה בטוח/ה ?" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "מחק %(verbose_name_plural)s שנבחרו" +msgstr "להמשיך?" msgid "Administration" msgstr "ניהול" msgid "All" -msgstr "הכל" +msgstr "הכול" msgid "Yes" msgstr "כן" @@ -70,6 +73,12 @@ msgstr "ללא תאריך" msgid "Has date" msgstr "עם תאריך" +msgid "Empty" +msgstr "ריק" + +msgid "Not empty" +msgstr "לא ריק" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -127,23 +136,23 @@ msgid "log entries" msgstr "רישומי יומן" #, python-format -msgid "Added \"%(object)s\"." -msgstr "בוצעה הוספת \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "„%(object)s” נוסף." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "בוצע שינוי \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "בוצע שינוי \"%(object)s\" — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "בוצעה מחיקת \"%(object)s\"." +msgid "Deleted “%(object)s.”" +msgstr "„%(object)s” נמחקו." msgid "LogEntry Object" msgstr "אובייקט LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "בוצעה הוספת {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "בוצעה הוספת {name} “{object}”." msgid "Added." msgstr "נוסף." @@ -152,16 +161,16 @@ msgid "and" msgstr "ו" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "בוצע שינוי {fields} עבור {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "בוצע שינוי {fields} עבור {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr " {fields} שונו." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "בוצעה מחיקת {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "בוצעה מחיקת {name} “{object}”." msgid "No fields changed." msgstr "אף שדה לא השתנה." @@ -169,42 +178,41 @@ msgstr "אף שדה לא השתנה." msgid "None" msgstr "ללא" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" -"יש להחזיק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "יש להחזיק \"Control\" או \"Command\" במק, כדי לבחור יותר מאחד." + +msgid "Select this object for an action - {}" +msgstr "בחירת אובייקט זה עבור פעולה - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה." +msgid "The {name} “{obj}” was added successfully." +msgstr "הוספת {name} “{obj}” בוצעה בהצלחה." msgid "You may edit it again below." msgstr "ניתן לערוך שוב מתחת." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה. ניתן להוסיף עוד {name} מתחת.." +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "הוספת {name} “{obj}” בוצעה בהצלחה. ניתן להוסיף עוד {name} מתחת." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "עדכון {name} \"{obj}\" " +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "שינוי {name} “{obj}” בוצע בהצלחה. ניתן לערוך שוב מתחת." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "הוספת {name} \"{obj}\" בוצעה בהצלחה. ניתן לערוך שוב מתחת." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "הוספת {name} “{obj}” בוצעה בהצלחה. ניתן לערוך שוב מתחת." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "עדכון {name} \"{obj}\" בוצע בהצלחה. ניתן להוסיף עוד {name} מתחת." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "שינוי {name} \"{obj}\" בוצע בהצלחה." msgid "" @@ -216,11 +224,11 @@ msgid "No action selected." msgstr "לא נבחרה פעולה." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "מחיקת %(name)s “%(obj)s” בוצעה בהצלחה." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "%(name)s עם ID \"%(key)s\" לא במצאי. אולי זה נמחק?" #, python-format @@ -262,8 +270,9 @@ msgstr "0 מ %(cnt)s נבחרים" msgid "Change history: %s" msgstr "היסטוריית שינוי: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -295,8 +304,8 @@ msgstr "ניהול %(app)s" msgid "Page not found" msgstr "דף לא קיים" -msgid "We're sorry, but the requested page could not be found." -msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש." +msgid "We’re sorry, but the requested page could not be found." +msgstr "אנו מתנצלים, העמוד המבוקש אינו קיים." msgid "Home" msgstr "דף הבית" @@ -311,7 +320,7 @@ msgid "Server Error (500)" msgstr "שגיאת שרת (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך." @@ -332,12 +341,28 @@ msgstr "בחירת כל %(total_count)s ה־%(module_name)s" msgid "Clear selection" msgstr "איפוס בחירה" +msgid "Breadcrumbs" +msgstr "פירורי לחם" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "מודלים ביישום %(name)s" + +msgid "Add" +msgstr "הוספה" + +msgid "View" +msgstr "צפיה" + +msgid "You don’t have permission to view or edit anything." +msgstr "אין לך כלל הרשאות צפיה או עריכה." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"ראשית יש להזין שם משתמש וסיסמה. לאחר מכן יהיה ביכולתך לערוך אפשרויות נוספות " -"עבור המשתמש." +"ראשית יש להזין שם משתמש וססמה. לאחר מכן ניתן יהיה לערוך אפשרויות משתמש " +"נוספות." msgid "Enter a username and password." msgstr "נא לשים שם משתמש וסיסמה." @@ -346,15 +371,19 @@ msgid "Change password" msgstr "שינוי סיסמה" msgid "Please correct the error below." -msgstr "נא לתקן את השגיאה מתחת." - -msgid "Please correct the errors below." -msgstr "נא לתקן את השגיאות מתחת." +msgid_plural "Please correct the errors below." +msgstr[0] "נא לתקן את השגיאה מתחת." +msgstr[1] "נא לתקן את השגיאות מתחת." +msgstr[2] "נא לתקן את השגיאות מתחת." +msgstr[3] "נא לתקן את השגיאות מתחת." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "יש להזין סיסמה חדשה עבור המשתמש %(username)s." +msgid "Skip to main content" +msgstr "דילוג לתוכן העיקרי" + msgid "Welcome," msgstr "שלום," @@ -380,6 +409,15 @@ msgstr "צפיה באתר" msgid "Filter" msgstr "סינון" +msgid "Hide counts" +msgstr "הסתרת ספירות" + +msgid "Show counts" +msgstr "הצגת ספירות" + +msgid "Clear all filters" +msgstr "ניקוי כל הסינונים" + msgid "Remove from sorting" msgstr "הסרה ממיון" @@ -390,6 +428,15 @@ msgstr "עדיפות מיון: %(priority_number)s" msgid "Toggle sorting" msgstr "החלף כיוון מיון" +msgid "Toggle theme (current theme: auto)" +msgstr "החלפת ערכת נושא (נוכחית: אוטומטית)" + +msgid "Toggle theme (current theme: light)" +msgstr "החלפת ערכת נושא (נוכחית: בהירה)" + +msgid "Toggle theme (current theme: dark)" +msgstr "החלפת ערכת נושא (נוכחית: כהה)" + msgid "Delete" msgstr "מחיקה" @@ -421,8 +468,8 @@ msgstr "" msgid "Objects" msgstr "אובייקטים" -msgid "Yes, I'm sure" -msgstr "כן, אני בטוח/ה" +msgid "Yes, I’m sure" +msgstr "כן, בבטחה" msgid "No, take me back" msgstr "לא, קח אותי חזרה." @@ -455,9 +502,6 @@ msgstr "" "האם אתה בטוח שאתה רוצה למחוק את ה%(objects_name)s הנבחר? כל האובייקטים הבאים " "ופריטים הקשורים להם יימחקו:" -msgid "View" -msgstr "צפיה" - msgid "Delete?" msgstr "מחיקה ?" @@ -468,16 +512,6 @@ msgstr " לפי %(filter_title)s " msgid "Summary" msgstr "סיכום" -#, python-format -msgid "Models in the %(name)s application" -msgstr "מודלים ביישום %(name)s" - -msgid "Add" -msgstr "הוספה" - -msgid "You don't have permission to view or edit anything." -msgstr "אין לך הרשאות לצפיה או עריכה." - msgid "Recent actions" msgstr "פעולות אחרונות" @@ -487,16 +521,25 @@ msgstr "הפעולות שלי" msgid "None available" msgstr "לא נמצאו" +msgid "Added:" +msgstr "נוספו:" + +msgid "Changed:" +msgstr "שונו:" + +msgid "Deleted:" +msgstr "נמחקו:" + msgid "Unknown content" msgstr "תוכן לא ידוע" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים " -"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים." +"משהו שגוי בהתקנת בסיס הנתונים שלך. יש לוודא יצירת הטבלאות המתאימות וקיום " +"הרשאות קריאה על בסיס הנתונים עבור המשתמש המתאים." #, python-format msgid "" @@ -509,6 +552,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "שכחת את שם המשתמש והסיסמה שלך ?" +msgid "Toggle navigation" +msgstr "החלפת מצב סרגל ניווט" + +msgid "Sidebar" +msgstr "סרגל צד" + +msgid "Start typing to filter…" +msgstr "התחל להקליד כדי לסנן..." + +msgid "Filter navigation items" +msgstr "סנן פריטי ניווט" + msgid "Date/time" msgstr "תאריך/שעה" @@ -518,11 +573,17 @@ msgstr "משתמש" msgid "Action" msgstr "פעולה" +msgid "entry" +msgid_plural "entries" +msgstr[0] "רשומה" +msgstr[1] "רשומה" +msgstr[2] "רשומות" +msgstr[3] "רשומות" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." -msgstr "" -"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו." +msgstr "לאובייקט זה אין היסטוריית שינויים. כנראה לא נוסף דרך ממשק הניהול." msgid "Show all" msgstr "הצג הכל" @@ -575,7 +636,11 @@ msgstr "הוספת %(model)s נוסף." msgid "Delete selected %(model)s" msgstr "מחיקת %(model)s הנבחר." -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "צפיה ב%(model)s אשר נבחרו." + +msgid "Thanks for spending some quality time with the web site today." msgstr "תודה על בילוי זמן איכות עם האתר." msgid "Log in again" @@ -588,11 +653,11 @@ msgid "Your password was changed." msgstr "סיסמתך שונתה." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"נא להזין את סיסמתך הישנה, לצרכי אבטחה, ולאחר מכן את סיסמתך החדשה פעמיים כדי " -"שנוכל לוודא שהקלדת אותה כראוי." +"נא להזין את הססמה הישנה שלך, למען האבטחה, ולאחר מכן את הססמה החדשה שלך " +"פעמיים כדי שנוכל לוודא שהקלדת אותה נכון." msgid "Change my password" msgstr "שנה את סיסמתי" @@ -625,18 +690,18 @@ msgstr "" "חדש." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"שלחנו אליך דואר אלקטרוני עם הוראות לקביעת הסיסמה, אם קיים חשבון עם כתובת " -"הדואר שהזנת. ההודעה אמור להגיע בקרוב." +"שלחנו לך הוראות לקביעת הססמה, בהנחה שקיים חשבון עם כתובת הדואר האלקטרוני " +"שהזנת. ההוראות אמורות להתקבל בקרוב." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"אם הדוא\"ל לא הגיע, נא לוודא שהזנת כתובת נכונה בעת הרישום ולבדוק את תיקיית " -"דואר הזבל." +"אם לא קיבלת דואר אלקטרוני, נא לוודא שהזנת את הכתובת שנרשמת עימה ושההודעה לא " +"נחתה בתיקיית דואר הזבל." #, python-format msgid "" @@ -649,8 +714,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:" -msgid "Your username, in case you've forgotten:" -msgstr "שם המשתמש שלך, במקרה ששכחת:" +msgid "Your username, in case you’ve forgotten:" +msgstr "שם המשתמש שלך במקרה ושכחת:" msgid "Thanks for using our site!" msgstr "תודה על השימוש באתר שלנו!" @@ -660,11 +725,11 @@ msgid "The %(site_name)s team" msgstr "צוות %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"שכחת את סיסמתך ? נא להזין את כתובת הדוא\"ל מתחת, ואנו נשלח הוראות לקביעת " -"סיסמה חדשה." +"שכחת את הססמה שלך? נא להזין את כתובת הדואר האלקטרוני מתחת ואנו נשלח הוראות " +"לקביעת ססמה חדשה." msgid "Email address:" msgstr "כתובת דוא\"ל:" @@ -672,6 +737,9 @@ msgstr "כתובת דוא\"ל:" msgid "Reset my password" msgstr "אפס את סיסמתי" +msgid "Select all objects on this page for an action" +msgstr "בחירת כל האובייקטים בעמוד זה עבור פעולה" + msgid "All dates" msgstr "כל התאריכים" diff --git a/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo index fe37ec5a8339..265d261b3b9b 100644 Binary files a/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po index 43eee285656e..1946efc77537 100644 --- a/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/he/LC_MESSAGES/djangojs.po @@ -1,17 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Alex Gaynor , 2012 +# 534b44a19bf18d20b71ecc4eb77c572f_db336e9 , 2012 # Jannis Leidel , 2011 -# Meir Kriheli , 2011-2012,2014-2015,2017 +# Meir Kriheli , 2011-2012,2014-2015,2017,2020,2023 +# Yaron Shahrabani , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Meir Kriheli \n" -"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Meir Kriheli , " +"2011-2012,2014-2015,2017,2020,2023\n" +"Language-Team: Hebrew (http://app.transifex.com/django/django/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -63,6 +65,10 @@ msgstr "" "זו רשימת %s אשר נבחרו. ניתן להסיר חלק ע\"י בחירה בתיבה מתחת ולחיצה על חץ " "\"הסרה\" בין שתי התיבות." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "ניתן להקליד בתיבה זו כדי לסנן את רשימת %s הנבחרים." + msgid "Remove all" msgstr "הסרת הכל" @@ -70,6 +76,14 @@ msgstr "הסרת הכל" msgid "Click to remove all chosen %s at once." msgstr "הסרת כל %s אשר נבחרו בבת אחת." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "אפשרות נבחרת %s אינה גלויה." +msgstr[1] "%s אפשרויות נבחרות אינן גלויות." +msgstr[2] "%s אפשרויות נבחרות אינן גלויות." +msgstr[3] "%s אפשרויות נבחרות אינן גלויות." + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s מ %(cnt)s נבחרות" @@ -85,20 +99,20 @@ msgstr "" "נשמרו יאבדו." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"בחרת פעולה, אבל עוד לא שמרת את השינויים לשדות בודדים. אנא לחץ על אישור כדי " +"בחרת פעולה, אך לא שמרת עדיין את השינויים לשדות בודדים. נא ללחוץ על אישור כדי " "לשמור. יהיה עליך להפעיל את הפעולה עוד פעם." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"בחרת פעולה, ולא עשיתה שינויימ על שדות. אתה כנראה מחפש את הכפתור ללכת במקום " -"הכפתור לשמור." +"בחרת פעולה, אך לא ביצעת שינויים בשדות. כנראה חיפשת את כפתור בצע במקום כפתור " +"שמירה." msgid "Now" msgstr "כעת" @@ -188,29 +202,126 @@ msgstr "נובמבר" msgid "December" msgstr "דצמבר" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "ינו׳" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "פבר׳" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "מרץ" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "אפר׳" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "מאי" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "יונ׳" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "יול׳" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "אוג׳" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "ספט׳" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "אוק׳" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "נוב׳" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "דצמ׳" + +msgid "Sunday" +msgstr "ראשון" + +msgid "Monday" +msgstr "שני" + +msgid "Tuesday" +msgstr "שלישי" + +msgid "Wednesday" +msgstr "רביעי" + +msgid "Thursday" +msgstr "חמישי" + +msgid "Friday" +msgstr "שישי" + +msgid "Saturday" +msgstr "שבת" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "א" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "ב" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "ג" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "ד" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "ה" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "ו" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "ש" + msgctxt "one letter Sunday" msgid "S" -msgstr "ר" +msgstr "א" msgctxt "one letter Monday" msgid "M" -msgstr "ש" +msgstr "ב" msgctxt "one letter Tuesday" msgid "T" -msgstr "ש" +msgstr "ג" msgctxt "one letter Wednesday" msgid "W" -msgstr "ר" +msgstr "ד" msgctxt "one letter Thursday" msgid "T" -msgstr "ח" +msgstr "ה" msgctxt "one letter Friday" msgid "F" -msgstr "ש" +msgstr "ו" msgctxt "one letter Saturday" msgid "S" diff --git a/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo b/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo index b8c97bb4df2e..a2c4c7d877dc 100644 Binary files a/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/hi/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/hi/LC_MESSAGES/django.po b/django/contrib/admin/locale/hi/LC_MESSAGES/django.po index 8ed2fb96b8ab..51935397b8b6 100644 --- a/django/contrib/admin/locale/hi/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/hi/LC_MESSAGES/django.po @@ -6,13 +6,14 @@ # Jannis Leidel , 2011 # Pratik , 2013 # Sandeep Satavlekar , 2011 +# Vaarun Sinha, 2022 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: Vaarun Sinha\n" "Language-Team: Hindi (http://www.transifex.com/django/django/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,9 +21,13 @@ msgstr "" "Language: hi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये " + #, python-format msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है| |" +msgstr "%(count)d %(items)s सफलतापूर्वक हटा दिया गया है |" #, python-format msgid "Cannot delete %(name)s" @@ -31,10 +36,6 @@ msgstr "%(name)s नहीं हटा सकते" msgid "Are you sure?" msgstr "क्या आप निश्चित हैं?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "चुने हुए %(verbose_name_plural)s हटा दीजिये " - msgid "Administration" msgstr "" @@ -71,6 +72,12 @@ msgstr "" msgid "Has date" msgstr "" +msgid "Empty" +msgstr "" + +msgid "Not empty" +msgstr "" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -89,8 +96,17 @@ msgstr "एक और %(verbose_name)s जोड़ें " msgid "Remove" msgstr "निकालें" +msgid "Addition" +msgstr "" + +msgid "Change" +msgstr "बदलें" + +msgid "Deletion" +msgstr "" + msgid "action time" -msgstr "कार्य समय" +msgstr "कार्य के लिए समय" msgid "user" msgstr "" @@ -99,12 +115,12 @@ msgid "content type" msgstr "" msgid "object id" -msgstr "वस्तु आई डी " +msgstr "वस्तु की आईडी " #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" -msgstr "वस्तु प्रतिनिधित्व" +msgstr "वस्तु का निरूपण" msgid "action flag" msgstr "कार्य ध्वज" @@ -119,22 +135,22 @@ msgid "log entries" msgstr "लॉग प्रविष्टियाँ" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" को जोड़ा गया." +msgid "Added “%(object)s”." +msgstr "" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "परिवर्तित \"%(object)s\" - %(changes)s " +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" को नष्ट कर दिया है." +msgid "Deleted “%(object)s.”" +msgstr "" msgid "LogEntry Object" msgstr "LogEntry ऑब्जेक्ट" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "" msgid "Added." @@ -144,7 +160,7 @@ msgid "and" msgstr "और" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "" #, python-brace-format @@ -152,7 +168,7 @@ msgid "Changed {fields}." msgstr "" #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "" msgid "No fields changed." @@ -161,38 +177,38 @@ msgstr "कोई क्षेत्र नहीं बदला" msgid "None" msgstr "कोई नहीं" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully." +msgstr "" + +msgid "You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "" msgid "" @@ -204,11 +220,11 @@ msgid "No action selected." msgstr "कोई कार्रवाई नहीं चुनी है |" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" को कामयाबी से निकाला गया है" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" #, python-format @@ -219,6 +235,10 @@ msgstr "%s बढाएं" msgid "Change %s" msgstr "%s बदलो" +#, python-format +msgid "View %s" +msgstr "" + msgid "Database error" msgstr "डेटाबेस त्रुटि" @@ -242,8 +262,9 @@ msgstr "%(cnt)s में से 0 चुने" msgid "Change history: %s" msgstr "इतिहास बदलो: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -273,8 +294,8 @@ msgstr "" msgid "Page not found" msgstr "पृष्ठ लापता" -msgid "We're sorry, but the requested page could not be found." -msgstr "क्षमा कीजिए पर निवेदित पृष्ठ लापता है ।" +msgid "We’re sorry, but the requested page could not be found." +msgstr "" msgid "Home" msgstr "गृह" @@ -289,11 +310,9 @@ msgid "Server Error (500)" msgstr "सर्वर त्रुटि (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"एक त्रुटि मिली है। इसकी जानकारी स्थल के संचालकों को डाक द्वारा दे दी गई है, और यह जल्द " -"ठीक हो जानी चाहिए। धीरज रखने के लिए शुक्रिया।" msgid "Run the selected action" msgstr "चयनित कार्रवाई चलाइये" @@ -311,21 +330,32 @@ msgstr "तमाम %(total_count)s %(module_name)s चुनें" msgid "Clear selection" msgstr "चयन खालिज किया जाये " +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s अनुप्रयोग के प्रतिरूप" + +msgid "Add" +msgstr "बढाएं" + +msgid "View" +msgstr "" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"पहले प्रदवोक्ता नाम और कूटशब्द दर्ज करें । उसके पश्चात ही आप अधिक प्रवोक्ता विकल्प बदल " -"सकते हैं ।" msgid "Enter a username and password." msgstr "उपयोगकर्ता का नाम और कूटशब्द दर्ज करें." msgid "Change password" -msgstr "कूटशब्द बदलें" +msgstr "पासवर्ड बदलें" msgid "Please correct the error below." -msgstr "कृपया नीचे पायी गयी गलतियाँ ठीक करें ।" +msgstr "" msgid "Please correct the errors below." msgstr "" @@ -359,6 +389,9 @@ msgstr "साइट पे देखें" msgid "Filter" msgstr "छन्नी" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "श्रेणीकरण से हटाये " @@ -400,8 +433,8 @@ msgstr "" msgid "Objects" msgstr "" -msgid "Yes, I'm sure" -msgstr "हाँ, मैंने पक्का तय किया हैं " +msgid "Yes, I’m sure" +msgstr "" msgid "No, take me back" msgstr "" @@ -434,9 +467,6 @@ msgstr "" "क्या आप ने पक्का तय किया हैं की चयनित %(objects_name)s को नष्ट किया जाये ? " "निम्नलिखित सभी वस्तुएं और उनसे सम्बंधित वस्तुए भी नष्ट की जाएगी:" -msgid "Change" -msgstr "बदलें" - msgid "Delete?" msgstr "मिटाएँ ?" @@ -447,16 +477,6 @@ msgstr "%(filter_title)s द्वारा" msgid "Summary" msgstr "" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s अनुप्रयोग के प्रतिरूप" - -msgid "Add" -msgstr "बढाएं" - -msgid "You don't have permission to edit anything." -msgstr "आपके पास कुछ भी संपादन करने के लिये अनुमति नहीं है ।" - msgid "Recent actions" msgstr "" @@ -470,12 +490,10 @@ msgid "Unknown content" msgstr "अज्ञात सामग्री" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"अपने डेटाबेस स्थापना के साथ कुछ गलत तो है | सुनिश्चित करें कि उचित डेटाबेस तालिका बनायीं " -"गयी है, और सुनिश्चित करें कि डेटाबेस उपयुक्त उपयोक्ता के द्वारा पठनीय है |" #, python-format msgid "" @@ -486,6 +504,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "अपना पासवर्ड या उपयोगकर्ता नाम भूल गये हैं?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "तिथि / समय" @@ -495,12 +522,16 @@ msgstr "उपभोक्ता" msgid "Action" msgstr "कार्य" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"इस वस्तु का बदलाव इतिहास नहीं है. शायद वह इस साइट व्यवस्थापक के माध्यम से नहीं जोड़ा " -"गया है." msgid "Show all" msgstr "सभी दिखाएँ" @@ -508,19 +539,7 @@ msgstr "सभी दिखाएँ" msgid "Save" msgstr "सुरक्षित कीजिये" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" +msgid "Popup closing…" msgstr "" msgid "Search" @@ -545,8 +564,30 @@ msgstr "सहेजें और एक और जोडें" msgid "Save and continue editing" msgstr "सहेजें और संपादन करें" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "आज हमारे वेब साइट पर आने के लिए धन्यवाद ।" +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "फिर से लॉगिन कीजिए" @@ -558,11 +599,9 @@ msgid "Your password was changed." msgstr "आपके कूटशब्द को बदला गया है" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"सुरक्षा कारणों के लिए कृपया पुराना कूटशब्द दर्ज करें । उसके पश्चात नए कूटशब्द को दो बार दर्ज " -"करें ताकि हम उसे सत्यापित कर सकें ।" msgid "Change my password" msgstr "कूटशब्द बदलें" @@ -595,16 +634,14 @@ msgstr "" "पुनस्थाप की आवेदन करें ।" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"अगर आपको कोई ईमेल प्राप्त नई होता है,यह ध्यान रखे की आपने सही पता रजिस्ट्रीकृत किया है " -"और आपने स्पॅम फोल्डर को जाचे|" #, python-format msgid "" @@ -617,8 +654,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "कृपया निम्नलिखित पृष्ठ पर नया कूटशब्द चुनिये :" -msgid "Your username, in case you've forgotten:" -msgstr "आपका प्रवोक्ता नाम, यदि भूल गये हों :" +msgid "Your username, in case you’ve forgotten:" +msgstr "" msgid "Thanks for using our site!" msgstr "हमारे साइट को उपयोग करने के लिए धन्यवाद ।" @@ -628,10 +665,9 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s दल" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"कूटशब्द भूल गए? नीचे अपना डाक पता भरें, वहाँ पर हम आपको नया कूटशब्द रखने के निर्देश भेजेंगे।" msgid "Email address:" msgstr "डाक पता -" @@ -650,6 +686,10 @@ msgstr "%s चुनें" msgid "Select %s to change" msgstr "%s के बदली के लिए चयन करें" +#, python-format +msgid "Select %s to view" +msgstr "" + msgid "Date:" msgstr "तिथि:" diff --git a/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo b/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo index 9bbaf7bf3a9f..8d8267184e04 100644 Binary files a/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/hsb/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po b/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po index 2f1eb4141aa0..eca6bc4cf294 100644 --- a/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/hsb/LC_MESSAGES/django.po @@ -1,22 +1,26 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Michael Wolf , 2016-2019 +# Michael Wolf , 2016-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-23 09:33+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Michael Wolf , 2016-2024\n" +"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" "language/hsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Wubrane %(verbose_name_plural)s zhašeć" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -29,10 +33,6 @@ msgstr "%(name)s njeda so zhašeć." msgid "Are you sure?" msgstr "Sće wěsty?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Wubrane %(verbose_name_plural)s zhašeć" - msgid "Administration" msgstr "Administracija" @@ -69,6 +69,12 @@ msgstr "Žadyn datum" msgid "Has date" msgstr "Ma datum" +msgid "Empty" +msgstr "Prózdny" + +msgid "Not empty" +msgstr "Njeprózdny" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -172,6 +178,9 @@ msgid "Hold down “Control”, or “Command” on a Mac, to select more than o msgstr "" "Dźeržće „ctrl“ abo „cmd“ na Mac stłóčeny, zo byšće wjace hač jedyn wubrał." +msgid "Select this object for an action - {}" +msgstr "Wubjerće tutón objekt za akciju – {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} „{obj}“ je so wuspěšnje přidał." @@ -190,10 +199,6 @@ msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "{name} „{obj}“ je so wuspěšnje změnił. Móžeće jón deleka wobdźěłować." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} „{obj}“ je so wuspěšnje přidał. Móžeće jón deleka wobdźěłować." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -262,8 +267,9 @@ msgstr "0 z %(cnt)s wubranych" msgid "Change history: %s" msgstr "Změnowa historija: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -333,6 +339,22 @@ msgstr "Wubjerće wšě %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Wuběr wotstronić" +msgid "Breadcrumbs" +msgstr "Chlěbowe srjódki" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w nałoženju %(name)s" + +msgid "Add" +msgstr "Přidać" + +msgid "View" +msgstr "Pokazać" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nimaće prawo něšto pokazać abo wobdźěłać." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -346,16 +368,36 @@ msgstr "Zapodajće wužiwarske mjeno a hesło." msgid "Change password" msgstr "Hesło změnić" -msgid "Please correct the error below." -msgstr "Prošu porjedźće slědowacy zmylk." +msgid "Set password" +msgstr "Hesło postajić" -msgid "Please correct the errors below." -msgstr "Prošu porjedźće slědowace zmylki." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Prošu porjedźće slědowacy zmylk." +msgstr[1] "Prošu porjedźće slědowacej zmylkaj." +msgstr[2] "Prošu porjedźće slědowace zmylki." +msgstr[3] "Prošu porjedźće slědowace zmylki." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Zapodajće nowe hesło za %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Tuta akcija awtentifikacija na zakładźe hesła za tutoho wužiwarja " +"zmóžni ." + +msgid "Disable password-based authentication" +msgstr "Awtentifikaciju na zakładźe hesła znjemóžnić" + +msgid "Enable password-based authentication" +msgstr "Awtentifikaciju na zakładźe hesła zmóžnić" + +msgid "Skip to main content" +msgstr "Dale k hłownemu wobsahej" + msgid "Welcome," msgstr "Witajće," @@ -381,6 +423,15 @@ msgstr "Na sydle pokazać" msgid "Filter" msgstr "Filtrować" +msgid "Hide counts" +msgstr "Ličby schować" + +msgid "Show counts" +msgstr "Ličby pokazać" + +msgid "Clear all filters" +msgstr "Wšě filtry zhašeć" + msgid "Remove from sorting" msgstr "Ze sortěrowanja wotstronić" @@ -391,6 +442,15 @@ msgstr "Sortěrowanski porjad: %(priority_number)s" msgid "Toggle sorting" msgstr "Sortěrowanje přepinać" +msgid "Toggle theme (current theme: auto)" +msgstr "Drastu změnić (aktualna drasta: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Drastu změnić (aktualna drasta: swětła)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Drastu změnić (aktualna drasta: ćmowa)" + msgid "Delete" msgstr "Zhašeć" @@ -456,9 +516,6 @@ msgstr "" "Chceće woprawdźe wubrane %(objects_name)s zhašeć? Wšě slědowace objekty a " "jich přisłušne zapiski so zhašeja:" -msgid "View" -msgstr "Pokazać" - msgid "Delete?" msgstr "Zhašeć?" @@ -469,16 +526,6 @@ msgstr "Po %(filter_title)s " msgid "Summary" msgstr "Zjeće" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w nałoženju %(name)s" - -msgid "Add" -msgstr "Přidać" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nimaće prawo něšto pokazać abo wobdźěłać." - msgid "Recent actions" msgstr "Najnowše akcije" @@ -488,6 +535,15 @@ msgstr "Moje akcije" msgid "None available" msgstr "Žadyn k dispoziciji" +msgid "Added:" +msgstr "Přidaty:" + +msgid "Changed:" +msgstr "Změnjeny:" + +msgid "Deleted:" +msgstr "Zhašany:" + msgid "Unknown content" msgstr "Njeznaty wobsah" @@ -511,6 +567,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Sće swoje hesło abo wužiwarske mjeno zabył?" +msgid "Toggle navigation" +msgstr "Nawigaciju přepinać" + +msgid "Sidebar" +msgstr "Bóčnica" + +msgid "Start typing to filter…" +msgstr "Pisajće, zo byšće filtrował …" + +msgid "Filter navigation items" +msgstr "Nawigaciske zapiski fitrować" + msgid "Date/time" msgstr "Datum/čas" @@ -520,6 +588,13 @@ msgstr "Wužiwar" msgid "Action" msgstr "Akcija" +msgid "entry" +msgid_plural "entries" +msgstr[0] "zapisk" +msgstr[1] "zapiskaj" +msgstr[2] "zapiski" +msgstr[3] "zapiskow" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -578,8 +653,14 @@ msgstr "Druhi %(model)s přidać" msgid "Delete selected %(model)s" msgstr "Wubrane %(model)s zhašeć" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Wulki dźak, zo sće dźensa rjane chwile z websydłom přebywali." +#, python-format +msgid "View selected %(model)s" +msgstr "Wubrany %(model)s pokazać" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Wulki dźak, zo sće sej čas brał, zo byšće kwalitu websydła dźensa " +"přepruwował." msgid "Log in again" msgstr "Znowa přizjewić" @@ -677,6 +758,9 @@ msgstr "E-mejlowa adresa:" msgid "Reset my password" msgstr "Moje hesło wróćo stajić" +msgid "Select all objects on this page for an action" +msgstr "Wubjerće wšě objekty na tutej stronje za akciju" + msgid "All dates" msgstr "Wšě daty" diff --git a/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo index 48ff13aed2bb..536522fd9ad3 100644 Binary files a/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po index e33aed632acc..96499792ee4d 100644 --- a/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/hsb/LC_MESSAGES/djangojs.po @@ -1,22 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Michael Wolf , 2016 +# Michael Wolf , 2016,2020-2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 00:02+0000\n" -"Last-Translator: Michael Wolf \n" -"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Michael Wolf , 2016,2020-2023\n" +"Language-Team: Upper Sorbian (http://app.transifex.com/django/django/" "language/hsb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hsb\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" #, javascript-format msgid "Available %s" @@ -65,6 +65,12 @@ msgstr "" "slědowacym kašćiku wuběraće a potom na šipk „Wotstronić“ mjez kašćikomaj " "kliknjeće." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"Zapisajće do tutoho kašćika, zo byšće někotre z lisćiny wubranych %s " +"wufiltrował." + msgid "Remove all" msgstr "Wšě wotstronić" @@ -72,6 +78,14 @@ msgstr "Wšě wotstronić" msgid "Click to remove all chosen %s at once." msgstr "Klikńće, zo byšće wšě wubrane %s naraz wotstronił." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%swubrane nastajenje njewidźomne" +msgstr[1] "%swubranej nastajeni njewidźomnej" +msgstr[2] "%s wubrane nastajenja njewidźomne" +msgstr[3] "%swubranych nastajenjow njewidźomne" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s z %(cnt)s wubrany" @@ -87,8 +101,8 @@ msgstr "" "wuwjedźeće, so waše njeskładowane změny zhubja." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Sće akciju wubrał, ale njejsće hišće swoje změny na jednoliwych polach " @@ -96,8 +110,8 @@ msgstr "" "znowa wuwjesć." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Sće akciju wubrał, a njejsće žane změny na jednotliwych polach přewjedł. " @@ -191,6 +205,103 @@ msgstr "Nowember" msgid "December" msgstr "December" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Měr." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Meja" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun." + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul." + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Awg." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Now." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec." + +msgid "Sunday" +msgstr "Njedźela" + +msgid "Monday" +msgstr "Póndźela" + +msgid "Tuesday" +msgstr "Wutora" + +msgid "Wednesday" +msgstr "Srjeda" + +msgid "Thursday" +msgstr "Štwórtk" + +msgid "Friday" +msgstr "Pjatk" + +msgid "Saturday" +msgstr "Sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Nje" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pón" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Wut" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Srj" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Štw" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pja" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sob" + msgctxt "one letter Sunday" msgid "S" msgstr "Nj" diff --git a/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo b/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo index 780ec2e8ba24..a9d8e835ba02 100644 Binary files a/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/hu/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/hu/LC_MESSAGES/django.po b/django/contrib/admin/locale/hu/LC_MESSAGES/django.po index 9d53aaf67cc7..ef84090a90d3 100644 --- a/django/contrib/admin/locale/hu/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/hu/LC_MESSAGES/django.po @@ -3,7 +3,8 @@ # Translators: # Ádám Krizsány , 2015 # Akos Zsolt Hochrein , 2018 -# András Veres-Szentkirályi, 2016,2018-2019 +# András Veres-Szentkirályi, 2016,2018-2020,2023 +# Balázs R, 2023 # Istvan Farkas , 2019 # Jannis Leidel , 2011 # János R, 2017 @@ -15,10 +16,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-18 09:25+0000\n" -"Last-Translator: Istvan Farkas \n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: András Veres-Szentkirályi, 2016,2018-2020,2023\n" +"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" "hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,6 +27,10 @@ msgstr "" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Kiválasztott %(verbose_name_plural)s törlése" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s sikeresen törölve lett." @@ -37,10 +42,6 @@ msgstr "%(name)s törlése nem sikerült" msgid "Are you sure?" msgstr "Biztos benne?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Kiválasztott %(verbose_name_plural)s törlése" - msgid "Administration" msgstr "Adminisztráció" @@ -77,6 +78,12 @@ msgstr "Nincs dátuma" msgid "Has date" msgstr "Van dátuma" +msgid "Empty" +msgstr "Üres" + +msgid "Not empty" +msgstr "Nem üres" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -181,6 +188,9 @@ msgstr "" "Több elem kiválasztásához tartsa nyomva a \"Control\" gombot, vagy Mac " "gépeken a \"Command\" gombot." +msgid "Select this object for an action - {}" +msgstr "Objektum kijelölése egy művelethez - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "A(z) \"{obj}\" {name} sikeresen hozzáadva." @@ -270,8 +280,9 @@ msgstr "0 kiválasztva ennyiből: %(cnt)s" msgid "Change history: %s" msgstr "Változások története: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -341,6 +352,22 @@ msgstr "Az összes %(module_name)s kiválasztása, összesen %(total_count)s db" msgid "Clear selection" msgstr "Kiválasztás törlése" +msgid "Breadcrumbs" +msgstr "Breadcrumb navigáció" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s alkalmazásban elérhető modellek." + +msgid "Add" +msgstr "Új" + +msgid "View" +msgstr "Megtekintés" + +msgid "You don’t have permission to view or edit anything." +msgstr "Jelenleg nincs jogosultsága bármit megtekinteni vagy szerkeszteni." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -355,16 +382,18 @@ msgid "Change password" msgstr "Jelszó megváltoztatása" msgid "Please correct the error below." -msgstr "Kérem javítsa a hibát alább." - -msgid "Please correct the errors below." -msgstr "Kérem javítsa ki a lenti hibákat." +msgid_plural "Please correct the errors below." +msgstr[0] "Kérem javítsa a lenti hibát." +msgstr[1] "Kérem javítsa a lenti hibákat." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Adjon meg egy új jelszót %(username)s nevű felhasználónak." +msgid "Skip to main content" +msgstr "Ugrás az oldal fő részéhez" + msgid "Welcome," msgstr "Üdvözlöm," @@ -390,6 +419,15 @@ msgstr "Megtekintés a honlapon" msgid "Filter" msgstr "Szűrő" +msgid "Hide counts" +msgstr "Számok elrejtése" + +msgid "Show counts" +msgstr "Számok megjelenítése" + +msgid "Clear all filters" +msgstr "Összes szűrő törlése" + msgid "Remove from sorting" msgstr "Eltávolítás a rendezésből" @@ -400,6 +438,15 @@ msgstr "Prioritás rendezésnél: %(priority_number)s" msgid "Toggle sorting" msgstr "Rendezés megfordítása" +msgid "Toggle theme (current theme: auto)" +msgstr "Téma váltás (jelenleg: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Téma váltás (jelenleg: világos)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Téma váltás (jelenleg: sötét)" + msgid "Delete" msgstr "Törlés" @@ -467,9 +514,6 @@ msgstr "" "Biztosan törölni akarja a kiválasztott %(objects_name)s objektumokat? Minden " "alábbi objektum, és a hozzájuk kapcsolódóak is törlésre kerülnek:" -msgid "View" -msgstr "Megtekintés" - msgid "Delete?" msgstr "Törli?" @@ -480,16 +524,6 @@ msgstr " %(filter_title)s szerint " msgid "Summary" msgstr "Összegzés" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s alkalmazásban elérhető modellek." - -msgid "Add" -msgstr "Új" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jelenleg nincs jogosultsága bármit megtekinteni vagy szerkeszteni." - msgid "Recent actions" msgstr "Legutóbbi műveletek" @@ -499,6 +533,15 @@ msgstr "Az én műveleteim" msgid "None available" msgstr "Nincs elérhető" +msgid "Added:" +msgstr "Hozzáadva:" + +msgid "Changed:" +msgstr "Szerkesztve:" + +msgid "Deleted:" +msgstr "Törölve:" + msgid "Unknown content" msgstr "Ismeretlen tartalom" @@ -522,6 +565,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Elfelejtette jelszavát vagy felhasználónevét?" +msgid "Toggle navigation" +msgstr "Navigáció megjelenítése/elrejtése" + +msgid "Sidebar" +msgstr "Oldalsáv" + +msgid "Start typing to filter…" +msgstr "Kezdjen el gépelni a szűréshez..." + +msgid "Filter navigation items" +msgstr "Navigációs elemek szűrése" + msgid "Date/time" msgstr "Dátum/idő" @@ -531,6 +586,11 @@ msgstr "Felhasználó" msgid "Action" msgstr "Művelet" +msgid "entry" +msgid_plural "entries" +msgstr[0] "bejegyzés" +msgstr[1] "bejegyzés" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -587,8 +647,12 @@ msgstr "Újabb %(model)s hozzáadása" msgid "Delete selected %(model)s" msgstr "Kiválasztott %(model)s törlése" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Köszönjük hogy egy kis időt eltöltött ma a honlapunkon." +#, python-format +msgid "View selected %(model)s" +msgstr "Kiválasztott %(model)s megtekintése" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Köszönjük, hogy egy kis minőségi időt eltöltött ma a honlapunkon." msgid "Log in again" msgstr "Jelentkezzen be újra" @@ -688,6 +752,9 @@ msgstr "E-mail cím:" msgid "Reset my password" msgstr "Jelszavam törlése" +msgid "Select all objects on this page for an action" +msgstr "Minden objektum kijelölése egy művelethez" + msgid "All dates" msgstr "Minden dátum" diff --git a/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo index fd76d35a639d..e9bed069256c 100644 Binary files a/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po index 5642e4069e9b..d21b38a1aab3 100644 --- a/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/hu/LC_MESSAGES/djangojs.po @@ -1,20 +1,21 @@ # This file is distributed under the same license as the Django package. # # Translators: -# András Veres-Szentkirályi, 2016 +# András Veres-Szentkirályi, 2016,2020-2021,2023 # Attila Nagy <>, 2012 +# Balázs R, 2023 # Jannis Leidel , 2011 -# János R (Hangya), 2011 +# János R, 2011 # Máté Őry , 2012 # Szilveszter Farkas , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: János R (Hangya)\n" -"Language-Team: Hungarian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: András Veres-Szentkirályi, 2016,2020-2021,2023\n" +"Language-Team: Hungarian (http://app.transifex.com/django/django/language/" "hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,6 +67,10 @@ msgstr "" "Ez a kiválasztott %s listája. Eltávolíthat közülük, ha rákattint, majd a két " "doboz közti \"Eltávolítás\" nyílra kattint." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Írjon a mezőbe a kiválasztott %s szűréséhez." + msgid "Remove all" msgstr "Összes törlése" @@ -73,6 +78,12 @@ msgstr "Összes törlése" msgid "Click to remove all chosen %s at once." msgstr "Kattintson az összes %s eltávolításához." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s kiválasztott elem nem látható" +msgstr[1] "%s kiválasztott elem nem látható" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s/%(cnt)s kijelölve" @@ -86,8 +97,8 @@ msgstr "" "futtat egy műveletet, akkor a módosítások elvesznek." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Kiválasztott egy műveletet, de nem mentette az egyes mezőkhöz kapcsolódó " @@ -95,8 +106,8 @@ msgstr "" "műveletet." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Kiválasztott egy műveletet, és nem módosított egyetlen mezőt sem. " @@ -186,6 +197,103 @@ msgstr "november" msgid "December" msgstr "december" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "már" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "ápr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "máj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jún" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "júl" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "szep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec" + +msgid "Sunday" +msgstr "vasárnap" + +msgid "Monday" +msgstr "hétfő" + +msgid "Tuesday" +msgstr "kedd" + +msgid "Wednesday" +msgstr "szerda" + +msgid "Thursday" +msgstr "csütörtök" + +msgid "Friday" +msgstr "péntek" + +msgid "Saturday" +msgstr "szombat" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "vas" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "hét" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "kedd" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "sze" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "csüt" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "pén" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "szo" + msgctxt "one letter Sunday" msgid "S" msgstr "V" diff --git a/django/contrib/admin/locale/id/LC_MESSAGES/django.mo b/django/contrib/admin/locale/id/LC_MESSAGES/django.mo index 8b739391a295..dbba65c99a92 100644 Binary files a/django/contrib/admin/locale/id/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/id/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/id/LC_MESSAGES/django.po b/django/contrib/admin/locale/id/LC_MESSAGES/django.po index 984e0a344ae0..791412ed6a98 100644 --- a/django/contrib/admin/locale/id/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/id/LC_MESSAGES/django.po @@ -1,23 +1,24 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Bayu Satiyo , 2024 # Claude Paroz , 2014 -# Fery Setiawan , 2015-2019 +# Fery Setiawan , 2015-2019,2021-2024 # Jannis Leidel , 2011 # M Asep Indrayana , 2015 -# oon arfiandwi , 2016 +# oon arfiandwi (OonID) , 2016,2020 # rodin , 2011-2013 # rodin , 2013-2017 -# sage , 2019 +# sag​e , 2019 # Sutrisno Efendi , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-18 13:06+0000\n" -"Last-Translator: sage \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Fery Setiawan , 2015-2019,2021-2024\n" +"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" "id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +26,10 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Hapus %(verbose_name_plural)s yang dipilih" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Sukses menghapus %(count)d %(items)s." @@ -36,10 +41,6 @@ msgstr "Tidak dapat menghapus %(name)s" msgid "Are you sure?" msgstr "Yakin?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Hapus %(verbose_name_plural)s yang dipilih" - msgid "Administration" msgstr "Administrasi" @@ -76,6 +77,12 @@ msgstr "Tidak ada tanggal" msgid "Has date" msgstr "Ada tanggal" +msgid "Empty" +msgstr "Kosong" + +msgid "Not empty" +msgstr "Tidak kosong" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -179,6 +186,9 @@ msgid "Hold down “Control”, or “Command” on a Mac, to select more than o msgstr "" "Tekan “Control”, atau “Command” pada Mac, untuk memilih lebih dari satu." +msgid "Select this object for an action - {}" +msgstr "Pilih objek ini untuk suatu aksi - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” berhasil ditambahkan." @@ -199,11 +209,6 @@ msgid "" msgstr "" "{name} “{obj}” berhasil diubah. Anda dapat mengeditnya kembali di bawah." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” berhasil ditambahkan. Anda dapat mengeditnya kembali di bawah." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -265,8 +270,9 @@ msgstr "0 dari %(cnt)s dipilih" msgid "Change history: %s" msgstr "Ubah riwayat: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -336,6 +342,22 @@ msgstr "Pilih seluruh %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Bersihkan pilihan" +msgid "Breadcrumbs" +msgstr "Breadcrumbs" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model pada aplikasi %(name)s" + +msgid "Add" +msgstr "Tambah" + +msgid "View" +msgstr "Lihat" + +msgid "You don’t have permission to view or edit anything." +msgstr "Anda tidak memiliki izin untuk melihat atau mengedit apa pun." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -349,16 +371,33 @@ msgstr "Masukkan nama pengguna dan sandi." msgid "Change password" msgstr "Ganti sandi" -msgid "Please correct the error below." -msgstr "Mohon perbaiki kesalahan di bawah ini." +msgid "Set password" +msgstr "Setel sandi" -msgid "Please correct the errors below." -msgstr "Perbaiki galat di bawah ini." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Harap perbaiki kesalahan dibawah." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Masukkan sandi baru untuk pengguna %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Tindakan ini akan enable autentifikasi brerdasarkan-sandi " +"untuk pengguna ini." + +msgid "Disable password-based authentication" +msgstr "Tiadakan autentifikasu berdasarkan-sandi" + +msgid "Enable password-based authentication" +msgstr "Adakan autentifikasu berdasarkan-sandi" + +msgid "Skip to main content" +msgstr "Lewati ke isi utama" + msgid "Welcome," msgstr "Selamat datang," @@ -384,6 +423,15 @@ msgstr "Lihat di situs" msgid "Filter" msgstr "Filter" +msgid "Hide counts" +msgstr "Sembunyikan hitungan" + +msgid "Show counts" +msgstr "Tampilkan hitungan" + +msgid "Clear all filters" +msgstr "Hapus semua penyaringan" + msgid "Remove from sorting" msgstr "Dihapus dari pengurutan" @@ -394,6 +442,15 @@ msgstr "Prioritas pengurutan: %(priority_number)s" msgid "Toggle sorting" msgstr "Ubah pengurutan" +msgid "Toggle theme (current theme: auto)" +msgstr "Ganti tema (tema saat ini: otomatis)" + +msgid "Toggle theme (current theme: light)" +msgstr "Ganti tema (tema saat ini: terang)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Ganti tema (tema saat ini: gelap)" + msgid "Delete" msgstr "Hapus" @@ -461,9 +518,6 @@ msgstr "" "Yakin akan menghapus %(objects_name)s terpilih? Semua objek berikut beserta " "objek terkait juga akan dihapus:" -msgid "View" -msgstr "Lihat" - msgid "Delete?" msgstr "Hapus?" @@ -474,16 +528,6 @@ msgstr " Berdasarkan %(filter_title)s " msgid "Summary" msgstr "Ringkasan" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model pada aplikasi %(name)s" - -msgid "Add" -msgstr "Tambah" - -msgid "You don’t have permission to view or edit anything." -msgstr "Anda tidak memiliki izin untuk melihat atau mengedit apa pun." - msgid "Recent actions" msgstr "Tindakan terbaru" @@ -493,6 +537,15 @@ msgstr "Tindakan saya" msgid "None available" msgstr "Tidak ada yang tersedia" +msgid "Added:" +msgstr "Ditambahkan:" + +msgid "Changed:" +msgstr "Berubah:" + +msgid "Deleted:" +msgstr "Dihapus:" + msgid "Unknown content" msgstr "Konten tidak diketahui" @@ -515,6 +568,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Lupa nama pengguna atau sandi?" +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Sidebar" +msgstr "Sidebar" + +msgid "Start typing to filter…" +msgstr "Mulai mengetik untuk menyaring..." + +msgid "Filter navigation items" +msgstr "Navigasi pencarian barang" + msgid "Date/time" msgstr "Tanggal/waktu" @@ -524,6 +589,10 @@ msgstr "Pengguna" msgid "Action" msgstr "Aksi" +msgid "entry" +msgid_plural "entries" +msgstr[0] "masukan" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -579,8 +648,14 @@ msgstr "Tambahkan %(model)s yang lain" msgid "Delete selected %(model)s" msgstr "Hapus %(model)s yang dipilih" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Terima kasih telah menggunakan situs ini hari ini." +#, python-format +msgid "View selected %(model)s" +msgstr "Menampilkan %(model)s terpilih" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Terima kasih untuk meluangkan waktu berkualitas dengan jaringan situs hari " +"ini." msgid "Log in again" msgstr "Masuk kembali" @@ -680,6 +755,9 @@ msgstr "Alamat email:" msgid "Reset my password" msgstr "Setel ulang sandi saya" +msgid "Select all objects on this page for an action" +msgstr "Pilih semua objek di halaman ini untuk suatu aksi" + msgid "All dates" msgstr "Semua tanggal" diff --git a/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo index 6b7bff39c635..d51b5514aeb6 100644 Binary files a/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po index aa096df9e02d..bfb31c8e91ef 100644 --- a/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/id/LC_MESSAGES/djangojs.po @@ -1,18 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Fery Setiawan , 2015-2016 +# Fery Setiawan , 2015-2016,2021-2023 # Jannis Leidel , 2011 +# oon arfiandwi (OonID) , 2020 # rodin , 2011-2012 # rodin , 2014,2016 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: rodin \n" -"Language-Team: Indonesian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Fery Setiawan , 2015-2016,2021-2023\n" +"Language-Team: Indonesian (http://app.transifex.com/django/django/language/" "id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,6 +67,10 @@ msgstr "" "dengan memilihnya pada kotak di bawah, lalu mengeklik tanda panah \"Hapus\" " "di antara kedua kotak." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Ketik di dalam kotak utnuk menyaring daftar dar %s terpilih." + msgid "Remove all" msgstr "Hapus semua" @@ -73,6 +78,11 @@ msgstr "Hapus semua" msgid "Click to remove all chosen %s at once." msgstr "Klik untuk menghapus semua pilihan %s sekaligus." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s pilihan terpilih tidak muncul" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s dari %(cnt)s terpilih" @@ -85,21 +95,21 @@ msgstr "" "telah dilakukan akan hilang." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Anda telah memilih sebuah aksi, tetapi belum menyimpan perubahan ke bidang " -"yang ada. Klik OK untuk menyimpan perubahan ini. Anda akan perlu mengulangi " -"aksi tersebut kembali." +"Anda telah memilih tindakan, tetapi Anda belum menyimpan perubahan ke masing-" +"masing bidang. Silakan klik OK untuk menyimpan. Anda harus menjalankan " +"kembali tindakan tersebut." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Anda telah memilih sebuah aksi, tetapi belum mengubah bidang apapun. " -"Kemungkinan Anda mencari tombol Buka dan bukan tombol Simpan." +"Anda telah memilih tindakan, dan Anda belum membuat perubahan apa pun di " +"setiap bidang. Anda mungkin mencari tombol Buka daripada tombol Simpan." msgid "Now" msgstr "Sekarang" @@ -183,6 +193,103 @@ msgstr "November" msgid "December" msgstr "Desember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mei" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Agu" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" + +msgid "Sunday" +msgstr "" + +msgid "Monday" +msgstr "" + +msgid "Tuesday" +msgstr "" + +msgid "Wednesday" +msgstr "" + +msgid "Thursday" +msgstr "" + +msgid "Friday" +msgstr "" + +msgid "Saturday" +msgstr "" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "" + msgctxt "one letter Sunday" msgid "S" msgstr "M" diff --git a/django/contrib/admin/locale/is/LC_MESSAGES/django.mo b/django/contrib/admin/locale/is/LC_MESSAGES/django.mo index 0f8eea9a90e0..553296860530 100644 Binary files a/django/contrib/admin/locale/is/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/is/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/is/LC_MESSAGES/django.po b/django/contrib/admin/locale/is/LC_MESSAGES/django.po index ea97dd69aac9..868a4528c657 100644 --- a/django/contrib/admin/locale/is/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/is/LC_MESSAGES/django.po @@ -4,15 +4,15 @@ # Dagur Ammendrup , 2019 # Hafsteinn Einarsson , 2011-2012 # Jannis Leidel , 2011 -# Kári Tristan Helgason , 2013 -# Thordur Sigurdsson , 2016-2019 +# 479d446b5da12875beba10cac54e9faf_a7ca1e7 , 2013 +# Thordur Sigurdsson , 2016-2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-20 05:02+0000\n" -"Last-Translator: Thordur Sigurdsson \n" +"POT-Creation-Date: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-14 22:38+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Icelandic (http://www.transifex.com/django/django/language/" "is/)\n" "MIME-Version: 1.0\n" @@ -72,6 +72,12 @@ msgstr "Engin dagsetning" msgid "Has date" msgstr "Hefur dagsetningu" +msgid "Empty" +msgstr "Tómt" + +msgid "Not empty" +msgstr "Ekki tómt" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -333,6 +339,19 @@ msgstr "Velja alla %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Hreinsa val" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Módel í appinu %(name)s" + +msgid "Add" +msgstr "Bæta við" + +msgid "View" +msgstr "Skoða" + +msgid "You don’t have permission to view or edit anything." +msgstr "Þú hefur ekki réttindi til að skoða eða breyta neinu." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -381,6 +400,9 @@ msgstr "Skoða á vef" msgid "Filter" msgstr "Sía" +msgid "Clear all filters" +msgstr "Hreinsa allar síur" + msgid "Remove from sorting" msgstr "Taka úr röðun" @@ -456,9 +478,6 @@ msgstr "" "Ertu viss um að þú viljir eyða völdum %(objects_name)s? Öllum eftirtöldum " "hlutum og skyldum hlutum verður eytt:" -msgid "View" -msgstr "Skoða" - msgid "Delete?" msgstr "Eyða?" @@ -469,16 +488,6 @@ msgstr " Eftir %(filter_title)s " msgid "Summary" msgstr "Samantekt" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Módel í appinu %(name)s" - -msgid "Add" -msgstr "Bæta við" - -msgid "You don’t have permission to view or edit anything." -msgstr "Þú hefur ekki réttindi til að skoða eða breyta neinu." - msgid "Recent actions" msgstr "Nýlegar aðgerðir" @@ -510,6 +519,9 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Gleymt notandanafn eða lykilorð?" +msgid "Toggle navigation" +msgstr "" + msgid "Date/time" msgstr "Dagsetning/tími" diff --git a/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo index 3f47b7b22ad2..29c2bc12ac00 100644 Binary files a/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po index 847c39cea442..5ddb17c0c3b7 100644 --- a/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/is/LC_MESSAGES/djangojs.po @@ -5,14 +5,14 @@ # Hafsteinn Einarsson , 2011-2012 # Jannis Leidel , 2011 # Matt R, 2018 -# Thordur Sigurdsson , 2016-2017 +# Thordur Sigurdsson , 2016-2017,2020-2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-05-18 14:09+0000\n" -"Last-Translator: Matt R\n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-06 17:37+0000\n" +"Last-Translator: Thordur Sigurdsson \n" "Language-Team: Icelandic (http://www.transifex.com/django/django/language/" "is/)\n" "MIME-Version: 1.0\n" @@ -85,16 +85,16 @@ msgstr "" "ekki verða vistaðar." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Þú hefur valið aðgerð en hefur ekki vistað breytingar á reitum. Vinsamlegast " "veldu 'Í lagi' til að vista. Þú þarft að endurkeyra aðgerðina." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Þú hefur valið aðgerð en hefur ekki gert breytingar á reitum. Þú ert líklega " @@ -184,6 +184,54 @@ msgstr "nóvember" msgid "December" msgstr "desember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maí" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jún" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Júl" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ágú" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nóv" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" + msgctxt "one letter Sunday" msgid "S" msgstr "S" diff --git a/django/contrib/admin/locale/it/LC_MESSAGES/django.mo b/django/contrib/admin/locale/it/LC_MESSAGES/django.mo index 72b2ffa20f79..a099863f8df9 100644 Binary files a/django/contrib/admin/locale/it/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/it/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/it/LC_MESSAGES/django.po b/django/contrib/admin/locale/it/LC_MESSAGES/django.po index d47979e0a0c2..3671884ec089 100644 --- a/django/contrib/admin/locale/it/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/it/LC_MESSAGES/django.po @@ -1,26 +1,29 @@ # This file is distributed under the same license as the Django package. # # Translators: -# AndreiCR , 2017 -# Carlo Miron , 2018-2019 +# 0d21a39e384d88c2313b89b5042c04cb, 2017 +# Carlo Miron , 2018-2019 +# Davide Targa , 2021 # Denis Darii , 2011 # Flavio Curella , 2013 +# Franky Bonanno, 2023 # Jannis Leidel , 2011 # Luciano De Falco Alfano, 2016 # Marco Bonetti, 2014 -# Mirco Grillo , 2018 +# Mirco Grillo , 2018,2020 # Nicola Larosa , 2013 -# palmux , 2014-2015 +# palmux , 2014-2015,2021 +# Paolo Melchiorre , 2022-2023 # Mattia Procopio , 2015 # Stefano Brentegani , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 10:24+0000\n" -"Last-Translator: Carlo Miron \n" -"Language-Team: Italian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: Franky Bonanno, 2023\n" +"Language-Team: Italian (http://app.transifex.com/django/django/language/" "it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,6 +31,10 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Cancella %(verbose_name_plural)s selezionati" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Cancellati/e con successo %(count)d %(items)s." @@ -39,10 +46,6 @@ msgstr "Impossibile cancellare %(name)s " msgid "Are you sure?" msgstr "Confermi?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Cancella %(verbose_name_plural)s selezionati" - msgid "Administration" msgstr "Amministrazione" @@ -79,6 +82,12 @@ msgstr "Senza data" msgid "Has date" msgstr "Ha la data" +msgid "Empty" +msgstr "Vuoto" + +msgid "Not empty" +msgstr "Non vuoto" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -136,22 +145,22 @@ msgid "log entries" msgstr "voci di log" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Aggiunto \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "\"%(object)s\" aggiunto." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Cambiato \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "%(object)s%(changes)s modificati" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Cancellato \"%(object)s .\"" +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" cancellato." msgid "LogEntry Object" msgstr "Oggetto LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "Aggiunto {name} \"{object}\"." msgid "Added." @@ -161,7 +170,7 @@ msgid "and" msgstr "e" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "Modificati {fields} per {name} \"{object}\"." #, python-brace-format @@ -169,7 +178,7 @@ msgid "Changed {fields}." msgstr "Modificati {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "Eliminato {name} \"{object}\"." msgid "No fields changed." @@ -178,13 +187,15 @@ msgstr "Nessun campo modificato." msgid "None" msgstr "Nessuno" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" "Tieni premuto \"Control\", o \"Command\" su Mac, per selezionarne più di uno." +msgid "Select this object for an action - {}" +msgstr "Seleziona questo oggetto per intraprendere un'azione - {}" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "Il {name} \"{obj}\" è stato aggiunto con successo." msgid "You may edit it again below." @@ -192,36 +203,34 @@ msgstr "Puoi modificarlo di nuovo qui sotto." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" "Il {name} \"{obj}\" è stato aggiunto con successo. Puoi aggiungere un altro " "{name} qui sotto." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" "Il {name} \"{obj}\" è stato modificato con successo. Puoi modificarlo " "nuovamente qui sotto." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" "Il {name} \"{obj}\" è stato aggiunto con successo. Puoi modificarlo " "nuovamente qui sotto." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" "Il {name} \"{obj}\" è stato modificato con successo. Puoi aggiungere un " "altro {name} qui sotto." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "Il {name} \"{obj}\" è stato modificato con successo." msgid "" @@ -235,13 +244,13 @@ msgid "No action selected." msgstr "Nessuna azione selezionata." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "%(name)s \"%(obj)s\" cancellato correttamente." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" -"%(name)s con ID \"%(key)s\" non esiste. Probabilmente sarà stato cancellato?" +"%(name)s con ID \"%(key)s\" non esiste. Probabilmente è stato cancellato?" #, python-format msgid "Add %s" @@ -263,12 +272,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s modificato correttamente." msgstr[1] "%(count)s %(name)s modificati correttamente." +msgstr[2] "%(count)s %(name)s modificati correttamente." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s selezionato" msgstr[1] "Tutti i %(total_count)s selezionati" +msgstr[2] "Tutti i %(total_count)s selezionati" #, python-format msgid "0 of %(cnt)s selected" @@ -278,8 +289,9 @@ msgstr "0 di %(cnt)s selezionati" msgid "Change history: %s" msgstr "Tracciato delle modifiche: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -311,7 +323,7 @@ msgstr "Amministrazione %(app)s" msgid "Page not found" msgstr "Pagina non trovata" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Spiacenti, ma la pagina richiesta non è stata trovata." msgid "Home" @@ -327,7 +339,7 @@ msgid "Server Error (500)" msgstr "Errore del server (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Si è verificato un errore. Gli amministratori del sito ne sono stati " @@ -350,8 +362,24 @@ msgstr "Seleziona tutti %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Annulla la selezione" +msgid "Breadcrumbs" +msgstr "Breadcrumbs" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelli nell'applicazione %(name)s" + +msgid "Add" +msgstr "Aggiungi" + +msgid "View" +msgstr "Vista" + +msgid "You don’t have permission to view or edit anything." +msgstr "Non hai i permessi per visualizzare o modificare nulla." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Prima di tutto inserisci nome utente e password. Poi potrai modificare le " @@ -364,16 +392,19 @@ msgid "Change password" msgstr "Modifica password" msgid "Please correct the error below." -msgstr "Per favore, correggi l'errore sottostante" - -msgid "Please correct the errors below." -msgstr "Correggi gli errori qui sotto." +msgid_plural "Please correct the errors below." +msgstr[0] "Si prega di correggere l'errore sottostante." +msgstr[1] "Si prega di correggere gli errori sottostanti." +msgstr[2] "Si prega di correggere gli errori sottostanti." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Inserisci una nuova password per l'utente %(username)s." +msgid "Skip to main content" +msgstr "Passa al contenuto principale" + msgid "Welcome," msgstr "Benvenuto," @@ -399,6 +430,15 @@ msgstr "Vedi sul sito" msgid "Filter" msgstr "Filtra" +msgid "Hide counts" +msgstr "Nascondi i conteggi " + +msgid "Show counts" +msgstr "Mostra i conteggi " + +msgid "Clear all filters" +msgstr "Cancella tutti i filtri" + msgid "Remove from sorting" msgstr "Elimina dall'ordinamento" @@ -409,6 +449,15 @@ msgstr "Priorità d'ordinamento: %(priority_number)s" msgid "Toggle sorting" msgstr "Abilita/disabilita ordinamento" +msgid "Toggle theme (current theme: auto)" +msgstr "Cambia tema (tema corrente: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Cambia tema (tema corrente: chiaro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Cambia tema (tema corrente: scuro)" + msgid "Delete" msgstr "Cancella" @@ -441,7 +490,7 @@ msgstr "" msgid "Objects" msgstr "Oggetti" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Sì, sono sicuro" msgid "No, take me back" @@ -476,9 +525,6 @@ msgstr "" "Confermi la cancellazione dell'elemento %(objects_name)s selezionato? " "Saranno rimossi tutti i seguenti oggetti e le loro voci correlate:" -msgid "View" -msgstr "Vista" - msgid "Delete?" msgstr "Cancellare?" @@ -489,16 +535,6 @@ msgstr " Per %(filter_title)s " msgid "Summary" msgstr "Riepilogo" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelli nell'applicazione %(name)s" - -msgid "Add" -msgstr "Aggiungi" - -msgid "You don't have permission to view or edit anything." -msgstr "Non hai i permessi per visualizzare o modificare nulla" - msgid "Recent actions" msgstr "Azioni recenti" @@ -508,17 +544,26 @@ msgstr "Le mie azioni" msgid "None available" msgstr "Nulla disponibile" +msgid "Added:" +msgstr "Aggiunto" + +msgid "Changed:" +msgstr "Cambiato " + +msgid "Deleted:" +msgstr "Eliminato " + msgid "Unknown content" msgstr "Contenuto sconosciuto" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Ci sono problemi nell'installazione del database. Assicurarsi che le tabelle " -"appropriate del database siano state create, e che il database sia leggibile " -"dall'utente appropriato." +"Qualcosa non è andato a buon fine nell'installazione del database. " +"Assicurati che le tabelle del database siano state create, e che il database " +"sia leggibile dall'utente corretto." #, python-format msgid "" @@ -531,6 +576,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Hai dimenticato la password o lo username?" +msgid "Toggle navigation" +msgstr "Abilita/disabilita navigazione" + +msgid "Sidebar" +msgstr "Barra laterale" + +msgid "Start typing to filter…" +msgstr "Inizia a scrivere per filtrare..." + +msgid "Filter navigation items" +msgstr "Filtra gli oggetti di navigazione" + msgid "Date/time" msgstr "Data/ora" @@ -540,8 +597,14 @@ msgstr "Utente" msgid "Action" msgstr "Azione" +msgid "entry" +msgid_plural "entries" +msgstr[0] "voce" +msgstr[1] "voci" +msgstr[2] "voci" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato " @@ -564,6 +627,7 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s risultato" msgstr[1] "%(counter)s risultati" +msgstr[2] "%(counter)s risultati" #, python-format msgid "%(full_result_count)s total" @@ -596,8 +660,12 @@ msgstr "Aggiungi un altro %(model)s" msgid "Delete selected %(model)s" msgstr "Elimina la selezione %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Grazie per aver speso il tuo tempo prezioso su questo sito oggi." +#, python-format +msgid "View selected %(model)s" +msgstr "Visualizza il %(model)s selezionato" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Grazie per avere trascorso del tempo di qualità sul sito oggi." msgid "Log in again" msgstr "Accedi di nuovo" @@ -609,7 +677,7 @@ msgid "Your password was changed." msgstr "La tua password è stata cambiata." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Inserisci la password attuale, per ragioni di sicurezza, e poi la nuova " @@ -648,15 +716,14 @@ msgstr "" "era già stato usato. Richiedi una nuova reimpostazione della password." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Abbiamo inviato istruzioni per impostare la password all'indirizzo email che " -"hai indicato. Dovresti riceverle a breve a patto che l'indirizzo che hai " -"inserito sia valido." +"Abbiamo inviato istruzioni per impostare la password, se esiste un account " +"valido all'indirizzo email che hai indicato. Dovresti riceverle a breve." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "Se non ricevi un messaggio email, accertati di aver inserito l'indirizzo con " @@ -673,7 +740,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Vai alla pagina seguente e scegli una nuova password:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:" msgid "Thanks for using our site!" @@ -684,11 +751,11 @@ msgid "The %(site_name)s team" msgstr "Il team di %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Password dimenticata? Inserisci il tuo indirizzo email qui sotto, e ti " -"invieremo istruzioni per impostarne una nuova." +"Password dimenticata? Inserisci il tuo indirizzo email qui sotto e ti " +"invieremo le istruzioni per impostarne una nuova." msgid "Email address:" msgstr "Indirizzo email:" @@ -696,6 +763,10 @@ msgstr "Indirizzo email:" msgid "Reset my password" msgstr "Reimposta la mia password" +msgid "Select all objects on this page for an action" +msgstr "" +"Seleziona tutti gli oggetti di questa pagina per intraprendere un'azione " + msgid "All dates" msgstr "Tutte le date" diff --git a/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo index 85f5ce8e858a..5b0c2810a05f 100644 Binary files a/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po index baa69c6b88d9..73a00fda48b8 100644 --- a/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/it/LC_MESSAGES/djangojs.po @@ -5,16 +5,18 @@ # Jannis Leidel , 2011 # Luciano De Falco Alfano, 2016 # Marco Bonetti, 2014 +# Mirco Grillo , 2020 # Nicola Larosa , 2011-2012 -# palmux , 2015 +# palmux , 2015,2021 +# Paolo Melchiorre , 2022-2023 # Stefano Brentegani , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: palmux \n" +"POT-Creation-Date: 2023-03-17 03:19-0500\n" +"PO-Revision-Date: 2023-04-25 07:59+0000\n" +"Last-Translator: Paolo Melchiorre , 2022-2023\n" "Language-Team: Italian (http://www.transifex.com/django/django/language/" "it/)\n" "MIME-Version: 1.0\n" @@ -69,6 +71,10 @@ msgstr "" "casella qui sotto e poi facendo clic sulla freccia \"Elimina\" tra le due " "caselle." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Scrivi in questa casella per filtrare l'elenco dei %s selezionati." + msgid "Remove all" msgstr "Elimina tutti" @@ -76,10 +82,18 @@ msgstr "Elimina tutti" msgid "Click to remove all chosen %s at once." msgstr "Fai clic per eliminare tutti i %s in una volta." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opzione selezionata non visibile" +msgstr[1] "%s opzioni selezionate non visibili" +msgstr[2] "%s opzioni selezionate non visibili" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s di %(cnt)s selezionato" msgstr[1] "%(sel)s di %(cnt)s selezionati" +msgstr[2] "%(sel)s di %(cnt)s selezionati" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -89,20 +103,20 @@ msgstr "" "un'azione, le modifiche non salvate andranno perse." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Hai selezionato un'azione, ma non hai ancora salvato le modifiche apportate " -"a campi singoli. Fai clic su OK per salvare. Poi dovrai ri-eseguire l'azione." +"a campi singoli. Fai clic su OK per salvare. Poi dovrai rieseguire l'azione." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Hai selezionato un'azione, e non hai ancora apportato alcuna modifica a " -"campi singoli. Probabilmente stai cercando il pulsante Go, invece di Save." +"Hai selezionato un'azione e non hai ancora apportato alcuna modifica ai " +"campi singoli. Probabilmente stai cercando il pulsante Vai, invece di Salva." msgid "Now" msgstr "Adesso" @@ -124,12 +138,14 @@ msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Nota: Sei %s ora in anticipo rispetto al server." msgstr[1] "Nota: Sei %s ore in anticipo rispetto al server." +msgstr[2] "Nota: Sei %s ore in anticipo rispetto al server." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Nota: Sei %s ora in ritardo rispetto al server." msgstr[1] "Nota: Sei %s ore in ritardo rispetto al server." +msgstr[2] "Nota: Sei %s ore in ritardo rispetto al server." msgid "Choose a Time" msgstr "Scegli un orario" @@ -188,6 +204,54 @@ msgstr "Novembre" msgid "December" msgstr "Dicembre" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Gen" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mag" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Giu" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Lug" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Set" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Ott" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dic" + msgctxt "one letter Sunday" msgid "S" msgstr "D" diff --git a/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo index 2a968da0922b..ec8a37829730 100644 Binary files a/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ja/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ja/LC_MESSAGES/django.po b/django/contrib/admin/locale/ja/LC_MESSAGES/django.po index afa002d1a49c..ac42d389fe99 100644 --- a/django/contrib/admin/locale/ja/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ja/LC_MESSAGES/django.po @@ -1,20 +1,28 @@ # This file is distributed under the same license as the Django package. # # Translators: +# akiyoko , 2020 # Claude Paroz , 2016 +# Goto Hayato , 2019 +# Hiroki Sawano, 2022 # Jannis Leidel , 2011 +# Masaya, 2023 # Shinichi Katsumata , 2019 -# Shinya Okano , 2012-2018 +# Shinya Okano , 2012-2018,2021,2023 +# TANIGUCHI Taichi, 2022 +# Takuro Onoue , 2020 +# Takuya N , 2020 # Tetsuya Morimoto , 2011 # 上田慶祐 , 2015 +# 余田大輝, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-19 07:00+0000\n" -"Last-Translator: Shinichi Katsumata \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: 余田大輝, 2024\n" +"Language-Team: Japanese (http://app.transifex.com/django/django/language/" "ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +30,10 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "選択された %(verbose_name_plural)s の削除" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d 個の %(items)s を削除しました。" @@ -33,10 +45,6 @@ msgstr "%(name)s が削除できません" msgid "Are you sure?" msgstr "よろしいですか?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "選択された %(verbose_name_plural)s の削除" - msgid "Administration" msgstr "管理" @@ -73,6 +81,12 @@ msgstr "日付なし" msgid "Has date" msgstr "日付あり" +msgid "Empty" +msgstr "空" + +msgid "Not empty" +msgstr "空でない" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -130,23 +144,23 @@ msgid "log entries" msgstr "ログエントリー" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" を追加しました。" +msgid "Added “%(object)s”." +msgstr "“%(object)s” を追加しました。" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" を変更しました - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” を変更しました — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\"を削除しました。" +msgid "Deleted “%(object)s.”" +msgstr "“%(object)s” を削除しました。" msgid "LogEntry Object" msgstr "ログエントリー オブジェクト" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "{name} \"{object}\" を追加しました。" +msgid "Added {name} “{object}”." +msgstr "{name} “{object}” を追加しました。" msgid "Added." msgstr "追加されました。" @@ -155,16 +169,16 @@ msgid "and" msgstr "と" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{name} \"{object}\" の {fields} を変更しました。" +msgid "Changed {fields} for {name} “{object}”." +msgstr "{name} “{object}” の {fields} を変更しました。" #, python-brace-format msgid "Changed {fields}." msgstr "{fields} を変更しました。" #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "{name} \"{object}\" を削除しました。" +msgid "Deleted {name} “{object}”." +msgstr "{name} “{object}” を削除しました。" msgid "No fields changed." msgstr "変更はありませんでした。" @@ -172,44 +186,40 @@ msgstr "変更はありませんでした。" msgid "None" msgstr "None" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"複数選択するときには Control キーを押したまま選択してください。Mac では " +"複数選択するときには Control キーを押したまま選択してください。Mac は " "Command キーを使ってください" +msgid "Select this object for an action - {}" +msgstr "アクション用にこのオブジェクトを選択 - {}" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" を追加しました。" +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” を追加しました。" msgid "You may edit it again below." msgstr "以下で再度編集できます。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" を追加しました。 別の {name} を以下から追加できます。" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" を変更しました。 以下から再度編集できます。" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "{name} “{obj}” を追加しました。別の {name} を以下から追加できます。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" を追加しました。続けて編集できます。" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "{name} “{obj}” を変更しました。以下から再度編集できます。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} \"{obj}\" を変更しました。 別の {name} を以下から追加できます。" +msgstr "{name} “{obj}” を変更しました。 別の {name} を以下から追加できます。" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" を変更しました。" +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” を変更しました。" msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -221,13 +231,13 @@ msgid "No action selected." msgstr "操作が選択されていません。" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" を削除しました。" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” を削除しました。" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" -"ID \"%(key)s\" の%(name)sは見つかりませんでした。削除された可能性があります。" +"ID “%(key)s” の%(name)sは見つかりませんでした。削除された可能性があります。" #, python-format msgid "Add %s" @@ -262,8 +272,9 @@ msgstr "%(cnt)s個の内ひとつも選択されていません" msgid "Change history: %s" msgstr "変更履歴: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -295,7 +306,7 @@ msgstr "%(app)s 管理" msgid "Page not found" msgstr "ページが見つかりません" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。" msgid "Home" @@ -311,7 +322,7 @@ msgid "Server Error (500)" msgstr "サーバーエラー (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "エラーが発生しました。サイト管理者にメールで報告されたので、修正されるまでし" @@ -333,8 +344,24 @@ msgstr "%(total_count)s個ある%(module_name)s を全て選択" msgid "Clear selection" msgstr "選択を解除" +msgid "Breadcrumbs" +msgstr "パンくずリスト" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s アプリケーション内のモデル" + +msgid "Add" +msgstr "追加" + +msgid "View" +msgstr "表示" + +msgid "You don’t have permission to view or edit anything." +msgstr "表示または変更のためのパーミッションがありません。" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "まずユーザー名とパスワードを登録してください。その後詳細情報が編集可能になり" @@ -346,17 +373,33 @@ msgstr "ユーザー名とパスワードを入力してください。" msgid "Change password" msgstr "パスワードの変更" -msgid "Please correct the error below." -msgstr "下記のエラーを修正してください。" +msgid "Set password" +msgstr "パスワードを設定" -msgid "Please correct the errors below." -msgstr "下記のエラーを修正してください。" +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "下記のエラーを修正してください。" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "%(username)sさんの新しいパスワードを入力してください。" +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"このアクションは、このユーザーに対するパスワードによる認証を有効にします。" + +msgid "Disable password-based authentication" +msgstr "パスワードによる認証の無効化" + +msgid "Enable password-based authentication" +msgstr "パスワードによる認証の有効化" + +msgid "Skip to main content" +msgstr "スキップしてメインコンテンツへ" + msgid "Welcome," msgstr "ようこそ" @@ -382,6 +425,15 @@ msgstr "サイト上で表示" msgid "Filter" msgstr "フィルター" +msgid "Hide counts" +msgstr "件数を非表示" + +msgid "Show counts" +msgstr "件数を表示" + +msgid "Clear all filters" +msgstr "全てのフィルターを解除" + msgid "Remove from sorting" msgstr "ソート条件から外します" @@ -392,6 +444,15 @@ msgstr "ソート優先順位: %(priority_number)s" msgid "Toggle sorting" msgstr "昇順降順を切り替えます" +msgid "Toggle theme (current theme: auto)" +msgstr "テーマを切り替え (現在のテーマ: 自動)" + +msgid "Toggle theme (current theme: light)" +msgstr "テーマを切り替え (現在のテーマ: ライト)" + +msgid "Toggle theme (current theme: dark)" +msgstr "テーマを切り替え (現在のテーマ: ダーク)" + msgid "Delete" msgstr "削除" @@ -424,8 +485,8 @@ msgstr "" msgid "Objects" msgstr "オブジェクト" -msgid "Yes, I'm sure" -msgstr "はい" +msgid "Yes, I’m sure" +msgstr "はい、大丈夫です" msgid "No, take me back" msgstr "戻る" @@ -458,9 +519,6 @@ msgstr "" "本当に選択した %(objects_name)s を削除しますか? 以下の全てのオブジェクトと関" "連する要素が削除されます:" -msgid "View" -msgstr "表示" - msgid "Delete?" msgstr "削除しますか?" @@ -471,16 +529,6 @@ msgstr "%(filter_title)s で絞り込む" msgid "Summary" msgstr "概要" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s アプリケーション内のモデル" - -msgid "Add" -msgstr "追加" - -msgid "You don't have permission to view or edit anything." -msgstr "表示または変更のためのパーミッションがありません。" - msgid "Recent actions" msgstr "最近行った操作" @@ -490,16 +538,25 @@ msgstr "自分の操作" msgid "None available" msgstr "利用不可" +msgid "Added:" +msgstr "追加されました:" + +msgid "Changed:" +msgstr "変更されました:" + +msgid "Deleted:" +msgstr "削除されました:" + msgid "Unknown content" msgstr "不明なコンテント" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"データベースの設定に問題があるようです。適切なテーブルが作られていること、適" -"切なユーザーでデータベースのデータを読み込めることを確認してください。" +"データベースのインストールに問題があります。適切なデータベーステーブルが作ら" +"れているか、適切なユーザーがデータベースを読み込み可能かを確認してください。" #, python-format msgid "" @@ -512,6 +569,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "パスワードまたはユーザー名を忘れましたか?" +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替えます" + +msgid "Sidebar" +msgstr "サイドバー" + +msgid "Start typing to filter…" +msgstr "絞り込みの入力..." + +msgid "Filter navigation items" +msgstr "ナビゲーション項目の絞り込み" + msgid "Date/time" msgstr "日付/時刻" @@ -521,8 +590,12 @@ msgstr "ユーザー" msgid "Action" msgstr "操作" +msgid "entry" +msgid_plural "entries" +msgstr[0] "エントリー" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも" @@ -576,7 +649,11 @@ msgstr "%(model)s の追加" msgid "Delete selected %(model)s" msgstr "選択された %(model)s を削除" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "選択された %(model)s を表示" + +msgid "Thanks for spending some quality time with the web site today." msgstr "ご利用ありがとうございました。" msgid "Log in again" @@ -589,7 +666,7 @@ msgid "Your password was changed." msgstr "あなたのパスワードは変更されました" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正" @@ -626,14 +703,14 @@ msgstr "" "す。もう一度パスワードリセットしてください。" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "入力されたメールアドレスを持つアカウントが存在する場合、パスワードを設定する" -"ためのメールを送信しました。すぐに受け取る必要があります。" +"ためのメールを送信しました。すぐに届くはずです。" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "メールが届かない場合は、登録したメールアドレスを入力したか確認し、スパムフォ" @@ -650,8 +727,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "次のページで新しいパスワードを選んでください:" -msgid "Your username, in case you've forgotten:" -msgstr "あなたのユーザー名 (念のため):" +msgid "Your username, in case you’ve forgotten:" +msgstr "あなたのユーザー名 (もし忘れていたら):" msgid "Thanks for using our site!" msgstr "ご利用ありがとうございました!" @@ -661,7 +738,7 @@ msgid "The %(site_name)s team" msgstr " %(site_name)s チーム" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "パスワードを忘れましたか? メールアドレスを以下に入力すると、新しいパスワード" @@ -673,6 +750,9 @@ msgstr "メールアドレス:" msgid "Reset my password" msgstr "パスワードをリセット" +msgid "Select all objects on this page for an action" +msgstr "アクション用にこのページのすべてのオブジェクトを選択" + msgid "All dates" msgstr "いつでも" diff --git a/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo index 24824f82dc96..513b0a2b05da 100644 Binary files a/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po index 3768547cd480..55e78db59e21 100644 --- a/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ja/LC_MESSAGES/djangojs.po @@ -1,16 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Goto Hayato , 2021 # Jannis Leidel , 2011 -# Shinya Okano , 2012,2014-2016 +# Shinya Okano , 2012,2014-2016,2023 +# Taichi Taniguchi, 2022 +# Takuro Onoue , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Shinya Okano \n" -"Language-Team: Japanese (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Shinya Okano , 2012,2014-2016,2023\n" +"Language-Team: Japanese (http://app.transifex.com/django/django/language/" "ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -62,6 +65,10 @@ msgstr "" "これが選択された %s のリストです。下のボックスで選択し、2つのボックス間の " "\"削除\"矢印をクリックして一部を削除することができます。" +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "選択された%sのリストを絞り込むには、このボックスに入力します。" + msgid "Remove all" msgstr "すべて削除" @@ -69,6 +76,11 @@ msgstr "すべて削除" msgid "Click to remove all chosen %s at once." msgstr "クリックするとすべての %s を選択から削除します。" +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "選択された%s件のオプションは非表示です。" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(cnt)s個中%(sel)s個選択" @@ -81,16 +93,16 @@ msgstr "" "す。" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "操作を選択しましたが、フィールドに未保存の変更があります。OKをクリックして保" "存してください。その後、操作を再度実行する必要があります。" msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "操作を選択しましたが、フィールドに変更はありませんでした。もしかして保存ボタ" @@ -178,6 +190,103 @@ msgstr "11月" msgid "December" msgstr "12月" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "1月" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "2月" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "3月" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "4月" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "5月" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "6月" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "7月" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "8月" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "9月" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "10月" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "11月" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "12月" + +msgid "Sunday" +msgstr "日曜日" + +msgid "Monday" +msgstr "月曜日" + +msgid "Tuesday" +msgstr "火曜日" + +msgid "Wednesday" +msgstr "水曜日" + +msgid "Thursday" +msgstr "木曜日" + +msgid "Friday" +msgstr "金曜日" + +msgid "Saturday" +msgstr "土曜日" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "日" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "月" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "火" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "水" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "木" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "金" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "土" + msgctxt "one letter Sunday" msgid "S" msgstr "日" diff --git a/django/contrib/admin/locale/kn/LC_MESSAGES/django.po b/django/contrib/admin/locale/kn/LC_MESSAGES/django.po index 3ae96cfa6791..06e63dc492ea 100644 --- a/django/contrib/admin/locale/kn/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/kn/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kn\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #, python-format msgid "Successfully deleted %(count)d %(items)s." diff --git a/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo index 988728ce948e..fa49be6dccb8 100644 Binary files a/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po index 90363b7a2cf9..0a651bc57f79 100644 --- a/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/kn/LC_MESSAGES/djangojs.po @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: kn\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" #, javascript-format msgid "Available %s" @@ -68,6 +68,7 @@ msgstr "" msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "" +msgstr[1] "" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -77,29 +78,43 @@ msgstr "" "ನಾಶವಾಗುತ್ತವೆ" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" +msgid "Now" +msgstr "ಈಗ" + +msgid "Midnight" +msgstr "ಮಧ್ಯರಾತ್ರಿ" + +msgid "6 a.m." +msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ " + +msgid "Noon" +msgstr "ಮಧ್ಯಾಹ್ನ" + +msgid "6 p.m." +msgstr "" + #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "" +msgstr[1] "" #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "" - -msgid "Now" -msgstr "ಈಗ" +msgstr[1] "" msgid "Choose a Time" msgstr "" @@ -107,18 +122,6 @@ msgstr "" msgid "Choose a time" msgstr "ಸಮಯವೊಂದನ್ನು ಆರಿಸಿ" -msgid "Midnight" -msgstr "ಮಧ್ಯರಾತ್ರಿ" - -msgid "6 a.m." -msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ " - -msgid "Noon" -msgstr "ಮಧ್ಯಾಹ್ನ" - -msgid "6 p.m." -msgstr "" - msgid "Cancel" msgstr "ರದ್ದುಗೊಳಿಸಿ" @@ -170,6 +173,54 @@ msgstr "" msgid "December" msgstr "" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "" + msgctxt "one letter Sunday" msgid "S" msgstr "" @@ -198,6 +249,11 @@ msgctxt "one letter Saturday" msgid "S" msgstr "" +msgid "" +"You have already submitted this form. Are you sure you want to submit it " +"again?" +msgstr "" + msgid "Show" msgstr "ಪ್ರದರ್ಶನ" diff --git a/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo index 5e50c80fbf31..2d1eb80a3d25 100644 Binary files a/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ko/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ko/LC_MESSAGES/django.po b/django/contrib/admin/locale/ko/LC_MESSAGES/django.po index 7fcad066aeb0..717f2d599575 100644 --- a/django/contrib/admin/locale/ko/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ko/LC_MESSAGES/django.po @@ -2,6 +2,8 @@ # # Translators: # Jiyoon, Ha , 2016 +# DONGHO JEONG , 2020 +# Dummy Iam, 2021 # Geonho Kim / Leo Kim , 2019 # Gihun Ham , 2018 # Hang Park , 2019 @@ -9,25 +11,36 @@ # Ian Y. Choi , 2015,2019 # Jaehong Kim , 2011 # Jannis Leidel , 2011 +# Jay Oh , 2020 # Le Tartuffe , 2014,2016 -# Noh Seho , 2018 +# Juyoung Lim, 2024 +# LEE Hwanyong , 2023 +# Seho Noh , 2018 # Seacbyul Lee , 2017 +# 최소영, 2024 # Taesik Yoon , 2015 +# 정훈 이, 2021 +# 박태진, 2021 # Yang Chan Woo , 2019 +# Youngkwang Yang, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-10-05 07:07+0000\n" -"Last-Translator: Geonho Kim / Leo Kim \n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Youngkwang Yang, 2024\n" +"Language-Team: Korean (http://app.transifex.com/django/django/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" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "선택된 %(verbose_name_plural)s 을/를 삭제합니다." + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d개의 %(items)s 을/를 성공적으로 삭제하였습니다." @@ -39,10 +52,6 @@ msgstr "%(name)s를 삭제할 수 없습니다." msgid "Are you sure?" msgstr "확실합니까?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "선택된 %(verbose_name_plural)s 을/를 삭제합니다." - msgid "Administration" msgstr "관리" @@ -79,6 +88,12 @@ msgstr "날짜 없음" msgid "Has date" msgstr "날짜 있음" +msgid "Empty" +msgstr "비어 있음" + +msgid "Not empty" +msgstr "비어 있지 않음" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -183,6 +198,9 @@ msgstr "" "하나 이상을 선택하려면 \"Control\" 키를 누른 채로 선택해주세요. Mac의 경우에" "는 \"Command\" 키를 눌러주세요." +msgid "Select this object for an action - {}" +msgstr "작업에 대한 객체를 선택합니다." + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} \"{obj}\"가 성공적으로 추가되었습니다." @@ -204,12 +222,6 @@ msgstr "" "{name} \"{obj}\"가 성공적으로 변경되었습니다. 아래에서 다시 수정할 수 있습니" "다." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\"가 성공적으로 추가되었습니다. 아래에서 다시 수정할 수 있습니" -"다." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -275,8 +287,9 @@ msgstr "%(cnt)s 중 아무것도 선택되지 않았습니다." msgid "Change history: %s" msgstr "변경 히스토리: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -346,6 +359,22 @@ msgstr "%(total_count)s개의 %(module_name)s 모두를 선택합니다." msgid "Clear selection" msgstr "선택 해제" +msgid "Breadcrumbs" +msgstr "사용자 위치" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s 애플리케이션의 모델" + +msgid "Add" +msgstr "추가" + +msgid "View" +msgstr "보기" + +msgid "You don’t have permission to view or edit anything." +msgstr "독자는 뷰 및 수정 권한이 없습니다." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -359,16 +388,31 @@ msgstr "사용자 이름과 비밀번호를 입력하세요." msgid "Change password" msgstr "비밀번호 변경" -msgid "Please correct the error below." -msgstr "아래 오류를 해결해주세요." +msgid "Set password" +msgstr "비밀번호 설정" -msgid "Please correct the errors below." -msgstr "아래의 오류들을 수정하십시오." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "아래 오류들을 수정하기 바랍니다. " #, python-format msgid "Enter a new password for the user %(username)s." msgstr "%(username)s 새로운 비밀번호를 입력하세요." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" + +msgid "Disable password-based authentication" +msgstr "" + +msgid "Enable password-based authentication" +msgstr "" + +msgid "Skip to main content" +msgstr "메인 콘텐츠로 이동" + msgid "Welcome," msgstr "환영합니다," @@ -394,6 +438,15 @@ msgstr "사이트에서 보기" msgid "Filter" msgstr "필터" +msgid "Hide counts" +msgstr "개수 숨기기" + +msgid "Show counts" +msgstr "개수 표시" + +msgid "Clear all filters" +msgstr "모든 필터 삭제" + msgid "Remove from sorting" msgstr "정렬에서 " @@ -404,6 +457,15 @@ msgstr "정렬 조건 : %(priority_number)s" msgid "Toggle sorting" msgstr "정렬 " +msgid "Toggle theme (current theme: auto)" +msgstr "테마 토글 (현재 테마:자동)" + +msgid "Toggle theme (current theme: light)" +msgstr "테마 토글 (현재 테마: 밝음)" + +msgid "Toggle theme (current theme: dark)" +msgstr "테마 토글 (현재 테마: 어두움)" + msgid "Delete" msgstr "삭제" @@ -470,9 +532,6 @@ msgstr "" "선택한 %(objects_name)s를 정말 삭제하시겠습니까? 다음의 오브젝트와 연관 아이" "템들이 모두 삭제됩니다:" -msgid "View" -msgstr "보기" - msgid "Delete?" msgstr "삭제" @@ -483,16 +542,6 @@ msgstr "%(filter_title)s (으)로" msgid "Summary" msgstr "개요" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 애플리케이션의 모델" - -msgid "Add" -msgstr "추가" - -msgid "You don’t have permission to view or edit anything." -msgstr "독자는 뷰 및 수정 권한이 없습니다." - msgid "Recent actions" msgstr "최근 활동" @@ -502,6 +551,15 @@ msgstr "나의 활동" msgid "None available" msgstr "이용할 수 없습니다." +msgid "Added:" +msgstr "추가되었습니다:" + +msgid "Changed:" +msgstr "변경:" + +msgid "Deleted:" +msgstr "삭제:" + msgid "Unknown content" msgstr "알 수 없는 형식입니다." @@ -525,6 +583,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "아이디 또는 비밀번호를 분실하였습니까?" +msgid "Toggle navigation" +msgstr "토글 메뉴" + +msgid "Sidebar" +msgstr "사이드바" + +msgid "Start typing to filter…" +msgstr "필터에 타이핑 시작..." + +msgid "Filter navigation items" +msgstr "탐색 항목 필터링" + msgid "Date/time" msgstr "날짜/시간" @@ -534,6 +604,10 @@ msgstr "사용자" msgid "Action" msgstr "액션" +msgid "entry" +msgid_plural "entries" +msgstr[0] "항목" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -589,7 +663,11 @@ msgstr "%(model)s 추가" msgid "Delete selected %(model)s" msgstr "선택된 %(model)s 제거" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "선택된 %(model)s 보기" + +msgid "Thanks for spending some quality time with the web site today." msgstr "사이트를 이용해 주셔서 고맙습니다." msgid "Log in again" @@ -688,6 +766,9 @@ msgstr "이메일 주소:" msgid "Reset my password" msgstr "비밀번호 초기화" +msgid "Select all objects on this page for an action" +msgstr "작업에 대한 이 페이지의 모든 객체를 선택합니다." + msgid "All dates" msgstr "언제나" diff --git a/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo index 8ef689d23183..85267f801e42 100644 Binary files a/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po index 6d52c03b99f3..adcf4491201f 100644 --- a/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ko/LC_MESSAGES/djangojs.po @@ -2,19 +2,24 @@ # # Translators: # DaHae Sung , 2016 +# alexhojinpark, 2023 # Hoseok Lee , 2016 # Jaehong Kim , 2011 # Jannis Leidel , 2011 +# Jay Oh , 2020 # Le Tartuffe , 2014 +# LEE Hwanyong , 2023 # minsung kang, 2015 +# Seoeun(Sun☀️) Hong, 2023 +# Yang Chan Woo , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Hoseok Lee \n" -"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: alexhojinpark, 2023\n" +"Language-Team: Korean (http://app.transifex.com/django/django/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -65,6 +70,10 @@ msgstr "" "선택된 %s 리스트 입니다. 아래의 상자에서 선택하고 두 상자 사이의 \"제거\" 화" "살표를 클릭하여 일부를 제거 할 수 있습니다." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "선택된 %s의 리스트를 필터링 하려면 이 박스에 입력 하세요 ." + msgid "Remove all" msgstr "모두 제거" @@ -72,6 +81,11 @@ msgstr "모두 제거" msgid "Click to remove all chosen %s at once." msgstr "한번에 선택된 모든 %s 를 제거하려면 클릭하세요." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s 선택된 옵션은 표시되지 않습니다." + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s개가 %(cnt)s개 중에 선택됨." @@ -84,16 +98,16 @@ msgstr "" "지 않은 값들을 잃어버리게 됩니다." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "개별 필드의 값들을 저장하지 않고 액션을 선택했습니다. OK를 누르면 저장되며, " "액션을 한 번 더 실행해야 합니다." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "개별 필드에 아무런 변경이 없는 상태로 액션을 선택했습니다. 저장 버튼이 아니" @@ -181,6 +195,103 @@ msgstr "11월" msgid "December" msgstr "12월" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "1월" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "2월" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "3월" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "4월" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "5월" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "6월" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "7월" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "8월" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "9월" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "10월" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "11월" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "12월" + +msgid "Sunday" +msgstr "일요일" + +msgid "Monday" +msgstr "월요일" + +msgid "Tuesday" +msgstr "화요일" + +msgid "Wednesday" +msgstr "수요일" + +msgid "Thursday" +msgstr "목요일" + +msgid "Friday" +msgstr "금요일" + +msgid "Saturday" +msgstr "토요일" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "일" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "월" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "화" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "수" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "목" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "금" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "토" + msgctxt "one letter Sunday" msgid "S" msgstr "일" diff --git a/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..71d5e5b3caad Binary files /dev/null and b/django/contrib/admin/locale/ky/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ky/LC_MESSAGES/django.po b/django/contrib/admin/locale/ky/LC_MESSAGES/django.po new file mode 100644 index 000000000000..683480cf13d7 --- /dev/null +++ b/django/contrib/admin/locale/ky/LC_MESSAGES/django.po @@ -0,0 +1,711 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Belek , 2016 +# Chyngyz Monokbaev , 2016 +# Soyuzbek Orozbek uulu , 2020-2021 +# Soyuzbek Orozbek uulu , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-27 14:12+0000\n" +"Last-Translator: Soyuzbek Orozbek uulu \n" +"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ky\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Тандалган %(verbose_name_plural)s элементтерин өчүрүү" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s ийгиликтүү өчүрүлдү." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s өчүрүү мүмкүн эмес" + +msgid "Are you sure?" +msgstr "Чечимиңиз аныкпы?" + +msgid "Administration" +msgstr "Башкаруу" + +msgid "All" +msgstr "Баары" + +msgid "Yes" +msgstr "Ооба" + +msgid "No" +msgstr "Жок" + +msgid "Unknown" +msgstr "Такталбаган" + +msgid "Any date" +msgstr "Кааалаган бир күн" + +msgid "Today" +msgstr "Бүгүн" + +msgid "Past 7 days" +msgstr "Өткөн 7 күн" + +msgid "This month" +msgstr "Бул айда" + +msgid "This year" +msgstr "Бул жылда" + +msgid "No date" +msgstr "Күн белгиленген эмес" + +msgid "Has date" +msgstr "Күн белгиленген" + +msgid "Empty" +msgstr "Бош" + +msgid "Not empty" +msgstr "Бош эмес" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Сураныч кызматкердин %(username)s жана сыр сөзүн туура жазыңыз. Эки " +"талаага тең баш тамга же кичүү тамга менен жазганыңыз маанилүү экенин эске " +"тутуңуз." + +msgid "Action:" +msgstr "Аракет" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Дагы %(verbose_name)s кошуу" + +msgid "Remove" +msgstr "Алып таштоо" + +msgid "Addition" +msgstr "Кошумча" + +msgid "Change" +msgstr "Өзгөртүү" + +msgid "Deletion" +msgstr "Өчүрүү" + +msgid "action time" +msgstr "аракет убактысы" + +msgid "user" +msgstr "колдонуучу" + +msgid "content type" +msgstr "Контент тиби" + +msgid "object id" +msgstr "объекттин id-си" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "объекттин repr-и" + +msgid "action flag" +msgstr "аракет белгиси" + +msgid "change message" +msgstr "билдирүүнү өзгөртүү" + +msgid "log entry" +msgstr "Жазуу журналы" + +msgid "log entries" +msgstr "Жазуу журналдары" + +#, python-format +msgid "Added “%(object)s”." +msgstr "“%(object)s” кошулду" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” — %(changes)s өзгөрдү" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "“%(object)s.” өчүрүлдү" + +msgid "LogEntry Object" +msgstr "LogEntry обектиси" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "{name} “{object}” кошулду" + +msgid "Added." +msgstr "Кошулду." + +msgid "and" +msgstr "жана" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "{name} “{object}” үчүн {fields} өзгөртүлдү." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} өзгөртүлдү." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "{name} “{object}” өчүрүлдү." + +msgid "No fields changed." +msgstr "Эч бир талаа өзгөртүлгөн жок" + +msgid "None" +msgstr "Эчбир" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "Көбүрөөк тандоо үчүн “CTRL”, же макбук үчүн “Cmd” кармап туруңуз." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} \"{obj}\" ийгиликтүү кошулду." + +msgid "You may edit it again below." +msgstr "Сиз муну төмөндө кайра өзгөртүшүңүз мүмкүн." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "{name} \"{obj}\" ийгиликтүү кошулду. Сиз башка {name} кошо аласыз." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "{name} “{obj}” ийгиликтүү өзгөрдү. Сиз аны төмөндө өзгөртө аласыз." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} “{obj}” ийгиликтүү кошулду. Сиз аны төмөндө өзгөртө аласыз." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} “{obj}” ийгиликтүү өзгөрдү. Төмөндө башка {name} кошсоңуз болот." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} \"{obj}\" ийгиликтүү өзгөрдү." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Нерселердин үстүнөн аракет кылуудан мурда алар тандалуусу керек. Эч " +"нерсеөзгөргөн жок." + +msgid "No action selected." +msgstr "Аракет тандалган жок." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s \"%(obj)s\" ийгиликтүү өчүрүлдү" + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" +"ID си %(key)s\" болгон %(name)s табылган жок. Ал өчүрүлгөн болуп жүрбөсүн?" + +#, python-format +msgid "Add %s" +msgstr "%s кошуу" + +#, python-format +msgid "Change %s" +msgstr "%s өзгөртүү" + +#, python-format +msgid "View %s" +msgstr "%s көрүү" + +msgid "Database error" +msgstr "Берилиштер базасында ката" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s%(name)s ийгиликтүү өзгөртүлдү." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Бүт %(total_count)s тандалды" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s нерседен эчтемке тандалган жок" + +#, python-format +msgid "Change history: %s" +msgstr "%s тарыхын өзгөртүү" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s %(instance)s өчүрүлүүсү үчүн %(related_objects)s да " +"өчүрүлүүсү талап кылынат." + +msgid "Django site admin" +msgstr "Жанго башкарма сайты" + +msgid "Django administration" +msgstr "Жанго башкармасы" + +msgid "Site administration" +msgstr "Сайт башкармасы" + +msgid "Log in" +msgstr "Кирүү" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s башкармасы" + +msgid "Page not found" +msgstr "Барак табылган жок" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "Кечирим сурайбыз, сиз сураган барак табылбады." + +msgid "Home" +msgstr "Башкы" + +msgid "Server error" +msgstr "Сервер катасы" + +msgid "Server error (500)" +msgstr "Сервер (500) катасы" + +msgid "Server Error (500)" +msgstr "Сервер (500) катасы" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Ката кетти. Сайт башкармасына экат менен кайрылсаңыз тез арада маселе " +"чечилиши мүмкүн. Түшүнгөнүңүз үчүн рахмат." + +msgid "Run the selected action" +msgstr "Тандалган аракетти иштетиңиз" + +msgid "Go" +msgstr "Жөнө" + +msgid "Click here to select the objects across all pages" +msgstr "Барак боюнча бүт обекттерди тандоо үчүн чыкылдатыңыз" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Бүт %(total_count)s %(module_name)s тандаңыз" + +msgid "Clear selection" +msgstr "Тандоону бошотуу" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s колдонмосундагы моделдер" + +msgid "Add" +msgstr "Кошуу" + +msgid "View" +msgstr "Көрүү" + +msgid "You don’t have permission to view or edit anything." +msgstr "Сиз эчнерсени көрүүгө же өзгөртүүгө жеткиңиз жок." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Оболу колдонуучу атыңызды жана сырсөздү териңиз. Ошондо гана башка " +"маалыматтарын өзгөртө аласыз." + +msgid "Enter a username and password." +msgstr "колдонуучу атыңызды жана сырсөз киргизиңиз." + +msgid "Change password" +msgstr "Сырсөз өзгөртүү" + +msgid "Please correct the error below." +msgstr "Төмөнкү катаны оңдоңуз." + +msgid "Please correct the errors below." +msgstr "Төмөнкү каталарды оңдоңуз" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "%(username)s үчүн жаңы сырсөз териңиз." + +msgid "Welcome," +msgstr "Кош келиңиз," + +msgid "View site" +msgstr "Сайтты ачуу" + +msgid "Documentation" +msgstr "Түшүндүрмө" + +msgid "Log out" +msgstr "Чыгуу" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)s кошуу" + +msgid "History" +msgstr "Тарых" + +msgid "View on site" +msgstr "Сайтта көрүү" + +msgid "Filter" +msgstr "Чыпкалоо" + +msgid "Clear all filters" +msgstr "Бүт чыпкаларды алып салуу" + +msgid "Remove from sorting" +msgstr "Ирээттөөдөн алып салуу" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Ирээттөө абзелдүүлүгү: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Ирээтти алмаштыруу" + +msgid "Delete" +msgstr "Өчүрүү" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " +"обекттерди өчүрүү да талап кылынат. Бирок сиздин буга жеткиңиз жок:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s '%(escaped_object)s өчүрүү үчүн башка байланышкан " +"обекттерди өчүрүү да талап кылат:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Сиз чындап эле %(object_name)s \"%(escaped_object)s\" өчүрүүнү каалайсызбы? " +"Бүт байланышкан нерселер өчүрүлөт:" + +msgid "Objects" +msgstr "Обекттер" + +msgid "Yes, I’m sure" +msgstr "Ооба, мен чындап эле" + +msgid "No, take me back" +msgstr "Жок, мени аркага кайтар" + +msgid "Delete multiple objects" +msgstr "обекттерди өчүр" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " +"кылат. Бирок сиздин буга жеткиңиз жок:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"%(objects_name)s өчүрүү үчүн башка байланышкан обекттерди өчүрүү да талап " +"кылат:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"чындап эле %(objects_name)s өчүрүүнү каалайсызбы? Бүт байланышкан нерселер " +"өчүрүлөт:" + +msgid "Delete?" +msgstr "Өчүрөлүбү?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s боюнча" + +msgid "Summary" +msgstr "Жалпысынан" + +msgid "Recent actions" +msgstr "Акыркы аракеттер" + +msgid "My actions" +msgstr "Менин аракеттерим" + +msgid "None available" +msgstr "Мүмкүн эмес" + +msgid "Unknown content" +msgstr "Белгисиз мазмун" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Сиздин базаңызды орнотуу боюнча ката кетти. Керектүү база жадыбалдары " +"түзүлгөндүгүн жана тиешелүү колдонуучунун жеткиси барлыгын текшериңиз." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Сиз %(username)s катары киргенсиз, бирок сиздин бул баракка жеткиңиз жок. " +"Сиз башка колдонуучу катары киресизби?" + +msgid "Forgotten your password or username?" +msgstr "Колдонуучу атыңыз же сырсөздү унутуп калдыңызбы?" + +msgid "Toggle navigation" +msgstr "Навигацияны алмаштыруу" + +msgid "Start typing to filter…" +msgstr "чыпкалоо үчүн жазып башта" + +msgid "Filter navigation items" +msgstr "Навигация элементтерин чыпкалоо" + +msgid "Date/time" +msgstr "Күн/убакыт" + +msgid "User" +msgstr "Колдонуучу" + +msgid "Action" +msgstr "Аракет" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "Бул обекттин өзгөрүү тарыхы жок." + +msgid "Show all" +msgstr "Баарын көрсөтүү" + +msgid "Save" +msgstr "Сактоо" + +msgid "Popup closing…" +msgstr "Жалтаң жабылуу..." + +msgid "Search" +msgstr "Издөө" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "жыйынтыгы:%(counter)s" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "жалпысынан %(full_result_count)s" + +msgid "Save as new" +msgstr "Жаңы катары сактоо" + +msgid "Save and add another" +msgstr "Сакта жана башкасын кош" + +msgid "Save and continue editing" +msgstr "Сакта жана өзгөртүүнү улант" + +msgid "Save and view" +msgstr "Сактап туруп көрүү" + +msgid "Close" +msgstr "Жабуу" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Тандалган %(model)s өзгөртүү" + +#, python-format +msgid "Add another %(model)s" +msgstr "Башка %(model)s кошуу" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Тандалган %(model)s обеттерин өчүрүү" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Сайтта бираз убакыт өткөргөн үчүн ыраазычылык." + +msgid "Log in again" +msgstr "Кайрадан кирүү" + +msgid "Password change" +msgstr "Сырсөз өзгөрт" + +msgid "Your password was changed." +msgstr "Сиздин сырсөз өзгөрдү." + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Коопсуздуктан улам эски сырсөздү териңиз, жана биз коошкондугун текшерүү " +"үчүн жаңы сырсөздү эки жолу териңиз." + +msgid "Change my password" +msgstr "Сырсөздү өзгөрт" + +msgid "Password reset" +msgstr "Сырсөздү кыйратуу" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" +"Сиздин сырсөз орнотулду. Эми сиз алдыга карай жылып, кирүү аткарсаңыз болот." + +msgid "Password reset confirmation" +msgstr "Сырсөздү кыйратуу тастыктамасы" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Тууралыгын жана коошкондугун текшере алышыбыз үчүн сырсөздү эки жолу териңиз." + +msgid "New password:" +msgstr "Жаңы сырсөз" + +msgid "Confirm password:" +msgstr "Сырсөз тастыктоосу:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Сырсөз кыйратуу шилтемеси жараксыз, мурдатан эле колдонулган болушу мүмкүн. " +"Башка шилтеме сурап көрүңүз." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Сырсөз тууралуу сизге кат жөнөттүк. Эгер мындай аккаунт бар болсо аны тез " +"арада ала аласыз." + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Эгер сиз екат албасаңыз даректин тууралыган текшериңиз жана спам папкасын " +"текшериңиз." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "Сиз %(site_name)s боюнча сырсөз сураган үчүн бул экат келди." + +msgid "Please go to the following page and choose a new password:" +msgstr "Төмөнкү баракка кириңиз да жаңы сырсөз тандаңыз." + +msgid "Your username, in case you’ve forgotten:" +msgstr "Сиздин колдонуучу атыңыз, унутуп калсаңыз керек болот." + +msgid "Thanks for using our site!" +msgstr "Биздин сайтты колдонгонуңуз үчүн рахмат!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s жамааты" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "Сырсөз унуттуңузбу? едарек териңиз сизге сырсөз боюнча экат жөнөтөбүз." + +msgid "Email address:" +msgstr "едарек:" + +msgid "Reset my password" +msgstr "Сырсөзүмдү кыйрат" + +msgid "All dates" +msgstr "Бүт күндөр" + +#, python-format +msgid "Select %s" +msgstr "%s тандоо" + +#, python-format +msgid "Select %s to change" +msgstr "%s обекттерин өзгөртүү үчүн тандоо" + +#, python-format +msgid "Select %s to view" +msgstr "%s обекттерин көрүү үчүн тандоо" + +msgid "Date:" +msgstr "Күн:" + +msgid "Time:" +msgstr "Убак:" + +msgid "Lookup" +msgstr "Көз чаптыруу" + +msgid "Currently:" +msgstr "Азыркы:" + +msgid "Change:" +msgstr "Өзгөртүү:" diff --git a/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..037e5fd78e1b Binary files /dev/null and b/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..76ca7384a69d --- /dev/null +++ b/django/contrib/admin/locale/ky/LC_MESSAGES/djangojs.po @@ -0,0 +1,260 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Soyuzbek Orozbek uulu , 2020-2021 +# Soyuzbek Orozbek uulu , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-04-02 11:44+0000\n" +"Last-Translator: Soyuzbek Orozbek uulu \n" +"Language-Team: Kyrgyz (http://www.transifex.com/django/django/language/ky/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ky\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s даана жеткиликтүү" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Бул жеткиликтүү тизмеси %s даана . Сиз төмөндө кутудан кээ бирлерин \"Тандоо" +"\" баскычын басуу менен тандап алсаңыз болот." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Жеткиликтүү %s даана тизмесин чыпкалоо үчүн төмөнкү кутуга жазыңыз." + +msgid "Filter" +msgstr "Чыпкалоо" + +msgid "Choose all" +msgstr "Баарын тандоо" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Бүт %s даананы заматта тандоо үчүн чыкылдатыңыз." + +msgid "Choose" +msgstr "Тандоо" + +msgid "Remove" +msgstr "Алып таштоо" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s даана тандалды" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Бул тандалган %s даана. Сиз алардын каалаганын төмөндө кутудан \"Өчүр\" " +"баскычын басуу менен өчүрө аласыз." + +msgid "Remove all" +msgstr "Баарын алып ташта" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Тандалган %s даананын баарын өчүрүү үчүн басыңыз" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(cnt)sнерседен %(sel)sтандалды" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Сиз өзүнчө аймактарда сакталбаган өзгөртүүлөргө ээсиз. Эгер сиз бул аракетти " +"жасасаңыз сакталбаган өзгөрүүлөр текке кетет." + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"Сиз аракетти тандадыңыз бирок өзүнчө аймактарды сактай элексиз. Сактоо үчүн " +"ОК ту басыңыз. Сиз аракетти кайталашыңыз керек." + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Сиз аракетти тандадыңыз жана өзүнчө аймактарда өзгөртүү киргизген жоксуз. " +"Сиз Сактоонун ордуна Жөнө баскычын басууңуз керек." + +msgid "Now" +msgstr "Азыр" + +msgid "Midnight" +msgstr "Түнүчү" + +msgid "6 a.m." +msgstr "саарлап саат 6" + +msgid "Noon" +msgstr "Түш" + +msgid "6 p.m." +msgstr "Кэч саат 6" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Эскертүү: Сиз серверден %s саат алдыда жүрөсүз." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Эскертүү: Сиз серверден %s саат аркада жүрөсүз." + +msgid "Choose a Time" +msgstr "Толук убак танда" + +msgid "Choose a time" +msgstr "Кыска убак танда" + +msgid "Cancel" +msgstr "Жокко чыгар" + +msgid "Today" +msgstr "Бүгүн" + +msgid "Choose a Date" +msgstr "Күн танда" + +msgid "Yesterday" +msgstr "Кечээ" + +msgid "Tomorrow" +msgstr "Эртең" + +msgid "January" +msgstr "Январь" + +msgid "February" +msgstr "Февраль" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрель" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июнь" + +msgid "July" +msgstr "Июль" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябрь" + +msgid "October" +msgstr "Октябрь" + +msgid "November" +msgstr "Ноябрь" + +msgid "December" +msgstr "Декабрь" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Янв" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Фев" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Мар" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Апр" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Июн" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Июл" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Авг" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Сен" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Окт" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Ноя" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Дек" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Жек" + +msgctxt "one letter Monday" +msgid "M" +msgstr "Дүй" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Шей" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Шар" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "Бей" + +msgctxt "one letter Friday" +msgid "F" +msgstr "Жума" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Ише" + +msgid "Show" +msgstr "Көрсөт" + +msgid "Hide" +msgstr "Жашыр" diff --git a/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo b/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo index aa09d47ad717..15ac7ec8ab74 100644 Binary files a/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/lv/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/lv/LC_MESSAGES/django.po b/django/contrib/admin/locale/lv/LC_MESSAGES/django.po index 5159d7c7b790..e4ac00a5ad05 100644 --- a/django/contrib/admin/locale/lv/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/lv/LC_MESSAGES/django.po @@ -2,20 +2,22 @@ # # Translators: # edgars , 2011 -# NullIsNot0 , 2017 -# NullIsNot0 , 2018 +# Edgars Voroboks , 2023-2024 +# Edgars Voroboks , 2017,2022 +# Edgars Voroboks , 2018 # Jannis Leidel , 2011 # Māris Nartišs , 2016 -# NullIsNot0 , 2019 +# Edgars Voroboks , 2019-2021 # peterisb , 2016 +# Pēteris Caune, 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-07 08:06+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Edgars Voroboks , 2023-2024\n" +"Language-Team: Latvian (http://app.transifex.com/django/django/language/" "lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,6 +26,10 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Izdzēst izvēlēto %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Veiksmīgi izdzēsti %(count)d %(items)s." @@ -35,10 +41,6 @@ msgstr "Nevar izdzēst %(name)s" msgid "Are you sure?" msgstr "Vai esat pārliecināts?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izdzēst izvēlēto %(verbose_name_plural)s" - msgid "Administration" msgstr "Administrācija" @@ -75,13 +77,19 @@ msgstr "Nav datums" msgid "Has date" msgstr "Ir datums" +msgid "Empty" +msgstr "Tukšs" + +msgid "Not empty" +msgstr "Nav tukšs" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" "Lūdzu ievadi korektu %(username)s un paroli personāla kontam. Ņem vērā, ka " -"abi ievades lauki ir reģistr jūtīgi." +"abi ievades lauki ir reģistrjutīgi." msgid "Action:" msgstr "Darbība:" @@ -158,7 +166,7 @@ msgstr "un" #, python-brace-format msgid "Changed {fields} for {name} “{object}”." -msgstr "Laboti {fields} {name} “{object}”." +msgstr "Mainīti {fields} priekš {name} “{object}”." #, python-brace-format msgid "Changed {fields}." @@ -169,7 +177,7 @@ msgid "Deleted {name} “{object}”." msgstr "Dzēsts {name} “{object}”." msgid "No fields changed." -msgstr "Lauki nav izmainīti" +msgstr "Neviens lauks nav mainīts." msgid "None" msgstr "nekas" @@ -179,6 +187,9 @@ msgstr "" "Turiet nospiestu “Control”, vai “Command” uz Mac, lai iezīmētu vairāk par " "vienu." +msgid "Select this object for an action - {}" +msgstr "Atzīmējiet šo objektu darbībai - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” veiksmīgi pievienots." @@ -194,26 +205,25 @@ msgstr "{name} “{obj}” veiksmīgi pievienots. Zemāk varat pievienot vēl {n #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." -msgstr "{name} “{obj}” veiksmīgi labots. Zemāk to varat atkal labot." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” veiksmīgi pievienots. Zemāk to varat atkal labot." +msgstr "{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat to labot vēlreiz." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} “{obj}” veiksmīgi labots. Zemāk varat pievienot vēl {name}." +msgstr "" +"{name} “{obj}” tika veiksmīgi mainīts. Zemāk varat pievienot vēl {name}." #, python-brace-format msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} “{obj}” veiksmīgi labots." +msgstr "{name} “{obj}” tika veiksmīgi mainīts." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." -msgstr "Lai veiktu darbību, jāizvēlas rindas. Rindas nav izmainītas." +msgstr "" +"Vienumi ir jāatlasa, lai ar tiem veiktu darbības. Neviens vienums nav " +"mainīts." msgid "No action selected." msgstr "Nav izvēlēta darbība." @@ -244,9 +254,9 @@ msgstr "Datubāzes kļūda" #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s ir laboti sekmīgi" -msgstr[1] "%(count)s %(name)s ir sekmīgi rediģēts" -msgstr[2] "%(count)s %(name)s ir sekmīgi rediģēti." +msgstr[0] "%(count)s %(name)s tika veiksmīgi mainīti." +msgstr[1] "%(count)s %(name)s tika veiksmīgi mainīts." +msgstr[2] "%(count)s %(name)s tika veiksmīgi mainīti." #, python-format msgid "%(total_count)s selected" @@ -263,8 +273,9 @@ msgstr "0 no %(cnt)s izvēlēti" msgid "Change history: %s" msgstr "Izmaiņu vēsture: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -334,6 +345,22 @@ msgstr "Izvēlēties visus %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Atcelt iezīmēto" +msgid "Breadcrumbs" +msgstr "Atpakaļceļi" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeļi %(name)s lietotnē" + +msgid "Add" +msgstr "Pievienot" + +msgid "View" +msgstr "Apskatīt" + +msgid "You don’t have permission to view or edit anything." +msgstr "Jums nav tiesību neko skatīt vai labot." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -347,16 +374,35 @@ msgstr "Ievadi lietotājvārdu un paroli." msgid "Change password" msgstr "Paroles maiņa" -msgid "Please correct the error below." -msgstr "Lūdzu izlabojiet zemāk redzamo kļūdu." +msgid "Set password" +msgstr "Iestatīt paroli" -msgid "Please correct the errors below." -msgstr "Lūdzu labo kļūdas zemāk." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Lūdzu, izlabojiet zemāk norādītās kļūdas." +msgstr[1] "Lūdzu, izlabojiet zemāk norādīto kļūdu." +msgstr[2] "Lūdzu, izlabojiet zemāk norādītās kļūdas." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Ievadiet jaunu paroli lietotājam %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Šī darbība šim lietotājam iespējos paroles bāzētu " +"autentifikāciju." + +msgid "Disable password-based authentication" +msgstr "Atspējot paroles bāzētu autentifikāciju" + +msgid "Enable password-based authentication" +msgstr "Iespējot paroles bāzētu autentifikāciju" + +msgid "Skip to main content" +msgstr "Pāriet uz galveno saturu" + msgid "Welcome," msgstr "Sveicināti," @@ -382,6 +428,15 @@ msgstr "Apskatīt lapā" msgid "Filter" msgstr "Filtrs" +msgid "Hide counts" +msgstr "Slēpt skaitu" + +msgid "Show counts" +msgstr "Rādīt skaitu" + +msgid "Clear all filters" +msgstr "Notīrīt visus filtrus" + msgid "Remove from sorting" msgstr "Izņemt no kārtošanas" @@ -392,6 +447,15 @@ msgstr "Kārtošanas prioritāte: %(priority_number)s" msgid "Toggle sorting" msgstr "Pārslēgt kārtošanu" +msgid "Toggle theme (current theme: auto)" +msgstr "Pārslēgt motīvu (pašreizējais motīvs: automātisks)" + +msgid "Toggle theme (current theme: light)" +msgstr "Pārslēgt motīvu (pašreizējais motīvs: gaišs)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Pārslēgt motīvu (pašreizējais motīvs: tumšs)" + msgid "Delete" msgstr "Dzēst" @@ -417,8 +481,8 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s \"%(escaped_object)s" -"\"? Tiks dzēsti arī sekojoši saistītie objekti:" +"Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s " +"\"%(escaped_object)s\"? Tiks dzēsti arī sekojoši saistītie objekti:" msgid "Objects" msgstr "Objekti" @@ -457,9 +521,6 @@ msgstr "" "Vai esat pārliecināts, ka vēlaties dzēst izvēlētos %(objects_name)s " "objektus? Visi sekojošie objekti un tiem piesaistītie objekti tiks izdzēsti:" -msgid "View" -msgstr "Apskatīt" - msgid "Delete?" msgstr "Dzēst?" @@ -470,16 +531,6 @@ msgstr " Pēc %(filter_title)s " msgid "Summary" msgstr "Kopsavilkums" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeļi %(name)s lietotnē" - -msgid "Add" -msgstr "Pievienot" - -msgid "You don’t have permission to view or edit anything." -msgstr "Jums nav tiesību neko skatīt vai labot." - msgid "Recent actions" msgstr "Nesenās darbības" @@ -489,6 +540,15 @@ msgstr "Manas darbības" msgid "None available" msgstr "Nav pieejams" +msgid "Added:" +msgstr "Pievienots:" + +msgid "Changed:" +msgstr "Mainīts:" + +msgid "Deleted:" +msgstr "Izdzēsts:" + msgid "Unknown content" msgstr "Nezināms saturs" @@ -511,6 +571,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Aizmirsi paroli vai lietotājvārdu?" +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Sidebar" +msgstr "Sānjosla" + +msgid "Start typing to filter…" +msgstr "Sāciet rakstīt, lai atlasītu…" + +msgid "Filter navigation items" +msgstr "Atlasīt navigācijas vienības" + msgid "Date/time" msgstr "Datums/laiks" @@ -520,6 +592,12 @@ msgstr "Lietotājs" msgid "Action" msgstr "Darbība" +msgid "entry" +msgid_plural "entries" +msgstr[0] "ieraksti" +msgstr[1] "ieraksts" +msgstr[2] "ieraksti" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -577,8 +655,12 @@ msgstr "Pievienot citu %(model)s" msgid "Delete selected %(model)s" msgstr "Dzēst izvēlēto %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Paldies par pavadīto laiku mājas lapā." +#, python-format +msgid "View selected %(model)s" +msgstr "Apskatīt atzīmētos %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Paldies, ka šodien vietnei veltījāt kvalitatīvu laiku." msgid "Log in again" msgstr "Pieslēgties vēlreiz" @@ -600,13 +682,13 @@ msgid "Change my password" msgstr "Nomainīt manu paroli" msgid "Password reset" -msgstr "Paroles pārstatīšana(reset)" +msgstr "Paroles atiestatīšana" msgid "Your password has been set. You may go ahead and log in now." -msgstr "Jūsu parole ir uzstādīta. Varat pieslēgties." +msgstr "Jūsu parole ir iestatīta. Varat pieslēgties." msgid "Password reset confirmation" -msgstr "Paroles pārstatīšanas apstiprinājums" +msgstr "Paroles atiestatīšanas apstiprinājums" msgid "" "Please enter your new password twice so we can verify you typed it in " @@ -625,7 +707,7 @@ msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" -"Paroles pārstatīšanas saite bija nekorekta, iespējams, tā jau ir izmantota. " +"Paroles atiestatīšanas saite bija nekorekta, iespējams, tā jau ir izmantota. " "Lūdzu pieprasiet paroles pārstatīšanu vēlreiz." msgid "" @@ -675,7 +757,10 @@ msgid "Email address:" msgstr "E-pasta adrese:" msgid "Reset my password" -msgstr "Paroles pārstatīšana" +msgstr "Paroles atiestatīšana" + +msgid "Select all objects on this page for an action" +msgstr "Atlasiet visus šīs lapas objektus darbībai" msgid "All dates" msgstr "Visi datumi" diff --git a/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo index 61e6e33e7e9d..e3f9a509d313 100644 Binary files a/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po index 4f1b55fe6a8f..0f1979a7626e 100644 --- a/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/lv/LC_MESSAGES/djangojs.po @@ -1,17 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# NullIsNot0 , 2017 +# Edgars Voroboks , 2023 +# Edgars Voroboks , 2017,2022 # Jannis Leidel , 2011 +# Edgars Voroboks , 2020-2021 # peterisb , 2016 +# Pēteris Caune, 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-11-18 08:13+0000\n" -"Last-Translator: NullIsNot0 \n" -"Language-Team: Latvian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Edgars Voroboks , 2023\n" +"Language-Team: Latvian (http://app.transifex.com/django/django/language/" "lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,8 +33,8 @@ msgid "" "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" "Šis ir saraksts ar pieejamajiem %s. Tev ir jāizvēlas atbilstošās vērtības " -"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izvēlēties" -"\", lai pārvietotu starp izvēļu sarakstiem." +"atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu " +"\"Izvēlēties\", lai pārvietotu starp izvēļu sarakstiem." #, javascript-format msgid "Type into this box to filter down the list of available %s." @@ -67,6 +70,10 @@ msgstr "" "atzīmējot izvēlēs zemāk esošajā sarakstā un pēc tam spiežot pogu \"Izņemt\", " "lai izņemtu no izvēlēto ierakstu saraksta." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Rakstiet šajā laukā, lai filtrētu atlasīto %s sarakstu." + msgid "Remove all" msgstr "Izņemt visu" @@ -74,6 +81,13 @@ msgstr "Izņemt visu" msgid "Click to remove all chosen %s at once." msgstr "Izvēlies, lai izņemtu visas %s izvēles vienā reizē." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s atlasītās opcijas nav redzamas" +msgstr[1] "%s atlasītā opcija nav redzama" +msgstr[2] "%s atlasītās opcijas nav redzamas" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s no %(cnt)s izvēlēts" @@ -88,20 +102,20 @@ msgstr "" "izpildīsiet izvēlēto darbību, šīs izmaiņas netiks saglabātas." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Jūs esat izvēlējies veikt darbību un neesat saglabājis veiktās izmaiņas. " -"Lūdzu nospiežat OK, lai saglabātu. Jums nāksies šo darbību izpildīt vēlreiz." +"Jūs esiet izvēlējies veikt darbību, bet neesiet saglabājis veiktās izmaiņas. " +"Lūdzu nospiediet OK, lai saglabātu. Šo darbību jums nāksies izpildīt vēlreiz." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Jūs esat izvēlējies veikt darbību un neesat izmainījis nevienu lauku. Jūs " -"droši vien meklējat pogu 'Aiziet' nevis 'Saglabāt'." +"Jūs esiet izvēlējies veikt darbību un neesiet mainījis nevienu lauku. Jūs " +"droši vien meklējiet pogu 'Aiziet' nevis 'Saglabāt'." msgid "Now" msgstr "Tagad" @@ -189,6 +203,103 @@ msgstr "novembris" msgid "December" msgstr "decembris" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jūn" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jūl" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec" + +msgid "Sunday" +msgstr "Svētdiena" + +msgid "Monday" +msgstr "Pirmdiena" + +msgid "Tuesday" +msgstr "Otrdiena" + +msgid "Wednesday" +msgstr "Trešdiena" + +msgid "Thursday" +msgstr "Ceturtdiena" + +msgid "Friday" +msgstr "Piektdiena" + +msgid "Saturday" +msgstr "Sestdiena" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Sv" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pr" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Ot" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Tr" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Ce" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pi" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Se" + msgctxt "one letter Sunday" msgid "S" msgstr "Sv" diff --git a/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo b/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo index 5674f69b397d..9f4d6e436a2c 100644 Binary files a/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/mk/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/mk/LC_MESSAGES/django.po b/django/contrib/admin/locale/mk/LC_MESSAGES/django.po index 09d8dd19375b..676173ca2c43 100644 --- a/django/contrib/admin/locale/mk/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/mk/LC_MESSAGES/django.po @@ -1,18 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Dimce Grozdanoski , 2021 # dekomote , 2015 # Jannis Leidel , 2011 -# Vasil Vangelovski , 2016-2017,2019 +# Martino Nikolovski, 2022 +# Vasil Vangelovski , 2016-2017,2019,2021 # Vasil Vangelovski , 2013-2015 # Vasil Vangelovski , 2011-2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 01:31+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-05-25 07:05+0000\n" +"Last-Translator: Martino Nikolovski, 2022\n" "Language-Team: Macedonian (http://www.transifex.com/django/django/language/" "mk/)\n" "MIME-Version: 1.0\n" @@ -21,6 +23,10 @@ msgstr "" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Избриши ги избраните %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Успешно беа избришани %(count)d %(items)s." @@ -32,10 +38,6 @@ msgstr "Не може да се избрише %(name)s" msgid "Are you sure?" msgstr "Сигурни сте?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Избриши ги избраните %(verbose_name_plural)s" - msgid "Administration" msgstr "Администрација" @@ -72,6 +74,12 @@ msgstr "Нема датум" msgid "Has date" msgstr "Има датум" +msgid "Empty" +msgstr "Празно" + +msgid "Not empty" +msgstr "" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -130,7 +138,7 @@ msgstr "ставки во записникот" #, python-format msgid "Added “%(object)s”." -msgstr "" +msgstr "Додадено “%(object)s”." #, python-format msgid "Changed “%(object)s” — %(changes)s" @@ -138,7 +146,7 @@ msgstr "" #, python-format msgid "Deleted “%(object)s.”" -msgstr "" +msgstr "Избришано “%(object)s.”" msgid "LogEntry Object" msgstr "Запис во дневник" @@ -159,11 +167,11 @@ msgstr "" #, python-brace-format msgid "Changed {fields}." -msgstr "Изменето {fields}." +msgstr "Изменети {fields}." #, python-brace-format msgid "Deleted {name} “{object}”." -msgstr "" +msgstr "Избришан {name} “{object}”." msgid "No fields changed." msgstr "Не е изменето ниедно поле." @@ -172,11 +180,11 @@ msgid "None" msgstr "Ништо" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." -msgstr "" +msgstr "Држете “Control” или “Command” на Mac за да изберете повеќе." #, python-brace-format msgid "The {name} “{obj}” was added successfully." -msgstr "" +msgstr "Успешно беше додадено {name} “{obj}”." msgid "You may edit it again below." msgstr "Можете повторно да го промените подолу." @@ -258,8 +266,9 @@ msgstr "0 од %(cnt)s избрани" msgid "Change history: %s" msgstr "Историја на измени: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -292,7 +301,7 @@ msgid "Page not found" msgstr "Страницата не е најдена" msgid "We’re sorry, but the requested page could not be found." -msgstr "" +msgstr "Се извинуваме, страница која ја побаравте не е пронајдена" msgid "Home" msgstr "Дома" @@ -310,6 +319,8 @@ msgid "" "There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"Наидовте на грешка. Известени се администраторите на страницата преку имејл " +"и би требало наскоро да биде поправена. Ви благодариме на трпението." msgid "Run the selected action" msgstr "Изврши ја избраната акција" @@ -327,10 +338,25 @@ msgstr "Избери ги сите %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Откажи го изборот" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Модели во %(name)s апликација" + +msgid "Add" +msgstr "Додади" + +msgid "View" +msgstr "Погледни" + +msgid "You don’t have permission to view or edit anything." +msgstr "Немате дозвола да прегледате или промените ништо" + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"Прво внесете корисничко име и лозинка па потоа ќе можете да уредувате повеќе " +"опции за корисникот" msgid "Enter a username and password." msgstr "Внесете корисничко име и лозинка." @@ -373,6 +399,9 @@ msgstr "Погледни на сајтот" msgid "Filter" msgstr "Филтер" +msgid "Clear all filters" +msgstr "Ресетирај ги сите филтри" + msgid "Remove from sorting" msgstr "Отстрани од сортирање" @@ -416,7 +445,7 @@ msgid "Objects" msgstr "Предмети" msgid "Yes, I’m sure" -msgstr "" +msgstr "Да, сигурен сум" msgid "No, take me back" msgstr "Не, врати ме назад" @@ -449,9 +478,6 @@ msgstr "" "Дали сте сигурни дека сакате да го избришете избраниот %(objects_name)s? " "Сите овие објекти и оние поврзани со нив ќе бидат избришани:" -msgid "View" -msgstr "Погледни" - msgid "Delete?" msgstr "Избриши?" @@ -462,16 +488,6 @@ msgstr " Според %(filter_title)s " msgid "Summary" msgstr "Резиме" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели во %(name)s апликација" - -msgid "Add" -msgstr "Додади" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "Последни акции" @@ -489,6 +505,9 @@ msgid "" "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"Нешто не е во ред со инсталацијата на базата на податоци. Уверете се дека " +"соодветните табели се создадени, и дека базата на податоци е пристапна до " +"соодветниот корисник." #, python-format msgid "" @@ -501,6 +520,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Ја заборавивте вашата лозинка или корисничко име?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "Започнете со пишување за да филтрирате..." + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Датум/час" @@ -510,6 +538,12 @@ msgstr "Корисник" msgid "Action" msgstr "Акција" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -564,9 +598,12 @@ msgstr "Додади уште %(model)s" msgid "Delete selected %(model)s" msgstr "Избриши ги избраните %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." msgstr "" -"Ви благодариме што денеска поминавте квалитетно време со интернет страницава." msgid "Log in again" msgstr "Најавете се повторно" @@ -636,7 +673,7 @@ msgid "Please go to the following page and choose a new password:" msgstr "Ве молам одете на следната страница и внесете нова лозинка:" msgid "Your username, in case you’ve forgotten:" -msgstr "" +msgstr "Вашето корисничко име, во случај да сте заборавиле:" msgid "Thanks for using our site!" msgstr "Ви благодариме што го користите овој сајт!" @@ -649,6 +686,8 @@ msgid "" "Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Ја заборавивте вашата лозинка? Внесете го вашиот имејл и ќе ви пратиме " +"инструкции да подесите нова лозинка. " msgid "Email address:" msgstr "Email адреса:" diff --git a/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo index 5b11c786c3af..c87ddf6d3808 100644 Binary files a/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po index 04e9dcbbe11f..bd7201027912 100644 --- a/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/mk/LC_MESSAGES/djangojs.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Vasil Vangelovski \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 11:28+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Macedonian (http://www.transifex.com/django/django/language/" "mk/)\n" "MIME-Version: 1.0\n" @@ -84,21 +84,31 @@ msgstr "" "незачувани промени ќе бидат изгубени." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Избравте акција, но сеуште ги немате зачувано вашите промени на поединечни " -"полиња. Кликнете ОК за да ги зачувате. Ќе треба повторно да ја извршите " -"акцијата." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Избравте акција и немате направено промени на поединечни полиња. Веројатно " -"го барате копчето Оди наместо Зачувај." + +msgid "Now" +msgstr "Сега" + +msgid "Midnight" +msgstr "Полноќ" + +msgid "6 a.m." +msgstr "6 наутро" + +msgid "Noon" +msgstr "Пладне" + +msgid "6 p.m." +msgstr "6 попладне" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -112,27 +122,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Забелешка: Вие сте %s час поназад од времето на серверот." msgstr[1] "Забелешка: Вие сте %s часа поназад од времето на серверот." -msgid "Now" -msgstr "Сега" - msgid "Choose a Time" msgstr "Одбери време" msgid "Choose a time" msgstr "Одбери време" -msgid "Midnight" -msgstr "Полноќ" - -msgid "6 a.m." -msgstr "6 наутро" - -msgid "Noon" -msgstr "Пладне" - -msgid "6 p.m." -msgstr "6 попладне" - msgid "Cancel" msgstr "Откажи" @@ -184,6 +179,54 @@ msgstr "Ноември" msgid "December" msgstr "Декември" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "" + msgctxt "one letter Sunday" msgid "S" msgstr "Н" diff --git a/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo index dd39d0a9b36d..f75d3d6ae29b 100644 Binary files a/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ml/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ml/LC_MESSAGES/django.po b/django/contrib/admin/locale/ml/LC_MESSAGES/django.po index 776202c6f726..d96aab9b9cb6 100644 --- a/django/contrib/admin/locale/ml/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ml/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ # # Translators: # Aby Thomas , 2014 -# Hrishikesh , 2019 +# Hrishikesh , 2019-2020 # Jannis Leidel , 2011 # JOMON THOMAS LOBO , 2019 # Junaid , 2012 @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-03-26 07:56+0000\n" -"Last-Translator: JOMON THOMAS LOBO \n" +"POT-Creation-Date: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-14 22:38+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Malayalam (http://www.transifex.com/django/django/language/" "ml/)\n" "MIME-Version: 1.0\n" @@ -74,6 +74,12 @@ msgstr "തിയ്യതിയില്ല " msgid "Has date" msgstr "തിയ്യതിയുണ്ട്" +msgid "Empty" +msgstr "കാലി" + +msgid "Not empty" +msgstr "കാലിയല്ല" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -131,32 +137,32 @@ msgid "log entries" msgstr "ലോഗ് എൻട്രികള്‍" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" ചേര്‍ത്തു." +msgid "Added “%(object)s”." +msgstr "“%(object)s” ചേർത്തു." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\"ല്‍ %(changes)s മാറ്റം വരുത്തി" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” മാറ്റം വരുത്തി — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" നീക്കം ചെയ്തു." +msgid "Deleted “%(object)s.”" +msgstr "" msgid "LogEntry Object" msgstr "ലോഗ്‌എന്‍ട്രി ഒബ്ജെക്റ്റ്" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr " {name} \"{object}\" ചേർത്തിരിക്കുന്നു ." +msgid "Added {name} “{object}”." +msgstr "" msgid "Added." msgstr "ചേര്‍ത്തു." msgid "and" -msgstr "ഉം" +msgstr "കൂടാതെ" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "" #, python-brace-format @@ -164,8 +170,8 @@ msgid "Changed {fields}." msgstr "" #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr " {name} \"{object}\". ഡിലീറ്റ് ചെയ്തു " +msgid "Deleted {name} “{object}”." +msgstr "" msgid "No fields changed." msgstr "ഒരു മാറ്റവുമില്ല." @@ -173,59 +179,54 @@ msgstr "ഒരു മാറ്റവുമില്ല." msgid "None" msgstr "ഒന്നുമില്ല" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" വിജയകരമായി ചേർത്തിരിക്കുന്നു " +msgid "The {name} “{obj}” was added successfully." +msgstr "" msgid "You may edit it again below." msgstr "താഴെ നിങ്ങൾക്കിത് വീണ്ടും എഡിറ്റുചെയ്യാം" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -" {name} \"{obj}\" വിജയകരമായി ചേർത്തിരിക്കുന്നു . നിങ്ങൾക്ക് പുതിയ ഒരു {name} താഴെ " -"ചേർക്കാവുന്നതാണ് " #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "" msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." -msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നും മാറ്റിയിട്ടില്ല." +msgstr "ആക്ഷന്‍ നടപ്പിലാക്കേണ്ട വകകള്‍ തെരഞ്ഞെടുക്കണം. ഒന്നിലും മാറ്റങ്ങൾ വരുത്തിയിട്ടില്ല." msgid "No action selected." msgstr "ആക്ഷനൊന്നും തെരഞ്ഞെടുത്തിട്ടില്ല." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" നീക്കം ചെയ്തു." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" #, python-format @@ -247,7 +248,7 @@ msgstr "ഡേറ്റാബേസ് എറർ." msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." -msgstr[1] "%(count)s %(name)s ല്‍ മാറ്റം വരുത്തി." +msgstr[1] "%(count)s %(name)s വിജയകരമായി മാറ്റി" #, python-format msgid "%(total_count)s selected" @@ -296,7 +297,7 @@ msgstr "%(app)s കാര്യനിർവഹണം" msgid "Page not found" msgstr "പേജ് കണ്ടെത്താനായില്ല" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "ക്ഷമിക്കണം, ആവശ്യപ്പെട്ട പേജ് കണ്ടെത്താന്‍ കഴിഞ്ഞില്ല." msgid "Home" @@ -312,11 +313,9 @@ msgid "Server Error (500)" msgstr "സെര്‍വറിൽ എന്തോ പ്രശ്നം (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"എന്തോ പ്രശ്നം സംഭവിച്ചിരിക്കുന്നു. സൈറ്റിന്റെ കാര്യനിർവാഹകരെ ഈമെയിൽ മുഖാന്തരം വിവരം " -"അറിയിച്ചിട്ടുണ്ട്. ക്ഷമയോടെ കത്തിരിക്കുനതിന് നന്ദി." msgid "Run the selected action" msgstr "തെരഞ്ഞെടുത്ത ആക്ഷന്‍ നടപ്പിലാക്കുക" @@ -334,10 +333,25 @@ msgstr "മുഴുവന്‍ %(total_count)s %(module_name)s ഉം തെ msgid "Clear selection" msgstr "തെരഞ്ഞെടുത്തത് റദ്ദാക്കുക." +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s മാതൃകയിലുള്ള" + +msgid "Add" +msgstr "ചേര്‍ക്കുക" + +msgid "View" +msgstr "കാണുക" + +msgid "You don’t have permission to view or edit anything." +msgstr "നിങ്ങൾക്ക് ഒന്നും കാണാനോ തിരുത്താനോ ഉള്ള അനുമതിയില്ല." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." -msgstr "ആദ്യം, യൂസര്‍ നാമവും പാസ് വേര്‍ഡും നല്കണം. പിന്നെ, കൂടുതല്‍ കാര്യങ്ങള്‍ മാറ്റാവുന്നതാണ്." +msgstr "" +"ആദ്യമായി ഒരു യൂസർനെയിമും പാസ്‌‌വേഡും നൽകുക. തുടർന്ന്, നിങ്ങൾക്ക് കൂടുതൽ കാര്യങ്ങളിൽ മാറ്റം " +"വരുത്താവുന്നതാണ്" msgid "Enter a username and password." msgstr "Enter a username and password." @@ -380,6 +394,9 @@ msgstr "View on site" msgid "Filter" msgstr "അരിപ്പ" +msgid "Clear all filters" +msgstr "എല്ലാ ഫിൽറ്ററുകളും ഒഴിവാക്കുക" + msgid "Remove from sorting" msgstr "ക്രമീകരണത്തില്‍ നിന്നും ഒഴിവാക്കുക" @@ -422,8 +439,8 @@ msgstr "" msgid "Objects" msgstr "വസ്തുക്കൾ" -msgid "Yes, I'm sure" -msgstr "അതെ, തീര്‍ച്ചയാണ്" +msgid "Yes, I’m sure" +msgstr "അതെ, എനിക്കുറപ്പാണ്" msgid "No, take me back" msgstr "ഇല്ല, എന്നെ തിരിച്ചെടുക്കൂ" @@ -456,9 +473,6 @@ msgstr "" "തിരഞ്ഞെടുക്കപ്പെട്ട %(objects_name)s നീക്കം ചെയ്യണമെന്നു ഉറപ്പാണോ ? തിരഞ്ഞെടുക്കപ്പെട്ടതും " "അതിനോട് ബന്ധപ്പെട്ടതും ആയ എല്ലാ താഴെപ്പറയുന്ന വസ്തുക്കളും നീക്കം ചെയ്യുന്നതാണ്:" -msgid "View" -msgstr "കാണുക" - msgid "Delete?" msgstr "ഡിലീറ്റ് ചെയ്യട്ടെ?" @@ -469,18 +483,8 @@ msgstr "%(filter_title)s ആൽ" msgid "Summary" msgstr "ചുരുക്കം" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s മാതൃകയിലുള്ള" - -msgid "Add" -msgstr "ചേര്‍ക്കുക" - -msgid "You don't have permission to view or edit anything." -msgstr "നിങ്ങൾക്ക് ഒന്നും കാണാനോ എഡിറ്റുചെയ്യാനോ അനുമതിയില്ല" - msgid "Recent actions" -msgstr "" +msgstr "സമീപകാല പ്രവൃത്തികൾ" msgid "My actions" msgstr "എന്റെ പ്രവർത്തനം" @@ -492,12 +496,10 @@ msgid "Unknown content" msgstr "ഉള്ളടക്കം അറിയില്ല." msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"നിങ്ങളുടെ ഡേറ്റാബേസ് ഇന്‍സ്ടാലേഷനില്‍ എന്തോ പിശകുണ്ട്. ശരിയായ ടേബിളുകള്‍ ഉണ്ടെന്നും ഡേറ്റാബേസ് " -"വായനായോഗ്യമാണെന്നും ഉറപ്പു വരുത്തുക." #, python-format msgid "" @@ -510,6 +512,9 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "രഹസ്യവാക്കോ ഉപയോക്തൃനാമമോ മറന്നുപോയോ?" +msgid "Toggle navigation" +msgstr "" + msgid "Date/time" msgstr "തീയതി/സമയം" @@ -520,11 +525,9 @@ msgid "Action" msgstr "പ്രവർത്തി" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"ഈ വസ്തുവിന്റെ മാറ്റങ്ങളുടെ ചരിത്രം ലഭ്യമല്ല. ഒരുപക്ഷെ ഇത് അഡ്മിന്‍ സൈറ്റ് വഴി ചേര്‍" -"ത്തതായിരിക്കില്ല." msgid "Show all" msgstr "എല്ലാം കാണട്ടെ" @@ -588,11 +591,9 @@ msgid "Your password was changed." msgstr "നിങ്ങളുടെ പാസ് വേര്‍ഡ് മാറ്റിക്കഴിഞ്ഞു." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"സുരക്ഷയ്ക്കായി നിങ്ങളുടെ പഴയ പാസ് വേര്‍ഡ് നല്കുക. പിന്നെ, പുതിയ പാസ് വേര്‍ഡ് രണ്ട് തവണ നല്കുക. " -"(ടയ്പ് ചെയ്തതു ശരിയാണെന്ന് ഉറപ്പാക്കാന്‍)" msgid "Change my password" msgstr "എന്റെ പാസ് വേര്‍ഡ് മാറ്റണം" @@ -627,16 +628,14 @@ msgstr "" "കഴിഞ്ഞതാവാം. പുതിയ ഒരു ലിങ്കിന് അപേക്ഷിക്കൂ." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"ഞങ്ങളുടെ ഇമെയിൽ കിട്ടിയില്ലെങ്കിൽ രജിസ്റ്റർ ചെയ്യാൻ ഉപയോകിച്ച അതെ ഇമെയിൽ വിലാസം തന്നെ " -"ആണോ എന്ന് ഉറപ്പ് വരുത്തുക. ശരിയാണെങ്കിൽ സ്പാം ഫോൾഡറിലും നോക്കുക " #, python-format msgid "" @@ -649,8 +648,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "ദയവായി താഴെ പറയുന്ന പേജ് സന്ദര്‍ശിച്ച് പുതിയ പാസ് വേര്‍ഡ് തെരഞ്ഞെടുക്കുക:" -msgid "Your username, in case you've forgotten:" -msgstr "നിങ്ങള്‍ മറന്നെങ്കില്‍, നിങ്ങളുടെ യൂസര്‍ നാമം, :" +msgid "Your username, in case you’ve forgotten:" +msgstr "" msgid "Thanks for using our site!" msgstr "ഞങ്ങളുടെ സൈറ്റ് ഉപയോഗിച്ചതിന് നന്ദി!" @@ -660,11 +659,9 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s പക്ഷം" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"പാസ് വേര്‍ഡ് മറന്നു പോയോ? നിങ്ങളുടെ ഇമെയിൽ വിലാസം താഴെ എഴുതുക. പാസ് വേർഡ്‌ മാറ്റാനുള്ള " -"നിർദേശങ്ങൾ ഇമെയിലിൽ അയച്ചു തരുന്നതായിരിക്കും." msgid "Email address:" msgstr "ഇമെയിൽ വിലാസം:" diff --git a/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo index 60bef7df7f00..0abc5e79c0de 100644 Binary files a/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po index 803362f8c6d6..964d3557a90e 100644 --- a/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ml/LC_MESSAGES/djangojs.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-03-09 08:56+0000\n" -"Last-Translator: MUHAMMED RAMEEZ \n" +"POT-Creation-Date: 2020-05-11 20:56+0200\n" +"PO-Revision-Date: 2020-05-13 00:53+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Malayalam (http://www.transifex.com/django/django/language/" "ml/)\n" "MIME-Version: 1.0\n" @@ -84,20 +84,16 @@ msgstr "" "നഷ്ടപ്പെടും." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. പക്ഷേ, കളങ്ങളിലെ മാറ്റങ്ങള്‍ ഇനിയും സേവ് ചെയ്യാനുണ്ട്. " -"ആദ്യം സേവ്ചെയ്യാനായി OK ക്ലിക് ചെയ്യുക. അതിനു ശേഷം ആക്ഷന്‍ ഒന്നു കൂടി പ്രയോഗിക്കേണ്ടി വരും." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"നിങ്ങള്‍ ഒരു ആക്ഷന്‍ തെരഞ്ഞെടുത്തിട്ടുണ്ട്. കളങ്ങളില്‍ സേവ് ചെയ്യാത്ത മാറ്റങ്ങള്‍ ഇല്ല. നിങ്ങള്‍സേവ് ബട്ടണ്‍ " -"തന്നെയാണോ അതോ ഗോ ബട്ടണാണോ ഉദ്ദേശിച്ചത്." msgid "Now" msgstr "ഇപ്പോള്‍" diff --git a/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo index 57a9d75e6e81..cf857e049ec5 100644 Binary files a/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/mn/LC_MESSAGES/django.po b/django/contrib/admin/locale/mn/LC_MESSAGES/django.po index 813710351637..c5d0cb44870b 100644 --- a/django/contrib/admin/locale/mn/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/mn/LC_MESSAGES/django.po @@ -4,17 +4,18 @@ # Ankhbayar , 2013 # Jannis Leidel , 2011 # jargalan , 2011 +# Turmunkh Batkhuyag, 2023 # Zorig, 2016 -# Анхбаяр Анхаа , 2013-2016,2018-2019 +# Анхбаяр Анхаа , 2013-2016,2018-2019,2021,2023 # Баясгалан Цэвлээ , 2011,2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-13 09:17+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 07:05+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,6 +23,10 @@ msgstr "" "Language: mn\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Сонгосон %(verbose_name_plural)s-ийг устгах" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(items)s ээс %(count)d-ийг амжилттай устгалаа." @@ -33,10 +38,6 @@ msgstr "%(name)s устгаж чадахгүй." msgid "Are you sure?" msgstr "Итгэлтэй байна уу?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сонгосон %(verbose_name_plural)s-ийг устга" - msgid "Administration" msgstr "Удирдлага" @@ -73,6 +74,12 @@ msgstr "Огноогүй" msgid "Has date" msgstr "Огноотой" +msgid "Empty" +msgstr "Хоосон" + +msgid "Not empty" +msgstr "Хоосон биш" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -130,23 +137,23 @@ msgid "log entries" msgstr "лог өгөгдөлүүд" #, python-format -msgid "Added \"%(object)s\"." -msgstr "\"%(object)s\" нэмсэн." +msgid "Added “%(object)s”." +msgstr "Нэмэгдсэн \"%(object)s\"." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\"-ийг %(changes)s өөрчилсөн." +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Өөрчлөгдсөн \"%(object)s\"— %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "\"%(object)s\" устгасан." +msgid "Deleted “%(object)s.”" +msgstr "Устгагдсан \"%(object)s\"." msgid "LogEntry Object" msgstr "Лог бүртгэлийн обект" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Нэмэгдсэн {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Нэмсэн {name} “{object}”." msgid "Added." msgstr "Нэмэгдсэн." @@ -155,16 +162,16 @@ msgid "and" msgstr "ба" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{name} \"{object}\"-ны {fields} өөрчилөгдсөн." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Changed {fields} for {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "Өөрчлөгдсөн {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Устгасан {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Устгасан {name} “{object}”." msgid "No fields changed." msgstr "Өөрчилсөн талбар алга байна." @@ -172,48 +179,49 @@ msgstr "Өөрчилсөн талбар алга байна." msgid "None" msgstr "Хоосон" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Олон утга сонгохын тулд \"Control\", эсвэл Mac дээр \"Command\" товчыг дарж " -"байгаад сонгоно." +"Нэгээс олныг сонгохын тулд \"Control\" эсвэл Mac компьютер дээр \"Command\" " +"товчоо дарна уу." + +msgid "Select this object for an action - {}" +msgstr "Сонголтоо хийхийн тулд энэ объектыг сонгоно уу - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr " {name} \"{obj}\" амжилттай нэмэгдлээ." +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” амжилттай нэмэгдлээ." msgid "You may edit it again below." msgstr "Та дараахийг дахин засах боломжтой" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"{name} \"{obj}\" амжилттай нэмэгдлээ. Доорх хэсгээс {name} өөрийн нэмэх " -"боломжтой." +"{name} “{obj}” амжилттай нэмэгдлээ. Та доорх {name}-ийг нэмэх боломжтой." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" амжилттай өөрчилөгдлөө. Та дахин засах боломжтой." +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" +"{name} \"{obj}\" амжилттай өөрчлөгдлөө. Та доорх талбаруудыг дахин засварлах " +"боломжтой." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" амжилттай нэмэгдлээ. Та дахин засах боломжтой." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "" +" {name} \"{obj}\" амжилттай нэмэгдлээ. Та доор дахин шинэчлэх боломжтой." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"{name} \"{obj}\" амжилттай өөрчилөгдлөө. Доорх хэсгээс {name} өөрийн нэмэх " -"боломжтой." +"\"{name}\" \"{obj}\" амжилттай өөрчлөгдлөө. Доорх {name}-г нэмж оруулна уу." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" амжилттай засагдлаа." +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} \" {obj} \" амжилттай өөрчлөгдлөө." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -225,13 +233,12 @@ msgid "No action selected." msgstr "Үйлдэл сонгоогүй." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr " %(name)s \"%(obj)s\" амжилттай устгагдлаа." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” амжилттай устгагдлаа." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" -"\"%(key)s\" дугаартай %(name)s байхгүй байна. Устсан байсан юм болов уу?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "“%(key)s” ID-тай %(name)sбайхгүй байна. Магадгүй устсан уу?" #, python-format msgid "Add %s" @@ -268,8 +275,9 @@ msgstr "%(cnt)s оос 0 сонгосон" msgid "Change history: %s" msgstr "Өөрчлөлтийн түүх: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(instance)s %(class_name)s" @@ -301,8 +309,8 @@ msgstr "%(app)s удирдлага" msgid "Page not found" msgstr "Хуудас олдсонгүй." -msgid "We're sorry, but the requested page could not be found." -msgstr "Уучлаарай, хандахыг хүссэн хуудас тань олдсонгүй." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Уучлаарай, хүссэн хуудас олдсонгүй." msgid "Home" msgstr "Нүүр" @@ -317,11 +325,11 @@ msgid "Server Error (500)" msgstr "Серверийн алдаа (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Алдаа гарсан байна. Энэ алдааг сайт хариуцагчид имэйлээр мэдэгдсэн бөгөөд " -"тэд нэн даруй засах хэрэгтэй. Хүлээцтэй хандсанд баярлалаа." +"Алдаа гарсан байна. И-мэйлээр админуудад мэдэгдэгдсэн бөгөөд тун удахгүй " +"засах болно. Хамтран ажилласанд баярлалаа." msgid "Run the selected action" msgstr "Сонгосон үйлдэлийг ажилуулах" @@ -339,12 +347,28 @@ msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Сонгосонг цэвэрлэх" +msgid "Breadcrumbs" +msgstr "Талхны үүрмэг" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s хэрэглүүр дэх моделууд." + +msgid "Add" +msgstr "Нэмэх" + +msgid "View" +msgstr "Харах" + +msgid "You don’t have permission to view or edit anything." +msgstr "Та ямар ч харах эсвэл засах эрхгүй байна." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Эхлээд хэрэглэгчийн нэр нууц үгээ оруулна уу. Ингэснээр та хэрэглэгчийн " -"сонголтыг нэмж засварлах боломжтой болно. " +"Эхлээд, хэрэглэгчийн нэр болон нууц үгээ оруулна уу. Дараа нь, та бусад " +"хэрэглэгчийн сонголтуудыг засварлах боломжтой болно." msgid "Enter a username and password." msgstr "Хэрэглэгчийн нэр ба нууц үгээ оруулна." @@ -353,15 +377,17 @@ msgid "Change password" msgstr "Нууц үг өөрчлөх" msgid "Please correct the error below." -msgstr "Доорх алдааг засна уу" - -msgid "Please correct the errors below." -msgstr "Доор гарсан алдаануудыг засна уу." +msgid_plural "Please correct the errors below." +msgstr[0] "Та доорх алдаануудыг засна уу." +msgstr[1] "Та доорх алдаануудыг засна уу." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "%(username)s.хэрэглэгчид шинэ нууц үг оруулна уу." +msgid "Skip to main content" +msgstr "Үндсэн агуулга руу шилжих" + msgid "Welcome," msgstr "Тавтай морилно уу" @@ -387,6 +413,15 @@ msgstr "Сайтаас харах" msgid "Filter" msgstr "Шүүлтүүр" +msgid "Hide counts" +msgstr "Тооцоог нуух" + +msgid "Show counts" +msgstr "Тооцоог харуулах" + +msgid "Clear all filters" +msgstr "Бүх шүүлтүүрийг арилгах" + msgid "Remove from sorting" msgstr "Эрэмблэлтээс хасах" @@ -397,6 +432,15 @@ msgstr "Эрэмблэх урьтамж: %(priority_number)s" msgid "Toggle sorting" msgstr "Эрэмбэлэлтийг харуул" +msgid "Toggle theme (current theme: auto)" +msgstr "Загварыг сэлгэх (одоогийн загвар: авто)" + +msgid "Toggle theme (current theme: light)" +msgstr "Загварыг сэлгэх (одоогийн загвар: өдрийн)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Загварыг сэлгэх (одоогийн горим: шөнийн)" + msgid "Delete" msgstr "Устгах" @@ -428,8 +472,8 @@ msgstr "" msgid "Objects" msgstr "Бичлэгүүд" -msgid "Yes, I'm sure" -msgstr "Тийм, итгэлтэй байна." +msgid "Yes, I’m sure" +msgstr "Тийм, би итгэлтэй." msgid "No, take me back" msgstr "Үгүй, намайг буцаа" @@ -462,9 +506,6 @@ msgstr "" "Та %(objects_name)s ийг устгах гэж байна итгэлтэй байна? Дараах обектууд " "болон холбоотой зүйлс хамт устагдах болно:" -msgid "View" -msgstr "Харах" - msgid "Delete?" msgstr "Устгах уу?" @@ -473,17 +514,7 @@ msgid " By %(filter_title)s " msgstr " %(filter_title)s -ээр" msgid "Summary" -msgstr "Нийт" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s хэрэглүүр дэх моделууд." - -msgid "Add" -msgstr "Нэмэх" - -msgid "You don't have permission to view or edit anything." -msgstr "Танд харах болон засах эрх алга." +msgstr "Хураангуй" msgid "Recent actions" msgstr "Сүүлд хийсэн үйлдлүүд" @@ -494,17 +525,26 @@ msgstr "Миний үйлдлүүд" msgid "None available" msgstr "Үйлдэл алга" +msgid "Added:" +msgstr "Нэмсэн:" + +msgid "Changed:" +msgstr "Өөрчилсөн:" + +msgid "Deleted:" +msgstr "Устгасан:" + msgid "Unknown content" msgstr "Тодорхойгүй агуулга" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Өгөгдлийн сангийн ямар нэг зүйл буруу суугдсан байна. Өгөгдлийн сангийн " -"зохих хүснэгт үүсгэгдсэн эсэх, өгөгдлийн санг зохих хэрэглэгч унших " -"боломжтой байгаа эсэхийг шалгаарай." +"Таны өгөгдлийн санг суулгахад ямар нэг алдаа гарлаа байна. Өгөгдлийн сангийн " +"тохирох хүснэгтүүдийг үүсгэсэн эсэхийг шалгаад, өгөгдлийн санг тохирох " +"хэрэглэгч унших боломжтой эсэхийг шалгаарай." #, python-format msgid "" @@ -517,6 +557,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Таны мартсан нууц үг эсвэл нэрвтэр нэр?" +msgid "Toggle navigation" +msgstr "Жолоодлого солбих" + +msgid "Sidebar" +msgstr "Хажуугийн самбар" + +msgid "Start typing to filter…" +msgstr "Шүүхийн тулд бичиж эхлэх..." + +msgid "Filter navigation items" +msgstr "Жолоодлогын зүйлсийг шүүх" + msgid "Date/time" msgstr "Огноо/цаг" @@ -526,12 +578,17 @@ msgstr "Хэрэглэгч" msgid "Action" msgstr "Үйлдэл" +msgid "entry" +msgid_plural "entries" +msgstr[0] "оролт" +msgstr[1] "оролт" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Уг объектэд өөрчлөлтийн түүх байхгүй байна. Магадгүй үүнийг уг удирдлагын " -"сайтаар дамжуулан нэмээгүй байх." +"Энэ объектод өөрчлөлтийн түүх байхгүй байна. Админ сайтаар нэмээгүй байх " +"магадлалтай." msgid "Show all" msgstr "Бүгдийг харуулах" @@ -582,8 +639,12 @@ msgstr "Өөр %(model)s нэмэх" msgid "Delete selected %(model)s" msgstr "Сонгосон %(model)s устгах" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Манай вэб сайтыг ашигласанд баярлалаа." +#, python-format +msgid "View selected %(model)s" +msgstr "View selected %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Өнөөдөр вэб сайтад цаг заваа зарцуулсанд баярлалаа." msgid "Log in again" msgstr "Ахин нэвтрэх " @@ -595,11 +656,11 @@ msgid "Your password was changed." msgstr "Нууц үг тань өөрчлөгдлөө." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Аюулгүй байдлын үүднээс хуучин нууц үгээ оруулаад шинэ нууц үгээ хоёр удаа " -"хийнэ үү. Ингэснээр нууц үгээ зөв бичиж байгаа эсэхийг тань шалгах юм." +"Та аюулгүй байдлын үүднээс хуучин нууц үгээ оруулна уу, тэгээд шинэ нууц " +"үгээ хоёр удаа оруулнаар бид бичсэн эсэхийг баталгаажуулах боломжтой." msgid "Change my password" msgstr "Нууц үгээ солих" @@ -634,18 +695,18 @@ msgstr "" "байж болзошгүй. Шинэ нууц үг авахаар хүсэлт гаргана уу. " msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Таны оруулсан имайл хаяг бүртгэлтэй бол таны имайл хаягруу нууц үг " -"тохируулах зааварыг удахгүй очих болно. Та удахгүй имайл хүлээж авах болно. " +"Бид таны нууц үг тохируулах зааварчилгааг и-мэйлээр илгээлээ. Хэрэв таны " +"оруулсан и-мэйл дээр акаунт байвал хурдан авах ёстой." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Хэрвээ та имайл хүлээж аваагүй бол оруулсан имайл хаягаараа бүртгүүлсэн " -"эсхээ шалгаад мөн имайлийнхаа Spam фолдер ийг шалгана уу." +"Хэрэв та имэйл аваагүй бол та бүртгэлтэй хаяг оруулсан эсэхийг шалгана уу, " +"мөн спам хавтасыг шалгана уу." #, python-format msgid "" @@ -658,8 +719,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:" -msgid "Your username, in case you've forgotten:" -msgstr "Хэрэглэгчийн нэрээ мартсан бол :" +msgid "Your username, in case you’ve forgotten:" +msgstr "Та хэрэглэгчийн нэрээ мартсан бол:" msgid "Thanks for using our site!" msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!" @@ -669,11 +730,11 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s баг" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Нууц үгээ мартсан уу? Доорх хэсэгт имайл хаягаа оруулвал бид хаягаар тань " -"нууц үг сэргэх зааварчилгаа явуулах болно." +"Нууц үгээ мартсан уу? Доор имэйл хаягаа оруулна уу, бид шинэ нууц үг " +"тохируулах зааврыг имэйлээр илгээнэ." msgid "Email address:" msgstr "Имэйл хаяг:" @@ -681,6 +742,9 @@ msgstr "Имэйл хаяг:" msgid "Reset my password" msgstr "Нууц үгээ шинэчлэх" +msgid "Select all objects on this page for an action" +msgstr "Энэ хуудас дээрх бүх объектуудыг үйлдэл хийхийн тулд сонгоно уу" + msgid "All dates" msgstr "Бүх огноо" diff --git a/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo b/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo index d847b48ad67e..51f8c63d9656 100644 Binary files a/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/mr/LC_MESSAGES/django.po b/django/contrib/admin/locale/mr/LC_MESSAGES/django.po index c02c72b1e8e8..c77756219428 100644 --- a/django/contrib/admin/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2015-01-18 08:31+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-25 07:05+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,108 +18,142 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #, python-format -msgid "Successfully deleted %(count)d %(items)s." +msgid "Delete selected %(verbose_name_plural)s" msgstr "" +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "यशस्वीरीत्या %(count)d %(items)s घालवले गेले आहेत." + #, python-format msgid "Cannot delete %(name)s" -msgstr "" +msgstr "%(name)s घालवू शकत नाही" msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" +msgstr "तुम्हाला खात्री आहे का?" msgid "Administration" -msgstr "" +msgstr "प्रशासन" msgid "All" -msgstr "" +msgstr "सर्व" msgid "Yes" -msgstr "" +msgstr "होय" msgid "No" -msgstr "" +msgstr "नाही" msgid "Unknown" -msgstr "" +msgstr "अज्ञात" msgid "Any date" -msgstr "" +msgstr "कोणतीही दिनांक" msgid "Today" -msgstr "" +msgstr "आज" msgid "Past 7 days" -msgstr "" +msgstr "मागील 7 दिवस" msgid "This month" -msgstr "" +msgstr "या महिन्यात" msgid "This year" -msgstr "" +msgstr "यावर्षी" + +msgid "No date" +msgstr "दिनांक नाही" + +msgid "Has date" +msgstr "दिनांक आहे" + +msgid "Empty" +msgstr "रिकामी" + +msgid "Not empty" +msgstr "रिकामी नाही" #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" +"कृपया करून %(username)s आणि कर्मचारी खात्यासाठी अचूक गुप्तशब्द नमूद करा. लक्षात घ्या की " +"दोन्ही राखणे संवेदनशील असू शकतात." msgid "Action:" -msgstr "" +msgstr "क्रिया:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "अजून एक %(verbose_name)s जोडा" + +msgid "Remove" +msgstr "काढा" + +msgid "Addition" +msgstr "वाढ" + +msgid "Change" +msgstr "बदला" + +msgid "Deletion" +msgstr "वगळा" msgid "action time" -msgstr "" +msgstr "क्रियाकाळ" + +msgid "user" +msgstr "वापरकर्ता" + +msgid "content type" +msgstr "सामुग्री प्रकार" msgid "object id" msgstr "" +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "" msgid "action flag" -msgstr "" +msgstr "क्रिया झेंडा" msgid "change message" -msgstr "" +msgstr "लिखित बदला" msgid "log entry" -msgstr "" +msgstr "घटक नोंद" msgid "log entries" -msgstr "" +msgstr "घटक नोंदी" #, python-format -msgid "Added \"%(object)s\"." -msgstr "" +msgid "Added “%(object)s”." +msgstr "“%(object)s” जोडले" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” — %(changes)s बदलले" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" घालविले" msgid "LogEntry Object" msgstr "" -msgid "None" +#, python-brace-format +msgid "Added {name} “{object}”." msgstr "" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" +msgid "Added." +msgstr "जोडले." msgid "and" -msgstr "" +msgstr "आणि" #, python-format msgid "Added %(name)s \"%(object)s\"." @@ -133,24 +168,21 @@ msgid "Deleted %(name)s \"%(object)s\"." msgstr "" msgid "No fields changed." -msgstr "" +msgstr "कोणतेही रखाणे बदलले नाहीत." -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgid "None" msgstr "" -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "एकापेक्षा जास्त निवडण्यासाठी \"कंट्रोल\" किंवा मॅक वर \"कमांड\" खटका दाबा" -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." +msgid "Select this object for an action - {}" msgstr "" -#, python-format +msgid "You may edit it again below." +msgstr "तुम्ही ते खाली पुन्हा संपादित करू शकता." + +#, python-brace-format msgid "" "The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " "below." @@ -162,36 +194,52 @@ msgid "" "%(name)s below." msgstr "" -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" यशस्वीरीत्या जोडले गेले आहे. तुम्ही त्याचे पुन्हा संपादन करू शकता." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" यशस्वीरीत्या जोडले गेले आहे. तुम्ही त्याचे पुन्हा संपादन करू शकता." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} \"{obj}\" यशस्वीरीत्या बदलले गेले आहे." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" +"गोष्टींवर क्रिया करण्यासाठी त्या निवडले जाणे आवश्यक आहे. कोणत्याही गोष्टी बदलल्या गेल्या " +"नाहीत." msgid "No action selected." -msgstr "" +msgstr "कोणतीही क्रिया निवडली नाही." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” यशस्वीरीत्या हटवले गेले आहे." #, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s “%(key)s” ओळखीसह अस्तित्वात नाही. कदाचित ते घालवले असेल ?" #, python-format msgid "Add %s" -msgstr "" +msgstr "जोडा %s" #, python-format msgid "Change %s" -msgstr "" +msgstr "बदला %s" + +#, python-format +msgid "View %s" +msgstr "पहा %s" msgid "Database error" -msgstr "" +msgstr "डेटाबेस त्रुटी" #, python-format msgid "%(count)s %(name)s was changed successfully." @@ -213,8 +261,9 @@ msgstr "" msgid "Change history: %s" msgstr "" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -226,111 +275,139 @@ msgid "" msgstr "" msgid "Django site admin" -msgstr "" +msgstr "जॅंगो स्थळ प्रशासक" msgid "Django administration" -msgstr "" +msgstr "जॅंगो प्रशासन " msgid "Site administration" -msgstr "" +msgstr "स्थळ प्रशासन " msgid "Log in" msgstr "" #, python-format msgid "%(app)s administration" -msgstr "" +msgstr "%(app)s प्रशासन" msgid "Page not found" -msgstr "" +msgstr "पान मिळाले नाही" -msgid "We're sorry, but the requested page could not be found." -msgstr "" +msgid "We’re sorry, but the requested page could not be found." +msgstr "आम्ही क्षमस्व आहोत, पण विनंती केलेले पान मिळाले नाही." msgid "Home" -msgstr "" +msgstr "मुख्यपान" msgid "Server error" -msgstr "" +msgstr "वाढप्यात त्रुटी" msgid "Server error (500)" -msgstr "" +msgstr "सर्व्हर त्रुटी (500)" msgid "Server Error (500)" -msgstr "" +msgstr "सर्व्हर त्रुटी (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"त्रुटी आली आहे व ती विपत्राद्वारे सांकेतिकस्थळ व्यवस्थापकांकडे कळविण्यात आली आहे आणि लवकरच " +"ती सुधारली जाईल. आपल्या सहनशीलतेसाठी धन्यवाद." msgid "Run the selected action" -msgstr "" +msgstr "निवडलेली क्रिया चालवा" msgid "Go" -msgstr "" +msgstr "जा" msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "पानावरील सर्व वस्तूंची निवड करण्यासाठी येथे टिचकी मारा" #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "" +msgstr "सर्व %(total_count)s %(module_name)s निवडा" msgid "Clear selection" +msgstr "निवड काढा" + +msgid "Breadcrumbs" +msgstr "ब्रेडक्रम्ब्स" + +#, python-format +msgid "Models in the %(name)s application" msgstr "" +msgid "Add" +msgstr "जोडा" + +msgid "View" +msgstr "पहा" + +msgid "You don’t have permission to view or edit anything." +msgstr "तुम्हाला काहीही पाहण्याची किंवा संपादित करण्याची परवानगी नाही." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"पहिलं, वापरकर्तानाव आणि गुप्तशब्द नमूद करा. मग, आपण अधिक वापरकर्ता पर्यायांचे संपादन करू " +"शकता." msgid "Enter a username and password." -msgstr "" +msgstr "वापरकर्तानाव आणि गुप्तशब्द नमूद करा." msgid "Change password" -msgstr "" +msgstr "गुप्तशब्द बदला" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" #, python-format msgid "Enter a new password for the user %(username)s." -msgstr "" +msgstr "%(username)s वापरकर्त्यासाठी नवीन गुप्तशब्द नमूद करा " + +msgid "Skip to main content" +msgstr "मुख्य सामुग्रीवर जा" msgid "Welcome," -msgstr "" +msgstr "स्वागत आहे," msgid "View site" -msgstr "" +msgstr "संकेतस्थळ पहा" msgid "Documentation" -msgstr "" +msgstr "दस्तऐवज" msgid "Log out" -msgstr "" +msgstr "बाहेर पडा" -msgid "Add" +#, python-format +msgid "Add %(name)s" msgstr "" msgid "History" -msgstr "" +msgstr "इतिहास" msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" +msgstr "संकेतस्थळावर पहा" msgid "Filter" -msgstr "" +msgstr "गाळणी" + +msgid "Hide counts" +msgstr "गणना लपवा" + +msgid "Show counts" +msgstr "गणना दाखवा" + +msgid "Clear all filters" +msgstr "सर्व गाळण्या साफ करा" msgid "Remove from sorting" -msgstr "" +msgstr "सोडवा सोडवा" #, python-format msgid "Sorting priority: %(priority_number)s" @@ -339,8 +416,17 @@ msgstr "" msgid "Toggle sorting" msgstr "" +msgid "Toggle theme (current theme: auto)" +msgstr "थीम खुंटी बदला (सध्याची थीम: स्वयंप्रेरित)" + +msgid "Toggle theme (current theme: light)" +msgstr "थीम खुंटी बदला (सध्याची थीम: उजेड)" + +msgid "Toggle theme (current theme: dark)" +msgstr "थीम खुंटी बदला (सध्याची थीम: काळोख)" + msgid "Delete" -msgstr "" +msgstr "घालवा" #, python-format msgid "" @@ -360,18 +446,20 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" +"\"%(escaped_object)s\" %(object_name)sनावाच्या वस्तू घालवताना त्याच्या संबंधित " +"वस्तूही घालवाव्या लागतील" msgid "Objects" msgstr "" -msgid "Yes, I'm sure" -msgstr "" +msgid "Yes, I’m sure" +msgstr "होय, मला खात्री आहे" msgid "No, take me back" -msgstr "" +msgstr "नको, मला मागे न्या" msgid "Delete multiple objects" -msgstr "" +msgstr "एकाधिक वस्तू घालवा" #, python-format msgid "" @@ -385,95 +473,111 @@ msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" +"निवडलेले %(objects_name)s घालवण्यासाठी खालील संरक्षित संबंधित वस्तू डिलीट करणे आवश्यक " +"आहे." #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" - -msgid "Change" -msgstr "" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" +"तुम्हाला खात्री आहे की तुम्ही निवडलेले %(objects_name)s हटवायला याची खात्री आहे का? " +"खात्री आहे की खालील वस्तूंचे आणि त्यांच्या संबंधित घटक हटवले जातील:" msgid "Delete?" -msgstr "" +msgstr "घालवायचं ?" #, python-format msgid " By %(filter_title)s " msgstr "" msgid "Summary" -msgstr "" +msgstr "सारांश" -#, python-format -msgid "Models in the %(name)s application" -msgstr "" +msgid "Recent actions" +msgstr "अलीकडच्या क्रिया" -msgid "You don't have permission to edit anything." -msgstr "" +msgid "My actions" +msgstr "माझ्या क्रिया" -msgid "Recent Actions" -msgstr "" +msgid "None available" +msgstr "काहीही उपलब्ध नाही" -msgid "My Actions" -msgstr "" +msgid "Added:" +msgstr "जोडले गेले:" -msgid "None available" -msgstr "" +msgid "Changed:" +msgstr "बदलले." + +msgid "Deleted:" +msgstr "घालवले." msgid "Unknown content" -msgstr "" +msgstr "अज्ञात सामुग्री" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"तुमच्या माहितीगठ्ठा स्थापनेत काहीतरी चुक आहे. खात्री करा की योग्य डेटाबेस तक्ते तयार केलेले " +"आहेत आणि खात्री करा की योग्य वापरकर्त्या माहितीगठ्ठा वाचू शकतो." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"तुम्ही %(username)s म्हणून प्रमाणित केले आहे, परंतु हे पानात शिरकाव करण्यास अधिकृत नाही. " +"तुम्हाला वेगळ्या खात्यात प्रवेश करायला आवडेल का?" msgid "Forgotten your password or username?" +msgstr "तुमचा गुप्तशब्द किंवा वापरकर्तानाव विसरलात का?" + +msgid "Toggle navigation" +msgstr "टॉगल नेविगेशन" + +msgid "Sidebar" +msgstr "बाजूभिंत" + +msgid "Start typing to filter…" +msgstr "प्रविष्ट करण्यासाठी टाइप करण्याची सुरुवात करा ..." + +msgid "Filter navigation items" msgstr "" msgid "Date/time" -msgstr "" +msgstr "दिनांक/वेळ" msgid "User" -msgstr "" +msgstr "वापरकर्ता" msgid "Action" -msgstr "" +msgstr "क्रिया" + +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" +"या वस्तूचा कोणताही बदलाचा इतिहास नाही. कदाचित तो व्यवस्थापक मार्गे नव्हता जोडला गेला " +"असावा." msgid "Show all" -msgstr "" +msgstr "सर्व दाखवा" msgid "Save" -msgstr "" +msgstr "साठवा" -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" +msgid "Popup closing…" +msgstr "पॉपअप बंद होत आहे..." msgid "Search" -msgstr "" +msgstr "शोधा" #, python-format msgid "%(counter)s result" @@ -486,124 +590,164 @@ msgid "%(full_result_count)s total" msgstr "" msgid "Save as new" -msgstr "" +msgstr "नवीन म्हणून साठवा" msgid "Save and add another" -msgstr "" +msgstr "साठवा आणि आणखी एक जोडा" msgid "Save and continue editing" -msgstr "" +msgstr "साठवा आणि संपादन सुरू ठेवा" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" +msgid "Save and view" +msgstr "साठवा आणि पहा" + +msgid "Close" +msgstr "बंद" + +#, python-format +msgid "Change selected %(model)s" +msgstr "निवडलेले %(model)s बदला" + +#, python-format +msgid "Add another %(model)s" +msgstr "अजून एक %(model)s जोडा" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "निवडलेले %(model)s घालवा" + +#, python-format +msgid "View selected %(model)s" +msgstr "निवडलेले %(model)s पहा" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "आज संकेतस्थळावर अमुल्य वेळ घालवल्याबद्दल धन्यवाद." msgid "Log in again" -msgstr "" +msgstr "पुन्हा प्रवेश करा" msgid "Password change" -msgstr "" +msgstr "गुप्तशब्द बदला" msgid "Your password was changed." -msgstr "" +msgstr "तुमचा गुप्तशब्द बदलला गेला आहे." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" +"सुरक्षेसाठी कृपया आपला जुना गुप्तशब्द नमूद करा, आणि नंतर आपला नवीन गुप्तशब्द दोनदा नमूद " +"करा जेणेकरून तुम्ही गुप्तशब्द अचूक नमूद केला आहे की नाही ह्याची आम्ही पडताळणी करू." msgid "Change my password" -msgstr "" +msgstr "माझा गुप्तशब्द बदला" msgid "Password reset" -msgstr "" +msgstr "गुप्तशब्द पुन्हस्थापना" msgid "Your password has been set. You may go ahead and log in now." -msgstr "" +msgstr "तुमचा गुप्तशब्द जोडला आहे. आपण आता प्रवेश करू शकता." msgid "Password reset confirmation" -msgstr "" +msgstr "गुप्तशब्द पुन्हस्थापना निश्चित" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." msgstr "" +"कृपया आपला नवीन गुप्तशब्द दोनदा नमूद करा, जेणेकरून तुम्ही तो योग्य नमूद केला आहे का याची " +"आम्ही पडताळणी करू." msgid "New password:" -msgstr "" +msgstr "नवीन गुप्तशब्द:" msgid "Confirm password:" -msgstr "" +msgstr "निश्चित गुप्तशब्द:" msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" +"गुप्तशब्द पुन्हस्थापना दुवा अवैध आहे, कदाचित तो आधीच वापरला गेलेला आहे. कृपया नवीन गुप्तशब्द " +"पुन्हस्थापनेची विनंती करा." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"आपल्याला आपला गुप्तशब्द पुन्हस्थापीत करण्याच्या सूचना विपत्र केल्या आहेत, जर नमूद केलेल्या " +"विपत्रासह खाते उपलब्ध असेल तर आपल्याला ते लवकरच मिळायला पाहीजे." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"जर तुम्हाला विपत्र मिळत नसेल तर कृपया खाते नोंदवलेला विपत्र तुम्ही योग्य नमूद केलाय का " +"याची खात्री करा आणि तुमचा स्पॅम फोल्डर तपासा." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" +"तुम्हाला हा विपत्र मिळत आहे कारण तुम्ही %(site_name)s या संकेतस्थळावरील तुमच्या " +"वापरकर्ता खात्यासाठी गुप्तशब्द पुन्हस्थापनेची विनंती केली होती." msgid "Please go to the following page and choose a new password:" -msgstr "" +msgstr "कृपया खालील पानावर जा आणि नवीन गुप्तशब्द निवडा." -msgid "Your username, in case you've forgotten:" -msgstr "" +msgid "Your username, in case you’ve forgotten:" +msgstr "तुमचे वापरकर्तानाव, जर तुम्ही विसरला असाल तर:" msgid "Thanks for using our site!" -msgstr "" +msgstr "आमच्या संकेतस्थळाचा वापर केल्याबद्दल आभार!" #, python-format msgid "The %(site_name)s team" -msgstr "" +msgstr "%(site_name)s संघ" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"तुमचा गुप्तशब्द विसरलात का? तुमचा विपत्रपत्ता खाली नमूद करा. नवीन गुप्तशब्द " +"ठरवण्यासाठीच्या सूचना आम्ही तुम्हाला विपत्र करू." msgid "Email address:" -msgstr "" +msgstr "विपत्र पत्ता:" msgid "Reset my password" -msgstr "" +msgstr "माझा गुप्तशब्द पुन्हस्थापन करा" -msgid "All dates" -msgstr "" +msgid "Select all objects on this page for an action" +msgstr "क्रिया करण्यासाठी या पानावरील सर्व घटक निवडा." -msgid "(None)" -msgstr "" +msgid "All dates" +msgstr "सर्व दिनांक" #, python-format msgid "Select %s" -msgstr "" +msgstr "%s निवडा" #, python-format msgid "Select %s to change" -msgstr "" +msgstr "बदलण्यासाठी %s निवडा" + +#, python-format +msgid "Select %s to view" +msgstr "पाहण्यासाठी %s निवडा" msgid "Date:" -msgstr "" +msgstr "दिनांक:" msgid "Time:" -msgstr "" +msgstr "वेळ:" msgid "Lookup" -msgstr "" +msgstr "शोध" msgid "Currently:" -msgstr "" +msgstr "सध्या:" msgid "Change:" -msgstr "" +msgstr "बदला:" diff --git a/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..f558c1be6eb4 Binary files /dev/null and b/django/contrib/admin/locale/ms/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ms/LC_MESSAGES/django.po b/django/contrib/admin/locale/ms/LC_MESSAGES/django.po new file mode 100644 index 000000000000..e69439eb6077 --- /dev/null +++ b/django/contrib/admin/locale/ms/LC_MESSAGES/django.po @@ -0,0 +1,721 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jafry Hisham, 2021 +# Mariusz Felisiak , 2021 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-12-06 07:41+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Padam pilihan %(verbose_name_plural)s" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d %(items)s berjaya dipadamkan" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)s tidak boleh dipadamkan" + +msgid "Are you sure?" +msgstr "Adakah anda pasti?" + +msgid "Administration" +msgstr "Pentadbiran" + +msgid "All" +msgstr "Semua" + +msgid "Yes" +msgstr "Ya" + +msgid "No" +msgstr "Tidak" + +msgid "Unknown" +msgstr "Tidak diketahui" + +msgid "Any date" +msgstr "Sebarang tarikh" + +msgid "Today" +msgstr "Hari ini" + +msgid "Past 7 days" +msgstr "7 hari lalu" + +msgid "This month" +msgstr "Bulan ini" + +msgid "This year" +msgstr "Tahun ini" + +msgid "No date" +msgstr "Tiada tarikh" + +msgid "Has date" +msgstr "Mempunyai tarikh" + +msgid "Empty" +msgstr "Kosong" + +msgid "Not empty" +msgstr "Tidak kosong" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Sila masukkan %(username)s dan kata-laluan bagi akaun staf. Kedua-dua medan " +"berkemungkinan kes-sensitif." + +msgid "Action:" +msgstr "Tindakan" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Tambah %(verbose_name)s" + +msgid "Remove" +msgstr "Buang" + +msgid "Addition" +msgstr "Tambahan" + +msgid "Change" +msgstr "Tukar" + +msgid "Deletion" +msgstr "Pemadaman" + +msgid "action time" +msgstr "masa tindakan" + +msgid "user" +msgstr "pengguna" + +msgid "content type" +msgstr "jenis kandungan" + +msgid "object id" +msgstr "id objek" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "repr objek" + +msgid "action flag" +msgstr "bendera tindakan" + +msgid "change message" +msgstr "tukar mesej" + +msgid "log entry" +msgstr "entri log" + +msgid "log entries" +msgstr "entri log" + +#, python-format +msgid "Added “%(object)s”." +msgstr "\"%(object)s\" ditambah" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "\"%(object)s\" ditukar - %(changes)s" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" dipadam." + +msgid "LogEntry Object" +msgstr "Objek EntriLog" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "{name} “{object}” ditambah." + +msgid "Added." +msgstr "Ditambah." + +msgid "and" +msgstr "dan" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "“{object}” {name} untuk {fields} telah ditukar." + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} telah ditukar." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "“{object}” {name} telah dipadamkan" + +msgid "No fields changed." +msgstr "Tiada medan diubah." + +msgid "None" +msgstr "Tiada" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" +"Tekan \"Control\", atau \"Command pada Mac untuk memilih lebih daripada satu." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} \"{obj}\" telah berjaya ditambah." + +msgid "You may edit it again below." +msgstr "Anda boleh edit semula dibawah." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" +"{name} \"{obj}\" telah berjaya ditambah. Anda boleh menambah {name} lain " +"dibawah." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh edit semula dibawah." + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" berjaya ditambah. Anda boleh edit semula dibawah." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" berjaya diubah. Anda boleh tambah {name} lain dibawah" + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} \"{obj}\" berjaya diubah." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Item-item perlu dipilih mengikut turutan untuk tindakan lanjut. Tiada item-" +"item yang diubah." + +msgid "No action selected." +msgstr "Tiada tindakan dipilih." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s \"%(obj)s\" berjaya dipadam." + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" +"%(name)s dengan ID \"%(key)s\" tidak wujud. Mungkin ia telah dipadamkan?" + +#, python-format +msgid "Add %s" +msgstr "Tambah %s" + +#, python-format +msgid "Change %s" +msgstr "Tukar %s" + +#, python-format +msgid "View %s" +msgstr "Lihat %s" + +msgid "Database error" +msgstr "Masalah pangkalan data" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)s %(name)s berjaya ditukar." + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "Kesemua %(total_count)s dipilih" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "0 daripada %(cnt)s dipilih" + +#, python-format +msgid "Change history: %s" +msgstr "Sejarah penukaran: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Memadam %(class_name)s %(instance)s memerlukan pemadaman objek berkaitan " +"yang dilindungi: %(related_objects)s" + +msgid "Django site admin" +msgstr "Pentadbiran laman Django" + +msgid "Django administration" +msgstr "Pentadbiran Django" + +msgid "Site administration" +msgstr "Pentadbiran laman" + +msgid "Log in" +msgstr "Log masuk" + +#, python-format +msgid "%(app)s administration" +msgstr "Pentadbiran %(app)s" + +msgid "Page not found" +msgstr "Laman tidak dijumpai" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "Maaf, tetapi laman yang diminta tidak dijumpai." + +msgid "Home" +msgstr "Utama" + +msgid "Server error" +msgstr "Masalah pelayan" + +msgid "Server error (500)" +msgstr "Masalah pelayan (500)" + +msgid "Server Error (500)" +msgstr "Masalah pelayan (500)" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"Terdapat masalah. Ia telah dilaporkan kepada pentadbir laman melalui emel " +"dan sepatutnya dibaiki sebentar lagi. Kesabaran anda amat dihargai." + +msgid "Run the selected action" +msgstr "Jalankan tindakan yang dipilih" + +msgid "Go" +msgstr "Teruskan" + +msgid "Click here to select the objects across all pages" +msgstr "Klik disini untuk memilih objek-objek disemua laman" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Pilih kesemua %(total_count)s%(module_name)s" + +msgid "Clear selection" +msgstr "Padam pilihan" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model didalam aplikasi %(name)s" + +msgid "Add" +msgstr "Tambah" + +msgid "View" +msgstr "Lihat" + +msgid "You don’t have permission to view or edit anything." +msgstr "Anda tidak mempunyai kebenaran untuk melihat atau edit apa-apa." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"Pertama sekali, masukkan nama pengguna dan kata laluan. Selepas itu, anda " +"boleh edit pilihan pengguna yang lain" + +msgid "Enter a username and password." +msgstr "Masukkan nama pengguna dan kata laluan." + +msgid "Change password" +msgstr "Tukar kata laluan" + +msgid "Please correct the error below." +msgstr "Sila betulkan ralat di bawah." + +msgid "Please correct the errors below." +msgstr "Sila betulkan ralat-ralat di bawah." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Masukkan kata lalauan bagi pengguna %(username)s" + +msgid "Welcome," +msgstr "Selamat datang," + +msgid "View site" +msgstr "Lihat laman" + +msgid "Documentation" +msgstr "Dokumentasi" + +msgid "Log out" +msgstr "Log keluar" + +#, python-format +msgid "Add %(name)s" +msgstr "Tambah %(name)s" + +msgid "History" +msgstr "Sejarah" + +msgid "View on site" +msgstr "Lihat di laman" + +msgid "Filter" +msgstr "Tapis" + +msgid "Clear all filters" +msgstr "Kosongkan kesemua tapisan" + +msgid "Remove from sorting" +msgstr "Buang daripada penyusunan" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Keutamaan susunan: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Togol penyusunan" + +msgid "Delete" +msgstr "Buang" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Memadam %(object_name)s '%(escaped_object)s' akan menyebabkan pembuangan " +"objek-objek yang berkaitan, tetapi akaun anda tidak mempunyai kebenaran " +"untuk memadam jenis-jenis objek-objek berikut:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Membuang %(object_name)s '%(escaped_object)s' memerlukan pembuangan objek-" +"objek berkaitan yang dilindungi:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Adakah anda pasti anda ingin membuang %(object_name)s \"%(escaped_object)s" +"\"? Semua item-item berkaitan berikut akan turut dibuang:" + +msgid "Objects" +msgstr "Objek-objek" + +msgid "Yes, I’m sure" +msgstr "Ya, saya pasti" + +msgid "No, take me back" +msgstr "Tidak, bawa saya kembali" + +msgid "Delete multiple objects" +msgstr "Buang pelbagai objek" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Membuang %(objects_name)s akan menyebabkan pembuangan objek-objek yang " +"berkaitan, tetapi akaun anda tidak mempunyai kebenaran to membuang jenis " +"objek-objek berikut:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Membuang %(objects_name)s memerlukan pembuangan objek-objek berkaitan yang " +"dilindungi:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Adakah anda pasti untuk membuang %(objects_name)s yang dipilih? Segala objek-" +"objek berikut dan item-item yang berkaitan akan turut dibuang:" + +msgid "Delete?" +msgstr "Buang?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "Daripada %(filter_title)s" + +msgid "Summary" +msgstr "Rumusan" + +msgid "Recent actions" +msgstr "Tindakan terkini" + +msgid "My actions" +msgstr "Tindakan saya" + +msgid "None available" +msgstr "Tiada yang tersedia" + +msgid "Unknown content" +msgstr "Kandungan tidak diketahui" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"Nampaknya ada masalah dengan pemasangan pangkalan data anda. Pastikan jadual " +"pangkalan yang bersesuaian telah di cipta, dan pastikan pangkalan data " +"tersebut boleh dibaca oleh pengguna yang bersesuaian." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Anda telah disahkan sebagai %(username)s, tetapi anda tidak dibenarkan untuk " +"mengakses ruangan ini. Adakah anda ingin log masuk menggunakan akaun lain?" + +msgid "Forgotten your password or username?" +msgstr "Terlupa kata laluan atau nama pengguna anda?" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Start typing to filter…" +msgstr "Mulakan menaip untuk menapis..." + +msgid "Filter navigation items" +msgstr "Tapis item-item navigasi" + +msgid "Date/time" +msgstr "Tarikh/masa" + +msgid "User" +msgstr "Pengguna" + +msgid "Action" +msgstr "Tindakan" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" +"Objek ini tidak mempunyai sejarah penukaran. Ini mungkin bermaksud ia tidak " +"ditambah menggunakan laman admin ini." + +msgid "Show all" +msgstr "Tunjuk semua" + +msgid "Save" +msgstr "Simpan" + +msgid "Popup closing…" +msgstr "Popup sedang ditutup..." + +msgid "Search" +msgstr "Cari" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s keputusan" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s jumlah" + +msgid "Save as new" +msgstr "Simpan sebagai baru" + +msgid "Save and add another" +msgstr "Simpan dan tambah lagi" + +msgid "Save and continue editing" +msgstr "Simpan dan teruskan mengedit" + +msgid "Save and view" +msgstr "Simpan dan lihat" + +msgid "Close" +msgstr "Tutup" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Tukar %(model)s yang dipilih" + +#, python-format +msgid "Add another %(model)s" +msgstr "Tambah %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Buang %(model)s pilihan" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Terima kasih kerana meluangkan masa di laman sesawang ini hari ini." + +msgid "Log in again" +msgstr "Log masuk semula" + +msgid "Password change" +msgstr "Pertukaran kata laluan" + +msgid "Your password was changed." +msgstr "Kata laluan anda telah ditukarkan" + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Untuk tujuan keselamatan, sila masukkan kata laluan lama, kemudian masukkan " +"kata laluan baru dua kali supaya kami dapat memastikan anda memasukkannya " +"dengan betul." + +msgid "Change my password" +msgstr "Tukar kata laluan saya" + +msgid "Password reset" +msgstr "Tetap semula kata laluan" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Kata laluan anda telah ditetapkan. Sila log masuk." + +msgid "Password reset confirmation" +msgstr "Pengesahan tetapan semula kata laluan" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Sila masukkan kata laluan baru anda dua kali supaya kami adpat memastikan " +"anda memasukkannya dengan betul." + +msgid "New password:" +msgstr "Kata laluan baru:" + +msgid "Confirm password:" +msgstr "Sahkan kata laluan:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Pautan tetapan semula kata laluan tidak sah, mungkin kerana ia telah " +"digunakan. Sila minta tetapan semula kata laluan yang baru." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"Kami telah menghantar panduan untuk menetapkan kata laluan anda melalui " +"emel, sekiranya emel yang anda masukkan itu wujud. Anda sepatutnya " +"menerimanya sebentar lagi." + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" +"Jika anda tidak menerima emel, sila pastikan anda telah memasukkan alamat " +"emel yang telah didaftarkan, dan semak folder spam anda." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Anda menerima emel ini kerana anda telah memohon untuk menetapkan semula " +"kata laluan bagi akaun pengguna di %(site_name)s" + +msgid "Please go to the following page and choose a new password:" +msgstr "Sila ke ruangan berikut dan pilih kata laluan baru:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "Nama pengguna anda, sekiranya anda terlupa:" + +msgid "Thanks for using our site!" +msgstr "Terima kasih kerana menggunakan laman kami!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Pasukan %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" +"Lupa kata laluan anda? Masukkan alamat emel anda dibawah, dan kami akan " +"menghantar cara untuk menetapkan kata laluan baru." + +msgid "Email address:" +msgstr "Alamat emel:" + +msgid "Reset my password" +msgstr "Tetap semula kata laluan saya" + +msgid "All dates" +msgstr "Semua tarikh" + +#, python-format +msgid "Select %s" +msgstr "Pilih %s" + +#, python-format +msgid "Select %s to change" +msgstr "Pilih %s untuk diubah" + +#, python-format +msgid "Select %s to view" +msgstr "Pilih %s untuk lihat" + +msgid "Date:" +msgstr "Tarikh:" + +msgid "Time:" +msgstr "Masa:" + +msgid "Lookup" +msgstr "Carian" + +msgid "Currently:" +msgstr "Kini:" + +msgid "Change:" +msgstr "Tukar:" diff --git a/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..65e0050970c4 Binary files /dev/null and b/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..6d865028647f --- /dev/null +++ b/django/contrib/admin/locale/ms/LC_MESSAGES/djangojs.po @@ -0,0 +1,264 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Jafry Hisham, 2021 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-11-16 13:42+0000\n" +"Last-Translator: Jafry Hisham\n" +"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#, javascript-format +msgid "Available %s" +msgstr "%s tersedia" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Ini adalah senarai %s yang tersedia. Anda boleh memilih beberapa dengan " +"memilihnya di dalam kotak dibawah dan kemudian klik pada anak panah \"Pilih" +"\" diantara dua kotak itu." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "Taip didalam kotak untuk menapis senarai %s yang tersedia." + +msgid "Filter" +msgstr "Tapis" + +msgid "Choose all" +msgstr "Pilih semua" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Klik untuk memlih semua %s serentak." + +msgid "Choose" +msgstr "Pilih" + +msgid "Remove" +msgstr "Buang" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s dipilh" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Ini adalah senarai %s yang dipilih. Anda boleh membuangnya dengan memilihnya " +"pada kotak dibawah dan kemudian klik pada anak panah \"Buang\" diantara dua " +"kotak itu." + +msgid "Remove all" +msgstr "Buang semua" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Klik untuk membuang serentak semua %s yang dipilih." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s daripada %(cnt)s dipilih" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Anda mempunyai perubahan yang belum disimpan pada medan-medan individu yang " +"boleh di-edit. Sekiranya anda melakukan sebarang tindakan, penukaran yang " +"tidak disimpan akan hilang." + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"Anda telah memlih tindakan, tetapi anda belum menyimpan perubahan yang " +"dilakukan pada medan-medan individu. Sila klik OK to untuk simpan. Anda " +"perlu melakukan semula tindakan tersebut." + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "" +"Anda telah memilih sesuatu tindakan, dan belum membuat perubahan pada medan-" +"medan individu. Anda mungkin sedang mencari butang Pergi dan bukannya butang " +"Simpan." + +msgid "Now" +msgstr "Sekarang" + +msgid "Midnight" +msgstr "Tengah malam" + +msgid "6 a.m." +msgstr "6 pagi" + +msgid "Noon" +msgstr "Tengahari" + +msgid "6 p.m." +msgstr "6 malam" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Nota: Anda %s jam ke depan daripada masa pelayan." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Nota: Anda %s jam ke belakang daripada masa pelayan." + +msgid "Choose a Time" +msgstr "Pilih Masa" + +msgid "Choose a time" +msgstr "Pilih masa" + +msgid "Cancel" +msgstr "Batal" + +msgid "Today" +msgstr "Hari ini" + +msgid "Choose a Date" +msgstr "Pilih Tarikh" + +msgid "Yesterday" +msgstr "Semalam" + +msgid "Tomorrow" +msgstr "Esok" + +msgid "January" +msgstr "Januari" + +msgid "February" +msgstr "Februari" + +msgid "March" +msgstr "Mac" + +msgid "April" +msgstr "Arpil" + +msgid "May" +msgstr "Mei" + +msgid "June" +msgstr "Jun" + +msgid "July" +msgstr "Julai" + +msgid "August" +msgstr "Ogos" + +msgid "September" +msgstr "September" + +msgid "October" +msgstr "Oktober" + +msgid "November" +msgstr "November" + +msgid "December" +msgstr "Disember" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mei" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ogo" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dis" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "A" + +msgctxt "one letter Monday" +msgid "M" +msgstr "I" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "Se" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "R" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "K" + +msgctxt "one letter Friday" +msgid "F" +msgstr "J" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Sa" + +msgid "Show" +msgstr "Tunjuk" + +msgid "Hide" +msgstr "Sorok" diff --git a/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo b/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo index 59c0813bbe72..ea77ddde43fd 100644 Binary files a/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/nb/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/nb/LC_MESSAGES/django.po b/django/contrib/admin/locale/nb/LC_MESSAGES/django.po index ed32303788d3..3f6445ee4313 100644 --- a/django/contrib/admin/locale/nb/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/nb/LC_MESSAGES/django.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 12:21+0000\n" +"POT-Creation-Date: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-09-04 13:37+0000\n" "Last-Translator: Jon \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" "language/nb/)\n" @@ -75,6 +75,12 @@ msgstr "Ingen dato" msgid "Has date" msgstr "Har dato" +msgid "Empty" +msgstr "Tom" + +msgid "Not empty" +msgstr "Ikke tom" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -334,6 +340,19 @@ msgstr "Velg alle %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Nullstill valg" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i %(name)s-applikasjonen" + +msgid "Add" +msgstr "Legg til" + +msgid "View" +msgstr "Se" + +msgid "You don’t have permission to view or edit anything." +msgstr "Du har ikke tillatelse til å vise eller endre noe." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -382,6 +401,9 @@ msgstr "Vis på nettsted" msgid "Filter" msgstr "Filtrering" +msgid "Clear all filters" +msgstr "Fjern alle filtre" + msgid "Remove from sorting" msgstr "Fjern fra sortering" @@ -459,9 +481,6 @@ msgstr "" "Er du sikker på vil slette det valgte %(objects_name)s? De følgende " "objektene og deres relaterte objekter vil bli slettet:" -msgid "View" -msgstr "Se" - msgid "Delete?" msgstr "Slette?" @@ -472,16 +491,6 @@ msgstr "Etter %(filter_title)s " msgid "Summary" msgstr "Oppsummering" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i %(name)s-applikasjonen" - -msgid "Add" -msgstr "Legg til" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har ikke tillatelse til å vise eller endre noe." - msgid "Recent actions" msgstr "Siste handlinger" @@ -513,6 +522,9 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Glemt brukernavnet eller passordet ditt?" +msgid "Toggle navigation" +msgstr "Veksle navigasjon" + msgid "Date/time" msgstr "Dato/tid" diff --git a/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo index 5f34eb3aa735..6b1d74e4a1d0 100644 Binary files a/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po index 7588b488d573..1e6ddb658b36 100644 --- a/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/nb/LC_MESSAGES/djangojs.po @@ -3,16 +3,17 @@ # Translators: # Eirik Krogstad , 2014 # Jannis Leidel , 2011 -# Jon , 2015-2016 -# Jon , 2014 -# Jon , 2011-2012 +# Jon, 2015-2016 +# Jon, 2014 +# Jon, 2020-2021 +# Jon, 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jon \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-03-18 14:20+0000\n" +"Last-Translator: Jon\n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/django/django/" "language/nb/)\n" "MIME-Version: 1.0\n" @@ -85,17 +86,17 @@ msgstr "" "handling, vil dine ulagrede endringer gå tapt." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Du har valgt en handling, men du har ikke lagret dine endringer i " +"Du har valgt en handling, men du har ikke lagret endringene dine i " "individuelle felter enda. Vennligst trykk OK for å lagre. Du må utføre " "handlingen på nytt." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Du har valgt en handling, og har ikke gjort noen endringer i individuelle " @@ -185,6 +186,54 @@ msgstr "November" msgid "December" msgstr "Desember" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" + msgctxt "one letter Sunday" msgid "S" msgstr "S" diff --git a/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo index 903f979ff1e4..d10471430acb 100644 Binary files a/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ne/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ne/LC_MESSAGES/django.po b/django/contrib/admin/locale/ne/LC_MESSAGES/django.po index a328113848d6..ab9e55a06409 100644 --- a/django/contrib/admin/locale/ne/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ne/LC_MESSAGES/django.po @@ -3,13 +3,14 @@ # Translators: # Sagar Chalise , 2011 # Santosh Purbey , 2020 +# Shrawan Poudel , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 09:52+0000\n" -"Last-Translator: Santosh Purbey \n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-11-22 06:50+0000\n" +"Last-Translator: Shrawan Poudel \n" "Language-Team: Nepali (http://www.transifex.com/django/django/language/ne/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,6 +18,10 @@ msgstr "" "Language: ne\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "सफलतापूर्वक मेटियो %(count)d %(items)s ।" @@ -28,10 +33,6 @@ msgstr "%(name)s मेट्न सकिएन " msgid "Are you sure?" msgstr "के तपाई पक्का हुनुहुन्छ ?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s छानिएको मेट्नुहोस" - msgid "Administration" msgstr "प्रशासन " @@ -68,6 +69,12 @@ msgstr "मिति छैन" msgid "Has date" msgstr "मिति छ" +msgid "Empty" +msgstr "खाली" + +msgid "Not empty" +msgstr "खाली छैन" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -321,6 +328,19 @@ msgstr "%(total_count)s %(module_name)s सबै छान्नुहोस " msgid "Clear selection" msgstr "चुनेको कुरा हटाउनुहोस ।" +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु" + +msgid "Add" +msgstr "थप्नुहोस " + +msgid "View" +msgstr "" + +msgid "You don’t have permission to view or edit anything." +msgstr "तपाईंसँग केहि पनि हेर्न वा सम्पादन गर्न अनुमति छैन।" + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -369,6 +389,9 @@ msgstr "साइटमा हेर्नुहोस" msgid "Filter" msgstr "छान्नुहोस" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "" @@ -432,9 +455,6 @@ msgid "" "following objects and their related items will be deleted:" msgstr "%(objects_name)s " -msgid "View" -msgstr "" - msgid "Delete?" msgstr "मेट्नुहुन्छ ?" @@ -445,16 +465,6 @@ msgstr " %(filter_title)s द्वारा" msgid "Summary" msgstr "" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s एप्लिकेसनमा भएको मोडेलहरु" - -msgid "Add" -msgstr "थप्नुहोस " - -msgid "You don’t have permission to view or edit anything." -msgstr "तपाईंसँग केहि पनि हेर्न वा सम्पादन गर्न अनुमति छैन।" - msgid "Recent actions" msgstr "भर्खरका कार्यहरू" @@ -487,6 +497,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "पासवर्ड अथवा प्रयोगकर्ता नाम भुल्नुभयो ।" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "मिति/समय" @@ -550,8 +569,8 @@ msgstr "" msgid "Delete selected %(model)s" msgstr "" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "वेब साइटमा समय बिताउनु भएकोमा धन्यवाद ।" +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "पुन: लगिन गर्नुहोस" diff --git a/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo b/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo index 131248f04f10..b2181e2e71a3 100644 Binary files a/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/nl/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/nl/LC_MESSAGES/django.po b/django/contrib/admin/locale/nl/LC_MESSAGES/django.po index 76b5929dbfb6..ee971ddff079 100644 --- a/django/contrib/admin/locale/nl/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/nl/LC_MESSAGES/django.po @@ -7,26 +7,30 @@ # Harro van der Klauw , 2012 # Ilja Maas , 2015 # Jannis Leidel , 2011 -# Jeffrey Gelens , 2011-2012 +# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 # dokterbob , 2015 -# Meteor 0id, 2019 -# Sander Steffann , 2014-2015 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2014-2015 # Tino de Bruijn , 2011 -# Tonnes , 2017,2019 +# Tonnes , 2017,2019-2020,2022-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 08:08+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Tonnes , 2017,2019-2020,2022-2024\n" +"Language-Team: Dutch (http://app.transifex.com/django/django/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" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Geselecteerde %(verbose_name_plural)s verwijderen" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s met succes verwijderd." @@ -38,10 +42,6 @@ msgstr "%(name)s kan niet worden verwijderd " msgid "Are you sure?" msgstr "Weet u het zeker?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Geselecteerde %(verbose_name_plural)s verwijderen" - msgid "Administration" msgstr "Beheer" @@ -78,6 +78,12 @@ msgstr "Geen datum" msgid "Has date" msgstr "Heeft datum" +msgid "Empty" +msgstr "Leeg" + +msgid "Not empty" +msgstr "Niet leeg" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -182,6 +188,9 @@ msgstr "" "Houd ‘Control’, of ‘Command’ op een Mac, ingedrukt om meerdere items te " "selecteren." +msgid "Select this object for an action - {}" +msgstr "Selecteer dit object voor een actie - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "De {name} ‘{obj}’ is met succes toegevoegd." @@ -203,12 +212,6 @@ msgstr "" "De {name} ‘{obj}’ is met succes gewijzigd. U kunt deze hieronder nogmaals " "bewerken." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"De {name} ‘{obj}’ is met succes toegevoegd. U kunt deze hieronder nogmaals " -"bewerken." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -274,8 +277,9 @@ msgstr "0 van de %(cnt)s geselecteerd" msgid "Change history: %s" msgstr "Wijzigingsgeschiedenis: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -346,6 +350,22 @@ msgstr "Alle %(total_count)s %(module_name)s selecteren" msgid "Clear selection" msgstr "Selectie wissen" +msgid "Breadcrumbs" +msgstr "Broodkruimels" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modellen in de %(name)s-toepassing" + +msgid "Add" +msgstr "Toevoegen" + +msgid "View" +msgstr "Weergeven" + +msgid "You don’t have permission to view or edit anything." +msgstr "U hebt geen rechten om iets te bekijken of te bewerken." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -359,17 +379,35 @@ msgstr "Voer een gebruikersnaam en wachtwoord in." msgid "Change password" msgstr "Wachtwoord wijzigen" -msgid "Please correct the error below." -msgstr "Corrigeer de fout hieronder." +msgid "Set password" +msgstr "Wachtwoord instellen" -msgid "Please correct the errors below." -msgstr "Corrigeer de fouten hieronder." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Corrigeer de onderstaande fout." +msgstr[1] "Corrigeer de onderstaande fouten." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Voer een nieuw wachtwoord in voor de gebruiker %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Deze actie schakelt op wachtwoord gebaseerde authenticatie in voor deze gebruiker." + +msgid "Disable password-based authentication" +msgstr "Op wachtwoord gebaseerde authenticatie uitschakelen" + +msgid "Enable password-based authentication" +msgstr "Op wachtwoord gebaseerde authenticatie inschakelen" + +msgid "Skip to main content" +msgstr "Naar hoofdinhoud" + msgid "Welcome," msgstr "Welkom," @@ -395,6 +433,15 @@ msgstr "Weergeven op website" msgid "Filter" msgstr "Filter" +msgid "Hide counts" +msgstr "Aantallen verbergen" + +msgid "Show counts" +msgstr "Aantallen tonen" + +msgid "Clear all filters" +msgstr "Alle filters wissen" + msgid "Remove from sorting" msgstr "Verwijderen uit sortering" @@ -405,6 +452,15 @@ msgstr "Sorteerprioriteit: %(priority_number)s" msgid "Toggle sorting" msgstr "Sortering aan/uit" +msgid "Toggle theme (current theme: auto)" +msgstr "Thema wisselen (huidige thema: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Thema wisselen (huidige thema: licht)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Thema wisselen (huidige thema: donker)" + msgid "Delete" msgstr "Verwijderen" @@ -414,9 +470,9 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Het verwijderen van %(object_name)s '%(escaped_object)s' zal ook " -"gerelateerde objecten verwijderen. U hebt echter geen rechten om de volgende " -"typen objecten te verwijderen:" +"Het verwijderen van %(object_name)s '%(escaped_object)s' zou ook " +"gerelateerde objecten verwijderen, maar uw account heeft geen rechten om de " +"volgende typen objecten te verwijderen:" #, python-format msgid "" @@ -452,9 +508,9 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Het verwijderen van de geselecteerde %(objects_name)s vereist het " -"verwijderen van gerelateerde objecten, maar uw account heeft geen " -"toestemming om de volgende soorten objecten te verwijderen:" +"Het verwijderen van de geselecteerde %(objects_name)s zou ook gerelateerde " +"objecten verwijderen, maar uw account heeft geen rechten om de volgende " +"typen objecten te verwijderen:" #, python-format msgid "" @@ -472,9 +528,6 @@ msgstr "" "Weet u zeker dat u de geselecteerde %(objects_name)s wilt verwijderen? Alle " "volgende objecten en hun aanverwante items zullen worden verwijderd:" -msgid "View" -msgstr "Weergeven" - msgid "Delete?" msgstr "Verwijderen?" @@ -485,16 +538,6 @@ msgstr " Op %(filter_title)s " msgid "Summary" msgstr "Samenvatting" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modellen in de %(name)s-toepassing" - -msgid "Add" -msgstr "Toevoegen" - -msgid "You don’t have permission to view or edit anything." -msgstr "U hebt geen rechten om iets te bekijken of te bewerken." - msgid "Recent actions" msgstr "Recente acties" @@ -504,6 +547,15 @@ msgstr "Mijn acties" msgid "None available" msgstr "Geen beschikbaar" +msgid "Added:" +msgstr "Toegevoegd:" + +msgid "Changed:" +msgstr "Gewijzigd:" + +msgid "Deleted:" +msgstr "Verwijderd:" + msgid "Unknown content" msgstr "Onbekende inhoud" @@ -527,6 +579,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Wachtwoord of gebruikersnaam vergeten?" +msgid "Toggle navigation" +msgstr "Navigatie aan/uit" + +msgid "Sidebar" +msgstr "Zijbalk" + +msgid "Start typing to filter…" +msgstr "Begin met typen om te filteren…" + +msgid "Filter navigation items" +msgstr "Navigatie-items filteren" + msgid "Date/time" msgstr "Datum/tijd" @@ -536,6 +600,11 @@ msgstr "Gebruiker" msgid "Action" msgstr "Actie" +msgid "entry" +msgid_plural "entries" +msgstr[0] "vermelding" +msgstr[1] "vermeldingen" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -592,8 +661,12 @@ msgstr "Nog een %(model)s toevoegen" msgid "Delete selected %(model)s" msgstr "Geselecteerde %(model)s verwijderen" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Bedankt voor de aanwezigheid op de site vandaag." +#, python-format +msgid "View selected %(model)s" +msgstr "Geselecteerde %(model)s weergeven" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Bedankt voor het vandaag wat tijd besteden aan de website." msgid "Log in again" msgstr "Opnieuw aanmelden" @@ -692,6 +765,9 @@ msgstr "E-mailadres:" msgid "Reset my password" msgstr "Mijn wachtwoord opnieuw instellen" +msgid "Select all objects on this page for an action" +msgstr "Selecteer alle objecten op deze pagina voor een actie" + msgid "All dates" msgstr "Alle datums" diff --git a/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo index d8e3570fad3d..69485a263ee4 100644 Binary files a/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po index 2dd469ca5bf1..8c7a4ba1149d 100644 --- a/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/nl/LC_MESSAGES/djangojs.po @@ -6,19 +6,19 @@ # Harro van der Klauw , 2012 # Ilja Maas , 2015 # Jannis Leidel , 2011 -# Jeffrey Gelens , 2011-2012 -# Meteor0id, 2019 -# Sander Steffann , 2015 -# Tonnes , 2019 +# 6a27f10aef159701c7a5ff07f0fb0a78_05545ed , 2011-2012 +# Meteor0id, 2019-2020 +# 8de006b1b0894aab6aef71979dcd8bd6_5c6b207 , 2015 +# Tonnes , 2019-2020,2022-2023 # wunki , 2011 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-12-09 16:09+0000\n" -"Last-Translator: Tonnes \n" -"Language-Team: Dutch (http://www.transifex.com/django/django/language/nl/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Tonnes , 2019-2020,2022-2023\n" +"Language-Team: Dutch (http://app.transifex.com/django/django/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -71,6 +71,10 @@ msgstr "" "het vak hieronder te selecteren en daarna op de pijl 'Verwijderen' tussen de " "twee vakken te klikken." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Typ in dit vak om de lijst met geselecteerde %s te filteren." + msgid "Remove all" msgstr "Alle verwijderen" @@ -78,6 +82,12 @@ msgstr "Alle verwijderen" msgid "Click to remove all chosen %s at once." msgstr "Klik om alle gekozen %s tegelijk te verwijderen." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s geselecteerde optie niet zichtbaar" +msgstr[1] "%s geselecteerde opties niet zichtbaar" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s van de %(cnt)s geselecteerd" @@ -91,17 +101,17 @@ msgstr "" "een actie uitvoert, gaan uw wijzigingen verloren." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "U hebt een actie geselecteerd, maar uw wijzigingen in afzonderlijke velden " -"nog niet opgeslagen. Klik op OK om op te slaan. U dient de actie opnieuw uit " -"te voeren." +"nog niet opgeslagen. Klik op OK om deze op te slaan. U dient de actie " +"opnieuw uit te voeren." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "U hebt een actie geselecteerd, en geen wijzigingen in afzonderlijke velden " @@ -192,6 +202,103 @@ msgstr "november" msgid "December" msgstr "december" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mrt" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "mei" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec" + +msgid "Sunday" +msgstr "zondag" + +msgid "Monday" +msgstr "maandag" + +msgid "Tuesday" +msgstr "dinsdag" + +msgid "Wednesday" +msgstr "woensdag" + +msgid "Thursday" +msgstr "donderdag" + +msgid "Friday" +msgstr "vrijdag" + +msgid "Saturday" +msgstr "zaterdag" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "zo" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "ma" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "di" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "wo" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "do" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "vr" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "za" + msgctxt "one letter Sunday" msgid "S" msgstr "Z" diff --git a/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo b/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo index 78170f03f174..779cf097472a 100644 Binary files a/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/nn/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/nn/LC_MESSAGES/django.po b/django/contrib/admin/locale/nn/LC_MESSAGES/django.po index a85f011cacb2..4a7c846f80a1 100644 --- a/django/contrib/admin/locale/nn/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/nn/LC_MESSAGES/django.po @@ -5,14 +5,16 @@ # Jannis Leidel , 2011 # jensadne , 2013 # Sigurd Gartmann , 2012 +# Sivert Olstad, 2021-2022 # velmont , 2012 +# Vibeke Uthaug, 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2022-05-17 05:10-0500\n" +"PO-Revision-Date: 2022-07-25 07:05+0000\n" +"Last-Translator: Sivert Olstad\n" "Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" "language/nn/)\n" "MIME-Version: 1.0\n" @@ -21,6 +23,10 @@ msgstr "" "Language: nn\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Slett valgte %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Sletta %(count)d %(items)s." @@ -32,12 +38,8 @@ msgstr "Kan ikkje slette %(name)s" msgid "Are you sure?" msgstr "Er du sikker?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Slett valgte %(verbose_name_plural)s" - msgid "Administration" -msgstr "" +msgstr "Administrasjon" msgid "All" msgstr "Alle" @@ -67,41 +69,58 @@ msgid "This year" msgstr "I år" msgid "No date" -msgstr "" +msgstr "Ingen dato" msgid "Has date" -msgstr "" +msgstr "Har dato" + +msgid "Empty" +msgstr "Tom" + +msgid "Not empty" +msgstr "Ikkje tom" #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" +"Oppgje korrekt %(username)s og passord for ein administrasjonsbrukarkonto. " +"Merk at det er skilnad på små og store bokstavar." msgid "Action:" msgstr "Handling:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "Legg til ny %(verbose_name)s." +msgstr "Opprett ny %(verbose_name)s." msgid "Remove" msgstr "Fjern" +msgid "Addition" +msgstr "Tillegg" + +msgid "Change" +msgstr "Endre" + +msgid "Deletion" +msgstr "Sletting" + msgid "action time" msgstr "tid for handling" msgid "user" -msgstr "" +msgstr "brukar" msgid "content type" -msgstr "" +msgstr "innhaldstype" msgid "object id" msgstr "objekt-ID" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "objekt repr" @@ -118,41 +137,41 @@ msgid "log entries" msgstr "logginnlegg" #, python-format -msgid "Added \"%(object)s\"." -msgstr "La til «%(object)s»." +msgid "Added “%(object)s”." +msgstr "Oppretta “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Endra «%(object)s» - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Endra “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Sletta «%(object)s»." +msgid "Deleted “%(object)s.”" +msgstr "Sletta “%(object)s”." msgid "LogEntry Object" msgstr "LogEntry-objekt" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "" +msgid "Added {name} “{object}”." +msgstr "Oppretta {name} “{object}”." msgid "Added." -msgstr "" +msgstr "Oppretta." msgid "and" msgstr "og" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" +msgid "Changed {fields} for {name} “{object}”." +msgstr "Endra {fields} for {name} “{object}”." #, python-brace-format msgid "Changed {fields}." -msgstr "" +msgstr "Endra {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" +msgid "Deleted {name} “{object}”." +msgstr "Sletta {name} “{object}”." msgid "No fields changed." msgstr "Ingen felt endra." @@ -160,39 +179,41 @@ msgstr "Ingen felt endra." msgid "None" msgstr "Ingen" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +"Hald nede “Control”, eller “Command” på ein Mac, for å velge meir enn éin." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” vart oppretta." + +msgid "You may edit it again below." +msgstr "Du kan endre det att nedanfor." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} “{obj}” vart oppretta. Du kan opprette enda ein {name} nedanfor." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "{name} “{obj}” vart endra. Du kan redigere vidare nedanfor." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "" +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} “{obj}” vart oppretta. Du kan redigere vidare nedanfor." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "" +msgstr "{name} “{obj}” vart endra. Du kan opprette enda ein {name} nedanfor." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” vart endra." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -205,12 +226,13 @@ msgid "No action selected." msgstr "Inga valt handling." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" vart sletta." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” vart sletta." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" +"%(name)s med ID “%(key)s” eksisterer ikkje. Kanskje den har vorte sletta?" #, python-format msgid "Add %s" @@ -220,6 +242,10 @@ msgstr "Opprett %s" msgid "Change %s" msgstr "Rediger %s" +#, python-format +msgid "View %s" +msgstr "Sjå %s" + msgid "Database error" msgstr "Databasefeil" @@ -243,11 +269,12 @@ msgstr "Ingen av %(cnt)s valde" msgid "Change history: %s" msgstr "Endringshistorikk: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" -msgstr "" +msgstr "%(class_name)s %(instance)s" #, python-format msgid "" @@ -271,12 +298,12 @@ msgstr "Logg inn" #, python-format msgid "%(app)s administration" -msgstr "" +msgstr "%(app)s-administrasjon" msgid "Page not found" msgstr "Fann ikkje sida" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Sida du spør etter finst ikkje." msgid "Home" @@ -292,9 +319,11 @@ msgid "Server Error (500)" msgstr "Tenarfeil (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"Det har oppstått ein feil. Det er rapportert til dei som administrerer " +"nettsida med e-mail og burde bli fiksa snarast. Takk for tolmodigheita." msgid "Run the selected action" msgstr "Utfør den valde handlinga" @@ -312,8 +341,21 @@ msgstr "Velg alle %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Nullstill utval" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modellar i %(name)s-applikasjonen" + +msgid "Add" +msgstr "Opprett" + +msgid "View" +msgstr "Sjå" + +msgid "You don’t have permission to view or edit anything." +msgstr "Du har ikkje løyve til å sjå eller redigere noko." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Skriv først inn brukernamn og passord. Deretter vil du få høve til å endre " @@ -326,10 +368,10 @@ msgid "Change password" msgstr "Endre passord" msgid "Please correct the error below." -msgstr "Korriger feila under." +msgstr "Korriger feilen under." msgid "Please correct the errors below." -msgstr "" +msgstr "Korriger feila under." #, python-format msgid "Enter a new password for the user %(username)s." @@ -339,7 +381,7 @@ msgid "Welcome," msgstr "Velkommen," msgid "View site" -msgstr "" +msgstr "Vis nettstad" msgid "Documentation" msgstr "Dokumentasjon" @@ -360,6 +402,9 @@ msgstr "Vis på nettstad" msgid "Filter" msgstr "Filtrering" +msgid "Clear all filters" +msgstr "Fjern alle filter" + msgid "Remove from sorting" msgstr "Fjern frå sortering" @@ -399,13 +444,13 @@ msgstr "" "Alle dei følgjande relaterte objekta vil bli sletta:" msgid "Objects" -msgstr "" +msgstr "Objekt" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Ja, eg er sikker" msgid "No, take me back" -msgstr "" +msgstr "Nei, ta meg attende" msgid "Delete multiple objects" msgstr "Slett fleire objekt" @@ -435,9 +480,6 @@ msgstr "" "Er du sikker på at du vil slette dei valgte objekta %(objects_name)s? " "Følgjande objekt og deira relaterte objekt vil bli sletta:" -msgid "Change" -msgstr "Endre" - msgid "Delete?" msgstr "Slette?" @@ -446,23 +488,13 @@ msgid " By %(filter_title)s " msgstr "Etter %(filter_title)s " msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Opprett" - -msgid "You don't have permission to edit anything." -msgstr "Du har ikkje løyve til å redigere noko." +msgstr "Oppsummering" msgid "Recent actions" -msgstr "" +msgstr "Siste handlingar" msgid "My actions" -msgstr "" +msgstr "Mine handlingar" msgid "None available" msgstr "Ingen tilgjengelege" @@ -471,7 +503,7 @@ msgid "Unknown content" msgstr "Ukjent innhald" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -483,10 +515,21 @@ msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" +"Du er stadfesta som %(username)s, men er ikkje autentisert til å få tilgang " +"til denne sida. Ynskjer du å logge inn med ein annan konto?" msgid "Forgotten your password or username?" msgstr "Gløymd brukarnamn eller passord?" +msgid "Toggle navigation" +msgstr "Veksl navigasjon" + +msgid "Start typing to filter…" +msgstr "Begynn å skrive for å filtrere..." + +msgid "Filter navigation items" +msgstr "Filtrer navigasjonselement" + msgid "Date/time" msgstr "Dato/tid" @@ -496,12 +539,18 @@ msgstr "Brukar" msgid "Action" msgstr "Handling" +msgid "entry" +msgstr "" + +msgid "entries" +msgstr "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Dette objektet har ingen endringshistorikk. Det var sannsynlegvis ikkje " -"oppretta med administrasjonssida." +"Dette objektet har ingen endringshistorikk. Det blei sannsynlegvis ikkje " +"oppretta av denne administratoren. " msgid "Show all" msgstr "Vis alle" @@ -509,20 +558,8 @@ msgstr "Vis alle" msgid "Save" msgstr "Lagre" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" +msgid "Popup closing…" +msgstr "Lukkar popup…" msgid "Search" msgstr "Søk" @@ -546,8 +583,30 @@ msgstr "Lagre og opprett ny" msgid "Save and continue editing" msgstr "Lagre og hald fram å redigere" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Takk for at du brukte kvalitetstid på nettstaden i dag." +msgid "Save and view" +msgstr "Lagre og sjå" + +msgid "Close" +msgstr "Lukk" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Endre valt %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Opprett ny %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Slett valde %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Takk for at du brukte litt kvalitetstid på nettsida i dag. " msgid "Log in again" msgstr "Logg inn att" @@ -559,11 +618,11 @@ msgid "Your password was changed." msgstr "Passordet ditt vart endret." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Av sikkerheitsgrunnar må du oppgje det gamle passordet ditt. Oppgje så det " -"nye passordet ditt to gonger, slik at vi kan kontrollere at det er korrekt." +"nye passordet ditt to gongar, sånn at vi kan kontrollere at det er korrekt." msgid "Change my password" msgstr "Endre passord" @@ -598,25 +657,32 @@ msgstr "" "Nullstill passordet ditt på nytt." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Dersom det eksisterer ein brukarkonto med e-postadressa du skreiv inn vil " +"det bli sendt ein e-post med instruksjonar for å nullstille passordet til " +"den e-postadressa. Du burde motta den snart. " msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"Om du ikkje mottar ein e-post, ver vennleg og sørg for at du skreiv inn e-" +"postadressa du er registrert med og sjekk spam-filteret. " #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" +"Du får denne e-posten fordi du har bedt om å nullstille passordet for " +"brukarkontoen din på %(site_name)s." msgid "Please go to the following page and choose a new password:" msgstr "Gå til følgjande side og velg eit nytt passord:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Brukarnamnet ditt, i tilfelle du har gløymt det:" msgid "Thanks for using our site!" @@ -627,12 +693,14 @@ msgid "The %(site_name)s team" msgstr "Helsing %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Gløymt passordet ditt? Oppgje e-postadressa di under, så sender me deg ein e-" +"post med instruksjonar for nullstilling av passord." msgid "Email address:" -msgstr "" +msgstr "E-postadresse:" msgid "Reset my password" msgstr "Nullstill passordet" @@ -648,6 +716,10 @@ msgstr "Velg %s" msgid "Select %s to change" msgstr "Velg %s du ønskar å redigere" +#, python-format +msgid "Select %s to view" +msgstr "Velg %s du ønskar å sjå" + msgid "Date:" msgstr "Dato:" @@ -658,7 +730,7 @@ msgid "Lookup" msgstr "Oppslag" msgid "Currently:" -msgstr "" +msgstr "Noverande:" msgid "Change:" -msgstr "" +msgstr "Endre:" diff --git a/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo index c4c82413e535..d94421cf9de3 100644 Binary files a/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po index 07ba2f636512..8d4f64838c2f 100644 --- a/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/nn/LC_MESSAGES/djangojs.po @@ -3,14 +3,15 @@ # Translators: # hgrimelid , 2011 # Jannis Leidel , 2011 +# Sivert Olstad, 2021 # velmont , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-11-10 23:27+0000\n" +"Last-Translator: Sivert Olstad\n" "Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/" "language/nn/)\n" "MIME-Version: 1.0\n" @@ -83,42 +84,24 @@ msgstr "" "Endringar som ikkje er lagra vil gå tapt." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Du har vald ei handling, men du har framleis ikkje lagra endringar for " "individuelle felt. Klikk OK for å lagre. Du må gjere handlinga på nytt." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Du har vald ei handling og du har ikkje gjort endringar i individuelle felt. " "Du ser sannsynlegvis etter Gå vidare-knappen - ikkje Lagre-knappen." -#, javascript-format -msgid "Note: You are %s hour ahead of server time." -msgid_plural "Note: You are %s hours ahead of server time." -msgstr[0] "" -msgstr[1] "" - -#, javascript-format -msgid "Note: You are %s hour behind server time." -msgid_plural "Note: You are %s hours behind server time." -msgstr[0] "" -msgstr[1] "" - msgid "Now" msgstr "No" -msgid "Choose a Time" -msgstr "" - -msgid "Choose a time" -msgstr "Velg eit klokkeslett" - msgid "Midnight" msgstr "Midnatt" @@ -129,7 +112,25 @@ msgid "Noon" msgstr "12:00" msgid "6 p.m." -msgstr "" +msgstr "18:00" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "Merk: Du er %s time framanfor tjenar-tid." +msgstr[1] "Merk: Du er %s timar framanfor tjenar-tid." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "Merk: Du er %s time bak tjenar-tid." +msgstr[1] "Merk: Du er %s timar bak tjenar-tid." + +msgid "Choose a Time" +msgstr "Velg eit klokkeslett" + +msgid "Choose a time" +msgstr "Velg eit klokkeslett" msgid "Cancel" msgstr "Avbryt" @@ -138,7 +139,7 @@ msgid "Today" msgstr "I dag" msgid "Choose a Date" -msgstr "" +msgstr "Velg ein dato" msgid "Yesterday" msgstr "I går" @@ -147,68 +148,116 @@ msgid "Tomorrow" msgstr "I morgon" msgid "January" -msgstr "" +msgstr "Januar" msgid "February" -msgstr "" +msgstr "Februar" msgid "March" -msgstr "" +msgstr "Mars" msgid "April" -msgstr "" +msgstr "April" msgid "May" -msgstr "" +msgstr "Mai" msgid "June" -msgstr "" +msgstr "Juni" msgid "July" -msgstr "" +msgstr "Juli" msgid "August" -msgstr "" +msgstr "August" msgid "September" -msgstr "" +msgstr "September" msgid "October" -msgstr "" +msgstr "Oktober" msgid "November" -msgstr "" +msgstr "November" msgid "December" -msgstr "" +msgstr "Desember" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Des" msgctxt "one letter Sunday" msgid "S" -msgstr "" +msgstr "S" msgctxt "one letter Monday" msgid "M" -msgstr "" +msgstr "M" msgctxt "one letter Tuesday" msgid "T" -msgstr "" +msgstr "T" msgctxt "one letter Wednesday" msgid "W" -msgstr "" +msgstr "O" msgctxt "one letter Thursday" msgid "T" -msgstr "" +msgstr "T" msgctxt "one letter Friday" msgid "F" -msgstr "" +msgstr "F" msgctxt "one letter Saturday" msgid "S" -msgstr "" +msgstr "L" msgid "Show" msgstr "Vis" diff --git a/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo b/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo index 7f9761593840..e25e29a7fd1b 100644 Binary files a/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/pa/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/pa/LC_MESSAGES/django.po b/django/contrib/admin/locale/pa/LC_MESSAGES/django.po index 14b83e881d3f..004189383491 100644 --- a/django/contrib/admin/locale/pa/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/pa/LC_MESSAGES/django.po @@ -1,15 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# A S Alam , 2018 +# A S Alam, 2018 +# A S Alam, 2022 # Jannis Leidel , 2011 +# Satnam S Virdi , 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-21 14:16-0300\n" -"PO-Revision-Date: 2018-05-28 01:29+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 07:05+0000\n" +"Last-Translator: A S Alam, 2022\n" "Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" "language/pa/)\n" "MIME-Version: 1.0\n" @@ -18,6 +20,10 @@ msgstr "" "Language: pa\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "ਚੁਣੇ %(verbose_name_plural)s ਹਟਾਓ" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d %(items)s ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਈਆਂ ਗਈਆਂ।" @@ -29,12 +35,8 @@ msgstr "%(name)s ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" msgid "Are you sure?" msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਚਾਹੁੰਦੇ ਹੋ?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "ਚੁਣੇ %(verbose_name_plural)s ਹਟਾਓ" - msgid "Administration" -msgstr "ਪਰਸ਼ਾਸ਼ਨ" +msgstr "ਪ੍ਰਸ਼ਾਸਨ" msgid "All" msgstr "ਸਭ" @@ -64,9 +66,15 @@ msgid "This year" msgstr "ਇਹ ਸਾਲ" msgid "No date" -msgstr "" +msgstr "ਕੋਈ ਮਿਤੀ ਨਹੀਂ" msgid "Has date" +msgstr "ਮਿਤੀ ਹੈ" + +msgid "Empty" +msgstr "ਖਾਲੀ" + +msgid "Not empty" msgstr "" #, python-format @@ -107,7 +115,7 @@ msgid "object id" msgstr "ਆਬਜੈਕਟ id" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "ਆਬਜੈਕਟ repr" @@ -124,22 +132,22 @@ msgid "log entries" msgstr "ਲਾਗ ਐਂਟਰੀਆਂ" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" msgstr "" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "" msgid "LogEntry Object" msgstr "" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "" msgid "Added." @@ -149,7 +157,7 @@ msgid "and" msgstr "ਅਤੇ" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "" #, python-brace-format @@ -157,7 +165,7 @@ msgid "Changed {fields}." msgstr "" #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "" msgid "No fields changed." @@ -166,12 +174,11 @@ msgstr "ਕੋਈ ਖੇਤਰ ਨਹੀਂ ਬਦਲਿਆ।" msgid "None" msgstr "ਕੋਈ ਨਹੀਂ" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "" msgid "You may edit it again below." @@ -179,28 +186,26 @@ msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "" msgid "" @@ -212,11 +217,11 @@ msgid "No action selected." msgstr "ਕੋਈ ਕਾਰਵਾਈ ਨਹੀਂ ਚੁਣੀ ਗਈ।" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" ਠੀਕ ਤਰ੍ਹਾਂ ਹਟਾਇਆ ਗਿਆ ਹੈ।" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "" #, python-format @@ -229,7 +234,7 @@ msgstr "%s ਬਦਲੋ" #, python-format msgid "View %s" -msgstr "" +msgstr "%s ਵੇਖੋ" msgid "Database error" msgstr "ਡਾਟਾਬੇਸ ਗਲਤੀ" @@ -254,8 +259,9 @@ msgstr "" msgid "Change history: %s" msgstr "ਅਤੀਤ ਬਦਲੋ: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -285,8 +291,8 @@ msgstr "" msgid "Page not found" msgstr "ਸਫ਼ਾ ਨਹੀਂ ਲੱਭਿਆ" -msgid "We're sorry, but the requested page could not be found." -msgstr "ਸਾਨੂੰ ਅਫਸੋਸ ਹੈ, ਪਰ ਅਸੀਂ ਮੰਗਿਆ ਗਿਆ ਸਫ਼ਾ ਨਹੀਂ ਲੱਭ ਸਕੇ।" +msgid "We’re sorry, but the requested page could not be found." +msgstr "" msgid "Home" msgstr "ਘਰ" @@ -301,7 +307,7 @@ msgid "Server Error (500)" msgstr "ਸਰਵਰ ਗਲਤੀ (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" @@ -321,10 +327,23 @@ msgstr "ਸਭ %(total_count)s %(module_name)s ਚੁਣੋ" msgid "Clear selection" msgstr "ਚੋਣ ਸਾਫ਼ ਕਰੋ" +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "ਸ਼ਾਮਲ" + +msgid "View" +msgstr "" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." -msgstr "ਪਹਿਲਾਂ ਆਪਣਾ ਯੂਜ਼ਰ ਨਾਂ ਤੇ ਪਾਸਵਰਡ ਦਿਉ। ਫੇਰ ਤੁਸੀਂ ਹੋਰ ਯੂਜ਼ਰ ਚੋਣਾਂ ਨੂੰ ਸੋਧ ਸਕਦੇ ਹੋ।" +msgstr "" msgid "Enter a username and password." msgstr "" @@ -333,15 +352,17 @@ msgid "Change password" msgstr "ਪਾਸਵਰਡ ਬਦਲੋ" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "ਯੂਜ਼ਰ %(username)s ਲਈ ਨਵਾਂ ਪਾਸਵਰਡ ਦਿਓ।" +msgid "Skip to main content" +msgstr "" + msgid "Welcome," msgstr "ਜੀ ਆਇਆਂ ਨੂੰ, " @@ -354,6 +375,9 @@ msgstr "ਡੌਕੂਮੈਂਟੇਸ਼ਨ" msgid "Log out" msgstr "ਲਾਗ ਆਉਟ" +msgid "Breadcrumbs" +msgstr "" + #, python-format msgid "Add %(name)s" msgstr "%(name)s ਸ਼ਾਮਲ" @@ -367,6 +391,9 @@ msgstr "ਸਾਈਟ ਉੱਤੇ ਜਾਓ" msgid "Filter" msgstr "ਫਿਲਟਰ" +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "" @@ -377,6 +404,15 @@ msgstr "" msgid "Toggle sorting" msgstr "" +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + msgid "Delete" msgstr "ਹਟਾਓ" @@ -402,8 +438,8 @@ msgstr "" msgid "Objects" msgstr "" -msgid "Yes, I'm sure" -msgstr "ਹਾਂ, ਮੈਂ ਚਾਹੁੰਦਾ ਹਾਂ" +msgid "Yes, I’m sure" +msgstr "" msgid "No, take me back" msgstr "" @@ -430,9 +466,6 @@ msgid "" "following objects and their related items will be deleted:" msgstr "" -msgid "View" -msgstr "" - msgid "Delete?" msgstr "ਹਟਾਉਣਾ?" @@ -443,16 +476,6 @@ msgstr " %(filter_title)s ਵਲੋਂ " msgid "Summary" msgstr "" -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "ਸ਼ਾਮਲ" - -msgid "You don't have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "" @@ -466,7 +489,7 @@ msgid "Unknown content" msgstr "ਅਣਜਾਣ ਸਮੱਗਰੀ" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -480,6 +503,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "" +msgid "Toggle navigation" +msgstr "" + +msgid "Sidebar" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "ਮਿਤੀ/ਸਮਾਂ" @@ -489,8 +524,13 @@ msgstr "ਯੂਜ਼ਰ" msgid "Action" msgstr "ਕਾਰਵਾਈ" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" @@ -500,23 +540,7 @@ msgstr "ਸਭ ਵੇਖੋ" msgid "Save" msgstr "ਸੰਭਾਲੋ" -msgid "Popup closing..." -msgstr "" - -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "View selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" +msgid "Popup closing…" msgstr "" msgid "Search" @@ -547,8 +571,24 @@ msgstr "" msgid "Close" msgstr "" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "ਅੱਜ ਵੈੱਬਸਾਈਟ ਨੂੰ ਕੁਝ ਚੰਗਾ ਸਮਾਂ ਦੇਣ ਲਈ ਧੰਨਵਾਦ ਹੈ।" +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "ਫੇਰ ਲਾਗਇਨ ਕਰੋ" @@ -560,11 +600,9 @@ msgid "Your password was changed." msgstr "ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਬਦਲਿਆ ਗਿਆ ਹੈ।" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"ਸੁਰੱਖਿਆ ਲਈ ਪਹਿਲਾਂ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਦਿਉ, ਅਤੇ ਫੇਰ ਆਪਣਾ ਨਵਾਂ ਪਾਸਵਰਡ ਦੋ ਵਰਾ ਦਿਉ ਤਾਂ ਕਿ " -"ਅਸੀਂ ਜਾਂਚ ਸਕੀਏ ਕਿ ਤੁਸੀਂ ਇਹ ਠੀਕ ਤਰ੍ਹਾਂ ਲਿਖਿਆ ਹੈ।" msgid "Change my password" msgstr "ਮੇਰਾ ਪਾਸਵਰਡ ਬਦਲੋ" @@ -598,12 +636,12 @@ msgstr "" "ਸੈੱਟ ਲਈ ਬੇਨਤੀ ਭੇਜੋ ਜੀ।" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" @@ -616,8 +654,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "ਅੱਗੇ ਦਿੱਤੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਉ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਚੁਣੋ:" -msgid "Your username, in case you've forgotten:" -msgstr "ਤੁਹਾਡਾ ਯੂਜ਼ਰ ਨਾਂ, ਜੇ ਕਿਤੇ ਗਲਤੀ ਨਾਲ ਭੁੱਲ ਗਏ ਹੋਵੋ:" +msgid "Your username, in case you’ve forgotten:" +msgstr "" msgid "Thanks for using our site!" msgstr "ਸਾਡੀ ਸਾਈਟ ਵਰਤਣ ਲਈ ਧੰਨਵਾਦ ਜੀ!" @@ -627,7 +665,7 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s ਟੀਮ" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" diff --git a/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo index 57cc79f362f4..08925e49507b 100644 Binary files a/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po index 2a3604630e6c..ed55c46ea4cf 100644 --- a/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/pa/LC_MESSAGES/djangojs.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-01-15 11:28+0000\n" +"Last-Translator: Transifex Bot <>\n" "Language-Team: Panjabi (Punjabi) (http://www.transifex.com/django/django/" "language/pa/)\n" "MIME-Version: 1.0\n" @@ -75,14 +75,14 @@ msgid "" msgstr "" msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" @@ -170,6 +170,54 @@ msgstr "" msgid "December" msgstr "" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "" + msgctxt "one letter Sunday" msgid "S" msgstr "" diff --git a/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo b/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo index 218951228da3..4507529f5a41 100644 Binary files a/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/pl/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/pl/LC_MESSAGES/django.po b/django/contrib/admin/locale/pl/LC_MESSAGES/django.po index 7ed8d67a700a..bb14e7d758ad 100644 --- a/django/contrib/admin/locale/pl/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/pl/LC_MESSAGES/django.po @@ -6,10 +6,12 @@ # Jannis Leidel , 2011 # Janusz Harkot , 2014-2015 # Karol , 2012 -# konryd , 2011 -# konryd , 2011 -# m_aciek , 2016-2019 -# m_aciek , 2015 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# Maciej Olko , 2016-2022 +# Maciej Olko , 2023 +# Maciej Olko , 2015 +# Mariusz Felisiak , 2020,2022-2024 # Ola Sitarska , 2013 # Ola Sitarska , 2013 # Roman Barczyński, 2014 @@ -18,17 +20,22 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-11 14:07+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Mariusz Felisiak , " +"2020,2022-2024\n" +"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " +"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " +"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Usuń wybrane(-nych) %(verbose_name_plural)s" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -41,10 +48,6 @@ msgstr "Nie można usunąć %(name)s" msgid "Are you sure?" msgstr "Jesteś pewien?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Usuń wybranych %(verbose_name_plural)s" - msgid "Administration" msgstr "Administracja" @@ -81,6 +84,12 @@ msgstr "Brak daty" msgid "Has date" msgstr "Posiada datę" +msgid "Empty" +msgstr "Puste" + +msgid "Not empty" +msgstr "Niepuste" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -94,7 +103,7 @@ msgstr "Akcja:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "Dodaj kolejne %(verbose_name)s" +msgstr "Dodaj kolejne(go)(-ną)(-ny) %(verbose_name)s" msgid "Remove" msgstr "Usuń" @@ -185,9 +194,12 @@ msgstr "" "Przytrzymaj wciśnięty klawisz „Ctrl” lub „Command” na Macu, aby zaznaczyć " "więcej niż jeden wybór." +msgid "Select this object for an action - {}" +msgstr "Wybierz ten obiekt do wykonania akcji - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." -msgstr "{name} „{obj}” został dodany pomyślnie." +msgstr "{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie." msgid "You may edit it again below." msgstr "Poniżej możesz ponownie edytować." @@ -196,31 +208,27 @@ msgstr "Poniżej możesz ponownie edytować." msgid "" "The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"{name} „{obj}” został dodany pomyślnie. Można dodać kolejny {name} poniżej." +"{name} „{obj}” został(a)(-ło) dodany(-na)(-ne) pomyślnie. Można dodać " +"kolejne(go)(-ną)(-ny) {name} poniżej." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"{name} „{obj}” został pomyślnie zmieniony. Można edytować go ponownie " -"poniżej." - -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} „{obj}” został dodany pomyślnie. Można edytować go ponownie poniżej." +"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można edytować " +"go/ją/je ponownie poniżej." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"{name} „{obj}” został pomyślnie zmieniony. Można dodać kolejny {name} " -"poniżej." +"{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne). Można dodać " +"kolejny(-nego)(-ną)(-ne) {name} poniżej." #, python-brace-format msgid "The {name} “{obj}” was changed successfully." -msgstr "{name} „{obj}” został pomyślnie zmieniony." +msgstr "{name} „{obj}” został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -233,11 +241,12 @@ msgstr "Nie wybrano akcji." #, python-format msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "%(name)s „%(obj)s” usunięty pomyślnie." +msgstr "%(name)s „%(obj)s” usunięty(-ta)(-te) pomyślnie." #, python-format msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "%(name)s z ID „%(key)s” nie istnieje. Może został usunięty?" +msgstr "" +"%(name)s z ID „%(key)s” nie istnieje. Może został(a)(-ło) usunięty(-ta)(-te)?" #, python-format msgid "Add %s" @@ -249,7 +258,7 @@ msgstr "Zmień %s" #, python-format msgid "View %s" -msgstr "Obejrzyj %s" +msgstr "Zobacz %s" msgid "Database error" msgstr "Błąd bazy danych" @@ -257,10 +266,10 @@ msgstr "Błąd bazy danych" #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "%(count)s %(name)s został pomyślnie zmieniony." -msgstr[1] "%(count)s %(name)s zostały pomyślnie zmienione." +msgstr[0] "%(count)s %(name)s został(a)(-ło) pomyślnie zmieniony(-na)(-ne)." +msgstr[1] "%(count)s %(name)s zostały(-ło) pomyślnie zmienione(-nych)." msgstr[2] "%(count)s %(name)s zostało pomyślnie zmienionych." -msgstr[3] "%(count)s %(name)s zostało pomyślnie zmienionych." +msgstr[3] "%(count)s %(name)s zostało pomyślnie zmienione." #, python-format msgid "%(total_count)s selected" @@ -278,8 +287,9 @@ msgstr "Wybrano 0 z %(cnt)s" msgid "Change history: %s" msgstr "Historia zmian: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -289,7 +299,7 @@ msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" -"Usunięcie %(class_name)s %(instance)s może wiązać się z usunięciem " +"Usunięcie %(class_name)s %(instance)s może wiązać się z usunięciem " "następujących chronionych obiektów pokrewnych: %(related_objects)s" msgid "Django site admin" @@ -344,11 +354,27 @@ msgstr "Kliknij by wybrać obiekty na wszystkich stronach" #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "Wybierz wszystkie %(total_count)s %(module_name)s" +msgstr "Wybierz wszystkie(-kich) %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Wyczyść wybór" +msgid "Breadcrumbs" +msgstr "Breadcrumbs" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele w aplikacji %(name)s" + +msgid "Add" +msgstr "Dodaj" + +msgid "View" +msgstr "Zobacz" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nie masz uprawnień do oglądania ani edycji niczego." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -360,18 +386,38 @@ msgid "Enter a username and password." msgstr "Podaj nazwę użytkownika i hasło." msgid "Change password" -msgstr "Zmiana hasła" +msgstr "Zmień hasło" -msgid "Please correct the error below." -msgstr "Prosimy poprawić poniższy błąd." +msgid "Set password" +msgstr "Ustaw hasło" -msgid "Please correct the errors below." -msgstr "Proszę, popraw poniższe błędy." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Prosimy poprawić poniższy błąd." +msgstr[1] "Prosimy poprawić poniższe błędy." +msgstr[2] "Prosimy poprawić poniższe błędy." +msgstr[3] "Prosimy poprawić poniższe błędy." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Podaj nowe hasło dla użytkownika %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"To działanie włączy uwierzytelnianie oparte na haśle dla " +"tego użytkownika. " + +msgid "Disable password-based authentication" +msgstr "Wyłącz uwierzytelnianie oparte na haśle" + +msgid "Enable password-based authentication" +msgstr "Włącz uwierzytelnianie oparte na haśle" + +msgid "Skip to main content" +msgstr "Przejdź do głównej treści" + msgid "Welcome," msgstr "Witaj," @@ -397,6 +443,15 @@ msgstr "Pokaż na stronie" msgid "Filter" msgstr "Filtruj" +msgid "Hide counts" +msgstr "Ukryj ilości" + +msgid "Show counts" +msgstr "Pokaż ilości" + +msgid "Clear all filters" +msgstr "Wyczyść wszystkie filtry" + msgid "Remove from sorting" msgstr "Usuń z sortowania" @@ -407,6 +462,15 @@ msgstr "Priorytet sortowania: %(priority_number)s " msgid "Toggle sorting" msgstr "Przełącz sortowanie" +msgid "Toggle theme (current theme: auto)" +msgstr "Przełącz motyw (bieżący motyw: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Przełącz motyw (bieżący motyw: jasny)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Przełącz motyw (bieżący motyw: ciemny)" + msgid "Delete" msgstr "Usuń" @@ -416,8 +480,8 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Usunięcie %(object_name)s '%(escaped_object)s' może wiązać się z usunięciem " -"obiektów z nim powiązanych, ale niestety nie posiadasz uprawnień do " +"Usunięcie %(object_name)s „%(escaped_object)s” wiązałoby się z usunięciem " +"obiektów z nim/nią powiązanych, ale niestety nie posiadasz uprawnień do " "usunięcia obiektów następujących typów:" #, python-format @@ -425,8 +489,8 @@ msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -"Usunięcie %(object_name)s '%(escaped_object)s' może wymagać skasowania " -"następujących chronionych obiektów, które są z nim powiązane:" +"Usunięcie %(object_name)s „%(escaped_object)s” wymagałoby skasowania " +"następujących chronionych obiektów, które są z nim/nią powiązane:" #, python-format msgid "" @@ -454,28 +518,25 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Usunięcie %(objects_name)s spowoduje skasowanie obiektów, które są z nim " -"powiązane. Niestety nie posiadasz uprawnień do usunięcia następujących typów " -"obiektów:" +"Usunięcie wybranych(-nego)(-nej) %(objects_name)s spowoduje skasowanie " +"obiektów, które są z nim(i)/nią powiązane. Niestety nie posiadasz uprawnień " +"do usunięcia następujących typów obiektów:" #, python-format msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" -"Usunięcie %(objects_name)s wymaga skasowania następujących chronionych " -"obiektów, które są z nim powiązane:" +"Usunięcie wybranych(-nego)(-nej) %(objects_name)s wymaga skasowania " +"następujących chronionych obiektów, które są z nim(i)/nią powiązane:" #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"Czy chcesz skasować zaznaczone %(objects_name)s? Następujące obiekty oraz " -"obiekty od nich zależne zostaną skasowane:" - -msgid "View" -msgstr "Obejrzyj" +"Czy chcesz skasować zaznaczone(go)(-ną)(-ny)(-nych) %(objects_name)s? " +"Następujące obiekty oraz obiekty od nich zależne zostaną skasowane:" msgid "Delete?" msgstr "Usunąć?" @@ -487,16 +548,6 @@ msgstr " Według pola %(filter_title)s " msgid "Summary" msgstr "Podsumowanie" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele w aplikacji %(name)s" - -msgid "Add" -msgstr "Dodaj" - -msgid "You don’t have permission to view or edit anything." -msgstr "Nie masz uprawnień do oglądania ani edycji niczego." - msgid "Recent actions" msgstr "Ostatnie działania" @@ -506,6 +557,15 @@ msgstr "Moje działania" msgid "None available" msgstr "Brak dostępnych" +msgid "Added:" +msgstr "Dodano:" + +msgid "Changed:" +msgstr "Zmieniono:" + +msgid "Deleted:" +msgstr "Usunięto:" + msgid "Unknown content" msgstr "Zawartość nieznana" @@ -529,6 +589,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Nie pamiętasz swojego hasła lub nazwy użytkownika?" +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Sidebar" +msgstr "Pasek boczny" + +msgid "Start typing to filter…" +msgstr "Zacznij pisać, aby odfiltrować…" + +msgid "Filter navigation items" +msgstr "Filtruj elementy nawigacji" + msgid "Date/time" msgstr "Data/czas" @@ -538,6 +610,13 @@ msgstr "Użytkownik" msgid "Action" msgstr "Akcja" +msgid "entry" +msgid_plural "entries" +msgstr[0] "wpis" +msgstr[1] "wpisy" +msgstr[2] "wpisów" +msgstr[3] "wpisu" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -586,18 +665,22 @@ msgstr "Zamknij" #, python-format msgid "Change selected %(model)s" -msgstr "Zmień wybrane %(model)s" +msgstr "Zmień wybraną(-ne)(-nego)(-ny) %(model)s" #, python-format msgid "Add another %(model)s" -msgstr "Dodaj kolejny %(model)s" +msgstr "Dodaj kolejne(go)(-ną)(-ny) %(model)s" #, python-format msgid "Delete selected %(model)s" -msgstr "Usuń wybrane %(model)s" +msgstr "Usuń wybraną(-ne)(-nego)(-ny) %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "Obejrzyj wybraną(-ne)(-nego)(-ny) %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Dziękujemy za spędzenie cennego czasu na stronie." +msgid "Thanks for spending some quality time with the web site today." +msgstr "Dzięki za spędzenie cennego czasu ze stroną." msgid "Log in again" msgstr "Zaloguj się ponownie" @@ -669,7 +752,7 @@ msgid "" "user account at %(site_name)s." msgstr "" "Otrzymujesz tę wiadomość, gdyż skorzystano z opcji resetu hasła dla Twojego " -"konta na stronie %(site_name)s." +"konta na stronie %(site_name)s." msgid "Please go to the following page and choose a new password:" msgstr "" @@ -680,7 +763,7 @@ msgid "Your username, in case you’ve forgotten:" msgstr "Twoja nazwa użytkownika, na wypadek, gdybyś zapomniał(a):" msgid "Thanks for using our site!" -msgstr "Dziękujemy za korzystanie naszej strony." +msgstr "Dzięki za korzystanie z naszej strony!" #, python-format msgid "The %(site_name)s team" @@ -694,11 +777,14 @@ msgstr "" "wyślemy ci instrukcję opisującą sposób ustawienia nowego hasła." msgid "Email address:" -msgstr "Adres email:" +msgstr "Adres e-mail:" msgid "Reset my password" msgstr "Zresetuj moje hasło" +msgid "Select all objects on this page for an action" +msgstr "Wybierz wszystkie obiekty na tej stronie do wykonania akcji" + msgid "All dates" msgstr "Wszystkie daty" diff --git a/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo index a7f3ad9f06f7..7eb9375adac0 100644 Binary files a/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po index 9125a94ed4fc..7b9641caf6be 100644 --- a/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/pl/LC_MESSAGES/djangojs.po @@ -2,27 +2,30 @@ # # Translators: # angularcircle, 2011 +# Darek, 2022 # Jannis Leidel , 2011 # Janusz Harkot , 2014-2015 -# konryd , 2011 -# m_aciek , 2016,2018 +# 0d5641585fd67fbdb97037c19ab83e4c_18c98b0 , 2011 +# Maciej Olko , 2016,2018,2020 +# Maciej Olko , 2023 +# Mariusz Felisiak , 2021,2023 # Roman Barczyński, 2012 # Tomasz Kajtoch , 2016-2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-12-21 22:38+0000\n" -"Last-Translator: m_aciek \n" -"Language-Team: Polish (http://www.transifex.com/django/django/language/pl/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Mariusz Felisiak , 2021,2023\n" +"Language-Team: Polish (http://app.transifex.com/django/django/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" -"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" -"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " +"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " +"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #, javascript-format msgid "Available %s" @@ -68,6 +71,10 @@ msgstr "" "To lista wybranych %s. Aby usunąć, zaznacz pozycje wybrane do usunięcia i " "kliknij strzałkę „Usuń” pomiędzy listami." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Wpisz coś tutaj, aby wyfiltrować listę wybranych %s." + msgid "Remove all" msgstr "Usuń wszystkie" @@ -75,6 +82,14 @@ msgstr "Usuń wszystkie" msgid "Click to remove all chosen %s at once." msgstr "Kliknij, aby usunąć jednocześnie wszystkie wybrane %s." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s wybrana opcja jest ukryta" +msgstr[1] "%s wybrane opcje są ukryte" +msgstr[2] "%s wybranych opcji jest ukrytych" +msgstr[3] "%s wybranych opcji jest ukrytych" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "Wybrano %(sel)s z %(cnt)s" @@ -90,16 +105,16 @@ msgstr "" "te zostaną utracone." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Wybrano akcję, lecz część zmian w polach nie została zachowana. Kliknij OK, " "aby zapisać. Aby wykonać akcję, należy ją ponownie uruchomić." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Wybrano akcję, lecz nie dokonano żadnych zmian w polach. Prawdopodobnie " @@ -209,6 +224,103 @@ msgstr "Listopad" msgid "December" msgstr "Grudzień" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Sty" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Lut" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Kwi" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Cze" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Lip" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Sie" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Wrz" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Paź" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Lis" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Gru" + +msgid "Sunday" +msgstr "Niedziela" + +msgid "Monday" +msgstr "Poniedziałek" + +msgid "Tuesday" +msgstr "Wtorek" + +msgid "Wednesday" +msgstr "Środa" + +msgid "Thursday" +msgstr "Czwartek" + +msgid "Friday" +msgstr "Piątek" + +msgid "Saturday" +msgstr "Sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Nd" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pon" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Wt" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Śr" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Czw" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pt" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "So" + msgctxt "one letter Sunday" msgid "S" msgstr "N" diff --git a/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo b/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo index d7ec87d28b83..cf5303ac3b4f 100644 Binary files a/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/pt/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/pt/LC_MESSAGES/django.po b/django/contrib/admin/locale/pt/LC_MESSAGES/django.po index 2d39cdb30459..3451a0e888eb 100644 --- a/django/contrib/admin/locale/pt/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/pt/LC_MESSAGES/django.po @@ -1,21 +1,23 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Henrique Azevedo , 2018 +# emansije , 2023 +# Henrique Azevedo , 2018,2023 # Jannis Leidel , 2011 # jorgecarleitao , 2015 -# Nuno Mariz , 2013,2015,2017-2018 -# Paulo Köch , 2011 +# Nuno Mariz , 2013,2015,2017-2018,2023 +# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 # Raúl Pedro Fernandes Santos, 2014 # Rui Dinis Silva, 2017 +# Sofia Matias, 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" -"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: emansije , 2023\n" +"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" "pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,6 +25,10 @@ msgstr "" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Remover %(verbose_name_plural)s selecionados" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Foram removidos com sucesso %(count)d %(items)s." @@ -34,10 +40,6 @@ msgstr "Não é possível remover %(name)s " msgid "Are you sure?" msgstr "Tem a certeza?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - msgid "Administration" msgstr "Administração" @@ -74,6 +76,12 @@ msgstr "Sem data" msgid "Has date" msgstr "Tem data" +msgid "Empty" +msgstr "Vazio" + +msgid "Not empty" +msgstr "Não está vazio" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -131,23 +139,23 @@ msgid "log entries" msgstr "entradas de log" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Adicionado \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Adicionado \"%(object)s\"" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Foram modificados \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Modificado \"%(object)s\" — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Foram removidos \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Removido \"%(object)s.\"" msgid "LogEntry Object" msgstr "Objeto LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Foi adicionado {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Adicionado {name} \"{object}\"" msgid "Added." msgstr "Adicionado." @@ -156,16 +164,16 @@ msgid "and" msgstr "e" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Foram modificados os {fields} para {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Alterado {fields} para {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "Foi modificado {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Foi removido {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Removido {name} \"{object}\"" msgid "No fields changed." msgstr "Nenhum campo foi modificado." @@ -173,52 +181,50 @@ msgstr "Nenhum campo foi modificado." msgid "None" msgstr "Nenhum" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Mantenha pressionado o \"Control\", ou \"Command\" no Mac, para selecionar " -"mais do que um." +"Mantenha premida a tecla “Control”, ou “Command” no Mac, para selecionar " +"mais do que uma." + +msgid "Select this object for an action - {}" +msgstr "Selecionar este objecto para uma ação - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "O {name} \"{obj}\" foi adicionado com sucesso." +msgid "The {name} “{obj}” was added successfully." +msgstr "O {name} “{obj}” foi adicionado com sucesso." msgid "You may edit it again below." msgstr "Pode editar novamente abaixo." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"O {name} \"{obj}\" foi adicionado com sucesso. Pode adicionar um novo {name} " +"O {name} “{obj}” foi adicionado com sucesso. Pode adicionar outro {name} " "abaixo." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"O {name} \"{obj}\" foi modificado com sucesso. Pode voltar a editar " -"novamente abaixo." +"O {name} “{obj}” foi adicionado com sucesso. Pode editar novamente abaixo." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"O {name} \"{obj}\" foi adicionado com sucesso. Pode voltar a editar " -"novamente abaixo." +"O {name} “{obj}” foi adicionado com sucesso. Pode editar novamente abaixo. " #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"O {name} \"{obj}\" foi modificado com sucesso. Pode adicionar um novo {name} " +"O {name} “{obj}” foi alterado com sucesso. Pode adicionar outro {name} " "abaixo." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "O {name} \"{obj}\" foi modificado com sucesso." +msgid "The {name} “{obj}” was changed successfully." +msgstr "O {name} “{obj}” foi alterado com sucesso." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -231,12 +237,12 @@ msgid "No action selected." msgstr "Nenhuma ação selecionada." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "O(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "O %(name)s “%(obj)s” foi apagado com sucesso." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s com ID \"%(key)s\" não existe. Talvez foi removido?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s com o ID “%(key)s” não existe. Talvez tenha sido apagado?" #, python-format msgid "Add %s" @@ -258,12 +264,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s foi modificado com sucesso." msgstr[1] "%(count)s %(name)s foram modificados com sucesso." +msgstr[2] "%(count)s %(name)s foram modificados com sucesso." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s selecionado" msgstr[1] "Todos %(total_count)s selecionados" +msgstr[2] "Todos %(total_count)s selecionados" #, python-format msgid "0 of %(cnt)s selected" @@ -273,8 +281,9 @@ msgstr "0 de %(cnt)s selecionados" msgid "Change history: %s" msgstr "Histórico de modificações: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -306,8 +315,8 @@ msgstr "Administração de %(app)s" msgid "Page not found" msgstr "Página não encontrada" -msgid "We're sorry, but the requested page could not be found." -msgstr "Pedimos desculpa, mas a página solicitada não foi encontrada." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Pedimos desculpa mas a página solicitada não foi encontrada. " msgid "Home" msgstr "Início" @@ -322,11 +331,11 @@ msgid "Server Error (500)" msgstr "Erro do servidor (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Ocorreu um erro. Foi enviada uma notificação para os administradores do " -"site, devendo o mesmo ser corrigido em breve. Obrigado pela atenção." +"Ocorreu um erro. Foi comunicado por email aos administradores da página e " +"deverá ser corrigido em breve. Obrigado pela sua compreensão. " msgid "Run the selected action" msgstr "Executar a acção selecionada" @@ -344,12 +353,28 @@ msgstr "Selecionar todos %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Remover seleção" +msgid "Breadcrumbs" +msgstr "Marcas de navegação" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos na aplicação %(name)s" + +msgid "Add" +msgstr "Adicionar" + +msgid "View" +msgstr "View" + +msgid "You don’t have permission to view or edit anything." +msgstr "Não tem permissões para visualizar ou editar nada. " + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá " -"editar mais opções do utilizador." +"Primeiro, introduza o nome de utilizador e senha. Depois, poderá editar " +"mais opções de utilizador. " msgid "Enter a username and password." msgstr "Introduza o utilizador e palavra-passe." @@ -358,10 +383,10 @@ msgid "Change password" msgstr "Modificar palavra-passe" msgid "Please correct the error below." -msgstr "Por favor corrija o erro abaixo." - -msgid "Please correct the errors below." -msgstr "Por favor corrija os erros abaixo." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor, corrija o erro abaixo" +msgstr[1] "Por favor, corrija os erros abaixo." +msgstr[2] "Por favor, corrija os erros abaixo." #, python-format msgid "Enter a new password for the user %(username)s." @@ -369,6 +394,9 @@ msgstr "" "Introduza uma nova palavra-passe para o utilizador %(username)s." +msgid "Skip to main content" +msgstr "Ir para o conteúdo principal" + msgid "Welcome," msgstr "Bem-vindo," @@ -394,6 +422,15 @@ msgstr "Ver no site" msgid "Filter" msgstr "Filtro" +msgid "Hide counts" +msgstr "Ocultar contagem" + +msgid "Show counts" +msgstr "Mostrar contagem" + +msgid "Clear all filters" +msgstr "Limpar todos os filtros" + msgid "Remove from sorting" msgstr "Remover da ordenação" @@ -404,6 +441,15 @@ msgstr "Prioridade de ordenação: %(priority_number)s" msgid "Toggle sorting" msgstr "Altenar ordenação" +msgid "Toggle theme (current theme: auto)" +msgstr "Mudar tema (tema corrente: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Mudar tema (tema corrente: claro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Mudar tema (tema corrente: escuro)" + msgid "Delete" msgstr "Remover" @@ -436,7 +482,7 @@ msgstr "" msgid "Objects" msgstr "Objectos" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Sim, tenho a certeza" msgid "No, take me back" @@ -471,9 +517,6 @@ msgstr "" "Tem certeza de que deseja remover %(objects_name)s selecionado? Todos os " "objetos seguintes e seus itens relacionados serão removidos:" -msgid "View" -msgstr "View" - msgid "Delete?" msgstr "Remover?" @@ -484,16 +527,6 @@ msgstr " Por %(filter_title)s " msgid "Summary" msgstr "Sumário" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Add" -msgstr "Adicionar" - -msgid "You don't have permission to view or edit anything." -msgstr "Não tem permissão para ver ou editar nada." - msgid "Recent actions" msgstr "Ações recentes" @@ -503,17 +536,26 @@ msgstr "As minhas ações" msgid "None available" msgstr "Nenhum disponível" +msgid "Added:" +msgstr "Adicionado:" + +msgid "Changed:" +msgstr "Alterado:" + +msgid "Deleted:" +msgstr "Apagado:" + msgid "Unknown content" msgstr "Conteúdo desconhecido" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Passa-se algo de errado com a instalação da sua base de dados. Verifique se " -"as tabelas da base de dados foram criadas apropriadamente e verifique se a " -"base de dados pode ser lida pelo utilizador definido." +"Há algo de errado com a instalação da base de dados. Certifique-se de que as " +"tabelas adequadas da base de dados foram criadas e de que a base de dados " +"pode ser lida pelo utilizador adequado." #, python-format msgid "" @@ -526,6 +568,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Esqueceu-se da sua palavra-passe ou utilizador?" +msgid "Toggle navigation" +msgstr "Alternar navegação" + +msgid "Sidebar" +msgstr "Barra lateral" + +msgid "Start typing to filter…" +msgstr "Começe a digitar para filtrar…" + +msgid "Filter navigation items" +msgstr "Filtrar itens de navegação" + msgid "Date/time" msgstr "Data/hora" @@ -535,12 +589,18 @@ msgstr "Utilizador" msgid "Action" msgstr "Ação" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrada" +msgstr[1] "entradas" +msgstr[2] "entradas" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Este objeto não tem histórico de modificações. Provavelmente não foi " -"modificado via site de administração." +"Este objeto não tem um histórico de alterações. Provavelmente não foi " +"adicionado através da página de administração." msgid "Show all" msgstr "Mostrar todos" @@ -549,7 +609,7 @@ msgid "Save" msgstr "Gravar" msgid "Popup closing…" -msgstr "" +msgstr "Encerramento de popup…" msgid "Search" msgstr "Pesquisar" @@ -559,6 +619,7 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s resultado" msgstr[1] "%(counter)s resultados" +msgstr[2] "%(counter)s resultados" #, python-format msgid "%(full_result_count)s total" @@ -591,8 +652,12 @@ msgstr "Adicionar outro %(model)s" msgid "Delete selected %(model)s" msgstr "Remover %(model)s seleccionado" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Obrigado pela sua visita." +#, python-format +msgid "View selected %(model)s" +msgstr "Vista selecionada %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Obrigado por passar algum tempo de qualidade com a página Web hoje." msgid "Log in again" msgstr "Entrar novamente" @@ -604,12 +669,12 @@ msgid "Your password was changed." msgstr "A sua palavra-passe foi modificada." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Por razões de segurança, por favor introduza a sua palavra-passe antiga e " -"depois introduza a nova duas vezes para que possamos verificar se introduziu " -"corretamente." +"Por razões de segurança, introduza a sua palavra-passe antiga e, em seguida, " +"introduza a sua nova palavra-passe duas vezes para podermos verificar se a " +"digitou corretamente." msgid "Change my password" msgstr "Modificar a minha palavra-passe" @@ -645,20 +710,18 @@ msgstr "" "passe." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Foram enviadas para o email indicado as instruções de configuração da " -"palavra-passe, se existir uma conta com o email que indicou. Deverá recebê-" -"las brevemente." +"Enviámos-lhe um e-mail com instruções para definir a sua palavra-passe, caso " +"exista uma conta com o e-mail que introduziu. Deverá recebê-las em breve." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Se não receber um email, por favor assegure-se de que introduziu o endereço " -"com o qual se registou e verifique a sua pasta de correio electrónico não " -"solicitado." +"Se não receber uma mensagem de correio eletrónico, certifique-se de que " +"introduziu o endereço com que se registou e verifique a sua pasta de spam." #, python-format msgid "" @@ -671,8 +734,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Por favor siga a seguinte página e escolha a sua nova palavra-passe:" -msgid "Your username, in case you've forgotten:" -msgstr "O seu nome de utilizador, no caso de se ter esquecido:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Seu nome de utilizador, caso se tenha esquecido:" msgid "Thanks for using our site!" msgstr "Obrigado pela sua visita ao nosso site!" @@ -682,11 +745,12 @@ msgid "The %(site_name)s team" msgstr "A equipa do %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Esqueceu-se da sua palavra-chave? Introduza o seu endereço de email e enviar-" -"lhe-emos instruções para definir uma nova." +"Esqueceu-se da sua palavra-passe? Introduza o seu endereço de correio " +"eletrónico abaixo e enviar-lhe-emos instruções para definir uma nova palavra-" +"passe." msgid "Email address:" msgstr "Endereço de email:" @@ -694,6 +758,9 @@ msgstr "Endereço de email:" msgid "Reset my password" msgstr "Reinicializar a minha palavra-passe" +msgid "Select all objects on this page for an action" +msgstr "Marque todos os itens nesta página para executar uma operação" + msgid "All dates" msgstr "Todas as datas" diff --git a/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo index bc7ae616897a..3473883d4bd4 100644 Binary files a/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po index 17379945a2fc..7b37cadadad3 100644 --- a/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/pt/LC_MESSAGES/djangojs.po @@ -2,17 +2,17 @@ # # Translators: # Jannis Leidel , 2011 -# Nuno Mariz , 2011-2012,2015,2017 -# Paulo Köch , 2011 +# Nuno Mariz , 2011-2012,2015,2017,2023 +# 12574c6d66324e145c1d19e02acecb73_84badd8 <4e8d94859927eab3b50486d21249c068_5346>, 2011 # Raúl Pedro Fernandes Santos, 2014 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-11-30 23:49+0000\n" -"Last-Translator: Nuno Mariz \n" -"Language-Team: Portuguese (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Nuno Mariz , 2011-2012,2015,2017,2023\n" +"Language-Team: Portuguese (http://app.transifex.com/django/django/language/" "pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -64,6 +64,10 @@ msgstr "" "Esta é a lista de %s escolhidos. Poderá remover alguns, selecionando-os na " "caixa abaixo e clicando na seta \"Remover\" entre as duas caixas." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" + msgid "Remove all" msgstr "Remover todos" @@ -71,10 +75,18 @@ msgstr "Remover todos" msgid "Click to remove all chosen %s at once." msgstr "Clique para remover todos os %s escolhidos de uma vez." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s selecionado" msgstr[1] "%(sel)s de %(cnt)s selecionados" +msgstr[2] "%(sel)s de %(cnt)s selecionados" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -84,20 +96,31 @@ msgstr "" "mudanças por guardar serão perdidas." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Selecionou uma ação mas ainda não guardou as mudanças dos campos " -"individuais. Carregue em OK para gravar. Precisará de correr de novo a ação." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Selecionou uma ação mas ainda não guardou as mudanças dos campos " -"individuais. Provavelmente quererá o botão Ir ao invés do botão Guardar." + +msgid "Now" +msgstr "Agora" + +msgid "Midnight" +msgstr "Meia-noite" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "Meio-dia" + +msgid "6 p.m." +msgstr "6 p.m." #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -106,6 +129,8 @@ msgstr[0] "" "Nota: O seu fuso horário está %s hora adiantado em relação ao servidor." msgstr[1] "" "Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." +msgstr[2] "" +"Nota: O seu fuso horário está %s horas adiantado em relação ao servidor." #, javascript-format msgid "Note: You are %s hour behind server time." @@ -114,9 +139,8 @@ msgstr[0] "" "Nota: O use fuso horário está %s hora atrasado em relação ao servidor." msgstr[1] "" "Nota: O use fuso horário está %s horas atrasado em relação ao servidor." - -msgid "Now" -msgstr "Agora" +msgstr[2] "" +"Nota: O use fuso horário está %s horas atrasado em relação ao servidor." msgid "Choose a Time" msgstr "Escolha a Hora" @@ -124,18 +148,6 @@ msgstr "Escolha a Hora" msgid "Choose a time" msgstr "Escolha a hora" -msgid "Midnight" -msgstr "Meia-noite" - -msgid "6 a.m." -msgstr "6 a.m." - -msgid "Noon" -msgstr "Meio-dia" - -msgid "6 p.m." -msgstr "6 p.m." - msgid "Cancel" msgstr "Cancelar" @@ -187,6 +199,103 @@ msgstr "Novembro" msgid "December" msgstr "Dezembro" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Fev" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Set" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Out" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dez" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Monday" +msgstr "Segunda-feira" + +msgid "Tuesday" +msgstr "Terça-feira" + +msgid "Wednesday" +msgstr "Quarta-feira" + +msgid "Thursday" +msgstr "Quinta-feira" + +msgid "Friday" +msgstr "Sexta-feira" + +msgid "Saturday" +msgstr "Sábado" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Dom" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Seg" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Ter" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Qua" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Qui" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Sex" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sáb" + msgctxt "one letter Sunday" msgid "S" msgstr "D" diff --git a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo index 730ab99f7f65..1a2a3b986c2c 100644 Binary files a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po index 2e40b70f38ab..8318b3779a75 100644 --- a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/django.po @@ -4,37 +4,43 @@ # Allisson Azevedo , 2014 # Bruce de Sá , 2019 # bruno.devpod , 2014 -# Carlos C. Leite , 2019 -# Carlos C. Leite , 2019 -# Filipe Cifali Stangler , 2016 +# Carlos Cadu “Cadu” Leite , 2019 +# Carlos Cadu “Cadu” Leite , 2019 +# Filipe Cifali , 2016 # dudanogueira , 2012 +# Eduardo Felipe Castegnaro , 2024 # Elyézer Rezende , 2013 # Fábio C. Barrionuevo da Luz , 2015 # Fabio Cerqueira , 2019 -# Xico Petry , 2016 +# Francisco Petry Rauber , 2016 +# Gabriel da Mota , 2023 # Gladson , 2013 # Guilherme Ferreira , 2017 -# semente, 2012-2013 +# fa9e10542e458baef0599ae856e43651_13d2225, 2012-2013 # Jannis Leidel , 2011 # João Paulo Andrade , 2018 +# Jonas Rodrigues, 2023 # Lucas Infante , 2015 # Luiz Boaretto , 2017 +# Marssal Jr. , 2022 # Marcelo Moro Brondani , 2018 # Marco Rougeth , 2015 # Otávio Reis , 2018 # Raysa Dutra, 2016 # R.J Lelis , 2019 +# Samuel Nogueira Bacelar , 2020 # Sergio Garcia , 2015 +# Tomaz Marcelino Cunha Neto , 2022 # Vinícius Damaceno , 2019 # Vinícius Muniz de Melo , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-12-19 17:58+0000\n" -"Last-Translator: Vinícius Muniz de Melo \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" +"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" "language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,21 +48,21 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Remover %(verbose_name_plural)s selecionados" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Removido %(count)d %(items)s com sucesso." #, python-format msgid "Cannot delete %(name)s" -msgstr "Não é possível excluir %(name)s " +msgstr "Não é possível remover %(name)s " msgid "Are you sure?" msgstr "Tem certeza?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Remover %(verbose_name_plural)s selecionados" - msgid "Administration" msgstr "Administração" @@ -93,6 +99,12 @@ msgstr "Sem data" msgid "Has date" msgstr "Tem data" +msgid "Empty" +msgstr "Vazio" + +msgid "Not empty" +msgstr "Não está vazio" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -118,7 +130,7 @@ msgid "Change" msgstr "Modificar" msgid "Deletion" -msgstr "Eliminação" +msgstr "Remoção" msgid "action time" msgstr "hora da ação" @@ -159,7 +171,7 @@ msgstr "Alterado “%(object)s” — %(changes)s" #, python-format msgid "Deleted “%(object)s.”" -msgstr "Deletado “%(object)s.”" +msgstr "Removido “%(object)s.”" msgid "LogEntry Object" msgstr "Objeto LogEntry" @@ -184,7 +196,7 @@ msgstr "Alterado {fields}." #, python-brace-format msgid "Deleted {name} “{object}”." -msgstr "Deletado {name} “{object}”." +msgstr "Removido {name} “{object}”." msgid "No fields changed." msgstr "Nenhum campo modificado." @@ -195,6 +207,9 @@ msgstr "Nenhum" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "Pressione “Control”, ou “Command” no Mac, para selecionar mais de um." +msgid "Select this object for an action - {}" +msgstr "Selecione esse objeto para uma ação - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "O {name} “{obj}” foi adicionado com sucesso." @@ -216,12 +231,6 @@ msgstr "" "O {name} “{obj}” foi alterado com sucesso. Você pode alterá-lo novamente " "abaixo." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"O {name} “{obj}” foi adicionado com sucesso. Você pode editá-lo novamente " -"abaixo." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -246,11 +255,11 @@ msgstr "Nenhuma ação selecionada." #, python-format msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "O %(name)s “%(obj)s” foi deletado com sucesso." +msgstr "O %(name)s “%(obj)s” foi removido com sucesso." #, python-format msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "O %(name)s com ID “%(key)s” não existe. Talvez tenha sido deletado." +msgstr "O %(name)s com ID “%(key)s” não existe. Talvez tenha sido removido." #, python-format msgid "Add %s" @@ -272,12 +281,14 @@ msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." msgstr[0] "%(count)s %(name)s modificado com sucesso." msgstr[1] "%(count)s %(name)s modificados com sucesso." +msgstr[2] "%(count)s %(name)s modificados com sucesso." #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" msgstr[0] "%(total_count)s selecionado" msgstr[1] "Todos %(total_count)s selecionados" +msgstr[2] "Todos %(total_count)s selecionados" #, python-format msgid "0 of %(cnt)s selected" @@ -287,8 +298,9 @@ msgstr "0 de %(cnt)s selecionados" msgid "Change history: %s" msgstr "Histórico de modificações: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -298,7 +310,7 @@ msgid "" "Deleting %(class_name)s %(instance)s would require deleting the following " "protected related objects: %(related_objects)s" msgstr "" -"Excluir o %(class_name)s %(instance)s exigiria excluir os seguintes objetos " +"Remover o %(class_name)s %(instance)s exigiria remover os seguintes objetos " "protegidos relacionados: %(related_objects)s" msgid "Django site admin" @@ -358,11 +370,27 @@ msgstr "Selecionar todos %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Limpar seleção" +msgid "Breadcrumbs" +msgstr "Marcas de navegação" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modelos na aplicação %(name)s" + +msgid "Add" +msgstr "Adicionar" + +msgid "View" +msgstr "Visualizar" + +msgid "You don’t have permission to view or edit anything." +msgstr "Você não tem permissão para ver ou editar nada." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Primeiro, informe seu nome de usuário e senha. Então, você poderá editar " +"Primeiro, informe um nome de usuário e senha. Então, você poderá editar " "outras opções do usuário." msgid "Enter a username and password." @@ -371,16 +399,35 @@ msgstr "Digite um nome de usuário e senha." msgid "Change password" msgstr "Alterar senha" -msgid "Please correct the error below." -msgstr "Por favor corrija o erro abaixo " +msgid "Set password" +msgstr "Definir senha" -msgid "Please correct the errors below." -msgstr "Por favor, corrija os erros abaixo." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Por favor corrija o erro abaixo." +msgstr[1] "Por favor corrija os erros abaixo." +msgstr[2] "Por favor corrija os erros abaixo." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Informe uma nova senha para o usuário %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Esta ação irá habilitarautenticação baseada em senha para " +"este usuário." + +msgid "Disable password-based authentication" +msgstr "Desabilitar autenticação baseada em senha" + +msgid "Enable password-based authentication" +msgstr "Habilitar autenticação baseada em senha" + +msgid "Skip to main content" +msgstr "Ir para o conteúdo principal" + msgid "Welcome," msgstr "Bem-vindo(a)," @@ -406,6 +453,15 @@ msgstr "Ver no site" msgid "Filter" msgstr "Filtro" +msgid "Hide counts" +msgstr "Esconder contagem" + +msgid "Show counts" +msgstr "Mostrar contagem" + +msgid "Clear all filters" +msgstr "Limpar todos os filtros" + msgid "Remove from sorting" msgstr "Remover da ordenação" @@ -416,8 +472,17 @@ msgstr "Prioridade da ordenação: %(priority_number)s" msgid "Toggle sorting" msgstr "Alternar ordenção" +msgid "Toggle theme (current theme: auto)" +msgstr "Alternar tema (tema atual: automático)" + +msgid "Toggle theme (current theme: light)" +msgstr "Alternar tema (tema atual: claro)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Alternar tema (tema atual: escuro)" + msgid "Delete" -msgstr "Apagar" +msgstr "Remover" #, python-format msgid "" @@ -434,7 +499,7 @@ msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -"Excluir o %(object_name)s ' %(escaped_object)s ' exigiria excluir os " +"Remover o %(object_name)s ' %(escaped_object)s ' exigiria remover os " "seguintes objetos protegidos relacionados:" #, python-format @@ -463,8 +528,8 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Excluir o %(objects_name)s selecionado pode resultar na remoção de objetos " -"relacionados, mas sua conta não tem permissão para excluir os seguintes " +"Remover o %(objects_name)s selecionado pode resultar na remoção de objetos " +"relacionados, mas sua conta não tem permissão para remover os seguintes " "tipos de objetos:" #, python-format @@ -472,7 +537,7 @@ msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" -"Excluir o %(objects_name)s selecionado exigiria excluir os seguintes objetos " +"Remover o %(objects_name)s selecionado exigiria remover os seguintes objetos " "relacionados protegidos:" #, python-format @@ -480,14 +545,11 @@ msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"Tem certeza de que deseja apagar o %(objects_name)s selecionado? Todos os " +"Tem certeza de que deseja remover o %(objects_name)s selecionado? Todos os " "seguintes objetos e seus itens relacionados serão removidos:" -msgid "View" -msgstr "Visualizar" - msgid "Delete?" -msgstr "Apagar?" +msgstr "Remover?" #, python-format msgid " By %(filter_title)s " @@ -496,16 +558,6 @@ msgstr "Por %(filter_title)s " msgid "Summary" msgstr "Resumo" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modelos na aplicação %(name)s" - -msgid "Add" -msgstr "Adicionar" - -msgid "You don’t have permission to view or edit anything." -msgstr "Você não tem permissão para ver ou editar nada." - msgid "Recent actions" msgstr "Ações recentes" @@ -515,6 +567,15 @@ msgstr "Minhas Ações" msgid "None available" msgstr "Nenhum disponível" +msgid "Added:" +msgstr "Adicionado:" + +msgid "Changed:" +msgstr "Alterado:" + +msgid "Deleted:" +msgstr "Removido:" + msgid "Unknown content" msgstr "Conteúdo desconhecido" @@ -538,6 +599,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Esqueceu sua senha ou nome de usuário?" +msgid "Toggle navigation" +msgstr "Alternar navegação" + +msgid "Sidebar" +msgstr "Barra Lateral" + +msgid "Start typing to filter…" +msgstr "Comece a digitar para filtrar…" + +msgid "Filter navigation items" +msgstr "Filtrar itens de navegação" + msgid "Date/time" msgstr "Data/hora" @@ -547,6 +620,12 @@ msgstr "Usuário" msgid "Action" msgstr "Ação" +msgid "entry" +msgid_plural "entries" +msgstr[0] "entrada" +msgstr[1] "entradas" +msgstr[2] "entradas" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -571,6 +650,7 @@ msgid "%(counter)s result" msgid_plural "%(counter)s results" msgstr[0] "%(counter)s resultado" msgstr[1] "%(counter)s resultados" +msgstr[2] "%(counter)s resultados" #, python-format msgid "%(full_result_count)s total" @@ -601,10 +681,14 @@ msgstr "Adicionar outro %(model)s" #, python-format msgid "Delete selected %(model)s" -msgstr "Excluir %(model)s selecionado" +msgstr "Remover %(model)s selecionado" + +#, python-format +msgid "View selected %(model)s" +msgstr "Visualizar %(model)s selecionados" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Obrigado por visitar nosso Web site hoje." +msgid "Thanks for spending some quality time with the web site today." +msgstr "Obrigado por passar algum tempo de qualidade com o site hoje." msgid "Log in again" msgstr "Acessar novamente" @@ -703,6 +787,9 @@ msgstr "Endereço de email:" msgid "Reset my password" msgstr "Reinicializar minha senha" +msgid "Select all objects on this page for an action" +msgstr "Selecione todos os objetos nessa página para uma ação" + msgid "All dates" msgstr "Todas as datas" diff --git a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo index f499f4fe940d..e8fe18a5f0c3 100644 Binary files a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po index a5a872bd9d52..10e5080e0261 100644 --- a/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -4,18 +4,24 @@ # Allisson Azevedo , 2014 # andrewsmedina , 2016 # Eduardo Cereto Carvalho, 2011 -# semente, 2012 +# Eduardo Felipe Castegnaro , 2024 +# Gabriel da Mota , 2023 +# fa9e10542e458baef0599ae856e43651_13d2225, 2012 # Jannis Leidel , 2011 +# Jonas Rodrigues, 2023 # Lucas Infante , 2015 +# Marssal Jr. , 2022 +# Rafael Fontenelle , 2021 # Renata Barbosa Almeida , 2016 +# Samuel Nogueira Bacelar , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Tarsis Azevedo \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:59+0000\n" +"Last-Translator: Eduardo Felipe Castegnaro , 2024\n" +"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django/django/" "language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -67,6 +73,10 @@ msgstr "" "Esta é a lista de %s disponíveis. Você pode removê-los(as) selecionando-" "os(as) abaixo e clicando na seta \"Remover\" entre as duas caixas." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Digite nesta caixa para filtrar a lista de selecionados %s." + msgid "Remove all" msgstr "Remover todos" @@ -74,10 +84,18 @@ msgstr "Remover todos" msgid "Click to remove all chosen %s at once." msgstr "Clique para remover de uma só vez todos os %s escolhidos." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s opção selecionada não visível" +msgstr[1] "%s opções selecionadas não visíveis" +msgstr[2] "%s opções selecionadas não visíveis" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s de %(cnt)s selecionado" msgstr[1] "%(sel)s de %(cnt)s selecionados" +msgstr[2] "%(sel)s de %(cnt)s selecionados" msgid "" "You have unsaved changes on individual editable fields. If you run an " @@ -87,20 +105,21 @@ msgstr "" "executar uma ação suas alterações não salvas serão perdidas." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Você selecionou uma ação, mas você não salvou as alterações de cada campo " -"ainda. Clique em OK para salvar. Você vai precisar executar novamente a ação." +"Você selecionou uma ação, mas você ainda não salvou suas alterações nos " +"campos individuais. Por favor clique OK para salvar. você precisará de rodar " +"novamente a ação." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Você selecionou uma ação, e você não fez alterações em campos individuais. " -"Você provavelmente está procurando o botão Ir ao invés do botão Salvar." +"Você selecionou uma ação sem fazer mudanças nos campos individuais. Você " +"provavelmente está procurando pelo botão Ir ao invés do botão Salvar." msgid "Now" msgstr "Agora" @@ -122,12 +141,14 @@ msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." msgstr[0] "Nota: Você está %s hora à frente do horário do servidor." msgstr[1] "Nota: Você está %s horas à frente do horário do servidor." +msgstr[2] "Nota: Você está %s horas à frente do horário do servidor." #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." msgstr[0] "Nota: Você está %s hora atrás do tempo do servidor." msgstr[1] "Nota: Você está %s horas atrás do horário do servidor." +msgstr[2] "Nota: Você está %s horas atrás do horário do servidor." msgid "Choose a Time" msgstr "Escolha um horário" @@ -186,6 +207,103 @@ msgstr "Novembro" msgid "December" msgstr "Dezembro" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Fev" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Abr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Mai" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ago" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Set" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Out" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dez" + +msgid "Sunday" +msgstr "Domingo" + +msgid "Monday" +msgstr "Segunda-feira" + +msgid "Tuesday" +msgstr "Terça-feira" + +msgid "Wednesday" +msgstr "Quarta-feira" + +msgid "Thursday" +msgstr "Quinta-feira" + +msgid "Friday" +msgstr "Sexta-feira" + +msgid "Saturday" +msgstr "Sábado" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Dom" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Seg" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Ter" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Qua" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Qui" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Sex" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sáb" + msgctxt "one letter Sunday" msgid "S" msgstr "D" @@ -213,9 +331,3 @@ msgstr "S" msgctxt "one letter Saturday" msgid "S" msgstr "S" - -msgid "Show" -msgstr "Mostrar" - -msgid "Hide" -msgstr "Esconder" diff --git a/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo index de836e713341..4fe6d2eed159 100644 Binary files a/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ro/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ro/LC_MESSAGES/django.po b/django/contrib/admin/locale/ro/LC_MESSAGES/django.po index a52959bc54ec..f328477f0e1c 100644 --- a/django/contrib/admin/locale/ro/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ro/LC_MESSAGES/django.po @@ -2,18 +2,20 @@ # # Translators: # Bogdan Mateescu, 2018-2019 -# Daniel Ursache-Dogariu, 2011 +# Daniel Ursache-Dogariu, 2011,2022 # Denis Darii , 2011,2014 +# Eugenol Man , 2020 # Ionel Cristian Mărieș , 2012 # Jannis Leidel , 2011 +# Mihai Fotea , 2020 # Razvan Stefanescu , 2015-2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 12:02+0000\n" -"Last-Translator: Bogdan Mateescu\n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 07:05+0000\n" +"Last-Translator: Daniel Ursache-Dogariu, 2011,2022\n" "Language-Team: Romanian (http://www.transifex.com/django/django/language/" "ro/)\n" "MIME-Version: 1.0\n" @@ -23,9 +25,13 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1));\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Elimină %(verbose_name_plural)s selectate" + #, python-format msgid "Successfully deleted %(count)d %(items)s." -msgstr "%(count)d %(items)s eliminate cu succes." +msgstr "%(count)d %(items)s șterse cu succes." #, python-format msgid "Cannot delete %(name)s" @@ -34,10 +40,6 @@ msgstr "Nu se poate șterge %(name)s" msgid "Are you sure?" msgstr "Sigur?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Elimină %(verbose_name_plural)s selectate" - msgid "Administration" msgstr "Administrare" @@ -72,15 +74,21 @@ msgid "No date" msgstr "Fără dată" msgid "Has date" -msgstr "Are o dată" +msgstr "Are dată" + +msgid "Empty" +msgstr "Gol" + +msgid "Not empty" +msgstr "Nu este gol" #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Introduceți vă rog un %(username)s și o parolă pentru un cont de membru. De " -"remarcat că ambele țin cont de capitalizare." +"Introduceți vă rog un %(username)s și parola corectă pentru un cont de " +"membru. De remarcat că ambele pot conține majuscule." msgid "Action:" msgstr "Acțiune:" @@ -96,7 +104,7 @@ msgid "Addition" msgstr "Adăugare" msgid "Change" -msgstr "Schimbă" +msgstr "Schimbare" msgid "Deletion" msgstr "Ștergere" @@ -122,7 +130,7 @@ msgid "action flag" msgstr "marcaj acțiune" msgid "change message" -msgstr "schimbă mesaj" +msgstr "mesaj schimbare" msgid "log entry" msgstr "intrare jurnal" @@ -131,23 +139,23 @@ msgid "log entries" msgstr "intrări jurnal" #, python-format -msgid "Added \"%(object)s\"." -msgstr "S-au adăugat \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Adăugat %(object)s" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "S-au schimbat \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Schimbat “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "S-au șters \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Șters “%(object)s.”" msgid "LogEntry Object" msgstr "Obiect LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "S-a adăugat {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Adăugat {name} “{object}”." msgid "Added." msgstr "Adăugat." @@ -156,16 +164,16 @@ msgid "and" msgstr "și" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "S-au schimbat {fields} pentru {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "{fields} schimbat pentru {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "S-au schimbat {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "S-a șters {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Șters {name} “{object}”." msgid "No fields changed." msgstr "Niciun câmp modificat." @@ -173,49 +181,44 @@ msgstr "Niciun câmp modificat." msgid "None" msgstr "Nimic" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Ține apăsat \"Control\", sau \"Command\" pe un Mac, pentru a selecta mai " -"mult de unul." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "{name} \"{obj}\" a fost adăugat cu succes." msgid "You may edit it again below." -msgstr "O poți edita din nou mai jos." +msgstr "Poți edita din nou mai jos." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" "{name} \"{obj}\" a fost adăugat cu succes. Poți adăuga alt {name} mai jos." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"{name} \"{obj}\" a fost modificat cu succes. Poți să îl editezi în " -"continuare mai jos." +"{name} \"{obj}\" a fost modificat cu succes. Poți să editezi în continuare " +"mai jos." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"{name} \"{obj}\" a fost adăugat cu succes. Poți să îl editezi în continuare " -"mai jos." +"{name} \"{obj}\" a fost adăugat cu succes. Poți să editezi în continuare mai " +"jos." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" "{name} \"{obj}\" a fost modificat cu succes. Poți adăuga alt {name} mai jos." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "{name} \"{obj}\" a fost schimbat cu succes." msgid "" @@ -229,12 +232,12 @@ msgid "No action selected." msgstr "Nicio acțiune selectată." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" eliminat(ă) cu succes." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s cu ID \"%(key)s\" inexistent. Posibil să fi fost șters?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" #, python-format msgid "Add %s" @@ -273,8 +276,9 @@ msgstr "0 din %(cnt)s selectat" msgid "Change history: %s" msgstr "Istoric schimbări: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -306,8 +310,8 @@ msgstr "administrare %(app)s" msgid "Page not found" msgstr "Pagină inexistentă" -msgid "We're sorry, but the requested page could not be found." -msgstr "Ne pare rău, dar pagina solicitată nu a putut fi găsită." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Din păcate nu am găsit pagina solicitată" msgid "Home" msgstr "Acasă" @@ -322,11 +326,9 @@ msgid "Server Error (500)" msgstr "Eroare server (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"A apărut o eroare. A fost raportată către administratorii site-ului prin " -"email și ar trebui să fie reparată în scurt timp. Mulțumesc pentru răbdare." msgid "Run the selected action" msgstr "Pornește acțiunea selectată" @@ -344,12 +346,23 @@ msgstr "Selectați toate %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Deselectați" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele în aplicația %(name)s" + +msgid "Add" +msgstr "Adaugă" + +msgid "View" +msgstr "Vizualizează" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Introduceți mai întâi un nume de utilizator și o parolă. Apoi veți putea " -"modifica mai multe opțiuni ale utilizatorului." msgid "Enter a username and password." msgstr "Introduceți un nume de utilizator și o parolă." @@ -358,16 +371,19 @@ msgid "Change password" msgstr "Schimbă parola" msgid "Please correct the error below." -msgstr "Corectați eroarea de mai jos." - -msgid "Please correct the errors below." -msgstr "Corectați erorile de mai jos." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Introduceți o parolă nouă pentru utilizatorul %(username)s." +msgid "Skip to main content" +msgstr "" + msgid "Welcome," msgstr "Bun venit," @@ -380,6 +396,9 @@ msgstr "Documentație" msgid "Log out" msgstr "Deconectează-te" +msgid "Breadcrumbs" +msgstr "" + #, python-format msgid "Add %(name)s" msgstr "Adaugă %(name)s" @@ -393,6 +412,9 @@ msgstr "Vizualizează pe site" msgid "Filter" msgstr "Filtru" +msgid "Clear all filters" +msgstr "Șterge toate filtrele" + msgid "Remove from sorting" msgstr "Elimină din sortare" @@ -403,6 +425,15 @@ msgstr "Prioritate sortare: %(priority_number)s" msgid "Toggle sorting" msgstr "Alternează sortarea" +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + msgid "Delete" msgstr "Șterge" @@ -435,8 +466,8 @@ msgstr "" msgid "Objects" msgstr "Obiecte" -msgid "Yes, I'm sure" -msgstr "Da, cu siguranță" +msgid "Yes, I’m sure" +msgstr "Da, sunt sigur" msgid "No, take me back" msgstr "Nu, vreau să mă întorc" @@ -470,9 +501,6 @@ msgstr "" "Sigur doriţi să ștergeți %(objects_name)s conform selecției? Toate obiectele " "următoare alături de cele asociate lor vor fi șterse:" -msgid "View" -msgstr "Vizualizează" - msgid "Delete?" msgstr "Elimină?" @@ -483,16 +511,6 @@ msgstr "După %(filter_title)s " msgid "Summary" msgstr "Sumar" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele în aplicația %(name)s" - -msgid "Add" -msgstr "Adaugă" - -msgid "You don't have permission to view or edit anything." -msgstr "Nu aveți permisiunea de a edita sau vizualiza nimic." - msgid "Recent actions" msgstr "Acțiuni recente" @@ -506,13 +524,10 @@ msgid "Unknown content" msgstr "Conținut necunoscut" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Există o problema cu baza de date. Verificați dacă tabelele necesare din " -"baza de date au fost create și verificați dacă baza de date poate fi citită " -"de utilizatorul potrivit." #, python-format msgid "" @@ -525,6 +540,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Ați uitat parola sau utilizatorul ?" +msgid "Toggle navigation" +msgstr "Comutare navigație" + +msgid "Sidebar" +msgstr "" + +msgid "Start typing to filter…" +msgstr "Începeți să scrieți pentru filtrare..." + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Dată/oră" @@ -534,12 +561,16 @@ msgstr "Utilizator" msgid "Action" msgstr "Acțiune" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Acest obiect nu are un istoric al schimbărilor. Probabil nu a fost adăugat " -"prin intermediul acestui sit de administrare." msgid "Show all" msgstr "Arată totul" @@ -591,8 +622,12 @@ msgstr "Adaugă alt %(model)s" msgid "Delete selected %(model)s" msgstr "Șterge %(model)s selectat" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Mulţumiri pentru timpul petrecut astăzi pe sit." +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" msgid "Log in again" msgstr "Reautentificare" @@ -604,11 +639,11 @@ msgid "Your password was changed." msgstr "Parola a fost schimbată." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Din motive de securitate, introduceți parola veche, apoi de două ori parola " -"nouă, pentru a putea verifica dacă ați scris-o corect. " +"Vă rog introduceți parola veche, pentru securitate, apoi introduceți parola " +"nouă de doua ori pentru a verifica dacă a fost scrisă corect. " msgid "Change my password" msgstr "Schimbă-mi parola" @@ -645,19 +680,18 @@ msgstr "" "fost deja utilizat. Solicitați o nouă resetare a parolei." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"V-am transmis pe email instrucțiunile pentru setarea unei parole noi, dacă " -"există un cont cu adresa email introdusă. Ar trebui să le primiți în scurt " -"timp." +"Am trimis instrucțiuni pentru a seta parola, daca există un cont cu email-ul " +"introdus. O sa-l primiți cât de curând." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Dacă nu primiți un email, asigurați-vă că ați introdus adresa cu care v-ați " -"înregistrat și verificați directorul spam." +"Dacă nu ați primit un email, verificați vă rog dacă ați introdus adresa cu " +"care v-ați înregistrat și verificați si folderul Spam." #, python-format msgid "" @@ -670,8 +704,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Mergeți la următoarea pagină și alegeți o parolă nouă:" -msgid "Your username, in case you've forgotten:" -msgstr "Numele de utilizator, în caz că l-ați uitat:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Numele tău de utilizator, în caz că l-ai uitat:" msgid "Thanks for using our site!" msgstr "Mulțumiri pentru utilizarea sitului nostru!" @@ -681,11 +715,11 @@ msgid "The %(site_name)s team" msgstr "Echipa %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Ați uitat parola? Introduceți adresa email mai jos și veți primi " -"instrucțiuni pentru setarea unei noi parole." +"Ați uitat parola ? Introduceți adresa de email mai jos și vă vom trimite " +"instrucțiuni pentru o parolă nouă." msgid "Email address:" msgstr "Adresă e-mail:" diff --git a/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo index b1b5dffd9481..59f694e3a8c4 100644 Binary files a/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po index 11127e87e68b..e681dde5b868 100644 --- a/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ro/LC_MESSAGES/djangojs.po @@ -4,6 +4,7 @@ # Bogdan Mateescu, 2018-2019 # Daniel Ursache-Dogariu, 2011 # Denis Darii , 2011 +# Eugenol Man , 2020 # Ionel Cristian Mărieș , 2012 # Jannis Leidel , 2011 # razvan ionescu , 2015 @@ -12,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-04-18 17:06+0000\n" -"Last-Translator: Bogdan Mateescu\n" +"POT-Creation-Date: 2020-05-11 20:56+0200\n" +"PO-Revision-Date: 2020-07-15 11:16+0000\n" +"Last-Translator: Eugenol Man \n" "Language-Team: Romanian (http://www.transifex.com/django/django/language/" "ro/)\n" "MIME-Version: 1.0\n" @@ -91,21 +92,20 @@ msgstr "" "o acțiune, modificările nesalvate vor fi pierdute." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Aţi selectat o acţiune, dar nu aţi salvat încă modificările la câmpuri " -"individuale. Faceţi clic pe OK pentru a salva. Va trebui să executați " -"acțiunea din nou." +"Ai selectat o acțiune dar nu ai salvat modificările făcute în câmpuri " +"individuale. Te rugăm apasa Ok pentru a salva. Va trebui sa reiei acțiunea." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Ați selectat o acţiune și nu ațţi făcut modificări în cîmpuri individuale. " -"Probabil căutați butonul Go, în loc de Salvează." +"Ai selectat o acțiune și nu ai făcut modificări. Probabil că dorești butonul " +"de Go mai putin cel de Salvează." msgid "Now" msgstr "Acum" diff --git a/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo index c11def1d49b9..f95653f5a060 100644 Binary files a/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/ru/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ru/LC_MESSAGES/django.po b/django/contrib/admin/locale/ru/LC_MESSAGES/django.po index e27b05c04d99..c77ffd1b07f9 100644 --- a/django/contrib/admin/locale/ru/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/ru/LC_MESSAGES/django.po @@ -1,31 +1,38 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Alex Ibragimov, 2021 # Ivan Ivaschenko , 2013 # Denis Darii , 2011 # Dimmus , 2011 # Eugene , 2016-2017 +# crazyzubr , 2020 # Sergey , 2016 # Jannis Leidel , 2011 -# Алексей Борискин , 2012-2015 +# SeryiMysh , 2020 +# Алексей Борискин , 2012-2015,2022-2024 # Дмитрий , 2019 -# Дмитрий Шатера , 2018 +# Bobsans , 2018 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-14 12:41+0000\n" -"Last-Translator: Дмитрий \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Алексей Борискин , 2012-2015,2022-2024\n" +"Language-Team: Russian (http://app.transifex.com/django/django/language/" "ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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" +"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" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Удалить выбранные %(verbose_name_plural)s" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -38,10 +45,6 @@ msgstr "Не удается удалить %(name)s" msgid "Are you sure?" msgstr "Вы уверены?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Удалить выбранные %(verbose_name_plural)s" - msgid "Administration" msgstr "Администрирование" @@ -78,6 +81,12 @@ msgstr "Дата не указана" msgid "Has date" msgstr "Дата указана" +msgid "Empty" +msgstr "Пусто" + +msgid "Not empty" +msgstr "Не пусто" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -135,23 +144,23 @@ msgid "log entries" msgstr "записи в журнале" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Добавлено \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Добавлено “%(object)s“." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Изменено \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Изменено “%(object)s“ - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Удалено \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Удалено “%(object)s.“" msgid "LogEntry Object" msgstr "Запись в журнале" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Добавлен {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Добавлен {name} “{object}“." msgid "Added." msgstr "Добавлено." @@ -160,16 +169,16 @@ msgid "and" msgstr "и" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Изменено {fields} у {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Изменено {fields} у {name} “{object}“." #, python-brace-format msgid "Changed {fields}." msgstr "Изменено {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Удален {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Удален {name} “{object}“." msgid "No fields changed." msgstr "Ни одно поле не изменено." @@ -177,50 +186,42 @@ msgstr "Ни одно поле не изменено." msgid "None" msgstr "Нет" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Удерживайте \"Control\" (или \"Command\" на Mac), чтобы выбрать несколько " +"Удерживайте “Control“ (или “Command“ на Mac), чтобы выбрать несколько " "значений." +msgid "Select this object for an action - {}" +msgstr "Выбрать этот объект, чтобы применить к нему действие - {}" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" было успешно добавлено." +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} \"{obj}\" был успешно добавлен." msgid "You may edit it again below." msgstr "Вы можете снова изменить этот объект ниже." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" был успешно добавлен. Вы можете добавить еще один {name} " -"ниже." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"{name} \"{obj}\" был изменен успешно. Вы можете отредактировать его снова " -"ниже." +"{name} “{obj}“ был успешно добавлен. Вы можете добавить еще один {name} ниже." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"{name} \"{obj}\" был успешно добавлен. Вы можете отредактировать его еще раз " -"ниже." +"{name} “{obj}“ был изменен успешно. Вы можете отредактировать его снова ниже." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} \"{obj}\" был изменен. Вы можете добавить еще один {name} ниже." +msgstr "{name} “{obj}“ был изменен. Вы можете добавить еще один {name} ниже." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" был изменен." +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}“ был успешно изменен." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -233,12 +234,12 @@ msgid "No action selected." msgstr "Действие не выбрано." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" был успешно удален." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s“ был успешно удален." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s с ID \"%(key)s\" не существует. Возможно оно было удалено?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s с ID “%(key)s“ не существует. Возможно оно было удалено?" #, python-format msgid "Add %s" @@ -279,8 +280,9 @@ msgstr "Выбрано 0 объектов из %(cnt)s " msgid "Change history: %s" msgstr "История изменений: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -312,7 +314,7 @@ msgstr "Администрирование приложения «%(app)s»" msgid "Page not found" msgstr "Страница не найдена" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "К сожалению, запрашиваемая вами страница не найдена." msgid "Home" @@ -328,7 +330,7 @@ msgid "Server Error (500)" msgstr "Ошибка сервера (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Произошла ошибка. О ней сообщено администраторам сайта по электронной почте, " @@ -350,8 +352,24 @@ msgstr "Выбрать все %(module_name)s (%(total_count)s)" msgid "Clear selection" msgstr "Снять выделение" +msgid "Breadcrumbs" +msgstr "Хлебные крошки" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Модели в приложении %(name)s" + +msgid "Add" +msgstr "Добавить" + +msgid "View" +msgstr "Просмотреть" + +msgid "You don’t have permission to view or edit anything." +msgstr "У вас недостаточно полномочий для просмотра или изменения чего либо." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Сначала введите имя пользователя и пароль. Затем вы сможете ввести больше " @@ -363,16 +381,36 @@ msgstr "Введите имя пользователя и пароль." msgid "Change password" msgstr "Изменить пароль" -msgid "Please correct the error below." -msgstr "Пожалуйста, исправьте ошибку ниже." +msgid "Set password" +msgstr "Задать пароль" -msgid "Please correct the errors below." -msgstr "Пожалуйста, исправьте ошибки ниже." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Пожалуйста, исправьте ошибку ниже." +msgstr[1] "Пожалуйста, исправьте ошибки ниже." +msgstr[2] "Пожалуйста, исправьте ошибки ниже." +msgstr[3] "Пожалуйста, исправьте ошибки ниже." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Введите новый пароль для пользователя %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Это действие разрешит парольную аутентификацию для этого " +"пользователя." + +msgid "Disable password-based authentication" +msgstr "Запретить аутентификацию по паролю" + +msgid "Enable password-based authentication" +msgstr "Разрешить аутентификацию по паролю" + +msgid "Skip to main content" +msgstr "К основному" + msgid "Welcome," msgstr "Добро пожаловать," @@ -398,6 +436,15 @@ msgstr "Смотреть на сайте" msgid "Filter" msgstr "Фильтр" +msgid "Hide counts" +msgstr "Скрыть счётчики" + +msgid "Show counts" +msgstr "Показать счётчики" + +msgid "Clear all filters" +msgstr "Сбросить все фильтры" + msgid "Remove from sorting" msgstr "Удалить из сортировки" @@ -408,6 +455,15 @@ msgstr "Приоритет сортировки: %(priority_number)s" msgid "Toggle sorting" msgstr "Сортировать в другом направлении" +msgid "Toggle theme (current theme: auto)" +msgstr "Переключить тему (текущая: выбрана автоматически)" + +msgid "Toggle theme (current theme: light)" +msgstr "Переключить тему (текущая: светлая)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Переключить тему (текущая: тёмная)" + msgid "Delete" msgstr "Удалить" @@ -440,7 +496,7 @@ msgstr "" msgid "Objects" msgstr "Объекты" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Да, я уверен" msgid "No, take me back" @@ -474,9 +530,6 @@ msgstr "" "Вы уверены, что хотите удалить %(objects_name)s? Все следующие объекты и " "связанные с ними элементы будут удалены:" -msgid "View" -msgstr "Просмотреть" - msgid "Delete?" msgstr "Удалить?" @@ -487,16 +540,6 @@ msgstr "%(filter_title)s" msgid "Summary" msgstr "Краткая статистика" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели в приложении %(name)s" - -msgid "Add" -msgstr "Добавить" - -msgid "You don't have permission to view or edit anything." -msgstr "У вас недостаточно полномочий для просмотра или изменения чего либо." - msgid "Recent actions" msgstr "Последние действия" @@ -506,11 +549,20 @@ msgstr "Мои действия" msgid "None available" msgstr "Недоступно" +msgid "Added:" +msgstr "Создано:" + +msgid "Changed:" +msgstr "Изменено:" + +msgid "Deleted:" +msgstr "Удалено:" + msgid "Unknown content" msgstr "Неизвестный тип" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -530,6 +582,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Забыли свой пароль или имя пользователя?" +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Sidebar" +msgstr "Боковая панель" + +msgid "Start typing to filter…" +msgstr "Начните печатать для фильтрации..." + +msgid "Filter navigation items" +msgstr "Фильтр элементов навигации" + msgid "Date/time" msgstr "Дата и время" @@ -539,8 +603,15 @@ msgstr "Пользователь" msgid "Action" msgstr "Действие" +msgid "entry" +msgid_plural "entries" +msgstr[0] "запись" +msgstr[1] "записи" +msgstr[2] "записей" +msgstr[3] "записей" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Данный объект не имеет истории изменений. Возможно, он был добавлен не через " @@ -597,7 +668,11 @@ msgstr "Добавить ещё один объект типа \"%(model)s\"" msgid "Delete selected %(model)s" msgstr "Удалить выбранный объект типа \"%(model)s\"" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Просмотреть выбранный объект типа \"%(model)s\"" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Благодарим вас за время, проведенное на этом сайте." msgid "Log in again" @@ -610,7 +685,7 @@ msgid "Your password was changed." msgstr "Ваш пароль был изменен." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "В целях безопасности, пожалуйста, введите свой старый пароль, затем введите " @@ -649,7 +724,7 @@ msgstr "" "Пожалуйста, попробуйте восстановить пароль еще раз." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "Мы отправили вам инструкцию по установке нового пароля на указанный адрес " @@ -657,7 +732,7 @@ msgstr "" "получить ее в ближайшее время." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "Если вы не получили письмо, пожалуйста, убедитесь, что вы ввели адрес с " @@ -675,7 +750,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Пожалуйста, перейдите на эту страницу и введите новый пароль:" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Ваше имя пользователя (на случай, если вы его забыли):" msgid "Thanks for using our site!" @@ -686,7 +761,7 @@ msgid "The %(site_name)s team" msgstr "Команда сайта %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Забыли пароль? Введите свой адрес электронной почты ниже, и мы вышлем вам " @@ -698,6 +773,9 @@ msgstr "Адрес электронной почты:" msgid "Reset my password" msgstr "Восстановить мой пароль" +msgid "Select all objects on this page for an action" +msgstr "Выбрать все объекты на этой странице, чтобы применить к ним действие" + msgid "All dates" msgstr "Все даты" diff --git a/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo index 4a51b2f5f1d5..6bf7a814714d 100644 Binary files a/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po index 281cd5188987..cb33c01cc1f2 100644 --- a/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/ru/LC_MESSAGES/djangojs.po @@ -1,29 +1,33 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Claude Paroz , 2020 # Denis Darii , 2011 # Dimmus , 2011 # Eugene , 2012 # Eugene , 2016 +# crazyzubr , 2020 # Jannis Leidel , 2011 -# Алексей Борискин , 2012,2014-2015 +# Panasoft, 2021 +# Алексей Борискин , 2012,2014-2015,2022-2023 # Андрей Щуров , 2016 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Eugene \n" -"Language-Team: Russian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Алексей Борискин , " +"2012,2014-2015,2022-2023\n" +"Language-Team: Russian (http://app.transifex.com/django/django/language/" "ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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" +"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" #, javascript-format msgid "Available %s" @@ -70,6 +74,11 @@ msgstr "" "Это список выбранных %s. Вы можете удалить некоторые из них, выделив их в " "поле ниже и кликнув \"Удалить\", либо двойным щелчком." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "" +"Набирайте символы в этом поле, чтобы отфильтровать список выбранных %s." + msgid "Remove all" msgstr "Удалить все" @@ -77,6 +86,14 @@ msgstr "Удалить все" msgid "Click to remove all chosen %s at once." msgstr "Нажмите чтобы удалить все %s сразу." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s выбранный объект не виден" +msgstr[1] "%s выбранных объекта не видны" +msgstr[2] "%s выбранных объектов не видны" +msgstr[3] "%s выбранных объектов не видны" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "Выбран %(sel)s из %(cnt)s" @@ -92,8 +109,8 @@ msgstr "" "вы запустите действие, несохраненные изменения будут потеряны." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Вы выбрали действие, но еще не сохранили изменения, внесенные в некоторых " @@ -101,13 +118,13 @@ msgstr "" "сохранения вам придется запустить действие еще раз." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Вы выбрали действие и не внесли изменений в данные. Возможно, вы хотели " "воспользоваться кнопкой \"Выполнить\", а не кнопкой \"Сохранить\". Если это " -"так, то нажмите \"Отмена\", чтобы вернуться в интерфейс редактирования. " +"так, то нажмите \"Отмена\", чтобы вернуться в интерфейс редактирования." msgid "Now" msgstr "Сейчас" @@ -201,6 +218,103 @@ msgstr "Ноябрь" msgid "December" msgstr "Декабрь" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Янв" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Фев" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Мар" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Апр" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Май" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Июн" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Июл" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Авг" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Сен" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Окт" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Ноя" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Дек" + +msgid "Sunday" +msgstr "Воскресенье" + +msgid "Monday" +msgstr "Понедельник" + +msgid "Tuesday" +msgstr "Вторник" + +msgid "Wednesday" +msgstr "Среда" + +msgid "Thursday" +msgstr "Четверг" + +msgid "Friday" +msgstr "Пятница" + +msgid "Saturday" +msgstr "Суббота" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Вс" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Пн" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Вт" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Ср" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Чт" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Пт" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Сб" + msgctxt "one letter Sunday" msgid "S" msgstr "В" diff --git a/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo index d7a5ba377792..dc548e5b07bf 100644 Binary files a/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sk/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sk/LC_MESSAGES/django.po b/django/contrib/admin/locale/sk/LC_MESSAGES/django.po index 3e9db2405e7d..7e18ff8e65f5 100644 --- a/django/contrib/admin/locale/sk/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sk/LC_MESSAGES/django.po @@ -1,20 +1,24 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Adam Zahradník, 2023-2024 # Jannis Leidel , 2011 -# Juraj Bubniak , 2012-2013 +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013 # Marian Andre , 2013-2015,2017 -# Martin Kosír, 2011 -# Martin Tóth , 2017 +# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 +# Martin Tóth , 2017,2023 +# Miroslav Bendik , 2023 +# Peter Kuma, 2021 +# Peter Stríž , 2020 # Zbynek Drlik , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-06-10 07:35+0000\n" -"Last-Translator: Zbynek Drlik \n" -"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Adam Zahradník, 2023-2024\n" +"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,21 +26,21 @@ msgstr "" "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" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Odstrániť označené %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." -msgstr "Úspešne zmazaných %(count)d %(items)s." +msgstr "Úspešne odstránených %(count)d %(items)s." #, python-format msgid "Cannot delete %(name)s" -msgstr "Nedá sa vymazať %(name)s" +msgstr "Nedá sa odstrániť %(name)s" msgid "Are you sure?" msgstr "Ste si istý?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Zmazať označené %(verbose_name_plural)s" - msgid "Administration" msgstr "Správa" @@ -73,13 +77,19 @@ msgstr "Bez dátumu" msgid "Has date" msgstr "S dátumom" +msgid "Empty" +msgstr "Prázdna hodnota" + +msgid "Not empty" +msgstr "Neprázdna hodnota" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" -"Zadajte prosím správne %(username)s a heslo pre účet personálu - \"staff " -"account\". Obe polia môžu obsahovať veľké a malé písmená." +"Zadajte prosím správne %(username)s a heslo pre účet personálu - „staff " +"account“. Obe polia môžu obsahovať veľké a malé písmená." msgid "Action:" msgstr "Akcia:" @@ -92,13 +102,13 @@ msgid "Remove" msgstr "Odstrániť" msgid "Addition" -msgstr "" +msgstr "Pridávanie" msgid "Change" msgstr "Zmeniť" msgid "Deletion" -msgstr "" +msgstr "Odstránenie" msgid "action time" msgstr "čas akcie" @@ -130,23 +140,23 @@ msgid "log entries" msgstr "položky záznamu" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Pridané \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Pridané „%(object)s“." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Zmenené \"%(object)s\" - %(changes)s " +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Zmenené „%(object)s“ — %(changes)s " #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Odstránené \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Odstránené „%(object)s“." msgid "LogEntry Object" msgstr "Objekt LogEntry" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Pridaný {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Pridaný {name} „{object}“." msgid "Added." msgstr "Pridaný." @@ -155,16 +165,16 @@ msgid "and" msgstr "a" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Zmenený {fields} pre {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Zmenené {fields} pre {name} „{object}“." #, python-brace-format msgid "Changed {fields}." msgstr "Zmenené {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Zmazaný {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Odstránený {name} „{object}“." msgid "No fields changed." msgstr "Polia nezmenené." @@ -172,52 +182,43 @@ msgstr "Polia nezmenené." msgid "None" msgstr "Žiadne" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Ak chcete vybrať viac ako jednu položku, podržte \"Control\", alebo \"Command" -"\" na počítači Mac." +"Ak chcete vybrať viac ako jednu položku na Mac, podržte „Control“, alebo " +"„Command“" + +msgid "Select this object for an action - {}" +msgstr "Vybrať tento objekt pre akciu - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Objekt {name} \"{obj}\" bol úspešne pridaný." +msgid "The {name} “{obj}” was added successfully." +msgstr "Objekt {name} „{obj}“ bol úspešne pridaný." msgid "You may edit it again below." -msgstr "" +msgstr "Ďalšie zmeny môžete urobiť nižšie." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Objekt {name} \"{obj}\" bol úspešne pridaný. Môžete pridať ďaľší {name} " -"nižšie." +"Objekt {name} „{obj}“ bol úspešne pridaný. Môžete pridať ďaľší {name} nižšie." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" -"Objekt {name} \"{obj}\" bol úspešne zmenený. Ďalšie zmeny môžete urobiť " -"nižšie." +"Objekt {name} „{obj}“ bol úspešne zmenený. Ďalšie zmeny môžete urobiť nižšie." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"Objekt {name} \"{obj}\" bol úspešne pridaný. Ďalšie zmeny môžete urobiť " -"nižšie." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Objekt {name} \"{obj}\" bol úspešne pridaný. Môžete pridať ďaľší {name} " -"nižšie." +"Objekt {name} „{obj}“ bol úspešne zmenený. Môžete pridať ďaľší {name} nižšie." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "Objekt {name} \"{obj}\" bol úspešne pridaný." +msgid "The {name} “{obj}” was changed successfully." +msgstr "Objekt {name} „{obj}“ bol úspešne zmenený." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -230,13 +231,12 @@ msgid "No action selected." msgstr "Nebola vybraná žiadna akcia." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "Objekt %(name)s „%(obj)s“ bol úspešne odstránený." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" -"Položka %(name)s s ID \"%(key)s\" neexistuje - pravdepodobne je vymazaná?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "Objekt %(name)s s ID „%(key)s“ neexistuje. Možno bol odstránený?" #, python-format msgid "Add %s" @@ -248,7 +248,7 @@ msgstr "Zmeniť %s" #, python-format msgid "View %s" -msgstr "" +msgstr "Zobraziť%s" msgid "Database error" msgstr "Chyba databázy" @@ -277,8 +277,9 @@ msgstr "0 z %(cnt)s vybraných" msgid "Change history: %s" msgstr "Zoznam zmien: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -310,8 +311,8 @@ msgstr "%(app)s správa" msgid "Page not found" msgstr "Stránka nenájdená" -msgid "We're sorry, but the requested page could not be found." -msgstr "Ľutujeme, ale požadovanú stránku nie je možné nájsť." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená." msgid "Home" msgstr "Domov" @@ -326,7 +327,7 @@ msgid "Server Error (500)" msgstr "Chyba servera (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Došlo k chybe. Chyba bola nahlásená správcovi webu prostredníctvom e-mailu a " @@ -348,8 +349,24 @@ msgstr "Vybrať všetkých %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Zrušiť výber" +msgid "Breadcrumbs" +msgstr "Mininavigácia" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modely v %(name)s aplikácii" + +msgid "Add" +msgstr "Pridať" + +msgid "View" +msgstr "Zobraziť" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nemáte právo na zobrazenie alebo vykonávanie zmien." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Najskôr zadajte používateľské meno a heslo. Potom budete môcť upraviť viac " @@ -361,16 +378,36 @@ msgstr "Zadajte používateľské meno a heslo." msgid "Change password" msgstr "Zmeniť heslo" -msgid "Please correct the error below." -msgstr "" +msgid "Set password" +msgstr "Nastaviť heslo" -msgid "Please correct the errors below." -msgstr "Prosím, opravte chyby uvedené nižšie." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Prosím, opravte chybu uvedenú nižšie." +msgstr[1] "Prosím, opravte chyby uvedené nižšie." +msgstr[2] "Prosím, opravte chyby uvedené nižšie." +msgstr[3] "Prosím, opravte chyby uvedené nižšie." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Zadajte nové heslo pre používateľa %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Týmto povolíte tomuto používateľovi prihlasovanie pomocou " +"hesla." + +msgid "Disable password-based authentication" +msgstr "Vypnúť prihlasovanie pomocou hesla" + +msgid "Enable password-based authentication" +msgstr "Povoliť prihlasovanie pomocou hesla" + +msgid "Skip to main content" +msgstr "Preskočiť na hlavný obsah" + msgid "Welcome," msgstr "Vitajte," @@ -396,6 +433,15 @@ msgstr "Pozrieť na stránke" msgid "Filter" msgstr "Filtrovať" +msgid "Hide counts" +msgstr "Skryť počet" + +msgid "Show counts" +msgstr "Zobraziť počet" + +msgid "Clear all filters" +msgstr "Zrušiť všetky filtre" + msgid "Remove from sorting" msgstr "Odstrániť z triedenia" @@ -406,6 +452,15 @@ msgstr "Triedenie priority: %(priority_number)s " msgid "Toggle sorting" msgstr "Prepnúť triedenie" +msgid "Toggle theme (current theme: auto)" +msgstr "Prepnúť vzhľad (aktuálne: automatický)" + +msgid "Toggle theme (current theme: light)" +msgstr "Prepnúť vzhľad (aktuálne: svetlý)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Prepnúť vzhľad (aktuálne: tmavý)" + msgid "Delete" msgstr "Odstrániť" @@ -415,7 +470,7 @@ msgid "" "related objects, but your account doesn't have permission to delete the " "following types of objects:" msgstr "" -"Odstránenie objektu %(object_name)s '%(escaped_object)s' by malo za následok " +"Odstránenie objektu %(object_name)s „%(escaped_object)s“ by malo za následok " "aj odstránenie súvisiacich objektov. Váš účet však nemá oprávnenie na " "odstránenie nasledujúcich typov objektov:" @@ -424,7 +479,7 @@ msgid "" "Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " "following protected related objects:" msgstr "" -"Vymazanie %(object_name)s '%(escaped_object)s' vyžaduje vymazanie " +"Vymazanie %(object_name)s „%(escaped_object)s“ vyžaduje vymazanie " "nasledovných súvisiacich chránených objektov:" #, python-format @@ -432,20 +487,20 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" -"Ste si istý, že chcete odstrániť objekt %(object_name)s \"%(escaped_object)s" -"\"? Všetky nasledujúce súvisiace objekty budú odstránené:" +"Ste si istý, že chcete odstrániť objekt %(object_name)s " +"„%(escaped_object)s“? Všetky nasledujúce súvisiace objekty budú odstránené:" msgid "Objects" msgstr "Objekty" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Áno, som si istý" msgid "No, take me back" msgstr "Nie, chcem sa vrátiť" msgid "Delete multiple objects" -msgstr "Zmazať viacero objektov" +msgstr "Odstrániť viacero objektov" #, python-format msgid "" @@ -453,8 +508,8 @@ msgid "" "objects, but your account doesn't have permission to delete the following " "types of objects:" msgstr "" -"Vymazanie označených %(objects_name)s by spôsobilo vymazanie súvisiacich " -"objektov, ale váš účet nemá oprávnenie na vymazanie nasledujúcich typov " +"Odstránenie označených %(objects_name)s by spôsobilo odstránenie súvisiacich " +"objektov, ale váš účet nemá oprávnenie na odstránenie nasledujúcich typov " "objektov:" #, python-format @@ -470,14 +525,11 @@ msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"Ste si isty, že chcete vymazať označené %(objects_name)s? Vymažú sa všetky " -"nasledujúce objekty a ich súvisiace položky:" - -msgid "View" -msgstr "" +"Ste si istý, že chcete odstrániť označené %(objects_name)s? Odstránia sa " +"všetky nasledujúce objekty a ich súvisiace položky:" msgid "Delete?" -msgstr "Zmazať?" +msgstr "Odstrániť?" #, python-format msgid " By %(filter_title)s " @@ -486,16 +538,6 @@ msgstr "Podľa %(filter_title)s " msgid "Summary" msgstr "Súhrn" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modely v %(name)s aplikácii" - -msgid "Add" -msgstr "Pridať" - -msgid "You don't have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "Posledné akcie" @@ -505,17 +547,26 @@ msgstr "Moje akcie" msgid "None available" msgstr "Nedostupné" +msgid "Added:" +msgstr "Pridaný:" + +msgid "Changed:" +msgstr "Zmenený:" + +msgid "Deleted:" +msgstr "Odstránený:" + msgid "Unknown content" msgstr "Neznámy obsah" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Niečo nie je v poriadku s vašou inštaláciou databázy. Uistite sa, že boli " -"vytvorené potrebné databázové tabuľky a taktiež skontrolujte, či príslušný " -"používateľ môže databázu čítať." +"Niečo nie je v poriadku s vašou inštaláciou databázy. Zabezpečte, aby boli " +"vytvorené potrebné databázové tabuľky a taktiež zabezpečte, aby príslušný " +"používateľ mohol čítať databázu." #, python-format msgid "" @@ -528,6 +579,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Zabudli ste heslo alebo používateľské meno?" +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Sidebar" +msgstr "Bočný panel" + +msgid "Start typing to filter…" +msgstr "Filtrovať začnete písaním textu…" + +msgid "Filter navigation items" +msgstr "Filtrovať položky navigácie" + msgid "Date/time" msgstr "Dátum a čas" @@ -537,8 +600,15 @@ msgstr "Používateľ" msgid "Action" msgstr "Akcia" +msgid "entry" +msgid_plural "entries" +msgstr[0] "záznam" +msgstr[1] "záznamy" +msgstr[2] "záznamov" +msgstr[3] "záznamov" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Tento objekt nemá zoznam zmien. Pravdepodobne nebol pridaný prostredníctvom " @@ -551,7 +621,7 @@ msgid "Save" msgstr "Uložiť" msgid "Popup closing…" -msgstr "" +msgstr "Vyskakovacie okno sa zatvára…" msgid "Search" msgstr "Vyhľadávanie" @@ -578,7 +648,7 @@ msgid "Save and continue editing" msgstr "Uložiť a pokračovať v úpravách" msgid "Save and view" -msgstr "" +msgstr "Uložiť a zobraziť" msgid "Close" msgstr "Zatvoriť" @@ -593,10 +663,15 @@ msgstr "Pridať ďalší %(model)s" #, python-format msgid "Delete selected %(model)s" -msgstr "Zmazať vybrané %(model)s" +msgstr "Odstrániť vybrané %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ďakujeme za čas strávený na našich stránkach." +#, python-format +msgid "View selected %(model)s" +msgstr "Zobraziť vybrané %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" +"Ďakujeme, že ste dnes strávili pár pekných okamihov na tejto webovej stránke." msgid "Log in again" msgstr "Znova sa prihlásiť" @@ -608,7 +683,7 @@ msgid "Your password was changed." msgstr "Vaše heslo bolo zmenené." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Z bezpečnostných dôvodov zadajte staré heslo a potom nové heslo dvakrát, aby " @@ -646,17 +721,17 @@ msgstr "" "použitý. Prosím, požiadajte znovu o obnovu hesla." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Čoskoro by ste mali dostať inštrukcie pre nastavenie hesla, ak existuje " -"konto s emailom, ktorý ste zadali. " +"Poslali sme vám e-mailom inštrukcie pre nastavenie hesla, ak existuje konto " +"so zadanou emailovou adresou. Čoskoro by ste ich mali dostať." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Ak ste nedostali email, uistite sa, že ste zadali adresu, s ktorou ste sa " +"Ak vám nepríde e-mail, uistite sa, že ste zadali adresu, s ktorou ste sa " "registrovali a skontrolujte svoj spamový priečinok." #, python-format @@ -670,8 +745,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Prosím, choďte na túto stránku a zvoľte si nové heslo:" -msgid "Your username, in case you've forgotten:" -msgstr "Vaše používateľské meno, pre prípad, že ste ho zabudli:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Ak ste náhodou zabudli, vaše používateľské meno je:" msgid "Thanks for using our site!" msgstr "Ďakujeme, že používate našu stránku!" @@ -681,10 +756,10 @@ msgid "The %(site_name)s team" msgstr "Tím %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Zabudli ste heslo? Zadajte svoju e-mailovú adresu a my vám pošleme " +"Zabudli ste heslo? Zadajte vašu e-mailovú adresu nižšie a my vám pošleme " "inštrukcie pre nastavenie nového hesla." msgid "Email address:" @@ -693,6 +768,9 @@ msgstr "E-mailová adresa:" msgid "Reset my password" msgstr "Obnova môjho hesla" +msgid "Select all objects on this page for an action" +msgstr "Vybrať všetky objekty na tejto strane pre akciu" + msgid "All dates" msgstr "Všetky dátumy" @@ -702,11 +780,11 @@ msgstr "Vybrať %s" #, python-format msgid "Select %s to change" -msgstr "Vybrať \"%s\" na úpravu" +msgstr "Vybrať %s na úpravu" #, python-format msgid "Select %s to view" -msgstr "" +msgstr "Pre zobrazenie %s zvolte" msgid "Date:" msgstr "Dátum:" diff --git a/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo index 798ad96eed64..7e9530138b74 100644 Binary files a/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po index d703330d1fd2..e4b2fd45e2e4 100644 --- a/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sk/LC_MESSAGES/djangojs.po @@ -1,20 +1,22 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Adam Zahradník, 2023 # Dimitris Glezos , 2012 # Jannis Leidel , 2011 -# Juraj Bubniak , 2012 +# 18f25ad6fa9930fc67cb11aca9d16a27, 2012 # Marian Andre , 2012,2015 -# Martin Kosír, 2011 -# Martin Tóth , 2017 +# 29cf7e517570e1bc05a1509565db92ae_2a01508, 2011 +# Martin Tóth , 2017,2023 +# Peter Kuma, 2021 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Marian Andre \n" -"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Martin Tóth , 2017,2023\n" +"Language-Team: Slovak (http://app.transifex.com/django/django/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,7 +34,7 @@ msgid "" "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" "Toto je zoznam dostupných %s. Pre výber je potrebné označiť ich v poli a " -"následne kliknutím na šípku \"Vybrať\" presunúť." +"následne kliknutím na šípku „Vybrať“ presunúť." #, javascript-format msgid "Type into this box to filter down the list of available %s." @@ -64,7 +66,11 @@ msgid "" "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" "Toto je zoznam dostupných %s. Pre vymazanie je potrebné označiť ich v poli a " -"následne kliknutím na šípku \"Vymazať\" vymazať." +"následne kliknutím na šípku „Vymazať“ vymazať." + +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Píšte do tohto poľa pre vyfiltrovanie označených %s." msgid "Remove all" msgstr "Odstrániť všetky" @@ -73,6 +79,14 @@ msgstr "Odstrániť všetky" msgid "Click to remove all chosen %s at once." msgstr "Kliknite sem pre vymazanie vybratých %s naraz." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s označená možnosť sa nezobrazuje" +msgstr[1] "%s označené možnosti sa nezobrazujú" +msgstr[2] "%s označených možností sa nezobrazuje" +msgstr[3] "%s označených možností sa nezobrazuje" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s z %(cnt)s vybrané" @@ -88,20 +102,20 @@ msgstr "" "akciu, vaše zmeny budú stratené." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Vybrali ste akciu, ale neuložili ste jednotlivé polia. Prosím, uložte zmeny " "kliknutím na OK. Akciu budete musieť vykonať znova." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Vybrali ste akciu, ale neurobili ste žiadne zmeny v jednotlivých poliach. " -"Pravdepodobne ste chceli použiť tlačidlo vykonať namiesto uložiť." +"Pravdepodobne ste chceli použiť tlačidlo Vykonať namiesto Uložiť." msgid "Now" msgstr "Teraz" @@ -191,6 +205,103 @@ msgstr "november" msgid "December" msgstr "december" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "máj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jún" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "júl" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec." + +msgid "Sunday" +msgstr "nedeľa" + +msgid "Monday" +msgstr "pondelok" + +msgid "Tuesday" +msgstr "utorok" + +msgid "Wednesday" +msgstr "streda" + +msgid "Thursday" +msgstr "štvrtok" + +msgid "Friday" +msgstr "piatok" + +msgid "Saturday" +msgstr "sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "ne" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "po" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "ut" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "st" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "št" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "pi" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "so" + msgctxt "one letter Sunday" msgid "S" msgstr "N" diff --git a/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo index 0085a30fb2ca..0c262d29286a 100644 Binary files a/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sl/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sl/LC_MESSAGES/django.po b/django/contrib/admin/locale/sl/LC_MESSAGES/django.po index d45425701ad7..399349839015 100644 --- a/django/contrib/admin/locale/sl/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sl/LC_MESSAGES/django.po @@ -1,25 +1,30 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Andrej Marsetič, 2022-2023 # Jannis Leidel , 2011 -# Primož Verdnik , 2017 -# zejn , 2013,2016 -# zejn , 2011-2013 +# Primoz Verdnik , 2017 +# zejn , 2013,2016 +# zejn , 2011-2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-04 07:05+0000\n" +"Last-Translator: Andrej Marsetič, 2022-2023\n" +"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" "sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Izbriši izbrano: %(verbose_name_plural)s" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -32,10 +37,6 @@ msgstr "Ni mogoče izbrisati %(name)s" msgid "Are you sure?" msgstr "Ste prepričani?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Izbriši izbrano: %(verbose_name_plural)s" - msgid "Administration" msgstr "Administracija" @@ -72,6 +73,12 @@ msgstr "Brez datuma" msgid "Has date" msgstr "Z datumom" +msgid "Empty" +msgstr "Prazno" + +msgid "Not empty" +msgstr "Ni prazno" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -90,6 +97,15 @@ msgstr "Dodaj še en %(verbose_name)s" msgid "Remove" msgstr "Odstrani" +msgid "Addition" +msgstr "Dodatek" + +msgid "Change" +msgstr "Spremeni" + +msgid "Deletion" +msgstr "Izbris" + msgid "action time" msgstr "čas dejanja" @@ -103,7 +119,7 @@ msgid "object id" msgstr "id objekta" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "predstavitev objekta" @@ -120,23 +136,23 @@ msgid "log entries" msgstr "dnevniški vnosi" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Dodan \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Spremenjen \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Izbrisan \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "Izbrisan “%(object)s.”" msgid "LogEntry Object" msgstr "Dnevniški vnos" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Dodan vnos {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Dodan {name} “{object}”." msgid "Added." msgstr "Dodano." @@ -145,16 +161,16 @@ msgid "and" msgstr "in" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Spremenjena polja {fields} za {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "" #, python-brace-format msgid "Changed {fields}." msgstr "Spremenjena polja {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Izbrisan vnos {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr "Izbrisan {name} “{object}”." msgid "No fields changed." msgstr "Nobeno polje ni bilo spremenjeno." @@ -162,45 +178,42 @@ msgstr "Nobeno polje ni bilo spremenjeno." msgid "None" msgstr "Brez vrednosti" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "Držite \"Control\" (ali \"Command\" na Mac-u) za izbiro več kot enega." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" + +msgid "Select this object for an action - {}" +msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully." +msgstr "" + +msgid "You may edit it again below." msgstr "" -"Vnos {name} \"{obj}\" je bil uspešno dodan. Lahko ga znova uredite spodaj." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" -"Vnos {name} \"{obj}\" je bil uspešno dodan. Lahko dodate še en {name} spodaj." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "Vnos {name} \"{obj}\" je bil uspešno dodan." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" -"Vnos {name} \"{obj}\" je bil uspešno spremenjen. Lahko ga znova uredite " -"spodaj." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" -"Vnos {name} \"{obj}\" je bil uspešno spremenjen. Spodaj lahko dodate nov " -"vnos {name}." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "Vnos {name} \"{obj}\" je bil uspešno spremenjen." +msgid "The {name} “{obj}” was changed successfully." +msgstr "" msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -213,12 +226,12 @@ msgid "No action selected." msgstr "Brez dejanja." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" je bil uspešno izbrisan." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s s ključem \"%(key)s\" ne obstaja. Morda je bil izbrisan?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" #, python-format msgid "Add %s" @@ -228,6 +241,10 @@ msgstr "Dodaj %s" msgid "Change %s" msgstr "Spremeni %s" +#, python-format +msgid "View %s" +msgstr "Pogled %s" + msgid "Database error" msgstr "Napaka v podatkovni bazi" @@ -255,8 +272,9 @@ msgstr "0 od %(cnt)s izbranih" msgid "Change history: %s" msgstr "Zgodovina sprememb: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -288,7 +306,7 @@ msgstr "Administracija %(app)s" msgid "Page not found" msgstr "Strani ni mogoče najti" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Opravičujemo se, a zahtevane strani ni mogoče najti." msgid "Home" @@ -304,11 +322,12 @@ msgid "Server Error (500)" msgstr "Napaka na strežniku (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Prišlo je do nepričakovane napake. Napaka je bila javljena administratorjem " -"spletne strani in naj bi jo v kratkem odpravili. Hvala za potrpljenje." +"Prišlo je do nepričakovane napake. Napaka je bila preko e-pošte javljena " +"administratorjem spletne strani in naj bo bila v kratkem odpravljena. Hvala " +"za potrpljenje." msgid "Run the selected action" msgstr "Izvedi izbrano dejanje" @@ -326,12 +345,28 @@ msgstr "Izberi vse %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Počisti izbiro" +msgid "Breadcrumbs" +msgstr "Navigacijska sled" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Model v %(name)s aplikaciji" + +msgid "Add" +msgstr "Dodaj" + +msgid "View" +msgstr "Pogled" + +msgid "You don’t have permission to view or edit anything." +msgstr "Nimate dovoljenja za ogled ali urejanje česarkoli." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Najprej vpišite uporabniško ime in geslo, nato boste lahko urejali druge " -"lastnosti uporabnika." +"Najprej vnesite uporabniško ime in geslo. Nato boste lahko urejali več " +"uporabniških možnosti." msgid "Enter a username and password." msgstr "Vnesite uporabniško ime in geslo." @@ -340,15 +375,19 @@ msgid "Change password" msgstr "Spremeni geslo" msgid "Please correct the error below." -msgstr "Prosimo, odpravite sledeče napake." - -msgid "Please correct the errors below." -msgstr "Prosimo popravite spodnje napake." +msgid_plural "Please correct the errors below." +msgstr[0] "Popravite spodnjo napako." +msgstr[1] "Prosim popravite spodnji napaki." +msgstr[2] "Prosim popravite spodnje napake." +msgstr[3] "Prosim popravite spodnje napake." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Vpišite novo geslo za uporabnika %(username)s." +msgid "Skip to main content" +msgstr "Preskoči na glavno vsebino" + msgid "Welcome," msgstr "Dobrodošli," @@ -374,6 +413,15 @@ msgstr "Poglej na strani" msgid "Filter" msgstr "Filter" +msgid "Hide counts" +msgstr "" + +msgid "Show counts" +msgstr "" + +msgid "Clear all filters" +msgstr "Počisti vse filtre" + msgid "Remove from sorting" msgstr "Odstrani iz razvrščanja" @@ -384,6 +432,15 @@ msgstr "Prioriteta razvrščanja: %(priority_number)s" msgid "Toggle sorting" msgstr "Preklopi razvrščanje" +msgid "Toggle theme (current theme: auto)" +msgstr "Preklopi temo (trenutna tema: samodejno)" + +msgid "Toggle theme (current theme: light)" +msgstr "Preklopi temo (trenutna tema: svetla)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Preklop teme (trenutna tema: temna)" + msgid "Delete" msgstr "Izbriši" @@ -415,8 +472,8 @@ msgstr "" msgid "Objects" msgstr "Objekti" -msgid "Yes, I'm sure" -msgstr "Ja, prepričan sem" +msgid "Yes, I’m sure" +msgstr "Da, prepričan sem" msgid "No, take me back" msgstr "Ne, vrni me nazaj" @@ -450,9 +507,6 @@ msgstr "" "Ali res želite izbrisati izbrane %(objects_name)s? Vsi naslednji objekti in " "njihovi povezani vnosi bodo izbrisani:" -msgid "Change" -msgstr "Spremeni" - msgid "Delete?" msgstr "Izbrišem?" @@ -463,16 +517,6 @@ msgstr " Po %(filter_title)s " msgid "Summary" msgstr "Povzetek" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Model v %(name)s aplikaciji" - -msgid "Add" -msgstr "Dodaj" - -msgid "You don't have permission to edit anything." -msgstr "Nimate dovoljenja za urejanje česarkoli." - msgid "Recent actions" msgstr "Nedavna dejanja" @@ -482,17 +526,23 @@ msgstr "Moja dejanja" msgid "None available" msgstr "Ni na voljo" +msgid "Added:" +msgstr "" + +msgid "Changed:" +msgstr "" + +msgid "Deleted:" +msgstr "" + msgid "Unknown content" msgstr "Neznana vsebina" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Nekaj je narobe z namestitvijo vaše podatkovne baze. Preverite, da so bile " -"ustvarjene prave tabele v podatkovni bazi in da je dostop do branja baze " -"omogočen pravemu uporabniku." #, python-format msgid "" @@ -505,6 +555,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Ste pozabili geslo ali uporabniško ime?" +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Sidebar" +msgstr "Stranska vrstica" + +msgid "Start typing to filter…" +msgstr "Za filtriranje začnite tipkati ..." + +msgid "Filter navigation items" +msgstr "Filtrirajte navigacijske elemente" + msgid "Date/time" msgstr "Datum/čas" @@ -514,12 +576,17 @@ msgstr "Uporabnik" msgid "Action" msgstr "Dejanje" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Ta objekt nima zgodovine sprememb. Verjetno ni bil dodan preko te strani za " -"administracijo." msgid "Show all" msgstr "Prikaži vse" @@ -527,20 +594,8 @@ msgstr "Prikaži vse" msgid "Save" msgstr "Shrani" -msgid "Popup closing..." -msgstr "Zapiram pojavno okno ..." - -#, python-format -msgid "Change selected %(model)s" -msgstr "Spremeni izbran %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "Dodaj še en %(model)s " - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Izbriši izbran %(model)s" +msgid "Popup closing…" +msgstr "" msgid "Search" msgstr "Išči" @@ -566,7 +621,29 @@ msgstr "Shrani in dodaj še eno" msgid "Save and continue editing" msgstr "Shrani in nadaljuj z urejanjem" -msgid "Thanks for spending some quality time with the Web site today." +msgid "Save and view" +msgstr "Shrani in poglej" + +msgid "Close" +msgstr "Zapri" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Spremeni izbran %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "Dodaj še en %(model)s " + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Izbriši izbran %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "Poglej izbran %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Hvala, ker ste si danes vzeli nekaj časa za to spletno stran." msgid "Log in again" @@ -579,11 +656,11 @@ msgid "Your password was changed." msgstr "Vaše geslo je bilo spremenjeno." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo, da se " -"izognete tipkarskim napakam." +"Zaradi varnosti vnesite svoje staro geslo in nato dvakrat vnesite novo " +"geslo, da bomo lahko preverili, ali ste ga pravilno vnesli." msgid "Change my password" msgstr "Spremeni moje geslo" @@ -616,18 +693,18 @@ msgstr "" "uporabljena. Prosimo zahtevajte novo ponastavitev gesla." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"Če obstaja račun z navedenim e-poštnim naslovom, smo vam prek epošte poslali " -"navodila za nastavitev vašega gesla. Prejeti bi jih morali v kratkem." +"Po e-pošti smo vam poslali navodila za nastavitev gesla, če obstaja račun z " +"e-pošto, ki ste jo vnesli. Prejeti bi jih morali kmalu." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Če e-pošte niste prejeli, prosimo preverite, da ste vnesli pravilen e-poštni " -"naslov in preverite nezaželeno pošto." +"Če ne prejmete e-poštnega sporočila, preverite, ali ste vnesli naslov, s " +"katerim ste se registrirali, in preverite mapo z vsiljeno pošto." #, python-format msgid "" @@ -640,8 +717,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Prosimo pojdite na sledečo stran in izberite novo geslo:" -msgid "Your username, in case you've forgotten:" -msgstr "Vaše uporabniško ime (za vsak primer):" +msgid "Your username, in case you’ve forgotten:" +msgstr "Vaše uporabniško ime, če ste ga pozabili:" msgid "Thanks for using our site!" msgstr "Hvala, ker uporabljate našo stran!" @@ -651,11 +728,11 @@ msgid "The %(site_name)s team" msgstr "Ekipa strani %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Ste pozabili geslo? Vnesite vaš e-poštni naslov in poslali vam bomo navodila " -"za ponastavitev gesla." +"Ste pozabili geslo? Spodaj vnesite svoj e-poštni naslov in poslali vam bomo " +"navodila za nastavitev novega." msgid "Email address:" msgstr "E-poštni naslov:" @@ -663,6 +740,9 @@ msgstr "E-poštni naslov:" msgid "Reset my password" msgstr "Ponastavi moje geslo" +msgid "Select all objects on this page for an action" +msgstr "" + msgid "All dates" msgstr "Vsi datumi" @@ -674,6 +754,10 @@ msgstr "Izberite %s" msgid "Select %s to change" msgstr "Izberite %s, ki ga želite spremeniti" +#, python-format +msgid "Select %s to view" +msgstr "" + msgid "Date:" msgstr "Datum:" diff --git a/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo index 255885ed28a0..f01b6b48ce4a 100644 Binary files a/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po index 35ab1ce75654..08a77f67ec71 100644 --- a/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sl/LC_MESSAGES/djangojs.po @@ -1,24 +1,25 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Andrej Marsetič, 2022,2024 # Jannis Leidel , 2011 -# zejn , 2016 -# zejn , 2011-2012 +# zejn , 2016 +# zejn , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Primož Verdnik \n" -"Language-Team: Slovenian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:59+0000\n" +"Last-Translator: Andrej Marsetič, 2022,2024\n" +"Language-Team: Slovenian (http://app.transifex.com/django/django/language/" "sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3);\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3);\n" #, javascript-format msgid "Available %s" @@ -64,6 +65,10 @@ msgstr "" "To je seznam možnih %s. Odvečne lahko odstranite z izbiro v okvirju in " "klikom na puščico \"Odstrani\" med okvirjema." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Vnesite v to polje, da filtrirate seznam izbranih %s ." + msgid "Remove all" msgstr "Odstrani vse" @@ -71,6 +76,14 @@ msgstr "Odstrani vse" msgid "Click to remove all chosen %s at once." msgstr "Kliknite za odstranitev vseh %s hkrati." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] " %s izbrana možnosti ni vidna" +msgstr[1] " %s izbrani možnosti nista vidni" +msgstr[2] " %s izbrane možnosti niso vidne" +msgstr[3] " %s izbrane možnosti niso vidne" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s od %(cnt)s izbranih" @@ -86,21 +99,35 @@ msgstr "" "primeru nadaljevanja bodo neshranjene spremembe trajno izgubljene." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Izbrali ste dejanje, vendar niste shranili sprememb na posameznih poljih. " -"Kliknite na 'V redu', da boste shranili. Dejanje boste morali ponovno " -"izvesti." +"Izbrali ste dejanje, vendar še niste shranili sprememb posameznih polj. Za " +"shranjevanje kliknite V redu. Akcijo boste morali ponovno zagnati." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Izbrali ste dejanje, vendar niste naredili nobenih sprememb na posameznih " -"poljih. Verjetno iščete gumb Pojdi namesto Shrani." +"Izbrali ste dejanje in niste spremenili posameznih polj. Verjetno iščete " +"gumb Pojdi in ne gumb Shrani." + +msgid "Now" +msgstr "Takoj" + +msgid "Midnight" +msgstr "Polnoč" + +msgid "6 a.m." +msgstr "Ob 6h" + +msgid "Noon" +msgstr "Opoldne" + +msgid "6 p.m." +msgstr "Ob 18h" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -118,27 +145,12 @@ msgstr[1] "Opomba: glede na čas na strežniku ste %s uri zadaj." msgstr[2] "Opomba: glede na čas na strežniku ste %s ure zadaj." msgstr[3] "Opomba: glede na čas na strežniku ste %s ur zadaj." -msgid "Now" -msgstr "Takoj" - msgid "Choose a Time" msgstr "Izberite čas" msgid "Choose a time" msgstr "Izbor časa" -msgid "Midnight" -msgstr "Polnoč" - -msgid "6 a.m." -msgstr "Ob 6h" - -msgid "Noon" -msgstr "Opoldne" - -msgid "6 p.m." -msgstr "Ob 18h" - msgid "Cancel" msgstr "Prekliči" @@ -190,6 +202,103 @@ msgstr "november" msgid "December" msgstr "december" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dec" + +msgid "Sunday" +msgstr "Nedelja" + +msgid "Monday" +msgstr "Ponedeljek" + +msgid "Tuesday" +msgstr "Torek" + +msgid "Wednesday" +msgstr "Sreda" + +msgid "Thursday" +msgstr "Četrtek" + +msgid "Friday" +msgstr "Petek" + +msgid "Saturday" +msgstr "Sobota" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Ned" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pon" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Tor" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Sre" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Čet" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pet" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sob" + msgctxt "one letter Sunday" msgid "S" msgstr "N" @@ -217,9 +326,3 @@ msgstr "P" msgctxt "one letter Saturday" msgid "S" msgstr "S" - -msgid "Show" -msgstr "Prikaži" - -msgid "Hide" -msgstr "Skrij" diff --git a/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo index 111a4737b7ba..292f2cb3ec4f 100644 Binary files a/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sq/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sq/LC_MESSAGES/django.po b/django/contrib/admin/locale/sq/LC_MESSAGES/django.po index 40a8214c43a6..9e571d047deb 100644 --- a/django/contrib/admin/locale/sq/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sq/LC_MESSAGES/django.po @@ -1,16 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Besnik , 2011,2015 -# Besnik , 2015,2018-2019 +# Besnik Bleta , 2011,2015 +# Besnik Bleta , 2020,2022-2024 +# Besnik Bleta , 2015,2018-2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-18 09:47+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Besnik Bleta , 2020,2022-2024\n" +"Language-Team: Albanian (http://app.transifex.com/django/django/language/" "sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +19,10 @@ msgstr "" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "U fshinë me sukses %(count)d %(items)s." @@ -29,10 +34,6 @@ msgstr "S’mund të fshijë %(name)s" msgid "Are you sure?" msgstr "Jeni i sigurt?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Fshiji %(verbose_name_plural)s e përzgjedhur" - msgid "Administration" msgstr "Administrim" @@ -69,6 +70,12 @@ msgstr "Pa datë" msgid "Has date" msgstr "Ka datë" +msgid "Empty" +msgstr "E zbrazët" + +msgid "Not empty" +msgstr "Jo e zbrazët" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -174,6 +181,9 @@ msgstr "" "Që të përzgjidhni më shumë se një, mbani të shtypur “Control”, ose “Command” " "në një Mac." +msgid "Select this object for an action - {}" +msgstr "Përzgjidheni këtë objekt për një veprim - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” u shtua me sukses." @@ -193,10 +203,6 @@ msgid "" msgstr "" "{name} “{obj}” u ndryshua me sukses. Mund ta përpunoni sërish më poshtë." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "{name} “{obj}” u shtua me sukses. Mund ta përpunoni sërish më poshtë." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -261,8 +267,9 @@ msgstr "0 nga %(cnt)s të përzgjedhur" msgid "Change history: %s" msgstr "Ndryshoni historikun: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -330,7 +337,23 @@ msgid "Select all %(total_count)s %(module_name)s" msgstr "Përzgjidhni krejt %(total_count)s %(module_name)s" msgid "Clear selection" -msgstr "Pastroje përzgjedhjen" +msgstr "Spastroje përzgjedhjen" + +msgid "Breadcrumbs" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modele te aplikacioni %(name)s" + +msgid "Add" +msgstr "Shtoni" + +msgid "View" +msgstr "Shiheni" + +msgid "You don’t have permission to view or edit anything." +msgstr "S’keni leje të shihni apo të përpunoni gjë." msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " @@ -345,17 +368,35 @@ msgstr "Jepni emër përdoruesi dhe fjalëkalim." msgid "Change password" msgstr "Ndryshoni fjalëkalimin" -msgid "Please correct the error below." -msgstr "Ju lutemi, ndreqni gabimin më poshtë." +msgid "Set password" +msgstr "Caktoni fjalëkalim" -msgid "Please correct the errors below." -msgstr "Ju lutemi, ndreqni gabimet më poshtë." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Ju lutemi, ndreqni gabimin më poshtë." +msgstr[1] "Ju lutemi, ndreqni gabimet më poshtë." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" "Jepni një fjalëkalim të ri për përdoruesin %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Ky veprim do të aktivizojë për këtë përdorues mirëfilltësim " +"me bazë fjalëkalimin." + +msgid "Disable password-based authentication" +msgstr "Çaktivizo mirëfilltësim me bazë fjalëkalimin" + +msgid "Enable password-based authentication" +msgstr "Aktivizo mirëfilltësim me bazë fjalëkalimin" + +msgid "Skip to main content" +msgstr "Kalo te lënda bazë" + msgid "Welcome," msgstr "Mirë se vini," @@ -381,6 +422,15 @@ msgstr "Shiheni në sajt" msgid "Filter" msgstr "Filtër" +msgid "Hide counts" +msgstr "Fshihi numrat" + +msgid "Show counts" +msgstr "Shfaqi numrat" + +msgid "Clear all filters" +msgstr "Spastroji krejt filtrat" + msgid "Remove from sorting" msgstr "Hiqe prej renditjeje" @@ -391,6 +441,15 @@ msgstr "Përparësi renditjesh: %(priority_number)s" msgid "Toggle sorting" msgstr "Shfaq/fshih renditjen" +msgid "Toggle theme (current theme: auto)" +msgstr "Ndërroni temën (temë e tanishme: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Ndërroni temën (temë e tanishme: e çelët)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Ndërroni temën (temë e tanishme: e errët)" + msgid "Delete" msgstr "Fshije" @@ -458,9 +517,6 @@ msgstr "" "Jeni i sigurt se doni të fshihen %(objects_name)s e përzgjedhur? Krejt " "objektet vijues dhe gjëra të lidhura me ta do të fshihen:" -msgid "View" -msgstr "Shiheni" - msgid "Delete?" msgstr "Të fshihet?" @@ -471,16 +527,6 @@ msgstr " Nga %(filter_title)s " msgid "Summary" msgstr "Përmbledhje" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modele te aplikacioni %(name)s" - -msgid "Add" -msgstr "Shtoni" - -msgid "You don’t have permission to view or edit anything." -msgstr "S’keni leje të shihni apo të përpunoni gjë." - msgid "Recent actions" msgstr "Veprime së fundi" @@ -490,6 +536,15 @@ msgstr "Veprimet e mia" msgid "None available" msgstr "Asnjë i passhëm" +msgid "Added:" +msgstr "U shtua më:" + +msgid "Changed:" +msgstr "U ndryshua më:" + +msgid "Deleted:" +msgstr "U fshi më:" + msgid "Unknown content" msgstr "Lëndë e panjohur" @@ -513,6 +568,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Harruat fjalëkalimin ose emrin tuaj të përdoruesit?" +msgid "Toggle navigation" +msgstr "Shfaqni/fshihni lëvizjen" + +msgid "Sidebar" +msgstr "Anështyllë" + +msgid "Start typing to filter…" +msgstr "Që të bëhet filtrim, filloni të shtypni…" + +msgid "Filter navigation items" +msgstr "Filtroni elementë lëvizjeje" + msgid "Date/time" msgstr "Datë/kohë" @@ -522,6 +589,11 @@ msgstr "Përdorues" msgid "Action" msgstr "Veprim" +msgid "entry" +msgid_plural "entries" +msgstr[0] "zë" +msgstr[1] "zëra" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -578,8 +650,12 @@ msgstr "Shtoni një %(model)s tjetër" msgid "Delete selected %(model)s" msgstr "Fshije %(model)s e përzgjedhur" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Faleminderit që shpenzoni sot pak kohë të çmuar me sajtin Web." +#, python-format +msgid "View selected %(model)s" +msgstr "Shihni %(model)s e përzgjedhur" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Faleminderit që harxhoni pak kohë me sajtin sot." msgid "Log in again" msgstr "Hyni sërish" @@ -680,6 +756,9 @@ msgstr "Adresë email:" msgid "Reset my password" msgstr "Ricakto fjalëkalimin tim" +msgid "Select all objects on this page for an action" +msgstr "Përzgjidhni për një veprim krejt objektet në këtë faqe" + msgid "All dates" msgstr "Krejt datat" diff --git a/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo index 230c8a99da03..a1c8182bd9f7 100644 Binary files a/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po index 163c24117cad..bda26157a54f 100644 --- a/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sq/LC_MESSAGES/djangojs.po @@ -1,16 +1,17 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Besnik , 2011-2012,2015 -# Besnik , 2015,2017 +# Besnik Bleta , 2011-2012,2015 +# Besnik Bleta , 2020-2023 +# Besnik Bleta , 2015,2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-11-29 22:17+0000\n" -"Last-Translator: Besnik \n" -"Language-Team: Albanian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Besnik Bleta , 2020-2023\n" +"Language-Team: Albanian (http://app.transifex.com/django/django/language/" "sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -64,6 +65,10 @@ msgstr "" "kutiza më poshtë e mandej duke klikuar mbi shigjetën \"Hiqe\" mes dy " "kutizave." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Shtypni në këtë kuadrat, që të filtroni listën e %s të përzgjedhur." + msgid "Remove all" msgstr "Hiqi krejt" @@ -71,6 +76,12 @@ msgstr "Hiqi krejt" msgid "Click to remove all chosen %s at once." msgstr "Klikoni që të hiqen krejt %s e zgjedhura njëherësh." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s mundësi e përzgjedhur jo e dukshme" +msgstr[1] "%s mundësi të përzgjedhura jo të dukshme" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "U përzgjodh %(sel)s nga %(cnt)s" @@ -84,17 +95,17 @@ msgstr "" "kryeni një veprim, ndryshimet e paruajtura do të humbin." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Keni përzgjedhur një veprim, por nuk keni ruajtur ende ndryshimet që bëtë te " +"Keni përzgjedhur një veprim, por s’keni ruajtur ende ndryshimet që bëtë te " "fusha individuale. Ju lutemi, klikoni OK që të bëhet ruajtja. Do t’ju duhet " "ta ribëni veprimin." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Keni përzgjedhur një veprim, dhe nuk keni bërë ndonjë ndryshim te fusha " @@ -185,6 +196,103 @@ msgstr "Nëntor" msgid "December" msgstr "Dhjetor" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Shk" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Pri" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Qer" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Kor" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Gus" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Sht" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Tet" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Nën" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Dhje" + +msgid "Sunday" +msgstr "E diel" + +msgid "Monday" +msgstr "E hënë" + +msgid "Tuesday" +msgstr "E martë" + +msgid "Wednesday" +msgstr "E mërkurë" + +msgid "Thursday" +msgstr "E enjte" + +msgid "Friday" +msgstr "E premte" + +msgid "Saturday" +msgstr "E shtunë" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Die" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Hën" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Mar" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Mër" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Enj" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Pre" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Sht" + msgctxt "one letter Sunday" msgid "S" msgstr "D" diff --git a/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo index 16d4e9db2944..f794a8ccad27 100644 Binary files a/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sr/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sr/LC_MESSAGES/django.po b/django/contrib/admin/locale/sr/LC_MESSAGES/django.po index ad5c35dc15f6..1c9d7f945bfc 100644 --- a/django/contrib/admin/locale/sr/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sr/LC_MESSAGES/django.po @@ -2,24 +2,28 @@ # # Translators: # Branko Kokanovic , 2018 -# Igor Jerosimić, 2019 +# Igor Jerosimić, 2019,2021,2023-2024 # Jannis Leidel , 2011 # Janos Guljas , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-06-27 19:30+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Igor Jerosimić, 2019,2021,2023-2024\n" +"Language-Team: Serbian (http://app.transifex.com/django/django/language/" "sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Бриши означене објекте класе %(verbose_name_plural)s" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -32,10 +36,6 @@ msgstr "Несуспело брисање %(name)s" msgid "Are you sure?" msgstr "Да ли сте сигурни?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Бриши означене објекте класе %(verbose_name_plural)s" - msgid "Administration" msgstr "Администрација" @@ -72,6 +72,12 @@ msgstr "Нема датума" msgid "Has date" msgstr "Има датум" +msgid "Empty" +msgstr "Празно" + +msgid "Not empty" +msgstr "Није празно" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -129,22 +135,22 @@ msgid "log entries" msgstr "записи у логовима" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "Додат објекат класе „%(object)s“." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" msgstr "Промењен објекат класе „%(object)s“ - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "Уклоњен објекат класе „%(object)s“." msgid "LogEntry Object" msgstr "Објекат уноса лога" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "Додат објекат {name} \"{object}\"." msgid "Added." @@ -154,7 +160,7 @@ msgid "and" msgstr "и" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "Измењена поља {fields} за {name} \"{object}\"." #, python-brace-format @@ -162,7 +168,7 @@ msgid "Changed {fields}." msgstr "Измењена поља {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "Обрисан објекат {name} \"{object}\"." msgid "No fields changed." @@ -171,14 +177,16 @@ msgstr "Без измена у пољима." msgid "None" msgstr "Ништа" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" "Држите „Control“, или „Command“ на Mac-у да бисте обележили више од једне " "ставке." +msgid "Select this object for an action - {}" +msgstr "Изабери овај објекат за радњу - {}" + #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "Објекат {name} \"{obj}\" успешно додат." msgid "You may edit it again below." @@ -186,32 +194,26 @@ msgstr "Можете га изменити опет испод" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" "Објекат {name} \"{obj}\" успешно додат. Можете додати још један {name} испод." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" "Објекат {name} \"{obj}\" успешно измењен. Можете га опет изменити испод." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "Објекат {name} \"{obj}\" успешно додат. Испод га можете изменити." - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" "Објекат {name} \"{obj}\" успешно измењен. Можете додати још један {name} " "испод." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "Објекат {name} \"{obj}\" успешно измењен." msgid "" @@ -225,11 +227,11 @@ msgid "No action selected." msgstr "Није изабрана ниједна акција." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Објекат „%(obj)s“ класе %(name)s успешно је обрисан." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "Објекат „%(obj)s“ класе %(name)s је успешно обрисан." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "%(name)s са идентификацијом \"%(key)s\" не постоји. Можда је избрисан?" #, python-format @@ -269,8 +271,9 @@ msgstr "0 од %(cnt)s изабрано" msgid "Change history: %s" msgstr "Историјат измена: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -302,7 +305,7 @@ msgstr "%(app)s администрација" msgid "Page not found" msgstr "Страница није пронађена" -msgid "We're sorry, but the requested page could not be found." +msgid "We’re sorry, but the requested page could not be found." msgstr "Жао нам је, тражена страница није пронађена." msgid "Home" @@ -318,7 +321,7 @@ msgid "Server Error (500)" msgstr "Грешка на серверу (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Десила се грешка. Пријављена је администраторима сајта преко е-поште и " @@ -340,8 +343,24 @@ msgstr "Изабери све %(module_name)s од %(total_count)s укупно. msgid "Clear selection" msgstr "Поништи избор" +msgid "Breadcrumbs" +msgstr "Мрвице" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Модели у апликацији %(name)s" + +msgid "Add" +msgstr "Додај" + +msgid "View" +msgstr "Преглед" + +msgid "You don’t have permission to view or edit anything." +msgstr "Немате дозволе да погледате или измените било шта." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" "Прво унесите корисничко име и лозинку. Потом ћете моћи да мењате још " @@ -353,16 +372,35 @@ msgstr "Унесите корисничко име и лозинку" msgid "Change password" msgstr "Промена лозинке" -msgid "Please correct the error below." -msgstr "Молимо исправите грешку испод." +msgid "Set password" +msgstr "Постави лозинку" -msgid "Please correct the errors below." -msgstr "Исправите грешке испод." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Молимо исправите грешку испод." +msgstr[1] "Молимо исправите грешке испод." +msgstr[2] "Молимо исправите грешке испод." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Унесите нову лозинку за корисника %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +" Ова акција ћеомогућити аутентификацију засновану на " +"лозинки за овог корисника." + +msgid "Disable password-based authentication" +msgstr "Онемогући аутентификацију засновану на лозинки" + +msgid "Enable password-based authentication" +msgstr "Омогући аутентификацију засновану на лозинки" + +msgid "Skip to main content" +msgstr "Пређи на главни садржај" + msgid "Welcome," msgstr "Добродошли," @@ -388,6 +426,15 @@ msgstr "Преглед на сајту" msgid "Filter" msgstr "Филтер" +msgid "Hide counts" +msgstr "Сакриј бројање" + +msgid "Show counts" +msgstr "Прикажи бројање" + +msgid "Clear all filters" +msgstr "Обриши све филтере" + msgid "Remove from sorting" msgstr "Избаци из сортирања" @@ -398,6 +445,15 @@ msgstr "Приоритет сортирања: %(priority_number)s" msgid "Toggle sorting" msgstr "Укључи/искључи сортирање" +msgid "Toggle theme (current theme: auto)" +msgstr "Укључи/искључи тему (тренутна тема: ауто)" + +msgid "Toggle theme (current theme: light)" +msgstr "Укључи/искључи тему (тренутна тема: светла)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Укључи/искључи тему (тренутна тема: тамна)" + msgid "Delete" msgstr "Обриши" @@ -430,7 +486,7 @@ msgstr "" msgid "Objects" msgstr "Објекти" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Да, сигуран сам" msgid "No, take me back" @@ -465,9 +521,6 @@ msgstr "" "Да ли сте сигурни да желите да избришете изабране %(objects_name)s? Сви " "следећи објекти и објекти са њима повезани ће бити избрисани:" -msgid "View" -msgstr "Преглед" - msgid "Delete?" msgstr "Брисање?" @@ -478,16 +531,6 @@ msgstr " %(filter_title)s " msgid "Summary" msgstr "Сумарно" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Модели у апликацији %(name)s" - -msgid "Add" -msgstr "Додај" - -msgid "You don't have permission to view or edit anything." -msgstr "Немате дозвола да погледате или измените ништа." - msgid "Recent actions" msgstr "Скорашње акције" @@ -497,11 +540,20 @@ msgstr "Моје акције" msgid "None available" msgstr "Нема података" +msgid "Added:" +msgstr "Додато:" + +msgid "Changed:" +msgstr "Измењено:" + +msgid "Deleted:" +msgstr "Обрисано:" + msgid "Unknown content" msgstr "Непознат садржај" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -519,6 +571,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Заборавили сте лозинку или корисничко име?" +msgid "Toggle navigation" +msgstr "Укључи/искључи мени" + +msgid "Sidebar" +msgstr "Бочна трака" + +msgid "Start typing to filter…" +msgstr "Почните да куцате да бисте филтрирали…" + +msgid "Filter navigation items" +msgstr "Филтрирајте ставке навигације" + msgid "Date/time" msgstr "Датум/време" @@ -528,8 +592,14 @@ msgstr "Корисник" msgid "Action" msgstr "Радња" +msgid "entry" +msgid_plural "entries" +msgstr[0] "унос" +msgstr[1] "уноса" +msgstr[2] "уноса" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Овај објекат нема забележен историјат измена. Вероватно није додат кроз овај " @@ -585,7 +655,11 @@ msgstr "Додај још један модел %(model)s" msgid "Delete selected %(model)s" msgstr "Обриши одабрани модел %(model)s" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "Изабран приказ %(model)s" + +msgid "Thanks for spending some quality time with the web site today." msgstr "Хвала што сте данас провели време на овом сајту." msgid "Log in again" @@ -598,7 +672,7 @@ msgid "Your password was changed." msgstr "Ваша лозинка је измењена." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Из безбедносних разлога прво унесите своју стару лозинку, а нову затим " @@ -637,18 +711,18 @@ msgstr "" "искоришћен. Поново затражите ресетовање лозинке." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "Послали смо Вам упутства за постављање лозинке, уколико налог са овом " "адресом постоји. Требало би да их добијете ускоро." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "Ако не добијете поруку, проверите да ли сте унели добру адресу са којом сте " -"се и регистровали и проверите спам фасциклу." +"се и регистровали и проверите фасциклу за нежељену пошту." #, python-format msgid "" @@ -661,8 +735,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Идите на следећу страницу и поставите нову лозинку." -msgid "Your username, in case you've forgotten:" -msgstr "Уколико сте заборавили, ваше корисничко име:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Ваше корисничко име, уколико сте заборавили:" msgid "Thanks for using our site!" msgstr "Хвала што користите наш сајт!" @@ -672,7 +746,7 @@ msgid "The %(site_name)s team" msgstr "Екипа сајта %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Заборавили сте лозинку? Унесите адресу е-поште испод и послаћемо Вам на њу " @@ -684,6 +758,9 @@ msgstr "Адреса е-поште:" msgid "Reset my password" msgstr "Ресетуј моју лозинку" +msgid "Select all objects on this page for an action" +msgstr "Изаберите све објекте на овој страници за радњу" + msgid "All dates" msgstr "Сви датуми" diff --git a/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo index 3c6ee7f7a7b8..bdd3fc35afe6 100644 Binary files a/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po index 325f7f4be368..98d95aec3562 100644 --- a/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sr/LC_MESSAGES/djangojs.po @@ -2,23 +2,24 @@ # # Translators: # Branko Kokanovic , 2018 +# Igor Jerosimić, 2021,2023 # Jannis Leidel , 2011 # Janos Guljas , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-01-30 10:24+0000\n" -"Last-Translator: Branko Kokanovic \n" -"Language-Team: Serbian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Igor Jerosimić, 2021,2023\n" +"Language-Team: Serbian (http://app.transifex.com/django/django/language/" "sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #, javascript-format msgid "Available %s" @@ -64,6 +65,10 @@ msgstr "" "Ово је листа изабраних „%s“. Можете уклонити елементе тако што ћете их " "изабрати у листи и кликнути на „Уклони“." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Унесите ово поље да бисте филтрирали листу изабраних %s." + msgid "Remove all" msgstr "Уклони све" @@ -71,6 +76,13 @@ msgstr "Уклони све" msgid "Click to remove all chosen %s at once." msgstr "Уклоните све изабране „%s“ одједном." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s изабрана опција није видљива" +msgstr[1] "%s изабране опције нису видљиве" +msgstr[2] "%s изабраних опција није видљиво" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s од %(cnt)s изабран" @@ -84,16 +96,21 @@ msgstr "" "Имате несачиване измене. Ако покренете акцију, измене ће бити изгубљене." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." -msgstr "Изабрали сте акцију али нисте сачували промене поља." +msgstr "" +"Изабрали сте акцију, али нисте сачували ваше промене у појединачна поља. " +"Кликните на OK да сачувате промене. Биће неопходно да поново покренете " +"акцију." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." -msgstr "Изабрали сте акцију али нисте изменили ни једно поље." +msgstr "" +"Изабрали сте акцију и нисте направили ниједну промену на појединачним " +"пољима. Вероватно тражите Крени дугме уместо Сачувај." msgid "Now" msgstr "Тренутно време" @@ -181,6 +198,103 @@ msgstr "Новембар" msgid "December" msgstr "Децембар" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "јан" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "феб" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "март" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "апр" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "мај" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "јун" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "јул" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "авг" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "сеп" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "окт" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "нов" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "дец" + +msgid "Sunday" +msgstr "недеља" + +msgid "Monday" +msgstr "понедељак" + +msgid "Tuesday" +msgstr "уторак" + +msgid "Wednesday" +msgstr "среда" + +msgid "Thursday" +msgstr "четвртак" + +msgid "Friday" +msgstr "петак" + +msgid "Saturday" +msgstr "субота" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "нед" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "пон" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "уто" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "сре" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "чет" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "пет" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "суб" + msgctxt "one letter Sunday" msgid "S" msgstr "Н" diff --git a/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo index 5cc9a7aefc55..1535c7199d52 100644 Binary files a/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po index 1290502735e8..ec4e06e6edc0 100644 --- a/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sr_Latn/LC_MESSAGES/djangojs.po @@ -1,115 +1,145 @@ # This file is distributed under the same license as the Django package. -# +# # Translators: -# Igor Jerosimić, 2019 +# Igor Jerosimić, 2019,2021,2023-2024 # Jannis Leidel , 2011 # Janos Guljas , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-06-27 19:12+0000\n" -"Last-Translator: Igor Jerosimić\n" -"Language-Team: Serbian (Latin) (http://www.transifex.com/django/django/" -"language/sr@latin/)\n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:59+0000\n" +"Last-Translator: Igor Jerosimić, 2019,2021,2023-2024\n" +"Language-Team: Serbian (Latin) (http://app.transifex.com/django/django/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sr@latin\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +#: contrib/admin/static/admin/js/SelectFilter2.js:38 #, javascript-format msgid "Available %s" msgstr "Dostupni %s" +#: contrib/admin/static/admin/js/SelectFilter2.js:44 #, javascript-format msgid "" "This is the list of available %s. You may choose some by selecting them in " "the box below and then clicking the \"Choose\" arrow between the two boxes." -msgstr "" -"Ovo je lista dostupnih „%s“. Možete izabrati elemente tako što ćete ih " -"izabrati u listi i kliknuti na „Izaberi“." +msgstr "Ovo je lista dostupnih „%s“. Možete izabrati elemente tako što ćete ih izabrati u listi i kliknuti na „Izaberi“." +#: contrib/admin/static/admin/js/SelectFilter2.js:60 #, javascript-format msgid "Type into this box to filter down the list of available %s." msgstr "Filtrirajte listu dostupnih elemenata „%s“." +#: contrib/admin/static/admin/js/SelectFilter2.js:65 +#: contrib/admin/static/admin/js/SelectFilter2.js:110 msgid "Filter" msgstr "Filter" +#: contrib/admin/static/admin/js/SelectFilter2.js:69 msgid "Choose all" msgstr "Izaberi sve" +#: contrib/admin/static/admin/js/SelectFilter2.js:69 #, javascript-format msgid "Click to choose all %s at once." msgstr "Izaberite sve „%s“ odjednom." +#: contrib/admin/static/admin/js/SelectFilter2.js:75 msgid "Choose" msgstr "Izaberi" +#: contrib/admin/static/admin/js/SelectFilter2.js:77 msgid "Remove" msgstr "Ukloni" +#: contrib/admin/static/admin/js/SelectFilter2.js:83 #, javascript-format msgid "Chosen %s" msgstr "Izabrano „%s“" +#: contrib/admin/static/admin/js/SelectFilter2.js:89 #, javascript-format msgid "" "This is the list of chosen %s. You may remove some by selecting them in the " "box below and then clicking the \"Remove\" arrow between the two boxes." -msgstr "" -"Ovo je lista izabranih „%s“. Možete ukloniti elemente tako što ćete ih " -"izabrati u listi i kliknuti na „Ukloni“." +msgstr "Ovo je lista izabranih „%s“. Možete ukloniti elemente tako što ćete ih izabrati u listi i kliknuti na „Ukloni“." + +#: contrib/admin/static/admin/js/SelectFilter2.js:105 +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Unesite u ovo polje da biste filtrirali listu izabranih %s." +#: contrib/admin/static/admin/js/SelectFilter2.js:120 msgid "Remove all" msgstr "Ukloni sve" +#: contrib/admin/static/admin/js/SelectFilter2.js:120 #, javascript-format msgid "Click to remove all chosen %s at once." msgstr "Uklonite sve izabrane „%s“ odjednom." +#: contrib/admin/static/admin/js/SelectFilter2.js:211 +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s izabrana opcija nije vidljiva" +msgstr[1] "%s izabrane opcije nisu vidljive" +msgstr[2] "%s izabranih opcija nije vidljivo" + +#: contrib/admin/static/admin/js/actions.js:67 msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s od %(cnt)s izabran" msgstr[1] "%(sel)s od %(cnt)s izabrana" msgstr[2] "%(sel)s od %(cnt)s izabranih" +#: contrib/admin/static/admin/js/actions.js:161 msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." -msgstr "" -"Imate nesačivane izmene. Ako pokrenete akciju, izmene će biti izgubljene." +msgstr "Imate nesačivane izmene. Ako pokrenete akciju, izmene će biti izgubljene." +#: contrib/admin/static/admin/js/actions.js:174 msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." -msgstr "Izabrali ste akciju ali niste sačuvali promene polja." +msgstr "Izabrali ste akciju, ali niste sačuvali vaše promene u pojedinačna polja. Kliknite na OK da sačuvate promene. Biće neophodno da ponovo pokrenete akciju." +#: contrib/admin/static/admin/js/actions.js:175 msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." -msgstr "Izabrali ste akciju ali niste izmenili ni jedno polje." +msgstr "Izabrali ste akciju i niste napravili nijednu promenu na pojedinačnim poljima. Verovatno tražite Kreni dugme umesto Sačuvaj." +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:13 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:110 msgid "Now" msgstr "Trenutno vreme" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:14 msgid "Midnight" msgstr "Ponoć" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:15 msgid "6 a.m." msgstr "18č" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:16 msgid "Noon" msgstr "Podne" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:17 msgid "6 p.m." msgstr "18č" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:78 #, javascript-format msgid "Note: You are %s hour ahead of server time." msgid_plural "Note: You are %s hours ahead of server time." @@ -117,6 +147,7 @@ msgstr[0] "Obaveštenje: Vi ste %s sat ispred serverskog vremena." msgstr[1] "Obaveštenje: Vi ste %s sata ispred serverskog vremena." msgstr[2] "Obaveštenje: Vi ste %s sati ispred serverskog vremena." +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:86 #, javascript-format msgid "Note: You are %s hour behind server time." msgid_plural "Note: You are %s hours behind server time." @@ -124,93 +155,238 @@ msgstr[0] "Obaveštenje: Vi ste %s sat iza serverskog vremena." msgstr[1] "Obaveštenje: Vi ste %s sata iza serverskog vremena." msgstr[2] "Obaveštenje: Vi ste %s sati iza serverskog vremena." +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:128 msgid "Choose a Time" msgstr "Odaberite vreme" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:158 msgid "Choose a time" msgstr "Odabir vremena" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:175 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:333 msgid "Cancel" msgstr "Poništi" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:238 +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:318 msgid "Today" msgstr "Danas" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:255 msgid "Choose a Date" msgstr "Odaberite datum" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:312 msgid "Yesterday" msgstr "Juče" +#: contrib/admin/static/admin/js/admin/DateTimeShortcuts.js:324 msgid "Tomorrow" msgstr "Sutra" +#: contrib/admin/static/admin/js/calendar.js:11 msgid "January" msgstr "Januar" +#: contrib/admin/static/admin/js/calendar.js:12 msgid "February" msgstr "Februar" +#: contrib/admin/static/admin/js/calendar.js:13 msgid "March" msgstr "Mart" +#: contrib/admin/static/admin/js/calendar.js:14 msgid "April" msgstr "April" +#: contrib/admin/static/admin/js/calendar.js:15 msgid "May" msgstr "Maj" +#: contrib/admin/static/admin/js/calendar.js:16 msgid "June" msgstr "Jun" +#: contrib/admin/static/admin/js/calendar.js:17 msgid "July" msgstr "Jul" +#: contrib/admin/static/admin/js/calendar.js:18 msgid "August" msgstr "Avgust" +#: contrib/admin/static/admin/js/calendar.js:19 msgid "September" msgstr "Septembar" +#: contrib/admin/static/admin/js/calendar.js:20 msgid "October" msgstr "Oktobar" +#: contrib/admin/static/admin/js/calendar.js:21 msgid "November" msgstr "Novembar" +#: contrib/admin/static/admin/js/calendar.js:22 msgid "December" msgstr "Decembar" +#: contrib/admin/static/admin/js/calendar.js:25 +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +#: contrib/admin/static/admin/js/calendar.js:26 +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb" + +#: contrib/admin/static/admin/js/calendar.js:27 +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mart" + +#: contrib/admin/static/admin/js/calendar.js:28 +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr" + +#: contrib/admin/static/admin/js/calendar.js:29 +msgctxt "abbrev. month May" +msgid "May" +msgstr "maj" + +#: contrib/admin/static/admin/js/calendar.js:30 +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun" + +#: contrib/admin/static/admin/js/calendar.js:31 +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jul" + +#: contrib/admin/static/admin/js/calendar.js:32 +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "avg" + +#: contrib/admin/static/admin/js/calendar.js:33 +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep" + +#: contrib/admin/static/admin/js/calendar.js:34 +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +#: contrib/admin/static/admin/js/calendar.js:35 +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +#: contrib/admin/static/admin/js/calendar.js:36 +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec" + +#: contrib/admin/static/admin/js/calendar.js:39 +msgid "Sunday" +msgstr "nedelja" + +#: contrib/admin/static/admin/js/calendar.js:40 +msgid "Monday" +msgstr "ponedeljak" + +#: contrib/admin/static/admin/js/calendar.js:41 +msgid "Tuesday" +msgstr "utorak" + +#: contrib/admin/static/admin/js/calendar.js:42 +msgid "Wednesday" +msgstr "sreda" + +#: contrib/admin/static/admin/js/calendar.js:43 +msgid "Thursday" +msgstr "četvrtak" + +#: contrib/admin/static/admin/js/calendar.js:44 +msgid "Friday" +msgstr "petak" + +#: contrib/admin/static/admin/js/calendar.js:45 +msgid "Saturday" +msgstr "subota" + +#: contrib/admin/static/admin/js/calendar.js:48 +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "ned" + +#: contrib/admin/static/admin/js/calendar.js:49 +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "pon" + +#: contrib/admin/static/admin/js/calendar.js:50 +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "uto" + +#: contrib/admin/static/admin/js/calendar.js:51 +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "sre" + +#: contrib/admin/static/admin/js/calendar.js:52 +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "čet" + +#: contrib/admin/static/admin/js/calendar.js:53 +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "pet" + +#: contrib/admin/static/admin/js/calendar.js:54 +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "sub" + +#: contrib/admin/static/admin/js/calendar.js:57 msgctxt "one letter Sunday" msgid "S" msgstr "N" +#: contrib/admin/static/admin/js/calendar.js:58 msgctxt "one letter Monday" msgid "M" msgstr "P" +#: contrib/admin/static/admin/js/calendar.js:59 msgctxt "one letter Tuesday" msgid "T" msgstr "U" +#: contrib/admin/static/admin/js/calendar.js:60 msgctxt "one letter Wednesday" msgid "W" msgstr "S" +#: contrib/admin/static/admin/js/calendar.js:61 msgctxt "one letter Thursday" msgid "T" msgstr "Č" +#: contrib/admin/static/admin/js/calendar.js:62 msgctxt "one letter Friday" msgid "F" msgstr "P" +#: contrib/admin/static/admin/js/calendar.js:63 msgctxt "one letter Saturday" msgid "S" msgstr "S" - -msgid "Show" -msgstr "Pokaži" - -msgid "Hide" -msgstr "Sakrij" diff --git a/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo index 3811a5f5c04a..44dc92ddcc0b 100644 Binary files a/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sv/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sv/LC_MESSAGES/django.po b/django/contrib/admin/locale/sv/LC_MESSAGES/django.po index 940bfc9e6f8d..bc85c431dd73 100644 --- a/django/contrib/admin/locale/sv/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sv/LC_MESSAGES/django.po @@ -1,13 +1,18 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Albin Larsson , 2022-2023 # Alex Nordlund , 2012 +# Anders Hovmöller , 2023 # Andreas Pelme , 2014 # d7bcbd5f5cbecdc2b959899620582440, 2011 # Cybjit , 2012 +# Elias Johnstone , 2022 # Henrik Palmlund Wahlgren , 2019 # Jannis Leidel , 2011 +# Johan Rohdin, 2021 # Jonathan Lindén, 2015 +# Jörgen Olofsson, 2024 # Jonathan Lindén, 2014 # metteludwig , 2019 # Mattias Hansson , 2016 @@ -17,10 +22,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-11-18 14:26+0000\n" -"Last-Translator: metteludwig \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Jörgen Olofsson, 2024\n" +"Language-Team: Swedish (http://app.transifex.com/django/django/language/" "sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,6 +33,10 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Ta bort markerade %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Tog bort %(count)d %(items)s" @@ -39,10 +48,6 @@ msgstr "Kan inte ta bort %(name)s" msgid "Are you sure?" msgstr "Är du säker?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Ta bort markerade %(verbose_name_plural)s" - msgid "Administration" msgstr "Administration" @@ -79,6 +84,12 @@ msgstr "Inget datum" msgid "Has date" msgstr "Har datum" +msgid "Empty" +msgstr "Tom" + +msgid "Not empty" +msgstr "Inte tom" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -182,6 +193,9 @@ msgid "Hold down “Control”, or “Command” on a Mac, to select more than o msgstr "" "Håll inne “Control”, eller “Command” på en Mac, för att välja fler än en." +msgid "Select this object for an action - {}" +msgstr "Välj detta objekt för en åtgärd - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "Lade till {name} “{obj}”." @@ -199,10 +213,6 @@ msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "Ändrade {name} “{obj}”. Du kan göra ytterligare förändringar nedan." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "Lade till {name} “{obj}”. Du kan göra ytterligare förändringar nedan." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -240,7 +250,7 @@ msgstr "Ändra %s" #, python-format msgid "View %s" -msgstr "Visa 1%s" +msgstr "Visa %s" msgid "Database error" msgstr "Databasfel" @@ -265,8 +275,9 @@ msgstr "0 av %(cnt)s valda" msgid "Change history: %s" msgstr "Ändringshistorik: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -318,7 +329,7 @@ msgid "" "email and should be fixed shortly. Thanks for your patience." msgstr "" "Ett fel har inträffat. Felet är rapporterat till sidans administratörer via " -"e-post, och borde åtgärdas skyndsamt. Tack för ditt tålamod." +"e-post och bör vara åtgärdat inom kort. Tack för ditt tålamod." msgid "Run the selected action" msgstr "Kör markerade operationer" @@ -336,6 +347,22 @@ msgstr "Välj alla %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Rensa urval" +msgid "Breadcrumbs" +msgstr "Brödsmulor" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Modeller i applikationen %(name)s" + +msgid "Add" +msgstr "Lägg till" + +msgid "View" +msgstr "Visa" + +msgid "You don’t have permission to view or edit anything." +msgstr "Du har inte tillåtelse att se eller ändra någonting." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -349,16 +376,34 @@ msgstr "Mata in användarnamn och lösenord." msgid "Change password" msgstr "Ändra lösenord" -msgid "Please correct the error below." -msgstr "Vänligen rätta nedanstående fel" +msgid "Set password" +msgstr "Sätt lösenord" -msgid "Please correct the errors below." -msgstr "Vänligen rätta till felen nedan." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Var god rätta felet nedan." +msgstr[1] "Vad god rätta felen nedan." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Ange nytt lösenord för användare %(username)s." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Denna åtgärd aktiverar lösenordsbaserad autentisering för " +"denna användare." + +msgid "Disable password-based authentication" +msgstr "Inaktivera lösenordsbaserad autentisering" + +msgid "Enable password-based authentication" +msgstr "Aktivera lösenordsbaserad autentisering" + +msgid "Skip to main content" +msgstr "Hoppa till huvudinnehållet" + msgid "Welcome," msgstr "Välkommen," @@ -384,6 +429,15 @@ msgstr "Visa på webbplats" msgid "Filter" msgstr "Filtrera" +msgid "Hide counts" +msgstr "Dölj antal" + +msgid "Show counts" +msgstr "Visa antal" + +msgid "Clear all filters" +msgstr "Rensa alla filter" + msgid "Remove from sorting" msgstr "Ta bort från sortering" @@ -394,6 +448,15 @@ msgstr "Sorteringsprioritet: %(priority_number)s" msgid "Toggle sorting" msgstr "Ändra sorteringsordning" +msgid "Toggle theme (current theme: auto)" +msgstr "Växla tema (aktuellt tema: automatiskt)" + +msgid "Toggle theme (current theme: light)" +msgstr "Växla tema (aktuellt tema: ljust)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Växla tema (aktuellt tema: mörkt)" + msgid "Delete" msgstr "Radera" @@ -461,9 +524,6 @@ msgstr "" "Är du säker på att du vill ta bort valda %(objects_name)s? Alla följande " "objekt samt relaterade objekt kommer att tas bort: " -msgid "View" -msgstr "Visa" - msgid "Delete?" msgstr "Radera?" @@ -474,16 +534,6 @@ msgstr " På %(filter_title)s " msgid "Summary" msgstr "Översikt" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Modeller i applikationen %(name)s" - -msgid "Add" -msgstr "Lägg till" - -msgid "You don’t have permission to view or edit anything." -msgstr "Du har inte tillåtelse att se eller ändra någonting." - msgid "Recent actions" msgstr "Senaste Händelser" @@ -493,6 +543,15 @@ msgstr "Mina händelser" msgid "None available" msgstr "Inga tillgängliga" +msgid "Added:" +msgstr "Lagt till:" + +msgid "Changed:" +msgstr "Ändrade:" + +msgid "Deleted:" +msgstr "Raderade:" + msgid "Unknown content" msgstr "Okänt innehåll" @@ -516,6 +575,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Har du glömt lösenordet eller användarnamnet?" +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Sidebar" +msgstr "Sidopanel" + +msgid "Start typing to filter…" +msgstr "Börja skriv för att filtrera..." + +msgid "Filter navigation items" +msgstr "Filtrera navigeringsobjekt" + msgid "Date/time" msgstr "Datum tid" @@ -525,6 +596,11 @@ msgstr "Användare" msgid "Action" msgstr "Händelse" +msgid "entry" +msgid_plural "entries" +msgstr[0] "post" +msgstr[1] "poster" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -581,8 +657,12 @@ msgstr "Lägg till %(model)s" msgid "Delete selected %(model)s" msgstr "Ta bort markerade %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Tack för att du spenderade lite kvalitetstid med webbplatsen idag." +#, python-format +msgid "View selected %(model)s" +msgstr "Visa valda %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Tack för att du spenderade kvalitetstid med webbplatsen idag." msgid "Log in again" msgstr "Logga in igen" @@ -681,6 +761,9 @@ msgstr "E-postadress:" msgid "Reset my password" msgstr "Nollställ mitt lösenord" +msgid "Select all objects on this page for an action" +msgstr "Välj alla objekt på denna sida för en åtgärd" + msgid "All dates" msgstr "Alla datum" @@ -694,7 +777,7 @@ msgstr "Välj %s att ändra" #, python-format msgid "Select %s to view" -msgstr "Välj 1%s för visning" +msgstr "Välj %s för visning" msgid "Date:" msgstr "Datum:" diff --git a/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo index 5d202074ed27..47d3efe96993 100644 Binary files a/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po index 6d833d745ab4..28bd355fbde8 100644 --- a/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/sv/LC_MESSAGES/djangojs.po @@ -1,8 +1,12 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Andreas Pelme , 2012 +# Anders Hovmöller , 2023 +# Andreas Pelme , 2012,2024 +# Danijel Grujicic, 2023 +# Elias Johnstone , 2022 # Jannis Leidel , 2011 +# Jörgen Olofsson, 2024 # Jonathan Lindén, 2014 # Mattias Hansson , 2016 # Mattias Benjaminsson , 2011 @@ -12,10 +16,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Mattias Hansson \n" -"Language-Team: Swedish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:59+0000\n" +"Last-Translator: Jörgen Olofsson, 2024\n" +"Language-Team: Swedish (http://app.transifex.com/django/django/language/" "sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,6 +72,10 @@ msgstr "" "Detta är listan med utvalda %s. Du kan ta bort vissa genom att markera dem i " "rutan nedan och sedan klicka på \"Ta bort\"-pilen mellan de två rutorna." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Skriv i denna ruta för att filtrera listan av tillgängliga %s." + msgid "Remove all" msgstr "Ta bort alla" @@ -75,6 +83,12 @@ msgstr "Ta bort alla" msgid "Click to remove all chosen %s at once." msgstr "Klicka för att ta bort alla valda %s på en gång." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s valt alternativ inte synligt" +msgstr[1] "%s valda alternativ inte synliga" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s av %(cnt)s markerade" @@ -88,8 +102,8 @@ msgstr "" "operation kommer de ändringar som inte sparats att gå förlorade." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" "Du har markerat en operation, men du har inte sparat sparat dina ändringar " @@ -97,8 +111,8 @@ msgstr "" "behöva köra operationen på nytt." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" "Du har markerat en operation och du har inte gjort några ändringar i " @@ -188,6 +202,103 @@ msgstr "november" msgid "December" msgstr "december" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "jan" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "feb" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "apr" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "maj" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "jun" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "jul" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "aug" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "sep" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "okt" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "nov" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "dec" + +msgid "Sunday" +msgstr "Söndag" + +msgid "Monday" +msgstr "Måndag" + +msgid "Tuesday" +msgstr "Tisdag" + +msgid "Wednesday" +msgstr "Onsdag" + +msgid "Thursday" +msgstr "Torsdag" + +msgid "Friday" +msgstr "Fredag" + +msgid "Saturday" +msgstr "Lördag" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "sön" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "mån" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "tis" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "ons" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "tors" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "fre" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "lör" + msgctxt "one letter Sunday" msgid "S" msgstr "S" @@ -215,9 +326,3 @@ msgstr "F" msgctxt "one letter Saturday" msgid "S" msgstr "L" - -msgid "Show" -msgstr "Visa" - -msgid "Hide" -msgstr "Göm" diff --git a/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo index 6e917f5d949f..9aa7f311c2d8 100644 Binary files a/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/sw/LC_MESSAGES/django.po b/django/contrib/admin/locale/sw/LC_MESSAGES/django.po index 1271dff51e5a..afbca8e7f473 100644 --- a/django/contrib/admin/locale/sw/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/sw/LC_MESSAGES/django.po @@ -1,16 +1,20 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Machaku , 2013-2014 -# Machaku , 2016 +# Antony Owino , 2023 +# DOREEN WANYAMA, 2023 +# Machaku, 2013-2014 +# Machaku, 2016 +# Millicent Atieno Obwanda , 2023 +# Natalia (Django Fellow), 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Swahili (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 07:05+0000\n" +"Last-Translator: DOREEN WANYAMA, 2023\n" +"Language-Team: Swahili (http://app.transifex.com/django/django/language/" "sw/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,6 +22,10 @@ msgstr "" "Language: sw\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Futa %(verbose_name_plural)s teule" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Umefanikiwa kufuta %(items)s %(count)d." @@ -29,10 +37,6 @@ msgstr "Huwezi kufuta %(name)s" msgid "Are you sure?" msgstr "Una uhakika?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Futa %(verbose_name_plural)s teule" - msgid "Administration" msgstr "Utawala" @@ -69,6 +73,12 @@ msgstr "Hakuna tarehe" msgid "Has date" msgstr "Kuna tarehe" +msgid "Empty" +msgstr "tupu" + +msgid "Not empty" +msgstr "si tupu" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -87,6 +97,15 @@ msgstr "Ongeza %(verbose_name)s" msgid "Remove" msgstr "Ondoa" +msgid "Addition" +msgstr "ongeza" + +msgid "Change" +msgstr "Badilisha" + +msgid "Deletion" +msgstr "Ufutaji" + msgid "action time" msgstr "muda wa tendo" @@ -100,7 +119,7 @@ msgid "object id" msgstr "Kitambulisho cha kitu" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "`repr` ya kitu" @@ -117,23 +136,23 @@ msgid "log entries" msgstr "maingizo kwenye kumbukumbu" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Kuongezwa kwa \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "“%(object)s” Imeongezwa" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Kubadilishwa kwa \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Kubadilishwa kwa “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Kufutwa kwa \"%(object)s\"." +msgid "Deleted “%(object)s.”" +msgstr "Kimefutwa “%(object)s”" msgid "LogEntry Object" msgstr "Kitu cha Ingizo la Kumbukumbu" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "Kumeongezeka {name} \"{object}\"." +msgid "Added {name} “{object}”." +msgstr "Kumeongezwa {name} “{object}”." msgid "Added." msgstr "Imeongezwa" @@ -142,16 +161,16 @@ msgid "and" msgstr "na" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "Mabadiliko ya {fields} yamefanyika katika {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." +msgstr "Mabadiliko ya {fields} yamefanyika kwenye {name} “{object}”." #, python-brace-format msgid "Changed {fields}." msgstr "Mabadiliko yamefanyika katika {fields} " #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "Futa {name} \"{object}\"." +msgid "Deleted {name} “{object}”." +msgstr " {name} “{object}” umefutwa." msgid "No fields changed." msgstr "Hakuna uga uliobadilishwa." @@ -159,40 +178,50 @@ msgstr "Hakuna uga uliobadilishwa." msgid "None" msgstr "Hakuna" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +" Shikilia 'Control', au 'Command' kwenye Mac, ili kuchagua zaidi ya moja." -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "Select this object for an action - {}" msgstr "" -"Ingizo la {name} \"{obj}\" limefanyika kwa mafanikio. Unaweza kuhariri tena" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” imeongezwa kwa mafanikio." + +msgid "You may edit it again below." +msgstr "Unaweza kuihariri tena hapa chini" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuongeza {name} nyingine " +"hapa chini." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" +"{name} “{obj}” ilibadilishwa kwa mafanikio. Unaweza kuihariri tena hapa " +"chini." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" +"{name} “{obj}” imeongezwa kwa mafanikio. Unaweza kuihariri tena hapa chini." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"{name} “{obj} imebadilishwa kwa mafanikio. Unaweza kuongeza {name} nyingine " +"hapa chini. " #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” imebadilishwa kwa mafanikio." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -205,12 +234,12 @@ msgid "No action selected." msgstr "Hakuna tendo lililochaguliwa" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "Ufutaji wa \"%(obj)s\" %(name)s umefanikiwa." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s%(obj)s ilifutwa kwa mafanikio." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)sna ID %(key)s haipo. Labda ilifutwa?" #, python-format msgid "Add %s" @@ -220,6 +249,10 @@ msgstr "Ongeza %s" msgid "Change %s" msgstr "Badilisha %s" +#, python-format +msgid "View %s" +msgstr "Muonekano %s" + msgid "Database error" msgstr "Hitilafu katika hifadhidata" @@ -243,8 +276,9 @@ msgstr "Vilivyo chaguliwa ni 0 kati ya %(cnt)s" msgid "Change history: %s" msgstr "Badilisha historia: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(instance)s %(class_name)s" @@ -276,11 +310,11 @@ msgstr "Utawala wa %(app)s" msgid "Page not found" msgstr "Ukurasa haujapatikana" -msgid "We're sorry, but the requested page could not be found." -msgstr "Samahani, ukurasa uliohitajika haukupatikana." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Samahani, ukurasa uliotafutwa haukupatikana." msgid "Home" -msgstr "Sebule" +msgstr "Nyumbani" msgid "Server error" msgstr "Hitilafu ya seva" @@ -292,11 +326,11 @@ msgid "Server Error (500)" msgstr "Hitilafu ya seva (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Kumekuwa na hitilafu. Imeripotiwa kwa watawala kupitia barua pepe na " -"inatakiwa kurekebishwa mapema." +"Kumekuwa na kosa. Waendeshaji wa tovuti wamearifiwa kupitia barua pepe, na " +"linapaswa kurekebishwa hivi karibuni. Asante kwa uvumilivu wako." msgid "Run the selected action" msgstr "Fanya tendo lililochaguliwa." @@ -314,12 +348,28 @@ msgstr "Chagua kila %(module_name)s, (%(total_count)s). " msgid "Clear selection" msgstr "Safisha chaguo" +msgid "Breadcrumbs" +msgstr "Nyayo " + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Models katika application %(name)s" + +msgid "Add" +msgstr "Ongeza" + +msgid "View" +msgstr "Muonekano" + +msgid "You don’t have permission to view or edit anything." +msgstr "Huna ruhusa ya kutazama au kuhariri kitu chochote" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Kwanza, ingiza jina lamtumiaji na nywila. Kisha, utaweza kuhariri zaidi " -"machaguo ya mtumiaji." +"Kwanza, ingiza jina la mtumiaji na nywila. Kisha, utaweza kuhariri chaguo " +"zaidi za mtumiaji." msgid "Enter a username and password." msgstr "Ingiza jina la mtumiaji na nywila." @@ -328,15 +378,17 @@ msgid "Change password" msgstr "Badilisha nywila" msgid "Please correct the error below." -msgstr "Tafadhali sahihisha makosa yafuatayo " - -msgid "Please correct the errors below." -msgstr "Tafadhali sahihisha makosa yafuatayo." +msgid_plural "Please correct the errors below." +msgstr[0] "Tafadhali sahihisha kosa lifuatalo." +msgstr[1] "Tafadhali sahihisha makosa yafuatayo" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "ingiza nywila ya mtumiaji %(username)s." +msgid "Skip to main content" +msgstr "Ruka hadi kwa maudhui makuu." + msgid "Welcome," msgstr "Karibu" @@ -362,6 +414,15 @@ msgstr "Ona kwenye tovuti" msgid "Filter" msgstr "Chuja" +msgid "Hide counts" +msgstr "Ficha idadi" + +msgid "Show counts" +msgstr "Onesha idadi" + +msgid "Clear all filters" +msgstr "Safisha vichungi vyote" + msgid "Remove from sorting" msgstr "Ondoa katika upangaji" @@ -372,6 +433,15 @@ msgstr "Kipaumbele katika mpangilio: %(priority_number)s" msgid "Toggle sorting" msgstr "Geuza mpangilio" +msgid "Toggle theme (current theme: auto)" +msgstr "Badilisha mandhari (mandhari ya sasa: auto)" + +msgid "Toggle theme (current theme: light)" +msgstr "Badilisha mandhari (mandhari ya sasa: mwanga)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Badilisha mandhari (mandhari ya sasa: giza)" + msgid "Delete" msgstr "Futa" @@ -404,8 +474,8 @@ msgstr "" msgid "Objects" msgstr "Viumbile" -msgid "Yes, I'm sure" -msgstr "Ndiyo, Nina uhakika" +msgid "Yes, I’m sure" +msgstr "Ndiyo, nina uhakika" msgid "No, take me back" msgstr "Hapana, nirudishe" @@ -439,9 +509,6 @@ msgstr "" "Una uhakika kuwa unataka kufuta %(objects_name)s chaguliwa ? Vitu vyote kati " "ya vifuatavyo vinavyohusiana vitafutwa:" -msgid "Change" -msgstr "Badilisha" - msgid "Delete?" msgstr "Futa?" @@ -452,16 +519,6 @@ msgstr " Kwa %(filter_title)s" msgid "Summary" msgstr "Muhtasari" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Models katika application %(name)s" - -msgid "Add" -msgstr "Ongeza" - -msgid "You don't have permission to edit anything." -msgstr "Huna ruhusa ya kuhariri chochote" - msgid "Recent actions" msgstr "Matendo ya karibuni" @@ -471,27 +528,50 @@ msgstr "Matendo yangu" msgid "None available" msgstr "Hakuna kilichopatikana" +msgid "Added:" +msgstr "Imeongezwa:" + +msgid "Changed:" +msgstr "Kimebadilika" + +msgid "Deleted:" +msgstr "Kimefutwa" + msgid "Unknown content" msgstr "Maudhui hayajulikani" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Kuna tatizo limetokea katika usanikishaji wako wa hifadhidata. Hakikisha " -"kuwa majedwali sahihi ya hifadhidata yameundwa, na hakikisha hifadhidata " -"inaweza kusomwana mtumiaji sahihi." +"Kuna tatizo na ufungaji wa hifadhidata yako. Hakikisha meza sahihi za " +"hifadhidata zimeundwa, na hakikisha hifadhidata inaweza kusomwa na mtumiaji " +"sahihi." #, python-format msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" +"Umejithibitisha kama %(username)s, lakini huna ruhusa ya kupata ukurasa huu. " +"Ungependa kuingia kwa akaunti nyingine?" msgid "Forgotten your password or username?" msgstr "Umesahau jina na nenosiri lako?" +msgid "Toggle navigation" +msgstr "Badilisha urambazaji" + +msgid "Sidebar" +msgstr "Upande wa Kando" + +msgid "Start typing to filter…" +msgstr "Anza kuchapa ili kuchuja…" + +msgid "Filter navigation items" +msgstr "Chuja vitu vya urambazaji" + msgid "Date/time" msgstr "Tarehe/saa" @@ -501,12 +581,17 @@ msgstr "Mtumiaji" msgid "Action" msgstr "Tendo" +msgid "entry" +msgid_plural "entries" +msgstr[0] "ingizo" +msgstr[1] "maingizo" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" -"Kiumbile hiki hakina historia ya kubadilika. Inawezekana hakikuwekwa kupitia " -"hii tovuti ya utawala." +"Hakuna historia ya mabadiliko kwa kipande hiki. Labda hakikuongezwa kupitia " +"tovuti hii ya usimamizi." msgid "Show all" msgstr "Onesha yotee" @@ -514,20 +599,8 @@ msgstr "Onesha yotee" msgid "Save" msgstr "Hifadhi" -msgid "Popup closing..." -msgstr "Udukizi unafunga" - -#, python-format -msgid "Change selected %(model)s" -msgstr "Badili %(model)s husika" - -#, python-format -msgid "Add another %(model)s" -msgstr "Ongeza %(model)s tena" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "Futa %(model)s husika" +msgid "Popup closing…" +msgstr "Udukizi inafungwa..." msgid "Search" msgstr "Tafuta" @@ -551,8 +624,30 @@ msgstr "Hifadhi na ongeza" msgid "Save and continue editing" msgstr "Hifadhi na endelea kuhariri" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ahsante kwa kutumia muda wako katika Tovuti yetu leo. " +msgid "Save and view" +msgstr "Hifadhi kisha tazama" + +msgid "Close" +msgstr "Funga" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Badili %(model)s husika" + +#, python-format +msgid "Add another %(model)s" +msgstr "Ongeza %(model)s tena" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Futa %(model)s husika" + +#, python-format +msgid "View selected %(model)s" +msgstr "Tazama %(model)s zilizochaguliwa" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Asante kwa kutumia muda wako kenye tovuti leo." msgid "Log in again" msgstr "ingia tena" @@ -564,12 +659,11 @@ msgid "Your password was changed." msgstr "Nywila yako imebadilishwa" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Tafadhali ingiza nywila yako ya zamani, kwa ajili ya usalama, kisha ingiza " -"nywila mpya mara mbili ili tuweze kuthibitisha kuwa umelichapisha kwa " -"usahihi." +"Tafadhali ingiza nywila yako ya zamani, kwa usalama, na kisha ingiza nywila " +"yako mpya mara mbili ili tuweze kuthibitisha kuwa umeingiza kwa usahihi" msgid "Change my password" msgstr "Badilisha nywila yangu" @@ -604,16 +698,18 @@ msgstr "" "hicho tayari kimetumika. tafadhali omba upya kuseti nywila." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Tumekutumia barua pepe na maelekezo ya kuweka nywila yako, endapo akaunti " +"inayolingana na barua pepe uliyoingiza ipo. Unapaswa kuzipokea hivi karibuni." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Ikiwa hujapata barua pepe, tafadhali hakikisha umeingiza anuani ya barua " -"pepe uliyoitumia kujisajili na angalia katika folda la spam" +"Ikiwa hautapokea barua pepe, tafadhali hakikisha umeweka anwani " +"uliyojiandikisha nayo, na angalia folda yako ya barua taka" #, python-format msgid "" @@ -626,8 +722,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Tafadhali nenda ukurasa ufuatao na uchague nywila mpya:" -msgid "Your username, in case you've forgotten:" -msgstr "Jina lako la mtumiaji, ikiwa umesahau:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Jina lako la utumiaji, ikiwa umesahau:" msgid "Thanks for using our site!" msgstr "Ahsante kwa kutumia tovui yetu!" @@ -637,11 +733,11 @@ msgid "The %(site_name)s team" msgstr "timu ya %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Umesahau nywila yako? Ingiza anuani yako ya barua pepe hapo chini, nasi " -"tutakutumia maelekezo ya kuseti nenosiri jipya. " +"Umensahau nywila yako? Ingiza anwani yako ya barua pepe hapa chini, na " +"tutakutumia barua pepe na maelekezo ya kuweka mpya." msgid "Email address:" msgstr "Anuani ya barua pepe:" @@ -649,6 +745,9 @@ msgstr "Anuani ya barua pepe:" msgid "Reset my password" msgstr "Seti nywila yangu upya" +msgid "Select all objects on this page for an action" +msgstr "Chagua vitu vyote kwenye ukurasa huu kwa hatua." + msgid "All dates" msgstr "Tarehe zote" @@ -660,6 +759,10 @@ msgstr "Chagua %s" msgid "Select %s to change" msgstr "Chaguo %s kwa mabadilisho" +#, python-format +msgid "Select %s to view" +msgstr "Chagua %s kuona" + msgid "Date:" msgstr "Tarehe" diff --git a/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo b/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..34085cb0f09a Binary files /dev/null and b/django/contrib/admin/locale/tg/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/tg/LC_MESSAGES/django.po b/django/contrib/admin/locale/tg/LC_MESSAGES/django.po new file mode 100644 index 000000000000..dee2872666c2 --- /dev/null +++ b/django/contrib/admin/locale/tg/LC_MESSAGES/django.po @@ -0,0 +1,699 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2020 +# Surush Sufiew , 2020 +# Surush Sufiew , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-07-14 19:53+0200\n" +"PO-Revision-Date: 2020-07-30 18:53+0000\n" +"Last-Translator: Mariusz Felisiak \n" +"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "Муваффақона нест сохтед %(count)d %(items)s." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Нест карда нашуд %(name)s" + +msgid "Are you sure?" +msgstr "Шумо рози ҳастед ?" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Нест сохтани интихобшудаҳо %(verbose_name_plural)s" + +msgid "Administration" +msgstr "Маъмурият" + +msgid "All" +msgstr "Ҳама" + +msgid "Yes" +msgstr "Ҳа" + +msgid "No" +msgstr "Не" + +msgid "Unknown" +msgstr "Номуайян" + +msgid "Any date" +msgstr "Санаи бефарқ" + +msgid "Today" +msgstr "Имрӯз" + +msgid "Past 7 days" +msgstr "7 рӯзи охир" + +msgid "This month" +msgstr "Моҳи ҷорӣ" + +msgid "This year" +msgstr "Соли ҷорӣ" + +msgid "No date" +msgstr "Сана ишора нашудааст" + +msgid "Has date" +msgstr "Сана ишора шудааст" + +msgid "Empty" +msgstr "Холӣ" + +msgid "Not empty" +msgstr "Холӣ нест" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Хоҳиш менамоем %(username)s ва рамзро дуруст ворид созед. Ҳарду майдон " +"метавонанд духура бошанд." + +msgid "Action:" +msgstr "Амал:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Боз якто %(verbose_name)s илова кардан" + +msgid "Remove" +msgstr "Нест кардан" + +msgid "Addition" +msgstr "Иловакунӣ" + +msgid "Change" +msgstr "Тағйир додан" + +msgid "Deletion" +msgstr "Несткунӣ" + +msgid "action time" +msgstr "вақти амал" + +msgid "user" +msgstr "истифодабаранда" + +msgid "content type" +msgstr "намуди контент" + +msgid "object id" +msgstr "идентификатори объект" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "намоиши объект" + +msgid "action flag" +msgstr "намуди амал" + +msgid "change message" +msgstr "хабар оиди тағйирот" + +msgid "log entry" +msgstr "қайд дар дафтар" + +msgid "log entries" +msgstr "қайдҳо дар дафтар" + +#, python-format +msgid "Added “%(object)s”." +msgstr "Илова шуд \"%(object)s\"" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "" + +msgid "LogEntry Object" +msgstr "Қайд дар дафтар" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "" + +msgid "Added." +msgstr "Илова шуд." + +msgid "and" +msgstr "ва" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "Тағйир ёфт {fields}." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "" + +msgid "No fields changed." +msgstr "Ягон майдон тағйир наёфт." + +msgid "None" +msgstr "Не" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "Шумо метавонед ин объектро дар поён аз нав тағйир диҳед." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"Барои иҷрои амал лозим аст, ки объектро интихоб намоед. Тағйирот барои " +"объектҳо ворид нашуданд " + +msgid "No action selected." +msgstr "Ҳеҷ амал инихоб нашудааст." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "Илова кардан %s" + +#, python-format +msgid "Change %s" +msgstr "Тағйир додан %s" + +#, python-format +msgid "View %s" +msgstr "Азназаргузаронӣ %s" + +msgid "Database error" +msgstr "Мушкилӣ дар базаи додаҳо" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "Интихоб карда шуд 0 аз %(cnt)s " + +#, python-format +msgid "Change history: %s" +msgstr "Таърихи вориди тағйирот: %s" + +#. Translators: Model verbose name and instance representation, +#. suitable to be an item in a list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s %(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"Несткунии объекти %(instance)s намуди %(class_name)s талаб мекунад, ки " +"объектҳои алоқамандшудаизерин низ нест карда шаванд: %(related_objects)s" + +msgid "Django site admin" +msgstr "Сомонаи маъмурии Django" + +msgid "Django administration" +msgstr "Маъмурияти Django" + +msgid "Site administration" +msgstr "Маъмурияти сомона" + +msgid "Log in" +msgstr "Ворид шудан" + +#, python-format +msgid "%(app)s administration" +msgstr "Маъмурияти барномаи «%(app)s»" + +msgid "Page not found" +msgstr "Саҳифа ёфт нашуд" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "" + +msgid "Home" +msgstr "Асосӣ" + +msgid "Server error" +msgstr "Мушкилӣ дар сервер" + +msgid "Server error (500)" +msgstr "Мушкилӣ дар сервер (500)" + +msgid "Server Error (500)" +msgstr "Мушкилӣ дар сервер (500)" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "Иҷрои амалҳои ихтихобшуда" + +msgid "Go" +msgstr "Иҷро кардан" + +msgid "Click here to select the objects across all pages" +msgstr "Барои интихоби объектҳо дар ҳамаи саҳифаҳо, инҷоро пахш намоед" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "Интихоби ҳамаи %(module_name)s (%(total_count)s)" + +msgid "Clear selection" +msgstr "Бекоркунии интихоб" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "Моелҳои барномаи %(name)s" + +msgid "Add" +msgstr "Илова кардан" + +msgid "View" +msgstr "Азназаргузаронӣ" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" + +msgid "Enter a username and password." +msgstr "Ном ва рамзро ворид созед." + +msgid "Change password" +msgstr "Тағйир додани рамз" + +msgid "Please correct the error below." +msgstr "Хоҳишмандем, хатогии зеринро ислоҳ кунед." + +msgid "Please correct the errors below." +msgstr "Хоҳишмандем, хатогиҳои зеринро ислоҳ кунед." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "Рамзи навро ворид созед %(username)s." + +msgid "Welcome," +msgstr "Марҳамат," + +msgid "View site" +msgstr "Гузариш ба сомона" + +msgid "Documentation" +msgstr "Ҳуҷҷатнигорӣ" + +msgid "Log out" +msgstr "Баромад" + +#, python-format +msgid "Add %(name)s" +msgstr "Дохил кардани %(name)s" + +msgid "History" +msgstr "Таърих" + +msgid "View on site" +msgstr "Дар сомона дидан" + +msgid "Filter" +msgstr "Поло(Filter)" + +msgid "Clear all filters" +msgstr "" + +msgid "Remove from sorting" +msgstr "Аз қайди навъҳо баровардан" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "Бартарии навъҳо: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "Навъҷудокунӣ дар дигар раванд" + +msgid "Delete" +msgstr "Нест кардан" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Нест кардани %(object_name)s '%(escaped_object)s' ба нестсозии объектҳои ба " +"он алоқаманд оварда мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати " +"нестсозии объектҳои зеринро надорад:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"Нестсозии %(object_name)s '%(escaped_object)s' талаб менамояд, ки " +"объектҳоиалоқаманди муҳофизатии зерин нест карда шаванд:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(object_name)s " +"\"%(escaped_object)s\"? Ҳамаи объектҳои алоқаманди зерин низ нест карда " +"мешаванд:" + +msgid "Objects" +msgstr "Объектҳо" + +msgid "Yes, I’m sure" +msgstr "" + +msgid "No, take me back" +msgstr "Не, баргаштан" + +msgid "Delete multiple objects" +msgstr "Нестсозии якчанд объектҳо" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"Нест кардани %(objects_name)s ба нестсозии объектҳои ба он алоқаманд оварда " +"мерасонад, аммо'ҳисоби корбарӣ'-и (аккаунт) шумо иҷозати нестсозии объектҳои " +"зеринро надорад:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"Нестсозии %(objects_name)s талаб менамояд, ки объектҳоиалоқаманди " +"муҳофизатии зерин нест карда шаванд:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"Шумо боварӣ доред, ки ин элементҳо нест карда шаванд: %(objects_name)s? " +"Ҳамаи объектҳои алоқаманди зерин низ нест карда мешаванд:" + +msgid "Delete?" +msgstr "Нест кардан?" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s" + +msgid "Summary" +msgstr "Мухтасар" + +msgid "Recent actions" +msgstr "Амалҳои охирин" + +msgid "My actions" +msgstr "Амалҳои ман" + +msgid "None available" +msgstr "Дастнорас" + +msgid "Unknown content" +msgstr "Шакли номуайян" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"Шумо ба система ҳамчун %(username)s, ворид шудед, вале салоҳияти шумобарои " +"азназаргузарониисаҳифаи мазкур нокифоя аст. Шояд шумо мехоҳед бо истифода аз " +"дигар 'ҳисоби корбарӣ' вориди система шавед." + +msgid "Forgotten your password or username?" +msgstr "Рамз ё номро фаромӯш кардед?" + +msgid "Toggle navigation" +msgstr "" + +msgid "Date/time" +msgstr "Сана ва вақт" + +msgid "User" +msgstr "Истифодабар" + +msgid "Action" +msgstr "Амал" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "Ҳамаро нишон додан" + +msgid "Save" +msgstr "Ҳифз кардан" + +msgid "Popup closing…" +msgstr "Равзанаи иловагӣ пӯшида мешавад..." + +msgid "Search" +msgstr "Ёфтан" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s ҳамаги" + +msgid "Save as new" +msgstr "Ҳамчун объекти нав ҳифз кардан" + +msgid "Save and add another" +msgstr "Ҳифз кардан ва объекти дигар илова кардан" + +msgid "Save and continue editing" +msgstr "Ҳифз кардан ва танзимотро давом додан" + +msgid "Save and view" +msgstr "Ҳифз кардан ва аз назар гузаронидан" + +msgid "Close" +msgstr "Пӯшидан" + +#, python-format +msgid "Change selected %(model)s" +msgstr "Объекти интихобшударо тағйир додан: \"%(model)s\"" + +#, python-format +msgid "Add another %(model)s" +msgstr "Воридсозии боз як объекти \"%(model)s\"" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "Объекти зерини интихобшударо нест кардан \"%(model)s\"" + +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Барои вақти дар ин сомона сарф кардаатон миннатдорем." + +msgid "Log in again" +msgstr "Аз нав ворид шудан" + +msgid "Password change" +msgstr "Тағйири рамз" + +msgid "Your password was changed." +msgstr "Рамзи шумо тағйир дода шуд." + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" + +msgid "Change my password" +msgstr "Тағйири рамзи ман" + +msgid "Password reset" +msgstr "Барқароркунии рамз" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "Рамзи шумо ҳифз шуд. Акнун шумо метавонед ворид шавед." + +msgid "Password reset confirmation" +msgstr "Барқароркунии рамз тасдиқ карда шуд." + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"Хоҳиш мекунем рамзи нави худро ду маротиба(бояд ҳарду мувофиқат кунанд) " +"дохил кунед." + +msgid "New password:" +msgstr "Рамзи нав:" + +msgid "Confirm password:" +msgstr "Рамзи тасдиқӣ:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"Суроға барои барқароркунии рамз нодуруст аст. Эҳтимол алакай як маротиба " +"истифода шудааст.Амали барқароркунии рамзро такрор намоед." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"Шумо ин матубро гирифтед барои он, ки аз сомонаи %(site_name)s, ки бо ин " +"почтаи электронӣ алоқаманд аст,ба мо дархост барои барқароркунии рамз қабул " +"шуд." + +msgid "Please go to the following page and choose a new password:" +msgstr "Хоҳишмандем ба ин саҳифа гузаред ва рамзи навро ворид созед:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "" + +msgid "Thanks for using our site!" +msgstr "Барои аз сомонаи мо истифода карданатон сипосгузорем!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "Гурӯҳи ташкили %(site_name)s" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "Суроғаи почтаи электронӣ:" + +msgid "Reset my password" +msgstr "Барқароркунии рамзи ман" + +msgid "All dates" +msgstr "Ҳама санаҳо" + +#, python-format +msgid "Select %s" +msgstr "Интихоб кунед %s" + +#, python-format +msgid "Select %s to change" +msgstr "Интихоби %s барои тағйирот ворид сохтан " + +#, python-format +msgid "Select %s to view" +msgstr "Интихоби %s барои азназаргузаронӣ" + +msgid "Date:" +msgstr "Сана:" + +msgid "Time:" +msgstr "Вақт:" + +msgid "Lookup" +msgstr "Ҷустуҷӯ" + +msgid "Currently:" +msgstr "Ҷорӣ:" + +msgid "Change:" +msgstr "Тағйир додан:" diff --git a/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..2c0655198bdb Binary files /dev/null and b/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..b5f4fdb4280e --- /dev/null +++ b/django/contrib/admin/locale/tg/LC_MESSAGES/djangojs.po @@ -0,0 +1,222 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Surush Sufiew , 2020 +# Surush Sufiew , 2020 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-05-11 20:56+0200\n" +"PO-Revision-Date: 2020-05-15 01:22+0000\n" +"Last-Translator: Surush Sufiew \n" +"Language-Team: Tajik (http://www.transifex.com/django/django/language/tg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "Дастрас %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"Ин руйхати %s - ҳои дастрас. Шумо метавонед якчандто аз инҳоро дар " +"майдонипоён бо пахши тугмаи \\'Интихоб кардан'\\ интихоб намоед." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "" +"Барои баровардани рӯйхати %s. -ҳои дастрас, ба воридсозии матни лозима шурӯъ " +"кунед" + +msgid "Filter" +msgstr "Поло" + +msgid "Choose all" +msgstr "Интихоби кулл" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "Барои якбора интихоб намудани кулли %s инҷоро пахш намоед." + +msgid "Choose" +msgstr "интихоб кардан" + +msgid "Remove" +msgstr "Нест кардан" + +#, javascript-format +msgid "Chosen %s" +msgstr "%s -ҳои интихобшуда" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"Ин руйхати %s - ҳои интихобшуда. Шумо метавонед якчандто аз инҳоро дар " +"майдонипоён бо пахши тугмаи \\'Нест кардан'\\ нест созед." + +msgid "Remove all" +msgstr "Нест кардан ба таври кулл" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "Пахш кунед барои якбора нест кардани ҳамаи %s." + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"Тағйиротҳои ҳифзнакардашуда дар майдони таҳрир мавҷуданд. Агаршумо иҷрои " +"амалро давом диҳед, онҳо нест хоҳанд шуд." + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"Шумо амалро интихоб намудед, вале ҳануз тағйиротҳои ворид кардашуда ҳифз " +"нашудаанд.\"\n" +"\"Барои ҳифз намудани онҳо ба тугмаи 'ОК' пахш намоед.\"\n" +"\"Сипас шуморо лозим меояд, ки амалро такроран иҷро намоед" + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "" +"\"Шумо амалрор интихоб намудед, вале тағйирот ворид насохтед.\"\n" +"\"Эҳтимол шумо мехостед ба ҷои тугмаи \\'Ҳифз кардан'\\, аз тугмаи \\'Иҷро " +"кардан'\\ истифода намоед.\"\n" +"\"Агар чунин бошад, он гоҳ тугмаи \\'Инкор'\\ пахш кунед, то ки ба майдони " +"таҳриркунӣ баргардед.\"" + +msgid "Now" +msgstr "Ҳозир" + +msgid "Midnight" +msgstr "Нисфишабӣ" + +msgid "6 a.m." +msgstr "6-и саҳар" + +msgid "Noon" +msgstr "Нисфирӯзӣ" + +msgid "6 p.m." +msgstr "6-и бегоҳӣ" + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "" +msgstr[1] "" + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "" +msgstr[1] "" + +msgid "Choose a Time" +msgstr "Вақтро интихоб кунед" + +msgid "Choose a time" +msgstr "Вақтро интихоб кунед" + +msgid "Cancel" +msgstr "Инкор" + +msgid "Today" +msgstr "Имрӯз" + +msgid "Choose a Date" +msgstr "Санаро интихоб кунед" + +msgid "Yesterday" +msgstr "Дирӯз" + +msgid "Tomorrow" +msgstr "Фардо" + +msgid "January" +msgstr "Январ" + +msgid "February" +msgstr "Феврал" + +msgid "March" +msgstr "Март" + +msgid "April" +msgstr "Апрел" + +msgid "May" +msgstr "Май" + +msgid "June" +msgstr "Июн" + +msgid "July" +msgstr "Июл" + +msgid "August" +msgstr "Август" + +msgid "September" +msgstr "Сентябр" + +msgid "October" +msgstr "Октябр" + +msgid "November" +msgstr "Ноябр" + +msgid "December" +msgstr "Декабр" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "Я" + +msgctxt "one letter Monday" +msgid "M" +msgstr "Д" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "С" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "Ч" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "П" + +msgctxt "one letter Friday" +msgid "F" +msgstr "Ҷ" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "Ш" + +msgid "Show" +msgstr "Нишон додан" + +msgid "Hide" +msgstr "Пинҳон кардан" diff --git a/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo b/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..fd8f0e1f0afe Binary files /dev/null and b/django/contrib/admin/locale/tk/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/tk/LC_MESSAGES/django.po b/django/contrib/admin/locale/tk/LC_MESSAGES/django.po new file mode 100644 index 000000000000..ad73340b026e --- /dev/null +++ b/django/contrib/admin/locale/tk/LC_MESSAGES/django.po @@ -0,0 +1,738 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Mariusz Felisiak , 2022 +# Natalia, 2024 +# Resul , 2024 +# Rovshen Tagangylyjov, 2024 +# Welbeck Garli , 2022 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: Natalia, 2024\n" +"Language-Team: Turkmen (http://app.transifex.com/django/django/language/" +"tk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s saýlanany poz" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d%(items)süstünlikli pozuldy." + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "Pozmak amala aşyrylyp bilinmedi %(name)s" + +msgid "Are you sure?" +msgstr "Siz dowam etmekçimi?" + +msgid "Administration" +msgstr "Administrasiýa" + +msgid "All" +msgstr "Ählisi" + +msgid "Yes" +msgstr "Hawa" + +msgid "No" +msgstr "Ýok" + +msgid "Unknown" +msgstr "Näbelli" + +msgid "Any date" +msgstr "Islendik sene" + +msgid "Today" +msgstr "Şu gün" + +msgid "Past 7 days" +msgstr "Soňky 7 gün" + +msgid "This month" +msgstr "Şu aý" + +msgid "This year" +msgstr "Şu ýyl" + +msgid "No date" +msgstr "Senesiz" + +msgid "Has date" +msgstr "Senesi bar" + +msgid "Empty" +msgstr "Boş" + +msgid "Not empty" +msgstr "Boş däl" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Administratiw bolmadyk hasap üçin dogry %(username)s we parol ulanmagyňyzy " +"sizden haýyş edýäris. Giriziljek maglumatlaryň harp ýalňyşsyz bolmagyny göz " +"öňünde tutmagy unutmaň." + +msgid "Action:" +msgstr "Hereket:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "Başga %(verbose_name)s goş" + +msgid "Remove" +msgstr "Aýyr" + +msgid "Addition" +msgstr "Goşmak" + +msgid "Change" +msgstr "Üýtget" + +msgid "Deletion" +msgstr "Pozmaklyk" + +msgid "action time" +msgstr "hereket wagty" + +msgid "user" +msgstr "ulanyjy" + +msgid "content type" +msgstr "mazmun görnüşi" + +msgid "object id" +msgstr "obýekt id-sy" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "obýekt repr-y" + +msgid "action flag" +msgstr "hereket belligi" + +msgid "change message" +msgstr "Habarnamany üýtget" + +msgid "log entry" +msgstr "Giriş habarnamasy" + +msgid "log entries" +msgstr "giriş habarnamalary" + +#, python-format +msgid "Added “%(object)s”." +msgstr "\"%(object)s\" goşuldy" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "\"%(object)s\" üýtgedildi - %(changes)s" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" pozuldy." + +msgid "LogEntry Object" +msgstr "GirişHabarnamasy Obýekty" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "Goşuldy {name} “{object}”." + +msgid "Added." +msgstr "Goşuldy." + +msgid "and" +msgstr "we" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "{fields} üýtgedildi." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "" + +msgid "No fields changed." +msgstr "" + +msgid "None" +msgstr "" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "" + +msgid "Select this object for an action - {}" +msgstr "" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "" + +msgid "You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "" + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" + +msgid "No action selected." +msgstr "" + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "" + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "" + +#, python-format +msgid "Add %s" +msgstr "" + +#, python-format +msgid "Change %s" +msgstr "" + +#, python-format +msgid "View %s" +msgstr "" + +msgid "Database error" +msgstr "" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "" + +#, python-format +msgid "Change history: %s" +msgstr "" + +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" + +msgid "Django site admin" +msgstr "" + +msgid "Django administration" +msgstr "" + +msgid "Site administration" +msgstr "" + +msgid "Log in" +msgstr "" + +#, python-format +msgid "%(app)s administration" +msgstr "" + +msgid "Page not found" +msgstr "" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "" + +msgid "Home" +msgstr "" + +msgid "Server error" +msgstr "" + +msgid "Server error (500)" +msgstr "" + +msgid "Server Error (500)" +msgstr "" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" + +msgid "Run the selected action" +msgstr "" + +msgid "Go" +msgstr "" + +msgid "Click here to select the objects across all pages" +msgstr "" + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "" + +msgid "Clear selection" +msgstr "" + +msgid "Breadcrumbs" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "View" +msgstr "" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" + +msgid "Enter a username and password." +msgstr "" + +msgid "Change password" +msgstr "" + +msgid "Set password" +msgstr "" + +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "" + +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" + +msgid "Disable password-based authentication" +msgstr "" + +msgid "Enable password-based authentication" +msgstr "" + +msgid "Skip to main content" +msgstr "" + +msgid "Welcome," +msgstr "" + +msgid "View site" +msgstr "" + +msgid "Documentation" +msgstr "" + +msgid "Log out" +msgstr "" + +#, python-format +msgid "Add %(name)s" +msgstr "" + +msgid "History" +msgstr "" + +msgid "View on site" +msgstr "" + +msgid "Filter" +msgstr "" + +msgid "Hide counts" +msgstr "" + +msgid "Show counts" +msgstr "" + +msgid "Clear all filters" +msgstr "" + +msgid "Remove from sorting" +msgstr "" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "" + +msgid "Toggle sorting" +msgstr "" + +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + +msgid "Delete" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" + +msgid "Objects" +msgstr "" + +msgid "Yes, I’m sure" +msgstr "" + +msgid "No, take me back" +msgstr "" + +msgid "Delete multiple objects" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" + +msgid "Delete?" +msgstr "" + +#, python-format +msgid " By %(filter_title)s " +msgstr "" + +msgid "Summary" +msgstr "" + +msgid "Recent actions" +msgstr "" + +msgid "My actions" +msgstr "" + +msgid "None available" +msgstr "" + +msgid "Added:" +msgstr "" + +msgid "Changed:" +msgstr "" + +msgid "Deleted:" +msgstr "" + +msgid "Unknown content" +msgstr "" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" + +msgid "Forgotten your password or username?" +msgstr "" + +msgid "Toggle navigation" +msgstr "" + +msgid "Sidebar" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + +msgid "Date/time" +msgstr "" + +msgid "User" +msgstr "" + +msgid "Action" +msgstr "" + +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" + +msgid "Show all" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Popup closing…" +msgstr "" + +msgid "Search" +msgstr "" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "" + +msgid "Save as new" +msgstr "" + +msgid "Save and add another" +msgstr "" + +msgid "Save and continue editing" +msgstr "" + +msgid "Save and view" +msgstr "" + +msgid "Close" +msgstr "" + +#, python-format +msgid "Change selected %(model)s" +msgstr "" + +#, python-format +msgid "Add another %(model)s" +msgstr "" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "" + +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "" + +msgid "Log in again" +msgstr "" + +msgid "Password change" +msgstr "" + +msgid "Your password was changed." +msgstr "" + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" + +msgid "Change my password" +msgstr "" + +msgid "Password reset" +msgstr "" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "" + +msgid "Password reset confirmation" +msgstr "" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" + +msgid "New password:" +msgstr "" + +msgid "Confirm password:" +msgstr "" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" + +msgid "Please go to the following page and choose a new password:" +msgstr "" + +msgid "Your username, in case you’ve forgotten:" +msgstr "" + +msgid "Thanks for using our site!" +msgstr "" + +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" + +msgid "Email address:" +msgstr "" + +msgid "Reset my password" +msgstr "" + +msgid "Select all objects on this page for an action" +msgstr "" + +msgid "All dates" +msgstr "" + +#, python-format +msgid "Select %s" +msgstr "" + +#, python-format +msgid "Select %s to change" +msgstr "" + +#, python-format +msgid "Select %s to view" +msgstr "" + +msgid "Date:" +msgstr "" + +msgid "Time:" +msgstr "" + +msgid "Lookup" +msgstr "" + +msgid "Currently:" +msgstr "" + +msgid "Change:" +msgstr "" diff --git a/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo b/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo index f252fba72b7c..75038f36b51b 100644 Binary files a/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/tr/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/tr/LC_MESSAGES/django.po b/django/contrib/admin/locale/tr/LC_MESSAGES/django.po index 0f9d3f8c9138..be27db296e36 100644 --- a/django/contrib/admin/locale/tr/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/tr/LC_MESSAGES/django.po @@ -1,23 +1,24 @@ # This file is distributed under the same license as the Django package. # # Translators: -# BouRock, 2015-2019 +# BouRock, 2015-2024 # BouRock, 2014-2015 -# Caner Başaran , 2013 +# Caner Başaran , 2013 # Cihad GÜNDOĞDU , 2012 # Cihad GÜNDOĞDU , 2014 # Cihan Okyay , 2014 # Jannis Leidel , 2011 # Mesut Can Gürle , 2013 # Murat Sahin , 2011 +# Yigit Guler , 2020 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2019-09-17 07:45+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: BouRock, 2015-2024\n" +"Language-Team: Turkish (http://app.transifex.com/django/django/language/" "tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +26,10 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Seçili %(verbose_name_plural)s nesnelerini sil" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "%(count)d adet %(items)s başarılı olarak silindi." @@ -36,10 +41,6 @@ msgstr "%(name)s silinemiyor" msgid "Are you sure?" msgstr "Emin misiniz?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Seçili %(verbose_name_plural)s nesnelerini sil" - msgid "Administration" msgstr "Yönetim" @@ -76,6 +77,12 @@ msgstr "Tarih yok" msgid "Has date" msgstr "Tarih var" +msgid "Empty" +msgstr "Boş" + +msgid "Not empty" +msgstr "Boş değil" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -179,6 +186,9 @@ msgid "Hold down “Control”, or “Command” on a Mac, to select more than o msgstr "" "Birden fazla seçmek için “Ctrl” veya Mac’teki “Command” tuşuna basılı tutun." +msgid "Select this object for an action - {}" +msgstr "Bir eylem için bu nesneyi seç - {}" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "{name} “{obj}” başarılı olarak eklendi." @@ -200,11 +210,6 @@ msgstr "" "{name} “{obj}” başarılı olarak değiştirildi. Aşağıda tekrar " "düzenleyebilirsiniz." -#, python-brace-format -msgid "The {name} “{obj}” was added successfully. You may edit it again below." -msgstr "" -"{name} “{obj}” başarılı olarak eklendi. Aşağıda tekrar düzenleyebilirsiniz." - #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " @@ -270,8 +275,9 @@ msgstr "0 / %(cnt)s nesne seçildi" msgid "Change history: %s" msgstr "Değişiklik geçmişi: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -323,7 +329,7 @@ msgid "" "email and should be fixed shortly. Thanks for your patience." msgstr "" "Bir hata oluştu. Site yöneticilerine e-posta yoluyla bildirildi ve kısa süre " -"içinde düzeltilmelidir. Sabrınız için teşekkür ederiz." +"içinde düzeltilecektir. Sabrınız için teşekkür ederiz." msgid "Run the selected action" msgstr "Seçilen eylemi çalıştır" @@ -341,6 +347,22 @@ msgstr "Tüm %(total_count)s %(module_name)s nesnelerini seç" msgid "Clear selection" msgstr "Seçimi temizle" +msgid "Breadcrumbs" +msgstr "İçerik haritaları" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s uygulamasındaki modeller" + +msgid "Add" +msgstr "Ekle" + +msgid "View" +msgstr "Göster" + +msgid "You don’t have permission to view or edit anything." +msgstr "Hiçbir şeyi düzenlemek ve göstermek için izne sahip değilsiniz." + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -354,16 +376,34 @@ msgstr "Kullanıcı adı ve parola girin." msgid "Change password" msgstr "Parolayı değiştir" -msgid "Please correct the error below." -msgstr "Lütfen aşağıdaki hataları düzeltin." +msgid "Set password" +msgstr "Parola ayarla" -msgid "Please correct the errors below." -msgstr "Lütfen aşağıdaki hataları düzeltin." +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "Lütfen aşağıdaki hatayı düzeltin." +msgstr[1] "Lütfen aşağıdaki hataları düzeltin." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "%(username)s kullanıcısı için yeni bir parola girin." +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"Bu eylem, bu kullanıcı için parola tabanlı kimlik doğrulaması " +"etkinleştirecektir." + +msgid "Disable password-based authentication" +msgstr "Parola tabanlı kimlik doğrulamasını etkisizleştir" + +msgid "Enable password-based authentication" +msgstr "Parola tabanlı kimlik doğrulamasını etkinleştir" + +msgid "Skip to main content" +msgstr "Ana içeriğe atla" + msgid "Welcome," msgstr "Hoş Geldiniz," @@ -389,6 +429,15 @@ msgstr "Sitede görüntüle" msgid "Filter" msgstr "Süz" +msgid "Hide counts" +msgstr "Sayıları gizle" + +msgid "Show counts" +msgstr "Sayıları göster" + +msgid "Clear all filters" +msgstr "Tüm süzgeçleri temizle" + msgid "Remove from sorting" msgstr "Sıralamadan kaldır" @@ -399,6 +448,15 @@ msgstr "Sıralama önceliği: %(priority_number)s" msgid "Toggle sorting" msgstr "Sıralamayı değiştir" +msgid "Toggle theme (current theme: auto)" +msgstr "Temayı değiştir (şu anki tema: otomatik)" + +msgid "Toggle theme (current theme: light)" +msgstr "Temayı değiştir (şu anki tema: açık)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Temayı değiştir (şu anki tema: koyu)" + msgid "Delete" msgstr "Sil" @@ -466,9 +524,6 @@ msgstr "" "Seçilen %(objects_name)s nesnelerini silmek istediğinize emin misiniz? " "Aşağıdaki nesnelerin tümü ve onların ilgili öğeleri silinecektir:" -msgid "View" -msgstr "Göster" - msgid "Delete?" msgstr "Silinsin mi?" @@ -479,16 +534,6 @@ msgstr " %(filter_title)s süzgecine göre" msgid "Summary" msgstr "Özet" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s uygulamasındaki modeller" - -msgid "Add" -msgstr "Ekle" - -msgid "You don’t have permission to view or edit anything." -msgstr "Hiçbir şeyi düzenlemek ve göstermek için izne sahip değilsiniz." - msgid "Recent actions" msgstr "Son eylemler" @@ -498,6 +543,15 @@ msgstr "Eylemlerim" msgid "None available" msgstr "Mevcut değil" +msgid "Added:" +msgstr "Eklendi:" + +msgid "Changed:" +msgstr "Değiştirildi:" + +msgid "Deleted:" +msgstr "Silindi:" + msgid "Unknown content" msgstr "Bilinmeyen içerik" @@ -521,6 +575,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Kullanıcı adınızı veya parolanızı mı unuttunuz?" +msgid "Toggle navigation" +msgstr "Gezinmeyi aç/kapat" + +msgid "Sidebar" +msgstr "Kenar çubuğu" + +msgid "Start typing to filter…" +msgstr "Süzmek için yazmaya başlayın..." + +msgid "Filter navigation items" +msgstr "Gezinti öğelerini süz" + msgid "Date/time" msgstr "Tarih/saat" @@ -530,6 +596,11 @@ msgstr "Kullanıcı" msgid "Action" msgstr "Eylem" +msgid "entry" +msgid_plural "entries" +msgstr[0] "giriş" +msgstr[1] "giriş" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -586,9 +657,12 @@ msgstr "Başka bir %(model)s ekle" msgid "Delete selected %(model)s" msgstr "Seçilen %(model)s sil" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" -"Bugün Web sitesinde biraz güzel zaman geçirdiğiniz için teşekkür ederiz." +#, python-format +msgid "View selected %(model)s" +msgstr "Seçilen %(model)s görüntüle" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Bugün web sitesine ayırdığınız kaliteli zaman için teşekkür ederiz." msgid "Log in again" msgstr "Tekrar oturum aç" @@ -686,6 +760,9 @@ msgstr "E-posta adresi:" msgid "Reset my password" msgstr "Parolamı sıfırla" +msgid "Select all objects on this page for an action" +msgstr "Bir eylem için bu sayfadaki tüm nesneleri seç" + msgid "All dates" msgstr "Tüm tarihler" diff --git a/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo index cf61c236433a..ca1c3191790e 100644 Binary files a/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po index d883f5ca3bdc..f45b7aa1f6c6 100644 --- a/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/tr/LC_MESSAGES/djangojs.po @@ -1,19 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: -# BouRock, 2015-2016,2019 +# BouRock, 2015-2016,2019-2023 # BouRock, 2014 # Jannis Leidel , 2011 # Metin Amiroff , 2011 -# Murat Çorlu , 2012 +# Murat Çorlu , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-09-17 07:46+0000\n" -"Last-Translator: BouRock\n" -"Language-Team: Turkish (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: BouRock, 2015-2016,2019-2023\n" +"Language-Team: Turkish (http://app.transifex.com/django/django/language/" "tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,6 +66,10 @@ msgstr "" "ondan sonra iki kutu arasındaki \"Kaldır\" okuna tıklayarak " "kaldırabilirsiniz." +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "Seçilen %s listesini süzmek için bu kutu içine yazın." + msgid "Remove all" msgstr "Tümünü kaldır" @@ -73,6 +77,12 @@ msgstr "Tümünü kaldır" msgid "Click to remove all chosen %s at once." msgstr "Bir kerede tüm seçilen %s kaldırılması için tıklayın." +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s seçilen seçenek görünür değil" +msgstr[1] "%s seçilen seçenek görünür değil" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "%(sel)s / %(cnt)s seçildi" @@ -86,20 +96,20 @@ msgstr "" "bir eylem çalıştırırsanız, kaydedilmemiş değişiklikleriniz kaybolacaktır." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Bir eylem seçtiniz, fakat henüz bireysel alanlara değişikliklerinizi " -"kaydetmediniz. Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi " -"yeniden çalıştırmanız gerekecek." +"Bir eylem seçtiniz, ancak değişikliklerinizi tek tek alanlara kaydetmediniz. " +"Kaydetmek için lütfen TAMAM düğmesine tıklayın. Eylemi yeniden çalıştırmanız " +"gerekecek." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Bir eylem seçtiniz, fakat bireysel alanlar üzerinde hiçbir değişiklik " +"Bir eylem seçtiniz, ancak tek tek alanlarda herhangi bir değişiklik " "yapmadınız. Muhtemelen Kaydet düğmesi yerine Git düğmesini arıyorsunuz." msgid "Now" @@ -186,6 +196,103 @@ msgstr "Kasım" msgid "December" msgstr "Aralık" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Oca" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Şub" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Mar" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Nis" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "May" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Haz" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Tem" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Ağu" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Eyl" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Eki" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Kas" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Ara" + +msgid "Sunday" +msgstr "Pazar" + +msgid "Monday" +msgstr "Pazartesi" + +msgid "Tuesday" +msgstr "Salı" + +msgid "Wednesday" +msgstr "Çarşamba" + +msgid "Thursday" +msgstr "Perşembe" + +msgid "Friday" +msgstr "Cuma" + +msgid "Saturday" +msgstr "Cumartesi" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "Paz" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "Pzt" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "Sal" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "Çrş" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "Per" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "Cum" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "Cmt" + msgctxt "one letter Sunday" msgid "S" msgstr "P" diff --git a/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo b/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo new file mode 100644 index 000000000000..13b8d2c1443e Binary files /dev/null and b/django/contrib/admin/locale/ug/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/ug/LC_MESSAGES/django.po b/django/contrib/admin/locale/ug/LC_MESSAGES/django.po new file mode 100644 index 000000000000..bdac66a88d0b --- /dev/null +++ b/django/contrib/admin/locale/ug/LC_MESSAGES/django.po @@ -0,0 +1,790 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# abdl erkin <84247764@qq.com>, 2018 +# ABDULLA , 2014 +# Abduqadir Abliz , 2023-2024 +# Azat, 2023 +# Murat Orhun , 2023 +# Natalia, 2023 +# Serpidin Uyghur, 2023 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-10-07 07:05+0000\n" +"Last-Translator: Abduqadir Abliz , 2023-2024\n" +"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "تاللانغان%(verbose_name_plural)sنى ئۆچۈر" + +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "%(count)d%(items)sمۇۋەپپەقىيەتلىك ئۆچۈرۈلدى" + +#, python-format +msgid "Cannot delete %(name)s" +msgstr "%(name)sنى ئۆچۈرەلمەيدۇ" + +msgid "Are you sure?" +msgstr "جەزىملەشتۈرەمسىز؟" + +msgid "Administration" +msgstr "باشقۇرۇش" + +msgid "All" +msgstr "ھەممىسى" + +msgid "Yes" +msgstr "ھەئە" + +msgid "No" +msgstr "ياق" + +msgid "Unknown" +msgstr "نامەلۇم" + +msgid "Any date" +msgstr "خالىغان چېسلا" + +msgid "Today" +msgstr "بۈگۈن" + +msgid "Past 7 days" +msgstr "ئۆتكەن 7 كۈن" + +msgid "This month" +msgstr "بۇ ئاي" + +msgid "This year" +msgstr "بۇ يىل" + +msgid "No date" +msgstr "چېسلا يوق" + +msgid "Has date" +msgstr "ۋاقتى بار " + +msgid "Empty" +msgstr "بوش" + +msgid "Not empty" +msgstr "بوش ئەمەس" + +#, python-format +msgid "" +"Please enter the correct %(username)s and password for a staff account. Note " +"that both fields may be case-sensitive." +msgstr "" +"Please enter the correct %(username)s and password for a staff account. " +"دىققەت ھەر ئىككى بۆلەك چوڭ كىچىك يېزىلىشنى پەرقلەندۈرۈشى مۇمكىن." + +msgid "Action:" +msgstr "ھەرىكەت:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "باشقا %(verbose_name)sنى قوشۇش" + +msgid "Remove" +msgstr "چىقىرىۋەت" + +msgid "Addition" +msgstr "قوشۇش" + +msgid "Change" +msgstr "ئۆزگەرتىش" + +msgid "Deletion" +msgstr "ئۆچۈر" + +msgid "action time" +msgstr "مەشغۇلات ۋاقتى" + +msgid "user" +msgstr "ئىشلەتكۈچى" + +msgid "content type" +msgstr "مەزمۇن تىپى" + +msgid "object id" +msgstr "ئوبىيكىت كىملىكى" + +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) +msgid "object repr" +msgstr "ئوبيېكت ۋەكىلى" + +msgid "action flag" +msgstr "ھەرىكەت بايرىقى" + +msgid "change message" +msgstr "ئۇچۇرنى ئۆزگەرتىش" + +msgid "log entry" +msgstr "خاتىرە تۈرى" + +msgid "log entries" +msgstr "خاتىرە تۈرلىرى" + +#, python-format +msgid "Added “%(object)s”." +msgstr "%(object)sقوشۇلدى" + +#, python-format +msgid "Changed “%(object)s” — %(changes)s" +msgstr "%(object)s%(changes)s گە ئۆزگەرتىلدى" + +#, python-format +msgid "Deleted “%(object)s.”" +msgstr "%(object)sئۆچۈرۈلدى" + +msgid "LogEntry Object" +msgstr "خاتىرە تۈرى ئوبيېكتى" + +#, python-brace-format +msgid "Added {name} “{object}”." +msgstr "{name} “{object}” قا قوشۇلدى" + +msgid "Added." +msgstr "قوشۇلدى." + +msgid "and" +msgstr "ۋە" + +#, python-brace-format +msgid "Changed {fields} for {name} “{object}”." +msgstr "{name} “{object}” نىڭ {fields} ئۆزگەرتىلدى" + +#, python-brace-format +msgid "Changed {fields}." +msgstr "ئۆزگەرگەن {fields}." + +#, python-brace-format +msgid "Deleted {name} “{object}”." +msgstr "ئۆچۈرۈلگەن {name} “{object}”" + +msgid "No fields changed." +msgstr "ھېچقانداق مەيدان ئۆزگەرمىدى" + +msgid "None" +msgstr "يوق" + +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "Mac دىكى «كونترول» ياكى «Ctrl» نى بېسىپ ، بىردىن كۆپنى تاللاڭ." + +msgid "Select this object for an action - {}" +msgstr "مەشغۇلات ئۈچۈن ئوبيېكت تاللىنىدۇ-{}" + +#, python-brace-format +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى." + +msgid "You may edit it again below." +msgstr "تۆۋەندە قايتا تەھرىرلىسىڭىز بولىدۇ." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "" +"{name} “{obj}” مۇۋەپپەقىيەتلىك قوشۇلدى. تۆۋەندە باشقا {name} قوشسىڭىز بولىدۇ." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "" +"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە ئۇنى قايتا تەھرىرلىسىڭىز " +"بولىدۇ." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "" +"{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى. تۆۋەندە باشقا {name} قوشسىڭىز " +"بولىدۇ." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” مۇۋەپپەقىيەتلىك ئۆزگەرتىلدى." + +msgid "" +"Items must be selected in order to perform actions on them. No items have " +"been changed." +msgstr "" +"ھەرىكەت ئىجرا قىلىش ئۈچۈن تۈرلەر تاللىنىشى كېرەك. ھېچقانداق تۈر " +"ئۆزگەرتىلمىدى." + +msgid "No action selected." +msgstr "ھېچقانداق ھەرىكەت تاللىنمىدى." + +#, python-format +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s\"%(obj)s\" مۇۋەپپەقىيەتلىك ئۆچۈرۈلدى." + +#, python-format +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "ID سى \"%(key)s\" بولغان %(name)s مەۋجۇت ئەمەس. بەلكىم ئۇ ئۆچۈرۈلگەن؟" + +#, python-format +msgid "Add %s" +msgstr "%s نى قوش" + +#, python-format +msgid "Change %s" +msgstr "%sنى ئۆزگەرت" + +#, python-format +msgid "View %s" +msgstr "%sكۆرۈش" + +msgid "Database error" +msgstr "ساندان خاتالىقى" + +#, python-format +msgid "%(count)s %(name)s was changed successfully." +msgid_plural "%(count)s %(name)s were changed successfully." +msgstr[0] "%(count)sنى %(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى." +msgstr[1] "%(count)sنى%(name)sگە ئۆزگەرتىش مۇۋەپپىقىيەتلىك بولدى" + +#, python-format +msgid "%(total_count)s selected" +msgid_plural "All %(total_count)s selected" +msgstr[0] "ھەممە%(total_count)sتاللاندى " +msgstr[1] "ھەممە%(total_count)sتاللاندى" + +#, python-format +msgid "0 of %(cnt)s selected" +msgstr "%(cnt)s تۈردىن 0 نى تاللىدىڭىز." + +#, python-format +msgid "Change history: %s" +msgstr "تارىخنى ئۆزگەرتىش: %s" + +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. +#, python-format +msgid "%(class_name)s %(instance)s" +msgstr "%(class_name)s%(instance)s" + +#, python-format +msgid "" +"Deleting %(class_name)s %(instance)s would require deleting the following " +"protected related objects: %(related_objects)s" +msgstr "" +"%(class_name)s%(instance)s نى ئۆچۈرۈش قوغدالغان تۆۋەندىكى ئۇچۇرلارنى " +"ئۆچۈرۈشنى تەلەپ قىلىدۇ: %(related_objects)s" + +msgid "Django site admin" +msgstr "جانگو تور بېكەت باشقۇرغۇچى" + +msgid "Django administration" +msgstr "جانگو باشقۇرۇش" + +msgid "Site administration" +msgstr "تور بېكەت باشقۇرۇش" + +msgid "Log in" +msgstr "كىرىش" + +#, python-format +msgid "%(app)s administration" +msgstr "%(app)s باشقۇرۇش" + +msgid "Page not found" +msgstr "بەت تېپىلمىدى" + +msgid "We’re sorry, but the requested page could not be found." +msgstr "كەچۈرۈڭ، لېكىن تەلەب قىلىنغان بەت تېپىلمىدى." + +msgid "Home" +msgstr "باش بەت" + +msgid "Server error" +msgstr "مۇلازىمېتىر خاتالىقى" + +msgid "Server error (500)" +msgstr "مۇلازىمېتىر خاتالىقى (500)" + +msgid "Server Error (500)" +msgstr "مۇلازىمېتىر خاتالىقى (500)" + +msgid "" +"There’s been an error. It’s been reported to the site administrators via " +"email and should be fixed shortly. Thanks for your patience." +msgstr "" +"خاتالىق كۆرۈلدى. بۇ ئۇچۇر تور بېكەت باشقۇرغۇچىلارغا ئېلخەت ئارقىلىق " +"ئۇقتۇرۇلدى ۋە تېزدىن تۈزۈتۈلىدۇ. سەبرىڭىزگە رەھمەت." + +msgid "Run the selected action" +msgstr "تاللانغان مەشغۇلاتنى ئىجرا قىل" + +msgid "Go" +msgstr "يۆتكەل" + +msgid "Click here to select the objects across all pages" +msgstr "بارلىق بەتلەردىكى ئوبىيكتلەرنى تاللاش ئۈچۈن بۇ يەرنى چېكىڭ." + +#, python-format +msgid "Select all %(total_count)s %(module_name)s" +msgstr "بارىلىق %(total_count)s%(module_name)s نى تاللا" + +msgid "Clear selection" +msgstr "تاللىغاننى تازىلا" + +msgid "Breadcrumbs" +msgstr "يول كۆرسەتكۈچى" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s پروگراممىسىدىكى مودېللار" + +msgid "Add" +msgstr "قوش" + +msgid "View" +msgstr "كۆرۈنۈش" + +msgid "You don’t have permission to view or edit anything." +msgstr "سىزنىڭ كۆرۈش ياكى تەھرىرلەش ھوقۇقىڭىز يوق." + +msgid "" +"First, enter a username and password. Then, you’ll be able to edit more user " +"options." +msgstr "" +"ئالدى بىلەن، ئىشلەتكۈچى ئاتى ۋە ئىم كىرگۈزۈلىدۇ. ئاندىن، تېخىمۇ كۆپ " +"ئىشلەتكۈچى تاللانمىلىرىنى تەھرىرلىيەلەيسىز." + +msgid "Enter a username and password." +msgstr "ئىشلەتكۈچى ئاتى ۋە پارول كىرگۈزۈڭ." + +msgid "Change password" +msgstr "پارولنى ئۆزگەرتىش" + +msgid "Set password" +msgstr "پارول تەڭشەك" + +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." +msgstr[1] "تۆۋەندىكى خاتالىقلارنى توغرىلاڭ." + +#, python-format +msgid "Enter a new password for the user %(username)s." +msgstr "ئىشلەتكۈچى %(username)s ئۈچۈن يېڭى پارول كىرگۈزۈڭ." + +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "" +"بۇ مەشغۇلات مەزكۇر ئىشلەتكۈچىنىڭ ئىم ئاساسىدىكى دەلىللىشىنى " +"قوزغىتىدۇ" + +msgid "Disable password-based authentication" +msgstr "ئىم ئاساسىدىكى دەلىللەشنى چەكلەيدۇ" + +msgid "Enable password-based authentication" +msgstr "ئىم ئاساسىدىكى دەلىللەشنى قوزغىتىدۇ" + +msgid "Skip to main content" +msgstr "ئاساسلىق مەزمۇنغا ئاتلا" + +msgid "Welcome," +msgstr "مەرھابا،" + +msgid "View site" +msgstr "بېكەتنى كۆرۈش " + +msgid "Documentation" +msgstr "قوللانمىلار" + +msgid "Log out" +msgstr "چىكىنىش" + +#, python-format +msgid "Add %(name)s" +msgstr "%(name)sنى قوشۇش" + +msgid "History" +msgstr "تارىخ" + +msgid "View on site" +msgstr "بېكەتتە كۆرۈش " + +msgid "Filter" +msgstr "سۈزگۈچ" + +msgid "Hide counts" +msgstr "ساناقنى يوشۇر" + +msgid "Show counts" +msgstr "ساناقنى كۆرسەت" + +msgid "Clear all filters" +msgstr "ھەممە سۈزگۈچلەرنى تازىلا" + +msgid "Remove from sorting" +msgstr "تەرتىپلەشتىن چىقىرىۋەت" + +#, python-format +msgid "Sorting priority: %(priority_number)s" +msgstr "تەرتىپلەش دەرىجىسى: %(priority_number)s" + +msgid "Toggle sorting" +msgstr "تەرتىپلەشنى ئالماشتۇرۇش" + +msgid "Toggle theme (current theme: auto)" +msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: ئاپتوماتىك)" + +msgid "Toggle theme (current theme: light)" +msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: يورۇق)" + +msgid "Toggle theme (current theme: dark)" +msgstr "تېمىنى ئالماشتۇرۇش (ھازىرقى تېما: قارا)" + +msgid "Delete" +msgstr "ئۆچۈر" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"%(object_name)s%(escaped_object)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى " +"ئۆچۈرۈشكە زۆرۈرلىنىدۇ ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى " +"ئۆچۈرۈش ھوقۇقى يوق:" + +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the " +"following protected related objects:" +msgstr "" +"%(object_name)s 's '%(escaped_object)s' نى ئۆچۈرۈش، تۆۋەندىكى قوغداق " +"قوغدالغان ئۇچۇرلارنى ئۆچۈرۈشنى تەلەپ قىلىدۇ:" + +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"%(object_name)s %(escaped_object)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى " +"بارلىق باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" + +msgid "Objects" +msgstr "ئوبىيكتلار" + +msgid "Yes, I’m sure" +msgstr "ھەئە، شۇنداق" + +msgid "No, take me back" +msgstr "ياق، كەينىگە ياندۇر" + +msgid "Delete multiple objects" +msgstr "كۆپ ئوبىيكتنى ئ‍ۆچۈرۈش" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would result in deleting related " +"objects, but your account doesn't have permission to delete the following " +"types of objects:" +msgstr "" +"تاللانغان %(objects_name)s نى ئۆچۈرۈش، ئۇنىڭغا باغلىق نەرسىلەرنى ئۆچۈرۈشكە " +"ئۆتۈرۈلۈدۇ، لېكىن سىزنىڭ ھېساباتىڭىزدا تۆۋەندىكى تۈرلەرنى ئۆچۈرۈش ھوقۇقى يوق:" + +#, python-format +msgid "" +"Deleting the selected %(objects_name)s would require deleting the following " +"protected related objects:" +msgstr "" +"تاللانغان %(objects_name)s نى ئۆچۈرۈش، تۆۋەندىكى قوغداق قوغدالغان ئۇچۇرلارنى " +"ئۆچۈرۈشنى تەلەپ قىلىدۇ:" + +#, python-format +msgid "" +"Are you sure you want to delete the selected %(objects_name)s? All of the " +"following objects and their related items will be deleted:" +msgstr "" +"تاللانغان %(objects_name)s نى راستلا ئۆچۈرۈشنى خالامسىز؟ تۆۋەندىكى بارلىق " +"نەرسىلەر ۋە ئۇلارغا باغلىق تۈرلەر ئۆچۈرۈلىدۇ:" + +msgid "Delete?" +msgstr "ئۆچۈرۈۋېتەمسىز؟" + +#, python-format +msgid " By %(filter_title)s " +msgstr "%(filter_title)s بويىچە" + +msgid "Summary" +msgstr "ئۈزۈندە" + +msgid "Recent actions" +msgstr "يېقىنقى مەشغۇلاتلار" + +msgid "My actions" +msgstr "مەشغۇلاتلىرىم" + +msgid "None available" +msgstr "ھېچنېمە يوق" + +msgid "Added:" +msgstr "قوشۇلدى:" + +msgid "Changed:" +msgstr "ئۆزگەردى:" + +msgid "Deleted:" +msgstr "ئۆچۈرۈلدى:" + +msgid "Unknown content" +msgstr "بەلگىلەنمىگەن مەزمۇن" + +msgid "" +"Something’s wrong with your database installation. Make sure the appropriate " +"database tables have been created, and make sure the database is readable by " +"the appropriate user." +msgstr "" +"سىزنىڭ مەلۇمات سانداننىڭ ئورنىتىشىدا بىرنەمە مەسىلە بار. توغرا ساندان " +"جەدۋىلى قۇرۇلغانلىقىنى جەزملەڭ، ۋە سانداننىڭ توغرا ئىشلەتكۈچى تەرىپىدىن " +"ئوقۇلىدىغانلىقىنى جەزملەڭ." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"سىز %(username)s دېگەن ئىشلەتكۈچى ھېساباتى بىلەن كىرگەنسىز، لېكىن بۇ بەتكە " +"كىرىش ھوقۇقىڭىز يوق. باشقا ھېساباتقا كىرىشنى خالامسىز؟" + +msgid "Forgotten your password or username?" +msgstr "پارول ياكى ئىشلەتكۈچى ئاتىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟" + +msgid "Toggle navigation" +msgstr "يۆل باشلىغۇچنى ئالماشتۇرۇش" + +msgid "Sidebar" +msgstr "يان بالداق" + +msgid "Start typing to filter…" +msgstr " فىلتىرلاش ئۈچۈن يېزىشنى باشلاڭ…" + +msgid "Filter navigation items" +msgstr "يۆل باشقۇرۇش تۈرلەرىنى سۈزۈش" + +msgid "Date/time" +msgstr "چېسلا/ۋاقىت" + +msgid "User" +msgstr "ئىشلەتكۈچى" + +msgid "Action" +msgstr "مەشغۇلات" + +msgid "entry" +msgid_plural "entries" +msgstr[0] "تۈرى" +msgstr[1] "تۈرى" + +msgid "" +"This object doesn’t have a change history. It probably wasn’t added via this " +"admin site." +msgstr "" +"بۇ ئوبىيكتنىڭ ئۆزگەرتىش تارىخى يوق. بۇنى مۇمكىن بۇ باشقۇرۇش بېتى ئارقىلىق " +"قوشمىغان بولۇشى مۇمكىن." + +msgid "Show all" +msgstr "ھەممىنى كۆرسەت" + +msgid "Save" +msgstr "ساقلا" + +msgid "Popup closing…" +msgstr "قاڭقىشنى تاقاۋاتىدۇ…" + +msgid "Search" +msgstr "ئىزدە" + +#, python-format +msgid "%(counter)s result" +msgid_plural "%(counter)s results" +msgstr[0] "%(counter)s نەتىجە" +msgstr[1] "%(counter)s نەتىجەسى" + +#, python-format +msgid "%(full_result_count)s total" +msgstr "%(full_result_count)s جەمى" + +msgid "Save as new" +msgstr "يېڭىدىن ساقلاش" + +msgid "Save and add another" +msgstr "ساقلاپ يېڭىسىنى قوشۇش" + +msgid "Save and continue editing" +msgstr "تەھرىرلەشنى داۋاملاشتۇرۇپ ساقلاش" + +msgid "Save and view" +msgstr "ساقلاش ۋە كۆرۈش" + +msgid "Close" +msgstr "ياپ" + +#, python-format +msgid "Change selected %(model)s" +msgstr "تاللانغان%(model)sنى ئۆزگەرت" + +#, python-format +msgid "Add another %(model)s" +msgstr "باشقا %(model)s قوش" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "تاللىغان %(model)s نى ئۆچۈر" + +#, python-format +msgid "View selected %(model)s" +msgstr "تاللىغان %(model)s نى كۆرسەت" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "بۈگۈن تور بېكەتتە ساپالىق ۋاقىت سەرىب قىلغىنىڭىزغا رەھمەت." + +msgid "Log in again" +msgstr "قايتا كىرىڭ" + +msgid "Password change" +msgstr "پارولنى ئۆزگەرتىش" + +msgid "Your password was changed." +msgstr "پارولىڭىز ئۆزگەرتىلگەن" + +msgid "" +"Please enter your old password, for security’s sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"بىخەتەرلىك ئۈچۈن ئەسلى پارولىڭىزنى كىرگۈزۈڭ، ئاندىن يېڭى پارولىڭىزنى ئىككى " +"قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا يېزىب بولغىنىڭىزنى دەلىللەيمىز." + +msgid "Change my password" +msgstr "پارولىمنى ئۆزگەرتىىمەن" + +msgid "Password reset" +msgstr "ئىمنى ئەسلىگە قايتۇرۇش" + +msgid "Your password has been set. You may go ahead and log in now." +msgstr "پارول ئۆزگەرتىلدى. داۋاملاشتۇرۇپ تىزىمغا كىرسىڭىز بولىدۇ." + +msgid "Password reset confirmation" +msgstr "پارول ئەسلىگە قايتۇرۇشنى جەزملەش" + +msgid "" +"Please enter your new password twice so we can verify you typed it in " +"correctly." +msgstr "" +"يېڭى پارولىڭىزنى ئىككى قېتىم كىرگۈزۈڭ، بۇنىڭ ئارقىلىق سىز توغرا كىرگۈزۈب " +"بولغىنىڭىزنى دەلىللەيمىز." + +msgid "New password:" +msgstr "يېڭى پارول:" + +msgid "Confirm password:" +msgstr "پارولنى جەزملە:" + +msgid "" +"The password reset link was invalid, possibly because it has already been " +"used. Please request a new password reset." +msgstr "" +"پارولنى قايتا بەلگىلەش ئۈچۈن بېرىلگەن ئۇلانما ئىناۋەتسىز بولدى، بۇ ئۇلانما " +"ئاللىبۇرۇن ئىشلىتىلگەن بولۇشى مۇمكىن. يېڭى پارولنى قايتا بەلگىلەش ئۈچۈن " +"ئىلتىماس قىلىڭ." + +msgid "" +"We’ve emailed you instructions for setting your password, if an account " +"exists with the email you entered. You should receive them shortly." +msgstr "" +"سىز كىرگۈزگەن ئېلخەت ئادرېسىغا ھېسابات بولسا، پارول قويۇش ئۈچۈن سىزگە ئېلخەت " +"ئارقىلىق چۈشەندۈرۈش يوللىدۇق. سىز قىسقا ۋاقىت ئىچىدە ئۇخەتنى تاپشۇرۇب " +"ئېلىشىڭىز كېرەك." + +msgid "" +"If you don’t receive an email, please make sure you’ve entered the address " +"you registered with, and check your spam folder." +msgstr "" +"ئېلخەت تاپشۇرۇپ ئالمىغان بولسىڭىز، تىزىملىتىپ بولغان ئېلخەت ئادرېسىڭىزنى " +"توغرا كىرگۈزگەنلىكىڭىزنى جەزملەڭ ۋە ئېلخەت ئادرېسىڭىزنىڭ ئەخلەت ساندۇغىنى " +"تەكشۈرۈڭ." + +#, python-format +msgid "" +"You're receiving this email because you requested a password reset for your " +"user account at %(site_name)s." +msgstr "" +"سىز بۇ ئېلخەتنى تاپشۇرۇب ئالدىڭىز، چۈنكى ، %(site_name)s دىكى ئىشلەتكۈچى " +"ھېساباتىڭىزنىڭ پارولىنى قايتا بەلگىلەشنى ئىلتىماس قىلدى." + +msgid "Please go to the following page and choose a new password:" +msgstr "كىيىنكى بەتكە كىرىڭ ۋە بىر شىفرە تاللاڭ:" + +msgid "Your username, in case you’ve forgotten:" +msgstr "ئىشلەتكۈچى ئىسمىڭىز، ئۇنتۇپ قالغان ئەھۋال ئاستىدا:" + +msgid "Thanks for using our site!" +msgstr "تور بېكىتىمىزنى ئىشلەتكىنىڭىز ئۈچۈن رەھمەت!" + +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s قوشۇنى" + +msgid "" +"Forgotten your password? Enter your email address below, and we’ll email " +"instructions for setting a new one." +msgstr "" +"شىفرىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟ تۆۋەنگە ئېلىكتىرونلۇق ئېلىخەت ئادرىسىڭىزنى " +"كىرگۈزۈڭ، يېڭىسىنى تەڭشەش ئۈچۈن كۆرسەتمىلىك ئېلىخەت ئەۋەتىمىز ." + +msgid "Email address:" +msgstr "ئېلخەت ئادرېسى:" + +msgid "Reset my password" +msgstr "پارولىمنى قايتا بەلگىلەش" + +msgid "Select all objects on this page for an action" +msgstr "مەشغۇلات ئۈچۈن بۇ بەتتىكى ھەممە ئوبيېكت تاللىنىدۇ" + +msgid "All dates" +msgstr "بارلىق چىسلا" + +#, python-format +msgid "Select %s" +msgstr "%sنى تاللاش" + +#, python-format +msgid "Select %s to change" +msgstr "تاللانغان %sنى ئۆزگەرتش" + +#, python-format +msgid "Select %s to view" +msgstr "تاللانغان %sنى كۆرۈش" + +msgid "Date:" +msgstr "چېسلا:" + +msgid "Time:" +msgstr "ۋاقتى:" + +msgid "Lookup" +msgstr "ئىزدە" + +msgid "Currently:" +msgstr "نۆۋەتتە:" + +msgid "Change:" +msgstr "ئۆزگەرتىش:" diff --git a/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo new file mode 100644 index 000000000000..a0662270a279 Binary files /dev/null and b/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po new file mode 100644 index 000000000000..90c0a8801d1e --- /dev/null +++ b/django/contrib/admin/locale/ug/LC_MESSAGES/djangojs.po @@ -0,0 +1,323 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Abduqadir Abliz , 2023 +# Azat, 2023 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-04 07:59+0000\n" +"Last-Translator: Abduqadir Abliz , 2023\n" +"Language-Team: Uyghur (http://app.transifex.com/django/django/language/ug/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#, javascript-format +msgid "Available %s" +msgstr "ئىشلەتكىلى بولىدىغانى %s" + +#, javascript-format +msgid "" +"This is the list of available %s. You may choose some by selecting them in " +"the box below and then clicking the \"Choose\" arrow between the two boxes." +msgstr "" +"بۇ، تاللاشقا بولىدىغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن " +"بەزىلىرنى تاللاڭ ئاندىن «تاللاش» نى چېكىڭ." + +#, javascript-format +msgid "Type into this box to filter down the list of available %s." +msgstr "بۇ رامكىغا يېزىش ئارقىلىق قاتناشقىلى بولىدىغان %s تىزىملىكىنى سۈزۈڭ." + +msgid "Filter" +msgstr "سۈزگۈچ" + +msgid "Choose all" +msgstr "ھەممىنى تاللا" + +#, javascript-format +msgid "Click to choose all %s at once." +msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى تاللاڭ" + +msgid "Choose" +msgstr "تاللا" + +msgid "Remove" +msgstr "چىقىرىۋەت" + +#, javascript-format +msgid "Chosen %s" +msgstr "تاللانغانلىرى %s" + +#, javascript-format +msgid "" +"This is the list of chosen %s. You may remove some by selecting them in the " +"box below and then clicking the \"Remove\" arrow between the two boxes." +msgstr "" +"بۇ، تاللانغان %s تىزىملىكى. تۆۋەندىكى تىزىملىكلەر ئارىسىدىن بەزىلىرنى " +"تاللاڭ ئاندىن «چىقىرىش» نى چېكىڭ." + +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "بۇ رامكىغا يېزىش ئارقىلىق تاللانغان %s سۈزۈڭ." + +msgid "Remove all" +msgstr "ھەممىنى چىقىرىۋەت" + +#, javascript-format +msgid "Click to remove all chosen %s at once." +msgstr "بېسىب بارلىق تاللانغان %sنىڭ ھەممىسىنى چىقىرىۋېتىڭ" + +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s تاللانغانلىرى كۆرۈنمەيدۇ" +msgstr[1] "%s تاللانغانلىرى كۆرۈنمەيدۇ" + +msgid "%(sel)s of %(cnt)s selected" +msgid_plural "%(sel)s of %(cnt)s selected" +msgstr[0] "%(sel)s دىن %(cnt)s سى تاللاندى" +msgstr[1] "%(sel)s دىن %(cnt)s سى تاللاندى" + +msgid "" +"You have unsaved changes on individual editable fields. If you run an " +"action, your unsaved changes will be lost." +msgstr "" +"سىزنىڭ تېخى ساقلانمىغان ئۆزگەرتىشلىرىڭىز بار. ئەگەر سىز مەشخۇلاتىڭىزنى " +"داۋاملاشتۇرسىڭىز، ساقلانمىغان ئۆزگەرتىشلىرىڭىز يوقاب كېتىشى مۇمكىن" + +msgid "" +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " +"action." +msgstr "" +"سىز بىر مەشخۇلاتنى تاللىدىڭىز، ئەمما ئۆزگەرتىشلىرىڭىزنى ساقلىمىدىڭىز. ھەئە " +"نى بېسىب ساقلاڭ. ئاندىن مەشخۇلاتىڭىزنى قايتىدىن ئېلىب بېرىڭ." + +msgid "" +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " +"button." +msgstr "" +"سىز بىر ھەرىكەتنى تاللىدىڭىز ، ھەمدە ئايرىم ساھەدە ھېچقانداق ئۆزگەرتىش ئېلىپ " +"بارمىدىڭىز. سىز «ساقلاش» كۇنۇپكىسىنى ئەمەس ، بەلكى Go كۇنۇپكىسىنى " +"ئىزدەۋاتقان بولۇشىڭىز مۇمكىن." + +msgid "Now" +msgstr "ھازىرلا" + +msgid "Midnight" +msgstr "يېرىم كېچە" + +msgid "6 a.m." +msgstr "6 a.m." + +msgid "Noon" +msgstr "چۈش" + +msgid "6 p.m." +msgstr "6 p.m." + +#, javascript-format +msgid "Note: You are %s hour ahead of server time." +msgid_plural "Note: You are %s hours ahead of server time." +msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." +msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئالدىدا." + +#, javascript-format +msgid "Note: You are %s hour behind server time." +msgid_plural "Note: You are %s hours behind server time." +msgstr[0] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." +msgstr[1] "ئەسكەرتىش: سىز مۇلازىمېتىر ۋاقتىدىن %s سائەت ئارقىدا." + +msgid "Choose a Time" +msgstr "بىر ۋاقىت تاللاڭ" + +msgid "Choose a time" +msgstr "بىر ۋاقىت تاللاڭ" + +msgid "Cancel" +msgstr "ۋاز كەچ" + +msgid "Today" +msgstr "بۈگۈن" + +msgid "Choose a Date" +msgstr "بىر چېسلا تاللاڭ" + +msgid "Yesterday" +msgstr "تۈنۈگۈن" + +msgid "Tomorrow" +msgstr "ئەتە" + +msgid "January" +msgstr "يانۋار" + +msgid "February" +msgstr "فېۋرال" + +msgid "March" +msgstr "مارت" + +msgid "April" +msgstr "ئاپرىل" + +msgid "May" +msgstr "ماي" + +msgid "June" +msgstr "ئىيۇن" + +msgid "July" +msgstr "ئىيۇل" + +msgid "August" +msgstr "ئاۋغۇست" + +msgid "September" +msgstr "سىنتەبىر" + +msgid "October" +msgstr "ئۆكتەبىر" + +msgid "November" +msgstr "نويابىر" + +msgid "December" +msgstr "دىكابىر" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "يانۋار" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "فېۋرال" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "مارت" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "ئاپرېل" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "ماي" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "ئىيۇن" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "ئىيۇل" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "ئاۋغۇست" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "سېنتەبىر" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "ئۆكتەبىر" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "نويابىر" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "دىكابىر" + +msgid "Sunday" +msgstr "يەكشەنبە" + +msgid "Monday" +msgstr "دۈشەنبە" + +msgid "Tuesday" +msgstr "سەيشەنبە" + +msgid "Wednesday" +msgstr "چارشەمبە" + +msgid "Thursday" +msgstr "پەيشەمبە" + +msgid "Friday" +msgstr "جۈمە" + +msgid "Saturday" +msgstr "شەنبە" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "ي" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "د" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "س" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "چ" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "پ" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "ج" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "ش" + +msgctxt "one letter Sunday" +msgid "S" +msgstr "S" + +msgctxt "one letter Monday" +msgid "M" +msgstr "M" + +msgctxt "one letter Tuesday" +msgid "T" +msgstr "T" + +msgctxt "one letter Wednesday" +msgid "W" +msgstr "W" + +msgctxt "one letter Thursday" +msgid "T" +msgstr "T" + +msgctxt "one letter Friday" +msgid "F" +msgstr "F" + +msgctxt "one letter Saturday" +msgid "S" +msgstr "S" + +msgid "Show" +msgstr "كۆرسەت" + +msgid "Hide" +msgstr "يوشۇر" diff --git a/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo b/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo index 731bd86fd64c..e4abcc62e54f 100644 Binary files a/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/uk/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/uk/LC_MESSAGES/django.po b/django/contrib/admin/locale/uk/LC_MESSAGES/django.po index 593ccc35023b..1ce9de4965f6 100644 --- a/django/contrib/admin/locale/uk/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/uk/LC_MESSAGES/django.po @@ -1,16 +1,19 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Abbl Kto , 2021 # Oleksandr Chernihov , 2014 # Andriy Sokolovskiy , 2015 # Boryslav Larin , 2011 -# Денис Подлесный , 2016 +# Denis Podlesniy , 2016 # Igor Melnyk, 2014,2017 +# Illia Volochii , 2021-2023 # Ivan Dmytrenko , 2019 # Jannis Leidel , 2011 # Kirill Gagarski , 2015 # Max V. Stotsky , 2014 # Mikhail Kolesnik , 2015 +# Mykola Holovetskyi, 2022 # Mykola Zamkovoi , 2014 # Sergiy Kuzmenko , 2011 # tarasyyyk , 2018 @@ -19,9 +22,9 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-18 21:37+0000\n" -"Last-Translator: Ivan Dmytrenko \n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2023-04-25 07:05+0000\n" +"Last-Translator: Illia Volochii , 2021-2023\n" "Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" "uk/)\n" "MIME-Version: 1.0\n" @@ -33,6 +36,10 @@ msgstr "" "100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || " "(n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Видалити обрані %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Успішно видалено %(count)d %(items)s." @@ -44,10 +51,6 @@ msgstr "Не вдається видалити %(name)s" msgid "Are you sure?" msgstr "Ви впевнені?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Видалити обрані %(verbose_name_plural)s" - msgid "Administration" msgstr "Адміністрування" @@ -84,6 +87,12 @@ msgstr "Без дати" msgid "Has date" msgstr "Має дату" +msgid "Empty" +msgstr "Порожні" + +msgid "Not empty" +msgstr "Непорожні" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -141,22 +150,22 @@ msgid "log entries" msgstr "записи в журналі" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "Додано \"%(object)s\"." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" msgstr "Змінено \"%(object)s\" - %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "Видалено \"%(object)s.\"" msgid "LogEntry Object" msgstr "Об'єкт журнального запису" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "Додано {name} \"{object}\"." msgid "Added." @@ -166,7 +175,7 @@ msgid "and" msgstr "та" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." +msgid "Changed {fields} for {name} “{object}”." msgstr "Змінені {fields} для {name} \"{object}\"." #, python-brace-format @@ -174,7 +183,7 @@ msgid "Changed {fields}." msgstr "Змінені {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "Видалено {name} \"{object}\"." msgid "No fields changed." @@ -183,14 +192,13 @@ msgstr "Поля не змінені." msgid "None" msgstr "Ніщо" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Затисніть клавішу \"Control\", або \"Command\" на Mac, щоб обрати більше " -"однієї опції." +"Натисність \"Control\" або \"Command\" на Mac-пристрої, щоб вибрати більше " +"аніж один." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." +msgid "The {name} “{obj}” was added successfully." msgstr "{name} \"{obj}\" було додано успішно." msgid "You may edit it again below." @@ -198,32 +206,27 @@ msgstr "Ви можете відредагувати це знову." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "" -"{name} \"{obj}\" було додано успішно. Нижче Ви можете додати інше {name}." +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" "{name} \"{obj}\" було змінено успішно. Нижче Ви можете редагувати його знову." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "" -"{name} \"{obj}\" було додано успішно. Нижче Ви можете редагувати його знову." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" було додано успішно. Ви можете редагувати його знову." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "" -"{name} \"{obj}\" було змінено успішно. Нижче Ви можете додати інше {name}." +msgstr "{name} \"{obj}\" було змінено успішно. Ви можете додати інше {name}." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." +msgid "The {name} “{obj}” was changed successfully." msgstr "{name} \"{obj}\" було змінено успішно." msgid "" @@ -236,12 +239,12 @@ msgid "No action selected." msgstr "Дія не обрана." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgid "The %(name)s “%(obj)s” was deleted successfully." msgstr "%(name)s \"%(obj)s\" був видалений успішно." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "%(name)s з ID \"%(key)s\" не існує. Можливо воно було видалене?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s з ID \"%(key)s\" не існує. Можливо, воно було видалене?" #, python-format msgid "Add %s" @@ -282,8 +285,9 @@ msgstr "0 з %(cnt)s обрано" msgid "Change history: %s" msgstr "Історія змін: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -315,8 +319,8 @@ msgstr "Адміністрування %(app)s" msgid "Page not found" msgstr "Сторінка не знайдена" -msgid "We're sorry, but the requested page could not be found." -msgstr "Нам шкода, але сторінка яку ви запросили, не знайдена." +msgid "We’re sorry, but the requested page could not be found." +msgstr "На жаль, запрошену сторінку не знайдено." msgid "Home" msgstr "Домівка" @@ -331,11 +335,11 @@ msgid "Server Error (500)" msgstr "Помилка сервера (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"Виникла помилка. Адміністратора сайту повідомлено електронною поштою. " -"Помилка буде виправлена ​​найближчим часом. Дякуємо за ваше терпіння." +"Сталася помилка. Вона була відправлена адміністраторам сайту через email і " +"має бути вирішена швидко. Дякуємо за ваше терпіння." msgid "Run the selected action" msgstr "Виконати обрану дію" @@ -353,12 +357,25 @@ msgstr "Обрати всі %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Скинути вибір" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Моделі у %(name)s додатку" + +msgid "Add" +msgstr "Додати" + +msgid "View" +msgstr "Переглянути" + +msgid "You don’t have permission to view or edit anything." +msgstr "Ви не маєте дозволу переглядати чи редагувати будь-чого." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Спочатку введіть ім'я користувача і пароль. Після цього ви зможете " -"редагувати більше опцій користувача." +"Спершу, введіть користувацьке ім'я і пароль. Тоді, ви зможете редагувати " +"більше користувацьких опцій." msgid "Enter a username and password." msgstr "Введіть ім'я користувача і пароль." @@ -367,15 +384,19 @@ msgid "Change password" msgstr "Змінити пароль" msgid "Please correct the error below." -msgstr "Будь ласка, виправіть помилку нижче." - -msgid "Please correct the errors below." -msgstr "Будь ласка, виправте помилки, вказані нижче." +msgid_plural "Please correct the errors below." +msgstr[0] "Будь ласка, виправте наведену нижче помилку." +msgstr[1] "Будь ласка, виправте наведені нижче помилки." +msgstr[2] "Будь ласка, виправте наведені нижче помилки." +msgstr[3] "Будь ласка, виправте наведені нижче помилки." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Введіть новий пароль для користувача %(username)s." +msgid "Skip to main content" +msgstr "Перейти до основного вмісту" + msgid "Welcome," msgstr "Вітаємо," @@ -388,6 +409,9 @@ msgstr "Документація" msgid "Log out" msgstr "Вийти" +msgid "Breadcrumbs" +msgstr "Навігаційний рядок" + #, python-format msgid "Add %(name)s" msgstr "Додати %(name)s" @@ -401,6 +425,9 @@ msgstr "Дивитися на сайті" msgid "Filter" msgstr "Відфільтрувати" +msgid "Clear all filters" +msgstr "Очистити всі фільтри" + msgid "Remove from sorting" msgstr "Видалити з сортування" @@ -411,6 +438,15 @@ msgstr "Пріорітет сортування: %(priority_number)s" msgid "Toggle sorting" msgstr "Сортувати в іншому напрямку" +msgid "Toggle theme (current theme: auto)" +msgstr "Перемкнути тему (поточна тема: автоматична)" + +msgid "Toggle theme (current theme: light)" +msgstr "Перемкнути тему (поточна тема: світла)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Перемкнути тему (поточна тема: темна)" + msgid "Delete" msgstr "Видалити" @@ -443,7 +479,7 @@ msgstr "" msgid "Objects" msgstr "Об'єкти" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "Так, я впевнений" msgid "No, take me back" @@ -477,9 +513,6 @@ msgstr "" "Ви впевнені, що хочете видалити вибрані %(objects_name)s? Всі вказані " "об'єкти та пов'язані з ними елементи будуть видалені:" -msgid "View" -msgstr "Переглянути" - msgid "Delete?" msgstr "Видалити?" @@ -490,16 +523,6 @@ msgstr "За %(filter_title)s" msgid "Summary" msgstr "Резюме" -#, python-format -msgid "Models in the %(name)s application" -msgstr "Моделі у %(name)s додатку" - -msgid "Add" -msgstr "Додати" - -msgid "You don't have permission to view or edit anything." -msgstr "У вас немає дозволу на перегляд чи редагування чого-небудь." - msgid "Recent actions" msgstr "Недавні дії" @@ -513,12 +536,12 @@ msgid "Unknown content" msgstr "Невідомий зміст" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"Щось не так з інсталяцією бази даних. Перевірте, що відповідні таблиці бази " -"даних створені та база даних може бути прочитана відповідним користувачем." +"Щось не так з інсталяцією бази даних. Запевніться, що певні таблиці бази " +"даних були створені і що вона може бути прочитана певним користувачем." #, python-format msgid "" @@ -532,6 +555,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Забули пароль або ім'я користувача?" +msgid "Toggle navigation" +msgstr "Увімкнути навігацію" + +msgid "Sidebar" +msgstr "Бічна панель" + +msgid "Start typing to filter…" +msgstr "Почніть писати для фільтру..." + +msgid "Filter navigation items" +msgstr "Фільтрувати навігаційні об'єкти" + msgid "Date/time" msgstr "Дата/час" @@ -541,8 +576,15 @@ msgstr "Користувач" msgid "Action" msgstr "Дія" +msgid "entry" +msgid_plural "entries" +msgstr[0] "запис" +msgstr[1] "записи" +msgstr[2] "записи" +msgstr[3] "записи" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Цей об'єкт не має історії змін. Напевно, він був доданий не через цей сайт " @@ -599,8 +641,12 @@ msgstr "Додати ще одну %(model)s" msgid "Delete selected %(model)s" msgstr "Видалити обрану %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Дякуємо за час, проведений сьогодні на сайті." +#, python-format +msgid "View selected %(model)s" +msgstr "Переглянути обрану %(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "Дякуємо за час, який був проведений сьогодні на сайті." msgid "Log in again" msgstr "Увійти знову" @@ -612,11 +658,11 @@ msgid "Your password was changed." msgstr "Ваш пароль було змінено." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" -"Будь ласка введіть ваш старий пароль, задля безпеки, потім введіть ваш новий " -"пароль двічі для перевірки." +"Будь ласка введіть ваш старий пароль, заради безпеки, після цього введіть " +"ваш новий пароль двічі для верифікації коректності написаного." msgid "Change my password" msgstr "Змінити мій пароль" @@ -651,19 +697,18 @@ msgstr "" "було вже використано. Будь ласка, замовте нове перевстановлення паролю." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"На електронну адресу, яку ви ввели, надіслано ліста з інструкціями щодо " -"встановлення пароля, якщо обліковий запис з введеною адресою існує. Ви маєте " -"отримати його найближчим часом." +"Ми відправили вам інструкції для встановлення пароля, якщо обліковий запис з " +"введеною адресою існує. Ви маєте отримати їх найближчим часом." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Якщо Ви не отримали електронного листа, будь ласка переконайтеся, що ввели " -"адресу яку вказували при реєстрації та перевірте папку зі спамом." +"Якщо Ви не отримали електронного листа, переконайтеся, будь ласка, в " +"зареєстрованій адресі і перевірте папку \"Спам\"." #, python-format msgid "" @@ -676,8 +721,8 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Будь ласка, перейдіть на цю сторінку, та оберіть новий пароль:" -msgid "Your username, in case you've forgotten:" -msgstr "У разі, якщо ви забули, ваше ім'я користувача:" +msgid "Your username, in case you’ve forgotten:" +msgstr "Ваше користувацьке ім'я, у випадку, якщо ви забули:" msgid "Thanks for using our site!" msgstr "Дякуємо за користування нашим сайтом!" @@ -687,11 +732,11 @@ msgid "The %(site_name)s team" msgstr "Команда сайту %(site_name)s " msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"Забули пароль? Введіть свою email-адресу нижче і ми вишлемо інструкції по " -"встановленню нового." +"Забули пароль? Введіть свою email-адресу нижче і ми відправимо вам " +"інструкції по встановленню нового." msgid "Email address:" msgstr "Email адреса:" diff --git a/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo index f70d010ac202..20523fffac9b 100644 Binary files a/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po index 502c54871289..40e60de09424 100644 --- a/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/uk/LC_MESSAGES/djangojs.po @@ -3,17 +3,18 @@ # Translators: # Oleksandr Chernihov , 2014 # Boryslav Larin , 2011 -# Денис Подлесный , 2016 +# Denis Podlesniy , 2016 +# Illia Volochii , 2021 # Jannis Leidel , 2011 -# panasoft , 2016 +# Panasoft, 2016 # Sergey Lysach , 2011-2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2017-09-19 16:41+0000\n" -"Last-Translator: Денис Подлесный \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-10-21 18:50+0000\n" +"Last-Translator: Illia Volochii \n" "Language-Team: Ukrainian (http://www.transifex.com/django/django/language/" "uk/)\n" "MIME-Version: 1.0\n" @@ -92,20 +93,16 @@ msgstr "" "незбережені зміни буде втрачено." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Ви обрали дію, але не зберегли зміни в окремих полях. Будь ласка, натисніть " -"ОК, щоб зберегти. Вам доведеться повторно запустити дію." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Ви обрали дію і не зробили жодних змін у полях. Ви, напевно, шукаєте кнопку " -"\"Виконати\", а не \"Зберегти\"." msgid "Now" msgstr "Зараз" @@ -195,6 +192,54 @@ msgstr "листопада" msgid "December" msgstr "грудня" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Січ." + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Лют." + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Берез." + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Квіт." + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Трав." + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Черв." + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Лип." + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Серп." + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Верес." + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Жовт." + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Листоп." + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Груд." + msgctxt "one letter Sunday" msgid "S" msgstr "Н" diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo b/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo index 66b854d9a302..253820c477e6 100644 Binary files a/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/django.po b/django/contrib/admin/locale/uz/LC_MESSAGES/django.po index 767edf7f5ba7..8b4f8fd6b8ec 100644 --- a/django/contrib/admin/locale/uz/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/uz/LC_MESSAGES/django.po @@ -1,45 +1,48 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Alex Ibragimov, 2021 # Anvar Ulugov , 2020 # Bedilbek Khamidov , 2019 # Claude Paroz , 2019 +# Nuriddin Islamov, 2021 +# Shukrullo Turgunov , 2021,2024 # Sukhrobbek Ismatov , 2019 # Yet Sum , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-08 17:27+0200\n" -"PO-Revision-Date: 2020-01-21 09:24+0000\n" -"Last-Translator: Anvar Ulugov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-25 07:05+0000\n" +"Last-Translator: Shukrullo Turgunov , 2021,2024\n" +"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uz\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "%(verbose_name_plural)s larni o'chirish" + #, python-format msgid "Successfully deleted %(count)d %(items)s." -msgstr "Muvaffaqiyatli %(count)d%(items)s o'chirildi." +msgstr "%(count)d%(items)s muvaffaqiyatli o'chirildi." #, python-format msgid "Cannot delete %(name)s" -msgstr "%(name)s o'chirib bo'lmaydi" +msgstr "%(name)s o'chirib bo'lmadi" msgid "Are you sure?" msgstr "Ishonchingiz komilmi?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s tanlanganlarini o'chirish" - msgid "Administration" msgstr "Administratsiya" msgid "All" -msgstr "Hammasi" +msgstr "Barchasi" msgid "Yes" msgstr "Ha" @@ -71,6 +74,12 @@ msgstr "Sanasi yo'q" msgid "Has date" msgstr "Sanasi bor" +msgid "Empty" +msgstr "Bo'sh" + +msgid "Not empty" +msgstr "Bo'sh emas" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " @@ -84,10 +93,10 @@ msgstr "Harakat:" #, python-format msgid "Add another %(verbose_name)s" -msgstr "Boshqa%(verbose_name)s qo‘shish" +msgstr "Boshqa %(verbose_name)s qo‘shish" msgid "Remove" -msgstr "Olib tashlash" +msgstr "O'chirish" msgid "Addition" msgstr " Qo'shish" @@ -122,22 +131,22 @@ msgid "change message" msgstr "xabarni o'zgartirish" msgid "log entry" -msgstr "" +msgstr "jurnal yozuvi" msgid "log entries" -msgstr "" +msgstr "jurnal yozuvlari" #, python-format msgid "Added “%(object)s”." -msgstr "" +msgstr "\"%(object)s\" qo'shildi." #, python-format msgid "Changed “%(object)s” — %(changes)s" -msgstr "" +msgstr "%(object)s dan %(changes)sga o'zgartirildi." #, python-format msgid "Deleted “%(object)s.”" -msgstr "" +msgstr "\"%(object)s\" o'chirildi." msgid "LogEntry Object" msgstr "" @@ -150,7 +159,7 @@ msgid "Added." msgstr "" msgid "and" -msgstr "" +msgstr "va" #, python-brace-format msgid "Changed {fields} for {name} “{object}”." @@ -173,6 +182,9 @@ msgstr "Bo'sh" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +msgid "Select this object for an action - {}" +msgstr "" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "" @@ -226,14 +238,14 @@ msgstr "Qo'shish %s" #, python-format msgid "Change %s" -msgstr "O'zgartirish %s" +msgstr "%sni o'zgartirish" #, python-format msgid "View %s" msgstr "Ko'rish %s" msgid "Database error" -msgstr "" +msgstr "Ma'lumotlar bazasi xatoligi yuz berdi" #, python-format msgid "%(count)s %(name)s was changed successfully." @@ -253,8 +265,9 @@ msgstr "" msgid "Change history: %s" msgstr "" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -320,6 +333,22 @@ msgstr "" msgid "Clear selection" msgstr "" +msgid "Breadcrumbs" +msgstr "" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +msgid "Add" +msgstr "Qo'shish" + +msgid "View" +msgstr "Ko'rish" + +msgid "You don’t have permission to view or edit anything." +msgstr "" + msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." @@ -332,15 +361,16 @@ msgid "Change password" msgstr "Parolni o'zgartirish" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" +msgid_plural "Please correct the errors below." +msgstr[0] "" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" +msgid "Skip to main content" +msgstr "" + msgid "Welcome," msgstr "Xush kelibsiz," @@ -355,7 +385,7 @@ msgstr "Chiqish" #, python-format msgid "Add %(name)s" -msgstr "" +msgstr "%(name)sqo'shish" msgid "History" msgstr "" @@ -366,6 +396,15 @@ msgstr "Saytda ko'rish" msgid "Filter" msgstr "Saralash" +msgid "Hide counts" +msgstr "" + +msgid "Show counts" +msgstr "" + +msgid "Clear all filters" +msgstr "" + msgid "Remove from sorting" msgstr "Tartiblashdan chiqarish" @@ -376,6 +415,15 @@ msgstr "" msgid "Toggle sorting" msgstr "" +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + msgid "Delete" msgstr "O'chirish" @@ -429,9 +477,6 @@ msgid "" "following objects and their related items will be deleted:" msgstr "" -msgid "View" -msgstr "Ko'rish" - msgid "Delete?" msgstr "O'chirasizmi?" @@ -442,16 +487,6 @@ msgstr "" msgid "Summary" msgstr "Xulosa" -#, python-format -msgid "Models in the %(name)s application" -msgstr "" - -msgid "Add" -msgstr "Qo'shish" - -msgid "You don’t have permission to view or edit anything." -msgstr "" - msgid "Recent actions" msgstr "So'ngi harakatlar" @@ -461,6 +496,15 @@ msgstr "Mening harakatlarim" msgid "None available" msgstr "" +msgid "Added:" +msgstr "" + +msgid "Changed:" +msgstr "" + +msgid "Deleted:" +msgstr "" + msgid "Unknown content" msgstr "" @@ -479,6 +523,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "" +msgid "Toggle navigation" +msgstr "Navigatsiyani almashtirish" + +msgid "Sidebar" +msgstr "" + +msgid "Start typing to filter…" +msgstr "" + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "" @@ -488,6 +544,10 @@ msgstr "" msgid "Action" msgstr "" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -541,7 +601,11 @@ msgstr "" msgid "Delete selected %(model)s" msgstr "" -msgid "Thanks for spending some quality time with the Web site today." +#, python-format +msgid "View selected %(model)s" +msgstr "" + +msgid "Thanks for spending some quality time with the web site today." msgstr "" msgid "Log in again" @@ -624,14 +688,17 @@ msgid "Email address:" msgstr "" msgid "Reset my password" +msgstr "Parolimni tiklash" + +msgid "Select all objects on this page for an action" msgstr "" msgid "All dates" -msgstr "" +msgstr "Barcha sanalar" #, python-format msgid "Select %s" -msgstr "" +msgstr "%sni tanlash" #, python-format msgid "Select %s to change" @@ -642,16 +709,16 @@ msgid "Select %s to view" msgstr "" msgid "Date:" -msgstr "" +msgstr "Sana:" msgid "Time:" -msgstr "" +msgstr "Vaqt:" msgid "Lookup" -msgstr "" +msgstr "Izlash" msgid "Currently:" -msgstr "" +msgstr "Hozirda:" msgid "Change:" -msgstr "" +msgstr "O'zgartirish:" diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo index 914da0810261..7c922f69173f 100644 Binary files a/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po index 05e46414e699..d731b22efd8f 100644 --- a/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/uz/LC_MESSAGES/djangojs.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Nuriddin Islamov, 2021 # Otabek Umurzakov , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2019-12-13 21:48+0000\n" -"Last-Translator: Otabek Umurzakov \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-12-15 16:52+0000\n" +"Last-Translator: Nuriddin Islamov\n" "Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -84,22 +85,16 @@ msgstr "" "o'zgarishlaringiz yo'qotiladi." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Siz harakatni tanladingiz, lekin hali ham o'zgartirishlaringizni alohida " -"maydonlarga saqlamadingiz. Iltimos saqlash uchun OK ni bosing. Harakatni " -"qayta ishga tushurishingiz kerak bo'ladi." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Siz harakatni tanladingiz va alohida maydonlarda hech qanday o'zgartirishlar " -"kiritmadingiz. Ehtimol siz Saqlash tugmasini emas, balki O'tish tugmasini " -"qidirmoqdasiz." msgid "Now" msgstr "Hozir" @@ -183,36 +178,84 @@ msgstr "Noyabr" msgid "December" msgstr "Dekabr" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "" + msgctxt "one letter Sunday" msgid "S" -msgstr "S" +msgstr "Ya" msgctxt "one letter Monday" msgid "M" -msgstr "M" +msgstr "Du" msgctxt "one letter Tuesday" msgid "T" -msgstr "T" +msgstr "Se" msgctxt "one letter Wednesday" msgid "W" -msgstr "W" +msgstr "Ch" msgctxt "one letter Thursday" msgid "T" -msgstr "T" +msgstr "Pa" msgctxt "one letter Friday" msgid "F" -msgstr "F" +msgstr "Ju" msgctxt "one letter Saturday" msgid "S" -msgstr "S" +msgstr "Sh" msgid "Show" msgstr "Ko'rsatish" msgid "Hide" -msgstr "Yashirish" +msgstr "Bekitish" diff --git a/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo b/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo index 298498a4a851..1091b6fcd50b 100644 Binary files a/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/vi/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/vi/LC_MESSAGES/django.po b/django/contrib/admin/locale/vi/LC_MESSAGES/django.po index 68fd78c640b8..60fe2ce82c1d 100644 --- a/django/contrib/admin/locale/vi/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/vi/LC_MESSAGES/django.po @@ -6,15 +6,16 @@ # Thanh Le Viet , 2013 # Tran , 2011 # Tran Van , 2011-2013,2016,2018 +# tinnguyen121221, 2021 # Vuong Nguyen , 2011 # xgenvn , 2014 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-01-18 00:36+0000\n" -"Last-Translator: Ramiro Morales\n" +"POT-Creation-Date: 2021-09-21 10:22+0200\n" +"PO-Revision-Date: 2021-12-23 17:57+0000\n" +"Last-Translator: tinnguyen121221\n" "Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" "vi/)\n" "MIME-Version: 1.0\n" @@ -23,6 +24,10 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "Xóa các %(verbose_name_plural)s đã chọn" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "Đã xóa thành công %(count)d %(items)s ." @@ -34,10 +39,6 @@ msgstr "Không thể xóa %(name)s" msgid "Are you sure?" msgstr "Bạn có chắc chắn không?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "Xóa các %(verbose_name_plural)s đã chọn" - msgid "Administration" msgstr "Quản trị website" @@ -69,10 +70,16 @@ msgid "This year" msgstr "Năm nay" msgid "No date" -msgstr "" +msgstr "Không có ngày" msgid "Has date" -msgstr "" +msgstr "Có ngày" + +msgid "Empty" +msgstr "Rỗng" + +msgid "Not empty" +msgstr "Không rỗng" #, python-format msgid "" @@ -92,19 +99,19 @@ msgid "Remove" msgstr "Gỡ bỏ" msgid "Addition" -msgstr "" +msgstr "Thêm" msgid "Change" msgstr "Thay đổi" msgid "Deletion" -msgstr "" +msgstr "Xóa" msgid "action time" msgstr "Thời gian tác động" msgid "user" -msgstr "" +msgstr "người dùng" msgid "content type" msgstr "kiểu nội dung" @@ -130,23 +137,23 @@ msgid "log entries" msgstr "mục đăng nhập" #, python-format -msgid "Added \"%(object)s\"." -msgstr "Thêm \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "Đã thêm “%(object)s”." #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "Đã thay đổi \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "Đã thay đổi “%(object)s” — %(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "Đối tượng \"%(object)s.\" đã được xoá." +msgid "Deleted “%(object)s.”" +msgstr "Đã xóa “%(object)s.”" msgid "LogEntry Object" msgstr "LogEntry Object" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "{name} \"{object}\" đã được thêm vào." +msgid "Added {name} “{object}”." +msgstr "Đã thêm {name} “{object}”." msgid "Added." msgstr "Được thêm." @@ -155,16 +162,16 @@ msgid "and" msgstr "và" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "" +msgid "Changed {fields} for {name} “{object}”." +msgstr "Đã thay đổi {fields} cho {name} “{object}”." #, python-brace-format msgid "Changed {fields}." -msgstr "" +msgstr "Đã thay đổi {fields}." #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "" +msgid "Deleted {name} “{object}”." +msgstr "Đã xóa {name} “{object}”." msgid "No fields changed." msgstr "Không có trường nào thay đổi" @@ -172,43 +179,46 @@ msgstr "Không có trường nào thay đổi" msgid "None" msgstr "Không" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" -"Giữ phím \"Control\", hoặc \"Command\" trên Mac, để chọn nhiều hơn một." +"Nhấn giữ phím “Control”, hoặc “Command” trên máy Mac, để chọn nhiều hơn một." #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "" +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} “{obj}” được thêm vào thành công." msgid "You may edit it again below." -msgstr "" +msgstr "Bạn có thể chỉnh sửa lại bên dưới." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} “{obj}” được thêm vào thành công. Bạn có thể thêm một {name} khác bên " +"dưới." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." +"The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" +"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể chỉnh sửa lại bên dưới." #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." +msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" +"{name} “{obj}” được thêm vào thành công. Bạn có thể chỉnh sửa lại bên dưới." #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"{name} “{obj}” được chỉnh sửa thành công. Bạn có thể thêm một {name} khác " +"bên dưới." #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "" +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} “{obj}” đã được thay đổi thành công." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -221,12 +231,12 @@ msgid "No action selected." msgstr "Không có hoạt động nào được lựa chọn." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" đã được xóa thành công." +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” đã được xóa thành công." #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s với ID “%(key)s” không tồn tại. Có lẽ nó đã bị xóa?" #, python-format msgid "Add %s" @@ -238,7 +248,7 @@ msgstr "Thay đổi %s" #, python-format msgid "View %s" -msgstr "" +msgstr "Xem %s" msgid "Database error" msgstr "Cơ sở dữ liệu bị lỗi" @@ -294,8 +304,8 @@ msgstr "Quản lý %(app)s" msgid "Page not found" msgstr "Không tìm thấy trang nào" -msgid "We're sorry, but the requested page could not be found." -msgstr "Xin lỗi bạn! Trang mà bạn yêu cầu không tìm thấy." +msgid "We’re sorry, but the requested page could not be found." +msgstr "Rất tiếc, không thể tìm thấy trang được yêu cầu." msgid "Home" msgstr "Trang chủ" @@ -310,7 +320,7 @@ msgid "Server Error (500)" msgstr "Lỗi máy chủ (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" "Có lỗi xảy ra. Lỗi sẽ được gửi đến quản trị website qua email và sẽ được " @@ -332,11 +342,24 @@ msgstr "Hãy chọn tất cả %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Xóa lựa chọn" +#, python-format +msgid "Models in the %(name)s application" +msgstr "Các mô models trong %(name)s" + +msgid "Add" +msgstr "Thêm vào" + +msgid "View" +msgstr "Xem" + +msgid "You don’t have permission to view or edit anything." +msgstr "Bạn không có quyền xem hoặc chỉnh sửa bất cứ gì." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" -"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó bạn mới có thể chỉnh sửa " +"Đầu tiên, điền tên đăng nhập và mật khẩu. Sau đó, bạn mới có thể chỉnh sửa " "nhiều hơn lựa chọn của người dùng." msgid "Enter a username and password." @@ -359,7 +382,7 @@ msgid "Welcome," msgstr "Chào mừng bạn," msgid "View site" -msgstr "" +msgstr "Xem trang web" msgid "Documentation" msgstr "Tài liệu" @@ -380,6 +403,9 @@ msgstr "Xem trên trang web" msgid "Filter" msgstr "Bộ lọc" +msgid "Clear all filters" +msgstr "Xóa tất cả bộ lọc" + msgid "Remove from sorting" msgstr "Bỏ khỏi sắp xếp" @@ -421,11 +447,11 @@ msgstr "" msgid "Objects" msgstr "Đối tượng" -msgid "Yes, I'm sure" -msgstr "Có, tôi chắc chắn." +msgid "Yes, I’m sure" +msgstr "Có, tôi chắc chắn" msgid "No, take me back" -msgstr "" +msgstr "Không, đưa tôi trở lại" msgid "Delete multiple objects" msgstr "Xóa nhiều đối tượng" @@ -455,9 +481,6 @@ msgstr "" "Bạn chắc chắn muốn xóa những lựa chọn %(objects_name)s? Tất cả những đối " "tượng sau và những đối tượng liên quan sẽ được xóa:" -msgid "View" -msgstr "" - msgid "Delete?" msgstr "Bạn muốn xóa?" @@ -466,23 +489,13 @@ msgid " By %(filter_title)s " msgstr "Bởi %(filter_title)s " msgid "Summary" -msgstr "" - -#, python-format -msgid "Models in the %(name)s application" -msgstr "Các mô models trong %(name)s" - -msgid "Add" -msgstr "Thêm vào" - -msgid "You don't have permission to view or edit anything." -msgstr "" +msgstr "Tóm tắt" msgid "Recent actions" -msgstr "" +msgstr "Hoạt động gần đây" msgid "My actions" -msgstr "" +msgstr "Hoạt động của tôi" msgid "None available" msgstr "Không có sẵn" @@ -491,7 +504,7 @@ msgid "Unknown content" msgstr "Không biết nội dung" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -510,6 +523,15 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "Bạn quên mật khẩu hoặc tài khoản?" +msgid "Toggle navigation" +msgstr "" + +msgid "Start typing to filter…" +msgstr "Nhập để lọc..." + +msgid "Filter navigation items" +msgstr "" + msgid "Date/time" msgstr "Ngày/giờ" @@ -520,7 +542,7 @@ msgid "Action" msgstr "Hành động" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" "Đối tượng này không có một lịch sử thay đổi. Nó có lẽ đã không được thêm vào " @@ -533,7 +555,7 @@ msgid "Save" msgstr "Lưu lại" msgid "Popup closing…" -msgstr "" +msgstr "Đang đóng cửa sổ popup ..." msgid "Search" msgstr "Tìm kiếm" @@ -557,14 +579,14 @@ msgid "Save and continue editing" msgstr "Lưu và tiếp tục chỉnh sửa" msgid "Save and view" -msgstr "" +msgstr "Lưu lại và xem" msgid "Close" -msgstr "" +msgstr "Đóng" #, python-format msgid "Change selected %(model)s" -msgstr "" +msgstr "Thay đổi %(model)s đã chọn" #, python-format msgid "Add another %(model)s" @@ -574,8 +596,8 @@ msgstr "Thêm %(model)s khác" msgid "Delete selected %(model)s" msgstr "Xóa %(model)s đã chọn" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Cảm ơn bạn đã dành thời gian với website này" +msgid "Thanks for spending some quality time with the web site today." +msgstr "Cảm ơn bạn đã dành thời gian với trang web." msgid "Log in again" msgstr "Đăng nhập lại" @@ -587,7 +609,7 @@ msgid "Your password was changed." msgstr "Mật khẩu của bạn đã được thay đổi" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" "Hãy nhập lại mật khẩu cũ và sau đó nhập mật khẩu mới hai lần để chúng tôi có " @@ -626,16 +648,18 @@ msgstr "" "vui lòng yêu cầu đặt lại mật khẩu mới." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Chúng tôi đã gửi cho bạn hướng dẫn thiết lập mật khẩu của bạn qua email, nếu " +"tài khoản tồn tại với email bạn đã nhập. Bạn sẽ nhận được chúng sớm." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"Nếu bạn không nhận được email, hãy kiểm tra lại địa chỉ email mà bạn dùng để " -"đăng kí hoặc kiểm tra trong thư mục spam/rác" +"Nếu bạn không nhận được email, hãy đảm bảo rằng bạn đã nhập địa chỉ mà bạn " +"đã đăng ký và kiểm tra thư mục spam của mình." #, python-format msgid "" @@ -648,7 +672,7 @@ msgstr "" msgid "Please go to the following page and choose a new password:" msgstr "Hãy vào đường link dưới đây và chọn một mật khẩu mới" -msgid "Your username, in case you've forgotten:" +msgid "Your username, in case you’ve forgotten:" msgstr "Tên đăng nhập của bạn, trường hợp bạn quên nó:" msgid "Thanks for using our site!" @@ -659,7 +683,7 @@ msgid "The %(site_name)s team" msgstr "Đội của %(site_name)s" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" "Quên mật khẩu? Nhập địa chỉ email vào ô dưới đây. Chúng tôi sẽ email cho bạn " @@ -684,7 +708,7 @@ msgstr "Chọn %s để thay đổi" #, python-format msgid "Select %s to view" -msgstr "" +msgstr "Chọn %s để xem" msgid "Date:" msgstr "Ngày:" diff --git a/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo index 7588ed6ca7c5..c9d57cda5cf7 100644 Binary files a/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po index d2155ca4c99f..a3faf74ed754 100644 --- a/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/vi/LC_MESSAGES/djangojs.po @@ -4,15 +4,16 @@ # Jannis Leidel , 2011 # Tran , 2011 # Tran Van , 2013 +# tinnguyen121221, 2021 # Vuong Nguyen , 2011 # xgenvn , 2014 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-17 23:12+0200\n" -"PO-Revision-Date: 2017-09-23 18:54+0000\n" -"Last-Translator: Jannis Leidel \n" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2021-12-23 17:25+0000\n" +"Last-Translator: tinnguyen121221\n" "Language-Team: Vietnamese (http://www.transifex.com/django/django/language/" "vi/)\n" "MIME-Version: 1.0\n" @@ -84,21 +85,35 @@ msgstr "" "chỉnh sửa chưa được lưu sẽ bị mất." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"Bạn đã lựa chọn một hành động, nhưng bạn không lưu thay đổi của bạn đến các " -"lĩnh vực cá nhân được nêu ra. Xin vui lòng click OK để lưu lại. Bạn sẽ cần " -"phải chạy lại các hành động." +"Bạn đã chọn một hành động, nhưng bạn chưa lưu các thay đổi trên các trường. " +"Vui lòng bấm OK để lưu lại. Bạn sẽ cần chạy lại hành dộng." msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"Bạn đã lựa chọn một hành động, và bạn đã không thực hiện bất kỳ thay đổi nào " -"trên các trường. Có lẽ bạn đang tìm kiếm nút bấm Go thay vì nút bấm Save." +"Bạn đã chọn một hành động và bạn đã không thực hiện bất kỳ thay đổi nào trên " +"các trường. Có lẽ bạn nên bấm nút Đi đến hơn là nút Lưu lại." + +msgid "Now" +msgstr "Bây giờ" + +msgid "Midnight" +msgstr "Nửa đêm" + +msgid "6 a.m." +msgstr "6 giờ sáng" + +msgid "Noon" +msgstr "Buổi trưa" + +msgid "6 p.m." +msgstr "6 giờ chiều" #, javascript-format msgid "Note: You are %s hour ahead of server time." @@ -113,27 +128,12 @@ msgid_plural "Note: You are %s hours behind server time." msgstr[0] "" "Lưu ý: Hiện tại bạn đang thấy thời gian sau %s giờ so với thời gian máy chủ." -msgid "Now" -msgstr "Bây giờ" - msgid "Choose a Time" -msgstr "" +msgstr "Chọn Thời gian" msgid "Choose a time" msgstr "Chọn giờ" -msgid "Midnight" -msgstr "Nửa đêm" - -msgid "6 a.m." -msgstr "6 giờ sáng" - -msgid "Noon" -msgstr "Buổi trưa" - -msgid "6 p.m." -msgstr "" - msgid "Cancel" msgstr "Hủy bỏ" @@ -141,7 +141,7 @@ msgid "Today" msgstr "Hôm nay" msgid "Choose a Date" -msgstr "" +msgstr "Chọn Ngày" msgid "Yesterday" msgstr "Hôm qua" @@ -150,68 +150,116 @@ msgid "Tomorrow" msgstr "Ngày mai" msgid "January" -msgstr "" +msgstr "Tháng Một" msgid "February" -msgstr "" +msgstr "Tháng Hai" msgid "March" -msgstr "" +msgstr "Tháng Ba" msgid "April" -msgstr "" +msgstr "Tháng Tư" msgid "May" -msgstr "" +msgstr "Tháng Năm" msgid "June" -msgstr "" +msgstr "Tháng Sáu" msgid "July" -msgstr "" +msgstr "Tháng Bảy" msgid "August" -msgstr "" +msgstr "Tháng Tám" msgid "September" -msgstr "" +msgstr "Tháng Chín" msgid "October" -msgstr "" +msgstr "Tháng Mười" msgid "November" -msgstr "" +msgstr "Tháng Mười Một" msgid "December" -msgstr "" +msgstr "Tháng Mười Hai" + +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "Tháng Một" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "Tháng Hai" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "Tháng Ba" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "Tháng Tư" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "Tháng Năm" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "Tháng Sáu" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "Tháng Bảy" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "Tháng Tám" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "Tháng Chín" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "Tháng Mười" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "Tháng Mười Một" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "Tháng Mười Hai" msgctxt "one letter Sunday" msgid "S" -msgstr "" +msgstr "CN" msgctxt "one letter Monday" msgid "M" -msgstr "" +msgstr "2" msgctxt "one letter Tuesday" msgid "T" -msgstr "" +msgstr "3" msgctxt "one letter Wednesday" msgid "W" -msgstr "" +msgstr "4" msgctxt "one letter Thursday" msgid "T" -msgstr "" +msgstr "5" msgctxt "one letter Friday" msgid "F" -msgstr "" +msgstr "6" msgctxt "one letter Saturday" msgid "S" -msgstr "" +msgstr "7" msgid "Show" msgstr "Hiện ra" diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo index 8a5dd9364286..7bec9b7a2c75 100644 Binary files a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po index f063f60879ec..c6fcf86e8f5f 100644 --- a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.po @@ -1,35 +1,44 @@ # This file is distributed under the same license as the Django package. # # Translators: +# lanbla , 2021 # Brian Wang , 2018 # Fulong Sun , 2016 +# Huanqun Yang, 2022 +# jack yang, 2023 # Jannis Leidel , 2011 # Kevin Sze , 2012 # Lele Long , 2011,2015 # Le Yang , 2018 +# li beite , 2020 # Liping Wang , 2016-2017 # mozillazg , 2016 # Ronald White , 2013-2014 +# Scott Jiang, 2023 # Sean Lee , 2013 # Sean Lee , 2013 # slene , 2011 # Suntravel Chris , 2019 -# Wentao Han , 2018 +# Wentao Han , 2018,2020 # xuyi wang , 2018 # yf zhan , 2018 # dykai , 2019 # ced773123cfad7b4e8b79ca80f736af9, 2012 +# 千百度, 2024 +# LatteFang <370358679@qq.com>, 2020 # Kevin Sze , 2012 +# 考证 李 , 2020 # 雨翌 , 2016 +# 高乐喆 , 2023 # Ronald White , 2013 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-15 05:12+0000\n" -"Last-Translator: dykai \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: 千百度, 2024\n" +"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,6 +46,10 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "删除所选的 %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "成功删除了 %(count)d 个 %(items)s" @@ -48,10 +61,6 @@ msgstr "无法删除 %(name)s" msgid "Are you sure?" msgstr "你确定吗?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "删除所选的 %(verbose_name_plural)s" - msgid "Administration" msgstr "管理" @@ -88,11 +97,18 @@ msgstr "没有日期" msgid "Has date" msgstr "具有日期" +msgid "Empty" +msgstr "空" + +msgid "Not empty" +msgstr "非空" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." -msgstr "请输入一个正确的 %(username)s 和密码. 注意他们都是区分大小写的." +msgstr "" +"请输入一个正确的工作人员账户 %(username)s 和密码. 注意他们都是区分大小写的." msgid "Action:" msgstr "动作" @@ -114,7 +130,7 @@ msgid "Deletion" msgstr "删除" msgid "action time" -msgstr "动作时间" +msgstr "操作时间" msgid "user" msgstr "用户" @@ -143,23 +159,23 @@ msgid "log entries" msgstr "日志记录" #, python-format -msgid "Added \"%(object)s\"." -msgstr "已经添加了 \"%(object)s\"." +msgid "Added “%(object)s”." +msgstr "添加了“%(object)s”。" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "修改了 \"%(object)s\" - %(changes)s" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "修改了“%(object)s”—%(changes)s" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "删除了 \"%(object)s.\"" +msgid "Deleted “%(object)s.”" +msgstr "删除了“%(object)s”。" msgid "LogEntry Object" msgstr "LogEntry对象" #, python-brace-format -msgid "Added {name} \"{object}\"." -msgstr "已添加{name}\"{object}\"。" +msgid "Added {name} “{object}”." +msgstr "添加了 {name}“{object}”。" msgid "Added." msgstr "已添加。" @@ -168,16 +184,16 @@ msgid "and" msgstr "和" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "已修改{name} \"{object}\"的{fields}。" +msgid "Changed {fields} for {name} “{object}”." +msgstr "修改了 {name}“{object}”的 {fields}。" #, python-brace-format msgid "Changed {fields}." msgstr "已修改{fields}。" #, python-brace-format -msgid "Deleted {name} \"{object}\"." -msgstr "已删除{name}\"{object}\"。" +msgid "Deleted {name} “{object}”." +msgstr "删除了 {name}“{object}”。" msgid "No fields changed." msgstr "没有字段被修改。" @@ -185,42 +201,38 @@ msgstr "没有字段被修改。" msgid "None" msgstr "无" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "按住 ”Control“,或者Mac上的 “Command”,可以选择多个。" +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "按住 Control 键或 Mac 上的 Command 键来选择多项。" + +msgid "Select this object for an action - {}" +msgstr "选择此对象执行操作 - {}" #, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name}\"{obj}\"添加成功。" +msgid "The {name} “{obj}” was added successfully." +msgstr "成功添加了 {name}“{obj}”。" msgid "You may edit it again below." msgstr "您可以在下面再次编辑它." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." -msgstr "{name} \"{obj}\" 已经添加成功。你可以在下面添加其它的{name}。" - -#, python-brace-format -msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 添加成功。你可以在下面再次编辑它。" +"The {name} “{obj}” was added successfully. You may add another {name} below." +msgstr "成功添加了 {name}“{obj}”。你可以在下面添加另一个 {name}。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 已经添加成功。你可以在下面再次编辑它。" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "成功修改了 {name}“{obj}”。你可以在下面再次编辑它。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} \"{obj}\" 已经成功进行变更。你可以在下面添加其它的{name}。" +msgstr "成功修改了 {name}“{obj}”。你可以在下面添加另一个 {name}。" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name}\"{obj}\"修改成功。" +msgid "The {name} “{obj}” was changed successfully." +msgstr "成功修改了 {name}“{obj}”。" msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -231,12 +243,12 @@ msgid "No action selected." msgstr "未选择动作" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" 删除成功。" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "成功删除了 %(name)s“%(obj)s”。" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" -msgstr "ID为“%(key)s”的%(name)s不存在。也许它被删除了? " +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "ID 为“%(key)s”的 %(name)s 不存在。可能已经被删除了?" #, python-format msgid "Add %s" @@ -271,8 +283,9 @@ msgstr "%(cnt)s 个中 0 个被选" msgid "Change history: %s" msgstr "变更历史: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -304,8 +317,8 @@ msgstr "%(app)s 管理" msgid "Page not found" msgstr "页面没有找到" -msgid "We're sorry, but the requested page could not be found." -msgstr "很抱歉,请求页面无法找到。" +msgid "We’re sorry, but the requested page could not be found." +msgstr "非常抱歉,请求的页面不存在。" msgid "Home" msgstr "首页" @@ -320,11 +333,11 @@ msgid "Server Error (500)" msgstr "服务器错误 (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"有一个错误。已经通过电子邮件通知网站管理员,不久以后应该可以修复。谢谢你的参" -"与。" +"发生了错误,已经通过电子邮件报告给了网站管理员。我们会尽快修复,感谢您的耐心" +"等待。" msgid "Run the selected action" msgstr "运行选中的动作" @@ -342,10 +355,26 @@ msgstr "选中所有的 %(total_count)s 个 %(module_name)s" msgid "Clear selection" msgstr "清除选中" +msgid "Breadcrumbs" +msgstr "条形导航" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "在应用程序 %(name)s 中的模型" + +msgid "Add" +msgstr "增加" + +msgid "View" +msgstr "查看" + +msgid "You don’t have permission to view or edit anything." +msgstr "你没有查看或编辑的权限。" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." -msgstr "首先,输入一个用户名和密码。然后,你就可以编辑更多的用户选项。" +msgstr "输入用户名和密码后,你将能够编辑更多的用户选项。" msgid "Enter a username and password." msgstr "输入用户名和密码" @@ -353,16 +382,31 @@ msgstr "输入用户名和密码" msgid "Change password" msgstr "修改密码" -msgid "Please correct the error below." -msgstr "请更正下列错误。" +msgid "Set password" +msgstr "设置密码" -msgid "Please correct the errors below." -msgstr "请更正下列错误。" +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "请更正以下错误。" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "为用户 %(username)s 输入一个新的密码。" +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "这将启用本用户基于密码的验证" + +msgid "Disable password-based authentication" +msgstr "禁用基于密码的验证" + +msgid "Enable password-based authentication" +msgstr "启用基于密码的验证" + +msgid "Skip to main content" +msgstr "跳到主要内容" + msgid "Welcome," msgstr "欢迎," @@ -388,6 +432,15 @@ msgstr "在站点上查看" msgid "Filter" msgstr "过滤器" +msgid "Hide counts" +msgstr "隐藏计数" + +msgid "Show counts" +msgstr "显示计数" + +msgid "Clear all filters" +msgstr "清除所有筛选" + msgid "Remove from sorting" msgstr "删除排序" @@ -398,6 +451,15 @@ msgstr "排序优先级: %(priority_number)s" msgid "Toggle sorting" msgstr "正逆序切换" +msgid "Toggle theme (current theme: auto)" +msgstr "切换主题(当前主题:自动)" + +msgid "Toggle theme (current theme: light)" +msgstr "切换主题(当前主题:浅色)" + +msgid "Toggle theme (current theme: dark)" +msgstr "切换主题(当前主题:深色)" + msgid "Delete" msgstr "删除" @@ -428,7 +490,7 @@ msgstr "" msgid "Objects" msgstr "对象" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "是的,我确定" msgid "No, take me back" @@ -457,12 +519,9 @@ msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和余它们相关的条目将都会" +"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和与它们相关的条目将都会" "被删除:" -msgid "View" -msgstr "查看" - msgid "Delete?" msgstr "删除?" @@ -473,16 +532,6 @@ msgstr " 以 %(filter_title)s" msgid "Summary" msgstr "概览" -#, python-format -msgid "Models in the %(name)s application" -msgstr "在应用程序 %(name)s 中的模型" - -msgid "Add" -msgstr "增加" - -msgid "You don't have permission to view or edit anything." -msgstr "无权查看或修改。" - msgid "Recent actions" msgstr "最近动作" @@ -490,18 +539,27 @@ msgid "My actions" msgstr "我的动作" msgid "None available" -msgstr "无可用的" +msgstr "无可选的" + +msgid "Added:" +msgstr "已添加:" + +msgid "Changed:" +msgstr "已修改:" + +msgid "Deleted:" +msgstr "已删除:" msgid "Unknown content" msgstr "未知内容" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" -"你的数据库安装有误。确保已经创建了相应的数据库表,并确保数据库可被相关的用户" -"读取。" +"数据库设置有误。请检查所需的数据库表格是否已经创建,以及数据库用户是否具有正" +"确的权限。" #, python-format msgid "" @@ -514,6 +572,18 @@ msgstr "" msgid "Forgotten your password or username?" msgstr "忘记了您的密码或用户名?" +msgid "Toggle navigation" +msgstr "切换导航" + +msgid "Sidebar" +msgstr "侧边栏" + +msgid "Start typing to filter…" +msgstr "开始输入以筛选..." + +msgid "Filter navigation items" +msgstr "筛选导航项目" + msgid "Date/time" msgstr "日期/时间" @@ -523,10 +593,14 @@ msgstr "用户" msgid "Action" msgstr "动作" +msgid "entry" +msgid_plural "entries" +msgstr[0] "条目" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." -msgstr "该对象没有变更历史记录。可能从未通过这个管理站点添加。" +msgstr "此对象没有修改历史。它可能不是通过管理站点添加的。" msgid "Show all" msgstr "显示全部" @@ -576,8 +650,12 @@ msgstr "增加另一个 %(model)s" msgid "Delete selected %(model)s" msgstr "取消选中 %(model)s" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "感谢您今天在本站花费了一些宝贵时间。" +#, python-format +msgid "View selected %(model)s" +msgstr "查看已选择的%(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "感谢您今天与本网站共享一段美好时光。" msgid "Log in again" msgstr "重新登录" @@ -589,11 +667,9 @@ msgid "Your password was changed." msgstr "你的密码已修改。" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." -msgstr "" -"请输入你的旧密码,为了安全起见,接着要输入两遍新密码,以便我们校验你输入的是" -"否正确。" +msgstr "安全起见请输入你的旧密码。然后输入两次你的新密码以确保输入正确。" msgid "Change my password" msgstr "修改我的密码" @@ -624,17 +700,18 @@ msgid "" msgstr "密码重置链接无效,可能是因为它已使用。可以请求一次新的密码重置。" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" -"如果您输入的邮件地址所对应的账户存在,设置密码的提示已经发送邮件给您,您将很" -"快收到。" +"如果你所输入的电子邮箱存在对应的用户,我们将通过电子邮件向你发送设置密码的操" +"作步骤说明。你应该很快就会收到。" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" -"如果你没有收到邮件, 请确保您所输入的地址是正确的, 并检查您的垃圾邮件文件夹." +"如果你没有收到电子邮件,请检查输入的是你注册的电子邮箱地址。另外,也请检查你" +"的垃圾邮件文件夹。" #, python-format msgid "" @@ -645,8 +722,8 @@ msgstr "你收到这封邮件是因为你请求重置你在网站 %(site_name)s msgid "Please go to the following page and choose a new password:" msgstr "请访问该页面并选择一个新密码:" -msgid "Your username, in case you've forgotten:" -msgstr "你的用户名,如果已忘记的话:" +msgid "Your username, in case you’ve forgotten:" +msgstr "提醒一下,你的用户名是:" msgid "Thanks for using our site!" msgstr "感谢使用我们的站点!" @@ -656,11 +733,11 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s 团队" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"忘记你的密码了?在下面输入你的电子邮件地址,我们将发送一封设置新密码的邮件给" -"你。" +"忘记密码?在下面输入你的电子邮箱地址,我们将会把设置新密码的操作步骤说明通过" +"电子邮件发送给你。" msgid "Email address:" msgstr "电子邮件地址:" @@ -668,6 +745,9 @@ msgstr "电子邮件地址:" msgid "Reset my password" msgstr "重设我的密码" +msgid "Select all objects on this page for an action" +msgstr "选择此页面上的所有对象执行操作" + msgid "All dates" msgstr "所有日期" diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo index 2df69307e176..c78566a8767c 100644 Binary files a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo and b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo differ diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po index b37c86410e52..44f47c8b3919 100644 --- a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +++ b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po @@ -1,24 +1,30 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Bai HuanCheng (Bestony) , 2018 +# HuanCheng Bai白宦成(Bestony) , 2018 +# Fan Xu , 2022 +# jack yang, 2023 # Jannis Leidel , 2011 +# Kaiqi Zhu, 2023 # Kewei Ma , 2016 # Lele Long , 2011,2015 # Liping Wang , 2016 +# matthew Yip , 2020 # mozillazg , 2016 # slene , 2011 +# Veoco , 2021 # spaceoi , 2016 -# Ziang Song , 2012 +# ced773123cfad7b4e8b79ca80f736af9, 2012 # Kevin Sze , 2012 +# 高乐喆 , 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-05-17 11:50+0200\n" -"PO-Revision-Date: 2018-01-14 07:41+0000\n" -"Last-Translator: Bai HuanCheng (Bestony) \n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2023-12-25 07:59+0000\n" +"Last-Translator: jack yang, 2023\n" +"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,6 +76,10 @@ msgstr "" "这是选中的 %s 的列表。你可以在选择框下面进行选择,然后点击两选框之间的“删" "除”箭头进行删除。" +#, javascript-format +msgid "Type into this box to filter down the list of selected %s." +msgstr "在该框中键入以过滤所选%s的列表。" + msgid "Remove all" msgstr "删除全部" @@ -77,6 +87,11 @@ msgstr "删除全部" msgid "Click to remove all chosen %s at once." msgstr "删除所有已选择的%s。" +#, javascript-format +msgid "%s selected option not visible" +msgid_plural "%s selected options not visible" +msgstr[0] "%s所选选项不可见" + msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" msgstr[0] "选中了 %(cnt)s 个中的 %(sel)s 个" @@ -88,20 +103,20 @@ msgstr "" "你尚未保存一个可编辑栏位的变更. 如果你进行别的动作, 未保存的变更将会丢失." msgid "" -"You have selected an action, but you haven't saved your changes to " -"individual fields yet. Please click OK to save. You'll need to re-run the " +"You have selected an action, but you haven’t saved your changes to " +"individual fields yet. Please click OK to save. You’ll need to re-run the " "action." msgstr "" -"你已选则执行一个动作, 但有一个可编辑栏位的变更尚未保存. 请点选确定进行保存. " -"再重新执行该动作." +"你已经选择一个动作,但是你没有保存你单独修改的地方。请点击OK保存。你需要再重" +"新跑这个动作。" msgid "" -"You have selected an action, and you haven't made any changes on individual " -"fields. You're probably looking for the Go button rather than the Save " +"You have selected an action, and you haven’t made any changes on individual " +"fields. You’re probably looking for the Go button rather than the Save " "button." msgstr "" -"你已选则执行一个动作, 但可编辑栏位沒有任何改变. 你应该尝试 '去' 按钮, 而不是 " -"'保存' 按钮." +"你已经选择一个动作,但是没有单独修改任何一处。你可以选择'Go'按键而不" +"是'Save'按键。" msgid "Now" msgstr "现在" @@ -185,6 +200,103 @@ msgstr "十一月" msgid "December" msgstr "十二月" +msgctxt "abbrev. month January" +msgid "Jan" +msgstr "一月" + +msgctxt "abbrev. month February" +msgid "Feb" +msgstr "二月" + +msgctxt "abbrev. month March" +msgid "Mar" +msgstr "三月" + +msgctxt "abbrev. month April" +msgid "Apr" +msgstr "四月" + +msgctxt "abbrev. month May" +msgid "May" +msgstr "五月" + +msgctxt "abbrev. month June" +msgid "Jun" +msgstr "六月" + +msgctxt "abbrev. month July" +msgid "Jul" +msgstr "七月" + +msgctxt "abbrev. month August" +msgid "Aug" +msgstr "八月" + +msgctxt "abbrev. month September" +msgid "Sep" +msgstr "九月" + +msgctxt "abbrev. month October" +msgid "Oct" +msgstr "十月" + +msgctxt "abbrev. month November" +msgid "Nov" +msgstr "十一月" + +msgctxt "abbrev. month December" +msgid "Dec" +msgstr "十二月" + +msgid "Sunday" +msgstr "星期日" + +msgid "Monday" +msgstr "星期一" + +msgid "Tuesday" +msgstr "星期二" + +msgid "Wednesday" +msgstr "星期三" + +msgid "Thursday" +msgstr "星期四" + +msgid "Friday" +msgstr "星期五" + +msgid "Saturday" +msgstr "星期六" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "星期日" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "星期一" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "星期二" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "星期三" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "星期四" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "星期五" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "星期六" + msgctxt "one letter Sunday" msgid "S" msgstr "S" diff --git a/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo b/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo index a96ef9a02bff..da1da7026d33 100644 Binary files a/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo and b/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po b/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po index a2a1d9a3a506..89d0a940e2df 100644 --- a/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/zh_Hant/LC_MESSAGES/django.po @@ -5,19 +5,21 @@ # ilay , 2012 # Jannis Leidel , 2011 # mail6543210 , 2013-2014 -# ming hsien tzang , 2011 +# 0a3cb7bfd0810218facdfb511e592a6d_8d19d07 , 2011 # tcc , 2011 # Tzu-ping Chung , 2016-2017 +# YAO WEN LIANG, 2024 # Yeh-Yung , 2013 +# yubike, 2024 # Yeh-Yung , 2012 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Tzu-ping Chung \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2024-05-22 11:46-0300\n" +"PO-Revision-Date: 2024-08-07 07:05+0000\n" +"Last-Translator: YAO WEN LIANG, 2024\n" +"Language-Team: Chinese (Taiwan) (http://app.transifex.com/django/django/" "language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,6 +27,10 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" +#, python-format +msgid "Delete selected %(verbose_name_plural)s" +msgstr "刪除所選的 %(verbose_name_plural)s" + #, python-format msgid "Successfully deleted %(count)d %(items)s." msgstr "成功的刪除了 %(count)d 個 %(items)s." @@ -36,10 +42,6 @@ msgstr "無法刪除 %(name)s" msgid "Are you sure?" msgstr "你確定嗎?" -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "刪除所選的 %(verbose_name_plural)s" - msgid "Administration" msgstr "管理" @@ -76,11 +78,17 @@ msgstr "沒有日期" msgid "Has date" msgstr "有日期" +msgid "Empty" +msgstr "空的" + +msgid "Not empty" +msgstr "非空的" + #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." -msgstr "請輸入正確的工作人員%(username)s及密碼。請注意兩者皆區分大小寫。" +msgstr "請輸入正確的工作人員帳號%(username)s及密碼。請注意兩者皆區分大小寫。" msgid "Action:" msgstr "動作:" @@ -92,6 +100,15 @@ msgstr "新增其它 %(verbose_name)s" msgid "Remove" msgstr "移除" +msgid "Addition" +msgstr "新增" + +msgid "Change" +msgstr "修改" + +msgid "Deletion" +msgstr "删除" + msgid "action time" msgstr "動作時間" @@ -105,7 +122,7 @@ msgid "object id" msgstr "物件 id" #. Translators: 'repr' means representation -#. (https://docs.python.org/3/library/functions.html#repr) +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "物件 repr" @@ -113,31 +130,31 @@ msgid "action flag" msgstr "動作旗標" msgid "change message" -msgstr "變更訊息" +msgstr "修改訊息" msgid "log entry" -msgstr "紀錄項目" +msgstr "日誌記錄" msgid "log entries" -msgstr "紀錄項目" +msgstr "日誌紀錄" #, python-format -msgid "Added \"%(object)s\"." +msgid "Added “%(object)s”." msgstr "\"%(object)s\" 已新增。" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "\"%(object)s\" - %(changes)s 已變更。" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "\"%(object)s\" - %(changes)s 已修改。" #, python-format -msgid "Deleted \"%(object)s.\"" +msgid "Deleted “%(object)s.”" msgstr "\"%(object)s\" 已刪除。" msgid "LogEntry Object" -msgstr "紀錄項目" +msgstr "日誌記錄物件" #, python-brace-format -msgid "Added {name} \"{object}\"." +msgid "Added {name} “{object}”." msgstr "{name} \"{object}\" 已新增。" msgid "Added." @@ -147,71 +164,70 @@ msgid "and" msgstr "和" #, python-brace-format -msgid "Changed {fields} for {name} \"{object}\"." -msgstr "{name} \"{object}\" 的 {fields} 已變更。" +msgid "Changed {fields} for {name} “{object}”." +msgstr "{name} \"{object}\" 的 {fields} 已修改。" #, python-brace-format msgid "Changed {fields}." -msgstr "{fields} 已變更。" +msgstr "{fields} 已修改。" #, python-brace-format -msgid "Deleted {name} \"{object}\"." +msgid "Deleted {name} “{object}”." msgstr "{name} \"{object}\" 已刪除。" msgid "No fields changed." -msgstr "沒有欄位被變更。" +msgstr "沒有欄位被修改。" msgid "None" msgstr "無" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "按住 \"Control\" 或 \"Command\" (Mac),可選取多個值" +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "按住 \"Control\", 或者在 Mac 上按 \"Command\", 以選取更多值" + +msgid "Select this object for an action - {}" +msgstr "選擇此對象進行操作 - {}" #, python-brace-format -msgid "" -"The {name} \"{obj}\" was added successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 新增成功。你可以在下面再次編輯它。" +msgid "The {name} “{obj}” was added successfully." +msgstr "{name} \"{obj}\" 已成功新增。" + +msgid "You may edit it again below." +msgstr "您可以在下面再次編輯它." #, python-brace-format msgid "" -"The {name} \"{obj}\" was added successfully. You may add another {name} " -"below." +"The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "{name} \"{obj}\" 新增成功。你可以在下方加入其他 {name}。" -#, python-brace-format -msgid "The {name} \"{obj}\" was added successfully." -msgstr "{name} \"{obj}\" 已成功新增。" - #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may edit it again below." -msgstr "{name} \"{obj}\" 變更成功。你可以在下方再次編輯。" +"The {name} “{obj}” was changed successfully. You may edit it again below." +msgstr "{name} \"{obj}\" 修改成功。你可以在下方再次編輯。" #, python-brace-format msgid "" -"The {name} \"{obj}\" was changed successfully. You may add another {name} " +"The {name} “{obj}” was changed successfully. You may add another {name} " "below." -msgstr "{name} \"{obj}\" 變更成功。你可以在下方加入其他 {name}。" +msgstr "{name} \"{obj}\" 修改成功。你可以在下方加入其他 {name}。" #, python-brace-format -msgid "The {name} \"{obj}\" was changed successfully." -msgstr "{name} \"{obj}\" 已成功變更。" +msgid "The {name} “{obj}” was changed successfully." +msgstr "成功修改了 {name}“{obj}”。" msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." -msgstr "必須要有項目被選到才能對它們進行動作。沒有項目變更。" +msgstr "必須要有項目被選中才能進行動作。沒有任何項目被修改。" msgid "No action selected." -msgstr "沒有動作被選。" +msgstr "沒有動作被選取。" #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" 已成功刪除。" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "成功删除了 %(name)s“%(obj)s”。" #, python-format -msgid "%(name)s with ID \"%(key)s\" doesn't exist. Perhaps it was deleted?" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" msgstr "不存在 ID 為「%(key)s」的 %(name)s。或許它已被刪除?" #, python-format @@ -220,7 +236,11 @@ msgstr "新增 %s" #, python-format msgid "Change %s" -msgstr "變更 %s" +msgstr "修改 %s" + +#, python-format +msgid "View %s" +msgstr "查看 %s" msgid "Database error" msgstr "資料庫錯誤" @@ -228,23 +248,24 @@ msgstr "資料庫錯誤" #, python-format msgid "%(count)s %(name)s was changed successfully." msgid_plural "%(count)s %(name)s were changed successfully." -msgstr[0] "共 %(count)s %(name)s 已變更成功。" +msgstr[0] "共 %(count)s %(name)s 已修改成功。" #, python-format msgid "%(total_count)s selected" msgid_plural "All %(total_count)s selected" -msgstr[0] "全部 %(total_count)s 個被選" +msgstr[0] "選取了 %(total_count)s 個" #, python-format msgid "0 of %(cnt)s selected" -msgstr "%(cnt)s 中 0 個被選" +msgstr "%(cnt)s 中 0 個被選取" #, python-format msgid "Change history: %s" -msgstr "變更歷史: %s" +msgstr "修改歷史: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(class_name)s %(instance)s" @@ -274,10 +295,10 @@ msgid "%(app)s administration" msgstr "%(app)s 管理" msgid "Page not found" -msgstr "頁面沒有找到" +msgstr "找不到頁面" -msgid "We're sorry, but the requested page could not be found." -msgstr "很抱歉,請求頁面無法找到。" +msgid "We’re sorry, but the requested page could not be found." +msgstr "很抱歉,請求頁面不存在。" msgid "Home" msgstr "首頁" @@ -292,17 +313,17 @@ msgid "Server Error (500)" msgstr "伺服器錯誤 (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" -"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝你" -"的關心。" +"存在一個錯誤。已透過電子郵件回報給網站管理員,並且應該很快就會被修正。謝謝您" +"的耐心等待。" msgid "Run the selected action" -msgstr "執行選擇的動作" +msgstr "執行選取的動作" msgid "Go" -msgstr "去" +msgstr "執行" msgid "Click here to select the objects across all pages" msgstr "點選這裡可選取全部頁面的物件" @@ -314,27 +335,58 @@ msgstr "選擇全部 %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "清除選擇" +msgid "Breadcrumbs" +msgstr "導覽路徑" + +#, python-format +msgid "Models in the %(name)s application" +msgstr "%(name)s 應用程式中的模型" + +msgid "Add" +msgstr "新增" + +msgid "View" +msgstr "查看" + +msgid "You don’t have permission to view or edit anything." +msgstr "你沒有查看或編輯的權限。" + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." -msgstr "首先,輸入一個使用者名稱和密碼。然後你可以編輯更多使用者選項。" +msgstr "輸入使用者名稱和密碼後,你可以編輯更多使用者選項。" msgid "Enter a username and password." -msgstr "輸入一個使用者名稱和密碼。" +msgstr "輸入使用者名稱和密碼。" msgid "Change password" -msgstr "變更密碼" +msgstr "修改密碼" -msgid "Please correct the error below." -msgstr "請更正下面的錯誤。" +msgid "Set password" +msgstr "設定密碼" -msgid "Please correct the errors below." -msgstr "請修正以下錯誤" +msgid "Please correct the error below." +msgid_plural "Please correct the errors below." +msgstr[0] "請修正以下錯誤。" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "為使用者%(username)s輸入一個新的密碼。" +msgid "" +"This action will enable password-based authentication for " +"this user." +msgstr "這會 啟用 本用戶基於密碼的驗證" + +msgid "Disable password-based authentication" +msgstr "停用基於密碼的驗證" + +msgid "Enable password-based authentication" +msgstr "啟用基於密碼的驗證" + +msgid "Skip to main content" +msgstr "跳到主要內容" + msgid "Welcome," msgstr "歡迎," @@ -360,6 +412,15 @@ msgstr "在網站上檢視" msgid "Filter" msgstr "過濾器" +msgid "Hide counts" +msgstr "隱藏計數" + +msgid "Show counts" +msgstr "顯示計數" + +msgid "Clear all filters" +msgstr "清除所有篩選" + msgid "Remove from sorting" msgstr "從排序中移除" @@ -370,6 +431,15 @@ msgstr "優先排序:%(priority_number)s" msgid "Toggle sorting" msgstr "切換排序" +msgid "Toggle theme (current theme: auto)" +msgstr "切換主題(當前主題:自動)" + +msgid "Toggle theme (current theme: light)" +msgstr "切換主題(當前主題:淺色)" + +msgid "Toggle theme (current theme: dark)" +msgstr "切換主題(當前主題:深色)" + msgid "Delete" msgstr "刪除" @@ -400,11 +470,11 @@ msgstr "" msgid "Objects" msgstr "物件" -msgid "Yes, I'm sure" +msgid "Yes, I’m sure" msgstr "是的,我確定" msgid "No, take me back" -msgstr "不,請帶我回去" +msgstr "不,返回" msgid "Delete multiple objects" msgstr "刪除多個物件" @@ -431,9 +501,6 @@ msgid "" msgstr "" "你是否確定要刪除已選的 %(objects_name)s? 下面全部物件及其相關項目都將被刪除:" -msgid "Change" -msgstr "變更" - msgid "Delete?" msgstr "刪除?" @@ -444,16 +511,6 @@ msgstr " 以 %(filter_title)s" msgid "Summary" msgstr "總結" -#, python-format -msgid "Models in the %(name)s application" -msgstr "%(name)s 應用程式中的Model" - -msgid "Add" -msgstr "新增" - -msgid "You don't have permission to edit anything." -msgstr "你沒有編輯任何東西的權限。" - msgid "Recent actions" msgstr "最近的動作" @@ -461,13 +518,22 @@ msgid "My actions" msgstr "我的動作" msgid "None available" -msgstr "無可用的" +msgstr "無資料" + +msgid "Added:" +msgstr "已新增。" + +msgid "Changed:" +msgstr "已修改:" + +msgid "Deleted:" +msgstr "已刪除:" msgid "Unknown content" msgstr "未知內容" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" @@ -479,10 +545,23 @@ msgid "" "You are authenticated as %(username)s, but are not authorized to access this " "page. Would you like to login to a different account?" msgstr "" -"您已認證為 %(username)s,但並沒有瀏覽此頁面的權限。您是否希望以其他帳號登入?" +"您目前以%(username)s登入,但並沒有瀏覽此頁面的權限。您是否希望以其他帳號登" +"入?" msgid "Forgotten your password or username?" -msgstr "忘了你的密碼或是使用者名稱?" +msgstr "忘記您的密碼或是使用者名稱?" + +msgid "Toggle navigation" +msgstr "切換導航" + +msgid "Sidebar" +msgstr "側邊欄" + +msgid "Start typing to filter…" +msgstr "輸入內容開始篩選..." + +msgid "Filter navigation items" +msgstr "篩選導航項目" msgid "Date/time" msgstr "日期/時間" @@ -493,10 +572,14 @@ msgstr "使用者" msgid "Action" msgstr "動作" +msgid "entry" +msgid_plural "entries" +msgstr[0] "紀錄項目" + msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." -msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。" +msgstr "該物件沒有修改的歷史紀錄。它可能不是透過此管理網站新增的。" msgid "Show all" msgstr "顯示全部" @@ -504,20 +587,8 @@ msgstr "顯示全部" msgid "Save" msgstr "儲存" -msgid "Popup closing..." -msgstr "關閉彈出視窗中⋯⋯" - -#, python-format -msgid "Change selected %(model)s" -msgstr "變更所選的 %(model)s" - -#, python-format -msgid "Add another %(model)s" -msgstr "新增其它 %(model)s" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "刪除所選的 %(model)s" +msgid "Popup closing…" +msgstr "關閉彈跳視窗中..." msgid "Search" msgstr "搜尋" @@ -540,30 +611,50 @@ msgstr "儲存並新增另一個" msgid "Save and continue editing" msgstr "儲存並繼續編輯" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "感謝你今天花了重要的時間停留在本網站。" +msgid "Save and view" +msgstr "儲存並查看" + +msgid "Close" +msgstr "關閉" + +#, python-format +msgid "Change selected %(model)s" +msgstr "修改所選的 %(model)s" + +#, python-format +msgid "Add another %(model)s" +msgstr "新增其它 %(model)s" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "刪除所選的 %(model)s" + +#, python-format +msgid "View selected %(model)s" +msgstr "查看已選擇的%(model)s" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "感謝您今天在網站上度過了一段美好的時光。" msgid "Log in again" msgstr "重新登入" msgid "Password change" -msgstr "密碼變更" +msgstr "密碼修改" msgid "Your password was changed." -msgstr "你的密碼已變更。" +msgstr "您的密碼已修改。" msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." -msgstr "" -"為了安全上的考量,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸" -"入。" +msgstr "為了安全上的考量,請輸入你的舊密碼,然後輸入兩次新密碼已確保輸入正確。" msgid "Change my password" -msgstr "變更我的密碼" +msgstr "修改我的密碼" msgid "Password reset" -msgstr "密碼重設" +msgstr "重設密碼" msgid "Your password has been set. You may go ahead and log in now." msgstr "你的密碼已設置,現在可以繼續登入。" @@ -574,7 +665,7 @@ msgstr "密碼重設確認" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." -msgstr "請輸入你的新密碼兩次, 這樣我們才能檢查你的輸入是否正確。" +msgstr "請輸入新密碼兩次, 以便系統確認輸入無誤。" msgid "New password:" msgstr "新密碼:" @@ -585,17 +676,17 @@ msgstr "確認密碼:" msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." -msgstr "密碼重設連結無效,可能因為他已使用。請重新請求密碼重設。" +msgstr "密碼重設連結無效,可能已被使用。請重新申請密碼重設。" msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" "若您提交的電子郵件地址存在對應帳號,我們已寄出重設密碼的相關指示。您應該很快" "就會收到。" msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" "如果您未收到電子郵件,請確認您輸入的電子郵件地址與您註冊時輸入的一致,並檢查" @@ -605,13 +696,13 @@ msgstr "" msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." -msgstr "這封電子郵件來自 %(site_name)s,因為你要求為帳號重新設定密碼。" +msgstr "這封電子郵件來自 %(site_name)s,因為您要求為帳號重新設定密碼。" msgid "Please go to the following page and choose a new password:" msgstr "請到該頁面選擇一個新的密碼:" -msgid "Your username, in case you've forgotten:" -msgstr "你的使用者名稱,萬一你已經忘記的話:" +msgid "Your username, in case you’ve forgotten:" +msgstr "提醒一下,您的用戶名是:" msgid "Thanks for using our site!" msgstr "感謝使用本網站!" @@ -621,11 +712,10 @@ msgid "The %(site_name)s team" msgstr "%(site_name)s 團隊" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" -"忘記你的密碼? 請在下面輸入你的電子郵件位址, 然後我們會寄出設定新密碼的操作指" -"示。" +"忘記您的密碼? 請在下面輸入您的電子郵件, 然後我們會寄出設定新密碼的操作指示。" msgid "Email address:" msgstr "電子信箱:" @@ -633,6 +723,9 @@ msgstr "電子信箱:" msgid "Reset my password" msgstr "重設我的密碼" +msgid "Select all objects on this page for an action" +msgstr "選擇此頁面上的所有物件執行操作" + msgid "All dates" msgstr "所有日期" @@ -642,7 +735,11 @@ msgstr "選擇 %s" #, python-format msgid "Select %s to change" -msgstr "選擇 %s 來變更" +msgstr "選擇 %s 來修改" + +#, python-format +msgid "Select %s to view" +msgstr "選擇%s查看" msgid "Date:" msgstr "日期" @@ -651,7 +748,7 @@ msgid "Time:" msgstr "時間" msgid "Lookup" -msgstr "查詢" +msgstr "查找" msgid "Currently:" msgstr "目前:" diff --git a/django/contrib/admin/migrations/0001_initial.py b/django/contrib/admin/migrations/0001_initial.py index 78cd7a711249..6270e1032d9f 100644 --- a/django/contrib/admin/migrations/0001_initial.py +++ b/django/contrib/admin/migrations/0001_initial.py @@ -4,44 +4,72 @@ class Migration(migrations.Migration): - dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('contenttypes', '__first__'), + ("contenttypes", "__first__"), ] operations = [ migrations.CreateModel( - name='LogEntry', + name="LogEntry", fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('action_time', models.DateTimeField(auto_now=True, verbose_name='action time')), - ('object_id', models.TextField(null=True, verbose_name='object id', blank=True)), - ('object_repr', models.CharField(max_length=200, verbose_name='object repr')), - ('action_flag', models.PositiveSmallIntegerField(verbose_name='action flag')), - ('change_message', models.TextField(verbose_name='change message', blank=True)), - ('content_type', models.ForeignKey( - to_field='id', - on_delete=models.SET_NULL, - blank=True, null=True, - to='contenttypes.ContentType', - verbose_name='content type', - )), - ('user', models.ForeignKey( - to=settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - verbose_name='user', - )), + ( + "id", + models.AutoField( + verbose_name="ID", + serialize=False, + auto_created=True, + primary_key=True, + ), + ), + ( + "action_time", + models.DateTimeField(auto_now=True, verbose_name="action time"), + ), + ( + "object_id", + models.TextField(null=True, verbose_name="object id", blank=True), + ), + ( + "object_repr", + models.CharField(max_length=200, verbose_name="object repr"), + ), + ( + "action_flag", + models.PositiveSmallIntegerField(verbose_name="action flag"), + ), + ( + "change_message", + models.TextField(verbose_name="change message", blank=True), + ), + ( + "content_type", + models.ForeignKey( + on_delete=models.SET_NULL, + blank=True, + null=True, + to="contenttypes.ContentType", + verbose_name="content type", + ), + ), + ( + "user", + models.ForeignKey( + to=settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + verbose_name="user", + ), + ), ], options={ - 'ordering': ['-action_time'], - 'db_table': 'django_admin_log', - 'verbose_name': 'log entry', - 'verbose_name_plural': 'log entries', + "ordering": ["-action_time"], + "db_table": "django_admin_log", + "verbose_name": "log entry", + "verbose_name_plural": "log entries", }, bases=(models.Model,), managers=[ - ('objects', django.contrib.admin.models.LogEntryManager()), + ("objects", django.contrib.admin.models.LogEntryManager()), ], ), ] diff --git a/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py b/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py index a2b19162f28c..7fcf9c0c3945 100644 --- a/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py +++ b/django/contrib/admin/migrations/0002_logentry_remove_auto_add.py @@ -3,18 +3,17 @@ class Migration(migrations.Migration): - dependencies = [ - ('admin', '0001_initial'), + ("admin", "0001_initial"), ] # No database changes; removes auto_add and adds default/editable. operations = [ migrations.AlterField( - model_name='logentry', - name='action_time', + model_name="logentry", + name="action_time", field=models.DateTimeField( - verbose_name='action time', + verbose_name="action time", default=timezone.now, editable=False, ), diff --git a/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py b/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py index a041a9de0e13..a73e55fc254e 100644 --- a/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py +++ b/django/contrib/admin/migrations/0003_logentry_add_action_flag_choices.py @@ -2,19 +2,18 @@ class Migration(migrations.Migration): - dependencies = [ - ('admin', '0002_logentry_remove_auto_add'), + ("admin", "0002_logentry_remove_auto_add"), ] # No database changes; adds choices to action_flag. operations = [ migrations.AlterField( - model_name='logentry', - name='action_flag', + model_name="logentry", + name="action_flag", field=models.PositiveSmallIntegerField( - choices=[(1, 'Addition'), (2, 'Change'), (3, 'Deletion')], - verbose_name='action flag', + choices=[(1, "Addition"), (2, "Change"), (3, "Deletion")], + verbose_name="action flag", ), ), ] diff --git a/django/contrib/admin/models.py b/django/contrib/admin/models.py index a0fbb02afd41..5723ebff7f36 100644 --- a/django/contrib/admin/models.py +++ b/django/contrib/admin/models.py @@ -7,82 +7,102 @@ from django.urls import NoReverseMatch, reverse from django.utils import timezone from django.utils.text import get_text_list -from django.utils.translation import gettext, gettext_lazy as _ +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ ADDITION = 1 CHANGE = 2 DELETION = 3 -ACTION_FLAG_CHOICES = ( - (ADDITION, _('Addition')), - (CHANGE, _('Change')), - (DELETION, _('Deletion')), -) +ACTION_FLAG_CHOICES = [ + (ADDITION, _("Addition")), + (CHANGE, _("Change")), + (DELETION, _("Deletion")), +] class LogEntryManager(models.Manager): use_in_migrations = True - def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''): + def log_actions( + self, user_id, queryset, action_flag, change_message="", *, single_object=False + ): if isinstance(change_message, list): change_message = json.dumps(change_message) - return self.model.objects.create( - user_id=user_id, - content_type_id=content_type_id, - object_id=str(object_id), - object_repr=object_repr[:200], - action_flag=action_flag, - change_message=change_message, - ) + + log_entry_list = [ + self.model( + user_id=user_id, + content_type_id=ContentType.objects.get_for_model( + obj, for_concrete_model=False + ).id, + object_id=obj.pk, + object_repr=str(obj)[:200], + action_flag=action_flag, + change_message=change_message, + ) + for obj in queryset + ] + + if single_object and log_entry_list: + instance = log_entry_list[0] + instance.save() + return instance + + return self.model.objects.bulk_create(log_entry_list) class LogEntry(models.Model): action_time = models.DateTimeField( - _('action time'), + _("action time"), default=timezone.now, editable=False, ) user = models.ForeignKey( settings.AUTH_USER_MODEL, models.CASCADE, - verbose_name=_('user'), + verbose_name=_("user"), ) content_type = models.ForeignKey( ContentType, models.SET_NULL, - verbose_name=_('content type'), - blank=True, null=True, + verbose_name=_("content type"), + blank=True, + null=True, + ) + object_id = models.TextField(_("object id"), blank=True, null=True) + # Translators: 'repr' means representation + # (https://docs.python.org/library/functions.html#repr) + object_repr = models.CharField(_("object repr"), max_length=200) + action_flag = models.PositiveSmallIntegerField( + _("action flag"), choices=ACTION_FLAG_CHOICES ) - object_id = models.TextField(_('object id'), blank=True, null=True) - # Translators: 'repr' means representation (https://docs.python.org/library/functions.html#repr) - object_repr = models.CharField(_('object repr'), max_length=200) - action_flag = models.PositiveSmallIntegerField(_('action flag'), choices=ACTION_FLAG_CHOICES) # change_message is either a string or a JSON structure - change_message = models.TextField(_('change message'), blank=True) + change_message = models.TextField(_("change message"), blank=True) objects = LogEntryManager() class Meta: - verbose_name = _('log entry') - verbose_name_plural = _('log entries') - db_table = 'django_admin_log' - ordering = ['-action_time'] + verbose_name = _("log entry") + verbose_name_plural = _("log entries") + db_table = "django_admin_log" + ordering = ["-action_time"] def __repr__(self): return str(self.action_time) def __str__(self): if self.is_addition(): - return gettext('Added “%(object)s”.') % {'object': self.object_repr} + return gettext("Added “%(object)s”.") % {"object": self.object_repr} elif self.is_change(): - return gettext('Changed “%(object)s” — %(changes)s') % { - 'object': self.object_repr, - 'changes': self.get_change_message(), + return gettext("Changed “%(object)s” — %(changes)s") % { + "object": self.object_repr, + "changes": self.get_change_message(), } elif self.is_deletion(): - return gettext('Deleted “%(object)s.”') % {'object': self.object_repr} + return gettext("Deleted “%(object)s.”") % {"object": self.object_repr} - return gettext('LogEntry Object') + return gettext("LogEntry Object") def is_addition(self): return self.action_flag == ADDITION @@ -98,38 +118,62 @@ def get_change_message(self): If self.change_message is a JSON structure, interpret it as a change string, properly translated. """ - if self.change_message and self.change_message[0] == '[': + if self.change_message and self.change_message[0] == "[": try: change_message = json.loads(self.change_message) except json.JSONDecodeError: return self.change_message messages = [] for sub_message in change_message: - if 'added' in sub_message: - if sub_message['added']: - sub_message['added']['name'] = gettext(sub_message['added']['name']) - messages.append(gettext('Added {name} “{object}”.').format(**sub_message['added'])) + if "added" in sub_message: + if sub_message["added"]: + sub_message["added"]["name"] = gettext( + sub_message["added"]["name"] + ) + messages.append( + gettext("Added {name} “{object}”.").format( + **sub_message["added"] + ) + ) else: - messages.append(gettext('Added.')) - - elif 'changed' in sub_message: - sub_message['changed']['fields'] = get_text_list( - [gettext(field_name) for field_name in sub_message['changed']['fields']], gettext('and') + messages.append(gettext("Added.")) + + elif "changed" in sub_message: + sub_message["changed"]["fields"] = get_text_list( + [ + gettext(field_name) + for field_name in sub_message["changed"]["fields"] + ], + gettext("and"), ) - if 'name' in sub_message['changed']: - sub_message['changed']['name'] = gettext(sub_message['changed']['name']) - messages.append(gettext('Changed {fields} for {name} “{object}”.').format( - **sub_message['changed'] - )) + if "name" in sub_message["changed"]: + sub_message["changed"]["name"] = gettext( + sub_message["changed"]["name"] + ) + messages.append( + gettext("Changed {fields} for {name} “{object}”.").format( + **sub_message["changed"] + ) + ) else: - messages.append(gettext('Changed {fields}.').format(**sub_message['changed'])) - - elif 'deleted' in sub_message: - sub_message['deleted']['name'] = gettext(sub_message['deleted']['name']) - messages.append(gettext('Deleted {name} “{object}”.').format(**sub_message['deleted'])) + messages.append( + gettext("Changed {fields}.").format( + **sub_message["changed"] + ) + ) + + elif "deleted" in sub_message: + sub_message["deleted"]["name"] = gettext( + sub_message["deleted"]["name"] + ) + messages.append( + gettext("Deleted {name} “{object}”.").format( + **sub_message["deleted"] + ) + ) - change_message = ' '.join(msg[0].upper() + msg[1:] for msg in messages) - return change_message or gettext('No fields changed.') + change_message = " ".join(msg[0].upper() + msg[1:] for msg in messages) + return change_message or gettext("No fields changed.") else: return self.change_message @@ -142,7 +186,10 @@ def get_admin_url(self): Return the admin URL to edit the object represented by this log entry. """ if self.content_type and self.object_id: - url_name = 'admin:%s_%s_change' % (self.content_type.app_label, self.content_type.model) + url_name = "admin:%s_%s_change" % ( + self.content_type.app_label, + self.content_type.model, + ) try: return reverse(url_name, args=(quote(self.object_id),)) except NoReverseMatch: diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index e628afbe76bf..3c2cf9d13061 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1,39 +1,53 @@ import copy +import enum import json -import operator import re -from functools import partial, reduce, update_wrapper +from functools import partial, update_wrapper +from urllib.parse import parse_qsl from urllib.parse import quote as urlquote +from urllib.parse import urlsplit from django import forms from django.conf import settings from django.contrib import messages from django.contrib.admin import helpers, widgets from django.contrib.admin.checks import ( - BaseModelAdminChecks, InlineModelAdminChecks, ModelAdminChecks, + BaseModelAdminChecks, + InlineModelAdminChecks, + ModelAdminChecks, ) -from django.contrib.admin.exceptions import DisallowedModelAdminToField +from django.contrib.admin.exceptions import DisallowedModelAdminToField, NotRegistered from django.contrib.admin.templatetags.admin_urls import add_preserved_filters from django.contrib.admin.utils import ( - NestedObjects, construct_change_message, flatten_fieldsets, - get_deleted_objects, lookup_needs_distinct, model_format_dict, - model_ngettext, quote, unquote, -) -from django.contrib.admin.views.autocomplete import AutocompleteJsonView -from django.contrib.admin.widgets import ( - AutocompleteSelect, AutocompleteSelectMultiple, + NestedObjects, + construct_change_message, + flatten_fieldsets, + get_deleted_objects, + lookup_spawns_duplicates, + model_format_dict, + model_ngettext, + quote, + unquote, ) +from django.contrib.admin.widgets import AutocompleteSelect, AutocompleteSelectMultiple from django.contrib.auth import get_permission_codename from django.core.exceptions import ( - FieldDoesNotExist, FieldError, PermissionDenied, ValidationError, + FieldDoesNotExist, + FieldError, + PermissionDenied, + ValidationError, ) from django.core.paginator import Paginator from django.db import models, router, transaction from django.db.models.constants import LOOKUP_SEP +from django.db.models.functions import Cast from django.forms.formsets import DELETION_FIELD_NAME, all_valid from django.forms.models import ( - BaseInlineFormSet, inlineformset_factory, modelform_defines_fields, - modelform_factory, modelformset_factory, + BaseInlineFormSet, + inlineformset_factory, + modelform_defines_fields, + modelform_factory, + modelformset_factory, ) from django.forms.widgets import CheckboxSelectMultiple, SelectMultiple from django.http import HttpResponseRedirect @@ -45,14 +59,26 @@ from django.utils.http import urlencode from django.utils.safestring import mark_safe from django.utils.text import ( - capfirst, format_lazy, get_text_list, smart_split, unescape_string_literal, + capfirst, + format_lazy, + get_text_list, + smart_split, + unescape_string_literal, ) -from django.utils.translation import gettext as _, ngettext +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext from django.views.decorators.csrf import csrf_protect from django.views.generic import RedirectView -IS_POPUP_VAR = '_popup' -TO_FIELD_VAR = '_to_field' +IS_POPUP_VAR = "_popup" +TO_FIELD_VAR = "_to_field" +IS_FACETS_VAR = "_facets" + + +class ShowFacets(enum.Enum): + NEVER = "NEVER" + ALLOW = "ALLOW" + ALWAYS = "ALWAYS" HORIZONTAL, VERTICAL = 1, 2 @@ -62,11 +88,12 @@ def get_content_type_for_model(obj): # Since this module gets imported in the application's root package, # it cannot import models from other applications at the module level. from django.contrib.contenttypes.models import ContentType + return ContentType.objects.get_for_model(obj, for_concrete_model=False) def get_ul_class(radio_style): - return 'radiolist' if radio_style == VERTICAL else 'radiolist inline' + return "radiolist" if radio_style == VERTICAL else "radiolist inline" class IncorrectLookupParameters(Exception): @@ -78,20 +105,20 @@ class IncorrectLookupParameters(Exception): FORMFIELD_FOR_DBFIELD_DEFAULTS = { models.DateTimeField: { - 'form_class': forms.SplitDateTimeField, - 'widget': widgets.AdminSplitDateTime + "form_class": forms.SplitDateTimeField, + "widget": widgets.AdminSplitDateTime, }, - models.DateField: {'widget': widgets.AdminDateWidget}, - models.TimeField: {'widget': widgets.AdminTimeWidget}, - models.TextField: {'widget': widgets.AdminTextareaWidget}, - models.URLField: {'widget': widgets.AdminURLFieldWidget}, - models.IntegerField: {'widget': widgets.AdminIntegerFieldWidget}, - models.BigIntegerField: {'widget': widgets.AdminBigIntegerFieldWidget}, - models.CharField: {'widget': widgets.AdminTextInputWidget}, - models.ImageField: {'widget': widgets.AdminFileWidget}, - models.FileField: {'widget': widgets.AdminFileWidget}, - models.EmailField: {'widget': widgets.AdminEmailInputWidget}, - models.UUIDField: {'widget': widgets.AdminUUIDInputWidget}, + models.DateField: {"widget": widgets.AdminDateWidget}, + models.TimeField: {"widget": widgets.AdminTimeWidget}, + models.TextField: {"widget": widgets.AdminTextareaWidget}, + models.URLField: {"widget": widgets.AdminURLFieldWidget}, + models.IntegerField: {"widget": widgets.AdminIntegerFieldWidget}, + models.BigIntegerField: {"widget": widgets.AdminBigIntegerFieldWidget}, + models.CharField: {"widget": widgets.AdminTextInputWidget}, + models.ImageField: {"widget": widgets.AdminFileWidget}, + models.FileField: {"widget": widgets.AdminFileWidget}, + models.EmailField: {"widget": widgets.AdminEmailInputWidget}, + models.UUIDField: {"widget": widgets.AdminUUIDInputWidget}, } csrf_protect_m = method_decorator(csrf_protect) @@ -161,17 +188,32 @@ def formfield_for_dbfield(self, db_field, request, **kwargs): # rendered output. formfield can be None if it came from a # OneToOneField with parent_link=True or a M2M intermediary. if formfield and db_field.name not in self.raw_id_fields: - related_modeladmin = self.admin_site._registry.get(db_field.remote_field.model) - wrapper_kwargs = {} - if related_modeladmin: - wrapper_kwargs.update( - can_add_related=related_modeladmin.has_add_permission(request), - can_change_related=related_modeladmin.has_change_permission(request), - can_delete_related=related_modeladmin.has_delete_permission(request), - can_view_related=related_modeladmin.has_view_permission(request), + try: + related_modeladmin = self.admin_site.get_model_admin( + db_field.remote_field.model ) + except NotRegistered: + wrapper_kwargs = {} + else: + wrapper_kwargs = { + "can_add_related": related_modeladmin.has_add_permission( + request + ), + "can_change_related": related_modeladmin.has_change_permission( + request + ), + "can_delete_related": related_modeladmin.has_delete_permission( + request + ), + "can_view_related": related_modeladmin.has_view_permission( + request + ), + } formfield.widget = widgets.RelatedFieldWidgetWrapper( - formfield.widget, db_field.remote_field, self.admin_site, **wrapper_kwargs + formfield.widget, + db_field.remote_field, + self.admin_site, + **wrapper_kwargs, ) return formfield @@ -193,14 +235,15 @@ def formfield_for_choice_field(self, db_field, request, **kwargs): # If the field is named as a radio_field, use a RadioSelect if db_field.name in self.radio_fields: # Avoid stomping on custom widget/choices arguments. - if 'widget' not in kwargs: - kwargs['widget'] = widgets.AdminRadioSelect(attrs={ - 'class': get_ul_class(self.radio_fields[db_field.name]), - }) - if 'choices' not in kwargs: - kwargs['choices'] = db_field.get_choices( - include_blank=db_field.blank, - blank_choice=[('', _('None'))] + if "widget" not in kwargs: + kwargs["widget"] = widgets.AdminRadioSelect( + attrs={ + "class": get_ul_class(self.radio_fields[db_field.name]), + } + ) + if "choices" not in kwargs: + kwargs["choices"] = db_field.get_choices( + include_blank=db_field.blank, blank_choice=[("", _("None"))] ) return db_field.formfield(**kwargs) @@ -210,34 +253,47 @@ def get_field_queryset(self, db, db_field, request): ordering. Otherwise don't specify the queryset, let the field decide (return None in that case). """ - related_admin = self.admin_site._registry.get(db_field.remote_field.model) - if related_admin is not None: + try: + related_admin = self.admin_site.get_model_admin(db_field.remote_field.model) + except NotRegistered: + return None + else: ordering = related_admin.get_ordering(request) if ordering is not None and ordering != (): - return db_field.remote_field.model._default_manager.using(db).order_by(*ordering) + return db_field.remote_field.model._default_manager.using(db).order_by( + *ordering + ) return None def formfield_for_foreignkey(self, db_field, request, **kwargs): """ Get a form Field for a ForeignKey. """ - db = kwargs.get('using') + db = kwargs.get("using") - if 'widget' not in kwargs: + if "widget" not in kwargs: if db_field.name in self.get_autocomplete_fields(request): - kwargs['widget'] = AutocompleteSelect(db_field.remote_field, self.admin_site, using=db) + kwargs["widget"] = AutocompleteSelect( + db_field, self.admin_site, using=db + ) elif db_field.name in self.raw_id_fields: - kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.remote_field, self.admin_site, using=db) + kwargs["widget"] = widgets.ForeignKeyRawIdWidget( + db_field.remote_field, self.admin_site, using=db + ) elif db_field.name in self.radio_fields: - kwargs['widget'] = widgets.AdminRadioSelect(attrs={ - 'class': get_ul_class(self.radio_fields[db_field.name]), - }) - kwargs['empty_label'] = _('None') if db_field.blank else None + kwargs["widget"] = widgets.AdminRadioSelect( + attrs={ + "class": get_ul_class(self.radio_fields[db_field.name]), + } + ) + kwargs["empty_label"] = ( + kwargs.get("empty_label", _("None")) if db_field.blank else None + ) - if 'queryset' not in kwargs: + if "queryset" not in kwargs: queryset = self.get_field_queryset(db, db_field, request) if queryset is not None: - kwargs['queryset'] = queryset + kwargs["queryset"] = queryset return db_field.formfield(**kwargs) @@ -249,38 +305,46 @@ def formfield_for_manytomany(self, db_field, request, **kwargs): # a field in admin. if not db_field.remote_field.through._meta.auto_created: return None - db = kwargs.get('using') + db = kwargs.get("using") - if 'widget' not in kwargs: + if "widget" not in kwargs: autocomplete_fields = self.get_autocomplete_fields(request) if db_field.name in autocomplete_fields: - kwargs['widget'] = AutocompleteSelectMultiple( - db_field.remote_field, + kwargs["widget"] = AutocompleteSelectMultiple( + db_field, self.admin_site, using=db, ) elif db_field.name in self.raw_id_fields: - kwargs['widget'] = widgets.ManyToManyRawIdWidget( + kwargs["widget"] = widgets.ManyToManyRawIdWidget( db_field.remote_field, self.admin_site, using=db, ) elif db_field.name in [*self.filter_vertical, *self.filter_horizontal]: - kwargs['widget'] = widgets.FilteredSelectMultiple( - db_field.verbose_name, - db_field.name in self.filter_vertical + kwargs["widget"] = widgets.FilteredSelectMultiple( + db_field.verbose_name, db_field.name in self.filter_vertical ) - if 'queryset' not in kwargs: + if "queryset" not in kwargs: queryset = self.get_field_queryset(db, db_field, request) if queryset is not None: - kwargs['queryset'] = queryset + kwargs["queryset"] = queryset form_field = db_field.formfield(**kwargs) - if (isinstance(form_field.widget, SelectMultiple) and - not isinstance(form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple))): - msg = _('Hold down “Control”, or “Command” on a Mac, to select more than one.') + if ( + isinstance(form_field.widget, SelectMultiple) + and form_field.widget.allow_multiple_selected + and not isinstance( + form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) + ) + ): + msg = _( + "Hold down “Control”, or “Command” on a Mac, to select more than one." + ) help_text = form_field.help_text - form_field.help_text = format_lazy('{} {}', help_text, msg) if help_text else msg + form_field.help_text = ( + format_lazy("{} {}", help_text, msg) if help_text else msg + ) return form_field def get_autocomplete_fields(self, request): @@ -296,12 +360,16 @@ def get_view_on_site_url(self, obj=None): if callable(self.view_on_site): return self.view_on_site(obj) - elif self.view_on_site and hasattr(obj, 'get_absolute_url'): + elif hasattr(obj, "get_absolute_url"): # use the ContentType lookup if view_on_site is True - return reverse('admin:view_on_site', kwargs={ - 'content_type_id': get_content_type_for_model(obj).pk, - 'object_id': obj.pk - }) + return reverse( + "admin:view_on_site", + kwargs={ + "content_type_id": get_content_type_for_model(obj).pk, + "object_id": obj.pk, + }, + current_app=self.admin_site.name, + ) def get_empty_value_display(self): """ @@ -334,7 +402,7 @@ def get_fieldsets(self, request, obj=None): """ if self.fieldsets: return self.fieldsets - return [(None, {'fields': self.get_fields(request, obj)})] + return [(None, {"fields": self.get_fields(request, obj)})] def get_inlines(self, request, obj): """Hook for specifying custom inlines.""" @@ -372,9 +440,13 @@ def get_queryset(self, request): def get_sortable_by(self, request): """Hook for specifying which fields can be sorted in the changelist.""" - return self.sortable_by if self.sortable_by is not None else self.get_list_display(request) + return ( + self.sortable_by + if self.sortable_by is not None + else self.get_list_display(request) + ) - def lookup_allowed(self, lookup, value): + def lookup_allowed(self, lookup, value, request): from django.contrib.admin.filters import SimpleListFilter model = self.model @@ -385,37 +457,47 @@ def lookup_allowed(self, lookup, value): # As ``limit_choices_to`` can be a callable, invoke it here. if callable(fk_lookup): fk_lookup = fk_lookup() - if (lookup, value) in widgets.url_params_from_lookup_dict(fk_lookup).items(): + if (lookup, value) in widgets.url_params_from_lookup_dict( + fk_lookup + ).items(): return True relation_parts = [] prev_field = None - for part in lookup.split(LOOKUP_SEP): + parts = lookup.split(LOOKUP_SEP) + for part in parts: try: field = model._meta.get_field(part) except FieldDoesNotExist: # Lookups on nonexistent fields are ok, since they're ignored # later. break - # It is allowed to filter on values that would be found from local - # model anyways. For example, if you filter on employee__department__id, - # then the id value would be found already from employee__department_id. - if not prev_field or (prev_field.is_relation and - field not in prev_field.get_path_info()[-1].target_fields): + if not prev_field or ( + prev_field.is_relation + and field not in model._meta.parents.values() + and field is not model._meta.auto_field + and ( + model._meta.auto_field is None + or part not in getattr(prev_field, "to_fields", []) + ) + and (field.is_relation or not field.primary_key) + ): relation_parts.append(part) - if not getattr(field, 'get_path_info', None): + if not getattr(field, "path_infos", None): # This is not a relational field, so further parts # must be transforms. break prev_field = field - model = field.get_path_info()[-1].to_opts.model + model = field.path_infos[-1].to_opts.model if len(relation_parts) <= 1: # Either a local field filter, or no fields at all. return True valid_lookups = {self.date_hierarchy} - for filter_item in self.list_filter: - if isinstance(filter_item, type) and issubclass(filter_item, SimpleListFilter): + for filter_item in self.get_list_filter(request): + if isinstance(filter_item, type) and issubclass( + filter_item, SimpleListFilter + ): valid_lookups.add(filter_item.parameter_name) elif isinstance(filter_item, (list, tuple)): valid_lookups.add(filter_item[0]) @@ -425,7 +507,7 @@ def lookup_allowed(self, lookup, value): # Is it a valid relational lookup? return not { LOOKUP_SEP.join(relation_parts), - LOOKUP_SEP.join(relation_parts + [part]) + LOOKUP_SEP.join(relation_parts + [part]), }.isdisjoint(valid_lookups) def to_field_allowed(self, request, to_field): @@ -433,10 +515,8 @@ def to_field_allowed(self, request, to_field): Return True if the model associated with this admin should be allowed to be referenced by the specified field. """ - opts = self.model._meta - try: - field = opts.get_field(to_field) + field = self.opts.get_field(to_field) except FieldDoesNotExist: return False @@ -447,7 +527,7 @@ def to_field_allowed(self, request, to_field): # Allow reverse relationships to models defining m2m fields if they # target the specified field. - for many_to_many in opts.many_to_many: + for many_to_many in self.opts.many_to_many: if many_to_many.m2m_target_field_name() == to_field: return True @@ -460,15 +540,18 @@ def to_field_allowed(self, request, to_field): registered_models.add(inline.model) related_objects = ( - f for f in opts.get_fields(include_hidden=True) + f + for f in self.opts.get_fields(include_hidden=True) if (f.auto_created and not f.concrete) ) for related_object in related_objects: related_model = related_object.related_model remote_field = related_object.field.remote_field - if (any(issubclass(model, related_model) for model in registered_models) and - hasattr(remote_field, 'get_related_field') and - remote_field.get_related_field() == field): + if ( + any(issubclass(model, related_model) for model in registered_models) + and hasattr(remote_field, "get_related_field") + and remote_field.get_related_field() == field + ): return True return False @@ -479,7 +562,7 @@ def has_add_permission(self, request): Can be overridden by the user in subclasses. """ opts = self.opts - codename = get_permission_codename('add', opts) + codename = get_permission_codename("add", opts) return request.user.has_perm("%s.%s" % (opts.app_label, codename)) def has_change_permission(self, request, obj=None): @@ -494,12 +577,12 @@ def has_change_permission(self, request, obj=None): request has permission to change *any* object of the given type. """ opts = self.opts - codename = get_permission_codename('change', opts) + codename = get_permission_codename("change", opts) return request.user.has_perm("%s.%s" % (opts.app_label, codename)) def has_delete_permission(self, request, obj=None): """ - Return True if the given request has permission to change the given + Return True if the given request has permission to delete the given Django model instance, the default implementation doesn't examine the `obj` parameter. @@ -509,7 +592,7 @@ def has_delete_permission(self, request, obj=None): request has permission to delete *any* object of the given type. """ opts = self.opts - codename = get_permission_codename('delete', opts) + codename = get_permission_codename("delete", opts) return request.user.has_perm("%s.%s" % (opts.app_label, codename)) def has_view_permission(self, request, obj=None): @@ -524,15 +607,16 @@ def has_view_permission(self, request, obj=None): any object of the given type. """ opts = self.opts - codename_view = get_permission_codename('view', opts) - codename_change = get_permission_codename('change', opts) - return ( - request.user.has_perm('%s.%s' % (opts.app_label, codename_view)) or - request.user.has_perm('%s.%s' % (opts.app_label, codename_change)) - ) + codename_view = get_permission_codename("view", opts) + codename_change = get_permission_codename("change", opts) + return request.user.has_perm( + "%s.%s" % (opts.app_label, codename_view) + ) or request.user.has_perm("%s.%s" % (opts.app_label, codename_change)) def has_view_or_change_permission(self, request, obj=None): - return self.has_view_permission(request, obj) or self.has_change_permission(request, obj) + return self.has_view_permission(request, obj) or self.has_change_permission( + request, obj + ) def has_module_permission(self, request): """ @@ -551,7 +635,7 @@ def has_module_permission(self, request): class ModelAdmin(BaseModelAdmin): """Encapsulate all admin options and functionality for a given model.""" - list_display = ('__str__',) + list_display = ("__str__",) list_display_links = () list_filter = () list_select_related = False @@ -559,13 +643,15 @@ class ModelAdmin(BaseModelAdmin): list_max_show_all = 200 list_editable = () search_fields = () + search_help_text = None date_hierarchy = None save_as = False save_as_continue = True save_on_top = False paginator = Paginator preserve_filters = True - inlines = [] + show_facets = ShowFacets.ALLOW + inlines = () # Custom templates (designed to be over-ridden in subclasses) add_form_template = None @@ -577,7 +663,7 @@ class ModelAdmin(BaseModelAdmin): popup_response_template = None # Actions - actions = [] + actions = () action_form = helpers.ActionForm actions_on_top = True actions_on_bottom = False @@ -591,16 +677,24 @@ def __init__(self, model, admin_site): super().__init__() def __str__(self): - return "%s.%s" % (self.model._meta.app_label, self.__class__.__name__) + return "%s.%s" % (self.opts.app_label, self.__class__.__name__) + + def __repr__(self): + return ( + f"<{self.__class__.__qualname__}: model={self.model.__qualname__} " + f"site={self.admin_site!r}>" + ) def get_inline_instances(self, request, obj=None): inline_instances = [] for inline_class in self.get_inlines(request, obj): inline = inline_class(self.model, self.admin_site) if request: - if not (inline.has_view_or_change_permission(request, obj) or - inline.has_add_permission(request, obj) or - inline.has_delete_permission(request, obj)): + if not ( + inline.has_view_or_change_permission(request, obj) + or inline.has_add_permission(request, obj) + or inline.has_delete_permission(request, obj) + ): continue if not inline.has_add_permission(request, obj): inline.max_num = 0 @@ -614,22 +708,40 @@ def get_urls(self): def wrap(view): def wrapper(*args, **kwargs): return self.admin_site.admin_view(view)(*args, **kwargs) + wrapper.model_admin = self return update_wrapper(wrapper, view) - info = self.model._meta.app_label, self.model._meta.model_name + info = self.opts.app_label, self.opts.model_name return [ - path('', wrap(self.changelist_view), name='%s_%s_changelist' % info), - path('add/', wrap(self.add_view), name='%s_%s_add' % info), - path('autocomplete/', wrap(self.autocomplete_view), name='%s_%s_autocomplete' % info), - path('/history/', wrap(self.history_view), name='%s_%s_history' % info), - path('/delete/', wrap(self.delete_view), name='%s_%s_delete' % info), - path('/change/', wrap(self.change_view), name='%s_%s_change' % info), + path("", wrap(self.changelist_view), name="%s_%s_changelist" % info), + path("add/", wrap(self.add_view), name="%s_%s_add" % info), + path( + "/history/", + wrap(self.history_view), + name="%s_%s_history" % info, + ), + path( + "/delete/", + wrap(self.delete_view), + name="%s_%s_delete" % info, + ), + path( + "/change/", + wrap(self.change_view), + name="%s_%s_change" % info, + ), # For backwards compatibility (was the change url before 1.9) - path('/', wrap(RedirectView.as_view( - pattern_name='%s:%s_%s_change' % ((self.admin_site.name,) + info) - ))), + path( + "/", + wrap( + RedirectView.as_view( + pattern_name="%s:%s_%s_change" + % ((self.admin_site.name,) + info) + ) + ), + ), ] @property @@ -638,18 +750,18 @@ def urls(self): @property def media(self): - extra = '' if settings.DEBUG else '.min' + extra = "" if settings.DEBUG else ".min" js = [ - 'vendor/jquery/jquery%s.js' % extra, - 'jquery.init.js', - 'core.js', - 'admin/RelatedObjectLookups.js', - 'actions.js', - 'urlify.js', - 'prepopulate.js', - 'vendor/xregexp/xregexp%s.js' % extra, + "vendor/jquery/jquery%s.js" % extra, + "jquery.init.js", + "core.js", + "admin/RelatedObjectLookups.js", + "actions.js", + "urlify.js", + "prepopulate.js", + "vendor/xregexp/xregexp%s.js" % extra, ] - return forms.Media(js=['admin/js/%s' % url for url in js]) + return forms.Media(js=["admin/js/%s" % url for url in js]) def get_model_perms(self, request): """ @@ -658,10 +770,10 @@ def get_model_perms(self, request): for each of those actions. """ return { - 'add': self.has_add_permission(request), - 'change': self.has_change_permission(request), - 'delete': self.has_delete_permission(request), - 'view': self.has_view_permission(request), + "add": self.has_add_permission(request), + "change": self.has_change_permission(request), + "delete": self.has_delete_permission(request), + "view": self.has_view_permission(request), } def _get_form_for_get_fields(self, request, obj): @@ -672,8 +784,8 @@ def get_form(self, request, obj=None, change=False, **kwargs): Return a Form class for use in the admin add view. This is used by add_view and change_view. """ - if 'fields' in kwargs: - fields = kwargs.pop('fields') + if "fields" in kwargs: + fields = kwargs.pop("fields") else: fields = flatten_fieldsets(self.get_fieldsets(request, obj)) excluded = self.get_exclude(request, obj) @@ -682,9 +794,13 @@ def get_form(self, request, obj=None, change=False, **kwargs): exclude.extend(readonly_fields) # Exclude all fields if it's a change form and the user doesn't have # the change permission. - if change and hasattr(request, 'user') and not self.has_change_permission(request, obj): + if ( + change + and hasattr(request, "user") + and not self.has_change_permission(request, obj) + ): exclude.extend(fields) - if excluded is None and hasattr(self.form, '_meta') and self.form._meta.exclude: + if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: # Take the custom ModelForm's Meta.exclude into account only if the # ModelAdmin doesn't define its own. exclude.extend(self.form._meta.exclude) @@ -693,25 +809,29 @@ def get_form(self, request, obj=None, change=False, **kwargs): exclude = exclude or None # Remove declared form fields which are in readonly_fields. - new_attrs = dict.fromkeys(f for f in readonly_fields if f in self.form.declared_fields) + new_attrs = dict.fromkeys( + f for f in readonly_fields if f in self.form.declared_fields + ) form = type(self.form.__name__, (self.form,), new_attrs) defaults = { - 'form': form, - 'fields': fields, - 'exclude': exclude, - 'formfield_callback': partial(self.formfield_for_dbfield, request=request), + "form": form, + "fields": fields, + "exclude": exclude, + "formfield_callback": partial(self.formfield_for_dbfield, request=request), **kwargs, } - if defaults['fields'] is None and not modelform_defines_fields(defaults['form']): - defaults['fields'] = forms.ALL_FIELDS + if defaults["fields"] is None and not modelform_defines_fields( + defaults["form"] + ): + defaults["fields"] = forms.ALL_FIELDS try: return modelform_factory(self.model, **defaults) except FieldError as e: raise FieldError( - '%s. Check fields/fieldsets/exclude attributes of class %s.' + "%s. Check fields/fieldsets/exclude attributes of class %s." % (e, self.__class__.__name__) ) @@ -720,6 +840,7 @@ def get_changelist(self, request, **kwargs): Return the ChangeList class for use on the changelist page. """ from django.contrib.admin.views.main import ChangeList + return ChangeList def get_changelist_instance(self, request): @@ -731,7 +852,7 @@ def get_changelist_instance(self, request): list_display_links = self.get_list_display_links(request, list_display) # Add the action checkboxes if any actions are available. if self.get_actions(request): - list_display = ['action_checkbox', *list_display] + list_display = ["action_checkbox", *list_display] sortable_by = self.get_sortable_by(request) ChangeList = self.get_changelist(request) return ChangeList( @@ -748,6 +869,7 @@ def get_changelist_instance(self, request): self.list_editable, self, sortable_by, + self.search_help_text, ) def get_object(self, request, object_id, from_field=None): @@ -758,7 +880,9 @@ def get_object(self, request, object_id, from_field=None): """ queryset = self.get_queryset(request) model = queryset.model - field = model._meta.pk if from_field is None else model._meta.get_field(from_field) + field = ( + model._meta.pk if from_field is None else model._meta.get_field(from_field) + ) try: object_id = field.to_python(object_id) return queryset.get(**{field.name: object_id}) @@ -770,11 +894,13 @@ def get_changelist_form(self, request, **kwargs): Return a Form class for use in the Formset on the changelist page. """ defaults = { - 'formfield_callback': partial(self.formfield_for_dbfield, request=request), + "formfield_callback": partial(self.formfield_for_dbfield, request=request), **kwargs, } - if defaults.get('fields') is None and not modelform_defines_fields(defaults.get('form')): - defaults['fields'] = forms.ALL_FIELDS + if defaults.get("fields") is None and not modelform_defines_fields( + defaults.get("form") + ): + defaults["fields"] = forms.ALL_FIELDS return modelform_factory(self.model, **defaults) @@ -784,12 +910,15 @@ def get_changelist_formset(self, request, **kwargs): is used. """ defaults = { - 'formfield_callback': partial(self.formfield_for_dbfield, request=request), + "formfield_callback": partial(self.formfield_for_dbfield, request=request), **kwargs, } return modelformset_factory( - self.model, self.get_changelist_form(request), extra=0, - fields=self.list_editable, **defaults + self.model, + self.get_changelist_form(request), + extra=0, + fields=self.list_editable, + **defaults, ) def get_formsets_with_inlines(self, request, obj=None): @@ -799,54 +928,55 @@ def get_formsets_with_inlines(self, request, obj=None): for inline in self.get_inline_instances(request, obj): yield inline.get_formset(request, obj), inline - def get_paginator(self, request, queryset, per_page, orphans=0, allow_empty_first_page=True): + def get_paginator( + self, request, queryset, per_page, orphans=0, allow_empty_first_page=True + ): return self.paginator(queryset, per_page, orphans, allow_empty_first_page) - def log_addition(self, request, object, message): + def log_addition(self, request, obj, message): """ Log that an object has been successfully added. The default implementation creates an admin LogEntry object. """ - from django.contrib.admin.models import LogEntry, ADDITION - return LogEntry.objects.log_action( + from django.contrib.admin.models import ADDITION, LogEntry + + return LogEntry.objects.log_actions( user_id=request.user.pk, - content_type_id=get_content_type_for_model(object).pk, - object_id=object.pk, - object_repr=str(object), + queryset=[obj], action_flag=ADDITION, change_message=message, + single_object=True, ) - def log_change(self, request, object, message): + def log_change(self, request, obj, message): """ Log that an object has been successfully changed. The default implementation creates an admin LogEntry object. """ - from django.contrib.admin.models import LogEntry, CHANGE - return LogEntry.objects.log_action( + from django.contrib.admin.models import CHANGE, LogEntry + + return LogEntry.objects.log_actions( user_id=request.user.pk, - content_type_id=get_content_type_for_model(object).pk, - object_id=object.pk, - object_repr=str(object), + queryset=[obj], action_flag=CHANGE, change_message=message, + single_object=True, ) - def log_deletion(self, request, object, object_repr): + def log_deletions(self, request, queryset): """ - Log that an object will be deleted. Note that this method must be - called before the deletion. + Log that objects will be deleted. Note that this method must be called + before the deletion. - The default implementation creates an admin LogEntry object. + The default implementation creates admin LogEntry objects. """ - from django.contrib.admin.models import LogEntry, DELETION - return LogEntry.objects.log_action( + from django.contrib.admin.models import DELETION, LogEntry + + return LogEntry.objects.log_actions( user_id=request.user.pk, - content_type_id=get_content_type_for_model(object).pk, - object_id=object.pk, - object_repr=object_repr, + queryset=queryset, action_flag=DELETION, ) @@ -854,8 +984,21 @@ def action_checkbox(self, obj): """ A list_display column containing a checkbox widget. """ - return helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk)) - action_checkbox.short_description = mark_safe('') + attrs = { + "class": "action-select", + "aria-label": format_html( + _("Select this object for an action - {}"), str(obj) + ), + } + checkbox = forms.CheckboxInput(attrs, lambda value: False) + return checkbox.render(helpers.ACTION_CHECKBOX_NAME, str(obj.pk)) + + @staticmethod + def _get_action_description(func, name): + try: + return func.short_description + except AttributeError: + return capfirst(name.replace("_", " ")) def _get_base_actions(self): """Return the list of actions, prior to any request-based filtering.""" @@ -866,10 +1009,10 @@ def _get_base_actions(self): base_action_names = {name for _, name, _ in base_actions} # Gather actions from the admin site first - for (name, func) in self.admin_site.actions: + for name, func in self.admin_site.actions: if name in base_action_names: continue - description = getattr(func, 'short_description', name.replace('_', ' ')) + description = self._get_action_description(func, name) actions.append((func, name, description)) # Add actions from this ModelAdmin. actions.extend(base_actions) @@ -880,11 +1023,11 @@ def _filter_actions_by_permissions(self, request, actions): filtered_actions = [] for action in actions: callable = action[0] - if not hasattr(callable, 'allowed_permissions'): + if not hasattr(callable, "allowed_permissions"): filtered_actions.append(action) continue permission_checks = ( - getattr(self, 'has_%s_permission' % permission) + getattr(self, "has_%s_permission" % permission) for permission in callable.allowed_permissions ) if any(has_permission(request) for has_permission in permission_checks): @@ -938,10 +1081,7 @@ def get_action(self, action): except KeyError: return None - if hasattr(func, 'short_description'): - description = func.short_description - else: - description = capfirst(action.replace('_', ' ')) + description = self._get_action_description(func, action) return func, action, description def get_list_display(self, request): @@ -957,7 +1097,11 @@ def get_list_display_links(self, request, list_display): on the changelist. The list_display parameter is the list of fields returned by get_list_display(). """ - if self.list_display_links or self.list_display_links is None or not list_display: + if ( + self.list_display_links + or self.list_display_links is None + or not list_display + ): return self.list_display_links else: # Use only the first item in list_display as link @@ -989,50 +1133,77 @@ def get_search_results(self, request, queryset, search_term): Return a tuple containing a queryset to implement the search and a boolean indicating if the results may contain duplicates. """ + # Apply keyword searches. def construct_search(field_name): - if field_name.startswith('^'): - return "%s__istartswith" % field_name[1:] - elif field_name.startswith('='): - return "%s__iexact" % field_name[1:] - elif field_name.startswith('@'): - return "%s__search" % field_name[1:] + if field_name.startswith("^"): + return "%s__istartswith" % field_name.removeprefix("^"), None + elif field_name.startswith("="): + return "%s__iexact" % field_name.removeprefix("="), None + elif field_name.startswith("@"): + return "%s__search" % field_name.removeprefix("@"), None # Use field_name if it includes a lookup. opts = queryset.model._meta lookup_fields = field_name.split(LOOKUP_SEP) # Go through the fields, following all relations. prev_field = None - for path_part in lookup_fields: - if path_part == 'pk': + for i, path_part in enumerate(lookup_fields): + if path_part == "pk": path_part = opts.pk.name try: field = opts.get_field(path_part) except FieldDoesNotExist: # Use valid query lookups. if prev_field and prev_field.get_lookup(path_part): - return field_name + if path_part == "exact" and not isinstance( + prev_field, (models.CharField, models.TextField) + ): + field_name_without_exact = "__".join(lookup_fields[:i]) + alias = Cast( + field_name_without_exact, + output_field=models.CharField(), + ) + alias_name = "_".join(lookup_fields[:i]) + return f"{alias_name}_str", alias + else: + return field_name, None else: prev_field = field - if hasattr(field, 'get_path_info'): + if hasattr(field, "path_infos"): # Update opts to follow the relation. - opts = field.get_path_info()[-1].to_opts + opts = field.path_infos[-1].to_opts # Otherwise, use the field with icontains. - return "%s__icontains" % field_name + return "%s__icontains" % field_name, None - use_distinct = False + may_have_duplicates = False search_fields = self.get_search_fields(request) if search_fields and search_term: - orm_lookups = [construct_search(str(search_field)) - for search_field in search_fields] + str_aliases = {} + orm_lookups = [] + for field in search_fields: + lookup, str_alias = construct_search(str(field)) + orm_lookups.append(lookup) + if str_alias: + str_aliases[lookup] = str_alias + + if str_aliases: + queryset = queryset.alias(**str_aliases) + + term_queries = [] for bit in smart_split(search_term): - if bit.startswith(('"', "'")): + if bit.startswith(('"', "'")) and bit[0] == bit[-1]: bit = unescape_string_literal(bit) - or_queries = [models.Q(**{orm_lookup: bit}) - for orm_lookup in orm_lookups] - queryset = queryset.filter(reduce(operator.or_, or_queries)) - use_distinct |= any(lookup_needs_distinct(self.opts, search_spec) for search_spec in orm_lookups) - - return queryset, use_distinct + or_queries = models.Q.create( + [(orm_lookup, bit) for orm_lookup in orm_lookups], + connector=models.Q.OR, + ) + term_queries.append(or_queries) + queryset = queryset.filter(models.Q.create(term_queries)) + may_have_duplicates |= any( + lookup_spawns_duplicates(self.opts, search_spec) + for search_spec in orm_lookups + ) + return queryset, may_have_duplicates def get_preserved_filters(self, request): """ @@ -1040,17 +1211,19 @@ def get_preserved_filters(self, request): """ match = request.resolver_match if self.preserve_filters and match: - opts = self.model._meta - current_url = '%s:%s' % (match.app_name, match.url_name) - changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name) + current_url = "%s:%s" % (match.app_name, match.url_name) + changelist_url = "admin:%s_%s_changelist" % ( + self.opts.app_label, + self.opts.model_name, + ) if current_url == changelist_url: preserved_filters = request.GET.urlencode() else: - preserved_filters = request.GET.get('_changelist_filters') + preserved_filters = request.GET.get("_changelist_filters") if preserved_filters: - return urlencode({'_changelist_filters': preserved_filters}) - return '' + return urlencode({"_changelist_filters": preserved_filters}) + return "" def construct_change_message(self, request, form, formsets, add=False): """ @@ -1058,8 +1231,9 @@ def construct_change_message(self, request, form, formsets, add=False): """ return construct_change_message(form, formsets, add) - def message_user(self, request, message, level=messages.INFO, extra_tags='', - fail_silently=False): + def message_user( + self, request, message, level=messages.INFO, extra_tags="", fail_silently=False + ): """ Send a message to the user. The default implementation posts a message using the django.contrib.messages backend. @@ -1075,13 +1249,15 @@ def message_user(self, request, message, level=messages.INFO, extra_tags='', level = getattr(messages.constants, level.upper()) except AttributeError: levels = messages.constants.DEFAULT_TAGS.values() - levels_repr = ', '.join('`%s`' % level for level in levels) + levels_repr = ", ".join("`%s`" % level for level in levels) raise ValueError( - 'Bad message level string: `%s`. Possible values are: %s' + "Bad message level string: `%s`. Possible values are: %s" % (level, levels_repr) ) - messages.add_message(request, level, message, extra_tags=extra_tags, fail_silently=fail_silently) + messages.add_message( + request, level, message, extra_tags=extra_tags, fail_silently=fail_silently + ) def save_form(self, request, form, change): """ @@ -1124,40 +1300,52 @@ def save_related(self, request, form, formsets, change): for formset in formsets: self.save_formset(request, form, formset, change=change) - def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): - opts = self.model._meta - app_label = opts.app_label + def render_change_form( + self, request, context, add=False, change=False, form_url="", obj=None + ): + app_label = self.opts.app_label preserved_filters = self.get_preserved_filters(request) - form_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, form_url) + form_url = add_preserved_filters( + {"preserved_filters": preserved_filters, "opts": self.opts}, form_url + ) view_on_site_url = self.get_view_on_site_url(obj) has_editable_inline_admin_formsets = False - for inline in context['inline_admin_formsets']: - if inline.has_add_permission or inline.has_change_permission or inline.has_delete_permission: + for inline in context["inline_admin_formsets"]: + if ( + inline.has_add_permission + or inline.has_change_permission + or inline.has_delete_permission + ): has_editable_inline_admin_formsets = True break - context.update({ - 'add': add, - 'change': change, - 'has_view_permission': self.has_view_permission(request, obj), - 'has_add_permission': self.has_add_permission(request), - 'has_change_permission': self.has_change_permission(request, obj), - 'has_delete_permission': self.has_delete_permission(request, obj), - 'has_editable_inline_admin_formsets': has_editable_inline_admin_formsets, - 'has_file_field': context['adminform'].form.is_multipart() or any( - admin_formset.formset.is_multipart() - for admin_formset in context['inline_admin_formsets'] - ), - 'has_absolute_url': view_on_site_url is not None, - 'absolute_url': view_on_site_url, - 'form_url': form_url, - 'opts': opts, - 'content_type_id': get_content_type_for_model(self.model).pk, - 'save_as': self.save_as, - 'save_on_top': self.save_on_top, - 'to_field_var': TO_FIELD_VAR, - 'is_popup_var': IS_POPUP_VAR, - 'app_label': app_label, - }) + context.update( + { + "add": add, + "change": change, + "has_view_permission": self.has_view_permission(request, obj), + "has_add_permission": self.has_add_permission(request), + "has_change_permission": self.has_change_permission(request, obj), + "has_delete_permission": self.has_delete_permission(request, obj), + "has_editable_inline_admin_formsets": ( + has_editable_inline_admin_formsets + ), + "has_file_field": context["adminform"].form.is_multipart() + or any( + admin_formset.formset.is_multipart() + for admin_formset in context["inline_admin_formsets"] + ), + "has_absolute_url": view_on_site_url is not None, + "absolute_url": view_on_site_url, + "form_url": form_url, + "opts": self.opts, + "content_type_id": get_content_type_for_model(self.model).pk, + "save_as": self.save_as, + "save_on_top": self.save_on_top, + "to_field_var": TO_FIELD_VAR, + "is_popup_var": IS_POPUP_VAR, + "app_label": app_label, + } + ) if add and self.add_form_template is not None: form_template = self.add_form_template else: @@ -1165,11 +1353,20 @@ def render_change_form(self, request, context, add=False, change=False, form_url request.current_app = self.admin_site.name - return TemplateResponse(request, form_template or [ - "admin/%s/%s/change_form.html" % (app_label, opts.model_name), - "admin/%s/change_form.html" % app_label, - "admin/change_form.html" - ], context) + return TemplateResponse( + request, + form_template + or [ + "admin/%s/%s/change_form.html" % (app_label, self.opts.model_name), + "admin/%s/change_form.html" % app_label, + "admin/change_form.html", + ], + context, + ) + + def _get_preserved_qsl(self, request, preserved_filters): + query_string = urlsplit(request.build_absolute_uri()).query + return parse_qsl(query_string.replace(preserved_filters, "")) def response_add(self, request, obj, post_url_continue=None): """ @@ -1177,8 +1374,9 @@ def response_add(self, request, obj, post_url_continue=None): """ opts = obj._meta preserved_filters = self.get_preserved_filters(request) + preserved_qsl = self._get_preserved_qsl(request, preserved_filters) obj_url = reverse( - 'admin:%s_%s_change' % (opts.app_label, opts.model_name), + "admin:%s_%s_change" % (opts.app_label, opts.model_name), args=(quote(obj.pk),), current_app=self.admin_site.name, ) @@ -1188,8 +1386,8 @@ def response_add(self, request, obj, post_url_continue=None): else: obj_repr = str(obj) msg_dict = { - 'name': opts.verbose_name, - 'obj': obj_repr, + "name": opts.verbose_name, + "obj": obj_repr, } # Here, we distinguish between different save types by checking for # the presence of keys in request.POST. @@ -1201,49 +1399,71 @@ def response_add(self, request, obj, post_url_continue=None): else: attr = obj._meta.pk.attname value = obj.serializable_value(attr) - popup_response_data = json.dumps({ - 'value': str(value), - 'obj': str(obj), - }) - return TemplateResponse(request, self.popup_response_template or [ - 'admin/%s/%s/popup_response.html' % (opts.app_label, opts.model_name), - 'admin/%s/popup_response.html' % opts.app_label, - 'admin/popup_response.html', - ], { - 'popup_response_data': popup_response_data, - }) + popup_response_data = json.dumps( + { + "value": str(value), + "obj": str(obj), + } + ) + return TemplateResponse( + request, + self.popup_response_template + or [ + "admin/%s/%s/popup_response.html" + % (opts.app_label, opts.model_name), + "admin/%s/popup_response.html" % opts.app_label, + "admin/popup_response.html", + ], + { + "popup_response_data": popup_response_data, + }, + ) elif "_continue" in request.POST or ( - # Redirecting after "Save as new". - "_saveasnew" in request.POST and self.save_as_continue and - self.has_change_permission(request, obj) + # Redirecting after "Save as new". + "_saveasnew" in request.POST + and self.save_as_continue + and self.has_change_permission(request, obj) ): - msg = _('The {name} “{obj}” was added successfully.') + msg = _("The {name} “{obj}” was added successfully.") if self.has_change_permission(request, obj): - msg += ' ' + _('You may edit it again below.') + msg += " " + _("You may edit it again below.") self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS) if post_url_continue is None: post_url_continue = obj_url post_url_continue = add_preserved_filters( - {'preserved_filters': preserved_filters, 'opts': opts}, - post_url_continue + { + "preserved_filters": preserved_filters, + "preserved_qsl": preserved_qsl, + "opts": opts, + }, + post_url_continue, ) return HttpResponseRedirect(post_url_continue) elif "_addanother" in request.POST: msg = format_html( - _('The {name} “{obj}” was added successfully. You may add another {name} below.'), - **msg_dict + _( + "The {name} “{obj}” was added successfully. You may add another " + "{name} below." + ), + **msg_dict, ) self.message_user(request, msg, messages.SUCCESS) redirect_url = request.path - redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) + redirect_url = add_preserved_filters( + { + "preserved_filters": preserved_filters, + "preserved_qsl": preserved_qsl, + "opts": opts, + }, + redirect_url, + ) return HttpResponseRedirect(redirect_url) else: msg = format_html( - _('The {name} “{obj}” was added successfully.'), - **msg_dict + _("The {name} “{obj}” was added successfully."), **msg_dict ) self.message_user(request, msg, messages.SUCCESS) return self.response_post_save_add(request, obj) @@ -1257,83 +1477,100 @@ def response_change(self, request, obj): opts = obj._meta to_field = request.POST.get(TO_FIELD_VAR) attr = str(to_field) if to_field else opts.pk.attname - value = request.resolver_match.kwargs['object_id'] + value = request.resolver_match.kwargs["object_id"] new_value = obj.serializable_value(attr) - popup_response_data = json.dumps({ - 'action': 'change', - 'value': str(value), - 'obj': str(obj), - 'new_value': str(new_value), - }) - return TemplateResponse(request, self.popup_response_template or [ - 'admin/%s/%s/popup_response.html' % (opts.app_label, opts.model_name), - 'admin/%s/popup_response.html' % opts.app_label, - 'admin/popup_response.html', - ], { - 'popup_response_data': popup_response_data, - }) - - opts = self.model._meta + popup_response_data = json.dumps( + { + "action": "change", + "value": str(value), + "obj": str(obj), + "new_value": str(new_value), + } + ) + return TemplateResponse( + request, + self.popup_response_template + or [ + "admin/%s/%s/popup_response.html" + % (opts.app_label, opts.model_name), + "admin/%s/popup_response.html" % opts.app_label, + "admin/popup_response.html", + ], + { + "popup_response_data": popup_response_data, + }, + ) + + opts = self.opts preserved_filters = self.get_preserved_filters(request) + preserved_qsl = self._get_preserved_qsl(request, preserved_filters) msg_dict = { - 'name': opts.verbose_name, - 'obj': format_html('{}', urlquote(request.path), obj), + "name": opts.verbose_name, + "obj": format_html('{}', urlquote(request.path), obj), } if "_continue" in request.POST: msg = format_html( - _('The {name} “{obj}” was changed successfully. You may edit it again below.'), - **msg_dict + _( + "The {name} “{obj}” was changed successfully. You may edit it " + "again below." + ), + **msg_dict, ) self.message_user(request, msg, messages.SUCCESS) redirect_url = request.path - redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) - return HttpResponseRedirect(redirect_url) - - elif "_saveasnew" in request.POST: - msg = format_html( - _('The {name} “{obj}” was added successfully. You may edit it again below.'), - **msg_dict + redirect_url = add_preserved_filters( + { + "preserved_filters": preserved_filters, + "preserved_qsl": preserved_qsl, + "opts": opts, + }, + redirect_url, ) - self.message_user(request, msg, messages.SUCCESS) - redirect_url = reverse('admin:%s_%s_change' % - (opts.app_label, opts.model_name), - args=(obj.pk,), - current_app=self.admin_site.name) - redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) return HttpResponseRedirect(redirect_url) elif "_addanother" in request.POST: msg = format_html( - _('The {name} “{obj}” was changed successfully. You may add another {name} below.'), - **msg_dict + _( + "The {name} “{obj}” was changed successfully. You may add another " + "{name} below." + ), + **msg_dict, ) self.message_user(request, msg, messages.SUCCESS) - redirect_url = reverse('admin:%s_%s_add' % - (opts.app_label, opts.model_name), - current_app=self.admin_site.name) - redirect_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, redirect_url) + redirect_url = reverse( + "admin:%s_%s_add" % (opts.app_label, opts.model_name), + current_app=self.admin_site.name, + ) + redirect_url = add_preserved_filters( + { + "preserved_filters": preserved_filters, + "preserved_qsl": preserved_qsl, + "opts": opts, + }, + redirect_url, + ) return HttpResponseRedirect(redirect_url) else: msg = format_html( - _('The {name} “{obj}” was changed successfully.'), - **msg_dict + _("The {name} “{obj}” was changed successfully."), **msg_dict ) self.message_user(request, msg, messages.SUCCESS) return self.response_post_save_change(request, obj) def _response_post_save(self, request, obj): - opts = self.model._meta if self.has_view_or_change_permission(request): - post_url = reverse('admin:%s_%s_changelist' % - (opts.app_label, opts.model_name), - current_app=self.admin_site.name) + post_url = reverse( + "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), + current_app=self.admin_site.name, + ) preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, post_url) + post_url = add_preserved_filters( + {"preserved_filters": preserved_filters, "opts": self.opts}, post_url + ) else: - post_url = reverse('admin:index', - current_app=self.admin_site.name) + post_url = reverse("admin:index", current_app=self.admin_site.name) return HttpResponseRedirect(post_url) def response_post_save_add(self, request, obj): @@ -1361,7 +1598,7 @@ def response_action(self, request, queryset): # and bottom of the change list, for example). Get the action # whose button was pushed. try: - action_index = int(request.POST.get('index', 0)) + action_index = int(request.POST.get("index", 0)) except ValueError: action_index = 0 @@ -1372,7 +1609,7 @@ def response_action(self, request, queryset): # Use the action whose button was pushed try: - data.update({'action': data.getlist('action')[action_index]}) + data.update({"action": data.getlist("action")[action_index]}) except IndexError: # If we didn't get an action from the chosen form that's invalid # POST data, so by deleting action it'll fail the validation check @@ -1380,12 +1617,12 @@ def response_action(self, request, queryset): pass action_form = self.action_form(data, auto_id=None) - action_form.fields['action'].choices = self.get_action_choices(request) + action_form.fields["action"].choices = self.get_action_choices(request) # If the form's valid we can handle the action. if action_form.is_valid(): - action = action_form.cleaned_data['action'] - select_across = action_form.cleaned_data['select_across'] + action = action_form.cleaned_data["action"] + select_across = action_form.cleaned_data["select_across"] func = self.get_actions(request)[action][0] # Get the list of selected PKs. If nothing's selected, we can't @@ -1394,8 +1631,10 @@ def response_action(self, request, queryset): selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) if not selected and not select_across: # Reminder that something needs to be selected or nothing will happen - msg = _("Items must be selected in order to perform " - "actions on them. No items have been changed.") + msg = _( + "Items must be selected in order to perform " + "actions on them. No items have been changed." + ) self.message_user(request, msg, messages.WARNING) return None @@ -1421,46 +1660,52 @@ def response_delete(self, request, obj_display, obj_id): """ Determine the HttpResponse for the delete_view stage. """ - opts = self.model._meta - if IS_POPUP_VAR in request.POST: - popup_response_data = json.dumps({ - 'action': 'delete', - 'value': str(obj_id), - }) - return TemplateResponse(request, self.popup_response_template or [ - 'admin/%s/%s/popup_response.html' % (opts.app_label, opts.model_name), - 'admin/%s/popup_response.html' % opts.app_label, - 'admin/popup_response.html', - ], { - 'popup_response_data': popup_response_data, - }) + popup_response_data = json.dumps( + { + "action": "delete", + "value": str(obj_id), + } + ) + return TemplateResponse( + request, + self.popup_response_template + or [ + "admin/%s/%s/popup_response.html" + % (self.opts.app_label, self.opts.model_name), + "admin/%s/popup_response.html" % self.opts.app_label, + "admin/popup_response.html", + ], + { + "popup_response_data": popup_response_data, + }, + ) self.message_user( request, - _('The %(name)s “%(obj)s” was deleted successfully.') % { - 'name': opts.verbose_name, - 'obj': obj_display, + _("The %(name)s “%(obj)s” was deleted successfully.") + % { + "name": self.opts.verbose_name, + "obj": obj_display, }, messages.SUCCESS, ) if self.has_change_permission(request, None): post_url = reverse( - 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name), + "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name), current_app=self.admin_site.name, ) preserved_filters = self.get_preserved_filters(request) post_url = add_preserved_filters( - {'preserved_filters': preserved_filters, 'opts': opts}, post_url + {"preserved_filters": preserved_filters, "opts": self.opts}, post_url ) else: - post_url = reverse('admin:index', current_app=self.admin_site.name) + post_url = reverse("admin:index", current_app=self.admin_site.name) return HttpResponseRedirect(post_url) def render_delete_form(self, request, context): - opts = self.model._meta - app_label = opts.app_label + app_label = self.opts.app_label request.current_app = self.admin_site.name context.update( @@ -1471,8 +1716,11 @@ def render_delete_form(self, request, context): return TemplateResponse( request, - self.delete_confirmation_template or [ - "admin/{}/{}/delete_confirmation.html".format(app_label, opts.model_name), + self.delete_confirmation_template + or [ + "admin/{}/{}/delete_confirmation.html".format( + app_label, self.opts.model_name + ), "admin/{}/delete_confirmation.html".format(app_label), "admin/delete_confirmation.html", ], @@ -1481,7 +1729,11 @@ def render_delete_form(self, request, context): def get_inline_formsets(self, request, formsets, inline_instances, obj=None): # Edit permissions on parent model are required for editable inlines. - can_edit_parent = self.has_change_permission(request, obj) if obj else self.has_add_permission(request) + can_edit_parent = ( + self.has_change_permission(request, obj) + if obj + else self.has_add_permission(request) + ) inline_admin_formsets = [] for inline, formset in zip(inline_instances, formsets): fieldsets = list(inline.get_fieldsets(request, obj)) @@ -1491,15 +1743,24 @@ def get_inline_formsets(self, request, formsets, inline_instances, obj=None): has_change_permission = inline.has_change_permission(request, obj) has_delete_permission = inline.has_delete_permission(request, obj) else: - # Disable all edit-permissions, and overide formset settings. - has_add_permission = has_change_permission = has_delete_permission = False + # Disable all edit-permissions, and override formset settings. + has_add_permission = has_change_permission = has_delete_permission = ( + False + ) formset.extra = formset.max_num = 0 has_view_permission = inline.has_view_permission(request, obj) prepopulated = dict(inline.get_prepopulated_fields(request, obj)) inline_admin_formset = helpers.InlineAdminFormSet( - inline, formset, fieldsets, prepopulated, readonly, model_admin=self, - has_add_permission=has_add_permission, has_change_permission=has_change_permission, - has_delete_permission=has_delete_permission, has_view_permission=has_view_permission, + inline, + formset, + fieldsets, + prepopulated, + readonly, + model_admin=self, + has_add_permission=has_add_permission, + has_change_permission=has_change_permission, + has_delete_permission=has_delete_permission, + has_view_permission=has_view_permission, ) inline_admin_formsets.append(inline_admin_formset) return inline_admin_formsets @@ -1511,7 +1772,7 @@ def get_changeform_initial_data(self, request): initial = dict(request.GET.items()) for k in initial: try: - f = self.model._meta.get_field(k) + f = self.opts.get_field(k) except FieldDoesNotExist: continue # We have to special-case M2Ms as a list of comma-separated PKs. @@ -1524,28 +1785,30 @@ def _get_obj_does_not_exist_redirect(self, request, opts, object_id): Create a message informing the user that the object doesn't exist and return a redirect to the admin index page. """ - msg = _('%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?') % { - 'name': opts.verbose_name, - 'key': unquote(object_id), + msg = _("%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?") % { + "name": opts.verbose_name, + "key": unquote(object_id), } self.message_user(request, msg, messages.WARNING) - url = reverse('admin:index', current_app=self.admin_site.name) + url = reverse("admin:index", current_app=self.admin_site.name) return HttpResponseRedirect(url) @csrf_protect_m - def changeform_view(self, request, object_id=None, form_url='', extra_context=None): + def changeform_view(self, request, object_id=None, form_url="", extra_context=None): + if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): + return self._changeform_view(request, object_id, form_url, extra_context) + with transaction.atomic(using=router.db_for_write(self.model)): return self._changeform_view(request, object_id, form_url, extra_context) def _changeform_view(self, request, object_id, form_url, extra_context): to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field) - - model = self.model - opts = model._meta + raise DisallowedModelAdminToField( + "The field %s cannot be referenced." % to_field + ) - if request.method == 'POST' and '_saveasnew' in request.POST: + if request.method == "POST" and "_saveasnew" in request.POST: object_id = None add = object_id is None @@ -1558,7 +1821,7 @@ def _changeform_view(self, request, object_id, form_url, extra_context): else: obj = self.get_object(request, unquote(object_id), to_field) - if request.method == 'POST': + if request.method == "POST": if not self.has_change_permission(request, obj): raise PermissionDenied else: @@ -1566,24 +1829,32 @@ def _changeform_view(self, request, object_id, form_url, extra_context): raise PermissionDenied if obj is None: - return self._get_obj_does_not_exist_redirect(request, opts, object_id) + return self._get_obj_does_not_exist_redirect( + request, self.opts, object_id + ) fieldsets = self.get_fieldsets(request, obj) ModelForm = self.get_form( request, obj, change=not add, fields=flatten_fieldsets(fieldsets) ) - if request.method == 'POST': + if request.method == "POST": form = ModelForm(request.POST, request.FILES, instance=obj) + formsets, inline_instances = self._create_formsets( + request, + form.instance, + change=not add, + ) form_validated = form.is_valid() if form_validated: new_object = self.save_form(request, form, change=not add) else: new_object = form.instance - formsets, inline_instances = self._create_formsets(request, new_object, change=not add) if all_valid(formsets) and form_validated: self.save_model(request, new_object, form, not add) self.save_related(request, form, formsets, not add) - change_message = self.construct_change_message(request, form, formsets, add) + change_message = self.construct_change_message( + request, form, formsets, add + ) if add: self.log_addition(request, new_object, change_message) return self.response_add(request, new_object) @@ -1596,73 +1867,88 @@ def _changeform_view(self, request, object_id, form_url, extra_context): if add: initial = self.get_changeform_initial_data(request) form = ModelForm(initial=initial) - formsets, inline_instances = self._create_formsets(request, form.instance, change=False) + formsets, inline_instances = self._create_formsets( + request, form.instance, change=False + ) else: form = ModelForm(instance=obj) - formsets, inline_instances = self._create_formsets(request, obj, change=True) + formsets, inline_instances = self._create_formsets( + request, obj, change=True + ) if not add and not self.has_change_permission(request, obj): readonly_fields = flatten_fieldsets(fieldsets) else: readonly_fields = self.get_readonly_fields(request, obj) - adminForm = helpers.AdminForm( + admin_form = helpers.AdminForm( form, list(fieldsets), # Clear prepopulated fields on a view-only form to avoid a crash. - self.get_prepopulated_fields(request, obj) if add or self.has_change_permission(request, obj) else {}, + ( + self.get_prepopulated_fields(request, obj) + if add or self.has_change_permission(request, obj) + else {} + ), readonly_fields, - model_admin=self) - media = self.media + adminForm.media + model_admin=self, + ) + media = self.media + admin_form.media - inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj) + inline_formsets = self.get_inline_formsets( + request, formsets, inline_instances, obj + ) for inline_formset in inline_formsets: - media = media + inline_formset.media + media += inline_formset.media if add: - title = _('Add %s') + title = _("Add %s") elif self.has_change_permission(request, obj): - title = _('Change %s') + title = _("Change %s") else: - title = _('View %s') + title = _("View %s") context = { **self.admin_site.each_context(request), - 'title': title % opts.verbose_name, - 'adminform': adminForm, - 'object_id': object_id, - 'original': obj, - 'is_popup': IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - 'to_field': to_field, - 'media': media, - 'inline_admin_formsets': inline_formsets, - 'errors': helpers.AdminErrorList(form, formsets), - 'preserved_filters': self.get_preserved_filters(request), + "title": title % self.opts.verbose_name, + "subtitle": str(obj) if obj else None, + "adminform": admin_form, + "object_id": object_id, + "original": obj, + "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, + "to_field": to_field, + "media": media, + "inline_admin_formsets": inline_formsets, + "errors": helpers.AdminErrorList(form, formsets), + "preserved_filters": self.get_preserved_filters(request), } # Hide the "Save" and "Save and continue" buttons if "Save as New" was # previously chosen to prevent the interface from getting confusing. - if request.method == 'POST' and not form_validated and "_saveasnew" in request.POST: - context['show_save'] = False - context['show_save_and_continue'] = False + if ( + request.method == "POST" + and not form_validated + and "_saveasnew" in request.POST + ): + context["show_save"] = False + context["show_save_and_continue"] = False # Use the change template instead of the add template. add = False context.update(extra_context or {}) - return self.render_change_form(request, context, add=add, change=not add, obj=obj, form_url=form_url) - - def autocomplete_view(self, request): - return AutocompleteJsonView.as_view(model_admin=self)(request) + return self.render_change_form( + request, context, add=add, change=not add, obj=obj, form_url=form_url + ) - def add_view(self, request, form_url='', extra_context=None): + def add_view(self, request, form_url="", extra_context=None): return self.changeform_view(request, None, form_url, extra_context) - def change_view(self, request, object_id, form_url='', extra_context=None): + def change_view(self, request, object_id, form_url="", extra_context=None): return self.changeform_view(request, object_id, form_url, extra_context) def _get_edited_object_pks(self, request, prefix): """Return POST data values of list_editable primary keys.""" pk_pattern = re.compile( - r'{}-\d+-{}$'.format(re.escape(prefix), self.model._meta.pk.name) + r"{}-\d+-{}$".format(re.escape(prefix), self.opts.pk.name) ) return [value for key, value in request.POST.items() if pk_pattern.match(key)] @@ -1688,8 +1974,8 @@ def changelist_view(self, request, extra_context=None): The 'change list' admin view for this model. """ from django.contrib.admin.views.main import ERROR_FLAG - opts = self.model._meta - app_label = opts.app_label + + app_label = self.opts.app_label if not self.has_view_or_change_permission(request): raise PermissionDenied @@ -1703,10 +1989,13 @@ def changelist_view(self, request, extra_context=None): # something is screwed up with the database, so display an error # page. if ERROR_FLAG in request.GET: - return SimpleTemplateResponse('admin/invalid_setup.html', { - 'title': _('Database error'), - }) - return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1') + return SimpleTemplateResponse( + "admin/invalid_setup.html", + { + "title": _("Database error"), + }, + ) + return HttpResponseRedirect(request.path + "?" + ERROR_FLAG + "=1") # If the request was POSTed, this might be a bulk action or a bulk # edit. Try to look up an action or confirmation first, but if this @@ -1717,26 +2006,40 @@ def changelist_view(self, request, extra_context=None): actions = self.get_actions(request) # Actions with no confirmation - if (actions and request.method == 'POST' and - 'index' in request.POST and '_save' not in request.POST): + if ( + actions + and request.method == "POST" + and "index" in request.POST + and "_save" not in request.POST + ): if selected: - response = self.response_action(request, queryset=cl.get_queryset(request)) + response = self.response_action( + request, queryset=cl.get_queryset(request) + ) if response: return response else: action_failed = True else: - msg = _("Items must be selected in order to perform " - "actions on them. No items have been changed.") + msg = _( + "Items must be selected in order to perform " + "actions on them. No items have been changed." + ) self.message_user(request, msg, messages.WARNING) action_failed = True # Actions with confirmation - if (actions and request.method == 'POST' and - helpers.ACTION_CHECKBOX_NAME in request.POST and - 'index' not in request.POST and '_save' not in request.POST): + if ( + actions + and request.method == "POST" + and helpers.ACTION_CHECKBOX_NAME in request.POST + and "index" not in request.POST + and "_save" not in request.POST + ): if selected: - response = self.response_action(request, queryset=cl.get_queryset(request)) + response = self.response_action( + request, queryset=cl.get_queryset(request) + ) if response: return response else: @@ -1754,31 +2057,37 @@ def changelist_view(self, request, extra_context=None): formset = cl.formset = None # Handle POSTed bulk-edit data. - if request.method == 'POST' and cl.list_editable and '_save' in request.POST: + if request.method == "POST" and cl.list_editable and "_save" in request.POST: if not self.has_change_permission(request): raise PermissionDenied FormSet = self.get_changelist_formset(request) - modified_objects = self._get_list_editable_queryset(request, FormSet.get_default_prefix()) - formset = cl.formset = FormSet(request.POST, request.FILES, queryset=modified_objects) + modified_objects = self._get_list_editable_queryset( + request, FormSet.get_default_prefix() + ) + formset = cl.formset = FormSet( + request.POST, request.FILES, queryset=modified_objects + ) if formset.is_valid(): changecount = 0 - for form in formset.forms: - if form.has_changed(): - obj = self.save_form(request, form, change=True) - self.save_model(request, obj, form, change=True) - self.save_related(request, form, formsets=[], change=True) - change_msg = self.construct_change_message(request, form, None) - self.log_change(request, obj, change_msg) - changecount += 1 - + with transaction.atomic(using=router.db_for_write(self.model)): + for form in formset.forms: + if form.has_changed(): + obj = self.save_form(request, form, change=True) + self.save_model(request, obj, form, change=True) + self.save_related(request, form, formsets=[], change=True) + change_msg = self.construct_change_message( + request, form, None + ) + self.log_change(request, obj, change_msg) + changecount += 1 if changecount: msg = ngettext( "%(count)s %(name)s was changed successfully.", "%(count)s %(name)s were changed successfully.", - changecount + changecount, ) % { - 'count': changecount, - 'name': model_ngettext(opts, changecount), + "count": changecount, + "name": model_ngettext(self.opts, changecount), } self.message_user(request, msg, messages.SUCCESS) @@ -1798,44 +2107,48 @@ def changelist_view(self, request, extra_context=None): # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) - action_form.fields['action'].choices = self.get_action_choices(request) + action_form.fields["action"].choices = self.get_action_choices(request) media += action_form.media else: action_form = None selection_note_all = ngettext( - '%(total_count)s selected', - 'All %(total_count)s selected', - cl.result_count + "%(total_count)s selected", "All %(total_count)s selected", cl.result_count ) context = { **self.admin_site.each_context(request), - 'module_name': str(opts.verbose_name_plural), - 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)}, - 'selection_note_all': selection_note_all % {'total_count': cl.result_count}, - 'title': cl.title, - 'is_popup': cl.is_popup, - 'to_field': cl.to_field, - 'cl': cl, - 'media': media, - 'has_add_permission': self.has_add_permission(request), - 'opts': cl.opts, - 'action_form': action_form, - 'actions_on_top': self.actions_on_top, - 'actions_on_bottom': self.actions_on_bottom, - 'actions_selection_counter': self.actions_selection_counter, - 'preserved_filters': self.get_preserved_filters(request), + "module_name": str(self.opts.verbose_name_plural), + "selection_note": _("0 of %(cnt)s selected") % {"cnt": len(cl.result_list)}, + "selection_note_all": selection_note_all % {"total_count": cl.result_count}, + "title": cl.title, + "subtitle": None, + "is_popup": cl.is_popup, + "to_field": cl.to_field, + "cl": cl, + "media": media, + "has_add_permission": self.has_add_permission(request), + "opts": cl.opts, + "action_form": action_form, + "actions_on_top": self.actions_on_top, + "actions_on_bottom": self.actions_on_bottom, + "actions_selection_counter": self.actions_selection_counter, + "preserved_filters": self.get_preserved_filters(request), **(extra_context or {}), } request.current_app = self.admin_site.name - return TemplateResponse(request, self.change_list_template or [ - 'admin/%s/%s/change_list.html' % (app_label, opts.model_name), - 'admin/%s/change_list.html' % app_label, - 'admin/change_list.html' - ], context) + return TemplateResponse( + request, + self.change_list_template + or [ + "admin/%s/%s/change_list.html" % (app_label, self.opts.model_name), + "admin/%s/change_list.html" % app_label, + "admin/change_list.html", + ], + context, + ) def get_deleted_objects(self, objs, request): """ @@ -1846,17 +2159,21 @@ def get_deleted_objects(self, objs, request): @csrf_protect_m def delete_view(self, request, object_id, extra_context=None): + if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): + return self._delete_view(request, object_id, extra_context) + with transaction.atomic(using=router.db_for_write(self.model)): return self._delete_view(request, object_id, extra_context) def _delete_view(self, request, object_id, extra_context): "The 'delete' admin view for this model." - opts = self.model._meta - app_label = opts.app_label + app_label = self.opts.app_label to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) if to_field and not self.to_field_allowed(request, to_field): - raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field) + raise DisallowedModelAdminToField( + "The field %s cannot be referenced." % to_field + ) obj = self.get_object(request, unquote(object_id), to_field) @@ -1864,44 +2181,50 @@ def _delete_view(self, request, object_id, extra_context): raise PermissionDenied if obj is None: - return self._get_obj_does_not_exist_redirect(request, opts, object_id) + return self._get_obj_does_not_exist_redirect(request, self.opts, object_id) # Populate deleted_objects, a data structure of all related objects that # will also be deleted. - deleted_objects, model_count, perms_needed, protected = self.get_deleted_objects([obj], request) + ( + deleted_objects, + model_count, + perms_needed, + protected, + ) = self.get_deleted_objects([obj], request) if request.POST and not protected: # The user has confirmed the deletion. if perms_needed: raise PermissionDenied obj_display = str(obj) - attr = str(to_field) if to_field else opts.pk.attname + attr = str(to_field) if to_field else self.opts.pk.attname obj_id = obj.serializable_value(attr) - self.log_deletion(request, obj, obj_display) + self.log_deletions(request, [obj]) self.delete_model(request, obj) return self.response_delete(request, obj_display, obj_id) - object_name = str(opts.verbose_name) + object_name = str(self.opts.verbose_name) if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": object_name} else: - title = _("Are you sure?") + title = _("Delete") context = { **self.admin_site.each_context(request), - 'title': title, - 'object_name': object_name, - 'object': obj, - 'deleted_objects': deleted_objects, - 'model_count': dict(model_count).items(), - 'perms_lacking': perms_needed, - 'protected': protected, - 'opts': opts, - 'app_label': app_label, - 'preserved_filters': self.get_preserved_filters(request), - 'is_popup': IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, - 'to_field': to_field, + "title": title, + "subtitle": None, + "object_name": object_name, + "object": obj, + "deleted_objects": deleted_objects, + "model_count": dict(model_count).items(), + "perms_lacking": perms_needed, + "protected": protected, + "opts": self.opts, + "app_label": app_label, + "preserved_filters": self.get_preserved_filters(request), + "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, + "to_field": to_field, **(extra_context or {}), } @@ -1910,41 +2233,78 @@ def _delete_view(self, request, object_id, extra_context): def history_view(self, request, object_id, extra_context=None): "The 'history' admin view for this model." from django.contrib.admin.models import LogEntry + from django.contrib.admin.views.main import PAGE_VAR + # First check if the user can see this history. model = self.model obj = self.get_object(request, unquote(object_id)) if obj is None: - return self._get_obj_does_not_exist_redirect(request, model._meta, object_id) + return self._get_obj_does_not_exist_redirect( + request, model._meta, object_id + ) if not self.has_view_or_change_permission(request, obj): raise PermissionDenied # Then get the history for this object. - opts = model._meta - app_label = opts.app_label - action_list = LogEntry.objects.filter( - object_id=unquote(object_id), - content_type=get_content_type_for_model(model) - ).select_related().order_by('action_time') + app_label = self.opts.app_label + action_list = ( + LogEntry.objects.filter( + object_id=unquote(object_id), + content_type=get_content_type_for_model(model), + ) + .select_related() + .order_by("action_time") + ) + + paginator = self.get_paginator(request, action_list, 100) + page_number = request.GET.get(PAGE_VAR, 1) + page_obj = paginator.get_page(page_number) + page_range = paginator.get_elided_page_range(page_obj.number) context = { **self.admin_site.each_context(request), - 'title': _('Change history: %s') % obj, - 'action_list': action_list, - 'module_name': str(capfirst(opts.verbose_name_plural)), - 'object': obj, - 'opts': opts, - 'preserved_filters': self.get_preserved_filters(request), + "title": _("Change history: %s") % obj, + "subtitle": None, + "action_list": page_obj, + "page_range": page_range, + "page_var": PAGE_VAR, + "pagination_required": paginator.count > 100, + "module_name": str(capfirst(self.opts.verbose_name_plural)), + "object": obj, + "opts": self.opts, + "preserved_filters": self.get_preserved_filters(request), **(extra_context or {}), } request.current_app = self.admin_site.name - return TemplateResponse(request, self.object_history_template or [ - "admin/%s/%s/object_history.html" % (app_label, opts.model_name), - "admin/%s/object_history.html" % app_label, - "admin/object_history.html" - ], context) + return TemplateResponse( + request, + self.object_history_template + or [ + "admin/%s/%s/object_history.html" % (app_label, self.opts.model_name), + "admin/%s/object_history.html" % app_label, + "admin/object_history.html", + ], + context, + ) + + def get_formset_kwargs(self, request, obj, inline, prefix): + formset_params = { + "instance": obj, + "prefix": prefix, + "queryset": inline.get_queryset(request), + } + if request.method == "POST": + formset_params.update( + { + "data": request.POST.copy(), + "files": request.FILES, + "save_as_new": "_saveasnew" in request.POST, + } + ) + return formset_params def _create_formsets(self, request, obj, change): "Helper function to generate formsets for add/change_view." @@ -1959,31 +2319,21 @@ def _create_formsets(self, request, obj, change): prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1 or not prefix: prefix = "%s-%s" % (prefix, prefixes[prefix]) - formset_params = { - 'instance': obj, - 'prefix': prefix, - 'queryset': inline.get_queryset(request), - } - if request.method == 'POST': - formset_params.update({ - 'data': request.POST.copy(), - 'files': request.FILES, - 'save_as_new': '_saveasnew' in request.POST - }) + formset_params = self.get_formset_kwargs(request, obj, inline, prefix) formset = FormSet(**formset_params) - def user_deleted_form(request, obj, formset, index): + def user_deleted_form(request, obj, formset, index, inline): """Return whether or not the user deleted the form.""" return ( - inline.has_delete_permission(request, obj) and - '{}-{}-DELETE'.format(formset.prefix, index) in request.POST + inline.has_delete_permission(request, obj) + and "{}-{}-DELETE".format(formset.prefix, index) in request.POST ) # Bypass validation of each view-only inline form (since the form's # data won't be in request.POST), unless the form was deleted. if not inline.has_change_permission(request, obj if change else None): for index, form in enumerate(formset.initial_forms): - if user_deleted_form(request, obj, formset, index): + if user_deleted_form(request, obj, formset, index, inline): continue form._errors = {} form.cleaned_data = form.initial @@ -2000,6 +2350,7 @@ class InlineModelAdmin(BaseModelAdmin): from ``model`` to its parent. This is required if ``model`` has more than one ``ForeignKey`` to its parent. """ + model = None fk_name = None formset = BaseInlineFormSet @@ -2020,20 +2371,21 @@ def __init__(self, parent_model, admin_site): self.opts = self.model._meta self.has_registered_model = admin_site.is_registered(self.model) super().__init__() - if self.verbose_name is None: - self.verbose_name = self.model._meta.verbose_name if self.verbose_name_plural is None: - self.verbose_name_plural = self.model._meta.verbose_name_plural + if self.verbose_name is None: + self.verbose_name_plural = self.opts.verbose_name_plural + else: + self.verbose_name_plural = format_lazy("{}s", self.verbose_name) + if self.verbose_name is None: + self.verbose_name = self.opts.verbose_name @property def media(self): - extra = '' if settings.DEBUG else '.min' - js = ['vendor/jquery/jquery%s.js' % extra, 'jquery.init.js', 'inlines.js'] + extra = "" if settings.DEBUG else ".min" + js = ["vendor/jquery/jquery%s.js" % extra, "jquery.init.js", "inlines.js"] if self.filter_vertical or self.filter_horizontal: - js.extend(['SelectBox.js', 'SelectFilter2.js']) - if self.classes and 'collapse' in self.classes: - js.append('collapse.js') - return forms.Media(js=['admin/js/%s' % url for url in js]) + js.extend(["SelectBox.js", "SelectFilter2.js"]) + return forms.Media(js=["admin/js/%s" % url for url in js]) def get_extra(self, request, obj=None, **kwargs): """Hook for customizing the number of extra inline forms.""" @@ -2049,14 +2401,14 @@ def get_max_num(self, request, obj=None, **kwargs): def get_formset(self, request, obj=None, **kwargs): """Return a BaseInlineFormSet class for use in admin add/change views.""" - if 'fields' in kwargs: - fields = kwargs.pop('fields') + if "fields" in kwargs: + fields = kwargs.pop("fields") else: fields = flatten_fieldsets(self.get_fieldsets(request, obj)) excluded = self.get_exclude(request, obj) exclude = [] if excluded is None else list(excluded) exclude.extend(self.get_readonly_fields(request, obj)) - if excluded is None and hasattr(self.form, '_meta') and self.form._meta.exclude: + if excluded is None and hasattr(self.form, "_meta") and self.form._meta.exclude: # Take the custom ModelForm's Meta.exclude into account only if the # InlineModelAdmin doesn't define its own. exclude.extend(self.form._meta.exclude) @@ -2065,25 +2417,24 @@ def get_formset(self, request, obj=None, **kwargs): exclude = exclude or None can_delete = self.can_delete and self.has_delete_permission(request, obj) defaults = { - 'form': self.form, - 'formset': self.formset, - 'fk_name': self.fk_name, - 'fields': fields, - 'exclude': exclude, - 'formfield_callback': partial(self.formfield_for_dbfield, request=request), - 'extra': self.get_extra(request, obj, **kwargs), - 'min_num': self.get_min_num(request, obj, **kwargs), - 'max_num': self.get_max_num(request, obj, **kwargs), - 'can_delete': can_delete, + "form": self.form, + "formset": self.formset, + "fk_name": self.fk_name, + "fields": fields, + "exclude": exclude, + "formfield_callback": partial(self.formfield_for_dbfield, request=request), + "extra": self.get_extra(request, obj, **kwargs), + "min_num": self.get_min_num(request, obj, **kwargs), + "max_num": self.get_max_num(request, obj, **kwargs), + "can_delete": can_delete, **kwargs, } - base_model_form = defaults['form'] + base_model_form = defaults["form"] can_change = self.has_change_permission(request, obj) if request else True can_add = self.has_add_permission(request, obj) if request else True class DeleteProtectedModelForm(base_model_form): - def hand_clean_DELETE(self): """ We don't validate the 'DELETE' field itself because on @@ -2100,21 +2451,25 @@ def hand_clean_DELETE(self): objs = [] for p in collector.protected: objs.append( - # Translators: Model verbose name and instance representation, - # suitable to be an item in a list. - _('%(class_name)s %(instance)s') % { - 'class_name': p._meta.verbose_name, - 'instance': p} + # Translators: Model verbose name and instance + # representation, suitable to be an item in a + # list. + _("%(class_name)s %(instance)s") + % {"class_name": p._meta.verbose_name, "instance": p} ) params = { - 'class_name': self._meta.model._meta.verbose_name, - 'instance': self.instance, - 'related_objects': get_text_list(objs, _('and')), + "class_name": self._meta.model._meta.verbose_name, + "instance": self.instance, + "related_objects": get_text_list(objs, _("and")), } - msg = _("Deleting %(class_name)s %(instance)s would require " - "deleting the following protected related objects: " - "%(related_objects)s") - raise ValidationError(msg, code='deleting_protected', params=params) + msg = _( + "Deleting %(class_name)s %(instance)s would require " + "deleting the following protected related objects: " + "%(related_objects)s" + ) + raise ValidationError( + msg, code="deleting_protected", params=params + ) def is_valid(self): result = super().is_valid() @@ -2129,10 +2484,12 @@ def has_changed(self): return False return super().has_changed() - defaults['form'] = DeleteProtectedModelForm + defaults["form"] = DeleteProtectedModelForm - if defaults['fields'] is None and not modelform_defines_fields(defaults['form']): - defaults['fields'] = forms.ALL_FIELDS + if defaults["fields"] is None and not modelform_defines_fields( + defaults["form"] + ): + defaults["fields"] = forms.ALL_FIELDS return inlineformset_factory(self.parent_model, self.model, **defaults) @@ -2159,7 +2516,9 @@ def _has_any_perms_for_target_model(self, request, perms): opts = field.remote_field.model._meta break return any( - request.user.has_perm('%s.%s' % (opts.app_label, get_permission_codename(perm, opts))) + request.user.has_perm( + "%s.%s" % (opts.app_label, get_permission_codename(perm, opts)) + ) for perm in perms ) @@ -2169,32 +2528,32 @@ def has_add_permission(self, request, obj): # permissions. The user needs to have the change permission for the # related model in order to be able to do anything with the # intermediate model. - return self._has_any_perms_for_target_model(request, ['change']) + return self._has_any_perms_for_target_model(request, ["change"]) return super().has_add_permission(request) def has_change_permission(self, request, obj=None): if self.opts.auto_created: # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ['change']) + return self._has_any_perms_for_target_model(request, ["change"]) return super().has_change_permission(request) def has_delete_permission(self, request, obj=None): if self.opts.auto_created: # Same comment as has_add_permission(). - return self._has_any_perms_for_target_model(request, ['change']) + return self._has_any_perms_for_target_model(request, ["change"]) return super().has_delete_permission(request, obj) def has_view_permission(self, request, obj=None): if self.opts.auto_created: # Same comment as has_add_permission(). The 'change' permission # also implies the 'view' permission. - return self._has_any_perms_for_target_model(request, ['view', 'change']) + return self._has_any_perms_for_target_model(request, ["view", "change"]) return super().has_view_permission(request) class StackedInline(InlineModelAdmin): - template = 'admin/edit_inline/stacked.html' + template = "admin/edit_inline/stacked.html" class TabularInline(InlineModelAdmin): - template = 'admin/edit_inline/tabular.html' + template = "admin/edit_inline/tabular.html" diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index 5cdb2a0f7228..9c9aa21f57ba 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -1,34 +1,32 @@ -import re from functools import update_wrapper from weakref import WeakSet from django.apps import apps +from django.conf import settings from django.contrib.admin import ModelAdmin, actions +from django.contrib.admin.exceptions import AlreadyRegistered, NotRegistered +from django.contrib.admin.views.autocomplete import AutocompleteJsonView from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.decorators import login_not_required from django.core.exceptions import ImproperlyConfigured from django.db.models.base import ModelBase -from django.http import Http404, HttpResponseRedirect +from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect from django.template.response import TemplateResponse -from django.urls import NoReverseMatch, reverse +from django.urls import NoReverseMatch, Resolver404, resolve, reverse, reverse_lazy +from django.utils.decorators import method_decorator from django.utils.functional import LazyObject from django.utils.module_loading import import_string from django.utils.text import capfirst -from django.utils.translation import gettext as _, gettext_lazy +from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy from django.views.decorators.cache import never_cache +from django.views.decorators.common import no_append_slash from django.views.decorators.csrf import csrf_protect from django.views.i18n import JavaScriptCatalog all_sites = WeakSet() -class AlreadyRegistered(Exception): - pass - - -class NotRegistered(Exception): - pass - - class AdminSite: """ An AdminSite object encapsulates an instance of the Django admin application, ready @@ -39,36 +37,42 @@ class AdminSite: """ # Text to put at the end of each page's . - site_title = gettext_lazy('Django site admin') + site_title = gettext_lazy("Django site admin") - # Text to put in each page's <h1>. - site_header = gettext_lazy('Django administration') + # Text to put in each page's <div id="site-name">. + site_header = gettext_lazy("Django administration") # Text to put at the top of the admin index page. - index_title = gettext_lazy('Site administration') + index_title = gettext_lazy("Site administration") # URL for the "View site" link at the top of each admin page. - site_url = '/' + site_url = "/" enable_nav_sidebar = True - _empty_value_display = '-' + empty_value_display = "-" login_form = None index_template = None app_index_template = None login_template = None logout_template = None + password_change_form = None password_change_template = None password_change_done_template = None - def __init__(self, name='admin'): + final_catch_all_view = True + + def __init__(self, name="admin"): self._registry = {} # model_class class -> admin_class instance self.name = name - self._actions = {'delete_selected': actions.delete_selected} + self._actions = {"delete_selected": actions.delete_selected} self._global_actions = self._actions.copy() all_sites.add(self) + def __repr__(self): + return f"{self.__class__.__name__}(name={self.name!r})" + def check(self, app_configs): """ Run the system checks on all ModelAdmins, except if they aren't @@ -79,7 +83,9 @@ def check(self, app_configs): app_configs = set(app_configs) # Speed up lookups below errors = [] - modeladmins = (o for o in self._registry.values() if o.__class__ is not ModelAdmin) + modeladmins = ( + o for o in self._registry.values() if o.__class__ is not ModelAdmin + ) for modeladmin in modeladmins: if modeladmin.model._meta.app_config in app_configs: errors.extend(modeladmin.check()) @@ -105,17 +111,23 @@ def register(self, model_or_iterable, admin_class=None, **options): for model in model_or_iterable: if model._meta.abstract: raise ImproperlyConfigured( - 'The model %s is abstract, so it cannot be registered with admin.' % model.__name__ + "The model %s is abstract, so it cannot be registered with admin." + % model.__name__ + ) + if model._meta.is_composite_pk: + raise ImproperlyConfigured( + "The model %s has a composite primary key, so it cannot be " + "registered with admin." % model.__name__ ) - if model in self._registry: - registered_admin = str(self._registry[model]) - msg = 'The model %s is already registered ' % model.__name__ - if registered_admin.endswith('.ModelAdmin'): + if self.is_registered(model): + registered_admin = str(self.get_model_admin(model)) + msg = "The model %s is already registered " % model.__name__ + if registered_admin.endswith(".ModelAdmin"): # Most likely registered without a ModelAdmin subclass. - msg += 'in app %r.' % re.sub(r'\.ModelAdmin$', '', registered_admin) + msg += "in app %r." % registered_admin.removesuffix(".ModelAdmin") else: - msg += 'with %r.' % registered_admin + msg += "with %r." % registered_admin raise AlreadyRegistered(msg) # Ignore the registration if the model has been @@ -127,8 +139,10 @@ def register(self, model_or_iterable, admin_class=None, **options): # For reasons I don't quite understand, without a __module__ # the created class appears to "live" in the wrong place, # which causes issues later on. - options['__module__'] = __name__ - admin_class = type("%sAdmin" % model.__name__, (admin_class,), options) + options["__module__"] = __name__ + admin_class = type( + "%sAdmin" % model.__name__, (admin_class,), options + ) # Instantiate the admin class to save in the registry self._registry[model] = admin_class(model, self) @@ -142,8 +156,8 @@ def unregister(self, model_or_iterable): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: - if model not in self._registry: - raise NotRegistered('The model %s is not registered' % model.__name__) + if not self.is_registered(model): + raise NotRegistered("The model %s is not registered" % model.__name__) del self._registry[model] def is_registered(self, model): @@ -152,6 +166,12 @@ def is_registered(self, model): """ return model in self._registry + def get_model_admin(self, model): + try: + return self._registry[model] + except KeyError: + raise NotRegistered(f"The model {model.__name__} is not registered.") + def add_action(self, action, name=None): """ Register an action to be available globally. @@ -180,14 +200,6 @@ def actions(self): """ return self._actions.items() - @property - def empty_value_display(self): - return self._empty_value_display - - @empty_value_display.setter - def empty_value_display(self, empty_value_display): - self._empty_value_display = empty_value_display - def has_permission(self, request): """ Return True if the given HttpRequest has permission to view @@ -218,56 +230,67 @@ def get_urls(self): ``never_cache`` decorator. If the view can be safely cached, set cacheable=True. """ + def inner(request, *args, **kwargs): if not self.has_permission(request): - if request.path == reverse('admin:logout', current_app=self.name): - index_path = reverse('admin:index', current_app=self.name) + if request.path == reverse("admin:logout", current_app=self.name): + index_path = reverse("admin:index", current_app=self.name) return HttpResponseRedirect(index_path) # Inner import to prevent django.contrib.admin (app) from # importing django.contrib.auth.models.User (unrelated model). from django.contrib.auth.views import redirect_to_login + return redirect_to_login( request.get_full_path(), - reverse('admin:login', current_app=self.name) + reverse("admin:login", current_app=self.name), ) return view(request, *args, **kwargs) + if not cacheable: inner = never_cache(inner) # We add csrf_protect here so this function can be used as a utility # function for any view, without having to repeat 'csrf_protect'. - if not getattr(view, 'csrf_exempt', False): + if not getattr(view, "csrf_exempt", False): inner = csrf_protect(inner) return update_wrapper(inner, view) def get_urls(self): - from django.urls import include, path, re_path # Since this module gets imported in the application's root package, # it cannot import models from other applications at the module level, # and django.contrib.contenttypes.views imports ContentType. from django.contrib.contenttypes import views as contenttype_views + from django.urls import include, path, re_path def wrap(view, cacheable=False): def wrapper(*args, **kwargs): return self.admin_view(view, cacheable)(*args, **kwargs) + wrapper.admin_site = self + # Used by LoginRequiredMiddleware. + wrapper.login_url = reverse_lazy("admin:login", current_app=self.name) return update_wrapper(wrapper, view) # Admin-site-wide views. urlpatterns = [ - path('', wrap(self.index), name='index'), - path('login/', self.login, name='login'), - path('logout/', wrap(self.logout), name='logout'), - path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'), + path("", wrap(self.index), name="index"), + path("login/", self.login, name="login"), + path("logout/", wrap(self.logout), name="logout"), + path( + "password_change/", + wrap(self.password_change, cacheable=True), + name="password_change", + ), path( - 'password_change/done/', + "password_change/done/", wrap(self.password_change_done, cacheable=True), - name='password_change_done', + name="password_change_done", ), - path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'), + path("autocomplete/", wrap(self.autocomplete_view), name="autocomplete"), + path("jsi18n/", wrap(self.i18n_javascript, cacheable=True), name="jsi18n"), path( - 'r/<int:content_type_id>/<path:object_id>/', + "r/<path:content_type_id>/<path:object_id>/", wrap(contenttype_views.shortcut), - name='view_on_site', + name="view_on_site", ), ] @@ -276,7 +299,10 @@ def wrapper(*args, **kwargs): valid_app_labels = [] for model, model_admin in self._registry.items(): urlpatterns += [ - path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)), + path( + "%s/%s/" % (model._meta.app_label, model._meta.model_name), + include(model_admin.urls), + ), ] if model._meta.app_label not in valid_app_labels: valid_app_labels.append(model._meta.app_label) @@ -284,15 +310,19 @@ def wrapper(*args, **kwargs): # If there were ModelAdmins registered, we should have a list of app # labels for which we need to allow access to the app_index view, if valid_app_labels: - regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$' + regex = r"^(?P<app_label>" + "|".join(valid_app_labels) + ")/$" urlpatterns += [ - re_path(regex, wrap(self.app_index), name='app_list'), + re_path(regex, wrap(self.app_index), name="app_list"), ] + + if self.final_catch_all_view: + urlpatterns.append(re_path(r"(?P<url>.*)$", wrap(self.catch_all_view))) + return urlpatterns @property def urls(self): - return self.get_urls(), 'admin', self.name + return self.get_urls(), "admin", self.name def each_context(self, request): """ @@ -302,16 +332,19 @@ def each_context(self, request): For sites running on a subpath, use the SCRIPT_NAME value if site_url hasn't been customized. """ - script_name = request.META['SCRIPT_NAME'] - site_url = script_name if self.site_url == '/' and script_name else self.site_url + script_name = request.META["SCRIPT_NAME"] + site_url = ( + script_name if self.site_url == "/" and script_name else self.site_url + ) return { - 'site_title': self.site_title, - 'site_header': self.site_header, - 'site_url': site_url, - 'has_permission': self.has_permission(request), - 'available_apps': self.get_app_list(request), - 'is_popup': False, - 'is_nav_sidebar_enabled': self.enable_nav_sidebar, + "site_title": self.site_title, + "site_header": self.site_header, + "site_url": site_url, + "has_permission": self.has_permission(request), + "available_apps": self.get_app_list(request), + "is_popup": False, + "is_nav_sidebar_enabled": self.enable_nav_sidebar, + "log_entries": self.get_log_entries(request), } def password_change(self, request, extra_context=None): @@ -320,14 +353,15 @@ def password_change(self, request, extra_context=None): """ from django.contrib.admin.forms import AdminPasswordChangeForm from django.contrib.auth.views import PasswordChangeView - url = reverse('admin:password_change_done', current_app=self.name) + + url = reverse("admin:password_change_done", current_app=self.name) defaults = { - 'form_class': AdminPasswordChangeForm, - 'success_url': url, - 'extra_context': {**self.each_context(request), **(extra_context or {})}, + "form_class": self.password_change_form or AdminPasswordChangeForm, + "success_url": url, + "extra_context": {**self.each_context(request), **(extra_context or {})}, } if self.password_change_template is not None: - defaults['template_name'] = self.password_change_template + defaults["template_name"] = self.password_change_template request.current_app = self.name return PasswordChangeView.as_view(**defaults)(request) @@ -336,11 +370,12 @@ def password_change_done(self, request, extra_context=None): Display the "success" page after a password change. """ from django.contrib.auth.views import PasswordChangeDoneView + defaults = { - 'extra_context': {**self.each_context(request), **(extra_context or {})}, + "extra_context": {**self.each_context(request), **(extra_context or {})}, } if self.password_change_done_template is not None: - defaults['template_name'] = self.password_change_done_template + defaults["template_name"] = self.password_change_done_template request.current_app = self.name return PasswordChangeDoneView.as_view(**defaults)(request) @@ -351,9 +386,8 @@ def i18n_javascript(self, request, extra_context=None): `extra_context` is unused but present for consistency with the other admin views. """ - return JavaScriptCatalog.as_view(packages=['django.contrib.admin'])(request) + return JavaScriptCatalog.as_view(packages=["django.contrib.admin"])(request) - @never_cache def logout(self, request, extra_context=None): """ Log out the user for the given HttpRequest. @@ -361,54 +395,78 @@ def logout(self, request, extra_context=None): This should *not* assume the user is already logged in. """ from django.contrib.auth.views import LogoutView + defaults = { - 'extra_context': { + "extra_context": { **self.each_context(request), # Since the user isn't logged out at this point, the value of # has_permission must be overridden. - 'has_permission': False, - **(extra_context or {}) + "has_permission": False, + **(extra_context or {}), }, } if self.logout_template is not None: - defaults['template_name'] = self.logout_template + defaults["template_name"] = self.logout_template request.current_app = self.name return LogoutView.as_view(**defaults)(request) - @never_cache + @method_decorator(never_cache) + @login_not_required def login(self, request, extra_context=None): """ Display the login form for the given HttpRequest. """ - if request.method == 'GET' and self.has_permission(request): + if request.method == "GET" and self.has_permission(request): # Already logged-in, redirect to admin index - index_path = reverse('admin:index', current_app=self.name) + index_path = reverse("admin:index", current_app=self.name) return HttpResponseRedirect(index_path) - from django.contrib.auth.views import LoginView # Since this module gets imported in the application's root package, # it cannot import models from other applications at the module level, # and django.contrib.admin.forms eventually imports User. from django.contrib.admin.forms import AdminAuthenticationForm + from django.contrib.auth.views import LoginView + context = { **self.each_context(request), - 'title': _('Log in'), - 'app_path': request.get_full_path(), - 'username': request.user.get_username(), + "title": _("Log in"), + "subtitle": None, + "app_path": request.get_full_path(), + "username": request.user.get_username(), } - if (REDIRECT_FIELD_NAME not in request.GET and - REDIRECT_FIELD_NAME not in request.POST): - context[REDIRECT_FIELD_NAME] = reverse('admin:index', current_app=self.name) + if ( + REDIRECT_FIELD_NAME not in request.GET + and REDIRECT_FIELD_NAME not in request.POST + ): + context[REDIRECT_FIELD_NAME] = reverse("admin:index", current_app=self.name) context.update(extra_context or {}) defaults = { - 'extra_context': context, - 'authentication_form': self.login_form or AdminAuthenticationForm, - 'template_name': self.login_template or 'admin/login.html', + "extra_context": context, + "authentication_form": self.login_form or AdminAuthenticationForm, + "template_name": self.login_template or "admin/login.html", } request.current_app = self.name return LoginView.as_view(**defaults)(request) + def autocomplete_view(self, request): + return AutocompleteJsonView.as_view(admin_site=self)(request) + + @no_append_slash + def catch_all_view(self, request, url): + if settings.APPEND_SLASH and not url.endswith("/"): + urlconf = getattr(request, "urlconf", None) + try: + match = resolve("%s/" % request.path_info, urlconf) + except Resolver404: + pass + else: + if getattr(match.func, "should_append_slash", True): + return HttpResponsePermanentRedirect( + request.get_full_path(force_append_slash=True) + ) + raise Http404 + def _build_app_dict(self, request, label=None): """ Build the app dictionary. The optional `label` parameter filters models @@ -418,7 +476,8 @@ def _build_app_dict(self, request, label=None): if label: models = { - m: m_a for m, m_a in self._registry.items() + m: m_a + for m, m_a in self._registry.items() if m._meta.app_label == label } else: @@ -440,60 +499,62 @@ def _build_app_dict(self, request, label=None): info = (app_label, model._meta.model_name) model_dict = { - 'name': capfirst(model._meta.verbose_name_plural), - 'object_name': model._meta.object_name, - 'perms': perms, - 'admin_url': None, - 'add_url': None, + "model": model, + "name": capfirst(model._meta.verbose_name_plural), + "object_name": model._meta.object_name, + "perms": perms, + "admin_url": None, + "add_url": None, } - if perms.get('change') or perms.get('view'): - model_dict['view_only'] = not perms.get('change') + if perms.get("change") or perms.get("view"): + model_dict["view_only"] = not perms.get("change") try: - model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name) + model_dict["admin_url"] = reverse( + "admin:%s_%s_changelist" % info, current_app=self.name + ) except NoReverseMatch: pass - if perms.get('add'): + if perms.get("add"): try: - model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name) + model_dict["add_url"] = reverse( + "admin:%s_%s_add" % info, current_app=self.name + ) except NoReverseMatch: pass if app_label in app_dict: - app_dict[app_label]['models'].append(model_dict) + app_dict[app_label]["models"].append(model_dict) else: app_dict[app_label] = { - 'name': apps.get_app_config(app_label).verbose_name, - 'app_label': app_label, - 'app_url': reverse( - 'admin:app_list', - kwargs={'app_label': app_label}, + "name": apps.get_app_config(app_label).verbose_name, + "app_label": app_label, + "app_url": reverse( + "admin:app_list", + kwargs={"app_label": app_label}, current_app=self.name, ), - 'has_module_perms': has_module_perms, - 'models': [model_dict], + "has_module_perms": has_module_perms, + "models": [model_dict], } - if label: - return app_dict.get(label) return app_dict - def get_app_list(self, request): + def get_app_list(self, request, app_label=None): """ Return a sorted list of all the installed apps that have been registered in this site. """ - app_dict = self._build_app_dict(request) + app_dict = self._build_app_dict(request, app_label) # Sort the apps alphabetically. - app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower()) + app_list = sorted(app_dict.values(), key=lambda x: x["name"].lower()) # Sort the models alphabetically within each app. for app in app_list: - app['models'].sort(key=lambda x: x['name']) + app["models"].sort(key=lambda x: x["name"]) return app_list - @never_cache def index(self, request, extra_context=None): """ Display the main admin index page, which lists all of the installed @@ -503,43 +564,56 @@ def index(self, request, extra_context=None): context = { **self.each_context(request), - 'title': self.index_title, - 'app_list': app_list, + "title": self.index_title, + "subtitle": None, + "app_list": app_list, **(extra_context or {}), } request.current_app = self.name - return TemplateResponse(request, self.index_template or 'admin/index.html', context) + return TemplateResponse( + request, self.index_template or "admin/index.html", context + ) def app_index(self, request, app_label, extra_context=None): - app_dict = self._build_app_dict(request, app_label) - if not app_dict: - raise Http404('The requested admin page does not exist.') - # Sort the models alphabetically within each app. - app_dict['models'].sort(key=lambda x: x['name']) - app_name = apps.get_app_config(app_label).verbose_name + app_list = self.get_app_list(request, app_label) + + if not app_list: + raise Http404("The requested admin page does not exist.") + context = { **self.each_context(request), - 'title': _('%(app)s administration') % {'app': app_name}, - 'app_list': [app_dict], - 'app_label': app_label, + "title": _("%(app)s administration") % {"app": app_list[0]["name"]}, + "subtitle": None, + "app_list": app_list, + "app_label": app_label, **(extra_context or {}), } request.current_app = self.name - return TemplateResponse(request, self.app_index_template or [ - 'admin/%s/app_index.html' % app_label, - 'admin/app_index.html' - ], context) + return TemplateResponse( + request, + self.app_index_template + or ["admin/%s/app_index.html" % app_label, "admin/app_index.html"], + context, + ) + + def get_log_entries(self, request): + from django.contrib.admin.models import LogEntry + + return LogEntry.objects.select_related("content_type", "user") class DefaultAdminSite(LazyObject): def _setup(self): - AdminSiteClass = import_string(apps.get_app_config('admin').default_site) + AdminSiteClass = import_string(apps.get_app_config("admin").default_site) self._wrapped = AdminSiteClass() + def __repr__(self): + return repr(self._wrapped) + # This global object represents the default admin site, for the common case. # You can provide your own AdminSite using the (Simple)AdminConfig.default_site diff --git a/django/contrib/admin/static/admin/css/autocomplete.css b/django/contrib/admin/static/admin/css/autocomplete.css index 3ef95d15f0a1..7478c2c4e6ce 100644 --- a/django/contrib/admin/static/admin/css/autocomplete.css +++ b/django/contrib/admin/static/admin/css/autocomplete.css @@ -14,7 +14,7 @@ select.admin-autocomplete { .select2-container--admin-autocomplete.select2-container--focus .select2-selection, .select2-container--admin-autocomplete.select2-container--open .select2-selection { - border-color: #999; + border-color: var(--body-quiet-color); min-height: 30px; } @@ -29,13 +29,13 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--single { - background-color: #fff; - border: 1px solid #ccc; + background-color: var(--body-bg); + border: 1px solid var(--border-color); border-radius: 4px; } .select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered { - color: #444; + color: var(--body-fg); line-height: 30px; } @@ -46,7 +46,7 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder { - color: #999; + color: var(--body-quiet-color); } .select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow { @@ -80,7 +80,7 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single { - background-color: #eee; + background-color: var(--darkened-bg); cursor: default; } @@ -94,8 +94,8 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--multiple { - background-color: white; - border: 1px solid #ccc; + background-color: var(--body-bg); + border: 1px solid var(--border-color); border-radius: 4px; cursor: text; } @@ -104,8 +104,10 @@ select.admin-autocomplete { box-sizing: border-box; list-style: none; margin: 0; - padding: 0 5px; + padding: 0 10px 5px 5px; width: 100%; + display: flex; + flex-wrap: wrap; } .select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li { @@ -113,7 +115,7 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder { - color: #999; + color: var(--body-quiet-color); margin-top: 5px; float: left; } @@ -123,11 +125,13 @@ select.admin-autocomplete { float: right; font-weight: bold; margin: 5px; + position: absolute; + right: 0; } .select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #ccc; + background-color: var(--darkened-bg); + border: 1px solid var(--border-color); border-radius: 4px; cursor: default; float: left; @@ -137,7 +141,7 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove { - color: #999; + color: var(--body-quiet-color); cursor: pointer; display: inline-block; font-weight: bold; @@ -145,7 +149,7 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; + color: var(--body-fg); } .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline { @@ -163,12 +167,12 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple { - border: solid #999 1px; + border: solid var(--body-quiet-color) 1px; outline: 0; } .select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple { - background-color: #eee; + background-color: var(--darkened-bg); cursor: default; } @@ -186,12 +190,20 @@ select.admin-autocomplete { border-bottom-right-radius: 0; } +.select2-container--admin-autocomplete .select2-search--dropdown { + background: var(--darkened-bg); +} + .select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field { - border: 1px solid #ccc; + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--border-color); + border-radius: 4px; } .select2-container--admin-autocomplete .select2-search--inline .select2-search__field { background: transparent; + color: var(--body-fg); border: none; outline: 0; box-shadow: none; @@ -201,6 +213,8 @@ select.admin-autocomplete { .select2-container--admin-autocomplete .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; + color: var(--body-fg); + background: var(--body-bg); } .select2-container--admin-autocomplete .select2-results__option[role=group] { @@ -208,11 +222,12 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] { - color: #999; + color: var(--body-quiet-color); } .select2-container--admin-autocomplete .select2-results__option[aria-selected=true] { - background-color: #ddd; + background-color: var(--selected-bg); + color: var(--body-fg); } .select2-container--admin-autocomplete .select2-results__option .select2-results__option { @@ -249,8 +264,8 @@ select.admin-autocomplete { } .select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] { - background-color: #79aec8; - color: white; + background-color: var(--primary); + color: var(--primary-fg); } .select2-container--admin-autocomplete .select2-results__group { @@ -258,3 +273,7 @@ select.admin-autocomplete { display: block; padding: 6px; } + +.errors .select2-selection { + border: 1px solid var(--error-fg); +} diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index c4285195fc8b..4f4773284ea4 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -2,7 +2,92 @@ DJANGO Admin styles */ -@import url(fonts.css); +/* VARIABLE DEFINITIONS */ +html[data-theme="light"], +:root { + --primary: #79aec8; + --secondary: #417690; + --accent: #f5dd5d; + --primary-fg: #fff; + + --body-fg: #333; + --body-bg: #fff; + --body-quiet-color: #666; + --body-medium-color: #444; + --body-loud-color: #000; + + --header-color: #ffc; + --header-branding-color: var(--accent); + --header-bg: var(--secondary); + --header-link-color: var(--primary-fg); + + --breadcrumbs-fg: #c4dce8; + --breadcrumbs-link-fg: var(--body-bg); + --breadcrumbs-bg: #264b5d; + + --link-fg: #417893; + --link-hover-color: #036; + --link-selected-fg: var(--secondary); + + --hairline-color: #e8e8e8; + --border-color: #ccc; + + --error-fg: #ba2121; + + --message-success-bg: #dfd; + --message-warning-bg: #ffc; + --message-error-bg: #ffefef; + + --darkened-bg: #f8f8f8; /* A bit darker than --body-bg */ + --selected-bg: #e4e4e4; /* E.g. selected table cells */ + --selected-row: #ffc; + + --button-fg: #fff; + --button-bg: var(--secondary); + --button-hover-bg: #205067; + --default-button-bg: #205067; + --default-button-hover-bg: var(--secondary); + --close-button-bg: #747474; + --close-button-hover-bg: #333; + --delete-button-bg: #ba2121; + --delete-button-hover-bg: #a41515; + + --object-tools-fg: var(--button-fg); + --object-tools-bg: var(--close-button-bg); + --object-tools-hover-bg: var(--close-button-hover-bg); + + --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"; + --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"; + + color-scheme: light; +} html, body { height: 100%; @@ -11,21 +96,22 @@ html, body { body { margin: 0; padding: 0; - font-size: 14px; - font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; - color: #333; - background: #fff; + font-size: 0.875rem; + font-family: var(--font-family-primary); + color: var(--body-fg); + background: var(--body-bg); } /* LINKS */ a:link, a:visited { - color: #447e9b; + color: var(--link-fg); text-decoration: none; + transition: color 0.15s, background 0.15s; } a:focus, a:hover { - color: #036; + color: var(--link-hover-color); } a:focus { @@ -37,7 +123,7 @@ a img { } a.section:link, a.section:visited { - color: #fff; + color: var(--header-link-color); text-decoration: none; } @@ -63,12 +149,11 @@ h1,h2,h3,h4,h5 { h1 { margin: 0 0 20px; font-weight: 300; - font-size: 20px; - color: #666; + font-size: 1.25rem; } h2 { - font-size: 16px; + font-size: 1rem; margin: 1em 0 .5em 0; } @@ -78,22 +163,23 @@ h2.subhead { } h3 { - font-size: 14px; + font-size: 0.875rem; margin: .8em 0 .3em 0; - color: #666; + color: var(--body-medium-color); font-weight: bold; } h4 { - font-size: 12px; + font-size: 0.75rem; margin: 1em 0 .8em 0; padding-bottom: 3px; + color: var(--body-medium-color); } h5 { - font-size: 10px; + font-size: 0.625rem; margin: 1.5em 0 .5em 0; - color: #666; + color: var(--body-quiet-color); text-transform: uppercase; letter-spacing: 1px; } @@ -108,8 +194,8 @@ li ul { } li, dt, dd { - font-size: 13px; - line-height: 20px; + font-size: 0.8125rem; + line-height: 1.25rem; } dt { @@ -131,11 +217,15 @@ fieldset { min-width: 0; padding: 0; border: none; - border-top: 1px solid #eee; + border-top: 1px solid var(--hairline-color); +} + +details summary { + cursor: pointer; } blockquote { - font-size: 11px; + font-size: 0.6875rem; color: #777; margin-left: 2px; padding-left: 10px; @@ -143,15 +233,15 @@ blockquote { } code, pre { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; - color: #666; - font-size: 12px; + font-family: var(--font-family-monospace); + color: var(--body-quiet-color); + font-size: 0.75rem; overflow-x: auto; } pre.literal-block { margin: 10px; - background: #eee; + background: var(--darkened-bg); padding: 6px 8px; } @@ -161,29 +251,28 @@ code strong { hr { clear: both; - color: #eee; - background-color: #eee; + color: var(--hairline-color); + background-color: var(--hairline-color); height: 1px; border: none; margin: 0; padding: 0; - font-size: 1px; line-height: 1px; } /* TEXT STYLES & MODIFIERS */ .small { - font-size: 11px; + font-size: 0.6875rem; } .mini { - font-size: 10px; + font-size: 0.625rem; } .help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 11px; - color: #999; + font-size: 0.6875rem; + color: var(--body-quiet-color); } div.help ul { @@ -199,7 +288,7 @@ p img, h1 img, h2 img, h3 img, h4 img, td img { } .quiet, a.quiet:link, a.quiet:visited { - color: #999; + color: var(--body-quiet-color); font-weight: normal; } @@ -211,60 +300,63 @@ p img, h1 img, h2 img, h3 img, h4 img, td img { white-space: nowrap; } +.hidden { + display: none !important; +} + /* TABLES */ table { border-collapse: collapse; - border-color: #ccc; + border-color: var(--border-color); } td, th { - font-size: 13px; - line-height: 16px; - border-bottom: 1px solid #eee; + font-size: 0.8125rem; + line-height: 1rem; + border-bottom: 1px solid var(--hairline-color); vertical-align: top; padding: 8px; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; } th { - font-weight: 600; + font-weight: 500; text-align: left; } thead th, tfoot td { - color: #666; + color: var(--body-quiet-color); padding: 5px 10px; - font-size: 11px; - background: #fff; + font-size: 0.6875rem; + background: var(--body-bg); border: none; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); } tfoot td { border-bottom: none; - border-top: 1px solid #eee; + border-top: 1px solid var(--hairline-color); } thead th.required { - color: #000; + font-weight: bold; } tr.alt { - background: #f6f6f6; + background: var(--darkened-bg); } tr:nth-child(odd), .row-form-errors { - background: #fff; + background: var(--body-bg); } tr:nth-child(even), tr:nth-child(even) .errorlist, tr:nth-child(odd) + .row-form-errors, tr:nth-child(odd) + .row-form-errors .errorlist { - background: #f9f9f9; + background: var(--darkened-bg); } /* SORTABLE TABLES */ @@ -273,15 +365,15 @@ thead th { padding: 5px 10px; line-height: normal; text-transform: uppercase; - background: #f6f6f6; + background: var(--darkened-bg); } thead th a:link, thead th a:visited { - color: #666; + color: var(--body-quiet-color); } thead th.sorted { - background: #eee; + background: var(--selected-bg); } thead th.sorted .text { @@ -300,7 +392,7 @@ table thead th .text a { } table thead th .text a:focus, table thead th .text a:hover { - background: #eee; + background: var(--selected-bg); } thead th.sorted a.sortremove { @@ -346,13 +438,13 @@ table thead th.sorted .sortoptions a.sortremove:after { top: -6px; left: 3px; font-weight: 200; - font-size: 18px; - color: #999; + font-size: 1.125rem; + color: var(--body-quiet-color); } table thead th.sorted .sortoptions a.sortremove:focus:after, table thead th.sorted .sortoptions a.sortremove:hover:after { - color: #447e9b; + color: var(--link-fg); } table thead th.sorted .sortoptions a.sortremove:focus, @@ -385,9 +477,9 @@ input, textarea, select, .form-row p, form .button { margin: 2px 0; padding: 2px 3px; vertical-align: middle; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; + font-family: var(--font-family-primary); font-weight: normal; - font-size: 13px; + font-size: 0.8125rem; } .form-row div.help { padding: 2px 3px; @@ -397,22 +489,33 @@ textarea { vertical-align: top; } -input[type=text], input[type=password], input[type=email], input[type=url], -input[type=number], input[type=tel], textarea, select, .vTextField { - border: 1px solid #ccc; +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]), input[type=text], input[type=password], input[type=email], +input[type=url], input[type=number], input[type=tel], textarea, select, +.vTextField { + border: 1px solid var(--border-color); border-radius: 4px; padding: 5px 6px; margin-top: 0; + color: var(--body-fg); + background-color: var(--body-bg); } -input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, -input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus, -textarea:focus, select:focus, .vTextField:focus { - border-color: #999; +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, +input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, +input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { + border-color: var(--body-quiet-color); } select { - height: 30px; + height: 1.875rem; } select[multiple] { @@ -424,12 +527,13 @@ select[multiple] { /* FORM BUTTONS */ .button, input[type=submit], input[type=button], .submit-row input, a.button { - background: #79aec8; + background: var(--button-bg); padding: 10px 15px; border: none; border-radius: 4px; - color: #fff; + color: var(--button-fg); cursor: pointer; + transition: background 0.15s; } a.button { @@ -439,7 +543,7 @@ a.button { .button:active, input[type=submit]:active, input[type=button]:active, .button:focus, input[type=submit]:focus, input[type=button]:focus, .button:hover, input[type=submit]:hover, input[type=button]:hover { - background: #609ab6; + background: var(--button-hover-bg); } .button[disabled], input[type=submit][disabled], input[type=button][disabled] { @@ -447,16 +551,15 @@ a.button { } .button.default, input[type=submit].default, .submit-row input.default { - float: right; border: none; font-weight: 400; - background: #417690; + background: var(--default-button-bg); } .button.default:active, input[type=submit].default:active, .button.default:focus, input[type=submit].default:focus, .button.default:hover, input[type=submit].default:hover { - background: #205067; + background: var(--default-button-hover-bg); } .button[disabled].default, @@ -471,7 +574,7 @@ input[type=button][disabled].default { .module { border: none; margin-bottom: 30px; - background: #fff; + background: var(--body-bg); } .module p, .module ul, .module h3, .module h4, .module dl, .module pre { @@ -495,15 +598,15 @@ input[type=button][disabled].default { margin: 0; padding: 8px; font-weight: 400; - font-size: 13px; + font-size: 0.8125rem; text-align: left; - background: #79aec8; - color: #fff; + background: var(--header-bg); + color: var(--header-link-color); } .module caption, .inline-group h2 { - font-size: 12px; + font-size: 0.75rem; letter-spacing: 0.5px; text-transform: uppercase; } @@ -522,48 +625,51 @@ ul.messagelist { ul.messagelist li { display: block; font-weight: 400; - font-size: 13px; + font-size: 0.8125rem; padding: 10px 10px 10px 65px; margin: 0 0 10px 0; - background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat; + background: var(--message-success-bg) url(../img/icon-yes.svg) 40px 12px no-repeat; background-size: 16px auto; - color: #333; + color: var(--body-fg); + word-break: break-word; } ul.messagelist li.warning { - background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat; + background: var(--message-warning-bg) url(../img/icon-alert.svg) 40px 14px no-repeat; background-size: 14px auto; } ul.messagelist li.error { - background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat; + background: var(--message-error-bg) url(../img/icon-no.svg) 40px 12px no-repeat; background-size: 16px auto; } .errornote { - font-size: 14px; + font-size: 0.875rem; font-weight: 700; display: block; padding: 10px 12px; margin: 0 0 10px 0; - color: #ba2121; - border: 1px solid #ba2121; + color: var(--error-fg); + border: 1px solid var(--error-fg); border-radius: 4px; - background-color: #fff; + background-color: var(--body-bg); background-position: 5px 12px; + overflow-wrap: break-word; } ul.errorlist { margin: 0 0 4px; padding: 0; - color: #ba2121; - background: #fff; + color: var(--error-fg); + background: var(--body-bg); } ul.errorlist li { - font-size: 13px; + font-size: 0.8125rem; display: block; margin-bottom: 4px; + overflow-wrap: break-word; } ul.errorlist li:first-child { @@ -587,7 +693,7 @@ td ul.errorlist li { .form-row.errors { margin: 0; border: none; - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--hairline-color); background: none; } @@ -597,31 +703,30 @@ td ul.errorlist li { .errors input, .errors select, .errors textarea, td ul.errorlist + input, td ul.errorlist + select, td ul.errorlist + textarea { - border: 1px solid #ba2121; + border: 1px solid var(--error-fg); } .description { - font-size: 12px; + font-size: 0.75rem; padding: 5px 0 0 12px; } /* BREADCRUMBS */ div.breadcrumbs { - background: #79aec8; + background: var(--breadcrumbs-bg); padding: 10px 40px; border: none; - font-size: 14px; - color: #c4dce8; + color: var(--breadcrumbs-fg); text-align: left; } div.breadcrumbs a { - color: #fff; + color: var(--breadcrumbs-link-fg); } div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: #c4dce8; + color: var(--breadcrumbs-fg); } /* ACTION ICONS */ @@ -631,6 +736,11 @@ div.breadcrumbs a:focus, div.breadcrumbs a:hover { background: url(../img/icon-viewlink.svg) 0 1px no-repeat; } +.hidelink { + padding-left: 16px; + background: url(../img/icon-hidelink.svg) 0 1px no-repeat; +} + .addlink { padding-left: 16px; background: url(../img/icon-addlink.svg) 0 1px no-repeat; @@ -647,38 +757,29 @@ div.breadcrumbs a:focus, div.breadcrumbs a:hover { } a.deletelink:link, a.deletelink:visited { - color: #CC3434; + color: #CC3434; /* XXX Probably unused? */ } a.deletelink:focus, a.deletelink:hover { - color: #993333; + color: #993333; /* XXX Probably unused? */ text-decoration: none; } /* OBJECT TOOLS */ .object-tools { - font-size: 10px; + font-size: 0.625rem; font-weight: bold; padding-left: 0; float: right; position: relative; - margin-top: -48px; -} - -.form-row .object-tools { - margin-top: 5px; - margin-bottom: 5px; - float: none; - height: 2em; - padding-left: 3.5em; } .object-tools li { display: block; float: left; margin-left: 5px; - height: 16px; + height: 1rem; } .object-tools a { @@ -689,29 +790,29 @@ a.deletelink:focus, a.deletelink:hover { display: block; float: left; padding: 3px 12px; - background: #999; + background: var(--object-tools-bg); + color: var(--object-tools-fg); font-weight: 400; - font-size: 11px; + font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.5px; - color: #fff; } .object-tools a:focus, .object-tools a:hover { - background-color: #417690; + background-color: var(--object-tools-hover-bg); } .object-tools a:focus{ text-decoration: none; } -.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink { +.object-tools a.viewsitelink, .object-tools a.addlink { background-repeat: no-repeat; background-position: right 7px center; padding-right: 26px; } -.object-tools a.viewsitelink, .object-tools a.golink { +.object-tools a.viewsitelink { background-image: url(../img/tooltag-arrowright.svg); } @@ -719,16 +820,27 @@ a.deletelink:focus, a.deletelink:hover { background-image: url(../img/tooltag-add.svg); } +.object-tools:has(a.addlink) { + margin-top: -48px; +} + /* OBJECT HISTORY */ -table#change-history { +#change-history table { width: 100%; } -table#change-history tbody th { +#change-history table tbody th { width: 16em; } +#change-history .paginator { + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); + overflow: hidden; +} + /* PAGE STRUCTURE */ #container { @@ -741,10 +853,6 @@ table#change-history tbody th { height: 100%; } -#container > div { - flex-shrink: 0; -} - #container > .main { display: flex; flex: 1 0 auto; @@ -755,6 +863,20 @@ table#change-history tbody th { max-width: 100%; } +.skip-to-content-link { + position: absolute; + top: -999px; + margin: 5px; + padding: 5px; + background: var(--body-bg); + z-index: 1; +} + +.skip-to-content-link:focus { + left: 0px; + top: 0px; +} + #content { padding: 20px 40px; } @@ -775,9 +897,10 @@ table#change-history tbody th { margin-right: -300px; } -#footer { - clear: both; - padding: 10px; +@media (forced-colors: active) { + #content-related { + border: 1px solid; + } } /* COLUMN TYPES */ @@ -813,72 +936,96 @@ table#change-history tbody th { justify-content: space-between; align-items: center; padding: 10px 40px; - background: #417690; - color: #ffc; - overflow: hidden; + background: var(--header-bg); + color: var(--header-color); } -#header a:link, #header a:visited { - color: #fff; +#header a:link, #header a:visited, #logout-form button { + color: var(--header-link-color); } #header a:focus , #header a:hover { text-decoration: underline; } +@media (forced-colors: active) { + #header { + border-bottom: 1px solid; + } +} + #branding { - float: left; + display: flex; } -#branding h1 { +#site-name { padding: 0; - margin: 0 20px 0 0; + margin: 0; + margin-inline-end: 20px; font-weight: 300; - font-size: 24px; - color: #f5dd5d; + font-size: 1.5rem; + color: var(--header-branding-color); } -#branding h1, #branding h1 a:link, #branding h1 a:visited { - color: #f5dd5d; +#site-name a:link, #site-name a:visited { + color: var(--accent); } #branding h2 { padding: 0 10px; - font-size: 14px; + font-size: 0.875rem; margin: -8px 0 8px 0; font-weight: normal; - color: #ffc; + color: var(--header-color); } #branding a:hover { text-decoration: none; } +#logout-form { + display: inline; +} + +#logout-form button { + background: none; + border: 0; + cursor: pointer; + font-family: var(--font-family-primary); +} + #user-tools { float: right; - padding: 0; margin: 0 0 0 20px; + text-align: right; +} + +#user-tools, #logout-form button{ + padding: 0; font-weight: 300; - font-size: 11px; + font-size: 0.6875rem; letter-spacing: 0.5px; text-transform: uppercase; - text-align: right; } -#user-tools a { +#user-tools a, #logout-form button { border-bottom: 1px solid rgba(255, 255, 255, 0.25); } -#user-tools a:focus, #user-tools a:hover { +#user-tools a:focus, #user-tools a:hover, +#logout-form button:active, #logout-form button:hover { text-decoration: none; - border-bottom-color: #79aec8; - color: #79aec8; + border-bottom: 0; +} + +#logout-form button:active, #logout-form button:hover { + margin-bottom: 1px; } /* SIDEBAR */ #content-related { - background: #f8f8f8; + background: var(--darkened-bg); } #content-related .module { @@ -886,14 +1033,13 @@ table#change-history tbody th { } #content-related h3 { - font-size: 14px; - color: #666; + color: var(--body-quiet-color); padding: 0 16px; margin: 0 0 16px; } #content-related h4 { - font-size: 13px; + font-size: 0.8125rem; } #content-related p { @@ -916,40 +1062,40 @@ table#change-history tbody th { background: none; padding: 16px; margin-bottom: 16px; - border-bottom: 1px solid #eaeaea; - font-size: 18px; - color: #333; + border-bottom: 1px solid var(--hairline-color); + font-size: 1.125rem; + color: var(--body-fg); } .delete-confirmation form input[type="submit"] { - background: #ba2121; + background: var(--delete-button-bg); border-radius: 4px; padding: 10px 15px; - color: #fff; + color: var(--button-fg); } .delete-confirmation form input[type="submit"]:active, .delete-confirmation form input[type="submit"]:focus, .delete-confirmation form input[type="submit"]:hover { - background: #a41515; + background: var(--delete-button-hover-bg); } .delete-confirmation form .cancel-link { display: inline-block; vertical-align: middle; - height: 15px; - line-height: 15px; - background: #ddd; + height: 0.9375rem; + line-height: 0.9375rem; border-radius: 4px; padding: 10px 15px; - color: #333; + color: var(--button-fg); + background: var(--close-button-bg); margin: 0 0 0 10px; } .delete-confirmation form .cancel-link:active, .delete-confirmation form .cancel-link:focus, .delete-confirmation form .cancel-link:hover { - background: #ccc; + background: var(--close-button-hover-bg); } /* POPUP */ @@ -964,3 +1110,74 @@ table#change-history tbody th { .popup #header { padding: 10px 20px; } + +/* PAGINATOR */ + +.paginator { + display: flex; + align-items: center; + gap: 4px; + font-size: 0.8125rem; + padding-top: 10px; + padding-bottom: 10px; + line-height: 22px; + margin: 0; + border-top: 1px solid var(--hairline-color); + width: 100%; + box-sizing: border-box; +} + +.paginator a:link, .paginator a:visited { + padding: 2px 6px; + background: var(--button-bg); + text-decoration: none; + color: var(--button-fg); +} + +.paginator a.showall { + border: none; + background: none; + color: var(--link-fg); +} + +.paginator a.showall:focus, .paginator a.showall:hover { + background: none; + color: var(--link-hover-color); +} + +.paginator .end { + margin-right: 6px; +} + +.paginator .this-page { + padding: 2px 6px; + font-weight: bold; + font-size: 0.8125rem; + vertical-align: top; +} + +.paginator a:focus, .paginator a:hover { + color: white; + background: var(--link-hover-color); +} + +.paginator input { + margin-left: auto; +} + +.base-svgs { + display: none; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} diff --git a/django/contrib/admin/static/admin/css/changelists.css b/django/contrib/admin/static/admin/css/changelists.css index abd2640b4a27..005b7768c8e3 100644 --- a/django/contrib/admin/static/admin/css/changelists.css +++ b/django/contrib/admin/static/admin/css/changelists.css @@ -1,8 +1,14 @@ /* CHANGELISTS */ #changelist { - position: relative; - width: 100%; + display: flex; + align-items: flex-start; + justify-content: space-between; +} + +#changelist .changelist-form-container { + flex: 1 1 auto; + min-width: 0; } #changelist table { @@ -21,7 +27,6 @@ .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { - margin-right: 280px; width: auto; } @@ -30,17 +35,18 @@ } #changelist-form .results { - overflow-x: auto; + overflow-x: auto; + width: 100%; } #changelist .toplinks { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid var(--hairline-color); } #changelist .paginator { - color: #666; - border-bottom: 1px solid #eee; - background: #fff; + color: var(--body-quiet-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--body-bg); overflow: hidden; } @@ -62,77 +68,85 @@ } #changelist table tfoot { - color: #666; + color: var(--body-quiet-color); } /* TOOLBAR */ -#changelist #toolbar { +#toolbar { padding: 8px 10px; margin-bottom: 15px; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - background: #f8f8f8; - color: #666; + border-top: 1px solid var(--hairline-color); + border-bottom: 1px solid var(--hairline-color); + background: var(--darkened-bg); + color: var(--body-quiet-color); } -#changelist #toolbar form input { +#toolbar form input { border-radius: 4px; - font-size: 14px; + font-size: 0.875rem; padding: 5px; - color: #333; + color: var(--body-fg); } -#changelist #toolbar form #searchbar { - height: 19px; - border: 1px solid #ccc; +#toolbar #searchbar { + height: 1.1875rem; + border: 1px solid var(--border-color); padding: 2px 5px; margin: 0; vertical-align: top; - font-size: 13px; + font-size: 0.8125rem; + max-width: 100%; } -#changelist #toolbar form #searchbar:focus { - border-color: #999; +#toolbar #searchbar:focus { + border-color: var(--body-quiet-color); } -#changelist #toolbar form input[type="submit"] { - border: 1px solid #ccc; - font-size: 13px; +#toolbar form input[type="submit"] { + border: 1px solid var(--border-color); + font-size: 0.8125rem; padding: 4px 8px; margin: 0; vertical-align: middle; - background: #fff; + background: var(--body-bg); box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; cursor: pointer; - color: #333; + color: var(--body-fg); } -#changelist #toolbar form input[type="submit"]:focus, -#changelist #toolbar form input[type="submit"]:hover { - border-color: #999; +#toolbar form input[type="submit"]:focus, +#toolbar form input[type="submit"]:hover { + border-color: var(--body-quiet-color); } -#changelist #changelist-search img { +#changelist-search img { vertical-align: middle; margin-right: 4px; } +#changelist-search .help { + word-break: break-word; +} + /* FILTER COLUMN */ #changelist-filter { - position: absolute; - top: 0; - right: 0; - z-index: 1000; - width: 240px; - background: #f8f8f8; + flex: 0 0 240px; + order: 1; + background: var(--darkened-bg); border-left: none; - margin: 0; + margin: 0 0 0 30px; +} + +@media (forced-colors: active) { + #changelist-filter { + border: 1px solid; + } } #changelist-filter h2 { - font-size: 14px; + font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.5px; padding: 5px 15px; @@ -140,17 +154,39 @@ border-bottom: none; } -#changelist-filter h3 { +#changelist-filter h3, +#changelist-filter details summary { font-weight: 400; - font-size: 14px; padding: 0 15px; margin-bottom: 10px; } +#changelist-filter details summary > * { + display: inline; +} + +#changelist-filter details > summary { + list-style-type: none; +} + +#changelist-filter details > summary::-webkit-details-marker { + display: none; +} + +#changelist-filter details > summary::before { + content: '→'; + font-weight: bold; + color: var(--link-hover-color); +} + +#changelist-filter details[open] > summary::before { + content: '↓'; +} + #changelist-filter ul { margin: 5px 0; padding: 0 15px 15px; - border-bottom: 1px solid #eaeaea; + border-bottom: 1px solid var(--hairline-color); } #changelist-filter ul:last-child { @@ -165,108 +201,58 @@ #changelist-filter a { display: block; - color: #999; - text-overflow: ellipsis; - overflow-x: hidden; + color: var(--body-quiet-color); + word-break: break-word; } #changelist-filter li.selected { - border-left: 5px solid #eaeaea; + border-left: 5px solid var(--hairline-color); padding-left: 10px; margin-left: -15px; } #changelist-filter li.selected a { - color: #5b80b2; + color: var(--link-selected-fg); } #changelist-filter a:focus, #changelist-filter a:hover, #changelist-filter li.selected a:focus, #changelist-filter li.selected a:hover { - color: #036; + color: var(--link-hover-color); } -#changelist-filter #changelist-filter-clear a { - font-size: 13px; - padding-bottom: 10px; - border-bottom: 1px solid #eaeaea; +#changelist-filter #changelist-filter-extra-actions { + font-size: 0.8125rem; + margin-bottom: 10px; + border-bottom: 1px solid var(--hairline-color); } /* DATE DRILLDOWN */ -.change-list ul.toplinks { - display: block; - float: left; - padding: 0; - margin: 0; - width: 100%; -} - -.change-list ul.toplinks li { - padding: 3px 6px; +.change-list .toplinks { + display: flex; + padding-bottom: 5px; + flex-wrap: wrap; + gap: 3px 17px; font-weight: bold; - list-style-type: none; - display: inline-block; -} - -.change-list ul.toplinks .date-back a { - color: #999; -} - -.change-list ul.toplinks .date-back a:focus, -.change-list ul.toplinks .date-back a:hover { - color: #036; } -/* PAGINATOR */ - -.paginator { - font-size: 13px; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid #ddd; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: #79aec8; - text-decoration: none; - color: #fff; +.change-list .toplinks a { + font-size: 0.8125rem; } -.paginator a.showall { - border: none; - background: none; - color: #5b80b2; +.change-list .toplinks .date-back { + color: var(--body-quiet-color); } -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: #036; -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 13px; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: #036; +.change-list .toplinks .date-back:focus, +.change-list .toplinks .date-back:hover { + color: var(--link-hover-color); } /* ACTIONS */ .filtered .actions { - margin-right: 280px; border-right: none; } @@ -275,32 +261,41 @@ vertical-align: baseline; } -#changelist table tbody tr.selected { - background-color: #FFFFCC; +/* Once the :has() pseudo-class is supported by all browsers, the tr.selected + selector and the JS adding the class can be removed. */ +#changelist tbody tr.selected { + background-color: var(--selected-row); +} + +#changelist tbody tr:has(.action-select:checked) { + background-color: var(--selected-row); +} + +@media (forced-colors: active) { + #changelist tbody tr.selected { + background-color: SelectedItem; + } + #changelist tbody tr:has(.action-select:checked) { + background-color: SelectedItem; + } } #changelist .actions { padding: 10px; - background: #fff; + background: var(--body-bg); border-top: none; border-bottom: none; - line-height: 24px; - color: #999; -} - -#changelist .actions.selected { - background: #fffccf; - border-top: 1px solid #fffee8; - border-bottom: 1px solid #edecd6; + line-height: 1.5rem; + color: var(--body-quiet-color); + width: 100%; } #changelist .actions span.all, #changelist .actions span.action-counter, #changelist .actions span.clear, #changelist .actions span.question { - font-size: 13px; + font-size: 0.8125rem; margin: 0 0.5em; - display: none; } #changelist .actions:last-child { @@ -309,41 +304,40 @@ #changelist .actions select { vertical-align: top; - height: 24px; - background: none; - color: #000; - border: 1px solid #ccc; + height: 1.5rem; + color: var(--body-fg); + border: 1px solid var(--border-color); border-radius: 4px; - font-size: 14px; + font-size: 0.875rem; padding: 0 0 0 4px; margin: 0; margin-left: 10px; } #changelist .actions select:focus { - border-color: #999; + border-color: var(--body-quiet-color); } #changelist .actions label { display: inline-block; vertical-align: middle; - font-size: 13px; + font-size: 0.8125rem; } #changelist .actions .button { - font-size: 13px; - border: 1px solid #ccc; + font-size: 0.8125rem; + border: 1px solid var(--border-color); border-radius: 4px; - background: #fff; + background: var(--body-bg); box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; cursor: pointer; - height: 24px; + height: 1.5rem; line-height: 1; padding: 4px 8px; margin: 0; - color: #333; + color: var(--body-fg); } #changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: #999; + border-color: var(--body-quiet-color); } diff --git a/django/contrib/admin/static/admin/css/dark_mode.css b/django/contrib/admin/static/admin/css/dark_mode.css new file mode 100644 index 000000000000..65b58d035f9a --- /dev/null +++ b/django/contrib/admin/static/admin/css/dark_mode.css @@ -0,0 +1,130 @@ +@media (prefers-color-scheme: dark) { + :root { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; + } + } + + +html[data-theme="dark"] { + --primary: #264b5d; + --primary-fg: #f7f7f7; + + --body-fg: #eeeeee; + --body-bg: #121212; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; + --body-loud-color: #ffffff; + + --breadcrumbs-link-fg: #e0e0e0; + --breadcrumbs-bg: var(--primary); + + --link-fg: #81d4fa; + --link-hover-color: #4ac1f7; + --link-selected-fg: #6f94c6; + + --hairline-color: #272727; + --border-color: #353535; + + --error-fg: #e35f5f; + --message-success-bg: #006b1b; + --message-warning-bg: #583305; + --message-error-bg: #570808; + + --darkened-bg: #212121; + --selected-bg: #1b1b1b; + --selected-row: #00363a; + + --close-button-bg: #333333; + --close-button-hover-bg: #666666; + + color-scheme: dark; +} + +/* THEME SWITCH */ +.theme-toggle { + cursor: pointer; + border: none; + padding: 0; + background: transparent; + vertical-align: middle; + margin-inline-start: 5px; + margin-top: -1px; +} + +.theme-toggle svg { + vertical-align: middle; + height: 1.5rem; + width: 1.5rem; + display: none; +} + +/* +Fully hide screen reader text so we only show the one matching the current +theme. +*/ +.theme-toggle .visually-hidden { + display: none; +} + +html[data-theme="auto"] .theme-toggle .theme-label-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle .theme-label-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle .theme-label-when-light { + display: block; +} + +/* ICONS */ +.theme-toggle svg.theme-icon-when-auto, +.theme-toggle svg.theme-icon-when-dark, +.theme-toggle svg.theme-icon-when-light { + fill: var(--header-link-color); + color: var(--header-bg); +} + +html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto { + display: block; +} + +html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { + display: block; +} + +html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { + display: block; +} diff --git a/django/contrib/admin/static/admin/css/dashboard.css b/django/contrib/admin/static/admin/css/dashboard.css index 91d6efde8021..242b81a45f85 100644 --- a/django/contrib/admin/static/admin/css/dashboard.css +++ b/django/contrib/admin/static/admin/css/dashboard.css @@ -1,4 +1,7 @@ /* DASHBOARD */ +.dashboard td, .dashboard th { + word-break: break-word; +} .dashboard .module table th { width: 100%; diff --git a/django/contrib/admin/static/admin/css/fonts.css b/django/contrib/admin/static/admin/css/fonts.css deleted file mode 100644 index c837e017c7f6..000000000000 --- a/django/contrib/admin/static/admin/css/fonts.css +++ /dev/null @@ -1,20 +0,0 @@ -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold-webfont.woff'); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular-webfont.woff'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Light-webfont.woff'); - font-weight: 300; - font-style: normal; -} diff --git a/django/contrib/admin/static/admin/css/forms.css b/django/contrib/admin/static/admin/css/forms.css index 06acd4290d64..c6ce78833e47 100644 --- a/django/contrib/admin/static/admin/css/forms.css +++ b/django/contrib/admin/static/admin/css/forms.css @@ -5,8 +5,8 @@ .form-row { overflow: hidden; padding: 10px; - font-size: 13px; - border-bottom: 1px solid #eee; + font-size: 0.8125rem; + border-bottom: 1px solid var(--hairline-color); } .form-row img, .form-row input { @@ -22,35 +22,45 @@ form .form-row p { padding-left: 0; } -.hidden { - display: none; +.flex-container { + display: flex; +} + +.form-multiline { + flex-wrap: wrap; +} + +.form-multiline > div { + padding-bottom: 10px; } /* FORM LABELS */ label { font-weight: normal; - color: #666; - font-size: 13px; + color: var(--body-quiet-color); + font-size: 0.8125rem; } .required label, label.required { font-weight: bold; - color: #333; } /* RADIO BUTTONS */ -form ul.radiolist li { - list-style-type: none; +form div.radiolist div { + padding-right: 7px; } -form ul.radiolist label { - float: none; - display: inline; +form div.radiolist.inline div { + display: inline-block; +} + +form div.radiolist label { + width: auto; } -form ul.radiolist input[type="radio"] { +form div.radiolist input[type="radio"] { margin: -2px 4px 0 0; padding: 0; } @@ -65,29 +75,42 @@ form ul.inline li { padding-right: 7px; } +/* FIELDSETS */ + +fieldset .fieldset-heading, +fieldset .inline-heading, +:not(.inline-related) .collapse summary { + border: 1px solid var(--header-bg); + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + background: var(--header-bg); + color: var(--header-link-color); +} + /* ALIGNED FIELDSETS */ .aligned label { display: block; padding: 4px 10px 0 0; - float: left; + min-width: 160px; width: 160px; word-wrap: break-word; - line-height: 1; } .aligned label:not(.vCheckboxLabel):after { content: ''; display: inline-block; vertical-align: middle; - height: 26px; } -.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { +.aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { padding: 6px 0; margin-top: 0; margin-bottom: 0; - margin-left: 170px; + margin-left: 0; + overflow-wrap: break-word; } .aligned ul label { @@ -109,7 +132,7 @@ form .aligned ul { padding-left: 10px; } -form .aligned ul.radiolist { +form .aligned div.radiolist { display: inline-block; margin: 0; padding: 0; @@ -117,16 +140,17 @@ form .aligned ul.radiolist { form .aligned p.help, form .aligned div.help { - clear: left; margin-top: 0; margin-left: 160px; padding-left: 10px; } -form .aligned label + p.help, -form .aligned label + div.help { +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { margin-left: 0; padding-left: 0; + font-weight: normal; } form .aligned p.help:last-child, @@ -145,6 +169,10 @@ form .aligned select + div.help { padding-left: 10px; } +form .aligned select option:checked { + background-color: var(--selected-row); +} + form .aligned ul li { list-style: none; } @@ -155,11 +183,7 @@ form .aligned table p { } .aligned .vCheckboxLabel { - float: none; - width: auto; - display: inline-block; - vertical-align: -3px; - padding: 0 0 5px 5px; + padding: 1px 0 0 5px; } .aligned .vCheckboxLabel + p.help, @@ -171,14 +195,7 @@ form .aligned table p { width: 610px; } -.checkbox-row p.help, -.checkbox-row div.help { - margin-left: 0; - padding-left: 0; -} - fieldset .fieldBox { - float: left; margin-right: 20px; } @@ -188,15 +205,10 @@ fieldset .fieldBox { width: 200px; } -form .wide p, -form .wide input + p.help, -form .wide input + div.help { - margin-left: 200px; -} - form .wide p.help, +form .wide ul.errorlist, form .wide div.help { - padding-left: 38px; + padding-left: 50px; } form div.help ul { @@ -208,53 +220,36 @@ form div.help ul { width: 450px; } -/* COLLAPSED FIELDSETS */ +/* COLLAPSIBLE FIELDSETS */ -fieldset.collapsed * { - display: none; -} - -fieldset.collapsed h2, fieldset.collapsed { - display: block; -} - -fieldset.collapsed { - border: 1px solid #eee; - border-radius: 4px; - overflow: hidden; -} - -fieldset.collapsed h2 { - background: #f8f8f8; - color: #666; -} - -fieldset .collapse-toggle { - color: #fff; -} - -fieldset.collapsed .collapse-toggle { +.collapse summary .fieldset-heading, +.collapse summary .inline-heading { background: transparent; + border: none; + color: currentColor; display: inline; - color: #447e9b; + margin: 0; + padding: 0; } /* MONOSPACE TEXTAREAS */ fieldset.monospace textarea { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; + font-family: var(--font-family-monospace); } /* SUBMIT ROW */ .submit-row { - padding: 12px 14px; + padding: 12px 14px 12px; margin: 0 0 20px; - background: #f8f8f8; - border: 1px solid #eee; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); border-radius: 4px; - text-align: right; overflow: hidden; + display: flex; + gap: 10px; + flex-wrap: wrap; } body.popup .submit-row { @@ -262,56 +257,54 @@ body.popup .submit-row { } .submit-row input { - height: 35px; - line-height: 15px; - margin: 0 0 0 5px; + height: 2.1875rem; + line-height: 0.9375rem; } -.submit-row input.default { - margin: 0 0 0 8px; - text-transform: uppercase; +.submit-row input, .submit-row a { + margin: 0; } -.submit-row p { - margin: 0.3em; +.submit-row input.default { + text-transform: uppercase; } -.submit-row p.deletelink-box { - float: left; - margin: 0; +.submit-row a.deletelink { + margin-left: auto; } .submit-row a.deletelink { display: block; - background: #ba2121; + background: var(--delete-button-bg); border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - color: #fff; + padding: 0.625rem 0.9375rem; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); } .submit-row a.closelink { display: inline-block; - background: #bbbbbb; + background: var(--close-button-bg); border-radius: 4px; padding: 10px 15px; - height: 15px; - line-height: 15px; - margin: 0 0 0 5px; - color: #fff; + height: 0.9375rem; + line-height: 0.9375rem; + color: var(--button-fg); } .submit-row a.deletelink:focus, .submit-row a.deletelink:hover, .submit-row a.deletelink:active { - background: #a41515; + background: var(--delete-button-hover-bg); + text-decoration: none; } .submit-row a.closelink:focus, .submit-row a.closelink:hover, .submit-row a.closelink:active { - background: #aaaaaa; + background: var(--close-button-hover-bg); + text-decoration: none; } /* CUSTOM FORM FIELDS */ @@ -353,10 +346,6 @@ body.popup .submit-row { width: 2.2em; } -.vTextField, .vUUIDField { - width: 20em; -} - .vIntegerField { width: 5em; } @@ -369,6 +358,10 @@ body.popup .submit-row { width: 5em; } +.vTextField, .vUUIDField { + width: 20em; +} + /* INLINES */ .inline-group { @@ -388,14 +381,16 @@ body.popup .submit-row { position: relative; } -.inline-related h3 { +.inline-related h4, +.inline-related:not(.tabular) .collapse summary { margin: 0; - color: #666; + color: var(--body-medium-color); padding: 5px; - font-size: 13px; - background: #f8f8f8; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; + font-size: 0.8125rem; + background: var(--darkened-bg); + border: 1px solid var(--hairline-color); + border-left-color: var(--darkened-bg); + border-right-color: var(--darkened-bg); } .inline-related h3 span.delete { @@ -404,32 +399,23 @@ body.popup .submit-row { .inline-related h3 span.delete label { margin-left: 2px; - font-size: 11px; + font-size: 0.6875rem; } .inline-related fieldset { margin: 0; - background: #fff; + background: var(--body-bg); border: none; width: 100%; } -.inline-related fieldset.module h3 { - margin: 0; - padding: 2px 5px 3px 5px; - font-size: 11px; - text-align: left; - font-weight: bold; - background: #bcd; - color: #fff; -} - .inline-group .tabular fieldset.module { border: none; } .inline-related.tabular fieldset.module table { width: 100%; + overflow-x: scroll; } .last-related fieldset { @@ -457,42 +443,28 @@ body.popup .submit-row { height: 1.1em; padding: 2px 9px; overflow: hidden; - font-size: 9px; + font-size: 0.5625rem; font-weight: bold; - color: #666; + color: var(--body-quiet-color); _width: 700px; } -.inline-group ul.tools { - padding: 0; - margin: 0; - list-style: none; -} - -.inline-group ul.tools li { - display: inline; - padding: 0 5px; -} - .inline-group div.add-row, .inline-group .tabular tr.add-row td { - color: #666; - background: #f8f8f8; + color: var(--body-quiet-color); + background: var(--darkened-bg); padding: 8px 10px; - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--hairline-color); } .inline-group .tabular tr.add-row td { padding: 8px 10px; - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--hairline-color); } -.inline-group ul.tools a.add, .inline-group div.add-row a, .inline-group .tabular tr.add-row td a { - background: url(../img/icon-addlink.svg) 0 1px no-repeat; - padding-left: 16px; - font-size: 12px; + font-size: 0.75rem; } .empty-form { @@ -510,8 +482,8 @@ body.popup .submit-row { } .related-lookup { - width: 16px; - height: 16px; + width: 1rem; + height: 1rem; background-image: url(../img/search.svg); } diff --git a/django/contrib/admin/static/admin/css/login.css b/django/contrib/admin/static/admin/css/login.css index 062b36e0512a..805a34b5bdde 100644 --- a/django/contrib/admin/static/admin/css/login.css +++ b/django/contrib/admin/static/admin/css/login.css @@ -1,7 +1,7 @@ /* LOGIN FORM */ .login { - background: #f8f8f8; + background: var(--darkened-bg); height: auto; } @@ -12,20 +12,21 @@ } .login #header h1 { - font-size: 18px; + font-size: 1.125rem; + margin: 0; } .login #header h1 a { - color: #fff; + color: var(--header-link-color); } .login #content { - padding: 20px 20px 0; + padding: 20px; } .login #container { - background: #fff; - border: 1px solid #eaeaea; + background: var(--body-bg); + border: 1px solid var(--hairline-color); border-radius: 4px; overflow: hidden; width: 28em; @@ -34,44 +35,25 @@ height: auto; } -.login #content-main { - width: 100%; -} - .login .form-row { padding: 4px 0; - float: left; - width: 100%; - border-bottom: none; } .login .form-row label { - padding-right: 0.5em; + display: block; line-height: 2em; - font-size: 1em; - clear: both; - color: #333; } .login .form-row #id_username, .login .form-row #id_password { - clear: both; padding: 8px; width: 100%; box-sizing: border-box; } -.login span.help { - font-size: 10px; - display: block; -} - .login .submit-row { - clear: both; - padding: 1em 0 0 9.4em; + padding: 1em 0 0 0; margin: 0; - border: none; - background: none; - text-align: left; + text-align: center; } .login .password-reset-link { diff --git a/django/contrib/admin/static/admin/css/nav_sidebar.css b/django/contrib/admin/static/admin/css/nav_sidebar.css index 7d4c75fe12f1..7eb0de97ab27 100644 --- a/django/contrib/admin/static/admin/css/nav_sidebar.css +++ b/django/contrib/admin/static/admin/css/nav_sidebar.css @@ -12,22 +12,23 @@ justify-content: center; flex: 0 0 23px; width: 23px; - border-right: 1px solid #eaeaea; - background-color: #ffffff; + border: 0; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); cursor: pointer; - font-size: 20px; - color: #447e9b; + font-size: 1.25rem; + color: var(--link-fg); padding: 0; } [dir="rtl"] .toggle-nav-sidebar { - border-left: 1px solid #eaeaea; + border-left: 1px solid var(--hairline-color); border-right: 0; } .toggle-nav-sidebar:hover, .toggle-nav-sidebar:focus { - background-color: #f6f6f6; + background-color: var(--darkened-bg); } #nav-sidebar { @@ -36,13 +37,13 @@ left: -276px; margin-left: -276px; border-top: 1px solid transparent; - border-right: 1px solid #eaeaea; - background-color: #ffffff; + border-right: 1px solid var(--hairline-color); + background-color: var(--body-bg); overflow: auto; } [dir="rtl"] #nav-sidebar { - border-left: 1px solid #eaeaea; + border-left: 1px solid var(--hairline-color); border-right: 0; left: 0; margin-left: 0; @@ -58,19 +59,22 @@ content: '\00AB'; } +.main > #nav-sidebar { + visibility: hidden; +} + .main.shifted > #nav-sidebar { - left: 24px; margin-left: 0; + visibility: visible; } [dir="rtl"] .main.shifted > #nav-sidebar { - left: 0; - right: 24px; margin-right: 0; } #nav-sidebar .module th { width: 100%; + overflow-wrap: anywhere; } #nav-sidebar .module th, @@ -78,6 +82,10 @@ padding-left: 16px; } +#nav-sidebar .module td { + white-space: nowrap; +} + [dir="rtl"] #nav-sidebar .module th, [dir="rtl"] #nav-sidebar .module caption { padding-left: 8px; @@ -86,16 +94,57 @@ #nav-sidebar .current-app .section:link, #nav-sidebar .current-app .section:visited { - color: #ffc; + color: var(--header-color); font-weight: bold; } #nav-sidebar .current-model { - background: #ffc; + background: var(--selected-row); +} + +@media (forced-colors: active) { + #nav-sidebar .current-model { + background-color: SelectedItem; + } +} + +.main > #nav-sidebar + .content { + max-width: calc(100% - 23px); +} + +.main.shifted > #nav-sidebar + .content { + max-width: calc(100% - 299px); } @media (max-width: 767px) { #nav-sidebar, #toggle-nav-sidebar { display: none; } + + .main > #nav-sidebar + .content, + .main.shifted > #nav-sidebar + .content { + max-width: 100%; + } +} + +#nav-filter { + width: 100%; + box-sizing: border-box; + padding: 2px 5px; + margin: 5px 0; + border: 1px solid var(--border-color); + background-color: var(--darkened-bg); + color: var(--body-fg); +} + +#nav-filter:focus { + border-color: var(--body-quiet-color); +} + +#nav-filter.no-results { + background: var(--message-error-bg); +} + +#nav-sidebar table { + width: 100%; } diff --git a/django/contrib/admin/static/admin/css/responsive.css b/django/contrib/admin/static/admin/css/responsive.css index e1ce9c27d1fd..f0fcade41c6d 100644 --- a/django/contrib/admin/static/admin/css/responsive.css +++ b/django/contrib/admin/static/admin/css/responsive.css @@ -14,11 +14,11 @@ input[type="submit"], button { td, th { padding: 10px; - font-size: 14px; + font-size: 0.875rem; } .small { - font-size: 12px; + font-size: 0.75rem; } /* Layout */ @@ -28,7 +28,7 @@ input[type="submit"], button { } #content { - padding: 20px 30px 30px; + padding: 15px 20px 20px; } div.breadcrumbs { @@ -43,9 +43,8 @@ input[type="submit"], button { justify-content: flex-start; } - #branding h1 { + #site-name { margin: 0 0 8px; - font-size: 20px; line-height: 1.2; } @@ -88,35 +87,40 @@ input[type="submit"], button { } td .changelink, td .addlink { - font-size: 13px; + font-size: 0.8125rem; } /* Changelist */ - #changelist #toolbar { + #toolbar { border: none; padding: 15px; } #changelist-search > div { display: flex; - flex-wrap: wrap; + flex-wrap: nowrap; max-width: 480px; } #changelist-search label { - line-height: 22px; + line-height: 1.375rem; } - #changelist #toolbar form #searchbar { + #toolbar form #searchbar { flex: 1 0 auto; width: 0; - height: 22px; + height: 1.375rem; margin: 0 10px 0 6px; } + #toolbar form input[type=submit] { + flex: 0 1 auto; + } + #changelist-search .quiet { - width: 100%; + width: 0; + flex: 1 0 auto; margin: 5px 0 0 25px; } @@ -126,16 +130,12 @@ input[type="submit"], button { padding: 15px 0; } - #changelist .actions.selected { - border: none; - } - #changelist .actions label { display: flex; } #changelist .actions select { - background: #fff; + background: var(--body-bg); } #changelist .actions .button { @@ -147,24 +147,21 @@ input[type="submit"], button { #changelist .actions span.clear, #changelist .actions span.question, #changelist .actions span.action-counter { - font-size: 11px; + font-size: 0.6875rem; margin: 0 10px 0 0; } #changelist-filter { - width: 200px; + flex-basis: 200px; } .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered .actions, - .filtered div.xfull { - margin-right: 230px; - } #changelist .paginator { - border-top-color: #eee; + border-top-color: var(--hairline-color); /* XXX Is this used at all? */ } #changelist .results + .paginator { @@ -174,9 +171,14 @@ input[type="submit"], button { /* Forms */ label { - font-size: 14px; + font-size: 1rem; } + /* + Minifiers remove the default (text) "type" attribute from "input" HTML + tags. Add input:not([type]) to make the CSS stylesheet work the same. + */ + .form-row input:not([type]), .form-row input[type=text], .form-row input[type=password], .form-row input[type=email], @@ -189,12 +191,12 @@ input[type="submit"], button { box-sizing: border-box; margin: 0; padding: 6px 8px; - min-height: 36px; - font-size: 14px; + min-height: 2.25rem; + font-size: 1rem; } .form-row select { - height: 36px; + height: 2.25rem; } .form-row select[multiple] { @@ -202,20 +204,14 @@ input[type="submit"], button { min-height: 0; } - fieldset .fieldBox { - float: none; - margin: 0 -10px; - padding: 0 10px; - } - fieldset .fieldBox + .fieldBox { margin-top: 10px; padding-top: 10px; - border-top: 1px solid #eee; + border-top: 1px solid var(--hairline-color); } textarea { - max-width: 518px; + max-width: 100%; max-height: 120px; } @@ -230,24 +226,20 @@ input[type="submit"], button { margin-left: 15px; } - form .aligned ul.radiolist { + form .aligned div.radiolist { margin-left: 2px; } - /* Related widget */ - - .related-widget-wrapper { - float: none; + .submit-row { + padding: 8px; } - .related-widget-wrapper-link + .selector { - max-width: calc(100% - 30px); - margin-right: 15px; + .submit-row a.deletelink { + padding: 10px 7px; } - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 10px; + .button, input[type=submit], input[type=button], .submit-row input, a.button { + padding: 7px; } /* Selector */ @@ -262,12 +254,8 @@ input[type="submit"], button { align-items: center; } - .selector .selector-filter label { - margin: 0 8px 0 0; - } - .selector .selector-filter input { - width: auto; + width: 100%; min-height: 0; flex: 1 1; } @@ -285,30 +273,7 @@ input[type="submit"], button { margin-bottom: 5px; } - .selector ul.selector-chooser { - width: 26px; - height: 52px; - padding: 2px 0; - margin: auto 15px; - border-radius: 20px; - transform: translateY(-10px); - } - - .selector-add, .selector-remove { - width: 20px; - height: 20px; - background-size: 20px auto; - } - - .selector-add { - background-position: 0 -120px; - } - - .selector-remove { - background-position: 0 -80px; - } - - a.selector-chooseall, a.selector-clearall { + .selector-chooseall, .selector-clearall { align-self: center; } @@ -330,10 +295,7 @@ input[type="submit"], button { } .stacked ul.selector-chooser { - width: 52px; - height: 26px; padding: 0 2px; - margin: 15px auto; transform: none; } @@ -341,67 +303,27 @@ input[type="submit"], button { padding: 3px; } - .stacked .selector-add, .stacked .selector-remove { - background-size: 20px auto; - } - - .stacked .selector-add { - background-position: 0 -40px; - } - - .stacked .active.selector-add { - background-position: 0 -40px; - } - - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -140px; - } - - .stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -60px; - } - - .stacked .selector-remove { - background-position: 0 0; - } - - .stacked .active.selector-remove { - background-position: 0 0; - } - - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -100px; - } - - .stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -20px; - } - .help-tooltip, .selector .help-icon { display: none; } - form .form-row p.datetime { - width: 100%; - } - .datetime input { width: 50%; max-width: 120px; } .datetime span { - font-size: 13px; + font-size: 0.8125rem; } .datetime .timezonewarning { display: block; - font-size: 11px; - color: #999; + font-size: 0.6875rem; + color: var(--body-quiet-color); } .datetimeshortcuts { - color: #ccc; + color: var(--border-color); /* XXX Redundant, .datetime span also sets #ccc */ } .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { @@ -433,7 +355,7 @@ input[type="submit"], button { padding: 15px 20px; } - .login #branding h1 { + .login #site-name { margin: 0; } @@ -465,14 +387,10 @@ input[type="submit"], button { @media (max-width: 767px) { /* Layout */ - #header, #content, #footer { + #header, #content { padding: 15px; } - #footer:empty { - padding: 0; - } - div.breadcrumbs { padding: 10px 15px; } @@ -494,31 +412,22 @@ input[type="submit"], button { #content-related .module h2 { padding: 10px 15px; - font-size: 16px; + font-size: 1rem; } /* Changelist */ #changelist { - display: flex; + align-items: stretch; flex-direction: column; } - #changelist #toolbar { - order: 1; + #toolbar { padding: 10px; } - #changelist .xfull { - order: 2; - } - - #changelist-form { - order: 3; - } - #changelist-filter { - order: 4; + margin-left: 0; } #changelist .actions label { @@ -534,11 +443,6 @@ input[type="submit"], button { flex: 1 0 100%; } - .change-list .filtered .results, .change-list .filtered .paginator, - .filtered #toolbar, .filtered .actions, .filtered div.xfull { - margin-right: 0; - } - #changelist-filter { position: static; width: auto; @@ -569,8 +473,6 @@ input[type="submit"], button { .aligned .form-row, .aligned .form-row > div { - display: flex; - flex-wrap: wrap; max-width: 100vw; } @@ -578,6 +480,14 @@ input[type="submit"], button { width: calc(100vw - 30px); } + .flex-container { + flex-flow: column; + } + + .flex-container.checkbox-row { + flex-flow: row; + } + textarea { max-width: none; } @@ -591,12 +501,9 @@ input[type="submit"], button { padding-top: 15px; } - fieldset.collapsed .form-row { - display: none; - } - .aligned label { width: 100%; + min-width: auto; padding: 0 0 10px; } @@ -611,10 +518,6 @@ input[type="submit"], button { max-width: 100%; } - .aligned .checkbox-row { - align-items: center; - } - .aligned .checkbox-row input { flex: 0 1 auto; margin: 0; @@ -633,8 +536,7 @@ input[type="submit"], button { } .aligned p.file-upload { - margin-left: 0; - font-size: 13px; + font-size: 0.8125rem; } span.clearable-file-input { @@ -642,7 +544,7 @@ input[type="submit"], button { } span.clearable-file-input label { - font-size: 13px; + font-size: 0.8125rem; padding-bottom: 0; } @@ -657,17 +559,19 @@ input[type="submit"], button { padding: 0; } - form .aligned ul { + form .aligned ul, + form .aligned ul.errorlist { margin-left: 0; padding-left: 0; } - form .aligned ul.radiolist { + form .aligned div.radiolist { + margin-top: 5px; margin-right: 15px; margin-bottom: -3px; } - form .aligned ul.radiolist li + li { + form .aligned div.radiolist:not(.inline) div + div { margin-top: 5px; } @@ -681,6 +585,7 @@ input[type="submit"], button { .related-widget-wrapper .selector { order: 1; + flex: 1 0 auto; } .related-widget-wrapper > a { @@ -695,23 +600,14 @@ input[type="submit"], button { align-self: center; } - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 15px; - } - /* Selector */ .selector { flex-direction: column; - } - - .selector > * { - float: none; + gap: 10px 0; } .selector-available, .selector-chosen { - margin-bottom: 0; flex: 1 1 auto; } @@ -720,12 +616,10 @@ input[type="submit"], button { } .selector ul.selector-chooser { - display: block; - float: none; - width: 52px; - height: 26px; + display: flex; + width: 60px; + height: 30px; padding: 0 2px; - margin: 15px auto 20px; transform: none; } @@ -737,22 +631,22 @@ input[type="submit"], button { background-position: 0 0; } - .active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -20px; + :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; } .selector-add { - background-position: 0 -40px; + background-position: 0 -48px; } - .active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -60px; + :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; } /* Inlines */ .inline-group[data-inline-type="stacked"] .inline-related { - border: 2px solid #eee; + border: 1px solid var(--hairline-color); border-radius: 4px; margin-top: 15px; overflow: auto; @@ -762,18 +656,19 @@ input[type="submit"], button { box-sizing: border-box; } - .inline-group[data-inline-type="stacked"] .inline-related + .inline-related { - margin-top: 30px; - } - .inline-group[data-inline-type="stacked"] .inline-related .module { padding: 0 10px; } - .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:last-child { + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row { + border-top: 1px solid var(--hairline-color); border-bottom: none; } + .inline-group[data-inline-type="stacked"] .inline-related .module .form-row:first-child { + border-top: none; + } + .inline-group[data-inline-type="stacked"] .inline-related h3 { padding: 10px; border-top-width: 0; @@ -803,7 +698,7 @@ input[type="submit"], button { .inline-group[data-inline-type="stacked"] div.add-row { margin-top: 15px; - border: 1px solid #eee; + border: 1px solid var(--hairline-color); border-radius: 4px; } @@ -822,28 +717,23 @@ input[type="submit"], button { /* Submit row */ .submit-row { - padding: 10px 10px 0; + padding: 10px; margin: 0 0 15px; - display: flex; flex-direction: column; + gap: 8px; } - .submit-row > * { - width: 100%; - } - - .submit-row input, .submit-row input.default, .submit-row a, .submit-row a.closelink { - float: none; - margin: 0 0 10px; + .submit-row input, .submit-row input.default, .submit-row a { text-align: center; } .submit-row a.closelink { padding: 10px 0; + text-align: center; } - .submit-row p.deletelink-box { - order: 4; + .submit-row a.deletelink { + margin: 0; } /* Messages */ @@ -897,9 +787,7 @@ input[type="submit"], button { } .login .form-row label { - display: block; margin: 0 0 5px; - padding: 0; line-height: 1.2; } @@ -907,7 +795,7 @@ input[type="submit"], button { padding: 15px 0 0; } - .login br, .login .submit-row label { + .login br { display: none; } @@ -919,7 +807,7 @@ input[type="submit"], button { .errornote { margin: 0 0 20px; padding: 8px 12px; - font-size: 13px; + font-size: 0.8125rem; } /* Calendar and clock */ @@ -966,8 +854,8 @@ input[type="submit"], button { .calendar-shortcuts { padding: 10px 0; - font-size: 12px; - line-height: 12px; + font-size: 0.75rem; + line-height: 0.75rem; } .calendar-shortcuts a { @@ -975,7 +863,7 @@ input[type="submit"], button { } .timelist a { - background: #fff; + background: var(--body-bg); padding: 4px; } @@ -999,7 +887,7 @@ input[type="submit"], button { /* History */ table#change-history tbody th, table#change-history tbody td { - font-size: 13px; + font-size: 0.8125rem; word-break: break-word; } @@ -1010,7 +898,7 @@ input[type="submit"], button { /* Docs */ table.model tbody th, table.model tbody td { - font-size: 13px; + font-size: 0.8125rem; word-break: break-word; } } diff --git a/django/contrib/admin/static/admin/css/responsive_rtl.css b/django/contrib/admin/static/admin/css/responsive_rtl.css index 66fcc3ca6101..5e8f5c594344 100644 --- a/django/contrib/admin/static/admin/css/responsive_rtl.css +++ b/django/contrib/admin/static/admin/css/responsive_rtl.css @@ -23,28 +23,17 @@ [dir="rtl"] .change-list .filtered .paginator, [dir="rtl"] .filtered #toolbar, [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions { - margin-right: 0; - margin-left: 230px; + [dir="rtl"] .filtered .actions, + [dir="rtl"] #changelist-filter { + margin-left: 0; } - [dir="rtl"] .inline-group ul.tools a.add, [dir="rtl"] .inline-group div.add-row a, [dir="rtl"] .inline-group .tabular tr.add-row td a { padding: 8px 26px 8px 10px; background-position: calc(100% - 8px) 9px; } - [dir="rtl"] .related-widget-wrapper-link + .selector { - margin-right: 0; - margin-left: 15px; - } - - [dir="rtl"] .selector .selector-filter label { - margin-right: 0; - margin-left: 8px; - } - [dir="rtl"] .object-tools li { float: right; } @@ -63,21 +52,38 @@ /* MOBILE */ @media (max-width: 767px) { - [dir="rtl"] .change-list .filtered .results, - [dir="rtl"] .change-list .filtered .paginator, - [dir="rtl"] .filtered #toolbar, - [dir="rtl"] .filtered div.xfull, - [dir="rtl"] .filtered .actions { - margin-left: 0; - } - [dir="rtl"] .aligned .related-lookup, [dir="rtl"] .aligned .datetimeshortcuts { margin-left: 0; margin-right: 15px; } - [dir="rtl"] .aligned ul { + [dir="rtl"] .aligned ul, + [dir="rtl"] form .aligned ul.errorlist { margin-right: 0; } + + [dir="rtl"] #changelist-filter { + margin-left: 0; + margin-right: 0; + } + [dir="rtl"] .aligned .vCheckboxLabel { + padding: 1px 5px 0 0; + } + + [dir="rtl"] .selector-remove { + background-position: 0 0; + } + + [dir="rtl"] :enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -24px; + } + + [dir="rtl"] .selector-add { + background-position: 0 -48px; + } + + [dir="rtl"] :enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -72px; + } } diff --git a/django/contrib/admin/static/admin/css/rtl.css b/django/contrib/admin/static/admin/css/rtl.css index f4916d32822c..a2556d0478d3 100644 --- a/django/contrib/admin/static/admin/css/rtl.css +++ b/django/contrib/admin/static/admin/css/rtl.css @@ -1,25 +1,3 @@ -body { - direction: rtl; -} - -/* LOGIN */ - -.login .form-row { - float: right; -} - -.login .form-row label { - float: right; - padding-left: 0.5em; - padding-right: 0; - text-align: left; -} - -.login .submit-row { - clear: both; - padding: 1em 9.4em 0 0; -} - /* GLOBAL */ th { @@ -35,7 +13,7 @@ th { margin-right: 1.5em; } -.viewlink, .addlink, .changelink { +.viewlink, .addlink, .changelink, .hidelink { padding-left: 0; padding-right: 16px; background-position: 100% 1px; @@ -109,53 +87,45 @@ thead th.sorted .text { } #changelist-filter { - right: auto; - left: 0; border-left: none; border-right: none; -} - -.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { - margin-right: 0; - margin-left: 280px; + margin-left: 0; + margin-right: 30px; } #changelist-filter li.selected { border-left: none; padding-left: 10px; margin-left: 0; - border-right: 5px solid #eaeaea; + border-right: 5px solid var(--hairline-color); padding-right: 10px; margin-right: -15px; } -.filtered .actions { - margin-left: 280px; - margin-right: 0; -} - #changelist table tbody td:first-child, #changelist table tbody th:first-child { border-right: none; border-left: none; } -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; - float: right; +.paginator .end { + margin-left: 6px; + margin-right: 0; } -.submit-row { - text-align: left +.paginator input { + margin-left: 0; + margin-right: auto; } -.submit-row p.deletelink-box { - float: right; +/* FORMS */ + +.aligned label { + padding: 0 0 3px 1em; } -.submit-row input.default { +.submit-row a.deletelink { margin-left: 0; + margin-right: auto; } .vDateField, .vTimeField { @@ -166,13 +136,11 @@ thead th.sorted .text { margin-left: 5px; } -form .aligned p.help, form .aligned div.help { - clear: right; -} - form .aligned ul { margin-right: 163px; + padding-right: 10px; margin-left: 0; + padding-left: 0; } form ul.inline li { @@ -181,12 +149,34 @@ form ul.inline li { padding-left: 7px; } -input[type=submit].default, .submit-row input.default { - float: left; +form .aligned p.help, +form .aligned div.help { + margin-left: 0; + margin-right: 160px; + padding-right: 10px; +} + +form div.help ul, +form .aligned .checkbox-row + .help, +form .aligned p.date div.help.timezonewarning, +form .aligned p.datetime div.help.timezonewarning, +form .aligned p.time div.help.timezonewarning { + margin-right: 0; + padding-right: 0; +} + +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { + padding-left: 0; + padding-right: 50px; +} + +.submit-row { + text-align: right; } fieldset .fieldBox { - float: right; margin-left: 20px; margin-right: 0; } @@ -207,12 +197,14 @@ fieldset .fieldBox { top: 0; left: auto; right: 10px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; } .calendarnav-next { top: 0; right: auto; left: 10px; + background: url(../img/calendar-icons.svg) 0 0 no-repeat; } .calendar caption, .calendarbox h2 { @@ -227,6 +219,40 @@ fieldset .fieldBox { text-align: right; } +.selector-add { + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -120px; +} + +.selector-remove { + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; +} + +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -168px; +} + +.selector-chooseall { + background: url(../img/selector-icons.svg) right -128px no-repeat; +} + +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { + background-position: 100% -144px; +} + +.selector-clearall { + background: url(../img/selector-icons.svg) 0 -160px no-repeat; +} + +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { + background-position: 0 -176px; +} + .inline-deletelink { float: left; } @@ -257,3 +283,11 @@ form .form-row p.datetime { margin-left: inherit; margin-right: 2px; } + +.inline-group .tabular td.original p { + right: 0; +} + +.selector .selector-chooser { + margin: 0; +} diff --git a/django/contrib/admin/static/admin/css/unusable_password_field.css b/django/contrib/admin/static/admin/css/unusable_password_field.css new file mode 100644 index 000000000000..d46eb0384cfa --- /dev/null +++ b/django/contrib/admin/static/admin/css/unusable_password_field.css @@ -0,0 +1,19 @@ +/* Hide warnings fields if usable password is selected */ +form:has(#id_usable_password input[value="true"]:checked) .messagelist { + display: none; +} + +/* Hide password fields if unusable password is selected */ +form:has(#id_usable_password input[value="false"]:checked) .field-password1, +form:has(#id_usable_password input[value="false"]:checked) .field-password2 { + display: none; +} + +/* Select appropriate submit button */ +form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { + display: none; +} + +form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { + display: none; +} diff --git a/django/contrib/admin/static/admin/css/widgets.css b/django/contrib/admin/static/admin/css/widgets.css index 14ef12db94ce..eb555c8baa02 100644 --- a/django/contrib/admin/static/admin/css/widgets.css +++ b/django/contrib/admin/static/admin/css/widgets.css @@ -1,50 +1,74 @@ /* SELECTOR (FILTER INTERFACE) */ .selector { - width: 800px; - float: left; + display: flex; + flex: 1; + gap: 0 10px; } .selector select { - width: 380px; height: 17.2em; + flex: 1 0 auto; + overflow: scroll; + width: 100%; } .selector-available, .selector-chosen { - float: left; - width: 380px; - text-align: center; - margin-bottom: 5px; + display: flex; + flex-direction: column; + flex: 1 1; +} + +.selector-available-title, .selector-chosen-title { + border: 1px solid var(--border-color); + border-radius: 4px 4px 0 0; +} + +.selector .helptext { + font-size: 0.6875rem; } -.selector-chosen select { +.selector-chosen .list-footer-display { + border: 1px solid var(--border-color); border-top: none; + border-radius: 0 0 4px 4px; + margin: 0 0 10px; + padding: 8px; + text-align: center; + background: var(--primary); + color: var(--header-link-color); + cursor: pointer; +} +.selector-chosen .list-footer-display__clear { + color: var(--breadcrumbs-fg); } -.selector-available h2, .selector-chosen h2 { - border: 1px solid #ccc; - border-radius: 4px 4px 0 0; +.selector-chosen-title { + background: var(--secondary); + color: var(--header-link-color); + padding: 8px; } -.selector-chosen h2 { - background: #79aec8; - color: #fff; +.selector-chosen-title label { + color: var(--header-link-color); } -.selector .selector-available h2 { - background: #f8f8f8; - color: #666; +.selector-available-title { + background: var(--darkened-bg); + color: var(--body-quiet-color); + padding: 8px; } .selector .selector-filter { - background: white; - border: 1px solid #ccc; + border: 1px solid var(--border-color); border-width: 0 1px; padding: 8px; - color: #999; - font-size: 10px; + color: var(--body-quiet-color); + font-size: 0.625rem; margin: 0; text-align: left; + display: flex; + gap: 8px; } .selector .selector-filter label, @@ -56,20 +80,21 @@ padding: 0; overflow: hidden; line-height: 1; + min-width: auto; } -.selector .selector-available input { - width: 320px; - margin-left: 8px; +.selector-filter input { + flex-grow: 1; } .selector ul.selector-chooser { - float: left; - width: 22px; - background-color: #eee; + align-self: center; + width: 30px; + background-color: var(--selected-bg); border-radius: 10px; - margin: 10em 5px 0 5px; + margin: 0; padding: 0; + transform: translateY(-17px); } .selector-chooser li { @@ -83,84 +108,97 @@ margin: 0 0 10px; border-radius: 0 0 4px 4px; } +.selector .selector-chosen--with-filtered select { + margin: 0; + border-radius: 0; + height: 14em; +} + +.selector .selector-chosen:not(.selector-chosen--with-filtered) .list-footer-display { + display: none; +} .selector-add, .selector-remove { - width: 16px; - height: 16px; + width: 24px; + height: 24px; display: block; text-indent: -3000px; overflow: hidden; cursor: default; - opacity: 0.3; + opacity: 0.55; + border: none; } -.active.selector-add, .active.selector-remove { +:enabled.selector-add, :enabled.selector-remove { opacity: 1; } -.active.selector-add:hover, .active.selector-remove:hover { +:enabled.selector-add:hover, :enabled.selector-remove:hover { cursor: pointer; } .selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background: url(../img/selector-icons.svg) 0 -144px no-repeat; + background-size: 24px auto; } -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -112px; +:enabled.selector-add:focus, :enabled.selector-add:hover { + background-position: 0 -168px; } .selector-remove { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; + background: url(../img/selector-icons.svg) 0 -96px no-repeat; + background-size: 24px auto; } -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -80px; +:enabled.selector-remove:focus, :enabled.selector-remove:hover { + background-position: 0 -120px; } -a.selector-chooseall, a.selector-clearall { +.selector-chooseall, .selector-clearall { display: inline-block; height: 16px; text-align: left; - margin: 1px auto 3px; + margin: 0 auto; overflow: hidden; font-weight: bold; line-height: 16px; - color: #666; + color: var(--body-quiet-color); text-decoration: none; - opacity: 0.3; + opacity: 0.55; + border: none; } -a.active.selector-chooseall:focus, a.active.selector-clearall:focus, -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - color: #447e9b; +:enabled.selector-chooseall:focus, :enabled.selector-clearall:focus, +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { + color: var(--link-fg); } -a.active.selector-chooseall, a.active.selector-clearall { +:enabled.selector-chooseall, :enabled.selector-clearall { opacity: 1; } -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { +:enabled.selector-chooseall:hover, :enabled.selector-clearall:hover { cursor: pointer; } -a.selector-chooseall { +.selector-chooseall { padding: 0 18px 0 0; background: url(../img/selector-icons.svg) right -160px no-repeat; cursor: default; } -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { +:enabled.selector-chooseall:focus, :enabled.selector-chooseall:hover { background-position: 100% -176px; } -a.selector-clearall { +.selector-clearall { padding: 0 0 0 18px; background: url(../img/selector-icons.svg) 0 -128px no-repeat; cursor: default; } -a.active.selector-clearall:focus, a.active.selector-clearall:hover { +:enabled.selector-clearall:focus, :enabled.selector-clearall:hover { background-position: 0 -144px; } @@ -169,6 +207,7 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover { .stacked { float: left; width: 490px; + display: block; } .stacked select { @@ -189,11 +228,13 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover { } .stacked ul.selector-chooser { - height: 22px; - width: 50px; + display: flex; + height: 30px; + width: 64px; margin: 0 0 10px 40%; background-color: #eee; border-radius: 10px; + transform: none; } .stacked .selector-chooser li { @@ -206,32 +247,34 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover { } .stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -32px no-repeat; + background: url(../img/selector-icons.svg) 0 -48px no-repeat; + background-size: 24px auto; cursor: default; } -.stacked .active.selector-add { - background-position: 0 -32px; +.stacked :enabled.selector-add { + background-position: 0 -48px; cursor: pointer; } -.stacked .active.selector-add:focus, .stacked .active.selector-add:hover { - background-position: 0 -48px; +.stacked :enabled.selector-add:focus, .stacked :enabled.selector-add:hover { + background-position: 0 -72px; cursor: pointer; } .stacked .selector-remove { background: url(../img/selector-icons.svg) 0 0 no-repeat; + background-size: 24px auto; cursor: default; } -.stacked .active.selector-remove { +.stacked :enabled.selector-remove { background-position: 0 0px; cursor: pointer; } -.stacked .active.selector-remove:focus, .stacked .active.selector-remove:hover { - background-position: 0 -16px; +.stacked :enabled.selector-remove:focus, .stacked :enabled.selector-remove:hover { + background-position: 0 -24px; cursor: pointer; } @@ -251,8 +294,8 @@ a.active.selector-clearall:focus, a.active.selector-clearall:hover { .selector .search-label-icon { background: url(../img/search.svg) 0 0 no-repeat; display: inline-block; - height: 18px; - width: 18px; + height: 1.125rem; + width: 1.125rem; } /* DATE AND TIME */ @@ -261,15 +304,15 @@ p.datetime { line-height: 20px; margin: 0; padding: 0; - color: #666; + color: var(--body-quiet-color); font-weight: bold; } .datetime span { white-space: nowrap; font-weight: normal; - font-size: 11px; - color: #ccc; + font-size: 0.6875rem; + color: var(--body-quiet-color); } .datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { @@ -278,7 +321,7 @@ p.datetime { } table p.datetime { - font-size: 11px; + font-size: 0.6875rem; margin-left: 0; padding-left: 0; } @@ -287,33 +330,35 @@ table p.datetime { position: relative; display: inline-block; vertical-align: middle; - height: 16px; - width: 16px; + height: 24px; + width: 24px; overflow: hidden; } .datetimeshortcuts .clock-icon { background: url(../img/icon-clock.svg) 0 0 no-repeat; + background-size: 24px auto; } .datetimeshortcuts a:focus .clock-icon, .datetimeshortcuts a:hover .clock-icon { - background-position: 0 -16px; + background-position: 0 -24px; } .datetimeshortcuts .date-icon { background: url(../img/icon-calendar.svg) 0 0 no-repeat; + background-size: 24px auto; top: -1px; } .datetimeshortcuts a:focus .date-icon, .datetimeshortcuts a:hover .date-icon { - background-position: 0 -16px; + background-position: 0 -24px; } .timezonewarning { - font-size: 11px; - color: #999; + font-size: 0.6875rem; + color: var(--body-quiet-color); } /* URL */ @@ -322,8 +367,8 @@ p.url { line-height: 20px; margin: 0; padding: 0; - color: #666; - font-size: 11px; + color: var(--body-quiet-color); + font-size: 0.6875rem; font-weight: bold; } @@ -337,15 +382,11 @@ p.file-upload { line-height: 20px; margin: 0; padding: 0; - color: #666; - font-size: 11px; + color: var(--body-quiet-color); + font-size: 0.6875rem; font-weight: bold; } -.aligned p.file-upload { - margin-left: 170px; -} - .file-upload a { font-weight: normal; } @@ -355,8 +396,8 @@ p.file-upload { } span.clearable-file-input label { - color: #333; - font-size: 11px; + color: var(--body-fg); + font-size: 0.6875rem; display: inline; float: none; } @@ -365,11 +406,12 @@ span.clearable-file-input label { .calendarbox, .clockbox { margin: 5px auto; - font-size: 12px; + font-size: 0.75rem; width: 19em; text-align: center; - background: white; - border: 1px solid #ddd; + background: var(--body-bg); + color: var(--body-fg); + border: 1px solid var(--hairline-color); border-radius: 4px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); overflow: hidden; @@ -397,38 +439,38 @@ span.clearable-file-input label { margin: 0; text-align: center; border-top: none; - background: #f5dd5d; font-weight: 700; - font-size: 12px; + font-size: 0.75rem; color: #333; + background: var(--accent); } .calendar th { padding: 8px 5px; - background: #f8f8f8; - border-bottom: 1px solid #ddd; + background: var(--darkened-bg); + border-bottom: 1px solid var(--border-color); font-weight: 400; - font-size: 12px; + font-size: 0.75rem; text-align: center; - color: #666; + color: var(--body-quiet-color); } .calendar td { font-weight: 400; - font-size: 12px; + font-size: 0.75rem; text-align: center; padding: 0; - border-top: 1px solid #eee; + border-top: 1px solid var(--hairline-color); border-bottom: none; } .calendar td.selected a { - background: #79aec8; - color: #fff; + background: var(--secondary); + color: var(--button-fg); } .calendar td.nonday { - background: #f8f8f8; + background: var(--darkened-bg); } .calendar td.today a { @@ -440,22 +482,22 @@ span.clearable-file-input label { font-weight: 400; padding: 6px; text-decoration: none; - color: #444; + color: var(--body-quiet-color); } .calendar td a:focus, .timelist a:focus, .calendar td a:hover, .timelist a:hover { - background: #79aec8; + background: var(--primary); color: white; } .calendar td a:active, .timelist a:active { - background: #417690; + background: var(--header-bg); color: white; } .calendarnav { - font-size: 10px; + font-size: 0.625rem; text-align: center; color: #ccc; margin: 0; @@ -464,16 +506,16 @@ span.clearable-file-input label { .calendarnav a:link, #calendarnav a:visited, #calendarnav a:focus, #calendarnav a:hover { - color: #999; + color: var(--body-quiet-color); } .calendar-shortcuts { - background: white; - font-size: 11px; - line-height: 11px; - border-top: 1px solid #eee; + background: var(--body-bg); + color: var(--body-quiet-color); + font-size: 0.6875rem; + line-height: 0.6875rem; + border-top: 1px solid var(--hairline-color); padding: 8px 0; - color: #ccc; } .calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { @@ -491,36 +533,26 @@ span.clearable-file-input label { background: url(../img/calendar-icons.svg) 0 0 no-repeat; } -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -15px; -} - .calendarnav-next { right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -45px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; } .calendar-cancel { margin: 0; padding: 4px 0; - font-size: 12px; - background: #eee; - border-top: 1px solid #ddd; - color: #333; + font-size: 0.75rem; + background: var(--close-button-bg); + border-top: 1px solid var(--border-color); + color: var(--button-fg); } .calendar-cancel:focus, .calendar-cancel:hover { - background: #ddd; + background: var(--close-button-hover-bg); } .calendar-cancel a { - color: black; + color: var(--button-fg); display: block; } @@ -540,9 +572,10 @@ ul.timelist, .timelist li { float: right; text-indent: -9999px; background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 16px; - height: 16px; + width: 1.5rem; + height: 1.5rem; border: 0px none; + margin-bottom: .25rem; } .inline-deletelink:focus, .inline-deletelink:hover { @@ -551,24 +584,25 @@ ul.timelist, .timelist li { /* RELATED WIDGET WRAPPER */ .related-widget-wrapper { - float: left; /* display properly in form rows with multiple fields */ - overflow: hidden; /* clear floated contents */ + display: flex; + gap: 0 10px; + flex-grow: 1; + flex-wrap: wrap; + margin-bottom: 5px; } .related-widget-wrapper-link { - opacity: 0.3; + opacity: .6; + filter: grayscale(1); } .related-widget-wrapper-link:link { - opacity: .8; -} - -.related-widget-wrapper-link:link:focus, -.related-widget-wrapper-link:link:hover { opacity: 1; + filter: grayscale(0); } -select + .related-widget-wrapper-link, -.related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 7px; +/* GIS MAPS */ +.dj_map { + width: 600px; + height: 400px; } diff --git a/django/contrib/admin/static/admin/fonts/LICENSE.txt b/django/contrib/admin/static/admin/fonts/LICENSE.txt deleted file mode 100644 index 75b52484ea47..000000000000 --- a/django/contrib/admin/static/admin/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/django/contrib/admin/static/admin/fonts/README.txt b/django/contrib/admin/static/admin/fonts/README.txt deleted file mode 100644 index b247bef33cc5..000000000000 --- a/django/contrib/admin/static/admin/fonts/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -Roboto webfont source: https://www.google.com/fonts/specimen/Roboto -WOFF files extracted using https://github.com/majodev/google-webfonts-helper -Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff b/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff deleted file mode 100644 index 6e0f56267035..000000000000 Binary files a/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff and /dev/null differ diff --git a/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff b/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff deleted file mode 100644 index b9e99185c830..000000000000 Binary files a/django/contrib/admin/static/admin/fonts/Roboto-Light-webfont.woff and /dev/null differ diff --git a/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff b/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff deleted file mode 100644 index 96c1986f0145..000000000000 Binary files a/django/contrib/admin/static/admin/fonts/Roboto-Regular-webfont.woff and /dev/null differ diff --git a/django/contrib/admin/static/admin/img/README.txt b/django/contrib/admin/static/admin/img/README.txt index 4eb2e492a9be..bf81f35beea0 100644 --- a/django/contrib/admin/static/admin/img/README.txt +++ b/django/contrib/admin/static/admin/img/README.txt @@ -1,4 +1,4 @@ -All icons are taken from Font Awesome (http://fontawesome.io/) project. +All icons are taken from Font Awesome (https://fontawesome.com/) project. The Font Awesome font is licensed under the SIL OFL 1.1: - https://scripts.sil.org/OFL diff --git a/django/contrib/admin/static/admin/img/calendar-icons.svg b/django/contrib/admin/static/admin/img/calendar-icons.svg index dbf21c39d238..04c02741ad30 100644 --- a/django/contrib/admin/static/admin/img/calendar-icons.svg +++ b/django/contrib/admin/static/admin/img/calendar-icons.svg @@ -1,14 +1,63 @@ -<svg width="15" height="60" viewBox="0 0 1792 7168" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <defs> - <g id="previous"> - <path d="M1037 1395l102-102q19-19 19-45t-19-45l-307-307 307-307q19-19 19-45t-19-45l-102-102q-19-19-45-19t-45 19l-454 454q-19 19-19 45t19 45l454 454q19 19 45 19t45-19zm627-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="15" + height="30" + viewBox="0 0 1792 3584" + version="1.1" + id="svg5" + sodipodi:docname="calendar-icons.svg" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview5" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="13.3" + inkscape:cx="15.526316" + inkscape:cy="20.977444" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg5" /> + <defs + id="defs2"> + <g + id="previous"> + <path + d="m 1037,1395 102,-102 q 19,-19 19,-45 0,-26 -19,-45 L 832,896 1139,589 q 19,-19 19,-45 0,-26 -19,-45 L 1037,397 q -19,-19 -45,-19 -26,0 -45,19 L 493,851 q -19,19 -19,45 0,26 19,45 l 454,454 q 19,19 45,19 26,0 45,-19 z m 627,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" + id="path1" /> </g> - <g id="next"> - <path d="M845 1395l454-454q19-19 19-45t-19-45l-454-454q-19-19-45-19t-45 19l-102 102q-19 19-19 45t19 45l307 307-307 307q-19 19-19 45t19 45l102 102q19 19 45 19t45-19zm819-499q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> + <g + id="next"> + <path + d="m 845,1395 454,-454 q 19,-19 19,-45 0,-26 -19,-45 L 845,397 q -19,-19 -45,-19 -26,0 -45,19 L 653,499 q -19,19 -19,45 0,26 19,45 l 307,307 -307,307 q -19,19 -19,45 0,26 19,45 l 102,102 q 19,19 45,19 26,0 45,-19 z m 819,-499 q 0,209 -103,385.5 Q 1458,1458 1281.5,1561 1105,1664 896,1664 687,1664 510.5,1561 334,1458 231,1281.5 128,1105 128,896 128,687 231,510.5 334,334 510.5,231 687,128 896,128 1105,128 1281.5,231 1458,334 1561,510.5 1664,687 1664,896 Z" + id="path2" /> </g> </defs> - <use xlink:href="#previous" x="0" y="0" fill="#333333" /> - <use xlink:href="#previous" x="0" y="1792" fill="#000000" /> - <use xlink:href="#next" x="0" y="3584" fill="#333333" /> - <use xlink:href="#next" x="0" y="5376" fill="#000000" /> + <use + xlink:href="#next" + x="0" + y="5376" + fill="#000000" + id="use5" + transform="translate(0,-3584)" /> + <use + xlink:href="#previous" + x="0" + y="0" + fill="#333333" + id="use2" + style="fill:#000000;fill-opacity:1" /> </svg> diff --git a/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg b/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f3b00b..000000000000 --- a/django/contrib/admin/static/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#EBECE6" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9C9C9" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg b/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fdd708e..000000000000 --- a/django/contrib/admin/static/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="22" viewBox="0 0 847 779" xmlns="http://www.w3.org/2000/svg"><g><path fill="#F1C02A" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120z"/><path fill="#9E9E93" d="M120 1h607c66 0 120 54 120 120v536c0 66-54 120-120 120h-607c-66 0-120-54-120-120v-536c0-66 54-120 120-120zm607 25h-607c-26 0-50 11-67 28-17 18-28 41-28 67v536c0 27 11 50 28 68 17 17 41 27 67 27h607c26 0 49-10 67-27 17-18 28-41 28-68v-536c0-26-11-49-28-67-18-17-41-28-67-28z"/><path stroke="#A9A8A4" stroke-width="20" d="M706 295l-68 281"/><path stroke="#E47474" stroke-width="20" d="M316 648l390-353M141 435l175 213"/><path stroke="#C9A741" stroke-width="20" d="M319 151l-178 284M706 295l-387-144"/><g fill="#040405"><path d="M319 111c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40zM141 395c22 0 40 18 40 40s-18 40-40 40c-23 0-41-18-41-40s18-40 41-40zM316 608c22 0 40 18 40 40 0 23-18 41-40 41s-40-18-40-41c0-22 18-40 40-40zM706 254c22 0 40 18 40 41 0 22-18 40-40 40s-40-18-40-40c0-23 18-41 40-41zM638 536c22 0 40 18 40 40s-18 40-40 40-40-18-40-40 18-40 40-40z"/></g></g></svg> \ No newline at end of file diff --git a/django/contrib/admin/static/admin/img/icon-addlink.svg b/django/contrib/admin/static/admin/img/icon-addlink.svg index e004fb162633..8d5c6a3a9f6c 100644 --- a/django/contrib/admin/static/admin/img/icon-addlink.svg +++ b/django/contrib/admin/static/admin/img/icon-addlink.svg @@ -1,3 +1,3 @@ <svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#70bf2b" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> + <path fill="#5fa225" d="M1600 796v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/> </svg> diff --git a/django/contrib/admin/static/admin/img/icon-changelink.svg b/django/contrib/admin/static/admin/img/icon-changelink.svg index bbb137aa0866..592b093bc3c3 100644 --- a/django/contrib/admin/static/admin/img/icon-changelink.svg +++ b/django/contrib/admin/static/admin/img/icon-changelink.svg @@ -1,3 +1,3 @@ <svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> - <path fill="#efb80b" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/> + <path fill="#b48c08" d="M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z"/> </svg> diff --git a/django/contrib/admin/static/admin/img/icon-hidelink.svg b/django/contrib/admin/static/admin/img/icon-hidelink.svg new file mode 100644 index 000000000000..2a8b404b60fa --- /dev/null +++ b/django/contrib/admin/static/admin/img/icon-hidelink.svg @@ -0,0 +1,3 @@ +<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> + <path fill="#2b70bf" d="m555 1335 78-141q-87-63-136-159t-49-203q0-121 61-225-229 117-381 353 167 258 427 375zm389-759q0-20-14-34t-34-14q-125 0-214.5 89.5T592 832q0 20 14 34t34 14 34-14 14-34q0-86 61-147t147-61q20 0 34-14t14-34zm363-191q0 7-1 9-105 188-315 566t-316 567l-49 89q-10 16-28 16-12 0-134-70-16-10-16-28 0-12 44-87-143-65-263.5-173T20 1029Q0 998 0 960t20-69q153-235 380-371t496-136q89 0 180 17l54-97q10-16 28-16 5 0 18 6t31 15.5 33 18.5 31.5 18.5T1291 358q16 10 16 27zm37 447q0 139-79 253.5T1056 1250l280-502q8 45 8 84zm448 128q0 35-20 69-39 64-109 145-150 172-347.5 267T896 1536l74-132q212-18 392.5-137T1664 960q-115-179-282-294l63-112q95 64 182.5 153T1772 891q20 34 20 69z"/> +</svg> diff --git a/django/contrib/admin/static/admin/img/inline-delete.svg b/django/contrib/admin/static/admin/img/inline-delete.svg index 17d1ad67cdcc..875115056e1f 100644 --- a/django/contrib/admin/static/admin/img/inline-delete.svg +++ b/django/contrib/admin/static/admin/img/inline-delete.svg @@ -1,3 +1,3 @@ -<svg width="16" height="16" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> +<svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"> <path fill="#999999" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/> </svg> diff --git a/django/contrib/admin/static/admin/js/SelectBox.js b/django/contrib/admin/static/admin/js/SelectBox.js index 1927b4cefa0a..3db4ec7fa661 100644 --- a/django/contrib/admin/static/admin/js/SelectBox.js +++ b/django/contrib/admin/static/admin/js/SelectBox.js @@ -13,6 +13,7 @@ redisplay: function(id) { // Repopulate HTML select box from cache const box = document.getElementById(id); + const scroll_value_from_top = box.scrollTop; box.innerHTML = ''; for (const node of SelectBox.cache[id]) { if (node.displayed) { @@ -22,6 +23,7 @@ box.appendChild(new_option); } } + box.scrollTop = scroll_value_from_top; }, filter: function(id, text) { // Redisplay the HTML select box, displaying only the choices containing ALL @@ -31,7 +33,7 @@ node.displayed = 1; const node_text = node.text.toLowerCase(); for (const token of tokens) { - if (node_text.indexOf(token) === -1) { + if (!node_text.includes(token)) { node.displayed = 0; break; // Once the first token isn't found we're done } @@ -39,6 +41,10 @@ } SelectBox.redisplay(id); }, + get_hidden_node_count(id) { + const cache = SelectBox.cache[id] || []; + return cache.filter(node => node.displayed === 0).length; + }, delete_from_cache: function(id, value) { let delete_index = null; const cache = SelectBox.cache[id]; diff --git a/django/contrib/admin/static/admin/js/SelectFilter2.js b/django/contrib/admin/static/admin/js/SelectFilter2.js index 6c709a08c2e5..addb7ec72846 100644 --- a/django/contrib/admin/static/admin/js/SelectFilter2.js +++ b/django/contrib/admin/static/admin/js/SelectFilter2.js @@ -1,4 +1,4 @@ -/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ +/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ /* SelectFilter2 - Turns a multiple-select box into a filter interface. @@ -15,6 +15,7 @@ Requires core.js and SelectBox.js. const from_box = document.getElementById(field_id); from_box.id += '_from'; // change its ID from_box.className = 'filtered'; + from_box.setAttribute('aria-labelledby', field_id + '_from_title'); for (const p of from_box.parentNode.getElementsByTagName('p')) { if (p.classList.contains("info")) { @@ -30,23 +31,23 @@ Requires core.js and SelectBox.js. // <div class="selector"> or <div class="selector stacked"> const selector_div = quickElement('div', from_box.parentNode); + // Make sure the selector div is at the beginning so that the + // add link would be displayed to the right of the widget. + from_box.parentNode.prepend(selector_div); selector_div.className = is_stacked ? 'selector stacked' : 'selector'; // <div class="selector-available"> const selector_available = quickElement('div', selector_div); selector_available.className = 'selector-available'; - const title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); + const selector_available_title = quickElement('div', selector_available); + selector_available_title.id = field_id + '_from_title'; + selector_available_title.className = 'selector-available-title'; + quickElement('label', selector_available_title, interpolate(gettext('Available %s') + ' ', [field_name]), 'for', field_id + '_from'); quickElement( - 'span', title_available, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of available %s. You may choose some by ' + - 'selecting them in the box below and then clicking the ' + - '"Choose" arrow between the two boxes.' - ), - [field_name] - ) + 'p', + selector_available_title, + interpolate(gettext('Choose %s by selecting them and then select the "Choose" arrow button.'), [field_name]), + 'class', 'helptext' ); const filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); @@ -57,7 +58,7 @@ Requires core.js and SelectBox.js. quickElement( 'span', search_filter_label, '', 'class', 'help-tooltip search-label-icon', - 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) + 'aria-label', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) ); filter_p.appendChild(document.createTextNode(' ')); @@ -66,69 +67,131 @@ Requires core.js and SelectBox.js. filter_input.id = field_id + '_input'; selector_available.appendChild(from_box); - const choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); - choose_all.className = 'selector-chooseall'; + const choose_all = quickElement( + 'button', + selector_available, + interpolate(gettext('Choose all %s'), [field_name]), + 'id', field_id + '_add_all', + 'class', 'selector-chooseall' + ); // <ul class="selector-chooser"> const selector_chooser = quickElement('ul', selector_div); selector_chooser.className = 'selector-chooser'; - const add_link = quickElement('a', quickElement('li', selector_chooser), gettext('Choose'), 'title', gettext('Choose'), 'href', '#', 'id', field_id + '_add_link'); - add_link.className = 'selector-add'; - const remove_link = quickElement('a', quickElement('li', selector_chooser), gettext('Remove'), 'title', gettext('Remove'), 'href', '#', 'id', field_id + '_remove_link'); - remove_link.className = 'selector-remove'; + const add_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Choose selected %s'), [field_name]), + 'id', field_id + '_add', + 'class', 'selector-add' + ); + const remove_button = quickElement( + 'button', + quickElement('li', selector_chooser), + interpolate(gettext('Remove selected chosen %s'), [field_name]), + 'id', field_id + '_remove', + 'class', 'selector-remove' + ); // <div class="selector-chosen"> - const selector_chosen = quickElement('div', selector_div); + const selector_chosen = quickElement('div', selector_div, '', 'id', field_id + '_selector_chosen'); selector_chosen.className = 'selector-chosen'; - const title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); + const selector_chosen_title = quickElement('div', selector_chosen); + selector_chosen_title.className = 'selector-chosen-title'; + selector_chosen_title.id = field_id + '_to_title'; + quickElement('label', selector_chosen_title, interpolate(gettext('Chosen %s') + ' ', [field_name]), 'for', field_id + '_to'); + quickElement( + 'p', + selector_chosen_title, + interpolate(gettext('Remove %s by selecting them and then select the "Remove" arrow button.'), [field_name]), + 'class', 'helptext' + ); + + const filter_selected_p = quickElement('p', selector_chosen, '', 'id', field_id + '_filter_selected'); + filter_selected_p.className = 'selector-filter'; + + const search_filter_selected_label = quickElement('label', filter_selected_p, '', 'for', field_id + '_selected_input'); + quickElement( - 'span', title_chosen, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of chosen %s. You may remove some by ' + - 'selecting them in the box below and then clicking the ' + - '"Remove" arrow between the two boxes.' - ), - [field_name] - ) + 'span', search_filter_selected_label, '', + 'class', 'help-tooltip search-label-icon', + 'aria-label', interpolate(gettext("Type into this box to filter down the list of selected %s."), [field_name]) ); - const to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', '', 'size', from_box.size, 'name', from_box.name); - to_box.className = 'filtered'; - const clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_remove_all_link'); - clear_all.className = 'selector-clearall'; + filter_selected_p.appendChild(document.createTextNode(' ')); + + const filter_selected_input = quickElement('input', filter_selected_p, '', 'type', 'text', 'placeholder', gettext("Filter")); + filter_selected_input.id = field_id + '_selected_input'; + + quickElement( + 'select', + selector_chosen, + '', + 'id', field_id + '_to', + 'multiple', '', + 'size', from_box.size, + 'name', from_box.name, + 'aria-labelledby', field_id + '_to_title', + 'class', 'filtered' + ); + const warning_footer = quickElement('div', selector_chosen, '', 'class', 'list-footer-display'); + quickElement('span', warning_footer, '', 'id', field_id + '_list-footer-display-text'); + quickElement('span', warning_footer, ' ' + gettext('(click to clear)'), 'class', 'list-footer-display__clear'); + const clear_all = quickElement( + 'button', + selector_chosen, + interpolate(gettext('Remove all %s'), [field_name]), + 'id', field_id + '_remove_all', + 'class', 'selector-clearall' + ); from_box.name = from_box.name + '_old'; // Set up the JavaScript event handlers for the select box filter interface const move_selection = function(e, elem, move_func, from, to) { - if (elem.classList.contains('active')) { + if (!elem.hasAttribute('disabled')) { move_func(from, to); SelectFilter.refresh_icons(field_id); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); } e.preventDefault(); }; choose_all.addEventListener('click', function(e) { move_selection(e, this, SelectBox.move_all, field_id + '_from', field_id + '_to'); }); - add_link.addEventListener('click', function(e) { + add_button.addEventListener('click', function(e) { move_selection(e, this, SelectBox.move, field_id + '_from', field_id + '_to'); }); - remove_link.addEventListener('click', function(e) { + remove_button.addEventListener('click', function(e) { move_selection(e, this, SelectBox.move, field_id + '_to', field_id + '_from'); }); clear_all.addEventListener('click', function(e) { move_selection(e, this, SelectBox.move_all, field_id + '_to', field_id + '_from'); }); + warning_footer.addEventListener('click', function(e) { + filter_selected_input.value = ''; + SelectBox.filter(field_id + '_to', ''); + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); + }); filter_input.addEventListener('keypress', function(e) { - SelectFilter.filter_key_press(e, field_id); + SelectFilter.filter_key_press(e, field_id, '_from', '_to'); }); filter_input.addEventListener('keyup', function(e) { - SelectFilter.filter_key_up(e, field_id); + SelectFilter.filter_key_up(e, field_id, '_from'); }); filter_input.addEventListener('keydown', function(e) { - SelectFilter.filter_key_down(e, field_id); + SelectFilter.filter_key_down(e, field_id, '_from', '_to'); + }); + filter_selected_input.addEventListener('keypress', function(e) { + SelectFilter.filter_key_press(e, field_id, '_to', '_from'); + }); + filter_selected_input.addEventListener('keyup', function(e) { + SelectFilter.filter_key_up(e, field_id, '_to', '_selected_input'); + }); + filter_selected_input.addEventListener('keydown', function(e) { + SelectFilter.filter_key_down(e, field_id, '_to', '_from'); }); selector_div.addEventListener('change', function(e) { if (e.target.tagName === 'SELECT') { @@ -146,6 +209,7 @@ Requires core.js and SelectBox.js. } }); from_box.closest('form').addEventListener('submit', function() { + SelectBox.filter(field_id + '_to', ''); SelectBox.select_all(field_id + '_to'); }); SelectBox.init(field_id + '_from'); @@ -153,24 +217,6 @@ Requires core.js and SelectBox.js. // Move selected from_box options to to_box SelectBox.move(field_id + '_from', field_id + '_to'); - if (!is_stacked) { - // In horizontal mode, give the same height to the two boxes. - const j_from_box = document.getElementById(field_id + '_from'); - const j_to_box = document.getElementById(field_id + '_to'); - let height = filter_p.offsetHeight + j_from_box.offsetHeight; - - const j_to_box_style = window.getComputedStyle(j_to_box); - if (j_to_box_style.getPropertyValue('box-sizing') === 'border-box') { - // Add the padding and border to the final height. - height += parseInt(j_to_box_style.getPropertyValue('padding-top'), 10) - + parseInt(j_to_box_style.getPropertyValue('padding-bottom'), 10) - + parseInt(j_to_box_style.getPropertyValue('border-top-width'), 10) - + parseInt(j_to_box_style.getPropertyValue('border-bottom-width'), 10); - } - - j_to_box.style.height = height + 'px'; - } - // Initial icon refresh SelectFilter.refresh_icons(field_id); }, @@ -181,48 +227,73 @@ Requires core.js and SelectBox.js. field.required = false; return any_selected; }, + refresh_filtered_warning: function(field_id) { + const count = SelectBox.get_hidden_node_count(field_id + '_to'); + const selector = document.getElementById(field_id + '_selector_chosen'); + const warning = document.getElementById(field_id + '_list-footer-display-text'); + selector.className = selector.className.replace('selector-chosen--with-filtered', ''); + warning.textContent = interpolate(ngettext( + '%s selected option not visible', + '%s selected options not visible', + count + ), [count]); + if(count > 0) { + selector.className += ' selector-chosen--with-filtered'; + } + }, + refresh_filtered_selects: function(field_id) { + SelectBox.filter(field_id + '_from', document.getElementById(field_id + "_input").value); + SelectBox.filter(field_id + '_to', document.getElementById(field_id + "_selected_input").value); + }, refresh_icons: function(field_id) { const from = document.getElementById(field_id + '_from'); const to = document.getElementById(field_id + '_to'); - // Active if at least one item is selected - document.getElementById(field_id + '_add_link').classList.toggle('active', SelectFilter.any_selected(from)); - document.getElementById(field_id + '_remove_link').classList.toggle('active', SelectFilter.any_selected(to)); - // Active if the corresponding box isn't empty - document.getElementById(field_id + '_add_all_link').classList.toggle('active', from.querySelector('option')); - document.getElementById(field_id + '_remove_all_link').classList.toggle('active', to.querySelector('option')); + // Disabled if no items are selected. + document.getElementById(field_id + '_add').disabled = !SelectFilter.any_selected(from); + document.getElementById(field_id + '_remove').disabled = !SelectFilter.any_selected(to); + // Disabled if the corresponding box is empty. + document.getElementById(field_id + '_add_all').disabled = !from.querySelector('option'); + document.getElementById(field_id + '_remove_all').disabled = !to.querySelector('option'); }, - filter_key_press: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); + filter_key_press: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); // don't submit form if user pressed Enter if ((event.which && event.which === 13) || (event.keyCode && event.keyCode === 13)) { - from.selectedIndex = 0; - SelectBox.move(field_id + '_from', field_id + '_to'); - from.selectedIndex = 0; + source_box.selectedIndex = 0; + SelectBox.move(field_id + source, field_id + target); + source_box.selectedIndex = 0; event.preventDefault(); } }, - filter_key_up: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); - const temp = from.selectedIndex; - SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); - from.selectedIndex = temp; + filter_key_up: function(event, field_id, source, filter_input) { + const input = filter_input || '_input'; + const source_box = document.getElementById(field_id + source); + const temp = source_box.selectedIndex; + SelectBox.filter(field_id + source, document.getElementById(field_id + input).value); + source_box.selectedIndex = temp; + SelectFilter.refresh_filtered_warning(field_id); + SelectFilter.refresh_icons(field_id); }, - filter_key_down: function(event, field_id) { - const from = document.getElementById(field_id + '_from'); + filter_key_down: function(event, field_id, source, target) { + const source_box = document.getElementById(field_id + source); + // right key (39) or left key (37) + const direction = source === '_from' ? 39 : 37; // right arrow -- move across - if ((event.which && event.which === 39) || (event.keyCode && event.keyCode === 39)) { - const old_index = from.selectedIndex; - SelectBox.move(field_id + '_from', field_id + '_to'); - from.selectedIndex = (old_index === from.length) ? from.length - 1 : old_index; + if ((event.which && event.which === direction) || (event.keyCode && event.keyCode === direction)) { + const old_index = source_box.selectedIndex; + SelectBox.move(field_id + source, field_id + target); + SelectFilter.refresh_filtered_selects(field_id); + SelectFilter.refresh_filtered_warning(field_id); + source_box.selectedIndex = (old_index === source_box.length) ? source_box.length - 1 : old_index; return; } // down arrow -- wrap around if ((event.which && event.which === 40) || (event.keyCode && event.keyCode === 40)) { - from.selectedIndex = (from.length === from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; + source_box.selectedIndex = (source_box.length === source_box.selectedIndex + 1) ? 0 : source_box.selectedIndex + 1; } // up arrow -- wrap around if ((event.which && event.which === 38) || (event.keyCode && event.keyCode === 38)) { - from.selectedIndex = (from.selectedIndex === 0) ? from.length - 1 : from.selectedIndex - 1; + source_box.selectedIndex = (source_box.selectedIndex === 0) ? source_box.length - 1 : source_box.selectedIndex - 1; } } }; diff --git a/django/contrib/admin/static/admin/js/actions.js b/django/contrib/admin/static/admin/js/actions.js index dae69920b289..04b25e9684ac 100644 --- a/django/contrib/admin/static/admin/js/actions.js +++ b/django/contrib/admin/static/admin/js/actions.js @@ -1,154 +1,204 @@ -/*global gettext, interpolate, ngettext*/ +/*global gettext, interpolate, ngettext, Actions*/ 'use strict'; { - const $ = django.jQuery; - let lastChecked; + function show(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.remove('hidden'); + }); + } - $.fn.actions = function(opts) { - const options = $.extend({}, $.fn.actions.defaults, opts); - const actionCheckboxes = $(this); - let list_editable_changed = false; - const showQuestion = function() { - $(options.acrossClears).hide(); - $(options.acrossQuestions).show(); - $(options.allContainer).hide(); - }, - showClear = function() { - $(options.acrossClears).show(); - $(options.acrossQuestions).hide(); - $(options.actionContainer).toggleClass(options.selectedClass); - $(options.allContainer).show(); - $(options.counterContainer).hide(); - }, - reset = function() { - $(options.acrossClears).hide(); - $(options.acrossQuestions).hide(); - $(options.allContainer).hide(); - $(options.counterContainer).show(); - }, - clearAcross = function() { - reset(); - $(options.acrossInput).val(0); - $(options.actionContainer).removeClass(options.selectedClass); - }, - checker = function(checked) { - if (checked) { - showQuestion(); - } else { - reset(); - } - $(actionCheckboxes).prop("checked", checked) - .parent().parent().toggleClass(options.selectedClass, checked); - }, - updateCounter = function() { - const sel = $(actionCheckboxes).filter(":checked").length; - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = $('.action-counter').data('actionsIcnt'); - $(options.counterContainer).html(interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true)); - $(options.allToggle).prop("checked", function() { - let value; - if (sel === actionCheckboxes.length) { - value = true; - showQuestion(); - } else { - value = false; - clearAcross(); - } - return value; - }); - }; - // Show counter by default - $(options.counterContainer).show(); - // Check state of checkboxes and reinit state if needed - $(this).filter(":checked").each(function(i) { - $(this).parent().parent().toggleClass(options.selectedClass); - updateCounter(); - if ($(options.acrossInput).val() === 1) { - showClear(); - } + function hide(selector) { + document.querySelectorAll(selector).forEach(function(el) { + el.classList.add('hidden'); + }); + } + + function showQuestion(options) { + hide(options.acrossClears); + show(options.acrossQuestions); + hide(options.allContainer); + } + + function showClear(options) { + show(options.acrossClears); + hide(options.acrossQuestions); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + show(options.allContainer); + hide(options.counterContainer); + } + + function reset(options) { + hide(options.acrossClears); + hide(options.acrossQuestions); + hide(options.allContainer); + show(options.counterContainer); + } + + function clearAcross(options) { + reset(options); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 0; }); - $(options.allToggle).show().on('click', function() { - checker($(this).prop("checked")); - updateCounter(); + document.querySelector(options.actionContainer).classList.remove(options.selectedClass); + } + + function checker(actionCheckboxes, options, checked) { + if (checked) { + showQuestion(options); + } else { + reset(options); + } + actionCheckboxes.forEach(function(el) { + el.checked = checked; + el.closest('tr').classList.toggle(options.selectedClass, checked); }); - $("a", options.acrossQuestions).on('click', function(event) { - event.preventDefault(); - $(options.acrossInput).val(1); - showClear(); + } + + function updateCounter(actionCheckboxes, options) { + const sel = Array.from(actionCheckboxes).filter(function(el) { + return el.checked; + }).length; + const counter = document.querySelector(options.counterContainer); + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + const actions_icnt = Number(counter.dataset.actionsIcnt); + counter.textContent = interpolate( + ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { + sel: sel, + cnt: actions_icnt + }, true); + const allToggle = document.getElementById(options.allToggleId); + allToggle.checked = sel === actionCheckboxes.length; + if (allToggle.checked) { + showQuestion(options); + } else { + clearAcross(options); + } + } + + const defaults = { + actionContainer: "div.actions", + counterContainer: "span.action-counter", + allContainer: "div.actions span.all", + acrossInput: "div.actions input.select-across", + acrossQuestions: "div.actions span.question", + acrossClears: "div.actions span.clear", + allToggleId: "action-toggle", + selectedClass: "selected" + }; + + window.Actions = function(actionCheckboxes, options) { + options = Object.assign({}, defaults, options); + let list_editable_changed = false; + let lastChecked = null; + let shiftPressed = false; + + document.addEventListener('keydown', (event) => { + shiftPressed = event.shiftKey; }); - $("a", options.acrossClears).on('click', function(event) { - event.preventDefault(); - $(options.allToggle).prop("checked", false); - clearAcross(); - checker(0); - updateCounter(); + + document.addEventListener('keyup', (event) => { + shiftPressed = event.shiftKey; }); - lastChecked = null; - $(actionCheckboxes).on('click', function(event) { - if (!event) { event = window.event; } - const target = event.target ? event.target : event.srcElement; - if (lastChecked && $.data(lastChecked) !== $.data(target) && event.shiftKey === true) { - let inrange = false; - $(lastChecked).prop("checked", target.checked) - .parent().parent().toggleClass(options.selectedClass, target.checked); - $(actionCheckboxes).each(function() { - if ($.data(this) === $.data(lastChecked) || $.data(this) === $.data(target)) { - inrange = (inrange) ? false : true; - } - if (inrange) { - $(this).prop("checked", target.checked) - .parent().parent().toggleClass(options.selectedClass, target.checked); - } + + document.getElementById(options.allToggleId).addEventListener('click', function(event) { + checker(actionCheckboxes, options, this.checked); + updateCounter(actionCheckboxes, options); + }); + + document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + const acrossInputs = document.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function(acrossInput) { + acrossInput.value = 1; }); - } - $(target).parent().parent().toggleClass(options.selectedClass, target.checked); - lastChecked = target; - updateCounter(); + showClear(options); + }); }); - $('form#changelist-form table#result_list tr').on('change', 'td:gt(0) :input', function() { - list_editable_changed = true; + + document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { + el.addEventListener('click', function(event) { + event.preventDefault(); + document.getElementById(options.allToggleId).checked = false; + clearAcross(options); + checker(actionCheckboxes, options, false); + updateCounter(actionCheckboxes, options); + }); }); - $('form#changelist-form button[name="index"]').on('click', function(event) { - if (list_editable_changed) { - return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + + function affectedCheckboxes(target, withModifier) { + const multiSelect = (lastChecked && withModifier && lastChecked !== target); + if (!multiSelect) { + return [target]; } - }); - $('form#changelist-form input[name="_save"]').on('click', function(event) { - let action_changed = false; - $('select option:selected', options.actionContainer).each(function() { - if ($(this).val()) { - action_changed = true; + const checkboxes = Array.from(actionCheckboxes); + const targetIndex = checkboxes.findIndex(el => el === target); + const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); + const startIndex = Math.min(targetIndex, lastCheckedIndex); + const endIndex = Math.max(targetIndex, lastCheckedIndex); + const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); + return filtered; + }; + + Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { + el.addEventListener('change', function(event) { + const target = event.target; + if (target.classList.contains('action-select')) { + const checkboxes = affectedCheckboxes(target, shiftPressed); + checker(checkboxes, options, target.checked); + updateCounter(actionCheckboxes, options); + lastChecked = target; + } else { + list_editable_changed = true; } }); - if (action_changed) { - if (list_editable_changed) { - return confirm(gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.")); - } else { - return confirm(gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button.")); + }); + + document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { + if (list_editable_changed) { + const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); + if (!confirmed) { + event.preventDefault(); } } }); + + const el = document.querySelector('#changelist-form input[name=_save]'); + // The button does not exist if no fields are editable. + if (el) { + el.addEventListener('click', function(event) { + if (document.querySelector('[name=action]').value) { + const text = list_editable_changed + ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") + : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); + if (!confirm(text)) { + event.preventDefault(); + } + } + }); + } + // Sync counter when navigating to the page, such as through the back + // button. + window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); }; - /* Setup plugin defaults */ - $.fn.actions.defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggle: "#action-toggle", - selectedClass: "selected" - }; - $(document).ready(function() { - const $actionsEls = $('tr input.action-select'); - if ($actionsEls.length > 0) { - $actionsEls.actions(); + + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + function ready(fn) { + if (document.readyState !== 'loading') { + fn(); + } else { + document.addEventListener('DOMContentLoaded', fn); + } + } + + ready(function() { + const actionsEls = document.querySelectorAll('tr input.action-select'); + if (actionsEls.length > 0) { + Actions(actionsEls); } }); } diff --git a/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js b/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js index 28de479763cf..aa1cae9eeb45 100644 --- a/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js +++ b/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js @@ -28,8 +28,7 @@ timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch timezoneOffset: 0, init: function() { - const body = document.getElementsByTagName('body')[0]; - const serverOffset = body.dataset.adminUtcOffset; + const serverOffset = document.body.dataset.adminUtcOffset; if (serverOffset) { const localOffset = new Date().getTimezoneOffset() * -60; DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; @@ -48,8 +47,7 @@ }, // Return the current time while accounting for the server timezone. now: function() { - const body = document.getElementsByTagName('body')[0]; - const serverOffset = body.dataset.adminUtcOffset; + const serverOffset = document.body.dataset.adminUtcOffset; if (serverOffset) { const localNow = new Date(); const localOffset = localNow.getTimezoneOffset() * -60; @@ -92,10 +90,9 @@ } message = interpolate(message, [timezoneOffset]); - const warning = document.createElement('span'); - warning.className = warningClass; + const warning = document.createElement('div'); + warning.classList.add('help', warningClass); warning.textContent = message; - inp.parentNode.appendChild(document.createElement('br')); inp.parentNode.appendChild(warning); }, // Add clock widget to a given field @@ -390,13 +387,7 @@ DateTimeShortcuts.calendars[num].drawNextMonth(); }, handleCalendarCallback: function(num) { - let format = get_format('DATE_INPUT_FORMATS')[0]; - // the format needs to be escaped a little - format = format.replace('\\', '\\\\') - .replace('\r', '\\r') - .replace('\n', '\\n') - .replace('\t', '\\t') - .replace("'", "\\'"); + const format = get_format('DATE_INPUT_FORMATS')[0]; return function(y, m, d) { DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); DateTimeShortcuts.calendarInputs[num].focus(); diff --git a/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js index 8c95df7c1275..5395386087bb 100644 --- a/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js +++ b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js @@ -4,18 +4,43 @@ 'use strict'; { const $ = django.jQuery; + let popupIndex = 0; + const relatedWindows = []; + + function dismissChildPopups() { + relatedWindows.forEach(function(win) { + if(!win.closed) { + win.dismissChildPopups(); + win.close(); + } + }); + } + + function setPopupIndex() { + if(document.getElementsByName("_popup").length > 0) { + const index = window.name.lastIndexOf("__") + 2; + popupIndex = parseInt(window.name.substring(index)); + } else { + popupIndex = 0; + } + } + + function addPopupIndex(name) { + return name + "__" + (popupIndex + 1); + } + + function removePopupIndex(name) { + return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); + } function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = triggeringLink.id.replace(name_regexp, ''); - let href = triggeringLink.href; + const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); + const href = new URL(triggeringLink.href); if (add_popup) { - if (href.indexOf('?') === -1) { - href += '?_popup=1'; - } else { - href += '&_popup=1'; - } + href.searchParams.set('_popup', 1); } const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); + relatedWindows.push(win); win.focus(); return false; } @@ -25,12 +50,17 @@ } function dismissRelatedLookupPopup(win, chosenId) { - const name = win.name; + const name = removePopupIndex(win.name); const elem = document.getElementById(name); if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { elem.value += ',' + chosenId; } else { - document.getElementById(name).value = chosenId; + elem.value = chosenId; + } + $(elem).trigger('change'); + const index = window.relatedWindows.indexOf(win); + if (index > -1) { + window.relatedWindows.splice(index, 1); } win.close(); } @@ -50,19 +80,57 @@ siblings.each(function() { const elm = $(this); elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + elm.removeAttr('aria-disabled'); }); } else { siblings.removeAttr('href'); + siblings.attr('aria-disabled', true); } } + function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { + // After create/edit a model from the options next to the current + // select (+ or :pencil:) update ForeignKey PK of the rest of selects + // in the page. + + const path = win.location.pathname; + // Extract the model from the popup url '.../<model>/add/' or + // '.../<model>/<id>/change/' depending the action (add or change). + const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; + // Select elements with a specific model reference and context of "available-source". + const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); + + selectsRelated.forEach(function(select) { + if (currentSelect === select || skipIds && skipIds.includes(select.id)) { + return; + } + + let option = select.querySelector(`option[value="${objId}"]`); + + if (!option) { + option = new Option(newRepr, newId); + select.options.add(option); + // Update SelectBox cache for related fields. + if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { + SelectBox.add_to_cache(select.id, option); + SelectBox.redisplay(select.id); + } + return; + } + + option.textContent = newRepr; + option.value = newId; + }); + } + function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = win.name; + const name = removePopupIndex(win.name); const elem = document.getElementById(name); if (elem) { const elemName = elem.nodeName.toUpperCase(); if (elemName === 'SELECT') { elem.options[elem.options.length] = new Option(newRepr, newId, true, true); + updateRelatedSelectsOptions(elem, win, null, newRepr, newId); } else if (elemName === 'INPUT') { if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { elem.value += ',' + newId; @@ -74,15 +142,24 @@ $(elem).trigger('change'); } else { const toId = name + "_to"; + const toElem = document.getElementById(toId); const o = new Option(newRepr, newId); SelectBox.add_to_cache(toId, o); SelectBox.redisplay(toId); + if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { + const skipIds = [name + "_from"]; + updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); + } + } + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); } win.close(); } function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = win.name.replace(/^edit_/, ''); + const id = removePopupIndex(win.name.replace(/^edit_/, '')); const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); const selects = $(selectsSelector); selects.find('option').each(function() { @@ -90,18 +167,23 @@ this.textContent = newRepr; this.value = newId; } - }); + }).trigger('change'); + updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); selects.next().find('.select2-selection__rendered').each(function() { // The element can have a clear button as a child. // Use the lastChild to modify only the displayed value. this.lastChild.textContent = newRepr; this.title = newRepr; }); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } win.close(); } function dismissDeleteRelatedObjectPopup(win, objId) { - const id = win.name.replace(/^delete_/, ''); + const id = removePopupIndex(win.name.replace(/^delete_/, '')); const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); const selects = $(selectsSelector); selects.find('option').each(function() { @@ -109,6 +191,10 @@ $(this).remove(); } }).trigger('change'); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } win.close(); } @@ -119,17 +205,23 @@ window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + window.dismissChildPopups = dismissChildPopups; // Kept for backward compatibility window.showAddAnotherPopup = showRelatedObjectPopup; window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + window.addEventListener('unload', function(evt) { + window.dismissChildPopups(); + }); + $(document).ready(function() { + setPopupIndex(); $("a[data-popup-opener]").on('click', function(event) { event.preventDefault(); opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); }); - $('body').on('click', '.related-widget-wrapper-link', function(e) { + $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { e.preventDefault(); if (this.href) { const event = $.Event('django:show-related', {href: this.href}); diff --git a/django/contrib/admin/static/admin/js/autocomplete.js b/django/contrib/admin/static/admin/js/autocomplete.js index c922b303a82a..d3daeab89095 100644 --- a/django/contrib/admin/static/admin/js/autocomplete.js +++ b/django/contrib/admin/static/admin/js/autocomplete.js @@ -1,25 +1,22 @@ 'use strict'; { const $ = django.jQuery; - const init = function($element, options) { - const settings = $.extend({ - ajax: { - data: function(params) { - return { - term: params.term, - page: params.page - }; - } - } - }, options); - $element.select2(settings); - }; - $.fn.djangoAdminSelect2 = function(options) { - const settings = $.extend({}, options); + $.fn.djangoAdminSelect2 = function() { $.each(this, function(i, element) { - const $element = $(element); - init($element, settings); + $(element).select2({ + ajax: { + data: (params) => { + return { + term: params.term, + page: params.page, + app_label: element.dataset.appLabel, + model_name: element.dataset.modelName, + field_name: element.dataset.fieldName + }; + } + } + }); }); return this; }; @@ -30,9 +27,7 @@ $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); }); - $(document).on('formset:added', (function() { - return function(event, $newFormset) { - return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); - }; - })(this)); + document.addEventListener('formset:added', (event) => { + $(event.target).find('.admin-autocomplete').djangoAdminSelect2(); + }); } diff --git a/django/contrib/admin/static/admin/js/calendar.js b/django/contrib/admin/static/admin/js/calendar.js index 64598bbb6fd7..776310f75b53 100644 --- a/django/contrib/admin/static/admin/js/calendar.js +++ b/django/contrib/admin/static/admin/js/calendar.js @@ -21,7 +21,39 @@ depends on core.js for utility functions like removeChildren or quickElement gettext('November'), gettext('December') ], + monthsOfYearAbbrev: [ + pgettext('abbrev. month January', 'Jan'), + pgettext('abbrev. month February', 'Feb'), + pgettext('abbrev. month March', 'Mar'), + pgettext('abbrev. month April', 'Apr'), + pgettext('abbrev. month May', 'May'), + pgettext('abbrev. month June', 'Jun'), + pgettext('abbrev. month July', 'Jul'), + pgettext('abbrev. month August', 'Aug'), + pgettext('abbrev. month September', 'Sep'), + pgettext('abbrev. month October', 'Oct'), + pgettext('abbrev. month November', 'Nov'), + pgettext('abbrev. month December', 'Dec') + ], daysOfWeek: [ + gettext('Sunday'), + gettext('Monday'), + gettext('Tuesday'), + gettext('Wednesday'), + gettext('Thursday'), + gettext('Friday'), + gettext('Saturday') + ], + daysOfWeekAbbrev: [ + pgettext('abbrev. day Sunday', 'Sun'), + pgettext('abbrev. day Monday', 'Mon'), + pgettext('abbrev. day Tuesday', 'Tue'), + pgettext('abbrev. day Wednesday', 'Wed'), + pgettext('abbrev. day Thursday', 'Thur'), + pgettext('abbrev. day Friday', 'Fri'), + pgettext('abbrev. day Saturday', 'Sat') + ], + daysOfWeekInitial: [ pgettext('one letter Sunday', 'S'), pgettext('one letter Monday', 'M'), pgettext('one letter Tuesday', 'T'), @@ -84,7 +116,7 @@ depends on core.js for utility functions like removeChildren or quickElement // Draw days-of-week header let tableRow = quickElement('tr', tableBody); for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); + quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); } const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); diff --git a/django/contrib/admin/static/admin/js/cancel.js b/django/contrib/admin/static/admin/js/cancel.js index cfe06c279ff3..3069c6f27bfd 100644 --- a/django/contrib/admin/static/admin/js/cancel.js +++ b/django/contrib/admin/static/admin/js/cancel.js @@ -14,10 +14,11 @@ ready(function() { function handleClick(event) { event.preventDefault(); - if (window.location.search.indexOf('&_popup=1') === -1) { - window.history.back(); // Go back if not a popup. + const params = new URLSearchParams(window.location.search); + if (params.has('_popup')) { + window.close(); // Close the popup. } else { - window.close(); // Otherwise, close the popup. + window.history.back(); // Otherwise, go back. } } diff --git a/django/contrib/admin/static/admin/js/collapse.js b/django/contrib/admin/static/admin/js/collapse.js deleted file mode 100644 index c6c7b0f68a2d..000000000000 --- a/django/contrib/admin/static/admin/js/collapse.js +++ /dev/null @@ -1,43 +0,0 @@ -/*global gettext*/ -'use strict'; -{ - window.addEventListener('load', function() { - // Add anchor tag for Show/Hide link - const fieldsets = document.querySelectorAll('fieldset.collapse'); - for (const [i, elem] of fieldsets.entries()) { - // Don't hide if fields in this fieldset have errors - if (elem.querySelectorAll('div.errors, ul.errorlist').length === 0) { - elem.classList.add('collapsed'); - const h2 = elem.querySelector('h2'); - const link = document.createElement('a'); - link.id = 'fieldsetcollapser' + i; - link.className = 'collapse-toggle'; - link.href = '#'; - link.textContent = gettext('Show'); - h2.appendChild(document.createTextNode(' (')); - h2.appendChild(link); - h2.appendChild(document.createTextNode(')')); - } - } - // Add toggle to hide/show anchor tag - const toggleFunc = function(ev) { - if (ev.target.matches('.collapse-toggle')) { - ev.preventDefault(); - ev.stopPropagation(); - const fieldset = ev.target.closest('fieldset'); - if (fieldset.classList.contains('collapsed')) { - // Show - ev.target.textContent = gettext('Hide'); - fieldset.classList.remove('collapsed'); - } else { - // Hide - ev.target.textContent = gettext('Show'); - fieldset.classList.add('collapsed'); - } - } - }; - document.querySelectorAll('fieldset.module').forEach(function(el) { - el.addEventListener('click', toggleFunc); - }); - }); -} diff --git a/django/contrib/admin/static/admin/js/core.js b/django/contrib/admin/static/admin/js/core.js index 8ef27b3483e2..10504d4a8415 100644 --- a/django/contrib/admin/static/admin/js/core.js +++ b/django/contrib/admin/static/admin/js/core.js @@ -1,4 +1,4 @@ -// Core javascript helper functions +// Core JavaScript helper functions 'use strict'; // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]); @@ -85,6 +85,24 @@ function findPosY(obj) { return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); }; + Date.prototype.getAbbrevDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; + }; + + Date.prototype.getFullDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeek[this.getDay()]; + }; + + Date.prototype.getAbbrevMonthName = function() { + return typeof window.CalendarNamespace === "undefined" + ? this.getTwoDigitMonth() + : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()]; + }; + Date.prototype.getFullMonthName = function() { return typeof window.CalendarNamespace === "undefined" ? this.getTwoDigitMonth() @@ -93,6 +111,9 @@ function findPosY(obj) { Date.prototype.strftime = function(format) { const fields = { + a: this.getAbbrevDayName(), + A: this.getFullDayName(), + b: this.getAbbrevMonthName(), B: this.getFullMonthName(), c: this.toString(), d: this.getTwoDigitDate(), @@ -112,11 +133,11 @@ function findPosY(obj) { let result = '', i = 0; while (i < format.length) { if (format.charAt(i) === '%') { - result = result + fields[format.charAt(i + 1)]; + result += fields[format.charAt(i + 1)]; ++i; } else { - result = result + format.charAt(i); + result += format.charAt(i); } ++i; } diff --git a/django/contrib/admin/static/admin/js/filters.js b/django/contrib/admin/static/admin/js/filters.js new file mode 100644 index 000000000000..f5536ebc2d3b --- /dev/null +++ b/django/contrib/admin/static/admin/js/filters.js @@ -0,0 +1,30 @@ +/** + * Persist changelist filters state (collapsed/expanded). + */ +'use strict'; +{ + // Init filters. + let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState')); + + if (!filters) { + filters = {}; + } + + Object.entries(filters).forEach(([key, value]) => { + const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`); + + // Check if the filter is present, it could be from other view. + if (detailElement) { + value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open'); + } + }); + + // Save filter state when clicks. + const details = document.querySelectorAll('details'); + details.forEach(detail => { + detail.addEventListener('toggle', event => { + filters[`${event.target.dataset.filterTitle}`] = detail.open; + sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters)); + }); + }); +} diff --git a/django/contrib/admin/static/admin/js/inlines.js b/django/contrib/admin/static/admin/js/inlines.js index 82ec02723705..cd3726cf3061 100644 --- a/django/contrib/admin/static/admin/js/inlines.js +++ b/django/contrib/admin/static/admin/js/inlines.js @@ -50,11 +50,11 @@ // If forms are laid out as table rows, insert the // "add" button in a new table row: const numCols = $this.eq(-1).children().length; - $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="#">' + options.addText + "</a></tr>"); + $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></tr>"); addButton = $parent.find("tr:last a"); } else { // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="#">' + options.addText + "</a></div>"); + $this.filter(":last").after('<div class="' + options.addCssClass + '"><a role="button" class="addlink" href="#">' + options.addText + "</a></div>"); addButton = $this.filter(":last").next().find("a"); } } @@ -88,7 +88,12 @@ if (options.added) { options.added(row); } - $(document).trigger('formset:added', [row, options.prefix]); + row.get(0).dispatchEvent(new CustomEvent("formset:added", { + bubbles: true, + detail: { + formsetName: options.prefix + } + })); }; /** @@ -99,15 +104,15 @@ if (row.is("tr")) { // If the forms are laid out in table rows, insert // the remove button into the last table cell: - row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>"); + row.children(":last").append('<div><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></div>"); } else if (row.is("ul") || row.is("ol")) { // If they're laid out as an ordered/unordered list, // insert an <li> after the last list item: - row.append('<li><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>"); + row.append('<li><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></li>"); } else { // Otherwise, just insert the remove button as the // last child element of the form's container: - row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>"); + row.children(":first").append('<span><a role="button" class="' + options.deleteCssClass + '" href="#">' + options.deleteText + "</a></span>"); } // Add delete handler for each row. row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); @@ -130,7 +135,11 @@ if (options.removed) { options.removed(row); } - $(document).trigger('formset:removed', [row, options.prefix]); + document.dispatchEvent(new CustomEvent("formset:removed", { + detail: { + formsetName: options.prefix + } + })); // Update the TOTAL_FORMS form count. const forms = $("." + options.formCssClass); $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); @@ -218,12 +227,10 @@ // instantiate a new SelectFilter instance for it. if (typeof SelectFilter !== 'undefined') { $('.selectfilter').each(function(index, value) { - const namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length - 1], false); + SelectFilter.init(value.id, this.dataset.fieldName, false); }); $('.selectfilterstacked').each(function(index, value) { - const namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length - 1], true); + SelectFilter.init(value.id, this.dataset.fieldName, true); }); } }; @@ -283,12 +290,10 @@ // If any SelectFilter widgets were added, instantiate a new instance. if (typeof SelectFilter !== "undefined") { $(".selectfilter").each(function(index, value) { - const namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length - 1], false); + SelectFilter.init(value.id, this.dataset.fieldName, false); }); $(".selectfilterstacked").each(function(index, value) { - const namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length - 1], true); + SelectFilter.init(value.id, this.dataset.fieldName, true); }); } }; @@ -300,7 +305,13 @@ dependency_list = input.data('dependency_list') || [], dependencies = []; $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id')); + // Dependency in a fieldset. + let field_element = row.find('.form-row .field-' + field_name); + // Dependency without a fieldset. + if (!field_element.length) { + field_element = row.find('.form-row.field-' + field_name); + } + dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); }); if (dependencies.length) { input.prepopulate(dependencies, input.attr('maxlength')); diff --git a/django/contrib/admin/static/admin/js/nav_sidebar.js b/django/contrib/admin/static/admin/js/nav_sidebar.js index efaa7214b8de..7e735db15cf3 100644 --- a/django/contrib/admin/static/admin/js/nav_sidebar.js +++ b/django/contrib/admin/static/admin/js/nav_sidebar.js @@ -2,38 +2,78 @@ { const toggleNavSidebar = document.getElementById('toggle-nav-sidebar'); if (toggleNavSidebar !== null) { - const navLinks = document.querySelectorAll('#nav-sidebar a'); - function disableNavLinkTabbing() { - for (const navLink of navLinks) { - navLink.tabIndex = -1; - } - } - function enableNavLinkTabbing() { - for (const navLink of navLinks) { - navLink.tabIndex = 0; - } - } - + const navSidebar = document.getElementById('nav-sidebar'); const main = document.getElementById('main'); let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen'); if (navSidebarIsOpen === null) { navSidebarIsOpen = 'true'; } - if (navSidebarIsOpen === 'false') { - disableNavLinkTabbing(); - } main.classList.toggle('shifted', navSidebarIsOpen === 'true'); + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); toggleNavSidebar.addEventListener('click', function() { if (navSidebarIsOpen === 'true') { navSidebarIsOpen = 'false'; - disableNavLinkTabbing(); } else { navSidebarIsOpen = 'true'; - enableNavLinkTabbing(); } localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen); main.classList.toggle('shifted'); + navSidebar.setAttribute('aria-expanded', navSidebarIsOpen); + }); + } + + function initSidebarQuickFilter() { + const options = []; + const navSidebar = document.getElementById('nav-sidebar'); + if (!navSidebar) { + return; + } + navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => { + options.push({title: container.innerHTML, node: container}); }); + + function checkValue(event) { + let filterValue = event.target.value; + if (filterValue) { + filterValue = filterValue.toLowerCase(); + } + if (event.key === 'Escape') { + filterValue = ''; + event.target.value = ''; // clear input + } + let matches = false; + for (const o of options) { + let displayValue = ''; + if (filterValue) { + if (o.title.toLowerCase().indexOf(filterValue) === -1) { + displayValue = 'none'; + } else { + matches = true; + } + } + // show/hide parent <TR> + o.node.parentNode.parentNode.style.display = displayValue; + } + if (!filterValue || matches) { + event.target.classList.remove('no-results'); + } else { + event.target.classList.add('no-results'); + } + sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue); + } + + const nav = document.getElementById('nav-filter'); + nav.addEventListener('change', checkValue, false); + nav.addEventListener('input', checkValue, false); + nav.addEventListener('keyup', checkValue, false); + + const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue'); + if (storedValue) { + nav.value = storedValue; + checkValue({target: nav, key: ''}); + } } + window.initSidebarQuickFilter = initSidebarQuickFilter; + initSidebarQuickFilter(); } diff --git a/django/contrib/admin/static/admin/js/popup_response.js b/django/contrib/admin/static/admin/js/popup_response.js index 2b1d3dd31d7a..fecf0f479841 100644 --- a/django/contrib/admin/static/admin/js/popup_response.js +++ b/django/contrib/admin/static/admin/js/popup_response.js @@ -1,4 +1,3 @@ -/*global opener */ 'use strict'; { const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); diff --git a/django/contrib/admin/static/admin/js/prepopulate_init.js b/django/contrib/admin/static/admin/js/prepopulate_init.js index 72ebdcf5d89c..a58841f00412 100644 --- a/django/contrib/admin/static/admin/js/prepopulate_init.js +++ b/django/contrib/admin/static/admin/js/prepopulate_init.js @@ -3,7 +3,11 @@ const $ = django.jQuery; const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); $.each(fields, function(index, field) { - $('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field'); + $( + '.empty-form .form-row .field-' + field.name + + ', .empty-form.form-row .field-' + field.name + + ', .empty-form .form-row.field-' + field.name + ).addClass('prepopulated_field'); $(field.id).data('dependency_list', field.dependency_list).prepopulate( field.dependency_ids, field.maxLength, field.allowUnicode ); diff --git a/django/contrib/admin/static/admin/js/theme.js b/django/contrib/admin/static/admin/js/theme.js new file mode 100644 index 000000000000..e79d375c55cf --- /dev/null +++ b/django/contrib/admin/static/admin/js/theme.js @@ -0,0 +1,51 @@ +'use strict'; +{ + function setTheme(mode) { + if (mode !== "light" && mode !== "dark" && mode !== "auto") { + console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); + mode = "auto"; + } + document.documentElement.dataset.theme = mode; + localStorage.setItem("theme", mode); + } + + function cycleTheme() { + const currentTheme = localStorage.getItem("theme") || "auto"; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + + if (prefersDark) { + // Auto (dark) -> Light -> Dark + if (currentTheme === "auto") { + setTheme("light"); + } else if (currentTheme === "light") { + setTheme("dark"); + } else { + setTheme("auto"); + } + } else { + // Auto (light) -> Dark -> Light + if (currentTheme === "auto") { + setTheme("dark"); + } else if (currentTheme === "dark") { + setTheme("light"); + } else { + setTheme("auto"); + } + } + } + + function initTheme() { + // set theme defined in localStorage if there is one, or fallback to auto mode + const currentTheme = localStorage.getItem("theme"); + currentTheme ? setTheme(currentTheme) : setTheme("auto"); + } + + window.addEventListener('load', function(_) { + const buttons = document.getElementsByClassName("theme-toggle"); + Array.from(buttons).forEach((btn) => { + btn.addEventListener("click", cycleTheme); + }); + }); + + initTheme(); +} diff --git a/django/contrib/admin/static/admin/js/unusable_password_field.js b/django/contrib/admin/static/admin/js/unusable_password_field.js new file mode 100644 index 000000000000..ec26238c29ac --- /dev/null +++ b/django/contrib/admin/static/admin/js/unusable_password_field.js @@ -0,0 +1,29 @@ +"use strict"; +// Fallback JS for browsers which do not support :has selector used in +// admin/css/unusable_password_fields.css +// Remove file once all supported browsers support :has selector +try { + // If browser does not support :has selector this will raise an error + document.querySelector("form:has(input)"); +} catch (error) { + console.log("Defaulting to javascript for usable password form management: " + error); + // JS replacement for unsupported :has selector + document.querySelectorAll('input[name="usable_password"]').forEach(option => { + option.addEventListener('change', function() { + const usablePassword = (this.value === "true" ? this.checked : !this.checked); + const submit1 = document.querySelector('input[type="submit"].set-password'); + const submit2 = document.querySelector('input[type="submit"].unset-password'); + const messages = document.querySelector('#id_unusable_warning'); + document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; + document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; + if (messages) { + messages.hidden = usablePassword; + } + if (submit1 && submit2) { + submit1.hidden = !usablePassword; + submit2.hidden = usablePassword; + } + }); + option.dispatchEvent(new Event('change')); + }); +} diff --git a/django/contrib/admin/static/admin/js/urlify.js b/django/contrib/admin/static/admin/js/urlify.js index 61dedb23e989..9fc040949647 100644 --- a/django/contrib/admin/static/admin/js/urlify.js +++ b/django/contrib/admin/static/admin/js/urlify.js @@ -163,8 +163,7 @@ s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens s = s.substring(0, num_chars); // trim to first num_chars chars - s = s.replace(/-+$/g, ''); // trim any trailing hyphens - return s; + return s.replace(/-+$/g, ''); // trim any trailing hyphens } window.URLify = URLify; } diff --git a/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt b/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt index e3dbacb999ce..f642c3f7a77a 100644 --- a/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt +++ b/django/contrib/admin/static/admin/js/vendor/jquery/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright JS Foundation and other contributors, https://js.foundation/ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js b/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js index 50937333b99a..1a86433c2230 100644 --- a/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js +++ b/django/contrib/admin/static/admin/js/vendor/jquery/jquery.js @@ -1,15 +1,12 @@ /*! - * jQuery JavaScript Library v3.5.1 + * jQuery JavaScript Library v3.7.1 * https://jquery.com/ * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors + * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2020-05-04T22:49Z + * Date: 2023-08-28T13:37Z */ ( function( global, factory ) { @@ -23,7 +20,7 @@ // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. + // See ticket trac-14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { @@ -76,12 +73,16 @@ var support = {}; var isFunction = function isFunction( obj ) { - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML <object> elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML <object> elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; var isWindow = function isWindow( obj ) { @@ -146,8 +147,9 @@ function toType( obj ) { -var - version = "3.5.1", +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -393,6 +395,38 @@ jQuery.extend( { return obj; }, + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -401,7 +435,7 @@ jQuery.extend( { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? - [ arr ] : arr + [ arr ] : arr ); } else { push.call( ret, arr ); @@ -415,6 +449,15 @@ jQuery.extend( { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { @@ -496,9 +539,9 @@ if ( typeof Symbol === "function" ) { // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); function isArrayLike( obj ) { @@ -516,43 +559,98 @@ function isArrayLike( obj ) { return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + var i, - support, Expr, - getText, - isXML, - tokenize, - compile, - select, outermostContext, sortInput, hasDuplicate, + push = pushNative, // Local document vars - setDocument, document, - docElem, + documentElement, documentIsHTML, rbuggyQSA, - rbuggyMatches, matches, - contains, // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, + expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), @@ -566,47 +664,22 @@ var i, return 0; }, - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", // Regular expressions - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", @@ -625,101 +698,88 @@ var i, // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + + needsContext: new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, - rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - rnative = /^[^{]+\{\s*\[native \w/, - // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; - return nonHex ? + if ( nonHex ) { // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + return nonHex; } - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, - // Used for iframes - // See setDocument() + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ // Removing the function wrapper causes a "Permission Denied" - // error in IE + // error in IE/Edge. unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + return elem.disabled === true && nodeName( elem, "fieldset" ); }, { dir: "parentNode", next: "legend" } ); +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + // Optimize for push.apply( _, NodeList ) try { push.apply( @@ -727,32 +787,22 @@ try { preferredDoc.childNodes ); - // Support: Android<4.0 + // Support: Android <=4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { + push = { + apply: function( target, els ) { pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); } }; } -function Sizzle( selector, context, results, seed ) { +function find( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, @@ -786,11 +836,10 @@ function Sizzle( selector, context, results, seed ) { if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } else { @@ -800,14 +849,13 @@ function Sizzle( selector, context, results, seed ) { // Element context } else { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && + find.contains( context, elem ) && elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } @@ -818,22 +866,15 @@ function Sizzle( selector, context, results, seed ) { return results; // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { newSelector = selector; newContext = context; @@ -846,7 +887,7 @@ function Sizzle( selector, context, results, seed ) { // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || @@ -854,11 +895,15 @@ function Sizzle( selector, context, results, seed ) { // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); + nid = jQuery.escapeSelector( nid ); } else { context.setAttribute( "id", ( nid = expando ) ); } @@ -891,7 +936,7 @@ function Sizzle( selector, context, results, seed ) { } // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); } /** @@ -905,7 +950,8 @@ function createCache() { function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries @@ -917,7 +963,7 @@ function createCache() { } /** - * Mark a function for special use by Sizzle + * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ function markFunction( fn ) { @@ -948,56 +994,13 @@ function assert( fn ) { } } -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; + return nodeName( elem, "input" ) && elem.type === type; }; } @@ -1007,8 +1010,8 @@ function createInputPseudo( type ) { */ function createButtonPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; }; } @@ -1044,14 +1047,13 @@ function createDisabledPseudo( disabled ) { } } - // Support: IE 6 - 11 + // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - /* jshint -W018 */ elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1091,7 +1093,7 @@ function createPositionalPseudo( fn ) { } /** - * Checks a node for validity as a Sizzle context + * Checks a node for validity as a jQuery selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -1099,31 +1101,13 @@ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - /** * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document + * @param {Element|Object} [node] An element or document object to use to set the document * @returns {Object} Returns the current document */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, +function setDocument( node ) { + var subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected @@ -1137,87 +1121,90 @@ setDocument = Sizzle.setDocument = function( node ) { // Update global variables document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); } - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; } ); - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); } ); - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); } ); - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } } ); // ID filter and find if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && @@ -1228,7 +1215,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); @@ -1258,40 +1245,18 @@ setDocument = Sizzle.setDocument = function( node ) { } // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + Expr.find.CLASS = function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } @@ -1302,177 +1267,94 @@ setDocument = Sizzle.setDocument = function( node ) { // QSA and matchesSelector support - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + - "<select id='" + expando + "-\r\\' msallowcapture=''>" + - "<option selected=''></option></select>"; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { - assert( function( el ) { - el.innerHTML = "<a href='' disabled='disabled'></a>" + - "<select disabled='disabled'><option/></select>"; + var input; - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); + documentElement.appendChild( el ).innerHTML = + "<a id='" + expando + "' href='' disabled='disabled'></a>" + + "<select id='" + expando + "-\r\\' disabled='disabled'>" + + "<option selected=''></option></select>"; - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } - assert( function( el ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); + if ( !support.cssHas ) { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { + sortOrder = function( a, b ) { // Flag for duplicate removal if ( a === b ) { @@ -1506,8 +1388,8 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { return -1; } @@ -1515,100 +1397,33 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; }; return document; -}; +} -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); }; -Sizzle.matchesSelector = function( elem, expr ) { +find.matchesSelector = function( elem, expr ) { setDocument( elem ); - if ( support.matchesSelector && documentIsHTML && + if ( documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); @@ -1616,9 +1431,9 @@ Sizzle.matchesSelector = function( elem, expr ) { // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { @@ -1626,10 +1441,10 @@ Sizzle.matchesSelector = function( elem, expr ) { } } - return Sizzle( expr, document, null, [ elem ] ).length > 0; + return find( expr, document, null, [ elem ] ).length > 0; }; -Sizzle.contains = function( context, elem ) { +find.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1639,10 +1454,11 @@ Sizzle.contains = function( context, elem ) { if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } - return contains( context, elem ); + return jQuery.contains( context, elem ); }; -Sizzle.attr = function( elem, name ) { + +find.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1655,25 +1471,19 @@ Sizzle.attr = function( elem, name ) { var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) + // Don't get fooled by Object.prototype properties (see trac-13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; + if ( val !== undefined ) { + return val; + } -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); + return elem.getAttribute( name ); }; -Sizzle.error = function( msg ) { +find.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; @@ -1681,16 +1491,20 @@ Sizzle.error = function( msg ) { * Document sorting and removing duplicates * @param {ArrayLike} results */ -Sizzle.uniqueSort = function( results ) { +jQuery.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { @@ -1698,59 +1512,23 @@ Sizzle.uniqueSort = function( results ) { j = duplicates.push( i ); } } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } } - // Do not include comment or processing instruction nodes + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; - return ret; + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); }; -Expr = Sizzle.selectors = { +Expr = jQuery.expr = { // Can be adjusted by the user cacheLength: 50, @@ -1771,12 +1549,12 @@ Expr = Sizzle.selectors = { }, preFilter: { - "ATTR": function( match ) { + ATTR: function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; @@ -1785,7 +1563,7 @@ Expr = Sizzle.selectors = { return match.slice( 0, 4 ); }, - "CHILD": function( match ) { + CHILD: function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) @@ -1803,29 +1581,30 @@ Expr = Sizzle.selectors = { // nth-* requires argument if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - // other types prohibit arguments + // other types prohibit arguments } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } return match; }, - "PSEUDO": function( match ) { + PSEUDO: function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { return null; } @@ -1854,36 +1633,36 @@ Expr = Sizzle.selectors = { filter: { - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + return nodeName( elem, expectedNodeName ); }; }, - "CLASS": function( className ) { + CLASS: function( className ) { var pattern = classCache[ className + " " ]; return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); } ); }, - "ATTR": function( name, operator, check ) { + ATTR: function( name, operator, check ) { return function( elem ) { - var result = Sizzle.attr( elem, name ); + var result = find.attr( elem, name ); if ( result == null ) { return operator === "!="; @@ -1894,22 +1673,34 @@ Expr = Sizzle.selectors = { result += ""; - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + return false; }; }, - "CHILD": function( type, what, _argument, first, last ) { + CHILD: function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; @@ -1922,7 +1713,7 @@ Expr = Sizzle.selectors = { } : function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, + var cache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), @@ -1937,7 +1728,7 @@ Expr = Sizzle.selectors = { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) { return false; @@ -1956,17 +1747,8 @@ Expr = Sizzle.selectors = { if ( forward && useCache ) { // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; @@ -1978,7 +1760,7 @@ Expr = Sizzle.selectors = { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } @@ -1987,17 +1769,8 @@ Expr = Sizzle.selectors = { // Use previously-cached element index if available if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } @@ -2011,7 +1784,7 @@ Expr = Sizzle.selectors = { ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) && ++diff ) { @@ -2019,13 +1792,7 @@ Expr = Sizzle.selectors = { if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; + outerCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { @@ -2043,19 +1810,19 @@ Expr = Sizzle.selectors = { }; }, - "PSEUDO": function( pseudo, argument ) { + PSEUDO: function( pseudo, argument ) { // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes + // https://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); + find.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function - // just as Sizzle does + // just as jQuery does if ( fn[ expando ] ) { return fn( argument ); } @@ -2069,7 +1836,7 @@ Expr = Sizzle.selectors = { matched = fn( seed, argument ), i = matched.length; while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); + idx = indexOf.call( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : @@ -2085,14 +1852,14 @@ Expr = Sizzle.selectors = { pseudos: { // Potentially complex pseudos - "not": markFunction( function( selector ) { + not: markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { @@ -2111,22 +1878,23 @@ Expr = Sizzle.selectors = { input[ 0 ] = elem; matcher( input, null, xml, results ); - // Don't keep the element (issue #299) + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) input[ 0 ] = null; return !results.pop(); }; } ), - "has": markFunction( function( selector ) { + has: markFunction( function( selector ) { return function( elem ) { - return Sizzle( selector, elem ).length > 0; + return find( selector, elem ).length > 0; }; } ), - "contains": markFunction( function( text ) { + contains: markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; }; } ), @@ -2136,12 +1904,12 @@ Expr = Sizzle.selectors = { // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); + find.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { @@ -2160,38 +1928,39 @@ Expr = Sizzle.selectors = { } ), // Miscellaneous - "target": function( elem ) { + target: function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, - "root": function( elem ) { - return elem === docElem; + root: function( elem ) { + return elem === documentElement; }, - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), - "checked": function( elem ) { + checked: function( elem ) { // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); }, - "selected": function( elem ) { + selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; @@ -2201,9 +1970,9 @@ Expr = Sizzle.selectors = { }, // Contents - "empty": function( elem ) { + empty: function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo + // https://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children @@ -2215,49 +1984,49 @@ Expr = Sizzle.selectors = { return true; }, - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); }, // Element/input types - "header": function( elem ) { + header: function( elem ) { return rheader.test( elem.nodeName ); }, - "input": function( elem ) { + input: function( elem ) { return rinputs.test( elem.nodeName ); }, - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); }, - "text": function( elem ) { + text: function( elem ) { var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && + return nodeName( elem, "input" ) && elem.type === "text" && - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection - "first": createPositionalPseudo( function() { + first: createPositionalPseudo( function() { return [ 0 ]; } ), - "last": createPositionalPseudo( function( _matchIndexes, length ) { + last: createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), - "even": createPositionalPseudo( function( matchIndexes, length ) { + even: createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2265,7 +2034,7 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "odd": createPositionalPseudo( function( matchIndexes, length ) { + odd: createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2273,19 +2042,24 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); @@ -2295,7 +2069,7 @@ Expr = Sizzle.selectors = { } }; -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; +Expr.pseudos.nth = Expr.pseudos.eq; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { @@ -2310,7 +2084,7 @@ function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { +function tokenize( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; @@ -2338,13 +2112,13 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { matched = false; // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) + type: match[ 0 ].replace( rtrimCSS, " " ) } ); soFar = soFar.slice( matched.length ); } @@ -2371,14 +2145,16 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : + if ( parseOnly ) { + return soFar.length; + } - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} function toSelector( tokens ) { var i = 0, @@ -2411,7 +2187,7 @@ function addCombinator( matcher, combinator, base ) { // Check against all ancestor/preceding elements function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, + var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching @@ -2428,14 +2204,9 @@ function addCombinator( matcher, combinator, base ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { + if ( skip && nodeName( elem, skip ) ) { elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && + } else if ( ( oldCache = outerCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements @@ -2443,7 +2214,7 @@ function addCombinator( matcher, combinator, base ) { } else { // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; + outerCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { @@ -2475,7 +2246,7 @@ function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); + find( selector, contexts[ i ], results ); } return results; } @@ -2509,38 +2280,37 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, + var temp, i, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : - elems, + elems; - matcherOut = matcher ? + if ( matcher ) { - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - // ...intermediate processing is necessary - [] : + // ...intermediate processing is necessary + [] : - // ...otherwise use results directly - results : - matcherIn; + // ...otherwise use results directly + results; - // Find primary matches - if ( matcher ) { + // Find primary matches matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; } // Apply postFilter @@ -2578,7 +2348,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } @@ -2613,15 +2383,21 @@ function matcherFromTokens( tokens ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; + return indexOf.call( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) checkContext = null; return ret; } ]; @@ -2646,11 +2422,10 @@ function matcherFromTokens( tokens ) { i > 1 && elementMatcher( matchers ), i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), @@ -2676,7 +2451,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { contextBackup = outermostContext, // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + elems = seed || byElement && Expr.find.TAG( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), @@ -2692,8 +2467,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching + // elements by id. (see trac-14142) for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; @@ -2708,7 +2484,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); + push.call( results, elem ); break; } } @@ -2771,7 +2547,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { - Sizzle.uniqueSort( results ); + jQuery.uniqueSort( results ); } } @@ -2789,7 +2565,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { superMatcher; } -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { +function compile( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], @@ -2812,27 +2588,25 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { } // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; -}; +} /** - * A low-level selection function that works with Sizzle's compiled + * A low-level selection function that works with jQuery's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile + * selector function built with jQuery selector compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ -select = Sizzle.select = function( selector, context, results, seed ) { +function select( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); @@ -2846,10 +2620,12 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; if ( !context ) { return results; @@ -2862,7 +2638,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { } // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; @@ -2875,8 +2651,8 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early @@ -2903,21 +2679,18 @@ select = Sizzle.select = function( selector, context, results, seed ) { !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; -}; +} // One-time assignments +// Support: Android <=4.0 - 4.1+ // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - // Initialize against the default document setDocument(); -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Support: Android <=4.0 - 4.1+ // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { @@ -2925,68 +2698,29 @@ support.sortDetached = assert( function( el ) { return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = "<a href='#'></a>"; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = "<input/>"; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; +jQuery.find = find; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + /* eslint-enable */ + +} )(); var dir = function( elem, dir, until ) { @@ -3020,13 +2754,6 @@ var siblings = function( n, elem ) { var rneedsContext = jQuery.expr.match.needsContext; - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); @@ -3125,8 +2852,8 @@ jQuery.fn.extend( { var rootjQuery, // A simple way to check for HTML strings - // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) + // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, @@ -3277,7 +3004,7 @@ jQuery.fn.extend( { if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : - // Don't pass non-elements to Sizzle + // Don't pass non-elements to jQuery#find cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { @@ -3832,7 +3559,7 @@ jQuery.extend( { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, - process.stackTrace ); + process.error ); } // Support: Promises/A+ section 2.3.3.3.4.1 @@ -3860,10 +3587,17 @@ jQuery.extend( { process(); } else { - // Call an optional hook to record the stack, in case of exception + // Call an optional hook to record the error, in case of exception // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } @@ -3997,8 +3731,8 @@ jQuery.extend( { resolveContexts = Array( i ), resolveValues = slice.call( arguments ), - // the master Deferred - master = jQuery.Deferred(), + // the primary Deferred + primary = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { @@ -4006,30 +3740,30 @@ jQuery.extend( { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); + primary.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || + if ( primary.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - return master.then(); + return primary.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); } - return master.promise(); + return primary.promise(); } } ); @@ -4038,12 +3772,16 @@ jQuery.extend( { // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; -jQuery.Deferred.exceptionHook = function( error, stack ) { +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); } }; @@ -4083,7 +3821,7 @@ jQuery.extend( { isReady: false, // A counter to track how many items to wait for before - // the ready event fires. See #6781 + // the ready event fires. See trac-6781 readyWait: 1, // Handle when the DOM is ready @@ -4180,8 +3918,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } @@ -4211,7 +3949,7 @@ function fcamelCase( _all, letter ) { // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) +// Microsoft forgot to hump their vendor prefix (trac-9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } @@ -4247,7 +3985,7 @@ Data.prototype = { value = {}; // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. + // but we should not, see trac-8335. // Always return an empty object. if ( acceptData( owner ) ) { @@ -4486,7 +4224,7 @@ jQuery.fn.extend( { while ( i-- ) { // Support: IE 11 only - // The attrs elements can be null (#14894) + // The attrs elements can be null (trac-14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { @@ -4909,9 +4647,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) + // Check state lost if the name is set (trac-11217) // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) + // `name` and `type` must use .setAttribute for WWA (trac-14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); @@ -4935,7 +4673,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); } )(); -// We have to close these tags to support XHTML (#13200) +// We have to close these tags to support XHTML (trac-13200) var wrapMap = { // XHTML parsers do not magically insert elements in the @@ -4961,7 +4699,7 @@ if ( !support.option ) { function getAll( context, tag ) { // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { @@ -5044,7 +4782,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { // Remember the top-level container tmp = fragment.firstChild; - // Ensure the created nodes are orphaned (#12392) + // Ensure the created nodes are orphaned (trac-12392) tmp.textContent = ""; } } @@ -5089,10 +4827,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { } -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; @@ -5102,25 +4837,6 @@ function returnFalse() { return false; } -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - function on( elem, types, selector, data, fn, one ) { var origFn, type; @@ -5387,8 +5103,8 @@ jQuery.event = { event = jQuery.event.fix( nativeEvent ), handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event @@ -5468,15 +5184,15 @@ jQuery.event = { for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; - // Don't conflict with Object.prototype properties (#13203) + // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { @@ -5512,12 +5228,12 @@ jQuery.event = { get: isFunction( hook ) ? function() { if ( this.originalEvent ) { - return hook( this.originalEvent ); + return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { - return this.originalEvent[ name ]; + return this.originalEvent[ name ]; } }, @@ -5558,7 +5274,7 @@ jQuery.event = { el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); + leverageNative( el, "click", true ); } // Return false to allow normal processing in the caller @@ -5609,10 +5325,10 @@ jQuery.event = { // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { +function leverageNative( el, type, isSetup ) { - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } @@ -5624,15 +5340,13 @@ function leverageNative( el, type, expectSync ) { jQuery.event.add( el, type, { namespace: false, handler: function( event ) { - var notAsync, result, + var result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { + if ( !saved ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array @@ -5641,27 +5355,22 @@ function leverageNative( el, type, expectSync ) { dataPriv.set( this, type, saved ); // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } + dataPriv.set( this, type, false ); + if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - return result.value; + + return result; } // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. @@ -5671,22 +5380,25 @@ function leverageNative( el, type, expectSync ) { // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { + } else if ( saved ) { // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; } } } ); @@ -5724,7 +5436,7 @@ jQuery.Event = function( src, props ) { // Create target properties // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) + // Target should not be a text node (trac-504, trac-13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; @@ -5821,49 +5533,77 @@ jQuery.each( { targetTouches: true, toElement: true, touches: true, + which: true +}, jQuery.event.addProp ); - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - if ( button & 2 ) { - return 3; - } + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { - if ( button & 4 ) { - return 2; + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); } + } else { - return 0; + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); } - - return event.which; } -}, jQuery.event.addProp ); -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { + var attaches; + // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); + leverageNative( this, type, true ); - // Return false to allow normal processing in the caller - return false; + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } }, trigger: function() { @@ -5874,8 +5614,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + delegateType: delegateType }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks @@ -5970,7 +5786,8 @@ var // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; + + rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { @@ -6084,7 +5901,7 @@ function domManip( collection, args, callback, ignored ) { // Use the original fragment for the last item // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). + // being emptied incorrectly in certain situations (trac-8070). for ( ; i < l; i++ ) { node = fragment; @@ -6106,7 +5923,7 @@ function domManip( collection, args, callback, ignored ) { if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; - // Reenable scripts + // Re-enable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion @@ -6125,6 +5942,12 @@ function domManip( collection, args, callback, ignored ) { }, doc ); } } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } @@ -6171,7 +5994,8 @@ jQuery.extend( { if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); @@ -6407,9 +6231,12 @@ jQuery.each( { } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); +var rcustomProp = /^--/; + + var getStyles = function( elem ) { - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; @@ -6509,7 +6336,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); } // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) + // Style of cloned element affects source element cloned (trac-8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; @@ -6541,6 +6368,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { @@ -6548,17 +6379,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); - table.style.cssText = "position:absolute;left:-11111px"; + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. tr.style.height = "1px"; trChild.style.height = "9px"; + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; documentElement.removeChild( table ); } @@ -6570,6 +6416,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), // Support: Firefox 51+ // Retrieving style before computed somehow @@ -6580,11 +6427,42 @@ function curCSS( elem, name, computed ) { computed = computed || getStyles( elem ); // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` ret = computed.getPropertyValue( name ) || computed[ name ]; + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } @@ -6680,7 +6558,6 @@ var // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", @@ -6702,7 +6579,8 @@ function setPositiveNumber( _elem, value, subtract ) { function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, - delta = 0; + delta = 0, + marginDelta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { @@ -6712,8 +6590,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed for ( ; i < 4; i += 2 ) { // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" @@ -6764,7 +6644,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed ) ) || 0; } - return delta; + return delta + marginDelta; } function getWidthOrHeight( elem, dimension, extra ) { @@ -6862,26 +6742,35 @@ jQuery.extend( { // Don't automatically add "px" to these possibly-unitless properties cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true }, // Add in properties whose names you wish to fix before @@ -6916,15 +6805,15 @@ jQuery.extend( { if ( value !== undefined ) { type = typeof value; - // Convert "+=" or "-=" to relative numbers (#7345) + // Convert "+=" or "-=" to relative numbers (trac-7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); - // Fixes bug #9237 + // Fixes bug trac-9237 type = "number"; } - // Make sure that null and NaN values aren't set (#7116) + // Make sure that null and NaN values aren't set (trac-7116) if ( value == null || value !== value ) { return; } @@ -7022,10 +6911,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) { // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); } }, @@ -7084,7 +6973,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) - ) + "px"; + ) + "px"; } } ); @@ -7223,7 +7112,7 @@ Tween.propHooks = { if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || + jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { @@ -7468,7 +7357,7 @@ function defaultPrefilter( elem, props, opts ) { anim.done( function() { - /* eslint-enable no-loop-func */ + /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { @@ -7548,7 +7437,7 @@ function Animation( elem, properties, options ) { remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, @@ -7588,7 +7477,7 @@ function Animation( elem, properties, options ) { tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, @@ -7761,7 +7650,8 @@ jQuery.fn.extend( { anim.stop( true ); } }; - doAnimation.finish = doAnimation; + + doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : @@ -7937,7 +7827,6 @@ jQuery.fx.speeds = { // Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; @@ -8162,8 +8051,7 @@ jQuery.extend( { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) + // Use proper attribute retrieval (trac-12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { @@ -8267,8 +8155,7 @@ function classesToArray( value ) { jQuery.fn.extend( { addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -8276,36 +8163,35 @@ jQuery.fn.extend( { } ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -8317,45 +8203,42 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, toggleClass: function( value, stateVal ) { - var type = typeof value, + var classNames, className, i, self, + type = typeof value, isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( @@ -8365,17 +8248,20 @@ jQuery.fn.extend( { } ); } - return this.each( function() { - var className, i, self, classNames; + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + return this.each( function() { if ( isValidValue ) { // Toggle individual class names - i = 0; self = jQuery( this ); - classNames = classesToArray( value ); - while ( ( className = classNames[ i++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Check each className given, space separated list if ( self.hasClass( className ) ) { @@ -8401,8 +8287,8 @@ jQuery.fn.extend( { if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" + "" : + dataPriv.get( this, "__className__" ) || "" ); } } @@ -8417,7 +8303,7 @@ jQuery.fn.extend( { while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; + return true; } } @@ -8509,7 +8395,7 @@ jQuery.extend( { val : // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) + // option.text throws exceptions (trac-14686, trac-14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); @@ -8536,7 +8422,7 @@ jQuery.extend( { option = options[ i ]; // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) + // IE8-9 doesn't update selected after form reset (trac-2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup @@ -8610,9 +8496,39 @@ jQuery.each( [ "radio", "checkbox" ], function() { // Return jQuery for attributes-only inclusion +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} -support.focusin = "onfocusin" in window; + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, @@ -8679,8 +8595,8 @@ jQuery.extend( jQuery.event, { return; } - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; @@ -8707,9 +8623,7 @@ jQuery.extend( jQuery.event, { special.bindType || type; // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); @@ -8734,7 +8648,7 @@ jQuery.extend( jQuery.event, { acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) + // Don't do default actions on window, that's where global variables be (trac-6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method @@ -8802,80 +8716,6 @@ jQuery.fn.extend( { } ); -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - var rbracket = /\[\]$/, rCRLF = /\r?\n/g, @@ -8971,16 +8811,14 @@ jQuery.fn.extend( { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { + } ).filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { + } ).map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { @@ -9005,7 +8843,7 @@ var rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - // #7653, #8125, #8152: local protocol detection + // trac-7653, trac-8125, trac-8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, @@ -9028,12 +8866,13 @@ var */ transports = {}, - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; + +originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { @@ -9098,7 +8937,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX // A special extend for ajax options // that takes "flat" options (not to be deep extended) -// Fixes #9887 +// Fixes trac-9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; @@ -9414,8 +9253,8 @@ jQuery.extend( { // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, + jQuery( callbackContext ) : + jQuery.event, // Deferreds deferred = jQuery.Deferred(), @@ -9509,12 +9348,12 @@ jQuery.extend( { deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); - // Alias method option to type as per ticket #12004 + // Alias method option to type as per ticket trac-12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list @@ -9557,7 +9396,7 @@ jQuery.extend( { } // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests @@ -9586,7 +9425,7 @@ jQuery.extend( { if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - // #9682: remove data so that it's not used in an eventual retry + // trac-9682: remove data so that it's not used in an eventual retry delete s.data; } @@ -9727,8 +9566,10 @@ jQuery.extend( { response = ajaxHandleResponses( s, jqXHR, responses ); } - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { s.converters[ "text script" ] = function() {}; } @@ -9857,7 +9698,7 @@ jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, - // Make this explicit, since user can override this through ajaxSetup (#11264) + // Make this explicit, since user can override this through ajaxSetup (trac-11264) type: "GET", dataType: "script", cache: true, @@ -9966,7 +9807,7 @@ var xhrSuccessStatus = { 0: 200, // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 + // trac-1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); @@ -10038,7 +9879,7 @@ jQuery.ajaxTransport( function( options ) { } else { complete( - // File: protocol always yields status 0; see #8605, #14207 + // File: protocol always yields status 0; see trac-8605, trac-14207 xhr.status, xhr.statusText ); @@ -10099,7 +9940,7 @@ jQuery.ajaxTransport( function( options ) { xhr.send( options.hasContent && options.data || null ); } catch ( e ) { - // #14683: Only rethrow if this hasn't been notified as an error yet + // trac-14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } @@ -10466,12 +10307,6 @@ jQuery.offset = { options.using.call( elem, props ); } else { - if ( typeof props.top === "number" ) { - props.top += "px"; - } - if ( typeof props.left === "number" ) { - props.left += "px"; - } curElem.css( props ); } } @@ -10640,8 +10475,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) { // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, - function( defaultExtra, funcName ) { + jQuery.each( { + padding: "inner" + name, + content: type, + "": "outer" + name + }, function( defaultExtra, funcName ) { // Margin is only for outerHeight, outerWidth jQuery.fn[ funcName ] = function( margin, value ) { @@ -10722,11 +10560,14 @@ jQuery.fn.extend( { }, hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + return this + .on( "mouseenter", fnOver ) + .on( "mouseleave", fnOut || fnOver ); } } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + +jQuery.each( + ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( _i, name ) { @@ -10737,14 +10578,17 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + this.on( name, null, data, fn ) : this.trigger( name ); }; - } ); + } +); // Support: Android <=4.0 only // Make sure we trim BOM and NBSP -var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; +// Require that the "whitespace run" starts from a non-whitespace +// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. +var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; // Bind a function to a context, optionally partially applying any // arguments. @@ -10811,7 +10655,7 @@ jQuery.isNumeric = function( obj ) { jQuery.trim = function( text ) { return text == null ? "" : - ( text + "" ).replace( rtrim, "" ); + ( text + "" ).replace( rtrim, "$1" ); }; @@ -10859,8 +10703,8 @@ jQuery.noConflict = function( deep ) { }; // Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) +// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (trac-13566) if ( typeof noGlobal === "undefined" ) { window.jQuery = window.$ = jQuery; } diff --git a/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js b/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js index b0614034ad3a..7f37b5d99122 100644 --- a/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js +++ b/django/contrib/admin/static/admin/js/vendor/jquery/jquery.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S}); +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",t="(?:\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",p="\\["+ge+"*("+t+")(?:"+ge+"*([*^$|!~]?=)"+ge+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+t+"))|)"+ge+"*\\]",g=":("+t+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+p+")*)|.*)\\)|)",v=new RegExp(ge+"+","g"),y=new RegExp("^"+ge+"*,"+ge+"*"),m=new RegExp("^"+ge+"*([>+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="<a id='"+S+"' href='' disabled='disabled'></a><select id='"+S+"-\r\\' disabled='disabled'><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0<I(t,T,null,[e]).length},I.contains=function(e,t){return(e.ownerDocument||e)!=T&&V(e),ce.contains(e,t)},I.attr=function(e,t){(e.ownerDocument||e)!=T&&V(e);var n=b.attrHandle[t.toLowerCase()],r=n&&ue.call(b.attrHandle,t.toLowerCase())?n(e,t,!C):void 0;return void 0!==r?r:e.getAttribute(t)},I.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ce.uniqueSort=function(e){var t,n=[],r=0,i=0;if(a=!le.sortStable,o=!le.sortStable&&ae.call(e,0),de.call(e,l),a){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)he.call(e,n[r],1)}return o=null,e},ce.fn.uniqueSort=function(){return this.pushStack(ce.uniqueSort(ae.apply(this)))},(b=ce.expr={cacheLength:50,createPseudo:F,match:D,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(v," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(d,e,t,h,g){var v="nth"!==d.slice(0,3),y="last"!==d.slice(-4),m="of-type"===e;return 1===h&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u=v!==y?"nextSibling":"previousSibling",l=e.parentNode,c=m&&e.nodeName.toLowerCase(),f=!n&&!m,p=!1;if(l){if(v){while(u){o=e;while(o=o[u])if(m?fe(o,c):1===o.nodeType)return!1;s=u="only"===d&&!s&&"nextSibling"}return!0}if(s=[y?l.firstChild:l.lastChild],y&&f){p=(a=(r=(i=l[S]||(l[S]={}))[d]||[])[0]===E&&r[1])&&r[2],o=a&&l.childNodes[a];while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if(1===o.nodeType&&++p&&o===e){i[d]=[E,a,p];break}}else if(f&&(p=a=(r=(i=e[S]||(e[S]={}))[d]||[])[0]===E&&r[1]),!1===p)while(o=++a&&o&&o[u]||(p=a=0)||s.pop())if((m?fe(o,c):1===o.nodeType)&&++p&&(f&&((i=o[S]||(o[S]={}))[d]=[E,p]),o===e))break;return(p-=g)===h||p%h==0&&0<=p/h}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||I.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?F(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=se.call(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:F(function(e){var r=[],i=[],s=ne(e.replace(ve,"$1"));return s[S]?F(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:F(function(t){return function(e){return 0<I(t,e).length}}),contains:F(function(t){return t=t.replace(O,P),function(e){return-1<(e.textContent||ce.text(e)).indexOf(t)}}),lang:F(function(n){return A.test(n||"")||I.error("unsupported lang: "+n),n=n.replace(O,P).toLowerCase(),function(e){var t;do{if(t=C?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=ie.location&&ie.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===r},focus:function(e){return e===function(){try{return T.activeElement}catch(e){}}()&&T.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:z(!1),disabled:z(!0),checked:function(e){return fe(e,"input")&&!!e.checked||fe(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return q.test(e.nodeName)},input:function(e){return N.test(e.nodeName)},button:function(e){return fe(e,"input")&&"button"===e.type||fe(e,"button")},text:function(e){var t;return fe(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:X(function(){return[0]}),last:X(function(e,t){return[t-1]}),eq:X(function(e,t,n){return[n<0?n+t:n]}),even:X(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:X(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:X(function(e,t,n){var r;for(r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:X(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=B(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=_(e);function G(){}function Y(e,t){var n,r,i,o,a,s,u,l=c[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=y.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=m.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(ve," ")}),a=a.slice(n.length)),b.filter)!(r=D[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?I.error(e):c(e,s).slice(0)}function Q(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function J(a,e,t){var s=e.dir,u=e.next,l=u||s,c=t&&"parentNode"===l,f=n++;return e.first?function(e,t,n){while(e=e[s])if(1===e.nodeType||c)return a(e,t,n);return!1}:function(e,t,n){var r,i,o=[E,f];if(n){while(e=e[s])if((1===e.nodeType||c)&&a(e,t,n))return!0}else while(e=e[s])if(1===e.nodeType||c)if(i=e[S]||(e[S]={}),u&&fe(e,u))e=e[s]||e;else{if((r=i[l])&&r[0]===E&&r[1]===f)return o[2]=r[2];if((i[l]=o)[2]=a(e,t,n))return!0}return!1}}function K(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Z(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function ee(d,h,g,v,y,e){return v&&!v[S]&&(v=ee(v)),y&&!y[S]&&(y=ee(y,e)),F(function(e,t,n,r){var i,o,a,s,u=[],l=[],c=t.length,f=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)I(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),p=!d||!e&&h?f:Z(f,u,d,n,r);if(g?g(p,s=y||(e?d:c||v)?[]:t,n,r):s=p,v){i=Z(s,l),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(s[l[o]]=!(p[l[o]]=a))}if(e){if(y||d){if(y){i=[],o=s.length;while(o--)(a=s[o])&&i.push(p[o]=a);y(null,s=[],i,r)}o=s.length;while(o--)(a=s[o])&&-1<(i=y?se.call(e,a):u[o])&&(e[i]=!(t[i]=a))}}else s=Z(s===t?s.splice(c,s.length):s),y?y(null,t,s,r):k.apply(t,s)})}function te(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=J(function(e){return e===i},a,!0),l=J(function(e){return-1<se.call(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!=w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[J(K(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return ee(1<s&&K(c),1<s&&Q(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(ve,"$1"),t,s<n&&te(e.slice(s,n)),n<r&&te(e=e.slice(n)),n<r&&Q(e))}c.push(t)}return K(c)}function ne(e,t){var n,v,y,m,x,r,i=[],o=[],a=u[e+" "];if(!a){t||(t=Y(e)),n=t.length;while(n--)(a=te(t[n]))[S]?i.push(a):o.push(a);(a=u(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=E+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==T||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==T||(V(o),n=!C);while(s=v[a++])if(s(o,t||T,n)){k.call(r,o);break}i&&(E=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=pe.call(r));f=Z(f)}k.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&ce.uniqueSort(r)}return i&&(E=h,w=p),c},m?F(r):r))).selector=e}return a}function re(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&Y(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&C&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(O,P),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=D.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(O,P),H.test(o[0].type)&&U(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&Q(o)))return k.apply(n,r),n;break}}}return(l||ne(e,c))(r,t,!C,n,!t||H.test(e)&&U(t.parentNode)||t),n}G.prototype=b.filters=b.pseudos,b.setFilters=new G,le.sortStable=S.split("").sort(l).join("")===S,V(),le.sortDetached=$(function(e){return 1&e.compareDocumentPosition(T.createElement("fieldset"))}),ce.find=I,ce.expr[":"]=ce.expr.pseudos,ce.unique=ce.uniqueSort,I.compile=ne,I.select=re,I.setDocument=V,I.tokenize=Y,I.escape=ce.escapeSelector,I.getText=ce.text,I.isXML=ce.isXMLDoc,I.selectors=ce.expr,I.support=ce.support,I.uniqueSort=ce.uniqueSort}();var d=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},h=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},b=ce.expr.match.needsContext,w=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1<se.call(n,e)!==r}):ce.filter(n,e,r)}ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t<r;t++)if(ce.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)ce.find(e,i[t],n);return 1<r?ce.uniqueSort(n):n},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&b.test(e)?ce(e):e||[],!1).length}});var k,S=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(ce.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&ce(e);if(!b.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?se.call(ce(e),this[0]):se.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return d(e,"parentNode")},parentsUntil:function(e,t,n){return d(e,"parentNode",n)},next:function(e){return A(e,"nextSibling")},prev:function(e){return A(e,"previousSibling")},nextAll:function(e){return d(e,"nextSibling")},prevAll:function(e){return d(e,"previousSibling")},nextUntil:function(e,t,n){return d(e,"nextSibling",n)},prevUntil:function(e,t,n){return d(e,"previousSibling",n)},siblings:function(e){return h((e.parentNode||{}).firstChild,e)},children:function(e){return h(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(fe(e,"template")&&(e=e.content||e),ce.merge([],e.childNodes))}},function(r,i){ce.fn[r]=function(e,t){var n=ce.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=ce.filter(t,n)),1<this.length&&(j[r]||ce.uniqueSort(n),E.test(r)&&n.reverse()),this.pushStack(n)}});var D=/[^\x20\t\r\n\f]+/g;function N(e){return e}function q(e){throw e}function L(e,t,n,r){var i;try{e&&v(i=e.promise)?i.call(e).done(t).fail(n):e&&v(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}ce.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},ce.each(e.match(D)||[],function(e,t){n[t]=!0}),n):ce.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){ce.each(e,function(e,t){v(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==x(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return ce.each(arguments,function(e,t){var n;while(-1<(n=ce.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<ce.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},ce.extend({Deferred:function(e){var o=[["notify","progress",ce.Callbacks("memory"),ce.Callbacks("memory"),2],["resolve","done",ce.Callbacks("once memory"),ce.Callbacks("once memory"),0,"resolved"],["reject","fail",ce.Callbacks("once memory"),ce.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return ce.Deferred(function(r){ce.each(o,function(e,t){var n=v(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&v(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,v(t)?s?t.call(e,l(u,o,N,s),l(u,o,q,s)):(u++,t.call(e,l(u,o,N,s),l(u,o,q,s),l(u,o,N,o.notifyWith))):(a!==N&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){ce.Deferred.exceptionHook&&ce.Deferred.exceptionHook(e,t.error),u<=i+1&&(a!==q&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(ce.Deferred.getErrorHook?t.error=ce.Deferred.getErrorHook():ce.Deferred.getStackHook&&(t.error=ce.Deferred.getStackHook()),ie.setTimeout(t))}}return ce.Deferred(function(e){o[0][3].add(l(0,e,v(r)?r:N,e.notifyWith)),o[1][3].add(l(0,e,v(t)?t:N)),o[2][3].add(l(0,e,v(n)?n:q))}).promise()},promise:function(e){return null!=e?ce.extend(e,a):a}},s={};return ce.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=ae.call(arguments),o=ce.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?ae.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(L(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||v(i[t]&&i[t].then)))return o.then();while(t--)L(i[t],a(t),o.reject);return o.promise()}});var H=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;ce.Deferred.exceptionHook=function(e,t){ie.console&&ie.console.warn&&e&&H.test(e.name)&&ie.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},ce.readyException=function(e){ie.setTimeout(function(){throw e})};var O=ce.Deferred();function P(){C.removeEventListener("DOMContentLoaded",P),ie.removeEventListener("load",P),ce.ready()}ce.fn.ready=function(e){return O.then(e)["catch"](function(e){ce.readyException(e)}),this},ce.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--ce.readyWait:ce.isReady)||(ce.isReady=!0)!==e&&0<--ce.readyWait||O.resolveWith(C,[ce])}}),ce.ready.then=O.then,"complete"===C.readyState||"loading"!==C.readyState&&!C.documentElement.doScroll?ie.setTimeout(ce.ready):(C.addEventListener("DOMContentLoaded",P),ie.addEventListener("load",P));var M=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n))for(s in i=!0,n)M(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,v(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(ce(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},R=/^-ms-/,I=/-([a-z])/g;function W(e,t){return t.toUpperCase()}function F(e){return e.replace(R,"ms-").replace(I,W)}var $=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function B(){this.expando=ce.expando+B.uid++}B.uid=1,B.prototype={cache:function(e){var t=e[this.expando];return t||(t={},$(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[F(t)]=n;else for(r in t)i[F(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][F(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(F):(t=F(t))in r?[t]:t.match(D)||[]).length;while(n--)delete r[t[n]]}(void 0===t||ce.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!ce.isEmptyObject(t)}};var _=new B,z=new B,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(U,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:X.test(i)?JSON.parse(i):i)}catch(e){}z.set(e,t,n)}else n=void 0;return n}ce.extend({hasData:function(e){return z.hasData(e)||_.hasData(e)},data:function(e,t,n){return z.access(e,t,n)},removeData:function(e,t){z.remove(e,t)},_data:function(e,t,n){return _.access(e,t,n)},_removeData:function(e,t){_.remove(e,t)}}),ce.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=z.get(o),1===o.nodeType&&!_.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=F(r.slice(5)),V(o,r,i[r]));_.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){z.set(this,n)}):M(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=z.get(o,n))?t:void 0!==(t=V(o,n))?t:void 0;this.each(function(){z.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){z.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=_.get(e,t),n&&(!r||Array.isArray(n)?r=_.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){ce.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return _.get(e,n)||_.access(e,n,{empty:ce.Callbacks("once memory").add(function(){_.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?ce.queue(this[0],t):void 0===n?this:this.each(function(){var e=ce.queue(this,t,n);ce._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&ce.dequeue(this,t)})},dequeue:function(e){return this.each(function(){ce.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=ce.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=_.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var G=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Y=new RegExp("^(?:([+-])=|)("+G+")([a-z%]*)$","i"),Q=["Top","Right","Bottom","Left"],J=C.documentElement,K=function(e){return ce.contains(e.ownerDocument,e)},Z={composed:!0};J.getRootNode&&(K=function(e){return ce.contains(e.ownerDocument,e)||e.getRootNode(Z)===e.ownerDocument});var ee=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&K(e)&&"none"===ce.css(e,"display")};function te(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=s(),l=n&&n[3]||(ce.cssNumber[t]?"":"px"),c=e.nodeType&&(ce.cssNumber[t]||"px"!==l&&+u)&&Y.exec(ce.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)ce.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,ce.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ne={};function re(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=_.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ee(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ne[s])||(o=a.body.appendChild(a.createElement(s)),u=ce.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ne[s]=u)))):"none"!==n&&(l[c]="none",_.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}ce.fn.extend({show:function(){return re(this,!0)},hide:function(){return re(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ee(this)?ce(this).show():ce(this).hide()})}});var xe,be,we=/^(?:checkbox|radio)$/i,Te=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="<textarea>x</textarea>",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="<option></option>",le.option=!!xe.lastChild;var ke={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n<r;n++)_.set(e[n],"globalEval",!t||_.get(t[n],"globalEval"))}ke.tbody=ke.tfoot=ke.colgroup=ke.caption=ke.thead,ke.th=ke.td,le.option||(ke.optgroup=ke.option=[1,"<select multiple='multiple'>","</select>"]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))ce.merge(p,o.nodeType?[o]:o);else if(je.test(o)){a=a||f.appendChild(t.createElement("div")),s=(Te.exec(o)||["",""])[1].toLowerCase(),u=ke[s]||ke._default,a.innerHTML=u[1]+ce.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;ce.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<ce.inArray(o,r))i&&i.push(o);else if(l=K(o),a=Se(f.appendChild(o),"script"),l&&Ee(a),n){c=0;while(o=a[c++])Ce.test(o.type||"")&&n.push(o)}return f}var De=/^([^.]*)(?:\.(.+)|)/;function Ne(){return!0}function qe(){return!1}function Le(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Le(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=qe;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return ce().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function He(e,r,t){t?(_.set(e,r,!1),ce.event.add(e,r,{namespace:!1,handler:function(e){var t,n=_.get(this,r);if(1&e.isTrigger&&this[r]){if(n)(ce.event.special[r]||{}).delegateType&&e.stopPropagation();else if(n=ae.call(arguments),_.set(this,r,n),this[r](),t=_.get(this,r),_.set(this,r,!1),n!==t)return e.stopImmediatePropagation(),e.preventDefault(),t}else n&&(_.set(this,r,ce.event.trigger(n[0],n.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ne)}})):void 0===_.get(e,r)&&ce.event.add(e,r,Ne)}ce.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.get(t);if($(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&ce.find.matchesSelector(J,i),n.guid||(n.guid=ce.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof ce&&ce.event.triggered!==e.type?ce.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(D)||[""]).length;while(l--)d=g=(s=De.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},c=ce.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),ce.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=_.hasData(e)&&_.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(D)||[""]).length;while(l--)if(d=g=(s=De.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=ce.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||ce.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[l],n,r,!0);ce.isEmptyObject(u)&&_.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=ce.event.fix(e),l=(_.get(this,"events")||Object.create(null))[u.type]||[],c=ce.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=ce.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<ce(i,this).index(l):ce.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(ce.Event.prototype,t,{enumerable:!0,configurable:!0,get:v(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[ce.expando]?e:new ce.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click",!0),!1},trigger:function(e){var t=this||e;return we.test(t.type)&&t.click&&fe(t,"input")&&He(t,"click"),!0},_default:function(e){var t=e.target;return we.test(t.type)&&t.click&&fe(t,"input")&&_.get(t,"click")||fe(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},ce.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},ce.Event=function(e,t){if(!(this instanceof ce.Event))return new ce.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ne:qe,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&ce.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[ce.expando]=!0},ce.Event.prototype={constructor:ce.Event,isDefaultPrevented:qe,isPropagationStopped:qe,isImmediatePropagationStopped:qe,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ne,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ne,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ne,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},ce.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},ce.event.addProp),ce.each({focus:"focusin",blur:"focusout"},function(r,i){function o(e){if(C.documentMode){var t=_.get(this,"handle"),n=ce.event.fix(e);n.type="focusin"===e.type?"focus":"blur",n.isSimulated=!0,t(e),n.target===n.currentTarget&&t(n)}else ce.event.simulate(i,e.target,ce.event.fix(e))}ce.event.special[r]={setup:function(){var e;if(He(this,r,!0),!C.documentMode)return!1;(e=_.get(this,i))||this.addEventListener(i,o),_.set(this,i,(e||0)+1)},trigger:function(){return He(this,r),!0},teardown:function(){var e;if(!C.documentMode)return!1;(e=_.get(this,i)-1)?_.set(this,i,e):(this.removeEventListener(i,o),_.remove(this,i))},_default:function(e){return _.get(e.target,r)},delegateType:i},ce.event.special[i]={setup:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i);n||(C.documentMode?this.addEventListener(i,o):e.addEventListener(r,o,!0)),_.set(t,i,(n||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=C.documentMode?this:e,n=_.get(t,i)-1;n?_.set(t,i,n):(C.documentMode?this.removeEventListener(i,o):e.removeEventListener(r,o,!0),_.remove(t,i))}}}),ce.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){ce.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||ce.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),ce.fn.extend({on:function(e,t,n,r){return Le(this,e,t,n,r)},one:function(e,t,n,r){return Le(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,ce(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=qe),this.each(function(){ce.event.remove(this,e,n,t)})}});var Oe=/<script|<style|<link/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,Me=/^\s*<!\[CDATA\[|\]\]>\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)ce.event.add(t,i,s[i][n]);z.hasData(e)&&(o=z.access(e),a=ce.extend({},o),z.set(t,a))}}function $e(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=v(d);if(h||1<f&&"string"==typeof d&&!le.checkClone&&Pe.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),$e(t,r,i,o)});if(f&&(t=(e=Ae(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=ce.map(Se(e,"script"),Ie)).length;c<f;c++)u=e,c!==p&&(u=ce.clone(u,!0,!0),s&&ce.merge(a,Se(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,ce.map(a,We),c=0;c<s;c++)u=a[c],Ce.test(u.type||"")&&!_.access(u,"globalEval")&&ce.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?ce._evalUrl&&!u.noModule&&ce._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):m(u.textContent.replace(Me,""),u,l))}return n}function Be(e,t,n){for(var r,i=t?ce.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||ce.cleanData(Se(r)),r.parentNode&&(n&&K(r)&&Ee(Se(r,"script")),r.parentNode.removeChild(r));return e}ce.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=K(e);if(!(le.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(a=Se(c),r=0,i=(o=Se(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&we.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||Se(e),a=a||Se(c),r=0,i=o.length;r<i;r++)Fe(o[r],a[r]);else Fe(e,c);return 0<(a=Se(c,"script")).length&&Ee(a,!f&&Se(e,"script")),c},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[_.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[_.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),ce.fn.extend({detach:function(e){return Be(this,e,!0)},remove:function(e){return Be(this,e)},text:function(e){return M(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return $e(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Re(this,e).appendChild(e)})},prepend:function(){return $e(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Re(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return $e(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return M(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Oe.test(e)&&!ke[(Te.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(ce.cleanData(Se(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return $e(this,arguments,function(e){var t=this.parentNode;ce.inArray(this,n)<0&&(ce.cleanData(Se(this)),t&&t.replaceChild(e,this))},n)}}),ce.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){ce.fn[e]=function(e){for(var t,n=[],r=ce(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),ce(r[o])[a](t),s.apply(n,t.get());return this.pushStack(n)}});var _e=new RegExp("^("+G+")(?!px)[a-z%]+$","i"),ze=/^--/,Xe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=ie),t.getComputedStyle(e)},Ue=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ve=new RegExp(Q.join("|"),"i");function Ge(e,t,n){var r,i,o,a,s=ze.test(t),u=e.style;return(n=n||Xe(e))&&(a=n.getPropertyValue(t)||n[t],s&&a&&(a=a.replace(ve,"$1")||void 0),""!==a||K(e)||(a=ce.style(e,t)),!le.pixelBoxStyles()&&_e.test(a)&&Ve.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=n.width,u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?a+"":a}function Ye(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",J.appendChild(u).appendChild(l);var e=ie.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),J.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=C.createElement("div"),l=C.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",le.clearCloneStyle="content-box"===l.style.backgroundClip,ce.extend(le,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=C.createElement("table"),t=C.createElement("tr"),n=C.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="box-sizing:content-box;border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",J.appendChild(e).appendChild(t).appendChild(n),r=ie.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,J.removeChild(e)),a}}))}();var Qe=["Webkit","Moz","ms"],Je=C.createElement("div").style,Ke={};function Ze(e){var t=ce.cssProps[e]||Ke[e];return t||(e in Je?e:Ke[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Qe.length;while(n--)if((e=Qe[n]+t)in Je)return e}(e)||e)}var et=/^(none|table(?!-c[ea]).+)/,tt={position:"absolute",visibility:"hidden",display:"block"},nt={letterSpacing:"0",fontWeight:"400"};function rt(e,t,n){var r=Y.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function it(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=ce.css(e,n+Q[a],!0,i)),r?("content"===n&&(u-=ce.css(e,"padding"+Q[a],!0,i)),"margin"!==n&&(u-=ce.css(e,"border"+Q[a]+"Width",!0,i))):(u+=ce.css(e,"padding"+Q[a],!0,i),"padding"!==n?u+=ce.css(e,"border"+Q[a]+"Width",!0,i):s+=ce.css(e,"border"+Q[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function ot(e,t,n){var r=Xe(e),i=(!le.boxSizingReliable()||n)&&"border-box"===ce.css(e,"boxSizing",!1,r),o=i,a=Ge(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(_e.test(a)){if(!n)return a;a="auto"}return(!le.boxSizingReliable()&&i||!le.reliableTrDimensions()&&fe(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===ce.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===ce.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+it(e,t,n||(i?"border":"content"),o,r,a)+"px"}function at(e,t,n,r,i){return new at.prototype.init(e,t,n,r,i)}ce.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=F(t),u=ze.test(t),l=e.style;if(u||(t=Ze(s)),a=ce.cssHooks[t]||ce.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=Y.exec(n))&&i[1]&&(n=te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(ce.cssNumber[s]?"":"px")),le.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=F(t);return ze.test(t)||(t=Ze(s)),(a=ce.cssHooks[t]||ce.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Ge(e,t,r)),"normal"===i&&t in nt&&(i=nt[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),ce.each(["height","width"],function(e,u){ce.cssHooks[u]={get:function(e,t,n){if(t)return!et.test(ce.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ot(e,u,n):Ue(e,tt,function(){return ot(e,u,n)})},set:function(e,t,n){var r,i=Xe(e),o=!le.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===ce.css(e,"boxSizing",!1,i),s=n?it(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-it(e,u,"border",!1,i)-.5)),s&&(r=Y.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=ce.css(e,u)),rt(0,t,s)}}}),ce.cssHooks.marginLeft=Ye(le.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),ce.each({margin:"",padding:"",border:"Width"},function(i,o){ce.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+Q[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(ce.cssHooks[i+o].set=rt)}),ce.fn.extend({css:function(e,t){return M(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Xe(e),i=t.length;a<i;a++)o[t[a]]=ce.css(e,t[a],!1,r);return o}return void 0!==n?ce.style(e,t,n):ce.css(e,t)},e,t,1<arguments.length)}}),((ce.Tween=at).prototype={constructor:at,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=at.propHooks[this.prop];return e&&e.get?e.get(this):at.propHooks._default.get(this)},run:function(e){var t,n=at.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):at.propHooks._default.set(this),this}}).init.prototype=at.prototype,(at.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||!ce.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=at.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=at.prototype.init,ce.fx.step={};var st,ut,lt,ct,ft=/^(?:toggle|show|hide)$/,pt=/queueHooks$/;function dt(){ut&&(!1===C.hidden&&ie.requestAnimationFrame?ie.requestAnimationFrame(dt):ie.setTimeout(dt,ce.fx.interval),ce.fx.tick())}function ht(){return ie.setTimeout(function(){st=void 0}),st=Date.now()}function gt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Q[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function vt(e,t,n){for(var r,i=(yt.tweeners[t]||[]).concat(yt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function yt(o,e,t){var n,a,r=0,i=yt.prefilters.length,s=ce.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=st||ht(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:ce.extend({},e),opts:ce.extend(!0,{specialEasing:{},easing:ce.easing._default},t),originalProperties:e,originalOptions:t,startTime:st||ht(),duration:t.duration,tweens:[],createTween:function(e,t){var n=ce.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=F(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=ce.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=yt.prefilters[r].call(l,o,c,l.opts))return v(n.stop)&&(ce._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return ce.map(c,vt,l),v(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),ce.fx.timer(ce.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}ce.Animation=ce.extend(yt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return te(n.elem,e,Y.exec(t),n),n}]},tweener:function(e,t){v(e)?(t=e,e=["*"]):e=e.match(D);for(var n,r=0,i=e.length;r<i;r++)n=e[r],yt.tweeners[n]=yt.tweeners[n]||[],yt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ee(e),v=_.get(e,"fxshow");for(r in n.queue||(null==(a=ce._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,ce.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ft.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||ce.style(e,r)}if((u=!ce.isEmptyObject(t))||!ce.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=_.get(e,"display")),"none"===(c=ce.css(e,"display"))&&(l?c=l:(re([e],!0),l=e.style.display||l,c=ce.css(e,"display"),re([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===ce.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=_.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&re([e],!0),p.done(function(){for(r in g||re([e]),_.remove(e,"fxshow"),d)ce.style(e,r,d[r])})),u=vt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?yt.prefilters.unshift(e):yt.prefilters.push(e)}}),ce.speed=function(e,t,n){var r=e&&"object"==typeof e?ce.extend({},e):{complete:n||!n&&t||v(e)&&e,duration:e,easing:n&&t||t&&!v(t)&&t};return ce.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in ce.fx.speeds?r.duration=ce.fx.speeds[r.duration]:r.duration=ce.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){v(r.old)&&r.old.call(this),r.queue&&ce.dequeue(this,r.queue)},r},ce.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ee).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=ce.isEmptyObject(t),o=ce.speed(e,n,r),a=function(){var e=yt(this,ce.extend({},t),o);(i||_.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=ce.timers,r=_.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&pt.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||ce.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=_.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=ce.timers,o=n?n.length:0;for(t.finish=!0,ce.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),ce.each(["toggle","show","hide"],function(e,r){var i=ce.fn[r];ce.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(gt(r,!0),e,t,n)}}),ce.each({slideDown:gt("show"),slideUp:gt("hide"),slideToggle:gt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){ce.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),ce.timers=[],ce.fx.tick=function(){var e,t=0,n=ce.timers;for(st=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||ce.fx.stop(),st=void 0},ce.fx.timer=function(e){ce.timers.push(e),ce.fx.start()},ce.fx.interval=13,ce.fx.start=function(){ut||(ut=!0,dt())},ce.fx.stop=function(){ut=null},ce.fx.speeds={slow:600,fast:200,_default:400},ce.fn.delay=function(r,e){return r=ce.fx&&ce.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=ie.setTimeout(e,r);t.stop=function(){ie.clearTimeout(n)}})},lt=C.createElement("input"),ct=C.createElement("select").appendChild(C.createElement("option")),lt.type="checkbox",le.checkOn=""!==lt.value,le.optSelected=ct.selected,(lt=C.createElement("input")).value="t",lt.type="radio",le.radioValue="t"===lt.value;var mt,xt=ce.expr.attrHandle;ce.fn.extend({attr:function(e,t){return M(this,ce.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(i=ce.attrHooks[t.toLowerCase()]||(ce.expr.match.bool.test(t)?mt:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=ce.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!le.radioValue&&"radio"===t&&fe(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(D);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),mt={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var a=xt[t]||ce.find.attr;xt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=xt[o],xt[o]=r,r=null!=a(e,t,n)?o:null,xt[o]=i),r}});var bt=/^(?:input|select|textarea|button)$/i,wt=/^(?:a|area)$/i;function Tt(e){return(e.match(D)||[]).join(" ")}function Ct(e){return e.getAttribute&&e.getAttribute("class")||""}function kt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(D)||[]}ce.fn.extend({prop:function(e,t){return M(this,ce.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):bt.test(e.nodeName)||wt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),le.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this}),ce.fn.extend({addClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).addClass(t.call(this,e,Ct(this)))}):(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++)i=e[o],n.indexOf(" "+i+" ")<0&&(n+=i+" ");a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this},removeClass:function(t){var e,n,r,i,o,a;return v(t)?this.each(function(e){ce(this).removeClass(t.call(this,e,Ct(this)))}):arguments.length?(e=kt(t)).length?this.each(function(){if(r=Ct(this),n=1===this.nodeType&&" "+Tt(r)+" "){for(o=0;o<e.length;o++){i=e[o];while(-1<n.indexOf(" "+i+" "))n=n.replace(" "+i+" "," ")}a=Tt(n),r!==a&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(t,n){var e,r,i,o,a=typeof t,s="string"===a||Array.isArray(t);return v(t)?this.each(function(e){ce(this).toggleClass(t.call(this,e,Ct(this),n),n)}):"boolean"==typeof n&&s?n?this.addClass(t):this.removeClass(t):(e=kt(t),this.each(function(){if(s)for(o=ce(this),i=0;i<e.length;i++)r=e[i],o.hasClass(r)?o.removeClass(r):o.addClass(r);else void 0!==t&&"boolean"!==a||((r=Ct(this))&&_.set(this,"__className__",r),this.setAttribute&&this.setAttribute("class",r||!1===t?"":_.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+Tt(Ct(n))+" ").indexOf(t))return!0;return!1}});var St=/\r/g;ce.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=v(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,ce(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=ce.map(t,function(e){return null==e?"":e+""})),(r=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=ce.valHooks[t.type]||ce.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(St,""):null==e?"":e:void 0}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:Tt(ce.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!fe(n.parentNode,"optgroup"))){if(t=ce(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=ce.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<ce.inArray(ce.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<ce.inArray(ce(e).val(),t)}},le.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Et=ie.location,jt={guid:Date.now()},At=/\?/;ce.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new ie.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||ce.error("Invalid XML: "+(n?ce.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Dt=/^(?:focusinfocus|focusoutblur)$/,Nt=function(e){e.stopPropagation()};ce.extend(ce.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||C],d=ue.call(e,"type")?e.type:e,h=ue.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||C,3!==n.nodeType&&8!==n.nodeType&&!Dt.test(d+ce.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[ce.expando]?e:new ce.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),c=ce.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!y(n)){for(s=c.delegateType||d,Dt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||C)&&p.push(a.defaultView||a.parentWindow||ie)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(_.get(o,"events")||Object.create(null))[e.type]&&_.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&$(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!$(n)||u&&v(n[d])&&!y(n)&&((a=n[u])&&(n[u]=null),ce.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Nt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Nt),ce.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}});var qt=/\[\]$/,Lt=/\r?\n/g,Ht=/^(?:submit|button|image|reset|file)$/i,Ot=/^(?:input|select|textarea|keygen)/i;function Pt(n,e,r,i){var t;if(Array.isArray(e))ce.each(e,function(e,t){r||qt.test(n)?i(n,t):Pt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==x(e))i(n,e);else for(t in e)Pt(n+"["+t+"]",e[t],r,i)}ce.param=function(e,t){var n,r=[],i=function(e,t){var n=v(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Pt(n,e[n],t,i);return r.join("&")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&Ot.test(this.nodeName)&&!Ht.test(e)&&(this.checked||!we.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:Array.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}});var Mt=/%20/g,Rt=/#.*$/,It=/([?&])_=[^&]*/,Wt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ft=/^(?:GET|HEAD)$/,$t=/^\/\//,Bt={},_t={},zt="*/".concat("*"),Xt=C.createElement("a");function Ut(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(D)||[];if(v(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Vt(t,i,o,a){var s={},u=t===_t;function l(e){var r;return s[e]=!0,ce.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Gt(e,t){var n,r,i=ce.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&ce.extend(!0,e,r),e}Xt.href=Et.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,ce.ajaxSettings),t):Gt(ce.ajaxSettings,e)},ajaxPrefilter:Ut(Bt),ajaxTransport:Ut(_t),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=ce.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?ce(y):ce.event,x=ce.Deferred(),b=ce.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Wt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace($t,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(D)||[""],null==v.crossDomain){r=C.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Xt.protocol+"//"+Xt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=ce.param(v.data,v.traditional)),Vt(Bt,v,t,T),h)return T;for(i in(g=ce.event&&v.global)&&0==ce.active++&&ce.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ft.test(v.type),f=v.url.replace(Rt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Mt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(At.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(It,"$1"),o=(At.test(f)?"&":"?")+"_="+jt.guid+++o),v.url=f+o),v.ifModified&&(ce.lastModified[f]&&T.setRequestHeader("If-Modified-Since",ce.lastModified[f]),ce.etag[f]&&T.setRequestHeader("If-None-Match",ce.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+zt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Vt(_t,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=ie.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&ie.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<ce.inArray("script",v.dataTypes)&&ce.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(ce.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(ce.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--ce.active||ce.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,i){ce[i]=function(e,t,n,r){return v(t)&&(r=r||n,n=t,t=void 0),ce.ajax(ce.extend({url:e,type:i,dataType:r,data:t,success:n},ce.isPlainObject(e)&&e))}}),ce.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),ce._evalUrl=function(e,t,n){return ce.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){ce.globalEval(e,t,n)}})},ce.fn.extend({wrapAll:function(e){var t;return this[0]&&(v(e)&&(e=e.call(this[0])),t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return v(n)?this.each(function(e){ce(this).wrapInner(n.call(this,e))}):this.each(function(){var e=ce(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=v(t);return this.each(function(e){ce(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){ce(this).replaceWith(this.childNodes)}),this}}),ce.expr.pseudos.hidden=function(e){return!ce.expr.pseudos.visible(e)},ce.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},ce.ajaxSettings.xhr=function(){try{return new ie.XMLHttpRequest}catch(e){}};var Yt={0:200,1223:204},Qt=ce.ajaxSettings.xhr();le.cors=!!Qt&&"withCredentials"in Qt,le.ajax=Qt=!!Qt,ce.ajaxTransport(function(i){var o,a;if(le.cors||Qt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Yt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&ie.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),ce.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=ce("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=Tt(e.slice(s)),e=e.slice(0,s)),v(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&ce.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?ce("<div>").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var en=/^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;ce.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),v(e))return r=ae.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(ae.call(arguments)))}).guid=e.guid=e.guid||ce.guid++,i},ce.holdReady=function(e){e?ce.readyWait++:ce.ready(!0)},ce.isArray=Array.isArray,ce.parseJSON=JSON.parse,ce.nodeName=fe,ce.isFunction=v,ce.isWindow=y,ce.camelCase=F,ce.type=x,ce.now=Date.now,ce.isNumeric=function(e){var t=ce.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},ce.trim=function(e){return null==e?"":(e+"").replace(en,"$1")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return ce});var tn=ie.jQuery,nn=ie.$;return ce.noConflict=function(e){return ie.$===ce&&(ie.$=nn),e&&ie.jQuery===ce&&(ie.jQuery=tn),ce},"undefined"==typeof e&&(ie.jQuery=ie.$=ce),ce}); diff --git a/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt b/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt index 43f08b4c3d08..4d80338ce6df 100644 --- a/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt +++ b/django/contrib/admin/static/admin/js/vendor/xregexp/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2007-2017 Steven Levithan <http://xregexp.com/> +Copyright (c) 2007-present Steven Levithan <http://xregexp.com/> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js b/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js index ded6f6faa274..215482c45a6a 100644 --- a/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js +++ b/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.js @@ -1,2820 +1,547 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XRegExp = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ -/*! - * XRegExp.build 3.2.0 - * <xregexp.com> - * Steven Levithan (c) 2012-2017 MIT License - * Inspired by Lea Verou's RegExp.create <lea.verou.me> - */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XRegExp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ +"use strict"; -module.exports = function(XRegExp) { - 'use strict'; +var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); - var REGEX_DATA = 'xregexp'; - var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', { - conjunction: 'or' - }); +var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); - /** - * Strips a leading `^` and trailing unescaped `$`, if both are present. - * - * @private - * @param {String} pattern Pattern to process. - * @returns {String} Pattern with edge anchors removed. - */ - function deanchor(pattern) { - // Allow any number of empty noncapturing groups before/after anchors, because regexes - // built/generated by XRegExp sometimes include them - var leadingAnchor = /^(?:\(\?:\))*\^/; - var trailingAnchor = /\$(?:\(\?:\))*$/; - - if ( - leadingAnchor.test(pattern) && - trailingAnchor.test(pattern) && - // Ensure that the trailing `$` isn't escaped - trailingAnchor.test(pattern.replace(/\\[\s\S]/g, '')) - ) { - return pattern.replace(leadingAnchor, '').replace(trailingAnchor, ''); - } +var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); - return pattern; - } +var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); - /** - * Converts the provided value to an XRegExp. Native RegExp flags are not preserved. - * - * @private - * @param {String|RegExp} value Value to convert. - * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not - * already a regex generated by XRegExp - * @returns {RegExp} XRegExp object with XRegExp syntax applied. - */ - function asXRegExp(value, addFlagX) { - var flags = addFlagX ? 'x' : ''; - return XRegExp.isRegExp(value) ? - (value[REGEX_DATA] && value[REGEX_DATA].captureNames ? - // Don't recompile, to preserve capture names - value : - // Recompile as XRegExp - XRegExp(value.source, flags) - ) : - // Compile string as XRegExp - XRegExp(value, flags); - } +var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); - /** - * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in - * the outer pattern and provided subpatterns are automatically renumbered to work correctly. - * Native flags used by provided subpatterns are ignored in favor of the `flags` argument. - * - * @memberOf XRegExp - * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows - * `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within - * character classes. - * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A - * leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present. - * @param {String} [flags] Any combination of XRegExp flags. - * @returns {RegExp} Regex with interpolated subpatterns. - * @example - * - * var time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', { - * hours: XRegExp.build('{{h12}} : | {{h24}}', { - * h12: /1[0-2]|0?[1-9]/, - * h24: /2[0-3]|[01][0-9]/ - * }, 'x'), - * minutes: /^[0-5][0-9]$/ - * }); - * time.test('10:59'); // -> true - * XRegExp.exec('10:59', time).minutes; // -> '59' - */ - XRegExp.build = function(pattern, subs, flags) { - flags = flags || ''; - // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how - // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\` - // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>. - var addFlagX = flags.indexOf('x') > -1; - var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); - // Add flags within a leading mode modifier to the overall pattern's flags - if (inlineFlags) { - flags = XRegExp._clipDuplicates(flags + inlineFlags[1]); - } +var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - var data = {}; - for (var p in subs) { - if (subs.hasOwnProperty(p)) { - // Passing to XRegExp enables extended syntax and ensures independent validity, - // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For - // subpatterns provided as native regexes, it dies on octals and adds the property - // used to hold extended regex instance data, for simplicity. - var sub = asXRegExp(subs[p], addFlagX); - data[p] = { - // Deanchoring allows embedding independently useful anchored regexes. If you - // really need to keep your anchors, double them (i.e., `^^...$$`). - pattern: deanchor(sub.source), - names: sub[REGEX_DATA].captureNames || [] - }; - } - } +var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); - // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid; - // helps keep this simple. Named captures will be put back. - var patternAsRegex = asXRegExp(pattern, addFlagX); - - // 'Caps' is short for 'captures' - var numCaps = 0; - var numPriorCaps; - var numOuterCaps = 0; - var outerCapsMap = [0]; - var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || []; - var output = patternAsRegex.source.replace(parts, function($0, $1, $2, $3, $4) { - var subName = $1 || $2; - var capName; - var intro; - var localCapIndex; - // Named subpattern - if (subName) { - if (!data.hasOwnProperty(subName)) { - throw new ReferenceError('Undefined property ' + $0); - } - // Named subpattern was wrapped in a capturing group - if ($1) { - capName = outerCapNames[numOuterCaps]; - outerCapsMap[++numOuterCaps] = ++numCaps; - // If it's a named group, preserve the name. Otherwise, use the subpattern name - // as the capture name - intro = '(?<' + (capName || subName) + '>'; - } else { - intro = '(?:'; - } - numPriorCaps = numCaps; - return intro + data[subName].pattern.replace(subParts, function(match, paren, backref) { - // Capturing group - if (paren) { - capName = data[subName].names[numCaps - numPriorCaps]; - ++numCaps; - // If the current capture has a name, preserve the name - if (capName) { - return '(?<' + capName + '>'; - } - // Backreference - } else if (backref) { - localCapIndex = +backref - 1; - // Rewrite the backreference - return data[subName].names[localCapIndex] ? - // Need to preserve the backreference name in case using flag `n` - '\\k<' + data[subName].names[localCapIndex] + '>' : - '\\' + (+backref + numPriorCaps); - } - return match; - }) + ')'; - } - // Capturing group - if ($3) { - capName = outerCapNames[numOuterCaps]; - outerCapsMap[++numOuterCaps] = ++numCaps; - // If the current capture has a name, preserve the name - if (capName) { - return '(?<' + capName + '>'; - } - // Backreference - } else if ($4) { - localCapIndex = +$4 - 1; - // Rewrite the backreference - return outerCapNames[localCapIndex] ? - // Need to preserve the backreference name in case using flag `n` - '\\k<' + outerCapNames[localCapIndex] + '>' : - '\\' + outerCapsMap[+$4]; - } - return $0; - }); +_Object$defineProperty(exports, "__esModule", { + value: true +}); - return XRegExp(output, flags); - }; +exports["default"] = void 0; -}; +var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); + +var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); + +var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); + +var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); + +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { var _context4; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context4 = Object.prototype.toString.call(o)).call(_context4, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -},{}],2:[function(require,module,exports){ /*! - * XRegExp.matchRecursive 3.2.0 + * XRegExp Unicode Base 5.1.1 * <xregexp.com> - * Steven Levithan (c) 2009-2017 MIT License + * Steven Levithan (c) 2008-present MIT License */ +var _default = function _default(XRegExp) { + /** + * Adds base support for Unicode matching: + * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or + * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the + * braces for token names that are a single letter (e.g. `\pL` or `PL`). + * - Adds flag A (astral), which enables 21-bit Unicode support. + * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. + * + * Unicode Base relies on externally provided Unicode character data. Official addons are + * available to provide data for Unicode categories, scripts, and properties. + * + * @requires XRegExp + */ + // ==--------------------------== + // Private stuff + // ==--------------------------== + // Storage for Unicode data + var unicode = {}; + var unicodeTypes = {}; // Reuse utils + + var dec = XRegExp._dec; + var hex = XRegExp._hex; + var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed + + function normalize(name) { + return name.replace(/[- _]+/g, '').toLowerCase(); + } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal + + + function charCode(chr) { + var esc = /^\\[xu](.+)/.exec(chr); + return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\' ? 1 : 0); + } // Inverts a list of ordered BMP characters and ranges + + + function invertBmp(range) { + var output = ''; + var lastEnd = -1; + (0, _forEach["default"])(XRegExp).call(XRegExp, range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function (m) { + var start = charCode(m[1]); + + if (start > lastEnd + 1) { + output += "\\u".concat(pad4(hex(lastEnd + 1))); + + if (start > lastEnd + 2) { + output += "-\\u".concat(pad4(hex(start - 1))); + } + } + + lastEnd = charCode(m[2] || m[1]); + }); -module.exports = function(XRegExp) { - 'use strict'; - - /** - * Returns a match detail object composed of the provided values. - * - * @private - */ - function row(name, value, start, end) { - return { - name: name, - value: value, - start: start, - end: end - }; + if (lastEnd < 0xFFFF) { + output += "\\u".concat(pad4(hex(lastEnd + 1))); + + if (lastEnd < 0xFFFE) { + output += '-\\uFFFF'; + } } - /** - * Returns an array of match strings between outermost left and right delimiters, or an array of - * objects with detailed match parts and position data. An error is thrown if delimiters are - * unbalanced within the data. - * - * @memberOf XRegExp - * @param {String} str String to search. - * @param {String} left Left delimiter as an XRegExp pattern. - * @param {String} right Right delimiter as an XRegExp pattern. - * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters. - * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options. - * @returns {Array} Array of matches, or an empty array. - * @example - * - * // Basic usage - * var str = '(t((e))s)t()(ing)'; - * XRegExp.matchRecursive(str, '\\(', '\\)', 'g'); - * // -> ['t((e))s', '', 'ing'] - * - * // Extended information mode with valueNames - * str = 'Here is <div> <div>an</div></div> example'; - * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', { - * valueNames: ['between', 'left', 'match', 'right'] - * }); - * // -> [ - * // {name: 'between', value: 'Here is ', start: 0, end: 8}, - * // {name: 'left', value: '<div>', start: 8, end: 13}, - * // {name: 'match', value: ' <div>an</div>', start: 13, end: 27}, - * // {name: 'right', value: '</div>', start: 27, end: 33}, - * // {name: 'between', value: ' example', start: 33, end: 41} - * // ] - * - * // Omitting unneeded parts with null valueNames, and using escapeChar - * str = '...{1}.\\{{function(x,y){return {y:x}}}'; - * XRegExp.matchRecursive(str, '{', '}', 'g', { - * valueNames: ['literal', null, 'value', null], - * escapeChar: '\\' - * }); - * // -> [ - * // {name: 'literal', value: '...', start: 0, end: 3}, - * // {name: 'value', value: '1', start: 4, end: 5}, - * // {name: 'literal', value: '.\\{', start: 6, end: 9}, - * // {name: 'value', value: 'function(x,y){return {y:x}}', start: 10, end: 37} - * // ] - * - * // Sticky mode via flag y - * str = '<1><<<2>>><3>4<5>'; - * XRegExp.matchRecursive(str, '<', '>', 'gy'); - * // -> ['1', '<<2>>', '3'] - */ - XRegExp.matchRecursive = function(str, left, right, flags, options) { - flags = flags || ''; - options = options || {}; - var global = flags.indexOf('g') > -1; - var sticky = flags.indexOf('y') > -1; - // Flag `y` is controlled internally - var basicFlags = flags.replace(/y/g, ''); - var escapeChar = options.escapeChar; - var vN = options.valueNames; - var output = []; - var openTokens = 0; - var delimStart = 0; - var delimEnd = 0; - var lastOuterEnd = 0; - var outerStart; - var innerStart; - var leftMatch; - var rightMatch; - var esc; - left = XRegExp(left, basicFlags); - right = XRegExp(right, basicFlags); - - if (escapeChar) { - if (escapeChar.length > 1) { - throw new Error('Cannot use more than one escape character'); - } - escapeChar = XRegExp.escape(escapeChar); - // Example of concatenated `esc` regex: - // `escapeChar`: '%' - // `left`: '<' - // `right`: '>' - // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/ - esc = new RegExp( - '(?:' + escapeChar + '[\\S\\s]|(?:(?!' + - // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`. - // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax - // transformation resulting from those flags was already applied to `left` and - // `right` when they were passed through the XRegExp constructor above. - XRegExp.union([left, right], '', {conjunction: 'or'}).source + - ')[^' + escapeChar + '])+)+', - // Flags `gy` not needed here - flags.replace(/[^imu]+/g, '') - ); - } + return output; + } // Generates an inverted BMP range on first use - while (true) { - // If using an escape character, advance to the delimiter's next starting position, - // skipping any escaped characters in between - if (escapeChar) { - delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length; - } - leftMatch = XRegExp.exec(str, left, delimEnd); - rightMatch = XRegExp.exec(str, right, delimEnd); - // Keep the leftmost match only - if (leftMatch && rightMatch) { - if (leftMatch.index <= rightMatch.index) { - rightMatch = null; - } else { - leftMatch = null; - } - } - // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens): - // LM | RM | OT | Result - // 1 | 0 | 1 | loop - // 1 | 0 | 0 | loop - // 0 | 1 | 1 | loop - // 0 | 1 | 0 | throw - // 0 | 0 | 1 | throw - // 0 | 0 | 0 | break - // The paths above don't include the sticky mode special case. The loop ends after the - // first completed match if not `global`. - if (leftMatch || rightMatch) { - delimStart = (leftMatch || rightMatch).index; - delimEnd = delimStart + (leftMatch || rightMatch)[0].length; - } else if (!openTokens) { - break; - } - if (sticky && !openTokens && delimStart > lastOuterEnd) { - break; - } - if (leftMatch) { - if (!openTokens) { - outerStart = delimStart; - innerStart = delimEnd; - } - ++openTokens; - } else if (rightMatch && openTokens) { - if (!--openTokens) { - if (vN) { - if (vN[0] && outerStart > lastOuterEnd) { - output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart)); - } - if (vN[1]) { - output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart)); - } - if (vN[2]) { - output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart)); - } - if (vN[3]) { - output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd)); - } - } else { - output.push(str.slice(innerStart, delimStart)); - } - lastOuterEnd = delimEnd; - if (!global) { - break; - } - } - } else { - throw new Error('Unbalanced delimiter found in string'); - } - // If the delimiter matched an empty string, avoid an infinite loop - if (delimStart === delimEnd) { - ++delimEnd; - } - } - if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) { - output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length)); - } + function cacheInvertedBmp(slug) { + var prop = 'b!'; + return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp)); + } // Combines and optionally negates BMP and astral data - return output; - }; -}; + function buildAstral(slug, isNegated) { + var item = unicode[slug]; + var combined = ''; -},{}],3:[function(require,module,exports){ -/*! - * XRegExp Unicode Base 3.2.0 - * <xregexp.com> - * Steven Levithan (c) 2008-2017 MIT License - */ + if (item.bmp && !item.isBmpLast) { + var _context; -module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds base support for Unicode matching: - * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or - * `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the - * braces for token names that are a single letter (e.g. `\pL` or `PL`). - * - Adds flag A (astral), which enables 21-bit Unicode support. - * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data. - * - * Unicode Base relies on externally provided Unicode character data. Official addons are - * available to provide data for Unicode categories, scripts, blocks, and properties. - * - * @requires XRegExp - */ - - // ==--------------------------== - // Private stuff - // ==--------------------------== - - // Storage for Unicode data - var unicode = {}; - - // Reuse utils - var dec = XRegExp._dec; - var hex = XRegExp._hex; - var pad4 = XRegExp._pad4; - - // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed - function normalize(name) { - return name.replace(/[- _]+/g, '').toLowerCase(); + combined = (0, _concat["default"])(_context = "[".concat(item.bmp, "]")).call(_context, item.astral ? '|' : ''); } - // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal - function charCode(chr) { - var esc = /^\\[xu](.+)/.exec(chr); - return esc ? - dec(esc[1]) : - chr.charCodeAt(chr.charAt(0) === '\\' ? 1 : 0); + if (item.astral) { + combined += item.astral; } - // Inverts a list of ordered BMP characters and ranges - function invertBmp(range) { - var output = ''; - var lastEnd = -1; - - XRegExp.forEach( - range, - /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, - function(m) { - var start = charCode(m[1]); - if (start > (lastEnd + 1)) { - output += '\\u' + pad4(hex(lastEnd + 1)); - if (start > (lastEnd + 2)) { - output += '-\\u' + pad4(hex(start - 1)); - } - } - lastEnd = charCode(m[2] || m[1]); - } - ); + if (item.isBmpLast && item.bmp) { + var _context2; - if (lastEnd < 0xFFFF) { - output += '\\u' + pad4(hex(lastEnd + 1)); - if (lastEnd < 0xFFFE) { - output += '-\\uFFFF'; - } - } + combined += (0, _concat["default"])(_context2 = "".concat(item.astral ? '|' : '', "[")).call(_context2, item.bmp, "]"); + } // Astral Unicode tokens always match a code point, never a code unit + + + return isNegated ? "(?:(?!".concat(combined, ")(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))") : "(?:".concat(combined, ")"); + } // Builds a complete astral pattern on first use + + + function cacheAstral(slug, isNegated) { + var prop = isNegated ? 'a!' : 'a='; + return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated)); + } // ==--------------------------== + // Core functionality + // ==--------------------------== + + /* + * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. + */ - return output; + + XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` + /\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/, function (match, scope, flags) { + var ERR_DOUBLE_NEG = 'Invalid double negation '; + var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; + var ERR_UNKNOWN_REF = 'Unicode token missing data '; + var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; + var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; + + var _match = (0, _slicedToArray2["default"])(match, 6), + fullToken = _match[0], + pPrefix = _match[1], + caretNegation = _match[2], + typePrefix = _match[3], + tokenName = _match[4], + tokenSingleCharName = _match[5]; // Negated via \P{..} or \p{^..} + + + var isNegated = pPrefix === 'P' || !!caretNegation; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A + + var isAstralMode = (0, _indexOf["default"])(flags).call(flags, 'A') !== -1; // Token lookup name. Check `tokenSingleCharName` first to avoid passing `undefined` + // via `\p{}` + + var slug = normalize(tokenSingleCharName || tokenName); // Token data object + + var item = unicode[slug]; + + if (pPrefix === 'P' && caretNegation) { + throw new SyntaxError(ERR_DOUBLE_NEG + fullToken); } - // Generates an inverted BMP range on first use - function cacheInvertedBmp(slug) { - var prop = 'b!'; - return ( - unicode[slug][prop] || - (unicode[slug][prop] = invertBmp(unicode[slug].bmp)) - ); + if (!unicode.hasOwnProperty(slug)) { + throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); } - // Combines and optionally negates BMP and astral data - function buildAstral(slug, isNegated) { - var item = unicode[slug]; - var combined = ''; + if (typePrefix) { + if (!(unicodeTypes[typePrefix] && unicodeTypes[typePrefix][slug])) { + throw new SyntaxError(ERR_UNKNOWN_NAME + fullToken); + } + } // Switch to the negated form of the referenced Unicode token - if (item.bmp && !item.isBmpLast) { - combined = '[' + item.bmp + ']' + (item.astral ? '|' : ''); - } - if (item.astral) { - combined += item.astral; - } - if (item.isBmpLast && item.bmp) { - combined += (item.astral ? '|' : '') + '[' + item.bmp + ']'; - } - // Astral Unicode tokens always match a code point, never a code unit - return isNegated ? - '(?:(?!' + combined + ')(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))' : - '(?:' + combined + ')'; + if (item.inverseOf) { + slug = normalize(item.inverseOf); + + if (!unicode.hasOwnProperty(slug)) { + var _context3; + + throw new ReferenceError((0, _concat["default"])(_context3 = "".concat(ERR_UNKNOWN_REF + fullToken, " -> ")).call(_context3, item.inverseOf)); + } + + item = unicode[slug]; + isNegated = !isNegated; } - // Builds a complete astral pattern on first use - function cacheAstral(slug, isNegated) { - var prop = isNegated ? 'a!' : 'a='; - return ( - unicode[slug][prop] || - (unicode[slug][prop] = buildAstral(slug, isNegated)) - ); + if (!(item.bmp || isAstralMode)) { + throw new SyntaxError(ERR_ASTRAL_ONLY + fullToken); } - // ==--------------------------== - // Core functionality - // ==--------------------------== - - /* - * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`. - */ - XRegExp.addToken( - // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}` - /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, - function(match, scope, flags) { - var ERR_DOUBLE_NEG = 'Invalid double negation '; - var ERR_UNKNOWN_NAME = 'Unknown Unicode token '; - var ERR_UNKNOWN_REF = 'Unicode token missing data '; - var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token '; - var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; - // Negated via \P{..} or \p{^..} - var isNegated = match[1] === 'P' || !!match[2]; - // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A - var isAstralMode = flags.indexOf('A') > -1; - // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}` - var slug = normalize(match[4] || match[3]); - // Token data object - var item = unicode[slug]; - - if (match[1] === 'P' && match[2]) { - throw new SyntaxError(ERR_DOUBLE_NEG + match[0]); - } - if (!unicode.hasOwnProperty(slug)) { - throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]); - } + if (isAstralMode) { + if (scope === 'class') { + throw new SyntaxError(ERR_ASTRAL_IN_CLASS); + } - // Switch to the negated form of the referenced Unicode token - if (item.inverseOf) { - slug = normalize(item.inverseOf); - if (!unicode.hasOwnProperty(slug)) { - throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf); - } - item = unicode[slug]; - isNegated = !isNegated; - } + return cacheAstral(slug, isNegated); + } - if (!(item.bmp || isAstralMode)) { - throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]); - } - if (isAstralMode) { - if (scope === 'class') { - throw new SyntaxError(ERR_ASTRAL_IN_CLASS); - } + return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : "".concat((isNegated ? '[^' : '[') + item.bmp, "]"); + }, { + scope: 'all', + optionalFlags: 'A', + leadChar: '\\' + }); + /** + * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. + * + * @memberOf XRegExp + * @param {Array} data Objects with named character ranges. Each object may have properties + * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are + * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If + * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, + * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are + * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and + * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan + * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and + * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape + * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be + * escaped, apart from range-creating hyphens. The `astral` data can additionally use + * character classes and alternation, and should use surrogate pairs to represent astral code + * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is + * defined as the exact inverse of another token. + * @param {String} [typePrefix] Enables optionally using this type as a prefix for all of the + * provided Unicode tokens, e.g. if given `'Type'`, then `\p{TokenName}` can also be written + * as `\p{Type=TokenName}`. + * @example + * + * // Basic use + * XRegExp.addUnicodeData([{ + * name: 'XDigit', + * alias: 'Hexadecimal', + * bmp: '0-9A-Fa-f' + * }]); + * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true + */ + + XRegExp.addUnicodeData = function (data, typePrefix) { + var ERR_NO_NAME = 'Unicode token requires name'; + var ERR_NO_DATA = 'Unicode token has no character data '; + + if (typePrefix) { + // Case sensitive to match ES2018 + unicodeTypes[typePrefix] = {}; + } - return cacheAstral(slug, isNegated); - } + var _iterator = _createForOfIteratorHelper(data), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var item = _step.value; - return scope === 'class' ? - (isNegated ? cacheInvertedBmp(slug) : item.bmp) : - (isNegated ? '[^' : '[') + item.bmp + ']'; - }, - { - scope: 'all', - optionalFlags: 'A', - leadChar: '\\' + if (!item.name) { + throw new Error(ERR_NO_NAME); } - ); - - /** - * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`. - * - * @memberOf XRegExp - * @param {Array} data Objects with named character ranges. Each object may have properties - * `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are - * optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If - * `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent, - * the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are - * provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and - * `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan - * high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and - * `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape - * sequences, with hyphens to create ranges. Any regex metacharacters in the data should be - * escaped, apart from range-creating hyphens. The `astral` data can additionally use - * character classes and alternation, and should use surrogate pairs to represent astral code - * points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is - * defined as the exact inverse of another token. - * @example - * - * // Basic use - * XRegExp.addUnicodeData([{ - * name: 'XDigit', - * alias: 'Hexadecimal', - * bmp: '0-9A-Fa-f' - * }]); - * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true - */ - XRegExp.addUnicodeData = function(data) { - var ERR_NO_NAME = 'Unicode token requires name'; - var ERR_NO_DATA = 'Unicode token has no character data '; - var item; - - for (var i = 0; i < data.length; ++i) { - item = data[i]; - if (!item.name) { - throw new Error(ERR_NO_NAME); - } - if (!(item.inverseOf || item.bmp || item.astral)) { - throw new Error(ERR_NO_DATA + item.name); - } - unicode[normalize(item.name)] = item; - if (item.alias) { - unicode[normalize(item.alias)] = item; - } + + if (!(item.inverseOf || item.bmp || item.astral)) { + throw new Error(ERR_NO_DATA + item.name); } - // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and - // flags might now produce different results - XRegExp.cache.flush('patterns'); - }; + var normalizedName = normalize(item.name); + unicode[normalizedName] = item; - /** - * @ignore - * - * Return a reference to the internal Unicode definition structure for the given Unicode - * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex - * constructs. - * - * @memberOf XRegExp - * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), - * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode - * Properties and Property Aliases. - * @returns {Object} Reference to definition structure when the name matches a Unicode Property. - * - * @note - * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. - * - * @note - * This method is *not* part of the officially documented API and may change or be removed in - * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode - * structures set up by XRegExp. - */ - XRegExp._getUnicodeProperty = function(name) { - var slug = normalize(name); - return unicode[slug]; - }; + if (typePrefix) { + unicodeTypes[typePrefix][normalizedName] = true; + } -}; + if (item.alias) { + var normalizedAlias = normalize(item.alias); + unicode[normalizedAlias] = item; -},{}],4:[function(require,module,exports){ -/*! - * XRegExp Unicode Blocks 3.2.0 - * <xregexp.com> - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */ + if (typePrefix) { + unicodeTypes[typePrefix][normalizedAlias] = true; + } + } + } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and + // flags might now produce different results -module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g., - * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and - * underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks'); + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - XRegExp.addUnicodeData([ - { - name: 'InAdlam', - astral: '\uD83A[\uDD00-\uDD5F]' - }, - { - name: 'InAegean_Numbers', - astral: '\uD800[\uDD00-\uDD3F]' - }, - { - name: 'InAhom', - astral: '\uD805[\uDF00-\uDF3F]' - }, - { - name: 'InAlchemical_Symbols', - astral: '\uD83D[\uDF00-\uDF7F]' - }, - { - name: 'InAlphabetic_Presentation_Forms', - bmp: '\uFB00-\uFB4F' - }, - { - name: 'InAnatolian_Hieroglyphs', - astral: '\uD811[\uDC00-\uDE7F]' - }, - { - name: 'InAncient_Greek_Musical_Notation', - astral: '\uD834[\uDE00-\uDE4F]' - }, - { - name: 'InAncient_Greek_Numbers', - astral: '\uD800[\uDD40-\uDD8F]' - }, - { - name: 'InAncient_Symbols', - astral: '\uD800[\uDD90-\uDDCF]' - }, - { - name: 'InArabic', - bmp: '\u0600-\u06FF' - }, - { - name: 'InArabic_Extended_A', - bmp: '\u08A0-\u08FF' - }, - { - name: 'InArabic_Mathematical_Alphabetic_Symbols', - astral: '\uD83B[\uDE00-\uDEFF]' - }, - { - name: 'InArabic_Presentation_Forms_A', - bmp: '\uFB50-\uFDFF' - }, - { - name: 'InArabic_Presentation_Forms_B', - bmp: '\uFE70-\uFEFF' - }, - { - name: 'InArabic_Supplement', - bmp: '\u0750-\u077F' - }, - { - name: 'InArmenian', - bmp: '\u0530-\u058F' - }, - { - name: 'InArrows', - bmp: '\u2190-\u21FF' - }, - { - name: 'InAvestan', - astral: '\uD802[\uDF00-\uDF3F]' - }, - { - name: 'InBalinese', - bmp: '\u1B00-\u1B7F' - }, - { - name: 'InBamum', - bmp: '\uA6A0-\uA6FF' - }, - { - name: 'InBamum_Supplement', - astral: '\uD81A[\uDC00-\uDE3F]' - }, - { - name: 'InBasic_Latin', - bmp: '\0-\x7F' - }, - { - name: 'InBassa_Vah', - astral: '\uD81A[\uDED0-\uDEFF]' - }, - { - name: 'InBatak', - bmp: '\u1BC0-\u1BFF' - }, - { - name: 'InBengali', - bmp: '\u0980-\u09FF' - }, - { - name: 'InBhaiksuki', - astral: '\uD807[\uDC00-\uDC6F]' - }, - { - name: 'InBlock_Elements', - bmp: '\u2580-\u259F' - }, - { - name: 'InBopomofo', - bmp: '\u3100-\u312F' - }, - { - name: 'InBopomofo_Extended', - bmp: '\u31A0-\u31BF' - }, - { - name: 'InBox_Drawing', - bmp: '\u2500-\u257F' - }, - { - name: 'InBrahmi', - astral: '\uD804[\uDC00-\uDC7F]' - }, - { - name: 'InBraille_Patterns', - bmp: '\u2800-\u28FF' - }, - { - name: 'InBuginese', - bmp: '\u1A00-\u1A1F' - }, - { - name: 'InBuhid', - bmp: '\u1740-\u175F' - }, - { - name: 'InByzantine_Musical_Symbols', - astral: '\uD834[\uDC00-\uDCFF]' - }, - { - name: 'InCJK_Compatibility', - bmp: '\u3300-\u33FF' - }, - { - name: 'InCJK_Compatibility_Forms', - bmp: '\uFE30-\uFE4F' - }, - { - name: 'InCJK_Compatibility_Ideographs', - bmp: '\uF900-\uFAFF' - }, - { - name: 'InCJK_Compatibility_Ideographs_Supplement', - astral: '\uD87E[\uDC00-\uDE1F]' - }, - { - name: 'InCJK_Radicals_Supplement', - bmp: '\u2E80-\u2EFF' - }, - { - name: 'InCJK_Strokes', - bmp: '\u31C0-\u31EF' - }, - { - name: 'InCJK_Symbols_and_Punctuation', - bmp: '\u3000-\u303F' - }, - { - name: 'InCJK_Unified_Ideographs', - bmp: '\u4E00-\u9FFF' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_A', - bmp: '\u3400-\u4DBF' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_B', - astral: '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_C', - astral: '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_D', - astral: '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]' - }, - { - name: 'InCJK_Unified_Ideographs_Extension_E', - astral: '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]' - }, - { - name: 'InCarian', - astral: '\uD800[\uDEA0-\uDEDF]' - }, - { - name: 'InCaucasian_Albanian', - astral: '\uD801[\uDD30-\uDD6F]' - }, - { - name: 'InChakma', - astral: '\uD804[\uDD00-\uDD4F]' - }, - { - name: 'InCham', - bmp: '\uAA00-\uAA5F' - }, - { - name: 'InCherokee', - bmp: '\u13A0-\u13FF' - }, - { - name: 'InCherokee_Supplement', - bmp: '\uAB70-\uABBF' - }, - { - name: 'InCombining_Diacritical_Marks', - bmp: '\u0300-\u036F' - }, - { - name: 'InCombining_Diacritical_Marks_Extended', - bmp: '\u1AB0-\u1AFF' - }, - { - name: 'InCombining_Diacritical_Marks_Supplement', - bmp: '\u1DC0-\u1DFF' - }, - { - name: 'InCombining_Diacritical_Marks_for_Symbols', - bmp: '\u20D0-\u20FF' - }, - { - name: 'InCombining_Half_Marks', - bmp: '\uFE20-\uFE2F' - }, - { - name: 'InCommon_Indic_Number_Forms', - bmp: '\uA830-\uA83F' - }, - { - name: 'InControl_Pictures', - bmp: '\u2400-\u243F' - }, - { - name: 'InCoptic', - bmp: '\u2C80-\u2CFF' - }, - { - name: 'InCoptic_Epact_Numbers', - astral: '\uD800[\uDEE0-\uDEFF]' - }, - { - name: 'InCounting_Rod_Numerals', - astral: '\uD834[\uDF60-\uDF7F]' - }, - { - name: 'InCuneiform', - astral: '\uD808[\uDC00-\uDFFF]' - }, - { - name: 'InCuneiform_Numbers_and_Punctuation', - astral: '\uD809[\uDC00-\uDC7F]' - }, - { - name: 'InCurrency_Symbols', - bmp: '\u20A0-\u20CF' - }, - { - name: 'InCypriot_Syllabary', - astral: '\uD802[\uDC00-\uDC3F]' - }, - { - name: 'InCyrillic', - bmp: '\u0400-\u04FF' - }, - { - name: 'InCyrillic_Extended_A', - bmp: '\u2DE0-\u2DFF' - }, - { - name: 'InCyrillic_Extended_B', - bmp: '\uA640-\uA69F' - }, - { - name: 'InCyrillic_Extended_C', - bmp: '\u1C80-\u1C8F' - }, - { - name: 'InCyrillic_Supplement', - bmp: '\u0500-\u052F' - }, - { - name: 'InDeseret', - astral: '\uD801[\uDC00-\uDC4F]' - }, - { - name: 'InDevanagari', - bmp: '\u0900-\u097F' - }, - { - name: 'InDevanagari_Extended', - bmp: '\uA8E0-\uA8FF' - }, - { - name: 'InDingbats', - bmp: '\u2700-\u27BF' - }, - { - name: 'InDomino_Tiles', - astral: '\uD83C[\uDC30-\uDC9F]' - }, - { - name: 'InDuployan', - astral: '\uD82F[\uDC00-\uDC9F]' - }, - { - name: 'InEarly_Dynastic_Cuneiform', - astral: '\uD809[\uDC80-\uDD4F]' - }, - { - name: 'InEgyptian_Hieroglyphs', - astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]' - }, - { - name: 'InElbasan', - astral: '\uD801[\uDD00-\uDD2F]' - }, - { - name: 'InEmoticons', - astral: '\uD83D[\uDE00-\uDE4F]' - }, - { - name: 'InEnclosed_Alphanumeric_Supplement', - astral: '\uD83C[\uDD00-\uDDFF]' - }, - { - name: 'InEnclosed_Alphanumerics', - bmp: '\u2460-\u24FF' - }, - { - name: 'InEnclosed_CJK_Letters_and_Months', - bmp: '\u3200-\u32FF' - }, - { - name: 'InEnclosed_Ideographic_Supplement', - astral: '\uD83C[\uDE00-\uDEFF]' - }, - { - name: 'InEthiopic', - bmp: '\u1200-\u137F' - }, - { - name: 'InEthiopic_Extended', - bmp: '\u2D80-\u2DDF' - }, - { - name: 'InEthiopic_Extended_A', - bmp: '\uAB00-\uAB2F' - }, - { - name: 'InEthiopic_Supplement', - bmp: '\u1380-\u139F' - }, - { - name: 'InGeneral_Punctuation', - bmp: '\u2000-\u206F' - }, - { - name: 'InGeometric_Shapes', - bmp: '\u25A0-\u25FF' - }, - { - name: 'InGeometric_Shapes_Extended', - astral: '\uD83D[\uDF80-\uDFFF]' - }, - { - name: 'InGeorgian', - bmp: '\u10A0-\u10FF' - }, - { - name: 'InGeorgian_Supplement', - bmp: '\u2D00-\u2D2F' - }, - { - name: 'InGlagolitic', - bmp: '\u2C00-\u2C5F' - }, - { - name: 'InGlagolitic_Supplement', - astral: '\uD838[\uDC00-\uDC2F]' - }, - { - name: 'InGothic', - astral: '\uD800[\uDF30-\uDF4F]' - }, - { - name: 'InGrantha', - astral: '\uD804[\uDF00-\uDF7F]' - }, - { - name: 'InGreek_Extended', - bmp: '\u1F00-\u1FFF' - }, - { - name: 'InGreek_and_Coptic', - bmp: '\u0370-\u03FF' - }, - { - name: 'InGujarati', - bmp: '\u0A80-\u0AFF' - }, - { - name: 'InGurmukhi', - bmp: '\u0A00-\u0A7F' - }, - { - name: 'InHalfwidth_and_Fullwidth_Forms', - bmp: '\uFF00-\uFFEF' - }, - { - name: 'InHangul_Compatibility_Jamo', - bmp: '\u3130-\u318F' - }, - { - name: 'InHangul_Jamo', - bmp: '\u1100-\u11FF' - }, - { - name: 'InHangul_Jamo_Extended_A', - bmp: '\uA960-\uA97F' - }, - { - name: 'InHangul_Jamo_Extended_B', - bmp: '\uD7B0-\uD7FF' - }, - { - name: 'InHangul_Syllables', - bmp: '\uAC00-\uD7AF' - }, - { - name: 'InHanunoo', - bmp: '\u1720-\u173F' - }, - { - name: 'InHatran', - astral: '\uD802[\uDCE0-\uDCFF]' - }, - { - name: 'InHebrew', - bmp: '\u0590-\u05FF' - }, - { - name: 'InHigh_Private_Use_Surrogates', - bmp: '\uDB80-\uDBFF' - }, - { - name: 'InHigh_Surrogates', - bmp: '\uD800-\uDB7F' - }, - { - name: 'InHiragana', - bmp: '\u3040-\u309F' - }, - { - name: 'InIPA_Extensions', - bmp: '\u0250-\u02AF' - }, - { - name: 'InIdeographic_Description_Characters', - bmp: '\u2FF0-\u2FFF' - }, - { - name: 'InIdeographic_Symbols_and_Punctuation', - astral: '\uD81B[\uDFE0-\uDFFF]' - }, - { - name: 'InImperial_Aramaic', - astral: '\uD802[\uDC40-\uDC5F]' - }, - { - name: 'InInscriptional_Pahlavi', - astral: '\uD802[\uDF60-\uDF7F]' - }, - { - name: 'InInscriptional_Parthian', - astral: '\uD802[\uDF40-\uDF5F]' - }, - { - name: 'InJavanese', - bmp: '\uA980-\uA9DF' - }, - { - name: 'InKaithi', - astral: '\uD804[\uDC80-\uDCCF]' - }, - { - name: 'InKana_Supplement', - astral: '\uD82C[\uDC00-\uDCFF]' - }, - { - name: 'InKanbun', - bmp: '\u3190-\u319F' - }, - { - name: 'InKangxi_Radicals', - bmp: '\u2F00-\u2FDF' - }, - { - name: 'InKannada', - bmp: '\u0C80-\u0CFF' - }, - { - name: 'InKatakana', - bmp: '\u30A0-\u30FF' - }, - { - name: 'InKatakana_Phonetic_Extensions', - bmp: '\u31F0-\u31FF' - }, - { - name: 'InKayah_Li', - bmp: '\uA900-\uA92F' - }, - { - name: 'InKharoshthi', - astral: '\uD802[\uDE00-\uDE5F]' - }, - { - name: 'InKhmer', - bmp: '\u1780-\u17FF' - }, - { - name: 'InKhmer_Symbols', - bmp: '\u19E0-\u19FF' - }, - { - name: 'InKhojki', - astral: '\uD804[\uDE00-\uDE4F]' - }, - { - name: 'InKhudawadi', - astral: '\uD804[\uDEB0-\uDEFF]' - }, - { - name: 'InLao', - bmp: '\u0E80-\u0EFF' - }, - { - name: 'InLatin_Extended_Additional', - bmp: '\u1E00-\u1EFF' - }, - { - name: 'InLatin_Extended_A', - bmp: '\u0100-\u017F' - }, - { - name: 'InLatin_Extended_B', - bmp: '\u0180-\u024F' - }, - { - name: 'InLatin_Extended_C', - bmp: '\u2C60-\u2C7F' - }, - { - name: 'InLatin_Extended_D', - bmp: '\uA720-\uA7FF' - }, - { - name: 'InLatin_Extended_E', - bmp: '\uAB30-\uAB6F' - }, - { - name: 'InLatin_1_Supplement', - bmp: '\x80-\xFF' - }, - { - name: 'InLepcha', - bmp: '\u1C00-\u1C4F' - }, - { - name: 'InLetterlike_Symbols', - bmp: '\u2100-\u214F' - }, - { - name: 'InLimbu', - bmp: '\u1900-\u194F' - }, - { - name: 'InLinear_A', - astral: '\uD801[\uDE00-\uDF7F]' - }, - { - name: 'InLinear_B_Ideograms', - astral: '\uD800[\uDC80-\uDCFF]' - }, - { - name: 'InLinear_B_Syllabary', - astral: '\uD800[\uDC00-\uDC7F]' - }, - { - name: 'InLisu', - bmp: '\uA4D0-\uA4FF' - }, - { - name: 'InLow_Surrogates', - bmp: '\uDC00-\uDFFF' - }, - { - name: 'InLycian', - astral: '\uD800[\uDE80-\uDE9F]' - }, - { - name: 'InLydian', - astral: '\uD802[\uDD20-\uDD3F]' - }, - { - name: 'InMahajani', - astral: '\uD804[\uDD50-\uDD7F]' - }, - { - name: 'InMahjong_Tiles', - astral: '\uD83C[\uDC00-\uDC2F]' - }, - { - name: 'InMalayalam', - bmp: '\u0D00-\u0D7F' - }, - { - name: 'InMandaic', - bmp: '\u0840-\u085F' - }, - { - name: 'InManichaean', - astral: '\uD802[\uDEC0-\uDEFF]' - }, - { - name: 'InMarchen', - astral: '\uD807[\uDC70-\uDCBF]' - }, - { - name: 'InMathematical_Alphanumeric_Symbols', - astral: '\uD835[\uDC00-\uDFFF]' - }, - { - name: 'InMathematical_Operators', - bmp: '\u2200-\u22FF' - }, - { - name: 'InMeetei_Mayek', - bmp: '\uABC0-\uABFF' - }, - { - name: 'InMeetei_Mayek_Extensions', - bmp: '\uAAE0-\uAAFF' - }, - { - name: 'InMende_Kikakui', - astral: '\uD83A[\uDC00-\uDCDF]' - }, - { - name: 'InMeroitic_Cursive', - astral: '\uD802[\uDDA0-\uDDFF]' - }, - { - name: 'InMeroitic_Hieroglyphs', - astral: '\uD802[\uDD80-\uDD9F]' - }, - { - name: 'InMiao', - astral: '\uD81B[\uDF00-\uDF9F]' - }, - { - name: 'InMiscellaneous_Mathematical_Symbols_A', - bmp: '\u27C0-\u27EF' - }, - { - name: 'InMiscellaneous_Mathematical_Symbols_B', - bmp: '\u2980-\u29FF' - }, - { - name: 'InMiscellaneous_Symbols', - bmp: '\u2600-\u26FF' - }, - { - name: 'InMiscellaneous_Symbols_and_Arrows', - bmp: '\u2B00-\u2BFF' - }, - { - name: 'InMiscellaneous_Symbols_and_Pictographs', - astral: '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]' - }, - { - name: 'InMiscellaneous_Technical', - bmp: '\u2300-\u23FF' - }, - { - name: 'InModi', - astral: '\uD805[\uDE00-\uDE5F]' - }, - { - name: 'InModifier_Tone_Letters', - bmp: '\uA700-\uA71F' - }, - { - name: 'InMongolian', - bmp: '\u1800-\u18AF' - }, - { - name: 'InMongolian_Supplement', - astral: '\uD805[\uDE60-\uDE7F]' - }, - { - name: 'InMro', - astral: '\uD81A[\uDE40-\uDE6F]' - }, - { - name: 'InMultani', - astral: '\uD804[\uDE80-\uDEAF]' - }, - { - name: 'InMusical_Symbols', - astral: '\uD834[\uDD00-\uDDFF]' - }, - { - name: 'InMyanmar', - bmp: '\u1000-\u109F' - }, - { - name: 'InMyanmar_Extended_A', - bmp: '\uAA60-\uAA7F' - }, - { - name: 'InMyanmar_Extended_B', - bmp: '\uA9E0-\uA9FF' - }, - { - name: 'InNKo', - bmp: '\u07C0-\u07FF' - }, - { - name: 'InNabataean', - astral: '\uD802[\uDC80-\uDCAF]' - }, - { - name: 'InNew_Tai_Lue', - bmp: '\u1980-\u19DF' - }, - { - name: 'InNewa', - astral: '\uD805[\uDC00-\uDC7F]' - }, - { - name: 'InNumber_Forms', - bmp: '\u2150-\u218F' - }, - { - name: 'InOgham', - bmp: '\u1680-\u169F' - }, - { - name: 'InOl_Chiki', - bmp: '\u1C50-\u1C7F' - }, - { - name: 'InOld_Hungarian', - astral: '\uD803[\uDC80-\uDCFF]' - }, - { - name: 'InOld_Italic', - astral: '\uD800[\uDF00-\uDF2F]' - }, - { - name: 'InOld_North_Arabian', - astral: '\uD802[\uDE80-\uDE9F]' - }, - { - name: 'InOld_Permic', - astral: '\uD800[\uDF50-\uDF7F]' - }, - { - name: 'InOld_Persian', - astral: '\uD800[\uDFA0-\uDFDF]' - }, - { - name: 'InOld_South_Arabian', - astral: '\uD802[\uDE60-\uDE7F]' - }, - { - name: 'InOld_Turkic', - astral: '\uD803[\uDC00-\uDC4F]' - }, - { - name: 'InOptical_Character_Recognition', - bmp: '\u2440-\u245F' - }, - { - name: 'InOriya', - bmp: '\u0B00-\u0B7F' - }, - { - name: 'InOrnamental_Dingbats', - astral: '\uD83D[\uDE50-\uDE7F]' - }, - { - name: 'InOsage', - astral: '\uD801[\uDCB0-\uDCFF]' - }, - { - name: 'InOsmanya', - astral: '\uD801[\uDC80-\uDCAF]' - }, - { - name: 'InPahawh_Hmong', - astral: '\uD81A[\uDF00-\uDF8F]' - }, - { - name: 'InPalmyrene', - astral: '\uD802[\uDC60-\uDC7F]' - }, - { - name: 'InPau_Cin_Hau', - astral: '\uD806[\uDEC0-\uDEFF]' - }, - { - name: 'InPhags_pa', - bmp: '\uA840-\uA87F' - }, - { - name: 'InPhaistos_Disc', - astral: '\uD800[\uDDD0-\uDDFF]' - }, - { - name: 'InPhoenician', - astral: '\uD802[\uDD00-\uDD1F]' - }, - { - name: 'InPhonetic_Extensions', - bmp: '\u1D00-\u1D7F' - }, - { - name: 'InPhonetic_Extensions_Supplement', - bmp: '\u1D80-\u1DBF' - }, - { - name: 'InPlaying_Cards', - astral: '\uD83C[\uDCA0-\uDCFF]' - }, - { - name: 'InPrivate_Use_Area', - bmp: '\uE000-\uF8FF' - }, - { - name: 'InPsalter_Pahlavi', - astral: '\uD802[\uDF80-\uDFAF]' - }, - { - name: 'InRejang', - bmp: '\uA930-\uA95F' - }, - { - name: 'InRumi_Numeral_Symbols', - astral: '\uD803[\uDE60-\uDE7F]' - }, - { - name: 'InRunic', - bmp: '\u16A0-\u16FF' - }, - { - name: 'InSamaritan', - bmp: '\u0800-\u083F' - }, - { - name: 'InSaurashtra', - bmp: '\uA880-\uA8DF' - }, - { - name: 'InSharada', - astral: '\uD804[\uDD80-\uDDDF]' - }, - { - name: 'InShavian', - astral: '\uD801[\uDC50-\uDC7F]' - }, - { - name: 'InShorthand_Format_Controls', - astral: '\uD82F[\uDCA0-\uDCAF]' - }, - { - name: 'InSiddham', - astral: '\uD805[\uDD80-\uDDFF]' - }, - { - name: 'InSinhala', - bmp: '\u0D80-\u0DFF' - }, - { - name: 'InSinhala_Archaic_Numbers', - astral: '\uD804[\uDDE0-\uDDFF]' - }, - { - name: 'InSmall_Form_Variants', - bmp: '\uFE50-\uFE6F' - }, - { - name: 'InSora_Sompeng', - astral: '\uD804[\uDCD0-\uDCFF]' - }, - { - name: 'InSpacing_Modifier_Letters', - bmp: '\u02B0-\u02FF' - }, - { - name: 'InSpecials', - bmp: '\uFFF0-\uFFFF' - }, - { - name: 'InSundanese', - bmp: '\u1B80-\u1BBF' - }, - { - name: 'InSundanese_Supplement', - bmp: '\u1CC0-\u1CCF' - }, - { - name: 'InSuperscripts_and_Subscripts', - bmp: '\u2070-\u209F' - }, - { - name: 'InSupplemental_Arrows_A', - bmp: '\u27F0-\u27FF' - }, - { - name: 'InSupplemental_Arrows_B', - bmp: '\u2900-\u297F' - }, - { - name: 'InSupplemental_Arrows_C', - astral: '\uD83E[\uDC00-\uDCFF]' - }, - { - name: 'InSupplemental_Mathematical_Operators', - bmp: '\u2A00-\u2AFF' - }, - { - name: 'InSupplemental_Punctuation', - bmp: '\u2E00-\u2E7F' - }, - { - name: 'InSupplemental_Symbols_and_Pictographs', - astral: '\uD83E[\uDD00-\uDDFF]' - }, - { - name: 'InSupplementary_Private_Use_Area_A', - astral: '[\uDB80-\uDBBF][\uDC00-\uDFFF]' - }, - { - name: 'InSupplementary_Private_Use_Area_B', - astral: '[\uDBC0-\uDBFF][\uDC00-\uDFFF]' - }, - { - name: 'InSutton_SignWriting', - astral: '\uD836[\uDC00-\uDEAF]' - }, - { - name: 'InSyloti_Nagri', - bmp: '\uA800-\uA82F' - }, - { - name: 'InSyriac', - bmp: '\u0700-\u074F' - }, - { - name: 'InTagalog', - bmp: '\u1700-\u171F' - }, - { - name: 'InTagbanwa', - bmp: '\u1760-\u177F' - }, - { - name: 'InTags', - astral: '\uDB40[\uDC00-\uDC7F]' - }, - { - name: 'InTai_Le', - bmp: '\u1950-\u197F' - }, - { - name: 'InTai_Tham', - bmp: '\u1A20-\u1AAF' - }, - { - name: 'InTai_Viet', - bmp: '\uAA80-\uAADF' - }, - { - name: 'InTai_Xuan_Jing_Symbols', - astral: '\uD834[\uDF00-\uDF5F]' - }, - { - name: 'InTakri', - astral: '\uD805[\uDE80-\uDECF]' - }, - { - name: 'InTamil', - bmp: '\u0B80-\u0BFF' - }, - { - name: 'InTangut', - astral: '[\uD81C-\uD821][\uDC00-\uDFFF]' - }, - { - name: 'InTangut_Components', - astral: '\uD822[\uDC00-\uDEFF]' - }, - { - name: 'InTelugu', - bmp: '\u0C00-\u0C7F' - }, - { - name: 'InThaana', - bmp: '\u0780-\u07BF' - }, - { - name: 'InThai', - bmp: '\u0E00-\u0E7F' - }, - { - name: 'InTibetan', - bmp: '\u0F00-\u0FFF' - }, - { - name: 'InTifinagh', - bmp: '\u2D30-\u2D7F' - }, - { - name: 'InTirhuta', - astral: '\uD805[\uDC80-\uDCDF]' - }, - { - name: 'InTransport_and_Map_Symbols', - astral: '\uD83D[\uDE80-\uDEFF]' - }, - { - name: 'InUgaritic', - astral: '\uD800[\uDF80-\uDF9F]' - }, - { - name: 'InUnified_Canadian_Aboriginal_Syllabics', - bmp: '\u1400-\u167F' - }, - { - name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended', - bmp: '\u18B0-\u18FF' - }, - { - name: 'InVai', - bmp: '\uA500-\uA63F' - }, - { - name: 'InVariation_Selectors', - bmp: '\uFE00-\uFE0F' - }, - { - name: 'InVariation_Selectors_Supplement', - astral: '\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'InVedic_Extensions', - bmp: '\u1CD0-\u1CFF' - }, - { - name: 'InVertical_Forms', - bmp: '\uFE10-\uFE1F' - }, - { - name: 'InWarang_Citi', - astral: '\uD806[\uDCA0-\uDCFF]' - }, - { - name: 'InYi_Radicals', - bmp: '\uA490-\uA4CF' - }, - { - name: 'InYi_Syllables', - bmp: '\uA000-\uA48F' - }, - { - name: 'InYijing_Hexagram_Symbols', - bmp: '\u4DC0-\u4DFF' - } - ]); - + XRegExp.cache.flush('patterns'); + }; + /** + * @ignore + * + * Return a reference to the internal Unicode definition structure for the given Unicode + * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex + * constructs. + * + * @memberOf XRegExp + * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive), + * e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode + * Properties and Property Aliases. + * @returns {Object} Reference to definition structure when the name matches a Unicode Property. + * + * @note + * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories. + * + * @note + * This method is *not* part of the officially documented API and may change or be removed in + * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode + * structures set up by XRegExp. + */ + + + XRegExp._getUnicodeProperty = function (name) { + var slug = normalize(name); + return unicode[slug]; + }; }; -},{}],5:[function(require,module,exports){ -/*! - * XRegExp Unicode Categories 3.2.0 - * <xregexp.com> - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */ +exports["default"] = _default; +module.exports = exports.default; +},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(require,module,exports){ +"use strict"; -module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See - * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token - * names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); - } +var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - XRegExp.addUnicodeData([ - { - name: 'C', - alias: 'Other', - isBmpLast: true, - bmp: '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', - astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' - }, - { - name: 'Cc', - alias: 'Control', - bmp: '\0-\x1F\x7F-\x9F' - }, - { - name: 'Cf', - alias: 'Format', - bmp: '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', - astral: '\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - name: 'Cn', - alias: 'Unassigned', - bmp: '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u0560\u0588\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08B5\u08BE-\u08D3\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0AFA-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C04\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D00\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1CBF\u1CC8-\u1CCF\u1CF7\u1CFA-\u1CFF\u1DF6-\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20BF-\u20CF\u20F1-\u20FF\u218C-\u218F\u23FF\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2BBA-\u2BBC\u2BC9\u2BD2-\u2BEB\u2BF0-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E45-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FD6-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7AF\uA7B8-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA8FE\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB66-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', - astral: '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2F\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE34-\uDE37\uDE3B-\uDE3E\uDE48-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD00-\uDE5F\uDE7F-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD44-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF3B\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC5E-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB8-\uDEBF\uDECA-\uDEFF\uDF1A-\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC00-\uDC9F\uDCF3-\uDCFE\uDD00-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD874-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDEFF\uDF45-\uDF4F\uDF7F-\uDF8E\uDFA0-\uDFDF\uDFE1-\uDFFF]|\uD821[\uDFED-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDC02-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEFF\uDF57-\uDF5F\uDF72-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4B-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD2F\uDD6C-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDEFF]|\uD83D[\uDED3-\uDEDF\uDEED-\uDEEF\uDEF7-\uDEFF\uDF74-\uDF7F\uDFD5-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDD0F\uDD1F\uDD28-\uDD2F\uDD31\uDD32\uDD3F\uDD4C-\uDD4F\uDD5F-\uDD7F\uDD92-\uDDBF\uDDC1-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - name: 'Co', - alias: 'Private_Use', - bmp: '\uE000-\uF8FF', - astral: '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' - }, - { - name: 'Cs', - alias: 'Surrogate', - bmp: '\uD800-\uDFFF' - }, - { - name: 'L', - alias: 'Letter', - bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Ll', - alias: 'Lowercase_Letter', - bmp: 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' - }, - { - name: 'Lm', - alias: 'Modifier_Letter', - bmp: '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F', - astral: '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0]' - }, - { - name: 'Lo', - alias: 'Other_Letter', - bmp: '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Lt', - alias: 'Titlecase_Letter', - bmp: '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' - }, - { - name: 'Lu', - alias: 'Uppercase_Letter', - bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', - astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' - }, - { - name: 'M', - alias: 'Mark', - bmp: '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDCA-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'Mc', - alias: 'Spacing_Mark', - bmp: '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF2\u1CF3\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BD-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', - astral: '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4]|\uD81B[\uDF51-\uDF7E]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' - }, - { - name: 'Me', - alias: 'Enclosing_Mark', - bmp: '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' - }, - { - name: 'Mn', - alias: 'Nonspacing_Mark', - bmp: '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', - astral: '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDCA-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'N', - alias: 'Number', - bmp: '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - astral: '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83C[\uDD00-\uDD0C]' - }, - { - name: 'Nd', - alias: 'Decimal_Number', - bmp: '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', - astral: '\uD801[\uDCA0-\uDCA9]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD83A[\uDD50-\uDD59]' - }, - { - name: 'Nl', - alias: 'Letter_Number', - bmp: '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', - astral: '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' - }, - { - name: 'No', - alias: 'Other_Number', - bmp: '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', - astral: '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE47\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C]|\uD81A[\uDF5B-\uDF61]|\uD834[\uDF60-\uDF71]|\uD83A[\uDCC7-\uDCCF]|\uD83C[\uDD00-\uDD0C]' - }, - { - name: 'P', - alias: 'Punctuation', - bmp: '\x21-\x23\x25-\\x2A\x2C-\x2F\x3A\x3B\\x3F\x40\\x5B-\\x5D\x5F\\x7B\x7D\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', - astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - name: 'Pc', - alias: 'Connector_Punctuation', - bmp: '\x5F\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' - }, - { - name: 'Pd', - alias: 'Dash_Punctuation', - bmp: '\\x2D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D' - }, - { - name: 'Pe', - alias: 'Close_Punctuation', - bmp: '\\x29\\x5D\x7D\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' - }, - { - name: 'Pf', - alias: 'Final_Punctuation', - bmp: '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' - }, - { - name: 'Pi', - alias: 'Initial_Punctuation', - bmp: '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' - }, - { - name: 'Po', - alias: 'Other_Punctuation', - bmp: '\x21-\x23\x25-\x27\\x2A\x2C\\x2E\x2F\x3A\x3B\\x3F\x40\\x5C\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166D\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43\u2E44\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', - astral: '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' - }, - { - name: 'Ps', - alias: 'Open_Punctuation', - bmp: '\\x28\\x5B\\x7B\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' - }, - { - name: 'S', - alias: 'Symbol', - bmp: '\\x24\\x2B\x3C-\x3E\\x5E\x60\\x7C\x7E\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BE\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', - astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83B[\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' - }, - { - name: 'Sc', - alias: 'Currency_Symbol', - bmp: '\\x24\xA2-\xA5\u058F\u060B\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BE\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6' - }, - { - name: 'Sk', - alias: 'Modifier_Symbol', - bmp: '\\x5E\x60\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3', - astral: '\uD83C[\uDFFB-\uDFFF]' - }, - { - name: 'Sm', - alias: 'Math_Symbol', - bmp: '\\x2B\x3C-\x3E\\x7C\x7E\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', - astral: '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' - }, - { - name: 'So', - alias: 'Other_Symbol', - bmp: '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u23FE\u2400-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u32FE\u3300-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', - astral: '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]' - }, - { - name: 'Z', - alias: 'Separator', - bmp: '\x20\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - }, - { - name: 'Zl', - alias: 'Line_Separator', - bmp: '\u2028' - }, - { - name: 'Zp', - alias: 'Paragraph_Separator', - bmp: '\u2029' - }, - { - name: 'Zs', - alias: 'Space_Separator', - bmp: '\x20\xA0\u1680\u2000-\u200A\u202F\u205F\u3000' - } - ]); +var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); -}; +_Object$defineProperty(exports, "__esModule", { + value: true +}); + +exports["default"] = void 0; + +var _categories = _interopRequireDefault(require("../../tools/output/categories")); -},{}],6:[function(require,module,exports){ /*! - * XRegExp Unicode Properties 3.2.0 + * XRegExp Unicode Categories 5.1.1 * <xregexp.com> - * Steven Levithan (c) 2012-2017 MIT License + * Steven Levithan (c) 2010-present MIT License * Unicode data by Mathias Bynens <mathiasbynens.be> */ +var _default = function _default(XRegExp) { + /** + * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See + * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token + * names are case insensitive, and any spaces, hyphens, and underscores are ignored. + * + * Uses Unicode 14.0.0. + * + * @requires XRegExp, Unicode Base + */ + if (!XRegExp.addUnicodeData) { + throw new ReferenceError('Unicode Base must be loaded before Unicode Categories'); + } + + XRegExp.addUnicodeData(_categories["default"]); +}; -module.exports = function(XRegExp) { - 'use strict'; - - /** - * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See - * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from - * UAX #44 <http://unicode.org/reports/tr44/>: - * - * - Alphabetic - * Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm + - * Lo + Nl + Other_Alphabetic. - * - * - Default_Ignorable_Code_Point - * For programmatic determination of default ignorable code points. New characters that should - * be ignored in rendering (unless explicitly supported) will be assigned in these ranges, - * permitting programs to correctly handle the default rendering of such characters when not - * otherwise supported. - * - * - Lowercase - * Characters with the Lowercase property. Generated from: Ll + Other_Lowercase. - * - * - Noncharacter_Code_Point - * Code points permanently reserved for internal use. - * - * - Uppercase - * Characters with the Uppercase property. Generated from: Lu + Other_Uppercase. - * - * - White_Space - * Spaces, separator characters and other control characters which should be treated by - * programming languages as "white space" for the purpose of parsing elements. - * - * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS - * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are - * included in XRegExp's Unicode Categories and Unicode Scripts addons. - * - * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ - - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Properties'); - } +exports["default"] = _default; +module.exports = exports.default; +},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(require,module,exports){ +"use strict"; - var unicodeData = [ - { - name: 'ASCII', - bmp: '\0-\x7F' - }, - { - name: 'Alphabetic', - bmp: 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u1062\u1065-\u1068\u106E-\u1086\u108E\u109C\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C35\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A\uAA7E-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDF00-\uDF19\uDF1D-\uDF2A]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF36\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Any', - isBmpLast: true, - bmp: '\0-\uFFFF', - astral: '[\uD800-\uDBFF][\uDC00-\uDFFF]' - }, - { - name: 'Default_Ignorable_Code_Point', - bmp: '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8', - astral: '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]' - }, - { - name: 'Lowercase', - bmp: 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', - astral: '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]' - }, - { - name: 'Noncharacter_Code_Point', - bmp: '\uFDD0-\uFDEF\uFFFE\uFFFF', - astral: '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]' - }, - { - name: 'Uppercase', - bmp: 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A', - astral: '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]' - }, - { - name: 'White_Space', - bmp: '\x09-\x0D\x20\x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' - } - ]; - - // Add non-generated data - unicodeData.push({ - name: 'Assigned', - // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode - // Categories addon is required to use this property - inverseOf: 'Cn' - }); +var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); - XRegExp.addUnicodeData(unicodeData); +var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); -}; +_Object$defineProperty(exports, "__esModule", { + value: true +}); -},{}],7:[function(require,module,exports){ -/*! - * XRegExp Unicode Scripts 3.2.0 - * <xregexp.com> - * Steven Levithan (c) 2010-2017 MIT License - * Unicode data by Mathias Bynens <mathiasbynens.be> - */ +exports["default"] = void 0; -module.exports = function(XRegExp) { - 'use strict'; +var _xregexp = _interopRequireDefault(require("./xregexp")); - /** - * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive, - * and any spaces, hyphens, and underscores are ignored. - * - * Uses Unicode 9.0.0. - * - * @requires XRegExp, Unicode Base - */ +var _unicodeBase = _interopRequireDefault(require("./addons/unicode-base")); - if (!XRegExp.addUnicodeData) { - throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts'); - } +var _unicodeCategories = _interopRequireDefault(require("./addons/unicode-categories")); - XRegExp.addUnicodeData([ - { - name: 'Adlam', - astral: '\uD83A[\uDD00-\uDD4A\uDD50-\uDD59\uDD5E\uDD5F]' - }, - { - name: 'Ahom', - astral: '\uD805[\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF3F]' - }, - { - name: 'Anatolian_Hieroglyphs', - astral: '\uD811[\uDC00-\uDE46]' - }, - { - name: 'Arabic', - bmp: '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC', - astral: '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]' - }, - { - name: 'Armenian', - bmp: '\u0531-\u0556\u0559-\u055F\u0561-\u0587\u058A\u058D-\u058F\uFB13-\uFB17' - }, - { - name: 'Avestan', - astral: '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]' - }, - { - name: 'Balinese', - bmp: '\u1B00-\u1B4B\u1B50-\u1B7C' - }, - { - name: 'Bamum', - bmp: '\uA6A0-\uA6F7', - astral: '\uD81A[\uDC00-\uDE38]' - }, - { - name: 'Bassa_Vah', - astral: '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]' - }, - { - name: 'Batak', - bmp: '\u1BC0-\u1BF3\u1BFC-\u1BFF' - }, - { - name: 'Bengali', - bmp: '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FB' - }, - { - name: 'Bhaiksuki', - astral: '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]' - }, - { - name: 'Bopomofo', - bmp: '\u02EA\u02EB\u3105-\u312D\u31A0-\u31BA' - }, - { - name: 'Brahmi', - astral: '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]' - }, - { - name: 'Braille', - bmp: '\u2800-\u28FF' - }, - { - name: 'Buginese', - bmp: '\u1A00-\u1A1B\u1A1E\u1A1F' - }, - { - name: 'Buhid', - bmp: '\u1740-\u1753' - }, - { - name: 'Canadian_Aboriginal', - bmp: '\u1400-\u167F\u18B0-\u18F5' - }, - { - name: 'Carian', - astral: '\uD800[\uDEA0-\uDED0]' - }, - { - name: 'Caucasian_Albanian', - astral: '\uD801[\uDD30-\uDD63\uDD6F]' - }, - { - name: 'Chakma', - astral: '\uD804[\uDD00-\uDD34\uDD36-\uDD43]' - }, - { - name: 'Cham', - bmp: '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F' - }, - { - name: 'Cherokee', - bmp: '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF' - }, - { - name: 'Common', - bmp: '\0-\x40\\x5B-\x60\\x7B-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061C\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BE\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u23FE\u2400-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BB9\u2BBD-\u2BC8\u2BCA-\u2BD1\u2BEC-\u2BEF\u2E00-\u2E44\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD', - astral: '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDF00-\uDF56\uDF60-\uDF71]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD2E\uDD30-\uDD6B\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED2\uDEE0-\uDEEC\uDEF0-\uDEF6\uDF00-\uDF73\uDF80-\uDFD4]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD10-\uDD1E\uDD20-\uDD27\uDD30\uDD33-\uDD3E\uDD40-\uDD4B\uDD50-\uDD5E\uDD80-\uDD91\uDDC0]|\uDB40[\uDC01\uDC20-\uDC7F]' - }, - { - name: 'Coptic', - bmp: '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF' - }, - { - name: 'Cuneiform', - astral: '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]' - }, - { - name: 'Cypriot', - astral: '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]' - }, - { - name: 'Cyrillic', - bmp: '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F' - }, - { - name: 'Deseret', - astral: '\uD801[\uDC00-\uDC4F]' - }, - { - name: 'Devanagari', - bmp: '\u0900-\u0950\u0953-\u0963\u0966-\u097F\uA8E0-\uA8FD' - }, - { - name: 'Duployan', - astral: '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]' - }, - { - name: 'Egyptian_Hieroglyphs', - astral: '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]' - }, - { - name: 'Elbasan', - astral: '\uD801[\uDD00-\uDD27]' - }, - { - name: 'Ethiopic', - bmp: '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E' - }, - { - name: 'Georgian', - bmp: '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u2D00-\u2D25\u2D27\u2D2D' - }, - { - name: 'Glagolitic', - bmp: '\u2C00-\u2C2E\u2C30-\u2C5E', - astral: '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]' - }, - { - name: 'Gothic', - astral: '\uD800[\uDF30-\uDF4A]' - }, - { - name: 'Grantha', - astral: '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]' - }, - { - name: 'Greek', - bmp: '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65', - astral: '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]' - }, - { - name: 'Gujarati', - bmp: '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9' - }, - { - name: 'Gurmukhi', - bmp: '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75' - }, - { - name: 'Han', - bmp: '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9', - astral: '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]' - }, - { - name: 'Hangul', - bmp: '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' - }, - { - name: 'Hanunoo', - bmp: '\u1720-\u1734' - }, - { - name: 'Hatran', - astral: '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]' - }, - { - name: 'Hebrew', - bmp: '\u0591-\u05C7\u05D0-\u05EA\u05F0-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F' - }, - { - name: 'Hiragana', - bmp: '\u3041-\u3096\u309D-\u309F', - astral: '\uD82C\uDC01|\uD83C\uDE00' - }, - { - name: 'Imperial_Aramaic', - astral: '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]' - }, - { - name: 'Inherited', - bmp: '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951\u0952\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D', - astral: '\uD800[\uDDFD\uDEE0]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]' - }, - { - name: 'Inscriptional_Pahlavi', - astral: '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]' - }, - { - name: 'Inscriptional_Parthian', - astral: '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]' - }, - { - name: 'Javanese', - bmp: '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF' - }, - { - name: 'Kaithi', - astral: '\uD804[\uDC80-\uDCC1]' - }, - { - name: 'Kannada', - bmp: '\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2' - }, - { - name: 'Katakana', - bmp: '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D', - astral: '\uD82C\uDC00' - }, - { - name: 'Kayah_Li', - bmp: '\uA900-\uA92D\uA92F' - }, - { - name: 'Kharoshthi', - astral: '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F-\uDE47\uDE50-\uDE58]' - }, - { - name: 'Khmer', - bmp: '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF' - }, - { - name: 'Khojki', - astral: '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]' - }, - { - name: 'Khudawadi', - astral: '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]' - }, - { - name: 'Lao', - bmp: '\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF' - }, - { - name: 'Latin', - bmp: 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A' - }, - { - name: 'Lepcha', - bmp: '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F' - }, - { - name: 'Limbu', - bmp: '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F' - }, - { - name: 'Linear_A', - astral: '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]' - }, - { - name: 'Linear_B', - astral: '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]' - }, - { - name: 'Lisu', - bmp: '\uA4D0-\uA4FF' - }, - { - name: 'Lycian', - astral: '\uD800[\uDE80-\uDE9C]' - }, - { - name: 'Lydian', - astral: '\uD802[\uDD20-\uDD39\uDD3F]' - }, - { - name: 'Mahajani', - astral: '\uD804[\uDD50-\uDD76]' - }, - { - name: 'Malayalam', - bmp: '\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F' - }, - { - name: 'Mandaic', - bmp: '\u0840-\u085B\u085E' - }, - { - name: 'Manichaean', - astral: '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]' - }, - { - name: 'Marchen', - astral: '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]' - }, - { - name: 'Meetei_Mayek', - bmp: '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9' - }, - { - name: 'Mende_Kikakui', - astral: '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]' - }, - { - name: 'Meroitic_Cursive', - astral: '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]' - }, - { - name: 'Meroitic_Hieroglyphs', - astral: '\uD802[\uDD80-\uDD9F]' - }, - { - name: 'Miao', - astral: '\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]' - }, - { - name: 'Modi', - astral: '\uD805[\uDE00-\uDE44\uDE50-\uDE59]' - }, - { - name: 'Mongolian', - bmp: '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1877\u1880-\u18AA', - astral: '\uD805[\uDE60-\uDE6C]' - }, - { - name: 'Mro', - astral: '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]' - }, - { - name: 'Multani', - astral: '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]' - }, - { - name: 'Myanmar', - bmp: '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F' - }, - { - name: 'Nabataean', - astral: '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]' - }, - { - name: 'New_Tai_Lue', - bmp: '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF' - }, - { - name: 'Newa', - astral: '\uD805[\uDC00-\uDC59\uDC5B\uDC5D]' - }, - { - name: 'Nko', - bmp: '\u07C0-\u07FA' - }, - { - name: 'Ogham', - bmp: '\u1680-\u169C' - }, - { - name: 'Ol_Chiki', - bmp: '\u1C50-\u1C7F' - }, - { - name: 'Old_Hungarian', - astral: '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]' - }, - { - name: 'Old_Italic', - astral: '\uD800[\uDF00-\uDF23]' - }, - { - name: 'Old_North_Arabian', - astral: '\uD802[\uDE80-\uDE9F]' - }, - { - name: 'Old_Permic', - astral: '\uD800[\uDF50-\uDF7A]' - }, - { - name: 'Old_Persian', - astral: '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]' - }, - { - name: 'Old_South_Arabian', - astral: '\uD802[\uDE60-\uDE7F]' - }, - { - name: 'Old_Turkic', - astral: '\uD803[\uDC00-\uDC48]' - }, - { - name: 'Oriya', - bmp: '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77' - }, - { - name: 'Osage', - astral: '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]' - }, - { - name: 'Osmanya', - astral: '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]' - }, - { - name: 'Pahawh_Hmong', - astral: '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]' - }, - { - name: 'Palmyrene', - astral: '\uD802[\uDC60-\uDC7F]' - }, - { - name: 'Pau_Cin_Hau', - astral: '\uD806[\uDEC0-\uDEF8]' - }, - { - name: 'Phags_Pa', - bmp: '\uA840-\uA877' - }, - { - name: 'Phoenician', - astral: '\uD802[\uDD00-\uDD1B\uDD1F]' - }, - { - name: 'Psalter_Pahlavi', - astral: '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]' - }, - { - name: 'Rejang', - bmp: '\uA930-\uA953\uA95F' - }, - { - name: 'Runic', - bmp: '\u16A0-\u16EA\u16EE-\u16F8' - }, - { - name: 'Samaritan', - bmp: '\u0800-\u082D\u0830-\u083E' - }, - { - name: 'Saurashtra', - bmp: '\uA880-\uA8C5\uA8CE-\uA8D9' - }, - { - name: 'Sharada', - astral: '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]' - }, - { - name: 'Shavian', - astral: '\uD801[\uDC50-\uDC7F]' - }, - { - name: 'Siddham', - astral: '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]' - }, - { - name: 'SignWriting', - astral: '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]' - }, - { - name: 'Sinhala', - bmp: '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4', - astral: '\uD804[\uDDE1-\uDDF4]' - }, - { - name: 'Sora_Sompeng', - astral: '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]' - }, - { - name: 'Sundanese', - bmp: '\u1B80-\u1BBF\u1CC0-\u1CC7' - }, - { - name: 'Syloti_Nagri', - bmp: '\uA800-\uA82B' - }, - { - name: 'Syriac', - bmp: '\u0700-\u070D\u070F-\u074A\u074D-\u074F' - }, - { - name: 'Tagalog', - bmp: '\u1700-\u170C\u170E-\u1714' - }, - { - name: 'Tagbanwa', - bmp: '\u1760-\u176C\u176E-\u1770\u1772\u1773' - }, - { - name: 'Tai_Le', - bmp: '\u1950-\u196D\u1970-\u1974' - }, - { - name: 'Tai_Tham', - bmp: '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD' - }, - { - name: 'Tai_Viet', - bmp: '\uAA80-\uAAC2\uAADB-\uAADF' - }, - { - name: 'Takri', - astral: '\uD805[\uDE80-\uDEB7\uDEC0-\uDEC9]' - }, - { - name: 'Tamil', - bmp: '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA' - }, - { - name: 'Tangut', - astral: '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]' - }, - { - name: 'Telugu', - bmp: '\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C78-\u0C7F' - }, - { - name: 'Thaana', - bmp: '\u0780-\u07B1' - }, - { - name: 'Thai', - bmp: '\u0E01-\u0E3A\u0E40-\u0E5B' - }, - { - name: 'Tibetan', - bmp: '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA' - }, - { - name: 'Tifinagh', - bmp: '\u2D30-\u2D67\u2D6F\u2D70\u2D7F' - }, - { - name: 'Tirhuta', - astral: '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]' - }, - { - name: 'Ugaritic', - astral: '\uD800[\uDF80-\uDF9D\uDF9F]' - }, - { - name: 'Vai', - bmp: '\uA500-\uA62B' - }, - { - name: 'Warang_Citi', - astral: '\uD806[\uDCA0-\uDCF2\uDCFF]' - }, - { - name: 'Yi', - bmp: '\uA000-\uA48C\uA490-\uA4C6' - } - ]); +(0, _unicodeBase["default"])(_xregexp["default"]); +(0, _unicodeCategories["default"])(_xregexp["default"]); +var _default = _xregexp["default"]; +exports["default"] = _default; +module.exports = exports.default; +},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(require,module,exports){ +"use strict"; -}; +var _sliceInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/slice"); + +var _Array$from = require("@babel/runtime-corejs3/core-js-stable/array/from"); + +var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol"); + +var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); + +var _Array$isArray = require("@babel/runtime-corejs3/core-js-stable/array/is-array"); + +var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property"); + +var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); + +_Object$defineProperty(exports, "__esModule", { + value: true +}); + +exports["default"] = void 0; + +var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray")); + +var _flags = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags")); + +var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort")); + +var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice")); + +var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int")); + +var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of")); + +var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each")); + +var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create")); + +var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat")); -},{}],8:[function(require,module,exports){ -var XRegExp = require('./xregexp'); +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } -require('./addons/build')(XRegExp); -require('./addons/matchrecursive')(XRegExp); -require('./addons/unicode-base')(XRegExp); -require('./addons/unicode-blocks')(XRegExp); -require('./addons/unicode-categories')(XRegExp); -require('./addons/unicode-properties')(XRegExp); -require('./addons/unicode-scripts')(XRegExp); +function _unsupportedIterableToArray(o, minLen) { var _context9; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty2(_context9 = Object.prototype.toString.call(o)).call(_context9, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -module.exports = XRegExp; +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -},{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(require,module,exports){ /*! - * XRegExp 3.2.0 + * XRegExp 5.1.1 * <xregexp.com> - * Steven Levithan (c) 2007-2017 MIT License + * Steven Levithan (c) 2007-present MIT License */ -'use strict'; - /** * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to * make your client-side grepping simpler and more powerful, while freeing you from related * cross-browser inconsistencies. */ - // ==--------------------------== // Private stuff // ==--------------------------== - // Property name used for extended regex instance data -var REGEX_DATA = 'xregexp'; -// Optional features that can be installed and uninstalled +var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled + var features = { - astral: false, - natives: false -}; -// Native methods to use and restore ('native' is an ES3 reserved keyword) -var nativ = { - exec: RegExp.prototype.exec, - test: RegExp.prototype.test, - match: String.prototype.match, - replace: String.prototype.replace, - split: String.prototype.split -}; -// Storage for fixed/extended native methods -var fixed = {}; -// Storage for regexes cached by `XRegExp.cache` -var regexCache = {}; -// Storage for pattern details cached by the `XRegExp` constructor -var patternCache = {}; -// Storage for regex syntax tokens added internally or by `XRegExp.addToken` -var tokens = []; -// Token scopes + astral: false, + namespacing: true +}; // Storage for fixed/extended native methods + +var fixed = {}; // Storage for regexes cached by `XRegExp.cache` + +var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor + +var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken` + +var tokens = []; // Token scopes + var defaultScope = 'default'; -var classScope = 'class'; -// Regexes that match native regex syntax, including octals +var classScope = 'class'; // Regexes that match native regex syntax, including octals + var nativeTokens = { - // Any native multicharacter token in default scope, or any single character - 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, - // Any native multicharacter token in character class scope, or any single character - 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ -}; -// Any backreference or dollar-prefixed character in replacement strings -var replacementToken = /\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g; -// Check for correct `exec` handling of nonparticipating capturing groups -var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; -// Check for ES6 `flags` prop support -var hasFlagsProp = /x/.flags !== undefined; -// Shortcut to `Object.prototype.toString` -var toString = {}.toString; + // Any native multicharacter token in default scope, or any single character + 'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, + // Any native multicharacter token in character class scope, or any single character + 'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/ +}; // Any backreference or dollar-prefixed character in replacement strings + +var replacementToken = /\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g; // Check for correct `exec` handling of nonparticipating capturing groups + +var correctExecNpcg = /()??/.exec('')[1] === undefined; // Check for ES6 `flags` prop support + +var hasFlagsProp = (0, _flags["default"])(/x/) !== undefined; function hasNativeFlag(flag) { - // Can't check based on the presence of properties/getters since browsers might support such - // properties even when they don't support the corresponding flag in regex construction (tested - // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` - // throws an error) - var isSupported = true; - try { - // Can't use regex literals for testing even in a `try` because regex literals with - // unsupported flags cause a compilation error in IE - new RegExp('', flag); - } catch (exception) { + // Can't check based on the presence of properties/getters since browsers might support such + // properties even when they don't support the corresponding flag in regex construction (tested + // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u` + // throws an error) + var isSupported = true; + + try { + // Can't use regex literals for testing even in a `try` because regex literals with + // unsupported flags cause a compilation error in IE + new RegExp('', flag); // Work around a broken/incomplete IE11 polyfill for sticky introduced in core-js 3.6.0 + + if (flag === 'y') { + // Using function to avoid babel transform to regex literal + var gy = function () { + return 'gy'; + }(); + + var incompleteY = '.a'.replace(new RegExp('a', gy), '.') === '..'; + + if (incompleteY) { isSupported = false; + } } - return isSupported; -} -// Check for ES6 `u` flag support -var hasNativeU = hasNativeFlag('u'); -// Check for ES6 `y` flag support -var hasNativeY = hasNativeFlag('y'); -// Tracker for known flags, including addon flags -var registeredFlags = { - g: true, - i: true, - m: true, - u: hasNativeU, - y: hasNativeY -}; + } catch (exception) { + isSupported = false; + } + + return isSupported; +} // Check for ES2021 `d` flag support + + +var hasNativeD = hasNativeFlag('d'); // Check for ES2018 `s` flag support + +var hasNativeS = hasNativeFlag('s'); // Check for ES6 `u` flag support + +var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support + +var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags +var registeredFlags = { + d: hasNativeD, + g: true, + i: true, + m: true, + s: hasNativeS, + u: hasNativeU, + y: hasNativeY +}; // Flags to remove when passing to native `RegExp` constructor + +var nonnativeFlags = hasNativeS ? /[^dgimsuy]+/g : /[^dgimuy]+/g; /** * Attaches extended data and `XRegExp.prototype` properties to a regex object. * @@ -2826,49 +553,49 @@ var registeredFlags = { * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal * operations, and never exposed to users. For internal-only regexes, we can improve perf by * skipping some operations like attaching `XRegExp.prototype` properties. - * @returns {RegExp} Augmented regex. + * @returns {!RegExp} Augmented regex. */ + function augment(regex, captureNames, xSource, xFlags, isInternalOnly) { - var p; + var _context; - regex[REGEX_DATA] = { - captureNames: captureNames - }; + regex[REGEX_DATA] = { + captureNames: captureNames + }; - if (isInternalOnly) { - return regex; - } + if (isInternalOnly) { + return regex; + } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value - // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value - if (regex.__proto__) { - regex.__proto__ = XRegExp.prototype; - } else { - for (p in XRegExp.prototype) { - // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this - // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` - // extensions exist on `regex.prototype` anyway - regex[p] = XRegExp.prototype[p]; - } + + if (regex.__proto__) { + regex.__proto__ = XRegExp.prototype; + } else { + for (var p in XRegExp.prototype) { + // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this + // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype` + // extensions exist on `regex.prototype` anyway + regex[p] = XRegExp.prototype[p]; } + } - regex[REGEX_DATA].source = xSource; - // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order - regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags; + regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order - return regex; + regex[REGEX_DATA].flags = xFlags ? (0, _sort["default"])(_context = xFlags.split('')).call(_context).join('') : xFlags; + return regex; } - /** * Removes any duplicate characters from the provided string. * * @private * @param {String} str String to remove duplicate characters from. - * @returns {String} String with any duplicate characters removed. + * @returns {string} String with any duplicate characters removed. */ + + function clipDuplicates(str) { - return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, ''); + return str.replace(/([\s\S])(?=[\s\S]*\1)/g, ''); } - /** * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype` * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing @@ -2887,71 +614,80 @@ function clipDuplicates(str) { * - `source` {String} Overrides `<regex>.source`, for special cases. * @returns {RegExp} Copy of the provided regex, possibly with modified flags. */ -function copyRegex(regex, options) { - if (!XRegExp.isRegExp(regex)) { - throw new TypeError('Type RegExp expected'); - } - - var xData = regex[REGEX_DATA] || {}; - var flags = getNativeFlags(regex); - var flagsToAdd = ''; - var flagsToRemove = ''; - var xregexpSource = null; - var xregexpFlags = null; - options = options || {}; - if (options.removeG) {flagsToRemove += 'g';} - if (options.removeY) {flagsToRemove += 'y';} - if (flagsToRemove) { - flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), ''); - } - - if (options.addG) {flagsToAdd += 'g';} - if (options.addY) {flagsToAdd += 'y';} - if (flagsToAdd) { - flags = clipDuplicates(flags + flagsToAdd); - } - - if (!options.isInternalOnly) { - if (xData.source !== undefined) { - xregexpSource = xData.source; - } - // null or undefined; don't want to add to `flags` if the previous value was null, since - // that indicates we're not tracking original precompilation flags - if (xData.flags != null) { - // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never - // removed for non-internal regexes, so don't need to handle it - xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags; - } +function copyRegex(regex, options) { + var _context2; + + if (!XRegExp.isRegExp(regex)) { + throw new TypeError('Type RegExp expected'); + } + + var xData = regex[REGEX_DATA] || {}; + var flags = getNativeFlags(regex); + var flagsToAdd = ''; + var flagsToRemove = ''; + var xregexpSource = null; + var xregexpFlags = null; + options = options || {}; + + if (options.removeG) { + flagsToRemove += 'g'; + } + + if (options.removeY) { + flagsToRemove += 'y'; + } + + if (flagsToRemove) { + flags = flags.replace(new RegExp("[".concat(flagsToRemove, "]+"), 'g'), ''); + } + + if (options.addG) { + flagsToAdd += 'g'; + } + + if (options.addY) { + flagsToAdd += 'y'; + } + + if (flagsToAdd) { + flags = clipDuplicates(flags + flagsToAdd); + } + + if (!options.isInternalOnly) { + if (xData.source !== undefined) { + xregexpSource = xData.source; + } // null or undefined; don't want to add to `flags` if the previous value was null, since + // that indicates we're not tracking original precompilation flags + + + if ((0, _flags["default"])(xData) != null) { + // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never + // removed for non-internal regexes, so don't need to handle it + xregexpFlags = flagsToAdd ? clipDuplicates((0, _flags["default"])(xData) + flagsToAdd) : (0, _flags["default"])(xData); } + } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid + // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and + // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the + // translation to native regex syntax - // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid - // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and - // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the - // translation to native regex syntax - regex = augment( - new RegExp(options.source || regex.source, flags), - hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, - xregexpSource, - xregexpFlags, - options.isInternalOnly - ); - return regex; + regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? (0, _slice["default"])(_context2 = xData.captureNames).call(_context2, 0) : null, xregexpSource, xregexpFlags, options.isInternalOnly); + return regex; } - /** * Converts hexadecimal to decimal. * * @private * @param {String} hex - * @returns {Number} + * @returns {number} */ + + function dec(hex) { - return parseInt(hex, 16); + return (0, _parseInt2["default"])(hex, 16); } - /** * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an * inline comment or whitespace with flag x. This is used directly as a token handler function @@ -2961,134 +697,136 @@ function dec(hex) { * @param {String} match Match arg of `XRegExp.addToken` handler * @param {String} scope Scope arg of `XRegExp.addToken` handler * @param {String} flags Flags arg of `XRegExp.addToken` handler - * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match. + * @returns {string} Either '' or '(?:)', depending on which is needed in the context of the match. */ + + function getContextualTokenSeparator(match, scope, flags) { - if ( - // No need to separate tokens if at the beginning or end of a group - match.input.charAt(match.index - 1) === '(' || - match.input.charAt(match.index + match[0].length) === ')' || - // Avoid separating tokens when the following token is a quantifier - isPatternNext(match.input, match.index + match[0].length, flags, '[?*+]|{\\d+(?:,\\d*)?}') - ) { - return ''; - } - // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. - // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax - // error `(? :` into `(?:`. - return '(?:)'; + var matchEndPos = match.index + match[0].length; + var precedingChar = match.input[match.index - 1]; + var followingChar = match.input[matchEndPos]; + + if ( // No need to separate tokens if at the beginning or end of a group, before or after a + // group, or before or after a `|` + /^[()|]$/.test(precedingChar) || /^[()|]$/.test(followingChar) || // No need to separate tokens if at the beginning or end of the pattern + match.index === 0 || matchEndPos === match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookaround. + // Looks only at the last 4 chars (at most) for perf when constructing long regexes. + /\(\?(?:[:=!]|<[=!])$/.test(match.input.substring(match.index - 4, match.index)) || // Avoid separating tokens when the following token is a quantifier + isQuantifierNext(match.input, matchEndPos, flags)) { + return ''; + } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`. + // This also ensures all tokens remain as discrete atoms, e.g. it prevents converting the + // syntax error `(? :` into `(?:`. + + + return '(?:)'; } - /** * Returns native `RegExp` flags used by a regex object. * * @private * @param {RegExp} regex Regex to check. - * @returns {String} Native flags in use. + * @returns {string} Native flags in use. */ + + function getNativeFlags(regex) { - return hasFlagsProp ? - regex.flags : - // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation - // with an empty string) allows this to continue working predictably when - // `XRegExp.proptotype.toString` is overridden - nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1]; + return hasFlagsProp ? (0, _flags["default"])(regex) : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation + // with an empty string) allows this to continue working predictably when + // `XRegExp.proptotype.toString` is overridden + /\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(regex))[1]; } - /** * Determines whether a regex has extended instance data used to track capture names. * * @private * @param {RegExp} regex Regex to check. - * @returns {Boolean} Whether the regex uses named capture. + * @returns {boolean} Whether the regex uses named capture. */ + + function hasNamedCapture(regex) { - return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); + return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames); } - /** * Converts decimal to hexadecimal. * * @private * @param {Number|String} dec - * @returns {String} - */ -function hex(dec) { - return parseInt(dec, 10).toString(16); -} - -/** - * Returns the first index at which a given value can be found in an array. - * - * @private - * @param {Array} array Array to search. - * @param {*} value Value to locate in the array. - * @returns {Number} Zero-based index at which the item is found, or -1. + * @returns {string} */ -function indexOf(array, value) { - var len = array.length; - var i; - for (i = 0; i < len; ++i) { - if (array[i] === value) { - return i; - } - } - return -1; +function hex(dec) { + return (0, _parseInt2["default"])(dec, 10).toString(16); } - /** - * Checks whether the next nonignorable token after the specified position matches the - * `needlePattern` + * Checks whether the next nonignorable token after the specified position is a quantifier. * * @private * @param {String} pattern Pattern to search within. * @param {Number} pos Index in `pattern` to search at. * @param {String} flags Flags used by the pattern. - * @param {String} needlePattern Pattern to match the next token against. - * @returns {Boolean} Whether the next nonignorable token matches `needlePattern` + * @returns {Boolean} Whether the next nonignorable token is a quantifier. */ -function isPatternNext(pattern, pos, flags, needlePattern) { - var inlineCommentPattern = '\\(\\?#[^)]*\\)'; - var lineCommentPattern = '#[^#\\n]*'; - var patternsToIgnore = flags.indexOf('x') > -1 ? - // Ignore any leading whitespace, line comments, and inline comments - ['\\s', lineCommentPattern, inlineCommentPattern] : - // Ignore any leading inline comments - [inlineCommentPattern]; - return nativ.test.call( - new RegExp('^(?:' + patternsToIgnore.join('|') + ')*(?:' + needlePattern + ')'), - pattern.slice(pos) - ); -} + +function isQuantifierNext(pattern, pos, flags) { + var inlineCommentPattern = '\\(\\?#[^)]*\\)'; + var lineCommentPattern = '#[^#\\n]*'; + var quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}'; + var regex = (0, _indexOf["default"])(flags).call(flags, 'x') !== -1 ? // Ignore any leading whitespace, line comments, and inline comments + /^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ : // Ignore any leading inline comments + /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/; + return regex.test((0, _slice["default"])(pattern).call(pattern, pos)); +} /** * Determines whether a value is of the specified type, by resolving its internal [[Class]]. * * @private * @param {*} value Object to check. * @param {String} type Type to check for, in TitleCase. - * @returns {Boolean} Whether the object matches the type. + * @returns {boolean} Whether the object matches the type. */ + + function isType(value, type) { - return toString.call(value) === '[object ' + type + ']'; + return Object.prototype.toString.call(value) === "[object ".concat(type, "]"); } +/** + * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow + * the ES5 abstract operation `ToObject`. + * + * @private + * @param {*} value Object to check and return. + * @returns {*} The provided object. + */ + + +function nullThrows(value) { + // null or undefined + if (value == null) { + throw new TypeError('Cannot convert null or undefined to object'); + } + return value; +} /** * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values. * * @private * @param {String} str - * @returns {String} + * @returns {string} */ + + function pad4(str) { - while (str.length < 4) { - str = '0' + str; - } - return str; -} + while (str.length < 4) { + str = "0".concat(str); + } + return str; +} /** * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads * the flag preparation logic from the `XRegExp` constructor. @@ -3096,39 +834,49 @@ function pad4(str) { * @private * @param {String} pattern Regex pattern, possibly with a leading mode modifier. * @param {String} flags Any combination of flags. - * @returns {Object} Object with properties `pattern` and `flags`. + * @returns {!Object} Object with properties `pattern` and `flags`. */ + + function prepareFlags(pattern, flags) { - var i; + // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags + if (clipDuplicates(flags) !== flags) { + throw new SyntaxError("Invalid duplicate regex flag ".concat(flags)); + } // Strip and apply a leading mode modifier with any combination of flags except `dgy` - // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags - if (clipDuplicates(flags) !== flags) { - throw new SyntaxError('Invalid duplicate regex flag ' + flags); - } - // Strip and apply a leading mode modifier with any combination of flags except g or y - pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function($0, $1) { - if (nativ.test.call(/[gy]/, $1)) { - throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0); - } - // Allow duplicate flags within the mode modifier - flags = clipDuplicates(flags + $1); - return ''; - }); + pattern = pattern.replace(/^\(\?([\w$]+)\)/, function ($0, $1) { + if (/[dgy]/.test($1)) { + throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat($0)); + } // Allow duplicate flags within the mode modifier - // Throw on unknown native or nonnative flags - for (i = 0; i < flags.length; ++i) { - if (!registeredFlags[flags.charAt(i)]) { - throw new SyntaxError('Unknown regex flag ' + flags.charAt(i)); - } - } - return { - pattern: pattern, - flags: flags - }; -} + flags = clipDuplicates(flags + $1); + return ''; + }); // Throw on unknown native or nonnative flags + + var _iterator = _createForOfIteratorHelper(flags), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var flag = _step.value; + + if (!registeredFlags[flag]) { + throw new SyntaxError("Unknown regex flag ".concat(flag)); + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + return { + pattern: pattern, + flags: flags + }; +} /** * Prepares an options object from the given value. * @@ -3136,34 +884,35 @@ function prepareFlags(pattern, flags) { * @param {String|Object} value Value to convert to an options object. * @returns {Object} Options object. */ -function prepareOptions(value) { - var options = {}; - if (isType(value, 'String')) { - XRegExp.forEach(value, /[^\s,]+/, function(match) { - options[match] = true; - }); - return options; - } +function prepareOptions(value) { + var options = {}; - return value; -} + if (isType(value, 'String')) { + (0, _forEach["default"])(XRegExp).call(XRegExp, value, /[^\s,]+/, function (match) { + options[match] = true; + }); + return options; + } + return value; +} /** * Registers a flag so it doesn't throw an 'unknown flag' error. * * @private * @param {String} flag Single-character flag to register. */ + + function registerFlag(flag) { - if (!/^[\w$]$/.test(flag)) { - throw new Error('Flag must be a single character A-Za-z0-9_$'); - } + if (!/^[\w$]$/.test(flag)) { + throw new Error('Flag must be a single character A-Za-z0-9_$'); + } - registeredFlags[flag] = true; + registeredFlags[flag] = true; } - /** * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified * position, until a match is found. @@ -3176,85 +925,62 @@ function registerFlag(flag) { * @param {Object} context Context object to use for token handler functions. * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`. */ + + function runTokens(pattern, flags, pos, scope, context) { - var i = tokens.length; - var leadChar = pattern.charAt(pos); - var result = null; - var match; - var t; - - // Run in reverse insertion order - while (i--) { - t = tokens[i]; - if ( - (t.leadChar && t.leadChar !== leadChar) || - (t.scope !== scope && t.scope !== 'all') || - (t.flag && flags.indexOf(t.flag) === -1) - ) { - continue; - } + var i = tokens.length; + var leadChar = pattern[pos]; + var result = null; + var match; + var t; // Run in reverse insertion order - match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); - if (match) { - result = { - matchLength: match[0].length, - output: t.handler.call(context, match, scope, flags), - reparse: t.reparse - }; - // Finished with token tests - break; - } + while (i--) { + t = tokens[i]; + + if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !((0, _indexOf["default"])(flags).call(flags, t.flag) !== -1)) { + continue; } - return result; -} + match = XRegExp.exec(pattern, t.regex, pos, 'sticky'); -/** - * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to - * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if - * the Unicode Base addon is not available, since flag A is registered by that addon. - * - * @private - * @param {Boolean} on `true` to enable; `false` to disable. - */ -function setAstral(on) { - features.astral = on; -} + if (match) { + result = { + matchLength: match[0].length, + output: t.handler.call(context, match, scope, flags), + reparse: t.reparse + }; // Finished with token tests + + break; + } + } + return result; +} /** - * Enables or disables native method overrides. + * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to + * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if + * the Unicode Base addon is not available, since flag A is registered by that addon. * * @private * @param {Boolean} on `true` to enable; `false` to disable. */ -function setNatives(on) { - RegExp.prototype.exec = (on ? fixed : nativ).exec; - RegExp.prototype.test = (on ? fixed : nativ).test; - String.prototype.match = (on ? fixed : nativ).match; - String.prototype.replace = (on ? fixed : nativ).replace; - String.prototype.split = (on ? fixed : nativ).split; - - features.natives = on; -} + +function setAstral(on) { + features.astral = on; +} /** - * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow - * the ES5 abstract operation `ToObject`. + * Adds named capture groups to the `groups` property of match arrays. See here for details: + * https://github.com/tc39/proposal-regexp-named-groups * * @private - * @param {*} value Object to check and return. - * @returns {*} The provided object. + * @param {Boolean} on `true` to enable; `false` to disable. */ -function toObject(value) { - // null or undefined - if (value == null) { - throw new TypeError('Cannot convert null or undefined to object'); - } - return value; -} -// ==--------------------------== +function setNamespacing(on) { + features.namespacing = on; +} // ==--------------------------== // Constructor // ==--------------------------== @@ -3268,122 +994,119 @@ function toObject(value) { * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy. * @param {String} [flags] Any combination of flags. * Native flags: + * - `d` - indices for capturing groups (ES2021) * - `g` - global * - `i` - ignore case * - `m` - multiline anchors * - `u` - unicode (ES6) * - `y` - sticky (Firefox 3+, ES6) * Additional XRegExp flags: - * - `n` - explicit capture - * - `s` - dot matches all (aka singleline) + * - `n` - named capture only + * - `s` - dot matches all (aka singleline) - works even when not natively supported * - `x` - free-spacing and line comments (aka extended) - * - `A` - astral (requires the Unicode Base addon) + * - `A` - 21-bit Unicode properties (aka astral) - requires the Unicode Base addon * Flags cannot be provided when constructing one `RegExp` from another. * @returns {RegExp} Extended regular expression object. * @example * * // With named capture and flag x - * XRegExp('(?<year> [0-9]{4} ) -? # year \n\ - * (?<month> [0-9]{2} ) -? # month \n\ - * (?<day> [0-9]{2} ) # day ', 'x'); + * XRegExp(`(?<year> [0-9]{4} ) -? # year + * (?<month> [0-9]{2} ) -? # month + * (?<day> [0-9]{2} ) # day`, 'x'); * * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp) * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and * // have fresh `lastIndex` properties (set to zero). * XRegExp(/regex/); */ + + function XRegExp(pattern, flags) { - if (XRegExp.isRegExp(pattern)) { - if (flags !== undefined) { - throw new TypeError('Cannot supply flags when copying a RegExp'); - } - return copyRegex(pattern); + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) { + throw new TypeError('Cannot supply flags when copying a RegExp'); } - // Copy the argument behavior of `RegExp` - pattern = pattern === undefined ? '' : String(pattern); - flags = flags === undefined ? '' : String(flags); + return copyRegex(pattern); + } // Copy the argument behavior of `RegExp` - if (XRegExp.isInstalled('astral') && flags.indexOf('A') === -1) { - // This causes an error to be thrown if the Unicode Base addon is not available - flags += 'A'; - } - if (!patternCache[pattern]) { - patternCache[pattern] = {}; - } + pattern = pattern === undefined ? '' : String(pattern); + flags = flags === undefined ? '' : String(flags); - if (!patternCache[pattern][flags]) { - var context = { - hasNamedCapture: false, - captureNames: [] - }; - var scope = defaultScope; - var output = ''; - var pos = 0; - var result; - - // Check for flag-related errors, and strip/apply flags in a leading mode modifier - var applied = prepareFlags(pattern, flags); - var appliedPattern = applied.pattern; - var appliedFlags = applied.flags; - - // Use XRegExp's tokens to translate the pattern to a native regex pattern. - // `appliedPattern.length` may change on each iteration if tokens use `reparse` - while (pos < appliedPattern.length) { - do { - // Check for custom tokens at the current position - result = runTokens(appliedPattern, appliedFlags, pos, scope, context); - // If the matched token used the `reparse` option, splice its output into the - // pattern before running tokens again at the same position - if (result && result.reparse) { - appliedPattern = appliedPattern.slice(0, pos) + - result.output + - appliedPattern.slice(pos + result.matchLength); - } - } while (result && result.reparse); - - if (result) { - output += result.output; - pos += (result.matchLength || 1); - } else { - // Get the native token at the current position - var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0]; - output += token; - pos += token.length; - if (token === '[' && scope === defaultScope) { - scope = classScope; - } else if (token === ']' && scope === classScope) { - scope = defaultScope; - } - } - } + if (XRegExp.isInstalled('astral') && !((0, _indexOf["default"])(flags).call(flags, 'A') !== -1)) { + // This causes an error to be thrown if the Unicode Base addon is not available + flags += 'A'; + } - patternCache[pattern][flags] = { - // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty - // groups are sometimes inserted during regex transpilation in order to keep tokens - // separated. However, more than one empty group in a row is never needed. - pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'), - // Strip all but native flags - flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''), - // `context.captureNames` has an item for each capturing group, even if unnamed - captures: context.hasNamedCapture ? context.captureNames : null - }; + if (!patternCache[pattern]) { + patternCache[pattern] = {}; + } + + if (!patternCache[pattern][flags]) { + var context = { + hasNamedCapture: false, + captureNames: [] + }; + var scope = defaultScope; + var output = ''; + var pos = 0; + var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier + + var applied = prepareFlags(pattern, flags); + var appliedPattern = applied.pattern; + var appliedFlags = (0, _flags["default"])(applied); // Use XRegExp's tokens to translate the pattern to a native regex pattern. + // `appliedPattern.length` may change on each iteration if tokens use `reparse` + + while (pos < appliedPattern.length) { + do { + // Check for custom tokens at the current position + result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the + // pattern before running tokens again at the same position + + if (result && result.reparse) { + appliedPattern = (0, _slice["default"])(appliedPattern).call(appliedPattern, 0, pos) + result.output + (0, _slice["default"])(appliedPattern).call(appliedPattern, pos + result.matchLength); + } + } while (result && result.reparse); + + if (result) { + output += result.output; + pos += result.matchLength || 1; + } else { + // Get the native token at the current position + var _XRegExp$exec = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky'), + _XRegExp$exec2 = (0, _slicedToArray2["default"])(_XRegExp$exec, 1), + token = _XRegExp$exec2[0]; + + output += token; + pos += token.length; + + if (token === '[' && scope === defaultScope) { + scope = classScope; + } else if (token === ']' && scope === classScope) { + scope = defaultScope; + } + } } - var generated = patternCache[pattern][flags]; - return augment( - new RegExp(generated.pattern, generated.flags), - generated.captures, - pattern, - flags - ); -} + patternCache[pattern][flags] = { + // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty + // groups are sometimes inserted during regex transpilation in order to keep tokens + // separated. However, more than one empty group in a row is never needed. + pattern: output.replace(/(?:\(\?:\))+/g, '(?:)'), + // Strip all but native flags + flags: appliedFlags.replace(nonnativeFlags, ''), + // `context.captureNames` has an item for each capturing group, even if unnamed + captures: context.hasNamedCapture ? context.captureNames : null + }; + } -// Add `RegExp.prototype` to the prototype chain -XRegExp.prototype = new RegExp(); + var generated = patternCache[pattern][flags]; + return augment(new RegExp(generated.pattern, (0, _flags["default"])(generated)), generated.captures, pattern, flags); +} // Add `RegExp.prototype` to the prototype chain -// ==--------------------------== + +XRegExp.prototype = /(?:)/; // ==--------------------------== // Public properties // ==--------------------------== @@ -3395,19 +1118,17 @@ XRegExp.prototype = new RegExp(); * @memberOf XRegExp * @type String */ -XRegExp.version = '3.2.0'; -// ==--------------------------== +XRegExp.version = '5.1.1'; // ==--------------------------== // Public methods // ==--------------------------== - // Intentionally undocumented; used in tests and addons + XRegExp._clipDuplicates = clipDuplicates; XRegExp._hasNativeFlag = hasNativeFlag; XRegExp._dec = dec; XRegExp._hex = hex; XRegExp._pad4 = pad4; - /** * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to * create XRegExp addons. If more than one token can match the same string, the last added wins. @@ -3441,7 +1162,7 @@ XRegExp._pad4 = pad4; * // Basic usage: Add \a for the ALERT control code * XRegExp.addToken( * /\\a/, - * function() {return '\\x07';}, + * () => '\\x07', * {scope: 'all'} * ); * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true @@ -3451,47 +1172,57 @@ XRegExp._pad4 = pad4; * // character classes only) * XRegExp.addToken( * /([?*+]|{\d+(?:,\d*)?})(\??)/, - * function(match) {return match[1] + (match[2] ? '' : '?');}, + * (match) => `${match[1]}${match[2] ? '' : '?'}`, * {flag: 'U'} * ); * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a' * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa' */ -XRegExp.addToken = function(regex, handler, options) { - options = options || {}; - var optionalFlags = options.optionalFlags; - var i; - if (options.flag) { - registerFlag(options.flag); - } +XRegExp.addToken = function (regex, handler, options) { + options = options || {}; + var _options = options, + optionalFlags = _options.optionalFlags; - if (optionalFlags) { - optionalFlags = nativ.split.call(optionalFlags, ''); - for (i = 0; i < optionalFlags.length; ++i) { - registerFlag(optionalFlags[i]); - } - } + if (options.flag) { + registerFlag(options.flag); + } - // Add to the private list of syntax tokens - tokens.push({ - regex: copyRegex(regex, { - addG: true, - addY: hasNativeY, - isInternalOnly: true - }), - handler: handler, - scope: options.scope || defaultScope, - flag: options.flag, - reparse: options.reparse, - leadChar: options.leadChar - }); + if (optionalFlags) { + optionalFlags = optionalFlags.split(''); - // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags - // might now produce different results - XRegExp.cache.flush('patterns'); -}; + var _iterator2 = _createForOfIteratorHelper(optionalFlags), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var flag = _step2.value; + registerFlag(flag); + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + } // Add to the private list of syntax tokens + + + tokens.push({ + regex: copyRegex(regex, { + addG: true, + addY: hasNativeY, + isInternalOnly: true + }), + handler: handler, + scope: options.scope || defaultScope, + flag: options.flag, + reparse: options.reparse, + leadChar: options.leadChar + }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags + // might now produce different results + + XRegExp.cache.flush('patterns'); +}; /** * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with * the same pattern and flag combination, the cached copy of the regex is returned. @@ -3502,53 +1233,71 @@ XRegExp.addToken = function(regex, handler, options) { * @returns {RegExp} Cached XRegExp object. * @example * - * while (match = XRegExp.cache('.', 'gs').exec(str)) { + * let match; + * while (match = XRegExp.cache('.', 'gs').exec('abc')) { * // The regex is compiled once only * } */ -XRegExp.cache = function(pattern, flags) { - if (!regexCache[pattern]) { - regexCache[pattern] = {}; - } - return regexCache[pattern][flags] || ( - regexCache[pattern][flags] = XRegExp(pattern, flags) - ); -}; -// Intentionally undocumented; used in tests -XRegExp.cache.flush = function(cacheName) { - if (cacheName === 'patterns') { - // Flush the pattern cache used by the `XRegExp` constructor - patternCache = {}; - } else { - // Flush the regex cache populated by `XRegExp.cache` - regexCache = {}; - } -}; +XRegExp.cache = function (pattern, flags) { + if (!regexCache[pattern]) { + regexCache[pattern] = {}; + } + + return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags)); +}; // Intentionally undocumented; used in tests + + +XRegExp.cache.flush = function (cacheName) { + if (cacheName === 'patterns') { + // Flush the pattern cache used by the `XRegExp` constructor + patternCache = {}; + } else { + // Flush the regex cache populated by `XRegExp.cache` + regexCache = {}; + } +}; /** * Escapes any regular expression metacharacters, for use when matching literal strings. The result - * can safely be used at any point within a regex that uses any flags. + * can safely be used at any position within a regex that uses any flags. * * @memberOf XRegExp * @param {String} str String to escape. - * @returns {String} String with regex metacharacters escaped. + * @returns {string} String with regex metacharacters escaped. * @example * * XRegExp.escape('Escaped? <.>'); - * // -> 'Escaped\?\ <\.>' + * // -> 'Escaped\?\u0020<\.>' */ -XRegExp.escape = function(str) { - return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +// Following are the contexts where each metacharacter needs to be escaped because it would +// otherwise have a special meaning, change the meaning of surrounding characters, or cause an +// error. Context 'default' means outside character classes only. +// - `\` - context: all +// - `[()*+?.$|` - context: default +// - `]` - context: default with flag u or if forming the end of a character class +// - `{}` - context: default with flag u or if part of a valid/complete quantifier pattern +// - `,` - context: default if in a position that causes an unescaped `{` to turn into a quantifier. +// Ex: `/^a{1\,2}$/` matches `'a{1,2}'`, but `/^a{1,2}$/` matches `'a'` or `'aa'` +// - `#` and <whitespace> - context: default with flag x +// - `^` - context: default, and context: class if it's the first character in the class +// - `-` - context: class if part of a valid character class range + + +XRegExp.escape = function (str) { + return String(nullThrows(str)). // Escape most special chars with a backslash + replace(/[\\\[\]{}()*+?.^$|]/g, '\\$&'). // Convert to \uNNNN for special chars that can't be escaped when used with ES6 flag `u` + replace(/[\s#\-,]/g, function (match) { + return "\\u".concat(pad4(hex(match.charCodeAt(0)))); + }); }; - /** * Executes a regex search in a specified string. Returns a match array or `null`. If the provided - * regex uses named capture, named backreference properties are included on the match array. - * Optional `pos` and `sticky` arguments specify the search start position, and whether the match - * must start at the specified position only. The `lastIndex` property of the provided regex is not - * used, but is updated for compatibility. Also fixes browser bugs compared to the native - * `RegExp.prototype.exec` and can be used reliably cross-browser. + * regex uses named capture, named capture properties are included on the match array's `groups` + * property. Optional `pos` and `sticky` arguments specify the search start position, and whether + * the match must start at the specified position only. The `lastIndex` property of the provided + * regex is not used, but is updated for compatibility. Also fixes browser bugs compared to the + * native `RegExp.prototype.exec` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. @@ -3556,73 +1305,68 @@ XRegExp.escape = function(str) { * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Array} Match array with named backreference properties, or `null`. + * @returns {Array} Match array with named capture properties on the `groups` object, or `null`. If + * the `namespacing` feature is off, named capture properties are directly on the match array. * @example * - * // Basic use, with named backreference - * var match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})')); - * match.hex; // -> '2620' + * // Basic use, with named capturing group + * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})')); + * match.groups.hex; // -> '2620' * * // With pos and sticky, in a loop - * var pos = 2, result = [], match; + * let pos = 3, result = [], match; * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) { * result.push(match[1]); * pos = match.index + match[0].length; * } * // result -> ['2', '3', '4'] */ -XRegExp.exec = function(str, regex, pos, sticky) { - var cacheKey = 'g'; - var addY = false; - var fakeY = false; - var match; - var r2; - - addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false)); - if (addY) { - cacheKey += 'y'; - } else if (sticky) { - // Simulate sticky matching by appending an empty capture to the original regex. The - // resulting regex will succeed no matter what at the current index (set with `lastIndex`), - // and will not search the rest of the subject string. We'll know that the original regex - // has failed if that last capture is `''` rather than `undefined` (i.e., if that last - // capture participated in the match). - fakeY = true; - cacheKey += 'FakeY'; - } - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.match`/`replace` - r2 = regex[REGEX_DATA][cacheKey] || ( - regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: true, - addY: addY, - source: fakeY ? regex.source + '|()' : undefined, - removeY: sticky === false, - isInternalOnly: true - }) - ); - - pos = pos || 0; - r2.lastIndex = pos; - - // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. - match = fixed.exec.call(r2, str); - - // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means - // the original regexp failed (see above). - if (fakeY && match && match.pop() === '') { - match = null; - } - if (regex.global) { - regex.lastIndex = match ? r2.lastIndex : 0; - } - return match; +XRegExp.exec = function (str, regex, pos, sticky) { + var cacheKey = 'g'; + var addY = false; + var fakeY = false; + var match; + addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false); + + if (addY) { + cacheKey += 'y'; + } else if (sticky) { + // Simulate sticky matching by appending an empty capture to the original regex. The + // resulting regex will succeed no matter what at the current index (set with `lastIndex`), + // and will not search the rest of the subject string. We'll know that the original regex + // has failed if that last capture is `''` rather than `undefined` (i.e., if that last + // capture participated in the match). + fakeY = true; + cacheKey += 'FakeY'; + } + + regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace` + + var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { + addG: true, + addY: addY, + source: fakeY ? "".concat(regex.source, "|()") : undefined, + removeY: sticky === false, + isInternalOnly: true + })); + pos = pos || 0; + r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc. + + match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means + // the original regexp failed (see above). + + if (fakeY && match && match.pop() === '') { + match = null; + } + + if (regex.global) { + regex.lastIndex = match ? r2.lastIndex : 0; + } + + return match; }; - /** * Executes a provided function once per regex match. Searches always start at the beginning of the * string and continue until the end, regardless of the state of the regex's `global` property and @@ -3639,30 +1383,30 @@ XRegExp.exec = function(str, regex, pos, sticky) { * @example * * // Extracts every other digit from a string - * var evens = []; - * XRegExp.forEach('1a2345', /\d/, function(match, i) { + * const evens = []; + * XRegExp.forEach('1a2345', /\d/, (match, i) => { * if (i % 2) evens.push(+match[0]); * }); * // evens -> [2, 4] */ -XRegExp.forEach = function(str, regex, callback) { - var pos = 0; - var i = -1; - var match; - - while ((match = XRegExp.exec(str, regex, pos))) { - // Because `regex` is provided to `callback`, the function could use the deprecated/ - // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` - // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, - // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of - // regexes, mutating the regex will not have any effect on the iteration or matched strings, - // which is a nice side effect that brings extra safety. - callback(match, ++i, str, regex); - - pos = match.index + (match[0].length || 1); - } -}; + +XRegExp.forEach = function (str, regex, callback) { + var pos = 0; + var i = -1; + var match; + + while (match = XRegExp.exec(str, regex, pos)) { + // Because `regex` is provided to `callback`, the function could use the deprecated/ + // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec` + // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop, + // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of + // regexes, mutating the regex will not have any effect on the iteration or matched strings, + // which is a nice side effect that brings extra safety. + callback(match, ++i, str, regex); + pos = match.index + (match[0].length || 1); + } +}; /** * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native @@ -3673,13 +1417,16 @@ XRegExp.forEach = function(str, regex, callback) { * @returns {RegExp} Copy of the provided regex with flag `g` added. * @example * - * var globalCopy = XRegExp.globalize(/regex/); + * const globalCopy = XRegExp.globalize(/regex/); * globalCopy.global; // -> true */ -XRegExp.globalize = function(regex) { - return copyRegex(regex, {addG: true}); -}; + +XRegExp.globalize = function (regex) { + return copyRegex(regex, { + addG: true + }); +}; /** * Installs optional features according to the specified options. Can be undone using * `XRegExp.uninstall`. @@ -3693,48 +1440,50 @@ XRegExp.globalize = function(regex) { * // Enables support for astral code points in Unicode addons (implicitly sets flag A) * astral: true, * - * // DEPRECATED: Overrides native regex methods with fixed/extended versions - * natives: true + * // Adds named capture groups to the `groups` property of matches + * namespacing: true * }); * * // With an options string - * XRegExp.install('astral natives'); + * XRegExp.install('astral namespacing'); */ -XRegExp.install = function(options) { - options = prepareOptions(options); - if (!features.astral && options.astral) { - setAstral(true); - } - if (!features.natives && options.natives) { - setNatives(true); - } -}; +XRegExp.install = function (options) { + options = prepareOptions(options); + + if (!features.astral && options.astral) { + setAstral(true); + } + if (!features.namespacing && options.namespacing) { + setNamespacing(true); + } +}; /** * Checks whether an individual optional feature is installed. * * @memberOf XRegExp * @param {String} feature Name of the feature to check. One of: * - `astral` - * - `natives` - * @returns {Boolean} Whether the feature is installed. + * - `namespacing` + * @returns {boolean} Whether the feature is installed. * @example * * XRegExp.isInstalled('astral'); */ -XRegExp.isInstalled = function(feature) { - return !!(features[feature]); -}; + +XRegExp.isInstalled = function (feature) { + return !!features[feature]; +}; /** * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes * created in another frame, when `instanceof` and `constructor` checks would fail. * * @memberOf XRegExp * @param {*} value Object to check. - * @returns {Boolean} Whether the object is a `RegExp` object. + * @returns {boolean} Whether the object is a `RegExp` object. * @example * * XRegExp.isRegExp('string'); // -> false @@ -3742,10 +1491,12 @@ XRegExp.isInstalled = function(feature) { * XRegExp.isRegExp(RegExp('^', 'm')); // -> true * XRegExp.isRegExp(XRegExp('(?s).')); // -> true */ -XRegExp.isRegExp = function(value) { - return toString.call(value) === '[object RegExp]'; - //return isType(value, 'RegExp'); -}; + + +XRegExp.isRegExp = function (value) { + return Object.prototype.toString.call(value) === '[object RegExp]'; +}; // Same as `isType(value, 'RegExp')`, but avoiding that function call here for perf since +// `isRegExp` is used heavily by internals including regex construction /** * Returns the first matched string, or in global mode, an array containing all matched strings. @@ -3774,36 +1525,27 @@ XRegExp.isRegExp = function(value) { * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c'] * XRegExp.match('abc', /x/, 'all'); // -> [] */ -XRegExp.match = function(str, regex, scope) { - var global = (regex.global && scope !== 'one') || scope === 'all'; - var cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY'; - var result; - var r2; - - regex[REGEX_DATA] = regex[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.exec`/`replace` - r2 = regex[REGEX_DATA][cacheKey] || ( - regex[REGEX_DATA][cacheKey] = copyRegex(regex, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - }) - ); - - result = nativ.match.call(toObject(str), r2); - - if (regex.global) { - regex.lastIndex = ( - (scope === 'one' && result) ? - // Can't use `r2.lastIndex` since `r2` is nonglobal in this case - (result.index + result[0].length) : 0 - ); - } - return global ? (result || []) : (result && result[0]); -}; +XRegExp.match = function (str, regex, scope) { + var global = regex.global && scope !== 'one' || scope === 'all'; + var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY'; + regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace` + + var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, { + addG: !!global, + removeG: scope === 'one', + isInternalOnly: true + })); + var result = String(nullThrows(str)).match(r2); + + if (regex.global) { + regex.lastIndex = scope === 'one' && result ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case + result.index + result[0].length : 0; + } + + return global ? result || [] : result && result[0]; +}; /** * Retrieves the matches from searching a string using a chain of regexes that successively search * within previous matches. The provided `chain` array can contain regexes and or objects with @@ -3824,53 +1566,68 @@ XRegExp.match = function(str, regex, scope) { * // -> ['2', '4', '56'] * * // Passing forward and returning specific backreferences - * html = '<a href="http://xregexp.com/api/">XRegExp</a>\ - * <a href="http://www.google.com/">Google</a>'; + * const html = `<a href="http://xregexp.com/api/">XRegExp</a> + * <a href="http://www.google.com/">Google</a>`; * XRegExp.matchChain(html, [ * {regex: /<a href="([^"]+)">/i, backref: 1}, * {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'} * ]); * // -> ['xregexp.com', 'www.google.com'] */ -XRegExp.matchChain = function(str, chain) { - return (function recurseChain(values, level) { - var item = chain[level].regex ? chain[level] : {regex: chain[level]}; - var matches = []; - - function addMatch(match) { - if (item.backref) { - // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the - // `undefined`s for backreferences to nonparticipating capturing groups. In such - // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw - // the exception, so also check if the backreference is a number that is within the - // bounds of the array. - if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) { - throw new ReferenceError('Backreference to undefined group: ' + item.backref); - } - - matches.push(match[item.backref] || ''); - } else { - matches.push(match[0]); - } - } - for (var i = 0; i < values.length; ++i) { - XRegExp.forEach(values[i], item.regex, addMatch); + +XRegExp.matchChain = function (str, chain) { + return function recurseChain(values, level) { + var item = chain[level].regex ? chain[level] : { + regex: chain[level] + }; + var matches = []; + + function addMatch(match) { + if (item.backref) { + var ERR_UNDEFINED_GROUP = "Backreference to undefined group: ".concat(item.backref); + var isNamedBackref = isNaN(item.backref); + + if (isNamedBackref && XRegExp.isInstalled('namespacing')) { + // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty` + if (!(match.groups && item.backref in match.groups)) { + throw new ReferenceError(ERR_UNDEFINED_GROUP); + } + } else if (!match.hasOwnProperty(item.backref)) { + throw new ReferenceError(ERR_UNDEFINED_GROUP); } - return ((level === chain.length - 1) || !matches.length) ? - matches : - recurseChain(matches, level + 1); - }([str], 0)); -}; + var backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ? match.groups[item.backref] : match[item.backref]; + matches.push(backrefValue || ''); + } else { + matches.push(match[0]); + } + } + + var _iterator3 = _createForOfIteratorHelper(values), + _step3; + + try { + for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { + var value = _step3.value; + (0, _forEach["default"])(XRegExp).call(XRegExp, value, item.regex, addMatch); + } + } catch (err) { + _iterator3.e(err); + } finally { + _iterator3.f(); + } + return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1); + }([str], 0); +}; /** * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string * or regex, and the replacement can be a string or a function to be called for each match. To * perform a global search and replace, use the optional `scope` argument or include flag g if using - * a regex. Replacement strings can use `${n}` for named and numbered backreferences. Replacement - * functions can use named backreferences via `arguments[0].name`. Also fixes browser bugs compared - * to the native `String.prototype.replace` and can be used reliably cross-browser. + * a regex. Replacement strings can use `$<n>` or `${n}` for named and numbered backreferences. + * Replacement functions can use named backreferences via the last argument. Also fixes browser bugs + * compared to the native `String.prototype.replace` and can be used reliably cross-browser. * * @memberOf XRegExp * @param {String} str String to search. @@ -3881,29 +1638,34 @@ XRegExp.matchChain = function(str, chain) { * - $&, $0 - Inserts the matched substring. * - $` - Inserts the string that precedes the matched substring (left context). * - $' - Inserts the string that follows the matched substring (right context). - * - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts + * - $n, $nn - Where n/nn are digits referencing an existing capturing group, inserts * backreference n/nn. - * - ${n} - Where n is a name or any number of digits that reference an existent capturing + * - $<n>, ${n} - Where n is a name or any number of digits that reference an existing capturing * group, inserts backreference n. * Replacement functions are invoked with three or more arguments: - * - The matched substring (corresponds to $& above). Named backreferences are accessible as - * properties of this first argument. - * - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above). - * - The zero-based index of the match within the total search string. - * - The total string being searched. - * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not - * explicitly specified and using a regex with flag g, `scope` is 'all'. + * - args[0] - The matched substring (corresponds to `$&` above). If the `namespacing` feature + * is off, named backreferences are accessible as properties of this argument. + * - args[1..n] - One argument for each backreference (corresponding to `$1`, `$2`, etc. above). + * If the regex has no capturing groups, no arguments appear in this position. + * - args[n+1] - The zero-based index of the match within the entire search string. + * - args[n+2] - The total string being searched. + * - args[n+3] - If the the search pattern is a regex with named capturing groups, the last + * argument is the groups object. Its keys are the backreference names and its values are the + * backreference values. If the `namespacing` feature is off, this argument is not present. + * @param {String} [scope] Use 'one' to replace the first match only, or 'all'. Defaults to 'one'. + * Defaults to 'all' if using a regex with flag g. * @returns {String} New string with one or all matches replaced. * @example * * // Regex search, using named backreferences in replacement string - * var name = XRegExp('(?<first>\\w+) (?<last>\\w+)'); - * XRegExp.replace('John Smith', name, '${last}, ${first}'); + * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)'); + * XRegExp.replace('John Smith', name, '$<last>, $<first>'); * // -> 'Smith, John' * * // Regex search, using named backreferences in replacement function - * XRegExp.replace('John Smith', name, function(match) { - * return match.last + ', ' + match.first; + * XRegExp.replace('John Smith', name, (...args) => { + * const groups = args[args.length - 1]; + * return `${groups.last}, ${groups.first}`; * }); * // -> 'Smith, John' * @@ -3911,46 +1673,44 @@ XRegExp.matchChain = function(str, chain) { * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all'); * // -> 'XRegExp builds XRegExps' */ -XRegExp.replace = function(str, search, replacement, scope) { - var isRegex = XRegExp.isRegExp(search); - var global = (search.global && scope !== 'one') || scope === 'all'; - var cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY'; - var s2 = search; - var result; - - if (isRegex) { - search[REGEX_DATA] = search[REGEX_DATA] || {}; - - // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s - // `lastIndex` isn't updated *during* replacement iterations - s2 = search[REGEX_DATA][cacheKey] || ( - search[REGEX_DATA][cacheKey] = copyRegex(search, { - addG: !!global, - removeG: scope === 'one', - isInternalOnly: true - }) - ); - } else if (global) { - s2 = new RegExp(XRegExp.escape(String(search)), 'g'); - } - // Fixed `replace` required for named backreferences, etc. - result = fixed.replace.call(toObject(str), s2, replacement); - if (isRegex && search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } +XRegExp.replace = function (str, search, replacement, scope) { + var isRegex = XRegExp.isRegExp(search); + var global = search.global && scope !== 'one' || scope === 'all'; + var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY'; + var s2 = search; + + if (isRegex) { + search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s + // `lastIndex` isn't updated *during* replacement iterations + + s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, { + addG: !!global, + removeG: scope === 'one', + isInternalOnly: true + })); + } else if (global) { + s2 = new RegExp(XRegExp.escape(String(search)), 'g'); + } // Fixed `replace` required for named backreferences, etc. - return result; -}; + var result = fixed.replace.call(nullThrows(str), s2, replacement); + + if (isRegex && search.global) { + // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) + search.lastIndex = 0; + } + + return result; +}; /** * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an * array of replacement details. Later replacements operate on the output of earlier replacements. * Replacement details are accepted as an array with a regex or string to search for, the * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp - * replacement text syntax, which supports named backreference properties via `${name}`. + * replacement text syntax, which supports named backreference properties via `$<name>` or + * `${name}`. * * @memberOf XRegExp * @param {String} str String to search. @@ -3959,28 +1719,33 @@ XRegExp.replace = function(str, search, replacement, scope) { * @example * * str = XRegExp.replaceEach(str, [ - * [XRegExp('(?<name>a)'), 'z${name}'], + * [XRegExp('(?<name>a)'), 'z$<name>'], * [/b/gi, 'y'], * [/c/g, 'x', 'one'], // scope 'one' overrides /g * [/d/, 'w', 'all'], // scope 'all' overrides lack of /g * ['e', 'v', 'all'], // scope 'all' allows replace-all for strings - * [/f/g, function($0) { - * return $0.toUpperCase(); - * }] + * [/f/g, (match) => match.toUpperCase()] * ]); */ -XRegExp.replaceEach = function(str, replacements) { - var i; - var r; - for (i = 0; i < replacements.length; ++i) { - r = replacements[i]; - str = XRegExp.replace(str, r[0], r[1], r[2]); + +XRegExp.replaceEach = function (str, replacements) { + var _iterator4 = _createForOfIteratorHelper(replacements), + _step4; + + try { + for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { + var r = _step4.value; + str = XRegExp.replace(str, r[0], r[1], r[2]); } + } catch (err) { + _iterator4.e(err); + } finally { + _iterator4.f(); + } - return str; + return str; }; - /** * Splits a string into an array of strings using a regex or string separator. Matches of the * separator are not included in the result array. However, if `separator` is a regex that contains @@ -4007,10 +1772,11 @@ XRegExp.replaceEach = function(str, replacements) { * XRegExp.split('..word1..', /([a-z]+)(\d+)/i); * // -> ['..', 'word', '1', '..'] */ -XRegExp.split = function(str, separator, limit) { - return fixed.split.call(toObject(str), separator, limit); -}; + +XRegExp.split = function (str, separator, limit) { + return fixed.split.call(nullThrows(str), separator, limit); +}; /** * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and * `sticky` arguments specify the search start position, and whether the match must start at the @@ -4024,7 +1790,7 @@ XRegExp.split = function(str, separator, limit) { * @param {Number} [pos=0] Zero-based index at which to start the search. * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position * only. The string `'sticky'` is accepted as an alternative to `true`. - * @returns {Boolean} Whether the regex matched the provided value. + * @returns {boolean} Whether the regex matched the provided value. * @example * * // Basic use @@ -4034,14 +1800,15 @@ XRegExp.split = function(str, separator, limit) { * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true */ -XRegExp.test = function(str, regex, pos, sticky) { - // Do this the easy way :-) - return !!XRegExp.exec(str, regex, pos, sticky); -}; +// Do this the easy way :-) + +XRegExp.test = function (str, regex, pos, sticky) { + return !!XRegExp.exec(str, regex, pos, sticky); +}; /** - * Uninstalls optional features according to the specified options. All optional features start out - * uninstalled, so this is used to undo the actions of `XRegExp.install`. + * Uninstalls optional features according to the specified options. Used to undo the actions of + * `XRegExp.install`. * * @memberOf XRegExp * @param {Object|String} options Options object or string. @@ -4049,28 +1816,29 @@ XRegExp.test = function(str, regex, pos, sticky) { * * // With an options object * XRegExp.uninstall({ - * // Disables support for astral code points in Unicode addons + * // Disables support for astral code points in Unicode addons (unless enabled per regex) * astral: true, * - * // DEPRECATED: Restores native regex methods - * natives: true + * // Don't add named capture groups to the `groups` property of matches + * namespacing: true * }); * * // With an options string - * XRegExp.uninstall('astral natives'); + * XRegExp.uninstall('astral namespacing'); */ -XRegExp.uninstall = function(options) { - options = prepareOptions(options); - if (features.astral && options.astral) { - setAstral(false); - } - if (features.natives && options.natives) { - setNatives(false); - } -}; +XRegExp.uninstall = function (options) { + options = prepareOptions(options); + + if (features.astral && options.astral) { + setAstral(false); + } + if (features.namespacing && options.namespacing) { + setNamespacing(false); + } +}; /** * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as * regex objects or strings. Metacharacters are escaped in patterns provided as strings. @@ -4092,360 +1860,417 @@ XRegExp.uninstall = function(options) { * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'}); * // -> /manbearpig/i */ -XRegExp.union = function(patterns, flags, options) { - options = options || {}; - var conjunction = options.conjunction || 'or'; - var numCaptures = 0; - var numPriorCaptures; - var captureNames; - - function rewrite(match, paren, backref) { - var name = captureNames[numCaptures - numPriorCaptures]; - - // Capturing group - if (paren) { - ++numCaptures; - // If the current capture has a name, preserve the name - if (name) { - return '(?<' + name + '>'; - } - // Backreference - } else if (backref) { - // Rewrite the backreference - return '\\' + (+backref + numPriorCaptures); - } - return match; - } - if (!(isType(patterns, 'Array') && patterns.length)) { - throw new TypeError('Must provide a nonempty array of patterns to merge'); - } +XRegExp.union = function (patterns, flags, options) { + options = options || {}; + var conjunction = options.conjunction || 'or'; + var numCaptures = 0; + var numPriorCaptures; + var captureNames; - var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; - var output = []; - var pattern; - for (var i = 0; i < patterns.length; ++i) { - pattern = patterns[i]; + function rewrite(match, paren, backref) { + var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group - if (XRegExp.isRegExp(pattern)) { - numPriorCaptures = numCaptures; - captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || []; + if (paren) { + ++numCaptures; // If the current capture has a name, preserve the name - // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are - // independently valid; helps keep this simple. Named captures are put back - output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite)); - } else { - output.push(XRegExp.escape(pattern)); - } + if (name) { + return "(?<".concat(name, ">"); + } // Backreference + + } else if (backref) { + // Rewrite the backreference + return "\\".concat(+backref + numPriorCaptures); } - var separator = conjunction === 'none' ? '' : '|'; - return XRegExp(output.join(separator), flags); -}; + return match; + } -// ==--------------------------== + if (!(isType(patterns, 'Array') && patterns.length)) { + throw new TypeError('Must provide a nonempty array of patterns to merge'); + } + + var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g; + var output = []; + + var _iterator5 = _createForOfIteratorHelper(patterns), + _step5; + + try { + for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { + var pattern = _step5.value; + + if (XRegExp.isRegExp(pattern)) { + numPriorCaptures = numCaptures; + captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are + // independently valid; helps keep this simple. Named captures are put back + + output.push(XRegExp(pattern.source).source.replace(parts, rewrite)); + } else { + output.push(XRegExp.escape(pattern)); + } + } + } catch (err) { + _iterator5.e(err); + } finally { + _iterator5.f(); + } + + var separator = conjunction === 'none' ? '' : '|'; + return XRegExp(output.join(separator), flags); +}; // ==--------------------------== // Fixed/extended native methods // ==--------------------------== /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `RegExp.prototype.exec`. Calling `XRegExp.install('natives')` uses this to - * override the native method. Use via `XRegExp.exec` without overriding natives. + * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`. * * @memberOf RegExp * @param {String} str String to search. * @returns {Array} Match array with named backreference properties, or `null`. */ -fixed.exec = function(str) { - var origLastIndex = this.lastIndex; - var match = nativ.exec.apply(this, arguments); - var name; - var r2; - var i; - if (match) { - // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing - // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 - // in standards mode follows the spec. - if (!correctExecNpcg && match.length > 1 && indexOf(match, '') > -1) { - r2 = copyRegex(this, { - removeG: true, - isInternalOnly: true - }); - // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed - // matching due to characters outside the match - nativ.replace.call(String(str).slice(match.index), r2, function() { - var len = arguments.length; - var i; - // Skip index 0 and the last 2 - for (i = 1; i < len - 2; ++i) { - if (arguments[i] === undefined) { - match[i] = undefined; - } - } - }); - } - // Attach named capture properties - if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { - // Skip index 0 - for (i = 1; i < match.length; ++i) { - name = this[REGEX_DATA].captureNames[i - 1]; - if (name) { - match[name] = match[i]; - } - } +fixed.exec = function (str) { + var origLastIndex = this.lastIndex; + var match = RegExp.prototype.exec.apply(this, arguments); + + if (match) { + // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing + // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9 + // in standards mode follows the spec. + if (!correctExecNpcg && match.length > 1 && (0, _indexOf["default"])(match).call(match, '') !== -1) { + var _context3; + + var r2 = copyRegex(this, { + removeG: true, + isInternalOnly: true + }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + + (0, _slice["default"])(_context3 = String(str)).call(_context3, match.index).replace(r2, function () { + var len = arguments.length; // Skip index 0 and the last 2 + + for (var i = 1; i < len - 2; ++i) { + if ((i < 0 || arguments.length <= i ? undefined : arguments[i]) === undefined) { + match[i] = undefined; + } } + }); + } // Attach named capture properties + + + if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) { + var groupsObject = match; + + if (XRegExp.isInstalled('namespacing')) { + // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec + match.groups = (0, _create["default"])(null); + groupsObject = match.groups; + } // Skip index 0 + - // Fix browsers that increment `lastIndex` after zero-length matches - if (this.global && !match[0].length && (this.lastIndex > match.index)) { - this.lastIndex = match.index; + for (var i = 1; i < match.length; ++i) { + var name = this[REGEX_DATA].captureNames[i - 1]; + + if (name) { + groupsObject[name] = match[i]; } - } + } // Preserve any existing `groups` obj that came from native ES2018 named capture + + } else if (!match.groups && XRegExp.isInstalled('namespacing')) { + match.groups = undefined; + } // Fix browsers that increment `lastIndex` after zero-length matches + - if (!this.global) { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - this.lastIndex = origLastIndex; + if (this.global && !match[0].length && this.lastIndex > match.index) { + this.lastIndex = match.index; } + } - return match; -}; + if (!this.global) { + // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) + this.lastIndex = origLastIndex; + } + return match; +}; /** - * Fixes browser bugs in the native `RegExp.prototype.test`. Calling `XRegExp.install('natives')` - * uses this to override the native method. + * Fixes browser bugs in the native `RegExp.prototype.test`. * * @memberOf RegExp * @param {String} str String to search. - * @returns {Boolean} Whether the regex matched the provided value. + * @returns {boolean} Whether the regex matched the provided value. */ -fixed.test = function(str) { - // Do this the easy way :-) - return !!fixed.exec.call(this, str); -}; + +fixed.test = function (str) { + // Do this the easy way :-) + return !!fixed.exec.call(this, str); +}; /** * Adds named capture support (with backreferences returned as `result.name`), and fixes browser - * bugs in the native `String.prototype.match`. Calling `XRegExp.install('natives')` uses this to - * override the native method. + * bugs in the native `String.prototype.match`. * * @memberOf String * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`. * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g, * the result of calling `regex.exec(this)`. */ -fixed.match = function(regex) { - var result; - - if (!XRegExp.isRegExp(regex)) { - // Use the native `RegExp` rather than `XRegExp` - regex = new RegExp(regex); - } else if (regex.global) { - result = nativ.match.apply(this, arguments); - // Fixes IE bug - regex.lastIndex = 0; - - return result; - } - return fixed.exec.call(regex, toObject(this)); -}; +fixed.match = function (regex) { + if (!XRegExp.isRegExp(regex)) { + // Use the native `RegExp` rather than `XRegExp` + regex = new RegExp(regex); + } else if (regex.global) { + var result = String.prototype.match.apply(this, arguments); // Fixes IE bug + + regex.lastIndex = 0; + return result; + } + + return fixed.exec.call(regex, nullThrows(this)); +}; /** - * Adds support for `${n}` tokens for named and numbered backreferences in replacement text, and - * provides named backreferences to replacement functions as `arguments[0].name`. Also fixes browser - * bugs in replacement text syntax when performing a replacement using a nonregex search value, and - * the value of a replacement regex's `lastIndex` property during replacement iterations and upon - * completion. Calling `XRegExp.install('natives')` uses this to override the native method. Note - * that this doesn't support SpiderMonkey's proprietary third (`flags`) argument. Use via - * `XRegExp.replace` without overriding natives. + * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement + * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also + * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex + * search value, and the value of a replacement regex's `lastIndex` property during replacement + * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third + * (`flags`) argument. Use via `XRegExp.replace`. * * @memberOf String * @param {RegExp|String} search Search pattern to be replaced. * @param {String|Function} replacement Replacement string or a function invoked to create it. - * @returns {String} New string with one or all matches replaced. + * @returns {string} New string with one or all matches replaced. */ -fixed.replace = function(search, replacement) { - var isRegex = XRegExp.isRegExp(search); - var origLastIndex; - var captureNames; - var result; - - if (isRegex) { - if (search[REGEX_DATA]) { - captureNames = search[REGEX_DATA].captureNames; + + +fixed.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search); + var origLastIndex; + var captureNames; + var result; + + if (isRegex) { + if (search[REGEX_DATA]) { + captureNames = search[REGEX_DATA].captureNames; + } // Only needed if `search` is nonglobal + + + origLastIndex = search.lastIndex; + } else { + search += ''; // Type-convert + } // Don't use `typeof`; some older browsers return 'function' for regex objects + + + if (isType(replacement, 'Function')) { + // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement + // functions isn't type-converted to a string + result = String(this).replace(search, function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (captureNames) { + var groupsObject; + + if (XRegExp.isInstalled('namespacing')) { + // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec + groupsObject = (0, _create["default"])(null); + args.push(groupsObject); + } else { + // Change the `args[0]` string primitive to a `String` object that can store + // properties. This really does need to use `String` as a constructor + args[0] = new String(args[0]); + groupsObject = args[0]; + } // Store named backreferences + + + for (var i = 0; i < captureNames.length; ++i) { + if (captureNames[i]) { + groupsObject[captureNames[i]] = args[i + 1]; + } } - // Only needed if `search` is nonglobal - origLastIndex = search.lastIndex; - } else { - search += ''; // Type-convert - } + } // ES6 specs the context for replacement functions as `undefined` - // Don't use `typeof`; some older browsers return 'function' for regex objects - if (isType(replacement, 'Function')) { - // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement - // functions isn't type-converted to a string - result = nativ.replace.call(String(this), search, function() { - var args = arguments; - var i; - if (captureNames) { - // Change the `arguments[0]` string primitive to a `String` object that can store - // properties. This really does need to use `String` as a constructor - args[0] = new String(args[0]); - // Store named backreferences on the first argument - for (i = 0; i < captureNames.length; ++i) { - if (captureNames[i]) { - args[0][captureNames[i]] = args[i + 1]; - } - } - } - // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari - // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1) - if (isRegex && search.global) { - search.lastIndex = args[args.length - 2] + args[0].length; + + return replacement.apply(void 0, args); + }); + } else { + // Ensure that the last value of `args` will be a string when given nonstring `this`, + // while still throwing on null or undefined context + result = String(nullThrows(this)).replace(search, function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + return String(replacement).replace(replacementToken, replacer); + + function replacer($0, bracketed, angled, dollarToken) { + bracketed = bracketed || angled; // ES2018 added a new trailing `groups` arg that's passed to replacement functions + // when the search regex uses native named capture + + var numNonCaptureArgs = isType(args[args.length - 1], 'Object') ? 4 : 3; + var numCaptures = args.length - numNonCaptureArgs; // Handle named or numbered backreference with curly or angled braces: ${n}, $<n> + + if (bracketed) { + // Handle backreference to numbered capture, if `bracketed` is an integer. Use + // `0` for the entire match. Any number of leading zeros may be used. + if (/^\d+$/.test(bracketed)) { + // Type-convert and drop leading zeros + var _n = +bracketed; + + if (_n <= numCaptures) { + return args[_n] || ''; } - // ES6 specs the context for replacement functions as `undefined` - return replacement.apply(undefined, args); - }); - } else { - // Ensure that the last value of `args` will be a string when given nonstring `this`, - // while still throwing on null or undefined context - result = nativ.replace.call(this == null ? this : String(this), search, function() { - // Keep this function's `arguments` available through closure - var args = arguments; - return nativ.replace.call(String(replacement), replacementToken, function($0, $1, $2) { - var n; - // Named or numbered backreference with curly braces - if ($1) { - // XRegExp behavior for `${n}`: - // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the - // entire match. Any number of leading zeros may be used. - // 2. Backreference to named capture `n`, if it exists and is not an integer - // overridden by numbered capture. In practice, this does not overlap with - // numbered capture since XRegExp does not allow named capture to use a bare - // integer as the name. - // 3. If the name or number does not refer to an existing capturing group, it's - // an error. - n = +$1; // Type-convert; drop leading zeros - if (n <= args.length - 3) { - return args[n] || ''; - } - // Groups with the same name is an error, else would need `lastIndexOf` - n = captureNames ? indexOf(captureNames, $1) : -1; - if (n < 0) { - throw new SyntaxError('Backreference to undefined group ' + $0); - } - return args[n + 1] || ''; - } - // Else, special variable or numbered backreference without curly braces - if ($2 === '$') { // $$ - return '$'; - } - if ($2 === '&' || +$2 === 0) { // $&, $0 (not followed by 1-9), $00 - return args[0]; - } - if ($2 === '`') { // $` (left context) - return args[args.length - 1].slice(0, args[args.length - 2]); - } - if ($2 === "'") { // $' (right context) - return args[args.length - 1].slice(args[args.length - 2] + args[0].length); - } - // Else, numbered backreference without curly braces - $2 = +$2; // Type-convert; drop leading zero - // XRegExp behavior for `$n` and `$nn`: - // - Backrefs end after 1 or 2 digits. Use `${..}` for more digits. - // - `$1` is an error if no capturing groups. - // - `$10` is an error if less than 10 capturing groups. Use `${1}0` instead. - // - `$01` is `$1` if at least one capturing group, else it's an error. - // - `$0` (not followed by 1-9) and `$00` are the entire match. - // Native behavior, for comparison: - // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. - // - `$1` is a literal `$1` if no capturing groups. - // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. - // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. - // - `$0` is a literal `$0`. - if (!isNaN($2)) { - if ($2 > args.length - 3) { - throw new SyntaxError('Backreference to undefined group ' + $0); - } - return args[$2] || ''; - } - // `$` followed by an unsupported char is an error, unlike native JS - throw new SyntaxError('Invalid token ' + $0); - }); - }); - } + } // Handle backreference to named capture. If the name does not refer to an + // existing capturing group, it's an error. Also handles the error for numbered + // backference that does not refer to an existing group. + // Using `indexOf` since having groups with the same name is already an error, + // otherwise would need `lastIndexOf`. - if (isRegex) { - if (search.global) { - // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) - search.lastIndex = 0; - } else { - // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) - search.lastIndex = origLastIndex; + + var n = captureNames ? (0, _indexOf["default"])(captureNames).call(captureNames, bracketed) : -1; + + if (n < 0) { + throw new SyntaxError("Backreference to undefined group ".concat($0)); + } + + return args[n + 1] || ''; + } // Handle `$`-prefixed variable + // Handle space/blank first because type conversion with `+` drops space padding + // and converts spaces and empty strings to `0` + + + if (dollarToken === '' || dollarToken === ' ') { + throw new SyntaxError("Invalid token ".concat($0)); + } + + if (dollarToken === '&' || +dollarToken === 0) { + // $&, $0 (not followed by 1-9), $00 + return args[0]; + } + + if (dollarToken === '$') { + // $$ + return '$'; + } + + if (dollarToken === '`') { + var _context4; + + // $` (left context) + return (0, _slice["default"])(_context4 = args[args.length - 1]).call(_context4, 0, args[args.length - 2]); } + + if (dollarToken === "'") { + var _context5; + + // $' (right context) + return (0, _slice["default"])(_context5 = args[args.length - 1]).call(_context5, args[args.length - 2] + args[0].length); + } // Handle numbered backreference without braces + // Type-convert and drop leading zero + + + dollarToken = +dollarToken; // XRegExp behavior for `$n` and `$nn`: + // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits. + // - `$1` is an error if no capturing groups. + // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0` + // instead. + // - `$01` is `$1` if at least one capturing group, else it's an error. + // - `$0` (not followed by 1-9) and `$00` are the entire match. + // Native behavior, for comparison: + // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+. + // - `$1` is a literal `$1` if no capturing groups. + // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups. + // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`. + // - `$0` is a literal `$0`. + + if (!isNaN(dollarToken)) { + if (dollarToken > numCaptures) { + throw new SyntaxError("Backreference to undefined group ".concat($0)); + } + + return args[dollarToken] || ''; + } // `$` followed by an unsupported char is an error, unlike native JS + + + throw new SyntaxError("Invalid token ".concat($0)); + } + }); + } + + if (isRegex) { + if (search.global) { + // Fixes IE, Safari bug (last tested IE 9, Safari 5.1) + search.lastIndex = 0; + } else { + // Fixes IE, Opera bug (last tested IE 9, Opera 11.6) + search.lastIndex = origLastIndex; } + } - return result; + return result; }; - /** - * Fixes browser bugs in the native `String.prototype.split`. Calling `XRegExp.install('natives')` - * uses this to override the native method. Use via `XRegExp.split` without overriding natives. + * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`. * * @memberOf String * @param {RegExp|String} separator Regex or string to use for separating the string. * @param {Number} [limit] Maximum number of items to include in the result array. - * @returns {Array} Array of substrings. + * @returns {!Array} Array of substrings. */ -fixed.split = function(separator, limit) { - if (!XRegExp.isRegExp(separator)) { - // Browsers handle nonregex split correctly, so use the faster native method - return nativ.split.apply(this, arguments); - } - var str = String(this); - var output = []; - var origLastIndex = separator.lastIndex; - var lastLastIndex = 0; - var lastLength; - - // Values for `limit`, per the spec: - // If undefined: pow(2,32) - 1 - // If 0, Infinity, or NaN: 0 - // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); - // If negative number: pow(2,32) - floor(abs(limit)) - // If other: Type-convert, then use the above rules - // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless - // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ - limit = (limit === undefined ? -1 : limit) >>> 0; - - XRegExp.forEach(str, separator, function(match) { - // This condition is not the same as `if (match[0].length)` - if ((match.index + match[0].length) > lastLastIndex) { - output.push(str.slice(lastLastIndex, match.index)); - if (match.length > 1 && match.index < str.length) { - Array.prototype.push.apply(output, match.slice(1)); - } - lastLength = match[0].length; - lastLastIndex = match.index + lastLength; - } - }); - if (lastLastIndex === str.length) { - if (!nativ.test.call(separator, '') || lastLength) { - output.push(''); - } - } else { - output.push(str.slice(lastLastIndex)); +fixed.split = function (separator, limit) { + if (!XRegExp.isRegExp(separator)) { + // Browsers handle nonregex split correctly, so use the faster native method + return String.prototype.split.apply(this, arguments); + } + + var str = String(this); + var output = []; + var origLastIndex = separator.lastIndex; + var lastLastIndex = 0; + var lastLength; // Values for `limit`, per the spec: + // If undefined: pow(2,32) - 1 + // If 0, Infinity, or NaN: 0 + // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32); + // If negative number: pow(2,32) - floor(abs(limit)) + // If other: Type-convert, then use the above rules + // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless + // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+ + + limit = (limit === undefined ? -1 : limit) >>> 0; + (0, _forEach["default"])(XRegExp).call(XRegExp, str, separator, function (match) { + // This condition is not the same as `if (match[0].length)` + if (match.index + match[0].length > lastLastIndex) { + output.push((0, _slice["default"])(str).call(str, lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) { + Array.prototype.push.apply(output, (0, _slice["default"])(match).call(match, 1)); + } + + lastLength = match[0].length; + lastLastIndex = match.index + lastLength; } + }); - separator.lastIndex = origLastIndex; - return output.length > limit ? output.slice(0, limit) : output; -}; + if (lastLastIndex === str.length) { + if (!separator.test('') || lastLength) { + output.push(''); + } + } else { + output.push((0, _slice["default"])(str).call(str, lastLastIndex)); + } -// ==--------------------------== + separator.lastIndex = origLastIndex; + return output.length > limit ? (0, _slice["default"])(output).call(output, 0, limit) : output; +}; // ==--------------------------== // Built-in syntax/flag tokens // ==--------------------------== @@ -4454,21 +2279,19 @@ fixed.split = function(separator, limit) { * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser * consistency and to reserve their syntax, but lets them be superseded by addons. */ -XRegExp.addToken( - /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, - function(match, scope) { - // \B is allowed in default scope only - if (match[1] === 'B' && scope === defaultScope) { - return match[0]; - } - throw new SyntaxError('Invalid escape ' + match[0]); - }, - { - scope: 'all', - leadChar: '\\' - } -); + +XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function (match, scope) { + // \B is allowed in default scope only + if (match[1] === 'B' && scope === defaultScope) { + return match[0]; + } + + throw new SyntaxError("Invalid escape ".concat(match[0])); +}, { + scope: 'all', + leadChar: '\\' +}); /* * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag @@ -4477,176 +2300,3827 @@ XRegExp.addToken( * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or * if you use the same in a character class. */ -XRegExp.addToken( - /\\u{([\dA-Fa-f]+)}/, - function(match, scope, flags) { - var code = dec(match[1]); - if (code > 0x10FFFF) { - throw new SyntaxError('Invalid Unicode code point ' + match[0]); - } - if (code <= 0xFFFF) { - // Converting to \uNNNN avoids needing to escape the literal character and keep it - // separate from preceding tokens - return '\\u' + pad4(hex(code)); - } - // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling - if (hasNativeU && flags.indexOf('u') > -1) { - return match[0]; - } - throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); - }, - { - scope: 'all', - leadChar: '\\' - } -); -/* - * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency. - * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because - * character class endings can't be determined. - */ -XRegExp.addToken( - /\[(\^?)\]/, - function(match) { - // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. - // (?!) should work like \b\B, but is unreliable in some versions of Firefox - return match[1] ? '[\\s\\S]' : '\\b\\B'; - }, - {leadChar: '['} -); +XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/, function (match, scope, flags) { + var code = dec(match[1]); + if (code > 0x10FFFF) { + throw new SyntaxError("Invalid Unicode code point ".concat(match[0])); + } + + if (code <= 0xFFFF) { + // Converting to \uNNNN avoids needing to escape the literal character and keep it + // separate from preceding tokens + return "\\u".concat(pad4(hex(code))); + } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling + + + if (hasNativeU && (0, _indexOf["default"])(flags).call(flags, 'u') !== -1) { + return match[0]; + } + + throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u'); +}, { + scope: 'all', + leadChar: '\\' +}); /* * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in * free-spacing mode (flag x). */ -XRegExp.addToken( - /\(\?#[^)]*\)/, - getContextualTokenSeparator, - {leadChar: '('} -); +XRegExp.addToken(/\(\?#[^)]*\)/, getContextualTokenSeparator, { + leadChar: '(' +}); /* * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only. */ -XRegExp.addToken( - /\s+|#[^\n]*\n?/, - getContextualTokenSeparator, - {flag: 'x'} -); +XRegExp.addToken(/\s+|#[^\n]*\n?/, getContextualTokenSeparator, { + flag: 'x' +}); /* - * Dot, in dotall mode (aka singleline mode, flag s) only. + * Dot, in dotAll mode (aka singleline mode, flag s) only. */ -XRegExp.addToken( - /\./, - function() { - return '[\\s\\S]'; - }, - { - flag: 's', - leadChar: '.' - } -); +if (!hasNativeS) { + XRegExp.addToken(/\./, function () { + return '[\\s\\S]'; + }, { + flag: 's', + leadChar: '.' + }); +} /* - * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _, - * and $ only. Also allows numbered backreferences as `\k<n>`. + * Named backreference: `\k<name>`. Backreference names can use RegExpIdentifierName characters + * only. Also allows numbered backreferences as `\k<n>`. */ -XRegExp.addToken( - /\\k<([\w$]+)>/, - function(match) { - // Groups with the same name is an error, else would need `lastIndexOf` - var index = isNaN(match[1]) ? (indexOf(this.captureNames, match[1]) + 1) : +match[1]; - var endIndex = match.index + match[0].length; - if (!index || index > this.captureNames.length) { - throw new SyntaxError('Backreference to undefined group ' + match[0]); - } - // Keep backreferences separate from subsequent literal numbers. This avoids e.g. - // inadvertedly changing `(?<n>)\k<n>1` to `()\11`. - return '\\' + index + ( - endIndex === match.input.length || isNaN(match.input.charAt(endIndex)) ? - '' : '(?:)' - ); - }, - {leadChar: '\\'} -); + +XRegExp.addToken(/\\k<([^>]+)>/, function (match) { + var _context6, _context7; + + // Groups with the same name is an error, else would need `lastIndexOf` + var index = isNaN(match[1]) ? (0, _indexOf["default"])(_context6 = this.captureNames).call(_context6, match[1]) + 1 : +match[1]; + var endIndex = match.index + match[0].length; + + if (!index || index > this.captureNames.length) { + throw new SyntaxError("Backreference to undefined group ".concat(match[0])); + } // Keep backreferences separate from subsequent literal numbers. This avoids e.g. + // inadvertedly changing `(?<n>)\k<n>1` to `()\11`. + + + return (0, _concat["default"])(_context7 = "\\".concat(index)).call(_context7, endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)'); +}, { + leadChar: '\\' +}); /* * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0` * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax. */ -XRegExp.addToken( - /\\(\d+)/, - function(match, scope) { - if ( - !( - scope === defaultScope && - /^[1-9]/.test(match[1]) && - +match[1] <= this.captureNames.length - ) && - match[1] !== '0' - ) { - throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + - match[0]); - } - return match[0]; - }, - { - scope: 'all', - leadChar: '\\' - } -); +XRegExp.addToken(/\\(\d+)/, function (match, scope) { + if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') { + throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(match[0])); + } + + return match[0]; +}, { + scope: 'all', + leadChar: '\\' +}); /* * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the - * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style + * RegExpIdentifierName characters only. Names can't be integers. Supports Python-style * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to * Python-style named capture as octals. */ -XRegExp.addToken( - /\(\?P?<([\w$]+)>/, - function(match) { - // Disallow bare integers as names because named backreferences are added to match arrays - // and therefore numeric properties may lead to incorrect lookups - if (!isNaN(match[1])) { - throw new SyntaxError('Cannot use integer as capture name ' + match[0]); - } - if (match[1] === 'length' || match[1] === '__proto__') { - throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]); - } - if (indexOf(this.captureNames, match[1]) > -1) { - throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]); - } - this.captureNames.push(match[1]); - this.hasNamedCapture = true; - return '('; - }, - {leadChar: '('} -); +XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/, function (match) { + var _context8; + + if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) { + throw new SyntaxError("Cannot use reserved word as capture name ".concat(match[0])); + } + + if ((0, _indexOf["default"])(_context8 = this.captureNames).call(_context8, match[1]) !== -1) { + throw new SyntaxError("Cannot use same name for multiple groups ".concat(match[0])); + } + + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return '('; +}, { + leadChar: '(' +}); /* * Capturing group; match the opening parenthesis only. Required for support of named capturing - * groups. Also adds explicit capture mode (flag n). + * groups. Also adds named capture only mode (flag n). */ -XRegExp.addToken( - /\((?!\?)/, - function(match, scope, flags) { - if (flags.indexOf('n') > -1) { - return '(?:'; + +XRegExp.addToken(/\((?!\?)/, function (match, scope, flags) { + if ((0, _indexOf["default"])(flags).call(flags, 'n') !== -1) { + return '(?:'; + } + + this.captureNames.push(null); + return '('; +}, { + optionalFlags: 'n', + leadChar: '(' +}); +var _default = XRegExp; +exports["default"] = _default; +module.exports = exports.default; +},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/array/from"); +},{"core-js-pure/stable/array/from":208}],6:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/array/is-array"); +},{"core-js-pure/stable/array/is-array":209}],7:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/concat"); +},{"core-js-pure/stable/instance/concat":212}],8:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/flags"); +},{"core-js-pure/stable/instance/flags":213}],9:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/for-each"); +},{"core-js-pure/stable/instance/for-each":214}],10:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/index-of"); +},{"core-js-pure/stable/instance/index-of":215}],11:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/slice"); +},{"core-js-pure/stable/instance/slice":216}],12:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/instance/sort"); +},{"core-js-pure/stable/instance/sort":217}],13:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/object/create"); +},{"core-js-pure/stable/object/create":218}],14:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/object/define-property"); +},{"core-js-pure/stable/object/define-property":219}],15:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/parse-int"); +},{"core-js-pure/stable/parse-int":220}],16:[function(require,module,exports){ +module.exports = require("core-js-pure/stable/symbol"); +},{"core-js-pure/stable/symbol":221}],17:[function(require,module,exports){ +module.exports = require("core-js-pure/features/array/from"); +},{"core-js-pure/features/array/from":52}],18:[function(require,module,exports){ +module.exports = require("core-js-pure/features/array/is-array"); +},{"core-js-pure/features/array/is-array":53}],19:[function(require,module,exports){ +module.exports = require("core-js-pure/features/get-iterator-method"); +},{"core-js-pure/features/get-iterator-method":54}],20:[function(require,module,exports){ +module.exports = require("core-js-pure/features/instance/slice"); +},{"core-js-pure/features/instance/slice":55}],21:[function(require,module,exports){ +module.exports = require("core-js-pure/features/symbol"); +},{"core-js-pure/features/symbol":56}],22:[function(require,module,exports){ +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{}],23:[function(require,module,exports){ +var _Array$isArray = require("@babel/runtime-corejs3/core-js/array/is-array"); + +function _arrayWithHoles(arr) { + if (_Array$isArray(arr)) return arr; +} + +module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(require,module,exports){ +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{}],25:[function(require,module,exports){ +var _Symbol = require("@babel/runtime-corejs3/core-js/symbol"); + +var _getIteratorMethod = require("@babel/runtime-corejs3/core-js/get-iterator-method"); + +function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof _Symbol !== "undefined" && _getIteratorMethod(arr) || arr["@@iterator"]; + + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + + var _s, _e; + + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; +} + +module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(require,module,exports){ +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{}],27:[function(require,module,exports){ +var arrayWithHoles = require("./arrayWithHoles.js"); + +var iterableToArrayLimit = require("./iterableToArrayLimit.js"); + +var unsupportedIterableToArray = require("./unsupportedIterableToArray.js"); + +var nonIterableRest = require("./nonIterableRest.js"); + +function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); +} + +module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(require,module,exports){ +var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js/instance/slice"); + +var _Array$from = require("@babel/runtime-corejs3/core-js/array/from"); + +var arrayLikeToArray = require("./arrayLikeToArray.js"); + +function _unsupportedIterableToArray(o, minLen) { + var _context; + + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + + var n = _sliceInstanceProperty(_context = Object.prototype.toString.call(o)).call(_context, 8, -1); + + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return _Array$from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); +} + +module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; +},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(require,module,exports){ +var parent = require('../../stable/array/from'); + +module.exports = parent; + +},{"../../stable/array/from":208}],30:[function(require,module,exports){ +var parent = require('../../stable/array/is-array'); + +module.exports = parent; + +},{"../../stable/array/is-array":209}],31:[function(require,module,exports){ +var parent = require('../stable/get-iterator-method'); + +module.exports = parent; + +},{"../stable/get-iterator-method":211}],32:[function(require,module,exports){ +var parent = require('../../stable/instance/slice'); + +module.exports = parent; + +},{"../../stable/instance/slice":216}],33:[function(require,module,exports){ +var parent = require('../../stable/symbol'); + +module.exports = parent; + +},{"../../stable/symbol":221}],34:[function(require,module,exports){ +require('../../modules/es.string.iterator'); +require('../../modules/es.array.from'); +var path = require('../../internals/path'); + +module.exports = path.Array.from; + +},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(require,module,exports){ +require('../../modules/es.array.is-array'); +var path = require('../../internals/path'); + +module.exports = path.Array.isArray; + +},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(require,module,exports){ +require('../../../modules/es.array.concat'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('Array').concat; + +},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(require,module,exports){ +require('../../../modules/es.array.for-each'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('Array').forEach; + +},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(require,module,exports){ +require('../../../modules/es.array.index-of'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('Array').indexOf; + +},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(require,module,exports){ +require('../../../modules/es.array.slice'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('Array').slice; + +},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(require,module,exports){ +require('../../../modules/es.array.sort'); +var entryVirtual = require('../../../internals/entry-virtual'); + +module.exports = entryVirtual('Array').sort; + +},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(require,module,exports){ +require('../modules/es.array.iterator'); +require('../modules/es.string.iterator'); +var getIteratorMethod = require('../internals/get-iterator-method'); + +module.exports = getIteratorMethod; + +},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(require,module,exports){ +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var method = require('../array/virtual/concat'); + +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + var own = it.concat; + return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.concat) ? method : own; +}; + +},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(require,module,exports){ +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var flags = require('../regexp/flags'); + +var RegExpPrototype = RegExp.prototype; + +module.exports = function (it) { + return (it === RegExpPrototype || isPrototypeOf(RegExpPrototype, it)) ? flags(it) : it.flags; +}; + +},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(require,module,exports){ +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var method = require('../array/virtual/index-of'); + +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + var own = it.indexOf; + return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.indexOf) ? method : own; +}; + +},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(require,module,exports){ +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var method = require('../array/virtual/slice'); + +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + var own = it.slice; + return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.slice) ? method : own; +}; + +},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(require,module,exports){ +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var method = require('../array/virtual/sort'); + +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + var own = it.sort; + return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.sort) ? method : own; +}; + +},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(require,module,exports){ +require('../../modules/es.object.create'); +var path = require('../../internals/path'); + +var Object = path.Object; + +module.exports = function create(P, D) { + return Object.create(P, D); +}; + +},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(require,module,exports){ +require('../../modules/es.object.define-property'); +var path = require('../../internals/path'); + +var Object = path.Object; + +var defineProperty = module.exports = function defineProperty(it, key, desc) { + return Object.defineProperty(it, key, desc); +}; + +if (Object.defineProperty.sham) defineProperty.sham = true; + +},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(require,module,exports){ +require('../modules/es.parse-int'); +var path = require('../internals/path'); + +module.exports = path.parseInt; + +},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(require,module,exports){ +require('../../modules/es.regexp.flags'); +var uncurryThis = require('../../internals/function-uncurry-this'); +var regExpFlags = require('../../internals/regexp-flags'); + +module.exports = uncurryThis(regExpFlags); + +},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(require,module,exports){ +require('../../modules/es.array.concat'); +require('../../modules/es.object.to-string'); +require('../../modules/es.symbol'); +require('../../modules/es.symbol.async-iterator'); +require('../../modules/es.symbol.description'); +require('../../modules/es.symbol.has-instance'); +require('../../modules/es.symbol.is-concat-spreadable'); +require('../../modules/es.symbol.iterator'); +require('../../modules/es.symbol.match'); +require('../../modules/es.symbol.match-all'); +require('../../modules/es.symbol.replace'); +require('../../modules/es.symbol.search'); +require('../../modules/es.symbol.species'); +require('../../modules/es.symbol.split'); +require('../../modules/es.symbol.to-primitive'); +require('../../modules/es.symbol.to-string-tag'); +require('../../modules/es.symbol.unscopables'); +require('../../modules/es.json.to-string-tag'); +require('../../modules/es.math.to-string-tag'); +require('../../modules/es.reflect.to-string-tag'); +var path = require('../../internals/path'); + +module.exports = path.Symbol; + +},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(require,module,exports){ +var parent = require('../../actual/array/from'); + +module.exports = parent; + +},{"../../actual/array/from":29}],53:[function(require,module,exports){ +var parent = require('../../actual/array/is-array'); + +module.exports = parent; + +},{"../../actual/array/is-array":30}],54:[function(require,module,exports){ +var parent = require('../actual/get-iterator-method'); + +module.exports = parent; + +},{"../actual/get-iterator-method":31}],55:[function(require,module,exports){ +var parent = require('../../actual/instance/slice'); + +module.exports = parent; + +},{"../../actual/instance/slice":32}],56:[function(require,module,exports){ +var parent = require('../../actual/symbol'); +require('../../modules/esnext.symbol.async-dispose'); +require('../../modules/esnext.symbol.dispose'); +require('../../modules/esnext.symbol.matcher'); +require('../../modules/esnext.symbol.metadata'); +require('../../modules/esnext.symbol.observable'); +// TODO: Remove from `core-js@4` +require('../../modules/esnext.symbol.pattern-match'); +// TODO: Remove from `core-js@4` +require('../../modules/esnext.symbol.replace-all'); + +module.exports = parent; + +},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(require,module,exports){ +var global = require('../internals/global'); +var isCallable = require('../internals/is-callable'); +var tryToString = require('../internals/try-to-string'); + +var TypeError = global.TypeError; + +// `Assert: IsCallable(argument) is true` +module.exports = function (argument) { + if (isCallable(argument)) return argument; + throw TypeError(tryToString(argument) + ' is not a function'); +}; + +},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(require,module,exports){ +var global = require('../internals/global'); +var isCallable = require('../internals/is-callable'); + +var String = global.String; +var TypeError = global.TypeError; + +module.exports = function (argument) { + if (typeof argument == 'object' || isCallable(argument)) return argument; + throw TypeError("Can't set " + String(argument) + ' as a prototype'); +}; + +},{"../internals/global":104,"../internals/is-callable":114}],59:[function(require,module,exports){ +module.exports = function () { /* empty */ }; + +},{}],60:[function(require,module,exports){ +var global = require('../internals/global'); +var isObject = require('../internals/is-object'); + +var String = global.String; +var TypeError = global.TypeError; + +// `Assert: Type(argument) is Object` +module.exports = function (argument) { + if (isObject(argument)) return argument; + throw TypeError(String(argument) + ' is not an object'); +}; + +},{"../internals/global":104,"../internals/is-object":117}],61:[function(require,module,exports){ +'use strict'; +var $forEach = require('../internals/array-iteration').forEach; +var arrayMethodIsStrict = require('../internals/array-method-is-strict'); + +var STRICT_METHOD = arrayMethodIsStrict('forEach'); + +// `Array.prototype.forEach` method implementation +// https://tc39.es/ecma262/#sec-array.prototype.foreach +module.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) { + return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); +// eslint-disable-next-line es/no-array-prototype-foreach -- safe +} : [].forEach; + +},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(require,module,exports){ +'use strict'; +var global = require('../internals/global'); +var bind = require('../internals/function-bind-context'); +var call = require('../internals/function-call'); +var toObject = require('../internals/to-object'); +var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); +var isArrayIteratorMethod = require('../internals/is-array-iterator-method'); +var isConstructor = require('../internals/is-constructor'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var createProperty = require('../internals/create-property'); +var getIterator = require('../internals/get-iterator'); +var getIteratorMethod = require('../internals/get-iterator-method'); + +var Array = global.Array; + +// `Array.from` method implementation +// https://tc39.es/ecma262/#sec-array.from +module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var IS_CONSTRUCTOR = isConstructor(this); + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined); + var iteratorMethod = getIteratorMethod(O); + var index = 0; + var length, result, step, iterator, next, value; + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = getIterator(O, iteratorMethod); + next = iterator.next; + result = IS_CONSTRUCTOR ? new this() : []; + for (;!(step = call(next, iterator)).done; index++) { + value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value; + createProperty(result, index, value); + } + } else { + length = lengthOfArrayLike(O); + result = IS_CONSTRUCTOR ? new this(length) : Array(length); + for (;length > index; index++) { + value = mapping ? mapfn(O[index], index) : O[index]; + createProperty(result, index, value); + } + } + result.length = index; + return result; +}; + +},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(require,module,exports){ +var toIndexedObject = require('../internals/to-indexed-object'); +var toAbsoluteIndex = require('../internals/to-absolute-index'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); + +// `Array.prototype.{ indexOf, includes }` methods implementation +var createMethod = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = lengthOfArrayLike(O); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare -- NaN check + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare -- NaN check + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) { + if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +module.exports = { + // `Array.prototype.includes` method + // https://tc39.es/ecma262/#sec-array.prototype.includes + includes: createMethod(true), + // `Array.prototype.indexOf` method + // https://tc39.es/ecma262/#sec-array.prototype.indexof + indexOf: createMethod(false) +}; + +},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(require,module,exports){ +var bind = require('../internals/function-bind-context'); +var uncurryThis = require('../internals/function-uncurry-this'); +var IndexedObject = require('../internals/indexed-object'); +var toObject = require('../internals/to-object'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var arraySpeciesCreate = require('../internals/array-species-create'); + +var push = uncurryThis([].push); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation +var createMethod = function (TYPE) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var IS_FILTER_REJECT = TYPE == 7; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + return function ($this, callbackfn, that, specificCreate) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that); + var length = lengthOfArrayLike(self); + var index = 0; + var create = specificCreate || arraySpeciesCreate; + var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: push(target, value); // filter + } else switch (TYPE) { + case 4: return false; // every + case 7: push(target, value); // filterReject } - this.captureNames.push(null); - return '('; + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + +module.exports = { + // `Array.prototype.forEach` method + // https://tc39.es/ecma262/#sec-array.prototype.foreach + forEach: createMethod(0), + // `Array.prototype.map` method + // https://tc39.es/ecma262/#sec-array.prototype.map + map: createMethod(1), + // `Array.prototype.filter` method + // https://tc39.es/ecma262/#sec-array.prototype.filter + filter: createMethod(2), + // `Array.prototype.some` method + // https://tc39.es/ecma262/#sec-array.prototype.some + some: createMethod(3), + // `Array.prototype.every` method + // https://tc39.es/ecma262/#sec-array.prototype.every + every: createMethod(4), + // `Array.prototype.find` method + // https://tc39.es/ecma262/#sec-array.prototype.find + find: createMethod(5), + // `Array.prototype.findIndex` method + // https://tc39.es/ecma262/#sec-array.prototype.findIndex + findIndex: createMethod(6), + // `Array.prototype.filterReject` method + // https://github.com/tc39/proposal-array-filtering + filterReject: createMethod(7) +}; + +},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(require,module,exports){ +var fails = require('../internals/fails'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var V8_VERSION = require('../internals/engine-v8-version'); + +var SPECIES = wellKnownSymbol('species'); + +module.exports = function (METHOD_NAME) { + // We can't use this feature detection in V8 since it causes + // deoptimization and serious performance degradation + // https://github.com/zloirock/core-js/issues/677 + return V8_VERSION >= 51 || !fails(function () { + var array = []; + var constructor = array.constructor = {}; + constructor[SPECIES] = function () { + return { foo: 1 }; + }; + return array[METHOD_NAME](Boolean).foo !== 1; + }); +}; + +},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(require,module,exports){ +'use strict'; +var fails = require('../internals/fails'); + +module.exports = function (METHOD_NAME, argument) { + var method = [][METHOD_NAME]; + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing + method.call(null, argument || function () { throw 1; }, 1); + }); +}; + +},{"../internals/fails":94}],67:[function(require,module,exports){ +var global = require('../internals/global'); +var toAbsoluteIndex = require('../internals/to-absolute-index'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var createProperty = require('../internals/create-property'); + +var Array = global.Array; +var max = Math.max; + +module.exports = function (O, start, end) { + var length = lengthOfArrayLike(O); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + var result = Array(max(fin - k, 0)); + for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]); + result.length = n; + return result; +}; + +},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); + +module.exports = uncurryThis([].slice); + +},{"../internals/function-uncurry-this":99}],69:[function(require,module,exports){ +var arraySlice = require('../internals/array-slice-simple'); + +var floor = Math.floor; + +var mergeSort = function (array, comparefn) { + var length = array.length; + var middle = floor(length / 2); + return length < 8 ? insertionSort(array, comparefn) : merge( + array, + mergeSort(arraySlice(array, 0, middle), comparefn), + mergeSort(arraySlice(array, middle), comparefn), + comparefn + ); +}; + +var insertionSort = function (array, comparefn) { + var length = array.length; + var i = 1; + var element, j; + + while (i < length) { + j = i; + element = array[i]; + while (j && comparefn(array[j - 1], element) > 0) { + array[j] = array[--j]; + } + if (j !== i++) array[j] = element; + } return array; +}; + +var merge = function (array, left, right, comparefn) { + var llength = left.length; + var rlength = right.length; + var lindex = 0; + var rindex = 0; + + while (lindex < llength || rindex < rlength) { + array[lindex + rindex] = (lindex < llength && rindex < rlength) + ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++] + : lindex < llength ? left[lindex++] : right[rindex++]; + } return array; +}; + +module.exports = mergeSort; + +},{"../internals/array-slice-simple":67}],70:[function(require,module,exports){ +var global = require('../internals/global'); +var isArray = require('../internals/is-array'); +var isConstructor = require('../internals/is-constructor'); +var isObject = require('../internals/is-object'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var SPECIES = wellKnownSymbol('species'); +var Array = global.Array; + +// a part of `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (isConstructor(C) && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + +},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(require,module,exports){ +var arraySpeciesConstructor = require('../internals/array-species-constructor'); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.es/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length); +}; + +},{"../internals/array-species-constructor":70}],72:[function(require,module,exports){ +var anObject = require('../internals/an-object'); +var iteratorClose = require('../internals/iterator-close'); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } +}; + +},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(require,module,exports){ +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var ITERATOR = wellKnownSymbol('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; }, - { - optionalFlags: 'n', - leadChar: '(' + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + +},{"../internals/well-known-symbol":166}],74:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + +},{"../internals/function-uncurry-this":99}],75:[function(require,module,exports){ +var global = require('../internals/global'); +var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); +var isCallable = require('../internals/is-callable'); +var classofRaw = require('../internals/classof-raw'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var Object = global.Object; + +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result; +}; + +},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(require,module,exports){ +var fails = require('../internals/fails'); + +module.exports = !fails(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + // eslint-disable-next-line es/no-object-getprototypeof -- required for testing + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + +},{"../internals/fails":94}],77:[function(require,module,exports){ +'use strict'; +var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; +var create = require('../internals/object-create'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); +var setToStringTag = require('../internals/set-to-string-tag'); +var Iterators = require('../internals/iterators'); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + +},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(require,module,exports){ +var DESCRIPTORS = require('../internals/descriptors'); +var definePropertyModule = require('../internals/object-define-property'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); + +module.exports = DESCRIPTORS ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(require,module,exports){ +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +},{}],80:[function(require,module,exports){ +'use strict'; +var toPropertyKey = require('../internals/to-property-key'); +var definePropertyModule = require('../internals/object-define-property'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); + +module.exports = function (object, key, value) { + var propertyKey = toPropertyKey(key); + if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else object[propertyKey] = value; +}; + +},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var call = require('../internals/function-call'); +var IS_PURE = require('../internals/is-pure'); +var FunctionName = require('../internals/function-name'); +var isCallable = require('../internals/is-callable'); +var createIteratorConstructor = require('../internals/create-iterator-constructor'); +var getPrototypeOf = require('../internals/object-get-prototype-of'); +var setPrototypeOf = require('../internals/object-set-prototype-of'); +var setToStringTag = require('../internals/set-to-string-tag'); +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var redefine = require('../internals/redefine'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var Iterators = require('../internals/iterators'); +var IteratorsCore = require('../internals/iterators-core'); + +var PROPER_FUNCTION_NAME = FunctionName.PROPER; +var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var ITERATOR = wellKnownSymbol('iterator'); +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { + redefine(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array.prototype.{ values, @@iterator }.name in V8 / FF + if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { + createNonEnumerableProperty(IterablePrototype, 'name', VALUES); + } else { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return call(nativeIterator, this); }; + } + } + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); + } + Iterators[NAME] = defaultIterator; + + return methods; +}; + +},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(require,module,exports){ +var path = require('../internals/path'); +var hasOwn = require('../internals/has-own-property'); +var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); +var defineProperty = require('../internals/object-define-property').f; + +module.exports = function (NAME) { + var Symbol = path.Symbol || (path.Symbol = {}); + if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, { + value: wrappedWellKnownSymbolModule.f(NAME) + }); +}; + +},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(require,module,exports){ +var fails = require('../internals/fails'); + +// Detect IE8's incomplete defineProperty implementation +module.exports = !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7; +}); + +},{"../internals/fails":94}],84:[function(require,module,exports){ +var global = require('../internals/global'); +var isObject = require('../internals/is-object'); + +var document = global.document; +// typeof document.createElement is 'object' in old IE +var EXISTS = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return EXISTS ? document.createElement(it) : {}; +}; + +},{"../internals/global":104,"../internals/is-object":117}],85:[function(require,module,exports){ +// iterable DOM collections +// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods +module.exports = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 +}; + +},{}],86:[function(require,module,exports){ +var userAgent = require('../internals/engine-user-agent'); + +var firefox = userAgent.match(/firefox\/(\d+)/i); + +module.exports = !!firefox && +firefox[1]; + +},{"../internals/engine-user-agent":88}],87:[function(require,module,exports){ +var UA = require('../internals/engine-user-agent'); + +module.exports = /MSIE|Trident/.test(UA); + +},{"../internals/engine-user-agent":88}],88:[function(require,module,exports){ +var getBuiltIn = require('../internals/get-built-in'); + +module.exports = getBuiltIn('navigator', 'userAgent') || ''; + +},{"../internals/get-built-in":100}],89:[function(require,module,exports){ +var global = require('../internals/global'); +var userAgent = require('../internals/engine-user-agent'); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + +},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(require,module,exports){ +var userAgent = require('../internals/engine-user-agent'); + +var webkit = userAgent.match(/AppleWebKit\/(\d+)\./); + +module.exports = !!webkit && +webkit[1]; + +},{"../internals/engine-user-agent":88}],91:[function(require,module,exports){ +var path = require('../internals/path'); + +module.exports = function (CONSTRUCTOR) { + return path[CONSTRUCTOR + 'Prototype']; +}; + +},{"../internals/path":142}],92:[function(require,module,exports){ +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + +},{}],93:[function(require,module,exports){ +'use strict'; +var global = require('../internals/global'); +var apply = require('../internals/function-apply'); +var uncurryThis = require('../internals/function-uncurry-this'); +var isCallable = require('../internals/is-callable'); +var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f; +var isForced = require('../internals/is-forced'); +var path = require('../internals/path'); +var bind = require('../internals/function-bind-context'); +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var hasOwn = require('../internals/has-own-property'); + +var wrapConstructor = function (NativeConstructor) { + var Wrapper = function (a, b, c) { + if (this instanceof Wrapper) { + switch (arguments.length) { + case 0: return new NativeConstructor(); + case 1: return new NativeConstructor(a); + case 2: return new NativeConstructor(a, b); + } return new NativeConstructor(a, b, c); + } return apply(NativeConstructor, this, arguments); + }; + Wrapper.prototype = NativeConstructor.prototype; + return Wrapper; +}; + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target + options.name - the .name of the function if it does not match the key +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var PROTO = options.proto; + + var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype; + + var target = GLOBAL ? path : path[TARGET] || createNonEnumerableProperty(path, TARGET, {})[TARGET]; + var targetPrototype = target.prototype; + + var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE; + var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor; + + for (key in source) { + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contains in native + USE_NATIVE = !FORCED && nativeSource && hasOwn(nativeSource, key); + + targetProperty = target[key]; + + if (USE_NATIVE) if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(nativeSource, key); + nativeProperty = descriptor && descriptor.value; + } else nativeProperty = nativeSource[key]; + + // export native or implementation + sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key]; + + if (USE_NATIVE && typeof targetProperty == typeof sourceProperty) continue; + + // bind timers to global for call from export context + if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global); + // wrap global constructors for prevent changs in this version + else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty); + // make static versions for prototype methods + else if (PROTO && isCallable(sourceProperty)) resultProperty = uncurryThis(sourceProperty); + // default case + else resultProperty = sourceProperty; + + // add a flag to not completely full polyfills + if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) { + createNonEnumerableProperty(resultProperty, 'sham', true); + } + + createNonEnumerableProperty(target, key, resultProperty); + + if (PROTO) { + VIRTUAL_PROTOTYPE = TARGET + 'Prototype'; + if (!hasOwn(path, VIRTUAL_PROTOTYPE)) { + createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {}); + } + // export virtual prototype methods + createNonEnumerableProperty(path[VIRTUAL_PROTOTYPE], key, sourceProperty); + // export real prototype methods + if (options.real && targetPrototype && !targetPrototype[key]) { + createNonEnumerableProperty(targetPrototype, key, sourceProperty); + } } -); + } +}; + +},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(require,module,exports){ +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; -module.exports = XRegExp; +},{}],95:[function(require,module,exports){ +var FunctionPrototype = Function.prototype; +var apply = FunctionPrototype.apply; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; + +// eslint-disable-next-line es/no-reflect -- safe +module.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () { + return call.apply(apply, arguments); +}); + +},{}],96:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var aCallable = require('../internals/a-callable'); + +var bind = uncurryThis(uncurryThis.bind); + +// optional / simple context binding +module.exports = function (fn, that) { + aCallable(fn); + return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(require,module,exports){ +var call = Function.prototype.call; + +module.exports = call.bind ? call.bind(call) : function () { + return call.apply(call, arguments); +}; + +},{}],98:[function(require,module,exports){ +var DESCRIPTORS = require('../internals/descriptors'); +var hasOwn = require('../internals/has-own-property'); + +var FunctionPrototype = Function.prototype; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; + +var EXISTS = hasOwn(FunctionPrototype, 'name'); +// additional protection from minified / mangled / dropped function names +var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something'; +var CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable)); + +module.exports = { + EXISTS: EXISTS, + PROPER: PROPER, + CONFIGURABLE: CONFIGURABLE +}; + +},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(require,module,exports){ +var FunctionPrototype = Function.prototype; +var bind = FunctionPrototype.bind; +var call = FunctionPrototype.call; +var callBind = bind && bind.bind(call); + +module.exports = bind ? function (fn) { + return fn && callBind(call, fn); +} : function (fn) { + return fn && function () { + return call.apply(fn, arguments); + }; +}; + +},{}],100:[function(require,module,exports){ +var path = require('../internals/path'); +var global = require('../internals/global'); +var isCallable = require('../internals/is-callable'); + +var aFunction = function (variable) { + return isCallable(variable) ? variable : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) + : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; +}; + +},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(require,module,exports){ +var classof = require('../internals/classof'); +var getMethod = require('../internals/get-method'); +var Iterators = require('../internals/iterators'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var ITERATOR = wellKnownSymbol('iterator'); + +module.exports = function (it) { + if (it != undefined) return getMethod(it, ITERATOR) + || getMethod(it, '@@iterator') + || Iterators[classof(it)]; +}; + +},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(require,module,exports){ +var global = require('../internals/global'); +var call = require('../internals/function-call'); +var aCallable = require('../internals/a-callable'); +var anObject = require('../internals/an-object'); +var tryToString = require('../internals/try-to-string'); +var getIteratorMethod = require('../internals/get-iterator-method'); + +var TypeError = global.TypeError; + +module.exports = function (argument, usingIterator) { + var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator; + if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument)); + throw TypeError(tryToString(argument) + ' is not iterable'); +}; + +},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(require,module,exports){ +var aCallable = require('../internals/a-callable'); + +// `GetMethod` abstract operation +// https://tc39.es/ecma262/#sec-getmethod +module.exports = function (V, P) { + var func = V[P]; + return func == null ? undefined : aCallable(func); +}; + +},{"../internals/a-callable":57}],104:[function(require,module,exports){ +(function (global){(function (){ +var check = function (it) { + return it && it.Math == Math && it; +}; + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = + // eslint-disable-next-line es/no-global-this -- safe + check(typeof globalThis == 'object' && globalThis) || + check(typeof window == 'object' && window) || + // eslint-disable-next-line no-restricted-globals -- safe + check(typeof self == 'object' && self) || + check(typeof global == 'object' && global) || + // eslint-disable-next-line no-new-func -- fallback + (function () { return this; })() || Function('return this')(); + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],105:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var toObject = require('../internals/to-object'); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + +},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(require,module,exports){ +module.exports = {}; + +},{}],107:[function(require,module,exports){ +var getBuiltIn = require('../internals/get-built-in'); + +module.exports = getBuiltIn('document', 'documentElement'); + +},{"../internals/get-built-in":100}],108:[function(require,module,exports){ +var DESCRIPTORS = require('../internals/descriptors'); +var fails = require('../internals/fails'); +var createElement = require('../internals/document-create-element'); + +// Thank's IE8 for his funny defineProperty +module.exports = !DESCRIPTORS && !fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- requied for testing + return Object.defineProperty(createElement('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + +},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(require,module,exports){ +var global = require('../internals/global'); +var uncurryThis = require('../internals/function-uncurry-this'); +var fails = require('../internals/fails'); +var classof = require('../internals/classof-raw'); + +var Object = global.Object; +var split = uncurryThis(''.split); + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins -- safe + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split(it, '') : Object(it); +} : Object; + +},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var isCallable = require('../internals/is-callable'); +var store = require('../internals/shared-store'); + +var functionToString = uncurryThis(Function.toString); + +// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper +if (!isCallable(store.inspectSource)) { + store.inspectSource = function (it) { + return functionToString(it); + }; +} + +module.exports = store.inspectSource; + +},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(require,module,exports){ +var NATIVE_WEAK_MAP = require('../internals/native-weak-map'); +var global = require('../internals/global'); +var uncurryThis = require('../internals/function-uncurry-this'); +var isObject = require('../internals/is-object'); +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var hasOwn = require('../internals/has-own-property'); +var shared = require('../internals/shared-store'); +var sharedKey = require('../internals/shared-key'); +var hiddenKeys = require('../internals/hidden-keys'); + +var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; +var TypeError = global.TypeError; +var WeakMap = global.WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP || shared.state) { + var store = shared.state || (shared.state = new WeakMap()); + var wmget = uncurryThis(store.get); + var wmhas = uncurryThis(store.has); + var wmset = uncurryThis(store.set); + set = function (it, metadata) { + if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + wmset(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget(store, it) || {}; + }; + has = function (it) { + return wmhas(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); + metadata.facade = it; + createNonEnumerableProperty(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return hasOwn(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return hasOwn(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + +},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(require,module,exports){ +var wellKnownSymbol = require('../internals/well-known-symbol'); +var Iterators = require('../internals/iterators'); + +var ITERATOR = wellKnownSymbol('iterator'); +var ArrayPrototype = Array.prototype; + +// check on default Array iterator +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + +},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(require,module,exports){ +var classof = require('../internals/classof-raw'); + +// `IsArray` abstract operation +// https://tc39.es/ecma262/#sec-isarray +// eslint-disable-next-line es/no-array-isarray -- safe +module.exports = Array.isArray || function isArray(argument) { + return classof(argument) == 'Array'; +}; + +},{"../internals/classof-raw":74}],114:[function(require,module,exports){ +// `IsCallable` abstract operation +// https://tc39.es/ecma262/#sec-iscallable +module.exports = function (argument) { + return typeof argument == 'function'; +}; + +},{}],115:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var fails = require('../internals/fails'); +var isCallable = require('../internals/is-callable'); +var classof = require('../internals/classof'); +var getBuiltIn = require('../internals/get-built-in'); +var inspectSource = require('../internals/inspect-source'); + +var noop = function () { /* empty */ }; +var empty = []; +var construct = getBuiltIn('Reflect', 'construct'); +var constructorRegExp = /^\s*(?:class|function)\b/; +var exec = uncurryThis(constructorRegExp.exec); +var INCORRECT_TO_STRING = !constructorRegExp.exec(noop); + +var isConstructorModern = function isConstructor(argument) { + if (!isCallable(argument)) return false; + try { + construct(noop, empty, argument); + return true; + } catch (error) { + return false; + } +}; + +var isConstructorLegacy = function isConstructor(argument) { + if (!isCallable(argument)) return false; + switch (classof(argument)) { + case 'AsyncFunction': + case 'GeneratorFunction': + case 'AsyncGeneratorFunction': return false; + } + try { + // we can't check .prototype since constructors produced by .bind haven't it + // `Function#toString` throws on some built-it function in some legacy engines + // (for example, `DOMQuad` and similar in FF41-) + return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument)); + } catch (error) { + return true; + } +}; + +isConstructorLegacy.sham = true; + +// `IsConstructor` abstract operation +// https://tc39.es/ecma262/#sec-isconstructor +module.exports = !construct || fails(function () { + var called; + return isConstructorModern(isConstructorModern.call) + || !isConstructorModern(Object) + || !isConstructorModern(function () { called = true; }) + || called; +}) ? isConstructorLegacy : isConstructorModern; + +},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(require,module,exports){ +var fails = require('../internals/fails'); +var isCallable = require('../internals/is-callable'); + +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : isCallable(detection) ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + +},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(require,module,exports){ +var isCallable = require('../internals/is-callable'); + +module.exports = function (it) { + return typeof it == 'object' ? it !== null : isCallable(it); +}; + +},{"../internals/is-callable":114}],118:[function(require,module,exports){ +module.exports = true; + +},{}],119:[function(require,module,exports){ +var global = require('../internals/global'); +var getBuiltIn = require('../internals/get-built-in'); +var isCallable = require('../internals/is-callable'); +var isPrototypeOf = require('../internals/object-is-prototype-of'); +var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); + +var Object = global.Object; + +module.exports = USE_SYMBOL_AS_UID ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + var $Symbol = getBuiltIn('Symbol'); + return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it)); +}; + +},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(require,module,exports){ +var call = require('../internals/function-call'); +var anObject = require('../internals/an-object'); +var getMethod = require('../internals/get-method'); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + +},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(require,module,exports){ +'use strict'; +var fails = require('../internals/fails'); +var isCallable = require('../internals/is-callable'); +var create = require('../internals/object-create'); +var getPrototypeOf = require('../internals/object-get-prototype-of'); +var redefine = require('../internals/redefine'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var IS_PURE = require('../internals/is-pure'); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + redefine(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + +},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(require,module,exports){ +arguments[4][106][0].apply(exports,arguments) +},{"dup":106}],123:[function(require,module,exports){ +var toLength = require('../internals/to-length'); + +// `LengthOfArrayLike` abstract operation +// https://tc39.es/ecma262/#sec-lengthofarraylike +module.exports = function (obj) { + return toLength(obj.length); +}; + +},{"../internals/to-length":156}],124:[function(require,module,exports){ +/* eslint-disable es/no-symbol -- required for testing */ +var V8_VERSION = require('../internals/engine-v8-version'); +var fails = require('../internals/fails'); + +// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing +module.exports = !!Object.getOwnPropertySymbols && !fails(function () { + var symbol = Symbol(); + // Chrome 38 Symbol has incorrect toString conversion + // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances + return !String(symbol) || !(Object(symbol) instanceof Symbol) || + // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances + !Symbol.sham && V8_VERSION && V8_VERSION < 41; +}); + +},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(require,module,exports){ +var global = require('../internals/global'); +var isCallable = require('../internals/is-callable'); +var inspectSource = require('../internals/inspect-source'); + +var WeakMap = global.WeakMap; + +module.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap)); + +},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(require,module,exports){ +var global = require('../internals/global'); +var fails = require('../internals/fails'); +var uncurryThis = require('../internals/function-uncurry-this'); +var toString = require('../internals/to-string'); +var trim = require('../internals/string-trim').trim; +var whitespaces = require('../internals/whitespaces'); + +var $parseInt = global.parseInt; +var Symbol = global.Symbol; +var ITERATOR = Symbol && Symbol.iterator; +var hex = /^[+-]?0x/i; +var exec = uncurryThis(hex.exec); +var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22 + // MS Edge 18- broken with boxed symbols + || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); })); + +// `parseInt` method +// https://tc39.es/ecma262/#sec-parseint-string-radix +module.exports = FORCED ? function parseInt(string, radix) { + var S = trim(toString(string)); + return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10)); +} : $parseInt; + +},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(require,module,exports){ +/* global ActiveXObject -- old IE, WSH */ +var anObject = require('../internals/an-object'); +var defineProperties = require('../internals/object-define-properties'); +var enumBugKeys = require('../internals/enum-bug-keys'); +var hiddenKeys = require('../internals/hidden-keys'); +var html = require('../internals/html'); +var documentCreateElement = require('../internals/document-create-element'); +var sharedKey = require('../internals/shared-key'); + +var GT = '>'; +var LT = '<'; +var PROTOTYPE = 'prototype'; +var SCRIPT = 'script'; +var IE_PROTO = sharedKey('IE_PROTO'); + +var EmptyConstructor = function () { /* empty */ }; + +var scriptTag = function (content) { + return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT; +}; + +// Create object with fake `null` prototype: use ActiveX Object with cleared prototype +var NullProtoObjectViaActiveX = function (activeXDocument) { + activeXDocument.write(scriptTag('')); + activeXDocument.close(); + var temp = activeXDocument.parentWindow.Object; + activeXDocument = null; // avoid memory leak + return temp; +}; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var NullProtoObjectViaIFrame = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var JS = 'java' + SCRIPT + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + // https://github.com/zloirock/core-js/issues/475 + iframe.src = String(JS); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(scriptTag('document.F=Object')); + iframeDocument.close(); + return iframeDocument.F; +}; + +// Check for document.domain and active x support +// No need to use active x approach when document.domain is not set +// see https://github.com/es-shims/es5-shim/issues/150 +// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346 +// avoid IE GC bug +var activeXDocument; +var NullProtoObject = function () { + try { + activeXDocument = new ActiveXObject('htmlfile'); + } catch (error) { /* ignore */ } + NullProtoObject = typeof document != 'undefined' + ? document.domain && activeXDocument + ? NullProtoObjectViaActiveX(activeXDocument) // old IE + : NullProtoObjectViaIFrame() + : NullProtoObjectViaActiveX(activeXDocument); // WSH + var length = enumBugKeys.length; + while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]]; + return NullProtoObject(); +}; + +hiddenKeys[IE_PROTO] = true; + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + EmptyConstructor[PROTOTYPE] = anObject(O); + result = new EmptyConstructor(); + EmptyConstructor[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = NullProtoObject(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + +},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(require,module,exports){ +var DESCRIPTORS = require('../internals/descriptors'); +var definePropertyModule = require('../internals/object-define-property'); +var anObject = require('../internals/an-object'); +var toIndexedObject = require('../internals/to-indexed-object'); +var objectKeys = require('../internals/object-keys'); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + +},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(require,module,exports){ +var global = require('../internals/global'); +var DESCRIPTORS = require('../internals/descriptors'); +var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); +var anObject = require('../internals/an-object'); +var toPropertyKey = require('../internals/to-property-key'); + +var TypeError = global.TypeError; +// eslint-disable-next-line es/no-object-defineproperty -- safe +var $defineProperty = Object.defineProperty; + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +exports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPropertyKey(P); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return $defineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(require,module,exports){ +var DESCRIPTORS = require('../internals/descriptors'); +var call = require('../internals/function-call'); +var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); +var toIndexedObject = require('../internals/to-indexed-object'); +var toPropertyKey = require('../internals/to-property-key'); +var hasOwn = require('../internals/has-own-property'); +var IE8_DOM_DEFINE = require('../internals/ie8-dom-define'); + +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor +exports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPropertyKey(P); + if (IE8_DOM_DEFINE) try { + return $getOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]); +}; + +},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(require,module,exports){ +/* eslint-disable es/no-object-getownpropertynames -- safe */ +var classof = require('../internals/classof-raw'); +var toIndexedObject = require('../internals/to-indexed-object'); +var $getOwnPropertyNames = require('../internals/object-get-own-property-names').f; +var arraySlice = require('../internals/array-slice-simple'); + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return $getOwnPropertyNames(it); + } catch (error) { + return arraySlice(windowNames); + } +}; + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && classof(it) == 'Window' + ? getWindowNames(it) + : $getOwnPropertyNames(toIndexedObject(it)); +}; + +},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(require,module,exports){ +var internalObjectKeys = require('../internals/object-keys-internal'); +var enumBugKeys = require('../internals/enum-bug-keys'); + +var hiddenKeys = enumBugKeys.concat('length', 'prototype'); + +// `Object.getOwnPropertyNames` method +// https://tc39.es/ecma262/#sec-object.getownpropertynames +// eslint-disable-next-line es/no-object-getownpropertynames -- safe +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + +},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(require,module,exports){ +// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe +exports.f = Object.getOwnPropertySymbols; + +},{}],134:[function(require,module,exports){ +var global = require('../internals/global'); +var hasOwn = require('../internals/has-own-property'); +var isCallable = require('../internals/is-callable'); +var toObject = require('../internals/to-object'); +var sharedKey = require('../internals/shared-key'); +var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter'); + +var IE_PROTO = sharedKey('IE_PROTO'); +var Object = global.Object; +var ObjectPrototype = Object.prototype; + +// `Object.getPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.getprototypeof +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + var object = toObject(O); + if (hasOwn(object, IE_PROTO)) return object[IE_PROTO]; + var constructor = object.constructor; + if (isCallable(constructor) && object instanceof constructor) { + return constructor.prototype; + } return object instanceof Object ? ObjectPrototype : null; +}; + +},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); + +module.exports = uncurryThis({}.isPrototypeOf); + +},{"../internals/function-uncurry-this":99}],136:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var hasOwn = require('../internals/has-own-property'); +var toIndexedObject = require('../internals/to-indexed-object'); +var indexOf = require('../internals/array-includes').indexOf; +var hiddenKeys = require('../internals/hidden-keys'); + +var push = uncurryThis([].push); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key); + // Don't enum bug & hidden keys + while (names.length > i) if (hasOwn(O, key = names[i++])) { + ~indexOf(result, key) || push(result, key); + } + return result; +}; + +},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(require,module,exports){ +var internalObjectKeys = require('../internals/object-keys-internal'); +var enumBugKeys = require('../internals/enum-bug-keys'); + +// `Object.keys` method +// https://tc39.es/ecma262/#sec-object.keys +// eslint-disable-next-line es/no-object-keys -- safe +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + +},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(require,module,exports){ +'use strict'; +var $propertyIsEnumerable = {}.propertyIsEnumerable; +// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe +var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); + +// `Object.prototype.propertyIsEnumerable` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = getOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : $propertyIsEnumerable; + +},{}],139:[function(require,module,exports){ +/* eslint-disable no-proto -- safe */ +var uncurryThis = require('../internals/function-uncurry-this'); +var anObject = require('../internals/an-object'); +var aPossiblePrototype = require('../internals/a-possible-prototype'); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe + setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + +},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(require,module,exports){ +'use strict'; +var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); +var classof = require('../internals/classof'); + +// `Object.prototype.toString` method implementation +// https://tc39.es/ecma262/#sec-object.prototype.tostring +module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() { + return '[object ' + classof(this) + ']'; +}; + +},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(require,module,exports){ +var global = require('../internals/global'); +var call = require('../internals/function-call'); +var isCallable = require('../internals/is-callable'); +var isObject = require('../internals/is-object'); + +var TypeError = global.TypeError; + +// `OrdinaryToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-ordinarytoprimitive +module.exports = function (input, pref) { + var fn, val; + if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val; + if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + +},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(require,module,exports){ +arguments[4][106][0].apply(exports,arguments) +},{"dup":106}],143:[function(require,module,exports){ +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); + +module.exports = function (target, key, value, options) { + if (options && options.enumerable) target[key] = value; + else createNonEnumerableProperty(target, key, value); +}; + +},{"../internals/create-non-enumerable-property":78}],144:[function(require,module,exports){ +'use strict'; +var anObject = require('../internals/an-object'); + +// `RegExp.prototype.flags` getter implementation +// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.dotAll) result += 's'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + +},{"../internals/an-object":60}],145:[function(require,module,exports){ +var global = require('../internals/global'); + +var TypeError = global.TypeError; + +// `RequireObjectCoercible` abstract operation +// https://tc39.es/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + +},{"../internals/global":104}],146:[function(require,module,exports){ +var global = require('../internals/global'); + +// eslint-disable-next-line es/no-object-defineproperty -- safe +var defineProperty = Object.defineProperty; + +module.exports = function (key, value) { + try { + defineProperty(global, key, { value: value, configurable: true, writable: true }); + } catch (error) { + global[key] = value; + } return value; +}; + +},{"../internals/global":104}],147:[function(require,module,exports){ +var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support'); +var defineProperty = require('../internals/object-define-property').f; +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var hasOwn = require('../internals/has-own-property'); +var toString = require('../internals/object-to-string'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +module.exports = function (it, TAG, STATIC, SET_METHOD) { + if (it) { + var target = STATIC ? it : it.prototype; + if (!hasOwn(target, TO_STRING_TAG)) { + defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG }); + } + if (SET_METHOD && !TO_STRING_TAG_SUPPORT) { + createNonEnumerableProperty(target, 'toString', toString); + } + } +}; + +},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(require,module,exports){ +var shared = require('../internals/shared'); +var uid = require('../internals/uid'); + +var keys = shared('keys'); + +module.exports = function (key) { + return keys[key] || (keys[key] = uid(key)); +}; + +},{"../internals/shared":150,"../internals/uid":163}],149:[function(require,module,exports){ +var global = require('../internals/global'); +var setGlobal = require('../internals/set-global'); + +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +module.exports = store; + +},{"../internals/global":104,"../internals/set-global":146}],150:[function(require,module,exports){ +var IS_PURE = require('../internals/is-pure'); +var store = require('../internals/shared-store'); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.20.0', + mode: IS_PURE ? 'pure' : 'global', + copyright: '© 2021 Denis Pushkarev (zloirock.ru)' +}); + +},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); +var toString = require('../internals/to-string'); +var requireObjectCoercible = require('../internals/require-object-coercible'); + +var charAt = uncurryThis(''.charAt); +var charCodeAt = uncurryThis(''.charCodeAt); +var stringSlice = uncurryThis(''.slice); + +var createMethod = function (CONVERT_TO_STRING) { + return function ($this, pos) { + var S = toString(requireObjectCoercible($this)); + var position = toIntegerOrInfinity(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = charCodeAt(S, position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING + ? charAt(S, position) + : first + : CONVERT_TO_STRING + ? stringSlice(S, position, position + 2) + : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; + }; +}; + +module.exports = { + // `String.prototype.codePointAt` method + // https://tc39.es/ecma262/#sec-string.prototype.codepointat + codeAt: createMethod(false), + // `String.prototype.at` method + // https://github.com/mathiasbynens/String.prototype.at + charAt: createMethod(true) +}; + +},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); +var requireObjectCoercible = require('../internals/require-object-coercible'); +var toString = require('../internals/to-string'); +var whitespaces = require('../internals/whitespaces'); + +var replace = uncurryThis(''.replace); +var whitespace = '[' + whitespaces + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); + +// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation +var createMethod = function (TYPE) { + return function ($this) { + var string = toString(requireObjectCoercible($this)); + if (TYPE & 1) string = replace(string, ltrim, ''); + if (TYPE & 2) string = replace(string, rtrim, ''); + return string; + }; +}; + +module.exports = { + // `String.prototype.{ trimLeft, trimStart }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimstart + start: createMethod(1), + // `String.prototype.{ trimRight, trimEnd }` methods + // https://tc39.es/ecma262/#sec-string.prototype.trimend + end: createMethod(2), + // `String.prototype.trim` method + // https://tc39.es/ecma262/#sec-string.prototype.trim + trim: createMethod(3) +}; + +},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(require,module,exports){ +var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + +},{"../internals/to-integer-or-infinity":155}],154:[function(require,module,exports){ +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = require('../internals/indexed-object'); +var requireObjectCoercible = require('../internals/require-object-coercible'); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + +},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(require,module,exports){ +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToIntegerOrInfinity` abstract operation +// https://tc39.es/ecma262/#sec-tointegerorinfinity +module.exports = function (argument) { + var number = +argument; + // eslint-disable-next-line no-self-compare -- safe + return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number); +}; + +},{}],156:[function(require,module,exports){ +var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); + +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.es/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + +},{"../internals/to-integer-or-infinity":155}],157:[function(require,module,exports){ +var global = require('../internals/global'); +var requireObjectCoercible = require('../internals/require-object-coercible'); + +var Object = global.Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + +},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(require,module,exports){ +var global = require('../internals/global'); +var call = require('../internals/function-call'); +var isObject = require('../internals/is-object'); +var isSymbol = require('../internals/is-symbol'); +var getMethod = require('../internals/get-method'); +var ordinaryToPrimitive = require('../internals/ordinary-to-primitive'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var TypeError = global.TypeError; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +// `ToPrimitive` abstract operation +// https://tc39.es/ecma262/#sec-toprimitive +module.exports = function (input, pref) { + if (!isObject(input) || isSymbol(input)) return input; + var exoticToPrim = getMethod(input, TO_PRIMITIVE); + var result; + if (exoticToPrim) { + if (pref === undefined) pref = 'default'; + result = call(exoticToPrim, input, pref); + if (!isObject(result) || isSymbol(result)) return result; + throw TypeError("Can't convert object to primitive value"); + } + if (pref === undefined) pref = 'number'; + return ordinaryToPrimitive(input, pref); +}; + +},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(require,module,exports){ +var toPrimitive = require('../internals/to-primitive'); +var isSymbol = require('../internals/is-symbol'); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + +},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(require,module,exports){ +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +module.exports = String(test) === '[object z]'; + +},{"../internals/well-known-symbol":166}],161:[function(require,module,exports){ +var global = require('../internals/global'); +var classof = require('../internals/classof'); + +var String = global.String; + +module.exports = function (argument) { + if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string'); + return String(argument); +}; + +},{"../internals/classof":75,"../internals/global":104}],162:[function(require,module,exports){ +var global = require('../internals/global'); + +var String = global.String; + +module.exports = function (argument) { + try { + return String(argument); + } catch (error) { + return 'Object'; + } +}; + +},{"../internals/global":104}],163:[function(require,module,exports){ +var uncurryThis = require('../internals/function-uncurry-this'); + +var id = 0; +var postfix = Math.random(); +var toString = uncurryThis(1.0.toString); + +module.exports = function (key) { + return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36); +}; + +},{"../internals/function-uncurry-this":99}],164:[function(require,module,exports){ +/* eslint-disable es/no-symbol -- required for testing */ +var NATIVE_SYMBOL = require('../internals/native-symbol'); + +module.exports = NATIVE_SYMBOL + && !Symbol.sham + && typeof Symbol.iterator == 'symbol'; + +},{"../internals/native-symbol":124}],165:[function(require,module,exports){ +var wellKnownSymbol = require('../internals/well-known-symbol'); + +exports.f = wellKnownSymbol; + +},{"../internals/well-known-symbol":166}],166:[function(require,module,exports){ +var global = require('../internals/global'); +var shared = require('../internals/shared'); +var hasOwn = require('../internals/has-own-property'); +var uid = require('../internals/uid'); +var NATIVE_SYMBOL = require('../internals/native-symbol'); +var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid'); + +var WellKnownSymbolsStore = shared('wks'); +var Symbol = global.Symbol; +var symbolFor = Symbol && Symbol['for']; +var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid; + +module.exports = function (name) { + if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) { + var description = 'Symbol.' + name; + if (NATIVE_SYMBOL && hasOwn(Symbol, name)) { + WellKnownSymbolsStore[name] = Symbol[name]; + } else if (USE_SYMBOL_AS_UID && symbolFor) { + WellKnownSymbolsStore[name] = symbolFor(description); + } else { + WellKnownSymbolsStore[name] = createWellKnownSymbol(description); + } + } return WellKnownSymbolsStore[name]; +}; + +},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(require,module,exports){ +// a string of all valid unicode whitespaces +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' + + '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + +},{}],168:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var global = require('../internals/global'); +var fails = require('../internals/fails'); +var isArray = require('../internals/is-array'); +var isObject = require('../internals/is-object'); +var toObject = require('../internals/to-object'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var createProperty = require('../internals/create-property'); +var arraySpeciesCreate = require('../internals/array-species-create'); +var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var V8_VERSION = require('../internals/engine-v8-version'); + +var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); +var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; +var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; +var TypeError = global.TypeError; + +// We can't use this feature detection in V8 since it causes +// deoptimization and serious performance degradation +// https://github.com/zloirock/core-js/issues/679 +var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () { + var array = []; + array[IS_CONCAT_SPREADABLE] = false; + return array.concat()[0] !== array; +}); + +var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat'); + +var isConcatSpreadable = function (O) { + if (!isObject(O)) return false; + var spreadable = O[IS_CONCAT_SPREADABLE]; + return spreadable !== undefined ? !!spreadable : isArray(O); +}; + +var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; + +// `Array.prototype.concat` method +// https://tc39.es/ecma262/#sec-array.prototype.concat +// with adding support of @@isConcatSpreadable and @@species +$({ target: 'Array', proto: true, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + concat: function concat(arg) { + var O = toObject(this); + var A = arraySpeciesCreate(O, 0); + var n = 0; + var i, k, length, len, E; + for (i = -1, length = arguments.length; i < length; i++) { + E = i === -1 ? O : arguments[i]; + if (isConcatSpreadable(E)) { + len = lengthOfArrayLike(E); + if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]); + } else { + if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED); + createProperty(A, n++, E); + } + } + A.length = n; + return A; + } +}); + +},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var forEach = require('../internals/array-for-each'); + +// `Array.prototype.forEach` method +// https://tc39.es/ecma262/#sec-array.prototype.foreach +// eslint-disable-next-line es/no-array-prototype-foreach -- safe +$({ target: 'Array', proto: true, forced: [].forEach != forEach }, { + forEach: forEach +}); + +},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(require,module,exports){ +var $ = require('../internals/export'); +var from = require('../internals/array-from'); +var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration'); + +var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) { + // eslint-disable-next-line es/no-array-from -- required for testing + Array.from(iterable); +}); + +// `Array.from` method +// https://tc39.es/ecma262/#sec-array.from +$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: from +}); + +},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(require,module,exports){ +'use strict'; +/* eslint-disable es/no-array-prototype-indexof -- required for testing */ +var $ = require('../internals/export'); +var uncurryThis = require('../internals/function-uncurry-this'); +var $IndexOf = require('../internals/array-includes').indexOf; +var arrayMethodIsStrict = require('../internals/array-method-is-strict'); + +var un$IndexOf = uncurryThis([].indexOf); + +var NEGATIVE_ZERO = !!un$IndexOf && 1 / un$IndexOf([1], 1, -0) < 0; +var STRICT_METHOD = arrayMethodIsStrict('indexOf'); + +// `Array.prototype.indexOf` method +// https://tc39.es/ecma262/#sec-array.prototype.indexof +$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD }, { + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + var fromIndex = arguments.length > 1 ? arguments[1] : undefined; + return NEGATIVE_ZERO + // convert -0 to +0 + ? un$IndexOf(this, searchElement, fromIndex) || 0 + : $IndexOf(this, searchElement, fromIndex); + } +}); + +},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(require,module,exports){ +var $ = require('../internals/export'); +var isArray = require('../internals/is-array'); + +// `Array.isArray` method +// https://tc39.es/ecma262/#sec-array.isarray +$({ target: 'Array', stat: true }, { + isArray: isArray +}); + +},{"../internals/export":93,"../internals/is-array":113}],173:[function(require,module,exports){ +'use strict'; +var toIndexedObject = require('../internals/to-indexed-object'); +var addToUnscopables = require('../internals/add-to-unscopables'); +var Iterators = require('../internals/iterators'); +var InternalStateModule = require('../internals/internal-state'); +var defineProperty = require('../internals/object-define-property').f; +var defineIterator = require('../internals/define-iterator'); +var IS_PURE = require('../internals/is-pure'); +var DESCRIPTORS = require('../internals/descriptors'); + +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.es/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.es/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.es/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.es/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.es/ecma262/#sec-createunmappedargumentsobject +// https://tc39.es/ecma262/#sec-createmappedargumentsobject +var values = Iterators.Arguments = Iterators.Array; + +// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + +// V8 ~ Chrome 45- bug +if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { + defineProperty(values, 'name', { value: 'values' }); +} catch (error) { /* empty */ } + +},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var global = require('../internals/global'); +var isArray = require('../internals/is-array'); +var isConstructor = require('../internals/is-constructor'); +var isObject = require('../internals/is-object'); +var toAbsoluteIndex = require('../internals/to-absolute-index'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var toIndexedObject = require('../internals/to-indexed-object'); +var createProperty = require('../internals/create-property'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); +var un$Slice = require('../internals/array-slice'); + +var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice'); + +var SPECIES = wellKnownSymbol('species'); +var Array = global.Array; +var max = Math.max; + +// `Array.prototype.slice` method +// https://tc39.es/ecma262/#sec-array.prototype.slice +// fallback for not array-like ES3 strings and DOM objects +$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, { + slice: function slice(start, end) { + var O = toIndexedObject(this); + var length = lengthOfArrayLike(O); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible + var Constructor, result, n; + if (isArray(O)) { + Constructor = O.constructor; + // cross-realm fallback + if (isConstructor(Constructor) && (Constructor === Array || isArray(Constructor.prototype))) { + Constructor = undefined; + } else if (isObject(Constructor)) { + Constructor = Constructor[SPECIES]; + if (Constructor === null) Constructor = undefined; + } + if (Constructor === Array || Constructor === undefined) { + return un$Slice(O, k, fin); + } + } + result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0)); + for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); + result.length = n; + return result; + } +}); + +},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var uncurryThis = require('../internals/function-uncurry-this'); +var aCallable = require('../internals/a-callable'); +var toObject = require('../internals/to-object'); +var lengthOfArrayLike = require('../internals/length-of-array-like'); +var toString = require('../internals/to-string'); +var fails = require('../internals/fails'); +var internalSort = require('../internals/array-sort'); +var arrayMethodIsStrict = require('../internals/array-method-is-strict'); +var FF = require('../internals/engine-ff-version'); +var IE_OR_EDGE = require('../internals/engine-is-ie-or-edge'); +var V8 = require('../internals/engine-v8-version'); +var WEBKIT = require('../internals/engine-webkit-version'); + +var test = []; +var un$Sort = uncurryThis(test.sort); +var push = uncurryThis(test.push); + +// IE8- +var FAILS_ON_UNDEFINED = fails(function () { + test.sort(undefined); +}); +// V8 bug +var FAILS_ON_NULL = fails(function () { + test.sort(null); +}); +// Old WebKit +var STRICT_METHOD = arrayMethodIsStrict('sort'); + +var STABLE_SORT = !fails(function () { + // feature detection can be too slow, so check engines versions + if (V8) return V8 < 70; + if (FF && FF > 3) return; + if (IE_OR_EDGE) return true; + if (WEBKIT) return WEBKIT < 603; + + var result = ''; + var code, chr, value, index; + + // generate an array with more 512 elements (Chakra and old V8 fails only in this case) + for (code = 65; code < 76; code++) { + chr = String.fromCharCode(code); + + switch (code) { + case 66: case 69: case 70: case 72: value = 3; break; + case 68: case 71: value = 4; break; + default: value = 2; + } + + for (index = 0; index < 47; index++) { + test.push({ k: chr + index, v: value }); + } + } + + test.sort(function (a, b) { return b.v - a.v; }); + + for (index = 0; index < test.length; index++) { + chr = test[index].k.charAt(0); + if (result.charAt(result.length - 1) !== chr) result += chr; + } + + return result !== 'DGBEFHACIJK'; +}); + +var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT; + +var getSortCompare = function (comparefn) { + return function (x, y) { + if (y === undefined) return -1; + if (x === undefined) return 1; + if (comparefn !== undefined) return +comparefn(x, y) || 0; + return toString(x) > toString(y) ? 1 : -1; + }; +}; + +// `Array.prototype.sort` method +// https://tc39.es/ecma262/#sec-array.prototype.sort +$({ target: 'Array', proto: true, forced: FORCED }, { + sort: function sort(comparefn) { + if (comparefn !== undefined) aCallable(comparefn); + + var array = toObject(this); + + if (STABLE_SORT) return comparefn === undefined ? un$Sort(array) : un$Sort(array, comparefn); + + var items = []; + var arrayLength = lengthOfArrayLike(array); + var itemsLength, index; + + for (index = 0; index < arrayLength; index++) { + if (index in array) push(items, array[index]); + } + + internalSort(items, getSortCompare(comparefn)); + + itemsLength = items.length; + index = 0; + + while (index < itemsLength) array[index] = items[index++]; + while (index < arrayLength) delete array[index++]; + + return array; + } +}); + +},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(require,module,exports){ +var global = require('../internals/global'); +var setToStringTag = require('../internals/set-to-string-tag'); + +// JSON[@@toStringTag] property +// https://tc39.es/ecma262/#sec-json-@@tostringtag +setToStringTag(global.JSON, 'JSON', true); + +},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(require,module,exports){ +// empty + +},{}],178:[function(require,module,exports){ +var $ = require('../internals/export'); +var DESCRIPTORS = require('../internals/descriptors'); +var create = require('../internals/object-create'); + +// `Object.create` method +// https://tc39.es/ecma262/#sec-object.create +$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, { + create: create +}); + +},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(require,module,exports){ +var $ = require('../internals/export'); +var DESCRIPTORS = require('../internals/descriptors'); +var objectDefinePropertyModile = require('../internals/object-define-property'); + +// `Object.defineProperty` method +// https://tc39.es/ecma262/#sec-object.defineproperty +$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, { + defineProperty: objectDefinePropertyModile.f +}); + +},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(require,module,exports){ +arguments[4][177][0].apply(exports,arguments) +},{"dup":177}],181:[function(require,module,exports){ +var $ = require('../internals/export'); +var $parseInt = require('../internals/number-parse-int'); + +// `parseInt` method +// https://tc39.es/ecma262/#sec-parseint-string-radix +$({ global: true, forced: parseInt != $parseInt }, { + parseInt: $parseInt +}); + +},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(require,module,exports){ +arguments[4][177][0].apply(exports,arguments) +},{"dup":177}],183:[function(require,module,exports){ +arguments[4][177][0].apply(exports,arguments) +},{"dup":177}],184:[function(require,module,exports){ +'use strict'; +var charAt = require('../internals/string-multibyte').charAt; +var toString = require('../internals/to-string'); +var InternalStateModule = require('../internals/internal-state'); +var defineIterator = require('../internals/define-iterator'); + +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.es/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: toString(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = charAt(string, index); + state.index += point.length; + return { value: point, done: false }; +}); + +},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.asyncIterator` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.asynciterator +defineWellKnownSymbol('asyncIterator'); + +},{"../internals/define-well-known-symbol":82}],186:[function(require,module,exports){ +arguments[4][177][0].apply(exports,arguments) +},{"dup":177}],187:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.hasInstance` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.hasinstance +defineWellKnownSymbol('hasInstance'); + +},{"../internals/define-well-known-symbol":82}],188:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.isConcatSpreadable` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.isconcatspreadable +defineWellKnownSymbol('isConcatSpreadable'); + +},{"../internals/define-well-known-symbol":82}],189:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.iterator` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.iterator +defineWellKnownSymbol('iterator'); + +},{"../internals/define-well-known-symbol":82}],190:[function(require,module,exports){ +'use strict'; +var $ = require('../internals/export'); +var global = require('../internals/global'); +var getBuiltIn = require('../internals/get-built-in'); +var apply = require('../internals/function-apply'); +var call = require('../internals/function-call'); +var uncurryThis = require('../internals/function-uncurry-this'); +var IS_PURE = require('../internals/is-pure'); +var DESCRIPTORS = require('../internals/descriptors'); +var NATIVE_SYMBOL = require('../internals/native-symbol'); +var fails = require('../internals/fails'); +var hasOwn = require('../internals/has-own-property'); +var isArray = require('../internals/is-array'); +var isCallable = require('../internals/is-callable'); +var isObject = require('../internals/is-object'); +var isPrototypeOf = require('../internals/object-is-prototype-of'); +var isSymbol = require('../internals/is-symbol'); +var anObject = require('../internals/an-object'); +var toObject = require('../internals/to-object'); +var toIndexedObject = require('../internals/to-indexed-object'); +var toPropertyKey = require('../internals/to-property-key'); +var $toString = require('../internals/to-string'); +var createPropertyDescriptor = require('../internals/create-property-descriptor'); +var nativeObjectCreate = require('../internals/object-create'); +var objectKeys = require('../internals/object-keys'); +var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names'); +var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external'); +var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols'); +var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor'); +var definePropertyModule = require('../internals/object-define-property'); +var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable'); +var arraySlice = require('../internals/array-slice'); +var redefine = require('../internals/redefine'); +var shared = require('../internals/shared'); +var sharedKey = require('../internals/shared-key'); +var hiddenKeys = require('../internals/hidden-keys'); +var uid = require('../internals/uid'); +var wellKnownSymbol = require('../internals/well-known-symbol'); +var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped'); +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); +var setToStringTag = require('../internals/set-to-string-tag'); +var InternalStateModule = require('../internals/internal-state'); +var $forEach = require('../internals/array-iteration').forEach; + +var HIDDEN = sharedKey('hidden'); +var SYMBOL = 'Symbol'; +var PROTOTYPE = 'prototype'; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); + +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(SYMBOL); + +var ObjectPrototype = Object[PROTOTYPE]; +var $Symbol = global.Symbol; +var SymbolPrototype = $Symbol && $Symbol[PROTOTYPE]; +var TypeError = global.TypeError; +var QObject = global.QObject; +var $stringify = getBuiltIn('JSON', 'stringify'); +var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; +var nativeDefineProperty = definePropertyModule.f; +var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; +var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; +var push = uncurryThis([].push); + +var AllSymbols = shared('symbols'); +var ObjectPrototypeSymbols = shared('op-symbols'); +var StringToSymbolRegistry = shared('string-to-symbol-registry'); +var SymbolToStringRegistry = shared('symbol-to-string-registry'); +var WellKnownSymbolsStore = shared('wks'); + +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDescriptor = DESCRIPTORS && fails(function () { + return nativeObjectCreate(nativeDefineProperty({}, 'a', { + get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (O, P, Attributes) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P); + if (ObjectPrototypeDescriptor) delete ObjectPrototype[P]; + nativeDefineProperty(O, P, Attributes); + if (ObjectPrototypeDescriptor && O !== ObjectPrototype) { + nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor); + } +} : nativeDefineProperty; + +var wrap = function (tag, description) { + var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype); + setInternalState(symbol, { + type: SYMBOL, + tag: tag, + description: description + }); + if (!DESCRIPTORS) symbol.description = description; + return symbol; +}; + +var $defineProperty = function defineProperty(O, P, Attributes) { + if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes); + anObject(O); + var key = toPropertyKey(P); + anObject(Attributes); + if (hasOwn(AllSymbols, key)) { + if (!Attributes.enumerable) { + if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {})); + O[HIDDEN][key] = true; + } else { + if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false; + Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) }); + } return setSymbolDescriptor(O, key, Attributes); + } return nativeDefineProperty(O, key, Attributes); +}; + +var $defineProperties = function defineProperties(O, Properties) { + anObject(O); + var properties = toIndexedObject(Properties); + var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties)); + $forEach(keys, function (key) { + if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]); + }); + return O; +}; + +var $create = function create(O, Properties) { + return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties); +}; + +var $propertyIsEnumerable = function propertyIsEnumerable(V) { + var P = toPropertyKey(V); + var enumerable = call(nativePropertyIsEnumerable, this, P); + if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false; + return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P] + ? enumerable : true; +}; + +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) { + var it = toIndexedObject(O); + var key = toPropertyKey(P); + if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return; + var descriptor = nativeGetOwnPropertyDescriptor(it, key); + if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) { + descriptor.enumerable = true; + } + return descriptor; +}; + +var $getOwnPropertyNames = function getOwnPropertyNames(O) { + var names = nativeGetOwnPropertyNames(toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key); + }); + return result; +}; + +var $getOwnPropertySymbols = function getOwnPropertySymbols(O) { + var IS_OBJECT_PROTOTYPE = O === ObjectPrototype; + var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O)); + var result = []; + $forEach(names, function (key) { + if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) { + push(result, AllSymbols[key]); + } + }); + return result; +}; + +// `Symbol` constructor +// https://tc39.es/ecma262/#sec-symbol-constructor +if (!NATIVE_SYMBOL) { + $Symbol = function Symbol() { + if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor'); + var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); + var tag = uid(description); + var setter = function (value) { + if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); + if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); + }; + if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); + return wrap(tag, description); + }; + + SymbolPrototype = $Symbol[PROTOTYPE]; + + redefine(SymbolPrototype, 'toString', function toString() { + return getInternalState(this).tag; + }); + + redefine($Symbol, 'withoutSetter', function (description) { + return wrap(uid(description), description); + }); + + propertyIsEnumerableModule.f = $propertyIsEnumerable; + definePropertyModule.f = $defineProperty; + getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; + getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; + getOwnPropertySymbolsModule.f = $getOwnPropertySymbols; + + wrappedWellKnownSymbolModule.f = function (name) { + return wrap(wellKnownSymbol(name), name); + }; + + if (DESCRIPTORS) { + // https://github.com/tc39/proposal-Symbol-description + nativeDefineProperty(SymbolPrototype, 'description', { + configurable: true, + get: function description() { + return getInternalState(this).description; + } + }); + if (!IS_PURE) { + redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); + } + } +} + +$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { + Symbol: $Symbol +}); + +$forEach(objectKeys(WellKnownSymbolsStore), function (name) { + defineWellKnownSymbol(name); +}); + +$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { + // `Symbol.for` method + // https://tc39.es/ecma262/#sec-symbol.for + 'for': function (key) { + var string = $toString(key); + if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string]; + var symbol = $Symbol(string); + StringToSymbolRegistry[string] = symbol; + SymbolToStringRegistry[symbol] = string; + return symbol; + }, + // `Symbol.keyFor` method + // https://tc39.es/ecma262/#sec-symbol.keyfor + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); + if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym]; + }, + useSetter: function () { USE_SETTER = true; }, + useSimple: function () { USE_SETTER = false; } +}); + +$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { + // `Object.create` method + // https://tc39.es/ecma262/#sec-object.create + create: $create, + // `Object.defineProperty` method + // https://tc39.es/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty, + // `Object.defineProperties` method + // https://tc39.es/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor +}); + +$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { + // `Object.getOwnPropertyNames` method + // https://tc39.es/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames, + // `Object.getOwnPropertySymbols` method + // https://tc39.es/ecma262/#sec-object.getownpropertysymbols + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return getOwnPropertySymbolsModule.f(toObject(it)); + } +}); + +// `JSON.stringify` method behavior with symbols +// https://tc39.es/ecma262/#sec-json.stringify +if ($stringify) { + var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () { + var symbol = $Symbol(); + // MS Edge converts symbol values to JSON as {} + return $stringify([symbol]) != '[null]' + // WebKit converts symbol values to JSON as null + || $stringify({ a: symbol }) != '{}' + // V8 throws on boxed symbols + || $stringify(Object(symbol)) != '{}'; + }); + + $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, { + // eslint-disable-next-line no-unused-vars -- required for `.length` + stringify: function stringify(it, replacer, space) { + var args = arraySlice(arguments); + var $replacer = replacer; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (isCallable($replacer)) value = call($replacer, this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return apply($stringify, null, args); + } + }); +} + +// `Symbol.prototype[@@toPrimitive]` method +// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive +if (!SymbolPrototype[TO_PRIMITIVE]) { + var valueOf = SymbolPrototype.valueOf; + // eslint-disable-next-line no-unused-vars -- required for .length + redefine(SymbolPrototype, TO_PRIMITIVE, function (hint) { + // TODO: improve hint logic + return call(valueOf, this); + }); +} +// `Symbol.prototype[@@toStringTag]` property +// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag +setToStringTag($Symbol, SYMBOL); + +hiddenKeys[HIDDEN] = true; + +},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.matchAll` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.matchall +defineWellKnownSymbol('matchAll'); + +},{"../internals/define-well-known-symbol":82}],192:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.match` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.match +defineWellKnownSymbol('match'); + +},{"../internals/define-well-known-symbol":82}],193:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.replace` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.replace +defineWellKnownSymbol('replace'); + +},{"../internals/define-well-known-symbol":82}],194:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.search` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.search +defineWellKnownSymbol('search'); + +},{"../internals/define-well-known-symbol":82}],195:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.species` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.species +defineWellKnownSymbol('species'); + +},{"../internals/define-well-known-symbol":82}],196:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.split` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.split +defineWellKnownSymbol('split'); + +},{"../internals/define-well-known-symbol":82}],197:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.toPrimitive` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.toprimitive +defineWellKnownSymbol('toPrimitive'); + +},{"../internals/define-well-known-symbol":82}],198:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.toStringTag` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.tostringtag +defineWellKnownSymbol('toStringTag'); + +},{"../internals/define-well-known-symbol":82}],199:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.unscopables` well-known symbol +// https://tc39.es/ecma262/#sec-symbol.unscopables +defineWellKnownSymbol('unscopables'); + +},{"../internals/define-well-known-symbol":82}],200:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.asyncDispose` well-known symbol +// https://github.com/tc39/proposal-using-statement +defineWellKnownSymbol('asyncDispose'); + +},{"../internals/define-well-known-symbol":82}],201:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.dispose` well-known symbol +// https://github.com/tc39/proposal-using-statement +defineWellKnownSymbol('dispose'); + +},{"../internals/define-well-known-symbol":82}],202:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.matcher` well-known symbol +// https://github.com/tc39/proposal-pattern-matching +defineWellKnownSymbol('matcher'); + +},{"../internals/define-well-known-symbol":82}],203:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.metadata` well-known symbol +// https://github.com/tc39/proposal-decorators +defineWellKnownSymbol('metadata'); + +},{"../internals/define-well-known-symbol":82}],204:[function(require,module,exports){ +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.observable` well-known symbol +// https://github.com/tc39/proposal-observable +defineWellKnownSymbol('observable'); + +},{"../internals/define-well-known-symbol":82}],205:[function(require,module,exports){ +// TODO: remove from `core-js@4` +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +// `Symbol.patternMatch` well-known symbol +// https://github.com/tc39/proposal-pattern-matching +defineWellKnownSymbol('patternMatch'); + +},{"../internals/define-well-known-symbol":82}],206:[function(require,module,exports){ +// TODO: remove from `core-js@4` +var defineWellKnownSymbol = require('../internals/define-well-known-symbol'); + +defineWellKnownSymbol('replaceAll'); + +},{"../internals/define-well-known-symbol":82}],207:[function(require,module,exports){ +require('../modules/es.array.iterator'); +var DOMIterables = require('../internals/dom-iterables'); +var global = require('../internals/global'); +var classof = require('../internals/classof'); +var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); +var Iterators = require('../internals/iterators'); +var wellKnownSymbol = require('../internals/well-known-symbol'); + +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); + +for (var COLLECTION_NAME in DOMIterables) { + var Collection = global[COLLECTION_NAME]; + var CollectionPrototype = Collection && Collection.prototype; + if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) { + createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); + } + Iterators[COLLECTION_NAME] = Iterators.Array; +} + +},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(require,module,exports){ +var parent = require('../../es/array/from'); + +module.exports = parent; + +},{"../../es/array/from":34}],209:[function(require,module,exports){ +var parent = require('../../es/array/is-array'); + +module.exports = parent; + +},{"../../es/array/is-array":35}],210:[function(require,module,exports){ +var parent = require('../../../es/array/virtual/for-each'); + +module.exports = parent; + +},{"../../../es/array/virtual/for-each":37}],211:[function(require,module,exports){ +var parent = require('../es/get-iterator-method'); +require('../modules/web.dom-collections.iterator'); + +module.exports = parent; + +},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(require,module,exports){ +var parent = require('../../es/instance/concat'); + +module.exports = parent; + +},{"../../es/instance/concat":42}],213:[function(require,module,exports){ +var parent = require('../../es/instance/flags'); + +module.exports = parent; + +},{"../../es/instance/flags":43}],214:[function(require,module,exports){ +require('../../modules/web.dom-collections.iterator'); +var classof = require('../../internals/classof'); +var hasOwn = require('../../internals/has-own-property'); +var isPrototypeOf = require('../../internals/object-is-prototype-of'); +var method = require('../array/virtual/for-each'); + +var ArrayPrototype = Array.prototype; + +var DOMIterables = { + DOMTokenList: true, + NodeList: true +}; + +module.exports = function (it) { + var own = it.forEach; + return it === ArrayPrototype || (isPrototypeOf(ArrayPrototype, it) && own === ArrayPrototype.forEach) + || hasOwn(DOMIterables, classof(it)) ? method : own; +}; + +},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(require,module,exports){ +var parent = require('../../es/instance/index-of'); + +module.exports = parent; + +},{"../../es/instance/index-of":44}],216:[function(require,module,exports){ +var parent = require('../../es/instance/slice'); + +module.exports = parent; + +},{"../../es/instance/slice":45}],217:[function(require,module,exports){ +var parent = require('../../es/instance/sort'); + +module.exports = parent; + +},{"../../es/instance/sort":46}],218:[function(require,module,exports){ +var parent = require('../../es/object/create'); + +module.exports = parent; + +},{"../../es/object/create":47}],219:[function(require,module,exports){ +var parent = require('../../es/object/define-property'); + +module.exports = parent; + +},{"../../es/object/define-property":48}],220:[function(require,module,exports){ +var parent = require('../es/parse-int'); + +module.exports = parent; + +},{"../es/parse-int":49}],221:[function(require,module,exports){ +var parent = require('../../es/symbol'); +require('../../modules/web.dom-collections.iterator'); + +module.exports = parent; + +},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(require,module,exports){ +module.exports = [ + { + 'name': 'C', + 'alias': 'Other', + 'isBmpLast': true, + 'bmp': '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u0605\u061C\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F-\u0897\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF', + 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCBD\uDCC3-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]' + }, + { + 'name': 'Cc', + 'alias': 'Control', + 'bmp': '\0-\x1F\x7F-\x9F' + }, + { + 'name': 'Cf', + 'alias': 'Format', + 'bmp': '\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB', + 'astral': '\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]' + }, + { + 'name': 'Cn', + 'alias': 'Unassigned', + 'bmp': '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u05FF\u070E\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u086F\u088F\u0892-\u0897\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A\u0C3B\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B\u0C5C\u0C5E\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDC\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u1716-\u171E\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ACF-\u1AFF\u1B4D-\u1B4F\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20C1-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31E4-\u31EF\u321F\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7CB-\uA7CF\uA7D2\uA7D4\uA7DA-\uA7F1\uA82D-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB6C-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC3-\uFBD2\uFD90\uFD91\uFDC8-\uFDCE\uFDD0-\uFDEF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF', + 'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD7B\uDD8B\uDD93\uDD96\uDDA2\uDDB2\uDDBA\uDDBD-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDF7F\uDF86\uDFB1\uDFBB-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F\uDEAA\uDEAE\uDEAF\uDEB2-\uDEFF\uDF28-\uDF2F\uDF5A-\uDF6F\uDF8A-\uDFAF\uDFCC-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC76-\uDC7E\uDCC3-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD48-\uDD4F\uDD77-\uDD7F\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5C\uDC62-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEBA-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF47-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD47-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEAF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFAF\uDFB1-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80E-\uD810\uD812-\uD819\uD824-\uD82A\uD82D\uD82E\uD830-\uD832\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80B[\uDC00-\uDF8F\uDFF3-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDEBF\uDECA-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82B[\uDC00-\uDFEF\uDFF4\uDFFC\uDFFF]|\uD82C[\uDD23-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD833[\uDC00-\uDEFF\uDF2E\uDF2F\uDF47-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDEB-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD837[\uDC00-\uDEFF\uDF1F-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDE8F\uDEAF-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDFDF\uDFE7\uDFEC\uDFEF\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDC\uDEED-\uDEEF\uDEFD-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCB2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE75-\uDE77\uDE7D-\uDE7F\uDE87-\uDE8F\uDEAD-\uDEAF\uDEBB-\uDEBF\uDEC6-\uDECF\uDEDA-\uDEDF\uDEE8-\uDEEF\uDEF7-\uDEFF\uDF93\uDFCB-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEE0-\uDEFF]|\uD86D[\uDF39-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]' + }, + { + 'name': 'Co', + 'alias': 'Private_Use', + 'bmp': '\uE000-\uF8FF', + 'astral': '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]' + }, + { + 'name': 'Cs', + 'alias': 'Surrogate', + 'bmp': '\uD800-\uDFFF' + }, + { + 'name': 'L', + 'alias': 'Letter', + 'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', + 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' + }, + { + 'name': 'LC', + 'alias': 'Cased_Letter', + 'bmp': 'A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u01BA\u01BC-\u01BF\u01C4-\u0293\u0295-\u02AF\u0370-\u0373\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0560-\u0588\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FD-\u10FF\u13A0-\u13F5\u13F8-\u13FD\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C7B\u2C7E-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA640-\uA66D\uA680-\uA69B\uA722-\uA76F\uA771-\uA787\uA78B-\uA78E\uA790-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F5\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A', + 'astral': '\uD801[\uDC00-\uDC4F\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD806[\uDCA0-\uDCDF]|\uD81B[\uDE40-\uDE7F]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD00-\uDD43]' + }, + { + 'name': 'Ll', + 'alias': 'Lowercase_Letter', + 'bmp': 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5F\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C1\uA7C3\uA7C8\uA7CA\uA7D1\uA7D3\uA7D5\uA7D7\uA7D9\uA7F6\uA7FA\uAB30-\uAB5A\uAB60-\uAB68\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A', + 'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD837[\uDF00-\uDF09\uDF0B-\uDF1E]|\uD83A[\uDD22-\uDD43]' + }, + { + 'name': 'Lm', + 'alias': 'Modifier_Letter', + 'bmp': '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u08C9\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F2-\uA7F4\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uAB69\uFF70\uFF9E\uFF9F', + 'astral': '\uD801[\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD838[\uDD37-\uDD3D]|\uD83A\uDD4B' + }, + { + 'name': 'Lo', + 'alias': 'Other_Letter', + 'bmp': '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C8\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC', + 'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF4A\uDF50]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD837\uDF0A|\uD838[\uDD00-\uDD2C\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]' + }, + { + 'name': 'Lt', + 'alias': 'Titlecase_Letter', + 'bmp': '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC' + }, + { + 'name': 'Lu', + 'alias': 'Uppercase_Letter', + 'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2F\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C0\uA7C2\uA7C4-\uA7C7\uA7C9\uA7D0\uA7D6\uA7D8\uA7F5\uFF21-\uFF3A', + 'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]' + }, + { + 'name': 'M', + 'alias': 'Mark', + 'bmp': '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ACE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', + 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC82\uDCB0-\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD34\uDD45\uDD46\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDC9-\uDDCC\uDDCE\uDDCF\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3B\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDC5E\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD806[\uDC2C-\uDC3A\uDD30-\uDD35\uDD37\uDD38\uDD3B-\uDD3E\uDD40\uDD42\uDD43\uDDD1-\uDDD7\uDDDA-\uDDE0\uDDE4\uDE01-\uDE0A\uDE33-\uDE39\uDE3B-\uDE3E\uDE47\uDE51-\uDE5B\uDE8A-\uDE99]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD8A-\uDD8E\uDD90\uDD91\uDD93-\uDD97\uDEF3-\uDEF6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF51-\uDF87\uDF8F-\uDF92\uDFE4\uDFF0\uDFF1]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' + }, + { + 'name': 'Mc', + 'alias': 'Spacing_Mark', + 'bmp': '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u1715\u1734\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF7\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BE-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC', + 'astral': '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD45\uDD46\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDDCE\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD806[\uDC2C-\uDC2E\uDC38\uDD30-\uDD35\uDD37\uDD38\uDD3D\uDD40\uDD42\uDDD1-\uDDD3\uDDDC-\uDDDF\uDDE4\uDE39\uDE57\uDE58\uDE97]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4\uDD8A-\uDD8E\uDD93\uDD94\uDD96\uDEF5\uDEF6]|\uD81B[\uDF51-\uDF87\uDFF0\uDFF1]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]' + }, + { + 'name': 'Me', + 'alias': 'Enclosing_Mark', + 'bmp': '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672' + }, + { + 'name': 'Mn', + 'alias': 'Nonspacing_Mark', + 'bmp': '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u09FE\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B55\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3C\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D00\u0D01\u0D3B\u0D3C\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0D81\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732\u1733\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u180F\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA82C\uA8C4\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9BD\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F', + 'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDEAB\uDEAC\uDF46-\uDF50\uDF82-\uDF85]|\uD804[\uDC01\uDC38-\uDC46\uDC70\uDC73\uDC74\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDCC2\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDC9-\uDDCC\uDDCF\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3B\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDC5E\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD806[\uDC2F-\uDC37\uDC39\uDC3A\uDD3B\uDD3C\uDD3E\uDD43\uDDD4-\uDDD7\uDDDA\uDDDB\uDDE0\uDE01-\uDE0A\uDE33-\uDE38\uDE3B-\uDE3E\uDE47\uDE51-\uDE56\uDE59-\uDE5B\uDE8A-\uDE96\uDE98\uDE99]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD90\uDD91\uDD95\uDD97\uDEF3\uDEF4]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF8F-\uDF92\uDFE4]|\uD82F[\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEAE\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]' + }, + { + 'name': 'N', + 'alias': 'Number', + 'bmp': '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', + 'astral': '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDD30-\uDD39\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2\uDD50-\uDD59]|\uD807[\uDC50-\uDC6C\uDD50-\uDD59\uDDA0-\uDDA9\uDFC0-\uDFD4]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]' + }, + { + 'name': 'Nd', + 'alias': 'Decimal_Number', + 'bmp': '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19', + 'astral': '\uD801[\uDCA0-\uDCA9]|\uD803[\uDD30-\uDD39]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9\uDD50-\uDD59]|\uD807[\uDC50-\uDC59\uDD50-\uDD59\uDDA0-\uDDA9]|\uD81A[\uDE60-\uDE69\uDEC0-\uDEC9\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDD50-\uDD59]|\uD83E[\uDFF0-\uDFF9]' + }, + { + 'name': 'Nl', + 'alias': 'Letter_Number', + 'bmp': '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF', + 'astral': '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]' + }, + { + 'name': 'No', + 'alias': 'Other_Number', + 'bmp': '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835', + 'astral': '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54\uDFC5-\uDFCB]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C\uDFC0-\uDFD4]|\uD81A[\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD83A[\uDCC7-\uDCCF]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]' + }, + { + 'name': 'P', + 'alias': 'Punctuation', + 'bmp': '!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65', + 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' + }, + { + 'name': 'Pc', + 'alias': 'Connector_Punctuation', + 'bmp': '_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F' + }, + { + 'name': 'Pd', + 'alias': 'Dash_Punctuation', + 'bmp': '\\-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u2E5D\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D', + 'astral': '\uD803\uDEAD' + }, + { + 'name': 'Pe', + 'alias': 'Close_Punctuation', + 'bmp': '\\)\\]\\}\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u2E56\u2E58\u2E5A\u2E5C\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63' + }, + { + 'name': 'Pf', + 'alias': 'Final_Punctuation', + 'bmp': '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21' + }, + { + 'name': 'Pi', + 'alias': 'Initial_Punctuation', + 'bmp': '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20' + }, + { + 'name': 'Po', + 'alias': 'Other_Punctuation', + 'bmp': '!-#%-\'\\*,\\.\\/:;\\?@\\\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43-\u2E4F\u2E52-\u2E54\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65', + 'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]' + }, + { + 'name': 'Ps', + 'alias': 'Open_Punctuation', + 'bmp': '\\(\\[\\{\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u2E55\u2E57\u2E59\u2E5B\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62' + }, + { + 'name': 'S', + 'alias': 'Symbol', + 'bmp': '\\$\\+<->\\^`\\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD', + 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' + }, + { + 'name': 'Sc', + 'alias': 'Currency_Symbol', + 'bmp': '\\$\xA2-\xA5\u058F\u060B\u07FE\u07FF\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20C0\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6', + 'astral': '\uD807[\uDFDD-\uDFE0]|\uD838\uDEFF|\uD83B\uDCB0' + }, + { + 'name': 'Sk', + 'alias': 'Modifier_Symbol', + 'bmp': '\\^`\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u0888\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uAB6A\uAB6B\uFBB2-\uFBC2\uFF3E\uFF40\uFFE3', + 'astral': '\uD83C[\uDFFB-\uDFFF]' + }, + { + 'name': 'Sm', + 'alias': 'Math_Symbol', + 'bmp': '\\+<->\\|~\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC', + 'astral': '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]' + }, + { + 'name': 'So', + 'alias': 'Other_Symbol', + 'bmp': '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFD40-\uFD4F\uFDCF\uFDFD-\uFDFF\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD', + 'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFDC\uDFE1-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838\uDD4F|\uD83B[\uDCAC\uDD2E]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED7\uDEDD-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE74\uDE78-\uDE7C\uDE80-\uDE86\uDE90-\uDEAC\uDEB0-\uDEBA\uDEC0-\uDEC5\uDED0-\uDED9\uDEE0-\uDEE7\uDEF0-\uDEF6\uDF00-\uDF92\uDF94-\uDFCA]' + }, + { + 'name': 'Z', + 'alias': 'Separator', + 'bmp': ' \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000' + }, + { + 'name': 'Zl', + 'alias': 'Line_Separator', + 'bmp': '\u2028' + }, + { + 'name': 'Zp', + 'alias': 'Paragraph_Separator', + 'bmp': '\u2029' + }, + { + 'name': 'Zs', + 'alias': 'Space_Separator', + 'bmp': ' \xA0\u1680\u2000-\u200A\u202F\u205F\u3000' + } +]; -},{}]},{},[8])(8) +},{}]},{},[3])(3) }); diff --git a/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js b/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js index 6d56b1bd887a..6d36ca5699e7 100644 --- a/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js +++ b/django/contrib/admin/static/admin/js/vendor/xregexp/xregexp.min.js @@ -1,160 +1,17 @@ -/* - XRegExp.build 3.2.0 - <xregexp.com> - Steven Levithan (c) 2012-2017 MIT License - Inspired by Lea Verou's RegExp.create <lea.verou.me> - XRegExp.matchRecursive 3.2.0 - <xregexp.com> - Steven Levithan (c) 2009-2017 MIT License - XRegExp Unicode Base 3.2.0 - <xregexp.com> - Steven Levithan (c) 2008-2017 MIT License - XRegExp Unicode Blocks 3.2.0 - <xregexp.com> - Steven Levithan (c) 2010-2017 MIT License - Unicode data by Mathias Bynens <mathiasbynens.be> - XRegExp Unicode Categories 3.2.0 - <xregexp.com> - Steven Levithan (c) 2010-2017 MIT License - Unicode data by Mathias Bynens <mathiasbynens.be> - XRegExp Unicode Properties 3.2.0 - <xregexp.com> - Steven Levithan (c) 2012-2017 MIT License - Unicode data by Mathias Bynens <mathiasbynens.be> - XRegExp Unicode Scripts 3.2.0 - <xregexp.com> - Steven Levithan (c) 2010-2017 MIT License - Unicode data by Mathias Bynens <mathiasbynens.be> - XRegExp 3.2.0 - <xregexp.com> - Steven Levithan (c) 2007-2017 MIT License -*/ -(function(H){"object"===typeof exports&&"undefined"!==typeof module?module.exports=H():"function"===typeof define&&define.amd?define([],H):("undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self?self:this).XRegExp=H()})(function(){return function c(d,g,p){function A(l,b){if(!g[l]){if(!d[l]){var k="function"==typeof require&&require;if(!b&&k)return k(l,!0);if(B)return B(l,!0);b=Error("Cannot find module '"+l+"'");throw b.code="MODULE_NOT_FOUND",b;}b=g[l]={exports:{}}; -d[l][0].call(b.exports,function(b){var c=d[l][1][b];return A(c?c:b)},b,b.exports,c,d,g,p)}return g[l].exports}for(var B="function"==typeof require&&require,z=0;z<p.length;z++)A(p[z]);return A}({1:[function(d,g,p){g.exports=function(c){function A(b){var c=/^(?:\(\?:\))*\^/,l=/\$(?:\(\?:\))*$/;return c.test(b)&&l.test(b)&&l.test(b.replace(/\\[\s\S]/g,""))?b.replace(c,"").replace(l,""):b}function B(b,l){l=l?"x":"";return c.isRegExp(b)?b.xregexp&&b.xregexp.captureNames?b:c(b.source,l):c(b,l)}var z=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g, -l=c.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/,z],"g",{conjunction:"or"});c.build=function(b,k,g){g=g||"";var y=-1<g.indexOf("x"),m=/^\(\?([\w$]+)\)/.exec(b);m&&(g=c._clipDuplicates(g+m[1]));var h={},w;for(w in k)k.hasOwnProperty(w)&&(m=B(k[w],y),h[w]={pattern:A(m.source),names:m.xregexp.captureNames||[]});b=B(b,y);var x=0,v,q=0,f=[0],d=b.xregexp.captureNames||[];b=b.source.replace(l,function(b,c,m,l,y){var n=c||m;if(n){if(!h.hasOwnProperty(n))throw new ReferenceError("Undefined property "+b);if(c){var k= -d[q];f[++q]=++x;b="(?<"+(k||n)+">"}else b="(?:";v=x;return b+h[n].pattern.replace(z,function(f,b,c){if(b){if(k=h[n].names[x-v],++x,k)return"(?<"+k+">"}else if(c)return g=+c-1,h[n].names[g]?"\\k<"+h[n].names[g]+">":"\\"+(+c+v);return f})+")"}if(l){if(k=d[q],f[++q]=++x,k)return"(?<"+k+">"}else if(y){var g=+y-1;return d[g]?"\\k<"+d[g]+">":"\\"+f[+y]}return b});return c(b,g)}}},{}],2:[function(d,g,p){g.exports=function(c){function g(c,g,l,b){return{name:c,value:g,start:l,end:b}}c.matchRecursive=function(d, -p,l,b,k){b=b||"";k=k||{};var A=-1<b.indexOf("g"),y=-1<b.indexOf("y"),m=b.replace(/y/g,""),h=k.escapeChar;k=k.valueNames;var w=[],x=0,v=0,q=0,f=0;p=c(p,m);l=c(l,m);if(h){if(1<h.length)throw Error("Cannot use more than one escape character");h=c.escape(h);var z=new RegExp("(?:"+h+"[\\S\\s]|(?:(?!"+c.union([p,l],"",{conjunction:"or"}).source+")[^"+h+"])+)+",b.replace(/[^imu]+/g,""))}for(;;){h&&(q+=(c.exec(d,z,q,"sticky")||[""])[0].length);b=c.exec(d,p,q);m=c.exec(d,l,q);b&&m&&(b.index<=m.index?m=null: -b=null);if(b||m)v=(b||m).index,q=v+(b||m)[0].length;else if(!x)break;if(y&&!x&&v>f)break;if(b){if(!x){var n=v;var r=q}++x}else if(m&&x){if(!--x&&(k?(k[0]&&n>f&&w.push(g(k[0],d.slice(f,n),f,n)),k[1]&&w.push(g(k[1],d.slice(n,r),n,r)),k[2]&&w.push(g(k[2],d.slice(r,v),r,v)),k[3]&&w.push(g(k[3],d.slice(v,q),v,q))):w.push(d.slice(r,v)),f=q,!A))break}else throw Error("Unbalanced delimiter found in string");v===q&&++q}A&&!y&&k&&k[0]&&d.length>f&&w.push(g(k[0],d.slice(f),f,d.length));return w}}},{}],3:[function(d, -g,p){g.exports=function(c){function g(b){return b.replace(/[- _]+/g,"").toLowerCase()}function d(c){var m=/^\\[xu](.+)/.exec(c);return m?b(m[1]):c.charCodeAt("\\"===c.charAt(0)?1:0)}function p(b){var m="",h=-1;c.forEach(b,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,function(b){var c=d(b[1]);c>h+1&&(m+="\\u"+C(k(h+1)),c>h+2&&(m+="-\\u"+C(k(c-1))));h=d(b[2]||b[1])});65535>h&&(m+="\\u"+C(k(h+1)),65534>h&&(m+="-\\uFFFF"));return m}var l={},b=c._dec,k=c._hex,C=c._pad4;c.addToken(/\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, -function(b,c,h){var m="P"===b[1]||!!b[2],d=-1<h.indexOf("A");h=g(b[4]||b[3]);var k=l[h];if("P"===b[1]&&b[2])throw new SyntaxError("Invalid double negation "+b[0]);if(!l.hasOwnProperty(h))throw new SyntaxError("Unknown Unicode token "+b[0]);if(k.inverseOf){h=g(k.inverseOf);if(!l.hasOwnProperty(h))throw new ReferenceError("Unicode token missing data "+b[0]+" -> "+k.inverseOf);k=l[h];m=!m}if(!k.bmp&&!d)throw new SyntaxError("Astral mode required for Unicode token "+b[0]);if(d){if("class"===c)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes"); -b=m?"a!":"a=";(c=l[h][b])||(c=l[h],h=l[h],d="",h.bmp&&!h.isBmpLast&&(d="["+h.bmp+"]"+(h.astral?"|":"")),h.astral&&(d+=h.astral),h.isBmpLast&&h.bmp&&(d+=(h.astral?"|":"")+"["+h.bmp+"]"),c=c[b]=m?"(?:(?!"+d+")(?:[\ud800-\udbff][\udc00-\udfff]|[\x00-\uffff]))":"(?:"+d+")");return c}return"class"===c?m?l[h]["b!"]||(l[h]["b!"]=p(l[h].bmp)):k.bmp:(m?"[^":"[")+k.bmp+"]"},{scope:"all",optionalFlags:"A",leadChar:"\\"});c.addUnicodeData=function(b){for(var d,h=0;h<b.length;++h){d=b[h];if(!d.name)throw Error("Unicode token requires name"); -if(!(d.inverseOf||d.bmp||d.astral))throw Error("Unicode token has no character data "+d.name);l[g(d.name)]=d;d.alias&&(l[g(d.alias)]=d)}c.cache.flush("patterns")};c._getUnicodeProperty=function(b){b=g(b);return l[b]}}},{}],4:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Blocks");c.addUnicodeData([{name:"InAdlam",astral:"\ud83a[\udd00-\udd5f]"},{name:"InAegean_Numbers",astral:"\ud800[\udd00-\udd3f]"},{name:"InAhom", -astral:"\ud805[\udf00-\udf3f]"},{name:"InAlchemical_Symbols",astral:"\ud83d[\udf00-\udf7f]"},{name:"InAlphabetic_Presentation_Forms",bmp:"\ufb00-\ufb4f"},{name:"InAnatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude7f]"},{name:"InAncient_Greek_Musical_Notation",astral:"\ud834[\ude00-\ude4f]"},{name:"InAncient_Greek_Numbers",astral:"\ud800[\udd40-\udd8f]"},{name:"InAncient_Symbols",astral:"\ud800[\udd90-\uddcf]"},{name:"InArabic",bmp:"\u0600-\u06ff"},{name:"InArabic_Extended_A",bmp:"\u08a0-\u08ff"},{name:"InArabic_Mathematical_Alphabetic_Symbols", -astral:"\ud83b[\ude00-\udeff]"},{name:"InArabic_Presentation_Forms_A",bmp:"\ufb50-\ufdff"},{name:"InArabic_Presentation_Forms_B",bmp:"\ufe70-\ufeff"},{name:"InArabic_Supplement",bmp:"\u0750-\u077f"},{name:"InArmenian",bmp:"\u0530-\u058f"},{name:"InArrows",bmp:"\u2190-\u21ff"},{name:"InAvestan",astral:"\ud802[\udf00-\udf3f]"},{name:"InBalinese",bmp:"\u1b00-\u1b7f"},{name:"InBamum",bmp:"\ua6a0-\ua6ff"},{name:"InBamum_Supplement",astral:"\ud81a[\udc00-\ude3f]"},{name:"InBasic_Latin",bmp:"\x00-\u007f"}, -{name:"InBassa_Vah",astral:"\ud81a[\uded0-\udeff]"},{name:"InBatak",bmp:"\u1bc0-\u1bff"},{name:"InBengali",bmp:"\u0980-\u09ff"},{name:"InBhaiksuki",astral:"\ud807[\udc00-\udc6f]"},{name:"InBlock_Elements",bmp:"\u2580-\u259f"},{name:"InBopomofo",bmp:"\u3100-\u312f"},{name:"InBopomofo_Extended",bmp:"\u31a0-\u31bf"},{name:"InBox_Drawing",bmp:"\u2500-\u257f"},{name:"InBrahmi",astral:"\ud804[\udc00-\udc7f]"},{name:"InBraille_Patterns",bmp:"\u2800-\u28ff"},{name:"InBuginese",bmp:"\u1a00-\u1a1f"},{name:"InBuhid", -bmp:"\u1740-\u175f"},{name:"InByzantine_Musical_Symbols",astral:"\ud834[\udc00-\udcff]"},{name:"InCJK_Compatibility",bmp:"\u3300-\u33ff"},{name:"InCJK_Compatibility_Forms",bmp:"\ufe30-\ufe4f"},{name:"InCJK_Compatibility_Ideographs",bmp:"\uf900-\ufaff"},{name:"InCJK_Compatibility_Ideographs_Supplement",astral:"\ud87e[\udc00-\ude1f]"},{name:"InCJK_Radicals_Supplement",bmp:"\u2e80-\u2eff"},{name:"InCJK_Strokes",bmp:"\u31c0-\u31ef"},{name:"InCJK_Symbols_and_Punctuation",bmp:"\u3000-\u303f"},{name:"InCJK_Unified_Ideographs", -bmp:"\u4e00-\u9fff"},{name:"InCJK_Unified_Ideographs_Extension_A",bmp:"\u3400-\u4dbf"},{name:"InCJK_Unified_Ideographs_Extension_B",astral:"[\ud840-\ud868][\udc00-\udfff]|\ud869[\udc00-\udedf]"},{name:"InCJK_Unified_Ideographs_Extension_C",astral:"\ud869[\udf00-\udfff]|[\ud86a-\ud86c][\udc00-\udfff]|\ud86d[\udc00-\udf3f]"},{name:"InCJK_Unified_Ideographs_Extension_D",astral:"\ud86d[\udf40-\udfff]|\ud86e[\udc00-\udc1f]"},{name:"InCJK_Unified_Ideographs_Extension_E",astral:"\ud86e[\udc20-\udfff]|[\ud86f-\ud872][\udc00-\udfff]|\ud873[\udc00-\udeaf]"}, -{name:"InCarian",astral:"\ud800[\udea0-\udedf]"},{name:"InCaucasian_Albanian",astral:"\ud801[\udd30-\udd6f]"},{name:"InChakma",astral:"\ud804[\udd00-\udd4f]"},{name:"InCham",bmp:"\uaa00-\uaa5f"},{name:"InCherokee",bmp:"\u13a0-\u13ff"},{name:"InCherokee_Supplement",bmp:"\uab70-\uabbf"},{name:"InCombining_Diacritical_Marks",bmp:"\u0300-\u036f"},{name:"InCombining_Diacritical_Marks_Extended",bmp:"\u1ab0-\u1aff"},{name:"InCombining_Diacritical_Marks_Supplement",bmp:"\u1dc0-\u1dff"},{name:"InCombining_Diacritical_Marks_for_Symbols", -bmp:"\u20d0-\u20ff"},{name:"InCombining_Half_Marks",bmp:"\ufe20-\ufe2f"},{name:"InCommon_Indic_Number_Forms",bmp:"\ua830-\ua83f"},{name:"InControl_Pictures",bmp:"\u2400-\u243f"},{name:"InCoptic",bmp:"\u2c80-\u2cff"},{name:"InCoptic_Epact_Numbers",astral:"\ud800[\udee0-\udeff]"},{name:"InCounting_Rod_Numerals",astral:"\ud834[\udf60-\udf7f]"},{name:"InCuneiform",astral:"\ud808[\udc00-\udfff]"},{name:"InCuneiform_Numbers_and_Punctuation",astral:"\ud809[\udc00-\udc7f]"},{name:"InCurrency_Symbols",bmp:"\u20a0-\u20cf"}, -{name:"InCypriot_Syllabary",astral:"\ud802[\udc00-\udc3f]"},{name:"InCyrillic",bmp:"\u0400-\u04ff"},{name:"InCyrillic_Extended_A",bmp:"\u2de0-\u2dff"},{name:"InCyrillic_Extended_B",bmp:"\ua640-\ua69f"},{name:"InCyrillic_Extended_C",bmp:"\u1c80-\u1c8f"},{name:"InCyrillic_Supplement",bmp:"\u0500-\u052f"},{name:"InDeseret",astral:"\ud801[\udc00-\udc4f]"},{name:"InDevanagari",bmp:"\u0900-\u097f"},{name:"InDevanagari_Extended",bmp:"\ua8e0-\ua8ff"},{name:"InDingbats",bmp:"\u2700-\u27bf"},{name:"InDomino_Tiles", -astral:"\ud83c[\udc30-\udc9f]"},{name:"InDuployan",astral:"\ud82f[\udc00-\udc9f]"},{name:"InEarly_Dynastic_Cuneiform",astral:"\ud809[\udc80-\udd4f]"},{name:"InEgyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2f]"},{name:"InElbasan",astral:"\ud801[\udd00-\udd2f]"},{name:"InEmoticons",astral:"\ud83d[\ude00-\ude4f]"},{name:"InEnclosed_Alphanumeric_Supplement",astral:"\ud83c[\udd00-\uddff]"},{name:"InEnclosed_Alphanumerics",bmp:"\u2460-\u24ff"},{name:"InEnclosed_CJK_Letters_and_Months", -bmp:"\u3200-\u32ff"},{name:"InEnclosed_Ideographic_Supplement",astral:"\ud83c[\ude00-\udeff]"},{name:"InEthiopic",bmp:"\u1200-\u137f"},{name:"InEthiopic_Extended",bmp:"\u2d80-\u2ddf"},{name:"InEthiopic_Extended_A",bmp:"\uab00-\uab2f"},{name:"InEthiopic_Supplement",bmp:"\u1380-\u139f"},{name:"InGeneral_Punctuation",bmp:"\u2000-\u206f"},{name:"InGeometric_Shapes",bmp:"\u25a0-\u25ff"},{name:"InGeometric_Shapes_Extended",astral:"\ud83d[\udf80-\udfff]"},{name:"InGeorgian",bmp:"\u10a0-\u10ff"},{name:"InGeorgian_Supplement", -bmp:"\u2d00-\u2d2f"},{name:"InGlagolitic",bmp:"\u2c00-\u2c5f"},{name:"InGlagolitic_Supplement",astral:"\ud838[\udc00-\udc2f]"},{name:"InGothic",astral:"\ud800[\udf30-\udf4f]"},{name:"InGrantha",astral:"\ud804[\udf00-\udf7f]"},{name:"InGreek_Extended",bmp:"\u1f00-\u1fff"},{name:"InGreek_and_Coptic",bmp:"\u0370-\u03ff"},{name:"InGujarati",bmp:"\u0a80-\u0aff"},{name:"InGurmukhi",bmp:"\u0a00-\u0a7f"},{name:"InHalfwidth_and_Fullwidth_Forms",bmp:"\uff00-\uffef"},{name:"InHangul_Compatibility_Jamo",bmp:"\u3130-\u318f"}, -{name:"InHangul_Jamo",bmp:"\u1100-\u11ff"},{name:"InHangul_Jamo_Extended_A",bmp:"\ua960-\ua97f"},{name:"InHangul_Jamo_Extended_B",bmp:"\ud7b0-\ud7ff"},{name:"InHangul_Syllables",bmp:"\uac00-\ud7af"},{name:"InHanunoo",bmp:"\u1720-\u173f"},{name:"InHatran",astral:"\ud802[\udce0-\udcff]"},{name:"InHebrew",bmp:"\u0590-\u05ff"},{name:"InHigh_Private_Use_Surrogates",bmp:"\udb80-\udbff"},{name:"InHigh_Surrogates",bmp:"\ud800-\udb7f"},{name:"InHiragana",bmp:"\u3040-\u309f"},{name:"InIPA_Extensions",bmp:"\u0250-\u02af"}, -{name:"InIdeographic_Description_Characters",bmp:"\u2ff0-\u2fff"},{name:"InIdeographic_Symbols_and_Punctuation",astral:"\ud81b[\udfe0-\udfff]"},{name:"InImperial_Aramaic",astral:"\ud802[\udc40-\udc5f]"},{name:"InInscriptional_Pahlavi",astral:"\ud802[\udf60-\udf7f]"},{name:"InInscriptional_Parthian",astral:"\ud802[\udf40-\udf5f]"},{name:"InJavanese",bmp:"\ua980-\ua9df"},{name:"InKaithi",astral:"\ud804[\udc80-\udccf]"},{name:"InKana_Supplement",astral:"\ud82c[\udc00-\udcff]"},{name:"InKanbun",bmp:"\u3190-\u319f"}, -{name:"InKangxi_Radicals",bmp:"\u2f00-\u2fdf"},{name:"InKannada",bmp:"\u0c80-\u0cff"},{name:"InKatakana",bmp:"\u30a0-\u30ff"},{name:"InKatakana_Phonetic_Extensions",bmp:"\u31f0-\u31ff"},{name:"InKayah_Li",bmp:"\ua900-\ua92f"},{name:"InKharoshthi",astral:"\ud802[\ude00-\ude5f]"},{name:"InKhmer",bmp:"\u1780-\u17ff"},{name:"InKhmer_Symbols",bmp:"\u19e0-\u19ff"},{name:"InKhojki",astral:"\ud804[\ude00-\ude4f]"},{name:"InKhudawadi",astral:"\ud804[\udeb0-\udeff]"},{name:"InLao",bmp:"\u0e80-\u0eff"},{name:"InLatin_Extended_Additional", -bmp:"\u1e00-\u1eff"},{name:"InLatin_Extended_A",bmp:"\u0100-\u017f"},{name:"InLatin_Extended_B",bmp:"\u0180-\u024f"},{name:"InLatin_Extended_C",bmp:"\u2c60-\u2c7f"},{name:"InLatin_Extended_D",bmp:"\ua720-\ua7ff"},{name:"InLatin_Extended_E",bmp:"\uab30-\uab6f"},{name:"InLatin_1_Supplement",bmp:"\u0080-\u00ff"},{name:"InLepcha",bmp:"\u1c00-\u1c4f"},{name:"InLetterlike_Symbols",bmp:"\u2100-\u214f"},{name:"InLimbu",bmp:"\u1900-\u194f"},{name:"InLinear_A",astral:"\ud801[\ude00-\udf7f]"},{name:"InLinear_B_Ideograms", -astral:"\ud800[\udc80-\udcff]"},{name:"InLinear_B_Syllabary",astral:"\ud800[\udc00-\udc7f]"},{name:"InLisu",bmp:"\ua4d0-\ua4ff"},{name:"InLow_Surrogates",bmp:"\udc00-\udfff"},{name:"InLycian",astral:"\ud800[\ude80-\ude9f]"},{name:"InLydian",astral:"\ud802[\udd20-\udd3f]"},{name:"InMahajani",astral:"\ud804[\udd50-\udd7f]"},{name:"InMahjong_Tiles",astral:"\ud83c[\udc00-\udc2f]"},{name:"InMalayalam",bmp:"\u0d00-\u0d7f"},{name:"InMandaic",bmp:"\u0840-\u085f"},{name:"InManichaean",astral:"\ud802[\udec0-\udeff]"}, -{name:"InMarchen",astral:"\ud807[\udc70-\udcbf]"},{name:"InMathematical_Alphanumeric_Symbols",astral:"\ud835[\udc00-\udfff]"},{name:"InMathematical_Operators",bmp:"\u2200-\u22ff"},{name:"InMeetei_Mayek",bmp:"\uabc0-\uabff"},{name:"InMeetei_Mayek_Extensions",bmp:"\uaae0-\uaaff"},{name:"InMende_Kikakui",astral:"\ud83a[\udc00-\udcdf]"},{name:"InMeroitic_Cursive",astral:"\ud802[\udda0-\uddff]"},{name:"InMeroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"InMiao",astral:"\ud81b[\udf00-\udf9f]"}, -{name:"InMiscellaneous_Mathematical_Symbols_A",bmp:"\u27c0-\u27ef"},{name:"InMiscellaneous_Mathematical_Symbols_B",bmp:"\u2980-\u29ff"},{name:"InMiscellaneous_Symbols",bmp:"\u2600-\u26ff"},{name:"InMiscellaneous_Symbols_and_Arrows",bmp:"\u2b00-\u2bff"},{name:"InMiscellaneous_Symbols_and_Pictographs",astral:"\ud83c[\udf00-\udfff]|\ud83d[\udc00-\uddff]"},{name:"InMiscellaneous_Technical",bmp:"\u2300-\u23ff"},{name:"InModi",astral:"\ud805[\ude00-\ude5f]"},{name:"InModifier_Tone_Letters",bmp:"\ua700-\ua71f"}, -{name:"InMongolian",bmp:"\u1800-\u18af"},{name:"InMongolian_Supplement",astral:"\ud805[\ude60-\ude7f]"},{name:"InMro",astral:"\ud81a[\ude40-\ude6f]"},{name:"InMultani",astral:"\ud804[\ude80-\udeaf]"},{name:"InMusical_Symbols",astral:"\ud834[\udd00-\uddff]"},{name:"InMyanmar",bmp:"\u1000-\u109f"},{name:"InMyanmar_Extended_A",bmp:"\uaa60-\uaa7f"},{name:"InMyanmar_Extended_B",bmp:"\ua9e0-\ua9ff"},{name:"InNKo",bmp:"\u07c0-\u07ff"},{name:"InNabataean",astral:"\ud802[\udc80-\udcaf]"},{name:"InNew_Tai_Lue", -bmp:"\u1980-\u19df"},{name:"InNewa",astral:"\ud805[\udc00-\udc7f]"},{name:"InNumber_Forms",bmp:"\u2150-\u218f"},{name:"InOgham",bmp:"\u1680-\u169f"},{name:"InOl_Chiki",bmp:"\u1c50-\u1c7f"},{name:"InOld_Hungarian",astral:"\ud803[\udc80-\udcff]"},{name:"InOld_Italic",astral:"\ud800[\udf00-\udf2f]"},{name:"InOld_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"InOld_Permic",astral:"\ud800[\udf50-\udf7f]"},{name:"InOld_Persian",astral:"\ud800[\udfa0-\udfdf]"},{name:"InOld_South_Arabian",astral:"\ud802[\ude60-\ude7f]"}, -{name:"InOld_Turkic",astral:"\ud803[\udc00-\udc4f]"},{name:"InOptical_Character_Recognition",bmp:"\u2440-\u245f"},{name:"InOriya",bmp:"\u0b00-\u0b7f"},{name:"InOrnamental_Dingbats",astral:"\ud83d[\ude50-\ude7f]"},{name:"InOsage",astral:"\ud801[\udcb0-\udcff]"},{name:"InOsmanya",astral:"\ud801[\udc80-\udcaf]"},{name:"InPahawh_Hmong",astral:"\ud81a[\udf00-\udf8f]"},{name:"InPalmyrene",astral:"\ud802[\udc60-\udc7f]"},{name:"InPau_Cin_Hau",astral:"\ud806[\udec0-\udeff]"},{name:"InPhags_pa",bmp:"\ua840-\ua87f"}, -{name:"InPhaistos_Disc",astral:"\ud800[\uddd0-\uddff]"},{name:"InPhoenician",astral:"\ud802[\udd00-\udd1f]"},{name:"InPhonetic_Extensions",bmp:"\u1d00-\u1d7f"},{name:"InPhonetic_Extensions_Supplement",bmp:"\u1d80-\u1dbf"},{name:"InPlaying_Cards",astral:"\ud83c[\udca0-\udcff]"},{name:"InPrivate_Use_Area",bmp:"\ue000-\uf8ff"},{name:"InPsalter_Pahlavi",astral:"\ud802[\udf80-\udfaf]"},{name:"InRejang",bmp:"\ua930-\ua95f"},{name:"InRumi_Numeral_Symbols",astral:"\ud803[\ude60-\ude7f]"},{name:"InRunic", -bmp:"\u16a0-\u16ff"},{name:"InSamaritan",bmp:"\u0800-\u083f"},{name:"InSaurashtra",bmp:"\ua880-\ua8df"},{name:"InSharada",astral:"\ud804[\udd80-\udddf]"},{name:"InShavian",astral:"\ud801[\udc50-\udc7f]"},{name:"InShorthand_Format_Controls",astral:"\ud82f[\udca0-\udcaf]"},{name:"InSiddham",astral:"\ud805[\udd80-\uddff]"},{name:"InSinhala",bmp:"\u0d80-\u0dff"},{name:"InSinhala_Archaic_Numbers",astral:"\ud804[\udde0-\uddff]"},{name:"InSmall_Form_Variants",bmp:"\ufe50-\ufe6f"},{name:"InSora_Sompeng", -astral:"\ud804[\udcd0-\udcff]"},{name:"InSpacing_Modifier_Letters",bmp:"\u02b0-\u02ff"},{name:"InSpecials",bmp:"\ufff0-\uffff"},{name:"InSundanese",bmp:"\u1b80-\u1bbf"},{name:"InSundanese_Supplement",bmp:"\u1cc0-\u1ccf"},{name:"InSuperscripts_and_Subscripts",bmp:"\u2070-\u209f"},{name:"InSupplemental_Arrows_A",bmp:"\u27f0-\u27ff"},{name:"InSupplemental_Arrows_B",bmp:"\u2900-\u297f"},{name:"InSupplemental_Arrows_C",astral:"\ud83e[\udc00-\udcff]"},{name:"InSupplemental_Mathematical_Operators",bmp:"\u2a00-\u2aff"}, -{name:"InSupplemental_Punctuation",bmp:"\u2e00-\u2e7f"},{name:"InSupplemental_Symbols_and_Pictographs",astral:"\ud83e[\udd00-\uddff]"},{name:"InSupplementary_Private_Use_Area_A",astral:"[\udb80-\udbbf][\udc00-\udfff]"},{name:"InSupplementary_Private_Use_Area_B",astral:"[\udbc0-\udbff][\udc00-\udfff]"},{name:"InSutton_SignWriting",astral:"\ud836[\udc00-\udeaf]"},{name:"InSyloti_Nagri",bmp:"\ua800-\ua82f"},{name:"InSyriac",bmp:"\u0700-\u074f"},{name:"InTagalog",bmp:"\u1700-\u171f"},{name:"InTagbanwa", -bmp:"\u1760-\u177f"},{name:"InTags",astral:"\udb40[\udc00-\udc7f]"},{name:"InTai_Le",bmp:"\u1950-\u197f"},{name:"InTai_Tham",bmp:"\u1a20-\u1aaf"},{name:"InTai_Viet",bmp:"\uaa80-\uaadf"},{name:"InTai_Xuan_Jing_Symbols",astral:"\ud834[\udf00-\udf5f]"},{name:"InTakri",astral:"\ud805[\ude80-\udecf]"},{name:"InTamil",bmp:"\u0b80-\u0bff"},{name:"InTangut",astral:"[\ud81c-\ud821][\udc00-\udfff]"},{name:"InTangut_Components",astral:"\ud822[\udc00-\udeff]"},{name:"InTelugu",bmp:"\u0c00-\u0c7f"},{name:"InThaana", -bmp:"\u0780-\u07bf"},{name:"InThai",bmp:"\u0e00-\u0e7f"},{name:"InTibetan",bmp:"\u0f00-\u0fff"},{name:"InTifinagh",bmp:"\u2d30-\u2d7f"},{name:"InTirhuta",astral:"\ud805[\udc80-\udcdf]"},{name:"InTransport_and_Map_Symbols",astral:"\ud83d[\ude80-\udeff]"},{name:"InUgaritic",astral:"\ud800[\udf80-\udf9f]"},{name:"InUnified_Canadian_Aboriginal_Syllabics",bmp:"\u1400-\u167f"},{name:"InUnified_Canadian_Aboriginal_Syllabics_Extended",bmp:"\u18b0-\u18ff"},{name:"InVai",bmp:"\ua500-\ua63f"},{name:"InVariation_Selectors", -bmp:"\ufe00-\ufe0f"},{name:"InVariation_Selectors_Supplement",astral:"\udb40[\udd00-\uddef]"},{name:"InVedic_Extensions",bmp:"\u1cd0-\u1cff"},{name:"InVertical_Forms",bmp:"\ufe10-\ufe1f"},{name:"InWarang_Citi",astral:"\ud806[\udca0-\udcff]"},{name:"InYi_Radicals",bmp:"\ua490-\ua4cf"},{name:"InYi_Syllables",bmp:"\ua000-\ua48f"},{name:"InYijing_Hexagram_Symbols",bmp:"\u4dc0-\u4dff"}])}},{}],5:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories"); -c.addUnicodeData([{name:"C",alias:"Other",isBmpLast:!0,bmp:"\x00-\u001f\u007f-\u009f\u00ad\u0378\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u0605\u061c\u061d\u06dd\u070e\u070f\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08b5\u08be-\u08d3\u08e2\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d50-\u0d53\u0d64\u0d65\u0d80\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce\u10cf\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u137d-\u137f\u139a-\u139f\u13f6\u13f7\u13fe\u13ff\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180e\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c\u1a1d\u1a5f\u1a7d\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfa\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u200b-\u200f\u202a-\u202e\u2060-\u206f\u2072\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23ff\u2427-\u243f\u244b-\u245f\u2b74\u2b75\u2b96\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e45-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua8fe\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e\uaa4f\uaa5a\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07\uab08\uab0f\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\uf8ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\uff00\uffbf-\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd-\uffdf\uffe7\uffef-\ufffb\ufffe\uffff", -astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9c-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2f\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd70-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude34-\ude37\ude3b-\ude3e\ude48-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd00-\ude5f\ude7f-\udfff]|\ud804[\udc4e-\udc51\udc70-\udc7e\udcbd\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd4f\udd77-\udd7f\uddce\uddcf\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf3b\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5a\udc5c\udc5e-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeb8-\udebf\udeca-\udeff\udf1a-\udf1c\udf2c-\udf2f\udf40-\udfff]|\ud806[\udc00-\udc9f\udcf3-\udcfe\udd00-\udebf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udfff]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80b\ud80e-\ud810\ud812-\ud819\ud823-\ud82b\ud82d\ud82e\ud830-\ud833\ud837\ud839\ud83f\ud874-\ud87d\ud87f-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\ude70-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfdf\udfe1-\udfff]|\ud821[\udfed-\udfff]|\ud822[\udef3-\udfff]|\ud82c[\udc02-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca0-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\udde9-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4b-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\udd0d-\udd0f\udd2f\udd6c-\udd6f\uddad-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\udeff]|\ud83d[\uded3-\udedf\udeed-\udeef\udef7-\udeff\udf74-\udf7f\udfd5-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae-\udd0f\udd1f\udd28-\udd2f\udd31\udd32\udd3f\udd4c-\udd4f\udd5f-\udd7f\udd92-\uddbf\uddc1-\udfff]|\ud869[\uded7-\udeff]|\ud86d[\udf35-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udfff]|\ud87e[\ude1e-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]"}, -{name:"Cc",alias:"Control",bmp:"\x00-\u001f\u007f-\u009f"},{name:"Cf",alias:"Format",bmp:"\u00ad\u0600-\u0605\u061c\u06dd\u070f\u08e2\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb",astral:"\ud804\udcbd|\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|\udb40[\udc01\udc20-\udc7f]"},{name:"Cn",alias:"Unassigned",bmp:"\u0378\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u0590\u05c8-\u05cf\u05eb-\u05ef\u05f5-\u05ff\u061d\u070e\u074b\u074c\u07b2-\u07bf\u07fb-\u07ff\u082e\u082f\u083f\u085c\u085d\u085f-\u089f\u08b5\u08be-\u08d3\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4\u09e5\u09fc-\u0a00\u0a04\u0a0b-\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43-\u0a46\u0a49\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a76-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1-\u0adf\u0ae4\u0ae5\u0af2-\u0af8\u0afa-\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b45\u0b46\u0b49\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c04\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64\u0c65\u0c70-\u0c77\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4\u0ce5\u0cf0\u0cf3-\u0d00\u0d04\u0d0d\u0d11\u0d3b\u0d3c\u0d45\u0d49\u0d50-\u0d53\u0d64\u0d65\u0d80\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce\u10cf\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u137d-\u137f\u139a-\u139f\u13f6\u13f7\u13fe\u13ff\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1878-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c\u1a1d\u1a5f\u1a7d\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1cbf\u1cc8-\u1ccf\u1cf7\u1cfa-\u1cff\u1df6-\u1dfa\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2065\u2072\u2073\u208f\u209d-\u209f\u20bf-\u20cf\u20f1-\u20ff\u218c-\u218f\u23ff\u2427-\u243f\u244b-\u245f\u2b74\u2b75\u2b96\u2b97\u2bba-\u2bbc\u2bc9\u2bd2-\u2beb\u2bf0-\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e45-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097\u3098\u3100-\u3104\u312e-\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9fd6-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7af\ua7b8-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua8fe\ua8ff\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e\uaa4f\uaa5a\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07\uab08\uab0f\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90\ufd91\ufdc8-\ufdef\ufdfe\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf-\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe\uffff", -astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9c-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2f\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd70-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude34-\ude37\ude3b-\ude3e\ude48-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd00-\ude5f\ude7f-\udfff]|\ud804[\udc4e-\udc51\udc70-\udc7e\udcc2-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd44-\udd4f\udd77-\udd7f\uddce\uddcf\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf3b\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5a\udc5c\udc5e-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeb8-\udebf\udeca-\udeff\udf1a-\udf1c\udf2c-\udf2f\udf40-\udfff]|\ud806[\udc00-\udc9f\udcf3-\udcfe\udd00-\udebf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udfff]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80b\ud80e-\ud810\ud812-\ud819\ud823-\ud82b\ud82d\ud82e\ud830-\ud833\ud837\ud839\ud83f\ud874-\ud87d\ud87f-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\ude70-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\udeff\udf45-\udf4f\udf7f-\udf8e\udfa0-\udfdf\udfe1-\udfff]|\ud821[\udfed-\udfff]|\ud822[\udef3-\udfff]|\ud82c[\udc02-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udde9-\uddff\ude46-\udeff\udf57-\udf5f\udf72-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4b-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\udd0d-\udd0f\udd2f\udd6c-\udd6f\uddad-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\udeff]|\ud83d[\uded3-\udedf\udeed-\udeef\udef7-\udeff\udf74-\udf7f\udfd5-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae-\udd0f\udd1f\udd28-\udd2f\udd31\udd32\udd3f\udd4c-\udd4f\udd5f-\udd7f\udd92-\uddbf\uddc1-\udfff]|\ud869[\uded7-\udeff]|\ud86d[\udf35-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udfff]|\ud87e[\ude1e-\udfff]|\udb40[\udc00\udc02-\udc1f\udc80-\udcff\uddf0-\udfff]|[\udbbf\udbff][\udffe\udfff]"}, -{name:"Co",alias:"Private_Use",bmp:"\ue000-\uf8ff",astral:"[\udb80-\udbbe\udbc0-\udbfe][\udc00-\udfff]|[\udbbf\udbff][\udc00-\udffd]"},{name:"Cs",alias:"Surrogate",bmp:"\ud800-\udfff"},{name:"L",alias:"Letter",bmp:"A-Za-z\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2183\u2184\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005\u3006\u3031-\u3035\u303b\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6e5\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc", -astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udf00-\udf19]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud83a[\udc00-\udcc4\udd00-\udd43]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, -{name:"Ll",alias:"Lowercase_Letter",bmp:"a-z\u00b5\u00df-\u00f6\u00f8-\u00ff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7fa\uab30-\uab5a\uab60-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a", -astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Lm",alias:"Modifier_Letter", -bmp:"\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5\u06e6\u07f4\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua69c\ua69d\ua717-\ua71f\ua770\ua788\ua7f8\ua7f9\ua9cf\ua9e6\uaa70\uaadd\uaaf3\uaaf4\uab5c-\uab5f\uff70\uff9e\uff9f",astral:"\ud81a[\udf40-\udf43]|\ud81b[\udf93-\udf9f\udfe0]"}, -{name:"Lo",alias:"Other_Letter",bmp:"\u00aa\u00ba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05f0-\u05f2\u0620-\u063f\u0641-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10d0-\u10fa\u10fd-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1877\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a\ua62b\ua66e\ua6a0-\ua6e5\ua78f\ua7f7\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9e0-\ua9e4\ua9e7-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc", -astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc50-\udc9d\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udf00-\udf19]|\ud806[\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud83a[\udc00-\udcc4]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, -{name:"Lt",alias:"Titlecase_Letter",bmp:"\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc"},{name:"Lu",alias:"Uppercase_Letter",bmp:"A-Z\u00c0-\u00d6\u00d8-\u00de\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a", -astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]"},{name:"M", -alias:"Mark",bmp:"\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f\u109a-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u180b-\u180d\u1885\u1886\u18a9\u1920-\u192b\u1930-\u193b\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1ab0-\u1abe\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u20d0-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9e5\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f", -astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud804[\udc00-\udc02\udc38-\udc46\udc7f-\udc82\udcb0-\udcba\udd00-\udd02\udd27-\udd34\udd73\udd80-\udd82\uddb3-\uddc0\uddca-\uddcc\ude2c-\ude37\ude3e\udedf-\udeea\udf00-\udf03\udf3c\udf3e-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc35-\udc46\udcb0-\udcc3\uddaf-\uddb5\uddb8-\uddc0\udddc\udddd\ude30-\ude40\udeab-\udeb7\udf1d-\udf2b]|\ud807[\udc2f-\udc36\udc38-\udc3f\udc92-\udca7\udca9-\udcb6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf51-\udf7e\udf8f-\udf92]|\ud82f[\udc9d\udc9e]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"}, -{name:"Mc",alias:"Spacing_Mark",bmp:"\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e\u094f\u0982\u0983\u09be-\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102b\u102c\u1031\u1038\u103b\u103c\u1056\u1057\u1062-\u1064\u1067-\u106d\u1083\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7\u17c8\u1923-\u1926\u1929-\u192b\u1930\u1931\u1933-\u1938\u1a19\u1a1a\u1a55\u1a57\u1a61\u1a63\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43\u1b44\u1b82\u1ba1\u1ba6\u1ba7\u1baa\u1be7\u1bea-\u1bec\u1bee\u1bf2\u1bf3\u1c24-\u1c2b\u1c34\u1c35\u1ce1\u1cf2\u1cf3\u302e\u302f\ua823\ua824\ua827\ua880\ua881\ua8b4-\ua8c3\ua952\ua953\ua983\ua9b4\ua9b5\ua9ba\ua9bb\ua9bd-\ua9c0\uaa2f\uaa30\uaa33\uaa34\uaa4d\uaa7b\uaa7d\uaaeb\uaaee\uaaef\uaaf5\uabe3\uabe4\uabe6\uabe7\uabe9\uabea\uabec", -astral:"\ud804[\udc00\udc02\udc82\udcb0-\udcb2\udcb7\udcb8\udd2c\udd82\uddb3-\uddb5\uddbf\uddc0\ude2c-\ude2e\ude32\ude33\ude35\udee0-\udee2\udf02\udf03\udf3e\udf3f\udf41-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63]|\ud805[\udc35-\udc37\udc40\udc41\udc45\udcb0-\udcb2\udcb9\udcbb-\udcbe\udcc1\uddaf-\uddb1\uddb8-\uddbb\uddbe\ude30-\ude32\ude3b\ude3c\ude3e\udeac\udeae\udeaf\udeb6\udf20\udf21\udf26]|\ud807[\udc2f\udc3e\udca9\udcb1\udcb4]|\ud81b[\udf51-\udf7e]|\ud834[\udd65\udd66\udd6d-\udd72]"}, -{name:"Me",alias:"Enclosing_Mark",bmp:"\u0488\u0489\u1abe\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672"},{name:"Mn",alias:"Nonspacing_Mark",bmp:"\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62\u0b63\u0b82\u0bc0\u0bcd\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c81\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0ce2\u0ce3\u0d01\u0d41-\u0d44\u0d4d\u0d62\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u1885\u1886\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1bab-\u1bad\u1be6\u1be8\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099\u309a\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8c5\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaec\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f", -astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud804[\udc01\udc38-\udc46\udc7f-\udc81\udcb3-\udcb6\udcb9\udcba\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd73\udd80\udd81\uddb6-\uddbe\uddca-\uddcc\ude2f-\ude31\ude34\ude36\ude37\ude3e\udedf\udee3-\udeea\udf00\udf01\udf3c\udf40\udf66-\udf6c\udf70-\udf74]|\ud805[\udc38-\udc3f\udc42-\udc44\udc46\udcb3-\udcb8\udcba\udcbf\udcc0\udcc2\udcc3\uddb2-\uddb5\uddbc\uddbd\uddbf\uddc0\udddc\udddd\ude33-\ude3a\ude3d\ude3f\ude40\udeab\udead\udeb0-\udeb5\udeb7\udf1d-\udf1f\udf22-\udf25\udf27-\udf2b]|\ud807[\udc30-\udc36\udc38-\udc3d\udc3f\udc92-\udca7\udcaa-\udcb0\udcb2\udcb3\udcb5\udcb6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf8f-\udf92]|\ud82f[\udc9d\udc9e]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"}, -{name:"N",alias:"Number",bmp:"0-9\u00b2\u00b3\u00b9\u00bc-\u00be\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u09f4-\u09f9\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0b72-\u0b77\u0be6-\u0bf2\u0c66-\u0c6f\u0c78-\u0c7e\u0ce6-\u0cef\u0d58-\u0d5e\u0d66-\u0d78\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f33\u1040-\u1049\u1090-\u1099\u1369-\u137c\u16ee-\u16f0\u17e0-\u17e9\u17f0-\u17f9\u1810-\u1819\u1946-\u194f\u19d0-\u19da\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3007\u3021-\u3029\u3038-\u303a\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua620-\ua629\ua6e6-\ua6ef\ua830-\ua835\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19", -astral:"\ud800[\udd07-\udd33\udd40-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23\udf41\udf4a\udfd1-\udfd5]|\ud801[\udca0-\udca9]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude47\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e]|\ud804[\udc52-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udde1-\uddf4\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf3b]|\ud806[\udce0-\udcf2]|\ud807[\udc50-\udc6c]|\ud809[\udc00-\udc6e]|\ud81a[\ude60-\ude69\udf50-\udf59\udf5b-\udf61]|\ud834[\udf60-\udf71]|\ud835[\udfce-\udfff]|\ud83a[\udcc7-\udccf\udd50-\udd59]|\ud83c[\udd00-\udd0c]"}, -{name:"Nd",alias:"Decimal_Number",bmp:"0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19", -astral:"\ud801[\udca0-\udca9]|\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf39]|\ud806[\udce0-\udce9]|\ud807[\udc50-\udc59]|\ud81a[\ude60-\ude69\udf50-\udf59]|\ud835[\udfce-\udfff]|\ud83a[\udd50-\udd59]"},{name:"Nl",alias:"Letter_Number",bmp:"\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef",astral:"\ud800[\udd40-\udd74\udf41\udf4a\udfd1-\udfd5]|\ud809[\udc00-\udc6e]"}, -{name:"No",alias:"Other_Number",bmp:"\u00b2\u00b3\u00b9\u00bc-\u00be\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d58-\u0d5e\u0d70-\u0d78\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835",astral:"\ud800[\udd07-\udd33\udd75-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude47\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e]|\ud804[\udc52-\udc65\udde1-\uddf4]|\ud805[\udf3a\udf3b]|\ud806[\udcea-\udcf2]|\ud807[\udc5a-\udc6c]|\ud81a[\udf5b-\udf61]|\ud834[\udf60-\udf71]|\ud83a[\udcc7-\udccf]|\ud83c[\udd00-\udd0c]"}, -{name:"P",alias:"Punctuation",bmp:"!-#%-\\x2A,-/:;\\x3F@\\x5B-\\x5D_\\x7B}\u00a1\u00a7\u00ab\u00b6\u00b7\u00bb\u00bf\u037e\u0387\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u2308-\u230b\u2329\u232a\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30-\u2e44\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua8fc\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65", -astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|\ud801\udd6f|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc9\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udf3c-\udf3e]|\ud807[\udc41-\udc45\udc70\udc71]|\ud809[\udc70-\udc74]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud82f\udc9f|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"}, -{name:"Pc",alias:"Connector_Punctuation",bmp:"_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f"},{name:"Pd",alias:"Dash_Punctuation",bmp:"\\x2D\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a\u2e3b\u2e40\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\x29\\x5D}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u2309\u230b\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3e\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63"}, -{name:"Pf",alias:"Final_Punctuation",bmp:"\u00bb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21"},{name:"Pi",alias:"Initial_Punctuation",bmp:"\u00ab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\x2A,\\x2E/:;\\x3F@\\x5C\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u2e3c-\u2e3f\u2e41\u2e43\u2e44\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua8fc\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65", -astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|\ud801\udd6f|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc9\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udf3c-\udf3e]|\ud807[\udc41-\udc45\udc70\udc71]|\ud809[\udc70-\udc74]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud82f\udc9f|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"}, -{name:"Ps",alias:"Open_Punctuation",bmp:"\\x28\\x5B\\x7B\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2308\u230a\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u2e42\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3f\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62"},{name:"S", -alias:"Symbol",bmp:"\\x24\\x2B<->\\x5E`\\x7C~\u00a2-\u00a6\u00a8\u00a9\u00ac\u00ae-\u00b1\u00b4\u00b8\u00d7\u00f7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20be\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd", -astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83b[\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"}, -{name:"Sc",alias:"Currency_Symbol",bmp:"\\x24\u00a2-\u00a5\u058f\u060b\u09f2\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20be\ua838\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\x5E`\u00a8\u00af\u00b4\u00b8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u309b\u309c\ua700-\ua716\ua720\ua721\ua789\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3",astral:"\ud83c[\udffb-\udfff]"}, -{name:"Sm",alias:"Math_Symbol",bmp:"\\x2B<->\\x7C~\u00ac\u00b1\u00d7\u00f7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec", -astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"\u00a6\u00a9\u00ae\u00b0\u0482\u058d\u058e\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u214a\u214c\u214d\u214f\u218a\u218b\u2195-\u2199\u219c-\u219f\u21a1\u21a2\u21a4\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u23fe\u2400-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd", -astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9b\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|\ud805\udf3f|\ud81a[\udf3c-\udf3f\udf45]|\ud82f\udc9c|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\udde8\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udffa]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]"}, -{name:"Z",alias:"Separator",bmp:" \u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:" \u00a0\u1680\u2000-\u200a\u202f\u205f\u3000"}])}},{}],6:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Properties");var d=[{name:"ASCII",bmp:"\x00-\u007f"},{name:"Alphabetic",bmp:"A-Za-z\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0345\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05b0-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0657\u0659-\u065f\u066e-\u06d3\u06d5-\u06dc\u06e1-\u06e8\u06ed-\u06ef\u06fa-\u06fc\u06ff\u0710-\u073f\u074d-\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0817\u081a-\u082c\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08df\u08e3-\u08e9\u08f0-\u093b\u093d-\u094c\u094e-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd-\u09c4\u09c7\u09c8\u09cb\u09cc\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3e-\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd-\u0ac5\u0ac7-\u0ac9\u0acb\u0acc\u0ad0\u0ae0-\u0ae3\u0af9\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d-\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4c\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccc\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e46\u0e4d\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ecd\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f71-\u0f81\u0f88-\u0f97\u0f99-\u0fbc\u1000-\u1036\u1038\u103b-\u103f\u1050-\u1062\u1065-\u1068\u106e-\u1086\u108e\u109c\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135f\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17b3\u17b6-\u17c8\u17d7\u17dc\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u1938\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a61-\u1a74\u1aa7\u1b00-\u1b33\u1b35-\u1b43\u1b45-\u1b4b\u1b80-\u1ba9\u1bac-\u1baf\u1bba-\u1be5\u1be7-\u1bf1\u1c00-\u1c35\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1d00-\u1dbf\u1de7-\u1df4\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua674-\ua67b\ua67f-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua827\ua840-\ua873\ua880-\ua8c3\ua8c5\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua92a\ua930-\ua952\ua960-\ua97c\ua980-\ua9b2\ua9b4-\ua9bf\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a\uaa7e-\uaabe\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc", -astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf30-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2]|\ud804[\udc00-\udc45\udc82-\udcb8\udcd0-\udce8\udd00-\udd32\udd50-\udd72\udd76\udd80-\uddbf\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude34\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udee8\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d-\udf44\udf47\udf48\udf4b\udf4c\udf50\udf57\udf5d-\udf63]|\ud805[\udc00-\udc41\udc43-\udc45\udc47-\udc4a\udc80-\udcc1\udcc4\udcc5\udcc7\udd80-\uddb5\uddb8-\uddbe\uddd8-\udddd\ude00-\ude3e\ude40\ude44\ude80-\udeb5\udf00-\udf19\udf1d-\udf2a]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc3e\udc40\udc72-\udc8f\udc92-\udca7\udca9-\udcb6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|[\ud80c\ud81c-\ud820\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf93-\udf9f\udfe0]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9e]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd47]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, -{name:"Any",isBmpLast:!0,bmp:"\x00-\uffff",astral:"[\ud800-\udbff][\udc00-\udfff]"},{name:"Default_Ignorable_Code_Point",bmp:"\u00ad\u034f\u061c\u115f\u1160\u17b4\u17b5\u180b-\u180e\u200b-\u200f\u202a-\u202e\u2060-\u206f\u3164\ufe00-\ufe0f\ufeff\uffa0\ufff0-\ufff8",astral:"\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|[\udb40-\udb43][\udc00-\udfff]"},{name:"Lowercase",bmp:"a-z\u00aa\u00b5\u00ba\u00df-\u00f6\u00f8-\u00ff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02b8\u02c0\u02c1\u02e0-\u02e4\u0345\u0371\u0373\u0377\u037a-\u037d\u0390\u03ac-\u03ce\u03d0\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0561-\u0587\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1dbf\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6\u1fc7\u1fd0-\u1fd3\u1fd6\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6\u1ff7\u2071\u207f\u2090-\u209c\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146-\u2149\u214e\u2170-\u217f\u2184\u24d0-\u24e9\u2c30-\u2c5e\u2c61\u2c65\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73\u2c74\u2c76-\u2c7d\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b-\ua69d\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7b5\ua7b7\ua7f8-\ua7fa\uab30-\uab5a\uab5c-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a", -astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud83a[\udd22-\udd43]"},{name:"Noncharacter_Code_Point", -bmp:"\ufdd0-\ufdef\ufffe\uffff",astral:"[\ud83f\ud87f\ud8bf\ud8ff\ud93f\ud97f\ud9bf\ud9ff\uda3f\uda7f\udabf\udaff\udb3f\udb7f\udbbf\udbff][\udffe\udfff]"},{name:"Uppercase",bmp:"A-Z\u00c0-\u00d6\u00d8-\u00de\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189-\u018b\u018e-\u0191\u0193\u0194\u0196-\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1-\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e\u213f\u2145\u2160-\u216f\u2183\u24b6-\u24cf\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\uff21-\uff3a", -astral:"\ud801[\udc00-\udc27\udcb0-\udcd3]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]|\ud83c[\udd30-\udd49\udd50-\udd69\udd70-\udd89]"}, -{name:"White_Space",bmp:"\t-\r \u0085\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000"}];d.push({name:"Assigned",inverseOf:"Cn"});c.addUnicodeData(d)}},{}],7:[function(d,g,p){g.exports=function(c){if(!c.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Scripts");c.addUnicodeData([{name:"Adlam",astral:"\ud83a[\udd00-\udd4a\udd50-\udd59\udd5e\udd5f]"},{name:"Ahom",astral:"\ud805[\udf00-\udf19\udf1d-\udf2b\udf30-\udf3f]"},{name:"Anatolian_Hieroglyphs",astral:"\ud811[\udc00-\ude46]"}, -{name:"Arabic",bmp:"\u0600-\u0604\u0606-\u060b\u060d-\u061a\u061e\u0620-\u063f\u0641-\u064a\u0656-\u066f\u0671-\u06dc\u06de-\u06ff\u0750-\u077f\u08a0-\u08b4\u08b6-\u08bd\u08d4-\u08e1\u08e3-\u08ff\ufb50-\ufbc1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe70-\ufe74\ufe76-\ufefc",astral:"\ud803[\ude60-\ude7e]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb\udef0\udef1]"}, -{name:"Armenian",bmp:"\u0531-\u0556\u0559-\u055f\u0561-\u0587\u058a\u058d-\u058f\ufb13-\ufb17"},{name:"Avestan",astral:"\ud802[\udf00-\udf35\udf39-\udf3f]"},{name:"Balinese",bmp:"\u1b00-\u1b4b\u1b50-\u1b7c"},{name:"Bamum",bmp:"\ua6a0-\ua6f7",astral:"\ud81a[\udc00-\ude38]"},{name:"Bassa_Vah",astral:"\ud81a[\uded0-\udeed\udef0-\udef5]"},{name:"Batak",bmp:"\u1bc0-\u1bf3\u1bfc-\u1bff"},{name:"Bengali",bmp:"\u0980-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09fb"}, -{name:"Bhaiksuki",astral:"\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc45\udc50-\udc6c]"},{name:"Bopomofo",bmp:"\u02ea\u02eb\u3105-\u312d\u31a0-\u31ba"},{name:"Brahmi",astral:"\ud804[\udc00-\udc4d\udc52-\udc6f\udc7f]"},{name:"Braille",bmp:"\u2800-\u28ff"},{name:"Buginese",bmp:"\u1a00-\u1a1b\u1a1e\u1a1f"},{name:"Buhid",bmp:"\u1740-\u1753"},{name:"Canadian_Aboriginal",bmp:"\u1400-\u167f\u18b0-\u18f5"},{name:"Carian",astral:"\ud800[\udea0-\uded0]"},{name:"Caucasian_Albanian",astral:"\ud801[\udd30-\udd63\udd6f]"}, -{name:"Chakma",astral:"\ud804[\udd00-\udd34\udd36-\udd43]"},{name:"Cham",bmp:"\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f"},{name:"Cherokee",bmp:"\u13a0-\u13f5\u13f8-\u13fd\uab70-\uabbf"},{name:"Common",bmp:"\x00-@\\x5B-`\\x7B-\u00a9\u00ab-\u00b9\u00bb-\u00bf\u00d7\u00f7\u02b9-\u02df\u02e5-\u02e9\u02ec-\u02ff\u0374\u037e\u0385\u0387\u0589\u0605\u060c\u061b\u061c\u061f\u0640\u06dd\u08e2\u0964\u0965\u0e3f\u0fd5-\u0fd8\u10fb\u16eb-\u16ed\u1735\u1736\u1802\u1803\u1805\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u2000-\u200b\u200e-\u2064\u2066-\u2070\u2074-\u207e\u2080-\u208e\u20a0-\u20be\u2100-\u2125\u2127-\u2129\u212c-\u2131\u2133-\u214d\u214f-\u215f\u2189-\u218b\u2190-\u23fe\u2400-\u2426\u2440-\u244a\u2460-\u27ff\u2900-\u2b73\u2b76-\u2b95\u2b98-\u2bb9\u2bbd-\u2bc8\u2bca-\u2bd1\u2bec-\u2bef\u2e00-\u2e44\u2ff0-\u2ffb\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303c-\u303f\u309b\u309c\u30a0\u30fb\u30fc\u3190-\u319f\u31c0-\u31e3\u3220-\u325f\u327f-\u32cf\u3358-\u33ff\u4dc0-\u4dff\ua700-\ua721\ua788-\ua78a\ua830-\ua839\ua92e\ua9cf\uab5b\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe66\ufe68-\ufe6b\ufeff\uff01-\uff20\uff3b-\uff40\uff5b-\uff65\uff70\uff9e\uff9f\uffe0-\uffe6\uffe8-\uffee\ufff9-\ufffd", -astral:"\ud800[\udd00-\udd02\udd07-\udd33\udd37-\udd3f\udd90-\udd9b\uddd0-\uddfc\udee1-\udefb]|\ud82f[\udca0-\udca3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd66\udd6a-\udd7a\udd83\udd84\udd8c-\udda9\uddae-\udde8\udf00-\udf56\udf60-\udf71]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udfcb\udfce-\udfff]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd00-\udd0c\udd10-\udd2e\udd30-\udd6b\udd70-\uddac\udde6-\uddff\ude01\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\udf00-\udfff]|\ud83d[\udc00-\uded2\udee0-\udeec\udef0-\udef6\udf00-\udf73\udf80-\udfd4]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udd10-\udd1e\udd20-\udd27\udd30\udd33-\udd3e\udd40-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|\udb40[\udc01\udc20-\udc7f]"}, -{name:"Coptic",bmp:"\u03e2-\u03ef\u2c80-\u2cf3\u2cf9-\u2cff"},{name:"Cuneiform",astral:"\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc70-\udc74\udc80-\udd43]"},{name:"Cypriot",astral:"\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f]"},{name:"Cyrillic",bmp:"\u0400-\u0484\u0487-\u052f\u1c80-\u1c88\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f"},{name:"Deseret",astral:"\ud801[\udc00-\udc4f]"},{name:"Devanagari",bmp:"\u0900-\u0950\u0953-\u0963\u0966-\u097f\ua8e0-\ua8fd"},{name:"Duployan", -astral:"\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9c-\udc9f]"},{name:"Egyptian_Hieroglyphs",astral:"\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]"},{name:"Elbasan",astral:"\ud801[\udd00-\udd27]"},{name:"Ethiopic",bmp:"\u1200-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u137c\u1380-\u1399\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e"}, -{name:"Georgian",bmp:"\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u10ff\u2d00-\u2d25\u2d27\u2d2d"},{name:"Glagolitic",bmp:"\u2c00-\u2c2e\u2c30-\u2c5e",astral:"\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a]"},{name:"Gothic",astral:"\ud800[\udf30-\udf4a]"},{name:"Grantha",astral:"\ud804[\udf00-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]"},{name:"Greek", -bmp:"\u0370-\u0373\u0375-\u0377\u037a-\u037d\u037f\u0384\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03e1\u03f0-\u03ff\u1d26-\u1d2a\u1d5d-\u1d61\u1d66-\u1d6a\u1dbf\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2126\uab65",astral:"\ud800[\udd40-\udd8e\udda0]|\ud834[\ude00-\ude45]"},{name:"Gujarati",bmp:"\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0af1\u0af9"}, -{name:"Gurmukhi",bmp:"\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75"},{name:"Han",bmp:"\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u3005\u3007\u3021-\u3029\u3038-\u303b\u3400-\u4db5\u4e00-\u9fd5\uf900-\ufa6d\ufa70-\ufad9",astral:"[\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872][\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1]|\ud87e[\udc00-\ude1d]"}, -{name:"Hangul",bmp:"\u1100-\u11ff\u302e\u302f\u3131-\u318e\u3200-\u321e\u3260-\u327e\ua960-\ua97c\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"},{name:"Hanunoo",bmp:"\u1720-\u1734"},{name:"Hatran",astral:"\ud802[\udce0-\udcf2\udcf4\udcf5\udcfb-\udcff]"},{name:"Hebrew",bmp:"\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufb4f"},{name:"Hiragana",bmp:"\u3041-\u3096\u309d-\u309f",astral:"\ud82c\udc01|\ud83c\ude00"}, -{name:"Imperial_Aramaic",astral:"\ud802[\udc40-\udc55\udc57-\udc5f]"},{name:"Inherited",bmp:"\u0300-\u036f\u0485\u0486\u064b-\u0655\u0670\u0951\u0952\u1ab0-\u1abe\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u200c\u200d\u20d0-\u20f0\u302a-\u302d\u3099\u309a\ufe00-\ufe0f\ufe20-\ufe2d",astral:"\ud800[\uddfd\udee0]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad]|\udb40[\udd00-\uddef]"},{name:"Inscriptional_Pahlavi",astral:"\ud802[\udf60-\udf72\udf78-\udf7f]"}, -{name:"Inscriptional_Parthian",astral:"\ud802[\udf40-\udf55\udf58-\udf5f]"},{name:"Javanese",bmp:"\ua980-\ua9cd\ua9d0-\ua9d9\ua9de\ua9df"},{name:"Kaithi",astral:"\ud804[\udc80-\udcc1]"},{name:"Kannada",bmp:"\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2"},{name:"Katakana",bmp:"\u30a1-\u30fa\u30fd-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff6f\uff71-\uff9d",astral:"\ud82c\udc00"}, -{name:"Kayah_Li",bmp:"\ua900-\ua92d\ua92f"},{name:"Kharoshthi",astral:"\ud802[\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f-\ude47\ude50-\ude58]"},{name:"Khmer",bmp:"\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9\u19e0-\u19ff"},{name:"Khojki",astral:"\ud804[\ude00-\ude11\ude13-\ude3e]"},{name:"Khudawadi",astral:"\ud804[\udeb0-\udeea\udef0-\udef9]"},{name:"Lao",bmp:"\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf"}, -{name:"Latin",bmp:"A-Za-z\u00aa\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a"},{name:"Lepcha",bmp:"\u1c00-\u1c37\u1c3b-\u1c49\u1c4d-\u1c4f"},{name:"Limbu",bmp:"\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1940\u1944-\u194f"}, -{name:"Linear_A",astral:"\ud801[\ude00-\udf36\udf40-\udf55\udf60-\udf67]"},{name:"Linear_B",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa]"},{name:"Lisu",bmp:"\ua4d0-\ua4ff"},{name:"Lycian",astral:"\ud800[\ude80-\ude9c]"},{name:"Lydian",astral:"\ud802[\udd20-\udd39\udd3f]"},{name:"Mahajani",astral:"\ud804[\udd50-\udd76]"},{name:"Malayalam",bmp:"\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4f\u0d54-\u0d63\u0d66-\u0d7f"}, -{name:"Mandaic",bmp:"\u0840-\u085b\u085e"},{name:"Manichaean",astral:"\ud802[\udec0-\udee6\udeeb-\udef6]"},{name:"Marchen",astral:"\ud807[\udc70-\udc8f\udc92-\udca7\udca9-\udcb6]"},{name:"Meetei_Mayek",bmp:"\uaae0-\uaaf6\uabc0-\uabed\uabf0-\uabf9"},{name:"Mende_Kikakui",astral:"\ud83a[\udc00-\udcc4\udcc7-\udcd6]"},{name:"Meroitic_Cursive",astral:"\ud802[\udda0-\uddb7\uddbc-\uddcf\uddd2-\uddff]"},{name:"Meroitic_Hieroglyphs",astral:"\ud802[\udd80-\udd9f]"},{name:"Miao",astral:"\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]"}, -{name:"Modi",astral:"\ud805[\ude00-\ude44\ude50-\ude59]"},{name:"Mongolian",bmp:"\u1800\u1801\u1804\u1806-\u180e\u1810-\u1819\u1820-\u1877\u1880-\u18aa",astral:"\ud805[\ude60-\ude6c]"},{name:"Mro",astral:"\ud81a[\ude40-\ude5e\ude60-\ude69\ude6e\ude6f]"},{name:"Multani",astral:"\ud804[\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea9]"},{name:"Myanmar",bmp:"\u1000-\u109f\ua9e0-\ua9fe\uaa60-\uaa7f"},{name:"Nabataean",astral:"\ud802[\udc80-\udc9e\udca7-\udcaf]"},{name:"New_Tai_Lue",bmp:"\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de\u19df"}, -{name:"Newa",astral:"\ud805[\udc00-\udc59\udc5b\udc5d]"},{name:"Nko",bmp:"\u07c0-\u07fa"},{name:"Ogham",bmp:"\u1680-\u169c"},{name:"Ol_Chiki",bmp:"\u1c50-\u1c7f"},{name:"Old_Hungarian",astral:"\ud803[\udc80-\udcb2\udcc0-\udcf2\udcfa-\udcff]"},{name:"Old_Italic",astral:"\ud800[\udf00-\udf23]"},{name:"Old_North_Arabian",astral:"\ud802[\ude80-\ude9f]"},{name:"Old_Permic",astral:"\ud800[\udf50-\udf7a]"},{name:"Old_Persian",astral:"\ud800[\udfa0-\udfc3\udfc8-\udfd5]"},{name:"Old_South_Arabian",astral:"\ud802[\ude60-\ude7f]"}, -{name:"Old_Turkic",astral:"\ud803[\udc00-\udc48]"},{name:"Oriya",bmp:"\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b77"},{name:"Osage",astral:"\ud801[\udcb0-\udcd3\udcd8-\udcfb]"},{name:"Osmanya",astral:"\ud801[\udc80-\udc9d\udca0-\udca9]"},{name:"Pahawh_Hmong",astral:"\ud81a[\udf00-\udf45\udf50-\udf59\udf5b-\udf61\udf63-\udf77\udf7d-\udf8f]"},{name:"Palmyrene",astral:"\ud802[\udc60-\udc7f]"}, -{name:"Pau_Cin_Hau",astral:"\ud806[\udec0-\udef8]"},{name:"Phags_Pa",bmp:"\ua840-\ua877"},{name:"Phoenician",astral:"\ud802[\udd00-\udd1b\udd1f]"},{name:"Psalter_Pahlavi",astral:"\ud802[\udf80-\udf91\udf99-\udf9c\udfa9-\udfaf]"},{name:"Rejang",bmp:"\ua930-\ua953\ua95f"},{name:"Runic",bmp:"\u16a0-\u16ea\u16ee-\u16f8"},{name:"Samaritan",bmp:"\u0800-\u082d\u0830-\u083e"},{name:"Saurashtra",bmp:"\ua880-\ua8c5\ua8ce-\ua8d9"},{name:"Sharada",astral:"\ud804[\udd80-\uddcd\uddd0-\udddf]"},{name:"Shavian", -astral:"\ud801[\udc50-\udc7f]"},{name:"Siddham",astral:"\ud805[\udd80-\uddb5\uddb8-\udddd]"},{name:"SignWriting",astral:"\ud836[\udc00-\ude8b\ude9b-\ude9f\udea1-\udeaf]"},{name:"Sinhala",bmp:"\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df4",astral:"\ud804[\udde1-\uddf4]"},{name:"Sora_Sompeng",astral:"\ud804[\udcd0-\udce8\udcf0-\udcf9]"},{name:"Sundanese",bmp:"\u1b80-\u1bbf\u1cc0-\u1cc7"},{name:"Syloti_Nagri",bmp:"\ua800-\ua82b"}, -{name:"Syriac",bmp:"\u0700-\u070d\u070f-\u074a\u074d-\u074f"},{name:"Tagalog",bmp:"\u1700-\u170c\u170e-\u1714"},{name:"Tagbanwa",bmp:"\u1760-\u176c\u176e-\u1770\u1772\u1773"},{name:"Tai_Le",bmp:"\u1950-\u196d\u1970-\u1974"},{name:"Tai_Tham",bmp:"\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad"},{name:"Tai_Viet",bmp:"\uaa80-\uaac2\uaadb-\uaadf"},{name:"Takri",astral:"\ud805[\ude80-\udeb7\udec0-\udec9]"},{name:"Tamil",bmp:"\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa"}, -{name:"Tangut",astral:"\ud81b\udfe0|[\ud81c-\ud820][\udc00-\udfff]|\ud821[\udc00-\udfec]|\ud822[\udc00-\udef2]"},{name:"Telugu",bmp:"\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f"},{name:"Thaana",bmp:"\u0780-\u07b1"},{name:"Thai",bmp:"\u0e01-\u0e3a\u0e40-\u0e5b"},{name:"Tibetan",bmp:"\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc\u0fce-\u0fd4\u0fd9\u0fda"}, -{name:"Tifinagh",bmp:"\u2d30-\u2d67\u2d6f\u2d70\u2d7f"},{name:"Tirhuta",astral:"\ud805[\udc80-\udcc7\udcd0-\udcd9]"},{name:"Ugaritic",astral:"\ud800[\udf80-\udf9d\udf9f]"},{name:"Vai",bmp:"\ua500-\ua62b"},{name:"Warang_Citi",astral:"\ud806[\udca0-\udcf2\udcff]"},{name:"Yi",bmp:"\ua000-\ua48c\ua490-\ua4c6"}])}},{}],8:[function(d,g,p){p=d("./xregexp");d("./addons/build")(p);d("./addons/matchrecursive")(p);d("./addons/unicode-base")(p);d("./addons/unicode-blocks")(p);d("./addons/unicode-categories")(p); -d("./addons/unicode-properties")(p);d("./addons/unicode-scripts")(p);g.exports=p},{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9}],9:[function(d,g,p){function c(a){var e=!0;try{RegExp("",a)}catch(u){e=!1}return e}function A(a,e,u,b,c){var J;a.xregexp={captureNames:e};if(c)return a;if(a.__proto__)a.__proto__=f.prototype;else for(J in f.prototype)a[J]= -f.prototype[J];a.xregexp.source=u;a.xregexp.flags=b?b.split("").sort().join(""):b;return a}function B(a){return n.replace.call(a,/([\s\S])(?=[\s\S]*\1)/g,"")}function z(a,e){if(!f.isRegExp(a))throw new TypeError("Type RegExp expected");var u=a.xregexp||{},b=Q?a.flags:n.exec.call(/\/([a-z]*)$/i,RegExp.prototype.toString.call(a))[1],c="",d="",E=null,h=null;e=e||{};e.removeG&&(d+="g");e.removeY&&(d+="y");d&&(b=n.replace.call(b,new RegExp("["+d+"]+","g"),""));e.addG&&(c+="g");e.addY&&(c+="y");c&&(b=B(b+ -c));e.isInternalOnly||(void 0!==u.source&&(E=u.source),null!=u.flags&&(h=c?B(u.flags+c):u.flags));return a=A(new RegExp(e.source||a.source,b),a.xregexp&&a.xregexp.captureNames?u.captureNames.slice(0):null,E,h,e.isInternalOnly)}function l(a){return parseInt(a,16)}function b(a,e,b){(e="("===a.input.charAt(a.index-1)||")"===a.input.charAt(a.index+a[0].length))||(e=a.input,a=a.index+a[0].length,b=-1<b.indexOf("x")?["\\s","#[^#\\n]*","\\(\\?#[^)]*\\)"]:["\\(\\?#[^)]*\\)"],e=n.test.call(new RegExp("^(?:"+ -b.join("|")+")*(?:[?*+]|{\\d+(?:,\\d*)?})"),e.slice(a)));return e?"":"(?:)"}function k(a){return parseInt(a,10).toString(16)}function C(a,e){var b=a.length,c;for(c=0;c<b;++c)if(a[c]===e)return c;return-1}function y(a,e){return L.call(a)==="[object "+e+"]"}function m(a){for(;4>a.length;)a="0"+a;return a}function h(a,e){var b;if(B(e)!==e)throw new SyntaxError("Invalid duplicate regex flag "+e);a=n.replace.call(a,/^\(\?([\w$]+)\)/,function(a,b){if(n.test.call(/[gy]/,b))throw new SyntaxError("Cannot use flag g or y in mode modifier "+ -a);e=B(e+b);return""});for(b=0;b<e.length;++b)if(!N[e.charAt(b)])throw new SyntaxError("Unknown regex flag "+e.charAt(b));return{pattern:a,flags:e}}function w(a){var e={};return y(a,"String")?(f.forEach(a,/[^\s,]+/,function(a){e[a]=!0}),e):a}function x(a){if(!/^[\w$]$/.test(a))throw Error("Flag must be a single character A-Za-z0-9_$");N[a]=!0}function v(a){RegExp.prototype.exec=(a?r:n).exec;RegExp.prototype.test=(a?r:n).test;String.prototype.match=(a?r:n).match;String.prototype.replace=(a?r:n).replace; -String.prototype.split=(a?r:n).split;D.natives=a}function q(a){if(null==a)throw new TypeError("Cannot convert null or undefined to object");return a}function f(a,e){if(f.isRegExp(a)){if(void 0!==e)throw new TypeError("Cannot supply flags when copying a RegExp");return z(a)}a=void 0===a?"":String(a);e=void 0===e?"":String(e);f.isInstalled("astral")&&-1===e.indexOf("A")&&(e+="A");F[a]||(F[a]={});if(!F[a][e]){var b={hasNamedCapture:!1,captureNames:[]},c="default",d="",g=0,E=h(a,e),k=E.pattern;for(E= -E.flags;g<k.length;){do{for(var l,m=k,p=E,q=g,r=c,v=b,w=I.length,x=m.charAt(q),y=null;w--;){var t=I[w];if(!(t.leadChar&&t.leadChar!==x||t.scope!==r&&"all"!==t.scope||t.flag&&-1===p.indexOf(t.flag))&&(l=f.exec(m,t.regex,q,"sticky"))){y={matchLength:l[0].length,output:t.handler.call(v,l,r,p),reparse:t.reparse};break}}(t=y)&&t.reparse&&(k=k.slice(0,g)+t.output+k.slice(g+t.matchLength))}while(t&&t.reparse);t?(d+=t.output,g+=t.matchLength||1):(t=f.exec(k,O[c],g,"sticky")[0],d+=t,g+=t.length,"["===t&&"default"=== -c?c="class":"]"===t&&"class"===c&&(c="default"))}F[a][e]={pattern:n.replace.call(d,/(?:\(\?:\))+/g,"(?:)"),flags:n.replace.call(E,/[^gimuy]+/g,""),captures:b.hasNamedCapture?b.captureNames:null}}b=F[a][e];return A(new RegExp(b.pattern,b.flags),b.captures,a,e)}var D={astral:!1,natives:!1},n={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},r={},G={},F={},I=[],O={"default":/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/, -"class":/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},P=/\$(?:{([\w$]+)}|(\d\d?|[\s\S]))/g,R=void 0===n.exec.call(/()??/,"")[1],Q=void 0!==/x/.flags,L={}.toString,M=c("u"),K=c("y"),N={g:!0,i:!0,m:!0,u:M,y:K};f.prototype=RegExp();f.version="3.2.0";f._clipDuplicates=B;f._hasNativeFlag=c;f._dec=l;f._hex=k;f._pad4=m;f.addToken=function(a,e,b){b=b||{};var c=b.optionalFlags,d;b.flag&&x(b.flag);if(c)for(c=n.split.call(c,""),d=0;d<c.length;++d)x(c[d]); -I.push({regex:z(a,{addG:!0,addY:K,isInternalOnly:!0}),handler:e,scope:b.scope||"default",flag:b.flag,reparse:b.reparse,leadChar:b.leadChar});f.cache.flush("patterns")};f.cache=function(a,b){G[a]||(G[a]={});return G[a][b]||(G[a][b]=f(a,b))};f.cache.flush=function(a){"patterns"===a?F={}:G={}};f.escape=function(a){return n.replace.call(q(a),/[-\[\]{}()*+?.,\\^$|#\s]/g,"\\$&")};f.exec=function(a,b,c,d){var e="g",f,u=!1;(f=K&&!!(d||b.sticky&&!1!==d))?e+="y":d&&(u=!0,e+="FakeY");b.xregexp=b.xregexp||{}; -d=b.xregexp[e]||(b.xregexp[e]=z(b,{addG:!0,addY:f,source:u?b.source+"|()":void 0,removeY:!1===d,isInternalOnly:!0}));d.lastIndex=c||0;a=r.exec.call(d,a);u&&a&&""===a.pop()&&(a=null);b.global&&(b.lastIndex=a?d.lastIndex:0);return a};f.forEach=function(a,b,c){for(var e=0,d=-1;e=f.exec(a,b,e);)c(e,++d,a,b),e=e.index+(e[0].length||1)};f.globalize=function(a){return z(a,{addG:!0})};f.install=function(a){a=w(a);!D.astral&&a.astral&&(D.astral=!0);!D.natives&&a.natives&&v(!0)};f.isInstalled=function(a){return!!D[a]}; -f.isRegExp=function(a){return"[object RegExp]"===L.call(a)};f.match=function(a,b,c){var e=b.global&&"one"!==c||"all"===c,d=(e?"g":"")+(b.sticky?"y":"")||"noGY";b.xregexp=b.xregexp||{};d=b.xregexp[d]||(b.xregexp[d]=z(b,{addG:!!e,removeG:"one"===c,isInternalOnly:!0}));a=n.match.call(q(a),d);b.global&&(b.lastIndex="one"===c&&a?a.index+a[0].length:0);return e?a||[]:a&&a[0]};f.matchChain=function(a,b){return function S(a,e){function c(a){if(d.backref){if(!(a.hasOwnProperty(d.backref)||+d.backref<a.length))throw new ReferenceError("Backreference to undefined group: "+ -d.backref);g.push(a[d.backref]||"")}else g.push(a[0])}for(var d=b[e].regex?b[e]:{regex:b[e]},g=[],h=0;h<a.length;++h)f.forEach(a[h],d.regex,c);return e!==b.length-1&&g.length?S(g,e+1):g}([a],0)};f.replace=function(a,b,c,d){var e=f.isRegExp(b),g=b.global&&"one"!==d||"all"===d,h=(g?"g":"")+(b.sticky?"y":"")||"noGY",u=b;e?(b.xregexp=b.xregexp||{},u=b.xregexp[h]||(b.xregexp[h]=z(b,{addG:!!g,removeG:"one"===d,isInternalOnly:!0}))):g&&(u=new RegExp(f.escape(String(b)),"g"));a=r.replace.call(q(a),u,c);e&& -b.global&&(b.lastIndex=0);return a};f.replaceEach=function(a,b){var c;for(c=0;c<b.length;++c){var e=b[c];a=f.replace(a,e[0],e[1],e[2])}return a};f.split=function(a,b,c){return r.split.call(q(a),b,c)};f.test=function(a,b,c,d){return!!f.exec(a,b,c,d)};f.uninstall=function(a){a=w(a);D.astral&&a.astral&&(D.astral=!1);D.natives&&a.natives&&v(!1)};f.union=function(a,b,c){function d(a,b,c){var d=m[e-u];if(b){if(++e,d)return"(?<"+d+">"}else if(c)return"\\"+(+c+u);return a}c=c||{};c=c.conjunction||"or";var e= -0;if(!y(a,"Array")||!a.length)throw new TypeError("Must provide a nonempty array of patterns to merge");for(var g=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,h=[],k,l=0;l<a.length;++l)if(k=a[l],f.isRegExp(k)){var u=e;var m=k.xregexp&&k.xregexp.captureNames||[];h.push(n.replace.call(f(k.source).source,g,d))}else h.push(f.escape(k));return f(h.join("none"===c?"":"|"),b)};r.exec=function(a){var b=this.lastIndex,c=n.exec.apply(this,arguments),d;if(c){if(!R&&1<c.length&&-1<C(c,"")){var f= -z(this,{removeG:!0,isInternalOnly:!0});n.replace.call(String(a).slice(c.index),f,function(){var a=arguments.length,b;for(b=1;b<a-2;++b)void 0===arguments[b]&&(c[b]=void 0)})}if(this.xregexp&&this.xregexp.captureNames)for(d=1;d<c.length;++d)(f=this.xregexp.captureNames[d-1])&&(c[f]=c[d]);this.global&&!c[0].length&&this.lastIndex>c.index&&(this.lastIndex=c.index)}this.global||(this.lastIndex=b);return c};r.test=function(a){return!!r.exec.call(this,a)};r.match=function(a){if(!f.isRegExp(a))a=new RegExp(a); -else if(a.global){var b=n.match.apply(this,arguments);a.lastIndex=0;return b}return r.exec.call(a,q(this))};r.replace=function(a,b){var c=f.isRegExp(a);if(c){if(a.xregexp)var d=a.xregexp.captureNames;var e=a.lastIndex}else a+="";var g=y(b,"Function")?n.replace.call(String(this),a,function(){var e=arguments,f;if(d)for(e[0]=new String(e[0]),f=0;f<d.length;++f)d[f]&&(e[0][d[f]]=e[f+1]);c&&a.global&&(a.lastIndex=e[e.length-2]+e[0].length);return b.apply(void 0,e)}):n.replace.call(null==this?this:String(this), -a,function(){var a=arguments;return n.replace.call(String(b),P,function(b,c,e){if(c){e=+c;if(e<=a.length-3)return a[e]||"";e=d?C(d,c):-1;if(0>e)throw new SyntaxError("Backreference to undefined group "+b);return a[e+1]||""}if("$"===e)return"$";if("&"===e||0===+e)return a[0];if("`"===e)return a[a.length-1].slice(0,a[a.length-2]);if("'"===e)return a[a.length-1].slice(a[a.length-2]+a[0].length);e=+e;if(!isNaN(e)){if(e>a.length-3)throw new SyntaxError("Backreference to undefined group "+b);return a[e]|| -""}throw new SyntaxError("Invalid token "+b);})});c&&(a.lastIndex=a.global?0:e);return g};r.split=function(a,b){if(!f.isRegExp(a))return n.split.apply(this,arguments);var c=String(this),d=[],e=a.lastIndex,g=0,h;b=(void 0===b?-1:b)>>>0;f.forEach(c,a,function(a){a.index+a[0].length>g&&(d.push(c.slice(g,a.index)),1<a.length&&a.index<c.length&&Array.prototype.push.apply(d,a.slice(1)),h=a[0].length,g=a.index+h)});g===c.length?(!n.test.call(a,"")||h)&&d.push(""):d.push(c.slice(g));a.lastIndex=e;return d.length> -b?d.slice(0,b):d};f.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,function(a,b){if("B"===a[1]&&"default"===b)return a[0];throw new SyntaxError("Invalid escape "+a[0]);},{scope:"all",leadChar:"\\"});f.addToken(/\\u{([\dA-Fa-f]+)}/,function(a,b,c){b=l(a[1]);if(1114111<b)throw new SyntaxError("Invalid Unicode code point "+a[0]);if(65535>=b)return"\\u"+m(k(b));if(M&&-1<c.indexOf("u"))return a[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u"); -},{scope:"all",leadChar:"\\"});f.addToken(/\[(\^?)\]/,function(a){return a[1]?"[\\s\\S]":"\\b\\B"},{leadChar:"["});f.addToken(/\(\?#[^)]*\)/,b,{leadChar:"("});f.addToken(/\s+|#[^\n]*\n?/,b,{flag:"x"});f.addToken(/\./,function(){return"[\\s\\S]"},{flag:"s",leadChar:"."});f.addToken(/\\k<([\w$]+)>/,function(a){var b=isNaN(a[1])?C(this.captureNames,a[1])+1:+a[1],c=a.index+a[0].length;if(!b||b>this.captureNames.length)throw new SyntaxError("Backreference to undefined group "+a[0]);return"\\"+b+(c===a.input.length|| -isNaN(a.input.charAt(c))?"":"(?:)")},{leadChar:"\\"});f.addToken(/\\(\d+)/,function(a,b){if(!("default"===b&&/^[1-9]/.test(a[1])&&+a[1]<=this.captureNames.length)&&"0"!==a[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group "+a[0]);return a[0]},{scope:"all",leadChar:"\\"});f.addToken(/\(\?P?<([\w$]+)>/,function(a){if(!isNaN(a[1]))throw new SyntaxError("Cannot use integer as capture name "+a[0]);if("length"===a[1]||"__proto__"===a[1])throw new SyntaxError("Cannot use reserved word as capture name "+ -a[0]);if(-1<C(this.captureNames,a[1]))throw new SyntaxError("Cannot use same name for multiple groups "+a[0]);this.captureNames.push(a[1]);this.hasNamedCapture=!0;return"("},{leadChar:"("});f.addToken(/\((?!\?)/,function(a,b,c){if(-1<c.indexOf("n"))return"(?:";this.captureNames.push(null);return"("},{optionalFlags:"n",leadChar:"("});g.exports=f},{}]},{},[8])(8)}); +!function(u){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=u();else if("function"==typeof define&&define.amd)define([],u);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).XRegExp=u()}}((function(){return function r(u,d,t){function o(c,i){if(!d[c]){if(!u[c]){var l="function"==typeof require&&require;if(!i&&l)return l(c,!0);if(a)return a(c,!0);var D=new Error("Cannot find module '"+c+"'");throw D.code="MODULE_NOT_FOUND",D}var p=d[c]={exports:{}};u[c][0].call(p.exports,(function(d){return o(u[c][1][d]||d)}),p,p.exports,r,u,d,t)}return d[c].exports}for(var a="function"==typeof require&&require,c=0;c<t.length;c++)o(t[c]);return o}({1:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} +/*! + * XRegExp Unicode Base 5.1.1 + * <xregexp.com> + * Steven Levithan (c) 2008-present MIT License + */t.default=function _default(u){var d={},t={},a=u._dec,c=u._hex,i=u._pad4;function normalize(u){return u.replace(/[- _]+/g,"").toLowerCase()}function charCode(u){var d=/^\\[xu](.+)/.exec(u);return d?a(d[1]):u.charCodeAt("\\"===u[0]?1:0)}function cacheInvertedBmp(t){return d[t]["b!"]||(d[t]["b!"]=function invertBmp(d){var t="",a=-1;return(0,m.default)(u).call(u,d,/(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,(function(u){var d=charCode(u[1]);d>a+1&&(t+="\\u".concat(i(c(a+1))),d>a+2&&(t+="-\\u".concat(i(c(d-1))))),a=charCode(u[2]||u[1])})),a<65535&&(t+="\\u".concat(i(c(a+1))),a<65534&&(t+="-\\uFFFF")),t}(d[t].bmp))}function cacheAstral(u,t){var a=t?"a!":"a=";return d[u][a]||(d[u][a]=function buildAstral(u,t){var a,c,i=d[u],l="";return i.bmp&&!i.isBmpLast&&(l=(0,A.default)(a="[".concat(i.bmp,"]")).call(a,i.astral?"|":"")),i.astral&&(l+=i.astral),i.isBmpLast&&i.bmp&&(l+=(0,A.default)(c="".concat(i.astral?"|":"","[")).call(c,i.bmp,"]")),t?"(?:(?!".concat(l,")(?:[\ud800-\udbff][\udc00-\udfff]|[\0-￿]))"):"(?:".concat(l,")")}(u,t))}u.addToken(/\\([pP])(?:{(\^?)(?:(\w+)=)?([^}]*)}|([A-Za-z]))/,(function(u,a,c){var i="Unknown Unicode token ",l=(0,y.default)(u,6),D=l[0],p=l[1],b=l[2],m=l[3],C=l[4],g=l[5],h="P"===p||!!b,x=-1!==(0,E.default)(c).call(c,"A"),v=normalize(g||C),B=d[v];if("P"===p&&b)throw new SyntaxError("Invalid double negation "+D);if(!d.hasOwnProperty(v))throw new SyntaxError(i+D);if(m&&(!t[m]||!t[m][v]))throw new SyntaxError(i+D);if(B.inverseOf){var w;if(v=normalize(B.inverseOf),!d.hasOwnProperty(v))throw new ReferenceError((0,A.default)(w="".concat("Unicode token missing data "+D," -> ")).call(w,B.inverseOf));B=d[v],h=!h}if(!B.bmp&&!x)throw new SyntaxError("Astral mode required for Unicode token "+D);if(x){if("class"===a)throw new SyntaxError("Astral mode does not support Unicode tokens within character classes");return cacheAstral(v,h)}return"class"===a?h?cacheInvertedBmp(v):B.bmp:"".concat((h?"[^":"[")+B.bmp,"]")}),{scope:"all",optionalFlags:"A",leadChar:"\\"}),u.addUnicodeData=function(a,c){c&&(t[c]={});var i,l=_createForOfIteratorHelper(a);try{for(l.s();!(i=l.n()).done;){var D=i.value;if(!D.name)throw new Error("Unicode token requires name");if(!(D.inverseOf||D.bmp||D.astral))throw new Error("Unicode token has no character data "+D.name);var p=normalize(D.name);if(d[p]=D,c&&(t[c][p]=!0),D.alias){var b=normalize(D.alias);d[b]=D,c&&(t[c][b]=!0)}}}catch(u){l.e(u)}finally{l.f()}u.cache.flush("patterns")},u._getUnicodeProperty=function(u){var t=normalize(u);return d[t]}},d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],2:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("../../tools/output/categories")); +/*! + * XRegExp Unicode Categories 5.1.1 + * <xregexp.com> + * Steven Levithan (c) 2010-present MIT License + * Unicode data by Mathias Bynens <mathiasbynens.be> + */t.default=function _default(u){if(!u.addUnicodeData)throw new ReferenceError("Unicode Base must be loaded before Unicode Categories");u.addUnicodeData(i.default)},d.exports=t.default},{"../../tools/output/categories":222,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],3:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),c=u("@babel/runtime-corejs3/helpers/interopRequireDefault");a(t,"__esModule",{value:!0}),t.default=void 0;var i=c(u("./xregexp")),l=c(u("./addons/unicode-base")),D=c(u("./addons/unicode-categories"));(0,l.default)(i.default),(0,D.default)(i.default);var p=i.default;t.default=p,d.exports=t.default},{"./addons/unicode-base":1,"./addons/unicode-categories":2,"./xregexp":4,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/helpers/interopRequireDefault":24}],4:[function(u,d,t){"use strict";var a=u("@babel/runtime-corejs3/core-js-stable/instance/slice"),c=u("@babel/runtime-corejs3/core-js-stable/array/from"),i=u("@babel/runtime-corejs3/core-js-stable/symbol"),l=u("@babel/runtime-corejs3/core-js/get-iterator-method"),D=u("@babel/runtime-corejs3/core-js-stable/array/is-array"),p=u("@babel/runtime-corejs3/core-js-stable/object/define-property"),b=u("@babel/runtime-corejs3/helpers/interopRequireDefault");p(t,"__esModule",{value:!0}),t.default=void 0;var y=b(u("@babel/runtime-corejs3/helpers/slicedToArray")),m=b(u("@babel/runtime-corejs3/core-js-stable/instance/flags")),A=b(u("@babel/runtime-corejs3/core-js-stable/instance/sort")),E=b(u("@babel/runtime-corejs3/core-js-stable/instance/slice")),C=b(u("@babel/runtime-corejs3/core-js-stable/parse-int")),g=b(u("@babel/runtime-corejs3/core-js-stable/instance/index-of")),h=b(u("@babel/runtime-corejs3/core-js-stable/instance/for-each")),x=b(u("@babel/runtime-corejs3/core-js-stable/object/create")),v=b(u("@babel/runtime-corejs3/core-js-stable/instance/concat"));function _createForOfIteratorHelper(u,d){var t=void 0!==i&&l(u)||u["@@iterator"];if(!t){if(D(u)||(t=function _unsupportedIterableToArray(u,d){var t;if(!u)return;if("string"==typeof u)return _arrayLikeToArray(u,d);var i=a(t=Object.prototype.toString.call(u)).call(t,8,-1);"Object"===i&&u.constructor&&(i=u.constructor.name);if("Map"===i||"Set"===i)return c(u);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return _arrayLikeToArray(u,d)}(u))||d&&u&&"number"==typeof u.length){t&&(u=t);var p=0,b=function F(){};return{s:b,n:function n(){return p>=u.length?{done:!0}:{done:!1,value:u[p++]}},e:function e(u){throw u},f:b}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var y,m=!0,A=!1;return{s:function s(){t=t.call(u)},n:function n(){var u=t.next();return m=u.done,u},e:function e(u){A=!0,y=u},f:function f(){try{m||null==t.return||t.return()}finally{if(A)throw y}}}}function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a} +/*! + * XRegExp 5.1.1 + * <xregexp.com> + * Steven Levithan (c) 2007-present MIT License + */var B={astral:!1,namespacing:!0},w={},j={},k={},S=[],O="default",R="class",_={default:/\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,class:/\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/},T=/\$(?:\{([^\}]+)\}|<([^>]+)>|(\d\d?|[\s\S]?))/g,I=void 0===/()??/.exec("")[1],P=void 0!==(0,m.default)(/x/);function hasNativeFlag(u){var d=!0;try{if(new RegExp("",u),"y"===u){".."===".a".replace(new RegExp("a","gy"),".")&&(d=!1)}}catch(u){d=!1}return d}var X=hasNativeFlag("d"),L=hasNativeFlag("s"),N=hasNativeFlag("u"),M=hasNativeFlag("y"),U={d:X,g:!0,i:!0,m:!0,s:L,u:N,y:M},G=L?/[^dgimsuy]+/g:/[^dgimuy]+/g;function augment(u,d,t,a,c){var i;if(u.xregexp={captureNames:d},c)return u;if(u.__proto__)u.__proto__=XRegExp.prototype;else for(var l in XRegExp.prototype)u[l]=XRegExp.prototype[l];return u.xregexp.source=t,u.xregexp.flags=a?(0,A.default)(i=a.split("")).call(i).join(""):a,u}function clipDuplicates(u){return u.replace(/([\s\S])(?=[\s\S]*\1)/g,"")}function copyRegex(u,d){var t;if(!XRegExp.isRegExp(u))throw new TypeError("Type RegExp expected");var a=u.xregexp||{},c=function getNativeFlags(u){return P?(0,m.default)(u):/\/([a-z]*)$/i.exec(RegExp.prototype.toString.call(u))[1]}(u),i="",l="",D=null,p=null;return(d=d||{}).removeG&&(l+="g"),d.removeY&&(l+="y"),l&&(c=c.replace(new RegExp("[".concat(l,"]+"),"g"),"")),d.addG&&(i+="g"),d.addY&&(i+="y"),i&&(c=clipDuplicates(c+i)),d.isInternalOnly||(void 0!==a.source&&(D=a.source),null!=(0,m.default)(a)&&(p=i?clipDuplicates((0,m.default)(a)+i):(0,m.default)(a))),u=augment(new RegExp(d.source||u.source,c),function hasNamedCapture(u){return!(!u.xregexp||!u.xregexp.captureNames)}(u)?(0,E.default)(t=a.captureNames).call(t,0):null,D,p,d.isInternalOnly)}function dec(u){return(0,C.default)(u,16)}function getContextualTokenSeparator(u,d,t){var a=u.index+u[0].length,c=u.input[u.index-1],i=u.input[a];return/^[()|]$/.test(c)||/^[()|]$/.test(i)||0===u.index||a===u.input.length||/\(\?(?:[:=!]|<[=!])$/.test(u.input.substring(u.index-4,u.index))||function isQuantifierNext(u,d,t){return(-1!==(0,g.default)(t).call(t,"x")?/^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/:/^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/).test((0,E.default)(u).call(u,d))}(u.input,a,t)?"":"(?:)"}function hex(u){return(0,C.default)(u,10).toString(16)}function isType(u,d){return Object.prototype.toString.call(u)==="[object ".concat(d,"]")}function nullThrows(u){if(null==u)throw new TypeError("Cannot convert null or undefined to object");return u}function pad4(u){for(;u.length<4;)u="0".concat(u);return u}function prepareOptions(u){var d={};return isType(u,"String")?((0,h.default)(XRegExp).call(XRegExp,u,/[^\s,]+/,(function(u){d[u]=!0})),d):u}function registerFlag(u){if(!/^[\w$]$/.test(u))throw new Error("Flag must be a single character A-Za-z0-9_$");U[u]=!0}function runTokens(u,d,t,a,c){for(var i,l,D=S.length,p=u[t],b=null;D--;)if(!((l=S[D]).leadChar&&l.leadChar!==p||l.scope!==a&&"all"!==l.scope||l.flag&&-1===(0,g.default)(d).call(d,l.flag))&&(i=XRegExp.exec(u,l.regex,t,"sticky"))){b={matchLength:i[0].length,output:l.handler.call(c,i,a,d),reparse:l.reparse};break}return b}function setAstral(u){B.astral=u}function setNamespacing(u){B.namespacing=u}function XRegExp(u,d){if(XRegExp.isRegExp(u)){if(void 0!==d)throw new TypeError("Cannot supply flags when copying a RegExp");return copyRegex(u)}if(u=void 0===u?"":String(u),d=void 0===d?"":String(d),XRegExp.isInstalled("astral")&&-1===(0,g.default)(d).call(d,"A")&&(d+="A"),k[u]||(k[u]={}),!k[u][d]){for(var t,a={hasNamedCapture:!1,captureNames:[]},c=O,i="",l=0,D=function prepareFlags(u,d){if(clipDuplicates(d)!==d)throw new SyntaxError("Invalid duplicate regex flag ".concat(d));u=u.replace(/^\(\?([\w$]+)\)/,(function(u,t){if(/[dgy]/.test(t))throw new SyntaxError("Cannot use flags dgy in mode modifier ".concat(u));return d=clipDuplicates(d+t),""}));var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;if(!U[c])throw new SyntaxError("Unknown regex flag ".concat(c))}}catch(u){a.e(u)}finally{a.f()}return{pattern:u,flags:d}}(u,d),p=D.pattern,b=(0,m.default)(D);l<p.length;){do{(t=runTokens(p,b,l,c,a))&&t.reparse&&(p=(0,E.default)(p).call(p,0,l)+t.output+(0,E.default)(p).call(p,l+t.matchLength))}while(t&&t.reparse);if(t)i+=t.output,l+=t.matchLength||1;else{var A=XRegExp.exec(p,_[c],l,"sticky"),C=(0,y.default)(A,1)[0];i+=C,l+=C.length,"["===C&&c===O?c=R:"]"===C&&c===R&&(c=O)}}k[u][d]={pattern:i.replace(/(?:\(\?:\))+/g,"(?:)"),flags:b.replace(G,""),captures:a.hasNamedCapture?a.captureNames:null}}var h=k[u][d];return augment(new RegExp(h.pattern,(0,m.default)(h)),h.captures,u,d)}XRegExp.prototype=/(?:)/,XRegExp.version="5.1.1",XRegExp._clipDuplicates=clipDuplicates,XRegExp._hasNativeFlag=hasNativeFlag,XRegExp._dec=dec,XRegExp._hex=hex,XRegExp._pad4=pad4,XRegExp.addToken=function(u,d,t){var a=(t=t||{}).optionalFlags;if(t.flag&®isterFlag(t.flag),a){var c,i=_createForOfIteratorHelper(a=a.split(""));try{for(i.s();!(c=i.n()).done;){registerFlag(c.value)}}catch(u){i.e(u)}finally{i.f()}}S.push({regex:copyRegex(u,{addG:!0,addY:M,isInternalOnly:!0}),handler:d,scope:t.scope||O,flag:t.flag,reparse:t.reparse,leadChar:t.leadChar}),XRegExp.cache.flush("patterns")},XRegExp.cache=function(u,d){return j[u]||(j[u]={}),j[u][d]||(j[u][d]=XRegExp(u,d))},XRegExp.cache.flush=function(u){"patterns"===u?k={}:j={}},XRegExp.escape=function(u){return String(nullThrows(u)).replace(/[\\\[\]{}()*+?.^$|]/g,"\\$&").replace(/[\s#\-,]/g,(function(u){return"\\u".concat(pad4(hex(u.charCodeAt(0))))}))},XRegExp.exec=function(u,d,t,a){var c,i,l="g",D=!1;(c=M&&!!(a||d.sticky&&!1!==a))?l+="y":a&&(D=!0,l+="FakeY"),d.xregexp=d.xregexp||{};var p=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!0,addY:c,source:D?"".concat(d.source,"|()"):void 0,removeY:!1===a,isInternalOnly:!0}));return t=t||0,p.lastIndex=t,i=w.exec.call(p,u),D&&i&&""===i.pop()&&(i=null),d.global&&(d.lastIndex=i?p.lastIndex:0),i},XRegExp.forEach=function(u,d,t){for(var a,c=0,i=-1;a=XRegExp.exec(u,d,c);)t(a,++i,u,d),c=a.index+(a[0].length||1)},XRegExp.globalize=function(u){return copyRegex(u,{addG:!0})},XRegExp.install=function(u){u=prepareOptions(u),!B.astral&&u.astral&&setAstral(!0),!B.namespacing&&u.namespacing&&setNamespacing(!0)},XRegExp.isInstalled=function(u){return!!B[u]},XRegExp.isRegExp=function(u){return"[object RegExp]"===Object.prototype.toString.call(u)},XRegExp.match=function(u,d,t){var a=d.global&&"one"!==t||"all"===t,c=(a?"g":"")+(d.sticky?"y":"")||"noGY";d.xregexp=d.xregexp||{};var i=d.xregexp[c]||(d.xregexp[c]=copyRegex(d,{addG:!!a,removeG:"one"===t,isInternalOnly:!0})),l=String(nullThrows(u)).match(i);return d.global&&(d.lastIndex="one"===t&&l?l.index+l[0].length:0),a?l||[]:l&&l[0]},XRegExp.matchChain=function(u,d){return function recurseChain(u,t){var a=d[t].regex?d[t]:{regex:d[t]},c=[];function addMatch(u){if(a.backref){var d="Backreference to undefined group: ".concat(a.backref),t=isNaN(a.backref);if(t&&XRegExp.isInstalled("namespacing")){if(!u.groups||!(a.backref in u.groups))throw new ReferenceError(d)}else if(!u.hasOwnProperty(a.backref))throw new ReferenceError(d);var i=t&&XRegExp.isInstalled("namespacing")?u.groups[a.backref]:u[a.backref];c.push(i||"")}else c.push(u[0])}var i,l=_createForOfIteratorHelper(u);try{for(l.s();!(i=l.n()).done;){var D=i.value;(0,h.default)(XRegExp).call(XRegExp,D,a.regex,addMatch)}}catch(u){l.e(u)}finally{l.f()}return t!==d.length-1&&c.length?recurseChain(c,t+1):c}([u],0)},XRegExp.replace=function(u,d,t,a){var c=XRegExp.isRegExp(d),i=d.global&&"one"!==a||"all"===a,l=(i?"g":"")+(d.sticky?"y":"")||"noGY",D=d;c?(d.xregexp=d.xregexp||{},D=d.xregexp[l]||(d.xregexp[l]=copyRegex(d,{addG:!!i,removeG:"one"===a,isInternalOnly:!0}))):i&&(D=new RegExp(XRegExp.escape(String(d)),"g"));var p=w.replace.call(nullThrows(u),D,t);return c&&d.global&&(d.lastIndex=0),p},XRegExp.replaceEach=function(u,d){var t,a=_createForOfIteratorHelper(d);try{for(a.s();!(t=a.n()).done;){var c=t.value;u=XRegExp.replace(u,c[0],c[1],c[2])}}catch(u){a.e(u)}finally{a.f()}return u},XRegExp.split=function(u,d,t){return w.split.call(nullThrows(u),d,t)},XRegExp.test=function(u,d,t,a){return!!XRegExp.exec(u,d,t,a)},XRegExp.uninstall=function(u){u=prepareOptions(u),B.astral&&u.astral&&setAstral(!1),B.namespacing&&u.namespacing&&setNamespacing(!1)},XRegExp.union=function(u,d,t){var a,c,i=(t=t||{}).conjunction||"or",l=0;function rewrite(u,d,t){var i=c[l-a];if(d){if(++l,i)return"(?<".concat(i,">")}else if(t)return"\\".concat(+t+a);return u}if(!isType(u,"Array")||!u.length)throw new TypeError("Must provide a nonempty array of patterns to merge");var D,p=/(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g,b=[],y=_createForOfIteratorHelper(u);try{for(y.s();!(D=y.n()).done;){var m=D.value;XRegExp.isRegExp(m)?(a=l,c=m.xregexp&&m.xregexp.captureNames||[],b.push(XRegExp(m.source).source.replace(p,rewrite))):b.push(XRegExp.escape(m))}}catch(u){y.e(u)}finally{y.f()}var A="none"===i?"":"|";return XRegExp(b.join(A),d)},w.exec=function(u){var d=this.lastIndex,t=RegExp.prototype.exec.apply(this,arguments);if(t){if(!I&&t.length>1&&-1!==(0,g.default)(t).call(t,"")){var a,c=copyRegex(this,{removeG:!0,isInternalOnly:!0});(0,E.default)(a=String(u)).call(a,t.index).replace(c,(function(){for(var u=arguments.length,d=1;d<u-2;++d)void 0===(d<0||arguments.length<=d?void 0:arguments[d])&&(t[d]=void 0)}))}if(this.xregexp&&this.xregexp.captureNames){var i=t;XRegExp.isInstalled("namespacing")&&(t.groups=(0,x.default)(null),i=t.groups);for(var l=1;l<t.length;++l){var D=this.xregexp.captureNames[l-1];D&&(i[D]=t[l])}}else!t.groups&&XRegExp.isInstalled("namespacing")&&(t.groups=void 0);this.global&&!t[0].length&&this.lastIndex>t.index&&(this.lastIndex=t.index)}return this.global||(this.lastIndex=d),t},w.test=function(u){return!!w.exec.call(this,u)},w.match=function(u){if(XRegExp.isRegExp(u)){if(u.global){var d=String.prototype.match.apply(this,arguments);return u.lastIndex=0,d}}else u=new RegExp(u);return w.exec.call(u,nullThrows(this))},w.replace=function(u,d){var t,a,c,i=XRegExp.isRegExp(u);return i?(u.xregexp&&(a=u.xregexp.captureNames),t=u.lastIndex):u+="",c=isType(d,"Function")?String(this).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];if(a){var i;XRegExp.isInstalled("namespacing")?(i=(0,x.default)(null),t.push(i)):(t[0]=new String(t[0]),i=t[0]);for(var l=0;l<a.length;++l)a[l]&&(i[a[l]]=t[l+1])}return d.apply(void 0,t)})):String(nullThrows(this)).replace(u,(function(){for(var u=arguments.length,t=new Array(u),c=0;c<u;c++)t[c]=arguments[c];return String(d).replace(T,replacer);function replacer(u,d,c,i){d=d||c;var l,D,p=isType(t[t.length-1],"Object")?4:3,b=t.length-p;if(d){if(/^\d+$/.test(d)){var y=+d;if(y<=b)return t[y]||""}var m=a?(0,g.default)(a).call(a,d):-1;if(m<0)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[m+1]||""}if(""===i||" "===i)throw new SyntaxError("Invalid token ".concat(u));if("&"===i||0==+i)return t[0];if("$"===i)return"$";if("`"===i)return(0,E.default)(l=t[t.length-1]).call(l,0,t[t.length-2]);if("'"===i)return(0,E.default)(D=t[t.length-1]).call(D,t[t.length-2]+t[0].length);if(i=+i,!isNaN(i)){if(i>b)throw new SyntaxError("Backreference to undefined group ".concat(u));return t[i]||""}throw new SyntaxError("Invalid token ".concat(u))}})),i&&(u.global?u.lastIndex=0:u.lastIndex=t),c},w.split=function(u,d){if(!XRegExp.isRegExp(u))return String.prototype.split.apply(this,arguments);var t,a=String(this),c=[],i=u.lastIndex,l=0;return d=(void 0===d?-1:d)>>>0,(0,h.default)(XRegExp).call(XRegExp,a,u,(function(u){u.index+u[0].length>l&&(c.push((0,E.default)(a).call(a,l,u.index)),u.length>1&&u.index<a.length&&Array.prototype.push.apply(c,(0,E.default)(u).call(u,1)),t=u[0].length,l=u.index+t)})),l===a.length?u.test("")&&!t||c.push(""):c.push((0,E.default)(a).call(a,l)),u.lastIndex=i,c.length>d?(0,E.default)(c).call(c,0,d):c},XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,(function(u,d){if("B"===u[1]&&d===O)return u[0];throw new SyntaxError("Invalid escape ".concat(u[0]))}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/,(function(u,d,t){var a=dec(u[1]);if(a>1114111)throw new SyntaxError("Invalid Unicode code point ".concat(u[0]));if(a<=65535)return"\\u".concat(pad4(hex(a)));if(N&&-1!==(0,g.default)(t).call(t,"u"))return u[0];throw new SyntaxError("Cannot use Unicode code point above \\u{FFFF} without flag u")}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?#[^)]*\)/,getContextualTokenSeparator,{leadChar:"("}),XRegExp.addToken(/\s+|#[^\n]*\n?/,getContextualTokenSeparator,{flag:"x"}),L||XRegExp.addToken(/\./,(function(){return"[\\s\\S]"}),{flag:"s",leadChar:"."}),XRegExp.addToken(/\\k<([^>]+)>/,(function(u){var d,t,a=isNaN(u[1])?(0,g.default)(d=this.captureNames).call(d,u[1])+1:+u[1],c=u.index+u[0].length;if(!a||a>this.captureNames.length)throw new SyntaxError("Backreference to undefined group ".concat(u[0]));return(0,v.default)(t="\\".concat(a)).call(t,c===u.input.length||isNaN(u.input[c])?"":"(?:)")}),{leadChar:"\\"}),XRegExp.addToken(/\\(\d+)/,(function(u,d){if(!(d===O&&/^[1-9]/.test(u[1])&&+u[1]<=this.captureNames.length)&&"0"!==u[1])throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(u[0]));return u[0]}),{scope:"all",leadChar:"\\"}),XRegExp.addToken(/\(\?P?<((?:[\$A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])(?:[\$0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])*)>/,(function(u){var d;if(!XRegExp.isInstalled("namespacing")&&("length"===u[1]||"__proto__"===u[1]))throw new SyntaxError("Cannot use reserved word as capture name ".concat(u[0]));if(-1!==(0,g.default)(d=this.captureNames).call(d,u[1]))throw new SyntaxError("Cannot use same name for multiple groups ".concat(u[0]));return this.captureNames.push(u[1]),this.hasNamedCapture=!0,"("}),{leadChar:"("}),XRegExp.addToken(/\((?!\?)/,(function(u,d,t){return-1!==(0,g.default)(t).call(t,"n")?"(?:":(this.captureNames.push(null),"(")}),{optionalFlags:"n",leadChar:"("});var q=XRegExp;t.default=q,d.exports=t.default},{"@babel/runtime-corejs3/core-js-stable/array/from":5,"@babel/runtime-corejs3/core-js-stable/array/is-array":6,"@babel/runtime-corejs3/core-js-stable/instance/concat":7,"@babel/runtime-corejs3/core-js-stable/instance/flags":8,"@babel/runtime-corejs3/core-js-stable/instance/for-each":9,"@babel/runtime-corejs3/core-js-stable/instance/index-of":10,"@babel/runtime-corejs3/core-js-stable/instance/slice":11,"@babel/runtime-corejs3/core-js-stable/instance/sort":12,"@babel/runtime-corejs3/core-js-stable/object/create":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":14,"@babel/runtime-corejs3/core-js-stable/parse-int":15,"@babel/runtime-corejs3/core-js-stable/symbol":16,"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/helpers/interopRequireDefault":24,"@babel/runtime-corejs3/helpers/slicedToArray":27}],5:[function(u,d,t){d.exports=u("core-js-pure/stable/array/from")},{"core-js-pure/stable/array/from":208}],6:[function(u,d,t){d.exports=u("core-js-pure/stable/array/is-array")},{"core-js-pure/stable/array/is-array":209}],7:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/concat")},{"core-js-pure/stable/instance/concat":212}],8:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/flags")},{"core-js-pure/stable/instance/flags":213}],9:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/for-each")},{"core-js-pure/stable/instance/for-each":214}],10:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/index-of")},{"core-js-pure/stable/instance/index-of":215}],11:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/slice")},{"core-js-pure/stable/instance/slice":216}],12:[function(u,d,t){d.exports=u("core-js-pure/stable/instance/sort")},{"core-js-pure/stable/instance/sort":217}],13:[function(u,d,t){d.exports=u("core-js-pure/stable/object/create")},{"core-js-pure/stable/object/create":218}],14:[function(u,d,t){d.exports=u("core-js-pure/stable/object/define-property")},{"core-js-pure/stable/object/define-property":219}],15:[function(u,d,t){d.exports=u("core-js-pure/stable/parse-int")},{"core-js-pure/stable/parse-int":220}],16:[function(u,d,t){d.exports=u("core-js-pure/stable/symbol")},{"core-js-pure/stable/symbol":221}],17:[function(u,d,t){d.exports=u("core-js-pure/features/array/from")},{"core-js-pure/features/array/from":52}],18:[function(u,d,t){d.exports=u("core-js-pure/features/array/is-array")},{"core-js-pure/features/array/is-array":53}],19:[function(u,d,t){d.exports=u("core-js-pure/features/get-iterator-method")},{"core-js-pure/features/get-iterator-method":54}],20:[function(u,d,t){d.exports=u("core-js-pure/features/instance/slice")},{"core-js-pure/features/instance/slice":55}],21:[function(u,d,t){d.exports=u("core-js-pure/features/symbol")},{"core-js-pure/features/symbol":56}],22:[function(u,d,t){d.exports=function _arrayLikeToArray(u,d){(null==d||d>u.length)&&(d=u.length);for(var t=0,a=new Array(d);t<d;t++)a[t]=u[t];return a},d.exports.__esModule=!0,d.exports.default=d.exports},{}],23:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/array/is-array");d.exports=function _arrayWithHoles(u){if(a(u))return u},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/array/is-array":18}],24:[function(u,d,t){d.exports=function _interopRequireDefault(u){return u&&u.__esModule?u:{default:u}},d.exports.__esModule=!0,d.exports.default=d.exports},{}],25:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/symbol"),c=u("@babel/runtime-corejs3/core-js/get-iterator-method");d.exports=function _iterableToArrayLimit(u,d){var t=null==u?null:void 0!==a&&c(u)||u["@@iterator"];if(null!=t){var i,l,D=[],p=!0,b=!1;try{for(t=t.call(u);!(p=(i=t.next()).done)&&(D.push(i.value),!d||D.length!==d);p=!0);}catch(u){b=!0,l=u}finally{try{p||null==t.return||t.return()}finally{if(b)throw l}}return D}},d.exports.__esModule=!0,d.exports.default=d.exports},{"@babel/runtime-corejs3/core-js/get-iterator-method":19,"@babel/runtime-corejs3/core-js/symbol":21}],26:[function(u,d,t){d.exports=function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},d.exports.__esModule=!0,d.exports.default=d.exports},{}],27:[function(u,d,t){var a=u("./arrayWithHoles.js"),c=u("./iterableToArrayLimit.js"),i=u("./unsupportedIterableToArray.js"),l=u("./nonIterableRest.js");d.exports=function _slicedToArray(u,d){return a(u)||c(u,d)||i(u,d)||l()},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayWithHoles.js":23,"./iterableToArrayLimit.js":25,"./nonIterableRest.js":26,"./unsupportedIterableToArray.js":28}],28:[function(u,d,t){var a=u("@babel/runtime-corejs3/core-js/instance/slice"),c=u("@babel/runtime-corejs3/core-js/array/from"),i=u("./arrayLikeToArray.js");d.exports=function _unsupportedIterableToArray(u,d){var t;if(u){if("string"==typeof u)return i(u,d);var l=a(t=Object.prototype.toString.call(u)).call(t,8,-1);return"Object"===l&&u.constructor&&(l=u.constructor.name),"Map"===l||"Set"===l?c(u):"Arguments"===l||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(l)?i(u,d):void 0}},d.exports.__esModule=!0,d.exports.default=d.exports},{"./arrayLikeToArray.js":22,"@babel/runtime-corejs3/core-js/array/from":17,"@babel/runtime-corejs3/core-js/instance/slice":20}],29:[function(u,d,t){var a=u("../../stable/array/from");d.exports=a},{"../../stable/array/from":208}],30:[function(u,d,t){var a=u("../../stable/array/is-array");d.exports=a},{"../../stable/array/is-array":209}],31:[function(u,d,t){var a=u("../stable/get-iterator-method");d.exports=a},{"../stable/get-iterator-method":211}],32:[function(u,d,t){var a=u("../../stable/instance/slice");d.exports=a},{"../../stable/instance/slice":216}],33:[function(u,d,t){var a=u("../../stable/symbol");d.exports=a},{"../../stable/symbol":221}],34:[function(u,d,t){u("../../modules/es.string.iterator"),u("../../modules/es.array.from");var a=u("../../internals/path");d.exports=a.Array.from},{"../../internals/path":142,"../../modules/es.array.from":170,"../../modules/es.string.iterator":184}],35:[function(u,d,t){u("../../modules/es.array.is-array");var a=u("../../internals/path");d.exports=a.Array.isArray},{"../../internals/path":142,"../../modules/es.array.is-array":172}],36:[function(u,d,t){u("../../../modules/es.array.concat");var a=u("../../../internals/entry-virtual");d.exports=a("Array").concat},{"../../../internals/entry-virtual":91,"../../../modules/es.array.concat":168}],37:[function(u,d,t){u("../../../modules/es.array.for-each");var a=u("../../../internals/entry-virtual");d.exports=a("Array").forEach},{"../../../internals/entry-virtual":91,"../../../modules/es.array.for-each":169}],38:[function(u,d,t){u("../../../modules/es.array.index-of");var a=u("../../../internals/entry-virtual");d.exports=a("Array").indexOf},{"../../../internals/entry-virtual":91,"../../../modules/es.array.index-of":171}],39:[function(u,d,t){u("../../../modules/es.array.slice");var a=u("../../../internals/entry-virtual");d.exports=a("Array").slice},{"../../../internals/entry-virtual":91,"../../../modules/es.array.slice":174}],40:[function(u,d,t){u("../../../modules/es.array.sort");var a=u("../../../internals/entry-virtual");d.exports=a("Array").sort},{"../../../internals/entry-virtual":91,"../../../modules/es.array.sort":175}],41:[function(u,d,t){u("../modules/es.array.iterator"),u("../modules/es.string.iterator");var a=u("../internals/get-iterator-method");d.exports=a},{"../internals/get-iterator-method":101,"../modules/es.array.iterator":173,"../modules/es.string.iterator":184}],42:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/concat"),i=Array.prototype;d.exports=function(u){var d=u.concat;return u===i||a(i,u)&&d===i.concat?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/concat":36}],43:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../regexp/flags"),i=RegExp.prototype;d.exports=function(u){return u===i||a(i,u)?c(u):u.flags}},{"../../internals/object-is-prototype-of":135,"../regexp/flags":50}],44:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/index-of"),i=Array.prototype;d.exports=function(u){var d=u.indexOf;return u===i||a(i,u)&&d===i.indexOf?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/index-of":38}],45:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/slice"),i=Array.prototype;d.exports=function(u){var d=u.slice;return u===i||a(i,u)&&d===i.slice?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/slice":39}],46:[function(u,d,t){var a=u("../../internals/object-is-prototype-of"),c=u("../array/virtual/sort"),i=Array.prototype;d.exports=function(u){var d=u.sort;return u===i||a(i,u)&&d===i.sort?c:d}},{"../../internals/object-is-prototype-of":135,"../array/virtual/sort":40}],47:[function(u,d,t){u("../../modules/es.object.create");var a=u("../../internals/path").Object;d.exports=function create(u,d){return a.create(u,d)}},{"../../internals/path":142,"../../modules/es.object.create":178}],48:[function(u,d,t){u("../../modules/es.object.define-property");var a=u("../../internals/path").Object,c=d.exports=function defineProperty(u,d,t){return a.defineProperty(u,d,t)};a.defineProperty.sham&&(c.sham=!0)},{"../../internals/path":142,"../../modules/es.object.define-property":179}],49:[function(u,d,t){u("../modules/es.parse-int");var a=u("../internals/path");d.exports=a.parseInt},{"../internals/path":142,"../modules/es.parse-int":181}],50:[function(u,d,t){u("../../modules/es.regexp.flags");var a=u("../../internals/function-uncurry-this"),c=u("../../internals/regexp-flags");d.exports=a(c)},{"../../internals/function-uncurry-this":99,"../../internals/regexp-flags":144,"../../modules/es.regexp.flags":183}],51:[function(u,d,t){u("../../modules/es.array.concat"),u("../../modules/es.object.to-string"),u("../../modules/es.symbol"),u("../../modules/es.symbol.async-iterator"),u("../../modules/es.symbol.description"),u("../../modules/es.symbol.has-instance"),u("../../modules/es.symbol.is-concat-spreadable"),u("../../modules/es.symbol.iterator"),u("../../modules/es.symbol.match"),u("../../modules/es.symbol.match-all"),u("../../modules/es.symbol.replace"),u("../../modules/es.symbol.search"),u("../../modules/es.symbol.species"),u("../../modules/es.symbol.split"),u("../../modules/es.symbol.to-primitive"),u("../../modules/es.symbol.to-string-tag"),u("../../modules/es.symbol.unscopables"),u("../../modules/es.json.to-string-tag"),u("../../modules/es.math.to-string-tag"),u("../../modules/es.reflect.to-string-tag");var a=u("../../internals/path");d.exports=a.Symbol},{"../../internals/path":142,"../../modules/es.array.concat":168,"../../modules/es.json.to-string-tag":176,"../../modules/es.math.to-string-tag":177,"../../modules/es.object.to-string":180,"../../modules/es.reflect.to-string-tag":182,"../../modules/es.symbol":190,"../../modules/es.symbol.async-iterator":185,"../../modules/es.symbol.description":186,"../../modules/es.symbol.has-instance":187,"../../modules/es.symbol.is-concat-spreadable":188,"../../modules/es.symbol.iterator":189,"../../modules/es.symbol.match":192,"../../modules/es.symbol.match-all":191,"../../modules/es.symbol.replace":193,"../../modules/es.symbol.search":194,"../../modules/es.symbol.species":195,"../../modules/es.symbol.split":196,"../../modules/es.symbol.to-primitive":197,"../../modules/es.symbol.to-string-tag":198,"../../modules/es.symbol.unscopables":199}],52:[function(u,d,t){var a=u("../../actual/array/from");d.exports=a},{"../../actual/array/from":29}],53:[function(u,d,t){var a=u("../../actual/array/is-array");d.exports=a},{"../../actual/array/is-array":30}],54:[function(u,d,t){var a=u("../actual/get-iterator-method");d.exports=a},{"../actual/get-iterator-method":31}],55:[function(u,d,t){var a=u("../../actual/instance/slice");d.exports=a},{"../../actual/instance/slice":32}],56:[function(u,d,t){var a=u("../../actual/symbol");u("../../modules/esnext.symbol.async-dispose"),u("../../modules/esnext.symbol.dispose"),u("../../modules/esnext.symbol.matcher"),u("../../modules/esnext.symbol.metadata"),u("../../modules/esnext.symbol.observable"),u("../../modules/esnext.symbol.pattern-match"),u("../../modules/esnext.symbol.replace-all"),d.exports=a},{"../../actual/symbol":33,"../../modules/esnext.symbol.async-dispose":200,"../../modules/esnext.symbol.dispose":201,"../../modules/esnext.symbol.matcher":202,"../../modules/esnext.symbol.metadata":203,"../../modules/esnext.symbol.observable":204,"../../modules/esnext.symbol.pattern-match":205,"../../modules/esnext.symbol.replace-all":206}],57:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/try-to-string"),l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not a function")}},{"../internals/global":104,"../internals/is-callable":114,"../internals/try-to-string":162}],58:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=a.String,l=a.TypeError;d.exports=function(u){if("object"==typeof u||c(u))return u;throw l("Can't set "+i(u)+" as a prototype")}},{"../internals/global":104,"../internals/is-callable":114}],59:[function(u,d,t){d.exports=function(){}},{}],60:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.String,l=a.TypeError;d.exports=function(u){if(c(u))return u;throw l(i(u)+" is not an object")}},{"../internals/global":104,"../internals/is-object":117}],61:[function(u,d,t){"use strict";var a=u("../internals/array-iteration").forEach,c=u("../internals/array-method-is-strict")("forEach");d.exports=c?[].forEach:function forEach(u){return a(this,u,arguments.length>1?arguments[1]:void 0)}},{"../internals/array-iteration":64,"../internals/array-method-is-strict":66}],62:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-bind-context"),i=u("../internals/function-call"),l=u("../internals/to-object"),D=u("../internals/call-with-safe-iteration-closing"),p=u("../internals/is-array-iterator-method"),b=u("../internals/is-constructor"),y=u("../internals/length-of-array-like"),m=u("../internals/create-property"),A=u("../internals/get-iterator"),E=u("../internals/get-iterator-method"),C=a.Array;d.exports=function from(u){var d=l(u),t=b(this),a=arguments.length,g=a>1?arguments[1]:void 0,h=void 0!==g;h&&(g=c(g,a>2?arguments[2]:void 0));var x,v,B,w,j,k,S=E(d),O=0;if(!S||this==C&&p(S))for(x=y(d),v=t?new this(x):C(x);x>O;O++)k=h?g(d[O],O):d[O],m(v,O,k);else for(j=(w=A(d,S)).next,v=t?new this:[];!(B=i(j,w)).done;O++)k=h?D(w,g,[B.value,O],!0):B.value,m(v,O,k);return v.length=O,v}},{"../internals/call-with-safe-iteration-closing":72,"../internals/create-property":80,"../internals/function-bind-context":96,"../internals/function-call":97,"../internals/get-iterator":102,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/is-array-iterator-method":112,"../internals/is-constructor":115,"../internals/length-of-array-like":123,"../internals/to-object":157}],63:[function(u,d,t){var a=u("../internals/to-indexed-object"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),createMethod=function(u){return function(d,t,l){var D,p=a(d),b=i(p),y=c(l,b);if(u&&t!=t){for(;b>y;)if((D=p[y++])!=D)return!0}else for(;b>y;y++)if((u||y in p)&&p[y]===t)return u||y||0;return!u&&-1}};d.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},{"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154}],64:[function(u,d,t){var a=u("../internals/function-bind-context"),c=u("../internals/function-uncurry-this"),i=u("../internals/indexed-object"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/array-species-create"),b=c([].push),createMethod=function(u){var d=1==u,t=2==u,c=3==u,y=4==u,m=6==u,A=7==u,E=5==u||m;return function(C,g,h,x){for(var v,B,w=l(C),j=i(w),k=a(g,h),S=D(j),O=0,R=x||p,_=d?R(C,S):t||A?R(C,0):void 0;S>O;O++)if((E||O in j)&&(B=k(v=j[O],O,w),u))if(d)_[O]=B;else if(B)switch(u){case 3:return!0;case 5:return v;case 6:return O;case 2:b(_,v)}else switch(u){case 4:return!1;case 7:b(_,v)}return m?-1:c||y?y:_}};d.exports={forEach:createMethod(0),map:createMethod(1),filter:createMethod(2),some:createMethod(3),every:createMethod(4),find:createMethod(5),findIndex:createMethod(6),filterReject:createMethod(7)}},{"../internals/array-species-create":71,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/indexed-object":109,"../internals/length-of-array-like":123,"../internals/to-object":157}],65:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/well-known-symbol"),i=u("../internals/engine-v8-version"),l=c("species");d.exports=function(u){return i>=51||!a((function(){var d=[];return(d.constructor={})[l]=function(){return{foo:1}},1!==d[u](Boolean).foo}))}},{"../internals/engine-v8-version":89,"../internals/fails":94,"../internals/well-known-symbol":166}],66:[function(u,d,t){"use strict";var a=u("../internals/fails");d.exports=function(u,d){var t=[][u];return!!t&&a((function(){t.call(null,d||function(){throw 1},1)}))}},{"../internals/fails":94}],67:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-absolute-index"),i=u("../internals/length-of-array-like"),l=u("../internals/create-property"),D=a.Array,p=Math.max;d.exports=function(u,d,t){for(var a=i(u),b=c(d,a),y=c(void 0===t?a:t,a),m=D(p(y-b,0)),A=0;b<y;b++,A++)l(m,A,u[b]);return m.length=A,m}},{"../internals/create-property":80,"../internals/global":104,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153}],68:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a([].slice)},{"../internals/function-uncurry-this":99}],69:[function(u,d,t){var a=u("../internals/array-slice-simple"),c=Math.floor,mergeSort=function(u,d){var t=u.length,i=c(t/2);return t<8?insertionSort(u,d):merge(u,mergeSort(a(u,0,i),d),mergeSort(a(u,i),d),d)},insertionSort=function(u,d){for(var t,a,c=u.length,i=1;i<c;){for(a=i,t=u[i];a&&d(u[a-1],t)>0;)u[a]=u[--a];a!==i++&&(u[a]=t)}return u},merge=function(u,d,t,a){for(var c=d.length,i=t.length,l=0,D=0;l<c||D<i;)u[l+D]=l<c&&D<i?a(d[l],t[D])<=0?d[l++]:t[D++]:l<c?d[l++]:t[D++];return u};d.exports=mergeSort},{"../internals/array-slice-simple":67}],70:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-array"),i=u("../internals/is-constructor"),l=u("../internals/is-object"),D=u("../internals/well-known-symbol")("species"),p=a.Array;d.exports=function(u){var d;return c(u)&&(d=u.constructor,(i(d)&&(d===p||c(d.prototype))||l(d)&&null===(d=d[D]))&&(d=void 0)),void 0===d?p:d}},{"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/well-known-symbol":166}],71:[function(u,d,t){var a=u("../internals/array-species-constructor");d.exports=function(u,d){return new(a(u))(0===d?0:d)}},{"../internals/array-species-constructor":70}],72:[function(u,d,t){var a=u("../internals/an-object"),c=u("../internals/iterator-close");d.exports=function(u,d,t,i){try{return i?d(a(t)[0],t[1]):d(t)}catch(d){c(u,"throw",d)}}},{"../internals/an-object":60,"../internals/iterator-close":120}],73:[function(u,d,t){var a=u("../internals/well-known-symbol")("iterator"),c=!1;try{var i=0,l={next:function(){return{done:!!i++}},return:function(){c=!0}};l[a]=function(){return this},Array.from(l,(function(){throw 2}))}catch(u){}d.exports=function(u,d){if(!d&&!c)return!1;var t=!1;try{var i={};i[a]=function(){return{next:function(){return{done:t=!0}}}},u(i)}catch(u){}return t}},{"../internals/well-known-symbol":166}],74:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=a({}.toString),i=a("".slice);d.exports=function(u){return i(c(u),8,-1)}},{"../internals/function-uncurry-this":99}],75:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/to-string-tag-support"),i=u("../internals/is-callable"),l=u("../internals/classof-raw"),D=u("../internals/well-known-symbol")("toStringTag"),p=a.Object,b="Arguments"==l(function(){return arguments}());d.exports=c?l:function(u){var d,t,a;return void 0===u?"Undefined":null===u?"Null":"string"==typeof(t=function(u,d){try{return u[d]}catch(u){}}(d=p(u),D))?t:b?l(d):"Object"==(a=l(d))&&i(d.callee)?"Arguments":a}},{"../internals/classof-raw":74,"../internals/global":104,"../internals/is-callable":114,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],76:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},{"../internals/fails":94}],77:[function(u,d,t){"use strict";var a=u("../internals/iterators-core").IteratorPrototype,c=u("../internals/object-create"),i=u("../internals/create-property-descriptor"),l=u("../internals/set-to-string-tag"),D=u("../internals/iterators"),returnThis=function(){return this};d.exports=function(u,d,t,p){var b=d+" Iterator";return u.prototype=c(a,{next:i(+!p,t)}),l(u,b,!1,!0),D[b]=returnThis,u}},{"../internals/create-property-descriptor":79,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-create":127,"../internals/set-to-string-tag":147}],78:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=a?function(u,d,t){return c.f(u,d,i(1,t))}:function(u,d,t){return u[d]=t,u}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/object-define-property":129}],79:[function(u,d,t){d.exports=function(u,d){return{enumerable:!(1&u),configurable:!(2&u),writable:!(4&u),value:d}}},{}],80:[function(u,d,t){"use strict";var a=u("../internals/to-property-key"),c=u("../internals/object-define-property"),i=u("../internals/create-property-descriptor");d.exports=function(u,d,t){var l=a(d);l in u?c.f(u,l,i(0,t)):u[l]=t}},{"../internals/create-property-descriptor":79,"../internals/object-define-property":129,"../internals/to-property-key":159}],81:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-call"),i=u("../internals/is-pure"),l=u("../internals/function-name"),D=u("../internals/is-callable"),p=u("../internals/create-iterator-constructor"),b=u("../internals/object-get-prototype-of"),y=u("../internals/object-set-prototype-of"),m=u("../internals/set-to-string-tag"),A=u("../internals/create-non-enumerable-property"),E=u("../internals/redefine"),C=u("../internals/well-known-symbol"),g=u("../internals/iterators"),h=u("../internals/iterators-core"),x=l.PROPER,v=l.CONFIGURABLE,B=h.IteratorPrototype,w=h.BUGGY_SAFARI_ITERATORS,j=C("iterator"),k="keys",S="values",O="entries",returnThis=function(){return this};d.exports=function(u,d,t,l,C,h,R){p(t,d,l);var _,T,I,getIterationMethod=function(u){if(u===C&&M)return M;if(!w&&u in L)return L[u];switch(u){case k:return function keys(){return new t(this,u)};case S:return function values(){return new t(this,u)};case O:return function entries(){return new t(this,u)}}return function(){return new t(this)}},P=d+" Iterator",X=!1,L=u.prototype,N=L[j]||L["@@iterator"]||C&&L[C],M=!w&&N||getIterationMethod(C),U="Array"==d&&L.entries||N;if(U&&(_=b(U.call(new u)))!==Object.prototype&&_.next&&(i||b(_)===B||(y?y(_,B):D(_[j])||E(_,j,returnThis)),m(_,P,!0,!0),i&&(g[P]=returnThis)),x&&C==S&&N&&N.name!==S&&(!i&&v?A(L,"name",S):(X=!0,M=function values(){return c(N,this)})),C)if(T={values:getIterationMethod(S),keys:h?M:getIterationMethod(k),entries:getIterationMethod(O)},R)for(I in T)(w||X||!(I in L))&&E(L,I,T[I]);else a({target:d,proto:!0,forced:w||X},T);return i&&!R||L[j]===M||E(L,j,M,{name:C}),g[d]=M,T}},{"../internals/create-iterator-constructor":77,"../internals/create-non-enumerable-property":78,"../internals/export":93,"../internals/function-call":97,"../internals/function-name":98,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/iterators":122,"../internals/iterators-core":121,"../internals/object-get-prototype-of":134,"../internals/object-set-prototype-of":139,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/well-known-symbol":166}],82:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/has-own-property"),i=u("../internals/well-known-symbol-wrapped"),l=u("../internals/object-define-property").f;d.exports=function(u){var d=a.Symbol||(a.Symbol={});c(d,u)||l(d,u,{value:i.f(u)})}},{"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/path":142,"../internals/well-known-symbol-wrapped":165}],83:[function(u,d,t){var a=u("../internals/fails");d.exports=!a((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},{"../internals/fails":94}],84:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-object"),i=a.document,l=c(i)&&c(i.createElement);d.exports=function(u){return l?i.createElement(u):{}}},{"../internals/global":104,"../internals/is-object":117}],85:[function(u,d,t){d.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},{}],86:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/firefox\/(\d+)/i);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],87:[function(u,d,t){var a=u("../internals/engine-user-agent");d.exports=/MSIE|Trident/.test(a)},{"../internals/engine-user-agent":88}],88:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("navigator","userAgent")||""},{"../internals/get-built-in":100}],89:[function(u,d,t){var a,c,i=u("../internals/global"),l=u("../internals/engine-user-agent"),D=i.process,p=i.Deno,b=D&&D.versions||p&&p.version,y=b&&b.v8;y&&(c=(a=y.split("."))[0]>0&&a[0]<4?1:+(a[0]+a[1])),!c&&l&&(!(a=l.match(/Edge\/(\d+)/))||a[1]>=74)&&(a=l.match(/Chrome\/(\d+)/))&&(c=+a[1]),d.exports=c},{"../internals/engine-user-agent":88,"../internals/global":104}],90:[function(u,d,t){var a=u("../internals/engine-user-agent").match(/AppleWebKit\/(\d+)\./);d.exports=!!a&&+a[1]},{"../internals/engine-user-agent":88}],91:[function(u,d,t){var a=u("../internals/path");d.exports=function(u){return a[u+"Prototype"]}},{"../internals/path":142}],92:[function(u,d,t){d.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],93:[function(u,d,t){"use strict";var a=u("../internals/global"),c=u("../internals/function-apply"),i=u("../internals/function-uncurry-this"),l=u("../internals/is-callable"),D=u("../internals/object-get-own-property-descriptor").f,p=u("../internals/is-forced"),b=u("../internals/path"),y=u("../internals/function-bind-context"),m=u("../internals/create-non-enumerable-property"),A=u("../internals/has-own-property"),wrapConstructor=function(u){var Wrapper=function(d,t,a){if(this instanceof Wrapper){switch(arguments.length){case 0:return new u;case 1:return new u(d);case 2:return new u(d,t)}return new u(d,t,a)}return c(u,this,arguments)};return Wrapper.prototype=u.prototype,Wrapper};d.exports=function(u,d){var t,c,E,C,g,h,x,v,B=u.target,w=u.global,j=u.stat,k=u.proto,S=w?a:j?a[B]:(a[B]||{}).prototype,O=w?b:b[B]||m(b,B,{})[B],R=O.prototype;for(E in d)t=!p(w?E:B+(j?".":"#")+E,u.forced)&&S&&A(S,E),g=O[E],t&&(h=u.noTargetGet?(v=D(S,E))&&v.value:S[E]),C=t&&h?h:d[E],t&&typeof g==typeof C||(x=u.bind&&t?y(C,a):u.wrap&&t?wrapConstructor(C):k&&l(C)?i(C):C,(u.sham||C&&C.sham||g&&g.sham)&&m(x,"sham",!0),m(O,E,x),k&&(A(b,c=B+"Prototype")||m(b,c,{}),m(b[c],E,C),u.real&&R&&!R[E]&&m(R,E,C)))}},{"../internals/create-non-enumerable-property":78,"../internals/function-apply":95,"../internals/function-bind-context":96,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/is-forced":116,"../internals/object-get-own-property-descriptor":130,"../internals/path":142}],94:[function(u,d,t){d.exports=function(u){try{return!!u()}catch(u){return!0}}},{}],95:[function(u,d,t){var a=Function.prototype,c=a.apply,i=a.bind,l=a.call;d.exports="object"==typeof Reflect&&Reflect.apply||(i?l.bind(c):function(){return l.apply(c,arguments)})},{}],96:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/a-callable"),i=a(a.bind);d.exports=function(u,d){return c(u),void 0===d?u:i?i(u,d):function(){return u.apply(d,arguments)}}},{"../internals/a-callable":57,"../internals/function-uncurry-this":99}],97:[function(u,d,t){var a=Function.prototype.call;d.exports=a.bind?a.bind(a):function(){return a.apply(a,arguments)}},{}],98:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/has-own-property"),i=Function.prototype,l=a&&Object.getOwnPropertyDescriptor,D=c(i,"name"),p=D&&"something"===function something(){}.name,b=D&&(!a||a&&l(i,"name").configurable);d.exports={EXISTS:D,PROPER:p,CONFIGURABLE:b}},{"../internals/descriptors":83,"../internals/has-own-property":105}],99:[function(u,d,t){var a=Function.prototype,c=a.bind,i=a.call,l=c&&c.bind(i);d.exports=c?function(u){return u&&l(i,u)}:function(u){return u&&function(){return i.apply(u,arguments)}}},{}],100:[function(u,d,t){var a=u("../internals/path"),c=u("../internals/global"),i=u("../internals/is-callable"),aFunction=function(u){return i(u)?u:void 0};d.exports=function(u,d){return arguments.length<2?aFunction(a[u])||aFunction(c[u]):a[u]&&a[u][d]||c[u]&&c[u][d]}},{"../internals/global":104,"../internals/is-callable":114,"../internals/path":142}],101:[function(u,d,t){var a=u("../internals/classof"),c=u("../internals/get-method"),i=u("../internals/iterators"),l=u("../internals/well-known-symbol")("iterator");d.exports=function(u){if(null!=u)return c(u,l)||c(u,"@@iterator")||i[a(u)]}},{"../internals/classof":75,"../internals/get-method":103,"../internals/iterators":122,"../internals/well-known-symbol":166}],102:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/a-callable"),l=u("../internals/an-object"),D=u("../internals/try-to-string"),p=u("../internals/get-iterator-method"),b=a.TypeError;d.exports=function(u,d){var t=arguments.length<2?p(u):d;if(i(t))return l(c(t,u));throw b(D(u)+" is not iterable")}},{"../internals/a-callable":57,"../internals/an-object":60,"../internals/function-call":97,"../internals/get-iterator-method":101,"../internals/global":104,"../internals/try-to-string":162}],103:[function(u,d,t){var a=u("../internals/a-callable");d.exports=function(u,d){var t=u[d];return null==t?void 0:a(t)}},{"../internals/a-callable":57}],104:[function(u,d,t){(function(u){(function(){var check=function(u){return u&&u.Math==Math&&u};d.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof u&&u)||function(){return this}()||Function("return this")()}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],105:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-object"),i=a({}.hasOwnProperty);d.exports=Object.hasOwn||function hasOwn(u,d){return i(c(u),d)}},{"../internals/function-uncurry-this":99,"../internals/to-object":157}],106:[function(u,d,t){d.exports={}},{}],107:[function(u,d,t){var a=u("../internals/get-built-in");d.exports=a("document","documentElement")},{"../internals/get-built-in":100}],108:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/fails"),i=u("../internals/document-create-element");d.exports=!a&&!c((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},{"../internals/descriptors":83,"../internals/document-create-element":84,"../internals/fails":94}],109:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-uncurry-this"),i=u("../internals/fails"),l=u("../internals/classof-raw"),D=a.Object,p=c("".split);d.exports=i((function(){return!D("z").propertyIsEnumerable(0)}))?function(u){return"String"==l(u)?p(u,""):D(u)}:D},{"../internals/classof-raw":74,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104}],110:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/is-callable"),i=u("../internals/shared-store"),l=a(Function.toString);c(i.inspectSource)||(i.inspectSource=function(u){return l(u)}),d.exports=i.inspectSource},{"../internals/function-uncurry-this":99,"../internals/is-callable":114,"../internals/shared-store":149}],111:[function(u,d,t){var a,c,i,l=u("../internals/native-weak-map"),D=u("../internals/global"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-object"),y=u("../internals/create-non-enumerable-property"),m=u("../internals/has-own-property"),A=u("../internals/shared-store"),E=u("../internals/shared-key"),C=u("../internals/hidden-keys"),g="Object already initialized",h=D.TypeError,x=D.WeakMap;if(l||A.state){var v=A.state||(A.state=new x),B=p(v.get),w=p(v.has),j=p(v.set);a=function(u,d){if(w(v,u))throw new h(g);return d.facade=u,j(v,u,d),d},c=function(u){return B(v,u)||{}},i=function(u){return w(v,u)}}else{var k=E("state");C[k]=!0,a=function(u,d){if(m(u,k))throw new h(g);return d.facade=u,y(u,k,d),d},c=function(u){return m(u,k)?u[k]:{}},i=function(u){return m(u,k)}}d.exports={set:a,get:c,has:i,enforce:function(u){return i(u)?c(u):a(u,{})},getterFor:function(u){return function(d){var t;if(!b(d)||(t=c(d)).type!==u)throw h("Incompatible receiver, "+u+" required");return t}}}},{"../internals/create-non-enumerable-property":78,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/is-object":117,"../internals/native-weak-map":125,"../internals/shared-key":148,"../internals/shared-store":149}],112:[function(u,d,t){var a=u("../internals/well-known-symbol"),c=u("../internals/iterators"),i=a("iterator"),l=Array.prototype;d.exports=function(u){return void 0!==u&&(c.Array===u||l[i]===u)}},{"../internals/iterators":122,"../internals/well-known-symbol":166}],113:[function(u,d,t){var a=u("../internals/classof-raw");d.exports=Array.isArray||function isArray(u){return"Array"==a(u)}},{"../internals/classof-raw":74}],114:[function(u,d,t){d.exports=function(u){return"function"==typeof u}},{}],115:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/fails"),i=u("../internals/is-callable"),l=u("../internals/classof"),D=u("../internals/get-built-in"),p=u("../internals/inspect-source"),noop=function(){},b=[],y=D("Reflect","construct"),m=/^\s*(?:class|function)\b/,A=a(m.exec),E=!m.exec(noop),C=function isConstructor(u){if(!i(u))return!1;try{return y(noop,b,u),!0}catch(u){return!1}},g=function isConstructor(u){if(!i(u))return!1;switch(l(u)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return E||!!A(m,p(u))}catch(u){return!0}};g.sham=!0,d.exports=!y||c((function(){var u;return C(C.call)||!C(Object)||!C((function(){u=!0}))||u}))?g:C},{"../internals/classof":75,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/inspect-source":110,"../internals/is-callable":114}],116:[function(u,d,t){var a=u("../internals/fails"),c=u("../internals/is-callable"),i=/#|\.prototype\./,isForced=function(u,d){var t=D[l(u)];return t==b||t!=p&&(c(d)?a(d):!!d)},l=isForced.normalize=function(u){return String(u).replace(i,".").toLowerCase()},D=isForced.data={},p=isForced.NATIVE="N",b=isForced.POLYFILL="P";d.exports=isForced},{"../internals/fails":94,"../internals/is-callable":114}],117:[function(u,d,t){var a=u("../internals/is-callable");d.exports=function(u){return"object"==typeof u?null!==u:a(u)}},{"../internals/is-callable":114}],118:[function(u,d,t){d.exports=!0},{}],119:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/get-built-in"),i=u("../internals/is-callable"),l=u("../internals/object-is-prototype-of"),D=u("../internals/use-symbol-as-uid"),p=a.Object;d.exports=D?function(u){return"symbol"==typeof u}:function(u){var d=c("Symbol");return i(d)&&l(d.prototype,p(u))}},{"../internals/get-built-in":100,"../internals/global":104,"../internals/is-callable":114,"../internals/object-is-prototype-of":135,"../internals/use-symbol-as-uid":164}],120:[function(u,d,t){var a=u("../internals/function-call"),c=u("../internals/an-object"),i=u("../internals/get-method");d.exports=function(u,d,t){var l,D;c(u);try{if(!(l=i(u,"return"))){if("throw"===d)throw t;return t}l=a(l,u)}catch(u){D=!0,l=u}if("throw"===d)throw t;if(D)throw l;return c(l),t}},{"../internals/an-object":60,"../internals/function-call":97,"../internals/get-method":103}],121:[function(u,d,t){"use strict";var a,c,i,l=u("../internals/fails"),D=u("../internals/is-callable"),p=u("../internals/object-create"),b=u("../internals/object-get-prototype-of"),y=u("../internals/redefine"),m=u("../internals/well-known-symbol"),A=u("../internals/is-pure"),E=m("iterator"),C=!1;[].keys&&("next"in(i=[].keys())?(c=b(b(i)))!==Object.prototype&&(a=c):C=!0),null==a||l((function(){var u={};return a[E].call(u)!==u}))?a={}:A&&(a=p(a)),D(a[E])||y(a,E,(function(){return this})),d.exports={IteratorPrototype:a,BUGGY_SAFARI_ITERATORS:C}},{"../internals/fails":94,"../internals/is-callable":114,"../internals/is-pure":118,"../internals/object-create":127,"../internals/object-get-prototype-of":134,"../internals/redefine":143,"../internals/well-known-symbol":166}],122:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],123:[function(u,d,t){var a=u("../internals/to-length");d.exports=function(u){return a(u.length)}},{"../internals/to-length":156}],124:[function(u,d,t){var a=u("../internals/engine-v8-version"),c=u("../internals/fails");d.exports=!!Object.getOwnPropertySymbols&&!c((function(){var u=Symbol();return!String(u)||!(Object(u)instanceof Symbol)||!Symbol.sham&&a&&a<41}))},{"../internals/engine-v8-version":89,"../internals/fails":94}],125:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/is-callable"),i=u("../internals/inspect-source"),l=a.WeakMap;d.exports=c(l)&&/native code/.test(i(l))},{"../internals/global":104,"../internals/inspect-source":110,"../internals/is-callable":114}],126:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/fails"),i=u("../internals/function-uncurry-this"),l=u("../internals/to-string"),D=u("../internals/string-trim").trim,p=u("../internals/whitespaces"),b=a.parseInt,y=a.Symbol,m=y&&y.iterator,A=/^[+-]?0x/i,E=i(A.exec),C=8!==b(p+"08")||22!==b(p+"0x16")||m&&!c((function(){b(Object(m))}));d.exports=C?function parseInt(u,d){var t=D(l(u));return b(t,d>>>0||(E(A,t)?16:10))}:b},{"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/global":104,"../internals/string-trim":152,"../internals/to-string":161,"../internals/whitespaces":167}],127:[function(u,d,t){var a,c=u("../internals/an-object"),i=u("../internals/object-define-properties"),l=u("../internals/enum-bug-keys"),D=u("../internals/hidden-keys"),p=u("../internals/html"),b=u("../internals/document-create-element"),y=u("../internals/shared-key"),m=y("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(u){return"<script>"+u+"</"+"script>"},NullProtoObjectViaActiveX=function(u){u.write(scriptTag("")),u.close();var d=u.parentWindow.Object;return u=null,d},NullProtoObject=function(){try{a=new ActiveXObject("htmlfile")}catch(u){}var u,d;NullProtoObject="undefined"!=typeof document?document.domain&&a?NullProtoObjectViaActiveX(a):((d=b("iframe")).style.display="none",p.appendChild(d),d.src=String("javascript:"),(u=d.contentWindow.document).open(),u.write(scriptTag("document.F=Object")),u.close(),u.F):NullProtoObjectViaActiveX(a);for(var t=l.length;t--;)delete NullProtoObject.prototype[l[t]];return NullProtoObject()};D[m]=!0,d.exports=Object.create||function create(u,d){var t;return null!==u?(EmptyConstructor.prototype=c(u),t=new EmptyConstructor,EmptyConstructor.prototype=null,t[m]=u):t=NullProtoObject(),void 0===d?t:i(t,d)}},{"../internals/an-object":60,"../internals/document-create-element":84,"../internals/enum-bug-keys":92,"../internals/hidden-keys":106,"../internals/html":107,"../internals/object-define-properties":128,"../internals/shared-key":148}],128:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/object-define-property"),i=u("../internals/an-object"),l=u("../internals/to-indexed-object"),D=u("../internals/object-keys");d.exports=a?Object.defineProperties:function defineProperties(u,d){i(u);for(var t,a=l(d),p=D(d),b=p.length,y=0;b>y;)c.f(u,t=p[y++],a[t]);return u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/object-define-property":129,"../internals/object-keys":137,"../internals/to-indexed-object":154}],129:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/descriptors"),i=u("../internals/ie8-dom-define"),l=u("../internals/an-object"),D=u("../internals/to-property-key"),p=a.TypeError,b=Object.defineProperty;t.f=c?b:function defineProperty(u,d,t){if(l(u),d=D(d),l(t),i)try{return b(u,d,t)}catch(u){}if("get"in t||"set"in t)throw p("Accessors not supported");return"value"in t&&(u[d]=t.value),u}},{"../internals/an-object":60,"../internals/descriptors":83,"../internals/global":104,"../internals/ie8-dom-define":108,"../internals/to-property-key":159}],130:[function(u,d,t){var a=u("../internals/descriptors"),c=u("../internals/function-call"),i=u("../internals/object-property-is-enumerable"),l=u("../internals/create-property-descriptor"),D=u("../internals/to-indexed-object"),p=u("../internals/to-property-key"),b=u("../internals/has-own-property"),y=u("../internals/ie8-dom-define"),m=Object.getOwnPropertyDescriptor;t.f=a?m:function getOwnPropertyDescriptor(u,d){if(u=D(u),d=p(d),y)try{return m(u,d)}catch(u){}if(b(u,d))return l(!c(i.f,u,d),u[d])}},{"../internals/create-property-descriptor":79,"../internals/descriptors":83,"../internals/function-call":97,"../internals/has-own-property":105,"../internals/ie8-dom-define":108,"../internals/object-property-is-enumerable":138,"../internals/to-indexed-object":154,"../internals/to-property-key":159}],131:[function(u,d,t){var a=u("../internals/classof-raw"),c=u("../internals/to-indexed-object"),i=u("../internals/object-get-own-property-names").f,l=u("../internals/array-slice-simple"),D="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];d.exports.f=function getOwnPropertyNames(u){return D&&"Window"==a(u)?function(u){try{return i(u)}catch(u){return l(D)}}(u):i(c(u))}},{"../internals/array-slice-simple":67,"../internals/classof-raw":74,"../internals/object-get-own-property-names":132,"../internals/to-indexed-object":154}],132:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys").concat("length","prototype");t.f=Object.getOwnPropertyNames||function getOwnPropertyNames(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],133:[function(u,d,t){t.f=Object.getOwnPropertySymbols},{}],134:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/has-own-property"),i=u("../internals/is-callable"),l=u("../internals/to-object"),D=u("../internals/shared-key"),p=u("../internals/correct-prototype-getter"),b=D("IE_PROTO"),y=a.Object,m=y.prototype;d.exports=p?y.getPrototypeOf:function(u){var d=l(u);if(c(d,b))return d[b];var t=d.constructor;return i(t)&&d instanceof t?t.prototype:d instanceof y?m:null}},{"../internals/correct-prototype-getter":76,"../internals/global":104,"../internals/has-own-property":105,"../internals/is-callable":114,"../internals/shared-key":148,"../internals/to-object":157}],135:[function(u,d,t){var a=u("../internals/function-uncurry-this");d.exports=a({}.isPrototypeOf)},{"../internals/function-uncurry-this":99}],136:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/has-own-property"),i=u("../internals/to-indexed-object"),l=u("../internals/array-includes").indexOf,D=u("../internals/hidden-keys"),p=a([].push);d.exports=function(u,d){var t,a=i(u),b=0,y=[];for(t in a)!c(D,t)&&c(a,t)&&p(y,t);for(;d.length>b;)c(a,t=d[b++])&&(~l(y,t)||p(y,t));return y}},{"../internals/array-includes":63,"../internals/function-uncurry-this":99,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/to-indexed-object":154}],137:[function(u,d,t){var a=u("../internals/object-keys-internal"),c=u("../internals/enum-bug-keys");d.exports=Object.keys||function keys(u){return a(u,c)}},{"../internals/enum-bug-keys":92,"../internals/object-keys-internal":136}],138:[function(u,d,t){"use strict";var a={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,i=c&&!a.call({1:2},1);t.f=i?function propertyIsEnumerable(u){var d=c(this,u);return!!d&&d.enumerable}:a},{}],139:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/an-object"),i=u("../internals/a-possible-prototype");d.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var u,d=!1,t={};try{(u=a(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(t,[]),d=t instanceof Array}catch(u){}return function setPrototypeOf(t,a){return c(t),i(a),d?u(t,a):t.__proto__=a,t}}():void 0)},{"../internals/a-possible-prototype":58,"../internals/an-object":60,"../internals/function-uncurry-this":99}],140:[function(u,d,t){"use strict";var a=u("../internals/to-string-tag-support"),c=u("../internals/classof");d.exports=a?{}.toString:function toString(){return"[object "+c(this)+"]"}},{"../internals/classof":75,"../internals/to-string-tag-support":160}],141:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-callable"),l=u("../internals/is-object"),D=a.TypeError;d.exports=function(u,d){var t,a;if("string"===d&&i(t=u.toString)&&!l(a=c(t,u)))return a;if(i(t=u.valueOf)&&!l(a=c(t,u)))return a;if("string"!==d&&i(t=u.toString)&&!l(a=c(t,u)))return a;throw D("Can't convert object to primitive value")}},{"../internals/function-call":97,"../internals/global":104,"../internals/is-callable":114,"../internals/is-object":117}],142:[function(u,d,t){arguments[4][106][0].apply(t,arguments)},{dup:106}],143:[function(u,d,t){var a=u("../internals/create-non-enumerable-property");d.exports=function(u,d,t,c){c&&c.enumerable?u[d]=t:a(u,d,t)}},{"../internals/create-non-enumerable-property":78}],144:[function(u,d,t){"use strict";var a=u("../internals/an-object");d.exports=function(){var u=a(this),d="";return u.global&&(d+="g"),u.ignoreCase&&(d+="i"),u.multiline&&(d+="m"),u.dotAll&&(d+="s"),u.unicode&&(d+="u"),u.sticky&&(d+="y"),d}},{"../internals/an-object":60}],145:[function(u,d,t){var a=u("../internals/global").TypeError;d.exports=function(u){if(null==u)throw a("Can't call method on "+u);return u}},{"../internals/global":104}],146:[function(u,d,t){var a=u("../internals/global"),c=Object.defineProperty;d.exports=function(u,d){try{c(a,u,{value:d,configurable:!0,writable:!0})}catch(t){a[u]=d}return d}},{"../internals/global":104}],147:[function(u,d,t){var a=u("../internals/to-string-tag-support"),c=u("../internals/object-define-property").f,i=u("../internals/create-non-enumerable-property"),l=u("../internals/has-own-property"),D=u("../internals/object-to-string"),p=u("../internals/well-known-symbol")("toStringTag");d.exports=function(u,d,t,b){if(u){var y=t?u:u.prototype;l(y,p)||c(y,p,{configurable:!0,value:d}),b&&!a&&i(y,"toString",D)}}},{"../internals/create-non-enumerable-property":78,"../internals/has-own-property":105,"../internals/object-define-property":129,"../internals/object-to-string":140,"../internals/to-string-tag-support":160,"../internals/well-known-symbol":166}],148:[function(u,d,t){var a=u("../internals/shared"),c=u("../internals/uid"),i=a("keys");d.exports=function(u){return i[u]||(i[u]=c(u))}},{"../internals/shared":150,"../internals/uid":163}],149:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/set-global"),i="__core-js_shared__",l=a[i]||c(i,{});d.exports=l},{"../internals/global":104,"../internals/set-global":146}],150:[function(u,d,t){var a=u("../internals/is-pure"),c=u("../internals/shared-store");(d.exports=function(u,d){return c[u]||(c[u]=void 0!==d?d:{})})("versions",[]).push({version:"3.20.0",mode:a?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},{"../internals/is-pure":118,"../internals/shared-store":149}],151:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/to-integer-or-infinity"),i=u("../internals/to-string"),l=u("../internals/require-object-coercible"),D=a("".charAt),p=a("".charCodeAt),b=a("".slice),createMethod=function(u){return function(d,t){var a,y,m=i(l(d)),A=c(t),E=m.length;return A<0||A>=E?u?"":void 0:(a=p(m,A))<55296||a>56319||A+1===E||(y=p(m,A+1))<56320||y>57343?u?D(m,A):a:u?b(m,A,A+2):y-56320+(a-55296<<10)+65536}};d.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-integer-or-infinity":155,"../internals/to-string":161}],152:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=u("../internals/require-object-coercible"),i=u("../internals/to-string"),l=u("../internals/whitespaces"),D=a("".replace),p="["+l+"]",b=RegExp("^"+p+p+"*"),y=RegExp(p+p+"*$"),createMethod=function(u){return function(d){var t=i(c(d));return 1&u&&(t=D(t,b,"")),2&u&&(t=D(t,y,"")),t}};d.exports={start:createMethod(1),end:createMethod(2),trim:createMethod(3)}},{"../internals/function-uncurry-this":99,"../internals/require-object-coercible":145,"../internals/to-string":161,"../internals/whitespaces":167}],153:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.max,i=Math.min;d.exports=function(u,d){var t=a(u);return t<0?c(t+d,0):i(t,d)}},{"../internals/to-integer-or-infinity":155}],154:[function(u,d,t){var a=u("../internals/indexed-object"),c=u("../internals/require-object-coercible");d.exports=function(u){return a(c(u))}},{"../internals/indexed-object":109,"../internals/require-object-coercible":145}],155:[function(u,d,t){var a=Math.ceil,c=Math.floor;d.exports=function(u){var d=+u;return d!=d||0===d?0:(d>0?c:a)(d)}},{}],156:[function(u,d,t){var a=u("../internals/to-integer-or-infinity"),c=Math.min;d.exports=function(u){return u>0?c(a(u),9007199254740991):0}},{"../internals/to-integer-or-infinity":155}],157:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/require-object-coercible"),i=a.Object;d.exports=function(u){return i(c(u))}},{"../internals/global":104,"../internals/require-object-coercible":145}],158:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/function-call"),i=u("../internals/is-object"),l=u("../internals/is-symbol"),D=u("../internals/get-method"),p=u("../internals/ordinary-to-primitive"),b=u("../internals/well-known-symbol"),y=a.TypeError,m=b("toPrimitive");d.exports=function(u,d){if(!i(u)||l(u))return u;var t,a=D(u,m);if(a){if(void 0===d&&(d="default"),t=c(a,u,d),!i(t)||l(t))return t;throw y("Can't convert object to primitive value")}return void 0===d&&(d="number"),p(u,d)}},{"../internals/function-call":97,"../internals/get-method":103,"../internals/global":104,"../internals/is-object":117,"../internals/is-symbol":119,"../internals/ordinary-to-primitive":141,"../internals/well-known-symbol":166}],159:[function(u,d,t){var a=u("../internals/to-primitive"),c=u("../internals/is-symbol");d.exports=function(u){var d=a(u,"string");return c(d)?d:d+""}},{"../internals/is-symbol":119,"../internals/to-primitive":158}],160:[function(u,d,t){var a={};a[u("../internals/well-known-symbol")("toStringTag")]="z",d.exports="[object z]"===String(a)},{"../internals/well-known-symbol":166}],161:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/classof"),i=a.String;d.exports=function(u){if("Symbol"===c(u))throw TypeError("Cannot convert a Symbol value to a string");return i(u)}},{"../internals/classof":75,"../internals/global":104}],162:[function(u,d,t){var a=u("../internals/global").String;d.exports=function(u){try{return a(u)}catch(u){return"Object"}}},{"../internals/global":104}],163:[function(u,d,t){var a=u("../internals/function-uncurry-this"),c=0,i=Math.random(),l=a(1..toString);d.exports=function(u){return"Symbol("+(void 0===u?"":u)+")_"+l(++c+i,36)}},{"../internals/function-uncurry-this":99}],164:[function(u,d,t){var a=u("../internals/native-symbol");d.exports=a&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},{"../internals/native-symbol":124}],165:[function(u,d,t){var a=u("../internals/well-known-symbol");t.f=a},{"../internals/well-known-symbol":166}],166:[function(u,d,t){var a=u("../internals/global"),c=u("../internals/shared"),i=u("../internals/has-own-property"),l=u("../internals/uid"),D=u("../internals/native-symbol"),p=u("../internals/use-symbol-as-uid"),b=c("wks"),y=a.Symbol,m=y&&y.for,A=p?y:y&&y.withoutSetter||l;d.exports=function(u){if(!i(b,u)||!D&&"string"!=typeof b[u]){var d="Symbol."+u;D&&i(y,u)?b[u]=y[u]:b[u]=p&&m?m(d):A(d)}return b[u]}},{"../internals/global":104,"../internals/has-own-property":105,"../internals/native-symbol":124,"../internals/shared":150,"../internals/uid":163,"../internals/use-symbol-as-uid":164}],167:[function(u,d,t){d.exports="\t\n\v\f\r                \u2028\u2029\ufeff"},{}],168:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/fails"),l=u("../internals/is-array"),D=u("../internals/is-object"),p=u("../internals/to-object"),b=u("../internals/length-of-array-like"),y=u("../internals/create-property"),m=u("../internals/array-species-create"),A=u("../internals/array-method-has-species-support"),E=u("../internals/well-known-symbol"),C=u("../internals/engine-v8-version"),g=E("isConcatSpreadable"),h=9007199254740991,x="Maximum allowed index exceeded",v=c.TypeError,B=C>=51||!i((function(){var u=[];return u[g]=!1,u.concat()[0]!==u})),w=A("concat"),isConcatSpreadable=function(u){if(!D(u))return!1;var d=u[g];return void 0!==d?!!d:l(u)};a({target:"Array",proto:!0,forced:!B||!w},{concat:function concat(u){var d,t,a,c,i,l=p(this),D=m(l,0),A=0;for(d=-1,a=arguments.length;d<a;d++)if(isConcatSpreadable(i=-1===d?l:arguments[d])){if(A+(c=b(i))>h)throw v(x);for(t=0;t<c;t++,A++)t in i&&y(D,A,i[t])}else{if(A>=h)throw v(x);y(D,A++,i)}return D.length=A,D}})},{"../internals/array-method-has-species-support":65,"../internals/array-species-create":71,"../internals/create-property":80,"../internals/engine-v8-version":89,"../internals/export":93,"../internals/fails":94,"../internals/global":104,"../internals/is-array":113,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/well-known-symbol":166}],169:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/array-for-each");a({target:"Array",proto:!0,forced:[].forEach!=c},{forEach:c})},{"../internals/array-for-each":61,"../internals/export":93}],170:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/array-from");a({target:"Array",stat:!0,forced:!u("../internals/check-correctness-of-iteration")((function(u){Array.from(u)}))},{from:c})},{"../internals/array-from":62,"../internals/check-correctness-of-iteration":73,"../internals/export":93}],171:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/array-includes").indexOf,l=u("../internals/array-method-is-strict"),D=c([].indexOf),p=!!D&&1/D([1],1,-0)<0,b=l("indexOf");a({target:"Array",proto:!0,forced:p||!b},{indexOf:function indexOf(u){var d=arguments.length>1?arguments[1]:void 0;return p?D(this,u,d)||0:i(this,u,d)}})},{"../internals/array-includes":63,"../internals/array-method-is-strict":66,"../internals/export":93,"../internals/function-uncurry-this":99}],172:[function(u,d,t){u("../internals/export")({target:"Array",stat:!0},{isArray:u("../internals/is-array")})},{"../internals/export":93,"../internals/is-array":113}],173:[function(u,d,t){"use strict";var a=u("../internals/to-indexed-object"),c=u("../internals/add-to-unscopables"),i=u("../internals/iterators"),l=u("../internals/internal-state"),D=u("../internals/object-define-property").f,p=u("../internals/define-iterator"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m="Array Iterator",A=l.set,E=l.getterFor(m);d.exports=p(Array,"Array",(function(u,d){A(this,{type:m,target:a(u),index:0,kind:d})}),(function(){var u=E(this),d=u.target,t=u.kind,a=u.index++;return!d||a>=d.length?(u.target=void 0,{value:void 0,done:!0}):"keys"==t?{value:a,done:!1}:"values"==t?{value:d[a],done:!1}:{value:[a,d[a]],done:!1}}),"values");var C=i.Arguments=i.Array;if(c("keys"),c("values"),c("entries"),!b&&y&&"values"!==C.name)try{D(C,"name",{value:"values"})}catch(u){}},{"../internals/add-to-unscopables":59,"../internals/define-iterator":81,"../internals/descriptors":83,"../internals/internal-state":111,"../internals/is-pure":118,"../internals/iterators":122,"../internals/object-define-property":129,"../internals/to-indexed-object":154}],174:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/is-array"),l=u("../internals/is-constructor"),D=u("../internals/is-object"),p=u("../internals/to-absolute-index"),b=u("../internals/length-of-array-like"),y=u("../internals/to-indexed-object"),m=u("../internals/create-property"),A=u("../internals/well-known-symbol"),E=u("../internals/array-method-has-species-support"),C=u("../internals/array-slice"),g=E("slice"),h=A("species"),x=c.Array,v=Math.max;a({target:"Array",proto:!0,forced:!g},{slice:function slice(u,d){var t,a,c,A=y(this),E=b(A),g=p(u,E),B=p(void 0===d?E:d,E);if(i(A)&&(t=A.constructor,(l(t)&&(t===x||i(t.prototype))||D(t)&&null===(t=t[h]))&&(t=void 0),t===x||void 0===t))return C(A,g,B);for(a=new(void 0===t?x:t)(v(B-g,0)),c=0;g<B;g++,c++)g in A&&m(a,c,A[g]);return a.length=c,a}})},{"../internals/array-method-has-species-support":65,"../internals/array-slice":68,"../internals/create-property":80,"../internals/export":93,"../internals/global":104,"../internals/is-array":113,"../internals/is-constructor":115,"../internals/is-object":117,"../internals/length-of-array-like":123,"../internals/to-absolute-index":153,"../internals/to-indexed-object":154,"../internals/well-known-symbol":166}],175:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/function-uncurry-this"),i=u("../internals/a-callable"),l=u("../internals/to-object"),D=u("../internals/length-of-array-like"),p=u("../internals/to-string"),b=u("../internals/fails"),y=u("../internals/array-sort"),m=u("../internals/array-method-is-strict"),A=u("../internals/engine-ff-version"),E=u("../internals/engine-is-ie-or-edge"),C=u("../internals/engine-v8-version"),g=u("../internals/engine-webkit-version"),h=[],x=c(h.sort),v=c(h.push),B=b((function(){h.sort(void 0)})),w=b((function(){h.sort(null)})),j=m("sort"),k=!b((function(){if(C)return C<70;if(!(A&&A>3)){if(E)return!0;if(g)return g<603;var u,d,t,a,c="";for(u=65;u<76;u++){switch(d=String.fromCharCode(u),u){case 66:case 69:case 70:case 72:t=3;break;case 68:case 71:t=4;break;default:t=2}for(a=0;a<47;a++)h.push({k:d+a,v:t})}for(h.sort((function(u,d){return d.v-u.v})),a=0;a<h.length;a++)d=h[a].k.charAt(0),c.charAt(c.length-1)!==d&&(c+=d);return"DGBEFHACIJK"!==c}}));a({target:"Array",proto:!0,forced:B||!w||!j||!k},{sort:function sort(u){void 0!==u&&i(u);var d=l(this);if(k)return void 0===u?x(d):x(d,u);var t,a,c=[],b=D(d);for(a=0;a<b;a++)a in d&&v(c,d[a]);for(y(c,function(u){return function(d,t){return void 0===t?-1:void 0===d?1:void 0!==u?+u(d,t)||0:p(d)>p(t)?1:-1}}(u)),t=c.length,a=0;a<t;)d[a]=c[a++];for(;a<b;)delete d[a++];return d}})},{"../internals/a-callable":57,"../internals/array-method-is-strict":66,"../internals/array-sort":69,"../internals/engine-ff-version":86,"../internals/engine-is-ie-or-edge":87,"../internals/engine-v8-version":89,"../internals/engine-webkit-version":90,"../internals/export":93,"../internals/fails":94,"../internals/function-uncurry-this":99,"../internals/length-of-array-like":123,"../internals/to-object":157,"../internals/to-string":161}],176:[function(u,d,t){var a=u("../internals/global");u("../internals/set-to-string-tag")(a.JSON,"JSON",!0)},{"../internals/global":104,"../internals/set-to-string-tag":147}],177:[function(u,d,t){},{}],178:[function(u,d,t){u("../internals/export")({target:"Object",stat:!0,sham:!u("../internals/descriptors")},{create:u("../internals/object-create")})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-create":127}],179:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/descriptors");a({target:"Object",stat:!0,forced:!c,sham:!c},{defineProperty:u("../internals/object-define-property").f})},{"../internals/descriptors":83,"../internals/export":93,"../internals/object-define-property":129}],180:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],181:[function(u,d,t){var a=u("../internals/export"),c=u("../internals/number-parse-int");a({global:!0,forced:parseInt!=c},{parseInt:c})},{"../internals/export":93,"../internals/number-parse-int":126}],182:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],183:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],184:[function(u,d,t){"use strict";var a=u("../internals/string-multibyte").charAt,c=u("../internals/to-string"),i=u("../internals/internal-state"),l=u("../internals/define-iterator"),D="String Iterator",p=i.set,b=i.getterFor(D);l(String,"String",(function(u){p(this,{type:D,string:c(u),index:0})}),(function next(){var u,d=b(this),t=d.string,c=d.index;return c>=t.length?{value:void 0,done:!0}:(u=a(t,c),d.index+=u.length,{value:u,done:!1})}))},{"../internals/define-iterator":81,"../internals/internal-state":111,"../internals/string-multibyte":151,"../internals/to-string":161}],185:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncIterator")},{"../internals/define-well-known-symbol":82}],186:[function(u,d,t){arguments[4][177][0].apply(t,arguments)},{dup:177}],187:[function(u,d,t){u("../internals/define-well-known-symbol")("hasInstance")},{"../internals/define-well-known-symbol":82}],188:[function(u,d,t){u("../internals/define-well-known-symbol")("isConcatSpreadable")},{"../internals/define-well-known-symbol":82}],189:[function(u,d,t){u("../internals/define-well-known-symbol")("iterator")},{"../internals/define-well-known-symbol":82}],190:[function(u,d,t){"use strict";var a=u("../internals/export"),c=u("../internals/global"),i=u("../internals/get-built-in"),l=u("../internals/function-apply"),D=u("../internals/function-call"),p=u("../internals/function-uncurry-this"),b=u("../internals/is-pure"),y=u("../internals/descriptors"),m=u("../internals/native-symbol"),A=u("../internals/fails"),E=u("../internals/has-own-property"),C=u("../internals/is-array"),g=u("../internals/is-callable"),h=u("../internals/is-object"),x=u("../internals/object-is-prototype-of"),v=u("../internals/is-symbol"),B=u("../internals/an-object"),w=u("../internals/to-object"),j=u("../internals/to-indexed-object"),k=u("../internals/to-property-key"),S=u("../internals/to-string"),O=u("../internals/create-property-descriptor"),R=u("../internals/object-create"),_=u("../internals/object-keys"),T=u("../internals/object-get-own-property-names"),I=u("../internals/object-get-own-property-names-external"),P=u("../internals/object-get-own-property-symbols"),X=u("../internals/object-get-own-property-descriptor"),L=u("../internals/object-define-property"),N=u("../internals/object-property-is-enumerable"),M=u("../internals/array-slice"),U=u("../internals/redefine"),G=u("../internals/shared"),q=u("../internals/shared-key"),z=u("../internals/hidden-keys"),$=u("../internals/uid"),H=u("../internals/well-known-symbol"),Z=u("../internals/well-known-symbol-wrapped"),Y=u("../internals/define-well-known-symbol"),V=u("../internals/set-to-string-tag"),W=u("../internals/internal-state"),J=u("../internals/array-iteration").forEach,K=q("hidden"),Q="Symbol",uu=H("toPrimitive"),eu=W.set,du=W.getterFor(Q),nu=Object.prototype,tu=c.Symbol,ru=tu&&tu.prototype,au=c.TypeError,cu=c.QObject,ou=i("JSON","stringify"),iu=X.f,su=L.f,fu=I.f,lu=N.f,Du=p([].push),pu=G("symbols"),bu=G("op-symbols"),yu=G("string-to-symbol-registry"),Fu=G("symbol-to-string-registry"),mu=G("wks"),Au=!cu||!cu.prototype||!cu.prototype.findChild,Eu=y&&A((function(){return 7!=R(su({},"a",{get:function(){return su(this,"a",{value:7}).a}})).a}))?function(u,d,t){var a=iu(nu,d);a&&delete nu[d],su(u,d,t),a&&u!==nu&&su(nu,d,a)}:su,wrap=function(u,d){var t=pu[u]=R(ru);return eu(t,{type:Q,tag:u,description:d}),y||(t.description=d),t},Cu=function defineProperty(u,d,t){u===nu&&Cu(bu,d,t),B(u);var a=k(d);return B(t),E(pu,a)?(t.enumerable?(E(u,K)&&u[K][a]&&(u[K][a]=!1),t=R(t,{enumerable:O(0,!1)})):(E(u,K)||su(u,K,O(1,{})),u[K][a]=!0),Eu(u,a,t)):su(u,a,t)},gu=function defineProperties(u,d){B(u);var t=j(d),a=_(t).concat(Bu(t));return J(a,(function(d){y&&!D(hu,t,d)||Cu(u,d,t[d])})),u},hu=function propertyIsEnumerable(u){var d=k(u),t=D(lu,this,d);return!(this===nu&&E(pu,d)&&!E(bu,d))&&(!(t||!E(this,d)||!E(pu,d)||E(this,K)&&this[K][d])||t)},xu=function getOwnPropertyDescriptor(u,d){var t=j(u),a=k(d);if(t!==nu||!E(pu,a)||E(bu,a)){var c=iu(t,a);return!c||!E(pu,a)||E(t,K)&&t[K][a]||(c.enumerable=!0),c}},vu=function getOwnPropertyNames(u){var d=fu(j(u)),t=[];return J(d,(function(u){E(pu,u)||E(z,u)||Du(t,u)})),t},Bu=function getOwnPropertySymbols(u){var d=u===nu,t=fu(d?bu:j(u)),a=[];return J(t,(function(u){!E(pu,u)||d&&!E(nu,u)||Du(a,pu[u])})),a};(m||(tu=function Symbol(){if(x(ru,this))throw au("Symbol is not a constructor");var u=arguments.length&&void 0!==arguments[0]?S(arguments[0]):void 0,d=$(u),setter=function(u){this===nu&&D(setter,bu,u),E(this,K)&&E(this[K],d)&&(this[K][d]=!1),Eu(this,d,O(1,u))};return y&&Au&&Eu(nu,d,{configurable:!0,set:setter}),wrap(d,u)},U(ru=tu.prototype,"toString",(function toString(){return du(this).tag})),U(tu,"withoutSetter",(function(u){return wrap($(u),u)})),N.f=hu,L.f=Cu,X.f=xu,T.f=I.f=vu,P.f=Bu,Z.f=function(u){return wrap(H(u),u)},y&&(su(ru,"description",{configurable:!0,get:function description(){return du(this).description}}),b||U(nu,"propertyIsEnumerable",hu,{unsafe:!0}))),a({global:!0,wrap:!0,forced:!m,sham:!m},{Symbol:tu}),J(_(mu),(function(u){Y(u)})),a({target:Q,stat:!0,forced:!m},{for:function(u){var d=S(u);if(E(yu,d))return yu[d];var t=tu(d);return yu[d]=t,Fu[t]=d,t},keyFor:function keyFor(u){if(!v(u))throw au(u+" is not a symbol");if(E(Fu,u))return Fu[u]},useSetter:function(){Au=!0},useSimple:function(){Au=!1}}),a({target:"Object",stat:!0,forced:!m,sham:!y},{create:function create(u,d){return void 0===d?R(u):gu(R(u),d)},defineProperty:Cu,defineProperties:gu,getOwnPropertyDescriptor:xu}),a({target:"Object",stat:!0,forced:!m},{getOwnPropertyNames:vu,getOwnPropertySymbols:Bu}),a({target:"Object",stat:!0,forced:A((function(){P.f(1)}))},{getOwnPropertySymbols:function getOwnPropertySymbols(u){return P.f(w(u))}}),ou)&&a({target:"JSON",stat:!0,forced:!m||A((function(){var u=tu();return"[null]"!=ou([u])||"{}"!=ou({a:u})||"{}"!=ou(Object(u))}))},{stringify:function stringify(u,d,t){var a=M(arguments),c=d;if((h(d)||void 0!==u)&&!v(u))return C(d)||(d=function(u,d){if(g(c)&&(d=D(c,this,u,d)),!v(d))return d}),a[1]=d,l(ou,null,a)}});if(!ru[uu]){var wu=ru.valueOf;U(ru,uu,(function(u){return D(wu,this)}))}V(tu,Q),z[K]=!0},{"../internals/an-object":60,"../internals/array-iteration":64,"../internals/array-slice":68,"../internals/create-property-descriptor":79,"../internals/define-well-known-symbol":82,"../internals/descriptors":83,"../internals/export":93,"../internals/fails":94,"../internals/function-apply":95,"../internals/function-call":97,"../internals/function-uncurry-this":99,"../internals/get-built-in":100,"../internals/global":104,"../internals/has-own-property":105,"../internals/hidden-keys":106,"../internals/internal-state":111,"../internals/is-array":113,"../internals/is-callable":114,"../internals/is-object":117,"../internals/is-pure":118,"../internals/is-symbol":119,"../internals/native-symbol":124,"../internals/object-create":127,"../internals/object-define-property":129,"../internals/object-get-own-property-descriptor":130,"../internals/object-get-own-property-names":132,"../internals/object-get-own-property-names-external":131,"../internals/object-get-own-property-symbols":133,"../internals/object-is-prototype-of":135,"../internals/object-keys":137,"../internals/object-property-is-enumerable":138,"../internals/redefine":143,"../internals/set-to-string-tag":147,"../internals/shared":150,"../internals/shared-key":148,"../internals/to-indexed-object":154,"../internals/to-object":157,"../internals/to-property-key":159,"../internals/to-string":161,"../internals/uid":163,"../internals/well-known-symbol":166,"../internals/well-known-symbol-wrapped":165}],191:[function(u,d,t){u("../internals/define-well-known-symbol")("matchAll")},{"../internals/define-well-known-symbol":82}],192:[function(u,d,t){u("../internals/define-well-known-symbol")("match")},{"../internals/define-well-known-symbol":82}],193:[function(u,d,t){u("../internals/define-well-known-symbol")("replace")},{"../internals/define-well-known-symbol":82}],194:[function(u,d,t){u("../internals/define-well-known-symbol")("search")},{"../internals/define-well-known-symbol":82}],195:[function(u,d,t){u("../internals/define-well-known-symbol")("species")},{"../internals/define-well-known-symbol":82}],196:[function(u,d,t){u("../internals/define-well-known-symbol")("split")},{"../internals/define-well-known-symbol":82}],197:[function(u,d,t){u("../internals/define-well-known-symbol")("toPrimitive")},{"../internals/define-well-known-symbol":82}],198:[function(u,d,t){u("../internals/define-well-known-symbol")("toStringTag")},{"../internals/define-well-known-symbol":82}],199:[function(u,d,t){u("../internals/define-well-known-symbol")("unscopables")},{"../internals/define-well-known-symbol":82}],200:[function(u,d,t){u("../internals/define-well-known-symbol")("asyncDispose")},{"../internals/define-well-known-symbol":82}],201:[function(u,d,t){u("../internals/define-well-known-symbol")("dispose")},{"../internals/define-well-known-symbol":82}],202:[function(u,d,t){u("../internals/define-well-known-symbol")("matcher")},{"../internals/define-well-known-symbol":82}],203:[function(u,d,t){u("../internals/define-well-known-symbol")("metadata")},{"../internals/define-well-known-symbol":82}],204:[function(u,d,t){u("../internals/define-well-known-symbol")("observable")},{"../internals/define-well-known-symbol":82}],205:[function(u,d,t){u("../internals/define-well-known-symbol")("patternMatch")},{"../internals/define-well-known-symbol":82}],206:[function(u,d,t){u("../internals/define-well-known-symbol")("replaceAll")},{"../internals/define-well-known-symbol":82}],207:[function(u,d,t){u("../modules/es.array.iterator");var a=u("../internals/dom-iterables"),c=u("../internals/global"),i=u("../internals/classof"),l=u("../internals/create-non-enumerable-property"),D=u("../internals/iterators"),p=u("../internals/well-known-symbol")("toStringTag");for(var b in a){var y=c[b],m=y&&y.prototype;m&&i(m)!==p&&l(m,p,b),D[b]=D.Array}},{"../internals/classof":75,"../internals/create-non-enumerable-property":78,"../internals/dom-iterables":85,"../internals/global":104,"../internals/iterators":122,"../internals/well-known-symbol":166,"../modules/es.array.iterator":173}],208:[function(u,d,t){var a=u("../../es/array/from");d.exports=a},{"../../es/array/from":34}],209:[function(u,d,t){var a=u("../../es/array/is-array");d.exports=a},{"../../es/array/is-array":35}],210:[function(u,d,t){var a=u("../../../es/array/virtual/for-each");d.exports=a},{"../../../es/array/virtual/for-each":37}],211:[function(u,d,t){var a=u("../es/get-iterator-method");u("../modules/web.dom-collections.iterator"),d.exports=a},{"../es/get-iterator-method":41,"../modules/web.dom-collections.iterator":207}],212:[function(u,d,t){var a=u("../../es/instance/concat");d.exports=a},{"../../es/instance/concat":42}],213:[function(u,d,t){var a=u("../../es/instance/flags");d.exports=a},{"../../es/instance/flags":43}],214:[function(u,d,t){u("../../modules/web.dom-collections.iterator");var a=u("../../internals/classof"),c=u("../../internals/has-own-property"),i=u("../../internals/object-is-prototype-of"),l=u("../array/virtual/for-each"),D=Array.prototype,p={DOMTokenList:!0,NodeList:!0};d.exports=function(u){var d=u.forEach;return u===D||i(D,u)&&d===D.forEach||c(p,a(u))?l:d}},{"../../internals/classof":75,"../../internals/has-own-property":105,"../../internals/object-is-prototype-of":135,"../../modules/web.dom-collections.iterator":207,"../array/virtual/for-each":210}],215:[function(u,d,t){var a=u("../../es/instance/index-of");d.exports=a},{"../../es/instance/index-of":44}],216:[function(u,d,t){var a=u("../../es/instance/slice");d.exports=a},{"../../es/instance/slice":45}],217:[function(u,d,t){var a=u("../../es/instance/sort");d.exports=a},{"../../es/instance/sort":46}],218:[function(u,d,t){var a=u("../../es/object/create");d.exports=a},{"../../es/object/create":47}],219:[function(u,d,t){var a=u("../../es/object/define-property");d.exports=a},{"../../es/object/define-property":48}],220:[function(u,d,t){var a=u("../es/parse-int");d.exports=a},{"../es/parse-int":49}],221:[function(u,d,t){var a=u("../../es/symbol");u("../../modules/web.dom-collections.iterator"),d.exports=a},{"../../es/symbol":51,"../../modules/web.dom-collections.iterator":207}],222:[function(u,d,t){d.exports=[{name:"C",alias:"Other",isBmpLast:!0,bmp:"\0--Ÿ­͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-؅؜۝܎܏݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏-ࢗ࣢঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠎᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿​-‏‪-‮⁠-⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽-＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcbd\udcc3-\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udbff][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca0-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\udd73-\udd7a\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00-\udcff\uddf0-\udfff]"},{name:"Cc",alias:"Control",bmp:"\0--Ÿ"},{name:"Cf",alias:"Format",bmp:"­؀-؅؜۝܏࢐࢑࣢᠎​-‏‪-‮⁠-⁤⁦-\ufeff-",astral:"\ud804[\udcbd\udccd]|\ud80d[\udc30-\udc38]|\ud82f[\udca0-\udca3]|\ud834[\udd73-\udd7a]|\udb40[\udc01\udc20-\udc7f]"},{name:"Cn",alias:"Unassigned",bmp:"͸͹΀-΃΋΍΢԰՗՘֋֌֐׈-׏׫-׮׵-׿܎݋݌޲-޿߻߼࠮࠯࠿࡜࡝࡟࡫-࡯࢏࢒-ࢗ঄঍঎঑঒঩঱঳-঵঺঻৅৆৉৊৏-৖৘-৛৞৤৥৿਀਄਋-਎਑਒਩਱਴਷਺਻਽੃-੆੉੊੎-੐੒-੘੝੟-੥੷-઀઄઎઒઩઱઴઺઻૆૊૎૏૑-૟૤૥૲-૸଀଄଍଎଑଒଩଱଴଺଻୅୆୉୊୎-୔୘-୛୞୤୥୸-஁஄஋-஍஑஖-஘஛஝஠-஢஥-஧஫-஭஺-஽௃-௅௉௎௏௑-௖௘-௥௻-௿఍఑఩఺఻౅౉౎-౔౗౛౜౞౟౤౥౰-౶಍಑಩಴಺಻೅೉೎-೔೗-೜೟೤೥೰ೳ-೿഍഑൅൉൐-൓൤൥඀඄඗-඙඲඼඾඿෇-෉෋-෎෕෗෠-෥෰෱෵-฀฻-฾๜-຀຃຅຋຤຦຾຿໅໇໎໏໚໛໠-໿཈཭-཰྘྽࿍࿛-࿿჆჈-჌჎჏቉቎቏቗቙቞቟኉኎኏኱኶኷኿዁዆዇዗጑጖጗፛፜፽-፿᎚-᎟᏶᏷᏾᏿᚝-᚟᛹-᛿᜖-᜞᜷-᜿᝔-᝟᝭᝱᝴-᝿៞៟៪-៯៺-៿᠚-᠟᡹-᡿᢫-᢯᣶-᣿᤟᤬-᤯᤼-᤿᥁-᥃᥮᥯᥵-᥿᦬-᦯᧊-᧏᧛-᧝᨜᨝᩟᩽᩾᪊-᪏᪚-᪟᪮᪯᫏-᫿᭍-᭏᭿᯴-᯻᰸-᰺᱊-᱌Ᲊ-᲏᲻᲼᳈-᳏᳻-᳿἖἗἞἟὆὇὎὏὘὚὜὞὾὿᾵῅῔῕῜῰῱῵῿⁥⁲⁳₏₝-₟⃁-⃏⃱-⃿↌-↏␧-␿⑋-⑟⭴⭵⮖⳴-⳸⴦⴨-⴬⴮⴯⵨-⵮⵱-⵾⶗-⶟⶧⶯⶷⶿⷇⷏⷗⷟⹞-⹿⺚⻴-⻿⿖-⿯⿼-⿿぀゗゘㄀-㄄㄰㆏㇤-㇯㈟꒍-꒏꓇-꓏꘬-꘿꛸-꛿Ɤ-꟏꟒꟔Ꟛ-꟱꠭-꠯꠺-꠿꡸-꡿꣆-꣍꣚-꣟꥔-꥞꥽-꥿꧎꧚-꧝꧿꨷-꨿꩎꩏꩚꩛꫃-꫚꫷-꬀꬇꬈꬏꬐꬗-꬟꬧꬯꭬-꭯꯮꯯꯺-꯿힤-힯퟇-퟊퟼-퟿﩮﩯﫚-﫿﬇-﬒﬘-﬜﬷﬽﬿﭂﭅﯃-﯒﶐﶑﷈-﷎﷐-﷯︚-︟﹓﹧﹬-﹯﹵﻽﻾＀﾿-￁￈￉￐￑￘￙￝-￟￧￯-￸￾￿",astral:"\ud800[\udc0c\udc27\udc3b\udc3e\udc4e\udc4f\udc5e-\udc7f\udcfb-\udcff\udd03-\udd06\udd34-\udd36\udd8f\udd9d-\udd9f\udda1-\uddcf\uddfe-\ude7f\ude9d-\ude9f\uded1-\udedf\udefc-\udeff\udf24-\udf2c\udf4b-\udf4f\udf7b-\udf7f\udf9e\udfc4-\udfc7\udfd6-\udfff]|\ud801[\udc9e\udc9f\udcaa-\udcaf\udcd4-\udcd7\udcfc-\udcff\udd28-\udd2f\udd64-\udd6e\udd7b\udd8b\udd93\udd96\udda2\uddb2\uddba\uddbd-\uddff\udf37-\udf3f\udf56-\udf5f\udf68-\udf7f\udf86\udfb1\udfbb-\udfff]|\ud802[\udc06\udc07\udc09\udc36\udc39-\udc3b\udc3d\udc3e\udc56\udc9f-\udca6\udcb0-\udcdf\udcf3\udcf6-\udcfa\udd1c-\udd1e\udd3a-\udd3e\udd40-\udd7f\uddb8-\uddbb\uddd0\uddd1\ude04\ude07-\ude0b\ude14\ude18\ude36\ude37\ude3b-\ude3e\ude49-\ude4f\ude59-\ude5f\udea0-\udebf\udee7-\udeea\udef7-\udeff\udf36-\udf38\udf56\udf57\udf73-\udf77\udf92-\udf98\udf9d-\udfa8\udfb0-\udfff]|\ud803[\udc49-\udc7f\udcb3-\udcbf\udcf3-\udcf9\udd28-\udd2f\udd3a-\ude5f\ude7f\udeaa\udeae\udeaf\udeb2-\udeff\udf28-\udf2f\udf5a-\udf6f\udf8a-\udfaf\udfcc-\udfdf\udff7-\udfff]|\ud804[\udc4e-\udc51\udc76-\udc7e\udcc3-\udccc\udcce\udccf\udce9-\udcef\udcfa-\udcff\udd35\udd48-\udd4f\udd77-\udd7f\udde0\uddf5-\uddff\ude12\ude3f-\ude7f\ude87\ude89\ude8e\ude9e\udeaa-\udeaf\udeeb-\udeef\udefa-\udeff\udf04\udf0d\udf0e\udf11\udf12\udf29\udf31\udf34\udf3a\udf45\udf46\udf49\udf4a\udf4e\udf4f\udf51-\udf56\udf58-\udf5c\udf64\udf65\udf6d-\udf6f\udf75-\udfff]|\ud805[\udc5c\udc62-\udc7f\udcc8-\udccf\udcda-\udd7f\uddb6\uddb7\uddde-\uddff\ude45-\ude4f\ude5a-\ude5f\ude6d-\ude7f\udeba-\udebf\udeca-\udeff\udf1b\udf1c\udf2c-\udf2f\udf47-\udfff]|\ud806[\udc3c-\udc9f\udcf3-\udcfe\udd07\udd08\udd0a\udd0b\udd14\udd17\udd36\udd39\udd3a\udd47-\udd4f\udd5a-\udd9f\udda8\udda9\uddd8\uddd9\udde5-\uddff\ude48-\ude4f\udea3-\udeaf\udef9-\udfff]|\ud807[\udc09\udc37\udc46-\udc4f\udc6d-\udc6f\udc90\udc91\udca8\udcb7-\udcff\udd07\udd0a\udd37-\udd39\udd3b\udd3e\udd48-\udd4f\udd5a-\udd5f\udd66\udd69\udd8f\udd92\udd99-\udd9f\uddaa-\udedf\udef9-\udfaf\udfb1-\udfbf\udff2-\udffe]|\ud808[\udf9a-\udfff]|\ud809[\udc6f\udc75-\udc7f\udd44-\udfff]|[\ud80a\ud80e-\ud810\ud812-\ud819\ud824-\ud82a\ud82d\ud82e\ud830-\ud832\ud83f\ud87b-\ud87d\ud87f\ud885-\udb3f\udb41-\udb7f][\udc00-\udfff]|\ud80b[\udc00-\udf8f\udff3-\udfff]|\ud80d[\udc2f\udc39-\udfff]|\ud811[\ude47-\udfff]|\ud81a[\ude39-\ude3f\ude5f\ude6a-\ude6d\udebf\udeca-\udecf\udeee\udeef\udef6-\udeff\udf46-\udf4f\udf5a\udf62\udf78-\udf7c\udf90-\udfff]|\ud81b[\udc00-\ude3f\ude9b-\udeff\udf4b-\udf4e\udf88-\udf8e\udfa0-\udfdf\udfe5-\udfef\udff2-\udfff]|\ud821[\udff8-\udfff]|\ud823[\udcd6-\udcff\udd09-\udfff]|\ud82b[\udc00-\udfef\udff4\udffc\udfff]|\ud82c[\udd23-\udd4f\udd53-\udd63\udd68-\udd6f\udefc-\udfff]|\ud82f[\udc6b-\udc6f\udc7d-\udc7f\udc89-\udc8f\udc9a\udc9b\udca4-\udfff]|\ud833[\udc00-\udeff\udf2e\udf2f\udf47-\udf4f\udfc4-\udfff]|\ud834[\udcf6-\udcff\udd27\udd28\uddeb-\uddff\ude46-\udedf\udef4-\udeff\udf57-\udf5f\udf79-\udfff]|\ud835[\udc55\udc9d\udca0\udca1\udca3\udca4\udca7\udca8\udcad\udcba\udcbc\udcc4\udd06\udd0b\udd0c\udd15\udd1d\udd3a\udd3f\udd45\udd47-\udd49\udd51\udea6\udea7\udfcc\udfcd]|\ud836[\ude8c-\ude9a\udea0\udeb0-\udfff]|\ud837[\udc00-\udeff\udf1f-\udfff]|\ud838[\udc07\udc19\udc1a\udc22\udc25\udc2b-\udcff\udd2d-\udd2f\udd3e\udd3f\udd4a-\udd4d\udd50-\ude8f\udeaf-\udebf\udefa-\udefe\udf00-\udfff]|\ud839[\udc00-\udfdf\udfe7\udfec\udfef\udfff]|\ud83a[\udcc5\udcc6\udcd7-\udcff\udd4c-\udd4f\udd5a-\udd5d\udd60-\udfff]|\ud83b[\udc00-\udc70\udcb5-\udd00\udd3e-\uddff\ude04\ude20\ude23\ude25\ude26\ude28\ude33\ude38\ude3a\ude3c-\ude41\ude43-\ude46\ude48\ude4a\ude4c\ude50\ude53\ude55\ude56\ude58\ude5a\ude5c\ude5e\ude60\ude63\ude65\ude66\ude6b\ude73\ude78\ude7d\ude7f\ude8a\ude9c-\udea0\udea4\udeaa\udebc-\udeef\udef2-\udfff]|\ud83c[\udc2c-\udc2f\udc94-\udc9f\udcaf\udcb0\udcc0\udcd0\udcf6-\udcff\uddae-\udde5\ude03-\ude0f\ude3c-\ude3f\ude49-\ude4f\ude52-\ude5f\ude66-\udeff]|\ud83d[\uded8-\udedc\udeed-\udeef\udefd-\udeff\udf74-\udf7f\udfd9-\udfdf\udfec-\udfef\udff1-\udfff]|\ud83e[\udc0c-\udc0f\udc48-\udc4f\udc5a-\udc5f\udc88-\udc8f\udcae\udcaf\udcb2-\udcff\ude54-\ude5f\ude6e\ude6f\ude75-\ude77\ude7d-\ude7f\ude87-\ude8f\udead-\udeaf\udebb-\udebf\udec6-\udecf\udeda-\udedf\udee8-\udeef\udef7-\udeff\udf93\udfcb-\udfef\udffa-\udfff]|\ud869[\udee0-\udeff]|\ud86d[\udf39-\udf3f]|\ud86e[\udc1e\udc1f]|\ud873[\udea2-\udeaf]|\ud87a[\udfe1-\udfff]|\ud87e[\ude1e-\udfff]|\ud884[\udf4b-\udfff]|\udb40[\udc00\udc02-\udc1f\udc80-\udcff\uddf0-\udfff]|[\udbbf\udbff][\udffe\udfff]"},{name:"Co",alias:"Private_Use",bmp:"-",astral:"[\udb80-\udbbe\udbc0-\udbfe][\udc00-\udfff]|[\udbbf\udbff][\udc00-\udffd]"},{name:"Cs",alias:"Surrogate",bmp:"\ud800-\udfff"},{name:"L",alias:"Letter",bmp:"A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc\ude00-\udf36\udf40-\udf55\udf60-\udf67\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udca0-\udcdf\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf50\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf1e]|\ud838[\udd00-\udd2c\udd37-\udd3d\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd4b]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"LC",alias:"Cased_Letter",bmp:"A-Za-zµÀ-ÖØ-öø-ƺƼ-ƿDŽ-ʓʕ-ʯͰ-ͳͶͷͻ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՠ-ֈႠ-ჅჇჍა-ჺჽ-ჿᎠ-Ᏽᏸ-ᏽᲀ-ᲈᲐ-ᲺᲽ-Ჿᴀ-ᴫᵫ-ᵷᵹ-ᶚḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℴℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-ⱻⱾ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭꙀ-ꙭꚀ-ꚛꜢ-ꝯꝱ-ꞇꞋ-ꞎꞐ-ꟊꟐꟑꟓꟕ-ꟙꟵꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗA-Za-z",astral:"\ud801[\udc00-\udc4f\udcb0-\udcd3\udcd8-\udcfb\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udc80-\udcb2\udcc0-\udcf2]|\ud806[\udca0-\udcdf]|\ud81b[\ude40-\ude7f]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd00-\udd43]"},{name:"Ll",alias:"Lowercase_Letter",bmp:"a-zµß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž-ƀƃƅƈƌƍƒƕƙ-ƛƞơƣƥƨƪƫƭưƴƶƹƺƽ-ƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳ-ȹȼȿɀɂɇɉɋɍɏ-ʓʕ-ʯͱͳͷͻ-ͽΐά-ώϐϑϕ-ϗϙϛϝϟϡϣϥϧϩϫϭϯ-ϳϵϸϻϼа-џѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӏӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹӻӽӿԁԃԅԇԉԋԍԏԑԓԕԗԙԛԝԟԡԣԥԧԩԫԭԯՠ-ֈა-ჺჽ-ჿᏸ-ᏽᲀ-ᲈᴀ-ᴫᵫ-ᵷᵹ-ᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕ-ẝẟạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹỻỽỿ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶᾷιῂ-ῄῆῇῐ-ΐῖῗῠ-ῧῲ-ῴῶῷℊℎℏℓℯℴℹℼℽⅆ-ⅉⅎↄⰰ-ⱟⱡⱥⱦⱨⱪⱬⱱⱳⱴⱶ-ⱻⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⳬⳮⳳⴀ-ⴥⴧⴭꙁꙃꙅꙇꙉꙋꙍꙏꙑꙓꙕꙗꙙꙛꙝꙟꙡꙣꙥꙧꙩꙫꙭꚁꚃꚅꚇꚉꚋꚍꚏꚑꚓꚕꚗꚙꚛꜣꜥꜧꜩꜫꜭꜯ-ꜱꜳꜵꜷꜹꜻꜽꜿꝁꝃꝅꝇꝉꝋꝍꝏꝑꝓꝕꝗꝙꝛꝝꝟꝡꝣꝥꝧꝩꝫꝭꝯꝱ-ꝸꝺꝼꝿꞁꞃꞅꞇꞌꞎꞑꞓ-ꞕꞗꞙꞛꞝꞟꞡꞣꞥꞧꞩꞯꞵꞷꞹꞻꞽꞿꟁꟃꟈꟊꟑꟓꟕꟗꟙꟶꟺꬰ-ꭚꭠ-ꭨꭰ-ꮿff-stﬓ-ﬗa-z",astral:"\ud801[\udc28-\udc4f\udcd8-\udcfb\udd97-\udda1\udda3-\uddb1\uddb3-\uddb9\uddbb\uddbc]|\ud803[\udcc0-\udcf2]|\ud806[\udcc0-\udcdf]|\ud81b[\ude60-\ude7f]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb]|\ud837[\udf00-\udf09\udf0b-\udf1e]|\ud83a[\udd22-\udd43]"},{name:"Lm",alias:"Modifier_Letter",bmp:"ʰ-ˁˆ-ˑˠ-ˤˬˮʹͺՙـۥۦߴߵߺࠚࠤࠨࣉॱๆໆჼៗᡃᪧᱸ-ᱽᴬ-ᵪᵸᶛ-ᶿⁱⁿₐ-ₜⱼⱽⵯⸯ々〱-〵〻ゝゞー-ヾꀕꓸ-ꓽꘌꙿꚜꚝꜗ-ꜟꝰꞈꟲ-ꟴꟸꟹꧏꧦꩰꫝꫳꫴꭜ-ꭟꭩー゙゚",astral:"\ud801[\udf80-\udf85\udf87-\udfb0\udfb2-\udfba]|\ud81a[\udf40-\udf43]|\ud81b[\udf93-\udf9f\udfe0\udfe1\udfe3]|\ud82b[\udff0-\udff3\udff5-\udffb\udffd\udffe]|\ud838[\udd37-\udd3d]|𞥋"},{name:"Lo",alias:"Other_Letter",bmp:"ªºƻǀ-ǃʔא-תׯ-ײؠ-ؿف-يٮٯٱ-ۓەۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪࠀ-ࠕࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣈऄ-हऽॐक़-ॡॲ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๅກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎᄀ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛱ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៜᠠ-ᡂᡄ-ᡸᢀ-ᢄᢇ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱷᳩ-ᳬᳮ-ᳳᳵᳶᳺℵ-ℸⴰ-ⵧⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ〆〼ぁ-ゖゟァ-ヺヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꀔꀖ-ꒌꓐ-ꓷꔀ-ꘋꘐ-ꘟꘪꘫꙮꚠ-ꛥꞏꟷꟻ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧠ-ꧤꧧ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩯꩱ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛꫜꫠ-ꫪꫲꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎יִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼヲ-ッア-ンᅠ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",astral:"\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf40\udf42-\udf49\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc50-\udc9d\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udd00-\udd23\ude80-\udea9\udeb0\udeb1\udf00-\udf1c\udf27\udf30-\udf45\udf70-\udf81\udfb0-\udfc4\udfe0-\udff6]|\ud804[\udc03-\udc37\udc71\udc72\udc75\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd47\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f-\udc61\udc80-\udcaf\udcc4\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a\udf40-\udf46]|\ud806[\udc00-\udc2b\udcff-\udd06\udd09\udd0c-\udd13\udd15\udd16\udd18-\udd2f\udd3f\udd41\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udeb0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67\udd68\udd6a-\udd89\udd98\udee0-\udef2\udfb0]|\ud808[\udc00-\udf99]|\ud809[\udc80-\udd43]|\ud80b[\udf90-\udff0]|[\ud80c\ud81c-\ud820\ud822\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872\ud874-\ud879\ud880-\ud883][\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude70-\udebe\uded0-\udeed\udf00-\udf2f\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf4a\udf50]|\ud821[\udc00-\udff7]|\ud823[\udc00-\udcd5\udd00-\udd08]|\ud82c[\udc00-\udd22\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|𝼊|\ud838[\udd00-\udd2c\udd4e\ude90-\udead\udec0-\udeeb]|\ud839[\udfe0-\udfe6\udfe8-\udfeb\udfed\udfee\udff0-\udffe]|\ud83a[\udc00-\udcc4]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud869[\udc00-\udedf\udf00-\udfff]|\ud86d[\udc00-\udf38\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\ud884[\udc00-\udf4a]"},{name:"Lt",alias:"Titlecase_Letter",bmp:"DžLjNjDzᾈ-ᾏᾘ-ᾟᾨ-ᾯᾼῌῼ"},{name:"Lu",alias:"Uppercase_Letter",bmp:"A-ZÀ-ÖØ-ÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉ-ƋƎ-ƑƓƔƖ-ƘƜƝƟƠƢƤƦƧƩƬƮƯƱ-ƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶ-ǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁɃ-ɆɈɊɌɎͰͲͶͿΆΈ-ΊΌΎΏΑ-ΡΣ-ΫϏϒ-ϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽ-ЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸӺӼӾԀԂԄԆԈԊԌԎԐԒԔԖԘԚԜԞԠԢԤԦԨԪԬԮԱ-ՖႠ-ჅჇჍᎠ-ᏵᲐ-ᲺᲽ-ᲿḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẞẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸỺỼỾἈ-ἏἘ-ἝἨ-ἯἸ-ἿὈ-ὍὙὛὝὟὨ-ὯᾸ-ΆῈ-ΉῘ-ΊῨ-ῬῸ-Ώℂℇℋ-ℍℐ-ℒℕℙ-ℝℤΩℨK-ℭℰ-ℳℾℿⅅↃⰀ-ⰯⱠⱢ-ⱤⱧⱩⱫⱭ-ⱰⱲⱵⱾ-ⲀⲂⲄⲆⲈⲊⲌⲎⲐⲒⲔⲖⲘⲚⲜⲞⲠⲢⲤⲦⲨⲪⲬⲮⲰⲲⲴⲶⲸⲺⲼⲾⳀⳂⳄⳆⳈⳊⳌⳎⳐⳒⳔⳖⳘⳚⳜⳞⳠⳢⳫⳭⳲꙀꙂꙄꙆꙈꙊꙌꙎꙐꙒꙔꙖꙘꙚꙜꙞꙠꙢꙤꙦꙨꙪꙬꚀꚂꚄꚆꚈꚊꚌꚎꚐꚒꚔꚖꚘꚚꜢꜤꜦꜨꜪꜬꜮꜲꜴꜶꜸꜺꜼꜾꝀꝂꝄꝆꝈꝊꝌꝎꝐꝒꝔꝖꝘꝚꝜꝞꝠꝢꝤꝦꝨꝪꝬꝮꝹꝻꝽꝾꞀꞂꞄꞆꞋꞍꞐꞒꞖꞘꞚꞜꞞꞠꞢꞤꞦꞨꞪ-ꞮꞰ-ꞴꞶꞸꞺꞼꞾꟀꟂꟄ-ꟇꟉꟐꟖꟘꟵA-Z",astral:"\ud801[\udc00-\udc27\udcb0-\udcd3\udd70-\udd7a\udd7c-\udd8a\udd8c-\udd92\udd94\udd95]|\ud803[\udc80-\udcb2]|\ud806[\udca0-\udcbf]|\ud81b[\ude40-\ude5f]|\ud835[\udc00-\udc19\udc34-\udc4d\udc68-\udc81\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb5\udcd0-\udce9\udd04\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd38\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd6c-\udd85\udda0-\uddb9\uddd4-\udded\ude08-\ude21\ude3c-\ude55\ude70-\ude89\udea8-\udec0\udee2-\udefa\udf1c-\udf34\udf56-\udf6e\udf90-\udfa8\udfca]|\ud83a[\udd00-\udd21]"},{name:"M",alias:"Mark",bmp:"̀-ͯ҃-҉֑-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣඁ-ඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-ᫎᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿⃐-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯-꙲ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc00-\udc02\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc82\udcb0-\udcba\udcc2\udd00-\udd02\udd27-\udd34\udd45\udd46\udd73\udd80-\udd82\uddb3-\uddc0\uddc9-\uddcc\uddce\uddcf\ude2c-\ude37\ude3e\udedf-\udeea\udf00-\udf03\udf3b\udf3c\udf3e-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc35-\udc46\udc5e\udcb0-\udcc3\uddaf-\uddb5\uddb8-\uddc0\udddc\udddd\ude30-\ude40\udeab-\udeb7\udf1d-\udf2b]|\ud806[\udc2c-\udc3a\udd30-\udd35\udd37\udd38\udd3b-\udd3e\udd40\udd42\udd43\uddd1-\uddd7\uddda-\udde0\udde4\ude01-\ude0a\ude33-\ude39\ude3b-\ude3e\ude47\ude51-\ude5b\ude8a-\ude99]|\ud807[\udc2f-\udc36\udc38-\udc3f\udc92-\udca7\udca9-\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd8a-\udd8e\udd90\udd91\udd93-\udd97\udef3-\udef6]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf51-\udf87\udf8f-\udf92\udfe4\udff0\udff1]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"Mc",alias:"Spacing_Mark",bmp:"ःऻा-ीॉ-ौॎॏংঃা-ীেৈোৌৗਃਾ-ੀઃા-ીૉોૌଂଃାୀେୈୋୌୗாிுூெ-ைொ-ௌௗఁ-ఃు-ౄಂಃಾೀ-ೄೇೈೊೋೕೖംഃാ-ീെ-ൈൊ-ൌൗංඃා-ෑෘ-ෟෲෳ༾༿ཿါာေးျြၖၗၢ-ၤၧ-ၭႃႄႇ-ႌႏႚ-ႜ᜕᜴ាើ-ៅះៈᤣ-ᤦᤩ-ᤫᤰᤱᤳ-ᤸᨙᨚᩕᩗᩡᩣᩤᩭ-ᩲᬄᬵᬻᬽ-ᭁᭃ᭄ᮂᮡᮦᮧ᮪ᯧᯪ-ᯬᯮ᯲᯳ᰤ-ᰫᰴᰵ᳡᳷〮〯ꠣꠤꠧꢀꢁꢴ-ꣃꥒ꥓ꦃꦴꦵꦺꦻꦾ-꧀ꨯꨰꨳꨴꩍꩻꩽꫫꫮꫯꫵꯣꯤꯦꯧꯩꯪ꯬",astral:"\ud804[\udc00\udc02\udc82\udcb0-\udcb2\udcb7\udcb8\udd2c\udd45\udd46\udd82\uddb3-\uddb5\uddbf\uddc0\uddce\ude2c-\ude2e\ude32\ude33\ude35\udee0-\udee2\udf02\udf03\udf3e\udf3f\udf41-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf62\udf63]|\ud805[\udc35-\udc37\udc40\udc41\udc45\udcb0-\udcb2\udcb9\udcbb-\udcbe\udcc1\uddaf-\uddb1\uddb8-\uddbb\uddbe\ude30-\ude32\ude3b\ude3c\ude3e\udeac\udeae\udeaf\udeb6\udf20\udf21\udf26]|\ud806[\udc2c-\udc2e\udc38\udd30-\udd35\udd37\udd38\udd3d\udd40\udd42\uddd1-\uddd3\udddc-\udddf\udde4\ude39\ude57\ude58\ude97]|\ud807[\udc2f\udc3e\udca9\udcb1\udcb4\udd8a-\udd8e\udd93\udd94\udd96\udef5\udef6]|\ud81b[\udf51-\udf87\udff0\udff1]|\ud834[\udd65\udd66\udd6d-\udd72]"},{name:"Me",alias:"Enclosing_Mark",bmp:"҈҉᪾⃝-⃠⃢-⃤꙰-꙲"},{name:"Mn",alias:"Nonspacing_Mark",bmp:"̀-ͯ҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࢘-࢟࣊-ࣣ࣡-ंऺ़ु-ै्॑-ॗॢॣঁ়ু-ৄ্ৢৣ৾ਁਂ਼ੁੂੇੈੋ-੍ੑੰੱੵઁં઼ુ-ૅેૈ્ૢૣૺ-૿ଁ଼ିୁ-ୄ୍୕ୖୢୣஂீ்ఀఄ఼ా-ీె-ైొ-్ౕౖౢౣಁ಼ಿೆೌ್ೢೣഀഁ഻഼ു-ൄ്ൢൣඁ්ි-ුූัิ-ฺ็-๎ັິ-ຼ່-ໍཱ༹༘༙༵༷-ཾྀ-྄྆྇ྍ-ྗྙ-ྼ࿆ိ-ူဲ-့္်ွှၘၙၞ-ၠၱ-ၴႂႅႆႍႝ፝-፟ᜒ-᜔ᜲᜳᝒᝓᝲᝳ឴឵ិ-ួំ៉-៓៝᠋-᠍᠏ᢅᢆᢩᤠ-ᤢᤧᤨᤲ᤹-᤻ᨘᨗᨛᩖᩘ-ᩞ᩠ᩢᩥ-ᩬᩳ-᩿᩼᪰-᪽ᪿ-ᫎᬀ-ᬃ᬴ᬶ-ᬺᬼᭂ᭫-᭳ᮀᮁᮢ-ᮥᮨᮩ᮫-ᮭ᯦ᯨᯩᯭᯯ-ᯱᰬ-ᰳᰶ᰷᳐-᳔᳒-᳢᳠-᳨᳭᳴᳸᳹᷀-᷿⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〭꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠥꠦ꠬꣄ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-ꥑꦀ-ꦂ꦳ꦶ-ꦹꦼꦽꧥꨩ-ꨮꨱꨲꨵꨶꩃꩌꩼꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫬꫭ꫶ꯥꯨ꯭ﬞ︀-️︠-︯",astral:"\ud800[\uddfd\udee0\udf76-\udf7a]|\ud802[\ude01-\ude03\ude05\ude06\ude0c-\ude0f\ude38-\ude3a\ude3f\udee5\udee6]|\ud803[\udd24-\udd27\udeab\udeac\udf46-\udf50\udf82-\udf85]|\ud804[\udc01\udc38-\udc46\udc70\udc73\udc74\udc7f-\udc81\udcb3-\udcb6\udcb9\udcba\udcc2\udd00-\udd02\udd27-\udd2b\udd2d-\udd34\udd73\udd80\udd81\uddb6-\uddbe\uddc9-\uddcc\uddcf\ude2f-\ude31\ude34\ude36\ude37\ude3e\udedf\udee3-\udeea\udf00\udf01\udf3b\udf3c\udf40\udf66-\udf6c\udf70-\udf74]|\ud805[\udc38-\udc3f\udc42-\udc44\udc46\udc5e\udcb3-\udcb8\udcba\udcbf\udcc0\udcc2\udcc3\uddb2-\uddb5\uddbc\uddbd\uddbf\uddc0\udddc\udddd\ude33-\ude3a\ude3d\ude3f\ude40\udeab\udead\udeb0-\udeb5\udeb7\udf1d-\udf1f\udf22-\udf25\udf27-\udf2b]|\ud806[\udc2f-\udc37\udc39\udc3a\udd3b\udd3c\udd3e\udd43\uddd4-\uddd7\uddda\udddb\udde0\ude01-\ude0a\ude33-\ude38\ude3b-\ude3e\ude47\ude51-\ude56\ude59-\ude5b\ude8a-\ude96\ude98\ude99]|\ud807[\udc30-\udc36\udc38-\udc3d\udc3f\udc92-\udca7\udcaa-\udcb0\udcb2\udcb3\udcb5\udcb6\udd31-\udd36\udd3a\udd3c\udd3d\udd3f-\udd45\udd47\udd90\udd91\udd95\udd97\udef3\udef4]|\ud81a[\udef0-\udef4\udf30-\udf36]|\ud81b[\udf4f\udf8f-\udf92\udfe4]|\ud82f[\udc9d\udc9e]|\ud833[\udf00-\udf2d\udf30-\udf46]|\ud834[\udd67-\udd69\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23\udc24\udc26-\udc2a\udd30-\udd36\udeae\udeec-\udeef]|\ud83a[\udcd0-\udcd6\udd44-\udd4a]|\udb40[\udd00-\uddef]"},{name:"N",alias:"Number",bmp:"0-9²³¹¼-¾٠-٩۰-۹߀-߉०-९০-৯৴-৹੦-੯૦-૯୦-୯୲-୷௦-௲౦-౯౸-౾೦-೯൘-൞൦-൸෦-෯๐-๙໐-໙༠-༳၀-၉႐-႙፩-፼ᛮ-ᛰ០-៩៰-៹᠐-᠙᥆-᥏᧐-᧚᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙⁰⁴-⁹₀-₉⅐-ↂↅ-↉①-⒛⓪-⓿❶-➓⳽〇〡-〩〸-〺㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꘠-꘩ꛦ-ꛯ꠰-꠵꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud800[\udd07-\udd33\udd40-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23\udf41\udf4a\udfd1-\udfd5]|\ud801[\udca0-\udca9]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\udd30-\udd39\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udde1-\uddf4\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf3b]|\ud806[\udce0-\udcf2\udd50-\udd59]|\ud807[\udc50-\udc6c\udd50-\udd59\udda0-\udda9\udfc0-\udfd4]|\ud809[\udc00-\udc6e]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udcc7-\udccf\udd50-\udd59]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]|\ud83e[\udff0-\udff9]"},{name:"Nd",alias:"Decimal_Number",bmp:"0-9٠-٩۰-۹߀-߉०-९০-৯੦-੯૦-૯୦-୯௦-௯౦-౯೦-೯൦-൯෦-෯๐-๙໐-໙༠-༩၀-၉႐-႙០-៩᠐-᠙᥆-᥏᧐-᧙᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙꘠-꘩꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9",astral:"\ud801[\udca0-\udca9]|\ud803[\udd30-\udd39]|\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udef0-\udef9]|\ud805[\udc50-\udc59\udcd0-\udcd9\ude50-\ude59\udec0-\udec9\udf30-\udf39]|\ud806[\udce0-\udce9\udd50-\udd59]|\ud807[\udc50-\udc59\udd50-\udd59\udda0-\udda9]|\ud81a[\ude60-\ude69\udec0-\udec9\udf50-\udf59]|\ud835[\udfce-\udfff]|\ud838[\udd40-\udd49\udef0-\udef9]|\ud83a[\udd50-\udd59]|\ud83e[\udff0-\udff9]"},{name:"Nl",alias:"Letter_Number",bmp:"ᛮ-ᛰⅠ-ↂↅ-ↈ〇〡-〩〸-〺ꛦ-ꛯ",astral:"\ud800[\udd40-\udd74\udf41\udf4a\udfd1-\udfd5]|\ud809[\udc00-\udc6e]"},{name:"No",alias:"Other_Number",bmp:"²³¹¼-¾৴-৹୲-୷௰-௲౸-౾൘-൞൰-൸༪-༳፩-፼៰-៹᧚⁰⁴-⁹₀-₉⅐-⅟↉①-⒛⓪-⓿❶-➓⳽㆒-㆕㈠-㈩㉈-㉏㉑-㉟㊀-㊉㊱-㊿꠰-꠵",astral:"\ud800[\udd07-\udd33\udd75-\udd78\udd8a\udd8b\udee1-\udefb\udf20-\udf23]|\ud802[\udc58-\udc5f\udc79-\udc7f\udca7-\udcaf\udcfb-\udcff\udd16-\udd1b\uddbc\uddbd\uddc0-\uddcf\uddd2-\uddff\ude40-\ude48\ude7d\ude7e\ude9d-\ude9f\udeeb-\udeef\udf58-\udf5f\udf78-\udf7f\udfa9-\udfaf]|\ud803[\udcfa-\udcff\ude60-\ude7e\udf1d-\udf26\udf51-\udf54\udfc5-\udfcb]|\ud804[\udc52-\udc65\udde1-\uddf4]|\ud805[\udf3a\udf3b]|\ud806[\udcea-\udcf2]|\ud807[\udc5a-\udc6c\udfc0-\udfd4]|\ud81a[\udf5b-\udf61]|\ud81b[\ude80-\ude96]|\ud834[\udee0-\udef3\udf60-\udf78]|\ud83a[\udcc7-\udccf]|\ud83b[\udc71-\udcab\udcad-\udcaf\udcb1-\udcb4\udd01-\udd2d\udd2f-\udd3d]|\ud83c[\udd00-\udd0c]"},{name:"P",alias:"Punctuation",bmp:"!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}¡§«¶·»¿;·՚-՟։֊־׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔༺-༽྅࿐-࿔࿙࿚၊-၏჻፠-፨᐀᙮᚛᚜᛫-᛭᜵᜶។-៖៘-៚᠀-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‐-‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎⌈-⌋〈〉❨-❵⟅⟆⟦-⟯⦃-⦘⧘-⧛⧼⧽⳹-⳼⳾⳿⵰⸀-⸮⸰-⹏⹒-⹝、-〃〈-】〔-〟〰〽゠・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udead\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Pc",alias:"Connector_Punctuation",bmp:"_‿⁀⁔︳︴﹍-﹏_"},{name:"Pd",alias:"Dash_Punctuation",bmp:"\\-֊־᐀᠆‐-―⸗⸚⸺⸻⹀⹝〜〰゠︱︲﹘﹣-",astral:"𐺭"},{name:"Pe",alias:"Close_Punctuation",bmp:"\\)\\]\\}༻༽᚜⁆⁾₎⌉⌋〉❩❫❭❯❱❳❵⟆⟧⟩⟫⟭⟯⦄⦆⦈⦊⦌⦎⦐⦒⦔⦖⦘⧙⧛⧽⸣⸥⸧⸩⹖⹘⹚⹜〉》」』】〕〗〙〛〞〟﴾︘︶︸︺︼︾﹀﹂﹄﹈﹚﹜﹞)]}⦆」"},{name:"Pf",alias:"Final_Punctuation",bmp:"»’”›⸃⸅⸊⸍⸝⸡"},{name:"Pi",alias:"Initial_Punctuation",bmp:"«‘‛“‟‹⸂⸄⸉⸌⸜⸠"},{name:"Po",alias:"Other_Punctuation",bmp:"!-#%-'\\*,\\.\\/:;\\?@\\¡§¶·¿;·՚-՟։׀׃׆׳״؉؊،؍؛؝-؟٪-٭۔܀-܍߷-߹࠰-࠾࡞।॥॰৽੶૰౷಄෴๏๚๛༄-༒༔྅࿐-࿔࿙࿚၊-၏჻፠-፨᙮᛫-᛭᜵᜶។-៖៘-៚᠀-᠅᠇-᠊᥄᥅᨞᨟᪠-᪦᪨-᪭᭚-᭠᭽᭾᯼-᯿᰻-᰿᱾᱿᳀-᳇᳓‖‗†-‧‰-‸※-‾⁁-⁃⁇-⁑⁓⁕-⁞⳹-⳼⳾⳿⵰⸀⸁⸆-⸈⸋⸎-⸖⸘⸙⸛⸞⸟⸪-⸮⸰-⸹⸼-⸿⹁⹃-⹏⹒-⹔、-〃〽・꓾꓿꘍-꘏꙳꙾꛲-꛷꡴-꡷꣎꣏꣸-꣺꣼꤮꤯꥟꧁-꧍꧞꧟꩜-꩟꫞꫟꫰꫱꯫︐-︖︙︰﹅﹆﹉-﹌﹐-﹒﹔-﹗﹟-﹡﹨﹪﹫!-#%-'*,./:;?@\。、・",astral:"\ud800[\udd00-\udd02\udf9f\udfd0]|𐕯|\ud802[\udc57\udd1f\udd3f\ude50-\ude58\ude7f\udef0-\udef6\udf39-\udf3f\udf99-\udf9c]|\ud803[\udf55-\udf59\udf86-\udf89]|\ud804[\udc47-\udc4d\udcbb\udcbc\udcbe-\udcc1\udd40-\udd43\udd74\udd75\uddc5-\uddc8\uddcd\udddb\udddd-\udddf\ude38-\ude3d\udea9]|\ud805[\udc4b-\udc4f\udc5a\udc5b\udc5d\udcc6\uddc1-\uddd7\ude41-\ude43\ude60-\ude6c\udeb9\udf3c-\udf3e]|\ud806[\udc3b\udd44-\udd46\udde2\ude3f-\ude46\ude9a-\ude9c\ude9e-\udea2]|\ud807[\udc41-\udc45\udc70\udc71\udef7\udef8\udfff]|\ud809[\udc70-\udc74]|\ud80b[\udff1\udff2]|\ud81a[\ude6e\ude6f\udef5\udf37-\udf3b\udf44]|\ud81b[\ude97-\ude9a\udfe2]|𛲟|\ud836[\ude87-\ude8b]|\ud83a[\udd5e\udd5f]"},{name:"Ps",alias:"Open_Punctuation",bmp:"\\(\\[\\{༺༼᚛‚„⁅⁽₍⌈⌊〈❨❪❬❮❰❲❴⟅⟦⟨⟪⟬⟮⦃⦅⦇⦉⦋⦍⦏⦑⦓⦕⦗⧘⧚⧼⸢⸤⸦⸨⹂⹕⹗⹙⹛〈《「『【〔〖〘〚〝﴿︗︵︷︹︻︽︿﹁﹃﹇﹙﹛﹝([{⦅「"},{name:"S",alias:"Symbol",bmp:"\\$\\+<->\\^`\\|~¢-¦¨©¬®-±´¸×÷˂-˅˒-˟˥-˫˭˯-˿͵΄΅϶҂֍-֏؆-؈؋؎؏۞۩۽۾߶߾߿࢈৲৳৺৻૱୰௳-௺౿൏൹฿༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭៛᥀᧞-᧿᭡-᭪᭴-᭼᾽᾿-῁῍-῏῝-῟῭-`´῾⁄⁒⁺-⁼₊-₌₠-⃀℀℁℃-℆℈℉℔№-℘℞-℣℥℧℩℮℺℻⅀-⅄⅊-⅍⅏↊↋←-⌇⌌-⌨⌫-␦⑀-⑊⒜-ⓩ─-❧➔-⟄⟇-⟥⟰-⦂⦙-⧗⧜-⧻⧾-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿゛゜㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꜀-꜖꜠꜡꞉꞊꠨-꠫꠶-꠹꩷-꩹꭛꭪꭫﬩﮲-﯂﵀-﵏﷏﷼-﷿﹢﹤-﹦﹩$+<->^`|~¢-₩│-○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|\ud838[\udd4f\udeff]|\ud83b[\udcac\udcb0\udd2e\udef0\udef1]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udfff]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Sc",alias:"Currency_Symbol",bmp:"\\$¢-¥֏؋߾߿৲৳৻૱௹฿៛₠-⃀꠸﷼﹩$¢£¥₩",astral:"\ud807[\udfdd-\udfe0]|𞋿|𞲰"},{name:"Sk",alias:"Modifier_Symbol",bmp:"\\^`¨¯´¸˂-˅˒-˟˥-˫˭˯-˿͵΄΅࢈᾽᾿-῁῍-῏῝-῟῭-`´῾゛゜꜀-꜖꜠꜡꞉꞊꭛꭪꭫﮲-﯂^` ̄",astral:"\ud83c[\udffb-\udfff]"},{name:"Sm",alias:"Math_Symbol",bmp:"\\+<->\\|~¬±×÷϶؆-؈⁄⁒⁺-⁼₊-₌℘⅀-⅄⅋←-↔↚↛↠↣↦↮⇎⇏⇒⇔⇴-⋿⌠⌡⍼⎛-⎳⏜-⏡▷◁◸-◿♯⟀-⟄⟇-⟥⟰-⟿⤀-⦂⦙-⧗⧜-⧻⧾-⫿⬰-⭄⭇-⭌﬩﹢﹤-﹦+<->|~¬←-↓",astral:"\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83b[\udef0\udef1]"},{name:"So",alias:"Other_Symbol",bmp:"¦©®°҂֍֎؎؏۞۩۽۾߶৺୰௳-௸௺౿൏൹༁-༃༓༕-༗༚-༟༴༶༸྾-࿅࿇-࿌࿎࿏࿕-࿘႞႟᎐-᎙᙭᥀᧞-᧿᭡-᭪᭴-᭼℀℁℃-℆℈℉℔№℗℞-℣℥℧℩℮℺℻⅊⅌⅍⅏↊↋↕-↙↜-↟↡↢↤↥↧-↭↯-⇍⇐⇑⇓⇕-⇳⌀-⌇⌌-⌟⌢-⌨⌫-⍻⍽-⎚⎴-⏛⏢-␦⑀-⑊⒜-ⓩ─-▶▸-◀◂-◷☀-♮♰-❧➔-➿⠀-⣿⬀-⬯⭅⭆⭍-⭳⭶-⮕⮗-⯿⳥-⳪⹐⹑⺀-⺙⺛-⻳⼀-⿕⿰-⿻〄〒〓〠〶〷〾〿㆐㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉇㉐㉠-㉿㊊-㊰㋀-㏿䷀-䷿꒐-꓆꠨-꠫꠶꠷꠹꩷-꩹﵀-﵏﷏﷽-﷿¦│■○�",astral:"\ud800[\udd37-\udd3f\udd79-\udd89\udd8c-\udd8e\udd90-\udd9c\udda0\uddd0-\uddfc]|\ud802[\udc77\udc78\udec8]|𑜿|\ud807[\udfd5-\udfdc\udfe1-\udff1]|\ud81a[\udf3c-\udf3f\udf45]|𛲜|\ud833[\udf50-\udfc3]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83\udd84\udd8c-\udda9\uddae-\uddea\ude00-\ude41\ude45\udf00-\udf56]|\ud836[\udc00-\uddff\ude37-\ude3a\ude6d-\ude74\ude76-\ude83\ude85\ude86]|𞅏|\ud83b[\udcac\udd2e]|\ud83c[\udc00-\udc2b\udc30-\udc93\udca0-\udcae\udcb1-\udcbf\udcc1-\udccf\udcd1-\udcf5\udd0d-\uddad\udde6-\ude02\ude10-\ude3b\ude40-\ude48\ude50\ude51\ude60-\ude65\udf00-\udffa]|\ud83d[\udc00-\uded7\udedd-\udeec\udef0-\udefc\udf00-\udf73\udf80-\udfd8\udfe0-\udfeb\udff0]|\ud83e[\udc00-\udc0b\udc10-\udc47\udc50-\udc59\udc60-\udc87\udc90-\udcad\udcb0\udcb1\udd00-\ude53\ude60-\ude6d\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec5\uded0-\uded9\udee0-\udee7\udef0-\udef6\udf00-\udf92\udf94-\udfca]"},{name:"Z",alias:"Separator",bmp:"   - \u2028\u2029   "},{name:"Zl",alias:"Line_Separator",bmp:"\u2028"},{name:"Zp",alias:"Paragraph_Separator",bmp:"\u2029"},{name:"Zs",alias:"Space_Separator",bmp:"   -    "}]},{}]},{},[3])(3)})); diff --git a/django/contrib/admin/templates/admin/actions.html b/django/contrib/admin/templates/admin/actions.html index b912d3739608..f506c9233432 100644 --- a/django/contrib/admin/templates/admin/actions.html +++ b/django/contrib/admin/templates/admin/actions.html @@ -2,7 +2,7 @@ <div class="actions"> {% block actions %} {% block actions-form %} - {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% endif %}{% endfor %} + {% for field in action_form %}{% if field.label %}<label>{{ field.label }} {{ field }}</label>{% else %}{{ field }}{% endif %}{% endfor %} {% endblock %} {% block actions-submit %} <button type="submit" class="button" title="{% translate "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% translate "Go" %}</button> @@ -11,11 +11,11 @@ {% if actions_selection_counter %} <span class="action-counter" data-actions-icnt="{{ cl.result_list|length }}">{{ selection_note }}</span> {% if cl.result_count != cl.result_list|length %} - <span class="all">{{ selection_note_all }}</span> - <span class="question"> - <a href="#" title="{% translate "Click here to select the objects across all pages" %}">{% blocktranslate with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktranslate %}</a> + <span class="all hidden">{{ selection_note_all }}</span> + <span class="question hidden"> + <a role="button" href="#" title="{% translate "Click here to select the objects across all pages" %}">{% blocktranslate with cl.result_count as total_count %}Select all {{ total_count }} {{ module_name }}{% endblocktranslate %}</a> </span> - <span class="clear"><a href="#">{% translate "Clear selection" %}</a></span> + <span class="clear hidden"><a role="button" href="#">{% translate "Clear selection" %}</a></span> {% endif %} {% endif %} {% endblock %} diff --git a/django/contrib/admin/templates/admin/app_index.html b/django/contrib/admin/templates/admin/app_index.html index 886bf6ca00da..727f72b190ef 100644 --- a/django/contrib/admin/templates/admin/app_index.html +++ b/django/contrib/admin/templates/admin/app_index.html @@ -4,14 +4,16 @@ {% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %} {% if not is_popup %} -{% block breadcrumbs %} -<div class="breadcrumbs"> -<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> -› -{% for app in app_list %} -{{ app.name }} -{% endfor %} -</div> +{% block nav-breadcrumbs %} + <nav aria-label="{% translate 'Breadcrumbs' %}"> + <div class="breadcrumbs"> + <a href="{% url 'admin:index' %}">{% translate 'Home' %}</a> + › + {% for app in app_list %} + {{ app.name }} + {% endfor %} + </div> + </nav> {% endblock %} {% endif %} diff --git a/django/contrib/admin/templates/admin/app_list.html b/django/contrib/admin/templates/admin/app_list.html index ea4a85bd0bf0..60d874b2b699 100644 --- a/django/contrib/admin/templates/admin/app_list.html +++ b/django/contrib/admin/templates/admin/app_list.html @@ -2,35 +2,46 @@ {% if app_list %} {% for app in app_list %} - <div class="app-{{ app.app_label }} module{% if app.app_url in request.path %} current-app{% endif %}"> + <div class="app-{{ app.app_label }} module{% if app.app_url in request.path|urlencode %} current-app{% endif %}"> <table> <caption> <a href="{{ app.app_url }}" class="section" title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">{{ app.name }}</a> </caption> + <thead class="visually-hidden"> + <tr> + <th scope="col">{% translate 'Model name' %}</th> + <th scope="col">{% translate 'Add link' %}</th> + <th scope="col">{% translate 'Change or view list link' %}</th> + </tr> + </thead> {% for model in app.models %} - <tr class="model-{{ model.object_name|lower }}{% if model.admin_url in request.path %} current-model{% endif %}"> - {% if model.admin_url %} - <th scope="row"><a href="{{ model.admin_url }}"{% if model.admin_url in request.path %} aria-current="page"{% endif %}>{{ model.name }}</a></th> - {% else %} - <th scope="row">{{ model.name }}</th> - {% endif %} - - {% if model.add_url %} - <td><a href="{{ model.add_url }}" class="addlink">{% translate 'Add' %}</a></td> - {% else %} - <td></td> - {% endif %} + {% with model_name=model.object_name|lower %} + <tr class="model-{{ model_name }}{% if model.admin_url in request.path|urlencode %} current-model{% endif %}"> + <th scope="row" id="{{ app.app_label }}-{{ model_name }}"> + {% if model.admin_url %} + <a href="{{ model.admin_url }}"{% if model.admin_url in request.path|urlencode %} aria-current="page"{% endif %}>{{ model.name }}</a> + {% else %} + {{ model.name }} + {% endif %} + </th> - {% if model.admin_url and show_changelinks %} - {% if model.view_only %} - <td><a href="{{ model.admin_url }}" class="viewlink">{% translate 'View' %}</a></td> + {% if model.add_url %} + <td><a href="{{ model.add_url }}" class="addlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Add' %}</a></td> {% else %} - <td><a href="{{ model.admin_url }}" class="changelink">{% translate 'Change' %}</a></td> + <td></td> {% endif %} - {% elif show_changelinks %} - <td></td> - {% endif %} - </tr> + + {% if model.admin_url and show_changelinks %} + {% if model.view_only %} + <td><a href="{{ model.admin_url }}" class="viewlink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'View' %}</a></td> + {% else %} + <td><a href="{{ model.admin_url }}" class="changelink" aria-describedby="{{ app.app_label }}-{{ model_name }}">{% translate 'Change' %}</a></td> + {% endif %} + {% elif show_changelinks %} + <td></td> + {% endif %} + </tr> + {% endwith %} {% endfor %} </table> </div> diff --git a/django/contrib/admin/templates/admin/auth/user/add_form.html b/django/contrib/admin/templates/admin/auth/user/add_form.html index 61cf5b1b4061..7c7ca1d1ad3c 100644 --- a/django/contrib/admin/templates/admin/auth/user/add_form.html +++ b/django/contrib/admin/templates/admin/auth/user/add_form.html @@ -1,10 +1,16 @@ {% extends "admin/change_form.html" %} -{% load i18n %} +{% load i18n static %} {% block form_top %} {% if not is_popup %} - <p>{% translate 'First, enter a username and password. Then, you’ll be able to edit more user options.' %}</p> - {% else %} - <p>{% translate "Enter a username and password." %}</p> + <p>{% translate "After you’ve created a user, you’ll be able to edit more user options." %}</p> {% endif %} {% endblock %} +{% block extrahead %} + {{ block.super }} + <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> +{% endblock %} +{% block admin_change_form_document_ready %} + {{ block.super }} + <script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> +{% endblock %} diff --git a/django/contrib/admin/templates/admin/auth/user/change_password.html b/django/contrib/admin/templates/admin/auth/user/change_password.html index 895374deea09..2f96a7143629 100644 --- a/django/contrib/admin/templates/admin/auth/user/change_password.html +++ b/django/contrib/admin/templates/admin/auth/user/change_password.html @@ -2,7 +2,12 @@ {% load i18n static %} {% load admin_urls %} -{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">{% endblock %} +{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} +{% block extrastyle %} + {{ block.super }} + <link rel="stylesheet" href="{% static "admin/css/forms.css" %}"> + <link rel="stylesheet" href="{% static 'admin/css/unusable_password_field.css' %}"> +{% endblock %} {% block bodyclass %}{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form{% endblock %} {% if not is_popup %} {% block breadcrumbs %} @@ -11,47 +16,66 @@ › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> › <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> › <a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">{{ original|truncatewords:"18" }}</a> -› {% translate 'Change password' %} +› {% if form.user.has_usable_password %}{% translate 'Change password' %}{% else %}{% translate 'Set password' %}{% endif %} </div> {% endblock %} {% endif %} {% block content %}<div id="content-main"> <form{% if form_url %} action="{{ form_url }}"{% endif %} method="post" id="{{ opts.model_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %} -<input type="text" name="username" value="{{ original.get_username }}" style="display: none"> +<input type="text" name="username" value="{{ original.get_username }}" class="hidden"> <div> -{% if is_popup %}<input type="hidden" name="_popup" value="1">{% endif %} +{% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1">{% endif %} {% if form.errors %} <p class="errornote"> - {% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} + {% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %} </p> {% endif %} <p>{% blocktranslate with username=original %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktranslate %}</p> +{% if not form.user.has_usable_password %} + <p>{% blocktranslate %}This action will <strong>enable</strong> password-based authentication for this user.{% endblocktranslate %}</p> +{% endif %} <fieldset class="module aligned"> <div class="form-row"> + {{ form.usable_password.errors }} + <div class="flex-container">{{ form.usable_password.label_tag }} {{ form.usable_password }}</div> + {% if form.usable_password.help_text %} + <div class="help"{% if form.usable_password.id_for_label %} id="{{ form.usable_password.id_for_label }}_helptext"{% endif %}> + <p>{{ form.usable_password.help_text|safe }}</p> + </div> + {% endif %} +</div> + +<div class="form-row field-password1"> {{ form.password1.errors }} - {{ form.password1.label_tag }} {{ form.password1 }} + <div class="flex-container">{{ form.password1.label_tag }} {{ form.password1 }}</div> {% if form.password1.help_text %} - <div class="help">{{ form.password1.help_text|safe }}</div> + <div class="help"{% if form.password1.id_for_label %} id="{{ form.password1.id_for_label }}_helptext"{% endif %}>{{ form.password1.help_text|safe }}</div> {% endif %} </div> -<div class="form-row"> +<div class="form-row field-password2"> {{ form.password2.errors }} - {{ form.password2.label_tag }} {{ form.password2 }} + <div class="flex-container">{{ form.password2.label_tag }} {{ form.password2 }}</div> {% if form.password2.help_text %} - <div class="help">{{ form.password2.help_text|safe }}</div> + <div class="help"{% if form.password2.id_for_label %} id="{{ form.password2.id_for_label }}_helptext"{% endif %}>{{ form.password2.help_text|safe }}</div> {% endif %} </div> </fieldset> <div class="submit-row"> -<input type="submit" value="{% translate 'Change password' %}" class="default"> + {% if form.user.has_usable_password %} + <input type="submit" name="set-password" value="{% translate 'Change password' %}" class="default set-password"> + <input type="submit" name="unset-password" value="{% translate 'Disable password-based authentication' %}" class="unset-password"> + {% else %} + <input type="submit" name="set-password" value="{% translate 'Enable password-based authentication' %}" class="default set-password"> + {% endif %} </div> </div> </form></div> +<script src="{% static 'admin/js/unusable_password_field.js' %}" defer></script> {% endblock %} diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index 3f39cd5b8f5a..92f7210e028f 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -1,34 +1,37 @@ {% load i18n static %}<!DOCTYPE html> {% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %} -<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> +<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" dir="{{ LANGUAGE_BIDI|yesno:'rtl,ltr,auto' }}"> <head> <title>{% block title %}{% endblock %} - + +{% block dark-mode-vars %} + + +{% endblock %} {% if not is_popup and is_nav_sidebar_enabled %} - - + {% endif %} {% block extrastyle %}{% endblock %} -{% if LANGUAGE_BIDI %}{% endif %} +{% if LANGUAGE_BIDI %}{% endif %} {% block extrahead %}{% endblock %} {% block responsive %} - - - {% if LANGUAGE_BIDI %}{% endif %} + + + {% if LANGUAGE_BIDI %}{% endif %} {% endblock %} {% block blockbots %}{% endblock %} -{% load i18n %} - +{% translate 'Skip to main content' %}
{% if not is_popup %} - {% endif %} {% endblock %} {% block nav-global %}{% endblock %} -
+ + {% endblock %} - {% block breadcrumbs %} - + {% block nav-breadcrumbs %} + {% endblock %} {% endif %} -
+
{% if not is_popup and is_nav_sidebar_enabled %} {% block nav-sidebar %} {% include "admin/nav_sidebar.html" %} {% endblock %} {% endif %} -
+
{% block messages %} {% if messages %}
    {% for message in messages %} @@ -86,18 +98,28 @@
    {% block pretitle %}{% endblock %} {% block content_title %}{% if title %}

    {{ title }}

    {% endif %}{% endblock %} + {% block object-tools %}{% endblock %} + {% block content_subtitle %}{% if subtitle %}

    {{ subtitle }}

    {% endif %}{% endblock %} {% block content %} - {% block object-tools %}{% endblock %} {{ content }} {% endblock %} {% block sidebar %}{% endblock %}
    - {% block footer %}{% endblock %} -
+
+
{% block footer %}{% endblock %}
+ + + + + + + + +{% block extrabody %}{% endblock extrabody %} diff --git a/django/contrib/admin/templates/admin/base_site.html b/django/contrib/admin/templates/admin/base_site.html index cae0a691e36f..4405998164eb 100644 --- a/django/contrib/admin/templates/admin/base_site.html +++ b/django/contrib/admin/templates/admin/base_site.html @@ -1,9 +1,12 @@ {% extends "admin/base.html" %} -{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} +{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} -

{{ site_header|default:_('Django administration') }}

+ +{% if user.is_anonymous %} + {% include "admin/color_theme_toggle.html" %} +{% endif %} {% endblock %} {% block nav-global %}{% endblock %} diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index 21b1c9bceb5d..11536b0965d2 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -1,12 +1,13 @@ {% extends "admin/base_site.html" %} {% load i18n admin_urls static admin_modify %} +{% block title %}{% if errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} {% block extrahead %}{{ block.super }} {{ media }} {% endblock %} -{% block extrastyle %}{{ block.super }}{% endblock %} +{% block extrastyle %}{{ block.super }}{% endblock %} {% block coltype %}colM{% endblock %} @@ -23,16 +24,17 @@ {% endblock %} {% endif %} -{% block content %}
{% block object-tools %} -{% if change %}{% if not is_popup %} +{% if change and not is_popup %}
    {% block object-tools-items %} {% change_form_object_tools %} {% endblock %}
-{% endif %}{% endif %} +{% endif %} {% endblock %} + +{% block content %}
{% csrf_token %}{% block form_top %}{% endblock %}
{% if is_popup %}{% endif %} @@ -40,14 +42,14 @@ {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %} {% if errors %}

- {% if errors|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} + {% blocktranslate count counter=errors|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %}

{{ adminform.form.non_field_errors }} {% endif %} {% block field_sets %} {% for fieldset in adminform %} - {% include "admin/includes/fieldset.html" %} + {% include "admin/includes/fieldset.html" with heading_level=2 prefix="fieldset" id_prefix=0 id_suffix=forloop.counter0 %} {% endfor %} {% endblock %} diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index b426373410b7..cf96df9fe24c 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -1,11 +1,12 @@ {% extends "admin/base_site.html" %} {% load i18n admin_urls static admin_list %} +{% block title %}{% if cl.formset and cl.formset.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} {% block extrastyle %} {{ block.super }} - + {% if cl.formset %} - + {% endif %} {% if cl.formset or action_form %} @@ -21,6 +22,7 @@ {% block extrahead %} {{ block.super }} {{ media.js }} + {% endblock %} {% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} @@ -37,49 +39,57 @@ {% block coltype %}{% endblock %} +{% block object-tools %} +
    + {% block object-tools-items %} + {% change_list_object_tools %} + {% endblock %} +
+{% endblock %} + {% block content %}
- {% block object-tools %} -
    - {% block object-tools-items %} - {% change_list_object_tools %} - {% endblock %} -
- {% endblock %} {% if cl.formset and cl.formset.errors %}

- {% if cl.formset.total_error_count == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} + {% blocktranslate count counter=cl.formset.total_error_count %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %}

{{ cl.formset.non_form_errors }} {% endif %}
- {% block search %}{% search_form cl %}{% endblock %} - {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} +
+ {% block search %}{% search_form cl %}{% endblock %} + {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} - {% block filters %} - {% if cl.has_filters %} -
-

{% translate 'Filter' %}

- {% if cl.has_active_filters %}

- ✖ {% translate "Clear all filters" %} -

{% endif %} - {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} -
+ {% csrf_token %} + {% if cl.formset %} +
{{ cl.formset.management_form }}
{% endif %} - {% endblock %} - {% csrf_token %} - {% if cl.formset %} -
{{ cl.formset.management_form }}
- {% endif %} - - {% block result_list %} + {% block result_list %} {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} {% result_list cl %} {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} + {% endblock %} + {% block pagination %}{% pagination cl %}{% endblock %} + +
+ {% block filters %} + {% if cl.has_filters %} + + {% endif %} {% endblock %} - {% block pagination %}{% pagination cl %}{% endblock %} -
{% endblock %} diff --git a/django/contrib/admin/templates/admin/change_list_results.html b/django/contrib/admin/templates/admin/change_list_results.html index 7eeba04f7cd1..d2a9feed2085 100644 --- a/django/contrib/admin/templates/admin/change_list_results.html +++ b/django/contrib/admin/templates/admin/change_list_results.html @@ -1,4 +1,4 @@ -{% load i18n static %} +{% load i18n %} {% if result_hidden_fields %}
{# DIV for HTML validation #} {% for item in result_hidden_fields %}{{ item }}{% endfor %} @@ -10,15 +10,13 @@ {% for header in result_headers %} - - {% if header.sortable %} - {% if header.sort_priority > 0 %} + + {% if header.sortable and header.sort_priority > 0 %}
{% if num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %} - +
- {% endif %} {% endif %}
{% if header.sortable %}{{ header.text|capfirst }}{% else %}{{ header.text|capfirst }}{% endif %}
diff --git a/django/contrib/admin/templates/admin/color_theme_toggle.html b/django/contrib/admin/templates/admin/color_theme_toggle.html new file mode 100644 index 000000000000..2caa19edbf1f --- /dev/null +++ b/django/contrib/admin/templates/admin/color_theme_toggle.html @@ -0,0 +1,15 @@ +{% load i18n %} + diff --git a/django/contrib/admin/templates/admin/date_hierarchy.html b/django/contrib/admin/templates/admin/date_hierarchy.html index 65ae80013411..c50885642844 100644 --- a/django/contrib/admin/templates/admin/date_hierarchy.html +++ b/django/contrib/admin/templates/admin/date_hierarchy.html @@ -1,16 +1,14 @@ {% if show %} -
-
-
+ {% endif %} diff --git a/django/contrib/admin/templates/admin/delete_confirmation.html b/django/contrib/admin/templates/admin/delete_confirmation.html index d4c9b295a131..e3f08ee6515d 100644 --- a/django/contrib/admin/templates/admin/delete_confirmation.html +++ b/django/contrib/admin/templates/admin/delete_confirmation.html @@ -21,24 +21,21 @@ {% block content %} {% if perms_lacking %} -

{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

-
    - {% for obj in perms_lacking %} -
  • {{ obj }}
  • - {% endfor %} -
+ {% block delete_forbidden %} +

{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} “{{ escaped_object }}” would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

+
    {{ perms_lacking|unordered_list }}
+ {% endblock %} {% elif protected %} -

{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:{% endblocktranslate %}

-
    - {% for obj in protected %} -
  • {{ obj }}
  • - {% endfor %} -
+ {% block delete_protected %} +

{% blocktranslate with escaped_object=object %}Deleting the {{ object_name }} “{{ escaped_object }}” would require deleting the following protected related objects:{% endblocktranslate %}

+
    {{ protected|unordered_list }}
+ {% endblock %} {% else %} -

{% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktranslate %}

+ {% block delete_confirm %} +

{% blocktranslate with escaped_object=object %}Are you sure you want to delete the {{ object_name }} “{{ escaped_object }}”? All of the following related items will be deleted:{% endblocktranslate %}

{% include "admin/includes/object_delete_summary.html" %}

{% translate "Objects" %}

-
    {{ deleted_objects|unordered_list }}
+
    {{ deleted_objects|unordered_list }}
{% csrf_token %}
@@ -48,5 +45,6 @@

{% translate "Objects" %}

{% translate "No, take me back" %}
+ {% endblock %} {% endif %} -{% endblock %} +{% endblock content %} diff --git a/django/contrib/admin/templates/admin/delete_selected_confirmation.html b/django/contrib/admin/templates/admin/delete_selected_confirmation.html index a49b6adeebdd..51b93a5f49cf 100644 --- a/django/contrib/admin/templates/admin/delete_selected_confirmation.html +++ b/django/contrib/admin/templates/admin/delete_selected_confirmation.html @@ -21,18 +21,10 @@ {% block content %} {% if perms_lacking %}

{% blocktranslate %}Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktranslate %}

-
    - {% for obj in perms_lacking %} -
  • {{ obj }}
  • - {% endfor %} -
+
    {{ perms_lacking|unordered_list }}
{% elif protected %}

{% blocktranslate %}Deleting the selected {{ objects_name }} would require deleting the following protected related objects:{% endblocktranslate %}

-
    - {% for obj in protected %} -
  • {{ obj }}
  • - {% endfor %} -
+
    {{ protected|unordered_list }}
{% else %}

{% blocktranslate %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktranslate %}

{% include "admin/includes/object_delete_summary.html" %} diff --git a/django/contrib/admin/templates/admin/edit_inline/stacked.html b/django/contrib/admin/templates/admin/edit_inline/stacked.html index 0292c6ef9975..a6939f4ea276 100644 --- a/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ b/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -1,25 +1,38 @@ -{% load i18n admin_urls static %} +{% load i18n admin_urls %}
-
-

{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}

+
+ {% if inline_admin_formset.is_collapsible %}
{% endif %} +

+ {% if inline_admin_formset.formset.max_num == 1 %} + {{ inline_admin_formset.opts.verbose_name|capfirst }} + {% else %} + {{ inline_admin_formset.opts.verbose_name_plural|capfirst }} + {% endif %} +

+ {% if inline_admin_formset.is_collapsible %}
{% endif %} {{ inline_admin_formset.formset.management_form }} {{ inline_admin_formset.formset.non_form_errors }} -{% for inline_admin_form in inline_admin_formset %}
-

{{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}{% endif %} +{% for inline_admin_form in inline_admin_formset %}
+

{{ inline_admin_formset.opts.verbose_name|capfirst }}: {% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} {% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}{% endif %} {% else %}#{{ forloop.counter }}{% endif %} {% if inline_admin_form.show_url %}{% translate "View on site" %}{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}{% endif %}

{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} - {% for fieldset in inline_admin_form %} - {% include "admin/includes/fieldset.html" %} - {% endfor %} + + {% with parent_counter=forloop.counter0 %} + {% for fieldset in inline_admin_form %} + {% include "admin/includes/fieldset.html" with heading_level=4 prefix=fieldset.formset.prefix id_prefix=parent_counter id_suffix=forloop.counter0 %} + {% endfor %} + {% endwith %} + {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %}
{% endfor %} + {% if inline_admin_formset.is_collapsible %}

{% endif %}
diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html index c19d28406228..9367ac9b6343 100644 --- a/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ b/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -4,20 +4,26 @@ data-inline-formset="{{ inline_admin_formset.inline_formset_data }}">
diff --git a/django/contrib/admin/templates/admin/filter.html b/django/contrib/admin/templates/admin/filter.html index 35dc553bd8ac..a6094ecb5a53 100644 --- a/django/contrib/admin/templates/admin/filter.html +++ b/django/contrib/admin/templates/admin/filter.html @@ -1,8 +1,12 @@ {% load i18n %} -

{% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}

-
    -{% for choice in choices %} +
    + + {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %} + + + {{ choice.display }} + {% endfor %} +
+ diff --git a/django/contrib/admin/templates/admin/includes/fieldset.html b/django/contrib/admin/templates/admin/includes/fieldset.html index 218fd5a4c17c..9c9b31965ae5 100644 --- a/django/contrib/admin/templates/admin/includes/fieldset.html +++ b/django/contrib/admin/templates/admin/includes/fieldset.html @@ -1,29 +1,39 @@ -
- {% if fieldset.name %}

{{ fieldset.name }}

{% endif %} +
+ {% if fieldset.name %} + {% if fieldset.is_collapsible %}
{% endif %} + {{ fieldset.name }} + {% if fieldset.is_collapsible %}{% endif %} + {% endif %} {% if fieldset.description %}
{{ fieldset.description|safe }}
{% endif %} {% for line in fieldset %} -
- {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} +
+ {% if line.fields|length == 1 %}{{ line.errors }}{% else %}
{% endif %} {% for field in line %} - - {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} - {% if field.is_checkbox %} - {{ field.field }}{{ field.label_tag }} - {% else %} - {{ field.label_tag }} - {% if field.is_readonly %} -
{{ field.contents }}
- {% else %} - {{ field.field }} - {% endif %} - {% endif %} +
+ {% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %} +
+ {% if field.is_checkbox %} + {{ field.field }}{{ field.label_tag }} + {% else %} + {{ field.label_tag }} + {% if field.is_readonly %} +
{{ field.contents }}
+ {% else %} + {{ field.field }} + {% endif %} + {% endif %} +
{% if field.field.help_text %} -
{{ field.field.help_text|safe }}
+
+
{{ field.field.help_text|safe }}
+
{% endif %}
{% endfor %} + {% if not line.fields|length == 1 %}
{% endif %}
{% endfor %} + {% if fieldset.name and fieldset.is_collapsible %}
{% endif %}
diff --git a/django/contrib/admin/templates/admin/index.html b/django/contrib/admin/templates/admin/index.html index b6e84b64ed72..899727a4bad8 100644 --- a/django/contrib/admin/templates/admin/index.html +++ b/django/contrib/admin/templates/admin/index.html @@ -1,13 +1,13 @@ {% extends "admin/base_site.html" %} {% load i18n static %} -{% block extrastyle %}{{ block.super }}{% endblock %} +{% block extrastyle %}{{ block.super }}{% endblock %} {% block coltype %}colMS{% endblock %} {% block bodyclass %}{{ block.super }} dashboard{% endblock %} -{% block breadcrumbs %}{% endblock %} +{% block nav-breadcrumbs %}{% endblock %} {% block nav-sidebar %}{% endblock %} @@ -30,6 +30,7 @@

{% translate 'My actions' %}

    {% for entry in admin_log %}
  • + {% if entry.is_addition %}{% translate 'Added:' %}{% elif entry.is_change %}{% translate 'Changed:' %}{% elif entry.is_deletion %}{% translate 'Deleted:' %}{% endif %} {% if entry.is_deletion or not entry.get_admin_url %} {{ entry.object_repr }} {% else %} diff --git a/django/contrib/admin/templates/admin/login.html b/django/contrib/admin/templates/admin/login.html index 7a192a4bdf9b..fa0dcbc01db1 100644 --- a/django/contrib/admin/templates/admin/login.html +++ b/django/contrib/admin/templates/admin/login.html @@ -1,7 +1,8 @@ {% extends "admin/base_site.html" %} {% load i18n static %} -{% block extrastyle %}{{ block.super }} +{% block title %}{% if form.errors %}{% translate "Error:" %} {% endif %}{{ block.super }}{% endblock %} +{% block extrastyle %}{{ block.super }} {{ form.media }} {% endblock %} @@ -15,12 +16,12 @@ {% block content_title %}{% endblock %} -{% block breadcrumbs %}{% endblock %} +{% block nav-breadcrumbs %}{% endblock %} {% block content %} {% if form.errors and not form.non_field_errors %}

    -{% if form.errors.items|length == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +{% blocktranslate count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktranslate %}

    {% endif %} @@ -56,7 +57,7 @@ {% url 'admin_password_reset' as password_reset_url %} {% if password_reset_url %} {% endif %}
    diff --git a/django/contrib/admin/templates/admin/nav_sidebar.html b/django/contrib/admin/templates/admin/nav_sidebar.html index 9fde4c28e11b..37cdac218491 100644 --- a/django/contrib/admin/templates/admin/nav_sidebar.html +++ b/django/contrib/admin/templates/admin/nav_sidebar.html @@ -1,5 +1,9 @@ -{% load i18n %} +{% load i18n static %} -
  • {% endfor %}
-
{% if not is_email %} +
Local Vars {% if request %} Request Method: {{ request.META.REQUEST_METHOD }} -Request URL: {{ request.get_raw_uri }} +Request URL: {{ request_insecure_uri }} {% endif %} Django Version: {{ django_version_info }} Python Version: {{ sys_version_info }} @@ -311,7 +322,7 @@

Local Vars

{% endif %}{% endif %}{% if template_info %} Template error: In template {{ template_info.name }}, error at line {{ template_info.line }} - {{ template_info.message }} + {{ template_info.message|force_escape }} {% for source_line in template_info.source_lines %}{% if source_line.0 == template_info.line %} {{ source_line.0 }} : {{ template_info.before }} {{ template_info.during }} {{ template_info.after }}{% else %} {{ source_line.0 }} : {{ source_line.1 }}{% endif %}{% endfor %}{% endif %} Traceback (most recent call last):{% for frame in frames %} @@ -319,18 +330,18 @@

Local Vars

The above exception ({{ frame.exc_cause|force_escape }}) was the direct cause of the following exception: {% else %} During handling of the above exception ({{ frame.exc_cause|force_escape }}), another exception occurred: -{% endif %}{% endif %}{% endifchanged %} File "{{ frame.filename }}"{% if frame.context_line %}, line {{ frame.lineno }}{% endif %}, in {{ frame.function }} -{% if frame.context_line %} {% spaceless %}{{ frame.context_line }}{% endspaceless %}{% endif %}{% endfor %} +{% endif %}{% endif %}{% endifchanged %} {% if frame.tb %}File "{{ frame.filename }}"{% if frame.context_line %}, line {{ frame.lineno }}{% endif %}, in {{ frame.function }} +{% if frame.context_line %} {% spaceless %}{{ frame.context_line }}{% endspaceless %}{{ frame.tb_area_colno }}{% endif %}{% elif forloop.first %}None{% else %}Traceback: None{% endif %}{% endfor %} Exception Type: {{ exception_type }}{% if request %} at {{ request.path_info }}{% endif %} -Exception Value: {{ exception_value|force_escape }} +Exception Value: {{ exception_value|force_escape }}{% if exception_notes %}{{ exception_notes }}{% endif %}

-
{% endif %} +
{% endif %}
@@ -347,8 +358,8 @@

GET

- - + + @@ -369,8 +380,8 @@

POST

VariableValueVariableValue
- - + + @@ -385,36 +396,36 @@

POST

{% else %}

No POST data

{% endif %} +

FILES

{% if request.FILES %}
VariableValueVariableValue
- - - - - - - - {% for k, v in request_FILES_items %} - - - - - {% endfor %} - + + + + + + + + {% for k, v in request_FILES_items %} + + + + + {% endfor %} +
VariableValue
{{ k }}
{{ v|pprint }}
VariableValue
{{ k }}
{{ v|pprint }}
{% else %}

No FILES data

{% endif %} - {% if request.COOKIES %} - - + + @@ -434,15 +445,15 @@

META

VariableValueVariableValue
- - + + - {% for var in request_meta.items|dictsort:0 %} + {% for k, v in request_meta.items|dictsort:0 %} - - + + {% endfor %} @@ -456,29 +467,31 @@

Using settings module {{ settings.SETTINGS_MODULE }}

VariableValueVariableValue
{{ var.0 }}
{{ var.1|pprint }}
{{ k }}
{{ v|pprint }}
- - + + - {% for var in settings.items|dictsort:0 %} + {% for k, v in settings.items|dictsort:0 %} - - + + {% endfor %}
SettingValueSettingValue
{{ var.0 }}
{{ var.1|pprint }}
{{ k }}
{{ v|pprint }}
+ + {% if not is_email %} -
+

- You're seeing this error because you have DEBUG = True in your + You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard page generated by the handler for this status code.

-
+ {% endif %} diff --git a/django/views/templates/technical_500.txt b/django/views/templates/technical_500.txt index f06a1a499ec1..5a75324ebc97 100644 --- a/django/views/templates/technical_500.txt +++ b/django/views/templates/technical_500.txt @@ -2,7 +2,7 @@ {% firstof exception_value 'No exception message supplied' %} {% if request %} Request Method: {{ request.META.REQUEST_METHOD }} -Request URL: {{ request.get_raw_uri }}{% endif %} +Request URL: {{ request_insecure_uri }}{% endif %} Django Version: {{ django_version_info }} Python Executable: {{ sys_executable }} Python Version: {{ sys_version_info }} @@ -30,11 +30,12 @@ In template {{ template_info.name }}, error at line {{ template_info.line }} Traceback (most recent call last): {% for frame in frames %}{% ifchanged frame.exc_cause %}{% if frame.exc_cause %} {% if frame.exc_cause_explicit %}The above exception ({{ frame.exc_cause }}) was the direct cause of the following exception:{% else %}During handling of the above exception ({{ frame.exc_cause }}), another exception occurred:{% endif %} -{% endif %}{% endifchanged %} File "{{ frame.filename }}"{% if frame.context_line %}, line {{ frame.lineno }}{% endif %}, in {{ frame.function }} -{% if frame.context_line %} {% spaceless %}{{ frame.context_line }}{% endspaceless %}{% endif %} +{% endif %}{% endifchanged %} {% if frame.tb %}File "{{ frame.filename }}"{% if frame.context_line %}, line {{ frame.lineno }}{% endif %}, in {{ frame.function }} +{% if frame.context_line %} {% spaceless %}{{ frame.context_line }}{% endspaceless %}{{ frame.tb_area_colno }}{% endif %}{% elif forloop.first %}None{% else %}Traceback: None{% endif %} {% endfor %} {% if exception_type %}Exception Type: {{ exception_type }}{% if request %} at {{ request.path_info }}{% endif %} -{% if exception_value %}Exception Value: {{ exception_value }}{% endif %}{% endif %}{% endif %} +{% if exception_value %}Exception Value: {{ exception_value }}{% endif %}{% if exception_notes %}{{ exception_notes }}{% endif %}{% endif %}{% endif %} +{% if raising_view_name %}Raised during: {{ raising_view_name }}{% endif %} {% if request %}Request information: {% if user_str %}USER: {{ user_str }}{% endif %} @@ -59,7 +60,7 @@ Using settings module {{ settings.SETTINGS_MODULE }}{% for k, v in settings.item {{ k }} = {{ v|stringformat:"r" }}{% endfor %} {% if not is_email %} -You're seeing this error because you have DEBUG = True in your +You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard page generated by the handler for this status code. {% endif %} diff --git a/docs/Makefile b/docs/Makefile index 39f84ec0e3ff..bbdd2bb4c85b 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -8,6 +8,12 @@ SPHINXBUILD ?= sphinx-build PAPER ?= BUILDDIR ?= _build LANGUAGE ?= +JOBS ?= auto + +# Set the default language. +ifndef LANGUAGE +override LANGUAGE = en +endif # Convert something like "en_US" to "en", because Sphinx does not recognize # underscores. Country codes should be passed using a dash, e.g. "pt-BR". @@ -16,7 +22,7 @@ LANGUAGEOPT = $(firstword $(subst _, ,$(LANGUAGE))) # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -n -d $(BUILDDIR)/doctrees -D language=$(LANGUAGEOPT) $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +ALLSPHINXOPTS = -n -d $(BUILDDIR)/doctrees -D language=$(LANGUAGEOPT) --jobs $(JOBS) $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . @@ -44,6 +50,7 @@ help: @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " spelling to check for typos in documentation" + @echo " black to apply the black formatting to code blocks in documentation" clean: @@ -55,7 +62,7 @@ html: @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." htmlview: html - $(PYTHON) -c "import webbrowser; webbrowser.open('_build/html/index.html')" + $(PYTHON) -m webbrowser "$(BUILDDIR)/html/index.html" dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @@ -160,3 +167,10 @@ spelling: @echo @echo "Check finished. Wrong words can be found in " \ "$(BUILDDIR)/spelling/output.txt." + +black: + @mkdir -p $(BUILDDIR)/black + find . -name "*.txt" -not -path "./_build/*" -not -path "./_theme/*" \ + | xargs blacken-docs --rst-literal-block; echo $$? > "$(BUILDDIR)/black/output.txt" + @echo + @echo "Code blocks reformatted" diff --git a/docs/_ext/djangodocs.py b/docs/_ext/djangodocs.py index b21cfebc9e72..77e24ff0eb68 100644 --- a/docs/_ext/djangodocs.py +++ b/docs/_ext/djangodocs.py @@ -1,6 +1,7 @@ """ Sphinx plugins for Django documentation. """ + import json import os import re @@ -9,6 +10,7 @@ from docutils.parsers.rst import Directive from docutils.statemachine import ViewList from sphinx import addnodes +from sphinx import version_info as sphinx_version from sphinx.builders.html import StandaloneHTMLBuilder from sphinx.directives.code import CodeBlock from sphinx.domains.std import Cmdoption @@ -19,8 +21,7 @@ logger = logging.getLogger(__name__) # RE for option descriptions without a '--' prefix -simple_option_desc_re = re.compile( - r'([-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)') +simple_option_desc_re = re.compile(r"([-_a-zA-Z0-9]+)(\s*.*?)(?=,\s+(?:/|-|--)|$)") def setup(app): @@ -32,12 +33,12 @@ def setup(app): app.add_crossref_type( directivename="templatetag", rolename="ttag", - indextemplate="pair: %s; template tag" + indextemplate="pair: %s; template tag", ) app.add_crossref_type( directivename="templatefilter", rolename="tfilter", - indextemplate="pair: %s; template filter" + indextemplate="pair: %s; template filter", ) app.add_crossref_type( directivename="fieldlookup", @@ -50,13 +51,13 @@ def setup(app): indextemplate="pair: %s; django-admin command", parse_node=parse_django_admin_node, ) - app.add_directive('django-admin-option', Cmdoption) - app.add_config_value('django_next_version', '0.0', True) - app.add_directive('versionadded', VersionDirective) - app.add_directive('versionchanged', VersionDirective) + app.add_directive("django-admin-option", Cmdoption) + app.add_config_value("django_next_version", "0.0", True) + app.add_directive("versionadded", VersionDirective) + app.add_directive("versionchanged", VersionDirective) app.add_builder(DjangoStandaloneHTMLBuilder) - app.set_translator('djangohtml', DjangoHTMLTranslator) - app.set_translator('json', DjangoHTMLTranslator) + app.set_translator("djangohtml", DjangoHTMLTranslator) + app.set_translator("json", DjangoHTMLTranslator) app.add_node( ConsoleNode, html=(visit_console_html, None), @@ -65,10 +66,10 @@ def setup(app): text=(visit_console_dummy, depart_console_dummy), texinfo=(visit_console_dummy, depart_console_dummy), ) - app.add_directive('console', ConsoleDirective) - app.connect('html-page-context', html_page_context_hook) - app.add_role('default-role-error', default_role_error) - return {'parallel_read_safe': True} + app.add_directive("console", ConsoleDirective) + app.connect("html-page-context", html_page_context_hook) + app.add_role("default-role-error", default_role_error) + return {"parallel_read_safe": True} class VersionDirective(Directive): @@ -82,7 +83,9 @@ def run(self): if len(self.arguments) > 1: msg = """Only one argument accepted for directive '{directive_name}::'. Comments should be provided as content, - not as an extra argument.""".format(directive_name=self.name) + not as an extra argument.""".format( + directive_name=self.name + ) raise self.error(msg) env = self.state.document.settings.env @@ -91,18 +94,18 @@ def run(self): ret.append(node) if self.arguments[0] == env.config.django_next_version: - node['version'] = "Development version" + node["version"] = "Development version" else: - node['version'] = self.arguments[0] + node["version"] = self.arguments[0] - node['type'] = self.name + node["type"] = self.name if self.content: self.state.nested_parse(self.content, self.content_offset, node) try: - env.get_domain('changeset').note_changeset(node) + env.get_domain("changeset").note_changeset(node) except ExtensionError: # Sphinx < 1.8: Domain 'changeset' is not registered - env.note_versionchange(node['type'], node['version'], node, self.lineno) + env.note_versionchange(node["type"], node["version"], node, self.lineno) return ret @@ -115,22 +118,37 @@ class DjangoHTMLTranslator(HTMLTranslator): def visit_table(self, node): self.context.append(self.compact_p) self.compact_p = True - self._table_row_index = 0 # Needed by Sphinx - self.body.append(self.starttag(node, 'table', CLASS='docutils')) + # Needed by Sphinx. + self._table_row_indices.append(0) + self.body.append(self.starttag(node, "table", CLASS="docutils")) def depart_table(self, node): self.compact_p = self.context.pop() - self.body.append('\n') + self._table_row_indices.pop() + self.body.append("\n") def visit_desc_parameterlist(self, node): - self.body.append('(') # by default sphinx puts around the "(" - self.first_param = 1 + self.body.append("(") # by default sphinx puts around the "(" self.optional_param_level = 0 self.param_separator = node.child_text_separator - self.required_params_left = sum(isinstance(c, addnodes.desc_parameter) for c in node.children) + # Counts 'parameter groups' being either a required parameter, or a set + # of contiguous optional ones. + required_params = [ + isinstance(c, addnodes.desc_parameter) for c in node.children + ] + # How many required parameters are left. + self.required_params_left = sum(required_params) + if sphinx_version < (7, 1): + self.first_param = 1 + else: + self.is_first_param = True + self.params_left_at_level = 0 + self.param_group_index = 0 + self.list_is_required_param = required_params + self.multi_line_parameter_list = False def depart_desc_parameterlist(self, node): - self.body.append(')') + self.body.append(")") # # Turn the "new in version" stuff (versionadded/versionchanged) into a @@ -142,20 +160,15 @@ def depart_desc_parameterlist(self, node): # that work. # version_text = { - 'versionchanged': 'Changed in Django %s', - 'versionadded': 'New in Django %s', + "versionchanged": "Changed in Django %s", + "versionadded": "New in Django %s", } def visit_versionmodified(self, node): - self.body.append( - self.starttag(node, 'div', CLASS=node['type']) - ) - version_text = self.version_text.get(node['type']) + self.body.append(self.starttag(node, "div", CLASS=node["type"])) + version_text = self.version_text.get(node["type"]) if version_text: - title = "%s%s" % ( - version_text % node['version'], - ":" if len(node) else "." - ) + title = "%s%s" % (version_text % node["version"], ":" if len(node) else ".") self.body.append('%s ' % title) def depart_versionmodified(self, node): @@ -163,16 +176,16 @@ def depart_versionmodified(self, node): # Give each section a unique ID -- nice for custom CSS hooks def visit_section(self, node): - old_ids = node.get('ids', []) - node['ids'] = ['s-' + i for i in old_ids] - node['ids'].extend(old_ids) + old_ids = node.get("ids", []) + node["ids"] = ["s-" + i for i in old_ids] + node["ids"].extend(old_ids) super().visit_section(node) - node['ids'] = old_ids + node["ids"] = old_ids def parse_django_admin_node(env, sig, signode): - command = sig.split(' ')[0] - env.ref_context['std:program'] = command + command = sig.split(" ")[0] + env.ref_context["std:program"] = command title = "django-admin %s" % sig signode += addnodes.desc_name(title, title) return command @@ -183,7 +196,7 @@ class DjangoStandaloneHTMLBuilder(StandaloneHTMLBuilder): Subclass to add some extra things we need. """ - name = 'djangohtml' + name = "djangohtml" def finish(self): super().finish() @@ -191,19 +204,21 @@ def finish(self): xrefs = self.env.domaindata["std"]["objects"] templatebuiltins = { "ttags": [ - n for ((t, n), (k, a)) in xrefs.items() + n + for ((t, n), (k, a)) in xrefs.items() if t == "templatetag" and k == "ref/templates/builtins" ], "tfilters": [ - n for ((t, n), (k, a)) in xrefs.items() + n + for ((t, n), (k, a)) in xrefs.items() if t == "templatefilter" and k == "ref/templates/builtins" ], } outfilename = os.path.join(self.outdir, "templatebuiltins.js") - with open(outfilename, 'w') as fp: - fp.write('var django_template_builtins = ') + with open(outfilename, "w") as fp: + fp.write("var django_template_builtins = ") json.dump(templatebuiltins, fp) - fp.write(';\n') + fp.write(";\n") class ConsoleNode(nodes.literal_block): @@ -211,13 +226,14 @@ class ConsoleNode(nodes.literal_block): Custom node to override the visit/depart event handlers at registration time. Wrap a literal_block object and defer to it. """ - tagname = 'ConsoleNode' + + tagname = "ConsoleNode" def __init__(self, litblk_obj): self.wrapped = litblk_obj def __getattr__(self, attr): - if attr == 'wrapped': + if attr == "wrapped": return self.__dict__.wrapped return getattr(self.wrapped, attr) @@ -234,38 +250,44 @@ def depart_console_dummy(self, node): def visit_console_html(self, node): """Generate HTML for the console directive.""" - if self.builder.name in ('djangohtml', 'json') and node['win_console_text']: + if self.builder.name in ("djangohtml", "json") and node["win_console_text"]: # Put a mark on the document object signaling the fact the directive # has been used on it. self.document._console_directive_used_flag = True - uid = node['uid'] - self.body.append('''\ + uid = node["uid"] + self.body.append( + """\
- + -
\n''' % {'id': uid}) +
\n""" + % {"id": uid} + ) try: self.visit_literal_block(node) except nodes.SkipNode: pass - self.body.append('
\n') + self.body.append("
\n") - self.body.append('
\n' % {'id': uid}) - win_text = node['win_console_text'] - highlight_args = {'force': True} - linenos = node.get('linenos', False) + self.body.append( + '
\n' % {"id": uid} + ) + win_text = node["win_console_text"] + highlight_args = {"force": True} + linenos = node.get("linenos", False) def warner(msg): self.builder.warn(msg, (self.builder.current_docname, node.line)) highlighted = self.highlighter.highlight_block( - win_text, 'doscon', warn=warner, linenos=linenos, **highlight_args + win_text, "doscon", warn=warner, linenos=linenos, **highlight_args ) self.body.append(highlighted) - self.body.append('
\n') - self.body.append('
\n') + self.body.append("\n") + self.body.append("\n") raise nodes.SkipNode else: self.visit_literal_block(node) @@ -277,54 +299,54 @@ class ConsoleDirective(CodeBlock): the second tab shows a Windows command line equivalent of the usual Unix-oriented examples. """ + required_arguments = 0 # The 'doscon' Pygments formatter needs a prompt like this. '>' alone # won't do it because then it simply paints the whole command line as a - # grey comment with no highlighting at all. - WIN_PROMPT = r'...\> ' + # gray comment with no highlighting at all. + WIN_PROMPT = r"...\> " def run(self): - def args_to_win(cmdline): changed = False out = [] for token in cmdline.split(): - if token[:2] == './': + if token[:2] == "./": token = token[2:] changed = True - elif token[:2] == '~/': - token = '%HOMEPATH%\\' + token[2:] + elif token[:2] == "~/": + token = "%HOMEPATH%\\" + token[2:] changed = True - elif token == 'make': - token = 'make.bat' + elif token == "make": + token = "make.bat" changed = True - if '://' not in token and 'git' not in cmdline: - out.append(token.replace('/', '\\')) + if "://" not in token and "git" not in cmdline: + out.append(token.replace("/", "\\")) changed = True else: out.append(token) if changed: - return ' '.join(out) + return " ".join(out) return cmdline def cmdline_to_win(line): - if line.startswith('# '): - return 'REM ' + args_to_win(line[2:]) - if line.startswith('$ # '): - return 'REM ' + args_to_win(line[4:]) - if line.startswith('$ ./manage.py'): - return 'manage.py ' + args_to_win(line[13:]) - if line.startswith('$ manage.py'): - return 'manage.py ' + args_to_win(line[11:]) - if line.startswith('$ ./runtests.py'): - return 'runtests.py ' + args_to_win(line[15:]) - if line.startswith('$ ./'): + if line.startswith("# "): + return "REM " + args_to_win(line[2:]) + if line.startswith("$ # "): + return "REM " + args_to_win(line[4:]) + if line.startswith("$ ./manage.py"): + return "manage.py " + args_to_win(line[13:]) + if line.startswith("$ manage.py"): + return "manage.py " + args_to_win(line[11:]) + if line.startswith("$ ./runtests.py"): + return "runtests.py " + args_to_win(line[15:]) + if line.startswith("$ ./"): return args_to_win(line[4:]) - if line.startswith('$ python3'): - return 'py ' + args_to_win(line[9:]) - if line.startswith('$ python'): - return 'py ' + args_to_win(line[8:]) - if line.startswith('$ '): + if line.startswith("$ python3"): + return "py " + args_to_win(line[9:]) + if line.startswith("$ python"): + return "py " + args_to_win(line[8:]) + if line.startswith("$ "): return args_to_win(line[2:]) return None @@ -343,23 +365,23 @@ def code_block_to_win(content): return None env = self.state.document.settings.env - self.arguments = ['console'] + self.arguments = ["console"] lit_blk_obj = super().run()[0] # Only do work when the djangohtml HTML Sphinx builder is being used, # invoke the default behavior for the rest. - if env.app.builder.name not in ('djangohtml', 'json'): + if env.app.builder.name not in ("djangohtml", "json"): return [lit_blk_obj] - lit_blk_obj['uid'] = str(env.new_serialno('console')) + lit_blk_obj["uid"] = str(env.new_serialno("console")) # Only add the tabbed UI if there is actually a Windows-specific # version of the CLI example. win_content = code_block_to_win(self.content) if win_content is None: - lit_blk_obj['win_console_text'] = None + lit_blk_obj["win_console_text"] = None else: self.content = win_content - lit_blk_obj['win_console_text'] = super().run()[0].rawsource + lit_blk_obj["win_console_text"] = super().run()[0].rawsource # Replace the literal_node object returned by Sphinx's CodeBlock with # the ConsoleNode wrapper. @@ -371,7 +393,9 @@ def html_page_context_hook(app, pagename, templatename, context, doctree): # control inclusion of console-tabs.css and activation of the JavaScript. # This way it's include only from HTML files rendered from reST files where # the ConsoleDirective is used. - context['include_console_assets'] = getattr(doctree, '_console_directive_used_flag', False) + context["include_console_assets"] = getattr( + doctree, "_console_directive_used_flag", False + ) def default_role_error( @@ -379,8 +403,7 @@ def default_role_error( ): msg = ( "Default role used (`single backticks`): %s. Did you mean to use two " - "backticks for ``code``, or miss an underscore for a `link`_ ?" - % rawtext + "backticks for ``code``, or miss an underscore for a `link`_ ?" % rawtext ) logger.warning(msg, location=(inliner.document.current_source, lineno)) return [nodes.Text(text)], [] diff --git a/docs/_ext/github_links.py b/docs/_ext/github_links.py new file mode 100644 index 000000000000..11ec1e07c824 --- /dev/null +++ b/docs/_ext/github_links.py @@ -0,0 +1,149 @@ +import ast +import functools +import importlib.util +import pathlib + + +class CodeLocator(ast.NodeVisitor): + def __init__(self): + super().__init__() + self.current_path = [] + self.node_line_numbers = {} + self.import_locations = {} + + @classmethod + def from_code(cls, code): + tree = ast.parse(code) + locator = cls() + locator.visit(tree) + return locator + + def visit_node(self, node): + self.current_path.append(node.name) + self.node_line_numbers[".".join(self.current_path)] = node.lineno + self.generic_visit(node) + self.current_path.pop() + + def visit_FunctionDef(self, node): + self.visit_node(node) + + def visit_ClassDef(self, node): + self.visit_node(node) + + def visit_ImportFrom(self, node): + for alias in node.names: + if alias.asname: + # Exclude linking aliases (`import x as y`) to avoid confusion + # when clicking a source link to a differently named entity. + continue + if alias.name == "*": + # Resolve wildcard imports. + file = module_name_to_file_path(node.module) + file_contents = file.read_text(encoding="utf-8") + locator = CodeLocator.from_code(file_contents) + self.import_locations.update(locator.import_locations) + self.import_locations.update( + {n: node.module for n in locator.node_line_numbers if "." not in n} + ) + else: + self.import_locations[alias.name] = ("." * node.level) + ( + node.module or "" + ) + + +@functools.lru_cache(maxsize=1024) +def get_locator(file): + file_contents = file.read_text(encoding="utf-8") + return CodeLocator.from_code(file_contents) + + +class CodeNotFound(Exception): + pass + + +def module_name_to_file_path(module_name): + # Avoid importlib machinery as locating a module involves importing its + # parent, which would trigger import side effects. + + for suffix in [".py", "/__init__.py"]: + file_path = pathlib.Path(__file__).parents[2] / ( + module_name.replace(".", "/") + suffix + ) + if file_path.exists(): + return file_path + + raise CodeNotFound + + +def get_path_and_line(module, fullname): + path = module_name_to_file_path(module_name=module) + + locator = get_locator(path) + + lineno = locator.node_line_numbers.get(fullname) + + if lineno is not None: + return path, lineno + + imported_object = fullname.split(".", maxsplit=1)[0] + try: + imported_path = locator.import_locations[imported_object] + except KeyError: + raise CodeNotFound + + # From a statement such as: + # from . import y.z + # - either y.z might be an object in the parent module + # - or y might be a module, and z be an object in y + # also: + # - either the current file is x/__init__.py, and z would be in x.y + # - or the current file is x/a.py, and z would be in x.a.y + if path.name != "__init__.py": + # Look in parent module + module = module.rsplit(".", maxsplit=1)[0] + try: + imported_module = importlib.util.resolve_name( + name=imported_path, package=module + ) + except ImportError as error: + raise ImportError( + f"Could not import '{imported_path}' in '{module}'." + ) from error + try: + return get_path_and_line(module=imported_module, fullname=fullname) + except CodeNotFound: + if "." not in fullname: + raise + + first_element, remainder = fullname.rsplit(".", maxsplit=1) + # Retrying, assuming the first element of the fullname is a module. + return get_path_and_line( + module=f"{imported_module}.{first_element}", fullname=remainder + ) + + +def get_branch(version, next_version): + if version == next_version: + return "main" + else: + return f"stable/{version}.x" + + +def github_linkcode_resolve(domain, info, *, version, next_version): + if domain != "py": + return None + + if not (module := info["module"]): + return None + + try: + path, lineno = get_path_and_line(module=module, fullname=info["fullname"]) + except CodeNotFound: + return None + + branch = get_branch(version=version, next_version=next_version) + relative_path = path.relative_to(pathlib.Path(__file__).parents[2]) + # Use "/" explicitly to join the path parts since str(file), on Windows, + # uses the Windows path separator which is incorrect for URLs. + url_path = "/".join(relative_path.parts) + return f"https://github.com/django/django/blob/{branch}/{url_path}#L{lineno}" diff --git a/docs/_theme/djangodocs/layout.html b/docs/_theme/djangodocs/layout.html index c8770173aae6..487c2b49220f 100644 --- a/docs/_theme/djangodocs/layout.html +++ b/docs/_theme/djangodocs/layout.html @@ -72,7 +72,7 @@ {% endif %} {%- if include_console_assets -%} - + {%- endif -%} {% endblock %} diff --git a/docs/_theme/djangodocs/static/djangodocs.css b/docs/_theme/djangodocs/static/djangodocs.css index 02504d67a49a..0b6a8b9ad3bc 100644 --- a/docs/_theme/djangodocs/static/djangodocs.css +++ b/docs/_theme/djangodocs/static/djangodocs.css @@ -103,6 +103,7 @@ dt .literal, table .literal { background:none; } #bd a.reference { text-decoration: none; } #bd a.reference tt.literal { border-bottom: 1px #234f32 dotted; } div.code-block-caption { color: white; background-color: #234F32; margin: 0; padding: 2px 5px; width: 100%; font-family: monospace; font-size: small; line-height: 1.3em; } +div.code-block-caption .literal {color: white; } div.literal-block-wrapper pre { margin-top: 0; } /* Restore colors of pygments hyperlinked code */ @@ -125,8 +126,9 @@ div.versionadded span.title, div.versionchanged span.title, span.versionmodified div.versionadded, div.versionchanged, div.deprecated { color:#555; } /*** p-links ***/ -a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; visibility: hidden; } -h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } +a.headerlink { color: #c60f0f; font-size: 0.8em; margin-left: 4px; opacity: 0; text-decoration: none; } +h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { opacity: 1; } +a.headerlink:focus { opacity: 1; } /*** index ***/ table.indextable td { text-align: left; vertical-align: top;} diff --git a/docs/conf.py b/docs/conf.py index 4970e754c78b..579e13d21edc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,13 +12,15 @@ import sys from os.path import abspath, dirname, join +from sphinx import version_info as sphinx_version + # Workaround for sphinx-build recursion limit overflow: # pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL) # RuntimeError: maximum recursion depth exceeded while pickling an object # # Python's default allowed recursion depth is 1000 but this isn't enough for # building docs/ref/settings.txt sometimes. -# https://groups.google.com/d/topic/sphinx-dev/MtRf64eGtv4/discussion +# https://groups.google.com/g/sphinx-dev/c/MtRf64eGtv4/discussion sys.setrecursionlimit(2000) # Make sure we get the version of this copy of Django @@ -29,19 +31,23 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append(abspath(join(dirname(__file__), "_ext"))) +# Use the module to GitHub url resolver, but import it after the _ext directoy +# it lives in has been added to sys.path. +import github_links # NOQA + # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = '1.6.0' +needs_sphinx = "4.5.0" # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ "djangodocs", - 'sphinx.ext.extlinks', + "sphinx.ext.extlinks", "sphinx.ext.intersphinx", - "sphinx.ext.viewcode", "sphinx.ext.autosectionlabel", + "sphinx.ext.linkcode", ] # AutosectionLabel settings. @@ -50,32 +56,60 @@ autosectionlabel_prefix_document = True autosectionlabel_maxdepth = 2 +# Linkcheck settings. +linkcheck_ignore = [ + # Special-use addresses and domain names. (RFC 6761/6890) + r"^https?://(?:127\.0\.0\.1|\[::1\])(?::\d+)?/", + r"^https?://(?:[^/.]+\.)*example\.(?:com|net|org)(?::\d+)?/", + r"^https?://(?:[^/.]+\.)*(?:example|invalid|localhost|test)(?::\d+)?/", + # Pages that are inaccessible because they require authentication. + r"^https://github\.com/[^/]+/[^/]+/fork", + r"^https://code\.djangoproject\.com/github/login", + r"^https://code\.djangoproject\.com/newticket", + r"^https://(?:code|www)\.djangoproject\.com/admin/", + r"^https://www\.djangoproject\.com/community/add/blogs/", + r"^https://www\.google\.com/webmasters/tools/ping", + r"^https://search\.google\.com/search-console/welcome", + # Fragments used to dynamically switch content or populate fields. + r"^https://web\.libera\.chat/#", + r"^https://github\.com/[^#]+#L\d+-L\d+$", + r"^https://help\.apple\.com/itc/podcasts_connect/#/itc", + # Anchors on certain pages with missing a[name] attributes. + r"^https://tools\.ietf\.org/html/rfc1123\.html#section-", +] + # Spelling check needs an additional module that is not installed by default. # Add it only if spelling check is requested so docs can be generated without it. -if 'spelling' in sys.argv: +if "spelling" in sys.argv: extensions.append("sphinxcontrib.spelling") # Spelling language. -spelling_lang = 'en_US' +spelling_lang = "en_US" # Location of word list. -spelling_word_list_filename = 'spelling_wordlist' +spelling_word_list_filename = "spelling_wordlist" + +spelling_warning = True # Add any paths that contain templates here, relative to this directory. # templates_path = [] # The suffix of source filenames. -source_suffix = '.txt' +source_suffix = {".txt": "restructuredtext"} # The encoding of source files. # source_encoding = 'utf-8-sig' -# The master toctree document. -master_doc = 'contents' +# The root toctree document. +root_doc = "contents" + +# Disable auto-created table of contents entries for all domain objects (e.g. +# functions, classes, attributes, etc.) in Sphinx 5.2+. +toc_object_entries = False # General substitutions. -project = 'Django' -copyright = 'Django Software Foundation and contributors' +project = "Django" +copyright = "Django Software Foundation and contributors" # The version info for the project you're documenting, acts as replacement for @@ -83,48 +117,53 @@ # built documents. # # The short X.Y version. -version = '3.2' +version = "6.0" # The full version, including alpha/beta/rc tags. try: from django import VERSION, get_version except ImportError: release = version else: + def django_release(): pep440ver = get_version() - if VERSION[3:5] == ('alpha', 0) and 'dev' not in pep440ver: - return pep440ver + '.dev' + if VERSION[3:5] == ("alpha", 0) and "dev" not in pep440ver: + return pep440ver + ".dev" return pep440ver release = django_release() # The "development version" of Django -django_next_version = '3.2' +django_next_version = "6.0" extlinks = { - 'commit': ('https://github.com/django/django/commit/%s', ''), - 'cve': ('https://nvd.nist.gov/view/vuln/detail?vulnId=%s', 'CVE-'), + "bpo": ("https://bugs.python.org/issue?@action=redirect&bpo=%s", "bpo-%s"), + "commit": ("https://github.com/django/django/commit/%s", "%s"), + "pypi": ("https://pypi.org/project/%s/", "%s"), # A file or directory. GitHub redirects from blob to tree if needed. - 'source': ('https://github.com/django/django/blob/master/%s', ''), - 'ticket': ('https://code.djangoproject.com/ticket/%s', '#'), + "source": ("https://github.com/django/django/blob/main/%s", "%s"), + "ticket": ("https://code.djangoproject.com/ticket/%s", "#%s"), } +if sphinx_version < (8, 1): + extlinks["cve"] = ("https://www.cve.org/CVERecord?id=CVE-%s", "CVE-%s") + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # Location for .po/.mo translation files used when language is set -locale_dirs = ['locale/'] +locale_dirs = ["locale/"] # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. -today_fmt = '%B %d, %Y' +today_fmt = "%B %d, %Y" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build', '_theme'] +exclude_patterns = ["_build", "_theme", "requirements.txt"] # The reST default role (used for this markup: `text`) to use for all documents. default_role = "default-role-error" @@ -141,21 +180,21 @@ def django_release(): show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'trac' +pygments_style = "trac" # Links to Python's docs should reference the most recent version of the 3.x # branch, which is located at this URL. intersphinx_mapping = { - 'python': ('https://docs.python.org/3/', None), - 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), - 'psycopg2': ('https://www.psycopg.org/docs/', None), + "python": ("https://docs.python.org/3", None), + "sphinx": ("https://www.sphinx-doc.org/en/master", None), + "psycopg": ("https://www.psycopg.org/psycopg3/docs", None), } # Python's docs don't change every week. intersphinx_cache_limit = 90 # days # The 'versionadded' and 'versionchanged' directives are overridden. -suppress_warnings = ['app.add_directive'] +suppress_warnings = ["app.add_directive"] # -- Options for HTML output --------------------------------------------------- @@ -194,7 +233,7 @@ def django_release(): # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -html_last_updated_fmt = '%b %d, %Y' +html_last_updated_fmt = "%b %d, %Y" # Content template for the index page. # html_index = '' @@ -233,36 +272,54 @@ def django_release(): # html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'Djangodoc' +htmlhelp_basename = "Djangodoc" modindex_common_prefix = ["django."] # Appended to every page rst_epilog = """ .. |django-users| replace:: :ref:`django-users ` -.. |django-core-mentorship| replace:: :ref:`django-core-mentorship ` .. |django-developers| replace:: :ref:`django-developers ` .. |django-announce| replace:: :ref:`django-announce ` .. |django-updates| replace:: :ref:`django-updates ` -""" +""" # NOQA # -- Options for LaTeX output -------------------------------------------------- +# Use XeLaTeX for Unicode support. +latex_engine = "xelatex" +latex_use_xindy = False +# Set font for CJK and fallbacks for unicode characters. latex_elements = { - 'preamble': ( - '\\DeclareUnicodeCharacter{2264}{\\ensuremath{\\le}}' - '\\DeclareUnicodeCharacter{2265}{\\ensuremath{\\ge}}' - '\\DeclareUnicodeCharacter{2665}{[unicode-heart]}' - '\\DeclareUnicodeCharacter{2713}{[unicode-checkmark]}' - ), + "fontpkg": r""" + \setmainfont{Symbola} + """, + "preamble": r""" + \usepackage[UTF8]{ctex} + \xeCJKDeclareCharClass{HalfLeft}{"2018, "201C} + \xeCJKDeclareCharClass{HalfRight}{ + "00B7, "2019, "201D, "2013, "2014, "2025, "2026, "2E3A + } + \usepackage{newunicodechar} + \newunicodechar{π}{\ensuremath{\pi}} + \newunicodechar{≤}{\ensuremath{\le}} + \newunicodechar{≥}{\ensuremath{\ge}} + \newunicodechar{♥}{\ensuremath{\heartsuit}} + \newunicodechar{…}{\ensuremath{\ldots}} + """, } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). # latex_documents = [] latex_documents = [ - ('contents', 'django.tex', 'Django Documentation', - 'Django Software Foundation', 'manual'), + ( + "contents", + "django.tex", + "Django Documentation", + "Django Software Foundation", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of @@ -290,31 +347,41 @@ def django_release(): # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [( - 'ref/django-admin', - 'django-admin', - 'Utility script for the Django Web framework', - ['Django Software Foundation'], - 1 -)] +man_pages = [ + ( + "ref/django-admin", + "django-admin", + "Utility script for the Django web framework", + ["Django Software Foundation"], + 1, + ) +] # -- Options for Texinfo output ------------------------------------------------ # List of tuples (startdocname, targetname, title, author, dir_entry, # description, category, toctree_only) -texinfo_documents = [( - master_doc, "django", "", "", "Django", - "Documentation of the Django framework", "Web development", False -)] +texinfo_documents = [ + ( + root_doc, + "django", + "", + "", + "Django", + "Documentation of the Django framework", + "Web development", + False, + ) +] # -- Options for Epub output --------------------------------------------------- # Bibliographic Dublin Core info. epub_title = project -epub_author = 'Django Software Foundation' -epub_publisher = 'Django Software Foundation' +epub_author = "Django Software Foundation" +epub_publisher = "Django Software Foundation" epub_copyright = copyright # The basename for the epub file. It defaults to the project name. @@ -324,7 +391,7 @@ def django_release(): # for small screen space, using the same theme for HTML and epub output is # usually not wise. This defaults to 'epub', a theme designed to save visual # space. -epub_theme = 'djangodocs-epub' +epub_theme = "djangodocs-epub" # The language of the text. It defaults to the language option # or en if the language is not set. @@ -341,7 +408,7 @@ def django_release(): # epub_uid = '' # A tuple containing the cover image and cover page html template filenames. -epub_cover = ('', 'epub-cover.html') +epub_cover = ("", "epub-cover.html") # A sequence of (type, uri, title) tuples for the guide element of content.opf. # epub_guide = () @@ -350,7 +417,7 @@ def django_release(): # The format is a list of tuples containing the path and title. # epub_pre_files = [] -# HTML files shat should be inserted after the pages created by sphinx. +# HTML files that should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. # epub_post_files = [] @@ -377,3 +444,12 @@ def django_release(): # If false, no index is generated. # epub_use_index = True + + +def version_github_linkcode_resolve(domain, info): + return github_links.github_linkcode_resolve( + domain, info, version=version, next_version=django_next_version + ) + + +linkcode_resolve = version_github_linkcode_resolve diff --git a/docs/faq/admin.txt b/docs/faq/admin.txt index ea9690bbe6eb..2c75070ad08c 100644 --- a/docs/faq/admin.txt +++ b/docs/faq/admin.txt @@ -49,10 +49,10 @@ My "list_filter" contains a ManyToManyField, but the filter doesn't display. ============================================================================ Django won't bother displaying the filter for a ``ManyToManyField`` if there -are fewer than two related objects. +are no related objects. For example, if your :attr:`~django.contrib.admin.ModelAdmin.list_filter` -includes :doc:`sites `, and there's only one site in your +includes :doc:`sites `, and there are no sites in your database, it won't display a "Site" filter. In that case, filtering by site would be meaningless. @@ -109,3 +109,12 @@ Android and iOS. Depending on feature support, there *may* be minor stylistic differences between browsers. These are considered acceptable variations in rendering. + +What assistive technologies are supported for using the admin? +============================================================== + +The admin is intended to be compatible with a wide range of assistive +technologies, but there are currently many blockers. The support target is all +latest versions of major assistive technologies, including Dragon, JAWS, NVDA, +Orca, TalkBack, Voice Control, VoiceOver iOS, VoiceOver macOS, Windows Contrast +Themes, ZoomText, and screen magnifiers. diff --git a/docs/faq/contributing.txt b/docs/faq/contributing.txt index 8d8eb2ded7f9..c4c66f877b53 100644 --- a/docs/faq/contributing.txt +++ b/docs/faq/contributing.txt @@ -2,14 +2,16 @@ FAQ: Contributing code ====================== +.. _new-contributors-faq: + How can I get started contributing code to Django? ================================================== Thanks for asking! We've written an entire document devoted to this question. It's titled :doc:`Contributing to Django `. -I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch? -============================================================================================ +I submitted a bug fix several weeks ago. Why are you ignoring my contribution? +============================================================================== Don't worry: We're not ignoring you! @@ -32,45 +34,47 @@ that area of the code, to understand the problem and verify the fix: database, are those instructions clear enough even for someone not familiar with it? -* If there are several patches attached to the ticket, is it clear what - each one does, which ones can be ignored and which matter? +* If there are several branches linked to the ticket, is it clear what each one + does, which ones can be ignored and which matter? -* Does the patch include a unit test? If not, is there a very clear +* Does the change include a unit test? If not, is there a very clear explanation why not? A test expresses succinctly what the problem is, - and shows that the patch actually fixes it. + and shows that the branch actually fixes it. -If your patch stands no chance of inclusion in Django, we won't ignore it -- -we'll just close the ticket. So if your ticket is still open, it doesn't mean +If your contribution is not suitable for inclusion in Django, we won't ignore +it -- we'll close the ticket. So if your ticket is still open, it doesn't mean we're ignoring you; it just means we haven't had time to look at it yet. -When and how might I remind the team of a patch I care about? -============================================================= +When and how might I remind the team of a change I care about? +============================================================== -A polite, well-timed message to the mailing list is one way to get attention. +A polite, well-timed message in the forum/branch is one way to get attention. To determine the right time, you need to keep an eye on the schedule. If you post your message right before a release deadline, you're not likely to get the sort of attention you require. -Gentle IRC reminders can also work -- again, strategically timed if possible. -During a bug sprint would be a very good time, for example. +Gentle reminders in the ``#contributing-getting-started`` channel in the +`Django Discord server`_ can work. Another way to get traction is to pull several related tickets together. When -the someone sits down to review a bug in an area they haven't touched for +someone sits down to review a bug in an area they haven't touched for a while, it can take a few minutes to remember all the fine details of how that area of code works. If you collect several minor bug fixes together into a similarly themed group, you make an attractive target, as the cost of coming up to speed on an area of code can be spread over multiple tickets. Please refrain from emailing anyone personally or repeatedly raising the same -issue over and over. This sort of behavior will not gain you any additional -attention -- certainly not the attention that you need in order to get your -issue addressed. +issue over and over again. This sort of behavior will not gain you any +additional attention -- certainly not the attention that you need in order to +get your issue addressed. + +.. _`Django Discord server`: https://chat.djangoproject.com -But I've reminded you several times and you keep ignoring my patch! -=================================================================== +But I've reminded you several times and you keep ignoring my contribution! +========================================================================== -Seriously - we're not ignoring you. If your patch stands no chance of -inclusion in Django, we'll close the ticket. For all the other tickets, we +Seriously - we're not ignoring you. If your contribution is not suitable for +inclusion in Django, we will close the ticket. For all the other tickets, we need to prioritize our efforts, which means that some tickets will be addressed before others. @@ -79,10 +83,10 @@ people that will likely be affected by a given bug. Bugs that have the potential to affect many people will generally get priority over those that are edge cases. -Another reason that bugs might be ignored for while is if the bug is a symptom -of a larger problem. While we can spend time writing, testing and applying -lots of little patches, sometimes the right solution is to rebuild. If a -rebuild or refactor of a particular component has been proposed or is +Another reason that a bug might be ignored for a while is if the bug is a +symptom of a larger problem. While we can spend time writing, testing and +applying lots of little changes, sometimes the right solution is to rebuild. If +a rebuild or refactor of a particular component has been proposed or is underway, you may find that bugs affecting that component will not get as much attention. Again, this is a matter of prioritizing scarce resources. By concentrating on the rebuild, we can close all the little bugs at once, and @@ -97,3 +101,9 @@ entire community, instead of prioritizing the impact on one particular user. This doesn't mean that we think your problem is unimportant -- just that in the limited time we have available, we will always err on the side of making 10 people happy rather than making a single person happy. + +I'm sure my ticket is absolutely 100% perfect, can I mark it as "Ready For Checkin" myself? +=========================================================================================== + +Sorry, no. It's always better to get another set of eyes on a ticket. If +you're having trouble getting that second set of eyes, see questions above. diff --git a/docs/faq/general.txt b/docs/faq/general.txt index 128c0d92882c..3861ac7814bb 100644 --- a/docs/faq/general.txt +++ b/docs/faq/general.txt @@ -5,18 +5,18 @@ FAQ: General Why does this project exist? ============================ -Django grew from a very practical need: World Online, a newspaper Web -operation, is responsible for building intensive Web applications on journalism +Django grew from a very practical need: World Online, a newspaper web +operation, is responsible for building intensive web applications on journalism deadlines. In the fast-paced newsroom, World Online often has only a matter of -hours to take a complicated Web application from concept to public launch. +hours to take a complicated web application from concept to public launch. -At the same time, the World Online Web developers have consistently been -perfectionists when it comes to following best practices of Web development. +At the same time, the World Online web developers have consistently been +perfectionists when it comes to following best practices of web development. In fall 2003, the World Online developers (Adrian Holovaty and Simon Willison) ditched PHP and began using Python to develop its websites. As they built intensive, richly interactive sites such as Lawrence.com, they began to extract -a generic Web development framework that let them build Web applications more +a generic web development framework that let them build web applications more and more quickly. They tweaked this framework constantly, adding improvements over two years. @@ -58,7 +58,7 @@ Yes. Compared to development time, hardware is cheap, and so Django is designed to take advantage of as much hardware as you can throw at it. Django uses a "shared-nothing" architecture, which means you can add hardware -at any level -- database servers, caching servers or Web/application servers. +at any level -- database servers, caching servers or web/application servers. The framework cleanly separates components such as its database layer and application layer. And it ships with a simple-yet-powerful @@ -67,7 +67,7 @@ application layer. And it ships with a simple-yet-powerful Who's behind this? ================== -Django was originally developed at World Online, the Web department of a +Django was originally developed at World Online, the web department of a newspaper in Lawrence, Kansas, USA. Django's now run by an international `team of volunteers `_. @@ -88,9 +88,10 @@ under a permissive open source license. :source:`A copy of the Python license Which sites use Django? ======================= -`DjangoSites.org`_ features a constantly growing list of Django-powered sites. +`BuiltWithDjango.com`_ features a constantly growing list of Django-powered +sites. -.. _DjangoSites.org: https://djangosites.org +.. _BuiltWithDjango.com: https://builtwithdjango.com/projects/ .. _faq-mtv: @@ -127,7 +128,7 @@ us. does -- why doesn't Django? ===================================================== -We're well aware that there are other awesome Web frameworks out there, and +We're well aware that there are other awesome web frameworks out there, and we're not averse to borrowing ideas where appropriate. However, Django was developed precisely because we were unhappy with the status quo, so please be aware that "because does it" is not going to be sufficient reason @@ -137,7 +138,7 @@ Why did you write all of Django from scratch, instead of using other Python libr ====================================================================================== When Django was originally written, Adrian and Simon spent quite a bit of time -exploring the various Python Web frameworks available. +exploring the various Python web frameworks available. In our opinion, none of them were completely up to snuff. @@ -162,7 +163,7 @@ Is Django a content-management-system (CMS)? ============================================ No, Django is not a CMS, or any sort of "turnkey product" in and of itself. -It's a Web framework; it's a programming tool that lets you build websites. +It's a web framework; it's a programming tool that lets you build websites. For example, it doesn't make much sense to compare Django to something like Drupal_, because Django is something you use to *create* things like Drupal. @@ -172,14 +173,14 @@ site is one module of Django the framework. Furthermore, although Django has special conveniences for building "CMS-y" apps, that doesn't mean it's not just as appropriate for building "non-CMS-y" apps (whatever that means!). -.. _Drupal: https://drupal.org/ +.. _Drupal: https://www.drupal.org/ How can I download the Django documentation to read it offline? =============================================================== The Django docs are available in the ``docs`` directory of each Django tarball release. These docs are in reST (reStructuredText) format, and each text file -corresponds to a Web page on the official Django site. +corresponds to a web page on the official Django site. Because the documentation is :source:`stored in revision control `, you can browse documentation changes just like you can browse code changes. @@ -195,9 +196,11 @@ It's difficult to give an official citation format, for two reasons: citation formats can vary wildly between publications, and citation standards for software are still a matter of some debate. -For example, `APA style`_, would dictate something like:: +For example, `APA style`_, would dictate something like: - Django (Version 1.5) [Computer Software]. (2013). Retrieved from https://djangoproject.com. +.. code-block:: text + + Django (Version 1.5) [Computer Software]. (2013). Retrieved from https://www.djangoproject.com/. However, the only true guide is what your publisher will accept, so get a copy of those guidelines and fill in the gaps as best you can. @@ -207,11 +210,11 @@ Foundation". If you need a publishing location, use "Lawrence, Kansas". -If you need a web address, use https://djangoproject.com. +If you need a web address, use https://www.djangoproject.com/. If you need a name, just use "Django", without any tagline. If you need a publication date, use the year of release of the version you're referencing (e.g., 2013 for v1.5) -.. _APA style: https://www.apastyle.org +.. _APA style: https://apastyle.apa.org/ diff --git a/docs/faq/help.txt b/docs/faq/help.txt index 30ae3e4398be..8a51890f9368 100644 --- a/docs/faq/help.txt +++ b/docs/faq/help.txt @@ -21,14 +21,10 @@ Then, please post it in one of the following channels: * The Django Forum section `"Using Django"`_. This is for web-based discussions. -* The |django-users| mailing list. This is for email-based discussions. -* The `#django IRC channel`_ on the Freenode IRC network. This is for - chat-based discussions. If you're new to IRC, see the `Freenode - documentation`_ for different ways to connect. +* The `Django Discord server`_ for chat-based discussions. -.. _`"Using Django"`: https://forum.djangoproject.com/c/users -.. _#django IRC channel: https://webchat.freenode.net/#django -.. _Freenode documentation: https://freenode.net/kb/answer/chat +.. _`"Using Django"`: https://forum.djangoproject.com/c/users/6 +.. _`Django Discord server`: https://chat.djangoproject.com In all these channels please abide by the `Django Code of Conduct`_. In summary, being friendly and patient, considerate, respectful, and careful in @@ -36,22 +32,6 @@ your choice of words. .. _Django Code of Conduct: https://www.djangoproject.com/conduct/ -.. _message-does-not-appear-on-django-users: - -Why hasn't my message appeared on *django-users*? -================================================= - -|django-users| has a lot of subscribers. This is good for the community, as -it means many people are available to contribute answers to questions. -Unfortunately, it also means that |django-users| is an attractive target for -spammers. - -In order to combat the spam problem, when you join the |django-users| mailing -list, we manually moderate the first message you send to the list. This means -that spammers get caught, but it also means that your first question to the -list might take a little longer to get answered. We apologize for any -inconvenience that this policy may cause. - Nobody answered my question! What should I do? ============================================== @@ -66,12 +46,6 @@ everybody that can help is busy. You can also try asking on a different channel. But please don't post your question in all three channels in quick succession. -You might notice we have a second mailing list, called |django-developers|. -This list is for discussion of the development of Django itself. Please don't -email support questions to this mailing list. Asking a tech support question -there is considered impolite, and you will likely be directed to ask on -|django-users|. - I think I've found a bug! What should I do? =========================================== @@ -86,8 +60,8 @@ to security@djangoproject.com. This is a private list only open to long-time, highly trusted Django developers, and its archives are not publicly readable. Due to the sensitive nature of security issues, we ask that if you think you -have found a security problem, *please* don't post a message on the forum, IRC, -or one of the public mailing lists. Django has a +have found a security problem, *please* don't post a message on the forum, the +Discord server, IRC, or one of the public mailing lists. Django has a :ref:`policy for handling security issues `; while a defect is outstanding, we would like to minimize any damage that could be inflicted through public knowledge of that defect. diff --git a/docs/faq/install.txt b/docs/faq/install.txt index e54336882bb2..b483d30f5e24 100644 --- a/docs/faq/install.txt +++ b/docs/faq/install.txt @@ -23,7 +23,7 @@ required for some use cases, but you'll receive an error about them as they're needed. For a development environment -- if you just want to experiment with Django -- -you don't need to have a separate Web server installed or database server. +you don't need to have a separate web server installed or database server. Django comes with its own :djadmin:`lightweight development server`. For a production environment, Django follows the WSGI spec, :pep:`3333`, which @@ -50,19 +50,22 @@ What Python version can I use with Django? ============== =============== Django version Python versions ============== =============== -2.2 3.5, 3.6, 3.7, 3.8 (added in 2.2.8) -3.0, 3.1, 3.2 3.6, 3.7, 3.8 +4.2 3.8, 3.9, 3.10, 3.11, 3.12 (added in 4.2.8) +5.0 3.10, 3.11, 3.12 +5.1 3.10, 3.11, 3.12, 3.13 (added in 5.1.3) +5.2 3.10, 3.11, 3.12, 3.13 +6.0 3.12, 3.13 ============== =============== For each version of Python, only the latest micro release (A.B.C) is officially supported. You can find the latest micro version for each series on the `Python download page `_. -Typically, we will support a Python version up to and including the first -Django LTS release whose security support ends after security support for that -version of Python ends. For example, Python 3.3 security support ended -September 2017 and Django 1.8 LTS security support ended April 2018. Therefore -Django 1.8 is the last version to support Python 3.3. +We will support a Python version up to and including the first Django LTS +release whose security support ends after security support for that version of +Python ends. For example, Python 3.9 security support ends in October 2025 and +Django 4.2 LTS security support ends in April 2026. Therefore Django 4.2 is the +last version to support Python 3.9. What Python version should I use with Django? ============================================= @@ -80,7 +83,7 @@ Should I use the stable version or development version? Generally, if you're using code in production, you should be using a stable release. The Django project publishes a full stable release -every nine months or so, with bugfix updates in between. These stable +every eight months or so, with bugfix updates in between. These stable releases contain the API that is covered by our backwards compatibility guarantees; if you write code against stable releases, you shouldn't have any problems upgrading when the next official diff --git a/docs/faq/models.txt b/docs/faq/models.txt index baace7901bd0..0cfbfd638a6e 100644 --- a/docs/faq/models.txt +++ b/docs/faq/models.txt @@ -8,7 +8,9 @@ How can I see the raw SQL queries Django is running? ==================================================== Make sure your Django :setting:`DEBUG` setting is set to ``True``. -Then do this:: +Then do this: + +.. code-block:: pycon >>> from django.db import connection >>> connection.queries @@ -17,28 +19,31 @@ Then do this:: ``connection.queries`` is only available if :setting:`DEBUG` is ``True``. It's a list of dictionaries in order of query execution. Each dictionary has -the following:: +the following: - ``sql`` -- The raw SQL statement - ``time`` -- How long the statement took to execute, in seconds. +* ``sql`` - The raw SQL statement +* ``time`` - How long the statement took to execute, in seconds. ``connection.queries`` includes all SQL statements -- INSERTs, UPDATES, SELECTs, etc. Each time your app hits the database, the query will be recorded. If you are using :doc:`multiple databases`, you can use the -same interface on each member of the ``connections`` dictionary:: +same interface on each member of the ``connections`` dictionary: + +.. code-block:: pycon >>> from django.db import connections - >>> connections['my_db_alias'].queries + >>> connections["my_db_alias"].queries If you need to clear the query list manually at any point in your functions, call ``reset_queries()``, like this:: from django.db import reset_queries + reset_queries() -Can I use Django with a pre-existing database? -============================================== +Can I use Django with a preexisting database? +============================================= Yes. See :doc:`Integrating with a legacy database `. @@ -85,6 +90,8 @@ these options, create a migration with a ``ALTER TABLE`` statements that do what you want to do. For example, if you're using MySQL and want your tables to use the MyISAM table -type, use the following SQL:: +type, use the following SQL: + +.. code-block:: sql ALTER TABLE myapp_mytable ENGINE=MyISAM; diff --git a/docs/faq/troubleshooting.txt b/docs/faq/troubleshooting.txt index ce468a56a620..21b1a70ba5d8 100644 --- a/docs/faq/troubleshooting.txt +++ b/docs/faq/troubleshooting.txt @@ -36,7 +36,9 @@ I'm getting a ``UnicodeDecodeError``. What am I doing wrong? This class of errors happen when a bytestring containing non-ASCII sequences is transformed into a Unicode string and the specified encoding is incorrect. The -output generally looks like this:: +output generally looks like this: + +.. code-block:: pytb UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position ?: ordinal not in range(128) diff --git a/docs/faq/usage.txt b/docs/faq/usage.txt index f95ca1117433..c75a296a1e3b 100644 --- a/docs/faq/usage.txt +++ b/docs/faq/usage.txt @@ -8,7 +8,7 @@ Why do I get an error about importing :envvar:`DJANGO_SETTINGS_MODULE`? Make sure that: * The environment variable :envvar:`DJANGO_SETTINGS_MODULE` is set to a - fully-qualified Python module (i.e. "mysite.settings"). + fully-qualified Python module (i.e. ``mysite.settings``). * Said module is on ``sys.path`` (``import mysite.settings`` should work). @@ -42,7 +42,7 @@ Using a :class:`~django.db.models.FileField` or an the full path to a directory where you'd like Django to store uploaded files. (For performance, these files are not stored in the database.) Define :setting:`MEDIA_URL` as the base public URL of that directory. - Make sure that this directory is writable by the Web server's user + Make sure that this directory is writable by the web server's user account. #. Add the :class:`~django.db.models.FileField` or diff --git a/docs/howto/_images/template-lines.png b/docs/howto/_images/template-lines.png index 128e99ae9d0e..7af0168043c3 100644 Binary files a/docs/howto/_images/template-lines.png and b/docs/howto/_images/template-lines.png differ diff --git a/docs/howto/auth-remote-user.txt b/docs/howto/auth-remote-user.txt index 742c0d223b1d..254a141b4577 100644 --- a/docs/howto/auth-remote-user.txt +++ b/docs/howto/auth-remote-user.txt @@ -1,21 +1,20 @@ -==================================== -Authentication using ``REMOTE_USER`` -==================================== +========================================= +How to authenticate using ``REMOTE_USER`` +========================================= This document describes how to make use of external authentication sources -(where the Web server sets the ``REMOTE_USER`` environment variable) in your +(where the web server sets the ``REMOTE_USER`` environment variable) in your Django applications. This type of authentication solution is typically seen on intranet sites, with single sign-on solutions such as IIS and Integrated -Windows Authentication or Apache and `mod_authnz_ldap`_, `CAS`_, `Cosign`_, -`WebAuth`_, `mod_auth_sspi`_, etc. +Windows Authentication or Apache and `mod_authnz_ldap`_, `CAS`_, `WebAuth`_, +`mod_auth_sspi`_, etc. -.. _mod_authnz_ldap: https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html +.. _mod_authnz_ldap: https://httpd.apache.org/docs/current/mod/mod_authnz_ldap.html .. _CAS: https://www.apereo.org/projects/cas -.. _Cosign: http://weblogin.org -.. _WebAuth: https://www.stanford.edu/services/webauth/ +.. _WebAuth: https://uit.stanford.edu/service/authentication .. _mod_auth_sspi: https://sourceforge.net/projects/mod-auth-sspi -When the Web server takes care of authentication it typically sets the +When the web server takes care of authentication it typically sets the ``REMOTE_USER`` environment variable for use in the underlying application. In Django, ``REMOTE_USER`` is made available in the :attr:`request.META ` attribute. Django can be configured to make @@ -33,10 +32,10 @@ First, you must add the :class:`django.contrib.auth.middleware.AuthenticationMiddleware`:: MIDDLEWARE = [ - '...', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.RemoteUserMiddleware', - '...', + "...", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.auth.middleware.RemoteUserMiddleware", + "...", ] Next, you must replace the :class:`~django.contrib.auth.backends.ModelBackend` @@ -44,7 +43,7 @@ with :class:`~django.contrib.auth.backends.RemoteUserBackend` in the :setting:`AUTHENTICATION_BACKENDS` setting:: AUTHENTICATION_BACKENDS = [ - 'django.contrib.auth.backends.RemoteUserBackend', + "django.contrib.auth.backends.RemoteUserBackend", ] With this setup, ``RemoteUserMiddleware`` will detect the username in @@ -77,12 +76,26 @@ regardless of ``AUTHENTICATION_BACKENDS``. If your authentication mechanism uses a custom HTTP header and not ``REMOTE_USER``, you can subclass ``RemoteUserMiddleware`` and set the -``header`` attribute to the desired ``request.META`` key. For example:: +``header`` attribute to the desired ``request.META`` key. For example: + +.. code-block:: python + :caption: ``mysite/middleware.py`` from django.contrib.auth.middleware import RemoteUserMiddleware - class CustomHeaderMiddleware(RemoteUserMiddleware): - header = 'HTTP_AUTHUSER' + + class CustomHeaderRemoteUserMiddleware(RemoteUserMiddleware): + header = "HTTP_AUTHUSER" + +This custom middleware is then used in the :setting:`MIDDLEWARE` setting +instead of :class:`django.contrib.auth.middleware.RemoteUserMiddleware`:: + + MIDDLEWARE = [ + "...", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "mysite.middleware.CustomHeaderRemoteUserMiddleware", + "...", + ] .. warning:: diff --git a/docs/howto/csrf.txt b/docs/howto/csrf.txt new file mode 100644 index 000000000000..d40f4b4cb40e --- /dev/null +++ b/docs/howto/csrf.txt @@ -0,0 +1,311 @@ +.. _using-csrf: + +=================================== +How to use Django's CSRF protection +=================================== + +To take advantage of CSRF protection in your views, follow these steps: + +#. The CSRF middleware is activated by default in the :setting:`MIDDLEWARE` + setting. If you override that setting, remember that + ``'django.middleware.csrf.CsrfViewMiddleware'`` should come before any view + middleware that assume that CSRF attacks have been dealt with. + + If you disabled it, which is not recommended, you can use + :func:`~django.views.decorators.csrf.csrf_protect` on particular views + you want to protect (see below). + +#. In any template that uses a POST form, use the :ttag:`csrf_token` tag inside + the ``
`` element if the form is for an internal URL, e.g.: + + .. code-block:: html+django + + {% csrf_token %} + + This should not be done for POST forms that target external URLs, since + that would cause the CSRF token to be leaked, leading to a vulnerability. + +#. In the corresponding view functions, ensure that + :class:`~django.template.RequestContext` is used to render the response so + that ``{% csrf_token %}`` will work properly. If you're using the + :func:`~django.shortcuts.render` function, generic views, or contrib apps, + you are covered already since these all use ``RequestContext``. + +.. _csrf-ajax: + +Using CSRF protection with AJAX +=============================== + +While the above method can be used for AJAX POST requests, it has some +inconveniences: you have to remember to pass the CSRF token in as POST data with +every POST request. For this reason, there is an alternative method: on each +XMLHttpRequest, set a custom ``X-CSRFToken`` header (as specified by the +:setting:`CSRF_HEADER_NAME` setting) to the value of the CSRF token. This is +often easier because many JavaScript frameworks provide hooks that allow +headers to be set on every request. + +First, you must get the CSRF token. How to do that depends on whether or not +the :setting:`CSRF_USE_SESSIONS` and :setting:`CSRF_COOKIE_HTTPONLY` settings +are enabled. + +.. _acquiring-csrf-token-from-cookie: + +Acquiring the token if :setting:`CSRF_USE_SESSIONS` and :setting:`CSRF_COOKIE_HTTPONLY` are ``False`` +----------------------------------------------------------------------------------------------------- + +The recommended source for the token is the ``csrftoken`` cookie, which will be +set if you've enabled CSRF protection for your views as outlined above. + +The CSRF token cookie is named ``csrftoken`` by default, but you can control +the cookie name via the :setting:`CSRF_COOKIE_NAME` setting. + +You can acquire the token like this: + +.. code-block:: javascript + + function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + const csrftoken = getCookie('csrftoken'); + +The above code could be simplified by using the `JavaScript Cookie library +`_ to replace ``getCookie``: + +.. code-block:: javascript + + const csrftoken = Cookies.get('csrftoken'); + +.. note:: + + The CSRF token is also present in the DOM in a masked form, but only if + explicitly included using :ttag:`csrf_token` in a template. The cookie + contains the canonical, unmasked token. The + :class:`~django.middleware.csrf.CsrfViewMiddleware` will accept either. + However, in order to protect against `BREACH`_ attacks, it's recommended to + use a masked token. + +.. warning:: + + If your view is not rendering a template containing the :ttag:`csrf_token` + template tag, Django might not set the CSRF token cookie. This is common in + cases where forms are dynamically added to the page. To address this case, + Django provides a view decorator which forces setting of the cookie: + :func:`~django.views.decorators.csrf.ensure_csrf_cookie`. + +.. _BREACH: https://www.breachattack.com/ + +.. _acquiring-csrf-token-from-html: + +Acquiring the token if :setting:`CSRF_USE_SESSIONS` or :setting:`CSRF_COOKIE_HTTPONLY` is ``True`` +-------------------------------------------------------------------------------------------------- + +If you activate :setting:`CSRF_USE_SESSIONS` or +:setting:`CSRF_COOKIE_HTTPONLY`, you must include the CSRF token in your HTML +and read the token from the DOM with JavaScript: + +.. code-block:: html+django + + {% csrf_token %} + + +Setting the token on the AJAX request +------------------------------------- + +Finally, you'll need to set the header on your AJAX request. Using the +`fetch()`_ API: + +.. code-block:: javascript + + const request = new Request( + /* URL */, + { + method: 'POST', + headers: {'X-CSRFToken': csrftoken}, + mode: 'same-origin' // Do not send CSRF token to another domain. + } + ); + fetch(request).then(function(response) { + // ... + }); + +.. _fetch(): https://developer.mozilla.org/en-US/docs/Web/API/fetch + +Using CSRF protection in Jinja2 templates +========================================= + +Django's :class:`~django.template.backends.jinja2.Jinja2` template backend +adds ``{{ csrf_input }}`` to the context of all templates which is equivalent +to ``{% csrf_token %}`` in the Django template language. For example: + +.. code-block:: html+jinja + + {{ csrf_input }} + +Using the decorator method +========================== + +Rather than adding ``CsrfViewMiddleware`` as a blanket protection, you can use +the :func:`~django.views.decorators.csrf.csrf_protect` decorator, which has +exactly the same functionality, on particular views that need the protection. +It must be used **both** on views that insert the CSRF token in the output, and +on those that accept the POST form data. (These are often the same view +function, but not always). + +Use of the decorator by itself is **not recommended**, since if you forget to +use it, you will have a security hole. The 'belt and braces' strategy of using +both is fine, and will incur minimal overhead. + +.. _csrf-rejected-requests: + +Handling rejected requests +========================== + +By default, a '403 Forbidden' response is sent to the user if an incoming +request fails the checks performed by ``CsrfViewMiddleware``. This should +usually only be seen when there is a genuine Cross Site Request Forgery, or +when, due to a programming error, the CSRF token has not been included with a +POST form. + +The error page, however, is not very friendly, so you may want to provide your +own view for handling this condition. To do this, set the +:setting:`CSRF_FAILURE_VIEW` setting. + +CSRF failures are logged as warnings to the :ref:`django.security.csrf +` logger. + +Using CSRF protection with caching +================================== + +If the :ttag:`csrf_token` template tag is used by a template (or the +``get_token`` function is called some other way), ``CsrfViewMiddleware`` will +add a cookie and a ``Vary: Cookie`` header to the response. This means that the +middleware will play well with the cache middleware if it is used as instructed +(``UpdateCacheMiddleware`` goes before all other middleware). + +However, if you use cache decorators on individual views, the CSRF middleware +will not yet have been able to set the Vary header or the CSRF cookie, and the +response will be cached without either one. In this case, on any views that +will require a CSRF token to be inserted you should use the +:func:`django.views.decorators.csrf.csrf_protect` decorator first:: + + from django.views.decorators.cache import cache_page + from django.views.decorators.csrf import csrf_protect + + + @cache_page(60 * 15) + @csrf_protect + def my_view(request): ... + +If you are using class-based views, you can refer to :ref:`Decorating +class-based views`. + +Testing and CSRF protection +=========================== + +The ``CsrfViewMiddleware`` will usually be a big hindrance to testing view +functions, due to the need for the CSRF token which must be sent with every POST +request. For this reason, Django's HTTP client for tests has been modified to +set a flag on requests which relaxes the middleware and the ``csrf_protect`` +decorator so that they no longer rejects requests. In every other respect +(e.g. sending cookies etc.), they behave the same. + +If, for some reason, you *want* the test client to perform CSRF +checks, you can create an instance of the test client that enforces +CSRF checks: + +.. code-block:: pycon + + >>> from django.test import Client + >>> csrf_client = Client(enforce_csrf_checks=True) + +Edge cases +========== + +Certain views can have unusual requirements that mean they don't fit the normal +pattern envisaged here. A number of utilities can be useful in these +situations. The scenarios they might be needed in are described in the following +section. + +Disabling CSRF protection for just a few views +---------------------------------------------- + +Most views requires CSRF protection, but a few do not. + +Solution: rather than disabling the middleware and applying ``csrf_protect`` to +all the views that need it, enable the middleware and use +:func:`~django.views.decorators.csrf.csrf_exempt`. + +Setting the token when ``CsrfViewMiddleware.process_view()`` is not used +------------------------------------------------------------------------ + +There are cases when ``CsrfViewMiddleware.process_view`` may not have run +before your view is run - 404 and 500 handlers, for example - but you still +need the CSRF token in a form. + +Solution: use :func:`~django.views.decorators.csrf.requires_csrf_token` + +Including the CSRF token in an unprotected view +----------------------------------------------- + +There may be some views that are unprotected and have been exempted by +``csrf_exempt``, but still need to include the CSRF token. + +Solution: use :func:`~django.views.decorators.csrf.csrf_exempt` followed by +:func:`~django.views.decorators.csrf.requires_csrf_token`. (i.e. ``requires_csrf_token`` +should be the innermost decorator). + +Protecting a view for only one path +----------------------------------- + +A view needs CSRF protection under one set of conditions only, and mustn't have +it for the rest of the time. + +Solution: use :func:`~django.views.decorators.csrf.csrf_exempt` for the whole +view function, and :func:`~django.views.decorators.csrf.csrf_protect` for the +path within it that needs protection. Example:: + + from django.views.decorators.csrf import csrf_exempt, csrf_protect + + + @csrf_exempt + def my_view(request): + @csrf_protect + def protected_path(request): + do_something() + + if some_condition(): + return protected_path(request) + else: + do_something_else() + +Protecting a page that uses AJAX without an HTML form +----------------------------------------------------- + +A page makes a POST request via AJAX, and the page does not have an HTML form +with a :ttag:`csrf_token` that would cause the required CSRF cookie to be sent. + +Solution: use :func:`~django.views.decorators.csrf.ensure_csrf_cookie` on the +view that sends the page. + +CSRF protection in reusable applications +======================================== + +Because it is possible for the developer to turn off the ``CsrfViewMiddleware``, +all relevant views in contrib apps use the ``csrf_protect`` decorator to ensure +the security of these applications against CSRF. It is recommended that the +developers of other reusable apps that want the same guarantees also use the +``csrf_protect`` decorator on their views. diff --git a/docs/howto/custom-file-storage.txt b/docs/howto/custom-file-storage.txt index 7fd71ffef070..4c9d164a0a01 100644 --- a/docs/howto/custom-file-storage.txt +++ b/docs/howto/custom-file-storage.txt @@ -1,6 +1,6 @@ -=============================== -Writing a custom storage system -=============================== +=================================== +How to write a custom storage class +=================================== .. currentmodule:: django.core.files.storage @@ -13,8 +13,8 @@ You'll need to follow these steps: from django.core.files.storage import Storage - class MyStorage(Storage): - ... + + class MyStorage(Storage): ... #. Django must be able to instantiate your storage system without any arguments. This means that any settings should be taken from ``django.conf.settings``:: @@ -22,6 +22,7 @@ You'll need to follow these steps: from django.conf import settings from django.core.files.storage import Storage + class MyStorage(Storage): def __init__(self, option=None): if not option: @@ -74,7 +75,8 @@ objects. These are: Called by ``Storage.open()``, this is the actual mechanism the storage class uses to open the file. This must return a ``File`` object, though in most cases, you'll want to return some subclass here that implements logic specific to the -backend storage system. +backend storage system. The :exc:`FileNotFoundError` exception should be raised +when a file doesn't exist. .. method:: _save(name, content) @@ -82,8 +84,8 @@ Called by ``Storage.save()``. The ``name`` will already have gone through ``get_valid_name()`` and ``get_available_name()``, and the ``content`` will be a ``File`` object itself. -Should return the actual name of name of the file saved (usually the ``name`` -passed in, but if the storage needs to change the file name return the new name +Should return the actual name of the file saved (usually the ``name`` passed +in, but if the storage needs to change the file name return the new name instead). .. method:: get_valid_name(name) @@ -116,3 +118,22 @@ free unique filename cannot be found, a :exc:`SuspiciousFileOperation If a file with ``name`` already exists, ``get_alternative_name()`` is called to obtain an alternative name. + +.. _using-custom-storage-engine: + +Use your custom storage engine +============================== + +The first step to using your custom storage with Django is to tell Django about +the file storage backend you'll be using. This is done using the +:setting:`STORAGES` setting. This setting maps storage aliases, which are a way +to refer to a specific storage throughout Django, to a dictionary of settings +for that specific storage backend. The settings in the inner dictionaries are +described fully in the :setting:`STORAGES` documentation. + +Storages are then accessed by alias from the +:data:`django.core.files.storage.storages` dictionary:: + + from django.core.files.storage import storages + + example_storage = storages["example"] diff --git a/docs/howto/custom-lookups.txt b/docs/howto/custom-lookups.txt index 52a16ae167cb..fc8e92889063 100644 --- a/docs/howto/custom-lookups.txt +++ b/docs/howto/custom-lookups.txt @@ -1,6 +1,6 @@ -============== -Custom Lookups -============== +=========================== +How to write custom lookups +=========================== .. currentmodule:: django.db.models @@ -28,14 +28,15 @@ lookup, then we need to tell Django about it:: from django.db.models import Lookup + class NotEqual(Lookup): - lookup_name = 'ne' + lookup_name = "ne" def as_sql(self, compiler, connection): lhs, lhs_params = self.process_lhs(compiler, connection) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params - return '%s <> %s' % (lhs, rhs), params + return "%s <> %s" % (lhs, rhs), params To register the ``NotEqual`` lookup we will need to call ``register_lookup`` on the field class we want the lookup to be available for. In this case, the lookup @@ -43,15 +44,16 @@ makes sense on all ``Field`` subclasses, so we register it with ``Field`` directly:: from django.db.models import Field + Field.register_lookup(NotEqual) Lookup registration can also be done using a decorator pattern:: from django.db.models import Field + @Field.register_lookup - class NotEqualLookup(Lookup): - # ... + class NotEqualLookup(Lookup): ... We can now use ``foo__ne`` for any field ``foo``. You will need to ensure that this registration happens before you try to create any querysets using it. You @@ -115,13 +117,15 @@ function ``ABS()`` to transform the value before comparison:: from django.db.models import Transform + class AbsoluteValue(Transform): - lookup_name = 'abs' - function = 'ABS' + lookup_name = "abs" + function = "ABS" Next, let's register it for ``IntegerField``:: from django.db.models import IntegerField + IntegerField.register_lookup(AbsoluteValue) We can now run the queries we had before. @@ -132,7 +136,7 @@ We can now run the queries we had before. SELECT ... WHERE ABS("experiments"."change") = 27 By using ``Transform`` instead of ``Lookup`` it means we are able to chain -further lookups afterwards. So +further lookups afterward. So ``Experiment.objects.filter(change__abs__lt=27)`` will generate the following SQL: @@ -167,9 +171,10 @@ be done by adding an ``output_field`` attribute to the transform:: from django.db.models import FloatField, Transform + class AbsoluteValue(Transform): - lookup_name = 'abs' - function = 'ABS' + lookup_name = "abs" + function = "ABS" @property def output_field(self): @@ -197,14 +202,16 @@ The implementation is:: from django.db.models import Lookup + class AbsoluteValueLessThan(Lookup): - lookup_name = 'lt' + lookup_name = "lt" def as_sql(self, compiler, connection): lhs, lhs_params = compiler.compile(self.lhs.lhs) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params + lhs_params + rhs_params - return '%s < %s AND %s > -%s' % (lhs, rhs, lhs, rhs), params + return "%s < %s AND %s > -%s" % (lhs, rhs, lhs, rhs), params + AbsoluteValue.register_lookup(AbsoluteValueLessThan) @@ -252,14 +259,16 @@ this transformation should apply to both ``lhs`` and ``rhs``:: from django.db.models import Transform + class UpperCase(Transform): - lookup_name = 'upper' - function = 'UPPER' + lookup_name = "upper" + function = "UPPER" bilateral = True Next, let's register it:: from django.db.models import CharField, TextField + CharField.register_lookup(UpperCase) TextField.register_lookup(UpperCase) @@ -287,7 +296,8 @@ We can change the behavior on a specific backend by creating a subclass of lhs, lhs_params = self.process_lhs(compiler, connection) rhs, rhs_params = self.process_rhs(compiler, connection) params = lhs_params + rhs_params - return '%s != %s' % (lhs, rhs), params + return "%s != %s" % (lhs, rhs), params + Field.register_lookup(MySQLNotEqual) @@ -310,9 +320,9 @@ would override ``get_lookup`` with something like:: class CoordinatesField(Field): def get_lookup(self, lookup_name): - if lookup_name.startswith('x'): + if lookup_name.startswith("x"): try: - dimension = int(lookup_name[1:]) + dimension = int(lookup_name.removeprefix("x")) except ValueError: pass else: diff --git a/docs/howto/custom-management-commands.txt b/docs/howto/custom-management-commands.txt index 56db507689e2..ce8c85276cd3 100644 --- a/docs/howto/custom-management-commands.txt +++ b/docs/howto/custom-management-commands.txt @@ -1,6 +1,6 @@ -======================================== -Writing custom ``django-admin`` commands -======================================== +============================================== +How to create custom ``django-admin`` commands +============================================== .. module:: django.core.management @@ -12,7 +12,9 @@ command for the ``polls`` application from the To do this, add a ``management/commands`` directory to the application. Django will register a ``manage.py`` command for each Python module in that directory -whose name doesn't begin with an underscore. For example:: +whose name doesn't begin with an underscore. For example: + +.. code-block:: text polls/ __init__.py @@ -47,14 +49,15 @@ look like this:: from django.core.management.base import BaseCommand, CommandError from polls.models import Question as Poll + class Command(BaseCommand): - help = 'Closes the specified poll for voting' + help = "Closes the specified poll for voting" def add_arguments(self, parser): - parser.add_argument('poll_ids', nargs='+', type=int) + parser.add_argument("poll_ids", nargs="+", type=int) def handle(self, *args, **options): - for poll_id in options['poll_ids']: + for poll_id in options["poll_ids"]: try: poll = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: @@ -63,7 +66,9 @@ look like this:: poll.opened = False poll.save() - self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id)) + self.stdout.write( + self.style.SUCCESS('Successfully closed poll "%s"' % poll_id) + ) .. _management-commands-output: @@ -76,7 +81,7 @@ look like this:: character, it will be added automatically, unless you specify the ``ending`` parameter:: - self.stdout.write("Unterminated line", ending='') + self.stdout.write("Unterminated line", ending="") The new custom command can be called using ``python manage.py closepoll ``. @@ -99,18 +104,18 @@ options can be added in the :meth:`~BaseCommand.add_arguments` method like this: class Command(BaseCommand): def add_arguments(self, parser): # Positional arguments - parser.add_argument('poll_ids', nargs='+', type=int) + parser.add_argument("poll_ids", nargs="+", type=int) # Named (optional) arguments parser.add_argument( - '--delete', - action='store_true', - help='Delete poll instead of closing it', + "--delete", + action="store_true", + help="Delete poll instead of closing it", ) def handle(self, *args, **options): # ... - if options['delete']: + if options["delete"]: poll.delete() # ... @@ -136,12 +141,12 @@ decorator on your :meth:`~BaseCommand.handle` method:: from django.core.management.base import BaseCommand, no_translations + class Command(BaseCommand): ... @no_translations - def handle(self, *args, **options): - ... + def handle(self, *args, **options): ... Since translation deactivation requires access to configured settings, the decorator can't be used for commands that work without configured settings. @@ -152,6 +157,8 @@ Testing Information on how to test custom management commands can be found in the :ref:`testing docs `. +.. _overriding-commands: + Overriding commands =================== @@ -218,21 +225,17 @@ All attributes can be set in your derived class and can be used in .. attribute:: BaseCommand.requires_system_checks A list or tuple of tags, e.g. ``[Tags.staticfiles, Tags.models]``. System - checks registered in the chosen tags will be checked for errors prior to - executing the command. The value ``'__all__'`` can be used to specify - that all system checks should be performed. Default value is ``'__all__'``. - - .. versionchanged:: 3.2 - - In older versions, the ``requires_system_checks`` attribute expects a - boolean value instead of a list or tuple of tags. + checks :ref:`registered in the chosen tags ` + will be checked for errors prior to executing the command. The value + ``'__all__'`` can be used to specify that all system checks should be + performed. Default value is ``'__all__'``. .. attribute:: BaseCommand.style An instance attribute that helps create colored output when writing to ``stdout`` or ``stderr``. For example:: - self.stdout.write(self.style.SUCCESS('...')) + self.stdout.write(self.style.SUCCESS("...")) See :ref:`syntax-coloring` to learn how to modify the color palette and to see the available styles (use uppercased versions of the "roles" described @@ -241,6 +244,12 @@ All attributes can be set in your derived class and can be used in If you pass the :option:`--no-color` option when running your command, all ``self.style()`` calls will return the original string uncolored. +.. attribute:: BaseCommand.suppressed_base_arguments + + The default command options to suppress in the help output. This should be + a set of option names (e.g. ``'--verbosity'``). The default values for the + suppressed options are still passed. + Methods ------- @@ -283,7 +292,7 @@ the :meth:`~BaseCommand.handle` method must be implemented. Tries to execute this command, performing system checks if needed (as controlled by the :attr:`requires_system_checks` attribute). If the command - raises a :exc:`CommandError`, it's intercepted and printed to stderr. + raises a :exc:`CommandError`, it's intercepted and printed to ``stderr``. .. admonition:: Calling a management command in your code @@ -297,15 +306,35 @@ the :meth:`~BaseCommand.handle` method must be implemented. It may return a string which will be printed to ``stdout`` (wrapped by ``BEGIN;`` and ``COMMIT;`` if :attr:`output_transaction` is ``True``). -.. method:: BaseCommand.check(app_configs=None, tags=None, display_num_errors=False) +.. method:: BaseCommand.check(app_configs=None, tags=None,display_num_errors=False, include_deployment_checks=False, fail_level=checks.ERROR, databases=None) Uses the system check framework to inspect the entire Django project for potential problems. Serious problems are raised as a :exc:`CommandError`; - warnings are output to stderr; minor notifications are output to stdout. + warnings are output to ``stderr``; minor notifications are output to + ``stdout``. If ``app_configs`` and ``tags`` are both ``None``, all system checks are - performed. ``tags`` can be a list of check tags, like ``compatibility`` or - ``models``. + performed except deployment and database related checks. ``tags`` can be a + list of check tags, like ``compatibility`` or ``models``. + + You can pass ``include_deployment_checks=True`` to also perform deployment + checks, and list of database aliases in the ``databases`` to run database + related checks against them. + +.. method:: BaseCommand.get_check_kwargs(options) + + .. versionadded:: 5.2 + + Supplies kwargs for the call to :meth:`check`, including transforming the + value of :attr:`requires_system_checks` to the ``tag`` kwarg. + + Override this method to change the values supplied to :meth:`check`. For + example, to opt into database related checks you can override + ``get_check_kwargs()`` as follows:: + + def get_check_kwargs(self, options): + kwargs = super().get_check_kwargs(options) + return {**kwargs, "databases": [options["database"]]} .. _ref-basecommand-subclasses: @@ -355,16 +384,12 @@ Exception class indicating a problem while executing a management command. If this exception is raised during the execution of a management command from a command line console, it will be caught and turned into a nicely-printed error -message to the appropriate output stream (i.e., stderr); as a result, raising -this exception (with a sensible description of the error) is the preferred way -to indicate that something has gone wrong in the execution of a command. It -accepts the optional ``returncode`` argument to customize the exit status for -the management command to exit with, using :func:`sys.exit`. +message to the appropriate output stream (i.e., ``stderr``); as a result, +raising this exception (with a sensible description of the error) is the +preferred way to indicate that something has gone wrong in the execution of a +command. It accepts the optional ``returncode`` argument to customize the exit +status for the management command to exit with, using :func:`sys.exit`. If a management command is called from code through :func:`~django.core.management.call_command`, it's up to you to catch the exception when needed. - -.. versionchanged:: 3.1 - - The ``returncode`` argument was added. diff --git a/docs/howto/custom-model-fields.txt b/docs/howto/custom-model-fields.txt index c31a5dbc4f81..fefd8740e721 100644 --- a/docs/howto/custom-model-fields.txt +++ b/docs/howto/custom-model-fields.txt @@ -1,6 +1,6 @@ -=========================== -Writing custom model fields -=========================== +================================= +How to create custom model fields +================================= .. currentmodule:: django.db.models @@ -98,7 +98,7 @@ Normally, you're either writing a Django field to match a particular database column type, or you will need a way to convert your data to, say, a string. For our ``Hand`` example, we could convert the card data to a string of 104 -characters by concatenating all the cards together in a pre-determined order -- +characters by concatenating all the cards together in a predetermined order -- say, all the *north* cards first, then the *east*, *south* and *west* cards. So ``Hand`` objects can be saved to text or character columns in the database. @@ -162,12 +162,12 @@ behave like any existing field, so we'll subclass directly from from django.db import models - class HandField(models.Field): + class HandField(models.Field): description = "A hand of cards (bridge style)" def __init__(self, *args, **kwargs): - kwargs['max_length'] = 104 + kwargs["max_length"] = 104 super().__init__(*args, **kwargs) Our ``HandField`` accepts most of the standard field options (see the list @@ -234,7 +234,7 @@ The counterpoint to writing your ``__init__()`` method is writing the :meth:`~.Field.deconstruct` method. It's used during :doc:`model migrations ` to tell Django how to take an instance of your new field and reduce it to a serialized form - in particular, what arguments to pass to -``__init__()`` to re-create it. +``__init__()`` to recreate it. If you haven't added any extra options on top of the field you inherited from, then there's no need to write a new ``deconstruct()`` method. If, however, @@ -259,10 +259,10 @@ we can drop it from the keyword arguments for readability:: from django.db import models - class HandField(models.Field): + class HandField(models.Field): def __init__(self, *args, **kwargs): - kwargs['max_length'] = 104 + kwargs["max_length"] = 104 super().__init__(*args, **kwargs) def deconstruct(self): @@ -277,6 +277,7 @@ such as when the default value is being used:: from django.db import models + class CommaSepField(models.Field): "Implements comma-separated storage of lists" @@ -288,7 +289,7 @@ such as when the default value is being used:: name, path, args, kwargs = super().deconstruct() # Only include kwarg if it's not the default if self.separator != ",": - kwargs['separator'] = self.separator + kwargs["separator"] = self.separator return name, path, args, kwargs More complex examples are beyond the scope of this document, but remember - @@ -314,29 +315,43 @@ reconstructing the field:: new_instance = MyField(*args, **kwargs) self.assertEqual(my_field_instance.some_attribute, new_instance.some_attribute) +.. _custom-field-non_db_attrs: + +Field attributes not affecting database column definition +--------------------------------------------------------- + +You can override ``Field.non_db_attrs`` to customize attributes of a field that +don't affect a column definition. It's used during model migrations to detect +no-op ``AlterField`` operations. + +For example:: + + class CommaSepField(models.Field): + @property + def non_db_attrs(self): + return super().non_db_attrs + ("separator",) + + Changing a custom field's base class ------------------------------------ You can't change the base class of a custom field because Django won't detect the change and make a migration for it. For example, if you start with:: - class CustomCharField(models.CharField): - ... + class CustomCharField(models.CharField): ... and then decide that you want to use ``TextField`` instead, you can't change the subclass like this:: - class CustomCharField(models.TextField): - ... + class CustomCharField(models.TextField): ... Instead, you must create a new custom field class and update your models to reference it:: - class CustomCharField(models.CharField): - ... + class CustomCharField(models.CharField): ... + - class CustomTextField(models.TextField): - ... + class CustomTextField(models.TextField): ... As discussed in :ref:`removing fields `, you must retain the original ``CustomCharField`` class as long as you have @@ -379,9 +394,10 @@ subclass ``Field`` and implement the :meth:`~Field.db_type` method, like so:: from django.db import models + class MytypeField(models.Field): def db_type(self, connection): - return 'mytype' + return "mytype" Once you have ``MytypeField``, you can use it in any model, just like any other ``Field`` type:: @@ -394,25 +410,24 @@ If you aim to build a database-agnostic application, you should account for differences in database column types. For example, the date/time column type in PostgreSQL is called ``timestamp``, while the same column in MySQL is called ``datetime``. You can handle this in a :meth:`~Field.db_type` method by -checking the ``connection.settings_dict['ENGINE']`` attribute. +checking the ``connection.vendor`` attribute. Current built-in vendor names +are: ``sqlite``, ``postgresql``, ``mysql``, and ``oracle``. For example:: class MyDateField(models.Field): def db_type(self, connection): - if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': - return 'datetime' + if connection.vendor == "mysql": + return "datetime" else: - return 'timestamp' + return "timestamp" The :meth:`~Field.db_type` and :meth:`~Field.rel_db_type` methods are called by Django when the framework constructs the ``CREATE TABLE`` statements for your application -- that is, when you first create your tables. The methods are also called when constructing a ``WHERE`` clause that includes the model field -- that is, when you retrieve data using QuerySet methods like ``get()``, -``filter()``, and ``exclude()`` and have the model field as an argument. They -are not called at any other time, so it can afford to execute slightly complex -code, such as the ``connection.settings_dict`` check in the above example. +``filter()``, and ``exclude()`` and have the model field as an argument. Some database column types accept parameters, such as ``CHAR(25)``, where the parameter ``25`` represents the maximum column length. In cases like these, @@ -423,7 +438,8 @@ sense to have a ``CharMaxlength25Field``, shown here:: # This is a silly example of hard-coded parameters. class CharMaxlength25Field(models.Field): def db_type(self, connection): - return 'char(25)' + return "char(25)" + # In the model: class MyModel(models.Model): @@ -441,7 +457,8 @@ time -- i.e., when the class is instantiated. To do that, implement super().__init__(*args, **kwargs) def db_type(self, connection): - return 'char(%s)' % self.max_length + return "char(%s)" % self.max_length + # In the model: class MyModel(models.Model): @@ -462,10 +479,10 @@ need the foreign keys that point to that field to use the same data type:: # MySQL unsigned integer (range 0 to 4294967295). class UnsignedAutoField(models.AutoField): def db_type(self, connection): - return 'integer UNSIGNED AUTO_INCREMENT' + return "integer UNSIGNED AUTO_INCREMENT" def rel_db_type(self, connection): - return 'integer UNSIGNED' + return "integer UNSIGNED" .. _converting-values-to-python-objects: @@ -492,8 +509,8 @@ following arguments: * ``None`` (if the field allows ``null=True``) -In our ``HandField`` class, we're storing the data as a VARCHAR field in the -database, so we need to be able to process strings and ``None`` in the +In our ``HandField`` class, we're storing the data as a ``VARCHAR`` field in +the database, so we need to be able to process strings and ``None`` in the ``from_db_value()``. In ``to_python()``, we need to also handle ``Hand`` instances:: @@ -503,15 +520,17 @@ instances:: from django.db import models from django.utils.translation import gettext_lazy as _ + def parse_hand(hand_string): """Takes a string of cards and splits into a full hand.""" - p1 = re.compile('.{26}') - p2 = re.compile('..') + p1 = re.compile(".{26}") + p2 = re.compile("..") args = [p2.findall(x) for x in p1.findall(hand_string)] if len(args) != 4: raise ValidationError(_("Invalid input for a Hand instance")) return Hand(*args) + class HandField(models.Field): # ... @@ -541,8 +560,8 @@ Converting Python objects to query values ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Since using a database requires conversion in both ways, if you override -:meth:`~Field.to_python` you also have to override :meth:`~Field.get_prep_value` -to convert Python objects back to query values. +:meth:`~Field.from_db_value` you also have to override +:meth:`~Field.get_prep_value` to convert Python objects back to query values. For example:: @@ -550,8 +569,9 @@ For example:: # ... def get_prep_value(self, value): - return ''.join([''.join(l) for l in (value.north, - value.east, value.south, value.west)]) + return "".join( + ["".join(l) for l in (value.north, value.east, value.south, value.west)] + ) .. warning:: @@ -625,6 +645,9 @@ delegate further handling to the parent class. This might require you to write a custom form field (and even a form widget). See the :doc:`forms documentation ` for information about this. +If you wish to exclude the field from the :class:`~django.forms.ModelForm`, you +can override the :meth:`~Field.formfield` method to return ``None``. + Continuing our ongoing example, we can write the :meth:`~Field.formfield` method as:: @@ -632,9 +655,13 @@ as:: # ... def formfield(self, **kwargs): - # This is a fairly standard way to set up some defaults - # while letting the caller override them. - defaults = {'form_class': MyFormField} + # Exclude the field from the ModelForm when some condition is met. + some_condition = kwargs.get("some_condition", False) + if some_condition: + return None + + # Set up some defaults while letting the caller override them. + defaults = {"form_class": MyFormField} defaults.update(kwargs) return super().formfield(**defaults) @@ -661,7 +688,7 @@ For example:: # ... def get_internal_type(self): - return 'CharField' + return "CharField" No matter which database backend we are using, this will mean that :djadmin:`migrate` and other SQL commands create the right column type for @@ -703,7 +730,7 @@ serialization formats. Here are a couple of tips to make things go more smoothly: #. Look at the existing Django fields (in - :file:`django/db/models/fields/__init__.py`) for inspiration. Try to find + :source:`django/db/models/fields/__init__.py`) for inspiration. Try to find a field that's similar to what you want and extend it a little bit, instead of creating an entirely new field from scratch. @@ -740,7 +767,7 @@ In addition to the above details, there are a few guidelines which can greatly improve the efficiency and readability of the field's code. #. The source for Django's own ``ImageField`` (in - ``django/db/models/fields/files.py``) is a great example of how to + :source:`django/db/models/fields/files.py`) is a great example of how to subclass ``FileField`` to support a particular type of file, as it incorporates all of the techniques described above. diff --git a/docs/howto/custom-shell.txt b/docs/howto/custom-shell.txt new file mode 100644 index 000000000000..312a38162b92 --- /dev/null +++ b/docs/howto/custom-shell.txt @@ -0,0 +1,66 @@ +====================================== +How to customize the ``shell`` command +====================================== + +The Django :djadmin:`shell` is an interactive Python environment that provides +access to models and settings, making it useful for testing code, experimenting +with queries, and interacting with application data. + +Customizing the :djadmin:`shell` command allows adding extra functionality or +pre-loading specific modules. To do this, create a new management command that +subclasses ``django.core.management.commands.shell.Command`` and overrides the +existing ``shell`` management command. For more details, refer to the guide on +:ref:`overriding commands `. + +.. _customizing-shell-auto-imports: + +Customize automatic imports +=========================== + +.. versionadded:: 5.2 + +To customize the automatic import behavior of the :djadmin:`shell` management +command, override the ``get_auto_imports()`` method. This method should return +a sequence of import paths for objects or modules available in the application. +For example: + +.. code-block:: python + :caption: ``polls/management/commands/shell.py`` + + from django.core.management.commands import shell + + + class Command(shell.Command): + def get_auto_imports(self): + return super().get_auto_imports() + [ + "django.urls.reverse", + "django.urls.resolve", + ] + +The customization above adds :func:`~django.urls.resolve` and +:func:`~django.urls.reverse` to the default namespace, which already includes +all models from the apps listed in :setting:`INSTALLED_APPS`. These objects +will be available in the ``shell`` without requiring a manual import. + +Running this customized ``shell`` command with ``verbosity=2`` would show: + +.. console:: + + 8 objects imported automatically: + + from django.contrib.admin.models import LogEntry + from django.contrib.auth.models import Group, Permission, User + from django.contrib.contenttypes.models import ContentType + from django.contrib.sessions.models import Session + from django.urls import resolve, reverse + +If an overridden ``shell`` command includes paths that cannot be imported, +these errors are shown when ``verbosity`` is set to ``1`` or higher. + +Note that automatic imports can be disabled for a specific ``shell`` session +using the :option:`--no-imports ` flag. To permanently +disable automatic imports, override ``get_auto_imports()`` to return ``None``:: + + class Command(shell.Command): + def get_auto_imports(self): + return None diff --git a/docs/howto/custom-template-backend.txt b/docs/howto/custom-template-backend.txt index 3e9c87a07ab5..640f6918f76f 100644 --- a/docs/howto/custom-template-backend.txt +++ b/docs/howto/custom-template-backend.txt @@ -1,6 +1,6 @@ -======================= -Custom template backend -======================= +========================================== +How to implement a custom template backend +========================================== Custom backends --------------- @@ -19,14 +19,13 @@ fictional ``foobar`` template library:: class FooBar(BaseEngine): - # Name of the subdirectory containing the templates for this engine # inside an installed application. - app_dirname = 'foobar' + app_dirname = "foobar" def __init__(self, params): params = params.copy() - options = params.pop('OPTIONS').copy() + options = params.pop("OPTIONS").copy() super().__init__(params) self.engine = foobar.Engine(**options) @@ -47,7 +46,6 @@ fictional ``foobar`` template library:: class Template: - def __init__(self, template): self.template = template @@ -55,9 +53,9 @@ fictional ``foobar`` template library:: if context is None: context = {} if request is not None: - context['request'] = request - context['csrf_input'] = csrf_input_lazy(request) - context['csrf_token'] = csrf_token_lazy(request) + context["request"] = request + context["csrf_input"] = csrf_input_lazy(request) + context["csrf_token"] = csrf_token_lazy(request) return self.template.render(context) See `DEP 182`_ for more information. @@ -127,25 +125,25 @@ a :class:`dict` with the following values: Given the above template error, ``template_debug`` would look like:: { - 'name': '/path/to/template.html', - 'message': "Invalid block tag: 'syntax'", - 'source_lines': [ - (1, 'some\n'), - (2, 'lines\n'), - (3, 'before\n'), - (4, 'Hello {% syntax error %} {{ world }}\n'), - (5, 'some\n'), - (6, 'lines\n'), - (7, 'after\n'), - (8, ''), + "name": "/path/to/template.html", + "message": "Invalid block tag: 'syntax'", + "source_lines": [ + (1, "some\n"), + (2, "lines\n"), + (3, "before\n"), + (4, "Hello {% syntax error %} {{ world }}\n"), + (5, "some\n"), + (6, "lines\n"), + (7, "after\n"), + (8, ""), ], - 'line': 4, - 'before': 'Hello ', - 'during': '{% syntax error %}', - 'after': ' {{ world }}\n', - 'total': 9, - 'bottom': 9, - 'top': 1, + "line": 4, + "before": "Hello ", + "during": "{% syntax error %}", + "after": " {{ world }}\n", + "total": 9, + "bottom": 9, + "top": 1, } .. _template-origin-api: @@ -156,7 +154,8 @@ Origin API and 3rd-party integration Django templates have an :class:`~django.template.base.Origin` object available through the ``template.origin`` attribute. This enables debug information to be displayed in the :ref:`template postmortem `, as well as -in 3rd-party libraries, like the `Django Debug Toolbar`_. +in 3rd-party libraries, like the :pypi:`Django Debug Toolbar +`. Custom engines can provide their own ``template.origin`` information by creating an object that specifies the following attributes: @@ -169,5 +168,4 @@ creating an object that specifies the following attributes: * ``'loader_name'``: An optional string identifying the function or class used to load the template, e.g. ``django.template.loaders.filesystem.Loader``. -.. _DEP 182: https://github.com/django/deps/blob/master/final/0182-multiple-template-engines.rst -.. _Django Debug Toolbar: https://github.com/jazzband/django-debug-toolbar +.. _DEP 182: https://github.com/django/deps/blob/main/final/0182-multiple-template-engines.rst diff --git a/docs/howto/custom-template-tags.txt b/docs/howto/custom-template-tags.txt index aad254b9460e..b5577eef7b1e 100644 --- a/docs/howto/custom-template-tags.txt +++ b/docs/howto/custom-template-tags.txt @@ -1,6 +1,6 @@ -================================ -Custom template tags and filters -================================ +============================================== +How to create custom template tags and filters +============================================== Django's template language comes with a wide variety of :doc:`built-in tags and filters ` designed to address the @@ -35,7 +35,9 @@ later, so be careful to pick a name that won't clash with custom tags and filters in another app. For example, if your custom tags/filters are in a file called -``poll_extras.py``, your app layout might look like this:: +``poll_extras.py``, your app layout might look like this: + +.. code-block:: text polls/ __init__.py @@ -79,8 +81,8 @@ an application. .. admonition:: Behind the scenes For a ton of examples, read the source code for Django's default filters - and tags. They're in ``django/template/defaultfilters.py`` and - ``django/template/defaulttags.py``, respectively. + and tags. They're in :source:`django/template/defaultfilters.py` and + :source:`django/template/defaulttags.py`, respectively. For more information on the :ttag:`load` tag, read its documentation. @@ -109,7 +111,7 @@ Here's an example filter definition:: def cut(value, arg): """Removes all values of arg from the given string""" - return value.replace(arg, '') + return value.replace(arg, "") And here's an example of how that filter would be used: @@ -120,7 +122,7 @@ And here's an example of how that filter would be used: Most filters don't take arguments. In this case, leave the argument out of your function:: - def lower(value): # Only one argument. + def lower(value): # Only one argument. """Converts a string into all lowercase""" return value.lower() @@ -132,8 +134,8 @@ Registering custom filters Once you've written your filter definition, you need to register it with your ``Library`` instance, to make it available to Django's template language:: - register.filter('cut', cut) - register.filter('lower', lower) + register.filter("cut", cut) + register.filter("lower", lower) The ``Library.filter()`` method takes two arguments: @@ -143,9 +145,10 @@ The ``Library.filter()`` method takes two arguments: You can use ``register.filter()`` as a decorator instead:: - @register.filter(name='cut') + @register.filter(name="cut") def cut(value, arg): - return value.replace(arg, '') + return value.replace(arg, "") + @register.filter def lower(value): @@ -173,6 +176,7 @@ convert an object to its string value before being passed to your function:: register = template.Library() + @register.filter @stringfilter def lower(value): @@ -240,7 +244,7 @@ Template filter code falls into one of two situations: @register.filter(is_safe=True) def add_xx(value): - return '%sxx' % value + return "%sxx" % value When this filter is used in a template where auto-escaping is enabled, Django will escape the output whenever the input is not already marked @@ -298,6 +302,7 @@ Template filter code falls into one of two situations: register = template.Library() + @register.filter(needs_autoescape=True) def initial_letter_filter(text, autoescape=True): first, other = text[0], text[1:] @@ -305,7 +310,7 @@ Template filter code falls into one of two situations: esc = conditional_escape else: esc = lambda x: x - result = '%s%s' % (esc(first), esc(other)) + result = "%s%s" % (esc(first), esc(other)) return mark_safe(result) The ``needs_autoescape`` flag and the ``autoescape`` keyword argument mean @@ -343,12 +348,10 @@ Template filter code falls into one of two situations: from django.template.defaultfilters import linebreaksbr, urlize + @register.filter(needs_autoescape=True) def urlize_and_linebreaks(text, autoescape=True): - return linebreaksbr( - urlize(text, autoescape=autoescape), - autoescape=autoescape - ) + return linebreaksbr(urlize(text, autoescape=autoescape), autoescape=autoescape) Then: @@ -376,7 +379,7 @@ objects, you'll usually register it with the ``expects_localtime`` flag set to try: return 9 <= value.hour < 17 except AttributeError: - return '' + return "" When this flag is set, if the first argument to your filter is a time zone aware datetime, Django will convert it to the current time zone before passing @@ -419,6 +422,7 @@ Our ``current_time`` function could thus be written like this:: register = template.Library() + @register.simple_tag def current_time(format_string): return datetime.datetime.now().strftime(format_string) @@ -448,7 +452,7 @@ If your template tag needs to access the current context, you can use the @register.simple_tag(takes_context=True) def current_time(context, format_string): - timezone = context['timezone'] + timezone = context["timezone"] return your_get_current_time_method(timezone, format_string) Note that the first argument *must* be called ``context``. @@ -458,9 +462,10 @@ on :ref:`inclusion tags`. If you need to rename your tag, you can provide a custom name for it:: - register.simple_tag(lambda x: x - 1, name='minusone') + register.simple_tag(lambda x: x - 1, name="minusone") + - @register.simple_tag(name='minustwo') + @register.simple_tag(name="minustwo") def some_function(value): return value - 2 @@ -469,8 +474,8 @@ arguments. For example:: @register.simple_tag def my_tag(a, b, *args, **kwargs): - warning = kwargs['warning'] - profile = kwargs['profile'] + warning = kwargs["warning"] + profile = kwargs["profile"] ... return ... @@ -493,6 +498,195 @@ you see fit: {% current_time "%Y-%m-%d %I:%M %p" as the_time %}

The time is {{ the_time }}.

+.. _howto-custom-template-tags-simple-block-tags: + +Simple block tags +----------------- + +.. versionadded:: 5.2 + +.. method:: django.template.Library.simple_block_tag() + +When a section of rendered template needs to be passed into a custom tag, +Django provides the ``simple_block_tag`` helper function to accomplish this. +Similar to :meth:`~django.template.Library.simple_tag()`, this function accepts +a custom tag function, but with the additional ``content`` argument, which +contains the rendered content as defined inside the tag. This allows dynamic +template sections to be easily incorporated into custom tags. + +For example, a custom block tag which creates a chart could look like this:: + + from django import template + from myapp.charts import render_chart + + register = template.Library() + + + @register.simple_block_tag + def chart(content): + return render_chart(source=content) + +The ``content`` argument contains everything in between the ``{% chart %}`` +and ``{% endchart %}`` tags: + +.. code-block:: html+django + + {% chart %} + digraph G { + label = "Chart for {{ request.user }}" + A -> {B C} + } + {% endchart %} + +If there are other template tags or variables inside the ``content`` block, +they will be rendered before being passed to the tag function. In the example +above, ``request.user`` will be resolved by the time ``render_chart`` is +called. + +Block tags are closed with ``end{name}`` (for example, ``endchart``). This can +be customized with the ``end_name`` parameter:: + + @register.simple_block_tag(end_name="endofchart") + def chart(content): + return render_chart(source=content) + +Which would require a template definition like this: + +.. code-block:: html+django + + {% chart %} + digraph G { + label = "Chart for {{ request.user }}" + A -> {B C} + } + {% endofchart %} + +A few things to note about ``simple_block_tag``: + +* The first argument must be called ``content``, and it will contain the + contents of the template tag as a rendered string. +* Variables passed to the tag are not included in the rendering context of the + content, as would be when using the ``{% with %}`` tag. + +Just like :ref:`simple_tag`, +``simple_block_tag``: + +* Validates the quantity and quality of the arguments. +* Strips quotes from arguments if necessary. +* Escapes the output accordingly. +* Supports passing ``takes_context=True`` at registration time to access + context. Note that in this case, the first argument to the custom function + *must* be called ``context``, and ``content`` must follow. +* Supports renaming the tag by passing the ``name`` argument when registering. +* Supports accepting any number of positional or keyword arguments. +* Supports storing the result in a template variable using the ``as`` variant. + +.. admonition:: Content Escaping + + ``simple_block_tag`` behaves similarly to ``simple_tag`` regarding + auto-escaping. For details on escaping and safety, refer to ``simple_tag``. + Because the ``content`` argument has already been rendered by Django, it is + already escaped. + +A complete example +~~~~~~~~~~~~~~~~~~ + +Consider a custom template tag that generates a message box that supports +multiple message levels and content beyond a simple phrase. This could be +implemented using a ``simple_block_tag`` as follows: + +.. code-block:: python + :caption: ``testapp/templatetags/testapptags.py`` + + from django import template + from django.utils.html import format_html + + + register = template.Library() + + + @register.simple_block_tag(takes_context=True) + def msgbox(context, content, level): + format_kwargs = { + "level": level.lower(), + "level_title": level.capitalize(), + "content": content, + "open": " open" if level.lower() == "error" else "", + "site": context.get("site", "My Site"), + } + result = """ +
+ + + {level_title}: Please read for {site} + +

+ {content} +

+ +
+ """ + return format_html(result, **format_kwargs) + +When combined with a minimal view and corresponding template, as shown here: + +.. code-block:: python + :caption: ``testapp/views.py`` + + from django.shortcuts import render + + + def simpleblocktag_view(request): + return render(request, "test.html", context={"site": "Important Site"}) + + +.. code-block:: html+django + :caption: ``testapp/templates/test.html`` + + {% extends "base.html" %} + + {% load testapptags %} + + {% block content %} + + {% msgbox level="error" %} + Please fix all errors. Further documentation can be found at + Docs. + {% endmsgbox %} + + {% msgbox level="info" %} + More information at: Other Site/ + {% endmsgbox %} + + {% endblock %} + +The following HTML is produced as the rendered output: + +.. code-block:: html + +
+
+ + Error: Please read for Important Site + +

+ Please fix all errors. Further documentation can be found at + Docs. +

+
+
+ +
+
+ + Info: Please read for Important Site + +

+ More information at: Other Site +

+
+
+ .. _howto-custom-template-tags-inclusion-tags: Inclusion tags @@ -535,7 +729,7 @@ for the template fragment. Example:: def show_results(poll): choices = poll.choice_set.all() - return {'choices': choices} + return {"choices": choices} Next, create the template used to render the tag's output. This template is a fixed feature of the tag: the tag writer specifies it, not the template @@ -555,15 +749,15 @@ in a file called ``results.html`` in a directory that's searched by the template loader, we'd register the tag like this:: # Here, register is a django.template.Library instance, as before - @register.inclusion_tag('results.html') - def show_results(poll): - ... + @register.inclusion_tag("results.html") + def show_results(poll): ... Alternatively it is possible to register the inclusion tag using a :class:`django.template.Template` instance:: from django.template.loader import get_template - t = get_template('results.html') + + t = get_template("results.html") register.inclusion_tag(t)(show_results) ...when first creating the function. @@ -579,11 +773,11 @@ For example, say you're writing an inclusion tag that will always be used in a context that contains ``home_link`` and ``home_title`` variables that point back to the main page. Here's what the Python function would look like:: - @register.inclusion_tag('link.html', takes_context=True) + @register.inclusion_tag("link.html", takes_context=True) def jump_link(context): return { - 'link': context['home_link'], - 'title': context['home_title'], + "link": context["home_link"], + "title": context["home_title"], } Note that the first parameter to the function *must* be called ``context``. @@ -613,10 +807,10 @@ only difference between this case and the previous ``inclusion_tag`` example. ``inclusion_tag`` functions may accept any number of positional or keyword arguments. For example:: - @register.inclusion_tag('my_template.html') + @register.inclusion_tag("my_template.html") def my_tag(a, b, *args, **kwargs): - warning = kwargs['warning'] - profile = kwargs['profile'] + warning = kwargs["warning"] + profile = kwargs["profile"] ... return ... @@ -676,6 +870,7 @@ object:: from django import template + def do_current_time(parser, token): try: # split_contents() knows not to split quoted strings. @@ -735,6 +930,7 @@ Continuing the above example, we need to define ``CurrentTimeNode``:: import datetime from django import template + class CurrentTimeNode(template.Node): def __init__(self, format_string): self.format_string = format_string @@ -786,17 +982,18 @@ The ``__init__`` method for the ``Context`` class takes a parameter called from django.template import Context + def render(self, context): # ... - new_context = Context({'var': obj}, autoescape=context.autoescape) + new_context = Context({"var": obj}, autoescape=context.autoescape) # ... Do something with new_context ... This is not a very common situation, but it's useful if you're rendering a template yourself. For example:: def render(self, context): - t = context.template.engine.get_template('small_fragment.html') - return t.render(Context({'var': obj}, autoescape=context.autoescape)) + t = context.template.engine.get_template("small_fragment.html") + return t.render(Context({"var": obj}, autoescape=context.autoescape)) If we had neglected to pass in the current ``context.autoescape`` value to our new ``Context`` in this example, the results would have *always* been @@ -832,6 +1029,7 @@ A naive implementation of ``CycleNode`` might look something like this:: import itertools from django import template + class CycleNode(template.Node): def __init__(self, cyclevars): self.cycle_iter = itertools.cycle(cyclevars) @@ -895,7 +1093,7 @@ Finally, register the tag with your module's ``Library`` instance, as explained in :ref:`writing custom template tags` above. Example:: - register.tag('current_time', do_current_time) + register.tag("current_time", do_current_time) The ``tag()`` method takes two arguments: @@ -907,12 +1105,11 @@ The ``tag()`` method takes two arguments: As with filter registration, it is also possible to use this as a decorator:: @register.tag(name="current_time") - def do_current_time(parser, token): - ... + def do_current_time(parser, token): ... + @register.tag - def shout(parser, token): - ... + def shout(parser, token): ... If you leave off the ``name`` argument, as in the second example above, Django will use the function's name as the tag name. @@ -947,6 +1144,7 @@ Now your tag should begin to look like this:: from django import template + def do_format_time(parser, token): try: # split_contents() knows not to split quoted strings. @@ -978,7 +1176,7 @@ be resolved, and then call ``variable.resolve(context)``. So, for example:: actual_date = self.date_to_be_formatted.resolve(context) return actual_date.strftime(self.format_string) except template.VariableDoesNotExist: - return '' + return "" Variable resolution will throw a ``VariableDoesNotExist`` exception if it cannot resolve the string passed to it in the current context of the page. @@ -998,12 +1196,14 @@ outputting it:: import datetime from django import template + class CurrentTimeNode2(template.Node): def __init__(self, format_string): self.format_string = format_string + def render(self, context): - context['current_time'] = datetime.datetime.now().strftime(self.format_string) - return '' + context["current_time"] = datetime.datetime.now().strftime(self.format_string) + return "" Note that ``render()`` returns the empty string. ``render()`` should always return string output. If all the template tag does is set a variable, @@ -1039,13 +1239,16 @@ class, like so:: import re + class CurrentTimeNode3(template.Node): def __init__(self, format_string, var_name): self.format_string = format_string self.var_name = var_name + def render(self, context): context[self.var_name] = datetime.datetime.now().strftime(self.format_string) - return '' + return "" + def do_current_time(parser, token): # This version uses a regular expression to parse tag contents. @@ -1056,7 +1259,7 @@ class, like so:: raise template.TemplateSyntaxError( "%r tag requires arguments" % token.contents.split()[0] ) - m = re.search(r'(.*?) as (\w+)', arg) + m = re.search(r"(.*?) as (\w+)", arg) if not m: raise template.TemplateSyntaxError("%r tag had invalid arguments" % tag_name) format_string, var_name = m.groups() @@ -1085,13 +1288,14 @@ compilation function. Here's how a simplified ``{% comment %}`` tag might be implemented:: def do_comment(parser, token): - nodelist = parser.parse(('endcomment',)) + nodelist = parser.parse(("endcomment",)) parser.delete_first_token() return CommentNode() + class CommentNode(template.Node): def render(self, context): - return '' + return "" .. note:: The actual implementation of :ttag:`{% comment %}` is slightly @@ -1138,13 +1342,15 @@ As in the previous example, we'll use ``parser.parse()``. But this time, we pass the resulting ``nodelist`` to the ``Node``:: def do_upper(parser, token): - nodelist = parser.parse(('endupper',)) + nodelist = parser.parse(("endupper",)) parser.delete_first_token() return UpperNode(nodelist) + class UpperNode(template.Node): def __init__(self, nodelist): self.nodelist = nodelist + def render(self, context): output = self.nodelist.render(context) return output.upper() @@ -1153,5 +1359,5 @@ The only new concept here is the ``self.nodelist.render(context)`` in ``UpperNode.render()``. For more examples of complex rendering, see the source code of -:ttag:`{% for %}` in ``django/template/defaulttags.py`` and -:ttag:`{% if %}` in ``django/template/smartif.py``. +:ttag:`{% for %}` in :source:`django/template/defaulttags.py` and +:ttag:`{% if %}` in :source:`django/template/smartif.py`. diff --git a/docs/howto/delete-app.txt b/docs/howto/delete-app.txt new file mode 100644 index 000000000000..e1dac4f17939 --- /dev/null +++ b/docs/howto/delete-app.txt @@ -0,0 +1,29 @@ +================================== +How to delete a Django application +================================== + +Django provides the ability to group sets of features into Python packages +called :doc:`applications`. When requirements change, apps +may become obsolete or unnecessary. The following steps will help you delete an +application safely. + +#. Remove all references to the app (imports, foreign keys etc.). + +#. Remove all models from the corresponding ``models.py`` file. + +#. Create relevant migrations by running :djadmin:`makemigrations`. This step + generates a migration that deletes tables for the removed models, and any + other required migration for updating relationships connected to those + models. + +#. :ref:`Squash ` out references to the app in other apps' + migrations. + +#. Apply migrations locally, runs tests, and verify the correctness of your + project. + +#. Deploy/release your updated Django project. + +#. Remove the app from :setting:`INSTALLED_APPS`. + +#. Finally, remove the app's directory. diff --git a/docs/howto/deployment/asgi/daphne.txt b/docs/howto/deployment/asgi/daphne.txt index 94d1ac897b44..a8867955f8e1 100644 --- a/docs/howto/deployment/asgi/daphne.txt +++ b/docs/howto/deployment/asgi/daphne.txt @@ -2,17 +2,15 @@ How to use Django with Daphne ============================= -.. highlight:: bash - -Daphne_ is a pure-Python ASGI server for UNIX, maintained by members of the -Django project. It acts as the reference server for ASGI. - -.. _Daphne: https://pypi.org/project/daphne/ +:pypi:`Daphne ` is a pure-Python ASGI server for UNIX, maintained by +members of the Django project. It acts as the reference server for ASGI. Installing Daphne =================== -You can install Daphne with ``pip``:: +You can install Daphne with ``pip``: + +.. code-block:: shell python -m pip install daphne @@ -24,10 +22,31 @@ Daphne server process. At its simplest, Daphne needs to be called with the location of a module containing an ASGI application object, followed by what the application is called (separated by a colon). -For a typical Django project, invoking Daphne would look like:: +For a typical Django project, invoking Daphne would look like: + +.. code-block:: shell daphne myproject.asgi:application This will start one process listening on ``127.0.0.1:8000``. It requires that your project be on the Python path; to ensure that run this command from the same directory as your ``manage.py`` file. + +.. _daphne-runserver: + +Integration with ``runserver`` +============================== + +Daphne provides a :djadmin:`runserver` command to serve your site under ASGI +during development. + +This can be enabled by adding ``daphne`` to the start of your +:setting:`INSTALLED_APPS` and adding an ``ASGI_APPLICATION`` setting pointing +to your ASGI application object:: + + INSTALLED_APPS = [ + "daphne", + ..., + ] + + ASGI_APPLICATION = "myproject.asgi.application" diff --git a/docs/howto/deployment/asgi/hypercorn.txt b/docs/howto/deployment/asgi/hypercorn.txt new file mode 100644 index 000000000000..3abd2d54efcf --- /dev/null +++ b/docs/howto/deployment/asgi/hypercorn.txt @@ -0,0 +1,38 @@ +================================ +How to use Django with Hypercorn +================================ + +Hypercorn_ is an ASGI server that supports HTTP/1, HTTP/2, and HTTP/3 +with an emphasis on protocol support. + +Installing Hypercorn +==================== + +You can install Hypercorn with ``pip``: + +.. code-block:: shell + + python -m pip install hypercorn + +Running Django in Hypercorn +=========================== + +When :pypi:`Hypercorn` is installed, a ``hypercorn`` command is available +which runs ASGI applications. Hypercorn needs to be called with the +location of a module containing an ASGI application object, followed +by what the application is called (separated by a colon). + +For a typical Django project, invoking Hypercorn would look like: + +.. code-block:: shell + + hypercorn myproject.asgi:application + +This will start one process listening on ``127.0.0.1:8000``. It +requires that your project be on the Python path; to ensure that run +this command from the same directory as your ``manage.py`` file. + +For more advanced usage, please read the `Hypercorn documentation +`_. + +.. _Hypercorn: https://hypercorn.readthedocs.io/ diff --git a/docs/howto/deployment/asgi/index.txt b/docs/howto/deployment/asgi/index.txt index f09d79a67e4e..6015554350cf 100644 --- a/docs/howto/deployment/asgi/index.txt +++ b/docs/howto/deployment/asgi/index.txt @@ -17,6 +17,7 @@ Django includes getting-started documentation for the following ASGI servers: :maxdepth: 1 daphne + hypercorn uvicorn The ``application`` object @@ -68,4 +69,5 @@ To apply ASGI middleware, or to embed Django in another ASGI application, you can wrap Django's ``application`` object in the ``asgi.py`` file. For example:: from some_asgi_library import AmazingMiddleware + application = AmazingMiddleware(application) diff --git a/docs/howto/deployment/asgi/uvicorn.txt b/docs/howto/deployment/asgi/uvicorn.txt index c42341c778d7..cd7cacd72fd0 100644 --- a/docs/howto/deployment/asgi/uvicorn.txt +++ b/docs/howto/deployment/asgi/uvicorn.txt @@ -2,15 +2,15 @@ How to use Django with Uvicorn ============================== -.. highlight:: bash - Uvicorn_ is an ASGI server based on ``uvloop`` and ``httptools``, with an emphasis on speed. Installing Uvicorn ================== -You can install Uvicorn with ``pip``:: +You can install Uvicorn with ``pip``: + +.. code-block:: shell python -m pip install uvicorn @@ -22,14 +22,38 @@ applications. Uvicorn needs to be called with the location of a module containing an ASGI application object, followed by what the application is called (separated by a colon). -For a typical Django project, invoking Uvicorn would look like:: +For a typical Django project, invoking Uvicorn would look like: + +.. code-block:: shell - uvicorn myproject.asgi:application + python -m uvicorn myproject.asgi:application This will start one process listening on ``127.0.0.1:8000``. It requires that your project be on the Python path; to ensure that run this command from the same directory as your ``manage.py`` file. +In development mode, you can add ``--reload`` to cause the server to reload any +time a file is changed on disk. + For more advanced usage, please read the `Uvicorn documentation `_. +Deploying Django using Uvicorn and Gunicorn +=========================================== + +Gunicorn_ is a robust web server that implements process monitoring and automatic +restarts. This can be useful when running Uvicorn in a production environment. + +To install Uvicorn and Gunicorn, use the following: + +.. code-block:: shell + + python -m pip install uvicorn uvicorn-worker gunicorn + +Then start Gunicorn using the Uvicorn worker class like this: + +.. code-block:: shell + + python -m gunicorn myproject.asgi:application -k uvicorn_worker.UvicornWorker + .. _Uvicorn: https://www.uvicorn.org/ +.. _Gunicorn: https://gunicorn.org/ diff --git a/docs/howto/deployment/checklist.txt b/docs/howto/deployment/checklist.txt index 06bf08473af1..0f4bd158f8af 100644 --- a/docs/howto/deployment/checklist.txt +++ b/docs/howto/deployment/checklist.txt @@ -2,7 +2,7 @@ Deployment checklist ==================== -The Internet is a hostile environment. Before deploying your Django project, +The internet is a hostile environment. Before deploying your Django project, you should take some time to review your settings, with security, performance, and operations in mind. @@ -36,6 +36,14 @@ Some of the checks described below can be automated using the :option:`check --deploy` option. Be sure to run it against your production settings file as described in the option's documentation. +Switch away from ``manage.py runserver`` +======================================== + +The :djadmin:`runserver` command is not designed for a production setting. Be +sure to switch to a production-ready WSGI or ASGI server. For a few common +options, see :doc:`WSGI servers ` or +:doc:`ASGI servers `. + Critical settings ================= @@ -52,13 +60,26 @@ Instead of hardcoding the secret key in your settings module, consider loading it from an environment variable:: import os - SECRET_KEY = os.environ['SECRET_KEY'] + + SECRET_KEY = os.environ["SECRET_KEY"] or from a file:: - with open('/etc/secret_key.txt') as f: + with open("/etc/secret_key.txt") as f: SECRET_KEY = f.read().strip() +If rotating secret keys, you may use :setting:`SECRET_KEY_FALLBACKS`:: + + import os + + SECRET_KEY = os.environ["CURRENT_SECRET_KEY"] + SECRET_KEY_FALLBACKS = [ + os.environ["OLD_SECRET_KEY"], + ] + +Ensure that old secret keys are removed from ``SECRET_KEY_FALLBACKS`` in a +timely manner. + :setting:`DEBUG` ---------------- @@ -85,11 +106,11 @@ you use a wildcard, you must perform your own validation of the ``Host`` HTTP header, or otherwise ensure that you aren't vulnerable to this category of attacks. -You should also configure the Web server that sits in front of Django to +You should also configure the web server that sits in front of Django to validate the host. It should respond with a static error page or ignore requests for incorrect hosts instead of forwarding the request to Django. This way you'll avoid spurious errors in your Django logs (or emails if you have -error reporting configured that way). For example, on nginx you might setup a +error reporting configured that way). For example, on nginx you might set up a default server to return "444 No Response" on an unrecognized host: .. code-block:: nginx @@ -207,8 +228,10 @@ This helps a lot on virtualized hosts with limited network performance. -------------------- Enabling the cached template loader often improves performance drastically, as -it avoids compiling each template every time it needs to be rendered. See the -:ref:`template loaders docs ` for more information. +it avoids compiling each template every time it needs to be rendered. When +:setting:`DEBUG = False `, the cached template loader is enabled +automatically. See :class:`django.template.loaders.cached.Loader` for more +information. Error reporting =============== @@ -249,5 +272,5 @@ Django includes default views and templates for several HTTP error codes. You may want to override the default templates by creating the following templates in your root template directory: ``404.html``, ``500.html``, ``403.html``, and ``400.html``. The :ref:`default error views ` that use these -templates should suffice for 99% of Web applications, but you can +templates should suffice for 99% of web applications, but you can :ref:`customize them ` as well. diff --git a/docs/howto/deployment/index.txt b/docs/howto/deployment/index.txt index c1cb6d8cd22f..2f53a97bef99 100644 --- a/docs/howto/deployment/index.txt +++ b/docs/howto/deployment/index.txt @@ -1,8 +1,8 @@ -================ -Deploying Django -================ +==================== +How to deploy Django +==================== -Django is full of shortcuts to make Web developers' lives easier, but all +Django is full of shortcuts to make web developers' lives easier, but all those tools are of no use if you can't easily deploy your sites. Since Django's inception, ease of deployment has been a major goal. @@ -12,11 +12,12 @@ the scope of what Django can give you as guidance. Django, being a web framework, needs a web server in order to operate. And since most web servers don't natively speak Python, we need an interface to -make that communication happen. +make that communication happen. The :djadmin:`runserver` command starts a +lightweight development server, which is not suitable for production. Django currently supports two interfaces: WSGI and ASGI. -* `WSGI`_ is the main Python standard for communicating between Web servers and +* `WSGI`_ is the main Python standard for communicating between web servers and applications, but it only supports synchronous code. * `ASGI`_ is the new, asynchronous-friendly standard that will allow your diff --git a/docs/howto/deployment/wsgi/apache-auth.txt b/docs/howto/deployment/wsgi/apache-auth.txt index 912d11830e0e..0629b785c587 100644 --- a/docs/howto/deployment/wsgi/apache-auth.txt +++ b/docs/howto/deployment/wsgi/apache-auth.txt @@ -1,6 +1,6 @@ -========================================================= -Authenticating against Django's user database from Apache -========================================================= +============================================================== +How to authenticate against Django's user database from Apache +============================================================== Since keeping multiple authentication databases in sync is a common problem when dealing with Apache, you can configure Apache to authenticate against Django's @@ -37,7 +37,7 @@ Authentication with ``mod_wsgi`` information about this setting. Make sure that mod_wsgi is installed and activated and that you have -followed the steps to setup :doc:`Apache with mod_wsgi +followed the steps to set up :doc:`Apache with mod_wsgi `. Next, edit your Apache configuration to add a location that you want @@ -84,11 +84,12 @@ function:: import os - os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' + os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings" from django.contrib.auth.handlers.modwsgi import check_password from django.core.handlers.wsgi import WSGIHandler + application = WSGIHandler() diff --git a/docs/howto/deployment/wsgi/gunicorn.txt b/docs/howto/deployment/wsgi/gunicorn.txt index 609112048855..60d6620ea34d 100644 --- a/docs/howto/deployment/wsgi/gunicorn.txt +++ b/docs/howto/deployment/wsgi/gunicorn.txt @@ -2,8 +2,6 @@ How to use Django with Gunicorn =============================== -.. highlight:: bash - Gunicorn_ ('Green Unicorn') is a pure-Python WSGI server for UNIX. It has no dependencies and can be installed using ``pip``. @@ -23,7 +21,9 @@ Running Django in Gunicorn as a generic WSGI application When Gunicorn is installed, a ``gunicorn`` command is available which starts the Gunicorn server process. The simplest invocation of gunicorn is to pass the location of a module containing a WSGI application object named -``application``, which for a typical Django project would look like:: +``application``, which for a typical Django project would look like: + +.. code-block:: shell gunicorn myproject.wsgi diff --git a/docs/howto/deployment/wsgi/index.txt b/docs/howto/deployment/wsgi/index.txt index fae2d69980f2..502a25386628 100644 --- a/docs/howto/deployment/wsgi/index.txt +++ b/docs/howto/deployment/wsgi/index.txt @@ -76,6 +76,7 @@ object. For instance you could add these lines at the bottom of :file:`wsgi.py`:: from helloworld.wsgi import HelloWorldApplication + application = HelloWorldApplication(application) You could also replace the Django WSGI application with a custom WSGI diff --git a/docs/howto/deployment/wsgi/modwsgi.txt b/docs/howto/deployment/wsgi/modwsgi.txt index 97c261f10052..c81b3df48a9e 100644 --- a/docs/howto/deployment/wsgi/modwsgi.txt +++ b/docs/howto/deployment/wsgi/modwsgi.txt @@ -27,7 +27,7 @@ Basic configuration Once you've got mod_wsgi installed and activated, edit your Apache server's `httpd.conf`_ file and add the following. -.. _httpd.conf: https://wiki.apache.org/httpd/DistrosDefaultLayout +.. _httpd.conf: https://cwiki.apache.org/confluence/display/httpd/DistrosDefaultLayout .. code-block:: apache @@ -83,15 +83,25 @@ should put in this file, and what else you can add to it. .. admonition:: Fixing ``UnicodeEncodeError`` for file uploads - If you get a ``UnicodeEncodeError`` when uploading files with file names - that contain non-ASCII characters, make sure Apache is configured to accept - non-ASCII file names:: + If you get a ``UnicodeEncodeError`` when uploading or writing files with + file names or content that contains non-ASCII characters, make sure Apache + is configured to support UTF-8 encoding: + + .. code-block:: shell export LANG='en_US.UTF-8' export LC_ALL='en_US.UTF-8' A common location to put this configuration is ``/etc/apache2/envvars``. + Alternatively, if you are :ref:`using mod_wsgi daemon mode` + you can add ``lang`` and ``locale`` options to the ``WSGIDaemonProcess`` + directive: + + .. code-block:: text + + WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8' + See the :ref:`unicode-files` section of the Unicode reference guide for details. @@ -131,10 +141,10 @@ mode`_. Serving files ============= -Django doesn't serve files itself; it leaves that job to whichever Web +Django doesn't serve files itself; it leaves that job to whichever web server you choose. -We recommend using a separate Web server -- i.e., one that's not also running +We recommend using a separate web server -- i.e., one that's not also running Django -- for serving media. Here are some good choices: * Nginx_ @@ -189,15 +199,15 @@ When :mod:`django.contrib.staticfiles` is in :setting:`INSTALLED_APPS`, the Django development server automatically serves the static files of the admin app (and any other installed apps). This is however not the case when you use any other server arrangement. You're responsible for setting up Apache, or -whichever Web server you're using, to serve the admin files. +whichever web server you're using, to serve the admin files. -The admin files live in (:file:`django/contrib/admin/static/admin`) of the +The admin files live in (:source:`django/contrib/admin/static/admin`) of the Django distribution. We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the -admin files (along with a Web server as outlined in the previous section; this +admin files (along with a web server as outlined in the previous section; this means using the :djadmin:`collectstatic` management command to collect the -static files in :setting:`STATIC_ROOT`, and then configuring your Web server to +static files in :setting:`STATIC_ROOT`, and then configuring your web server to serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but here are three other approaches: diff --git a/docs/howto/deployment/wsgi/uwsgi.txt b/docs/howto/deployment/wsgi/uwsgi.txt index 6e66189b4ef7..2bb49b285c61 100644 --- a/docs/howto/deployment/wsgi/uwsgi.txt +++ b/docs/howto/deployment/wsgi/uwsgi.txt @@ -2,8 +2,6 @@ How to use Django with uWSGI ============================ -.. highlight:: bash - uWSGI_ is a fast, self-healing and developer/sysadmin-friendly application container server coded in pure C. @@ -37,7 +35,7 @@ command. For example: uWSGI model ----------- -uWSGI operates on a client-server model. Your Web server (e.g., nginx, Apache) +uWSGI operates on a client-server model. Your web server (e.g., nginx, Apache) communicates with a ``django-uwsgi`` "worker" process to serve dynamic content. Configuring and starting the uWSGI server for Django @@ -48,7 +46,9 @@ uWSGI supports multiple ways to configure the process. See uWSGI's .. _configuration documentation: https://uwsgi.readthedocs.io/en/latest/Configuration.html -Here's an example command to start a uWSGI server:: +Here's an example command to start a uWSGI server: + +.. code-block:: shell uwsgi --chdir=/path/to/your/project \ --module=mysite.wsgi:application \ @@ -80,7 +80,9 @@ The Django-specific options here are: * ``env``: Should probably contain at least :envvar:`DJANGO_SETTINGS_MODULE`. * ``home``: Optional path to your project virtual environment. -Example ini configuration file:: +Example ini configuration file: + +.. code-block:: ini [uwsgi] chdir=/path/to/your/project @@ -91,7 +93,9 @@ Example ini configuration file:: max-requests=5000 daemonize=/var/log/uwsgi/yourproject.log -Example ini configuration file usage:: +Example ini configuration file usage: + +.. code-block:: shell uwsgi --ini uwsgi.ini @@ -99,7 +103,9 @@ Example ini configuration file usage:: If you get a ``UnicodeEncodeError`` when uploading files with file names that contain non-ASCII characters, make sure uWSGI is configured to accept - non-ASCII file names by adding this to your ``uwsgi.ini``:: + non-ASCII file names by adding this to your ``uwsgi.ini``: + + .. code-block:: ini env = LANG=en_US.UTF-8 diff --git a/docs/howto/error-reporting.txt b/docs/howto/error-reporting.txt index c77f1e955e6d..17ba14c35c17 100644 --- a/docs/howto/error-reporting.txt +++ b/docs/howto/error-reporting.txt @@ -1,6 +1,6 @@ -=============== -Error reporting -=============== +============================= +How to manage error reporting +============================= When you're running a public site you should always turn off the :setting:`DEBUG` setting. That will make your server run much faster, and will @@ -64,9 +64,9 @@ not found" errors). Django sends emails about 404 errors when: If those conditions are met, Django will email the users listed in the :setting:`MANAGERS` setting whenever your code raises a 404 and the request has a referer. It doesn't bother to email for 404s that don't have a referer -- -those are usually people typing in broken URLs or broken Web bots. It also +those are usually people typing in broken URLs or broken web bots. It also ignores 404s when the referer is equal to the requested URL, since this -behavior is from broken Web bots too. +behavior is from broken web bots too. .. note:: @@ -74,16 +74,17 @@ behavior is from broken Web bots too. before other middleware that intercepts 404 errors, such as :class:`~django.middleware.locale.LocaleMiddleware` or :class:`~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware`. - Put it towards the top of your :setting:`MIDDLEWARE` setting. + Put it toward the top of your :setting:`MIDDLEWARE` setting. You can tell Django to stop reporting particular 404s by tweaking the :setting:`IGNORABLE_404_URLS` setting. It should be a list of compiled regular expression objects. For example:: import re + IGNORABLE_404_URLS = [ - re.compile(r'\.(php|cgi)$'), - re.compile(r'^/phpmyadmin/'), + re.compile(r"\.(php|cgi)$"), + re.compile(r"^/phpmyadmin/"), ] In this example, a 404 to any URL ending with ``.php`` or ``.cgi`` will *not* be @@ -93,10 +94,11 @@ The following example shows how to exclude some conventional URLs that browsers crawlers often request:: import re + IGNORABLE_404_URLS = [ - re.compile(r'^/apple-touch-icon.*\.png$'), - re.compile(r'^/favicon\.ico$'), - re.compile(r'^/robots\.txt$'), + re.compile(r"^/apple-touch-icon.*\.png$"), + re.compile(r"^/favicon\.ico$"), + re.compile(r"^/robots\.txt$"), ] (Note that these are regular expressions, so we put a backslash in front of @@ -123,7 +125,7 @@ Filtering error reports Filtering sensitive data is a hard problem, and it's nearly impossible to guarantee that sensitive data won't leak into an error report. Therefore, error reports should only be available to trusted team members and you - should avoid transmitting error reports unencrypted over the Internet + should avoid transmitting error reports unencrypted over the internet (such as through email). Filtering sensitive information @@ -158,7 +160,8 @@ filtered out of error reports in a production environment (that is, where from django.views.decorators.debug import sensitive_variables - @sensitive_variables('user', 'pw', 'cc') + + @sensitive_variables("user", "pw", "cc") def process_info(user): pw = user.pass_word cc = user.credit_card_number @@ -174,8 +177,7 @@ filtered out of error reports in a production environment (that is, where do not provide any argument to the ``sensitive_variables`` decorator:: @sensitive_variables() - def my_function(): - ... + def my_function(): ... .. admonition:: When using multiple decorators @@ -185,11 +187,10 @@ filtered out of error reports in a production environment (that is, where at the top of the decorator chain. This way it will also hide the function argument as it gets passed through the other decorators:: - @sensitive_variables('user', 'pw', 'cc') + @sensitive_variables("user", "pw", "cc") @some_decorator @another_decorator - def process_info(user): - ... + def process_info(user): ... .. function:: sensitive_post_parameters(*parameters) @@ -201,13 +202,14 @@ filtered out of error reports in a production environment (that is, where from django.views.decorators.debug import sensitive_post_parameters - @sensitive_post_parameters('pass_word', 'credit_card_number') + + @sensitive_post_parameters("pass_word", "credit_card_number") def record_user_profile(request): UserProfile.create( user=request.user, - password=request.POST['pass_word'], - credit_card=request.POST['credit_card_number'], - name=request.POST['name'], + password=request.POST["pass_word"], + credit_card=request.POST["credit_card_number"], + name=request.POST["name"], ) ... @@ -221,8 +223,7 @@ filtered out of error reports in a production environment (that is, where do not provide any argument to the ``sensitive_post_parameters`` decorator:: @sensitive_post_parameters() - def my_view(request): - ... + def my_view(request): ... All POST parameters are systematically filtered out of error reports for certain :mod:`django.contrib.auth.views` views (``login``, @@ -248,7 +249,7 @@ override or customize this default behavior for your entire site, you need to define your own filter class and tell Django to use it via the :setting:`DEFAULT_EXCEPTION_REPORTER_FILTER` setting:: - DEFAULT_EXCEPTION_REPORTER_FILTER = 'path.to.your.CustomExceptionReporterFilter' + DEFAULT_EXCEPTION_REPORTER_FILTER = "path.to.your.CustomExceptionReporterFilter" You may also control in a more granular way which filter to use within any given view by setting the ``HttpRequest``’s ``exception_reporter_filter`` @@ -269,23 +270,23 @@ following attributes and methods: .. attribute:: cleansed_substitute - .. versionadded:: 3.1 - The string value to replace sensitive value with. By default it replaces the values of sensitive variables with stars (``**********``). .. attribute:: hidden_settings - .. versionadded:: 3.1 - A compiled regular expression object used to match settings and ``request.META`` values considered as sensitive. By default equivalent to:: import re - re.compile(r'API|TOKEN|KEY|SECRET|PASS|SIGNATURE', flags=re.IGNORECASE) + re.compile(r"API|AUTH|TOKEN|KEY|SECRET|PASS|SIGNATURE|HTTP_COOKIE", flags=re.IGNORECASE) + + .. versionchanged:: 5.2 + + The term ``AUTH`` was added. .. method:: is_active(request) @@ -307,13 +308,11 @@ following attributes and methods: traceback frame. Sensitive values are replaced with :attr:`cleansed_substitute`. -.. versionadded:: 3.1 - If you need to customize error reports beyond filtering you may specify a custom error reporter class by defining the :setting:`DEFAULT_EXCEPTION_REPORTER` setting:: - DEFAULT_EXCEPTION_REPORTER = 'path.to.your.CustomExceptionReporter' + DEFAULT_EXCEPTION_REPORTER = "path.to.your.CustomExceptionReporter" The exception reporter is responsible for compiling the exception report data, and formatting it as text or HTML appropriately. (The exception reporter uses @@ -325,6 +324,19 @@ Your custom reporter class needs to inherit from .. class:: ExceptionReporter + .. attribute:: html_template_path + + Property that returns a :class:`pathlib.Path` representing the absolute + filesystem path to a template for rendering the HTML representation of + the exception. Defaults to the Django provided template. + + .. attribute:: text_template_path + + Property that returns a :class:`pathlib.Path` representing the absolute + filesystem path to a template for rendering the plain-text + representation of the exception. Defaults to the Django provided + template. + .. method:: get_traceback_data() Return a dictionary containing traceback information. diff --git a/docs/howto/index.txt b/docs/howto/index.txt index ffe4c5519e71..d49a9b1206f2 100644 --- a/docs/howto/index.txt +++ b/docs/howto/index.txt @@ -1,34 +1,66 @@ -=============== -"How-to" guides -=============== +============= +How-to guides +============= -Here you'll find short answers to "How do I....?" types of questions. These -how-to guides don't cover topics in depth -- you'll find that material in the -:doc:`/topics/index` and the :doc:`/ref/index`. However, these guides will help -you quickly accomplish common tasks. +Practical guides covering common tasks and problems. + +Models, data and databases +========================== .. toctree:: :maxdepth: 1 - auth-remote-user - custom-management-commands - custom-model-fields - custom-lookups - custom-template-backend - custom-template-tags - custom-file-storage - deployment/index - upgrade-version - error-reporting initial-data legacy-databases + custom-model-fields + writing-migrations + custom-lookups + +Templates and output +==================== + +.. toctree:: + :maxdepth: 1 + outputting-csv outputting-pdf overriding-templates + custom-template-backend + custom-template-tags + +Project configuration and management +==================================== + +.. toctree:: + :maxdepth: 1 + static-files/index - static-files/deployment + logging + error-reporting + delete-app + +Installing, deploying and upgrading +=================================== + +.. toctree:: + :maxdepth: 1 + + upgrade-version windows - writing-migrations + deployment/index + static-files/deployment + +Other guides +============ + +.. toctree:: + :maxdepth: 1 + + auth-remote-user + csrf + custom-file-storage + custom-management-commands + custom-shell .. seealso:: diff --git a/docs/howto/initial-data.txt b/docs/howto/initial-data.txt index b999f037fe0e..a8c5a577263e 100644 --- a/docs/howto/initial-data.txt +++ b/docs/howto/initial-data.txt @@ -1,26 +1,27 @@ -================================= -Providing initial data for models -================================= +====================================== +How to provide initial data for models +====================================== -It's sometimes useful to pre-populate your database with hard-coded data when +It's sometimes useful to prepopulate your database with hard-coded data when you're first setting up an app. You can provide initial data with migrations or fixtures. -Providing initial data with migrations -====================================== +Provide initial data with migrations +==================================== -If you want to automatically load initial data for an app, create a +To automatically load initial data for an app, create a :ref:`data migration `. Migrations are run when setting up the test database, so the data will be available there, subject to :ref:`some limitations `. .. _initial-data-via-fixtures: -Providing data with fixtures -============================ +Provide data with fixtures +========================== -You can also provide data using fixtures, however, this data isn't loaded -automatically, except if you use :attr:`.TransactionTestCase.fixtures`. +You can also provide data using :ref:`fixtures `, +however, this data isn't loaded automatically, except if you use +:attr:`.TransactionTestCase.fixtures`. A fixture is a collection of data that Django knows how to import into a database. The most straightforward way of creating a fixture if you've already @@ -76,20 +77,33 @@ You'll store this data in a ``fixtures`` directory inside your app. You can load data by calling :djadmin:`manage.py loaddata ` ````, where ```` is the name of the fixture file you've created. Each time you run :djadmin:`loaddata`, the data will be read -from the fixture and re-loaded into the database. Note this means that if you +from the fixture and reloaded into the database. Note this means that if you change one of the rows created by a fixture and then run :djadmin:`loaddata` again, you'll wipe out any changes you've made. -Where Django finds fixture files --------------------------------- +Tell Django where to look for fixture files +------------------------------------------- + +By default, Django looks for fixtures in the ``fixtures`` directory inside each +app, so the command ``loaddata sample`` will find the file +``my_app/fixtures/sample.json``. This works with relative paths as well, so +``loaddata my_app/sample`` will find the file +``my_app/fixtures/my_app/sample.json``. + +Django also looks for fixtures in the list of directories provided in the +:setting:`FIXTURE_DIRS` setting. + +To completely prevent default search from happening, use an absolute path to +specify the location of your fixture file, e.g. ``loaddata /path/to/sample``. -By default, Django looks in the ``fixtures`` directory inside each app for -fixtures. You can set the :setting:`FIXTURE_DIRS` setting to a list of -additional directories where Django should look. +.. admonition:: Namespace your fixture files -When running :djadmin:`manage.py loaddata `, you can also -specify a path to a fixture file, which overrides searching the usual -directories. + Django will use the first fixture file it finds whose name matches, so if + you have fixture files with the same name in different applications, you + will be unable to distinguish between them in your ``loaddata`` commands. + The easiest way to avoid this problem is by *namespacing* your fixture + files. That is, by putting them inside a directory named for their + application, as in the relative path example above. .. seealso:: diff --git a/docs/howto/legacy-databases.txt b/docs/howto/legacy-databases.txt index 957b33fc6585..5730a8a0593f 100644 --- a/docs/howto/legacy-databases.txt +++ b/docs/howto/legacy-databases.txt @@ -1,6 +1,6 @@ -========================================= -Integrating Django with a legacy database -========================================= +============================================== +How to integrate Django with a legacy database +============================================== While Django is best suited for developing new applications, it's quite possible to integrate it into legacy databases. Django includes a couple of @@ -30,15 +30,17 @@ connection: Auto-generate the models ======================== -.. highlight:: bash - Django comes with a utility called :djadmin:`inspectdb` that can create models by introspecting an existing database. You can view the output by running this -command:: +command: + +.. code-block:: shell $ python manage.py inspectdb -Save this as a file by using standard Unix output redirection:: +Save this as a file by using standard Unix output redirection: + +.. code-block:: shell $ python manage.py inspectdb > models.py @@ -56,9 +58,10 @@ each table's creation, modification, and deletion:: class Person(models.Model): id = models.IntegerField(primary_key=True) first_name = models.CharField(max_length=70) + class Meta: - managed = False - db_table = 'CENSUS_PERSONS' + managed = False + db_table = "CENSUS_PERSONS" If you do want to allow Django to manage the table's lifecycle, you'll need to change the :attr:`~django.db.models.Options.managed` option above to ``True`` @@ -68,7 +71,9 @@ Install the core Django tables ============================== Next, run the :djadmin:`migrate` command to install any extra needed database -records such as admin permissions and content types:: +records such as admin permissions and content types: + +.. code-block:: shell $ python manage.py migrate diff --git a/docs/howto/logging.txt b/docs/howto/logging.txt new file mode 100644 index 000000000000..149b8bb83be3 --- /dev/null +++ b/docs/howto/logging.txt @@ -0,0 +1,339 @@ +.. _logging-how-to: + +================================ +How to configure and use logging +================================ + +.. seealso:: + + * :ref:`Django logging reference ` + * :ref:`Django logging overview ` + +Django provides a working :ref:`default logging configuration +` that is readily extended. + +Make a basic logging call +========================= + +To send a log message from within your code, you place a logging call into it. + +.. admonition:: Don't be tempted to use logging calls in ``settings.py``. + + The way that Django logging is configured as part of the ``setup()`` + function means that logging calls placed in ``settings.py`` may not work as + expected, because *logging will not be set up at that point*. To explore + logging, use a view function as suggested in the example below. + +First, import the Python logging library, and then obtain a logger instance +with :py:func:`logging.getLogger`. Provide the ``getLogger()`` method with a +name to identify it and the records it emits. A good option is to use +``__name__`` (see :ref:`naming-loggers` below for more on this) which will +provide the name of the current Python module as a dotted path:: + + import logging + + logger = logging.getLogger(__name__) + +It's a good convention to perform this declaration at module level. + +And then in a function, for example in a view, send a record to the logger:: + + def some_view(request): + ... + if some_risky_state: + logger.warning("Platform is running at risk") + +When this code is executed, a :py:class:`~logging.LogRecord` containing that +message will be sent to the logger. If you're using Django's default logging +configuration, the message will appear in the console. + +The ``WARNING`` level used in the example above is one of several +:ref:`logging severity levels `: ``DEBUG``, +``INFO``, ``WARNING``, ``ERROR``, ``CRITICAL``. So, another example might be:: + + logger.critical("Payment system is not responding") + +.. important:: + + Records with a level lower than ``WARNING`` will not appear in the console + by default. Changing this behavior requires additional configuration. + +Customize logging configuration +=============================== + +Although Django's logging configuration works out of the box, you can control +exactly how your logs are sent to various destinations - to log files, external +services, email and so on - with some additional configuration. + +You can configure: + +* logger mappings, to determine which records are sent to which handlers +* handlers, to determine what they do with the records they receive +* filters, to provide additional control over the transfer of records, and + even modify records in-place +* formatters, to convert :class:`~logging.LogRecord` objects to a string or + other form for consumption by human beings or another system + +There are various ways of configuring logging. In Django, the +:setting:`LOGGING` setting is most commonly used. The setting uses the +:ref:`dictConfig format `, and extends the +:ref:`default logging configuration `. + +See :ref:`configuring-logging` for an explanation of how your custom settings +are merged with Django's defaults. + +See the :mod:`Python logging documentation ` for +details of other ways of configuring logging. For the sake of simplicity, this +documentation will only consider configuration via the ``LOGGING`` setting. + +.. _basic-logger-configuration: + +Basic logging configuration +--------------------------- + +When configuring logging, it makes sense to + +Create a ``LOGGING`` dictionary +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In your ``settings.py``:: + + LOGGING = { + "version": 1, # the dictConfig format version + "disable_existing_loggers": False, # retain the default loggers + } + +It nearly always makes sense to retain and extend the default logging +configuration by setting ``disable_existing_loggers`` to ``False``. + +Configure a handler +~~~~~~~~~~~~~~~~~~~ + +This example configures a single handler named ``file``, that uses Python's +:class:`~logging.FileHandler` to save logs of level ``DEBUG`` and higher to the +file ``general.log`` (at the project root): + +.. code-block:: python + :emphasize-lines: 3-8 + + LOGGING = { + # ... + "handlers": { + "file": { + "class": "logging.FileHandler", + "filename": "general.log", + }, + }, + } + +Different handler classes take different configuration options. For more +information on available handler classes, see the +:class:`~django.utils.log.AdminEmailHandler` provided by Django and the various +:py:mod:`handler classes ` provided by Python. + +Logging levels can also be set on the handlers (by default, they accept log +messages of all levels). Using the example above, adding: + +.. code-block:: python + :emphasize-lines: 4 + + { + "class": "logging.FileHandler", + "filename": "general.log", + "level": "DEBUG", + } + +would define a handler configuration that only accepts records of level +``DEBUG`` and higher. + +Configure a logger mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To send records to this handler, configure a logger mapping to use it for +example: + +.. code-block:: python + :emphasize-lines: 3-8 + + LOGGING = { + # ... + "loggers": { + "": { + "level": "DEBUG", + "handlers": ["file"], + }, + }, + } + +The mapping's name determines which log records it will process. This +configuration (``''``) is *unnamed*. That means that it will process records +from *all* loggers (see :ref:`naming-loggers` below on how to use the mapping +name to determine the loggers for which it will process records). + +It will forward messages of levels ``DEBUG`` and higher to the handler named +``file``. + +Note that a logger can forward messages to multiple handlers, so the relation +between loggers and handlers is many-to-many. + +If you execute:: + + logger.debug("Attempting to connect to API") + +in your code, you will find that message in the file ``general.log`` in the +root of the project. + +Configure a formatter +~~~~~~~~~~~~~~~~~~~~~ + +By default, the final log output contains the message part of each :class:`log +record `. Use a formatter if you want to include additional +data. First name and define your formatters - this example defines +formatters named ``verbose`` and ``simple``: + +.. code-block:: python + :emphasize-lines: 3-12 + + LOGGING = { + # ... + "formatters": { + "verbose": { + "format": "{name} {levelname} {asctime} {module} {process:d} {thread:d} {message}", + "style": "{", + }, + "simple": { + "format": "{levelname} {message}", + "style": "{", + }, + }, + } + +The ``style`` keyword allows you to specify ``{`` for :meth:`str.format` or +``$`` for :class:`string.Template` formatting; the default is ``$``. + +See :ref:`logrecord-attributes` for the :class:`~logging.LogRecord` attributes +you can include. + +To apply a formatter to a handler, add a ``formatter`` entry to the handler's +dictionary referring to the formatter by name, for example: + +.. code-block:: python + :emphasize-lines: 5 + + "handlers": { + "file": { + "class": "logging.FileHandler", + "filename": "general.log", + "formatter": "verbose", + }, + } + +.. _naming-loggers: + +Use logger namespacing +~~~~~~~~~~~~~~~~~~~~~~ + +The unnamed logging configuration ``''`` captures logs from any Python +application. A named logging configuration will capture logs only from loggers +with matching names. + +The namespace of a logger instance is defined using +:py:func:`~logging.getLogger`. For example in ``views.py`` of ``my_app``:: + + logger = logging.getLogger(__name__) + +will create a logger in the ``my_app.views`` namespace. ``__name__`` allows you +to organize log messages according to their provenance within your project's +applications automatically. It also ensures that you will not experience name +collisions. + +A logger mapping named ``my_app.views`` will capture records from this logger: + +.. code-block:: python + :emphasize-lines: 4 + + LOGGING = { + # ... + "loggers": { + "my_app.views": {...}, + }, + } + +A logger mapping named ``my_app`` will be more permissive, capturing records +from loggers anywhere within the ``my_app`` namespace (including +``my_app.views``, ``my_app.utils``, and so on): + +.. code-block:: python + :emphasize-lines: 4 + + LOGGING = { + # ... + "loggers": { + "my_app": {...}, + }, + } + +You can also define logger namespacing explicitly:: + + logger = logging.getLogger("project.payment") + +and set up logger mappings accordingly. + +.. _naming-loggers-hierarchy: + +Using logger hierarchies and propagation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Logger naming is *hierarchical*. ``my_app`` is the parent of ``my_app.views``, +which is the parent of ``my_app.views.private``. Unless specified otherwise, +logger mappings will propagate the records they process to their parents - a +record from a logger in the ``my_app.views.private`` namespace will be handled +by a mapping for both ``my_app`` and ``my_app.views``. + +To manage this behavior, set the propagation key on the mappings you define:: + + LOGGING = { + # ... + "loggers": { + "my_app": { + # ... + }, + "my_app.views": { + # ... + }, + "my_app.views.private": { + # ... + "propagate": False, + }, + }, + } + +``propagate`` defaults to ``True``. In this example, the logs from +``my_app.views.private`` will not be handled by the parent, but logs from +``my_app.views`` will. + +Configure responsive logging +---------------------------- + +Logging is most useful when it contains as much information as possible, but +not information that you don't need - and how much you need depends upon what +you're doing. When you're debugging, you need a level of information that would +be excessive and unhelpful if you had to deal with it in production. + +You can configure logging to provide you with the level of detail you need, +when you need it. Rather than manually change configuration to achieve this, a +better way is to apply configuration automatically according to the +environment. + +For example, you could set an environment variable ``DJANGO_LOG_LEVEL`` +appropriately in your development and staging environments, and make use of it +in a logger mapping thus:: + + "level": os.getenv("DJANGO_LOG_LEVEL", "WARNING") + +\- so that unless the environment specifies a lower log level, this +configuration will only forward records of severity ``WARNING`` and above to +its handler. + +Other options in the configuration (such as the ``level`` or ``formatter`` +option of handlers) can be similarly managed. diff --git a/docs/howto/outputting-csv.txt b/docs/howto/outputting-csv.txt index 2886a1b2948a..8e4bd8108c7d 100644 --- a/docs/howto/outputting-csv.txt +++ b/docs/howto/outputting-csv.txt @@ -1,6 +1,6 @@ -========================== -Outputting CSV with Django -========================== +======================== +How to create CSV output +======================== This document explains how to output CSV (Comma Separated Values) dynamically using Django views. To do this, you can either use the Python CSV library or the @@ -18,14 +18,17 @@ Here's an example:: import csv from django.http import HttpResponse + def some_view(request): # Create the HttpResponse object with the appropriate CSV header. - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' + response = HttpResponse( + content_type="text/csv", + headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, + ) writer = csv.writer(response) - writer.writerow(['First row', 'Foo', 'Bar', 'Baz']) - writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"]) + writer.writerow(["First row", "Foo", "Bar", "Baz"]) + writer.writerow(["Second row", "A", "B", "C", '"Testing"', "Here's a quote"]) return response @@ -70,14 +73,17 @@ the assembly and transmission of a large CSV file:: from django.http import StreamingHttpResponse + class Echo: """An object that implements just the write method of the file-like interface. """ + def write(self, value): """Write the value by returning it, instead of storing in a buffer.""" return value + def some_streaming_csv_view(request): """A view that streams a large CSV file.""" # Generate a sequence of rows. The range is based on the maximum number of @@ -86,10 +92,11 @@ the assembly and transmission of a large CSV file:: rows = (["Row {}".format(idx), str(idx)] for idx in range(65536)) pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) - response = StreamingHttpResponse((writer.writerow(row) for row in rows), - content_type="text/csv") - response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' - return response + return StreamingHttpResponse( + (writer.writerow(row) for row in rows), + content_type="text/csv", + headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, + ) Using the template system ========================= @@ -106,20 +113,23 @@ Here's an example, which generates the same CSV file as above:: from django.http import HttpResponse from django.template import loader + def some_view(request): # Create the HttpResponse object with the appropriate CSV header. - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename="somefilename.csv"' + response = HttpResponse( + content_type="text/csv", + headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'}, + ) # The data is hard-coded here, but you could load it from a database or # some other source. csv_data = ( - ('First row', 'Foo', 'Bar', 'Baz'), - ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"), + ("First row", "Foo", "Bar", "Baz"), + ("Second row", "A", "B", "C", '"Testing"', "Here's a quote"), ) - t = loader.get_template('my_template_name.txt') - c = {'data': csv_data} + t = loader.get_template("my_template_name.txt") + c = {"data": csv_data} response.write(t.render(c)) return response diff --git a/docs/howto/outputting-pdf.txt b/docs/howto/outputting-pdf.txt index 37b71b67618e..bb23affff46a 100644 --- a/docs/howto/outputting-pdf.txt +++ b/docs/howto/outputting-pdf.txt @@ -1,6 +1,6 @@ -=========================== -Outputting PDFs with Django -=========================== +======================= +How to create PDF files +======================= This document explains how to output PDF files dynamically using Django views. This is made possible by the excellent, open-source ReportLab_ Python PDF @@ -14,27 +14,28 @@ For example, Django was used at kusports.com_ to generate customized, printer-friendly NCAA tournament brackets, as PDF files, for people participating in a March Madness contest. -.. _ReportLab: https://www.reportlab.com/opensource/ -.. _kusports.com: http://www.kusports.com/ +.. _ReportLab: https://docs.reportlab.com/ +.. _kusports.com: https://www2.kusports.com/ Install ReportLab ================= -The ReportLab library is `available on PyPI`_. A `user guide`_ (not -coincidentally, a PDF file) is also available for download. +The ReportLab library is :pypi:`available on PyPI `. A `user guide`_ +(not coincidentally, a PDF file) is also available for download. You can install ReportLab with ``pip``: .. console:: $ python -m pip install reportlab -Test your installation by importing it in the Python interactive interpreter:: +Test your installation by importing it in the Python interactive interpreter: + +.. code-block:: pycon >>> import reportlab If that command doesn't raise any errors, the installation worked. -.. _available on PyPI: https://pypi.org/project/reportlab/ .. _user guide: https://www.reportlab.com/docs/reportlab-userguide.pdf Write your view @@ -50,6 +51,7 @@ Here's a "Hello World" example:: from django.http import FileResponse from reportlab.pdfgen import canvas + def some_view(request): # Create a file-like buffer to receive PDF data. buffer = io.BytesIO() @@ -68,7 +70,7 @@ Here's a "Hello World" example:: # FileResponse sets the Content-Disposition header so that browsers # present the option to save the file. buffer.seek(0) - return FileResponse(buffer, as_attachment=True, filename='hello.pdf') + return FileResponse(buffer, as_attachment=True, filename="hello.pdf") The code and comments should be self-explanatory, but a few things deserve a mention: @@ -79,7 +81,7 @@ mention: :mimetype:`application/octet-stream` binary content. * When ``as_attachment=True`` is passed to ``FileResponse``, it sets the - appropriate ``Content-Disposition`` header and that tells Web browsers to + appropriate ``Content-Disposition`` header and that tells web browsers to pop-up a dialog box prompting/confirming how to handle the document even if a default is set on the machine. If the ``as_attachment`` parameter is omitted, browsers will handle the PDF using whatever program/plugin they've been diff --git a/docs/howto/overriding-templates.txt b/docs/howto/overriding-templates.txt index 7faf972a3b00..f99a1203a8d6 100644 --- a/docs/howto/overriding-templates.txt +++ b/docs/howto/overriding-templates.txt @@ -1,6 +1,6 @@ -==================== -Overriding templates -==================== +========================= +How to override templates +========================= In your project, you might want to override a template in another Django application, whether it be a third-party application or a contrib application @@ -29,20 +29,20 @@ called ``blog``, which provides the templates ``blog/post.html`` and from pathlib import Path - BASE_DIR = Path(__file__).resolve(strict=True).parent.parent + BASE_DIR = Path(__file__).resolve().parent.parent INSTALLED_APPS = [ ..., - 'blog', + "blog", ..., ] TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [BASE_DIR / 'templates'], - 'APP_DIRS': True, - ... + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [BASE_DIR / "templates"], + "APP_DIRS": True, + # ... }, ] @@ -77,9 +77,9 @@ First, make sure your template settings are checking inside app directories:: TEMPLATES = [ { - ..., - 'APP_DIRS': True, - ... + # ... + "APP_DIRS": True, + # ... }, ] @@ -97,3 +97,43 @@ then your directory structure will look like: With :setting:`APP_DIRS` set to ``True``, the template loader will look in the app's templates directory and find the templates. + +.. _extending_an_overridden_template: + +Extending an overridden template +================================ + +With your template loaders configured, you can extend a template using the +:ttag:`{% extends %}` template tag whilst at the same time overriding +it. This can allow you to make small customizations without needing to +reimplement the entire template. + +For example, you can use this technique to add a custom logo to the +``admin/base_site.html`` template: + +.. code-block:: html+django + :caption: ``templates/admin/base_site.html`` + + {% extends "admin/base_site.html" %} + + {% block branding %} + logo + {{ block.super }} + {% endblock %} + +Key points to note: + +* The example creates a file at ``templates/admin/base_site.html`` that uses + the configured project-level ``templates`` directory to override + ``admin/base_site.html``. +* The new template extends ``admin/base_site.html``, which is the same template + as is being overridden. +* The template replaces just the ``branding`` block, adding a custom logo, and + using ``block.super`` to retain the prior content. +* The rest of the template is inherited unchanged from + ``admin/base_site.html``. + +This technique works because the template loader does not consider the already +loaded override template (at ``templates/admin/base_site.html``) when +resolving the ``extends`` tag. Combined with ``block.super`` it is a powerful +technique to make small customizations. diff --git a/docs/howto/static-files/deployment.txt b/docs/howto/static-files/deployment.txt index c1421d8244d2..19b7c9df826a 100644 --- a/docs/howto/static-files/deployment.txt +++ b/docs/howto/static-files/deployment.txt @@ -1,6 +1,6 @@ -====================== -Deploying static files -====================== +========================== +How to deploy static files +========================== .. seealso:: @@ -15,8 +15,8 @@ Serving static files in production The basic outline of putting static files into production consists of two steps: run the :djadmin:`collectstatic` command when static files change, then arrange for the collected static files directory (:setting:`STATIC_ROOT`) to be -moved to the static file server and served. Depending on -:setting:`STATICFILES_STORAGE`, files may need to be moved to a new location +moved to the static file server and served. Depending on the ``staticfiles`` +:setting:`STORAGES` alias, files may need to be moved to a new location manually or the :func:`post_process ` method of the ``Storage`` class might take care of that. @@ -44,7 +44,7 @@ multiple web servers. Serving static files from a dedicated server -------------------------------------------- -Most larger Django sites use a separate Web server -- i.e., one that's not also +Most larger Django sites use a separate web server -- i.e., one that's not also running Django -- for serving static files. This server often runs a different type of web server -- faster but less full-featured. Some common choices are: @@ -75,7 +75,7 @@ Serving static files from a cloud service or CDN Another common tactic is to serve static files from a cloud storage provider like Amazon's S3 and/or a CDN (content delivery network). This lets you ignore the problems of serving static files and can often make for -faster-loading Web pages (especially when using a CDN). +faster-loading web pages (especially when using a CDN). When using these services, the basic workflow would look a bit like the above, except that instead of using ``rsync`` to transfer your static files to the @@ -85,17 +85,20 @@ There's any number of ways you might do this, but if the provider has an API, you can use a :doc:`custom file storage backend ` to integrate the CDN with your Django project. If you've written or are using a 3rd party custom storage backend, you can tell :djadmin:`collectstatic` to use -it by setting :setting:`STATICFILES_STORAGE` to the storage engine. +it by setting ``staticfiles`` in :setting:`STORAGES`. For example, if you've written an S3 storage backend in ``myproject.storage.S3Storage`` you could use it with:: - STATICFILES_STORAGE = 'myproject.storage.S3Storage' + STORAGES = { + # ... + "staticfiles": {"BACKEND": "myproject.storage.S3Storage"} + } Once that's done, all you have to do is run :djadmin:`collectstatic` and your static files would be pushed through your storage package up to S3. If you later needed to switch to a different storage provider, you may only have to -change your :setting:`STATICFILES_STORAGE` setting. +change ``staticfiles`` in the :setting:`STORAGES` setting. For details on how you'd write one of these backends, see :doc:`/howto/custom-file-storage`. There are 3rd party apps available that diff --git a/docs/howto/static-files/index.txt b/docs/howto/static-files/index.txt index 9bdfc2fd8272..b4cfd03df7f9 100644 --- a/docs/howto/static-files/index.txt +++ b/docs/howto/static-files/index.txt @@ -1,6 +1,6 @@ -==================================================== -Managing static files (e.g. images, JavaScript, CSS) -==================================================== +========================================================= +How to manage static files (e.g. images, JavaScript, CSS) +========================================================= Websites generally need to serve additional files such as images, JavaScript, or CSS. In Django, we refer to these files as "static files". Django provides @@ -16,17 +16,18 @@ Configuring static files #. In your settings file, define :setting:`STATIC_URL`, for example:: - STATIC_URL = '/static/' + STATIC_URL = "static/" #. In your templates, use the :ttag:`static` template tag to build the URL for - the given relative path using the configured :setting:`STATICFILES_STORAGE`. + the given relative path using the configured ``staticfiles`` + :setting:`STORAGES` alias. .. _staticfiles-in-templates: .. code-block:: html+django {% load static %} - My image + My image #. Store your static files in a folder called ``static`` in your app. For example ``my_app/static/my_app/example.jpg``. @@ -53,7 +54,7 @@ settings file where Django will also look for static files. For example:: STATICFILES_DIRS = [ BASE_DIR / "static", - '/var/www/static/', + "/var/www/static/", ] See the documentation for the :setting:`STATICFILES_FINDERS` setting for @@ -88,8 +89,8 @@ to ``True``. If you don't have ``django.contrib.staticfiles`` in This is not suitable for production use! For some common deployment strategies, see :doc:`/howto/static-files/deployment`. -For example, if your :setting:`STATIC_URL` is defined as ``/static/``, you can do -this by adding the following snippet to your urls.py:: +For example, if your :setting:`STATIC_URL` is defined as ``static/``, you can +do this by adding the following snippet to your ``urls.py``:: from django.conf import settings from django.conf.urls.static import static @@ -101,13 +102,17 @@ this by adding the following snippet to your urls.py:: .. note:: This helper function works only in debug mode and only if - the given prefix is local (e.g. ``/static/``) and not a URL (e.g. + the given prefix is local (e.g. ``static/``) and not a URL (e.g. ``http://static.example.com/``). Also this helper function only serves the actual :setting:`STATIC_ROOT` folder; it doesn't perform static files discovery like :mod:`django.contrib.staticfiles`. + Finally, static files are served via a wrapper at the WSGI application + layer. As a consequence, static files requests do not pass through the + normal :doc:`middleware chain `. + .. _serving-uploaded-files-in-development: Serving files uploaded by a user during development @@ -119,8 +124,8 @@ During development, you can serve user-uploaded media files from This is not suitable for production use! For some common deployment strategies, see :doc:`/howto/static-files/deployment`. -For example, if your :setting:`MEDIA_URL` is defined as ``/media/``, you can do -this by adding the following snippet to your urls.py:: +For example, if your :setting:`MEDIA_URL` is defined as ``media/``, you can do +this by adding the following snippet to your :setting:`ROOT_URLCONF`:: from django.conf import settings from django.conf.urls.static import static @@ -132,7 +137,7 @@ this by adding the following snippet to your urls.py:: .. note:: This helper function works only in debug mode and only if - the given prefix is local (e.g. ``/media/``) and not a URL (e.g. + the given prefix is local (e.g. ``media/``) and not a URL (e.g. ``http://media.example.com/``). .. _staticfiles-testing-support: @@ -167,7 +172,9 @@ for gathering static files in a single directory so you can serve them easily. STATIC_ROOT = "/var/www/example.com/static/" -#. Run the :djadmin:`collectstatic` management command:: +#. Run the :djadmin:`collectstatic` management command: + + .. code-block:: shell $ python manage.py collectstatic diff --git a/docs/howto/upgrade-version.txt b/docs/howto/upgrade-version.txt index bde9b18c1be4..02e0cbf9a0b4 100644 --- a/docs/howto/upgrade-version.txt +++ b/docs/howto/upgrade-version.txt @@ -1,6 +1,6 @@ -=================================== -Upgrading Django to a newer version -=================================== +======================================== +How to upgrade Django to a newer version +======================================== While it can be a complex process at times, upgrading to the latest Django version has several benefits: @@ -21,7 +21,7 @@ Required Reading If it's your first time doing an upgrade, it is useful to read the :doc:`guide on the different release processes `. -Afterwards, you should familiarize yourself with the changes that were made in +Afterward, you should familiarize yourself with the changes that were made in the new Django version(s): * Read the :doc:`release notes ` for each 'final' release from @@ -69,7 +69,7 @@ environment variable. For example, to show warnings while running tests: If you're not using the Django test runner, you may need to also ensure that any console output is not captured which would hide deprecation warnings. For -example, if you use `pytest `__: +example, if you use `pytest `__: .. code-block:: console diff --git a/docs/howto/windows.txt b/docs/howto/windows.txt index 9149509604a1..235b18a24ff3 100644 --- a/docs/howto/windows.txt +++ b/docs/howto/windows.txt @@ -2,13 +2,11 @@ How to install Django on Windows ================================ -.. highlight:: doscon - -This document will guide you through installing Python 3.8 and Django on +This document will guide you through installing Python 3.13 and Django on Windows. It also provides instructions for setting up a virtual environment, which makes it easier to work on Python projects. This is meant as a beginner's guide for users working on Django projects and does not reflect how Django -should be installed when developing patches for Django itself. +should be installed when developing changes for Django itself. The steps in this guide have been tested with Windows 10. In other versions, the steps would be similar. You will need to be familiar with using @@ -20,18 +18,28 @@ Install Python ============== Django is a Python web framework, thus requiring Python to be installed on your -machine. At the time of writing, Python 3.8 is the latest version. +machine. At the time of writing, Python 3.13 is the latest version. -To install Python on your machine go to https://python.org/downloads/. The +To install Python on your machine go to https://www.python.org/downloads/. The website should offer you a download button for the latest Python version. Download the executable installer and run it. Check the boxes next to "Install launcher for all users (recommended)" then click "Install Now". After installation, open the command prompt and check that the Python version -matches the version you installed by executing:: +matches the version you installed by executing: + +.. code-block:: doscon ...\> py --version +.. admonition:: ``py`` is not recognized or found + + Depending on how you've installed Python (such as via the Microsoft Store), + ``py`` may not be available in the command prompt. + + You will then need to use ``python`` instead of ``py`` when entering + commands. + .. seealso:: For more details, see :doc:`python:using/windows` documentation. @@ -39,13 +47,11 @@ matches the version you installed by executing:: About ``pip`` ============= -`pip`_ is a package manager for Python and is included by default with the +:pypi:`pip` is a package manager for Python and is included by default with the Python installer. It helps to install and uninstall Python packages (such as Django!). For the rest of the installation, we'll use ``pip`` to install Python packages from the command line. -.. _pip: https://pypi.org/project/pip/ - .. _virtualenvironment: Setting up a virtual environment @@ -60,12 +66,16 @@ environments which we will use for this guide. To create a virtual environment for your project, open a new command prompt, navigate to the folder where you want to create your project and then enter the -following:: +following: + +.. code-block:: doscon ...\> py -m venv project-name This will create a folder called 'project-name' if it does not already exist -and setup the virtual environment. To activate the environment, run:: +and set up the virtual environment. To activate the environment, run: + +.. code-block:: doscon ...\> project-name\Scripts\activate.bat @@ -79,7 +89,9 @@ Install Django Django can be installed easily using ``pip`` within your virtual environment. In the command prompt, ensure your virtual environment is active, and execute -the following command:: +the following command: + +.. code-block:: doscon ...\> py -m pip install Django @@ -91,6 +103,23 @@ by executing ``django-admin --version`` in the command prompt. See :ref:`database-installation` for information on database installation with Django. +Colored terminal output +======================= + +A quality-of-life feature adds colored (rather than monochrome) output to the +terminal. In modern terminals this should work for both CMD and PowerShell. If +for some reason this needs to be disabled, set the environmental variable +:envvar:`DJANGO_COLORS` to ``nocolor``. + +On older Windows versions, or legacy terminals, :pypi:`colorama` 0.4.6+ must be +installed to enable syntax coloring: + +.. code-block:: doscon + + ...\> py -m pip install "colorama >= 0.4.6" + +See :ref:`syntax-coloring` for more information on color settings. + Common pitfalls =============== @@ -102,7 +131,17 @@ Common pitfalls * If you are connecting to the internet behind a proxy, there might be problems in running the command ``py -m pip install Django``. Set the environment - variables for proxy configuration in the command prompt as follows:: + variables for proxy configuration in the command prompt as follows: + + .. code-block:: doscon ...\> set http_proxy=http://username:password@proxyserver:proxyport ...\> set https_proxy=https://username:password@proxyserver:proxyport + +* In general, Django assumes that ``UTF-8`` encoding is used for I/O. This may + cause problems if your system is set to use a different encoding. Recent + versions of Python allow setting the :envvar:`PYTHONUTF8` environment + variable in order to force a ``UTF-8`` encoding. Windows 10 also provides a + system-wide setting by checking ``Use Unicode UTF-8 for worldwide language + support`` in :menuselection:`Language --> Administrative Language Settings + --> Change system locale` in system settings. diff --git a/docs/howto/writing-migrations.txt b/docs/howto/writing-migrations.txt index 00dc0dfadfa8..2c52eccbad8b 100644 --- a/docs/howto/writing-migrations.txt +++ b/docs/howto/writing-migrations.txt @@ -1,6 +1,6 @@ -=========================== -Writing database migrations -=========================== +================================= +How to create database migrations +================================= This document explains how to structure and write database migrations for different scenarios you might encounter. For introductory material on @@ -21,13 +21,14 @@ attribute:: from django.db import migrations + def forwards(apps, schema_editor): - if schema_editor.connection.alias != 'default': + if schema_editor.connection.alias != "default": return # Your migration code goes here - class Migration(migrations.Migration): + class Migration(migrations.Migration): dependencies = [ # Dependencies to other migrations ] @@ -40,31 +41,31 @@ You can also provide hints that will be passed to the :meth:`allow_migrate()` method of database routers as ``**hints``: .. code-block:: python - :caption: myapp/dbrouters.py + :caption: ``myapp/dbrouters.py`` class MyRouter: - def allow_migrate(self, db, app_label, model_name=None, **hints): - if 'target_db' in hints: - return db == hints['target_db'] + if "target_db" in hints: + return db == hints["target_db"] return True Then, to leverage this in your migrations, do the following:: from django.db import migrations + def forwards(apps, schema_editor): # Your migration code goes here ... - class Migration(migrations.Migration): + class Migration(migrations.Migration): dependencies = [ # Dependencies to other migrations ] operations = [ - migrations.RunPython(forwards, hints={'target_db': 'default'}), + migrations.RunPython(forwards, hints={"target_db": "default"}), ] If your ``RunPython`` or ``RunSQL`` operation only affects one model, it's good @@ -98,22 +99,22 @@ the respective field according to your needs. ``AlterField``, and add imports of ``uuid`` and ``models``. For example: .. code-block:: python - :caption: 0006_remove_uuid_null.py + :caption: ``0006_remove_uuid_null.py`` # Generated by Django A.B on YYYY-MM-DD HH:MM from django.db import migrations, models import uuid - class Migration(migrations.Migration): + class Migration(migrations.Migration): dependencies = [ - ('myapp', '0005_populate_uuid_values'), + ("myapp", "0005_populate_uuid_values"), ] operations = [ migrations.AlterField( - model_name='mymodel', - name='uuid', + model_name="mymodel", + name="uuid", field=models.UUIDField(default=uuid.uuid4, unique=True), ), ] @@ -122,18 +123,17 @@ the respective field according to your needs. similar to this: .. code-block:: python - :caption: 0004_add_uuid_field.py + :caption: ``0004_add_uuid_field.py`` class Migration(migrations.Migration): - dependencies = [ - ('myapp', '0003_auto_20150129_1705'), + ("myapp", "0003_auto_20150129_1705"), ] operations = [ migrations.AddField( - model_name='mymodel', - name='uuid', + model_name="mymodel", + name="uuid", field=models.UUIDField(default=uuid.uuid4, unique=True), ), ] @@ -149,22 +149,23 @@ the respective field according to your needs. of ``uuid``. For example: .. code-block:: python - :caption: 0005_populate_uuid_values.py + :caption: ``0005_populate_uuid_values.py`` # Generated by Django A.B on YYYY-MM-DD HH:MM from django.db import migrations import uuid + def gen_uuid(apps, schema_editor): - MyModel = apps.get_model('myapp', 'MyModel') + MyModel = apps.get_model("myapp", "MyModel") for row in MyModel.objects.all(): row.uuid = uuid.uuid4() - row.save(update_fields=['uuid']) + row.save(update_fields=["uuid"]) - class Migration(migrations.Migration): + class Migration(migrations.Migration): dependencies = [ - ('myapp', '0004_add_uuid_field'), + ("myapp", "0004_add_uuid_field"), ] operations = [ @@ -190,6 +191,7 @@ a transaction by setting the ``atomic`` attribute to ``False``:: from django.db import migrations + class Migration(migrations.Migration): atomic = False @@ -205,14 +207,16 @@ smaller batches:: from django.db import migrations, transaction + def gen_uuid(apps, schema_editor): - MyModel = apps.get_model('myapp', 'MyModel') + MyModel = apps.get_model("myapp", "MyModel") while MyModel.objects.filter(uuid__isnull=True).exists(): with transaction.atomic(): for row in MyModel.objects.filter(uuid__isnull=True)[:1000]: row.uuid = uuid.uuid4() row.save() + class Migration(migrations.Migration): atomic = False @@ -241,10 +245,10 @@ The ``dependencies`` property is declared like this:: from django.db import migrations - class Migration(migrations.Migration): + class Migration(migrations.Migration): dependencies = [ - ('myapp', '0123_the_previous_migration'), + ("myapp", "0123_the_previous_migration"), ] Usually this will be enough, but from time to time you may need to @@ -259,7 +263,7 @@ the ``run_before`` attribute on your ``Migration`` class:: ... run_before = [ - ('third_party_app', '0001_do_awesome'), + ("third_party_app", "0001_do_awesome"), ] Prefer using ``dependencies`` over ``run_before`` when possible. You should @@ -283,35 +287,37 @@ project anywhere without first installing and then uninstalling the old app. Here's a sample migration: .. code-block:: python - :caption: myapp/migrations/0124_move_old_app_to_new_app.py + :caption: ``myapp/migrations/0124_move_old_app_to_new_app.py`` from django.apps import apps as global_apps from django.db import migrations + def forwards(apps, schema_editor): try: - OldModel = apps.get_model('old_app', 'OldModel') + OldModel = apps.get_model("old_app", "OldModel") except LookupError: # The old app isn't installed. return - NewModel = apps.get_model('new_app', 'NewModel') + NewModel = apps.get_model("new_app", "NewModel") NewModel.objects.bulk_create( NewModel(new_attribute=old_object.old_attribute) for old_object in OldModel.objects.all() ) + class Migration(migrations.Migration): operations = [ migrations.RunPython(forwards, migrations.RunPython.noop), ] dependencies = [ - ('myapp', '0123_the_previous_migration'), - ('new_app', '0001_initial'), + ("myapp", "0123_the_previous_migration"), + ("new_app", "0001_initial"), ] - if global_apps.is_installed('old_app'): - dependencies.append(('old_app', '0001_initial')) + if global_apps.is_installed("old_app"): + dependencies.append(("old_app", "0001_initial")) Also consider what you want to happen when the migration is unapplied. You could either do nothing (as in the example above) or remove some or all of the @@ -345,7 +351,7 @@ For example, if we had a ``Book`` model with a ``ManyToManyField`` linking to class Migration(migrations.Migration): dependencies = [ - ('core', '0001_initial'), + ("core", "0001_initial"), ] operations = [ @@ -354,52 +360,52 @@ For example, if we had a ``Book`` model with a ``ManyToManyField`` linking to # Old table name from checking with sqlmigrate, new table # name from AuthorBook._meta.db_table. migrations.RunSQL( - sql='ALTER TABLE core_book_authors RENAME TO core_authorbook', - reverse_sql='ALTER TABLE core_authorbook RENAME TO core_book_authors', + sql="ALTER TABLE core_book_authors RENAME TO core_authorbook", + reverse_sql="ALTER TABLE core_authorbook RENAME TO core_book_authors", ), ], state_operations=[ migrations.CreateModel( - name='AuthorBook', + name="AuthorBook", fields=[ ( - 'id', + "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, - verbose_name='ID', + verbose_name="ID", ), ), ( - 'author', + "author", models.ForeignKey( on_delete=django.db.models.deletion.DO_NOTHING, - to='core.Author', + to="core.Author", ), ), ( - 'book', + "book", models.ForeignKey( on_delete=django.db.models.deletion.DO_NOTHING, - to='core.Book', + to="core.Book", ), ), ], ), migrations.AlterField( - model_name='book', - name='authors', + model_name="book", + name="authors", field=models.ManyToManyField( - to='core.Author', - through='core.AuthorBook', + to="core.Author", + through="core.AuthorBook", ), ), ], ), migrations.AddField( - model_name='authorbook', - name='is_primary', + model_name="authorbook", + name="is_primary", field=models.BooleanField(default=False), ), ] diff --git a/docs/index.txt b/docs/index.txt index 9e8a3fdfd62a..358c465df5cc 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -22,11 +22,12 @@ Are you new to Django or to programming? This is the place to start! :doc:`Part 4: Forms and generic views ` | :doc:`Part 5: Testing ` | :doc:`Part 6: Static files ` | - :doc:`Part 7: Customizing the admin site ` + :doc:`Part 7: Customizing the admin site ` | + :doc:`Part 8: Adding third-party packages ` * **Advanced Tutorials:** :doc:`How to write reusable apps ` | - :doc:`Writing your first patch for Django ` + :doc:`Writing your first contribution to Django ` Getting help ============ @@ -52,7 +53,7 @@ Django has a lot of documentation. A high-level overview of how it's organized will help you know where to look for certain things: * :doc:`Tutorials ` take you by the hand through a series of - steps to create a Web application. Start here if you're new to Django or Web + steps to create a web application. Start here if you're new to Django or web application development. Also look at the ":ref:`index-first-steps`". * :doc:`Topic guides ` discuss key topics and concepts at a @@ -70,7 +71,7 @@ The model layer =============== Django provides an abstraction layer (the "models") for structuring and -manipulating the data of your Web application. Learn more about it below: +manipulating the data of your web application. Learn more about it below: * **Models:** :doc:`Introduction to models ` | @@ -241,7 +242,7 @@ most popular features: Security ======== -Security is a topic of paramount importance in the development of Web +Security is a topic of paramount importance in the development of web applications and Django provides multiple protection tools and mechanisms: * :doc:`Security overview ` @@ -261,7 +262,7 @@ regions: * :doc:`Overview ` | :doc:`Internationalization ` | :ref:`Localization ` | - :doc:`Localized Web UI formatting and form input ` + :doc:`Localized web UI formatting and form input ` * :doc:`Time zones ` Performance and optimization @@ -276,13 +277,13 @@ Geographic framework ==================== :doc:`GeoDjango ` intends to be a world-class geographic -Web framework. Its goal is to make it as easy as possible to build GIS Web +web framework. Its goal is to make it as easy as possible to build GIS web applications and harness the power of spatially enabled data. -Common Web application tools +Common web application tools ============================ -Django offers multiple tools commonly needed in the development of Web +Django offers multiple tools commonly needed in the development of web applications: * **Authentication:** @@ -324,12 +325,12 @@ Learn about the development process for the Django project itself and about how you can contribute: * **Community:** - :doc:`How to get involved ` | + :doc:`Contributing to Django ` | :doc:`The release process ` | :doc:`Team organization ` | :doc:`The Django source code repository ` | :doc:`Security policies ` | - :doc:`Mailing lists ` + :doc:`Mailing lists and Forum` * **Design philosophies:** :doc:`Overview ` diff --git a/docs/internals/_images/triage_process.graffle b/docs/internals/_images/triage_process.graffle index 291c0397f7f2..67bdbfb60057 100644 Binary files a/docs/internals/_images/triage_process.graffle and b/docs/internals/_images/triage_process.graffle differ diff --git a/docs/internals/_images/triage_process.pdf b/docs/internals/_images/triage_process.pdf index f731e3e584eb..558553e2dd7c 100644 Binary files a/docs/internals/_images/triage_process.pdf and b/docs/internals/_images/triage_process.pdf differ diff --git a/docs/internals/_images/triage_process.svg b/docs/internals/_images/triage_process.svg index 787f5ca64755..6fbf1cbcc7f2 100644 --- a/docs/internals/_images/triage_process.svg +++ b/docs/internals/_images/triage_process.svg @@ -1,3 +1,282 @@ - + -2013-04-08 16:32ZCanevas 1Calque 1Closed ticketsresolutionOpen ticketstriage stateReady for CheckinAcceptedUnreviewedduplicatefixedinvalidneedsinfoworksformewontfixcompletedstoppedin progressTicket triagers CommittersstatusThe ticket was already reported, was already rejected, isn't a bug, doesn't contain enough information, or can't be reproduced.The ticket is a bug and should be fixed.The ticket has a patch which applies cleanly and includes all needed tests and docs. A core developer can commit it as is. + + + + + + + + + + + + + + + + + + + + + Canevas 1 + + + Calque 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Closed tickets + resolution + + + + + + + Open tickets + triage state + + + + + + + Ready for + Checkin + + + + + + + Accepted + + + + + + + Unreviewed + + + + + + + duplicate + + + + + + + fixed + + + + + + + invalid + + + + + + + needsinfo + + + + + + + worksforme + + + + + + + wontfix + + + + + + + + + + + + completed + + + + + + stopped + + + + + + in progress + + + + + + + + Ticket triagers + + + + + + + + Mergers + + + + + + status + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The ticket was already reported, was + already rejected, isn't a bug, doesn't contain + enough information, or can't be reproduced. + + + + + + + + + + + + + The ticket is a + bug and should + be fixed. + + + + + + + + + + + + + The ticket has a patch which applies cleanly and includes all + needed tests and docs. A merger can commit it as is. + + + + + + + + + + + + + + diff --git a/docs/internals/contributing/bugs-and-features.txt b/docs/internals/contributing/bugs-and-features.txt index d782f8000da4..ad667e3c583d 100644 --- a/docs/internals/contributing/bugs-and-features.txt +++ b/docs/internals/contributing/bugs-and-features.txt @@ -16,15 +16,15 @@ Otherwise, before reporting a bug or requesting a new feature on the * Check that someone hasn't already filed the bug or feature request by `searching`_ or running `custom queries`_ in the ticket tracker. -* Don't use the ticket system to ask support questions. Use the - |django-users| list or the `#django`_ IRC channel for that. +* Don't use the ticket system to ask support questions. Use the `Django Forum`_ + or the `Django Discord server`_ for that. * Don't reopen issues that have been marked "wontfix" without finding consensus - to do so on |django-developers|. + to do so on the `Django Forum`_. * Don't use the ticket tracker for lengthy discussions, because they're likely to get lost. If a particular ticket is controversial, please move the - discussion to |django-developers|. + discussion to the `Django Forum`_. .. _reporting-bugs: @@ -39,8 +39,8 @@ particular: * **Do** read the :doc:`FAQ ` to see if your issue might be a well-known question. -* **Do** ask on |django-users| or `#django`_ *first* if you're not sure if - what you're seeing is a bug. +* **Do** ask on `Django Forum`_ or the `Django Discord server`_ *first* if + you're not sure if what you're seeing is a bug. * **Do** write complete, reproducible, specific bug reports. You must include a clear, concise description of the problem, and a set of @@ -49,7 +49,7 @@ particular: small test case is the best way to report a bug, as it gives us a helpful way to confirm the bug quickly. -* **Don't** post to |django-developers| only to announce that you have filed a +* **Don't** post to `Django Forum`_ only to announce that you have filed a bug report. All the tickets are mailed to another list, |django-updates|, which is tracked by developers and interested community members; we see them as they are filed. @@ -64,14 +64,14 @@ If your bug or feature request touches on anything visual in nature, there are a few additional guidelines to follow: * Include screenshots in your ticket which are the visual equivalent of a - minimal testcase. Show off the issue, not the crazy customizations + minimal test case. Show off the issue, not the crazy customizations you've made to your browser. * If the issue is difficult to show off using a still image, consider capturing a *brief* screencast. If your software permits it, capture only the relevant area of the screen. -* If you're offering a patch which changes the look or behavior of Django's +* If you're offering a patch that changes the look or behavior of Django's UI, you **must** attach before *and* after screenshots/screencasts. Tickets lacking these are difficult for triagers to assess quickly. @@ -94,11 +94,10 @@ part of that. Here are some tips on how to make a request most effectively: suggest that you develop it independently. Then, if your project gathers sufficient community support, we may consider it for inclusion in Django. -* First request the feature on the |django-developers| list, not in the - ticket tracker. It'll get read more closely if it's on the mailing list. - This is even more important for large-scale feature requests. We like to - discuss any big changes to Django's core on the mailing list before - actually working on them. +* First request the feature on the `Django Forum`_, not in the ticket tracker. + It'll get read more closely and reach a larger audience. This is even more + important for large-scale feature requests. We like to discuss any big + changes to Django's core before actually working on them. * Describe clearly and concisely what the missing feature is and how you'd like to see it implemented. Include example code (non-functional is OK) @@ -109,25 +108,29 @@ part of that. Here are some tips on how to make a request most effectively: achieving the same thing. If there's a consensus agreement on the feature, then it's appropriate to -create a ticket. Include a link the discussion on |django-developers| in the -ticket description. - -As with most open-source projects, code talks. If you are willing to write the -code for the feature yourself or, even better, if you've already written it, -it's much more likely to be accepted. Fork Django on GitHub, create a feature -branch, and show us your work! +create a ticket. Include a link to the discussion in the ticket description. See also: :ref:`documenting-new-features`. +Requesting performance optimizations +==================================== + +Reports of a performance regression, or suggested performance optimizations, +should provide benchmarks and commands for the ticket triager to reproduce. + +See the :ref:`django-asv-benchmarks` for more details of Django's existing +benchmarks. + .. _how-we-make-decisions: How we make decisions ===================== Whenever possible, we strive for a rough consensus. To that end, we'll often -have informal votes on |django-developers| about a feature. In these votes we +have informal votes on the Django Forum about a feature. In these votes we follow the voting style invented by Apache and used on Python itself, where -votes are given as +1, +0, -0, or -1. Roughly translated, these votes mean: +votes are given as +1, +0, -0, or -1. +Roughly translated, these votes mean: * +1: "I love the idea and I'm strongly committed to it." @@ -138,30 +141,30 @@ votes are given as +1, +0, -0, or -1. Roughly translated, these votes mean: * -1: "I strongly disagree and would be very unhappy to see the idea turn into reality." -Although these votes on |django-developers| are informal, they'll be taken very -seriously. After a suitable voting period, if an obvious consensus arises we'll -follow the votes. +Although these votes are informal, they'll be taken very seriously. After a +suitable voting period, if an obvious consensus arises we'll follow the votes. However, consensus is not always possible. If consensus cannot be reached, or -if the discussion towards a consensus fizzles out without a concrete decision, -the decision may be deferred to the :ref:`technical board `. +if the discussion toward a consensus fizzles out without a concrete decision, +the decision may be deferred to the :ref:`steering council `. -Internally, the technical board will use the same voting mechanism. A +Internally, the steering council will use the same voting mechanism. A proposition will be considered carried if: -* There are at least three "+1" votes from members of the technical board. +* There are at least three "+1" votes from members of the steering council. -* There is no "-1" vote from any member of the technical board. +* There is no "-1" vote from any member of the steering council. Votes should be submitted within a week. -Since this process allows any technical board member to veto a proposal, a +Since this process allows any steering council member to veto a proposal, a "-1" vote should be accompanied by an explanation of what it would take to convert that "-1" into at least a "+0". Votes on technical matters should be announced and held in public on the -|django-developers| mailing list. +`Django Forum`_. .. _searching: https://code.djangoproject.com/search .. _custom queries: https://code.djangoproject.com/query -.. _#django: https://webchat.freenode.net/#django +.. _Django Forum: https://forum.djangoproject.com/ +.. _Django Discord server: https://chat.djangoproject.com diff --git a/docs/internals/contributing/committing-code.txt b/docs/internals/contributing/committing-code.txt index 13c139c5c5dc..2dc42d885379 100644 --- a/docs/internals/contributing/committing-code.txt +++ b/docs/internals/contributing/committing-code.txt @@ -2,7 +2,7 @@ Committing code =============== -This section is addressed to the committers and to anyone interested in knowing +This section is addressed to the mergers and to anyone interested in knowing how code gets committed into Django. If you're a community member who wants to contribute code to Django, look at :doc:`writing-code/working-with-git` instead. @@ -16,18 +16,20 @@ requests. When committing a pull request, make sure each individual commit matches the commit guidelines described below. Contributors are expected to provide the -best pull requests possible. In practice however, committers - who will likely -be more familiar with the commit guidelines - may decide to bring a commit up -to standard themselves. +best pull requests possible. In practice mergers - who will likely be more +familiar with the commit guidelines - may decide to bring a commit up to +standard themselves. -You may want to have Jenkins test the pull request with one of the pull request -builders that doesn't run automatically, such as Oracle or Selenium. See the -`Jenkins wiki page`_ for instructions. +You may want to have Jenkins or GitHub actions test the pull request with one +of the pull request builders that doesn't run automatically, such as Oracle or +Selenium. See the `CI wiki page`_ for instructions. -.. _Jenkins wiki page: https://code.djangoproject.com/wiki/Jenkins +.. _CI wiki page: https://code.djangoproject.com/wiki/CI If you find yourself checking out pull requests locally more often, this git -alias will be helpful:: +alias will be helpful: + +.. code-block:: ini [alias] pr = !sh -c \"git fetch upstream pull/${1}/head:pr/${1} && git checkout pr/${1}\" @@ -41,27 +43,27 @@ Once you're ready: .. console:: - $ # Pull in the latest changes from master. - $ git checkout master - $ git pull upstream master - $ # Rebase the pull request on master. + $ # Pull in the latest changes from main. + $ git checkout main + $ git pull upstream main + $ # Rebase the pull request on main. $ git checkout pr/#### - $ git rebase master - $ git checkout master - $ # Merge the work as "fast-forward" to master to avoid a merge commit. + $ git rebase main + $ git checkout main + $ # Merge the work as "fast-forward" to main to avoid a merge commit. $ # (in practice, you can omit "--ff-only" since you just rebased) $ git merge --ff-only pr/XXXX $ # If you're not sure if you did things correctly, check that only the $ # changes you expect will be pushed to upstream. - $ git push --dry-run upstream master + $ git push --dry-run upstream main $ # Push! - $ git push upstream master + $ git push upstream main $ # Delete the pull request branch. $ git branch -d pr/xxxx -Force push to the branch after rebasing on master but before merging and -pushing to upstream. This allows the commit hashes on master and the branch to -match which automatically closes the pull request. +Force push to the branch after rebasing on main but before merging and pushing +to upstream. This allows the commit hashes on main and the branch to match +which automatically closes the pull request. If a pull request doesn't need to be merged as multiple commits, you can use GitHub's "Squash and merge" button on the website. Edit the commit message as @@ -90,7 +92,7 @@ Django's commit history as usable as possible: * Trivial and small patches usually are best done in one commit. Medium to large work may be split into multiple commits if it makes sense. -Practicality beats purity, so it is up to each committer to decide how much +Practicality beats purity, so it is up to each merger to decide how much history mangling to do for a pull request. The main points are engaging the community, getting work done, and having a usable commit history. @@ -107,14 +109,14 @@ Django's Git repository: discuss the situation with the team. * For any medium-to-big changes, where "medium-to-big" is according to - your judgment, please bring things up on the |django-developers| - mailing list before making the change. + your judgment, please bring things up on the `Django Forum`_ before making + the change. - If you bring something up on |django-developers| and nobody responds, - please don't take that to mean your idea is great and should be - implemented immediately because nobody contested it. Everyone doesn't always - have a lot of time to read mailing list discussions immediately, so you may - have to wait a couple of days before getting a response. + If you bring something up and nobody responds, please don't take that + to mean your idea is great and should be implemented immediately because + nobody contested it. Everyone doesn't always have a lot of time to read + discussions immediately, so you may have to wait a couple of days before + getting a response. * Write detailed commit messages in the past tense, not present tense. @@ -138,7 +140,7 @@ Django's Git repository: Credit the contributors in the commit message: "Thanks A for the report and B for review." Use git's `Co-Authored-By`_ as appropriate. - .. _Co-Authored-By: https://help.github.com/articles/creating-a-commit-with-multiple-authors/ + .. _Co-Authored-By: https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors * For commits to a branch, prefix the commit message with the branch name. For example: "[1.4.x] Fixed #xxxxx -- Added support for mind reading." @@ -166,7 +168,7 @@ Django's Git repository: Note that the Trac integration doesn't know anything about pull requests. So if you try to close a pull request with the phrase "closes #400" in your commit message, GitHub will close the pull request, but the Trac plugin - will also close the same numbered ticket in Trac. + will not close the same numbered ticket in Trac. .. _Trac plugin: https://github.com/trac-hacks/trac-github @@ -189,11 +191,11 @@ Django's Git repository: [1.3.x] Fixed #17028 -- Changed diveintopython.org -> diveintopython.net. - Backport of 80c0cbf1c97047daed2c5b41b296bbc56fe1d7e3 from master. + Backport of 80c0cbf1c97047daed2c5b41b296bbc56fe1d7e3 from main. There's a `script on the wiki - `_ - to automate this. + `_ to + automate this. If the commit fixes a regression, include this in the commit message: @@ -211,7 +213,7 @@ Nobody's perfect; mistakes will be committed. But try very hard to ensure that mistakes don't happen. Just because we have a reversion policy doesn't relax your responsibility to aim for the highest quality possible. Really: double-check your work, or have it checked by -another committer, **before** you commit it in the first place! +another merger **before** you commit it in the first place! When a mistaken commit is discovered, please follow these guidelines: @@ -225,16 +227,15 @@ When a mistaken commit is discovered, please follow these guidelines: * If the original author can't be reached (within a reasonable amount of time -- a day or so) and the problem is severe -- crashing bug, - major test failures, etc. -- then ask for objections on the - |django-developers| mailing list then revert if there are none. + major test failures, etc. -- then ask for objections on the `Django Forum`_ + then revert if there are none. * If the problem is small (a feature commit after feature freeze, say), wait it out. -* If there's a disagreement between the committer and the - reverter-to-be then try to work it out on the |django-developers| - mailing list. If an agreement can't be reached then it should - be put to a vote. +* If there's a disagreement between the merger and the reverter-to-be then try + to work it out on the `Django Forum`_ . If an agreement can't be reached then + it should be put to a vote. * If the commit introduced a confirmed, disclosed security vulnerability then the commit may be reverted immediately without @@ -248,3 +249,4 @@ When a mistaken commit is discovered, please follow these guidelines: do a reverse push: ``git push upstream :feature_antigravity``. .. _ticket tracker: https://code.djangoproject.com/ +.. _Django Forum: https://forum.djangoproject.com/ diff --git a/docs/internals/contributing/index.txt b/docs/internals/contributing/index.txt index 0dcfa7a84423..de53ece43e12 100644 --- a/docs/internals/contributing/index.txt +++ b/docs/internals/contributing/index.txt @@ -3,20 +3,30 @@ Contributing to Django ====================== Django is a community that lives on its volunteers. As it keeps growing, we -always need more people to help others. As soon as you learn Django, you can -contribute in many ways: +always need more people to help others. You can contribute in many ways, either +on the framework itself or in the wider ecosystem. -* Join the `Django forum`_. This forum is a place for discussing the Django +Communication channels +====================== + +We're passionate about helping Django users make the jump to contributing +members of the community. Communication is key - working on Django is being +part of a conversation. Join it, to become familiar with what we're doing and +how we talk about it. You'll be able to form relationships with more +experienced contributors who are there to help guide you towards success. + +Join the Django community +------------------------- + +There are several ways you can help the Django community and others to maintain +a great ecosystem to work in: + +* Join the `Django Forum`_. This forum is a place for discussing the Django framework and applications and projects that use it. This is also a good place to ask and answer any questions related to installing, using, or contributing to Django. -* Join the |django-users| mailing list and answer questions. This - mailing list has a huge audience, and we really want to maintain a - friendly and helpful atmosphere. If you're new to the Django community, - you should read the `posting guidelines`_. - -* Join the `#django IRC channel`_ on Freenode and answer questions. By +* Join the `Django Discord server`_ to discuss and answer questions. By explaining Django to other users, you're going to learn a lot about the framework yourself. @@ -29,49 +39,83 @@ contribute in many ways: ecosystem of pluggable applications is a big strength of Django, help us build it! -If you think working *with* Django is fun, wait until you start working *on* -it. We're passionate about helping Django users make the jump to contributing -members of the community, so there are several ways you can help Django's -development: +.. _community page: https://www.djangoproject.com/community/ +.. _Django Discord server: https://chat.djangoproject.com +.. _Django Forum: https://forum.djangoproject.com/ +.. _register it here: https://www.djangoproject.com/community/add/blogs/ + +Getting started +=============== -* :doc:`Report bugs ` in our `ticket tracker`_. +Django encourages and welcomes new contributors, and makes an effort to help +them become experienced, confident contributors to Open Source Software (OSS). +Our documentation contains guidance for first-time contributors, including: -* Join the |django-developers| mailing list and share your ideas for how - to improve Django. We're always open to suggestions. You can also interact - on the `#django-dev IRC channel`_. +.. toctree:: + :maxdepth: 1 + + An overview of the contributing process and what's involved. -* :doc:`Submit patches ` for new and/or - fixed behavior. If you're looking for a way to get started contributing - to Django read the :doc:`/intro/contributing` tutorial and have a look at the - `easy pickings`_ tickets. The :ref:`patch-review-checklist` will also be - helpful. +Work on the Django framework +============================ -* :doc:`Improve the documentation ` or - :doc:`write unit tests `. +If you enjoy working *with* Django, wait until you start working *on* it. +Really, **anyone** can do something to improve Django, which will improve the +experience of lots of people! -* :doc:`Triage tickets and review patches ` created by - other users. +The work on Django itself falls into three major areas: -Really, **ANYONE** can do something to help make Django better and greater! +Contributing code +----------------- -Browse the following sections to find out how: +Fix a bug, or add a new feature. You can make a pull request and see **your +code** in the next version of Django. .. toctree:: :maxdepth: 2 - new-contributors - bugs-and-features - triaging-tickets writing-code/index + +Contributing documentation +-------------------------- + +Django's documentation is one of its key strengths. It's informative and +thorough. You can help to improve the documentation and keep it relevant as the +framework evolves. + +.. toctree:: + :maxdepth: 2 + writing-documentation + +Localizing Django +----------------- + +Django is translated into over 100 languages - There's even some translation +for Klingon?! The i18n team is always looking for translators to help maintain +and increase language reach. + +.. toctree:: + :maxdepth: 2 + localizing - committing-code -.. _posting guidelines: https://code.djangoproject.com/wiki/UsingTheMailingList -.. _#django IRC channel: https://webchat.freenode.net/#django -.. _#django-dev IRC channel: https://webchat.freenode.net/#django-dev -.. _community page: https://www.djangoproject.com/community/ -.. _Django forum: https://forum.djangoproject.com/ -.. _register it here: https://www.djangoproject.com/community/add/blogs/ +Other ways of contributing +========================== + +Explore additional avenues of contributing to Django beyond coding. Django's +`ticket tracker`_ is the central hub for managing issues, improvements, and +contributions to Django. It's a valuable resource where you can report bugs you +encounter or assist in triaging existing tickets to ensure a smooth development +workflow. Explore the ways you can make a difference below, and join us in +making Django better for everyone. + +.. toctree:: + :maxdepth: 2 + + bugs-and-features + triaging-tickets + .. _ticket tracker: https://code.djangoproject.com/ -.. _easy pickings: https://code.djangoproject.com/query?status=!closed&easy=1 + +We're looking forward to working with you. Welcome aboard! diff --git a/docs/internals/contributing/localizing.txt b/docs/internals/contributing/localizing.txt index 8fb6fa5b0840..112a74dd9e2a 100644 --- a/docs/internals/contributing/localizing.txt +++ b/docs/internals/contributing/localizing.txt @@ -16,10 +16,9 @@ coordinated at `Transifex`_. If you find an incorrect translation or want to discuss specific translations, go to the `Django project page`_. If you would like to help out with -translating or add a language that isn't yet translated, here's what to do: +translating or adding a language that isn't yet translated, here's what to do: -* Join the :ref:`Django i18n mailing list ` and - introduce yourself. +* Introduce yourself on the `Django internationalization forum`_. * Make sure you read the notes about :ref:`specialties-of-django-i18n`. @@ -36,9 +35,9 @@ translating or add a language that isn't yet translated, here's what to do: procedural problems and handle the actual translation process. * Once you are a member of a team choose the translation resource you - want to update on the team page. For example the "core" resource refers + want to update on the team page. For example, the "core" resource refers to the translation catalog that contains all non-contrib translations. - Each of the contrib apps also have a resource (prefixed with "contrib"). + Each of the contrib apps also has a resource (prefixed with "contrib"). .. note:: For more information about how to use Transifex, read the @@ -60,17 +59,19 @@ the date, time and numbers formatting particularities of your locale. See :doc:`/topics/i18n/formatting` for details. The format files aren't managed by the use of Transifex. To change them, you -must :doc:`create a patch` against the -Django source tree, as for any code change: +must: -* Create a diff against the current Git master branch. +* :doc:`Create a pull request` against the + Django Git ``main`` branch, as for any code change. * Open a ticket in Django's ticket system, set its ``Component`` field to - ``Translations``, and attach the patch to it. + ``Translations``, set the "has patch" flag, and include the link to the pull + request. .. _Transifex: https://www.transifex.com/ -.. _Django project page: https://www.transifex.com/django/django/ -.. _Transifex User Guide: https://docs.transifex.com/ +.. _Django project page: https://app.transifex.com/django/django/ +.. _Django internationalization forum: https://forum.djangoproject.com/c/internals/i18n/14 +.. _Transifex User Guide: https://help.transifex.com/ .. _translating-documentation: @@ -79,7 +80,7 @@ Documentation There is also an opportunity to translate the documentation, though this is a huge undertaking to complete entirely (you have been warned!). We use the same -`Transifex tool `_. The +`Transifex tool `_. The translations will appear at ``https://docs.djangoproject.com//`` when at least the ``docs/intro/*`` files are fully translated in your language. diff --git a/docs/internals/contributing/new-contributors.txt b/docs/internals/contributing/new-contributors.txt index dbadb4cb0a4a..3ec74b6bd447 100644 --- a/docs/internals/contributing/new-contributors.txt +++ b/docs/internals/contributing/new-contributors.txt @@ -5,63 +5,71 @@ Advice for new contributors New contributor and not sure what to do? Want to help but just don't know how to get started? This is the section for you. -.. admonition:: Basic tools and workflow +.. admonition:: Get up and running! If you are new to contributing to Django, the :doc:`/intro/contributing` tutorial will give you an introduction to the tools and the workflow. +This page contains more general advice on ways you can contribute to Django, +and how to approach that. + +If you are looking for a reference on the details of making code contributions, +see the :doc:`/internals/contributing/writing-code/index` documentation. + First steps =========== Start with these steps to discover Django's development process. -* **Triage tickets** +Triage tickets +-------------- - If an `unreviewed ticket`_ reports a bug, try and reproduce it. If you - can reproduce it and it seems valid, make a note that you confirmed the bug - and accept the ticket. Make sure the ticket is filed under the correct - component area. Consider writing a patch that adds a test for the bug's - behavior, even if you don't fix the bug itself. See more at - :ref:`how-can-i-help-with-triaging` +If an `unreviewed ticket`_ reports a bug, try and reproduce it. If you can +reproduce it and it seems valid, make a note that you confirmed the bug and +accept the ticket. Make sure the ticket is filed under the correct component +area. Consider writing a patch that adds a test for the bug's behavior, even if +you don't fix the bug itself. See more at :ref:`how-can-i-help-with-triaging` -* **Look for tickets that are accepted and review patches to build familiarity - with the codebase and the process** +Review patches of accepted tickets +---------------------------------- - Mark the appropriate flags if a patch needs docs or tests. Look through the - changes a patch makes, and keep an eye out for syntax that is incompatible - with older but still supported versions of Python. :doc:`Run the tests - ` and make sure they pass. - Where possible and relevant, try them out on a database other than SQLite. - Leave comments and feedback! +This will help you build familiarity with the codebase and processes. Mark the +appropriate flags if a patch needs docs or tests. Look through the changes a +patch makes, and keep an eye out for syntax that is incompatible with older but +still supported versions of Python. :doc:`Run the tests +` and make sure they pass. +Where possible and relevant, try them out on a database other than SQLite. +Leave comments and feedback! -* **Keep old patches up to date** +Keep old patches up-to-date +--------------------------- - Oftentimes the codebase will change between a patch being submitted and the - time it gets reviewed. Make sure it still applies cleanly and functions as - expected. Updating a patch is both useful and important! See more on - :doc:`writing-code/submitting-patches`. +Oftentimes the codebase will change between a patch being submitted and the +time it gets reviewed. Make sure it still applies cleanly and functions as +expected. Updating a patch is both useful and important! See more on +:doc:`writing-code/submitting-patches`. -* **Write some documentation** +Write some documentation +------------------------ - Django's documentation is great but it can always be improved. Did you find - a typo? Do you think that something should be clarified? Go ahead and - suggest a documentation patch! See also the guide on - :doc:`writing-documentation`. +Django's documentation is great but it can always be improved. Did you find a +typo? Do you think that something should be clarified? Go ahead and suggest a +documentation patch! See also the guide on :doc:`writing-documentation`. - .. note:: +.. note:: - The `reports page`_ contains links to many useful Trac queries, including - several that are useful for triaging tickets and reviewing patches as - suggested above. + The `reports page`_ contains links to many useful Trac queries, including + several that are useful for triaging tickets and reviewing patches as + suggested above. - .. _reports page: https://code.djangoproject.com/wiki/Reports + .. _reports page: https://code.djangoproject.com/wiki/Reports -* **Sign the Contributor License Agreement** +Sign the Contributor License Agreement +-------------------------------------- - The code that you write belongs to you or your employer. If your - contribution is more than one or two lines of code, you need to sign the - `CLA`_. See the `Contributor License Agreement FAQ`_ for a more thorough - explanation. +The code that you write belongs to you or your employer. If your contribution +is more than one or two lines of code, you need to sign the `CLA`_. See the +`Contributor License Agreement FAQ`_ for a more thorough explanation. .. _CLA: https://www.djangoproject.com/foundation/cla/ .. _Contributor License Agreement FAQ: https://www.djangoproject.com/foundation/cla/faq/ @@ -74,83 +82,89 @@ Guidelines As a newcomer on a large project, it's easy to experience frustration. Here's some advice to make your work on Django more useful and rewarding. -* **Pick a subject area that you care about, that you are familiar with, or - that you want to learn about** +Pick a subject area +------------------- - You don't already have to be an expert on the area you want to work on; you - become an expert through your ongoing contributions to the code. +This should be something that you care about, that you are familiar with or +that you want to learn about. You don't already have to be an expert on the +area you want to work on; you become an expert through your ongoing +contributions to the code. -* **Analyze tickets' context and history** +Analyze tickets' context and history +------------------------------------ - Trac isn't an absolute; the context is just as important as the words. - When reading Trac, you need to take into account who says things, and when - they were said. Support for an idea two years ago doesn't necessarily mean - that the idea will still have support. You also need to pay attention to who - *hasn't* spoken -- for example, if an experienced contributor hasn't been - recently involved in a discussion, then a ticket may not have the support - required to get into Django. +Trac isn't an absolute; the context is just as important as the words. When +reading Trac, you need to take into account who says things, and when they were +said. Support for an idea two years ago doesn't necessarily mean that the idea +will still have support. You also need to pay attention to who *hasn't* spoken +-- for example, if an experienced contributor hasn't been recently involved in +a discussion, then a ticket may not have the support required to get into +Django. -* **Start small** +Start small +----------- - It's easier to get feedback on a little issue than on a big one. See the - `easy pickings`_. +It's easier to get feedback on a little issue than on a big one. See the +`easy pickings`_. -* **If you're going to engage in a big task, make sure that your idea has - support first** +Confirm support before engaging in a big task +--------------------------------------------- - This means getting someone else to confirm that a bug is real before you fix - the issue, and ensuring that there's consensus on a proposed feature before - you go implementing it. +This means getting someone else to confirm that a bug is real before you fix +the issue, and ensuring that there's consensus on a proposed feature before you +go implementing it. -* **Be bold! Leave feedback!** +Be bold! Leave feedback! +------------------------ - Sometimes it can be scary to put your opinion out to the world and say "this - ticket is correct" or "this patch needs work", but it's the only way the - project moves forward. The contributions of the broad Django community - ultimately have a much greater impact than that of any one person. We can't - do it without **you**! +Sometimes it can be scary to put your opinion out to the world and say "this +ticket is correct" or "this patch needs work", but it's the only way the +project moves forward. The contributions of the broad Django community +ultimately have a much greater impact than that of any one person. We can't do +it without **you**! -* **Err on the side of caution when marking things Ready For Check-in** +Be cautious when marking things "Ready For Check-in" +---------------------------------------------------- - If you're really not certain if a ticket is ready, don't mark it as - such. Leave a comment instead, letting others know your thoughts. If you're - mostly certain, but not completely certain, you might also try asking on IRC - to see if someone else can confirm your suspicions. +If you're really not certain if a ticket is ready, don't mark it as such. Leave +a comment instead, letting others know your thoughts. If you're mostly certain, +but not completely certain, you might also try asking on the +``#contributing-getting-started`` channel in the `Django Discord server`_ to +see if someone else can confirm your suspicions. -* **Wait for feedback, and respond to feedback that you receive** +.. _`Django Discord server`: https://chat.djangoproject.com - Focus on one or two tickets, see them through from start to finish, and - repeat. The shotgun approach of taking on lots of tickets and letting some - fall by the wayside ends up doing more harm than good. +Wait for feedback, and respond to feedback that you receive +----------------------------------------------------------- -* **Be rigorous** +Focus on one or two tickets, see them through from start to finish, and repeat. +The shotgun approach of taking on lots of tickets and letting some fall by the +wayside ends up doing more harm than good. - When we say ":pep:`8`, and must have docs and tests", we mean it. If a patch - doesn't have docs and tests, there had better be a good reason. Arguments - like "I couldn't find any existing tests of this feature" don't carry much - weight--while it may be true, that means you have the extra-important job of - writing the very first tests for that feature, not that you get a pass from - writing tests altogether. +Be rigorous +----------- -.. _easy pickings: https://code.djangoproject.com/query?status=!closed&easy=1 +When we say ":pep:`8`, and must have docs and tests", we mean it. If a patch +doesn't have docs and tests, there had better be a good reason. Arguments like +"I couldn't find any existing tests of this feature" don't carry much weight. +While it may be true, that means you have the extra-important job of writing +the very first tests for that feature, not that you get a pass from writing +tests altogether. -.. _new-contributors-faq: +Be patient +---------- -FAQ -=== +It's not always easy for your ticket or your patch to be reviewed quickly. This +isn't personal. There are a lot of tickets and pull requests to get through. -1. **This ticket I care about has been ignored for days/weeks/months! What can - I do to get it committed?** +Keeping your patch up to date is important. Review the ticket on Trac to ensure +that the *Needs tests*, *Needs documentation*, and *Patch needs improvement* +flags are unchecked once you've addressed all review comments. - First off, it's not personal. Django is entirely developed by volunteers - (except the Django fellow), and sometimes folks just don't have time. The - best thing to do is to send a gentle reminder to the |django-developers| - mailing list asking for review on the ticket, or to bring it up in the - ``#django-dev`` IRC channel. +Remember that Django has an eight-month release cycle, so there's plenty of +time for your patch to be reviewed. -2. **I'm sure my ticket is absolutely 100% perfect, can I mark it as RFC - myself?** +Finally, a well-timed reminder can help. See :ref:`contributing code FAQ +` for ideas here. - Short answer: No. It's always better to get another set of eyes on a - ticket. If you're having trouble getting that second set of eyes, see - question 1, above. +.. _easy pickings: https://code.djangoproject.com/query?status=!closed&easy=1 diff --git a/docs/internals/contributing/triaging-tickets.txt b/docs/internals/contributing/triaging-tickets.txt index 950c03e4f48e..ba5ab690c00f 100644 --- a/docs/internals/contributing/triaging-tickets.txt +++ b/docs/internals/contributing/triaging-tickets.txt @@ -6,10 +6,10 @@ Django uses Trac_ for managing the work on the code base. Trac is a community-tended garden of the bugs people have found and the features people would like to see added. As in any garden, sometimes there are weeds to be pulled and sometimes there are flowers and vegetables that need picking. We need -your help to sort out one from the other, and in the end we all benefit +your help to sort out one from the other, and in the end, we all benefit together. -Like all gardens, we can aspire to perfection but in reality there's no such +Like all gardens, we can aspire to perfection, but in reality there's no such thing. Even in the most pristine garden there are still snails and insects. In a community garden there are also helpful people who -- with the best of intentions -- fertilize the weeds and poison the roses. It's the job of the @@ -24,7 +24,7 @@ mistakes. Trac is "mostly accurate", and we give allowances for the fact that sometimes it will be wrong. That's okay. We're perfectionists with deadlines. We rely on the community to keep participating, keep tickets as accurate as -possible, and raise issues for discussion on our mailing lists when there is +possible, and raise issues for discussion on the `Django Forum`_ when there is confusion or disagreement. Django is a community project, and every contribution helps. We can't do this @@ -35,8 +35,8 @@ Triage workflow Unfortunately, not all bug reports and feature requests in the ticket tracker provide all the :doc:`required details`. A number of -tickets have patches, but those patches don't meet all the requirements of a -:ref:`good patch`. +tickets have proposed solutions, but those don't necessarily meet all the +requirements :ref:`adhering to the guidelines for contributing `. One way to help out is to *triage* tickets that have been created by other users. @@ -49,14 +49,14 @@ attribute easily tells us what and who each ticket is waiting on. Since a picture is worth a thousand words, let's start there: .. image:: /internals/_images/triage_process.* - :height: 501 - :width: 400 + :height: 750 + :width: 600 :alt: Django's ticket triage workflow We've got two roles in this diagram: -* Committers: people with commit access who are responsible for making the - final decision to merge a patch. +* Mergers: people with commit access who are responsible for making the + final decision to merge a change. * Ticket triagers: anyone in the Django community who chooses to become involved in Django's development process. Our Trac installation @@ -84,7 +84,8 @@ By way of example, here we see the lifecycle of an average ticket: * Daisy reviews the pull request and marks the ticket as "Ready for checkin". -* Jacob, a committer, reviews the pull request and merges it. +* Jacob, a :ref:`merger `, reviews the pull request and merges + it. Some tickets require much less feedback than this, but then again some tickets require much much more. @@ -114,18 +115,18 @@ Beyond that there are several considerations: * **Accepted + No Flags** The ticket is valid, but no one has submitted a patch for it yet. Often this - means you could safely start writing a patch for it. This is generally more + means you could safely start writing a fix for it. This is generally more true for the case of accepted bugs than accepted features. A ticket for a bug that has been accepted means that the issue has been verified by at least one triager as a legitimate bug - and should probably be fixed if possible. An accepted new feature may only mean that one triager thought the feature would be good to have, but this alone does not represent a consensus view or imply with any certainty that a patch will be accepted for that feature. Seek more - feedback before writing an extensive patch if you are in doubt. + feedback before writing an extensive contribution if you are in doubt. * **Accepted + Has Patch** - The ticket is waiting for people to review the supplied patch. This means + The ticket is waiting for people to review the supplied solution. This means downloading the patch and trying it out, verifying that it contains tests and docs, running the test suite with the included patch, and leaving feedback on the ticket. @@ -142,16 +143,18 @@ Ready For Checkin The ticket was reviewed by any member of the community other than the person who supplied the patch and found to meet all the requirements for a -commit-ready patch. A committer now needs to give the patch a final -review prior to being committed. See the -:ref:`New contributors' FAQ` for "My ticket has been in -RFC forever! What should I do?" +commit-ready contribution. A :ref:`merger ` now needs to give +a final review prior to being committed. + +There are a lot of pull requests. It can take a while for your patch to get +reviewed. See the :ref:`contributing code FAQ` for some +ideas here. Someday/Maybe ------------- This stage isn't shown on the diagram. It's used sparingly to keep track of -high-level ideas or long term feature requests. +high-level ideas or long-term feature requests. These tickets are uncommon and overall less useful since they don't describe concrete actionable issues. They are enhancement requests that we might @@ -166,9 +169,9 @@ A number of flags, appearing as checkboxes in Trac, can be set on a ticket: Has patch --------- -This means the ticket has an associated -:doc:`patch`. These will be reviewed -to see if the patch is "good". +This means the ticket has an associated solution. These will be reviewed to +ensure they adhere to the :doc:`documented guidelines +`. The following three fields (Needs documentation, Needs tests, Patch needs improvement) apply only if a patch has been supplied. @@ -184,12 +187,12 @@ Needs tests ----------- This flags the patch as needing associated unit tests. Again, this -is a required part of a valid patch. +is a required part of a valid contribution. Patch needs improvement ----------------------- -This flag means that although the ticket *has* a patch, it's not quite +This flag means that although the ticket *has* a solution, it's not quite ready for checkin. This could mean the patch no longer applies cleanly, there is a flaw in the implementation, or that the code doesn't meet our standards. @@ -197,7 +200,7 @@ doesn't meet our standards. Easy pickings ------------- -Tickets that would require small, easy, patches. +Tickets that would require small, easy, changes. Type ---- @@ -224,7 +227,7 @@ easier to find. Severity -------- -The *severity* attribute is used to identify blockers, that is, issues which +The *severity* attribute is used to identify blockers, that is, issues that should get fixed before releasing the next version of Django. Typically those issues are bugs causing regressions from earlier versions or potentially causing severe data losses. This attribute is quite rarely used and the vast @@ -253,7 +256,7 @@ Keywords -------- With this field you may label a ticket with multiple keywords. This can be -useful, for example, to group several tickets of a same theme. Keywords can +useful, for example, to group several tickets on the same theme. Keywords can either be comma or space separated. Keyword search finds the keyword string anywhere in the keywords. For example, clicking on a ticket with the keyword "form" will yield similar tickets tagged with keywords containing strings such @@ -303,13 +306,13 @@ A ticket can be resolved in a number of ways: submit support queries as tickets). * wontfix - Used when a someone decides that the request isn't appropriate for + Used when someone decides that the request isn't appropriate for consideration in Django. Sometimes a ticket is closed as "wontfix" with a - request for the reporter to start a discussion on the |django-developers| - mailing list if they feel differently from the rationale provided by the - person who closed the ticket. Other times, a mailing list discussion - precedes the decision to close a ticket. Always use the mailing list to - get a consensus before reopening tickets closed as "wontfix". + request for the reporter to start a discussion on the `Django Forum`_ if + they feel differently from the rationale provided by the person who + closed the ticket. Other times, a discussion precedes the decision to + close a ticket. Always use the forum to get a consensus before reopening + tickets closed as "wontfix". * duplicate Used when another ticket covers the same issue. By closing duplicate @@ -329,7 +332,7 @@ If you believe that the ticket was closed in error -- because you're still having the issue, or it's popped up somewhere else, or the triagers have made a mistake -- please reopen the ticket and provide further information. Again, please do not reopen tickets that have been marked as "wontfix" and -bring the issue to |django-developers| instead. +bring the issue to the `Django Forum`_ instead. .. _how-can-i-help-with-triaging: @@ -350,7 +353,7 @@ Then, you can help out by: * Closing "Unreviewed" tickets as "needsinfo" when the description is too sparse to be actionable, or when they're feature requests requiring a - discussion on |django-developers|. + discussion on the `Django Forum`_. * Correcting the "Needs tests", "Needs documentation", or "Has patch" flags for tickets where they are incorrectly set. @@ -368,9 +371,9 @@ Then, you can help out by: reports about a particular part of Django, it may indicate we should consider refactoring that part of the code. If a trend is emerging, you should raise it for discussion (referencing the relevant tickets) - on |django-developers|. + on the `Django Forum`_. -* Verify if patches submitted by other users are correct. If they are correct +* Verify if solutions submitted by others are correct. If they are correct and also contain appropriate documentation and tests then move them to the "Ready for Checkin" stage. If they are not correct then leave a comment to explain why and set the corresponding flags ("Patch needs improvement", @@ -379,7 +382,7 @@ Then, you can help out by: .. note:: The `Reports page`_ contains links to many useful Trac queries, including - several that are useful for triaging tickets and reviewing patches as + several that are useful for triaging tickets and reviewing proposals as suggested above. You can also find more :doc:`new-contributors`. @@ -390,28 +393,27 @@ However, we do ask the following of all general community members working in the ticket database: * Please **don't** promote your own tickets to "Ready for checkin". You - may mark other people's tickets which you've reviewed as "Ready for + may mark other people's tickets that you've reviewed as "Ready for checkin", but you should get at minimum one other community member to review a patch that you submit. -* Please **don't** reverse a decision without posting a message to - |django-developers| to find consensus. +* Please **don't** reverse a decision without posting a message to the + `Django Forum`_ to find consensus. * If you're unsure if you should be making a change, don't make the change but instead leave a comment with your concerns on the ticket, - or post a message to |django-developers|. It's okay to be unsure, - but your input is still valuable. + or post a message to the `Django Forum`_. It's okay to be unsure, but your + input is still valuable. .. _Trac: https://code.djangoproject.com/ .. _`easy pickings`: https://code.djangoproject.com/query?status=!closed&easy=1 .. _`creating an account on Trac`: https://www.djangoproject.com/accounts/register/ .. _password reset page: https://www.djangoproject.com/accounts/password/reset/ +.. _Django Forum: https://forum.djangoproject.com/ Bisecting a regression ====================== -.. highlight:: console - A regression is a bug that's present in some newer version of Django but not in an older one. An extremely helpful piece of information is the commit that introduced the regression. Knowing the commit that caused the change in @@ -420,13 +422,17 @@ inadvertent side-effect. Here's how you can determine this. Begin by writing a regression test for Django's test suite for the issue. For example, we'll pretend we're debugging a regression in migrations. After you've -written the test and confirmed that it fails on the latest master, put it in a -separate file that you can run standalone. For our example, we'll pretend we -created ``tests/migrations/test_regression.py``, which can be run with:: +written the test and confirmed that it fails on the latest main branch, put it +in a separate file that you can run standalone. For our example, we'll pretend +we created ``tests/migrations/test_regression.py``, which can be run with: + +.. code-block:: shell $ ./runtests.py migrations.test_regression -Next, we mark the current point in history as being "bad" since the test fails:: +Next, we mark the current point in history as being "bad" since the test fails: + +.. code-block:: shell $ git bisect bad You need to start by "git bisect start" @@ -434,17 +440,21 @@ Next, we mark the current point in history as being "bad" since the test fails:: Now, we need to find a point in git history before the regression was introduced (i.e. a point where the test passes). Use something like -``git checkout HEAD~100`` to checkout an earlier revision (100 commits earlier, +``git checkout HEAD~100`` to check out an earlier revision (100 commits earlier, in this case). Check if the test fails. If so, mark that point as "bad" -(``git bisect bad``), then checkout an earlier revision and recheck. Once you -find a revision where your test passes, mark it as "good":: +(``git bisect bad``), then check out an earlier revision and recheck. Once you +find a revision where your test passes, mark it as "good": + +.. code-block:: shell $ git bisect good Bisecting: X revisions left to test after this (roughly Y steps) ... Now we're ready for the fun part: using ``git bisect run`` to automate the rest -of the process:: +of the process: + +.. code-block:: shell $ git bisect run tests/runtests.py migrations.test_regression diff --git a/docs/internals/contributing/writing-code/coding-style.txt b/docs/internals/contributing/writing-code/coding-style.txt index 6793dde79e6c..20605aef5684 100644 --- a/docs/internals/contributing/writing-code/coding-style.txt +++ b/docs/internals/contributing/writing-code/coding-style.txt @@ -4,53 +4,91 @@ Coding style Please follow these coding standards when writing code for inclusion in Django. +.. _coding-style-pre-commit: + +Pre-commit checks +================= + +`pre-commit `_ is a framework for managing pre-commit +hooks. These hooks help to identify simple issues before committing code for +review. By checking for these issues before code review it allows the reviewer +to focus on the change itself, and it can also help to reduce the number of CI +runs. + +To use the tool, first install ``pre-commit`` and then the git hooks: + +.. console:: + + $ python -m pip install pre-commit + $ pre-commit install + +On the first commit ``pre-commit`` will install the hooks, these are +installed in their own environments and will take a short while to +install on the first run. Subsequent checks will be significantly faster. +If an error is found an appropriate error message will be displayed. +If the error was with ``black`` or ``isort`` then the tool will go ahead and +fix them for you. Review the changes and re-stage for commit if you are happy +with them. + .. _coding-style-python: Python style ============ -* Please conform to the indentation style dictated in the ``.editorconfig`` - file. We recommend using a text editor with `EditorConfig`_ support to avoid - indentation and whitespace issues. The Python files use 4 spaces for - indentation and the HTML files use 2 spaces. +* All files should be formatted using the :pypi:`black` auto-formatter. This + will be run by ``pre-commit`` if that is configured. + +* The project repository includes an ``.editorconfig`` file. We recommend using + a text editor with `EditorConfig`_ support to avoid indentation and + whitespace issues. The Python files use 4 spaces for indentation and the HTML + files use 2 spaces. * Unless otherwise specified, follow :pep:`8`. - Use `flake8`_ to check for problems in this area. Note that our ``setup.cfg`` - file contains some excluded files (deprecated modules we don't care about - cleaning up and some third-party code that Django vendors) as well as some - excluded errors that we don't consider as gross violations. Remember that - :pep:`8` is only a guide, so respect the style of the surrounding code as a - primary goal. + Use :pypi:`flake8` to check for problems in this area. Note that our + ``.flake8`` file contains some excluded files (deprecated modules we don't + care about cleaning up and some third-party code that Django vendors) as well + as some excluded errors that we don't consider as gross violations. Remember + that :pep:`8` is only a guide, so respect the style of the surrounding code + as a primary goal. An exception to :pep:`8` is our rules on line lengths. Don't limit lines of code to 79 characters if it means the code looks significantly uglier or is - harder to read. We allow up to 119 characters as this is the width of GitHub - code review; anything longer requires horizontal scrolling which makes review - more difficult. This check is included when you run ``flake8``. Documentation, + harder to read. We allow up to 88 characters as this is the line length used + by ``black``. This check is included when you run ``flake8``. Documentation, comments, and docstrings should be wrapped at 79 characters, even though :pep:`8` suggests 72. -* Use four spaces for indentation. +* String variable interpolation may use + :py:ref:`%-formatting `, :py:ref:`f-strings + `, or :py:meth:`str.format` as appropriate, with the goal of + maximizing code readability. -* Use four space hanging indentation rather than vertical alignment:: + Final judgments of readability are left to the Merger's discretion. As a + guide, f-strings should use only plain variable and property access, with + prior local variable assignment for more complex cases:: - raise AttributeError( - 'Here is a multiline error message ' - 'shortened for clarity.' - ) + # Allowed + f"hello {user}" + f"hello {user.name}" + f"hello {self.user.name}" - Instead of:: + # Disallowed + f"hello {get_user()}" + f"you are {user.age * 365.25} days old" - raise AttributeError('Here is a multiline error message ' - 'shortened for clarity.') + # Allowed with local variable assignment + user = get_user() + f"hello {user}" + user_days_old = user.age * 365.25 + f"you are {user_days_old} days old" - This makes better use of space and avoids having to realign strings if the - length of the first line changes. + f-strings should not be used for any string that may require translation, + including error and logging messages. In general ``format()`` is more + verbose, so the other formatting methods are preferred. -* Use single quotes for strings, or a double quote if the string contains a - single quote. Don't waste time doing unrelated refactoring of existing code - to conform to this style. + Don't waste time doing unrelated refactoring of existing code to adjust the + formatting method. * Avoid use of "we" in comments, e.g. "Loop over" rather than "We loop over". @@ -94,15 +132,14 @@ Python style Imports ======= -* Use `isort `_ to automate - import sorting using the guidelines below. +* Use :pypi:`isort` to automate import sorting using the guidelines below. Quick start: .. console:: - $ python -m pip install isort - $ isort -rc . + $ python -m pip install "isort >= 5.1.0" + $ isort . This runs ``isort`` recursively from your current directory, modifying any files that don't conform to the guidelines. If you need to have imports out @@ -129,7 +166,7 @@ Imports For example (comments are for explanatory purposes only): .. code-block:: python - :caption: django/contrib/admin/example.py + :caption: ``django/contrib/admin/example.py`` # future from __future__ import unicode_literals @@ -144,7 +181,10 @@ Imports # Django from django.http import Http404 from django.http.response import ( - Http404, HttpResponse, HttpResponseNotAllowed, StreamingHttpResponse, + Http404, + HttpResponse, + HttpResponseNotAllowed, + StreamingHttpResponse, cookie, ) @@ -157,13 +197,13 @@ Imports except ImportError: yaml = None - CONSTANT = 'foo' + CONSTANT = "foo" - class Example: - # ... + class Example: ... -* Use convenience imports whenever available. For example, do this:: +* Use convenience imports whenever available. For example, do this + :: from django.views import View @@ -174,20 +214,149 @@ Imports Template style ============== -* In Django template code, put one (and only one) space between the curly - brackets and the tag contents. +Follow the below rules in Django template code. + +* ``{% extends %}`` should be the first non-comment line. + + Do this: + + .. code-block:: html+django + + {% extends "base.html" %} + + {% block content %} +

+ {{ pages.title }} +

+ {% endblock content %} + + Or this: + + .. code-block:: html+django + + {# This is a comment #} + {% extends "base.html" %} + + {% block content %} +

+ {{ pages.title }} +

+ {% endblock content %} + + Don't do this: + + .. code-block:: html+django + + {% load i18n %} + {% extends "base.html" %} + + {% block content %} +

+ {{ pages.title }} +

+ {% endblock content %} + +* Put exactly one space between ``{{``, variable contents, and ``}}``. + + Do this: + + .. code-block:: html+django + + {{ user }} + + Don't do this: + + .. code-block:: html+django + + {{user}} + +* In ``{% load ... %}``, list libraries in alphabetical order. Do this: .. code-block:: html+django - {{ foo }} + {% load i18n l10 tz %} Don't do this: .. code-block:: html+django - {{foo}} + {% load l10 i18n tz %} + +* Put exactly one space between ``{%``, tag contents, and ``%}``. + + Do this: + + .. code-block:: html+django + + {% load humanize %} + + Don't do this: + + .. code-block:: html+django + + {%load humanize%} + +* Put the ``{% block %}`` tag name in the ``{% endblock %}`` tag if it is not + on the same line. + + Do this: + + .. code-block:: html+django + + {% block header %} + + Code goes here + + {% endblock header %} + + Don't do this: + + .. code-block:: html+django + + {% block header %} + + Code goes here + + {% endblock %} + +* Inside curly braces, separate tokens by single spaces, except for around the + ``.`` for attribute access and the ``|`` for a filter. + + Do this: + + .. code-block:: html+django + + {% if user.name|lower == "admin" %} + + Don't do this: + + .. code-block:: html+django + + {% if user . name | lower == "admin" %} + + {{ user.name | upper }} + +* Within a template using ``{% extends %}``, avoid indenting top-level + ``{% block %}`` tags. + + Do this: + + .. code-block:: html+django + + {% extends "base.html" %} + + {% block content %} + + Don't do this: + + .. code-block:: html+django + + {% extends "base.html" %} + + {% block content %} + ... View style ========== @@ -197,13 +366,11 @@ View style Do this:: - def my_view(request, foo): - # ... + def my_view(request, foo): ... Don't do this:: - def my_view(req, foo): - # ... + def my_view(req, foo): ... Model style =========== @@ -233,21 +400,13 @@ Model style last_name = models.CharField(max_length=40) class Meta: - verbose_name_plural = 'people' + verbose_name_plural = "people" Don't do this:: - class Person(models.Model): - first_name = models.CharField(max_length=20) - last_name = models.CharField(max_length=40) - class Meta: - verbose_name_plural = 'people' - - Don't do this, either:: - class Person(models.Model): class Meta: - verbose_name_plural = 'people' + verbose_name_plural = "people" first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=40) @@ -258,22 +417,29 @@ Model style * All database fields * Custom manager attributes * ``class Meta`` - * ``def __str__()`` + * ``def __str__()`` and other Python magic methods * ``def save()`` * ``def get_absolute_url()`` * Any custom methods * If ``choices`` is defined for a given model field, define each choice as a - list of tuples, with an all-uppercase name as a class attribute on the model. + mapping, with an all-uppercase name as a class attribute on the model. Example:: class MyModel(models.Model): - DIRECTION_UP = 'U' - DIRECTION_DOWN = 'D' - DIRECTION_CHOICES = [ - (DIRECTION_UP, 'Up'), - (DIRECTION_DOWN, 'Down'), - ] + DIRECTION_UP = "U" + DIRECTION_DOWN = "D" + DIRECTION_CHOICES = { + DIRECTION_UP: "Up", + DIRECTION_DOWN: "Down", + } + + Alternatively, consider using :ref:`field-choices-enum-types`:: + + class MyModel(models.Model): + class Direction(models.TextChoices): + UP = "U", "Up" + DOWN = "D", "Down" Use of ``django.conf.settings`` =============================== @@ -288,7 +454,7 @@ as follows:: from django.conf import settings - settings.configure({}, SOME_SETTING='foo') + settings.configure({}, SOME_SETTING="foo") However, if any setting is accessed before the ``settings.configure`` line, this will not work. (Internally, ``settings`` is a ``LazyObject`` which @@ -318,8 +484,8 @@ Miscellaneous documentation
` for details. * Remove ``import`` statements that are no longer used when you change code. - `flake8`_ will identify these imports for you. If an unused import needs to - remain for backwards-compatibility, mark the end of with ``# NOQA`` to + :pypi:`flake8` will identify these imports for you. If an unused import needs + to remain for backwards-compatibility, mark the end of with ``# NOQA`` to silence the flake8 warning. * Systematically remove all trailing whitespaces from your code as those @@ -341,4 +507,3 @@ For details about the JavaScript code style used by Django, see :doc:`javascript`. .. _editorconfig: https://editorconfig.org/ -.. _flake8: https://pypi.org/project/flake8/ diff --git a/docs/internals/contributing/writing-code/index.txt b/docs/internals/contributing/writing-code/index.txt index 98e2b8dfa2f2..72cc26452460 100644 --- a/docs/internals/contributing/writing-code/index.txt +++ b/docs/internals/contributing/writing-code/index.txt @@ -1,16 +1,51 @@ -============ -Writing code -============ +================= +Contributing code +================= -So you'd like to write some code to improve Django. Awesome! Browse the -following sections to find out how to give your code patches the best -chances to be included in Django core: +So you'd like to write some code, documentation or tests to improve Django? +There are several ways you can help Django's development. + +Tutorials +========= + +The Django tutorial contains a whole section that walks you step-by-step +through the contributing code process. + +.. toctree:: + :maxdepth: 1 + + /intro/contributing + +How-to guides +============= + +If you already have some familiarity with the processes and principles, +our documentation also contains useful guidance on specific topics: + +.. toctree:: + :maxdepth: 1 + + How to submit a patch to Django for new and/or fixed behavior + How to write and run tests
+ How to run Django's unit tests + How to work with Git and GitHub + +Related topics +============== + +It's important to understand how we work and the conventions we adopt. .. toctree:: :maxdepth: 1 coding-style - unit-tests - submitting-patches - working-with-git javascript + ../committing-code + +We maintain a curated list of small issues suited to first-time or less +experienced contributors, using the "easy pickings" filter. These are strongly +recommended for those contributors looking to make a contribution. + +* Browse `easy pickings`_ tickets. + +.. _easy pickings: https://code.djangoproject.com/query?status=!closed&easy=1 diff --git a/docs/internals/contributing/writing-code/javascript.txt b/docs/internals/contributing/writing-code/javascript.txt index 8dbd6e34f54d..25165206f07c 100644 --- a/docs/internals/contributing/writing-code/javascript.txt +++ b/docs/internals/contributing/writing-code/javascript.txt @@ -1,6 +1,6 @@ -========== -JavaScript -========== +=============== +JavaScript code +=============== While most of Django core is Python, the ``admin`` and ``gis`` contrib apps contain JavaScript code. @@ -45,7 +45,7 @@ JavaScript tests ================ Django's JavaScript tests can be run in a browser or from the command line. -The tests are located in a top level ``js_tests`` directory. +The tests are located in a top level :source:`js_tests` directory. Writing tests ------------- @@ -56,13 +56,13 @@ Django's JavaScript tests use `QUnit`_. Here is an example test module: QUnit.module('magicTricks', { beforeEach: function() { - var $ = django.jQuery; + const $ = django.jQuery; $('#qunit-fixture').append(''); } }); QUnit.test('removeOnClick removes button on click', function(assert) { - var $ = django.jQuery; + const $ = django.jQuery; removeOnClick('.button'); assert.equal($('.button').length, 1); $('.button').click(); @@ -70,7 +70,7 @@ Django's JavaScript tests use `QUnit`_. Here is an example test module: }); QUnit.test('copyOnClick adds button on click', function(assert) { - var $ = django.jQuery; + const $ = django.jQuery; copyOnClick('.button'); assert.equal($('.button').length, 1); $('.button').click(); @@ -78,7 +78,7 @@ Django's JavaScript tests use `QUnit`_. Here is an example test module: }); -Please consult the QUnit documentation for information on the types of +Please consult the ``QUnit`` documentation for information on the types of `assertions supported by QUnit `_. Running tests @@ -89,7 +89,7 @@ The JavaScript tests may be run from a web browser or from the command line. Testing from a web browser ~~~~~~~~~~~~~~~~~~~~~~~~~~ -To run the tests from a web browser, open up ``js_tests/tests.html`` in your +To run the tests from a web browser, open up :source:`js_tests/tests.html` in your browser. To measure code coverage when running the tests, you need to view that file diff --git a/docs/internals/contributing/writing-code/submitting-patches.txt b/docs/internals/contributing/writing-code/submitting-patches.txt index 45b2b9bdc41f..424cc8b9440f 100644 --- a/docs/internals/contributing/writing-code/submitting-patches.txt +++ b/docs/internals/contributing/writing-code/submitting-patches.txt @@ -1,10 +1,12 @@ -================== -Submitting patches -================== +======================== +Submitting contributions +======================== + +We're always grateful for contributions to Django's code. Indeed, bug reports +with associated contributions will get fixed *far* more quickly than those +without a solution. -We're always grateful for patches to Django's code. Indeed, bug reports -with associated patches will get fixed *far* more quickly than those -without patches. +.. _trivial-change: Typo fixes and trivial documentation changes ============================================ @@ -45,16 +47,21 @@ and time availability), claim it by following these steps: any activity, it's probably safe to reassign it to yourself. * Log into your account, if you haven't already, by clicking "GitHub Login" - or "DjangoProject Login" in the upper left of the ticket page. + or "DjangoProject Login" in the upper left of the ticket page. Once logged + in, you can then click the "Modify Ticket" button near the bottom of the + page. -* Claim the ticket by clicking the "assign to myself" radio button under - "Action" near the bottom of the page, then click "Submit changes." +* Claim the ticket by clicking the "assign to" radio button in the "Action" + section. Your username will be filled in the text box by default. + +* Finally click the "Submit changes" button at the bottom to save. .. note:: The Django software foundation requests that anyone contributing more than - a trivial patch to Django sign and submit a `Contributor License - Agreement`_, this ensures that the Django Software Foundation has clear - license to all contributions allowing for a clear license for all users. + a :ref:`trivial change `, to Django sign and submit a + `Contributor License Agreement`_, this ensures that the Django Software + Foundation has clear license to all contributions allowing for a clear + license for all users. .. _Login using your GitHub account: https://code.djangoproject.com/github/login .. _Create an account: https://www.djangoproject.com/accounts/register/ @@ -86,35 +93,32 @@ Going through the steps of claiming tickets is overkill in some cases. In the case of small changes, such as typos in the documentation or small bugs that will only take a few minutes to fix, you don't need to jump through the -hoops of claiming tickets. Submit your patch directly and you're done! +hoops of claiming tickets. Submit your changes directly and you're done! It is *always* acceptable, regardless whether someone has claimed it or not, to -submit patches to a ticket if you happen to have a patch ready. +link proposals to a ticket if you happen to have the changes ready. .. _patch-style: -Patch style -=========== +Contribution style +================== Make sure that any contribution you do fulfills at least the following requirements: * The code required to fix a problem or add a feature is an essential part - of a patch, but it is not the only part. A good patch should also include a + of a solution, but it is not the only part. A good fix should also include a :doc:`regression test ` to validate the behavior that has been fixed and to prevent the problem from arising again. Also, if some tickets are relevant to the code that you've written, mention the ticket numbers in some comments in the test so that one can easily trace back the relevant discussions after your patch gets committed, and the tickets get closed. -* If the code associated with a patch adds a new feature, or modifies - behavior of an existing feature, the patch should also contain - documentation. +* If the code adds a new feature, or modifies the behavior of an existing + feature, the change should also contain documentation. When you think your work is ready to be reviewed, send :doc:`a GitHub pull -request `. Please review the patch yourself using our -:ref:`patch review checklist ` first. - +request `. If you can't send a pull request for some reason, you can also use patches in Trac. When using this style, follow these guidelines. @@ -129,7 +133,7 @@ Trac. When using this style, follow these guidelines. Regardless of the way you submit your work, follow these steps. -* Make sure your code fulfills the requirements in our :ref:`patch review +* Make sure your code fulfills the requirements in our :ref:`contribution checklist `. * Check the "Has patch" box on the ticket and make sure the "Needs @@ -140,17 +144,61 @@ Regardless of the way you submit your work, follow these steps. .. _ticket tracker: https://code.djangoproject.com/ .. _Development dashboard: https://dashboard.djangoproject.com/ -Non-trivial patches -=================== +Contributions which require community feedback +============================================== + +A wider community discussion is required when a patch introduces new Django +functionality and makes some sort of design decision. This is especially +important if the approach involves a :ref:`deprecation ` +or introduces breaking changes. + +The following are different approaches for gaining feedback from the community. + +The Django Forum +---------------- + +You can propose a change on the `Django Forum`_. You should explain the need +for the change, go into details of the approach and discuss alternatives. -A "non-trivial" patch is one that is more than a small bug fix. It's a patch -that introduces Django functionality and makes some sort of design decision. +Please include a link to such discussions in your contributions. -If you provide a non-trivial patch, include evidence that alternatives have -been discussed on |django-developers|. +Third party package +------------------- -If you're not sure whether your patch should be considered non-trivial, ask on -the ticket for opinions. +Django does not accept experimental features. All features must follow our +:ref:`deprecation policy `. Hence, it can +take months or years for Django to iterate on an API design. + +If you need user feedback on a public interface, it is better to create a +third-party package first. You can iterate on the public API much faster, while +also validating the need for the feature. + +Once this package becomes stable and there are clear benefits of incorporating +aspects into Django core, starting a discussion on the `Django Forum`_ would be +the next step. + +Django Enhancement Proposal (DEP) +--------------------------------- + +Similar to Python’s PEPs, Django has `Django Enhancement Proposals`_ or DEPs. A +DEP is a design document which provides information to the Django community, or +describes a new feature or process for Django. They provide concise technical +specifications of features, along with rationales. DEPs are also the primary +mechanism for proposing and collecting community input on major new features. + +Before considering writing a DEP, it is recommended to first open a discussion +on the `Django Forum`_. This allows the community to provide feedback and helps +refine the proposal. Once the DEP is ready the :ref:`Steering Council +` votes on whether to accept it. + +Some examples of DEPs that have been approved and fully implemented: + +* `DEP 181: ORM Expressions `_ +* `DEP 182: Multiple Template Engines `_ +* `DEP 201: Simplified routing syntax `_ + +.. _Django Forum: https://forum.djangoproject.com/ +.. _Django Enhancement Proposals: https://github.com/django/deps .. _deprecating-a-feature: @@ -186,27 +234,55 @@ level: from django.test import ignore_warnings from django.utils.deprecation import RemovedInDjangoXXWarning + @ignore_warnings(category=RemovedInDjangoXXWarning) - def test_foo(self): - ... + def test_foo(self): ... #) For an entire test case:: from django.test import ignore_warnings from django.utils.deprecation import RemovedInDjangoXXWarning + @ignore_warnings(category=RemovedInDjangoXXWarning) - class MyDeprecatedTests(unittest.TestCase): - ... + class MyDeprecatedTests(unittest.TestCase): ... -You can also add a test for the deprecation warning:: +You should also add a test for the deprecation warning:: from django.utils.deprecation import RemovedInDjangoXXWarning + def test_foo_deprecation_warning(self): - msg = 'Expected deprecation message' - with self.assertWarnsMessage(RemovedInDjangoXXWarning, msg): + msg = "Expected deprecation message" + with self.assertWarnsMessage(RemovedInDjangoXXWarning, msg) as ctx: # invoke deprecated behavior + ... + self.assertEqual(ctx.filename, __file__) + +It's important to include a ``RemovedInDjangoXXWarning`` comment above code +which has no warning reference, but will need to be changed or removed when the +deprecation ends. This could include hooks which have been added to keep the +previous behavior, or standalone items that are unnecessary or unused when the +deprecation ends. For example:: + + import warnings + from django.utils.deprecation import RemovedInDjangoXXWarning + + + # RemovedInDjangoXXWarning. + def old_private_helper(): + # Helper function that is only used in foo(). + pass + + + def foo(): + warnings.warn( + "foo() is deprecated.", + category=RemovedInDjangoXXWarning, + stacklevel=2, + ) + old_private_helper() + ... Finally, there are a couple of updates to Django's documentation to make: @@ -225,32 +301,57 @@ Once you have completed these steps, you are finished with the deprecation. In each :term:`feature release `, all ``RemovedInDjangoXXWarning``\s matching the new version are removed. -JavaScript patches -================== +JavaScript contributions +======================== -For information on JavaScript patches, see the :ref:`javascript-patches` +For information on JavaScript contributions, see the :ref:`javascript-patches` documentation. +Optimization patches +==================== + +Patches aiming to deliver a performance improvement should provide benchmarks +showing the before and after impact of the patch and sharing the commands for +reviewers to reproduce. + +.. _django-asv-benchmarks: + +``django-asv`` benchmarks +------------------------- + +`django-asv`_ monitors the performance of Django code over time. These +benchmarks can be run on a pull request by labeling the pull request with +``benchmark``. Adding to these benchmarks is highly encouraged. + +.. _django-asv: https://github.com/django/django-asv/ + .. _patch-review-checklist: -Patch review checklist +Contribution checklist ====================== -Use this checklist to review a pull request. If you are reviewing a pull -request that is not your own and it passes all the criteria below, please set -the "Triage Stage" on the corresponding Trac ticket to "Ready for checkin". +Use this checklist to review a pull request. If this contribution would not be +:ref:`considered trivial `, first ensure it has an accepted +ticket before proceeding with the review. + +If the pull request passes all the criteria below and is not your own, please +set the "Triage Stage" on the corresponding Trac ticket to "Ready for checkin". If you've left comments for improvement on the pull request, please tick the appropriate flags on the Trac ticket based on the results of your review: "Patch needs improvement", "Needs documentation", and/or "Needs tests". As time -and interest permits, committers do final reviews of "Ready for checkin" -tickets and will either commit the patch or bump it back to "Accepted" if -further works need to be done. If you're looking to become a committer, -doing thorough reviews of patches is a great way to earn trust. +and interest permits, mergers do final reviews of "Ready for checkin" tickets +and will either commit the changes or bump it back to "Accepted" if further +work needs to be done. + +If you're looking to become a member of the `triage & review team +`_, doing +thorough reviews of contributions is a great way to earn trust. Looking for a patch to review? Check out the "Patches needing review" section of the `Django Development Dashboard `_. -Looking to get your patch reviewed? Ensure the Trac flags on the ticket are -set so that the ticket appears in that queue. + +Looking to get your pull request reviewed? Ensure the Trac flags on the ticket +are set so that the ticket appears in that queue. Documentation ------------- @@ -268,8 +369,8 @@ Bugs is applied)? * If it's a bug that :ref:`qualifies for a backport ` to the stable version of Django, is there a release note in - ``docs/releases/A.B.C.txt``? Bug fixes that will be applied only to the - master branch don't need a release note. + ``docs/releases/A.B.C.txt``? Bug fixes that will be applied only to the main + branch don't need a release note. New Features ------------ @@ -290,7 +391,9 @@ All code changes * Does the :doc:`coding style ` conform to our - guidelines? Are there any ``flake8`` errors? + guidelines? Are there any ``black``, ``blacken-docs``, ``flake8``, or + ``isort`` errors? You can install the :ref:`pre-commit + ` hooks to automatically catch these errors. * If the change is backwards incompatible in any way, is there a note in the release notes (``docs/releases/A.B.txt``)? * Is Django's test suite passing? @@ -301,6 +404,8 @@ All tickets * Is the pull request a single squashed commit with a message that follows our :ref:`commit message format `? * Are you the patch author and a new contributor? Please add yourself to the - ``AUTHORS`` file and submit a `Contributor License Agreement`_. + :source:`AUTHORS` file and submit a `Contributor License Agreement`_. +* Does this have an accepted ticket on Trac? All contributions require a ticket + unless the :ref:`change is considered trivial `. .. _Contributor License Agreement: https://www.djangoproject.com/foundation/cla/ diff --git a/docs/internals/contributing/writing-code/unit-tests.txt b/docs/internals/contributing/writing-code/unit-tests.txt index f8c1347abc54..489b651c4b62 100644 --- a/docs/internals/contributing/writing-code/unit-tests.txt +++ b/docs/internals/contributing/writing-code/unit-tests.txt @@ -36,7 +36,7 @@ Next, clone your fork, install some requirements, and run the tests: Installing the requirements will likely require some operating system packages that your computer doesn't have installed. You can usually figure out which -package to install by doing a Web search for the last line or so of the error +package to install by doing a web search for the last line or so of the error message. Try adding your operating system to the search query if needed. If you have trouble installing the requirements, you can skip that step. See @@ -55,10 +55,10 @@ Having problems? See :ref:`troubleshooting-unit-tests` for some common issues. Running tests using ``tox`` --------------------------- -`Tox `_ is a tool for running tests in different -virtual environments. Django includes a basic ``tox.ini`` that automates some -checks that our build server performs on pull requests. To run the unit tests -and other checks (such as :ref:`import sorting `, the +`Tox `_ is a tool for running tests in different virtual +environments. Django includes a basic ``tox.ini`` that automates some checks +that our build server performs on pull requests. To run the unit tests and +other checks (such as :ref:`import sorting `, the :ref:`documentation spelling checker `, and :ref:`code formatting `), install and run the ``tox`` command from any place in the Django source tree: @@ -69,18 +69,21 @@ command from any place in the Django source tree: $ tox By default, ``tox`` runs the test suite with the bundled test settings file for -SQLite, ``flake8``, ``isort``, and the documentation spelling checker. In -addition to the system dependencies noted elsewhere in this documentation, -the command ``python3`` must be on your path and linked to the appropriate -version of Python. A list of default environments can be seen as follows: +SQLite, ``black``, ``blacken-docs``, ``flake8``, ``isort``, and the +documentation spelling checker. In addition to the system dependencies noted +elsewhere in this documentation, the command ``python3`` must be on your path +and linked to the appropriate version of Python. A list of default environments +can be seen as follows: .. console:: $ tox -l py3 - flake8 + black + blacken-docs + flake8>=3.7.0 docs - isort + isort>=5.1.0 Testing other Python versions and database backends ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -89,14 +92,14 @@ In addition to the default environments, ``tox`` supports running unit tests for other versions of Python and other database backends. Since Django's test suite doesn't bundle a settings file for database backends other than SQLite, however, you must :ref:`create and provide your own test settings -`. For example, to run the tests on Python 3.7 +`. For example, to run the tests on Python 3.12 using PostgreSQL: .. console:: - $ tox -e py37-postgres -- --settings=my_postgres_settings + $ tox -e py312-postgres -- --settings=my_postgres_settings -This command sets up a Python 3.7 virtual environment, installs Django's +This command sets up a Python 3.12 virtual environment, installs Django's test suite dependencies (including those for PostgreSQL), and calls ``runtests.py`` with the supplied arguments (in this case, ``--settings=my_postgres_settings``). @@ -105,19 +108,20 @@ The remainder of this documentation shows commands for running tests without ``tox``, however, any option passed to ``runtests.py`` can also be passed to ``tox`` by prefixing the argument list with ``--``, as above. -Tox also respects the :envvar:`DJANGO_SETTINGS_MODULE` environment variable, if -set. For example, the following is equivalent to the command above: +``Tox`` also respects the :envvar:`DJANGO_SETTINGS_MODULE` environment +variable, if set. For example, the following is equivalent to the command +above: .. code-block:: console - $ DJANGO_SETTINGS_MODULE=my_postgres_settings tox -e py35-postgres + $ DJANGO_SETTINGS_MODULE=my_postgres_settings tox -e py312-postgres Windows users should use: .. code-block:: doscon ...\> set DJANGO_SETTINGS_MODULE=my_postgres_settings - ...\> tox -e py35-postgres + ...\> tox -e py312-postgres Running the JavaScript tests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -142,7 +146,7 @@ Running tests using ``django-docker-box`` supported databases and python versions. See the `django-docker-box`_ project page for installation and usage instructions. -.. _django-docker-box: https://github.com/django/django-docker-box +.. _django-docker-box: https://github.com/django/django-docker-box/ .. _running-unit-tests-settings: @@ -153,7 +157,10 @@ The included settings module (``tests/test_sqlite.py``) allows you to run the test suite using SQLite. If you want to run the tests using a different database, you'll need to define your own settings file. Some tests, such as those for ``contrib.postgres``, are specific to a particular database backend -and will be skipped if run with a different backend. +and will be skipped if run with a different backend. Some tests are skipped or +expected failures on a particular database backend (see +``DatabaseFeatures.django_test_skips`` and +``DatabaseFeatures.django_test_expected_failures`` on each backend). To run the tests with different settings, ensure that the module is on your :envvar:`PYTHONPATH` and pass the module with ``--settings``. @@ -240,11 +247,13 @@ Note that the ``--reverse`` option doesn't impact on ``--start-at`` or ``--start-after`` options. Moreover these options cannot be used with test labels. +.. _running-selenium-tests: + Running the Selenium tests -------------------------- -Some tests require Selenium and a Web browser. To run these tests, you must -install the selenium_ package and run the tests with the +Some tests require Selenium and a web browser. To run these tests, you must +install the :pypi:`selenium` package and run the tests with the ``--selenium=`` option. For example, if you have Firefox and Google Chrome installed: @@ -260,7 +269,34 @@ the tests that require selenium. Some browsers (e.g. Chrome or Firefox) support headless testing, which can be faster and more stable. Add the ``--headless`` option to enable this mode. -.. _selenium.webdriver: https://github.com/SeleniumHQ/selenium/tree/master/py/selenium/webdriver +.. _selenium.webdriver: https://github.com/SeleniumHQ/selenium/tree/trunk/py/selenium/webdriver + +For testing changes to the admin UI, the selenium tests can be run with the +``--screenshots`` option enabled. Screenshots will be saved to the +``tests/screenshots/`` directory. + +To define when screenshots should be taken during a selenium test, the test +class must use the ``@django.test.selenium.screenshot_cases`` decorator with a +list of supported screenshot types (``"desktop_size"``, ``"mobile_size"``, +``"small_screen_size"``, ``"rtl"``, ``"dark"``, and ``"high_contrast"``). It +can then call ``self.take_screenshot("unique-screenshot-name")`` at the desired +point to generate the screenshots. For example:: + + from django.test.selenium import SeleniumTestCase, screenshot_cases + from django.urls import reverse + + + class SeleniumTests(SeleniumTestCase): + @screenshot_cases(["desktop_size", "mobile_size", "rtl", "dark", "high_contrast"]) + def test_login_button_centered(self): + self.selenium.get(self.live_server_url + reverse("admin:login")) + self.take_screenshot("login") + ... + +This generates multiple screenshots of the login page - one for a desktop +screen, one for a mobile screen, one for right-to-left languages on desktop, +one for the dark mode on desktop, and one for high contrast mode on desktop +when using chrome. .. _running-unit-tests-dependencies: @@ -270,25 +306,30 @@ Running all the tests If you want to run the full suite of tests, you'll need to install a number of dependencies: -* argon2-cffi_ 19.1.0+ -* asgiref_ 3.2+ (required) -* bcrypt_ -* docutils_ -* geoip2_ -* jinja2_ 2.7+ -* numpy_ -* Pillow_ 6.2.0+ -* PyYAML_ -* pytz_ (required) -* pywatchman_ -* setuptools_ -* memcached_, plus a :ref:`supported Python binding ` -* gettext_ (:ref:`gettext_on_windows`) -* selenium_ -* sqlparse_ 0.2.2+ (required) -* tblib_ 1.5.0+ - -You can find these dependencies in `pip requirements files`_ inside the +* :pypi:`aiosmtpd` 1.4.5+ +* :pypi:`argon2-cffi` 23.1.0+ +* :pypi:`asgiref` 3.8.1+ (required) +* :pypi:`bcrypt` 4.1.1+ +* :pypi:`colorama` 0.4.6+ +* :pypi:`docutils` 0.19+ +* :pypi:`geoip2` 4.8.0+ +* :pypi:`Jinja2` 2.11+ +* :pypi:`numpy` 1.26.0+ +* :pypi:`Pillow` 10.1.0+ +* :pypi:`PyYAML` 6.0.2+ +* :pypi:`pywatchman` +* :pypi:`redis` 5.1.0+ +* :pypi:`setuptools` +* :pypi:`pymemcache`, plus a `supported Python binding + `_ +* `gettext `_ + (:ref:`gettext_on_windows`) +* :pypi:`selenium` 4.23.0+ +* :pypi:`sqlparse` 0.5.0+ (required) +* :pypi:`tblib` 3.0.0+ + +You can find these dependencies in `pip requirements files +`_ inside the ``tests/requirements`` directory of the Django source tree and install them like so: @@ -298,43 +339,24 @@ like so: If you encounter an error during the installation, your system might be missing a dependency for one or more of the Python packages. Consult the failing -package's documentation or search the Web with the error message that you +package's documentation or search the web with the error message that you encounter. You can also install the database adapter(s) of your choice using ``oracle.txt``, ``mysql.txt``, or ``postgres.txt``. -If you want to test the memcached cache backend, you'll also need to define -a :setting:`CACHES` setting that points at your memcached instance. +If you want to test the memcached or Redis cache backends, you'll also need to +define a :setting:`CACHES` setting that points at your memcached or Redis +instance respectively. -To run the GeoDjango tests, you will need to :doc:`setup a spatial database +To run the GeoDjango tests, you will need to :doc:`set up a spatial database and install the Geospatial libraries`. Each of these dependencies is optional. If you're missing any of them, the associated tests will be skipped. -To run some of the autoreload tests, you'll need to install the Watchman_ -service. - -.. _argon2-cffi: https://pypi.org/project/argon2_cffi/ -.. _asgiref: https://pypi.org/project/asgiref/ -.. _bcrypt: https://pypi.org/project/bcrypt/ -.. _docutils: https://pypi.org/project/docutils/ -.. _geoip2: https://pypi.org/project/geoip2/ -.. _jinja2: https://pypi.org/project/jinja2/ -.. _numpy: https://pypi.org/project/numpy/ -.. _Pillow: https://pypi.org/project/Pillow/ -.. _PyYAML: https://pyyaml.org/wiki/PyYAML -.. _pytz: https://pypi.org/project/pytz/ -.. _pywatchman: https://pypi.org/project/pywatchman/ -.. _setuptools: https://pypi.org/project/setuptools/ -.. _memcached: https://memcached.org/ -.. _gettext: https://www.gnu.org/software/gettext/manual/gettext.html -.. _selenium: https://pypi.org/project/selenium/ -.. _sqlparse: https://pypi.org/project/sqlparse/ -.. _pip requirements files: https://pip.pypa.io/en/latest/user_guide/#requirements-files -.. _tblib: https://pypi.org/project/tblib/ -.. _Watchman: https://facebook.github.io/watchman/ +To run some of the autoreload tests, you'll need to install the +`Watchman `_ service. Code coverage ------------- @@ -343,14 +365,19 @@ Contributors are encouraged to run coverage on the test suite to identify areas that need additional tests. The coverage tool installation and use is described in :ref:`testing code coverage`. -Coverage should be run in a single process to obtain accurate statistics. To -run coverage on the Django test suite using the standard test settings: +To run coverage on the Django test suite using the standard test settings: .. console:: - $ coverage run ./runtests.py --settings=test_sqlite --parallel=1 + $ coverage run ./runtests.py --settings=test_sqlite -After running coverage, generate the html report by running: +After running coverage, combine all coverage statistics by running: + +.. console:: + + $ coverage combine + +After that generate the html report by running: .. console:: @@ -366,30 +393,34 @@ and also excludes several directories not relevant to the results Contrib apps ============ -Tests for contrib apps can be found in the ``tests/`` directory, typically +Tests for contrib apps can be found in the :source:`tests/` directory, typically under ``_tests``. For example, tests for ``contrib.auth`` are located -in ``tests/auth_tests``. +in :source:`tests/auth_tests`. .. _troubleshooting-unit-tests: Troubleshooting =============== -Test suite hangs or shows failures on ``master`` branch -------------------------------------------------------- +Test suite hangs or shows failures on ``main`` branch +----------------------------------------------------- Ensure you have the latest point release of a :ref:`supported Python version `, since there are often bugs in earlier versions that may cause the test suite to fail or hang. On **macOS** (High Sierra and newer versions), you might see this message -logged, after which the tests hang:: +logged, after which the tests hang: + +.. code-block:: pytb objc[42074]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. To avoid this set a ``OBJC_DISABLE_INITIALIZE_FORK_SAFETY`` environment -variable, for example:: +variable, for example: + +.. code-block:: shell $ OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES ./runtests.py @@ -465,12 +496,13 @@ the first one: $ ./runtests.py --pair basic.tests.ModelTest.test_eq queries transactions -You can also try running any set of tests in reverse using the ``--reverse`` -option in order to verify that executing tests in a different order does not -cause any trouble: +You can also try running any set of tests in a random or reverse order using +the ``--shuffle`` and ``--reverse`` options. This can help verify that +executing tests in a different order does not cause any trouble: .. console:: + $ ./runtests.py basic --shuffle $ ./runtests.py basic --reverse Seeing the SQL queries run during a test @@ -501,42 +533,25 @@ this purpose. Tips for writing tests ====================== -.. highlight:: python - Isolating model registration ---------------------------- To avoid polluting the global :attr:`~django.apps.apps` registry and prevent unnecessary table creation, models defined in a test method should be bound to -a temporary ``Apps`` instance:: - - from django.apps.registry import Apps - from django.db import models - from django.test import SimpleTestCase - - class TestModelDefinition(SimpleTestCase): - def test_model_definition(self): - test_apps = Apps(['app_label']) - - class TestModel(models.Model): - class Meta: - apps = test_apps - ... - -.. function:: django.test.utils.isolate_apps(*app_labels, attr_name=None, kwarg_name=None) - -Since this pattern involves a lot of boilerplate, Django provides the -:func:`~django.test.utils.isolate_apps` decorator. It's used like this:: +a temporary ``Apps`` instance. To do this, use the +:func:`~django.test.utils.isolate_apps` decorator:: from django.db import models from django.test import SimpleTestCase from django.test.utils import isolate_apps + class TestModelDefinition(SimpleTestCase): - @isolate_apps('app_label') + @isolate_apps("app_label") def test_model_definition(self): class TestModel(models.Model): pass + ... .. admonition:: Setting ``app_label`` @@ -550,14 +565,15 @@ Since this pattern involves a lot of boilerplate, Django provides the installed, you should pass the set of targeted ``app_label`` as arguments: .. code-block:: python - :caption: tests/app_label/tests.py + :caption: ``tests/app_label/tests.py`` from django.db import models from django.test import SimpleTestCase from django.test.utils import isolate_apps + class TestModelDefinition(SimpleTestCase): - @isolate_apps('app_label', 'other_app_label') + @isolate_apps("app_label", "other_app_label") def test_model_definition(self): # This model automatically receives app_label='app_label' class TestModel(models.Model): @@ -565,47 +581,6 @@ Since this pattern involves a lot of boilerplate, Django provides the class OtherAppModel(models.Model): class Meta: - app_label = 'other_app_label' - ... + app_label = "other_app_label" -The decorator can also be applied to classes:: - - from django.db import models - from django.test import SimpleTestCase - from django.test.utils import isolate_apps - - @isolate_apps('app_label') - class TestModelDefinition(SimpleTestCase): - def test_model_definition(self): - class TestModel(models.Model): - pass - ... - -The temporary ``Apps`` instance used to isolate model registration can be -retrieved as an attribute when used as a class decorator by using the -``attr_name`` parameter:: - - from django.db import models - from django.test import SimpleTestCase - from django.test.utils import isolate_apps - - @isolate_apps('app_label', attr_name='apps') - class TestModelDefinition(SimpleTestCase): - def test_model_definition(self): - class TestModel(models.Model): - pass - self.assertIs(self.apps.get_model('app_label', 'TestModel'), TestModel) - -Or as an argument on the test method when used as a method decorator by using -the ``kwarg_name`` parameter:: - - from django.db import models - from django.test import SimpleTestCase - from django.test.utils import isolate_apps - - class TestModelDefinition(SimpleTestCase): - @isolate_apps('app_label', kwarg_name='apps') - def test_model_definition(self, apps): - class TestModel(models.Model): - pass - self.assertIs(apps.get_model('app_label', 'TestModel'), TestModel) + ... diff --git a/docs/internals/contributing/writing-code/working-with-git.txt b/docs/internals/contributing/writing-code/working-with-git.txt index 639f7719b86d..579543f8767f 100644 --- a/docs/internals/contributing/writing-code/working-with-git.txt +++ b/docs/internals/contributing/writing-code/working-with-git.txt @@ -3,8 +3,8 @@ Working with Git and GitHub =========================== This section explains how the community can contribute code to Django via pull -requests. If you're interested in how committers handle them, see -:doc:`../committing-code`. +requests. If you're interested in how :ref:`mergers ` handle +them, see :doc:`../committing-code`. Below, we are going to show how to create a GitHub pull request containing the changes for Trac ticket #xxxxx. By creating a fully-ready pull request, you @@ -24,8 +24,10 @@ your operating system's package manager. Django's `Git repository`_ is hosted on `GitHub`_, and it is recommended that you also work using GitHub. -After installing Git, the first thing you should do is setup your name and -email:: +After installing Git, the first thing you should do is set up your name and +email: + +.. code-block:: shell $ git config --global user.name "Your Real Name" $ git config --global user.email "you@email.com" @@ -43,62 +45,80 @@ Setting up local repository When you have created your GitHub account, with the nick "GitHub_nick", and `forked Django's repository `__, -create a local copy of your fork:: +create a local copy of your fork: + +.. code-block:: shell git clone https://github.com/GitHub_nick/django.git This will create a new directory "django", containing a clone of your GitHub repository. The rest of the git commands on this page need to be run within the -cloned directory, so switch to it now:: +cloned directory, so switch to it now: + +.. code-block:: shell cd django Your GitHub repository will be called "origin" in Git. -You should also setup ``django/django`` as an "upstream" remote (that is, tell -git that the reference Django repository was the source of your fork of it):: +You should also set up ``django/django`` as an "upstream" remote (that is, tell +git that the reference Django repository was the source of your fork of it): - git remote add upstream git@github.com:django/django.git +.. code-block:: shell + + git remote add upstream https://github.com/django/django.git git fetch upstream -You can add other remotes similarly, for example:: +You can add other remotes similarly, for example: + +.. code-block:: shell - git remote add akaariai git@github.com:akaariai/django.git + git remote add akaariai https://github.com/akaariai/django.git Working on a ticket =================== When working on a ticket, create a new branch for the work, and base that work -on upstream/master:: +on ``upstream/main``: - git checkout -b ticket_xxxxx upstream/master +.. code-block:: shell + + git checkout -b ticket_xxxxx upstream/main The -b flag creates a new branch for you locally. Don't hesitate to create new branches even for the smallest things - that's what they are there for. -If instead you were working for a fix on the 1.4 branch, you would do:: +If instead you were working for a fix on the 1.4 branch, you would do: + +.. code-block:: shell git checkout -b ticket_xxxxx_1_4 upstream/stable/1.4.x Assume the work is carried on the ticket_xxxxx branch. Make some changes and -commit them:: +commit them: + +.. code-block:: shell git commit When writing the commit message, follow the :ref:`commit message -guidelines ` to ease the work of the committer. If -you're uncomfortable with English, try at least to describe precisely what the -commit does. +guidelines ` to ease the work of the merger. If you're +uncomfortable with English, try at least to describe precisely what the commit +does. If you need to do additional work on your branch, commit as often as -necessary:: +necessary: + +.. code-block:: shell git commit -m 'Added two more tests for edge cases' Publishing work --------------- -You can publish your work on GitHub by running:: +You can publish your work on GitHub by running: + +.. code-block:: shell git push origin ticket_xxxxx @@ -115,7 +135,7 @@ their clone would become corrupt when you edit commits. There are also "public branches". These are branches other people are supposed to fork, so the history of these branches should never change. Good examples -of public branches are the ``master`` and ``stable/A.B.x`` branches in the +of public branches are the ``main`` and ``stable/A.B.x`` branches in the ``django/django`` repository. When you think your work is ready to be pulled into Django, you should create @@ -138,11 +158,10 @@ related Trac ticket explaining what you've done. In particular, you should note the environment in which you ran the tests, for instance: "all tests pass under SQLite and MySQL". -Pull requests at GitHub have only two states: open and closed. The committer -who will deal with your pull request has only two options: merge it or close -it. For this reason, it isn't useful to make a pull request until the code is -ready for merging -- or sufficiently close that a committer will finish it -himself. +Pull requests at GitHub have only two states: open and closed. The merger who +will deal with your pull request has only two options: merge it or close it. +For this reason, it isn't useful to make a pull request until the code is ready +for merging -- or sufficiently close that a merger will finish it themselves. Rebasing branches ----------------- @@ -155,7 +174,9 @@ repository. Your commit "Added two more tests" would be unhelpful noise. Instead, we would rather only have one commit containing all your work. To rework the history of your branch you can squash the commits into one by -using interactive rebase:: +using interactive rebase: + +.. code-block:: shell git rebase -i HEAD~2 @@ -168,7 +189,9 @@ the editor. A second editor window should open, so you can reword the commit message for the commit now that it includes both your steps. You can also use the "edit" option in rebase. This way you can change a single -commit, for example to fix a typo in a docstring:: +commit, for example to fix a typo in a docstring: + +.. code-block:: shell git rebase -i HEAD~3 # Choose edit, pick, pick for the commits @@ -181,7 +204,9 @@ commit, for example to fix a typo in a docstring:: If your topic branch is already published at GitHub, for example if you're making minor changes to take into account a review, you will need to force-push -the changes:: +the changes: + +.. code-block:: shell git push -f origin ticket_xxxxx @@ -194,13 +219,15 @@ After upstream has changed -------------------------- When upstream (``django/django``) has changed, you should rebase your work. To -do this, use:: +do this, use: + +.. code-block:: shell git fetch upstream - git rebase + git rebase upstream/main The work is automatically rebased using the branch you forked on, in the -example case using ``upstream/master``. +example case using ``upstream/main``. The rebase command removes all your local commits temporarily, applies the upstream commits, and then applies your local commits again on the work. @@ -226,12 +253,16 @@ easily check what changes you have done. In this case, do the changes required by the reviewer. Commit as often as necessary. Before publishing the changes, rebase your work. If you added two -commits, you would run:: +commits, you would run: + +.. code-block:: shell git rebase -i HEAD~2 Squash the second commit into the first. Write a commit message along the lines -of:: +of: + +.. code-block:: text Made changes asked in review by @@ -239,13 +270,15 @@ of:: - Reworded the docstring of bar() Finally, push your work back to your GitHub repository. Since you didn't touch -the public commits during the rebase, you should not need to force-push:: +the public commits during the rebase, you should not need to force-push: + +.. code-block:: shell git push origin ticket_xxxxx Your pull request should now contain the new commit too. -Note that the committer is likely to squash the review commit into the previous +Note that the merger is likely to squash the review commit into the previous commit when committing the code. Working on a patch @@ -253,17 +286,19 @@ Working on a patch One of the ways that developers can contribute to Django is by reviewing patches. Those patches will typically exist as pull requests on GitHub and -can be easily integrated into your local repository:: +can be easily integrated into your local repository: + +.. code-block:: shell - git checkout -b pull_xxxxx upstream/master - curl https://github.com/django/django/pull/xxxxx.patch | git am + git checkout -b pull_xxxxx upstream/main + curl -L https://github.com/django/django/pull/xxxxx.patch | git am This will create a new branch and then apply the changes from the pull request to it. At this point you can run the tests or do anything else you need to do to investigate the quality of the patch. For more detail on working with pull requests see the -:ref:`guidelines for committers `. +:ref:`guidelines for mergers `. Summary ======= diff --git a/docs/internals/contributing/writing-documentation.txt b/docs/internals/contributing/writing-documentation.txt index cad2b9975e73..10b7edbca85c 100644 --- a/docs/internals/contributing/writing-documentation.txt +++ b/docs/internals/contributing/writing-documentation.txt @@ -2,7 +2,7 @@ Writing documentation ===================== -We place a high importance on consistency and readability of documentation. +We place high importance on the consistency and readability of documentation. After all, Django was created in a journalism environment! So we treat our documentation like we treat our code: we aim to improve it as often as possible. @@ -18,26 +18,21 @@ Documentation changes generally come in two forms: This section explains how writers can craft their documentation changes in the most useful and least error-prone ways. -Getting the raw documentation -============================= +The Django documentation process +================================ Though Django's documentation is intended to be read as HTML at -https://docs.djangoproject.com/, we edit it as a collection of text files for -maximum flexibility. These files live in the top-level ``docs/`` directory of a -Django release. +https://docs.djangoproject.com/, we edit it as a collection of plain text files +written in the reStructuredText markup language for maximum flexibility. + +We work from the development version of the repository because it has the +latest-and-greatest documentation, just as it has the latest-and-greatest code. -If you'd like to start contributing to our docs, get the development version of -Django from the source code repository -(see :ref:`installing-development-version`). The development version has the -latest-and-greatest documentation, just as it has latest-and-greatest code. We also backport documentation fixes and improvements, at the discretion of the -committer, to the last release branch. That's because it's highly advantageous -to have the docs for the last release be up-to-date and correct (see +merger, to the last release branch. This is because it's advantageous to +have the docs for the last release be up-to-date and correct (see :ref:`differences-between-doc-versions`). -Getting started with Sphinx -=========================== - Django's documentation uses the Sphinx__ documentation system, which in turn is based on docutils__. The basic idea is that lightly-formatted plain-text documentation is transformed into HTML, PDF, and any other output format. @@ -45,25 +40,10 @@ documentation is transformed into HTML, PDF, and any other output format. __ https://www.sphinx-doc.org/ __ https://docutils.sourceforge.io/ -To build the documentation locally, install Sphinx: - -.. console:: - - $ python -m pip install Sphinx - -Then from the ``docs`` directory, build the HTML: - -.. console:: - - $ make html - -To get started contributing, you'll want to read the :ref:`reStructuredText -reference `. - -Your locally-built documentation will be themed differently than the -documentation at `docs.djangoproject.com `_. -This is OK! If your changes look good on your local machine, they'll look good -on the website. +Sphinx includes a ``sphinx-build`` command for turning reStructuredText into +other formats, e.g., HTML and PDF. This command is configurable, but the Django +documentation includes a ``Makefile`` that provides a shorter ``make html`` +command. How the documentation is organized ================================== @@ -80,7 +60,7 @@ The documentation is organized into several categories: understands what we're trying to achieve. Don't feel that you need to begin with explanations of how things work - what matters is what the reader does, not what you explain. It can be helpful to refer back to what you've done and - explain afterwards. + explain afterward. * :doc:`Topic guides
` aim to explain a concept or subject at a fairly high level. @@ -92,7 +72,7 @@ The documentation is organized into several categories: Providing background context helps a newcomer connect the topic to things that they already know. -* :doc:`Reference guides ` contain technical reference for APIs. +* :doc:`Reference guides ` contain technical references for APIs. They describe the functioning of Django's internal machinery and instruct in its use. @@ -116,11 +96,125 @@ The documentation is organized into several categories: hesitate to refer the reader back to the appropriate tutorial rather than repeat the same material. +How to start contributing documentation +======================================= + +Clone the Django repository to your local machine +------------------------------------------------- + +If you'd like to start contributing to our docs, get the development version of +Django from the source code repository (see +:ref:`installing-development-version`): + +.. console:: + + $ git clone https://github.com/django/django.git + +If you're planning to submit these changes, you might find it useful to make a +fork of the Django repository and clone this fork instead. + +Set up a virtual environment and install dependencies +----------------------------------------------------- + +Create and activate a virtual environment, then install the dependencies: + +.. code-block:: shell + + $ python -m venv .venv + $ source .venv/bin/activate + $ python -m pip install -r docs/requirements.txt + +Build the documentation locally +------------------------------- + +We can build HTML output from the ``docs`` directory: + +.. console:: + + $ cd docs + $ make html + +Your locally-built documentation will be accessible at +``_build/html/index.html`` and it can be viewed in any web browser, though it +will be themed differently than the documentation at +`docs.djangoproject.com `_. This is OK! If +your changes look good on your local machine, they'll look good on the website. + +Making edits to the documentation +--------------------------------- + +The source files are ``.txt`` files located in the ``docs/`` directory. + +These files are written in the reStructuredText markup language. To learn the +markup, see the :ref:`reStructuredText reference `. + +To edit this page, for example, we would edit the file +:source:`docs/internals/contributing/writing-documentation.txt` and rebuild the +HTML with ``make html``. + +.. _documentation-spelling-check: + +Spelling check +-------------- + +Before you commit your docs, it's a good idea to run the spelling checker. +You'll need to install :pypi:`sphinxcontrib-spelling` first. Then from the +``docs`` directory, run: + +.. console:: + + $ make spelling + +Wrong words (if any) along with the file and line number where they occur will +be saved to ``_build/spelling/output.txt``. + +If you encounter false-positives (error output that actually is correct), do +one of the following: + +* Surround inline code or brand/technology names with double grave accents + (``). +* Find synonyms that the spell checker recognizes. +* If, and only if, you are sure the word you are using is correct - add it + to ``docs/spelling_wordlist`` (please keep the list in alphabetical order). + +.. _documentation-link-check: + +Link check +---------- + +Links in documentation can become broken or changed such that they are no +longer the canonical link. Sphinx provides a builder that can check whether the +links in the documentation are working. From the ``docs`` directory, run: + +.. console:: + + $ make linkcheck + +Output is printed to the terminal, but can also be found in +``_build/linkcheck/output.txt`` and ``_build/linkcheck/output.json``. + +.. warning:: + + The execution of the command requires an internet connection and takes + several minutes to complete, because the command tests all the links + that are found in the documentation. + +Entries that have a status of "working" are fine, those that are "unchecked" or +"ignored" have been skipped because they either cannot be checked or have +matched ignore rules in the configuration. + +Entries that have a status of "broken" need to be fixed. Those that have a +status of "redirected" may need to be updated to point to the canonical +location, e.g. the scheme has changed ``http://`` → ``https://``. In certain +cases, we do not want to update a "redirected" link, e.g. a rewrite to always +point to the latest or stable version of the documentation, e.g. ``/en/stable/`` → +``/en/3.2/``. + Writing style ============= When using pronouns in reference to a hypothetical person, such as "a user with -a session cookie", gender neutral pronouns (they/their/them) should be used. +a session cookie", gender-neutral pronouns (they/their/them) should be used. Instead of: * he or she... use they. @@ -146,6 +240,9 @@ documentation: * **email** -- no hyphen. +* **HTTP** -- the expected pronunciation is "Aitch Tee Tee Pee" and therefore + should be preceded by "an" and not "a". + * **MySQL**, **PostgreSQL**, **SQLite** * **SQL** -- when referring to SQL, the expected pronunciation should be @@ -160,8 +257,7 @@ documentation: * **subclass** -- it's a single word without a hyphen, both as a verb ("subclass that model") and as a noun ("create a subclass"). -* **Web**, **World Wide Web**, **the Web** -- note Web is always - capitalized when referring to the World Wide Web. +* **the web**, **web framework** -- it's not capitalized. * **website** -- use one word, without capitalization. @@ -190,11 +286,15 @@ documentation: good reason. * The main thing to keep in mind as you write and edit docs is that the - more semantic markup you can add the better. So:: + more semantic markup you can add the better. So: + + .. code-block:: rst Add ``django.contrib.auth`` to your ``INSTALLED_APPS``... - Isn't nearly as helpful as:: + Isn't nearly as helpful as: + + .. code-block:: rst Add :mod:`django.contrib.auth` to your :setting:`INSTALLED_APPS`... @@ -205,6 +305,10 @@ documentation: "last bit" of that path. So ``:mod:`~django.contrib.auth``` will display a link with the title "auth". +* All Python code blocks should be formatted using the :pypi:`blacken-docs` + auto-formatter. This will be run by :ref:`pre-commit + ` if that is configured. + * Use :mod:`~sphinx.ext.intersphinx` to reference Python's and Sphinx' documentation. @@ -217,7 +321,9 @@ documentation: * To improve readability, use ``.. admonition:: Descriptive title`` rather than ``.. note::``. Use these boxes sparingly. -* Use these heading styles:: +* Use these heading styles: + + .. code-block:: rst === One @@ -235,8 +341,9 @@ documentation: Five ^^^^ -* Use :rst:role:`:rfc:` to reference RFC and try to link to the relevant - section if possible. For example, use ``:rfc:`2324#section-2.3.2``` or +* Use :rst:role:`:rfc:` to reference a Request for Comments (RFC) and + try to link to the relevant section if possible. For example, use + ``:rfc:`2324#section-2.3.2``` or ``:rfc:`Custom link text <2324#section-2.3.2>```. * Use :rst:role:`:pep:` to reference a Python Enhancement Proposal (PEP) @@ -250,50 +357,67 @@ documentation: also need to define a reference to the documentation for that environment variable using :rst:dir:`.. envvar:: `. +* Use :rst:role:`:cve:` to reference a Common Vulnerabilities and + Exposures (CVE) identifier. For example, use ``:cve:`2019-14232```. + Django-specific markup ====================== Besides :ref:`Sphinx's built-in markup `, Django's docs define some extra description units: -* Settings:: +* Settings: + + .. code-block:: rst .. setting:: INSTALLED_APPS To link to a setting, use ``:setting:`INSTALLED_APPS```. -* Template tags:: +* Template tags: + + .. code-block:: rst .. templatetag:: regroup To link, use ``:ttag:`regroup```. -* Template filters:: +* Template filters: + + .. code-block:: rst .. templatefilter:: linebreaksbr To link, use ``:tfilter:`linebreaksbr```. -* Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``):: +* Field lookups (i.e. ``Foo.objects.filter(bar__exact=whatever)``): + + .. code-block:: rst .. fieldlookup:: exact To link, use ``:lookup:`exact```. -* ``django-admin`` commands:: +* ``django-admin`` commands: + + .. code-block:: rst .. django-admin:: migrate To link, use ``:djadmin:`migrate```. -* ``django-admin`` command-line options:: +* ``django-admin`` command-line options: + + .. code-block:: rst .. django-admin-option:: --traceback To link, use ``:option:`command_name --traceback``` (or omit ``command_name`` for the options shared by all commands like ``--verbosity``). -* Links to Trac tickets (typically reserved for patch release notes):: +* Links to Trac tickets (typically reserved for patch release notes): + + .. code-block:: rst :ticket:`12345` @@ -302,7 +426,9 @@ command-line examples involving ``django-admin``, ``manage.py``, ``python``, etc.). In the HTML documentation, it renders a two-tab UI, with one tab showing a Unix-style command prompt and a second tab showing a Windows prompt. -For example, you can replace this fragment:: +For example, you can replace this fragment: + +.. code-block:: rst use this command: @@ -310,7 +436,9 @@ For example, you can replace this fragment:: $ python manage.py shell -with this one:: +with this one: + +.. code-block:: rst use this command: @@ -349,7 +477,7 @@ Documenting new features Our policy for new features is: All documentation of new features should be written in a way that - clearly designates the features are only available in the Django + clearly designates the features that are only available in the Django development version. Assume documentation readers are using the latest release, not the development version. @@ -357,7 +485,7 @@ Our preferred way for marking new features is by prefacing the features' documentation with: "``.. versionadded:: X.Y``", followed by a mandatory blank line and an optional description (indented). -General improvements, or other changes to the APIs that should be emphasized +General improvements or other changes to the APIs that should be emphasized should use the "``.. versionchanged:: X.Y``" directive (with the same format as the ``versionadded`` mentioned above. @@ -366,7 +494,9 @@ In other words, since we only keep these annotations around for two releases, it's nice to be able to remove the annotation and its contents without having to reflow, reindent, or edit the surrounding text. For example, instead of putting the entire description of a new or changed feature in a block, do -something like this:: +something like this: + +.. code-block:: rst .. class:: Author(first_name, last_name, middle_name=None) @@ -390,7 +520,9 @@ redundant to do so as these annotations render as "New in Django A.B:" and "Changed in Django A.B", respectively. If a function, attribute, etc. is added, it's also okay to use a -``versionadded`` annotation like this:: +``versionadded`` annotation like this: + +.. code-block:: rst .. attribute:: Author.middle_name @@ -407,14 +539,14 @@ Minimizing images Optimize image compression where possible. For PNG files, use OptiPNG and AdvanceCOMP's ``advpng``: -.. code-block:: console +.. console:: $ cd docs $ optipng -o7 -zm1-9 -i0 -strip all `find . -type f -not -path "./_build/*" -name "*.png"` $ advpng -z4 `find . -type f -not -path "./_build/*" -name "*.png"` This is based on OptiPNG version 0.7.5. Older versions may complain about the -``--strip all`` option being lossy. +``-strip all`` option being lossy. An example ========== @@ -459,7 +591,7 @@ example: You can find both in the :doc:`settings reference document `. - We use the Sphinx :rst:role:`doc` cross reference element when we want to + We use the Sphinx :rst:role:`doc` cross-reference element when we want to link to another document as a whole and the :rst:role:`ref` element when we want to link to an arbitrary location in a document. @@ -479,7 +611,7 @@ example: with the full exception information. Each member of the list should be a tuple of (Full name, email address). Example:: - [('John', 'john@example.com'), ('Mary', 'mary@example.com')] + [("John", "john@example.com"), ("Mary", "mary@example.com")] Note that Django will email *all* of these people whenever an error happens. See :doc:`/howto/error-reporting` for more information. @@ -490,26 +622,6 @@ example: That's basically how everything fits together. -.. _documentation-spelling-check: - -Spelling check -============== - -Before you commit your docs, it's a good idea to run the spelling checker. -You'll need to install `sphinxcontrib-spelling -`_ first. Then from the -``docs`` directory, run ``make spelling``. Wrong words (if any) along with the -file and line number where they occur will be saved to -``_build/spelling/output.txt``. - -If you encounter false-positives (error output that actually is correct), do -one of the following: - -* Surround inline code or brand/technology names with grave accents (`). -* Find synonyms that the spell checker recognizes. -* If, and only if, you are sure the word you are using is correct - add it - to ``docs/spelling_wordlist`` (please keep the list in alphabetical order). - Translating documentation ========================= @@ -528,6 +640,10 @@ included in the Django repository and the releases as ``docs/man/django-admin.1``. There isn't a need to update this file when updating the documentation, as it's updated once as part of the release process. -To generate an updated version of the man page, run ``make man`` in the -``docs`` directory. The new man page will be written in -``docs/_build/man/django-admin.1``. +To generate an updated version of the man page, in the ``docs`` directory, run: + +.. console:: + + $ make man + +The new man page will be written in ``docs/_build/man/django-admin.1``. diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index d6becd31c11a..0a8ccaa20a9e 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -7,6 +7,263 @@ in a backward incompatible way, following their deprecation, as per the :ref:`deprecation policy `. More details about each item can often be found in the release notes of two versions prior. +.. _deprecation-removed-in-7.0: + +7.0 +--- + +See the :ref:`Django 6.0 release notes ` for more +details on these changes. + +* The ``serialize`` keyword argument of + ``BaseDatabaseCreation.create_test_db()`` will be removed. + +.. _deprecation-removed-in-6.1: + +6.1 +--- + +See the :ref:`Django 5.2 release notes ` for more +details on these changes. + +* The ``all`` keyword argument of ``django.contrib.staticfiles.finders.find()`` + will be removed. + +* The fallback to ``request.user`` when ``user`` is ``None`` in + ``django.contrib.auth.login()`` and ``django.contrib.auth.alogin()`` will be + removed. + +* The ``ordering`` keyword argument of the PostgreSQL specific aggregation + functions ``django.contrib.postgres.aggregates.ArrayAgg``, + ``django.contrib.postgres.aggregates.JSONBAgg``, and + ``django.contrib.postgres.aggregates.StringAgg`` will be removed. + +.. _deprecation-removed-in-6.0: + +6.0 +--- + +See the :ref:`Django 5.0 release notes ` for more +details on these changes. + +* The ``DjangoDivFormRenderer`` and ``Jinja2DivFormRenderer`` transitional form + renderers will be removed. + +* Support for passing positional arguments to ``BaseConstraint`` will be + removed. + +* ``request`` will be required in the signature of + ``ModelAdmin.lookup_allowed()`` subclasses. + +* The ``django.db.models.sql.datastructures.Join`` will no longer fallback to + ``get_joining_columns()``. + +* The ``get_joining_columns()`` method of ``ForeignObject`` and + ``ForeignObjectRel`` will be removed. + +* The ``ForeignObject.get_reverse_joining_columns()`` method will be removed. + +* The default scheme for ``forms.URLField`` will change from ``"http"`` to + ``"https"``. + +* Support for calling ``format_html()`` without passing args or kwargs will be + removed. + +* Support for ``cx_Oracle`` will be removed. + +* ``BaseDatabaseOperations.field_cast_sql()`` will be removed. + +* The ``ChoicesMeta`` alias to ``django.db.models.enums.ChoicesType`` will be + removed. + +* The ``Prefetch.get_current_queryset()`` method will be removed. + +* The ``get_prefetch_queryset()`` method of related managers and descriptors + will be removed. + +* ``get_prefetcher()`` and ``prefetch_related_objects()`` will no longer + fallback to ``get_prefetch_queryset()``. + +* The ``FORMS_URLFIELD_ASSUME_HTTPS`` transitional setting will be removed. + +See the :ref:`Django 5.1 release notes ` for more +details on these changes. + +* The ``ModelAdmin.log_deletion()`` and ``LogEntryManager.log_action()`` + methods will be removed. + +* The undocumented ``django.utils.itercompat.is_iterable()`` function and the + ``django.utils.itercompat`` module will be removed. + +* The ``django.contrib.gis.geoip2.GeoIP2.coords()`` method will be removed. + +* The ``django.contrib.gis.geoip2.GeoIP2.open()`` method will be removed. + +* Support for passing positional arguments to ``Model.save()`` and + ``Model.asave()`` will be removed. + +* The setter for ``django.contrib.gis.gdal.OGRGeometry.coord_dim`` will be + removed. + +* ``django.urls.register_converter()`` will no longer allow overriding existing + converters. + +* The ``check`` keyword argument of ``CheckConstraint`` will be removed. + +* The ``OS_OPEN_FLAGS`` attribute of + :class:`~django.core.files.storage.FileSystemStorage` will be removed. + +* The ``get_cache_name()`` method of ``FieldCacheMixin`` will be removed. + +.. _deprecation-removed-in-5.1: + +5.1 +--- + +See the :ref:`Django 4.2 release notes ` for more +details on these changes. + +* The ``BaseUserManager.make_random_password()`` method will be removed. + +* The model's ``Meta.index_together`` option will be removed. + +* The ``length_is`` template filter will be removed. + +* The ``django.contrib.auth.hashers.SHA1PasswordHasher``, + ``django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher``, and + ``django.contrib.auth.hashers.UnsaltedMD5PasswordHasher`` will be removed. + +* The model ``django.contrib.postgres.fields.CICharField``, + ``django.contrib.postgres.fields.CIEmailField``, and + ``django.contrib.postgres.fields.CITextField`` will be removed. Stub fields + will remain for compatibility with historical migrations. + +* The ``django.contrib.postgres.fields.CIText`` mixin will be removed. + +* The ``map_width`` and ``map_height`` attributes of ``BaseGeometryWidget`` + will be removed. + +* The ``SimpleTestCase.assertFormsetError()`` method will be removed. + +* The ``TransactionTestCase.assertQuerysetEqual()`` method will be removed. + +* Support for passing encoded JSON string literals to ``JSONField`` and + associated lookups and expressions will be removed. + +* Support for passing positional arguments to ``Signer`` and + ``TimestampSigner`` will be removed. + +* The ``DEFAULT_FILE_STORAGE`` and ``STATICFILES_STORAGE`` settings will be + removed. + +* The ``django.core.files.storage.get_storage_class()`` function will be + removed. + +.. _deprecation-removed-in-5.0: + +5.0 +--- + +See the :ref:`Django 4.0 release notes ` for more +details on these changes. + +* The ``SERIALIZE`` test setting will be removed. + +* The undocumented ``django.utils.baseconv`` module will be removed. + +* The undocumented ``django.utils.datetime_safe`` module will be removed. + +* The default value of the ``USE_TZ`` setting will change from ``False`` to + ``True``. + +* The default sitemap protocol for sitemaps built outside the context of a + request will change from ``'http'`` to ``'https'``. + +* The ``extra_tests`` argument for ``DiscoverRunner.build_suite()`` and + ``DiscoverRunner.run_tests()`` will be removed. + +* The ``django.contrib.postgres.aggregates.ArrayAgg``, ``JSONBAgg``, and + ``StringAgg`` aggregates will return ``None`` when there are no rows instead + of ``[]``, ``[]``, and ``''`` respectively. + +* The ``USE_L10N`` setting will be removed. + +* The ``USE_DEPRECATED_PYTZ`` transitional setting will be removed. + +* Support for ``pytz`` timezones will be removed. + +* The ``is_dst`` argument will be removed from: + + * ``QuerySet.datetimes()`` + * ``django.utils.timezone.make_aware()`` + * ``django.db.models.functions.Trunc()`` + * ``django.db.models.functions.TruncSecond()`` + * ``django.db.models.functions.TruncMinute()`` + * ``django.db.models.functions.TruncHour()`` + * ``django.db.models.functions.TruncDay()`` + * ``django.db.models.functions.TruncWeek()`` + * ``django.db.models.functions.TruncMonth()`` + * ``django.db.models.functions.TruncQuarter()`` + * ``django.db.models.functions.TruncYear()`` + +* The ``django.contrib.gis.admin.GeoModelAdmin`` and ``OSMGeoAdmin`` classes + will be removed. + +* The undocumented ``BaseForm._html_output()`` method will be removed. + +* The ability to return a ``str``, rather than a ``SafeString``, when rendering + an ``ErrorDict`` and ``ErrorList`` will be removed. + +See the :ref:`Django 4.1 release notes ` for more +details on these changes. + +* The ``SitemapIndexItem.__str__()`` method will be removed. + +* The ``CSRF_COOKIE_MASKED`` transitional setting will be removed. + +* The ``name`` argument of ``django.utils.functional.cached_property()`` will + be removed. + +* The ``opclasses`` argument of + ``django.contrib.postgres.constraints.ExclusionConstraint`` will be removed. + +* The undocumented ability to pass ``errors=None`` to + ``SimpleTestCase.assertFormError()`` and ``assertFormsetError()`` will be + removed. + +* ``django.contrib.sessions.serializers.PickleSerializer`` will be removed. + +* The usage of ``QuerySet.iterator()`` on a queryset that prefetches related + objects without providing the ``chunk_size`` argument will no longer be + allowed. + +* Passing unsaved model instances to related filters will no longer be allowed. + +* ``created=True`` will be required in the signature of + ``RemoteUserBackend.configure_user()`` subclasses. + +* Support for logging out via ``GET`` requests in the + ``django.contrib.auth.views.LogoutView`` and + ``django.contrib.auth.views.logout_then_login()`` will be removed. + +* The ``django.utils.timezone.utc`` alias to ``datetime.timezone.utc`` will be + removed. + +* Passing a response object and a form/formset name to + ``SimpleTestCase.assertFormError()`` and ``assertFormsetError()`` will no + longer be allowed. + +* The ``django.contrib.gis.admin.OpenLayersWidget`` will be removed. + +* The ``django.contrib.auth.hashers.CryptPasswordHasher`` will be removed. + +* The ``"django/forms/default.html"`` and + ``"django/forms/formsets/default.html"`` templates will be removed. + +* The ability to pass ``nulls_first=False`` or ``nulls_last=False`` to + ``Expression.asc()`` and ``Expression.desc()`` methods, and the ``OrderBy`` + expression will be removed. + .. _deprecation-removed-in-4.1: 4.1 @@ -24,6 +281,16 @@ details on these changes. * The ``whitelist`` argument and ``domain_whitelist`` attribute of ``django.core.validators.EmailValidator`` will be removed. +* The ``default_app_config`` module variable will be removed. + +* ``TransactionTestCase.assertQuerysetEqual()`` will no longer automatically + call ``repr()`` on a queryset when compared to string values. + +* ``django.core.cache.backends.memcached.MemcachedCache`` will be removed. + +* Support for the pre-Django 3.2 format of messages used by + ``django.contrib.messages.storage.cookie.CookieStorage`` will be removed. + .. _deprecation-removed-in-4.0: 4.0 @@ -51,6 +318,9 @@ details on these changes. * ``django.utils.http.is_safe_url()`` will be removed. +See the :ref:`Django 3.1 release notes ` for more +details on these changes. + * The ``PASSWORD_RESET_TIMEOUT_DAYS`` setting will be removed. * The undocumented usage of the :lookup:`isnull` lookup with non-boolean values @@ -74,10 +344,14 @@ details on these changes. * Support for the pre-Django 3.1 ``django.core.signing.Signer`` signatures (encoded with the SHA-1 algorithm) will be removed. +* Support for the pre-Django 3.1 ``django.core.signing.dumps()`` signatures + (encoded with the SHA-1 algorithm) in ``django.core.signing.loads()`` will be + removed. + * Support for the pre-Django 3.1 user sessions (that use the SHA-1 algorithm) will be removed. -* The ``get_request`` argument for +* The ``get_response`` argument for ``django.utils.deprecation.MiddlewareMixin.__init__()`` will be required and won't accept ``None``. @@ -89,9 +363,6 @@ details on these changes. * The ``list`` message for ``ModelMultipleChoiceField`` will be removed. -* ``django.views.generic.TemplateView`` will no longer pass URL kwargs directly - to the ``context``. - * Support for passing raw column aliases to ``QuerySet.order_by()`` will be removed. @@ -109,8 +380,7 @@ details on these changes. * The ``{% ifequal %}`` and ``{% ifnotequal %}`` template tags will be removed. -See the :ref:`Django 3.1 release notes ` for more -details on these changes. +* The ``DEFAULT_HASHING_ALGORITHM`` transitional setting will be removed. .. _deprecation-removed-in-3.1: @@ -863,8 +1133,8 @@ details on these changes. supports base36 encoded user IDs (``django.contrib.auth.views.password_reset_confirm_uidb36``) will be removed. If your site has been running Django 1.6 for more than - :setting:`PASSWORD_RESET_TIMEOUT_DAYS`, this change will have no effect. If - not, then any password reset links generated before you upgrade to Django 1.7 + ``PASSWORD_RESET_TIMEOUT_DAYS``, this change will have no effect. If not, + then any password reset links generated before you upgrade to Django 1.7 won't work after the upgrade. * The ``django.utils.encoding.StrAndUnicode`` mix-in will be removed. @@ -1057,7 +1327,7 @@ details on these changes. * The ``django.contrib.gis.db.backend`` module will be removed in favor of the specific backends. -* ``SMTPConnection`` will be removed in favor of a generic Email backend API. +* ``SMTPConnection`` will be removed in favor of a generic email backend API. * The many to many SQL generation functions on the database backends will be removed. diff --git a/docs/internals/git.txt b/docs/internals/git.txt index 85f0c667a2ab..7329fe0bbcbc 100644 --- a/docs/internals/git.txt +++ b/docs/internals/git.txt @@ -31,7 +31,7 @@ Django releases, which you can browse online. The Git repository includes several `branches`_: -* ``master`` contains the main in-development code which will become +* ``main`` contains the main in-development code which will become the next packaged release of Django. This is where most development activity is focused. @@ -50,16 +50,20 @@ website can be found at `github.com/django/djangoproject.com `_. .. _Git: https://git-scm.com/ -.. _documentation: https://git-scm.com/documentation +.. _documentation: https://git-scm.com/doc .. _branches: https://github.com/django/django/branches .. _tags: https://github.com/django/django/tags -The master branch -================= +The main branch +=============== If you'd like to try out the in-development code for the next release of Django, or if you'd like to contribute to Django by fixing bugs or developing -new features, you'll want to get the code from the master branch. +new features, you'll want to get the code from the main branch. + +.. note:: + + Prior to March 2021, the main branch was called ``master``. Note that this will get *all* of Django: in addition to the top-level ``django`` module containing Python code, you'll also get a copy of Django's @@ -142,7 +146,7 @@ Archived feature-development work designed. Feature-development branches tend by their nature to be temporary. Some -produce successful features which are merged back into Django's master to +produce successful features which are merged back into Django's main branch to become part of an official release, but others do not; in either case, there comes a time when the branch is no longer being actively worked on by any developer. At this point the branch is considered closed. diff --git a/docs/internals/howto-release-django.txt b/docs/internals/howto-release-django.txt index d63ddfa31a25..fe0b8368e24c 100644 --- a/docs/internals/howto-release-django.txt +++ b/docs/internals/howto-release-django.txt @@ -2,8 +2,6 @@ How is Django Formed? ===================== -.. highlight:: console - This document explains how to release Django. **Please, keep these instructions up-to-date if you make changes!** The point @@ -17,12 +15,12 @@ There are three types of releases that you might need to make: * Security releases: disclosing and fixing a vulnerability. This'll generally involve two or three simultaneous releases -- e.g. - 1.5.x, 1.6.x, and, depending on timing, perhaps a 1.7 alpha/beta/rc. + 3.2.x, 4.0.x, and, depending on timing, perhaps a 4.1.x. -* Regular version releases: either a final release (e.g. 1.5) or a - bugfix update (e.g. 1.5.1). +* Regular version releases: either a final release (e.g. 4.1) or a + bugfix update (e.g. 4.1.1). -* Pre-releases: e.g. 1.6 alpha, beta, or rc. +* Pre-releases: e.g. 4.2 alpha, beta, or rc. The short version of the steps involved is: @@ -36,6 +34,9 @@ The short version of the steps involved is: #. Upload the package(s) to the ``djangoproject.com`` server. +#. Verify package(s) signatures, check if they can be installed, and ensure + minimal functionality. + #. Upload the new version(s) to PyPI. #. Declare the new version in the admin on ``djangoproject.com``. @@ -49,63 +50,155 @@ There are a lot of details, so please read on. Prerequisites ============= -You'll need a few things before getting started: +You'll need a few things before getting started. If this is your first release, +you'll need to coordinate with another releaser to get all these things lined +up, and write to the Ops mailing list requesting the required access and +permissions. + +* A Unix environment with these tools installed (in alphabetical order): + + * bash + * git + * GPG + * make + * man + * hashing tools (typically ``md5sum``, ``sha1sum``, and ``sha256sum`` on + Linux, or ``md5`` and ``shasum`` on macOS) + * python + * ssh + +* A GPG key pair. Ensure that the private part of this key is securely stored. + The public part needs to be uploaded to your GitHub account, and also to the + Jenkins server running the "confirm release" job. -* A GPG key. If the key you want to use is not your default signing key, you'll - need to add ``-u you@example.com`` to every GPG signing command below, where - ``you@example.com`` is the email address associated with the key you want to - use. + .. admonition:: More than one GPG key -* An install of some required Python packages:: + If the key you want to use is not your default signing key, you'll need to + add ``-u you@example.com`` to every GPG signing command shown below, where + ``you@example.com`` is the email address associated with the key you want + to use. - $ python -m pip install wheel twine +* A clean Python virtual environment per Django version being released, with + these required Python packages installed: -* Access to Django's record on PyPI. Create a file with your credentials: + .. code-block:: shell + + $ python -m pip install build twine + +* Access to `Django's project on PyPI `_ to + upload binaries, ideally with extra permissions to `yank a release + `_ if necessary. Create a project-scoped token + following the `official documentation `_ + and set up your ``$HOME/.pypirc`` file like this: .. code-block:: ini - :caption: ~/.pypirc + :caption: ``~/.pypirc`` - [pypi] - username:YourUsername - password:YourPassword + [distutils] + index-servers = + pypi + django -* Access to the ``djangoproject.com`` server to upload files. + [pypi] + username = __token__ + password = # User-scoped or project-scoped token, to set as the default. -* Access to the admin on ``djangoproject.com`` as a "Site maintainer". + [django] + repository = https://upload.pypi.org/legacy/ + username = __token__ + password = # A project token. -* Access to post to ``django-announce``. +* Access to `Django's project on Transifex + `_, with a Manager role. Generate + an API Token in the `user setting section + `_ and set up your + ``$HOME/.transifexrc`` file like this: + + .. code-block:: ini + :caption: ``~/.transifexrc`` -* If this is a security release, access to the pre-notification distribution - list. + [https://www.transifex.com] + rest_hostname = https://rest.api.transifex.com + token = # API token -If this is your first release, you'll need to coordinate with another releaser -to get all these things lined up. +* Access to the ``djangoproject.com`` server to upload files (using ``scp``). + +* Access to the Django admin on ``djangoproject.com`` as a "Site maintainer". + +* Access to create a post in the `Django Forum - Announcements category + `_ and to send emails to + the following mailing lists: + + * `django-announce `_ + +* Access to the ``django-security`` repo in GitHub. Among other things, this + provides access to the pre-notification distribution list (needed for + security release preparation tasks). + +* Access to the Django project on `Read the Docs + `_. Pre-release tasks ================= A few items need to be taken care of before even beginning the release process. This stuff starts about a week before the release; most of it can be done -any time leading up to the actual release: +any time leading up to the actual release. + +10 (or more) days before a security release +------------------------------------------- + +#. Request the `CVE IDs `_ for the security + issue(s) being released. One CVE ID per issue, requested with + ``Vendor: djangoproject`` and ``Product: django``. + +#. Generate the relevant (private) patch(es) using ``git format-patch``, one + for the ``main`` branch and one for each stable branch being patched. -#. If this is a security release, send out pre-notification **one week** before - the release. The template for that email and a list of the recipients are in - the private ``django-security`` GitHub wiki. BCC the pre-notification - recipients. Sign the email with the key you'll use for the release and - include `CVE IDs `_ (requested with Vendor: - djangoproject, Product: django) and patches for each issue being fixed. - Also, :ref:`notify django-announce ` of the upcoming - security release. +A week before a security release +-------------------------------- -#. As the release approaches, watch Trac to make sure no release blockers - are left for the upcoming release. +#. Send out pre-notification exactly **one week** before the security release. + The template for that email and a list of the recipients are in the private + ``django-security`` GitHub wiki. BCC the pre-notification recipients and be + sure to include the relevant CVE IDs. Attach all the relevant patches + (targeting ``main`` and the stable branches) and sign the email text with + the key you'll use for the release, with a command like: -#. Check with the other committers to make sure they don't have any - uncommitted changes for the release. + .. code-block:: shell -#. Proofread the release notes, including looking at the online - version to catch any broken links or reST errors, and make sure the - release notes contain the correct date. + $ gpg --clearsign --digest-algo SHA256 prenotification-email.txt + +#. :ref:`Notify django-announce ` of the upcoming + security release with a general message such as: + + .. code-block:: text + + Notice of upcoming Django security releases (3.2.24, 4.2.10 and 5.0.2) + + Django versions 5.0.2, 4.2.10, and 3.2.24 will be released on Tuesday, + February 6th, 2024 around 1500 UTC. They will fix one security defect + with severity "moderate". + + For details of severity levels, see: + https://docs.djangoproject.com/en/dev/internals/security/#how-django-discloses-security-issues + +A few days before any release +----------------------------- + +#. As the release approaches, watch Trac to make sure no release blockers are + left for the upcoming release. Under exceptional circumstances, such as to + meet a pre-determined security release date, a release could still go ahead + with an open release blocker. The releaser is trusted with the decision to + release with an open release blocker or to postpone the release date of a + non-security release if required. + +#. Check with the other mergers to make sure they don't have any uncommitted + changes for the release. + +#. Proofread the release notes, including looking at the online version to + :ref:`catch any broken links ` or reST errors, and + make sure the release notes contain the correct date. #. Double-check that the release notes mention deprecation timelines for any APIs noted as deprecated, and that they mention any changes @@ -114,18 +207,47 @@ any time leading up to the actual release: #. Double-check that the release notes index has a link to the notes for the new release; this will be in ``docs/releases/index.txt``. -#. If this is a feature release, ensure translations from Transifex have been - integrated. This is typically done by a separate translation's manager - rather than the releaser, but here are the steps. Provided you have an - account on Transifex:: +#. If this is a :term:`feature release`, ensure translations from Transifex + have been integrated. This is typically done by a separate translation's + manager rather than the releaser, but here are the steps. This process is a + bit lengthy so be sure to set aside 4-10 hours to do this, and ideally plan + for this task one or two days ahead of the release day. + + In addition to having a configured Transifex account, the + `tx CLI `_ should be available in + your ``PATH``. Then, you can fetch all the translations by running: + + .. code-block:: shell $ python scripts/manage_translations.py fetch - and then commit the changed/added files (both .po and .mo). Sometimes there - are validation errors which need to be debugged, so avoid doing this task - immediately before a release is needed. + This command takes some time to run. When done, carefully inspect the output + for potential errors and/or warnings. If there are some, you will need to + debug and resolve them on a case by case basis. + + The recently fetched translations need some manual adjusting. First of all, + the ``PO-Revision-Date`` values must be manually bumped to be later than + ``POT-Creation-Date``. You can use a command similar to this to bulk update + all the ``.po`` files (compare the diff against the relevant stable branch): + + .. code-block:: shell + + $ git diff --name-only stable/5.0.x | grep "\.po" | xargs sed -ri "s/PO-Revision-Date: [0-9\-]+ /PO-Revision-Date: $(date -I) /g" + + All the new ``.po`` files should be manually and carefully inspected to + avoid committing a change in a file without any new translations. Also, + there shouldn't be any changes in the "plural forms": if there are any + (usually Spanish and French report changes for this) those will need + reverting. -#. :ref:`Update the django-admin manual page `:: + Lastly, commit the changed/added files (both ``.po`` and ``.mo``) and create + a new PR targeting the stable branch of the corresponding release (example + `PR updating translations for 4.2 + `_). + +#. :ref:`Update the django-admin manual page `: + + .. code-block:: shell $ cd docs $ make man @@ -134,95 +256,230 @@ any time leading up to the actual release: and then commit the changed man page. -#. If this is the alpha release of a new series, create a new stable branch - from master. For example, when releasing Django 3.1:: - - $ git checkout -b stable/3.1.x origin/master - $ git push origin -u stable/3.1.x:stable/3.1.x - #. If this is the "dot zero" release of a new series, create a new branch from the current stable branch in the `django-docs-translations `_ repository. For - example, when releasing Django 2.2:: + example, when releasing Django 4.2: - $ git checkout -b stable/2.2.x origin/stable/2.1.x - $ git push origin stable/2.2.x:stable/2.2.x + .. code-block:: shell -Preparing for release -===================== + $ git checkout -b stable/4.2.x origin/stable/4.1.x + $ git push origin stable/4.2.x:stable/4.2.x -Write the announcement blog post for the release. You can enter it into the -admin at any time and mark it as inactive. Here are a few examples: `example -security release announcement`__, `example regular release announcement`__, -`example pre-release announcement`__. +#. Write the announcement blog post for the release. You can enter it into the + admin at any time and mark it as inactive. Here are a few examples: `example + security release announcement`__, `example regular release announcement`__, + `example pre-release announcement`__. __ https://www.djangoproject.com/weblog/2013/feb/19/security/ __ https://www.djangoproject.com/weblog/2012/mar/23/14/ __ https://www.djangoproject.com/weblog/2012/nov/27/15-beta-1/ +A few days before a feature freeze +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In preparation for the alpha release, the directory +``/home/www/www/media/releases/A.B`` must be created on the djangoproject +server. + +Before the feature freeze, a branch targeting ``main`` must be created to +prepare for the next feature release. It should be reviewed and approved a few +days before the freeze, allowing it to be merged after the stable branch is +cut. The following items should be addressed in this branch: + +#. Update the ``VERSION`` tuple in ``django/__init__.py``, incrementing to the + next expected release (:commit:`example commit + <96700c7b378c592f0b1732302c22af2fd2c87fc6>`). + +#. Create a stub release note for the next feature release. Use the stub from + the previous feature release or copy the contents from the current version + and delete most of the contents leaving only the headings + (:commit:`example commit <9b5ad4056ccf9ff7ea548f72d28eb66c1b4f84cc>`). + +#. Remove ``.. versionadded::`` and ``.. versionchanged::`` annotations in the + documentation from two releases ago, as well as any remaining older + annotations. For example, in Django 5.1, notes for 4.2 will be removed + (:commit:`example commit <9edb7833b89e811eefd94974fb987f4605b0c0d7>`). + +#. Remove features that have reached the end of their deprecation cycle, + including their docs and the ``.. deprecated::`` annotation. Each removal + should be done in a separate commit for clarity. In the commit message, add + a ``Refs #XXXXX --`` prefix linking to the original ticket where the + deprecation began if possible. Make sure this gets noted in the removed + features section in the release notes (:commit:`example commit + `). + +#. Increase the default PBKDF2 iterations in + ``django.contrib.auth.hashers.PBKDF2PasswordHasher`` by about 20% + (pick a round number). Run the tests, and update the 3 failing + hasher tests with the new values. Make sure this gets noted in the + release notes (:commit:`example commit + <7288866da4dddf3705148c703421858ec19cdb78>`). + +Concrete examples for past feature release bootstrap branches: `5.2 bootstrap +`_, `5.1 bootstrap +`_, `5.0 bootstrap +`_. + +Feature freeze tasks +==================== + +#. Remove empty sections from the release notes (:commit:`example commit + <9e6e58bad237a80ddd5e3ab8b834cecdaad8455e>`). + +#. Build the release notes locally and read them. Make any necessary change + to improve flow or fix grammar (:commit:`example commit + <435bdab93889dae01e71c79598edab10627cc1f9>`). + +#. Create a new stable branch from ``main``. For example, when feature freezing + Django 5.2: + + .. code-block:: shell + + $ git checkout -b stable/5.2.x upstream/main + $ git push upstream -u stable/5.2.x:stable/5.2.x + + At the same time, update the ``django_next_version`` variable in + ``docs/conf.py`` on the stable release branch to point to the new + development version. For example, when creating ``stable/5.2.x``, set + ``django_next_version`` to ``'6.0'`` on the new stable branch + (:commit:`example commit <1eb62e5b622ef7fd6e0123d8bbf6662d893d5d08>`). + +#. Go to the `Add release page in the admin`__, create a ``Release`` object for + the *final* release, ensuring that the *Release date* field is blank, thus + marking it as *unreleased*. For example, when creating ``stable/5.2.x``, + create ``5.2`` with the Release date field blank. If the release is part of + an LTS branch, mark it so. + + __ https://www.djangoproject.com/admin/releases/release/add/ + +#. Go to the `Add document release page in the admin`__, create a new + ``DocumentRelease`` object for the English language for the newly created + ``Release`` object. Do not mark this as default. + + __ https://www.djangoproject.com/admin/docs/documentrelease/add/ + +#. Add the new branch to `Read the Docs + `_. Since the automatically + generated version names ("stable-A.B.x") differ from the version names + used in Read the Docs ("A.B.x"), `create a ticket + `_ requesting + the new version. + +#. `Request the new classifier on PyPI + `_. For example + ``Framework :: Django :: 5.2``. + +#. Create a `roadmap page + `_ for the next + release on Trac. To create a new page on the Wiki, navigate to the URL of + where you wish to create the page and a "Create this page" button will be + available. + +#. Update the current branch under active development and add pre-release + branch in the `Django release process + `_ on Trac. + +#. Update the ``docs/fixtures/doc_releases.json`` JSON fixture for + djangoproject.com, so people without access to the production DB can still + run an up-to-date copy of the docs site + (`example PR `__). + This will be merged after the final release. + Actually rolling the release ============================ -OK, this is the fun part, where we actually push out a release! +OK, this is the fun part, where we actually push out a release! If you're +issuing **multiple releases**, repeat these steps for each release. #. Check `Jenkins`__ is green for the version(s) you're putting out. You - probably shouldn't issue a release until it's green. + probably shouldn't issue a release until it's green, and you should make + sure that the latest green run includes the changes that you are releasing. __ https://djangoci.com +#. Cleanup the release notes for this release. Make these changes in ``main`` + and backport to all branches where the release notes for a particular + version are located. + + #. For a feature release, remove the ``UNDER DEVELOPMENT`` header at the top + of the release notes, remove the ``Expected`` prefix and update the + release date, if necessary (:commit:`example commit + <1994a2643881a9e3f9fa8d3e0794c1a9933a1831>`). + + #. For a patch release, remove the ``Expected`` prefix and update the + release date for all releases, if necessary (:commit:`example commit + <34a503162fe222033a1cd3249bccad014fcd1d20>`). + #. A release always begins from a release branch, so you should make sure - you're on a stable branch and up-to-date. For example:: + you're on an up-to-date stable branch. Also, you should have available a + clean and dedicated virtual environment per version being released. For + example: + + .. code-block:: shell - $ git checkout stable/1.5.x + $ git checkout stable/4.1.x $ git pull #. If this is a security release, merge the appropriate patches from ``django-security``. Rebase these patches as necessary to make each one a plain commit on the release branch rather than a merge commit. To ensure - this, merge them with the ``--ff-only`` flag; for example:: + this, merge them with the ``--ff-only`` flag; for example: - $ git checkout stable/1.5.x - $ git merge --ff-only security/1.5.x + .. code-block:: shell - (This assumes ``security/1.5.x`` is a branch in the ``django-security`` repo - containing the necessary security patches for the next release in the 1.5 + $ git checkout stable/4.1.x + $ git merge --ff-only security/4.1.x + + (This assumes ``security/4.1.x`` is a branch in the ``django-security`` repo + containing the necessary security patches for the next release in the 4.1 series.) If git refuses to merge with ``--ff-only``, switch to the security-patch branch and rebase it on the branch you are about to merge it into (``git - checkout security/1.5.x; git rebase stable/1.5.x``) and then switch back and + checkout security/4.1.x; git rebase stable/4.1.x``) and then switch back and do the merge. Make sure the commit message for each security fix explains that the commit is a security fix and that an announcement will follow (:commit:`example security commit `). -#. For a feature release, remove the ``UNDER DEVELOPMENT`` header at the - top of the release notes and add the release date on the next line. For a - patch release, replace ``*Under Development*`` with the release date. Make - this change on all branches where the release notes for a particular version - are located. - #. Update the version number in ``django/__init__.py`` for the release. Please see `notes on setting the VERSION tuple`_ below for details - on ``VERSION``. + on ``VERSION`` (:commit:`example commit + <2719a7f8c161233f45d34b624a9df9392c86cc1b>`). -#. If this is a pre-release package, update the "Development Status" trove - classifier in ``setup.cfg`` to reflect this. Otherwise, make sure the - classifier is set to ``Development Status :: 5 - Production/Stable``. + #. If this is a pre-release package also update the "Development Status" + trove classifier in ``pyproject.toml`` to reflect this. An ``rc`` + pre-release should not change the trove classifier (:commit:`example + commit for alpha release <759921c8e9ad151932fc913ab429fef0a6112ef8>`, + :commit:`example commit for beta release + <25fec8940b24107e21314ab6616e18ce8dec1c1c>`). -#. Tag the release using ``git tag``. For example:: + #. Otherwise, make sure the classifier is set to + ``Development Status :: 5 - Production/Stable``. - $ git tag --sign --message="Tag 1.5.1" 1.5.1 +#. Tag the release using ``git tag``. For example: - You can check your work by running ``git tag --verify ``. + .. code-block:: shell -#. Push your work, including the tag: ``git push --tags``. + $ git tag --sign --message="Tag 4.1.1" 4.1.1 + + You can check your work running ``git tag --verify ``. + +#. Push your work and the new tag: + + .. code-block:: shell + + $ git push + $ git push --tags #. Make sure you have an absolutely clean tree by running ``git clean -dfx``. -#. Run ``make -f extras/Makefile`` to generate the release packages. This will - create the release packages in a ``dist/`` directory. +#. Run ``python -m build`` to generate the release packages. This will create + the release packages in a ``dist/`` directory. -#. Generate the hashes of the release packages:: +#. Generate the hashes of the release packages: + + .. code-block:: shell $ cd dist $ md5sum * @@ -232,7 +489,8 @@ OK, this is the fun part, where we actually push out a release! #. Create a "checksums" file, ``Django-<>.checksum.txt`` containing the hashes and release information. Start with this template and insert the correct version, date, GPG key ID (from - ``gpg --list-keys --keyid-format LONG``), release URL, and checksums: + ``gpg --list-keys --keyid-format LONG``), release manager's GitHub username, + release URL, and checksums: .. code-block:: text @@ -241,14 +499,18 @@ OK, this is the fun part, where we actually push out a release! To use this file, you will need a working install of PGP or other compatible public-key encryption software. You will also need to have - the Django release manager's public key in your keyring; this key has + the Django release manager's public key in your keyring. This key has the ID ``XXXXXXXXXXXXXXXX`` and can be imported from the MIT - keyserver. For example, if using the open-source GNU Privacy Guard + keyserver, for example, if using the open-source GNU Privacy Guard implementation of PGP: gpg --keyserver pgp.mit.edu --recv-key XXXXXXXXXXXXXXXX - Once the key is imported, verify this file:: + or via the GitHub API: + + curl https://github.com/<>.gpg | gpg --import - + + Once the key is imported, verify this file: gpg --verify <> @@ -256,26 +518,26 @@ OK, this is the fun part, where we actually push out a release! checksumming applications to generate the checksums of the Django package and compare them to the checksums listed below. - Release packages: - ================= + Release packages + ================ - https://www.djangoproject.com/m/releases/<> - https://www.djangoproject.com/m/releases/<> + https://www.djangoproject.com/m/releases/<>/<> + https://www.djangoproject.com/m/releases/<>/<> - MD5 checksums: - ============== + MD5 checksums + ============= <> <> <> <> - SHA1 checksums: - =============== + SHA1 checksums + ============== <> <> <> <> - SHA256 checksums: - ================= + SHA256 checksums + ================ <> <> <> <> @@ -285,74 +547,84 @@ OK, this is the fun part, where we actually push out a release! ``Django-.checksum.txt.asc`` which you can then verify using ``gpg --verify Django-.checksum.txt.asc``. -If you're issuing multiple releases, repeat these steps for each release. - Making the release(s) available to the public ============================================= Now you're ready to actually put the release out there. To do this: -#. Upload the release package(s) to the djangoproject server, replacing - A.B. with the appropriate version number, e.g. 1.5 for a 1.5.x release:: +#. Upload the checksum file(s): - $ scp Django-* djangoproject.com:/home/www/www/media/releases/A.B + .. code-block:: shell - If this is the alpha release of a new series, you will need to create the - directory A.B. + $ scp Django-A.B.C.checksum.txt.asc djangoproject.com:/home/www/www/media/pgp/Django-A.B.C.checksum.txt -#. Upload the checksum file(s):: + (If this is a security release, what follows should be done 15 minutes + before the announced release time, no sooner.) - $ scp Django-A.B.C.checksum.txt.asc djangoproject.com:/home/www/www/media/pgp/Django-A.B.C.checksum.txt +#. Upload the release package(s) to the djangoproject server, replacing + A.B. with the appropriate version number, e.g. 4.1 for a 4.1.x release: + + .. code-block:: shell -#. Test that the release packages install correctly using ``easy_install`` - and ``pip``. Here's one method:: + $ scp Django-* djangoproject.com:/home/www/www/media/releases/A.B + +#. Test that the release packages install correctly using ``pip``. Here's one + simple method (this just tests that the binaries are available, that they + install correctly, and that migrations and the development server start, but + it'll catch silly mistakes): - $ RELEASE_VERSION='1.7.2' + .. code-block:: shell + + $ RELEASE_VERSION='4.1.1' $ MAJOR_VERSION=`echo $RELEASE_VERSION| cut -c 1-3` - $ python -m venv django-easy-install - $ . django-easy-install/bin/activate - $ easy_install https://www.djangoproject.com/m/releases/$MAJOR_VERSION/Django-$RELEASE_VERSION.tar.gz - $ deactivate - $ python -m venv django-pip - $ . django-pip/bin/activate + $ python -m venv django-pip-tarball + $ . django-pip-tarball/bin/activate $ python -m pip install https://www.djangoproject.com/m/releases/$MAJOR_VERSION/Django-$RELEASE_VERSION.tar.gz + $ django-admin startproject test_tarball + $ cd test_tarball + $ ./manage.py --help # Ensure executable bits + $ python manage.py migrate + $ python manage.py runserver + $ deactivate + $ cd .. && rm -rf test_tarball && rm -rf django-pip-tarball + $ python -m venv django-pip-wheel $ . django-pip-wheel/bin/activate $ python -m pip install https://www.djangoproject.com/m/releases/$MAJOR_VERSION/Django-$RELEASE_VERSION-py3-none-any.whl + $ django-admin startproject test_wheel + $ cd test_wheel + $ ./manage.py --help # Ensure executable bits + $ python manage.py migrate + $ python manage.py runserver + $ deactivate + $ cd .. && rm -rf test_wheel && rm -rf django-pip-wheel - This just tests that the tarballs are available (i.e. redirects are up) and - that they install correctly, but it'll catch silly mistakes. +#. Run the `confirm-release`__ build on Jenkins to verify the checksum file(s) + (e.g. use ``4.2rc1`` for + https://media.djangoproject.com/pgp/Django-4.2rc1.checksum.txt). -#. Ask a few people on IRC to verify the checksums by visiting the checksums - file (e.g. https://www.djangoproject.com/m/pgp/Django-1.5b1.checksum.txt) - and following the instructions in it. For bonus points, they can also unpack - the downloaded release tarball and verify that its contents appear to be - correct (proper version numbers, no stray ``.pyc`` or other undesirable - files). + __ https://djangoci.com/job/confirm-release/ #. Upload the release packages to PyPI (for pre-releases, only upload the wheel - file):: + file): + + .. code-block:: shell - $ twine upload -s dist/* + $ twine upload --repository django dist/* #. Go to the `Add release page in the admin`__, enter the new release number - exactly as it appears in the name of the tarball (Django-.tar.gz). - So for example enter "1.5.1" or "1.4c2", etc. If the release is part of - an LTS branch, mark it so. + exactly as it appears in the name of the tarball + (``Django-.tar.gz``). So for example enter "4.1.1" or "4.2rc1", + etc. If the release is part of an LTS branch, mark it so. __ https://www.djangoproject.com/admin/releases/release/add/ - If this is the alpha release of a new series, also create a Release object - for the *final* release, ensuring that the *Release date* field is blank, - thus marking it as *unreleased*. For example, when creating the Release - object for ``3.1a1``, also create ``3.1`` with the Release date field blank. - #. Make the blog post announcing the release live. -#. For a new version release (e.g. 1.5, 1.6), update the default stable version +#. For a new version release (e.g. 4.1, 4.2), update the default stable version of the docs by flipping the ``is_default`` flag to ``True`` on the appropriate ``DocumentRelease`` object in the ``docs.djangoproject.com`` database (this will automatically flip it to ``False`` for all @@ -360,19 +632,22 @@ Now you're ready to actually put the release out there. To do this: Create new ``DocumentRelease`` objects for each language that has an entry for the previous release. Update djangoproject.com's `robots.docs.txt`__ - file by copying entries from ``manage_translations.py robots_txt`` from the - current stable branch in the ``django-docs-translations`` repository. For - example, when releasing Django 2.2:: + file by copying the result generated from running the command + ``manage_translations.py robots_txt`` in the current stable branch from the + `django-docs-translations repository`__. For example, when releasing Django + 4.2: - $ git checkout stable/2.2.x + .. code-block:: shell + + $ git checkout stable/4.2.x $ git pull $ python manage_translations.py robots_txt - __ https://github.com/django/djangoproject.com/blob/master/djangoproject/static/robots.docs.txt + __ https://github.com/django/djangoproject.com/blob/main/djangoproject/static/robots.docs.txt + __ https://github.com/django/django-docs-translations -#. Post the release announcement to the |django-announce|, |django-developers|, - and |django-users| mailing lists. This should include a link to the - announcement blog post. +#. Post the release announcement to the |django-announce| mailing list and the + Django Forum. This should include a link to the announcement blog post. #. If this is a security release, send a separate email to oss-security@lists.openwall.com. Provide a descriptive subject, for example, @@ -380,18 +655,16 @@ Now you're ready to actually put the release out there. To do this: message body should include the vulnerability details, for example, the announcement blog post text. Include a link to the announcement blog post. -#. Add a link to the blog post in the topic of the ``#django`` IRC channel: - ``/msg chanserv TOPIC #django new topic goes here``. - Post-release ============ You're almost done! All that's left to do now is: -#. Update the ``VERSION`` tuple in ``django/__init__.py`` again, - incrementing to whatever the next expected release will be. For - example, after releasing 1.5.1, update ``VERSION`` to - ``VERSION = (1, 5, 2, 'alpha', 0)``. +#. If this is not a pre-release, update the ``VERSION`` tuple in + ``django/__init__.py`` again, incrementing to whatever the next expected + release will be. For example, after releasing 4.1.1, update ``VERSION`` to + ``VERSION = (4, 1, 2, 'alpha', 0)`` (:commit:`example commit + `). #. Add the release in `Trac's versions list`_ if necessary (and make it the default by changing the ``default_version`` setting in the @@ -399,54 +672,21 @@ You're almost done! All that's left to do now is: version should be added after the alpha release and the default version should be updated after "dot zero" release. - __ https://github.com/django/code.djangoproject.com/blob/master/trac-env/conf/trac.ini - -#. If this was a security release, update :doc:`/releases/security` with - details of the issues addressed. - -.. _Trac's versions list: https://code.djangoproject.com/admin/ticket/versions - -New stable branch tasks -======================= + __ https://github.com/django/code.djangoproject.com/blob/main/trac-env/conf/trac.ini -There are several items to do in the time following the creation of a new -stable branch (often following an alpha release). Some of these tasks don't -need to be done by the releaser. +#. If this was a final release: -#. Create a new ``DocumentRelease`` object in the ``docs.djangoproject.com`` - database for the new version's docs, and update the - ``docs/fixtures/doc_releases.json`` JSON fixture, so people without access - to the production DB can still run an up-to-date copy of the docs site. + #. Update the current stable branch and remove the pre-release branch in the + `Django release process + `_ on Trac. -#. Create a stub release note for the new feature version. Use the stub from - the previous feature release version or copy the contents from the previous - feature version and delete most of the contents leaving only the headings. + #. Update djangoproject.com's download page (`example PR + `__). -#. Increase the default PBKDF2 iterations in - ``django.contrib.auth.hashers.PBKDF2PasswordHasher`` by about 20% - (pick a round number). Run the tests, and update the 3 failing - hasher tests with the new values. Make sure this gets noted in the - release notes (see the 1.8 release notes for an example). - -#. Remove features that have reached the end of their deprecation cycle. Each - removal should be done in a separate commit for clarity. In the commit - message, add a "refs #XXXX" to the original ticket where the deprecation - began if possible. - -#. Remove ``.. versionadded::``, ``.. versionadded::``, and ``.. deprecated::`` - annotations in the documentation from two releases ago. For example, in - Django 1.9, notes for 1.7 will be removed. - -#. Add the new branch to `Read the Docs - `_. Since the automatically - generated version names ("stable-A.B.x") differ from the version names - used in Read the Docs ("A.B.x"), `create a ticket - `_ requesting the new - version. +#. If this was a security release, update :doc:`/releases/security` with + details of the issues addressed. -#. `Request the new classifier on PyPI - `_. For example - ``Framework :: Django :: 3.1``. +.. _Trac's versions list: https://code.djangoproject.com/admin/ticket/versions Notes on setting the VERSION tuple ================================== @@ -468,8 +708,8 @@ be reported as "pre-alpha". Some examples: -* ``(1, 2, 1, 'final', 0)`` → "1.2.1" +* ``(4, 1, 1, "final", 0)`` → "4.1.1" -* ``(1, 3, 0, 'alpha', 0)`` → "1.3 pre-alpha" +* ``(4, 2, 0, "alpha", 0)`` → "4.2 pre-alpha" -* ``(1, 3, 0, 'beta', 2)`` → "1.3 beta 2" +* ``(4, 2, 0, "beta", 1)`` → "4.2 beta 1" diff --git a/docs/internals/mailing-lists.txt b/docs/internals/mailing-lists.txt index d5b9ab5f9ced..a88a1d3edf48 100644 --- a/docs/internals/mailing-lists.txt +++ b/docs/internals/mailing-lists.txt @@ -1,6 +1,6 @@ -============= -Mailing lists -============= +======================= +Mailing lists and Forum +======================= .. Important:: @@ -10,88 +10,29 @@ Mailing lists not public. For further details, please see :doc:`our security policies `. -Django has several official mailing lists on Google Groups that are open to -anyone. +Django Forum +============ -.. _django-users-mailing-list: +Django has an `official Forum`_ where you can input and ask questions. -``django-users`` -================ +There are several categories of discussion including: -This is the right place if you are looking to ask any question regarding the -installation, usage, or debugging of Django. +* `Using Django`_: to ask any question regarding the installation, usage, or + debugging of Django. +* `Internals`_: for discussion of the development of Django itself. .. note:: - If it's the first time you send an email to this list, your email must be - accepted first so don't worry if :ref:`your message does not appear - ` instantly. - -* `django-users mailing archive`_ -* `django-users subscription email address`_ -* `django-users posting email`_ - -.. _django-users mailing archive: https://groups.google.com/d/forum/django-users -.. _django-users subscription email address: mailto:django-users+subscribe@googlegroups.com -.. _django-users posting email: mailto:django-users@googlegroups.com - -.. _django-core-mentorship-mailing-list: - -``django-core-mentorship`` -========================== - -The Django Core Mentorship list is intended to provide a welcoming -introductory environment for community members interested in contributing to -the Django Project. - -* `django-core-mentorship mailing archive`_ -* `django-core-mentorship subscription email address`_ -* `django-core-mentorship posting email`_ - -.. _django-core-mentorship mailing archive: https://groups.google.com/d/forum/django-core-mentorship -.. _django-core-mentorship subscription email address: mailto:django-core-mentorship+subscribe@googlegroups.com -.. _django-core-mentorship posting email: mailto:django-core-mentorship@googlegroups.com - -.. _django-developers-mailing-list: - -``django-developers`` -===================== - -The discussion about the development of Django itself takes place here. - -Before asking a question about how to contribute, read -:doc:`/internals/contributing/index`. Many frequently asked questions are -answered there. - -.. note:: - - Please make use of - :ref:`django-users mailing list ` if you want - to ask for tech support, doing so in this list is inappropriate. - -* `django-developers mailing archive`_ -* `django-developers subscription email address`_ -* `django-developers posting email`_ - -.. _django-developers mailing archive: https://groups.google.com/d/forum/django-developers -.. _django-developers subscription email address: mailto:django-developers+subscribe@googlegroups.com -.. _django-developers posting email: mailto:django-developers@googlegroups.com - -.. _django-i18n-mailing-list: - -``django-i18n`` -=============== - -This is the place to discuss the internationalization and localization of -Django's components. + Before asking a question about how to contribute, read + :doc:`/internals/contributing/index`. Many frequently asked questions are + answered there. -* `django-i18n mailing archive`_ -* `django-i18n subscription email address`_ -* `django-i18n posting email`_ +.. _official Forum: https://forum.djangoproject.com +.. _Internals: https://forum.djangoproject.com/c/internals/5 +.. _Using Django: https://forum.djangoproject.com/c/users/6 -.. _django-i18n mailing archive: https://groups.google.com/d/forum/django-i18n -.. _django-i18n subscription email address: mailto:django-i18n+subscribe@googlegroups.com -.. _django-i18n posting email: mailto:django-i18n@googlegroups.com +In addition, Django has several official mailing lists on Google Groups that +are open to anyone. .. _django-announce-mailing-list: @@ -105,7 +46,7 @@ A (very) low-traffic list for announcing :ref:`upcoming security releases * `django-announce subscription email address`_ * `django-announce posting email`_ -.. _django-announce mailing archive: https://groups.google.com/d/forum/django-announce +.. _django-announce mailing archive: https://groups.google.com/g/django-announce .. _django-announce subscription email address: mailto:django-announce+subscribe@googlegroups.com .. _django-announce posting email: mailto:django-announce@googlegroups.com @@ -121,6 +62,45 @@ by developers and interested community members. * `django-updates subscription email address`_ * `django-updates posting email`_ -.. _django-updates mailing archive: https://groups.google.com/d/forum/django-updates +.. _django-updates mailing archive: https://groups.google.com/g/django-updates .. _django-updates subscription email address: mailto:django-updates+subscribe@googlegroups.com .. _django-updates posting email: mailto:django-updates@googlegroups.com + +Archived mailing lists +====================== + +The following mailing lists are archived and no longer active. These are still +available as a historical resource. + +.. _django-users-mailing-list: + +``django-users`` +---------------- + +.. note:: + + The `Using Django`_ category of the `official Forum`_ is now the preferred + venue for asking usage questions. + +This was used for questions regarding the installation, usage, or debugging of +Django projects. + +* `django-users mailing archive`_ + +.. _django-users mailing archive: https://groups.google.com/g/django-users + +.. _django-developers-mailing-list: + +``django-developers`` +--------------------- + +.. note:: + + The `Internals`_ category of the `official Forum`_ is now the preferred + venue for discussing the development of Django. + +This was used for discussions about the development of Django itself. + +* `django-developers mailing archive`_ + +.. _django-developers mailing archive: https://groups.google.com/g/django-developers diff --git a/docs/internals/organization.txt b/docs/internals/organization.txt index b2d399255f66..907c4185cc8b 100644 --- a/docs/internals/organization.txt +++ b/docs/internals/organization.txt @@ -7,7 +7,7 @@ Principles The Django Project is managed by a team of volunteers pursuing three goals: -- Driving the development of the Django Web Framework, +- Driving the development of the Django web framework, - Fostering the ecosystem of Django-related software, - Leading the Django community in accordance with the values described in the `Django Code of Conduct`_. @@ -21,170 +21,276 @@ and its community. .. _Django Code of Conduct: https://www.djangoproject.com/conduct/ .. _Django Software Foundation: https://www.djangoproject.com/foundation/ -The Django core team makes the decisions, nominates its new members, and -elects its technical board. While it holds decision power in theory, it aims -at using it as rarely as possible in practice. Rough consensus should be the -norm and formal voting an exception. +.. _mergers-team: -.. _core-team: - -Core team -========= +Mergers +======= Role ---- -The core team is the group of trusted volunteers who manage the Django -Project. They assume many roles required to achieve the project's goals, -especially those that require a high level of trust. They make the decisions -that shape the future of the project. - -Core team members are expected to act as role models for the community and -custodians of the project, on behalf of the community and all those who rely -on Django. - -They will intervene, where necessary, in online discussions or at official -Django events on the rare occasions that a situation arises that requires -intervention. - -They have authority over the Django Project infrastructure, including the -Django Project website itself, the Django GitHub organization and -repositories, the Trac bug tracker, the mailing lists, IRC channels, etc. +Mergers_ are a small set of people who merge pull requests to the `Django Git +repository`_. Prerogatives ------------ -Core team members may participate in formal votes, typically to nominate new -team members and to elect the technical board. +Mergers hold the following prerogatives: -Some contributions don't require commit access. Depending on the reasons why a -contributor joins the team, they may or may not have commit permissions to the -Django code repository. +- Merging any pull request which constitutes a `minor change`_ (small enough + not to require the use of the `DEP process`_). A Merger must not merge a + change primarily authored by that Merger, unless the pull request has been + approved by: -However, should the need arise, any team member may ask for commit access by -writing to the core team's mailing list. Access will be granted unless the -person withdraws their request or the technical board vetoes the proposal. + - another Merger, + - a steering council member, + - a member of the `triage & review team`_, or + - a member of the `security team`_. -Core team members who have commit access are referred to as "committers" or -"core developers". +- Initiating discussion of a minor change in the appropriate venue, and request + that other Mergers refrain from merging it while discussion proceeds. +- Requesting a vote of the steering council regarding any minor change if, in + the Merger's opinion, discussion has failed to reach a consensus. +- Requesting a vote of the steering council when a `major change`_ (significant + enough to require the use of the `DEP process`_) reaches one of its + implementation milestones and is intended to merge. -Other permissions, such as access to the servers, are granted to those who -need them through the same process. +.. _`minor change`: https://github.com/django/deps/blob/main/final/0010-new-governance.rst#terminology +.. _`major change`: https://github.com/django/deps/blob/main/final/0010-new-governance.rst#terminology Membership ---------- -`Django team members `_ -demonstrate: - -- a good grasp of the philosophy of the Django Project -- a solid track record of being constructive and helpful -- significant contributions to the project's goals, in any form -- willingness to dedicate some time to improving Django - -As the project matures, contributions go way beyond code. Here's an incomplete -list of areas where contributions may be considered for joining the core team, -in no particular order: - -- Working on community management and outreach -- Providing support on the mailing-lists and on IRC -- Triaging tickets -- Writing patches (code, docs, or tests) -- Reviewing patches (code, docs, or tests) -- Participating in design decisions -- Providing expertise in a particular domain (security, i18n, etc.) -- Managing the continuous integration infrastructure -- Managing the servers (website, tracker, documentation, etc.) -- Maintaining related projects (djangoproject.com site, ex-contrib apps, etc.) -- Creating visual designs - -Very few areas are reserved to core team members: - -- Reviewing security reports -- Merging patches (code, docs, or tests) -- Packaging releases - -Core team membership acknowledges sustained and valuable efforts that align -well with the philosophy and the goals of the Django Project. - -It is granted by a four fifths majority of votes cast in a core team vote and -no veto by the technical board. - -Core team members are always looking for promising contributors, teaching them -how the project is managed, and submitting their names to the core team's vote -when they're ready. If you would like to join the core team, you can contact a -core team member privately or ask for guidance on the :ref:`Django Core -Mentorship mailing-list `. - -There's no time limit on core team membership. However, in order to provide -the general public with a reasonable idea of how many people maintain Django, -core team members who have stopped contributing are encouraged to declare -themselves as "past team members". Those who haven't made any non-trivial -contribution in two years may be asked to move themselves to this category, -and moved there if they don't respond. Past team members lose their privileges -such as voting rights and commit access. - -.. _technical-board: - -Technical board -=============== +`The steering council`_ selects Mergers_ as necessary to maintain their number +at a minimum of three, in order to spread the workload and avoid over-burdening +or burning out any individual Merger. There is no upper limit to the number of +Mergers. + +It's not a requirement that a Merger is also a Django Fellow, but the Django +Software Foundation has the power to use funding of Fellow positions as a way +to make the role of Merger sustainable. + +The following restrictions apply to the role of Merger: + +- A person must not simultaneously serve as a member of the steering council. If + a Merger is elected to the steering council, they shall cease to be a Merger + immediately upon taking up membership in the steering council. +- A person may serve in the roles of Releaser and Merger simultaneously. + +The selection process, when a vacancy occurs or when the steering council deems +it necessary to select additional persons for such a role, occur as follows: + +- Any member in good standing of an appropriate discussion venue, or the Django + Software Foundation board acting with the input of the DSF's Fellowship + committee, may suggest a person for consideration. +- The steering council considers the suggestions put forth, and then any member + of the steering council formally nominates a candidate for the role. +- The steering council votes on nominees. + +Mergers may resign their role at any time, but should endeavor to provide some +advance notice in order to allow the selection of a replacement. Termination of +the contract of a Django Fellow by the Django Software Foundation temporarily +suspends that person's Merger role until such time as the steering council can +vote on their nomination. + +Otherwise, a Merger may be removed by: + +- Becoming disqualified due to election to the steering council. +- Becoming disqualified due to actions taken by the Code of Conduct committee + of the Django Software Foundation. +- A vote of the steering council. + +.. _releasers-team: + +Releasers +========= Role ---- -The technical board is a group of experienced and active committers who steer -technical choices. Their main concern is to maintain the quality and stability -of the Django Web Framework. +Releasers_ are a small set of people who have the authority to upload packaged +releases of Django to the :pypi:`Python Package Index ` and to the +`djangoproject.com`_ website. Prerogatives ------------ -The technical board holds two prerogatives: +Releasers_ :doc:`build Django releases ` and +upload them to the :pypi:`Python Package Index ` and to the +`djangoproject.com`_ website. + +Membership +---------- -- Making major technical decisions when no consensus is found otherwise. This - happens on the |django-developers| mailing-list. -- Veto a grant of commit access or remove commit access. This happens on the - ``django-core`` mailing-list. +`The steering council`_ selects Releasers_ as necessary to maintain their number +at a minimum of three, in order to spread the workload and avoid over-burdening +or burning out any individual Releaser. There is no upper limit to the number +of Releasers. -In both cases, the technical board is a last resort. In these matters, it -fulfills a similar function to the former Benevolent Dictators For Life. +It's not a requirement that a Releaser is also a Django Fellow, but the Django +Software Foundation has the power to use funding of Fellow positions as a way +to make the role of Releaser sustainable. -When the board wants to exercise one of these prerogatives, it must hold a -private, simple majority vote on the resolution. The quorum is the full -committee — each member must cast a vote or abstain explicitly. Then the board -communicates the result, and if possible the reasons, on the appropriate -mailing-list. There's no appeal for such decisions. +A person may serve in the roles of Releaser and Merger simultaneously. -In addition, at its discretion, the technical board may act in an advisory -capacity on non-technical decisions. +The selection process, when a vacancy occurs or when the steering council deems +it necessary to select additional persons for such a role, occur as follows: -Membership ----------- +- Any member in good standing of an appropriate discussion venue, or the Django + Software Foundation board acting with the input of the DSF's Fellowship + committee, may suggest a person for consideration. +- The steering council considers the suggestions put forth, and then any member + of the steering council formally nominates a candidate for the role. +- The steering council votes on nominees. -`The technical board`_ is an elected group of five committers. They're expected -to be experienced but there's no formal seniority requirement. +Releasers may resign their role at any time, but should endeavor to provide +some advance notice in order to allow the selection of a replacement. +Termination of the contract of a Django Fellow by the Django Software +Foundation temporarily suspends that person's Releaser role until such time as +the steering council can vote on their nomination. -A new board is elected after each feature release of Django. The election -process is managed by a returns officer nominated by the outgoing technical -board. The election process works as follows: +Otherwise, a Releaser may be removed by: -#. Candidates advertise their application for the technical board to the team. +- Becoming disqualified due to actions taken by the Code of Conduct committee + of the Django Software Foundation. +- A vote of the steering council. - They must be committers already. There's no term limit for technical board - members. +.. _djangoproject.com: https://www.djangoproject.com/download/ -#. Each team member can vote for zero to five people among the candidates. - Candidates are ranked by the total number of votes they received. +.. _steering-council: - In case of a tie, the person who joined the core team earlier wins. +Steering council +================ -Both the application and the voting period last between one and two weeks, at -the outgoing board's discretion. +Role +---- + +The steering council is a group of experienced contributors who: -.. _the technical board: https://www.djangoproject.com/foundation/teams/#technical-board-team +- provide oversight of Django's development and release process, +- assist in setting the direction of feature development and releases, +- select Mergers and Releasers, and +- have a tie-breaking vote when other decision-making processes fail. + +Their main concern is to maintain the quality and stability of the Django Web +Framework. + +Prerogatives +------------ + +The steering council holds the following prerogatives: + +- Making a binding decision regarding any question of a technical change to + Django. +- Vetoing the merging of any particular piece of code into Django or ordering + the reversion of any particular merge or commit. +- Announcing calls for proposals and ideas for the future technical direction + of Django. +- Selecting and removing mergers and releasers. +- Participating in the removal of members of the steering council, when deemed + appropriate. +- Calling elections of the steering council outside of those which are + automatically triggered, at times when the steering council deems an election + is appropriate. +- Participating in modifying Django's governance (see + :ref:`organization-change`). +- Declining to vote on a matter the steering council feels is unripe for a + binding decision, or which the steering council feels is outside the scope of + its powers. +- Taking charge of the governance of other technical teams within the Django + open-source project, and governing those teams accordingly. + +Membership +---------- + +`The steering council`_ is an elected group of five experienced contributors +who demonstrate: + +- A history of substantive contributions to Django or the Django ecosystem. + This history must begin at least 18 months prior to the individual's + candidacy for the Steering Council, and include substantive contributions in + at least two of these bullet points: + + - Code contributions to Django projects or major third-party packages in the + Django ecosystem + - Reviewing pull requests and/or triaging Django project tickets + - Documentation, tutorials or blog posts + - Discussions about Django on the Django Forum + - Running Django-related events or user groups + +- A history of engagement with the direction and future of Django. This does + not need to be recent, but candidates who have not engaged in the past three + years must still demonstrate an understanding of Django's changes and + direction within those three years. + +A new council is elected after each release cycle of Django. The election process +works as follows: + +#. The steering council directs one of its members to notify the Secretary of the + Django Software Foundation, in writing, of the triggering of the election, + and the condition which triggered it. The Secretary post to the appropriate + venue -- the `Django Forum`_ to announce the election and its timeline. +#. As soon as the election is announced, the `DSF Board`_ begin a period of + voter registration. All `individual members of the DSF`_ are automatically + registered and need not explicitly register. All other persons who believe + themselves eligible to vote, but who have not yet registered to vote, may + make an application to the DSF Board for voting privileges. The voter + registration form and roll of voters is maintained by the DSF Board. The DSF + Board may challenge and reject the registration of voters it believes are + registering in bad faith or who it believes have falsified their + qualifications or are otherwise unqualified. +#. Registration of voters close one week after the announcement of the + election. At that point, registration of candidates begin. Any qualified + person may register as a candidate. The candidate registration form and + roster of candidates are maintained by the DSF Board, and candidates must + provide evidence of their qualifications as part of registration. The DSF + Board may challenge and reject the registration of candidates it believes do + not meet the qualifications of members of the Steering Council, or who it + believes are registering in bad faith. +#. Registration of candidates close one week after it has opened. One week + after registration of candidates closes, the Secretary of the DSF publishes + the roster of candidates to the `Django Forum`_, and the election begins. + The DSF Board provides a voting form accessible to registered voters, and is + the custodian of the votes. +#. Voting is by secret ballot containing the roster of candidates, and any + relevant materials regarding the candidates, in a randomized order. Each + voter may vote for up to five candidates on the ballot. +#. The election conclude one week after it begins. The DSF Board then tally the + votes and produce a summary, including the total number of votes cast and + the number received by each candidate. This summary is ratified by a + majority vote of the DSF Board, then posted by the Secretary of the DSF to + the `Django Forum`_. The five candidates with the highest vote totals + immediately become the new steering council. + +A member of the steering council may be removed by: + +- Becoming disqualified due to actions taken by the Code of Conduct committee + of the Django Software Foundation. +- Determining that they did not possess the qualifications of a member of the + steering council. This determination must be made jointly by the other members + of the steering council, and the `DSF Board`_. A valid determination of + ineligibility requires that all other members of the steering council and all + members of the DSF Board vote who can vote on the issue (the affected person, + if a DSF Board member, must not vote) vote "yes" on a motion that the person + in question is ineligible. + +.. _`Django Forum`: https://forum.djangoproject.com/ +.. _`Django Git repository`: https://github.com/django/django/ +.. _`DSF Board`: https://www.djangoproject.com/foundation/#board +.. _`individual members of the DSF`: https://www.djangoproject.com/foundation/individual-members/ +.. _mergers: https://www.djangoproject.com/foundation/teams/#mergers-team +.. _releasers: https://www.djangoproject.com/foundation/teams/#releasers-team +.. _`security team`: https://www.djangoproject.com/foundation/teams/#security-team +.. _`the steering council`: https://www.djangoproject.com/foundation/teams/#steering-council-team +.. _`triage & review team`: https://www.djangoproject.com/foundation/teams/#triage-review-team + +.. _organization-change: Changing the organization ========================= -Changes to this document require a four fifths majority of votes cast in a -core team vote and no veto by the technical board. +Changes to this document require the use of the `DEP process`_, with +modifications described in `DEP 0010`_. + +.. _`DEP process`: https://github.com/django/deps/blob/main/final/0001-dep-process.rst +.. _`DEP 0010`: https://github.com/django/deps/blob/main/final/0010-new-governance.rst#changing-this-governance-process diff --git a/docs/internals/release-process.txt b/docs/internals/release-process.txt index 6091989893e5..ec5bdd3c7a52 100644 --- a/docs/internals/release-process.txt +++ b/docs/internals/release-process.txt @@ -128,10 +128,10 @@ varying levels. See `the supported versions section `_ of the download page for the current state of support for each version. -* The current development master will get new features and bug fixes +* The current development branch ``main`` will get new features and bug fixes requiring non-trivial refactoring. -* Patches applied to the master branch must also be applied to the last feature +* Patches applied to the main branch must also be applied to the last feature release branch, to be released in the next patch release of that feature series, when they fix critical problems: @@ -150,8 +150,8 @@ page for the current state of support for each version. release for bugs that would have prevented a release in the first place (release blockers). -* Security fixes and data loss bugs will be applied to the current master, the - last two feature release branches, and any other supported long-term +* Security fixes and data loss bugs will be applied to the current main branch, + the last two feature release branches, and any other supported long-term support release branches. * Documentation fixes generally will be more freely backported to the last @@ -162,17 +162,18 @@ page for the current state of support for each version. As a concrete example, consider a moment in time halfway between the release of Django 5.1 and 5.2. At this point in time: -* Features will be added to development master, to be released as Django 5.2. +* Features will be added to the development main branch, to be released as + Django 5.2. * Critical bug fixes will be applied to the ``stable/5.1.x`` branch, and released as 5.1.1, 5.1.2, etc. * Security fixes and bug fixes for data loss issues will be applied to - ``master`` and to the ``stable/5.1.x``, ``stable/5.0.x``, and + ``main`` and to the ``stable/5.1.x``, ``stable/5.0.x``, and ``stable/4.2.x`` (LTS) branches. They will trigger the release of ``5.1.1``, ``5.0.5``, ``4.2.8``, etc. -* Documentation fixes will be applied to master, and, if easily backported, to +* Documentation fixes will be applied to main, and, if easily backported, to the latest stable branch, ``5.1.x``. .. _release-process: @@ -183,54 +184,68 @@ Release process Django uses a time-based release schedule, with feature releases every eight months or so. -After each feature release, the release manager will announce a timeline for -the next feature release. +After each feature release, the release manager will publish a timeline for the +next feature release. The timeline for an upcoming feature release can be found +in the corresponding wiki roadmap page, e.g. +https://code.djangoproject.com/wiki/Version6.0Roadmap. -Release cycle -------------- +Feature release schedule and stages +----------------------------------- -Each release cycle consists of three parts: +Active development / Pre-feature freeze +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Phase one: feature proposal -~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Work begins on the feature release ``A.B`` after the feature freeze of the +previous release, i.e. when the ``stable/A.B-1.x`` branch is forked. -The first phase of the release process will include figuring out what major -features to include in the next version. This should include a good deal of -preliminary work on those features -- working code trumps grand design. +You can find the current branch under active development in the +`Django release process +`_ on Trac. -Major features for an upcoming release will be added to the wiki roadmap page, -e.g. https://code.djangoproject.com/wiki/Version1.11Roadmap. +Feature freeze / Alpha release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Phase two: development -~~~~~~~~~~~~~~~~~~~~~~ +All major and minor features, including deprecations and breaking changes, must +be merged by the feature freeze. Any features not done by this point will be +deferred to the next feature release. -The second part of the release schedule is the "heads-down" working period. -Using the roadmap produced at the end of phase one, we'll all work very hard to -get everything on it done. +At this point, the ``stable/A.B.x`` branch will be forked from ``main``. -At the end of phase two, any unfinished features will be postponed until the -next release. +Non-release blocking bug fix freeze / Beta release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Phase two will culminate with an alpha release. At this point, the -``stable/A.B.x`` branch will be forked from ``master``. +After the alpha, all bug fixes merged in ``main`` are also backported to +``stable/A.B.x``. Refactors are backported at the discretion of the merger. +Mergers will be more and more conservative with backports, to avoid introducing +regressions. -Phase three: bugfixes -~~~~~~~~~~~~~~~~~~~~~ +In parallel to this phase, ``main`` can continue to receive new features, to be +released in the ``A.B+1`` cycle. -The last part of a release cycle is spent fixing bugs -- no new features will -be accepted during this time. We'll try to release a beta release one month -after the alpha and a release candidate one month after the beta. +Translation string freeze / Release candidate release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If there is still a consistent stream of release blockers coming in at the +planned release candidate date, a beta 2 will be released to encourage further +testing and the release candidate date will be pushed out ~1 month. The release candidate marks the string freeze, and it happens at least two -weeks before the final release. After this point, new translatable strings -must not be added. +weeks before the final release. Translators can then submit updated +translations for inclusion in the final release. After this point, new +translatable strings must not be added. + +After the release candidate, only release blockers and documentation fixes are +backported. + +Final release +~~~~~~~~~~~~~ -During this phase, committers will be more and more conservative with -backports, to avoid introducing regressions. After the release candidate, only -release blockers and documentation fixes should be backported. +Ideally, the final release will ship two weeks after the last release +candidate. -In parallel to this phase, ``master`` can receive new features, to be released -in the ``A.B+1`` cycle. +If there are major bugs still being found 2 weeks after the release candidate, +there will be a decision on how to proceed (likely another release candidate +would be issued and the final release date will be pushed out). Bug-fix releases ---------------- @@ -239,7 +254,7 @@ After a feature release (e.g. A.B), the previous release will go into bugfix mode. The branch for the previous feature release (e.g. ``stable/A.B-1.x``) will -include bugfixes. Critical bugs fixed on master must *also* be fixed on the +include bugfixes. Critical bugs fixed on main must *also* be fixed on the bugfix branch; this means that commits need to cleanly separate bug fixes from -feature additions. The developer who commits a fix to master will be +feature additions. The developer who commits a fix to main will be responsible for also applying the fix to the current bugfix branch. diff --git a/docs/internals/security.txt b/docs/internals/security.txt index 511c83b537c7..4c3aca61e0b6 100644 --- a/docs/internals/security.txt +++ b/docs/internals/security.txt @@ -38,6 +38,47 @@ action to be taken, you may receive further followup emails. .. _our public Trac instance: https://code.djangoproject.com/query +.. _security-report-evaluation: + +How does Django evaluate a report +================================= + +These are criteria used by the security team when evaluating whether a report +requires a security release: + +* The vulnerability is within a :ref:`supported version ` of + Django. + +* The vulnerability does not depend on manual actions that rely on code + external to Django. This includes actions performed by a project's developer + or maintainer using developer tools or the Django CLI. For example, attacks + that require running management commands with uncommon or insecure options + do not qualify. + +* The vulnerability applies to a production-grade Django application. This + means the following scenarios do not require a security release: + + * Exploits that only affect local development, for example when using + :djadmin:`runserver`. + * Exploits which fail to follow security best practices, such as failure to + sanitize user input. For other examples, see our :ref:`security + documentation `. + * Exploits in AI generated code that do not adhere to security best practices. + +The security team may conclude that the source of the vulnerability is within +the Python standard library, in which case the reporter will be asked to report +the vulnerability to the Python core team. For further details see the `Python +security guidelines `_. + +On occasion, a security release may be issued to help resolve a security +vulnerability within a popular third-party package. These reports should come +from the package maintainers. + +If you are unsure whether your finding meets these criteria, please still report +it :ref:`privately by emailing security@djangoproject.com +`. The security team will review your report and +recommend the correct course of action. + .. _security-support: Supported versions @@ -46,9 +87,9 @@ Supported versions At any given time, the Django team provides official security support for several versions of Django: -* The `master development branch`_, hosted on GitHub, which will become the +* The `main development branch`_, hosted on GitHub, which will become the next major release of Django, receives security support. Security issues that - only affect the master development branch and not any stable released versions + only affect the main development branch and not any stable released versions are fixed in public without going through the :ref:`disclosure process `. @@ -67,7 +108,7 @@ comprised solely of *supported* versions of Django: older versions may also be affected, but we do not investigate to determine that, and will not issue patches or new releases for those versions. -.. _master development branch: https://github.com/django/django/ +.. _main development branch: https://github.com/django/django/ .. _security-disclosure: @@ -84,24 +125,24 @@ upcoming security release, as well as the severity of the issues. This is to aid organizations that need to ensure they have staff available to handle triaging our announcement and upgrade Django as needed. Severity levels are: -**High**: +* **High** -* Remote code execution -* SQL injection + * Remote code execution + * SQL injection -**Moderate**: +* **Moderate** -* Cross site scripting (XSS) -* Cross site request forgery (CSRF) -* Denial-of-service attacks -* Broken authentication + * Cross site scripting (XSS) + * Cross site request forgery (CSRF) + * Denial-of-service attacks + * Broken authentication -**Low**: +* **Low** -* Sensitive data exposure -* Broken session management -* Unvalidated redirects/forwards -* Issues requiring an uncommon configuration option + * Sensitive data exposure + * Broken session management + * Unvalidated redirects/forwards + * Issues requiring an uncommon configuration option Second, we notify a list of :ref:`people and organizations `, primarily composed of operating-system vendors and @@ -121,9 +162,10 @@ On the day of disclosure, we will take the following steps: #. Apply the relevant patch(es) to Django's codebase. -#. Issue the relevant release(s), by placing new packages on `the - Python Package Index`_ and on the Django website, and tagging the - new release(s) in Django's git repository. +#. Issue the relevant release(s), by placing new packages on the :pypi:`Python + Package Index ` and on the `djangoproject.com website + `_, and tagging the new release(s) + in Django's git repository. #. Post a public entry on `the official Django development blog`_, describing the issue and its resolution in detail, pointing to the @@ -133,7 +175,6 @@ On the day of disclosure, we will take the following steps: #. Post a notice to the |django-announce| and oss-security@lists.openwall.com mailing lists that links to the blog post. -.. _the Python Package Index: https://pypi.org/ .. _the official Django development blog: https://www.djangoproject.com/weblog/ If a reported issue is believed to be particularly time-sensitive -- diff --git a/docs/intro/_images/admin01.png b/docs/intro/_images/admin01.png index a1a0dc9619e3..61fe8ba199f5 100644 Binary files a/docs/intro/_images/admin01.png and b/docs/intro/_images/admin01.png differ diff --git a/docs/intro/_images/admin02.png b/docs/intro/_images/admin02.png index 7f3fa5d4a41c..24f428dcd6cc 100644 Binary files a/docs/intro/_images/admin02.png and b/docs/intro/_images/admin02.png differ diff --git a/docs/intro/_images/admin03t.png b/docs/intro/_images/admin03t.png index eb3f378a9d90..3245bd654b8b 100644 Binary files a/docs/intro/_images/admin03t.png and b/docs/intro/_images/admin03t.png differ diff --git a/docs/intro/_images/admin04t.png b/docs/intro/_images/admin04t.png index a527480b5fd2..517b2296b308 100644 Binary files a/docs/intro/_images/admin04t.png and b/docs/intro/_images/admin04t.png differ diff --git a/docs/intro/_images/admin05t.png b/docs/intro/_images/admin05t.png index fc6f5ceb6204..427a26ba18a4 100644 Binary files a/docs/intro/_images/admin05t.png and b/docs/intro/_images/admin05t.png differ diff --git a/docs/intro/_images/admin06t.png b/docs/intro/_images/admin06t.png index 80953f4060e0..b3b90ea15dad 100644 Binary files a/docs/intro/_images/admin06t.png and b/docs/intro/_images/admin06t.png differ diff --git a/docs/intro/_images/admin07.png b/docs/intro/_images/admin07.png index 9125cfd6c6a7..d13b0e9ef80b 100644 Binary files a/docs/intro/_images/admin07.png and b/docs/intro/_images/admin07.png differ diff --git a/docs/intro/_images/admin08t.png b/docs/intro/_images/admin08t.png index 293757dbe07f..824bf562e2f1 100644 Binary files a/docs/intro/_images/admin08t.png and b/docs/intro/_images/admin08t.png differ diff --git a/docs/intro/_images/admin09.png b/docs/intro/_images/admin09.png index bfaeb3b99f69..16ccff4b416e 100644 Binary files a/docs/intro/_images/admin09.png and b/docs/intro/_images/admin09.png differ diff --git a/docs/intro/_images/admin10t.png b/docs/intro/_images/admin10t.png index 928cad5d6ed2..e0376ec700ae 100644 Binary files a/docs/intro/_images/admin10t.png and b/docs/intro/_images/admin10t.png differ diff --git a/docs/intro/_images/admin11t.png b/docs/intro/_images/admin11t.png index a5e9bb12cff2..2dda5c0d0570 100644 Binary files a/docs/intro/_images/admin11t.png and b/docs/intro/_images/admin11t.png differ diff --git a/docs/intro/_images/admin12t.png b/docs/intro/_images/admin12t.png index 18eae0900790..6b43c7ae6d84 100644 Binary files a/docs/intro/_images/admin12t.png and b/docs/intro/_images/admin12t.png differ diff --git a/docs/intro/_images/admin13t.png b/docs/intro/_images/admin13t.png index 377172301f2a..0d79edefd4f0 100644 Binary files a/docs/intro/_images/admin13t.png and b/docs/intro/_images/admin13t.png differ diff --git a/docs/intro/_images/admin14t.png b/docs/intro/_images/admin14t.png index 47f2323c7cbd..44ae24fe4001 100644 Binary files a/docs/intro/_images/admin14t.png and b/docs/intro/_images/admin14t.png differ diff --git a/docs/intro/contributing.txt b/docs/intro/contributing.txt index b01fd35a9c52..6b3249b8239a 100644 --- a/docs/intro/contributing.txt +++ b/docs/intro/contributing.txt @@ -1,6 +1,6 @@ -=================================== -Writing your first patch for Django -=================================== +========================================== +Writing your first contribution for Django +========================================== Introduction ============ @@ -19,16 +19,16 @@ Who's this tutorial for? .. seealso:: - If you are looking for a reference on how to submit patches, see the - :doc:`/internals/contributing/writing-code/submitting-patches` + If you are looking for a reference on the details of making code + contributions, see the :doc:`/internals/contributing/writing-code/index` documentation. For this tutorial, we expect that you have at least a basic understanding of how Django works. This means you should be comfortable going through the existing tutorials on :doc:`writing your first Django app
`. In addition, you should have a good understanding of Python itself. But if you -don't, `Dive Into Python`__ is a fantastic (and free) online book for -beginning Python programmers. +don't, `Dive Into Python`_ is a fantastic (and free) online book for beginning +Python programmers. Those of you who are unfamiliar with version control systems and Trac will find that this tutorial and its links include just enough information to get started. @@ -41,25 +41,26 @@ so that it can be of use to the widest audience. .. admonition:: Where to get help: If you're having trouble going through this tutorial, please post a message - to |django-developers| or drop by `#django-dev on irc.freenode.net`__ to - chat with other Django users who might be able to help. + on the `Django Forum`_ or drop by the `Django Discord server`_ to chat with + other Django users who might be able to help. -__ https://diveinto.org/python3/table-of-contents.html -__ https://webchat.freenode.net/#django-dev +.. _Dive Into Python: https://diveintopython3.net/ +.. _Django Forum: https://forum.djangoproject.com/ +.. _Django Discord server: https://chat.djangoproject.com What does this tutorial cover? ------------------------------ -We'll be walking you through contributing a patch to Django for the first time. +We'll be walking you through contributing to Django for the first time. By the end of this tutorial, you should have a basic understanding of both the tools and the processes involved. Specifically, we'll be covering the following: * Installing Git. * Downloading a copy of Django's development version. * Running Django's test suite. -* Writing a test for your patch. -* Writing the code for your patch. -* Testing your patch. +* Writing a test for your changes. +* Writing the code for your changes. +* Testing your changes. * Submitting a pull request. * Where to look for more information. @@ -89,7 +90,7 @@ Installing Git ============== For this tutorial, you'll need Git installed to download the current -development version of Django and to generate patch files for the changes you +development version of Django and to generate a branch for the changes you make. To check whether or not you have Git installed, enter ``git`` into the command @@ -176,7 +177,7 @@ Go ahead and install the previously cloned copy of Django: The installed version of Django is now pointing at your local copy by installing in editable mode. You will immediately see any changes you make to it, which is -of great help when writing your first patch. +of great help when writing your first contribution. Creating projects with a local copy of Django --------------------------------------------- @@ -186,7 +187,11 @@ have to create a new virtual environment, :ref:`install the previously cloned local copy of Django in editable mode `, and create a new Django project outside of your local copy of Django. You will immediately see any changes you make to Django in your new project, which is -of great help when writing your first patch. +of great help when writing your first contribution, especially if testing +any changes to the UI. + +You can follow the :doc:`tutorial
` for help in creating a +Django project. Running Django's test suite for the first time ============================================== @@ -199,8 +204,8 @@ work and haven't broken other parts of Django. If you've never run Django's test suite before, it's a good idea to run it once beforehand to get familiar with its output. -Before running the test suite, install its dependencies by ``cd``-ing into the -Django ``tests/`` directory and then running: +Before running the test suite, enter the Django ``tests/`` directory using the +``cd tests`` command, and install test dependencies by running: .. console:: @@ -208,11 +213,10 @@ Django ``tests/`` directory and then running: If you encounter an error during the installation, your system might be missing a dependency for one or more of the Python packages. Consult the failing -package's documentation or search the Web with the error message that you +package's documentation or search the web with the error message that you encounter. -Now we are ready to run the test suite. If you're using GNU/Linux, macOS, or -some other flavor of Unix, run: +Now we are ready to run the test suite: .. console:: @@ -243,12 +247,12 @@ to Django's code, the entire test suite **should** pass. If you get failures or errors make sure you've followed all of the previous steps properly. See :ref:`running-unit-tests` for more information. -Note that the latest Django master may not always be stable. When developing -against master, you can check `Django's continuous integration builds`__ to -determine if the failures are specific to your machine or if they are also -present in Django's official builds. If you click to view a particular build, -you can view the "Configuration Matrix" which shows failures broken down by -Python version and database backend. +Note that the latest Django "main" branch may not always be stable. When +developing against "main", you can check `Django's continuous integration +builds`__ to determine if the failures are specific to your machine or if they +are also present in Django's official builds. If you click to view a particular +build, you can view the "Configuration Matrix" which shows failures broken down +by Python version and database backend. __ https://djangoci.com @@ -257,7 +261,8 @@ __ https://djangoci.com For this tutorial and the ticket we're working on, testing against SQLite is sufficient, however, it's possible (and sometimes necessary) to :ref:`run the tests using a different database - `. + `. When making UI changes, you will need to + :ref:`run the Selenium tests `. Working on a feature ==================== @@ -272,8 +277,8 @@ imaginary details: We'll now implement this feature and associated tests. -Creating a branch for your patch -================================ +Creating a branch +================= Before making any changes, create a new branch for the ticket: @@ -288,19 +293,19 @@ won't affect the main copy of the code that we cloned earlier. Writing some tests for your ticket ================================== -In most cases, for a patch to be accepted into Django it has to include tests. -For bug fix patches, this means writing a regression test to ensure that the -bug is never reintroduced into Django later on. A regression test should be -written in such a way that it will fail while the bug still exists and pass -once the bug has been fixed. For patches containing new features, you'll need -to include tests which ensure that the new features are working correctly. -They too should fail when the new feature is not present, and then pass once it -has been implemented. +In most cases, for a contribution to be accepted into Django it has to include +tests. For bug fix contributions, this means writing a regression test to +ensure that the bug is never reintroduced into Django later on. A regression +test should be written in such a way that it will fail while the bug still +exists and pass once the bug has been fixed. For contributions containing new +features, you'll need to include tests which ensure that the new features are +working correctly. They too should fail when the new feature is not present, +and then pass once it has been implemented. A good way to do this is to write your new tests first, before making any changes to the code. This style of development is called `test-driven development`__ and can be applied to both entire projects and -single patches. After writing your tests, you then run them to make sure that +single changes. After writing your tests, you then run them to make sure that they do indeed fail (since you haven't fixed that bug or added that feature yet). If your new tests don't fail, you'll need to fix them so that they do. After all, a regression test that passes regardless of whether a bug is present @@ -314,7 +319,7 @@ Writing a test for ticket #99999 -------------------------------- In order to resolve this ticket, we'll add a ``make_toast()`` function to the -top-level ``django`` module. First we are going to write a test that tries to +``django.shortcuts`` module. First we are going to write a test that tries to use the function and check that its output looks correct. Navigate to Django's ``tests/shortcuts/`` folder and create a new file @@ -326,7 +331,7 @@ Navigate to Django's ``tests/shortcuts/`` folder and create a new file class MakeToastTests(SimpleTestCase): def test_make_toast(self): - self.assertEqual(make_toast(), 'toast') + self.assertEqual(make_toast(), "toast") This test checks that the ``make_toast()`` returns ``'toast'``. @@ -343,7 +348,7 @@ This test checks that the ``make_toast()`` returns ``'toast'``. * After reading those, if you want something a little meatier to sink your teeth into, there's always the Python :mod:`unittest` documentation. -__ https://www.diveinto.org/python3/unit-testing.html +__ https://diveintopython3.net/unit-testing.html Running your new test --------------------- @@ -357,7 +362,9 @@ that's really what happens. ``cd`` to the Django ``tests/`` directory and run: $ ./runtests.py shortcuts If the tests ran correctly, you should see one failure corresponding to the test -method we added, with this error:: +method we added, with this error: + +.. code-block:: pytb ImportError: cannot import name 'make_toast' from 'django.shortcuts' @@ -373,7 +380,7 @@ Navigate to the ``django/`` folder and open the ``shortcuts.py`` file. At the bottom, add:: def make_toast(): - return 'toast' + return "toast" Now we need to make sure that the test we wrote earlier passes, so we can see whether the code we added is working correctly. Again, navigate to the Django @@ -389,7 +396,7 @@ function to the correct file. Running Django's test suite for the second time =============================================== -Once you've verified that your patch and your test are working correctly, it's +Once you've verified that your changes and test are working correctly, it's a good idea to run the entire Django test suite to verify that your change hasn't introduced any bugs into other areas of Django. While successfully passing the entire test suite doesn't guarantee your code is bug free, it does @@ -407,11 +414,15 @@ Writing Documentation This is a new feature, so it should be documented. Open the file ``docs/topics/http/shortcuts.txt`` and add the following at the end of the -file:: +file: + +.. code-block:: rst ``make_toast()`` ================ + .. function:: make_toast() + .. versionadded:: 2.2 Returns ``'toast'``. @@ -419,7 +430,9 @@ file:: Since this new feature will be in an upcoming release it is also added to the release notes for the next version of Django. Open the release notes for the latest version in ``docs/releases/``, which at time of writing is ``2.2.txt``. -Add a note under the "Minor Features" header:: +Add a note under the "Minor Features" header: + +.. code-block:: rst :mod:`django.shortcuts` ~~~~~~~~~~~~~~~~~~~~~~~ @@ -435,7 +448,7 @@ preview the HTML that will be generated. Previewing your changes ======================= -Now it's time to go through all the changes made in our patch. To stage all the +Now it's time to review the changes made in the branch. To stage all the changes ready for commit, run: .. console:: @@ -513,12 +526,11 @@ Use the arrow keys to move up and down. + def test_make_toast(self): + self.assertEqual(make_toast(), 'toast') -When you're done previewing the patch, hit the ``q`` key to return to the -command line. If the patch's content looked okay, it's time to commit the -changes. +When you're done previewing the changes, hit the ``q`` key to return to the +command line. If the diff looked okay, it's time to commit the changes. -Committing the changes in the patch -=================================== +Committing the changes +====================== To commit the changes: @@ -536,7 +548,7 @@ message guidelines ` and write a message like: Pushing the commit and making a pull request ============================================ -After committing the patch, send it to your fork on GitHub (substitute +After committing the changes, send it to your fork on GitHub (substitute "ticket_99999" with the name of your branch if it's different): .. console:: @@ -548,7 +560,7 @@ You can create a pull request by visiting the `Django GitHub page recently pushed branches". Click "Compare & pull request" next to it. Please don't do it for this tutorial, but on the next page that displays a -preview of the patch, you would click "Create pull request". +preview of the changes, you would click "Create pull request". Next steps ========== @@ -563,14 +575,14 @@ codebase. More information for new contributors ------------------------------------- -Before you get too into writing patches for Django, there's a little more +Before you get too into contributing to Django, there's a little more information on contributing that you should probably take a look at: * You should make sure to read Django's documentation on - :doc:`claiming tickets and submitting patches + :doc:`claiming tickets and submitting pull requests `. It covers Trac etiquette, how to claim tickets for yourself, expected - coding style for patches, and many other important details. + coding style (both for code and docs), and many other important details. * First time contributors should also read Django's :doc:`documentation for first time contributors`. It has lots of good advice for those of us who are new to helping out @@ -585,19 +597,19 @@ Finding your first real ticket ------------------------------ Once you've looked through some of that information, you'll be ready to go out -and find a ticket of your own to write a patch for. Pay special attention to +and find a ticket of your own to contribute to. Pay special attention to tickets with the "easy pickings" criterion. These tickets are often much simpler in nature and are great for first time contributors. Once you're -familiar with contributing to Django, you can move on to writing patches for -more difficult and complicated tickets. +familiar with contributing to Django, you can start working on more difficult +and complicated tickets. If you just want to get started already (and nobody would blame you!), try -taking a look at the list of `easy tickets that need patches`__ and the -`easy tickets that have patches which need improvement`__. If you're familiar +taking a look at the list of `easy tickets without a branch`__ and the +`easy tickets that have branches which need improvement`__. If you're familiar with writing tests, you can also look at the list of `easy tickets that need tests`__. Remember to follow the guidelines about claiming tickets that were mentioned in the link to Django's documentation on -:doc:`claiming tickets and submitting patches +:doc:`claiming tickets and submitting branches `. __ https://code.djangoproject.com/query?status=new&status=reopened&has_patch=0&easy=1&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority @@ -607,9 +619,9 @@ __ https://code.djangoproject.com/query?status=new&status=reopened&needs_tests=1 What's next after creating a pull request? ------------------------------------------ -After a ticket has a patch, it needs to be reviewed by a second set of eyes. +After a ticket has a branch, it needs to be reviewed by a second set of eyes. After submitting a pull request, update the ticket metadata by setting the flags on the ticket to say "has patch", "doesn't need tests", etc, so others -can find it for review. Contributing doesn't necessarily always mean writing a -patch from scratch. Reviewing existing patches is also a very helpful +can find it for review. Contributing doesn't necessarily always mean writing +code from scratch. Reviewing open pull requests is also a very helpful contribution. See :doc:`/internals/contributing/triaging-tickets` for details. diff --git a/docs/intro/index.txt b/docs/intro/index.txt index 1be0facb2234..a68d4876b704 100644 --- a/docs/intro/index.txt +++ b/docs/intro/index.txt @@ -2,7 +2,7 @@ Getting started =============== -New to Django? Or to Web development in general? Well, you came to the right +New to Django? Or to web development in general? Well, you came to the right place: read this material to quickly get up and running. .. toctree:: @@ -17,6 +17,7 @@ place: read this material to quickly get up and running. tutorial05 tutorial06 tutorial07 + tutorial08 reusable-apps whatsnext contributing @@ -31,10 +32,12 @@ place: read this material to quickly get up and running. `list of Python resources for non-programmers`_ If you already know a few other languages and want to get up to speed with - Python quickly, we recommend `Dive Into Python`_. If that's not quite your - style, there are many other `books about Python`_. + Python quickly, we recommend referring the official + `Python documentation`_, which provides comprehensive and authoritative + information about the language, as well as links to other resources such as + a list of `books about Python`_. - .. _python: https://python.org/ + .. _python: https://www.python.org/ .. _list of Python resources for non-programmers: https://wiki.python.org/moin/BeginnersGuide/NonProgrammers - .. _Dive Into Python: https://diveinto.org/python3/table-of-contents.html + .. _Python documentation: https://docs.python.org/3/ .. _books about Python: https://wiki.python.org/moin/PythonBooks diff --git a/docs/intro/install.txt b/docs/intro/install.txt index dc8399d933e6..b590df951bdb 100644 --- a/docs/intro/install.txt +++ b/docs/intro/install.txt @@ -10,17 +10,19 @@ while you walk through the introduction. Install Python ============== -Being a Python Web framework, Django requires Python. See +Being a Python web framework, Django requires Python. See :ref:`faq-python-version-support` for details. Python includes a lightweight database called SQLite_ so you won't need to set up a database just yet. -.. _sqlite: https://sqlite.org/ +.. _sqlite: https://www.sqlite.org/ Get the latest version of Python at https://www.python.org/downloads/ or with your operating system's package manager. You can verify that Python is installed by typing ``python`` from your shell; -you should see something like:: +you should see something like: + +.. code-block:: pycon Python 3.x.y [GCC 4.x] on linux diff --git a/docs/intro/overview.txt b/docs/intro/overview.txt index fa61e4ec571a..af87a01bb478 100644 --- a/docs/intro/overview.txt +++ b/docs/intro/overview.txt @@ -3,8 +3,8 @@ Django at a glance ================== Because Django was developed in a fast-paced newsroom environment, it was -designed to make common Web-development tasks fast and easy. Here's an informal -overview of how to write a database-driven Web app with Django. +designed to make common web development tasks fast and easy. Here's an informal +overview of how to write a database-driven web app with Django. The goal of this document is to give you enough technical specifics to understand how Django works, but this isn't intended to be a tutorial or @@ -26,16 +26,18 @@ representing your models -- so far, it's been solving many years' worth of database-schema problems. Here's a quick example: .. code-block:: python - :caption: mysite/news/models.py + :caption: ``news/models.py`` from django.db import models + class Reporter(models.Model): full_name = models.CharField(max_length=70) def __str__(self): return self.full_name + class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) @@ -66,7 +68,9 @@ Enjoy the free API With that, you've got a free, and rich, :doc:`Python API ` to access your data. The API is created on the fly, no code generation -necessary:: +necessary: + +.. code-block:: pycon # Import the models we created from our "news" app >>> from news.models import Article, Reporter @@ -76,7 +80,7 @@ necessary:: # Create a new Reporter. - >>> r = Reporter(full_name='John Smith') + >>> r = Reporter(full_name="John Smith") # Save the object into the database. You have to call save() explicitly. >>> r.save() @@ -96,9 +100,9 @@ necessary:: # Django provides a rich database lookup API. >>> Reporter.objects.get(id=1) - >>> Reporter.objects.get(full_name__startswith='John') + >>> Reporter.objects.get(full_name__startswith="John") - >>> Reporter.objects.get(full_name__contains='mith') + >>> Reporter.objects.get(full_name__contains="mith") >>> Reporter.objects.get(id=2) Traceback (most recent call last): @@ -107,8 +111,9 @@ necessary:: # Create an article. >>> from datetime import date - >>> a = Article(pub_date=date.today(), headline='Django is cool', - ... content='Yeah.', reporter=r) + >>> a = Article( + ... pub_date=date.today(), headline="Django is cool", content="Yeah.", reporter=r + ... ) >>> a.save() # Now the article is in the database. @@ -127,11 +132,11 @@ necessary:: # The API follows relationships as far as you need, performing efficient # JOINs for you behind the scenes. # This finds all articles by a reporter whose name starts with "John". - >>> Article.objects.filter(reporter__full_name__startswith='John') + >>> Article.objects.filter(reporter__full_name__startswith="John") ]> # Change an object by altering its attributes and calling save(). - >>> r.full_name = 'Billy Goat' + >>> r.full_name = "Billy Goat" >>> r.save() # Delete an object with delete(). @@ -146,10 +151,11 @@ a website that lets authenticated users add, change and delete objects. The only step required is to register your model in the admin site: .. code-block:: python - :caption: mysite/news/models.py + :caption: ``news/models.py`` from django.db import models + class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) @@ -157,7 +163,7 @@ only step required is to register your model in the admin site: reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) .. code-block:: python - :caption: mysite/news/admin.py + :caption: ``news/admin.py`` from django.contrib import admin @@ -176,7 +182,7 @@ start populating data. Then, develop the way data is presented to the public. Design your URLs ================ -A clean, elegant URL scheme is an important detail in a high-quality Web +A clean, elegant URL scheme is an important detail in a high-quality web application. Django encourages beautiful URL design and doesn't put any cruft in URLs, like ``.php`` or ``.asp``. @@ -189,16 +195,16 @@ Here's what a URLconf might look like for the ``Reporter``/``Article`` example above: .. code-block:: python - :caption: mysite/news/urls.py + :caption: ``news/urls.py`` from django.urls import path from . import views urlpatterns = [ - path('articles//', views.year_archive), - path('articles///', views.month_archive), - path('articles////', views.article_detail), + path("articles//", views.year_archive), + path("articles///", views.month_archive), + path("articles////", views.article_detail), ] The code above maps URL paths to Python callback functions ("views"). The path @@ -229,16 +235,17 @@ and renders the template with the retrieved data. Here's an example view for ``year_archive`` from above: .. code-block:: python - :caption: mysite/news/views.py + :caption: ``news/views.py`` from django.shortcuts import render from .models import Article + def year_archive(request, year): a_list = Article.objects.filter(pub_date__year=year) - context = {'year': year, 'article_list': a_list} - return render(request, 'news/year_archive.html', context) + context = {"year": year, "article_list": a_list} + return render(request, "news/year_archive.html", context) This example uses Django's :doc:`template system `, which has several powerful features but strives to stay simple enough for non-programmers @@ -258,7 +265,7 @@ Let's say the ``news/year_archive.html`` template was found. Here's what that might look like: .. code-block:: html+django - :caption: mysite/news/templates/news/year_archive.html + :caption: ``news/templates/news/year_archive.html`` {% extends "base.html" %} @@ -299,15 +306,15 @@ Here's what the "base.html" template, including the use of :doc:`static files `, might look like: .. code-block:: html+django - :caption: mysite/templates/base.html + :caption: ``templates/base.html`` {% load static %} - + {% block title %}{% endblock %} - Logo + Logo {% block content %}{% endblock %} diff --git a/docs/intro/reusable-apps.txt b/docs/intro/reusable-apps.txt index c32688680321..8c12a3628487 100644 --- a/docs/intro/reusable-apps.txt +++ b/docs/intro/reusable-apps.txt @@ -2,11 +2,11 @@ Advanced tutorial: How to write reusable apps ============================================= -This advanced tutorial begins where :doc:`Tutorial 7
` -left off. We'll be turning our Web-poll into a standalone Python package +This advanced tutorial begins where :doc:`Tutorial 8
` +left off. We'll be turning our web-poll into a standalone Python package you can reuse in new projects and share with other people. -If you haven't recently completed Tutorials 1–7, we encourage you to review +If you haven't recently completed Tutorials 1–8, we encourage you to review these so that your example project matches the one described below. Reusability matters @@ -53,9 +53,11 @@ projects and ready to publish for others to install and use. Your project and your reusable app ================================== -After the previous tutorials, our project should look like this:: +After the previous tutorials, our project should look like this: - mysite/ +.. code-block:: text + + djangotutorial/ manage.py mysite/ __init__.py @@ -74,7 +76,7 @@ After the previous tutorials, our project should look like this:: static/ polls/ images/ - background.gif + background.png style.css templates/ polls/ @@ -88,12 +90,12 @@ After the previous tutorials, our project should look like this:: admin/ base_site.html -You created ``mysite/templates`` in :doc:`Tutorial 7
`, -and ``polls/templates`` in :doc:`Tutorial 3
`. Now perhaps -it is clearer why we chose to have separate template directories for the -project and application: everything that is part of the polls application is in -``polls``. It makes the application self-contained and easier to drop into a -new project. +You created ``djangotutorial/templates`` in :doc:`Tutorial 7 +
`, and ``polls/templates`` in +:doc:`Tutorial 3
`. Now perhaps it is clearer why we chose +to have separate template directories for the project and application: +everything that is part of the polls application is in ``polls``. It makes the +application self-contained and easier to drop into a new project. The ``polls`` directory could now be copied into a new Django project and immediately reused. It's not quite ready to be published though. For that, we @@ -105,16 +107,13 @@ Installing some prerequisites ============================= The current state of Python packaging is a bit muddled with various tools. For -this tutorial, we're going to use setuptools_ to build our package. It's the -recommended packaging tool (merged with the ``distribute`` fork). We'll also be -using `pip`_ to install and uninstall it. You should install these +this tutorial, we're going to use :pypi:`setuptools` to build our package. It's +the recommended packaging tool (merged with the ``distribute`` fork). We'll +also be using :pypi:`pip` to install and uninstall it. You should install these two packages now. If you need help, you can refer to :ref:`how to install Django with pip`. You can install ``setuptools`` the same way. -.. _setuptools: https://pypi.org/project/setuptools/ -.. _pip: https://pypi.org/project/pip/ - Packaging your app ================== @@ -122,16 +121,17 @@ Python *packaging* refers to preparing your app in a specific format that can be easily installed and used. Django itself is packaged very much like this. For a small app like polls, this process isn't too difficult. -#. First, create a parent directory for ``polls``, outside of your Django +#. First, create a parent directory for the package, outside of your Django project. Call this directory ``django-polls``. .. admonition:: Choosing a name for your app - When choosing a name for your package, check resources like PyPI to avoid - naming conflicts with existing packages. It's often useful to prepend - ``django-`` to your module name when creating a package to distribute. - This helps others looking for Django apps identify your app as Django - specific. + When choosing a name for your package, check PyPI to avoid naming + conflicts with existing packages. We recommend using a ``django-`` + prefix for package names, to identify your package as specific to + Django, and a corresponding ``django_`` prefix for your module name. For + example, the ``django-ratelimit`` package contains the + ``django_ratelimit`` module. Application labels (that is, the final part of the dotted path to application packages) *must* be unique in :setting:`INSTALLED_APPS`. @@ -139,19 +139,35 @@ this. For a small app like polls, this process isn't too difficult. `, for example ``auth``, ``admin``, or ``messages``. -#. Move the ``polls`` directory into the ``django-polls`` directory. +#. Move the ``polls`` directory into ``django-polls`` directory, and rename it + to ``django_polls``. + +#. Edit ``django_polls/apps.py`` so that :attr:`~.AppConfig.name` refers to the + new module name and add :attr:`~.AppConfig.label` to give a short name for + the app: + + .. code-block:: python + :caption: ``django-polls/django_polls/apps.py`` + + from django.apps import AppConfig + + + class PollsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "django_polls" + label = "polls" #. Create a file ``django-polls/README.rst`` with the following contents: .. code-block:: rst - :caption: django-polls/README.rst + :caption: ``django-polls/README.rst`` - ===== - Polls - ===== + ============ + django-polls + ============ - Polls is a Django app to conduct Web-based polls. For each question, - visitors can choose between a fixed number of answers. + django-polls is a Django app to conduct web-based polls. For each + question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. @@ -161,20 +177,19 @@ this. For a small app like polls, this process isn't too difficult. 1. Add "polls" to your INSTALLED_APPS setting like this:: INSTALLED_APPS = [ - ... - 'polls', + ..., + "django_polls", ] 2. Include the polls URLconf in your project urls.py like this:: - path('polls/', include('polls.urls')), + path("polls/", include("django_polls.urls")), - 3. Run ``python manage.py migrate`` to create the polls models. + 3. Run ``python manage.py migrate`` to create the models. - 4. Start the development server and visit http://127.0.0.1:8000/admin/ - to create a poll (you'll need the Admin app enabled). + 4. Start the development server and visit the admin to create a poll. - 5. Visit http://127.0.0.1:8000/polls/ to participate in the poll. + 5. Visit the ``/polls/`` URL to participate in the poll. #. Create a ``django-polls/LICENSE`` file. Choosing a license is beyond the scope of this tutorial, but suffice it to say that code released publicly @@ -183,80 +198,75 @@ this. For a small app like polls, this process isn't too difficult. license. Just be aware that your licensing choice will affect who is able to use your code. -#. Next we'll create ``setup.cfg`` and ``setup.py`` files which detail how to - build and install the app. A full explanation of these files is beyond the - scope of this tutorial, but the `setuptools documentation - `_ has a good explanation. - Create the files ``django-polls/setup.cfg`` and ``django-polls/setup.py`` - with the following contents: - - .. code-block:: ini - :caption: django-polls/setup.cfg - - [metadata] - name = django-polls - version = 0.1 - description = A Django app to conduct Web-based polls. - long_description = file: README.rst - url = https://www.example.com/ - author = Your Name - author_email = yourname@example.com - license = BSD-3-Clause # Example license - classifiers = - Environment :: Web Environment - Framework :: Django - Framework :: Django :: X.Y # Replace "X.Y" as appropriate - Intended Audience :: Developers - License :: OSI Approved :: BSD License - Operating System :: OS Independent - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - Programming Language :: Python :: 3.8 - Topic :: Internet :: WWW/HTTP - Topic :: Internet :: WWW/HTTP :: Dynamic Content - - [options] - include_package_data = true - packages = find: - - .. code-block:: python - :caption: django-polls/setup.py - - from setuptools import setup - - setup() - -#. Only Python modules and packages are included in the package by default. To - include additional files, we'll need to create a ``MANIFEST.in`` file. The - setuptools docs referred to in the previous step discuss this file in more - details. To include the templates, the ``README.rst`` and our ``LICENSE`` - file, create a file ``django-polls/MANIFEST.in`` with the following - contents: +#. Next we'll create the ``pyproject.toml`` file which details how to build and + install the app. A full explanation of this file is beyond the scope of this + tutorial, but the `Python Packaging User Guide + `_ has a good + explanation. Create the ``django-polls/pyproject.toml`` file with the + following contents: + + .. code-block:: toml + :caption: ``django-polls/pyproject.toml`` + + [build-system] + requires = ["setuptools>=61.0"] + build-backend = "setuptools.build_meta" + + [project] + name = "django-polls" + version = "0.1" + dependencies = [ + "django>=X.Y", # Replace "X.Y" as appropriate + ] + description = "A Django app to conduct web-based polls." + readme = "README.rst" + requires-python = ">= 3.12" + authors = [ + {name = "Your Name", email = "yourname@example.com"}, + ] + classifiers = [ + "Environment :: Web Environment", + "Framework :: Django", + "Framework :: Django :: X.Y", # Replace "X.Y" as appropriate + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Internet :: WWW/HTTP :: Dynamic Content", + ] + + [project.urls] + Homepage = "https://www.example.com/" + +#. Many common files and Python modules and packages are included in the + package by default. To include additional files, we'll need to create a + ``MANIFEST.in`` file. To include the templates and static files, create a + file ``django-polls/MANIFEST.in`` with the following contents: .. code-block:: text - :caption: django-polls/MANIFEST.in + :caption: ``django-polls/MANIFEST.in`` - include LICENSE - include README.rst - recursive-include polls/static * - recursive-include polls/templates * + recursive-include django_polls/static * + recursive-include django_polls/templates * #. It's optional, but recommended, to include detailed documentation with your app. Create an empty directory ``django-polls/docs`` for future - documentation. Add an additional line to ``django-polls/MANIFEST.in``:: - - recursive-include docs * + documentation. Note that the ``docs`` directory won't be included in your package unless you add some files to it. Many Django apps also provide their documentation online through sites like `readthedocs.org `_. -#. Try building your package with ``python setup.py sdist`` (run from inside - ``django-polls``). This creates a directory called ``dist`` and builds your - new package, ``django-polls-0.1.tar.gz``. +#. Check that the :pypi:`build` package is installed (``python -m pip install + build``) and try building your package by running ``python -m build`` inside + ``django-polls``. This creates a directory called ``dist`` and builds your + new package into source and binary formats, ``django-polls-0.1.tar.gz`` and + ``django_polls-0.1-py3-none-any.whl``. For more information on packaging, see Python's `Tutorial on Packaging and Distributing Projects @@ -281,16 +291,27 @@ working. We'll now fix this by installing our new ``django-polls`` package. solution (see below). #. To install the package, use pip (you already :ref:`installed it - `, right?):: + `, right?): + + .. code-block:: shell + + python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz + +#. Update ``mysite/settings.py`` to point to the new module name:: - python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz + INSTALLED_APPS = [ + "django_polls.apps.PollsConfig", + ..., + ] -#. With luck, your Django project should now work correctly again. Run the - server again to confirm this. +#. Update ``mysite/urls.py`` to point to the new module name:: -#. To uninstall the package, use pip:: + urlpatterns = [ + path("polls/", include("django_polls.urls")), + ..., + ] - python -m pip uninstall django-polls +#. Run the development server to confirm the project continues to work. Publishing your app =================== @@ -310,7 +331,7 @@ the world! If this wasn't just an example, you could now: Installing Python packages with a virtual environment ===================================================== -Earlier, we installed the polls app as a user library. This has some +Earlier, we installed ``django-polls`` as a user library. This has some disadvantages: * Modifying the user libraries can affect other Python software on your system. diff --git a/docs/intro/tutorial01.txt b/docs/intro/tutorial01.txt index 05f99b6f7615..0a766f909937 100644 --- a/docs/intro/tutorial01.txt +++ b/docs/intro/tutorial01.txt @@ -23,16 +23,13 @@ in a shell prompt (indicated by the $ prefix): If Django is installed, you should see the version of your installation. If it isn't, you'll get an error telling "No module named django". -This tutorial is written for Django |version|, which supports Python 3.6 and +This tutorial is written for Django |version|, which supports Python 3.12 and later. If the Django version doesn't match, you can refer to the tutorial for your version of Django by using the version switcher at the bottom right corner of this page, or update Django to the newest version. If you're using an older version of Python, check :ref:`faq-python-version-support` to find a compatible version of Django. -See :doc:`How to install Django ` for advice on how to remove -older versions of Django and install a newer one. - .. admonition:: Where to get help: If you're having trouble going through this tutorial, please head over to @@ -48,14 +45,21 @@ including database configuration, Django-specific options and application-specific settings. From the command line, ``cd`` into a directory where you'd like to store your -code, then run the following command: +code and create a new directory named ``djangotutorial``. (This directory name +doesn't matter to Django; you can rename it to anything you like.) .. console:: - $ django-admin startproject mysite + $ mkdir djangotutorial + +Then, run the following command to bootstrap a new Django project: + +.. console:: -This will create a ``mysite`` directory in your current directory. If it didn't -work, see :ref:`troubleshooting-django-admin`. + $ django-admin startproject mysite djangotutorial + +This will create a project called ``mysite`` inside the ``djangotutorial`` +directory. If it didn't work, see :ref:`troubleshooting-django-admin`. .. note:: @@ -64,21 +68,11 @@ work, see :ref:`troubleshooting-django-admin`. ``django`` (which will conflict with Django itself) or ``test`` (which conflicts with a built-in Python package). -.. admonition:: Where should this code live? - - If your background is in plain old PHP (with no use of modern frameworks), - you're probably used to putting code under the Web server's document root - (in a place such as ``/var/www``). With Django, you don't do that. It's - not a good idea to put any of this Python code within your Web server's - document root, because it risks the possibility that people may be able - to view your code over the Web. That's not good for security. - - Put your code in some directory **outside** of the document root, such as - :file:`/home/mycode`. +Let's look at what :djadmin:`startproject` created: -Let's look at what :djadmin:`startproject` created:: +.. code-block:: text - mysite/ + djangotutorial/ manage.py mysite/ __init__.py @@ -89,14 +83,11 @@ Let's look at what :djadmin:`startproject` created:: These files are: -* The outer :file:`mysite/` root directory is a container for your project. Its - name doesn't matter to Django; you can rename it to anything you like. - * :file:`manage.py`: A command-line utility that lets you interact with this Django project in various ways. You can read all the details about :file:`manage.py` in :doc:`/ref/django-admin`. -* The inner :file:`mysite/` directory is the actual Python package for your +* :file:`mysite/`: A directory that is the actual Python package for your project. Its name is the Python package name you'll need to use to import anything inside it (e.g. ``mysite.urls``). @@ -121,8 +112,8 @@ These files are: The development server ====================== -Let's verify your Django project works. Change into the outer :file:`mysite` directory, if -you haven't already, and run the following commands: +Let's verify your Django project works. Change into the :file:`djangotutorial` +directory, if you haven't already, and run the following commands: .. console:: @@ -144,47 +135,27 @@ You'll see the following output on the command line: Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. + WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead. + For more information on production servers see: https://docs.djangoproject.com/en/|version|/howto/deployment/ + .. note:: Ignore the warning about unapplied database migrations for now; we'll deal with the database shortly. -You've started the Django development server, a lightweight Web server written +Now that the server's running, visit http://127.0.0.1:8000/ with your web +browser. You'll see a "Congratulations!" page, with a rocket taking off. +It worked! + +You've started the Django development server, a lightweight web server written purely in Python. We've included this with Django so you can develop things rapidly, without having to deal with configuring a production server -- such as Apache -- until you're ready for production. Now's a good time to note: **don't** use this server in anything resembling a production environment. It's intended only for use while developing. (We're in -the business of making Web frameworks, not Web servers.) - -Now that the server's running, visit http://127.0.0.1:8000/ with your Web -browser. You'll see a "Congratulations!" page, with a rocket taking off. -It worked! - -.. admonition:: Changing the port - - By default, the :djadmin:`runserver` command starts the development server - on the internal IP at port 8000. - - If you want to change the server's port, pass - it as a command-line argument. For instance, this command starts the server - on port 8080: - - .. console:: - - $ python manage.py runserver 8080 - - If you want to change the server's IP, pass it along with the port. For - example, to listen on all available public IPs (which is useful if you are - running Vagrant or want to show off your work on other computers on the - network), use: +the business of making web frameworks, not web servers.) - .. console:: - - $ python manage.py runserver 0:8000 - - **0** is a shortcut for **0.0.0.0**. Full docs for the development server - can be found in the :djadmin:`runserver` reference. +(To serve the site on a different port, see the :djadmin:`runserver` reference.) .. admonition:: Automatic reloading of :djadmin:`runserver` @@ -206,16 +177,14 @@ rather than creating directories. .. admonition:: Projects vs. apps - What's the difference between a project and an app? An app is a Web - application that does something -- e.g., a Weblog system, a database of + What's the difference between a project and an app? An app is a web + application that does something -- e.g., a blog system, a database of public records or a small poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects. -Your apps can live anywhere on your :ref:`Python path `. In -this tutorial, we'll create our poll app in the same directory as your -:file:`manage.py` file so that it can be imported as its own top-level module, -rather than a submodule of ``mysite``. +Your apps can live anywhere in your :ref:`Python path `. In +this tutorial, we'll create our poll app inside the ``djangotutorial`` folder. To create your app, make sure you're in the same directory as :file:`manage.py` and type this command: @@ -224,7 +193,9 @@ and type this command: $ python manage.py startapp polls -That'll create a directory :file:`polls`, which is laid out like this:: +That'll create a directory :file:`polls`, which is laid out like this: + +.. code-block:: text polls/ __init__.py @@ -245,7 +216,7 @@ Let's write the first view. Open the file ``polls/views.py`` and put the following Python code in it: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.http import HttpResponse @@ -253,11 +224,28 @@ and put the following Python code in it: def index(request): return HttpResponse("Hello, world. You're at the polls index.") -This is the simplest view possible in Django. To call the view, we need to map -it to a URL - and for this we need a URLconf. +This is the most basic view possible in Django. To access it in a browser, we +need to map it to a URL - and for this we need to define a URL configuration, +or "URLconf" for short. These URL configurations are defined inside each +Django app, and they are Python files named ``urls.py``. + +To define a URLconf for the ``polls`` app, create a file ``polls/urls.py`` +with the following content: -To create a URLconf in the polls directory, create a file called ``urls.py``. -Your app directory should now look like:: +.. code-block:: python + :caption: ``polls/urls.py`` + + from django.urls import path + + from . import views + + urlpatterns = [ + path("", views.index, name="index"), + ] + +Your app directory should now look like: + +.. code-block:: text polls/ __init__.py @@ -270,34 +258,24 @@ Your app directory should now look like:: urls.py views.py -In the ``polls/urls.py`` file include the following code: - -.. code-block:: python - :caption: polls/urls.py - - from django.urls import path - - from . import views - - urlpatterns = [ - path('', views.index, name='index'), - ] - -The next step is to point the root URLconf at the ``polls.urls`` module. In -``mysite/urls.py``, add an import for ``django.urls.include`` and insert an +The next step is to configure the root URLconf in the ``mysite`` project to +include the URLconf defined in ``polls.urls``. To do this, add an import for +``django.urls.include`` in ``mysite/urls.py`` and insert an :func:`~django.urls.include` in the ``urlpatterns`` list, so you have: .. code-block:: python - :caption: mysite/urls.py + :caption: ``mysite/urls.py`` from django.contrib import admin from django.urls import include, path urlpatterns = [ - path('polls/', include('polls.urls')), - path('admin/', admin.site.urls), + path("polls/", include("polls.urls")), + path("admin/", admin.site.urls), ] +The :func:`~django.urls.path` function expects at least two arguments: +``route`` and ``view``. The :func:`~django.urls.include` function allows referencing other URLconfs. Whenever Django encounters :func:`~django.urls.include`, it chops off whatever part of the URL matched up to that point and sends the remaining string to the @@ -312,7 +290,8 @@ app will still work. .. admonition:: When to use :func:`~django.urls.include()` You should always use ``include()`` when you include other URL patterns. - ``admin.site.urls`` is the only exception to this. + The only exception is ``admin.site.urls``, which is a pre-built URLconf + provided by Django for the default admin site. You have now wired an ``index`` view into the URLconf. Verify it's working with the following command: @@ -330,45 +309,6 @@ text "*Hello, world. You're at the polls index.*", which you defined in the If you get an error page here, check that you're going to http://localhost:8000/polls/ and not http://localhost:8000/. -The :func:`~django.urls.path` function is passed four arguments, two required: -``route`` and ``view``, and two optional: ``kwargs``, and ``name``. -At this point, it's worth reviewing what these arguments are for. - -:func:`~django.urls.path` argument: ``route`` ---------------------------------------------- - -``route`` is a string that contains a URL pattern. When processing a request, -Django starts at the first pattern in ``urlpatterns`` and makes its way down -the list, comparing the requested URL against each pattern until it finds one -that matches. - -Patterns don't search GET and POST parameters, or the domain name. For example, -in a request to ``https://www.example.com/myapp/``, the URLconf will look for -``myapp/``. In a request to ``https://www.example.com/myapp/?page=3``, the -URLconf will also look for ``myapp/``. - -:func:`~django.urls.path` argument: ``view`` --------------------------------------------- - -When Django finds a matching pattern, it calls the specified view function with -an :class:`~django.http.HttpRequest` object as the first argument and any -"captured" values from the route as keyword arguments. We'll give an example -of this in a bit. - -:func:`~django.urls.path` argument: ``kwargs`` ----------------------------------------------- - -Arbitrary keyword arguments can be passed in a dictionary to the target view. We -aren't going to use this feature of Django in the tutorial. - -:func:`~django.urls.path` argument: ``name`` --------------------------------------------- - -Naming your URL lets you refer to it unambiguously from elsewhere in Django, -especially from within templates. This powerful feature allows you to make -global changes to the URL patterns of your project while only touching a single -file. - When you're comfortable with the basic request and response flow, read :doc:`part 2 of this tutorial ` to start working with the database. diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt index 8ee3ec8159f2..f78a83d1bddd 100644 --- a/docs/intro/tutorial02.txt +++ b/docs/intro/tutorial02.txt @@ -3,8 +3,8 @@ Writing your first Django app, part 2 ===================================== This tutorial begins where :doc:`Tutorial 1 ` left off. -We'll setup the database, create your first model, and get a quick introduction -to Django's automatically-generated admin site. +We'll set up the database, create your first model, and get a quick +introduction to Django's automatically-generated admin site. .. admonition:: Where to get help: @@ -17,48 +17,15 @@ Database setup Now, open up :file:`mysite/settings.py`. It's a normal Python module with module-level variables representing Django settings. -By default, the configuration uses SQLite. If you're new to databases, or -you're just interested in trying Django, this is the easiest choice. SQLite is -included in Python, so you won't need to install anything else to support your -database. When starting your first real project, however, you may want to use a -more scalable database like PostgreSQL, to avoid database-switching headaches -down the road. - -If you wish to use another database, install the appropriate :ref:`database -bindings ` and change the following keys in the -:setting:`DATABASES` ``'default'`` item to match your database connection -settings: - -* :setting:`ENGINE ` -- Either - ``'django.db.backends.sqlite3'``, - ``'django.db.backends.postgresql'``, - ``'django.db.backends.mysql'``, or - ``'django.db.backends.oracle'``. Other backends are :ref:`also available - `. - -* :setting:`NAME` -- The name of your database. If you're using SQLite, the - database will be a file on your computer; in that case, :setting:`NAME` - should be the full absolute path, including filename, of that file. The - default value, ``BASE_DIR / 'db.sqlite3'``, will store the file in your - project directory. - -If you are not using SQLite as your database, additional settings such as -:setting:`USER`, :setting:`PASSWORD`, and :setting:`HOST` must be added. -For more details, see the reference documentation for :setting:`DATABASES`. - -.. admonition:: For databases other than SQLite - - If you're using a database besides SQLite, make sure you've created a - database by this point. Do that with "``CREATE DATABASE database_name;``" - within your database's interactive prompt. - - Also make sure that the database user provided in :file:`mysite/settings.py` - has "create database" privileges. This allows automatic creation of a - :ref:`test database ` which will be needed in a later - tutorial. - - If you're using SQLite, you don't need to create anything beforehand - the - database file will be created automatically when it is needed. +By default, the :setting:`DATABASES` configuration uses SQLite. If you're new +to databases, or you're just interested in trying Django, this is the easiest +choice. SQLite is included in Python, so you won't need to install anything +else to support your database. When starting your first real project, however, +you may want to use a more scalable database like PostgreSQL, to avoid +database-switching headaches down the road. + +If you wish to use another database, see :ref:`details to customize and get +your database running `. While you're editing :file:`mysite/settings.py`, set :setting:`TIME_ZONE` to your time zone. @@ -100,7 +67,7 @@ in your :file:`mysite/settings.py` file and the database migrations shipped with the app (we'll cover those later). You'll see a message for each migration it applies. If you're interested, run the command-line client for your database and type ``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MariaDB, MySQL), -``.schema`` (SQLite), or ``SELECT TABLE_NAME FROM USER_TABLES;`` (Oracle) to +``.tables`` (SQLite), or ``SELECT TABLE_NAME FROM USER_TABLES;`` (Oracle) to display the tables Django created. .. admonition:: For the minimalists @@ -122,10 +89,10 @@ additional metadata. .. admonition:: Philosophy - A model is the single, definitive source of truth about your data. It contains - the essential fields and behaviors of the data you're storing. Django follows - the :ref:`DRY Principle `. The goal is to define your data model in one - place and automatically derive things from it. + A model is the single, definitive source of information about your data. It + contains the essential fields and behaviors of the data you're storing. + Django follows the :ref:`DRY Principle `. The goal is to define your + data model in one place and automatically derive things from it. This includes the migrations - unlike in Ruby On Rails, for example, migrations are entirely derived from your models file, and are essentially a @@ -141,14 +108,14 @@ These concepts are represented by Python classes. Edit the :file:`polls/models.py` file so it looks like this: .. code-block:: python - :caption: polls/models.py + :caption: ``polls/models.py`` from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) - pub_date = models.DateTimeField('date published') + pub_date = models.DateTimeField("date published") class Choice(models.Model): @@ -217,16 +184,16 @@ add that dotted path to the :setting:`INSTALLED_APPS` setting. It'll look like this: .. code-block:: python - :caption: mysite/settings.py + :caption: ``mysite/settings.py`` INSTALLED_APPS = [ - 'polls.apps.PollsConfig', - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', + "polls.apps.PollsConfig", + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", ] Now Django knows to include the ``polls`` app. Let's run another command: @@ -241,8 +208,8 @@ You should see something similar to the following: Migrations for 'polls': polls/migrations/0001_initial.py - - Create model Question - - Create model Choice + + Create model Question + + Create model Choice By running ``makemigrations``, you're telling Django that you've made some changes to your models (in this case, you've made new ones) and that @@ -274,7 +241,7 @@ readability): -- Create model Question -- CREATE TABLE "polls_question" ( - "id" serial NOT NULL PRIMARY KEY, + "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, "question_text" varchar(200) NOT NULL, "pub_date" timestamp with time zone NOT NULL ); @@ -282,10 +249,10 @@ readability): -- Create model Choice -- CREATE TABLE "polls_choice" ( - "id" serial NOT NULL PRIMARY KEY, + "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, - "question_id" integer NOT NULL + "question_id" bigint NOT NULL ); ALTER TABLE "polls_choice" ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id" @@ -315,10 +282,10 @@ Note the following: PostgreSQL to not enforce the foreign key until the end of the transaction. * It's tailored to the database you're using, so database-specific field types - such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or ``integer - primary key autoincrement`` (SQLite) are handled for you automatically. Same - goes for the quoting of field names -- e.g., using double quotes or - single quotes. + such as ``auto_increment`` (MySQL), ``bigint PRIMARY KEY GENERATED BY DEFAULT + AS IDENTITY`` (PostgreSQL), or ``integer primary key autoincrement`` (SQLite) + are handled for you automatically. Same goes for the quoting of field names + -- e.g., using double quotes or single quotes. * The :djadmin:`sqlmigrate` command doesn't actually run the migration on your database - instead, it prints it to the screen so that you can see what SQL @@ -380,10 +347,12 @@ API Django gives you. To invoke the Python shell, use this command: We're using this instead of simply typing "python", because :file:`manage.py` sets the :envvar:`DJANGO_SETTINGS_MODULE` environment variable, which gives Django the Python import path to your :file:`mysite/settings.py` file. +By default, the :djadmin:`shell` command automatically imports the models from +your :setting:`INSTALLED_APPS`. -Once you're in the shell, explore the :doc:`database API `:: +Once you're in the shell, explore the :doc:`database API `: - >>> from polls.models import Choice, Question # Import the model classes we just wrote. +.. code-block:: pycon # No questions are in the system yet. >>> Question.objects.all() @@ -407,7 +376,7 @@ Once you're in the shell, explore the :doc:`database API `:: >>> q.question_text "What's new?" >>> q.pub_date - datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=) + datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.UTC) # Change values by changing the attributes, then calling save(). >>> q.question_text = "What's up?" @@ -424,15 +393,17 @@ representation of this object. Let's fix that by editing the ``Question`` model ``Choice``: .. code-block:: python - :caption: polls/models.py + :caption: ``polls/models.py`` from django.db import models + class Question(models.Model): # ... def __str__(self): return self.question_text + class Choice(models.Model): # ... def __str__(self): @@ -448,7 +419,7 @@ automatically-generated admin. Let's also add a custom method to this model: .. code-block:: python - :caption: polls/models.py + :caption: ``polls/models.py`` import datetime @@ -468,9 +439,9 @@ you aren't familiar with time zone handling in Python, you can learn more in the :doc:`time zone support docs `. Save these changes and start a new Python interactive shell by running -``python manage.py shell`` again:: +``python manage.py shell`` again: - >>> from polls.models import Choice, Question +.. code-block:: pycon # Make sure our __str__() addition worked. >>> Question.objects.all() @@ -480,7 +451,7 @@ Save these changes and start a new Python interactive shell by running # keyword arguments. >>> Question.objects.filter(id=1) ]> - >>> Question.objects.filter(question_text__startswith='What') + >>> Question.objects.filter(question_text__startswith="What") ]> # Get the question that was published this year. @@ -509,8 +480,8 @@ Save these changes and start a new Python interactive shell by running # Give the Question a couple of Choices. The create call constructs a new # Choice object, does the INSERT statement, adds the choice to the set # of available choices and returns the new Choice object. Django creates - # a set to hold the "other side" of a ForeignKey relation - # (e.g. a question's choice) which can be accessed via the API. + # a set (defined as "choice_set") to hold the "other side" of a ForeignKey + # relation (e.g. a question's choice) which can be accessed via the API. >>> q = Question.objects.get(pk=1) # Display any choices from the related object set -- none so far. @@ -518,11 +489,11 @@ Save these changes and start a new Python interactive shell by running # Create three choices. - >>> q.choice_set.create(choice_text='Not much', votes=0) + >>> q.choice_set.create(choice_text="Not much", votes=0) - >>> q.choice_set.create(choice_text='The sky', votes=0) + >>> q.choice_set.create(choice_text="The sky", votes=0) - >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0) + >>> c = q.choice_set.create(choice_text="Just hacking again", votes=0) # Choice objects have API access to their related Question objects. >>> c.question @@ -543,7 +514,7 @@ Save these changes and start a new Python interactive shell by running , , ]> # Let's delete one of the choices. Use delete() for that. - >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') + >>> c = q.choice_set.filter(choice_text__startswith="Just hacking") >>> c.delete() For more information on model relations, see :doc:`Accessing related objects @@ -613,7 +584,7 @@ If the server is not running start it like so: $ python manage.py runserver -Now, open a Web browser and go to "/admin/" on your local domain -- e.g., +Now, open a web browser and go to "/admin/" on your local domain -- e.g., http://127.0.0.1:8000/admin/. You should see the admin's login screen: .. image:: _images/admin01.png @@ -646,7 +617,7 @@ have an admin interface. To do this, open the :file:`polls/admin.py` file, and edit it to look like this: .. code-block:: python - :caption: polls/admin.py + :caption: ``polls/admin.py`` from django.contrib import admin diff --git a/docs/intro/tutorial03.txt b/docs/intro/tutorial03.txt index 3d83c56b91ef..a19f9c949d70 100644 --- a/docs/intro/tutorial03.txt +++ b/docs/intro/tutorial03.txt @@ -3,7 +3,7 @@ Writing your first Django app, part 3 ===================================== This tutorial begins where :doc:`Tutorial 2 ` left off. We're -continuing the Web-poll application and will focus on creating the public +continuing the web-poll application and will focus on creating the public interface -- "views." .. admonition:: Where to get help: @@ -14,7 +14,7 @@ interface -- "views." Overview ======== -A view is a "type" of Web page in your Django application that generally serves +A view is a "type" of web page in your Django application that generally serves a specific function and has a specific template. For example, in a blog application, you might have the following views: @@ -70,15 +70,17 @@ Now let's add a few more views to ``polls/views.py``. These views are slightly different, because they take an argument: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) + def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) + def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id) @@ -86,7 +88,7 @@ Wire these new views into the ``polls.urls`` module by adding the following :func:`~django.urls.path` calls: .. code-block:: python - :caption: polls/urls.py + :caption: ``polls/urls.py`` from django.urls import path @@ -94,17 +96,17 @@ Wire these new views into the ``polls.urls`` module by adding the following urlpatterns = [ # ex: /polls/ - path('', views.index, name='index'), + path("", views.index, name="index"), # ex: /polls/5/ - path('/', views.detail, name='detail'), + path("/", views.detail, name="detail"), # ex: /polls/5/results/ - path('/results/', views.results, name='results'), + path("/results/", views.results, name="results"), # ex: /polls/5/vote/ - path('/vote/', views.vote, name='vote'), + path("/vote/", views.vote, name="vote"), ] Take a look in your browser, at "/polls/34/". It'll run the ``detail()`` -method and display whatever ID you provide in the URL. Try +function and display whatever ID you provide in the URL. Try "/polls/34/results/" and "/polls/34/vote/" too -- these will display the placeholder results and voting pages. @@ -115,15 +117,18 @@ and traverses the patterns in order. After finding the match at ``'polls/'``, it strips off the matching text (``"polls/"``) and sends the remaining text -- ``"34/"`` -- to the 'polls.urls' URLconf for further processing. There it matches ``'/'``, resulting in a call to the ``detail()`` view -like so:: +like so: + +.. code-block:: pycon detail(request=, question_id=34) The ``question_id=34`` part comes from ````. Using angle brackets "captures" part of the URL and sends it as a keyword argument to the -view function. The ``:question_id>`` part of the string defines the name that -will be used to identify the matched pattern, and the `` @@ -212,12 +218,12 @@ Put the following code in that template: To make the tutorial shorter, all template examples use incomplete HTML. In your own projects you should use `complete HTML documents`__. -__ https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started#Anatomy_of_an_HTML_document +__ https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started#anatomy_of_an_html_document Now let's update our ``index`` view in ``polls/views.py`` to use the template: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.http import HttpResponse from django.template import loader @@ -226,11 +232,9 @@ Now let's update our ``index`` view in ``polls/views.py`` to use the template: def index(request): - latest_question_list = Question.objects.order_by('-pub_date')[:5] - template = loader.get_template('polls/index.html') - context = { - 'latest_question_list': latest_question_list, - } + latest_question_list = Question.objects.order_by("-pub_date")[:5] + template = loader.get_template("polls/index.html") + context = {"latest_question_list": latest_question_list} return HttpResponse(template.render(context, request)) That code loads the template called ``polls/index.html`` and passes it a @@ -250,7 +254,7 @@ template. Django provides a shortcut. Here's the full ``index()`` view, rewritten: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.shortcuts import render @@ -258,9 +262,9 @@ rewritten: def index(request): - latest_question_list = Question.objects.order_by('-pub_date')[:5] - context = {'latest_question_list': latest_question_list} - return render(request, 'polls/index.html', context) + latest_question_list = Question.objects.order_by("-pub_date")[:5] + context = {"latest_question_list": latest_question_list} + return render(request, "polls/index.html", context) Note that once we've done this in all these views, we no longer need to import :mod:`~django.template.loader` and :class:`~django.http.HttpResponse` (you'll @@ -279,19 +283,21 @@ Now, let's tackle the question detail view -- the page that displays the questio for a given poll. Here's the view: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.http import Http404 from django.shortcuts import render from .models import Question + + # ... def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Question does not exist") - return render(request, 'polls/detail.html', {'question': question}) + return render(request, "polls/detail.html", {"question": question}) The new concept here: The view raises the :exc:`~django.http.Http404` exception if a question with the requested ID doesn't exist. @@ -301,7 +307,7 @@ later, but if you'd like to quickly get the above example working, a file containing just: .. code-block:: html+django - :caption: polls/templates/polls/detail.html + :caption: ``polls/templates/polls/detail.html`` {{ question }} @@ -315,15 +321,17 @@ and raise :exc:`~django.http.Http404` if the object doesn't exist. Django provides a shortcut. Here's the ``detail()`` view, rewritten: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.shortcuts import get_object_or_404, render from .models import Question + + # ... def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) - return render(request, 'polls/detail.html', {'question': question}) + return render(request, "polls/detail.html", {"question": question}) The :func:`~django.shortcuts.get_object_or_404` function takes a Django model as its first argument and an arbitrary number of keyword arguments, which it @@ -357,7 +365,7 @@ variable ``question``, here's what the ``polls/detail.html`` template might look like: .. code-block:: html+django - :caption: polls/templates/polls/detail.html + :caption: ``polls/templates/polls/detail.html``

{{ question.question_text }}

    @@ -391,7 +399,7 @@ template, the link was partially hardcoded like this: The problem with this hardcoded, tightly-coupled approach is that it becomes challenging to change URLs on projects with a lot of templates. However, since -you defined the name argument in the :func:`~django.urls.path` functions in +you defined the ``name`` argument in the :func:`~django.urls.path` functions in the ``polls.urls`` module, you can remove a reliance on specific URL paths defined in your url configurations by using the ``{% url %}`` template tag: @@ -405,7 +413,7 @@ defined below:: ... # the 'name' value as called by the {% url %} template tag - path('/', views.detail, name='detail'), + path("/", views.detail, name="detail"), ... If you want to change the URL of the polls detail view to something else, @@ -414,7 +422,7 @@ template (or templates) you would change it in ``polls/urls.py``:: ... # added the word 'specifics' - path('specifics//', views.detail, name='detail'), + path("specifics//", views.detail, name="detail"), ... Namespacing URL names @@ -431,31 +439,31 @@ The answer is to add namespaces to your URLconf. In the ``polls/urls.py`` file, go ahead and add an ``app_name`` to set the application namespace: .. code-block:: python - :caption: polls/urls.py + :caption: ``polls/urls.py`` from django.urls import path from . import views - app_name = 'polls' + app_name = "polls" urlpatterns = [ - path('', views.index, name='index'), - path('/', views.detail, name='detail'), - path('/results/', views.results, name='results'), - path('/vote/', views.vote, name='vote'), + path("", views.index, name="index"), + path("/", views.detail, name="detail"), + path("/results/", views.results, name="results"), + path("/vote/", views.vote, name="vote"), ] Now change your ``polls/index.html`` template from: .. code-block:: html+django - :caption: polls/templates/polls/index.html + :caption: ``polls/templates/polls/index.html``
  • {{ question.question_text }}
  • to point at the namespaced detail view: .. code-block:: html+django - :caption: polls/templates/polls/index.html + :caption: ``polls/templates/polls/index.html``
  • {{ question.question_text }}
  • diff --git a/docs/intro/tutorial04.txt b/docs/intro/tutorial04.txt index 414156b56c51..149b01f338e4 100644 --- a/docs/intro/tutorial04.txt +++ b/docs/intro/tutorial04.txt @@ -3,7 +3,7 @@ Writing your first Django app, part 4 ===================================== This tutorial begins where :doc:`Tutorial 3 ` left off. We're -continuing the Web-poll application and will focus on form processing and +continuing the web-poll application and will focus on form processing and cutting down our code. .. admonition:: Where to get help: @@ -18,18 +18,18 @@ Let's update our poll detail template ("polls/detail.html") from the last tutorial, so that the template contains an HTML ```` element: .. code-block:: html+django - :caption: polls/templates/polls/detail.html - -

    {{ question.question_text }}

    - - {% if error_message %}

    {{ error_message }}

    {% endif %} + :caption: ``polls/templates/polls/detail.html`` {% csrf_token %} - {% for choice in question.choice_set.all %} - -
    - {% endfor %} +
    +

    {{ question.question_text }}

    + {% if error_message %}

    {{ error_message }}

    {% endif %} + {% for choice in question.choice_set.all %} + +
    + {% endfor %} +
    @@ -47,7 +47,7 @@ A quick rundown: ``method="get"``) is very important, because the act of submitting this form will alter data server-side. Whenever you create a form that alters data server-side, use ``method="post"``. This tip isn't specific to - Django; it's good Web development practice in general. + Django; it's good web development practice in general. * ``forloop.counter`` indicates how many times the :ttag:`for` tag has gone through its loop @@ -64,39 +64,46 @@ something with it. Remember, in :doc:`Tutorial 3 `, we created a URLconf for the polls application that includes this line: .. code-block:: python - :caption: polls/urls.py + :caption: ``polls/urls.py`` - path('/vote/', views.vote, name='vote'), + path("/vote/", views.vote, name="vote"), We also created a dummy implementation of the ``vote()`` function. Let's create a real version. Add the following to ``polls/views.py``: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` + from django.db.models import F from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.urls import reverse from .models import Choice, Question + + # ... def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: - selected_choice = question.choice_set.get(pk=request.POST['choice']) + selected_choice = question.choice_set.get(pk=request.POST["choice"]) except (KeyError, Choice.DoesNotExist): # Redisplay the question voting form. - return render(request, 'polls/detail.html', { - 'question': question, - 'error_message': "You didn't select a choice.", - }) + return render( + request, + "polls/detail.html", + { + "question": question, + "error_message": "You didn't select a choice.", + }, + ) else: - selected_choice.votes += 1 + selected_choice.votes = F("votes") + 1 selected_choice.save() # Always return an HttpResponseRedirect after successfully dealing # with POST data. This prevents data from being posted twice if a # user hits the Back button. - return HttpResponseRedirect(reverse('polls:results', args=(question.id,))) + return HttpResponseRedirect(reverse("polls:results", args=(question.id,))) This code includes a few things we haven't covered yet in this tutorial: @@ -117,6 +124,9 @@ This code includes a few things we haven't covered yet in this tutorial: :exc:`KeyError` and redisplays the question form with an error message if ``choice`` isn't given. +* ``F("votes") + 1`` :ref:`instructs the database + ` to increase the vote count by 1. + * After incrementing the choice count, the code returns an :class:`~django.http.HttpResponseRedirect` rather than a normal :class:`~django.http.HttpResponse`. @@ -126,7 +136,7 @@ This code includes a few things we haven't covered yet in this tutorial: As the Python comment above points out, you should always return an :class:`~django.http.HttpResponseRedirect` after successfully dealing with - POST data. This tip isn't specific to Django; it's good Web development + POST data. This tip isn't specific to Django; it's good web development practice in general. * We are using the :func:`~django.urls.reverse` function in the @@ -138,7 +148,7 @@ This code includes a few things we haven't covered yet in this tutorial: this :func:`~django.urls.reverse` call will return a string like :: - '/polls/3/results/' + "/polls/3/results/" where the ``3`` is the value of ``question.id``. This redirected URL will then call the ``'results'`` view to display the final page. @@ -152,14 +162,14 @@ After somebody votes in a question, the ``vote()`` view redirects to the results page for the question. Let's write that view: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.shortcuts import get_object_or_404, render def results(request, question_id): question = get_object_or_404(Question, pk=question_id) - return render(request, 'polls/results.html', {'question': question}) + return render(request, "polls/results.html", {"question": question}) This is almost exactly the same as the ``detail()`` view from :doc:`Tutorial 3 `. The only difference is the template name. We'll fix this @@ -168,7 +178,7 @@ redundancy later. Now, create a ``polls/results.html`` template: .. code-block:: html+django - :caption: polls/templates/polls/results.html + :caption: ``polls/templates/polls/results.html``

    {{ question.question_text }}

    @@ -184,19 +194,6 @@ Now, go to ``/polls/1/`` in your browser and vote in the question. You should se results page that gets updated each time you vote. If you submit the form without having chosen a choice, you should see the error message. -.. note:: - The code for our ``vote()`` view does have a small problem. It first gets - the ``selected_choice`` object from the database, then computes the new - value of ``votes``, and then saves it back to the database. If two users of - your website try to vote at *exactly the same time*, this might go wrong: - The same value, let's say 42, will be retrieved for ``votes``. Then, for - both users the new value of 43 is computed and saved, but 44 would be the - expected value. - - This is called a *race condition*. If you are interested, you can read - :ref:`avoiding-race-conditions-using-f` to learn how you can solve this - issue. - Use generic views: Less code is better ====================================== @@ -204,13 +201,17 @@ The ``detail()`` (from :doc:`Tutorial 3 `) and ``results()`` views are very short -- and, as mentioned above, redundant. The ``index()`` view, which displays a list of polls, is similar. -These views represent a common case of basic Web development: getting data from +These views represent a common case of basic web development: getting data from the database according to a parameter passed in the URL, loading a template and returning the rendered template. Because this is so common, Django provides a shortcut, called the "generic views" system. -Generic views abstract common patterns to the point where you don't even need -to write Python code to write an app. +Generic views abstract common patterns to the point where you don't even need to +write Python code to write an app. For example, the +:class:`~django.views.generic.list.ListView` and +:class:`~django.views.generic.detail.DetailView` generic views +abstract the concepts of "display a list of objects" and +"display a detail page for a particular type of object" respectively. Let's convert our poll app to use the generic views system, so we can delete a bunch of our own code. We'll have to take a few steps to make the conversion. @@ -240,22 +241,26 @@ Amend URLconf First, open the ``polls/urls.py`` URLconf and change it like so: .. code-block:: python - :caption: polls/urls.py + :caption: ``polls/urls.py`` from django.urls import path from . import views - app_name = 'polls' + app_name = "polls" urlpatterns = [ - path('', views.IndexView.as_view(), name='index'), - path('/', views.DetailView.as_view(), name='detail'), - path('/results/', views.ResultsView.as_view(), name='results'), - path('/vote/', views.vote, name='vote'), + path("", views.IndexView.as_view(), name="index"), + path("/", views.DetailView.as_view(), name="detail"), + path("/results/", views.ResultsView.as_view(), name="results"), + path("/vote/", views.vote, name="vote"), ] Note that the name of the matched pattern in the path strings of the second and -third patterns has changed from ```` to ````. +third patterns has changed from ```` to ````. This is +necessary because we'll use the +:class:`~django.views.generic.detail.DetailView` generic view to replace our +``detail()`` and ``results()`` views, and it expects the primary key value +captured from the URL to be called ``"pk"``. Amend views ----------- @@ -265,8 +270,9 @@ views and use Django's generic views instead. To do so, open the ``polls/views.py`` file and change it like so: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` + from django.db.models import F from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.urls import reverse @@ -276,40 +282,33 @@ views and use Django's generic views instead. To do so, open the class IndexView(generic.ListView): - template_name = 'polls/index.html' - context_object_name = 'latest_question_list' + template_name = "polls/index.html" + context_object_name = "latest_question_list" def get_queryset(self): """Return the last five published questions.""" - return Question.objects.order_by('-pub_date')[:5] + return Question.objects.order_by("-pub_date")[:5] class DetailView(generic.DetailView): model = Question - template_name = 'polls/detail.html' + template_name = "polls/detail.html" class ResultsView(generic.DetailView): model = Question - template_name = 'polls/results.html' + template_name = "polls/results.html" def vote(request, question_id): - ... # same as above, no changes needed. - -We're using two generic views here: -:class:`~django.views.generic.list.ListView` and -:class:`~django.views.generic.detail.DetailView`. Respectively, those -two views abstract the concepts of "display a list of objects" and -"display a detail page for a particular type of object." - -* Each generic view needs to know what model it will be acting - upon. This is provided using the ``model`` attribute. - -* The :class:`~django.views.generic.detail.DetailView` generic view - expects the primary key value captured from the URL to be called - ``"pk"``, so we've changed ``question_id`` to ``pk`` for the generic - views. + # same as above, no changes needed. + ... + +Each generic view needs to know what model it will be acting upon. This is +provided using either the ``model`` attribute (in this example, ``model = +Question`` for ``DetailView`` and ``ResultsView``) or by defining the +:meth:`~django.views.generic.list.MultipleObjectMixin.get_queryset` method (as +shown in ``IndexView``). By default, the :class:`~django.views.generic.detail.DetailView` generic view uses a template called ``/_detail.html``. diff --git a/docs/intro/tutorial05.txt b/docs/intro/tutorial05.txt index 046abb8124af..219b7b313048 100644 --- a/docs/intro/tutorial05.txt +++ b/docs/intro/tutorial05.txt @@ -3,7 +3,7 @@ Writing your first Django app, part 5 ===================================== This tutorial begins where :doc:`Tutorial 4 ` left off. -We've built a Web-poll application, and we'll now create some automated tests +We've built a web-poll application, and we'll now create some automated tests for it. .. admonition:: Where to get help: @@ -111,7 +111,7 @@ There are many ways to approach writing tests. Some programmers follow a discipline called "`test-driven development`_"; they actually write their tests before they write their code. This might seem -counter-intuitive, but in fact it's similar to what most people will often do +counterintuitive, but in fact it's similar to what most people will often do anyway: they describe a problem, then create some code to solve it. Test-driven development formalizes the problem in a Python test case. @@ -150,7 +150,6 @@ whose date lies in the future: >>> import datetime >>> from django.utils import timezone - >>> from polls.models import Question >>> # create a Question instance with pub_date 30 days in the future >>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30)) >>> # was it published recently? @@ -172,7 +171,7 @@ whose name begins with ``test``. Put the following in the ``tests.py`` file in the ``polls`` application: .. code-block:: python - :caption: polls/tests.py + :caption: ``polls/tests.py`` import datetime @@ -183,7 +182,6 @@ Put the following in the ``tests.py`` file in the ``polls`` application: class QuestionModelTests(TestCase): - def test_was_published_recently_with_future_question(self): """ was_published_recently() returns False for questions whose pub_date @@ -206,7 +204,9 @@ In the terminal, we can run our test: $ python manage.py test polls -and you'll see something like:: +and you'll see something like: + +.. code-block:: shell Creating test database for alias 'default'... System check identified no issues (0 silenced). @@ -215,7 +215,7 @@ and you'll see something like:: FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests) ---------------------------------------------------------------------- Traceback (most recent call last): - File "/path/to/mysite/polls/tests.py", line 16, in test_was_published_recently_with_future_question + File "/path/to/djangotutorial/polls/tests.py", line 16, in test_was_published_recently_with_future_question self.assertIs(future_question.was_published_recently(), False) AssertionError: True is not False @@ -261,13 +261,15 @@ return ``False`` if its ``pub_date`` is in the future. Amend the method in past: .. code-block:: python - :caption: polls/models.py + :caption: ``polls/models.py`` def was_published_recently(self): now = timezone.now() return now - datetime.timedelta(days=1) <= self.pub_date <= now -and run the test again:: +and run the test again: + +.. code-block:: pytb Creating test database for alias 'default'... System check identified no issues (0 silenced). @@ -297,7 +299,7 @@ Add two more test methods to the same class, to test the behavior of the method more comprehensively: .. code-block:: python - :caption: polls/tests.py + :caption: ``polls/tests.py`` def test_was_published_recently_with_old_question(self): """ @@ -308,6 +310,7 @@ more comprehensively: old_question = Question(pub_date=time) self.assertIs(old_question.was_published_recently(), False) + def test_was_published_recently_with_recent_question(self): """ was_published_recently() returns True for questions whose pub_date @@ -368,7 +371,7 @@ environment in the :djadmin:`shell`: :meth:`~django.test.utils.setup_test_environment` installs a template renderer which will allow us to examine some additional attributes on responses such as ``response.context`` that otherwise wouldn't be available. Note that this -method *does not* setup a test database, so the following will be run against +method *does not* set up a test database, so the following will be run against the existing database and the output may differ slightly depending on what questions you already created. You might get unexpected results if your ``TIME_ZONE`` in ``settings.py`` isn't correct. If you don't remember setting @@ -376,16 +379,20 @@ it earlier, check it before continuing. Next we need to import the test client class (later in ``tests.py`` we will use the :class:`django.test.TestCase` class, which comes with its own client, so -this won't be required):: +this won't be required): + +.. code-block:: pycon >>> from django.test import Client >>> # create an instance of the client for our use >>> client = Client() -With that ready, we can ask the client to do some work for us:: +With that ready, we can ask the client to do some work for us: + +.. code-block:: pycon >>> # get a response from '/' - >>> response = client.get('/') + >>> response = client.get("/") Not Found: / >>> # we should expect a 404 from that address; if you instead see an >>> # "Invalid HTTP_HOST header" error and a 400 response, you probably @@ -395,12 +402,12 @@ With that ready, we can ask the client to do some work for us:: >>> # on the other hand we should expect to find something at '/polls/' >>> # we'll use 'reverse()' rather than a hardcoded URL >>> from django.urls import reverse - >>> response = client.get(reverse('polls:index')) + >>> response = client.get(reverse("polls:index")) >>> response.status_code 200 >>> response.content b'\n \n\n' - >>> response.context['latest_question_list'] + >>> response.context["latest_question_list"] ]> Improving our view @@ -413,42 +420,42 @@ In :doc:`Tutorial 4 ` we introduced a class-based view, based on :class:`~django.views.generic.list.ListView`: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` class IndexView(generic.ListView): - template_name = 'polls/index.html' - context_object_name = 'latest_question_list' + template_name = "polls/index.html" + context_object_name = "latest_question_list" def get_queryset(self): """Return the last five published questions.""" - return Question.objects.order_by('-pub_date')[:5] + return Question.objects.order_by("-pub_date")[:5] We need to amend the ``get_queryset()`` method and change it so that it also checks the date by comparing it with ``timezone.now()``. First we need to add an import: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` from django.utils import timezone and then we must amend the ``get_queryset`` method like so: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` def get_queryset(self): """ Return the last five published questions (not including those set to be published in the future). """ - return Question.objects.filter( - pub_date__lte=timezone.now() - ).order_by('-pub_date')[:5] + return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[ + :5 + ] ``Question.objects.filter(pub_date__lte=timezone.now())`` returns a queryset containing ``Question``\s whose ``pub_date`` is less than or equal to - that -is, earlier than or equal to - ``timezone.now``. +is, earlier than or equal to - ``timezone.now()``. Testing our new view -------------------- @@ -463,7 +470,7 @@ our :djadmin:`shell` session above. Add the following to ``polls/tests.py``: .. code-block:: python - :caption: polls/tests.py + :caption: ``polls/tests.py`` from django.urls import reverse @@ -471,7 +478,7 @@ and we'll create a shortcut function to create questions as well as a new test class: .. code-block:: python - :caption: polls/tests.py + :caption: ``polls/tests.py`` def create_question(question_text, days): """ @@ -488,21 +495,21 @@ class: """ If no questions exist, an appropriate message is displayed. """ - response = self.client.get(reverse('polls:index')) + response = self.client.get(reverse("polls:index")) self.assertEqual(response.status_code, 200) self.assertContains(response, "No polls are available.") - self.assertQuerysetEqual(response.context['latest_question_list'], []) + self.assertQuerySetEqual(response.context["latest_question_list"], []) def test_past_question(self): """ Questions with a pub_date in the past are displayed on the index page. """ - create_question(question_text="Past question.", days=-30) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - [''] + question = create_question(question_text="Past question.", days=-30) + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question], ) def test_future_question(self): @@ -511,33 +518,33 @@ class: the index page. """ create_question(question_text="Future question.", days=30) - response = self.client.get(reverse('polls:index')) + response = self.client.get(reverse("polls:index")) self.assertContains(response, "No polls are available.") - self.assertQuerysetEqual(response.context['latest_question_list'], []) + self.assertQuerySetEqual(response.context["latest_question_list"], []) def test_future_question_and_past_question(self): """ Even if both past and future questions exist, only past questions are displayed. """ - create_question(question_text="Past question.", days=-30) + question = create_question(question_text="Past question.", days=-30) create_question(question_text="Future question.", days=30) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - [''] + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question], ) def test_two_past_questions(self): """ The questions index page may display multiple questions. """ - create_question(question_text="Past question 1.", days=-30) - create_question(question_text="Past question 2.", days=-5) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - ['', ''] + question1 = create_question(question_text="Past question 1.", days=-30) + question2 = create_question(question_text="Past question 2.", days=-5) + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question2, question1], ) @@ -551,7 +558,7 @@ repetition out of the process of creating questions. Note that the :class:`django.test.TestCase` class provides some additional assertion methods. In these examples, we use :meth:`~django.test.SimpleTestCase.assertContains()` and -:meth:`~django.test.TransactionTestCase.assertQuerysetEqual()`. +:meth:`~django.test.TransactionTestCase.assertQuerySetEqual()`. In ``test_past_question``, we create a question and verify that it appears in the list. @@ -572,10 +579,11 @@ the *index*, users can still reach them if they know or guess the right URL. So we need to add a similar constraint to ``DetailView``: .. code-block:: python - :caption: polls/views.py + :caption: ``polls/views.py`` class DetailView(generic.DetailView): ... + def get_queryset(self): """ Excludes any questions that aren't published yet. @@ -587,7 +595,7 @@ is in the past can be displayed, and that one with a ``pub_date`` in the future is not: .. code-block:: python - :caption: polls/tests.py + :caption: ``polls/tests.py`` class QuestionDetailViewTests(TestCase): def test_future_question(self): @@ -595,8 +603,8 @@ is not: The detail view of a question with a pub_date in the future returns a 404 not found. """ - future_question = create_question(question_text='Future question.', days=5) - url = reverse('polls:detail', args=(future_question.id,)) + future_question = create_question(question_text="Future question.", days=5) + url = reverse("polls:detail", args=(future_question.id,)) response = self.client.get(url) self.assertEqual(response.status_code, 404) @@ -605,8 +613,8 @@ is not: The detail view of a question with a pub_date in the past displays the question's text. """ - past_question = create_question(question_text='Past Question.', days=-5) - url = reverse('polls:detail', args=(past_question.id,)) + past_question = create_question(question_text="Past Question.", days=-5) + url = reverse("polls:detail", args=(past_question.id,)) response = self.client.get(url) self.assertContains(response, past_question.question_text) @@ -689,7 +697,7 @@ Coverage will help to identify dead code. See :doc:`Testing in Django ` has comprehensive information about testing. -.. _Selenium: http://seleniumhq.org/ +.. _Selenium: https://www.selenium.dev/ .. _continuous integration: https://en.wikipedia.org/wiki/Continuous_integration What's next? diff --git a/docs/intro/tutorial06.txt b/docs/intro/tutorial06.txt index be69f5e162bc..312b585f2965 100644 --- a/docs/intro/tutorial06.txt +++ b/docs/intro/tutorial06.txt @@ -3,7 +3,7 @@ Writing your first Django app, part 6 ===================================== This tutorial begins where :doc:`Tutorial 5 ` left off. -We've built a tested Web-poll application, and we'll now add a stylesheet and +We've built a tested web-poll application, and we'll now add a stylesheet and an image. Aside from the HTML generated by the server, web applications generally need @@ -61,7 +61,7 @@ the path for templates. Put the following code in that stylesheet (``polls/static/polls/style.css``): .. code-block:: css - :caption: polls/static/polls/style.css + :caption: ``polls/static/polls/style.css`` li a { color: green; @@ -70,11 +70,11 @@ Put the following code in that stylesheet (``polls/static/polls/style.css``): Next, add the following at the top of ``polls/templates/polls/index.html``: .. code-block:: html+django - :caption: polls/templates/polls/index.html + :caption: ``polls/templates/polls/index.html`` {% load static %} - + The ``{% static %}`` template tag generates the absolute URL of static files. @@ -94,17 +94,19 @@ Adding a background-image ========================= Next, we'll create a subdirectory for images. Create an ``images`` subdirectory -in the ``polls/static/polls/`` directory. Inside this directory, put an image -called ``background.gif``. In other words, put your image in -``polls/static/polls/images/background.gif``. +in the ``polls/static/polls/`` directory. Inside this directory, add any image +file that you'd like to use as a background. For the purposes of this tutorial, +we're using a file named ``background.png``, which will have the full path +``polls/static/polls/images/background.png``. -Then, add to your stylesheet (``polls/static/polls/style.css``): +Then, add a reference to your image in your stylesheet +(``polls/static/polls/style.css``): .. code-block:: css - :caption: polls/static/polls/style.css + :caption: ``polls/static/polls/style.css`` body { - background: white url("images/background.gif") no-repeat; + background: white url("images/background.png") no-repeat; } Reload ``http://localhost:8000/polls/`` and you should see the background diff --git a/docs/intro/tutorial07.txt b/docs/intro/tutorial07.txt index 9bcc2b40a3ba..a8d5e61b8177 100644 --- a/docs/intro/tutorial07.txt +++ b/docs/intro/tutorial07.txt @@ -3,7 +3,7 @@ Writing your first Django app, part 7 ===================================== This tutorial begins where :doc:`Tutorial 6 ` left off. We're -continuing the Web-poll application and will focus on customizing Django's +continuing the web-poll application and will focus on customizing Django's automatically-generated admin site that we first explored in :doc:`Tutorial 2 `. @@ -24,7 +24,7 @@ Let's see how this works by reordering the fields on the edit form. Replace the ``admin.site.register(Question)`` line with: .. code-block:: python - :caption: polls/admin.py + :caption: ``polls/admin.py`` from django.contrib import admin @@ -32,7 +32,8 @@ the ``admin.site.register(Question)`` line with: class QuestionAdmin(admin.ModelAdmin): - fields = ['pub_date', 'question_text'] + fields = ["pub_date", "question_text"] + admin.site.register(Question, QuestionAdmin) @@ -53,7 +54,7 @@ And speaking of forms with dozens of fields, you might want to split the form up into fieldsets: .. code-block:: python - :caption: polls/admin.py + :caption: ``polls/admin.py`` from django.contrib import admin @@ -62,10 +63,11 @@ up into fieldsets: class QuestionAdmin(admin.ModelAdmin): fieldsets = [ - (None, {'fields': ['question_text']}), - ('Date information', {'fields': ['pub_date']}), + (None, {"fields": ["question_text"]}), + ("Date information", {"fields": ["pub_date"]}), ] + admin.site.register(Question, QuestionAdmin) The first element of each tuple in @@ -87,11 +89,12 @@ There are two ways to solve this problem. The first is to register ``Choice`` with the admin just as we did with ``Question``: .. code-block:: python - :caption: polls/admin.py + :caption: ``polls/admin.py`` from django.contrib import admin from .models import Choice, Question + # ... admin.site.register(Choice) @@ -106,12 +109,12 @@ database. Django knows that a :class:`~django.db.models.ForeignKey` should be represented in the admin as a `` +.. class:: django.views.generic.edit.BaseFormView + + A base view for displaying a form. It is not intended to be used directly, + but rather as a parent class of the + :class:`django.views.generic.edit.FormView` or other views displaying a + form. + + **Ancestors (MRO)** + + This view inherits methods and attributes from the following views: + + * :class:`django.views.generic.edit.FormMixin` + * :class:`django.views.generic.edit.ProcessFormView` ``CreateView`` ============== @@ -100,7 +116,7 @@ editing content: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` - * ``django.views.generic.edit.BaseCreateView`` + * :class:`django.views.generic.edit.BaseCreateView` * :class:`django.views.generic.edit.ModelFormMixin` * :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.detail.SingleObjectMixin` @@ -128,9 +144,10 @@ editing content: from django.views.generic.edit import CreateView from myapp.models import Author - class AuthorCreate(CreateView): + + class AuthorCreateView(CreateView): model = Author - fields = ['name'] + fields = ["name"] **Example myapp/author_form.html**: @@ -141,6 +158,29 @@ editing content: +.. class:: django.views.generic.edit.BaseCreateView + + A base view for creating a new object instance. It is not intended to be + used directly, but rather as a parent class of the + :class:`django.views.generic.edit.CreateView`. + + **Ancestors (MRO)** + + This view inherits methods and attributes from the following views: + + * :class:`django.views.generic.edit.ModelFormMixin` + * :class:`django.views.generic.edit.ProcessFormView` + + **Methods** + + .. method:: get(request, *args, **kwargs) + + Sets the current object instance (``self.object``) to ``None``. + + .. method:: post(request, *args, **kwargs) + + Sets the current object instance (``self.object``) to ``None``. + ``UpdateView`` ============== @@ -157,7 +197,7 @@ editing content: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` - * ``django.views.generic.edit.BaseUpdateView`` + * :class:`django.views.generic.edit.BaseUpdateView` * :class:`django.views.generic.edit.ModelFormMixin` * :class:`django.views.generic.edit.FormMixin` * :class:`django.views.generic.detail.SingleObjectMixin` @@ -184,10 +224,11 @@ editing content: from django.views.generic.edit import UpdateView from myapp.models import Author - class AuthorUpdate(UpdateView): + + class AuthorUpdateView(UpdateView): model = Author - fields = ['name'] - template_name_suffix = '_update_form' + fields = ["name"] + template_name_suffix = "_update_form" **Example myapp/author_update_form.html**: @@ -198,6 +239,29 @@ editing content: +.. class:: django.views.generic.edit.BaseUpdateView + + A base view for updating an existing object instance. It is not intended to + be used directly, but rather as a parent class of the + :class:`django.views.generic.edit.UpdateView`. + + **Ancestors (MRO)** + + This view inherits methods and attributes from the following views: + + * :class:`django.views.generic.edit.ModelFormMixin` + * :class:`django.views.generic.edit.ProcessFormView` + + **Methods** + + .. method:: get(request, *args, **kwargs) + + Sets the current object instance (``self.object``). + + .. method:: post(request, *args, **kwargs) + + Sets the current object instance (``self.object``). + ``DeleteView`` ============== @@ -214,14 +278,26 @@ editing content: * :class:`django.views.generic.detail.SingleObjectTemplateResponseMixin` * :class:`django.views.generic.base.TemplateResponseMixin` - * ``django.views.generic.edit.BaseDeleteView`` + * :class:`django.views.generic.edit.BaseDeleteView` * :class:`django.views.generic.edit.DeletionMixin` - * ``django.views.generic.detail.BaseDetailView`` + * :class:`django.views.generic.edit.FormMixin` + * :class:`django.views.generic.base.ContextMixin` + * :class:`django.views.generic.detail.BaseDetailView` * :class:`django.views.generic.detail.SingleObjectMixin` * :class:`django.views.generic.base.View` **Attributes** + .. attribute:: form_class + + Inherited from :class:`~django.views.generic.edit.BaseDeleteView`. The + form class that will be used to confirm the request. By default + :class:`django.forms.Form`, resulting in an empty form that is always + valid. + + By providing your own ``Form`` subclass, you can add additional + requirements, such as a confirmation checkbox, for example. + .. attribute:: template_name_suffix The ``DeleteView`` page displayed to a ``GET`` request uses a @@ -236,9 +312,10 @@ editing content: from django.views.generic.edit import DeleteView from myapp.models import Author - class AuthorDelete(DeleteView): + + class AuthorDeleteView(DeleteView): model = Author - success_url = reverse_lazy('author-list') + success_url = reverse_lazy("author-list") **Example myapp/author_confirm_delete.html**: @@ -246,5 +323,20 @@ editing content:
    {% csrf_token %}

    Are you sure you want to delete "{{ object }}"?

    + {{ form }}
    + +.. class:: django.views.generic.edit.BaseDeleteView + + A base view for deleting an object instance. It is not intended to be used + directly, but rather as a parent class of the + :class:`django.views.generic.edit.DeleteView`. + + **Ancestors (MRO)** + + This view inherits methods and attributes from the following views: + + * :class:`django.views.generic.edit.DeletionMixin` + * :class:`django.views.generic.edit.FormMixin` + * :class:`django.views.generic.detail.BaseDetailView` diff --git a/docs/ref/class-based-views/index.txt b/docs/ref/class-based-views/index.txt index 518700038512..0c2f20aee5b3 100644 --- a/docs/ref/class-based-views/index.txt +++ b/docs/ref/class-based-views/index.txt @@ -26,7 +26,7 @@ A class-based view is deployed into a URL pattern using the :meth:`~django.views.generic.base.View.as_view()` classmethod:: urlpatterns = [ - path('view/', MyView.as_view(size=42)), + path("view/", MyView.as_view(size=42)), ] .. admonition:: Thread safety with view arguments diff --git a/docs/ref/class-based-views/mixins-date-based.txt b/docs/ref/class-based-views/mixins-date-based.txt index 471e222a6efd..6a441140ce0e 100644 --- a/docs/ref/class-based-views/mixins-date-based.txt +++ b/docs/ref/class-based-views/mixins-date-based.txt @@ -180,7 +180,8 @@ Date-based mixins The :func:`~time.strftime` format to use when parsing the week. By default, this is ``'%U'``, which means the week starts on Sunday. Set - it to ``'%W'`` if your week starts on Monday. + it to ``'%W'`` or ``'%V'`` (ISO 8601 week) if your week starts on + Monday. .. attribute:: week diff --git a/docs/ref/class-based-views/mixins-editing.txt b/docs/ref/class-based-views/mixins-editing.txt index 4b20e9498c62..aebbae04ae07 100644 --- a/docs/ref/class-based-views/mixins-editing.txt +++ b/docs/ref/class-based-views/mixins-editing.txt @@ -51,7 +51,7 @@ The following mixins are used to construct Django's editing views: .. method:: get_form_class() Retrieve the form class to instantiate. By default - :attr:`.form_class`. + :attr:`~django.views.generic.edit.FormMixin.form_class`. .. method:: get_form(form_class=None) @@ -218,7 +218,7 @@ The following mixins are used to construct Django's editing views: .. class:: django.views.generic.edit.DeletionMixin - Enables handling of the ``DELETE`` http action. + Enables handling of the ``DELETE`` HTTP action. **Methods and Attributes** diff --git a/docs/ref/class-based-views/mixins-multiple-object.txt b/docs/ref/class-based-views/mixins-multiple-object.txt index 52d5d976db66..4c6a1c5caaba 100644 --- a/docs/ref/class-based-views/mixins-multiple-object.txt +++ b/docs/ref/class-based-views/mixins-multiple-object.txt @@ -15,12 +15,14 @@ Multiple object mixins * Use the ``page`` parameter in the URLconf. For example, this is what your URLconf might look like:: - path('objects/page/', PaginatedView.as_view()), + path("objects/page/", PaginatedView.as_view()), * Pass the page number via the ``page`` query-string parameter. For - example, a URL would look like this:: + example, a URL would look like this: - /objects/?page=3 + .. code-block:: text + + /objects/?page=3 These values and lists are 1-based, not 0-based, so the first page would be represented as page ``1``. @@ -29,7 +31,9 @@ Multiple object mixins `. As a special case, you are also permitted to use ``last`` as a value for - ``page``:: + ``page``: + + .. code-block:: text /objects/?page=last diff --git a/docs/ref/class-based-views/mixins-simple.txt b/docs/ref/class-based-views/mixins-simple.txt index 7a9542447bf4..bbd0875e7523 100644 --- a/docs/ref/class-based-views/mixins-simple.txt +++ b/docs/ref/class-based-views/mixins-simple.txt @@ -16,7 +16,8 @@ Simple mixins :meth:`~django.views.generic.base.View.as_view`. Example usage:: from django.views.generic import TemplateView - TemplateView.as_view(extra_context={'title': 'Custom Title'}) + + TemplateView.as_view(extra_context={"title": "Custom Title"}) **Methods** @@ -27,7 +28,7 @@ Simple mixins def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['number'] = random.randrange(1, 100) + context["number"] = random.randrange(1, 100) return context The template context of all class-based generic views include a diff --git a/docs/ref/class-based-views/mixins-single-object.txt b/docs/ref/class-based-views/mixins-single-object.txt index 1378e10823df..2e96422fc794 100644 --- a/docs/ref/class-based-views/mixins-single-object.txt +++ b/docs/ref/class-based-views/mixins-single-object.txt @@ -164,9 +164,10 @@ Single object mixins .. method:: get_template_names() - Returns a list of candidate template names. Returns the following list: + Returns a list of candidate template names. Return a list containing + ``template_name``, if set on the value. Otherwise, return a list + containing: - * the value of ``template_name`` on the view (if provided) * the contents of the ``template_name_field`` field on the object instance that the view is operating upon (if available) * ``/.html`` diff --git a/docs/ref/clickjacking.txt b/docs/ref/clickjacking.txt index 9d7c5cb0c3d9..12c7afc8c49a 100644 --- a/docs/ref/clickjacking.txt +++ b/docs/ref/clickjacking.txt @@ -58,9 +58,9 @@ To set the same ``X-Frame-Options`` value for all responses in your site, put :setting:`MIDDLEWARE`:: MIDDLEWARE = [ - ... - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - ... + ..., + "django.middleware.clickjacking.XFrameOptionsMiddleware", + ..., ] This middleware is enabled in the settings file generated by @@ -70,7 +70,7 @@ By default, the middleware will set the ``X-Frame-Options`` header to ``DENY`` for every outgoing ``HttpResponse``. If you want any other value for this header instead, set the :setting:`X_FRAME_OPTIONS` setting:: - X_FRAME_OPTIONS = 'SAMEORIGIN' + X_FRAME_OPTIONS = "SAMEORIGIN" When using the middleware there may be some views where you do **not** want the ``X-Frame-Options`` header set. For those cases, you can use a view decorator @@ -79,6 +79,7 @@ that tells the middleware not to set the header:: from django.http import HttpResponse from django.views.decorators.clickjacking import xframe_options_exempt + @xframe_options_exempt def ok_to_load_in_a_frame(request): return HttpResponse("This page is safe to load in a frame on any site.") @@ -99,10 +100,12 @@ decorators:: from django.views.decorators.clickjacking import xframe_options_deny from django.views.decorators.clickjacking import xframe_options_sameorigin + @xframe_options_deny def view_one(request): return HttpResponse("I won't display in any frame!") + @xframe_options_sameorigin def view_two(request): return HttpResponse("Display in a frame if it's from the same origin as me.") @@ -113,24 +116,7 @@ a decorator overrides the middleware. Limitations =========== -The ``X-Frame-Options`` header will only protect against clickjacking in a -modern browser. Older browsers will quietly ignore the header and need `other -clickjacking prevention techniques`_. - -Browsers that support ``X-Frame-Options`` ------------------------------------------ - -* Internet Explorer 8+ -* Edge -* Firefox 3.6.9+ -* Opera 10.5+ -* Safari 4+ -* Chrome 4.1+ - -See also --------- - -A `complete list`_ of browsers supporting ``X-Frame-Options``. +The ``X-Frame-Options`` header will only protect against clickjacking in +`modern browsers`_. -.. _complete list: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#Browser_compatibility -.. _other clickjacking prevention techniques: https://en.wikipedia.org/wiki/Clickjacking#Prevention +.. _modern browsers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#browser_compatibility diff --git a/docs/ref/contrib/admin/_images/actions-as-modeladmin-methods.png b/docs/ref/contrib/admin/_images/actions-as-modeladmin-methods.png index d29f008e9fd8..6ae454e0de73 100644 Binary files a/docs/ref/contrib/admin/_images/actions-as-modeladmin-methods.png and b/docs/ref/contrib/admin/_images/actions-as-modeladmin-methods.png differ diff --git a/docs/ref/contrib/admin/_images/adding-actions-to-the-modeladmin.png b/docs/ref/contrib/admin/_images/adding-actions-to-the-modeladmin.png index 6e394288a4fb..9510706dadef 100644 Binary files a/docs/ref/contrib/admin/_images/adding-actions-to-the-modeladmin.png and b/docs/ref/contrib/admin/_images/adding-actions-to-the-modeladmin.png differ diff --git a/docs/ref/contrib/admin/_images/admin-actions.png b/docs/ref/contrib/admin/_images/admin-actions.png index 7aefcfe043e7..7c3a6ccc2e0b 100644 Binary files a/docs/ref/contrib/admin/_images/admin-actions.png and b/docs/ref/contrib/admin/_images/admin-actions.png differ diff --git a/docs/ref/contrib/admin/_images/fieldsets.png b/docs/ref/contrib/admin/_images/fieldsets.png index a52ec0d41b48..e5bc614f25d8 100644 Binary files a/docs/ref/contrib/admin/_images/fieldsets.png and b/docs/ref/contrib/admin/_images/fieldsets.png differ diff --git a/docs/ref/contrib/admin/_images/list_filter.png b/docs/ref/contrib/admin/_images/list_filter.png index de0a746cfec0..02c4879d182e 100644 Binary files a/docs/ref/contrib/admin/_images/list_filter.png and b/docs/ref/contrib/admin/_images/list_filter.png differ diff --git a/docs/ref/contrib/admin/_images/raw_id_fields.png b/docs/ref/contrib/admin/_images/raw_id_fields.png index e8ff48926594..7f16b11032d3 100644 Binary files a/docs/ref/contrib/admin/_images/raw_id_fields.png and b/docs/ref/contrib/admin/_images/raw_id_fields.png differ diff --git a/docs/ref/contrib/admin/actions.txt b/docs/ref/contrib/admin/actions.txt index 184a4d529a8f..263d43f8a372 100644 --- a/docs/ref/contrib/admin/actions.txt +++ b/docs/ref/contrib/admin/actions.txt @@ -47,11 +47,12 @@ news application with an ``Article`` model:: from django.db import models - STATUS_CHOICES = [ - ('d', 'Draft'), - ('p', 'Published'), - ('w', 'Withdrawn'), - ] + STATUS_CHOICES = { + "d": "Draft", + "p": "Published", + "w": "Withdrawn", + } + class Article(models.Model): title = models.CharField(max_length=100) @@ -83,7 +84,7 @@ Our publish-these-articles function won't need the :class:`ModelAdmin` or the request object, but we will use the queryset:: def make_published(modeladmin, request, queryset): - queryset.update(status='p') + queryset.update(status="p") .. note:: @@ -99,18 +100,26 @@ That's actually all there is to writing an action! However, we'll take one more optional-but-useful step and give the action a "nice" title in the admin. By default, this action would appear in the action list as "Make published" -- the function name, with underscores replaced by spaces. That's fine, but we -can provide a better, more human-friendly name by giving the -``make_published`` function a ``short_description`` attribute:: +can provide a better, more human-friendly name by using the +:func:`~django.contrib.admin.action` decorator on the ``make_published`` +function:: + + from django.contrib import admin + + ... + + @admin.action(description="Mark selected stories as published") def make_published(modeladmin, request, queryset): - queryset.update(status='p') - make_published.short_description = "Mark selected stories as published" + queryset.update(status="p") .. note:: - This might look familiar; the admin's ``list_display`` option uses the - same technique to provide human-readable descriptions for callback - functions registered there, too. + This might look familiar; the admin's + :attr:`~django.contrib.admin.ModelAdmin.list_display` option uses a similar + technique with the :func:`~django.contrib.admin.display` decorator to + provide human-readable descriptions for callback functions registered + there, too. Adding actions to the :class:`ModelAdmin` ----------------------------------------- @@ -122,15 +131,18 @@ the action and its registration would look like:: from django.contrib import admin from myapp.models import Article + + @admin.action(description="Mark selected stories as published") def make_published(modeladmin, request, queryset): - queryset.update(status='p') - make_published.short_description = "Mark selected stories as published" + queryset.update(status="p") + class ArticleAdmin(admin.ModelAdmin): - list_display = ['title', 'status'] - ordering = ['title'] + list_display = ["title", "status"] + ordering = ["title"] actions = [make_published] + admin.site.register(Article, ArticleAdmin) That code will give us an admin change list that looks something like this: @@ -169,11 +181,11 @@ You can do it like this:: class ArticleAdmin(admin.ModelAdmin): ... - actions = ['make_published'] + actions = ["make_published"] + @admin.action(description="Mark selected stories as published") def make_published(self, request, queryset): - queryset.update(status='p') - make_published.short_description = "Mark selected stories as published" + queryset.update(status="p") Notice first that we've moved ``make_published`` into a method and renamed the ``modeladmin`` parameter to ``self``, and second that we've now put the string @@ -186,22 +198,28 @@ provided by the admin. .. _custom-admin-action: -For example, we can use ``self`` to flash a message to the user informing her +For example, we can use ``self`` to flash a message to the user informing them that the action was successful:: from django.contrib import messages from django.utils.translation import ngettext + class ArticleAdmin(admin.ModelAdmin): ... def make_published(self, request, queryset): - updated = queryset.update(status='p') - self.message_user(request, ngettext( - '%d story was successfully marked as published.', - '%d stories were successfully marked as published.', - updated, - ) % updated, messages.SUCCESS) + updated = queryset.update(status="p") + self.message_user( + request, + ngettext( + "%d story was successfully marked as published.", + "%d stories were successfully marked as published.", + updated, + ) + % updated, + messages.SUCCESS, + ) This make the action match what the admin itself does after successfully performing an action: @@ -217,13 +235,14 @@ will need to return intermediate pages. For example, the built-in delete action asks for confirmation before deleting the selected objects. To provide an intermediary page, return an :class:`~django.http.HttpResponse` -(or subclass) from your action. For example, you might write a export function +(or subclass) from your action. For example, you might write an export function that uses Django's :doc:`serialization functions ` to dump some selected objects as JSON:: from django.core import serializers from django.http import HttpResponse + def export_as_json(modeladmin, request, queryset): response = HttpResponse(content_type="application/json") serializers.serialize("json", queryset, stream=response) @@ -242,13 +261,17 @@ that redirects to your custom export view:: from django.contrib.contenttypes.models import ContentType from django.http import HttpResponseRedirect + def export_selected_objects(modeladmin, request, queryset): - selected = queryset.values_list('pk', flat=True) + selected = queryset.values_list("pk", flat=True) ct = ContentType.objects.get_for_model(queryset.model) - return HttpResponseRedirect('/export/?ct=%s&ids=%s' % ( - ct.pk, - ','.join(str(pk) for pk in selected), - )) + return HttpResponseRedirect( + "/export/?ct=%s&ids=%s" + % ( + ct.pk, + ",".join(str(pk) for pk in selected), + ) + ) As you can see, the action is rather short; all the complex logic would belong in your export view. This would need to deal with objects of any type, hence @@ -278,7 +301,7 @@ Making actions available site-wide ` -- by passing a second argument to :meth:`AdminSite.add_action()`:: - admin.site.add_action(export_selected_objects, 'export_selected') + admin.site.add_action(export_selected_objects, "export_selected") .. _disabling-admin-actions: @@ -300,25 +323,27 @@ Disabling a site-wide action For example, you can use this method to remove the built-in "delete selected objects" action:: - admin.site.disable_action('delete_selected') + admin.site.disable_action("delete_selected") Once you've done the above, that action will no longer be available site-wide. - If, however, you need to re-enable a globally-disabled action for one + If, however, you need to reenable a globally-disabled action for one particular model, list it explicitly in your ``ModelAdmin.actions`` list:: # Globally disable delete selected - admin.site.disable_action('delete_selected') + admin.site.disable_action("delete_selected") + # This ModelAdmin will not have delete_selected available class SomeModelAdmin(admin.ModelAdmin): - actions = ['some_other_action'] + actions = ["some_other_action"] ... + # This one will class AnotherModelAdmin(admin.ModelAdmin): - actions = ['delete_selected', 'a_third_action'] + actions = ["delete_selected", "a_third_action"] ... @@ -353,9 +378,9 @@ Conditionally enabling or disabling actions def get_actions(self, request): actions = super().get_actions(request) - if request.user.username[0].upper() != 'J': - if 'delete_selected' in actions: - del actions['delete_selected'] + if request.user.username[0].upper() != "J": + if "delete_selected" in actions: + del actions["delete_selected"] return actions .. _admin-action-permissions: @@ -364,20 +389,20 @@ Setting permissions for actions ------------------------------- Actions may limit their availability to users with specific permissions by -setting an ``allowed_permissions`` attribute on the action function:: +wrapping the action function with the :func:`~django.contrib.admin.action` +decorator and passing the ``permissions`` argument:: + @admin.action(permissions=["change"]) def make_published(modeladmin, request, queryset): - queryset.update(status='p') - make_published.allowed_permissions = ('change',) + queryset.update(status="p") The ``make_published()`` action will only be available to users that pass the :meth:`.ModelAdmin.has_change_permission` check. -If ``allowed_permissions`` has more than one permission, the action will be -available as long as the user passes at least one of the checks. +If ``permissions`` has more than one permission, the action will be available +as long as the user passes at least one of the checks. -Available values for ``allowed_permissions`` and the corresponding method -checks are: +Available values for ``permissions`` and the corresponding method checks are: - ``'add'``: :meth:`.ModelAdmin.has_add_permission` - ``'change'``: :meth:`.ModelAdmin.has_change_permission` @@ -392,15 +417,57 @@ For example:: from django.contrib import admin from django.contrib.auth import get_permission_codename + class ArticleAdmin(admin.ModelAdmin): - actions = ['make_published'] + actions = ["make_published"] + @admin.action(permissions=["publish"]) def make_published(self, request, queryset): - queryset.update(status='p') - make_published.allowed_permissions = ('publish',) + queryset.update(status="p") def has_publish_permission(self, request): """Does the user have the publish permission?""" opts = self.opts - codename = get_permission_codename('publish', opts) - return request.user.has_perm('%s.%s' % (opts.app_label, codename)) + codename = get_permission_codename("publish", opts) + return request.user.has_perm("%s.%s" % (opts.app_label, codename)) + +The ``action`` decorator +======================== + +.. function:: action(*, permissions=None, description=None) + + This decorator can be used for setting specific attributes on custom action + functions that can be used with + :attr:`~django.contrib.admin.ModelAdmin.actions`:: + + @admin.action( + permissions=["publish"], + description="Mark selected stories as published", + ) + def make_published(self, request, queryset): + queryset.update(status="p") + + This is equivalent to setting some attributes (with the original, longer + names) on the function directly:: + + def make_published(self, request, queryset): + queryset.update(status="p") + + + make_published.allowed_permissions = ["publish"] + make_published.short_description = "Mark selected stories as published" + + Use of this decorator is not compulsory to make an action function, but it + can be useful to use it without arguments as a marker in your source to + identify the purpose of the function:: + + @admin.action + def make_inactive(self, request, queryset): + queryset.update(is_active=False) + + In this case it will add no attributes to the function. + + Action descriptions are %-formatted and may contain ``'%(verbose_name)s'`` + and ``'%(verbose_name_plural)s'`` placeholders, which are replaced, + respectively, by the model's :attr:`~django.db.models.Options.verbose_name` + and :attr:`~django.db.models.Options.verbose_name_plural`. diff --git a/docs/ref/contrib/admin/admindocs.txt b/docs/ref/contrib/admin/admindocs.txt index 5a95e101ed6c..5a605748ad55 100644 --- a/docs/ref/contrib/admin/admindocs.txt +++ b/docs/ref/contrib/admin/admindocs.txt @@ -23,7 +23,7 @@ the following: your ``urlpatterns``. Make sure it's included *before* the ``'admin/'`` entry, so that requests to ``/admin/doc/`` don't get handled by the latter entry. -* Install the docutils Python module (https://docutils.sourceforge.io/). +* Install the :pypi:`docutils` 0.19+ package. * **Optional:** Using the admindocs bookmarklets requires ``django.contrib.admindocs.middleware.XViewMiddleware`` to be installed. @@ -31,6 +31,8 @@ Once those steps are complete, you can start browsing the documentation by going to your admin interface and clicking the "Documentation" link in the upper right of the page. +.. _admindocs-helpers: + Documentation helpers ===================== @@ -47,13 +49,23 @@ Template filters ``:filter:`filtername``` Templates ``:template:`path/to/template.html``` ================= ======================= +Each of these support custom link text with the format +``:role:`link text ```. For example, ``:tag:`block ```. + +.. versionchanged:: 5.2 + + Support for custom link text was added. + +.. _admindocs-model-reference: + Model reference =============== -The **models** section of the ``admindocs`` page describes each model in the -system along with all the fields, properties, and methods available on it. -Relationships to other models appear as hyperlinks. Descriptions are pulled -from ``help_text`` attributes on fields or from docstrings on model methods. +The **models** section of the ``admindocs`` page describes each model that the +user has access to along with all the fields, properties, and methods available +on it. Relationships to other models appear as hyperlinks. Descriptions are +pulled from ``help_text`` attributes on fields or from docstrings on model +methods. A model with useful documentation might look like this:: @@ -62,11 +74,13 @@ A model with useful documentation might look like this:: Stores a single blog entry, related to :model:`blog.Blog` and :model:`auth.User`. """ + slug = models.SlugField(help_text="A short label, generally used in URLs.") author = models.ForeignKey( User, models.SET_NULL, - blank=True, null=True, + blank=True, + null=True, ) blog = models.ForeignKey(Blog, models.CASCADE) ... @@ -75,6 +89,11 @@ A model with useful documentation might look like this:: """Makes the blog entry live on the site.""" ... +.. versionchanged:: 5.2 + + Access was restricted to only allow users with model view or change + permissions. + View reference ============== @@ -92,6 +111,7 @@ For example:: from myapp.models import MyModel + def my_view(request, slug): """ Display an individual :model:`myapp.MyModel`. @@ -105,8 +125,8 @@ For example:: :template:`myapp/my_template.html` """ - context = {'mymodel': MyModel.objects.get(slug=slug)} - return render(request, 'myapp/my_template.html', context) + context = {"mymodel": MyModel.objects.get(slug=slug)} + return render(request, "myapp/my_template.html", context) Template tags and filters reference =================================== diff --git a/docs/ref/contrib/admin/filters.txt b/docs/ref/contrib/admin/filters.txt new file mode 100644 index 000000000000..d55e6fb946d9 --- /dev/null +++ b/docs/ref/contrib/admin/filters.txt @@ -0,0 +1,221 @@ +.. _modeladmin-list-filters: + +=========================== +``ModelAdmin`` List Filters +=========================== + +.. currentmodule:: django.contrib.admin + +``ModelAdmin`` classes can define list filters that appear in the right sidebar +of the change list page of the admin, as illustrated in the following +screenshot: + +.. image:: _images/list_filter.png + +To activate per-field filtering, set :attr:`ModelAdmin.list_filter` to a list +or tuple of elements, where each element is one of the following types: + +- A field name. +- A subclass of ``django.contrib.admin.SimpleListFilter``. +- A 2-tuple containing a field name and a subclass of + ``django.contrib.admin.FieldListFilter``. + +See the examples below for discussion of each of these options for defining +``list_filter``. + +Using a field name +================== + +The simplest option is to specify the required field names from your model. + +Each specified field should be either a ``BooleanField``, ``CharField``, +``DateField``, ``DateTimeField``, ``IntegerField``, ``ForeignKey`` or +``ManyToManyField``, for example:: + + class PersonAdmin(admin.ModelAdmin): + list_filter = ["is_staff", "company"] + +Field names in ``list_filter`` can also span relations +using the ``__`` lookup, for example:: + + class PersonAdmin(admin.UserAdmin): + list_filter = ["company__name"] + +Using a ``SimpleListFilter`` +============================ + +For custom filtering, you can define your own list filter by subclassing +``django.contrib.admin.SimpleListFilter``. You need to provide the ``title`` +and ``parameter_name`` attributes, and override the ``lookups`` and +``queryset`` methods, e.g.:: + + from datetime import date + + from django.contrib import admin + from django.utils.translation import gettext_lazy as _ + + + class DecadeBornListFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = _("decade born") + + # Parameter for the filter that will be used in the URL query. + parameter_name = "decade" + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + return [ + ("80s", _("in the eighties")), + ("90s", _("in the nineties")), + ] + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + # Compare the requested value (either '80s' or '90s') + # to decide how to filter the queryset. + if self.value() == "80s": + return queryset.filter( + birthday__gte=date(1980, 1, 1), + birthday__lte=date(1989, 12, 31), + ) + if self.value() == "90s": + return queryset.filter( + birthday__gte=date(1990, 1, 1), + birthday__lte=date(1999, 12, 31), + ) + + + class PersonAdmin(admin.ModelAdmin): + list_filter = [DecadeBornListFilter] + +.. note:: + + As a convenience, the ``HttpRequest`` object is passed to the ``lookups`` + and ``queryset`` methods, for example:: + + class AuthDecadeBornListFilter(DecadeBornListFilter): + def lookups(self, request, model_admin): + if request.user.is_superuser: + return super().lookups(request, model_admin) + + def queryset(self, request, queryset): + if request.user.is_superuser: + return super().queryset(request, queryset) + + Also as a convenience, the ``ModelAdmin`` object is passed to the + ``lookups`` method, for example if you want to base the lookups on the + available data:: + + class AdvancedDecadeBornListFilter(DecadeBornListFilter): + def lookups(self, request, model_admin): + """ + Only show the lookups if there actually is + anyone born in the corresponding decades. + """ + qs = model_admin.get_queryset(request) + if qs.filter( + birthday__gte=date(1980, 1, 1), + birthday__lte=date(1989, 12, 31), + ).exists(): + yield ("80s", _("in the eighties")) + if qs.filter( + birthday__gte=date(1990, 1, 1), + birthday__lte=date(1999, 12, 31), + ).exists(): + yield ("90s", _("in the nineties")) + +Using a field name and an explicit ``FieldListFilter`` +====================================================== + +Finally, if you wish to specify an explicit filter type to use with a field you +may provide a ``list_filter`` item as a 2-tuple, where the first element is a +field name and the second element is a class inheriting from +``django.contrib.admin.FieldListFilter``, for example:: + + class PersonAdmin(admin.ModelAdmin): + list_filter = [ + ("is_staff", admin.BooleanFieldListFilter), + ] + +Here the ``is_staff`` field will use the ``BooleanFieldListFilter``. Specifying +only the field name, fields will automatically use the appropriate filter for +most cases, but this format allows you to control the filter used. + +The following examples show available filter classes that you need to opt-in +to use. + +You can limit the choices of a related model to the objects involved in +that relation using ``RelatedOnlyFieldListFilter``:: + + class BookAdmin(admin.ModelAdmin): + list_filter = [ + ("author", admin.RelatedOnlyFieldListFilter), + ] + +Assuming ``author`` is a ``ForeignKey`` to a ``User`` model, this will +limit the ``list_filter`` choices to the users who have written a book, +instead of listing all users. + +You can filter empty values using ``EmptyFieldListFilter``, which can +filter on both empty strings and nulls, depending on what the field +allows to store:: + + class BookAdmin(admin.ModelAdmin): + list_filter = [ + ("title", admin.EmptyFieldListFilter), + ] + +By defining a filter using the ``__in`` lookup, it is possible to filter for +any of a group of values. You need to override the ``expected_parameters`` +method, and the specify the ``lookup_kwargs`` attribute with the appropriate +field name. By default, multiple values in the query string will be separated +with commas, but this can be customized via the ``list_separator`` attribute. +The following example shows such a filter using the vertical-pipe character as +the separator:: + + class FilterWithCustomSeparator(admin.FieldListFilter): + # custom list separator that should be used to separate values. + list_separator = "|" + + def __init__(self, field, request, params, model, model_admin, field_path): + self.lookup_kwarg = "%s__in" % field_path + super().__init__(field, request, params, model, model_admin, field_path) + + def expected_parameters(self): + return [self.lookup_kwarg] + +.. note:: + + The :class:`~django.contrib.contenttypes.fields.GenericForeignKey` field is + not supported. + +List filters typically appear only if the filter has more than one choice. A +filter's ``has_output()`` method controls whether or not it appears. + +It is possible to specify a custom template for rendering a list filter:: + + class FilterWithCustomTemplate(admin.SimpleListFilter): + template = "custom_template.html" + +See the default template provided by Django (``admin/filter.html``) for a +concrete example. + +.. _facet-filters: + +Facets +====== + +By default, counts for each filter, known as facets, can be shown by toggling +on via the admin UI. These counts will update according to the currently +applied filters. See :attr:`ModelAdmin.show_facets` for more details. diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index df956c6bf3e8..9fc5744dbd9b 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -34,20 +34,15 @@ If you're not using the default project template, here are the requirements: #. Configure a :class:`~django.template.backends.django.DjangoTemplates` backend in your :setting:`TEMPLATES` setting with - ``django.contrib.auth.context_processors.auth``, - ``django.contrib.messages.context_processors.request``, and + ``django.template.context_processors.request``, + ``django.contrib.auth.context_processors.auth``, and ``django.contrib.messages.context_processors.messages`` in the ``'context_processors'`` option of :setting:`OPTIONS `. - .. versionchanged:: 3.1 - - ``django.contrib.messages.context_processors.request`` was added as a - requirement in the ``'context_processors'`` option to support the new - :attr:`.AdminSite.enable_nav_sidebar`. - #. If you've customized the :setting:`MIDDLEWARE` setting, - :class:`django.contrib.auth.middleware.AuthenticationMiddleware` and + :class:`django.contrib.sessions.middleware.SessionMiddleware`, + :class:`django.contrib.auth.middleware.AuthenticationMiddleware`, and :class:`django.contrib.messages.middleware.MessageMiddleware` must be included. @@ -59,8 +54,7 @@ visiting the URL you hooked it into (``/admin/``, by default). If you need to create a user to login with, use the :djadmin:`createsuperuser` command. By default, logging in to the admin requires that the user has the -:attr:`~.User.is_superuser` or :attr:`~.User.is_staff` attribute set to -``True``. +:attr:`~.User.is_staff` attribute set to ``True``. Finally, determine which of your application's models should be editable in the admin interface. For each of those models, register them with the admin as @@ -73,6 +67,7 @@ Other topics :maxdepth: 1 actions + filters admindocs javascript @@ -93,10 +88,13 @@ Other topics application. Let's take a look at an example of the ``ModelAdmin``:: from django.contrib import admin - from myproject.myapp.models import Author + from myapp.models import Author + class AuthorAdmin(admin.ModelAdmin): pass + + admin.site.register(Author, AuthorAdmin) .. admonition:: Do you need a ``ModelAdmin`` object at all? @@ -109,20 +107,21 @@ Other topics preceding example could be simplified to:: from django.contrib import admin - from myproject.myapp.models import Author + from myapp.models import Author admin.site.register(Author) The ``register`` decorator -------------------------- -.. function:: register(*models, site=django.admin.sites.site) +.. function:: register(*models, site=django.contrib.admin.sites.site) There is also a decorator for registering your ``ModelAdmin`` classes:: from django.contrib import admin from .models import Author + @admin.register(Author) class AuthorAdmin(admin.ModelAdmin): pass @@ -135,6 +134,7 @@ The ``register`` decorator from .models import Author, Editor, Reader from myproject.admin_site import custom_admin_site + @admin.register(Author, Reader, Editor, site=custom_admin_site) class PersonAdmin(admin.ModelAdmin): pass @@ -191,8 +191,9 @@ subclass:: from django.contrib import admin + class AuthorAdmin(admin.ModelAdmin): - date_hierarchy = 'pub_date' + date_hierarchy = "pub_date" .. attribute:: ModelAdmin.actions @@ -220,12 +221,12 @@ subclass:: Example:: - date_hierarchy = 'pub_date' + date_hierarchy = "pub_date" You can also specify a field on a related model using the ``__`` lookup, for example:: - date_hierarchy = 'author__pub_date' + date_hierarchy = "author__pub_date" This will intelligently populate itself based on available data, e.g. if all the dates are in one month, it'll show the day-level @@ -246,22 +247,23 @@ subclass:: from django.contrib import admin + class AuthorAdmin(admin.ModelAdmin): - empty_value_display = '-empty-' + empty_value_display = "-empty-" You can also override ``empty_value_display`` for all admin pages with :attr:`AdminSite.empty_value_display`, or for specific fields like this:: from django.contrib import admin + class AuthorAdmin(admin.ModelAdmin): - fields = ('name', 'title', 'view_birth_date') + list_display = ["name", "title", "view_birth_date"] + @admin.display(empty_value="???") def view_birth_date(self, obj): return obj.birth_date - view_birth_date.empty_value_display = '???' - .. attribute:: ModelAdmin.exclude This attribute, if given, should be a list of field names to exclude from @@ -271,6 +273,7 @@ subclass:: from django.db import models + class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3) @@ -282,11 +285,13 @@ subclass:: from django.contrib import admin + class AuthorAdmin(admin.ModelAdmin): - fields = ('name', 'title') + fields = ["name", "title"] + class AuthorAdmin(admin.ModelAdmin): - exclude = ('birth_date',) + exclude = ["birth_date"] Since the Author model only has three fields, ``name``, ``title``, and ``birth_date``, the forms resulting from the above declarations will @@ -301,7 +306,7 @@ subclass:: :class:`django.contrib.flatpages.models.FlatPage` model as follows:: class FlatPageAdmin(admin.ModelAdmin): - fields = ('url', 'title', 'content') + fields = ["url", "title", "content"] In the above example, only the fields ``url``, ``title`` and ``content`` will be displayed, sequentially, in the form. ``fields`` can contain @@ -311,9 +316,9 @@ subclass:: For more complex layout needs, see the :attr:`~ModelAdmin.fieldsets` option. The ``fields`` option accepts the same types of values as - :attr:`~ModelAdmin.list_display`, except that callables aren't accepted. - Names of model and model admin methods will only be used if they're listed - in :attr:`~ModelAdmin.readonly_fields`. + :attr:`~ModelAdmin.list_display`, except that callables and ``__`` lookups + for related fields aren't accepted. Names of model and model admin methods + will only be used if they're listed in :attr:`~ModelAdmin.readonly_fields`. To display multiple fields on the same line, wrap those fields in their own tuple. In this example, the ``url`` and ``title`` fields will display on the @@ -321,9 +326,9 @@ subclass:: own line:: class FlatPageAdmin(admin.ModelAdmin): - fields = (('url', 'title'), 'content') + fields = [("url", "title"), "content"] - .. admonition:: Note + .. admonition:: Possible confusion with the ``ModelAdmin.fieldsets`` option This ``fields`` option should not be confused with the ``fields`` dictionary key that is within the :attr:`~ModelAdmin.fieldsets` option, @@ -332,17 +337,18 @@ subclass:: If neither ``fields`` nor :attr:`~ModelAdmin.fieldsets` options are present, Django will default to displaying each field that isn't an ``AutoField`` and has ``editable=True``, in a single fieldset, in the same order as the fields - are defined in the model. + are defined in the model, followed by any fields defined in + :attr:`~ModelAdmin.readonly_fields`. .. attribute:: ModelAdmin.fieldsets Set ``fieldsets`` to control the layout of admin "add" and "change" pages. - ``fieldsets`` is a list of two-tuples, in which each two-tuple represents a + ``fieldsets`` is a list of 2-tuples, in which each 2-tuple represents a ``
    `` on the admin form page. (A ``
    `` is a "section" of the form.) - The two-tuples are in the format ``(name, field_options)``, where ``name`` + The 2-tuples are in the format ``(name, field_options)``, where ``name`` is a string representing the title of the fieldset and ``field_options`` is a dictionary of information about the fieldset, including a list of fields to be displayed in it. @@ -352,16 +358,23 @@ subclass:: from django.contrib import admin + class FlatPageAdmin(admin.ModelAdmin): - fieldsets = ( - (None, { - 'fields': ('url', 'title', 'content', 'sites') - }), - ('Advanced options', { - 'classes': ('collapse',), - 'fields': ('registration_required', 'template_name'), - }), - ) + fieldsets = [ + ( + None, + { + "fields": ["url", "title", "content", "sites"], + }, + ), + ( + "Advanced options", + { + "classes": ["collapse"], + "fields": ["registration_required", "template_name"], + }, + ), + ] This results in an admin page that looks like: @@ -375,13 +388,13 @@ subclass:: The ``field_options`` dictionary can have the following keys: * ``fields`` - A tuple of field names to display in this fieldset. This key is + A list or tuple of field names to display in this fieldset. This key is required. Example:: { - 'fields': ('first_name', 'last_name', 'address', 'city', 'state'), + "fields": ["first_name", "last_name", "address", "city", "state"], } As with the :attr:`~ModelAdmin.fields` option, to display multiple @@ -390,7 +403,7 @@ subclass:: the same line:: { - 'fields': (('first_name', 'last_name'), 'address', 'city', 'state'), + "fields": [("first_name", "last_name"), "address", "city", "state"], } ``fields`` can contain values defined in @@ -402,24 +415,26 @@ subclass:: * ``classes`` A list or tuple containing extra CSS classes to apply to the fieldset. + This can include any custom CSS class defined in the project, as well + as any of the CSS classes provided by Django. Within the default admin + site CSS stylesheet, two particularly useful classes are defined: + ``collapse`` and ``wide``. Example:: { - 'classes': ('wide', 'extrapretty'), + "classes": ["wide", "collapse"], } - Two useful classes defined by the default admin site stylesheet are - ``collapse`` and ``wide``. Fieldsets with the ``collapse`` style - will be initially collapsed in the admin and replaced with a small - "click to expand" link. Fieldsets with the ``wide`` style will be - given extra horizontal space. + Fieldsets with the ``wide`` style will be given extra horizontal + space in the admin interface. + Fieldsets with a name and the ``collapse`` style will be initially + collapsed, using an expandable widget with a toggle for switching + their visibility. * ``description`` A string of optional extra text to be displayed at the top of each - fieldset, under the heading of the fieldset. This string is not - rendered for :class:`~django.contrib.admin.TabularInline` due to its - layout. + fieldset, under the heading of the fieldset. Note that this value is *not* HTML-escaped when it's displayed in the admin interface. This lets you include HTML if you so desire. @@ -427,6 +442,17 @@ subclass:: :func:`django.utils.html.escape` to escape any HTML special characters. + .. admonition:: :class:`~django.contrib.admin.TabularInline` has limited + support for ``fieldsets`` + + Using ``fieldsets`` with :class:`~django.contrib.admin.TabularInline` + has limited functionality. You can specify which fields will be + displayed and their order within the ``TabularInline`` layout by + defining ``fields`` in the ``field_options`` dictionary. + + All other features are not supported. This includes the use of ``name`` + to define a title for a group of fields. + .. attribute:: ModelAdmin.filter_horizontal By default, a :class:`~django.db.models.ManyToManyField` is displayed in @@ -455,7 +481,7 @@ subclass:: For an example see the section :ref:`admin-custom-validation`. - .. admonition:: Note + .. admonition:: Omit the ``Meta.model`` attribute If you define the ``Meta.model`` attribute on a :class:`~django.forms.ModelForm`, you must also define the @@ -469,7 +495,7 @@ subclass:: ``fields = []`` in the ``Meta`` class to satisfy the validation on the ``ModelForm``. - .. admonition:: Note + .. admonition:: ``ModelAdmin.exclude`` takes precedence If your ``ModelForm`` and ``ModelAdmin`` both define an ``exclude`` option then ``ModelAdmin`` takes precedence:: @@ -478,14 +504,15 @@ subclass:: from django.contrib import admin from myapp.models import Person - class PersonForm(forms.ModelForm): + class PersonForm(forms.ModelForm): class Meta: model = Person - exclude = ['name'] + exclude = ["name"] + class PersonAdmin(admin.ModelAdmin): - exclude = ['age'] + exclude = ["age"] form = PersonForm In the above example, the "age" field will be excluded but the "name" @@ -511,9 +538,10 @@ subclass:: from myapp.models import MyModel from myapp.widgets import RichTextEditorWidget + class MyModelAdmin(admin.ModelAdmin): formfield_overrides = { - models.TextField: {'widget': RichTextEditorWidget}, + models.TextField: {"widget": RichTextEditorWidget}, } Note that the key in the dictionary is the actual field class, *not* a @@ -547,36 +575,44 @@ subclass:: Example:: - list_display = ('first_name', 'last_name') + list_display = ["first_name", "last_name"] If you don't set ``list_display``, the admin site will display a single column that displays the ``__str__()`` representation of each object. - There are four types of values that can be used in ``list_display``: + There are five types of values that can be used in ``list_display``. All + but the simplest may use the :func:`~django.contrib.admin.display` + decorator, which is used to customize how the field is presented: * The name of a model field. For example:: class PersonAdmin(admin.ModelAdmin): - list_display = ('first_name', 'last_name') + list_display = ["first_name", "last_name"] + + * The name of a related field, using the ``__`` notation. For example:: + + class PersonAdmin(admin.ModelAdmin): + list_display = ["city__name"] * A callable that accepts one argument, the model instance. For example:: + @admin.display(description="Name") def upper_case_name(obj): - return ("%s %s" % (obj.first_name, obj.last_name)).upper() - upper_case_name.short_description = 'Name' + return f"{obj.first_name} {obj.last_name}".upper() + class PersonAdmin(admin.ModelAdmin): - list_display = (upper_case_name,) + list_display = [upper_case_name] * A string representing a ``ModelAdmin`` method that accepts one argument, the model instance. For example:: class PersonAdmin(admin.ModelAdmin): - list_display = ('upper_case_name',) + list_display = ["upper_case_name"] + @admin.display(description="Name") def upper_case_name(self, obj): - return ("%s %s" % (obj.first_name, obj.last_name)).upper() - upper_case_name.short_description = 'Name' + return f"{obj.first_name} {obj.last_name}".upper() * A string representing a model attribute or method (without any required arguments). For example:: @@ -584,16 +620,19 @@ subclass:: from django.contrib import admin from django.db import models + class Person(models.Model): name = models.CharField(max_length=50) birthday = models.DateField() + @admin.display(description="Birth decade") def decade_born_in(self): - return self.birthday.strftime('%Y')[:3] + "0's" - decade_born_in.short_description = 'Birth decade' + decade = self.birthday.year // 10 * 10 + return f"{decade}’s" + class PersonAdmin(admin.ModelAdmin): - list_display = ('name', 'decade_born_in') + list_display = ["name", "decade_born_in"] A few special cases to note about ``list_display``: @@ -606,8 +645,8 @@ subclass:: and add that method's name to ``list_display``. (See below for more on custom methods in ``list_display``.) - * If the field is a ``BooleanField``, Django will display a pretty "on" or - "off" icon instead of ``True`` or ``False``. + * If the field is a ``BooleanField``, Django will display a pretty "yes", + "no", or "unknown" icon instead of ``True``, ``False``, or ``None``. * If the string given is a method of the model, ``ModelAdmin`` or a callable, Django will HTML-escape the output by default. To escape @@ -620,11 +659,13 @@ subclass:: from django.db import models from django.utils.html import format_html + class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) + @admin.display def colored_name(self): return format_html( '{} {}', @@ -633,12 +674,15 @@ subclass:: self.last_name, ) + class PersonAdmin(admin.ModelAdmin): - list_display = ('first_name', 'last_name', 'colored_name') + list_display = ["first_name", "last_name", "colored_name"] * As some examples have already demonstrated, when using a callable, a model method, or a ``ModelAdmin`` method, you can customize the column's - title by adding a ``short_description`` attribute to the callable. + title by wrapping the callable with the + :func:`~django.contrib.admin.display` decorator and passing the + ``description`` argument. * If the value of a field is ``None``, an empty string, or an iterable without elements, Django will display ``-`` (a dash). You can override @@ -646,141 +690,156 @@ subclass:: from django.contrib import admin - admin.site.empty_value_display = '(None)' + admin.site.empty_value_display = "(None)" You can also use :attr:`ModelAdmin.empty_value_display`:: class PersonAdmin(admin.ModelAdmin): - empty_value_display = 'unknown' + empty_value_display = "unknown" Or on a field level:: class PersonAdmin(admin.ModelAdmin): - list_display = ('name', 'birth_date_view') + list_display = ["name", "birth_date_view"] + @admin.display(empty_value="unknown") def birth_date_view(self, obj): - return obj.birth_date - - birth_date_view.empty_value_display = 'unknown' + return obj.birth_date * If the string given is a method of the model, ``ModelAdmin`` or a - callable that returns True or False Django will display a pretty - "on" or "off" icon if you give the method a ``boolean`` attribute - whose value is ``True``. - - Here's a full example model:: + callable that returns ``True``, ``False``, or ``None``, Django will + display a pretty "yes", "no", or "unknown" icon if you wrap the method + with the :func:`~django.contrib.admin.display` decorator passing the + ``boolean`` argument with the value set to ``True``:: from django.contrib import admin from django.db import models + class Person(models.Model): first_name = models.CharField(max_length=50) birthday = models.DateField() + @admin.display(boolean=True) def born_in_fifties(self): - return self.birthday.strftime('%Y')[:3] == '195' - born_in_fifties.boolean = True + return 1950 <= self.birthday.year < 1960 + class PersonAdmin(admin.ModelAdmin): - list_display = ('name', 'born_in_fifties') + list_display = ["name", "born_in_fifties"] * The ``__str__()`` method is just as valid in ``list_display`` as any other model method, so it's perfectly OK to do this:: - list_display = ('__str__', 'some_other_field') + list_display = ["__str__", "some_other_field"] * Usually, elements of ``list_display`` that aren't actual database fields can't be used in sorting (because Django does all the sorting at the database level). - However, if an element of ``list_display`` represents a certain - database field, you can indicate this fact by setting the - ``admin_order_field`` attribute of the item. + However, if an element of ``list_display`` represents a certain database + field, you can indicate this fact by using the + :func:`~django.contrib.admin.display` decorator on the method, passing + the ``ordering`` argument:: - For example:: + from django.contrib import admin + from django.db import models + from django.utils.html import format_html - from django.contrib import admin - from django.db import models - from django.utils.html import format_html - class Person(models.Model): - first_name = models.CharField(max_length=50) - color_code = models.CharField(max_length=6) + class Person(models.Model): + first_name = models.CharField(max_length=50) + color_code = models.CharField(max_length=6) - def colored_first_name(self): - return format_html( - '{}', - self.color_code, - self.first_name, - ) + @admin.display(ordering="first_name") + def colored_first_name(self): + return format_html( + '{}', + self.color_code, + self.first_name, + ) - colored_first_name.admin_order_field = 'first_name' - class PersonAdmin(admin.ModelAdmin): - list_display = ('first_name', 'colored_first_name') + class PersonAdmin(admin.ModelAdmin): + list_display = ["first_name", "colored_first_name"] The above will tell Django to order by the ``first_name`` field when trying to sort by ``colored_first_name`` in the admin. - To indicate descending order with ``admin_order_field`` you can use a - hyphen prefix on the field name. Using the above example, this would - look like:: + To indicate descending order with the ``ordering`` argument you can use a + hyphen prefix on the field name. Using the above example, this would look + like:: - colored_first_name.admin_order_field = '-first_name' + @admin.display(ordering="-first_name") + def colored_first_name(self): ... - ``admin_order_field`` supports query lookups to sort by values on related - models. This example includes an "author first name" column in the list - display and allows sorting it by first name:: + The ``ordering`` argument supports query lookups to sort by values on + related models. This example includes an "author first name" column in + the list display and allows sorting it by first name:: class Blog(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Person, on_delete=models.CASCADE) + class BlogAdmin(admin.ModelAdmin): - list_display = ('title', 'author', 'author_first_name') + list_display = ["title", "author", "author_first_name"] + @admin.display(ordering="author__first_name") def author_first_name(self, obj): return obj.author.first_name - author_first_name.admin_order_field = 'author__first_name' - - :doc:`Query expressions ` may be used in - ``admin_order_field``. For example:: + :doc:`Query expressions ` may be used with the + ``ordering`` argument:: from django.db.models import Value from django.db.models.functions import Concat + class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) + @admin.display(ordering=Concat("first_name", Value(" "), "last_name")) def full_name(self): - return self.first_name + ' ' + self.last_name - full_name.admin_order_field = Concat('first_name', Value(' '), 'last_name') - - * Elements of ``list_display`` can also be properties. Please note however, - that due to the way properties work in Python, setting - ``short_description`` or ``admin_order_field`` on a property is only - possible when using the ``property()`` function and **not** with the - ``@property`` decorator. + return self.first_name + " " + self.last_name - For example:: + * Elements of ``list_display`` can also be properties + :: class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) - def my_property(self): - return self.first_name + ' ' + self.last_name - my_property.short_description = "Full name of the person" - my_property.admin_order_field = 'last_name' + @property + @admin.display( + ordering="last_name", + description="Full name of the person", + boolean=False, + ) + def full_name(self): + return self.first_name + " " + self.last_name - full_name = property(my_property) class PersonAdmin(admin.ModelAdmin): - list_display = ('full_name',) + list_display = ["full_name"] + + Note that ``@property`` must be above ``@display``. If you're using the + old way -- setting the display-related attributes directly rather than + using the :func:`~django.contrib.admin.display` decorator -- be aware + that the ``property()`` function and **not** the ``@property`` decorator + must be used:: + + def my_property(self): + return self.first_name + " " + self.last_name + my_property.short_description = "Full name of the person" + my_property.admin_order_field = "last_name" + my_property.boolean = False + + full_name = property(my_property) + * The field names in ``list_display`` will also appear as CSS classes in the HTML output, in the form of ``column-`` on each ```` element. This can be used to set column widths in a CSS file for example. @@ -788,7 +847,7 @@ subclass:: * Django will try to interpret every element of ``list_display`` in this order: - * A field of the model. + * A field of the model or from a related field. * A callable. * A string representing a ``ModelAdmin`` attribute. * A string representing a model attribute. @@ -819,13 +878,13 @@ subclass:: linked on the change list page:: class PersonAdmin(admin.ModelAdmin): - list_display = ('first_name', 'last_name', 'birthday') - list_display_links = ('first_name', 'last_name') + list_display = ["first_name", "last_name", "birthday"] + list_display_links = ["first_name", "last_name"] In this example, the change list page grid will have no links:: class AuditEntryAdmin(admin.ModelAdmin): - list_display = ('timestamp', 'message') + list_display = ["timestamp", "message"] list_display_links = None .. _admin-list-editable: @@ -854,158 +913,11 @@ subclass:: .. attribute:: ModelAdmin.list_filter Set ``list_filter`` to activate filters in the right sidebar of the change - list page of the admin, as illustrated in the following screenshot: - - .. image:: _images/list_filter.png - - ``list_filter`` should be a list or tuple of elements, where each element - should be of one of the following types: - - * a field name, where the specified field should be either a - ``BooleanField``, ``CharField``, ``DateField``, ``DateTimeField``, - ``IntegerField``, ``ForeignKey`` or ``ManyToManyField``, for example:: - - class PersonAdmin(admin.ModelAdmin): - list_filter = ('is_staff', 'company') - - Field names in ``list_filter`` can also span relations - using the ``__`` lookup, for example:: - - class PersonAdmin(admin.UserAdmin): - list_filter = ('company__name',) - - * a class inheriting from ``django.contrib.admin.SimpleListFilter``, - which you need to provide the ``title`` and ``parameter_name`` - attributes to and override the ``lookups`` and ``queryset`` methods, - e.g.:: - - from datetime import date - - from django.contrib import admin - from django.utils.translation import gettext_lazy as _ - - class DecadeBornListFilter(admin.SimpleListFilter): - # Human-readable title which will be displayed in the - # right admin sidebar just above the filter options. - title = _('decade born') - - # Parameter for the filter that will be used in the URL query. - parameter_name = 'decade' - - def lookups(self, request, model_admin): - """ - Returns a list of tuples. The first element in each - tuple is the coded value for the option that will - appear in the URL query. The second element is the - human-readable name for the option that will appear - in the right sidebar. - """ - return ( - ('80s', _('in the eighties')), - ('90s', _('in the nineties')), - ) - - def queryset(self, request, queryset): - """ - Returns the filtered queryset based on the value - provided in the query string and retrievable via - `self.value()`. - """ - # Compare the requested value (either '80s' or '90s') - # to decide how to filter the queryset. - if self.value() == '80s': - return queryset.filter(birthday__gte=date(1980, 1, 1), - birthday__lte=date(1989, 12, 31)) - if self.value() == '90s': - return queryset.filter(birthday__gte=date(1990, 1, 1), - birthday__lte=date(1999, 12, 31)) - - class PersonAdmin(admin.ModelAdmin): - list_filter = (DecadeBornListFilter,) - - .. note:: - - As a convenience, the ``HttpRequest`` object is passed to the - ``lookups`` and ``queryset`` methods, for example:: - - class AuthDecadeBornListFilter(DecadeBornListFilter): - - def lookups(self, request, model_admin): - if request.user.is_superuser: - return super().lookups(request, model_admin) - - def queryset(self, request, queryset): - if request.user.is_superuser: - return super().queryset(request, queryset) - - Also as a convenience, the ``ModelAdmin`` object is passed to - the ``lookups`` method, for example if you want to base the - lookups on the available data:: - - class AdvancedDecadeBornListFilter(DecadeBornListFilter): - - def lookups(self, request, model_admin): - """ - Only show the lookups if there actually is - anyone born in the corresponding decades. - """ - qs = model_admin.get_queryset(request) - if qs.filter(birthday__gte=date(1980, 1, 1), - birthday__lte=date(1989, 12, 31)).exists(): - yield ('80s', _('in the eighties')) - if qs.filter(birthday__gte=date(1990, 1, 1), - birthday__lte=date(1999, 12, 31)).exists(): - yield ('90s', _('in the nineties')) - - * a tuple, where the first element is a field name and the second - element is a class inheriting from - ``django.contrib.admin.FieldListFilter``, for example:: - - class PersonAdmin(admin.ModelAdmin): - list_filter = ( - ('is_staff', admin.BooleanFieldListFilter), - ) - - You can limit the choices of a related model to the objects involved in - that relation using ``RelatedOnlyFieldListFilter``:: - - class BookAdmin(admin.ModelAdmin): - list_filter = ( - ('author', admin.RelatedOnlyFieldListFilter), - ) - - Assuming ``author`` is a ``ForeignKey`` to a ``User`` model, this will - limit the ``list_filter`` choices to the users who have written a book - instead of listing all users. - - You can filter empty values using ``EmptyFieldListFilter``, which can - filter on both empty strings and nulls, depending on what the field - allows to store:: - - class BookAdmin(admin.ModelAdmin): - list_filter = ( - ('title', admin.EmptyFieldListFilter), - ) - - .. note:: - - The ``FieldListFilter`` API is considered internal and might be - changed. - - .. versionadded:: 3.1 - - The ``EmptyFieldListFilter`` class was added. - - List filter's typically appear only if the filter has more than one choice. - A filter's ``has_output()`` method controls whether or not it appears. - - It is possible to specify a custom template for rendering a list filter:: - - class FilterWithCustomTemplate(admin.SimpleListFilter): - template = "custom_template.html" + list page of the admin. - See the default template provided by Django (``admin/filter.html``) for - a concrete example. + At it's simplest ``list_filter`` takes a list or tuple of field names to + activate filtering upon, but several more advanced options as available. + See :ref:`modeladmin-list-filters` for the details. .. attribute:: ModelAdmin.list_max_show_all @@ -1039,7 +951,7 @@ subclass:: ``select_related`` as parameters. For example:: class ArticleAdmin(admin.ModelAdmin): - list_select_related = ('author', 'category') + list_select_related = ["author", "category"] will call ``select_related('author', 'category')``. @@ -1089,7 +1001,7 @@ subclass:: fields it should prepopulate from:: class ArticleAdmin(admin.ModelAdmin): - prepopulated_fields = {"slug": ("title",)} + prepopulated_fields = {"slug": ["title"]} When set, the given fields will use a bit of JavaScript to populate from the fields assigned. The main use for this functionality is to @@ -1105,16 +1017,55 @@ subclass:: ``prepopulated_fields`` doesn't accept ``DateTimeField``, ``ForeignKey``, ``OneToOneField``, and ``ManyToManyField`` fields. - .. versionchanged:: 3.2 +.. attribute:: ModelAdmin.preserve_filters - In older versions, various English stop words are removed from - generated values. + By default, applied filters are preserved on the list view after creating, + editing, or deleting an object. You can have filters cleared by setting + this attribute to ``False``. -.. attribute:: ModelAdmin.preserve_filters +.. attribute:: ModelAdmin.show_facets + + Controls whether facet counts are displayed for filters in the admin + changelist. Defaults to :attr:`.ShowFacets.ALLOW`. + + When displayed, facet counts update in line with currently applied filters. + + .. class:: ShowFacets + + Enum of allowed values for :attr:`.ModelAdmin.show_facets`. + + .. attribute:: ALWAYS + + Always show facet counts. + + .. attribute:: ALLOW + + Show facet counts when the ``_facets`` query string parameter is + provided. + + .. attribute:: NEVER + + Never show facet counts. - The admin now preserves filters on the list view after creating, editing - or deleting an object. You can restore the previous behavior of clearing - filters by setting this attribute to ``False``. + Set ``show_facets`` to the desired :class:`.ShowFacets` value. For example, + to always show facet counts without needing to provide the query + parameter:: + + from django.contrib import admin + + + class MyModelAdmin(admin.ModelAdmin): + ... + # Have facets always shown for this model admin. + show_facets = admin.ShowFacets.ALWAYS + + .. admonition:: Performance considerations with facets + + Enabling facet filters will increase the number of queries on the admin + changelist page in line with the number of filters. These queries may + cause performance problems, especially for large datasets. In these + cases it may be appropriate to set ``show_facets`` to + :attr:`.ShowFacets.NEVER` to disable faceting entirely. .. attribute:: ModelAdmin.radio_fields @@ -1161,11 +1112,12 @@ subclass:: ``question_text`` field and ordered by the ``date_created`` field:: class QuestionAdmin(admin.ModelAdmin): - ordering = ['date_created'] - search_fields = ['question_text'] + ordering = ["date_created"] + search_fields = ["question_text"] + class ChoiceAdmin(admin.ModelAdmin): - autocomplete_fields = ['question'] + autocomplete_fields = ["question"] .. admonition:: Performance considerations for large datasets @@ -1197,7 +1149,7 @@ subclass:: ``ManyToManyField``:: class ArticleAdmin(admin.ModelAdmin): - raw_id_fields = ("newspaper",) + raw_id_fields = ["newspaper"] The ``raw_id_fields`` ``Input`` widget should contain a primary key if the field is a ``ForeignKey`` or a comma separated list of values if the field @@ -1232,22 +1184,22 @@ subclass:: from django.utils.html import format_html_join from django.utils.safestring import mark_safe + class PersonAdmin(admin.ModelAdmin): - readonly_fields = ('address_report',) + readonly_fields = ["address_report"] + # description functions like a model field's verbose_name + @admin.display(description="Address") def address_report(self, instance): # assuming get_full_address() returns a list of strings # for each line of the address and you want to separate each # line by a linebreak return format_html_join( - mark_safe('
    '), - '{}', + mark_safe("
    "), + "{}", ((line,) for line in instance.get_full_address()), ) or mark_safe("I can't determine this address.") - # short_description functions like a model field's verbose_name - address_report.short_description = "Address" - .. attribute:: ModelAdmin.save_as Set ``save_as`` to enable a "save as new" feature on admin change forms. @@ -1288,13 +1240,13 @@ subclass:: ``TextField``. You can also perform a related lookup on a ``ForeignKey`` or ``ManyToManyField`` with the lookup API "follow" notation:: - search_fields = ['foreign_key__related_fieldname'] + search_fields = ["foreign_key__related_fieldname"] For example, if you have a blog entry with an author, the following definition would enable searching blog entries by the email address of the author:: - search_fields = ['user__email'] + search_fields = ["user__email"] When somebody does a search in the admin search box, Django splits the search query into words and returns all objects that contain each of the @@ -1328,7 +1280,7 @@ subclass:: ====== ==================== Prefix Lookup ====== ==================== - ^ :lookup:`startswith` + ^ :lookup:`istartswith` = :lookup:`iexact` @ :lookup:`search` None :lookup:`icontains` @@ -1338,9 +1290,10 @@ subclass:: :meth:`ModelAdmin.get_search_results` to provide additional or alternate search behavior. - .. versionchanged:: 3.2 +.. attribute:: ModelAdmin.search_help_text - Support for searching against quoted phrases with spaces was added. + Set ``search_help_text`` to specify a descriptive text for the search box + which will be displayed below it. .. attribute:: ModelAdmin.show_full_result_count @@ -1356,8 +1309,9 @@ subclass:: .. attribute:: ModelAdmin.sortable_by By default, the change list page allows sorting by all model fields (and - callables that have the ``admin_order_field`` property) specified in - :attr:`list_display`. + callables that use the ``ordering`` argument to the + :func:`~django.contrib.admin.display` decorator or have the + ``admin_order_field`` attribute) specified in :attr:`list_display`. If you want to disable sorting for some columns, set ``sortable_by`` to a collection (e.g. ``list``, ``tuple``, or ``set``) of the subset of @@ -1382,6 +1336,7 @@ subclass:: from django.contrib import admin + class PersonAdmin(admin.ModelAdmin): view_on_site = False @@ -1391,10 +1346,11 @@ subclass:: from django.contrib import admin from django.urls import reverse + class PersonAdmin(admin.ModelAdmin): def view_on_site(self, obj): - url = reverse('person-detail', kwargs={'slug': obj.slug}) - return 'https://example.com' + url + url = reverse("person-detail", kwargs={"slug": obj.slug}) + return "https://example.com" + url Custom template options ~~~~~~~~~~~~~~~~~~~~~~~ @@ -1459,6 +1415,7 @@ templates used by the :class:`ModelAdmin` views: from django.contrib import admin + class ArticleAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.user = request.user @@ -1499,6 +1456,27 @@ templates used by the :class:`ModelAdmin` views: See also :ref:`saving-objects-in-the-formset`. +.. warning:: + + All hooks that return a ``ModelAdmin`` property return the property itself + rather than a copy of its value. Dynamically modifying the value can lead + to surprising results. + + Let's take :meth:`ModelAdmin.get_readonly_fields` as an example:: + + class PersonAdmin(admin.ModelAdmin): + readonly_fields = ["name"] + + def get_readonly_fields(self, request, obj=None): + readonly = super().get_readonly_fields(request, obj) + if not request.user.is_superuser: + readonly.append("age") # Edits the class attribute. + return readonly + + This results in ``readonly_fields`` becoming + ``["name", "age", "age", ...]``, even for a superuser, as ``"age"`` is added + each time non-superuser visits the page. + .. method:: ModelAdmin.get_ordering(request) The ``get_ordering`` method takes a ``request`` as parameter and @@ -1506,12 +1484,11 @@ templates used by the :class:`ModelAdmin` views: to the :attr:`ordering` attribute. For example:: class PersonAdmin(admin.ModelAdmin): - def get_ordering(self, request): if request.user.is_superuser: - return ['name', 'rank'] + return ["name", "rank"] else: - return ['name'] + return ["name"] .. method:: ModelAdmin.get_search_results(request, queryset, search_term) @@ -1525,31 +1502,38 @@ templates used by the :class:`ModelAdmin` views: This method may be overridden with your own custom search method. For example, you might wish to search by an integer field, or use an external - tool such as Solr or Haystack. You must establish if the queryset changes - implemented by your search method may introduce duplicates into the results, - and return ``True`` in the second element of the return value. + tool such as `Solr`_ or `Haystack`_. You must establish if the queryset + changes implemented by your search method may introduce duplicates into the + results, and return ``True`` in the second element of the return value. For example, to search by ``name`` and ``age``, you could use:: class PersonAdmin(admin.ModelAdmin): - list_display = ('name', 'age') - search_fields = ('name',) + list_display = ["name", "age"] + search_fields = ["name"] def get_search_results(self, request, queryset, search_term): - queryset, use_distinct = super().get_search_results(request, queryset, search_term) + queryset, may_have_duplicates = super().get_search_results( + request, + queryset, + search_term, + ) try: search_term_as_int = int(search_term) except ValueError: pass else: queryset |= self.model.objects.filter(age=search_term_as_int) - return queryset, use_distinct + return queryset, may_have_duplicates This implementation is more efficient than ``search_fields = ('name', '=age')`` which results in a string comparison for the numeric field, for example ``... OR UPPER("polls_choice"."votes"::text) = UPPER('4')`` on PostgreSQL. +.. _Solr: https://solr.apache.org +.. _Haystack: https://haystacksearch.org + .. method:: ModelAdmin.save_related(request, form, formsets, change) The ``save_related`` method is given the ``HttpRequest``, the parent @@ -1610,7 +1594,7 @@ templates used by the :class:`ModelAdmin` views: The ``get_fieldsets`` method is given the ``HttpRequest`` and the ``obj`` being edited (or ``None`` on an add form) and is expected to return a list - of two-tuples, in which each two-tuple represents a ``
    `` on the + of 2-tuples, in which each 2-tuple represents a ``
    `` on the admin form page, as described above in the :attr:`ModelAdmin.fieldsets` section. .. method:: ModelAdmin.get_list_filter(request) @@ -1643,9 +1627,8 @@ templates used by the :class:`ModelAdmin` views: For example, to prevent one or more columns from being sortable:: class PersonAdmin(admin.ModelAdmin): - def get_sortable_by(self, request): - return {*self.get_list_display(request)} - {'rank'} + return {*self.get_list_display(request)} - {"rank"} .. method:: ModelAdmin.get_inline_instances(request, obj=None) @@ -1657,7 +1640,7 @@ templates used by the :class:`ModelAdmin` views: filtering based on add, change, delete, and view permissions:: class MyModelAdmin(admin.ModelAdmin): - inlines = (MyInline,) + inlines = [MyInline] def get_inline_instances(self, request, obj=None): return [inline(self.model, self.admin_site) for inline in self.inlines] @@ -1678,27 +1661,27 @@ templates used by the :class:`ModelAdmin` views: The ``get_urls`` method on a ``ModelAdmin`` returns the URLs to be used for that ModelAdmin in the same way as a URLconf. Therefore you can extend - them as documented in :doc:`/topics/http/urls`:: + them as documented in :doc:`/topics/http/urls`, using the + ``AdminSite.admin_view()`` wrapper on your views:: from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path + class MyModelAdmin(admin.ModelAdmin): def get_urls(self): urls = super().get_urls() - my_urls = [ - path('my_view/', self.my_view), - ] + my_urls = [path("my_view/", self.admin_site.admin_view(self.my_view))] return my_urls + urls def my_view(self, request): # ... context = dict( - # Include common variables for rendering the admin template. - self.admin_site.each_context(request), - # Anything else you want in the context... - key=value, + # Include common variables for rendering the admin template. + self.admin_site.each_context(request), + # Anything else you want in the context... + key=value, ) return TemplateResponse(request, "sometemplate.html", context) @@ -1711,6 +1694,18 @@ templates used by the :class:`ModelAdmin` views: ... {% endblock %} + .. note:: + + Notice how the ``self.my_view`` function is wrapped in + ``self.admin_site.admin_view``. This is important, since it ensures two + things: + + #. Permission checks are run, ensuring only active staff users can + access the view. + #. The :func:`django.views.decorators.cache.never_cache` decorator is + applied to prevent caching, ensuring the returned information is + up-to-date. + .. note:: Notice that the custom patterns are included *before* the regular admin @@ -1722,41 +1717,11 @@ templates used by the :class:`ModelAdmin` views: ``/admin/myapp/mymodel/my_view/`` (assuming the admin URLs are included at ``/admin/``.) - However, the ``self.my_view`` function registered above suffers from two - problems: - - * It will *not* perform any permission checks, so it will be accessible - to the general public. - * It will *not* provide any header details to prevent caching. This means - if the page retrieves data from the database, and caching middleware is - active, the page could show outdated information. - - Since this is usually not what you want, Django provides a convenience - wrapper to check permissions and mark the view as non-cacheable. This - wrapper is ``AdminSite.admin_view()`` (i.e. ``self.admin_site.admin_view`` - inside a ``ModelAdmin`` instance); use it like so:: - - class MyModelAdmin(admin.ModelAdmin): - def get_urls(self): - urls = super().get_urls() - my_urls = [ - path('my_view/', self.admin_site.admin_view(self.my_view)) - ] - return my_urls + urls - - Notice the wrapped view in the fifth line above:: - - path('my_view/', self.admin_site.admin_view(self.my_view)) - - This wrapping will protect ``self.my_view`` from unauthorized access and - will apply the :func:`django.views.decorators.cache.never_cache` decorator to - make sure it is not cached if the cache middleware is active. - If the page is cacheable, but you still want the permission check to be performed, you can pass a ``cacheable=True`` argument to ``AdminSite.admin_view()``:: - path('my_view/', self.admin_site.admin_view(self.my_view, cacheable=True)) + path("my_view/", self.admin_site.admin_view(self.my_view, cacheable=True)) ``ModelAdmin`` views have ``model_admin`` attributes. Other ``AdminSite`` views have ``admin_site`` attributes. @@ -1774,7 +1739,7 @@ templates used by the :class:`ModelAdmin` views: class MyModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if request.user.is_superuser: - kwargs['form'] = MySuperuserForm + kwargs["form"] = MySuperuserForm return super().get_form(request, obj, **kwargs) You may also return a custom :class:`~django.forms.ModelForm` class @@ -1812,6 +1777,19 @@ templates used by the :class:`ModelAdmin` views: This uses the ``HttpRequest`` instance to filter the ``Car`` foreign key field to only display the cars owned by the ``User`` instance. + For more complex filters, you can use ``ModelForm.__init__()`` method to + filter based on an ``instance`` of your model (see + :ref:`fields-which-handle-relationships`). For example:: + + class CountryAdminForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["capital"].queryset = self.instance.cities.all() + + + class CountryAdmin(admin.ModelAdmin): + form = CountryAdminForm + .. method:: ModelAdmin.formfield_for_manytomany(db_field, request, **kwargs) Like the ``formfield_for_foreignkey`` method, the @@ -1838,15 +1816,15 @@ templates used by the :class:`ModelAdmin` views: class MyModelAdmin(admin.ModelAdmin): def formfield_for_choice_field(self, db_field, request, **kwargs): if db_field.name == "status": - kwargs['choices'] = ( - ('accepted', 'Accepted'), - ('denied', 'Denied'), - ) + kwargs["choices"] = [ + ("accepted", "Accepted"), + ("denied", "Denied"), + ] if request.user.is_superuser: - kwargs['choices'] += (('ready', 'Ready for deployment'),) + kwargs["choices"].append(("ready", "Ready for deployment")) return super().formfield_for_choice_field(db_field, request, **kwargs) - .. admonition:: Note + .. admonition:: ``choices`` limitations Any ``choices`` attribute set on the formfield will be limited to the form field only. If the corresponding field on the model has choices @@ -1868,14 +1846,16 @@ templates used by the :class:`ModelAdmin` views: from django import forms + class MyForm(forms.ModelForm): pass + class MyModelAdmin(admin.ModelAdmin): def get_changelist_form(self, request, **kwargs): return MyForm - .. admonition:: Note + .. admonition:: Omit the ``Meta.model`` attribute If you define the ``Meta.model`` attribute on a :class:`~django.forms.ModelForm`, you must also define the @@ -1893,15 +1873,17 @@ templates used by the :class:`ModelAdmin` views: from django.forms import BaseModelFormSet + class MyAdminFormSet(BaseModelFormSet): pass + class MyModelAdmin(admin.ModelAdmin): def get_changelist_formset(self, request, **kwargs): - kwargs['formset'] = MyAdminFormSet + kwargs["formset"] = MyAdminFormSet return super().get_changelist_formset(request, **kwargs) -.. method:: ModelAdmin.lookup_allowed(lookup, value) +.. method:: ModelAdmin.lookup_allowed(lookup, value, request) The objects in the changelist page can be filtered with lookups from the URL's query string. This is how :attr:`list_filter` works, for example. The @@ -1911,10 +1893,11 @@ templates used by the :class:`ModelAdmin` views: unauthorized data exposure. The ``lookup_allowed()`` method is given a lookup path from the query string - (e.g. ``'user__email'``) and the corresponding value - (e.g. ``'user@example.com'``), and returns a boolean indicating whether - filtering the changelist's ``QuerySet`` using the parameters is permitted. - If ``lookup_allowed()`` returns ``False``, ``DisallowedModelAdminLookup`` + (e.g. ``'user__email'``), the corresponding value + (e.g. ``'user@example.com'``), and the request, and returns a boolean + indicating whether filtering the changelist's ``QuerySet`` using the + parameters is permitted. If ``lookup_allowed()`` returns ``False``, + ``DisallowedModelAdminLookup`` (subclass of :exc:`~django.core.exceptions.SuspiciousOperation`) is raised. By default, ``lookup_allowed()`` allows access to a model's local fields, @@ -2036,6 +2019,20 @@ templates used by the :class:`ModelAdmin` views: ``obj_id`` is the serialized identifier used to retrieve the object to be deleted. +.. method:: ModelAdmin.get_formset_kwargs(request, obj, inline, prefix) + + A hook for customizing the keyword arguments passed to the constructor of a + formset. For example, to pass ``request`` to formset forms:: + + class MyModelAdmin(admin.ModelAdmin): + def get_formset_kwargs(self, request, obj, inline, prefix): + return { + **super().get_formset_kwargs(request, obj, inline, prefix), + "form_kwargs": {"request": request}, + } + + You can also use it to set ``initial`` for formset forms. + .. method:: ModelAdmin.get_changeform_initial_data(request) A hook for the initial data on admin change forms. By default, fields are @@ -2047,7 +2044,7 @@ templates used by the :class:`ModelAdmin` views: ``{'fieldname': 'fieldval'}``:: def get_changeform_initial_data(self, request): - return {'name': 'custom_initial_value'} + return {"name": "custom_initial_value"} .. method:: ModelAdmin.get_deleted_objects(objs, request) @@ -2115,19 +2112,21 @@ example, the change view is overridden so that the rendered template is provided some extra mapping data that would not otherwise be available:: class MyModelAdmin(admin.ModelAdmin): - # A template for a very customized change view: - change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html' + change_form_template = "admin/myapp/extras/openstreetmap_change_form.html" def get_osm_info(self): # ... pass - def change_view(self, request, object_id, form_url='', extra_context=None): + def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} - extra_context['osm_data'] = self.get_osm_info() + extra_context["osm_data"] = self.get_osm_info() return super().change_view( - request, object_id, form_url, extra_context=extra_context, + request, + object_id, + form_url, + extra_context=extra_context, ) These views return :class:`~django.template.response.TemplateResponse` @@ -2147,9 +2146,9 @@ on your ``ModelAdmin``:: class ArticleAdmin(admin.ModelAdmin): class Media: css = { - "all": ("my_styles.css",) + "all": ["my_styles.css"], } - js = ("my_code.js",) + js = ["my_code.js"] The :doc:`staticfiles app ` prepends :setting:`STATIC_URL` (or :setting:`MEDIA_URL` if :setting:`STATIC_URL` is @@ -2164,13 +2163,12 @@ jQuery Django admin JavaScript makes use of the `jQuery`_ library. To avoid conflicts with user-supplied scripts or libraries, Django's jQuery -(version 3.5.1) is namespaced as ``django.jQuery``. If you want to use jQuery +(version 3.7.1) is namespaced as ``django.jQuery``. If you want to use jQuery in your own admin JavaScript without including a second copy, you can use the -``django.jQuery`` object on changelist and add/edit views. - -.. versionchanged:: 3.1 - - jQuery was upgraded from 3.4.1 to 3.5.1. +``django.jQuery`` object on changelist and add/edit views. Also, your own admin +forms or widgets depending on ``django.jQuery`` must specify +``js=['admin/js/jquery.init.js', …]`` when :ref:`declaring form media assets +`. The :class:`ModelAdmin` class requires jQuery by default, so there is no need to add jQuery to your ``ModelAdmin``’s list of media resources unless you have @@ -2196,7 +2194,7 @@ Adding custom validation to the admin You can also add custom validation of data in the admin. The automatic admin interface reuses :mod:`django.forms`, and the ``ModelAdmin`` class gives you -the ability define your own form:: +the ability to define your own form:: class ArticleAdmin(admin.ModelAdmin): form = MyArticleAdminForm @@ -2230,26 +2228,34 @@ information. from django.db import models + class Author(models.Model): - name = models.CharField(max_length=100) + name = models.CharField(max_length=100) + class Book(models.Model): - author = models.ForeignKey(Author, on_delete=models.CASCADE) - title = models.CharField(max_length=100) + author = models.ForeignKey(Author, on_delete=models.CASCADE) + title = models.CharField(max_length=100) You can edit the books authored by an author on the author page. You add inlines to a model by specifying them in a ``ModelAdmin.inlines``:: from django.contrib import admin + from myapp.models import Author, Book + class BookInline(admin.TabularInline): model = Book + class AuthorAdmin(admin.ModelAdmin): inlines = [ BookInline, ] + + admin.site.register(Author, AuthorAdmin) + Django provides two subclasses of ``InlineModelAdmin`` and they are: * :class:`~django.contrib.admin.TabularInline` @@ -2319,8 +2325,7 @@ The ``InlineModelAdmin`` class adds or customizes: A list or tuple containing extra CSS classes to apply to the fieldset that is rendered for the inlines. Defaults to ``None``. As with classes configured in :attr:`~ModelAdmin.fieldsets`, inlines with a ``collapse`` - class will be initially collapsed and their header will have a small "show" - link. + class will be initially collapsed using an expandable widget. .. attribute:: InlineModelAdmin.extra @@ -2368,7 +2373,7 @@ The ``InlineModelAdmin`` class adds or customizes: class BookInline(admin.TabularInline): model = Book - raw_id_fields = ("pages",) + raw_id_fields = ["pages"] .. attribute:: InlineModelAdmin.template @@ -2377,13 +2382,15 @@ The ``InlineModelAdmin`` class adds or customizes: .. attribute:: InlineModelAdmin.verbose_name - An override to the ``verbose_name`` found in the model's inner ``Meta`` - class. + An override to the :attr:`~django.db.models.Options.verbose_name` from the + model's inner ``Meta`` class. .. attribute:: InlineModelAdmin.verbose_name_plural - An override to the ``verbose_name_plural`` found in the model's inner - ``Meta`` class. + An override to the :attr:`~django.db.models.Options.verbose_name_plural` + from the model's inner ``Meta`` class. If this isn't given and the + :attr:`.InlineModelAdmin.verbose_name` is defined, Django will use + :attr:`.InlineModelAdmin.verbose_name` + ``'s'``. .. attribute:: InlineModelAdmin.can_delete @@ -2475,26 +2482,40 @@ Take this model for instance:: from django.db import models + + class Person(models.Model): + name = models.CharField(max_length=128) + + class Friendship(models.Model): - to_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="friends") - from_person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="from_friends") + to_person = models.ForeignKey( + Person, on_delete=models.CASCADE, related_name="friends" + ) + from_person = models.ForeignKey( + Person, on_delete=models.CASCADE, related_name="from_friends" + ) If you wanted to display an inline on the ``Person`` admin add/change pages you need to explicitly define the foreign key since it is unable to do so automatically:: from django.contrib import admin - from myapp.models import Friendship + from myapp.models import Friendship, Person + class FriendshipInline(admin.TabularInline): model = Friendship fk_name = "to_person" + class PersonAdmin(admin.ModelAdmin): inlines = [ FriendshipInline, ] + + admin.site.register(Person, PersonAdmin) + Working with many-to-many models -------------------------------- @@ -2503,38 +2524,41 @@ on whichever model contains the actual reference to the :class:`~django.db.models.ManyToManyField`. Depending on your ``ModelAdmin`` definition, each many-to-many field in your model will be represented by a standard HTML `` +
    Sender:
    +
    Cc myself:
    If ``auto_id`` is set to ``True``, then the form output *will* include ``