diff --git a/.github/workflows/api.yml b/.github/workflows/api.yml index d57fa92b9f45..e2dad9756291 100644 --- a/.github/workflows/api.yml +++ b/.github/workflows/api.yml @@ -56,7 +56,7 @@ jobs: - name: Generate OpenAPI run: | echo "::add-matcher::.github/matchers/spectacular.json" - ./manage.py spectacular > weblate-openapi.yaml + ./manage.py spectacular --urlconf="weblate.api.urls" > weblate-openapi.yaml echo "::remove-matcher owner=spectacular::" - name: openapi-lint run: npx @redocly/cli lint --format github-actions weblate-openapi.yaml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5e8eea9ac12a..727227921cf7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -40,7 +40,7 @@ jobs: echo "::add-matcher::.github/matchers/sphinx.json" ./ci/run-docs echo "::remove-matcher owner=sphinx::" - - uses: actions/upload-artifact@v4.4.0 + - uses: actions/upload-artifact@v4.4.3 with: name: Documentation path: docs/_build/html diff --git a/.github/workflows/linkcheck.yml b/.github/workflows/linkcheck.yml index 69bf24e9c8ab..16097638af8b 100644 --- a/.github/workflows/linkcheck.yml +++ b/.github/workflows/linkcheck.yml @@ -51,7 +51,7 @@ jobs: sed 's@^@docs/@' docs/_build/linkcheck/output.txt echo "::remove-matcher owner=sphinx::" echo "::remove-matcher owner=sphinx-warn::" - - uses: actions/upload-artifact@v4.4.0 + - uses: actions/upload-artifact@v4.4.3 if: always() with: name: Linkcheck report diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 774f91b44250..42bddb174210 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -36,12 +36,9 @@ jobs: brew unlink python@3.12 rm -f /usr/local/bin/{2to3,idle3,pydoc3,python3,python3-config} brew link --overwrite python@3.12 - - name: Fix OpenSSL - # Pulls fix from https://github.com/Homebrew/homebrew-core/pull/169721 - run: brew reinstall openssl@3 - name: Install brew dependencies run: | - brew install python pango cairo gobject-introspection glib libyaml pkg-config zstd xxhash libxmlsec1 + brew install pango cairo gobject-introspection glib libyaml pkg-config zstd xxhash libxmlsec1 - name: Install Weblate run: | python3 -m venv .venv diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index 36bcb44ad187..39fa1c408f8a 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -34,14 +34,11 @@ jobs: env: ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} run: | + touch changed-files.txt for file in ${ALL_CHANGED_FILES}; do echo "$file" >> changed-files.txt done - if [ ! -f changed-files.txt ] ; then - echo "No changed files!" - else - cat changed-files.txt - fi + cat changed-files.txt - name: Install apt dependencies run: sudo ./ci/apt-install @@ -66,7 +63,9 @@ jobs: run: | echo "::add-matcher::.github/matchers/mypy.json" if [ -f changed-files.txt ] ; then - grep -F -f changed-files.txt mypy.log + if grep --silent --fixed-strings --file=changed-files.txt mypy.log ; then + grep --fixed-strings --file=changed-files.txt mypy.log + fi else cat mypy.log fi diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index f3deb81ea9ec..b2a096cd74d2 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -53,7 +53,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload artifact - uses: actions/upload-artifact@v4.4.0 + uses: actions/upload-artifact@v4.4.3 with: name: SARIF file path: results.sarif @@ -61,6 +61,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@v3.26.11 + uses: github/codeql-action/upload-sarif@v3.26.12 with: sarif_file: results.sarif diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b3a97a2ea972..6b6e0d6bdd11 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: args: [--no-sort-keys, --autofix, --no-ensure-ascii] exclude: ^weblate/trans/fixtures/simple-project.json|weblate/trans/tests/data/.*.json$ - repo: https://github.com/adamchainz/django-upgrade - rev: 1.21.0 + rev: 1.22.1 hooks: - id: django-upgrade args: [--target-version, '5.0'] @@ -33,7 +33,7 @@ repos: args: [--fix, --exit-non-zero-on-fix] - id: ruff-format - repo: https://github.com/asottile/blacken-docs - rev: 1.18.0 + rev: 1.19.0 hooks: - id: blacken-docs - repo: meta @@ -66,9 +66,9 @@ repos: - id: stylelint args: [--formatter=compact] additional_dependencies: - - stylelint@16.9.0 + - stylelint@16.10.0 - repo: https://github.com/fsfe/reuse-tool - rev: v3.0.2 + rev: v4.0.3 hooks: - id: reuse - repo: https://github.com/shellcheck-py/shellcheck-py diff --git a/ci/docker-compose-mariadb.yml b/ci/docker-compose-mariadb.yml index ff0a2afff712..fe1de5c3d695 100644 --- a/ci/docker-compose-mariadb.yml +++ b/ci/docker-compose-mariadb.yml @@ -10,7 +10,7 @@ services: environment: MYSQL_ROOT_PASSWORD: weblate cache: - image: redis:7.4.0-alpine + image: redis:7.4.1-alpine restart: always ports: - 60001:6379 diff --git a/ci/docker-compose-mysql.yml b/ci/docker-compose-mysql.yml index 77ac1839ae57..ebea12135aca 100644 --- a/ci/docker-compose-mysql.yml +++ b/ci/docker-compose-mysql.yml @@ -10,7 +10,7 @@ services: environment: MYSQL_ROOT_PASSWORD: weblate cache: - image: redis:7.4.0-alpine + image: redis:7.4.1-alpine restart: always ports: - 60001:6379 diff --git a/ci/docker-compose-postgresql.yml b/ci/docker-compose-postgresql.yml index b23f1b14cf29..6d54375b37a0 100644 --- a/ci/docker-compose-postgresql.yml +++ b/ci/docker-compose-postgresql.yml @@ -13,7 +13,7 @@ services: POSTGRES_USER: postgres POSTGRES_PASSWORD: weblate cache: - image: redis:7.4.0-alpine + image: redis:7.4.1-alpine restart: always ports: - 60001:6379 diff --git a/client/package.json b/client/package.json index 2a5372fb1c28..6317e82f9bea 100644 --- a/client/package.json +++ b/client/package.json @@ -7,8 +7,9 @@ "build": "webpack" }, "dependencies": { - "@sentry/browser": "8.33.1", - "jquery": "3.7.1" + "@sentry/browser": "8.34.0", + "jquery": "3.7.1", + "tributejs": "5.1.3" }, "devDependencies": { "terser-webpack-plugin": "5.3.10", diff --git a/client/src/tribute.js b/client/src/tribute.js new file mode 100644 index 000000000000..7a7b60e2e3d9 --- /dev/null +++ b/client/src/tribute.js @@ -0,0 +1,7 @@ +// Copyright © Michal Čihař +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import Tribute from "tributejs"; + +window.Tribute = Tribute; diff --git a/client/webpack.config.js b/client/webpack.config.js index b9e037242376..7d33cc5015db 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -33,18 +33,25 @@ SPDX-License-Identifier: ${licenses} `; } // REUSE-IgnoreEnd - function mainLicenseTransform(packages) { - return genericTransform(packages, (pkg) => !pkg.name.startsWith("@sentry")); + const excludePrefixes = ["@sentry", "tributejs"]; + return genericTransform( + packages, + (pkg) => !excludePrefixes.some((prefix) => pkg.name.startsWith(prefix)), + ); } function sentryLicenseTransform(packages) { return genericTransform(packages, (pkg) => pkg.name.startsWith("@sentry")); } +function tributeLicenseTransform(packages) { + return genericTransform(packages, (pkg) => pkg.name.startsWith("tributejs")); +} module.exports = { entry: { main: "./src/main.js", sentry: "./src/sentry.js", + tribute: "./src/tribute.js", }, mode: "production", optimization: { @@ -65,6 +72,7 @@ module.exports = { additionalFiles: { "main.js.license": mainLicenseTransform, "sentry.js.license": sentryLicenseTransform, + "tribute.js.license": tributeLicenseTransform, }, }), ], diff --git a/client/yarn.lock b/client/yarn.lock index 21dc6ec5d060..4f6a8322ed25 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -47,76 +47,76 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@sentry-internal/browser-utils@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.33.1.tgz#5364532dc4d4a87698b191910a7f1c7d5361da52" - integrity sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA== - dependencies: - "@sentry/core" "8.33.1" - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry-internal/feedback@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.33.1.tgz#883a258b432e6dc8cf733c9a4c23cd2a8d430d23" - integrity sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA== - dependencies: - "@sentry/core" "8.33.1" - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry-internal/replay-canvas@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.33.1.tgz#02758ad1514ddd32c6169f10ca3676d04c91eee7" - integrity sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ== - dependencies: - "@sentry-internal/replay" "8.33.1" - "@sentry/core" "8.33.1" - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry-internal/replay@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.33.1.tgz#51910b702d25b99fd152cddd8c0d2e1ca8017ea8" - integrity sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog== - dependencies: - "@sentry-internal/browser-utils" "8.33.1" - "@sentry/core" "8.33.1" - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry/browser@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.33.1.tgz#3c4300fc58da905b5b611e70b02dbdb45d7c3a2b" - integrity sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w== - dependencies: - "@sentry-internal/browser-utils" "8.33.1" - "@sentry-internal/feedback" "8.33.1" - "@sentry-internal/replay" "8.33.1" - "@sentry-internal/replay-canvas" "8.33.1" - "@sentry/core" "8.33.1" - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry/core@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.33.1.tgz#dc59f73b93e6f78f15c897ac47e48008680d9c04" - integrity sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug== - dependencies: - "@sentry/types" "8.33.1" - "@sentry/utils" "8.33.1" - -"@sentry/types@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.33.1.tgz#3c519f974c3c3f3ea8b4e6f930b676f954c26f87" - integrity sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA== - -"@sentry/utils@8.33.1": - version "8.33.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.33.1.tgz#8cfc56b7dbc27135028e77aa5d553b15f4ba0466" - integrity sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg== - dependencies: - "@sentry/types" "8.33.1" +"@sentry-internal/browser-utils@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.34.0.tgz#36a50d503ad4ad51fce22e80670f8fd6fd195a27" + integrity sha512-4AcYOzPzD1tL5eSRQ/GpKv5enquZf4dMVUez99/Bh3va8qiJrNP55AcM7UzZ7WZLTqKygIYruJTU5Zu2SpEAPQ== + dependencies: + "@sentry/core" "8.34.0" + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry-internal/feedback@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.34.0.tgz#ff0db65c36f13665db99e3e22f2032bfdda98731" + integrity sha512-aYSM2KPUs0FLPxxbJCFSwCYG70VMzlT04xepD1Y/tTlPPOja/02tSv2tyOdZbv8Uw7xslZs3/8Lhj74oYcTBxw== + dependencies: + "@sentry/core" "8.34.0" + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry-internal/replay-canvas@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.34.0.tgz#10acadaef74e982dee2b9842a3eb6fec73f032ed" + integrity sha512-x8KhZcCDpbKHqFOykYXiamX6x0LRxv6N1OJHoH+XCrMtiDBZr4Yo30d/MaS6rjmKGMtSRij30v+Uq+YWIgxUrg== + dependencies: + "@sentry-internal/replay" "8.34.0" + "@sentry/core" "8.34.0" + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry-internal/replay@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.34.0.tgz#b730919a174cc5ae8a77f79fb24a5ffb18e44db5" + integrity sha512-EoMh9NYljNewZK1quY23YILgtNdGgrkzJ9TPsj6jXUG0LZ0Q7N7eFWd0xOEDBvFxrmI3cSXF1i4d1sBb+eyKRw== + dependencies: + "@sentry-internal/browser-utils" "8.34.0" + "@sentry/core" "8.34.0" + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry/browser@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.34.0.tgz#d2dfc2dbbfa9132d5c3e951f0a4b467805bc4c75" + integrity sha512-3HHG2NXxzHq1lVmDy2uRjYjGNf9NsJsTPlOC70vbQdOb+S49EdH/XMPy+J3ruIoyv6Cu0LwvA6bMOM6rHZOgNQ== + dependencies: + "@sentry-internal/browser-utils" "8.34.0" + "@sentry-internal/feedback" "8.34.0" + "@sentry-internal/replay" "8.34.0" + "@sentry-internal/replay-canvas" "8.34.0" + "@sentry/core" "8.34.0" + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry/core@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.34.0.tgz#92efe1cc8ced843beee636c344e66086d8915563" + integrity sha512-adrXCTK/zsg5pJ67lgtZqdqHvyx6etMjQW3P82NgWdj83c8fb+zH+K79Z47pD4zQjX0ou2Ws5nwwi4wJbz4bfA== + dependencies: + "@sentry/types" "8.34.0" + "@sentry/utils" "8.34.0" + +"@sentry/types@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.34.0.tgz#b02da72d1be67df5246aa9a97ca661ee71569372" + integrity sha512-zLRc60CzohGCo6zNsNeQ9JF3SiEeRE4aDCP9fDDdIVCOKovS+mn1rtSip0qd0Vp2fidOu0+2yY0ALCz1A3PJSQ== + +"@sentry/utils@8.34.0": + version "8.34.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.34.0.tgz#5ba543381a9de0ada1196df1fc5cde3b891de41e" + integrity sha512-W1KoRlFUjprlh3t86DZPFxLfM6mzjRzshVfMY7vRlJFymBelJsnJ3A1lPeBZM9nCraOSiw6GtOWu6k5BAkiGIg== + dependencies: + "@sentry/types" "8.34.0" "@types/estree@^1.0.5": version "1.0.5" @@ -819,6 +819,11 @@ terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" +tributejs@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/tributejs/-/tributejs-5.1.3.tgz#980600fc72865be5868893078b4bfde721129eae" + integrity sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" diff --git a/docs/admin/machine.rst b/docs/admin/machine.rst index 28c1428ac1a1..a70ad487a472 100644 --- a/docs/admin/machine.rst +++ b/docs/admin/machine.rst @@ -87,12 +87,14 @@ Amazon Translate Amazon Translate is a neural machine translation service for translating text to and from English across a breadth of supported languages. +The service requires the `TranslateFullAccess` Managed Policy. The service automatically uses :ref:`glossary`, see :ref:`glossary-mt`. .. seealso:: - `Amazon Translate Documentation `_ + `Amazon Translate Documentation `_, + `AWS TranslateFullAccess Policy `_ .. _mt-baidu: diff --git a/docs/changes.rst b/docs/changes.rst index 68b057617aa9..da54110b42f0 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -19,9 +19,12 @@ Not yet released. * :ref:`autofix` for Devanagari danda now better handles latin script. * :ref:`autofix` for French and Breton now uses a non-breaking space before colons instead of a narrow one. * :ref:`api` now has a preview OpenAPI specification. +* Stale, empty glossaries are now automatically removed. * :kbd:`?` now displays available :ref:`keyboard`. * Translation and language view in the project now include basic information about the language and plurals. * :ref:`bulk-edit` shows a preview of matched strings. +* :ref:`aresource` now supports translatable attribute in its strings. +* Creating component via file upload (Translate document) now supports bilingual files. **Bug fixes** @@ -31,6 +34,7 @@ Not yet released. **Compatibility** * Weblate now requires Python 3.11 or newer. +* :ref:`mt-aws` now requires the `TranslateFullAccess` permission **Upgrading** diff --git a/docs/contributing/frontend.rst b/docs/contributing/frontend.rst index 622f41719c87..d89da6439283 100644 --- a/docs/contributing/frontend.rst +++ b/docs/contributing/frontend.rst @@ -52,9 +52,12 @@ Then, there are two ways to import the library: 2. If it is page-specific library (library is used in a specific page or template): - Create a new file named ``src/.js``. - - Import the library in it. + - Import the library in it. Then inject it into the ``window`` object to be globally accessible. - Add an entry in ``webpack.config.js``: ``: "src/.js"``. + - Add library name in ``excludePrefixes`` array in ``mainLicenseTransform`` in ``webpack.config.js``. + - Add license file name in ``additionalFiles`` in ``LicensePlugin`` in ``plugins`` array in ``webpack.config.js``. + - Create a ``LicenseTransfrom`` function for the license file introduced in the previous steps and use it. Note: Replace ```` with the actual name of the 3rd party library. diff --git a/docs/locales/cy/LC_MESSAGES/docs.po b/docs/locales/cy/LC_MESSAGES/docs.po index 520f2d8d983e..321ac05161df 100644 --- a/docs/locales/cy/LC_MESSAGES/docs.po +++ b/docs/locales/cy/LC_MESSAGES/docs.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-21 02:46+0000\n" -"Last-Translator: Fill read-only add-on \n" +"PO-Revision-Date: 2024-10-09 18:52+0000\n" +"Last-Translator: Rhoslyn Prys \n" "Language-Team: Welsh \n" "Language: cy\n" @@ -973,10 +973,8 @@ msgid "" msgstr "Diweddaru'r ystorfa fewnol" #: ../../admin/access.rst:493 -#, fuzzy -#| msgid "Add glossary entry" msgid "Add glossary terminology" -msgstr "Ychwanegu cofnod geirfa" +msgstr "Ychwanegu geirfa derminoleg" #: ../../admin/access.rst:495 msgid "Edit glossary entry" @@ -3417,7 +3415,7 @@ msgstr "``case_sensitive``" #: ../../admin/addons.rst:793 msgid "Enable case-sensitive key sorting" -msgstr "" +msgstr "Galluogi didoli allwedd sy'n sensitif i faint" #: ../../admin/addons.rst:797 msgid "Formats and sorts the Java properties file." @@ -4775,16 +4773,16 @@ msgid "" msgstr "" #: ../../admin/auth.rst:783 -#, fuzzy -#| msgid "Authentication" msgid "Two-factor authentication" -msgstr "Dilysu" +msgstr "Dilysu dau ffactor" #: ../../admin/auth.rst:789 msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Mae dilysu dau ffactor yn ychwanegu haen arall o ddiogelwch i'ch cyfrif trwy " +"ofyn am fwy na chyfrinair yn unig i fewngofnodi." #: ../../admin/auth.rst:791 msgid "Weblate supports the following second factors:" @@ -4792,7 +4790,7 @@ msgstr "" #: ../../admin/auth.rst:793 msgid "Security keys (WebAuthn)" -msgstr "" +msgstr "Allweddi diogelwch (WebAuthn)" #: ../../admin/auth.rst:794 #, fuzzy @@ -4828,13 +4826,15 @@ msgstr "" #: ../../admin/auth.rst:806 msgid "Recovery codes" -msgstr "" +msgstr "Codau adfer" #: ../../admin/auth.rst:807 msgid "" "Recovery codes can be used to access your account if you lose access to your " "device and cannot receive two-factor authentication codes." msgstr "" +"Gellir defnyddio codau adfer i gael mynediad i'ch cyfrif os byddwch yn colli " +"mynediad i'ch dyfais ac yn methu â derbyn codau dilysu dau ffactor." #: ../../admin/auth.rst:809 msgid "" @@ -15550,16 +15550,10 @@ msgid "Translation context" msgstr "" #: ../../admin/machine.rst:148 -#, fuzzy -#| msgid "" -#| "Describe the persona of translator to improve the accuracy of the " -#| "translation. For example: “You are a squirrel breeder.”" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." -msgstr "" -"Disgrifiwch bersona'r cyfieithydd i wella cywirdeb y cyfieithiad. Er " -"enghraifft: “Rydych chi'n fridiwr gwiwerod.”" +msgstr "Disgrifiwch gyd-destun y cyfieithiad i wella cywirdeb y cyfieithiad." #: ../../admin/machine.rst:151 msgid "" @@ -16042,6 +16036,7 @@ msgstr "" msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." msgstr "" +"URL diweddbwynt yr enghraifft, e.e: https://my-instance.openai.azure.com." #: ../../admin/machine.rst:403 msgid "``deployment``" @@ -16053,7 +16048,7 @@ msgstr "" #: ../../admin/machine.rst:403 msgid "The model's unique deployment name." -msgstr "" +msgstr "Enw defnydd unigryw'r model." #: ../../admin/machine.rst:406 #, fuzzy @@ -16082,6 +16077,8 @@ msgstr "Cyd-destun" #: ../../admin/machine.rst:425 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Rhestr o IDau cof IDs:weight. wedi'u gwahanu gan goma, e.e: 1234:0.123,4567:0" +".456" #: ../../admin/machine.rst:432 msgid "`ModernMT API `_" @@ -16153,7 +16150,7 @@ msgstr "" #: ../../admin/machine.rst:491 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "URL sylfaenol yr API OpenAI, os yw'n wahanol i URL rhagosodedig OpenAI" #: ../../admin/machine.rst:493 msgid "``model``" @@ -16207,7 +16204,7 @@ msgstr "Cyfaddasu enw cydran" #: ../../admin/machine.rst:509 msgid "Only needed when model is set to 'Custom model'" -msgstr "" +msgstr "Dim ond ei angen pan fydd y model wedi'i osod i 'Model cyfaddas'" #: ../../admin/machine.rst:516 #, fuzzy @@ -18417,7 +18414,7 @@ msgstr "" #: ../../admin/projects.rst:206 msgid "Enforced two-factor authentication" -msgstr "" +msgstr "Dilysiad dau ffactor gorfodol" #: ../../admin/projects.rst:210 msgid "" diff --git a/docs/locales/fr/LC_MESSAGES/docs.po b/docs/locales/fr/LC_MESSAGES/docs.po index 2f5912755da6..70e78988e4de 100644 --- a/docs/locales/fr/LC_MESSAGES/docs.po +++ b/docs/locales/fr/LC_MESSAGES/docs.po @@ -21,7 +21,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-10-03 17:26+0000\n" +"PO-Revision-Date: 2024-10-07 22:13+0000\n" "Last-Translator: Christian Wia \n" "Language-Team: French \n" @@ -51303,7 +51303,6 @@ msgid "Subversion credentials" msgstr "Identifiants pour Subversion" #: ../../vcs.rst:547 -#, fuzzy msgid "" "Weblate expects you to have accepted the certificate up-front (and your " "credentials if needed). It will look to insert them into the :setting:" @@ -51311,7 +51310,7 @@ msgid "" "`$HOME` environment variable set to the :setting:`DATA_DIR`:" msgstr "" "Weblate suppose que vous avez accepté le certificat du serveur (et vos " -"données de connexion si nécessaire). Il va les insérer dans le répertoire " +"données de connexion si nécessaire). Il va les insérer dans le  répertoire " ":setting:`DATA_DIR`. Acceptez le certificat en utilisant `svn` une fois avec " "la variable d'environnement `HOME` initialisée avec :setting:`DATA_DIR`:" diff --git a/docs/locales/gl/LC_MESSAGES/docs.po b/docs/locales/gl/LC_MESSAGES/docs.po index 3b34122d07fb..856fa00f1ddd 100644 --- a/docs/locales/gl/LC_MESSAGES/docs.po +++ b/docs/locales/gl/LC_MESSAGES/docs.po @@ -3,12 +3,13 @@ # SPDX-License-Identifier: GPL-3.0-or-later # Fill read-only add-on , 2023, 2024. # "Miguel A. Bouzada" , 2024. +# Iker García Calviño <72529208+ikergcalvino@users.noreply.github.com>, 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-24 08:31+0000\n" +"PO-Revision-Date: 2024-10-10 14:44+0000\n" "Last-Translator: \"Miguel A. Bouzada\" \n" "Language-Team: Galician \n" @@ -163,6 +164,9 @@ msgid "" "Even `Private` project statistics are counted into the site-wide statistics " "and language summary. This does not reveal project names or any other info." msgstr "" +"Incluso as estatísticas dos proxectos `Privados` inclúense nas estatísticas " +"de todo o sitio e no resumo do idioma. Isto non revela os nomes dos " +"proxectos nin ningunha outra información." #: ../../admin/access.rst:78 msgid "" @@ -192,12 +196,18 @@ msgid "" "allows them to assign other users in `Public`, `Protected` and `Private` " "(but not `Custom`) projects via adding them to teams." msgstr "" +"Conceder aos usuarios a capacidade de :guilabel:`Xestionar o acceso ao " +"proxecto` (ver :ref:`privileges`) permítelles asignar a outros usuarios en " +"proxectos `Publicos`, `Protexidos` e `Privados` (mais non `Personalizados`) " +"a través de engadilos a equipos." #: ../../admin/access.rst:96 msgid "" "These are the default teams provided with Weblate; teams can be added or " "modified by users with sufficient privileges:" msgstr "" +"Estes son os equipos predeterminados fornecidos con Weblate; Os equipos " +"poden ser engadidos ou modificados por usuarios con privilexios abondo:" #: ../../admin/access.rst:99 msgid "Administration" @@ -16159,8 +16169,8 @@ msgid "" "Describe the persona of translator to improve the accuracy of the " "translation. For example: “You are a squirrel breeder.”" msgstr "" -"Describa a personalidade do tradutor para mellorar a precisión da tradución. " -"Por exemplo: «Vde. é un criador de esquíos.»" +"Describa a persona do tradutor para mellorar a precisión da tradución. Por " +"exemplo: «Vde. é un criador de esquíos.»" #: ../../admin/machine.rst:399 ../../admin/machine.rst:513 msgid "Translator style" @@ -23355,7 +23365,7 @@ msgstr "" #: ../../api.rst:2594 msgid "Metrics" -msgstr "" +msgstr "Métricas" #: ../../api.rst:2598 msgid "Returns server metrics." @@ -37926,6 +37936,9 @@ msgid "" "between whitespace (spaces, tabs, newlines). In the example string below, " "the word count is 9." msgstr "" +"Unha palabra é calquera secuencia de caracteres (letras, números, caracteres " +"especiais) entre espazos en branco (espazos, tabulacións, novas liñas). Na " +"cadea de exemplo de abaixo, o número de palabras é 9." #: ../../devel/reporting.rst:38 msgid "" diff --git a/docs/locales/id/LC_MESSAGES/docs.po b/docs/locales/id/LC_MESSAGES/docs.po index cf3214b99e25..2b135cb95b34 100644 --- a/docs/locales/id/LC_MESSAGES/docs.po +++ b/docs/locales/id/LC_MESSAGES/docs.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-21 02:46+0000\n" -"Last-Translator: Fill read-only add-on \n" +"PO-Revision-Date: 2024-10-09 00:14+0000\n" +"Last-Translator: Linerly \n" "Language-Team: Indonesian \n" "Language: id\n" @@ -16693,16 +16693,11 @@ msgid "Translation context" msgstr "" #: ../../admin/machine.rst:148 -#, fuzzy -#| msgid "" -#| "Describe the persona of translator to improve the accuracy of the " -#| "translation. For example: “You are a squirrel breeder.”" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." msgstr "" -"Deskripsikan persona penerjemah untuk meningkatkan akurasi terjemahan. " -"Misalnya: “Anda adalah peternak tupai.”" +"Deskripsikan konteks penerjemahan untuk meningkatkan akurasi terjemahan." #: ../../admin/machine.rst:151 msgid "" @@ -17188,7 +17183,7 @@ msgstr "URL titik akhir aplikasi" #: ../../admin/machine.rst:401 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." -msgstr "" +msgstr "URL titik akhir server, mis. https://server-aya.openai.azure.com." #: ../../admin/machine.rst:403 msgid "``deployment``" @@ -17203,7 +17198,7 @@ msgstr "URL titik akhir aplikasi" #: ../../admin/machine.rst:403 msgid "The model's unique deployment name." -msgstr "" +msgstr "Nama penyebaran unik model." #: ../../admin/machine.rst:406 #, fuzzy @@ -17232,6 +17227,7 @@ msgstr "Konteks" #: ../../admin/machine.rst:425 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Daftar berisi ID:berat memori terpisah oleh koma. Mis. 1234:0.123,4567:0.456" #: ../../admin/machine.rst:432 msgid "`ModernMT API `_" diff --git a/docs/locales/pt/LC_MESSAGES/docs.po b/docs/locales/pt/LC_MESSAGES/docs.po index 6c281063de5f..e24ae6dbaa0c 100644 --- a/docs/locales/pt/LC_MESSAGES/docs.po +++ b/docs/locales/pt/LC_MESSAGES/docs.po @@ -5,13 +5,14 @@ # ssantos , 2023, 2024. # Vinicius Caldas , 2024. # Manuela Silva , 2024. +# Alan Marques , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-10-06 23:37+0000\n" -"Last-Translator: ssantos \n" +"PO-Revision-Date: 2024-10-10 03:06+0000\n" +"Last-Translator: Alan Marques \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -18416,8 +18417,6 @@ msgstr "" "translator/reference/v3-0-reference#authenticating-with-an-access-token>`_" #: ../../admin/machine.rst:389 -#, fuzzy -#| msgid "Zen mode" msgid "Azure OpenAI" msgstr "Modo Zen" @@ -18479,10 +18478,8 @@ msgid "The model's unique deployment name." msgstr "O nome de implementação exclusivo do modelo." #: ../../admin/machine.rst:406 -#, fuzzy -#| msgid "Performs full update on translation unit." msgid "Performs translation using `OpenAI`_ hosted on Azure." -msgstr "Realiza a atualização completa da unidade de tradução." +msgstr "Executa tradução usando `OpenAI`_ hospedado no Azure." #: ../../admin/machine.rst:415 msgid "ModernMT" @@ -25008,17 +25005,15 @@ msgstr "Retorna etiquetas para um projeto." #: ../../api.rst:0 msgid ">json int id" -msgstr "" +msgstr ">json int id" #: ../../api.rst:1196 msgid "ID of the label" msgstr "ID da etiqueta" #: ../../api.rst:0 -#, fuzzy -#| msgid "string age" msgid ">json string name" -msgstr "idade do texto" +msgstr ">json string name" #: ../../api.rst:1197 ../../api.rst:1208 msgid "name of the label" @@ -25026,7 +25021,7 @@ msgstr "nome da etiqueta" #: ../../api.rst:0 msgid ">json string color" -msgstr "" +msgstr ">json string color" #: ../../api.rst:1198 ../../api.rst:1209 msgid "color of the label" @@ -25037,14 +25032,12 @@ msgid "Creates a label for a project." msgstr "Cria uma etiqueta para um projeto." #: ../../api.rst:0 -#, fuzzy -#| msgid "string age" msgid "json array results" -msgstr "" +msgstr ">json array results" #: ../../api.rst:2493 msgid "Associate component with a component list." @@ -26696,10 +26689,8 @@ msgid "type id" msgstr "tipo de id" #: ../../api.rst:0 -#, fuzzy -#| msgid "Project configuration" msgid ">json object configuration" -msgstr "Configuração de projeto" +msgstr ">json object configuração" #: ../../api.rst:2666 ../../api.rst:2676 msgid "Optional category configuration" @@ -27023,10 +27014,8 @@ msgid "`RSS on Wikipedia `_" msgstr "`RSS na Wikipédia `_" #: ../../changes.rst:2 -#, fuzzy -#| msgid "Weblate 4.5.3" msgid "Weblate 5.8" -msgstr "Weblate 4.5.3" +msgstr "Weblate 5.8" #: ../../changes.rst:4 msgid "Not yet released." @@ -27056,10 +27045,8 @@ msgstr "" "repositório, consulte :ref:`settings-credentials`." #: ../../changes.rst:10 -#, fuzzy -#| msgid "Configured automatic suggestion services" msgid ":ref:`mt-azure-openai` automatic suggestion service." -msgstr "Configurar serviços de sugestões automáticas" +msgstr ":ref:`mt-azure-openai` serviços de sugestões automáticas" #: ../../changes.rst:12 ../../changes.rst:41 ../../changes.rst:67 #: ../../changes.rst:105 ../../changes.rst:171 ../../changes.rst:196 @@ -27072,22 +27059,16 @@ msgid "**Improvements**" msgstr "**Aprimoramentos**" #: ../../changes.rst:14 -#, fuzzy -#| msgid ":ref:`mt-microsoft-terminology`" msgid ":ref:`mt-modernmt` supports :ref:`glossary-mt`." -msgstr ":ref:`mt-microsoft-terminology`" +msgstr ":ref:`mt-modernmt` suporta :ref:`glossary-mt`." #: ../../changes.rst:15 -#, fuzzy -#| msgid "Allow absolute links in source string locations." msgid ":ref:`mt-deepl` now supports specifying translation context." -msgstr "Permite ligações absolutos em locais de texto fonte." +msgstr ":ref:`mt-deepl` Agora suporte traduções de texto especificos." #: ../../changes.rst:16 -#, fuzzy -#| msgid ":ref:`mt-microsoft-terminology`" msgid ":ref:`mt-aws` now supports :ref:`glossary-mt`." -msgstr ":ref:`mt-microsoft-terminology`" +msgstr ":ref:`mt-aws` agora suporta :ref:`glossary-mt`." #: ../../changes.rst:17 msgid ":ref:`autofix` for Devanagari danda now better handles latin script." @@ -27235,6 +27216,10 @@ msgid "" "Chandler, Yaron Shahrabani, Michal Čihař, Miguel A. Bouzada, gallegonovato, " "Besnik Bleta, Sketch6580, Aindriú Mac Giolla Eoin, Fjuro, 大王叫我来巡山" msgstr "" +"Christian Wia, Ihor Hordiichuk, Hanaa MSB, Hoseok Seo, پرویز قادر, Reno Tx, " +"Jose Delvani, Artemka, Blueberry, Elisabeth Pieringer, VfBFan, ɴᴇᴋᴏ, Andi " +"Chandler, Yaron Shahrabani, Michal Čihař, Miguel A. Bouzada, gallegonovato, " +"Besnik Bleta, Sketch6580, Aindriú Mac Giolla Eoin, Fjuro, 大王叫我来巡山" #: ../../changes/contributors/5.7.1.rst:8 #: ../../changes/contributors/5.7.2.rst:8 ../../changes/contributors/5.7.rst:8 @@ -27420,7 +27405,7 @@ msgstr "Realça novas linhas no editor." #: ../../changes.rst:111 msgid ":doc:`/formats/csv` better handle files with two fields only." -msgstr "" +msgstr ":doc:`/formats/csv` lida melhor com arquivos com apenas dois campos." #: ../../changes.rst:112 msgid "Browse mode can now be navigated using keyboard, see :ref:`keyboard`." @@ -28779,13 +28764,15 @@ msgstr "Melhoradas as verificações de pontuação para Birmanês." #: ../../changes.rst:657 msgid "Engage page better shows stats." -msgstr "" +msgstr "A página envolvida mostra melhor as estatísticas." #: ../../changes.rst:658 msgid "" "Strings which can not be saved to a file no longer block other strings to be " "written." msgstr "" +"Strings que não podem ser salvas em um arquivo não bloqueiam mais a gravação " +"de outras strings." #: ../../changes.rst:659 #, fuzzy @@ -28830,7 +28817,7 @@ msgstr "Melhorado o tratamento de erros em import_project." #: ../../changes.rst:669 msgid ":ref:`autofix` gracefully handle strings from :ref:`multivalue-csv`." -msgstr "" +msgstr ":ref:`autofix` graciosamente lida com string de :ref:`multivalue-csv`." #: ../../changes.rst:670 #, fuzzy @@ -28860,7 +28847,7 @@ msgstr "" #: ../../changes.rst:677 msgid "Categories are now included ``weblate://`` repository URLs." -msgstr "" +msgstr "As categorias agora estão incluídas``weblate://`` repository URLs." #: ../../changes.rst:683 #, fuzzy @@ -28887,6 +28874,8 @@ msgid "" "Weblate now defaults to persistent database connections in :file:" "`settings_example.py` and Docker." msgstr "" +"O Weblate agora tem como padrão conexões de banco de dados persistentes em " +":file:`settings_example.py` e Docker." #: ../../changes.rst:687 #, fuzzy @@ -28926,7 +28915,7 @@ msgstr "Agora também mostra contagem de palavras." #: ../../changes.rst:701 msgid "Rendering of release notes on GitHub." -msgstr "" +msgstr "Renderização de notas de lançamento no GitHub." #: ../../changes.rst:702 #, fuzzy @@ -29006,7 +28995,7 @@ msgstr "A tradução está agora bloqueada para si." #: ../../changes.rst:728 msgid "Added object ``id`` to all :ref:`api` endpoints." -msgstr "" +msgstr "Adicionado objeto ``id`` a todos os endpoints :ref:`api`." #: ../../changes.rst:729 #, fuzzy @@ -29030,7 +29019,7 @@ msgstr "Criar componente" #: ../../changes.rst:735 msgid "Source strings and state display for converted formats." -msgstr "" +msgstr "Strings de origem e exibição de estado para formatos convertidos." #: ../../changes.rst:736 msgid "" @@ -29047,7 +29036,7 @@ msgstr "Exibição fixa de fonte plural para idiomas com forma plural única." #: ../../changes.rst:738 msgid "Performance issues while browsing some categories." -msgstr "" +msgstr "Problemas de desempenho ao navegar em algumas categorias." #: ../../changes.rst:739 #, fuzzy @@ -29071,7 +29060,7 @@ msgstr "A dependência `jellyfish` foi substituída por `rapidfuzz`." msgid "" "The default value of :setting:`IP_PROXY_OFFSET` has been changed from 1 to " "-1." -msgstr "" +msgstr "O valor padrão de :setting:`IP_PROXY_OFFSET` foi alterado de 1 para -1." #: ../../changes.rst:753 #, fuzzy @@ -29099,7 +29088,7 @@ msgstr "Lançado em 21 de agosto de 2021." #: ../../changes.rst:762 msgid ":doc:`/formats/markdown` support, thanks to Anders Kaplan." -msgstr "" +msgstr "Suporte :doc:`/formats/markdown`, um obrigado a Anders Kaplan." #: ../../changes.rst:763 #, fuzzy @@ -29111,6 +29100,8 @@ msgstr "Cria componentes de tradução no projeto dado." msgid "" ":doc:`/formats/fluent` now has better syntax checks thanks to Henry Wilkes." msgstr "" +":doc:`/formats/fluent` agora tem melhores verificações de sintaxe graças a " +"Henry Wilkes." #: ../../changes.rst:765 #, fuzzy @@ -29139,6 +29130,7 @@ msgstr "Tratamento de plurais na tradução automática." msgid "" ":ref:`check-same` check now honors placeholders even in the strict mode." msgstr "" +":ref:`check-same` agora verifica espaços reservados mesmo no modo estrito." #: ../../changes.rst:772 #, fuzzy @@ -29183,11 +29175,13 @@ msgstr "" #: ../../changes.rst:778 msgid "User API now includes last sign in date." -msgstr "" +msgstr "A API do usuário agora inclui a data do último login." #: ../../changes.rst:779 msgid "User API token is now hidden for privacy reasons by default." msgstr "" +"O token da API do usuário agora está oculto por motivos de privacidade por " +"padrão." #: ../../changes.rst:780 #, fuzzy @@ -29200,6 +29194,8 @@ msgid "" "Better preserve translation on source file change in :doc:`/formats/html` " "and :doc:`/formats/txt`." msgstr "" +"Preserva melhor a tradução na alteração do arquivo de origem em :doc:`/" +"formats/html` e :doc:`/formats/txt`." #: ../../changes.rst:782 #, fuzzy @@ -29210,16 +29206,20 @@ msgstr "Adicionada indicação visual de alertas de componentes na navegação." #: ../../changes.rst:783 msgid "Users now have to confirm invitations to become team members." msgstr "" +"Os usuários agora precisam confirmar os convites para se tornarem membros da " +"equipe." #: ../../changes.rst:784 msgid "" ":ref:`check-formats` can now check all plural forms with the ``strict-" "format`` flag." msgstr "" +":ref:`check-formats` agora pode verificar todas as formas plurais com a flag " +"``strict-format``." #: ../../changes.rst:785 msgid ":doc:`/user/checks` browsing experience." -msgstr "" +msgstr ":doc:`/user/checks` experiência de navegação." #: ../../changes.rst:786 #, fuzzy @@ -29229,11 +29229,11 @@ msgstr "Configurando sugestões automáticas" #: ../../changes.rst:787 msgid "Visual diff now better understands compositing characters." -msgstr "" +msgstr "A diferença visual agora entende melhor a composição dos personagens." #: ../../changes.rst:791 msgid "User names handling while committing to Git." -msgstr "" +msgstr "Manipulação de nomes de usuário durante o committing do Git." #: ../../changes.rst:792 #, fuzzy @@ -29295,7 +29295,7 @@ msgstr "" #: ../../changes.rst:807 msgid "Several previously optional dependencies are now required." -msgstr "" +msgstr "Várias dependências anteriormente opcionais são agora necessárias." #: ../../changes.rst:808 #, fuzzy @@ -33706,7 +33706,7 @@ msgstr "Corrigida a análise do local de ficheiros CSV." #: ../../changes/v4.rst:10 msgid "Fixed query parsing in navigation bar search." -msgstr "" +msgstr "Análise de consulta corrigida na pesquisa da barra de navegação." #: ../../changes/v4.rst:11 #, fuzzy @@ -33760,7 +33760,7 @@ msgstr "Melhorada a análise de código de idioma." #: ../../changes/v4.rst:23 msgid "Fixed CSS compression with dark theme." -msgstr "" +msgstr "Corrigido a compreensão do CSS com o tema escuro." #: ../../changes/v4.rst:25 #, fuzzy @@ -33812,7 +33812,7 @@ msgstr "Adicionado suporte para o formato Fluent." #: ../../changes/v4.rst:36 msgid "Avoiding signing-out user in some rate-limits." -msgstr "" +msgstr "Evitando desconectar o usuário em alguns limites de taxa." #: ../../changes/v4.rst:37 #, fuzzy @@ -33848,6 +33848,8 @@ msgid "" "Project stats exports to JSON/CSV now include more details; it now matches " "content available in the API." msgstr "" +"As exportações de estatísticas do projeto para JSON/CSV agora incluem mais " +"detalhes; agora corresponde ao conteúdo disponível na API." #: ../../changes/v4.rst:43 #, fuzzy @@ -33864,6 +33866,8 @@ msgstr "Configurando sugestões automáticas" #: ../../changes/v4.rst:45 msgid "Added dark theme; browser-following and manual setting are available." msgstr "" +"Adicionado tema escuro; acompanhamento do navegador e configuração manual " +"estão disponíveis." #: ../../changes/v4.rst:46 msgid "The Docker container can now be used with read-only root filesystem." diff --git a/docs/locales/pt_BR/LC_MESSAGES/docs.po b/docs/locales/pt_BR/LC_MESSAGES/docs.po index 141897c00eb6..02f5ed2cfc74 100644 --- a/docs/locales/pt_BR/LC_MESSAGES/docs.po +++ b/docs/locales/pt_BR/LC_MESSAGES/docs.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-10-04 23:48+0000\n" +"PO-Revision-Date: 2024-10-10 03:06+0000\n" "Last-Translator: Alan Marques \n" "Language-Team: Portuguese (Brazil) \n" @@ -27255,7 +27255,7 @@ msgstr "Atualização de traduções do repositório em componentes vinculados." #, fuzzy #| msgid "Improved look of notification e-mails." msgid "Improved rendering of digest notification e-mails." -msgstr "Visual melhorado de notificações de e-mails." +msgstr "Melhorado o formato de notificações de e-mails." #: ../../changes/contributors/5.7.1.rst:2 #: ../../changes/contributors/5.7.2.rst:2 ../../changes/contributors/5.7.rst:2 @@ -27326,9 +27326,9 @@ msgid "" "formats which need it to update non-translation content in the translated " "files." msgstr "" -":ref:`addon-weblate.cleanup.generic` agora é instalado automaticamente para " -"formatos que precisam dele para atualizar o conteúdo não traduzido nos " -"arquivos traduzidos." +":ref:`addon-weblate.cleanup.generic` agora, a instalação é realizada " +"automaticamente para os formatos que necessitam dela para atualizar " +"conteúdos não traduzidos nos arquivos que já foram traduzidos." #: ../../changes.rst:74 msgid "" @@ -28832,13 +28832,15 @@ msgstr "Melhoradas as verificações de pontuação para Birmanês." #: ../../changes.rst:657 msgid "Engage page better shows stats." -msgstr "" +msgstr "A página de engajamento exibe melhor as estatísticas." #: ../../changes.rst:658 msgid "" "Strings which can not be saved to a file no longer block other strings to be " "written." msgstr "" +"As strings que não podem ser salvas em um arquivo não bloqueiam mais outras " +"strings de serem escritas." #: ../../changes.rst:659 #, fuzzy @@ -28913,7 +28915,7 @@ msgstr "" #: ../../changes.rst:677 msgid "Categories are now included ``weblate://`` repository URLs." -msgstr "" +msgstr "As categorias agora estão incluídas nas URLs do repositório weblate://." #: ../../changes.rst:683 #, fuzzy @@ -28940,6 +28942,8 @@ msgid "" "Weblate now defaults to persistent database connections in :file:" "`settings_example.py` and Docker." msgstr "" +"O Weblate agora utiliza conexões de banco de dados persistentes por padrão " +"em :file:settings_example.py e Docker." #: ../../changes.rst:687 #, fuzzy @@ -28979,7 +28983,7 @@ msgstr "Agora mostra contagem de palavras também." #: ../../changes.rst:701 msgid "Rendering of release notes on GitHub." -msgstr "" +msgstr "Renderização das notas de lançamento no GitHub." #: ../../changes.rst:702 #, fuzzy @@ -29059,7 +29063,7 @@ msgstr "A tradução agora está bloqueada por você." #: ../../changes.rst:728 msgid "Added object ``id`` to all :ref:`api` endpoints." -msgstr "" +msgstr "Objeto id adicionado a todos os endpoints da :ref:api." #: ../../changes.rst:729 #, fuzzy @@ -29083,7 +29087,7 @@ msgstr "Criando componente dentro de uma categoria." #: ../../changes.rst:735 msgid "Source strings and state display for converted formats." -msgstr "" +msgstr "Strings de origem e exibição de estado para formatos convertidos." #: ../../changes.rst:736 msgid "" @@ -29100,7 +29104,7 @@ msgstr "Exibição fixa de fonte plural para idiomas com forma plural única." #: ../../changes.rst:738 msgid "Performance issues while browsing some categories." -msgstr "" +msgstr "Problemas de desempenho ao navegar por algumas categorias." #: ../../changes.rst:739 #, fuzzy @@ -29124,7 +29128,7 @@ msgstr "A dependência `jellyfish` foi substituída por `rapidfuzz`." msgid "" "The default value of :setting:`IP_PROXY_OFFSET` has been changed from 1 to " "-1." -msgstr "" +msgstr "O valor padrão de :setting:IP_PROXY_OFFSET foi alterado de 1 para -1." #: ../../changes.rst:753 #, fuzzy @@ -29236,11 +29240,13 @@ msgstr "" #: ../../changes.rst:778 msgid "User API now includes last sign in date." -msgstr "" +msgstr "A API de usuário agora inclui a data do último acesso." #: ../../changes.rst:779 msgid "User API token is now hidden for privacy reasons by default." msgstr "" +"O token da API do usuário agora está oculto por padrão por questões de " +"privacidade." #: ../../changes.rst:780 #, fuzzy @@ -29263,6 +29269,8 @@ msgstr "Adicionada indicação visual de alertas de componentes na navegação." #: ../../changes.rst:783 msgid "Users now have to confirm invitations to become team members." msgstr "" +"Os usuários agora precisam confirmar convites para se tornarem membros da " +"equipe." #: ../../changes.rst:784 msgid "" @@ -29282,11 +29290,11 @@ msgstr "Destaque as diferenças no texto fonte em sugestões automáticas." #: ../../changes.rst:787 msgid "Visual diff now better understands compositing characters." -msgstr "" +msgstr "O diff visual agora entende melhor os caracteres de composição." #: ../../changes.rst:791 msgid "User names handling while committing to Git." -msgstr "" +msgstr "Gerenciamento de nomes de usuário durante os commits no Git." #: ../../changes.rst:792 #, fuzzy @@ -29348,7 +29356,7 @@ msgstr "" #: ../../changes.rst:807 msgid "Several previously optional dependencies are now required." -msgstr "" +msgstr "Várias dependências que antes eram opcionais agora são obrigatórias." #: ../../changes.rst:808 #, fuzzy @@ -33746,7 +33754,7 @@ msgstr "Corrigida a análise do local de arquivos CSV." #: ../../changes/v4.rst:10 msgid "Fixed query parsing in navigation bar search." -msgstr "" +msgstr "Corrigida a análise de consultas na busca da barra de navegação." #: ../../changes/v4.rst:11 #, fuzzy @@ -33799,7 +33807,7 @@ msgstr "Melhorada a análise de código de idioma." #: ../../changes/v4.rst:23 msgid "Fixed CSS compression with dark theme." -msgstr "" +msgstr "Corrigida a compressão de CSS com o tema escuro." #: ../../changes/v4.rst:25 #, fuzzy @@ -33851,7 +33859,7 @@ msgstr "Adicionado suporte para o formato Fluent." #: ../../changes/v4.rst:36 msgid "Avoiding signing-out user in some rate-limits." -msgstr "" +msgstr "Evitar que o usuário seja desconectado em certos limites de taxa." #: ../../changes/v4.rst:37 #, fuzzy @@ -33887,6 +33895,8 @@ msgid "" "Project stats exports to JSON/CSV now include more details; it now matches " "content available in the API." msgstr "" +"As exportações de estatísticas do projeto para JSON/CSV agora incluem mais " +"detalhes; agora correspondem ao conteúdo disponível na API." #: ../../changes/v4.rst:43 #, fuzzy @@ -33903,10 +33913,14 @@ msgstr "Destaque a alteração sugerida nas sugestões automáticas." #: ../../changes/v4.rst:45 msgid "Added dark theme; browser-following and manual setting are available." msgstr "" +"Adicionado tema escuro; a configuração automática com base no navegador e a " +"configuração manual estão disponíveis." #: ../../changes/v4.rst:46 msgid "The Docker container can now be used with read-only root filesystem." msgstr "" +"O contêiner Docker agora pode ser utilizado com um sistema de arquivos raiz " +"somente leitura." #: ../../changes/v4.rst:47 #, fuzzy @@ -33943,6 +33957,7 @@ msgstr "" msgid "" "Dropped support for PostgreSQL 10, 11, MySQL 5.7 and MariaDB 10.2, 10.3." msgstr "" +"Removido o suporte para PostgreSQL 10, 11, MySQL 5.7 e MariaDB 10.2, 10.3." #: ../../changes/v4.rst:58 #, fuzzy @@ -33989,7 +34004,7 @@ msgstr "Permite mostrar o idioma secundário no modo Zen." #: ../../changes/v4.rst:69 msgid "Dropped deprecated command ``cleanup_celery``." -msgstr "" +msgstr "Removido o comando obsoleto ``cleanup_celery``." #: ../../changes/v4.rst:70 #, fuzzy @@ -34089,6 +34104,10 @@ msgid "" "`docker-postgres-upgrade` for upgrade instructions. Weblate itself supports " "older versions as well, when appropriate Django version is installed." msgstr "" +"O contêiner Docker agora requer PostgreSQL 12 ou mais recente; consulte :ref" +":docker-postgres-upgrade para obter instruções de atualização. O Weblate " +"também suporta versões mais antigas, desde que a versão apropriada do Django " +"esteja instalada." #: ../../changes/v4.rst:101 msgid "" @@ -34254,6 +34273,8 @@ msgstr "Weblate 4.1" #: ../../changes/v4.rst:155 msgid "Format string checks now also detects duplicated formats." msgstr "" +"As verificações de formato de string agora também detectam formatos " +"duplicados." #: ../../changes/v4.rst:156 #, fuzzy @@ -34263,7 +34284,7 @@ msgstr "Melhorado o desempenho para algumas traduções monolíngues." #: ../../changes/v4.rst:157 msgid "Celery beat is now storing the tasks schedule in the database." -msgstr "" +msgstr "O Celery beat agora armazena o cronograma de tarefas no banco de dados." #: ../../changes/v4.rst:158 #, fuzzy @@ -34379,6 +34400,7 @@ msgstr "Lançado em 9 de janeiro de 2020." msgid "" "Enabled gotext JSON and i18next v4 formats in the default configuration." msgstr "" +"Formatos gotext JSON e i18next v4 foram habilitados na configuração padrão." #: ../../changes/v4.rst:186 #, fuzzy @@ -38312,6 +38334,7 @@ msgstr "Gancho acionado antes que a nova unidade seja criada." #: weblate.addons.base.BaseAddon.user:1 msgid "Weblate user used to track changes by this add-on." msgstr "" +"Usuário do Weblate utilizado para rastrear alterações por este complemento." #: ../../contributing/addons.rst:15 #, fuzzy @@ -38339,11 +38362,11 @@ msgstr "Retorna estatísticas para um projeto." #: ../../contributing/addons.rst:33 msgid "ORM object for an unit." -msgstr "" +msgstr "Objeto ORM para uma unidade." #: ../../contributing/addons.rst:37 msgid "ORM object for an user." -msgstr "" +msgstr "Objeto ORM para um usuário." #: ../../contributing/addons.rst:41 #, fuzzy @@ -38408,6 +38431,8 @@ msgid "" "Git commits should follow `Conventional Commits `_ specification." msgstr "" +"Os commits do Git devem seguir a especificação de Conventional Commits " +"." #: ../../contributing/snippets/pre-commit.rst:2 msgid "Coding standard and linting the code" @@ -38469,7 +38494,7 @@ msgstr "" #: ../../contributing/communication.rst:2 msgid "Weblate Contributor Communication Guidelines" -msgstr "" +msgstr "Diretrizes de Comunicação para Contribuidores do Weblate" #: ../../contributing/communication.rst:5 #, fuzzy @@ -38818,30 +38843,33 @@ msgid "" msgstr "" #: ../../contributing/frontend.rst:26 +#, fuzzy msgid "Prerequisites" -msgstr "" +msgstr "Pré-requisitos" #: ../../contributing/frontend.rst:28 msgid "" "Before proceeding with an installation, make sure you have the following " "prerequisites:" msgstr "" +"Antes de prosseguir com a instalação, certifique-se de ter os seguintes " +"pré-requisitos:" #: ../../contributing/frontend.rst:30 msgid "``Nodejs`` version 14 or higher." -msgstr "" +msgstr "Versão 14 ou superior do Nodejs." #: ../../contributing/frontend.rst:31 msgid "The ``yarn`` package manager installed on your system." -msgstr "" +msgstr "O gerenciador de pacotes 'yarn' instalado no seu sistema." #: ../../contributing/frontend.rst:32 msgid "Run ``cd client``." -msgstr "" +msgstr "Execute ``cd client``." #: ../../contributing/frontend.rst:33 msgid "Run ``yarn install``" -msgstr "" +msgstr "Execute ``yarn install``" #: ../../contributing/frontend.rst:36 #, fuzzy @@ -38863,7 +38891,7 @@ msgstr "Importando para o Weblate" #: ../../contributing/frontend.rst:47 msgid "Then, there are two ways to import the library:" -msgstr "" +msgstr "Em seguida, existem duas maneiras de importar a biblioteca:" #: ../../contributing/frontend.rst:49 msgid "If it is a project-wide library (it is used/needed in all/most pages):" diff --git a/docs/locales/ru/LC_MESSAGES/docs.po b/docs/locales/ru/LC_MESSAGES/docs.po index afb7aefadd1b..f7716a7cdcc4 100644 --- a/docs/locales/ru/LC_MESSAGES/docs.po +++ b/docs/locales/ru/LC_MESSAGES/docs.po @@ -21,13 +21,14 @@ # Sagiri , 2024. # solokot , 2024. # Andrey , 2024. +# Victor K , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-10-03 17:26+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2024-10-12 04:29+0000\n" +"Last-Translator: Victor K \n" "Language-Team: Russian \n" "Language: ru\n" @@ -187,6 +188,9 @@ msgid "" "Even `Private` project statistics are counted into the site-wide statistics " "and language summary. This does not reveal project names or any other info." msgstr "" +"Даже статистика `приватных проектов` учитывается в общей статистике сайта и " +"сводке по языкам. При этом не раскрываются названия проектов и любая другая " +"информация." #: ../../admin/access.rst:78 #, fuzzy @@ -224,10 +228,13 @@ msgid "" msgstr "" #: ../../admin/access.rst:96 +#, fuzzy msgid "" "These are the default teams provided with Weblate; teams can be added or " "modified by users with sufficient privileges:" msgstr "" +"Это стандартные команды, предоставляемые Weblate; команды могут быть " +"добавлены или изменены пользователями с достаточными привилегиями." #: ../../admin/access.rst:99 msgid "Administration" @@ -5381,6 +5388,8 @@ msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Двухфакторная авторизация добавляет ещё один уровень безопасности вашей " +"учётной записи, требуя для входа больше, чем просто пароль." #: ../../admin/auth.rst:791 #, fuzzy @@ -19014,9 +19023,12 @@ msgid "Azure OpenAI endpoint URL" msgstr "Конечный URL приложения" #: ../../admin/machine.rst:401 +#, fuzzy msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." msgstr "" +"URL конечной точки экземпляра, например: https://my-instance.openai.azure." +"com." #: ../../admin/machine.rst:403 msgid "``deployment``" @@ -19030,8 +19042,9 @@ msgid "Azure OpenAI deployment" msgstr "Конечный URL приложения" #: ../../admin/machine.rst:403 +#, fuzzy msgid "The model's unique deployment name." -msgstr "" +msgstr "Уникальное имя развёртывания модели." #: ../../admin/machine.rst:406 #, fuzzy @@ -19056,8 +19069,11 @@ msgid "Context vector" msgstr "Вектор контекста" #: ../../admin/machine.rst:425 +#, fuzzy msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Разделённый запятыми список заметок Идентификатор:вес. Например: 1234:0." +"123,4567:0.456" #: ../../admin/machine.rst:432 msgid "`ModernMT API `_" @@ -19133,7 +19149,7 @@ msgstr "" #: ../../admin/machine.rst:491 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "Базовый URL API OpenAI, если он отличается от URL OpenAI по умолчанию" #: ../../admin/machine.rst:493 msgid "``model``" @@ -19184,8 +19200,11 @@ msgid "Custom model name" msgstr "Название настраиваемой модели" #: ../../admin/machine.rst:509 +#, fuzzy msgid "Only needed when model is set to 'Custom model'" msgstr "" +"Требуется только в том случае, если для модели установлено значение «" +"Пользовательская модель»" #: ../../admin/machine.rst:516 #, fuzzy @@ -53492,7 +53511,7 @@ msgid "" "to a certain group of translators." msgstr "" "Как проекты, так и компоненты внутри них могут быть видны всем или же только " -"определенной группе переводчиков." +"определённой группе переводчиков." #: ../../user/translating.rst:18 msgid ":ref:`access-control`, :ref:`workflows`" @@ -54048,7 +54067,7 @@ msgid "" "User configured :ref:`profile-specialchars` defined in the :ref:`user-" "profile`" msgstr "" -"Настроенные пользователем :ref:`profile-specialchars`, определенные через " +"Настроенные пользователем :ref:`profile-specialchars`, определённые через " ":ref:`профиль пользователя `" #: ../../user/translating.rst:277 diff --git a/docs/locales/sk/LC_MESSAGES/docs.po b/docs/locales/sk/LC_MESSAGES/docs.po index 743e5e7ff7b7..0261b604d9eb 100644 --- a/docs/locales/sk/LC_MESSAGES/docs.po +++ b/docs/locales/sk/LC_MESSAGES/docs.po @@ -3,13 +3,14 @@ # SPDX-License-Identifier: GPL-3.0-or-later # Peter Vančo , 2023, 2024. # Fill read-only add-on , 2023, 2024. +# Milan Šalka , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-21 02:47+0000\n" -"Last-Translator: Fill read-only add-on \n" +"PO-Revision-Date: 2024-10-11 17:52+0000\n" +"Last-Translator: Milan Šalka \n" "Language-Team: Slovak \n" "Language: sk\n" @@ -31,6 +32,10 @@ msgid "" "one or more groups of permissions to users for everything, or individual " "projects, components, glossaries, and so on." msgstr "" +"Weblate sa dodáva s jemným systémom oprávnení, ktorý umožňuje priradiť " +"používateľom oprávnenia pre celú inštanciu s preddefinovanými rolami alebo " +"priradením jednej alebo viacerých skupín oprávnení používateľom pre všetko " +"alebo pre jednotlivé projekty, komponenty, slovníky atď." #: ../../admin/access.rst:14 msgid "Project access control" @@ -42,16 +47,21 @@ msgid "" "guilabel:`Public`. You can switch to the paid plan if you want to restrict " "access to your project." msgstr "" +"Projekty s bezplatným plánom Libre na Hosted Weblate sú vždy " +":guilabel:`Public`. Ak chcete obmedziť prístup k svojmu projektu, môžete " +"prejsť na platený plán." #: ../../admin/access.rst:22 msgid "" "Limit user access to individual projects by selecting a different :ref:" "`project-access_control` setting. The available options are:" msgstr "" +"Obmedzte prístup používateľa k jednotlivým projektom výberom iného " +"nastavenia :ref:`project-access_control`. Dostupné možnosti sú:" #: ../../admin/access.rst:25 ../../admin/config.rst:489 msgid ":guilabel:`Public`" -msgstr "" +msgstr ":guilabel:`Public`" #: ../../admin/access.rst:26 ../../admin/access.rst:34 msgid "Visible to everybody." @@ -70,10 +80,12 @@ msgid "" "**Choose this for open-source projects, or when your Weblate instance is " "private or locked-down.**" msgstr "" +"**Túto možnosť vyberte pre projekty s otvoreným zdrojovým kódom alebo ak je " +"vaša inštancia Weblate súkromná alebo uzamknutá.**" #: ../../admin/access.rst:33 ../../admin/config.rst:491 msgid ":guilabel:`Protected`" -msgstr "" +msgstr ":guilabel:`Protected`" #: ../../admin/access.rst:36 ../../admin/access.rst:44 #: ../../admin/access.rst:52 @@ -90,10 +102,12 @@ msgid "" "**Choose this to gain visibility, but still have control over who can " "contribute.**" msgstr "" +"**Vyberte si túto možnosť, aby ste sa zviditeľnili, ale zároveň mali " +"kontrolu nad tým, kto môže prispievať.**" #: ../../admin/access.rst:41 ../../admin/config.rst:493 msgid ":guilabel:`Private`" -msgstr "" +msgstr ":guilabel:`Private`" #: ../../admin/access.rst:42 ../../admin/access.rst:50 msgid "Visible only to chosen users." @@ -103,26 +117,28 @@ msgstr "Viditeľné iba pre vybraných používateľov." msgid "" "**Choose this for projects that should not be exposed publicly at all.**" msgstr "" +"**Túto možnosť vyberte v prípade projektov, ktoré by vôbec nemali byť " +"verejne prístupné.**" #: ../../admin/access.rst:49 ../../admin/config.rst:495 msgid ":guilabel:`Custom`" -msgstr "" +msgstr ":guilabel:`Custom`" #: ../../admin/access.rst:56 -#, fuzzy -#| msgid "Log in to use Weblate." msgid "Not available on Hosted Weblate." -msgstr "Pre používanie Weblate sa prihláste." +msgstr "Nie je k dispozícii v službe Hosted Weblate." #: ../../admin/access.rst:58 msgid "You will have to set up all the permissions using :ref:`custom-acl`." -msgstr "" +msgstr "Všetky oprávnenia budete musieť nastaviť pomocou :ref:`custom-acl`." #: ../../admin/access.rst:60 msgid "" "**Choose this on your own Weblate instance if you want to define access in a " "specific, finely customizable way.**" msgstr "" +"**Ak chcete definovať prístup špecifickým, jemne prispôsobiteľným spôsobom, " +"vyberte si túto možnosť vo svojej vlastnej inštancii Weblate.**" #: ../../admin/access.rst:62 msgid "" @@ -130,17 +146,25 @@ msgid "" "the configuration (:guilabel:`Manage` ↓ :guilabel:`Settings`) of each " "respective project." msgstr "" +":guilabel:`Access control` možno zmeniť v záložke :guilabel:`Access` " +"konfigurácie (:guilabel:`Manage` ↓ :guilabel:`Settings`) každého príslušného " +"projektu." #: ../../admin/access.rst:68 msgid "" "The default can also be changed by setting :setting:`DEFAULT_ACCESS_CONTROL`." msgstr "" +"Predvolené nastavenie je možné zmeniť aj nastavením " +":setting:`DEFAULT_ACCESS_CONTROL`." #: ../../admin/access.rst:72 msgid "" "Even `Private` project statistics are counted into the site-wide statistics " "and language summary. This does not reveal project names or any other info." msgstr "" +"Aj štatistiky `Súkromných` projektov sa započítavajú do štatistík a " +"jazykového prehľadu celého webu. Tým sa nezverejňujú názvy projektov ani " +"žiadne iné informácie." #: ../../admin/access.rst:78 msgid "" @@ -148,20 +172,21 @@ msgid "" "users in `Public`, `Protected`, and `Private` projects by using :ref:`custom " "settings `." msgstr "" +"Správcovia inštancie môžu upraviť predvolené sady oprávnení dostupné " +"používateľom v projektoch `Public`, `Protected` a `Private` pomocou :ref:`" +"custom settings `." #: ../../admin/access.rst:83 msgid ":ref:`project-access_control`" msgstr ":ref:`project-access_control`" #: ../../admin/access.rst:88 -#, fuzzy -#| msgid "Version control" msgid "Managing per-project access control" -msgstr "Správa revízií" +msgstr "Správa riadenia prístupu pre jednotlivé projekty" #: ../../admin/access.rst:90 msgid "For `Public`, `Protected` and `Private` projects:" -msgstr "" +msgstr "Pre `verejné`, `chránené` a `súkromné` projekty:" #: ../../admin/access.rst:92 msgid "" @@ -169,6 +194,10 @@ msgid "" "allows them to assign other users in `Public`, `Protected` and `Private` " "(but not `Custom`) projects via adding them to teams." msgstr "" +"Pridelenie práv používateľom :guilabel:`Manage project access` (pozri " +":ref:`privileges`) im umožňuje priradiť iných používateľov do projektov " +"`Public`, `Protected` a `Private` (ale nie `Custom`) prostredníctvom ich " +"pridania do tímov." #: ../../admin/access.rst:96 msgid "" diff --git a/docs/locales/sr/LC_MESSAGES/docs.po b/docs/locales/sr/LC_MESSAGES/docs.po index 21623b435ac6..9554aee91bc0 100644 --- a/docs/locales/sr/LC_MESSAGES/docs.po +++ b/docs/locales/sr/LC_MESSAGES/docs.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-10-03 06:52+0000\n" +"PO-Revision-Date: 2024-10-12 04:29+0000\n" "Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" @@ -127,7 +127,7 @@ msgstr "Izaberi ovo za projekte koji ne treba uopšte da budu javni" #: ../../admin/access.rst:49 ../../admin/config.rst:495 msgid ":guilabel:`Custom`" -msgstr "" +msgstr ":guilabel:`Custom`" #: ../../admin/access.rst:56 #, fuzzy @@ -328,10 +328,8 @@ msgid "" msgstr "" #: ../../admin/access.rst:150 -#, fuzzy -#| msgid "Administrators" msgid "Team administrators" -msgstr "Администратори" +msgstr "Администратори тима" #: ../../admin/access.rst:154 msgid "" @@ -622,11 +620,11 @@ msgstr "Корисник има све могуће дозволе." #: ../../admin/access.rst:314 msgid "The authentication models consist of several objects:" -msgstr "" +msgstr "Модели аутентификације се састоје од неколико објеката:" #: ../../admin/access.rst:316 msgid "`Permission`" -msgstr "" +msgstr "`Дозвола`" #: ../../admin/access.rst:317 msgid "" @@ -636,7 +634,7 @@ msgstr "" #: ../../admin/access.rst:319 msgid "`Role`" -msgstr "" +msgstr "`Улога`" #: ../../admin/access.rst:320 msgid "" @@ -645,7 +643,7 @@ msgstr "" #: ../../admin/access.rst:322 msgid "`User`" -msgstr "" +msgstr "`Корисник`" #: ../../admin/access.rst:323 #, fuzzy @@ -655,7 +653,7 @@ msgstr "Додај појам у појмовник" #: ../../admin/access.rst:324 msgid "`Group`" -msgstr "" +msgstr "`Група`" #: ../../admin/access.rst:325 msgid "" @@ -896,7 +894,7 @@ msgstr "Пример додатка" #: ../../admin/access.rst:477 msgid "Billing (see :ref:`billing`)" -msgstr "" +msgstr "Наплата (погледајте :ref:`billing`)" #: ../../admin/access.rst:477 msgid "View billing info" @@ -948,10 +946,8 @@ msgid "Delete comment" msgstr "Брише коментаре" #: ../../admin/access.rst:485 -#, fuzzy -#| msgid "Resolved comment" msgid "Resolve comment" -msgstr "Решени коментар" +msgstr "Реши коментар" #: ../../admin/access.rst:485 ../../admin/access.rst:529 #: ../../admin/access.rst:531 @@ -994,10 +990,8 @@ msgid "" msgstr "" #: ../../admin/access.rst:493 -#, fuzzy -#| msgid "Add glossary entry" msgid "Add glossary terminology" -msgstr "Додаје унос у појмовник" +msgstr "Додај терминологију у глосар" #: ../../admin/access.rst:495 msgid "Edit glossary entry" @@ -1215,7 +1209,7 @@ msgstr "Додаје више језика за превођење" #: ../../admin/access.rst:553 msgid "Uploads" -msgstr "" +msgstr "Отпремања" #: ../../admin/access.rst:553 msgid "Define author of uploaded translation" @@ -1286,10 +1280,8 @@ msgid "Manage language definitions" msgstr "Управља дефиницијама језика" #: ../../admin/access.rst:579 -#, fuzzy -#| msgid "Manage users" msgid "Manage teams" -msgstr "Управља корисницима" +msgstr "Управљање тимовима" #: ../../admin/access.rst:581 msgid "Manage users" @@ -1308,10 +1300,8 @@ msgid "Manage translation memory" msgstr "Управља преводилачком меморијом" #: ../../admin/access.rst:589 -#, fuzzy -#| msgid "Machame" msgid "Manage machinery" -msgstr "мачаме" +msgstr "Управљање машинеријом" #: ../../admin/access.rst:591 msgid "Manage component lists" @@ -1322,10 +1312,8 @@ msgid "Manage billing" msgstr "Управљајте наплатама" #: ../../admin/access.rst:595 -#, fuzzy -#| msgid "Example addon" msgid "Manage site-wide add-ons" -msgstr "Пример додатка" +msgstr "Управљање додатцима на нивоу целог сајта" #: ../../admin/access.rst:600 msgid "" @@ -1581,7 +1569,7 @@ msgstr "" #: ../../admin/access.rst:650 msgid "`Guests`" -msgstr "" +msgstr "`Гости`" #: ../../admin/access.rst:651 msgid "Defines permissions for non-authenticated users." @@ -1599,11 +1587,11 @@ msgstr "" #: ../../admin/access.rst:658 msgid "Default roles: `Add suggestion`, `Access repository`" -msgstr "" +msgstr "Подразумеване улоге: `Додај предлог`, `Приступ складишту`" #: ../../admin/access.rst:660 msgid "`Viewers`" -msgstr "" +msgstr "`Гледаоци`" #: ../../admin/access.rst:661 msgid "" @@ -1619,12 +1607,12 @@ msgstr "" #: ../../admin/access.rst:667 msgid "Default roles: none" -msgstr "" +msgstr "Подразумеване улоге: нема" #: ../../admin/access.rst:669 ../../workflows.rst:121 ../../workflows.rst:153 #: ../../workflows.rst:186 msgid "`Users`" -msgstr "" +msgstr "`Корисници`" #: ../../admin/access.rst:670 msgid "Default team for all users." @@ -1632,31 +1620,31 @@ msgstr "" #: ../../admin/access.rst:675 msgid "Default roles: `Power user`" -msgstr "" +msgstr "Подразумеване улоге: `Моћни корисник`" #: ../../admin/access.rst:677 ../../workflows.rst:190 msgid "`Reviewers`" -msgstr "" +msgstr "`Прегледачи`" #: ../../admin/access.rst:678 msgid "Group for reviewers (see :ref:`workflows`)." -msgstr "" +msgstr "Група за прегледаче (погледајте :ref:`workflows`)." #: ../../admin/access.rst:680 msgid "Default roles: `Review strings`" -msgstr "" +msgstr "Подразумеване улоге: `Преглед стрингова`" #: ../../admin/access.rst:682 msgid "`Managers`" -msgstr "" +msgstr "`Менаџери`" #: ../../admin/access.rst:683 msgid "Group for administrators." -msgstr "" +msgstr "Група за администраторе." #: ../../admin/access.rst:685 msgid "Default roles: `Administration`" -msgstr "" +msgstr "Подразумеване улоге: `Администрација`" #: ../../admin/access.rst:687 #, fuzzy @@ -1741,7 +1729,7 @@ msgstr "" #: ../../admin/install/kubernetes.rst:26 ../../admin/install/openshift.rst:102 #: ../../admin/machine.rst:0 ../../faq.rst:5 msgid "Configuration" -msgstr "" +msgstr "Конфигурација" #: ../../admin/addons.rst:28 msgid "``mode``" @@ -1793,7 +1781,7 @@ msgid "" "Please note that translating all strings will discard all existing " "translations." msgstr "" -"Имајте на уму да ће превођење свих низова одбацити све постојеће преводе." +"Имајте на уму да ће превођење свих ниски одбацити све постојеће преводе." #: ../../admin/addons.rst:40 #, fuzzy @@ -1828,10 +1816,8 @@ msgid "``auto_source``" msgstr "``auto_source``" #: ../../admin/addons.rst:50 -#, fuzzy -#| msgid "Perform automatic translation" msgid "Source of automated translations" -msgstr "Обавља аутоматско превођење" +msgstr "Извор аутоматских превода" #: ../../admin/addons.rst:52 #, fuzzy @@ -1854,6 +1840,8 @@ msgid "" "Enter slug of a component to use as source, keep blank to use all components " "in the current project." msgstr "" +"Унесите слаг компоненте за употребу као извор, оставите празно да користите " +"све компоненте у тренутном пројекту." #: ../../admin/addons.rst:58 msgid "``engines``" @@ -1887,7 +1875,7 @@ msgid "" "Automatically translates strings using machine translation or other " "components." msgstr "" -"Аутоматски преводи низове користећи машински превод или друге компоненте." +"Аутоматски преводи ниске користећи машински превод или друге компоненте." #: ../../admin/addons.rst:66 msgid "It is triggered:" @@ -1907,7 +1895,7 @@ msgstr "" #: ../../admin/addons.rst:73 msgid ":ref:`auto-translation`, :ref:`translation-consistency`" -msgstr "" +msgstr ":ref:`auto-translation`, :ref:`translation-consistency`" #: ../../admin/addons.rst:79 msgid "JavaScript localization CDN" @@ -1963,7 +1951,7 @@ msgid "" "translatable strings." msgstr "" "Листа имена фајлова у тренутном складишту или удаљених URL-ова за парсирање " -"преводивих низова." +"преводивих ниски." #: ../../admin/addons.rst:93 msgid "daily, repository post-commit, repository post-update" @@ -2111,6 +2099,8 @@ msgid "" "Auto-translate the newly added strings with :ref:`addon-weblate." "autotranslate.autotranslate`." msgstr "" +"Аутоматски преведите ново додате стрингове са :ref:`addon-weblate." +"autotranslate.autotranslate`." #: ../../admin/addons.rst:189 msgid "Component discovery" @@ -2213,7 +2203,7 @@ msgid "" msgstr "" "Име фајла посредног преводног фајла. У већини случајева ово је преводни фајл " "који обезбеђују програмери и користи се приликом креирања стварних изворних " -"низова." +"ниски." #: ../../admin/addons.rst:205 msgid "``language_regex``" @@ -2224,14 +2214,12 @@ msgid "Language filter" msgstr "Филтер језика" #: ../../admin/addons.rst:205 -#, fuzzy -#| msgid "" -#| "Regular expression to filter translation files against when scanning for " -#| "filemask." msgid "" "Regular expression to filter translation files against when scanning for " "file mask." -msgstr "Регуларни израз за филтрирање фајлова превода по претрази маске фајла." +msgstr "" +"Регуларни израз за филтрирање преводних фајлова од када се скенира за маску " +"фајла." #: ../../admin/addons.rst:207 msgid "``copy_addons``" @@ -2239,7 +2227,7 @@ msgstr "``copy_addons``" #: ../../admin/addons.rst:207 msgid "Clone add-ons from the main component to the newly created ones" -msgstr "" +msgstr "Клонирајте додатке из главне компоненте у новокреиране" #: ../../admin/addons.rst:209 msgid "``remove``" @@ -2247,7 +2235,7 @@ msgstr "``remove``" #: ../../admin/addons.rst:209 msgid "Remove components for inexistent files" -msgstr "" +msgstr "Уклонити компоненте за непостојеће фајлове" #: ../../admin/addons.rst:211 msgid "``confirm``" @@ -2326,6 +2314,9 @@ msgid "" "presented, from where you can check whether the configuration actually " "matches your needs:" msgstr "" +"Када кликнете на :guilabel:`Сачувај`, биће приказан преглед одговарајућих " +"компоненти, одакле можете проверити да ли конфигурација заиста одговара " +"вашим потребама:" #: ../../admin/addons.rst:242 #, fuzzy @@ -2652,7 +2643,7 @@ msgstr "Компонента се ажурира…" #: ../../admin/addons.rst:369 msgid "Bulk edit flags, labels, or states of strings." -msgstr "Масовно уређивање застава, ознака или стања низова." +msgstr "Масовно уређивање застава, ознака или стања ниски." #: ../../admin/addons.rst:371 msgid "" @@ -2716,9 +2707,9 @@ msgid "" "source string, it is flagged as needing editing in Weblate. Especially " "useful for file formats that include source strings for untranslated strings." msgstr "" -"Када год се нови преводиви низ увезе из VCS-а и поклапа се са изворним " -"низом, означава се као потребан за уређивање у Веблејту. Посебно корисно за " -"формате фајлова који укључују изворне низове за непреведене низове." +"Када год се нови преводива ниска увезе из VCS-а и поклапа се са изворном " +"ниском, означава се као потребан за уређивање у Веблејту. Посебно корисно за " +"формате фајлова који укључују изворне ниске за непреведене ниске." #: ../../admin/addons.rst:416 msgid "" @@ -2768,20 +2759,16 @@ msgstr "" "које су креирали програмери." #: ../../admin/addons.rst:460 -#, fuzzy -#| msgid "Automatic translation source" msgid "Fill read-only strings with source" -msgstr "Извор аутоматског превођења" +msgstr "Попуните ниске само за читање из изворне" #: ../../admin/addons.rst:464 msgid "``weblate.generate.fill_read_only``" msgstr "" #: ../../admin/addons.rst:468 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "Fills in translation of read-only strings with source string." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Попуњава превод ниски само за читање из изворне ниске." #: ../../admin/addons.rst:473 msgid "Statistics generator" @@ -2830,31 +2817,27 @@ msgstr "" #: ../../admin/addons.rst:491 msgid "``locale/{{ language_code }}.json``" -msgstr "" +msgstr "``locale/{{ language_code }}.json``" #: ../../admin/addons.rst:492 msgid "Content" -msgstr "" +msgstr "Садржај" #: ../../admin/addons.rst:506 msgid ":ref:`markup`" msgstr ":ref:`markup`" #: ../../admin/addons.rst:511 -#, fuzzy -#| msgid "Automatic translation source" msgid "Prefill translation with source" -msgstr "Извор аутоматског превођења" +msgstr "Унапред попунити превод са извором" #: ../../admin/addons.rst:515 msgid "``weblate.generate.prefill``" msgstr "" #: ../../admin/addons.rst:519 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "Fills in translation strings with source string." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Попуњава преводне ниске са изворном ниском." #: ../../admin/addons.rst:521 msgid "" @@ -2885,47 +2868,39 @@ msgstr "Циљни превод" #: ../../admin/addons.rst:536 msgid "All strings in this translation will be overwritten" -msgstr "Сви низови у овом преводу ће бити преписани" +msgstr "Све ниске у овом преводу ће бити преписане" #: ../../admin/addons.rst:538 msgid "``prefix``" msgstr "``prefix``" #: ../../admin/addons.rst:538 -#, fuzzy -#| msgid "String prefix" msgid "Fixed string prefix" -msgstr "Префикс ниске" +msgstr "Фиксни префикс ниске" #: ../../admin/addons.rst:540 msgid "``var_prefix``" msgstr "``var_prefix``" #: ../../admin/addons.rst:540 -#, fuzzy -#| msgid "String prefix" msgid "Variable string prefix" -msgstr "Префикс ниске" +msgstr "Променљиви префикс ниске" #: ../../admin/addons.rst:542 msgid "``suffix``" msgstr "``suffix``" #: ../../admin/addons.rst:542 -#, fuzzy -#| msgid "String suffix" msgid "Fixed string suffix" -msgstr "Префикс ниске" +msgstr "Фиксни суфикс ниске" #: ../../admin/addons.rst:544 msgid "``var_suffix``" msgstr "``var_suffix``" #: ../../admin/addons.rst:544 -#, fuzzy -#| msgid "String suffix" msgid "Variable string suffix" -msgstr "Префикс ниске" +msgstr "Променљиви суфикс ниске" #: ../../admin/addons.rst:546 msgid "``var_multiplier``" @@ -2933,30 +2908,29 @@ msgstr "``var_multiplier``" #: ../../admin/addons.rst:546 msgid "Variable part multiplier" -msgstr "" +msgstr "Мултипликатор променљивог дела" #: ../../admin/addons.rst:546 msgid "" "How many times to repeat the variable part depending on the length of the " "source string." msgstr "" +"Колико пута поновити променљиви део у зависности од дужине изворне ниске." #: ../../admin/addons.rst:548 msgid "``include_readonly``" msgstr "``include_readonly``" #: ../../admin/addons.rst:548 -#, fuzzy -#| msgid "Read only strings" msgid "Include read-only strings" -msgstr "Ниске само за читање" +msgstr "Укључи низове само за читање" #: ../../admin/addons.rst:552 msgid "" "Generates a translation by adding prefix and suffix to source strings " "automatically." msgstr "" -"Генерише превод додавањем префикса и суфикса изворним низовима аутоматски." +"Генерише превод додавањем префикса и суфикса изворним нискама аутоматски." #: ../../admin/addons.rst:555 msgid "" @@ -2985,7 +2959,7 @@ msgstr "" #: ../../admin/addons.rst:570 msgid "The strings will be generated using following pattern:" -msgstr "" +msgstr "Ниске ће бити генерисане користећи следећи образац:" #: ../../admin/addons.rst:572 msgid "" @@ -3054,6 +3028,8 @@ msgid "" "Updates the ALL_LINGUAS variable in :file:`configure`, :file:`configure.in` " "or any :file:`configure.ac` files, when a new translation is added." msgstr "" +"Ажурира променљиву ALL_LINGUAS у :file:`configure`, :file:`configure.in` или " +"било којим :file:`configure.ac` фајловима, када се дода нови превод." #: ../../admin/addons.rst:631 msgid "Customize gettext output" @@ -3111,7 +3087,7 @@ msgstr "" #: ../../admin/addons.rst:649 msgid "It offers the following options:" -msgstr "" +msgstr "Нуди следеће опције:" #: ../../admin/addons.rst:651 msgid "Wrap lines at 77 characters and at newlines" @@ -3168,16 +3144,15 @@ msgid "``fuzzy``" msgstr "``fuzzy``" #: ../../admin/addons.rst:681 -#, fuzzy -#| msgid "Import as string needing edit" msgid "Include strings needing editing" -msgstr "Увези као ниску коју треба уредити" +msgstr "Укључите ниске које треба уредити" #: ../../admin/addons.rst:681 msgid "" "Strings needing editing (fuzzy) are typically not ready for use as " "translations." msgstr "" +"Ниске које треба уредити (фази) обично нису спремне за употребу као преводи." #: ../../admin/addons.rst:685 msgid "Automatically generates a MO file for every changed PO file." @@ -3406,10 +3381,8 @@ msgstr "" "Омогућава подешавање понашања JSON излаза, на пример увлачење или сортирање." #: ../../admin/addons.rst:789 -#, fuzzy -#| msgid "Formats the Java properties file" msgid "Format the Java properties file" -msgstr "Форматира фајл Јава својстава" +msgstr "Форматирајте Java properties фајл" #: ../../admin/addons.rst:791 msgid "``weblate.properties.sort``" @@ -3421,7 +3394,7 @@ msgstr "``case_sensitive``" #: ../../admin/addons.rst:793 msgid "Enable case-sensitive key sorting" -msgstr "" +msgstr "Омогући разликовање великог и малог слова при сортирању кључева" #: ../../admin/addons.rst:797 msgid "Formats and sorts the Java properties file." @@ -3533,18 +3506,20 @@ msgid "" "string." msgstr "" "Ажурирајте све преводне фајлове да одговарају једнојезичном узводном базном " -"фајлу. Неискоришћени низови се уклањају, а нови се додају као копије " -"изворног низа." +"фајлу. Неискоришћене ниске се уклањају, а нове се додају као копије изворне " +"ниске." #: ../../admin/addons.rst:855 msgid "" "Use :ref:`addon-weblate.cleanup.generic` if you only want to remove stale " "translation keys." msgstr "" +"Користите :ref:`addon-weblate.cleanup.generic` ако желите само уклонити " +"застареле кључеве превода." #: ../../admin/addons.rst:865 msgid "Customize XML output" -msgstr "" +msgstr "Прилагодите XML излаз" #: ../../admin/addons.rst:869 #, fuzzy @@ -3558,11 +3533,11 @@ msgstr "``closing_tags``" #: ../../admin/addons.rst:871 msgid "Include closing tag for blank XML tags" -msgstr "" +msgstr "Укључите затварајућу ознаку за празне XML ознаке" #: ../../admin/addons.rst:875 msgid "Allows adjusting XML output behavior, for example closing tags." -msgstr "" +msgstr "Омогућава подешавање понашања XML излаза, на пример затварање ознака." #: ../../admin/addons.rst:880 msgid "Customize YAML output" @@ -3679,33 +3654,35 @@ msgstr "" #: ../../admin/addons.rst:943 msgid "For installation instructions see :ref:`custom-addon-modules`." -msgstr "" +msgstr "За упутства о инсталацији погледајте :ref:`custom-addon-modules`." #: ../../admin/addons.rst:945 msgid "" "The script is executed with the current directory set to the root of the VCS " "repository for any given component." msgstr "" +"Скрипт се извршава са тренутним директоријумом постављеним на корен VCS " +"складишта за било коју дату компоненту." #: ../../admin/addons.rst:948 msgid "Additionally, the following environment variables are available:" -msgstr "" +msgstr "Поред тога, следеће променљиве окружења су доступне:" #: ../../admin/addons.rst:952 msgid "Version control system used." -msgstr "" +msgstr "Верзија система контроле верзија који се користи." #: ../../admin/addons.rst:956 msgid "Upstream repository URL." -msgstr "" +msgstr "URL узводног складишта." #: ../../admin/addons.rst:960 msgid "Absolute path to VCS repository." -msgstr "" +msgstr "Апсолутна путања до VCS складишта." #: ../../admin/addons.rst:964 msgid "Repository branch configured in the current component." -msgstr "" +msgstr "Грана складишта конфигурисана у тренутној компоненти." #: ../../admin/addons.rst:968 msgid "File mask for current component." @@ -3713,11 +3690,12 @@ msgstr "" #: ../../admin/addons.rst:972 msgid "Filename of template for monolingual translations (can be empty)." -msgstr "" +msgstr "Име фајла шаблона за једнојезичне преводе (може бити празно)." #: ../../admin/addons.rst:976 msgid "Filename of the file used for creating new translations (can be empty)." msgstr "" +"Име фајла фајла који се користи за стварање нових превода (може бити празно)." #: ../../admin/addons.rst:981 msgid "File format used in current component." @@ -3745,19 +3723,19 @@ msgstr "" #: ../../admin/addons.rst:1002 msgid "Component name." -msgstr "" +msgstr "Име компоненте." #: ../../admin/addons.rst:1006 msgid "Project name." -msgstr "" +msgstr "Име пројекта." #: ../../admin/addons.rst:1010 msgid "Component URL." -msgstr "" +msgstr "URL компоненте." #: ../../admin/addons.rst:1014 msgid "Project engage URL." -msgstr "" +msgstr "URL ангажовања пројекта." #: ../../admin/addons.rst:1018 ../../faq.rst:278 msgid ":ref:`component`" @@ -3776,7 +3754,7 @@ msgstr "" #: ../../admin/addons.rst:1027 msgid "For example with Gulp you can do it using following code:" -msgstr "" +msgstr "На пример, са Gulp-ом можете то урадити користећи следећи код:" #: ../../admin/addons.rst:1037 msgid "Pre-commit processing of translations" @@ -3793,6 +3771,8 @@ msgid "" "It is passed as a single parameter consisting of the filename of a current " "translation." msgstr "" +"Прослеђује се као један параметар који се састоји од имена фајла тренутног " +"превода." #: ../../admin/addons.rst:1046 #, fuzzy @@ -3814,7 +3794,7 @@ msgstr "" #: ../../admin/admin.rst:4 ../../admin/memory.rst:114 msgid "Management interface" -msgstr "" +msgstr "Интерфејс за управљање" #: ../../admin/admin.rst:6 msgid "" @@ -3941,7 +3921,7 @@ msgstr "" #: ../../admin/admin.rst:72 msgid "The Django admin interface" -msgstr "" +msgstr "Django администраторски интерфејс" #: ../../admin/admin.rst:76 msgid "" @@ -3955,6 +3935,8 @@ msgid "" "Here you can manage objects stored in the database, such as users, " "translations and other settings:" msgstr "" +"Овде можете управљати објектима сачуваним у бази података, као што су " +"корисници, преводи и друга подешавања:" #: ../../admin/admin.rst:84 msgid "" @@ -3962,6 +3944,9 @@ msgid "" "tweak it for :ref:`production`, or manage SSH keys used to access :ref:`vcs-" "repos`." msgstr "" +"У одељку :guilabel:`Извештаји`, можете проверити статус вашег сајта, " +"прилагодити га за :ref:`production`, или управљати SSH кључевима који се " +"користе за приступ :ref:`vcs-repos`." #: ../../admin/admin.rst:87 msgid "" @@ -3978,7 +3963,7 @@ msgstr "" #: ../../admin/admin.rst:95 msgid "Adding a project" -msgstr "" +msgstr "Додавање пројекта" #: ../../admin/admin.rst:97 msgid "" @@ -3986,6 +3971,9 @@ msgid "" "one project for one piece of software, or book (See :ref:`project` for info " "on individual parameters):" msgstr "" +"Додавање пројекта служи као контејнер за све компоненте. Обично креирате " +"један пројекат за један комад софтвера, или књигу (Погледајте :ref:`project` " +"за информације о појединачним параметрима):" #: ../../admin/admin.rst:105 msgid ":ref:`project`" @@ -3993,21 +3981,23 @@ msgstr ":ref:`project`" #: ../../admin/admin.rst:110 msgid "Bilingual components" -msgstr "" +msgstr "Двојезичне компоненте" #: ../../admin/admin.rst:112 msgid "" "Once you have added a project, translation components can be added to it. " "(See :ref:`component` for info regarding individual parameters):" msgstr "" +"Када додате пројекат, компоненте превода могу бити додате у њега. (" +"Погледајте :ref:`component` за информације о појединачним параметрима):" #: ../../admin/admin.rst:119 ../../admin/admin.rst:135 msgid ":ref:`component`, :ref:`bimono`" -msgstr "" +msgstr ":ref:`компонента`, :ref:`bimono`" #: ../../admin/admin.rst:125 msgid "Monolingual components" -msgstr "" +msgstr "Једнојезичне компоненте" #: ../../admin/admin.rst:127 msgid "" @@ -4022,36 +4012,44 @@ msgstr "Обавештења" #: ../../admin/announcements.rst:6 msgid "In prior releases this feature was called whiteboard messages." -msgstr "" +msgstr "У претходним издањима ова функција је била названа поруке на табли." #: ../../admin/announcements.rst:8 msgid "" "Provide info to your translators by posting announcements, site-wide, per " "project, component, or language." msgstr "" +"Пружите информације вашим преводиоцима објављивањем обавештења, на целом " +"сајту, по пројекту, компоненти или језику." #: ../../admin/announcements.rst:10 msgid "" "Announce the purpose, deadlines, status, or specify targets for translation." -msgstr "" +msgstr "Објавите сврху, рокове, статус или одредите циљеве за превод." #: ../../admin/announcements.rst:12 msgid "" "The users will receive notification on the announcements for watched " "projects (unless they opt out)." msgstr "" +"Корисници ће добити обавештење о обавештењима за гледане пројекте (осим ако " +"се не одјаве)." #: ../../admin/announcements.rst:15 msgid "" "This can be useful for various things from announcing the purpose of the " "website to specifying targets for translations." msgstr "" +"Ово може бити корисно за разне ствари од објављивања сврхе вебсајта до " +"одређивања циљева за преводе." #: ../../admin/announcements.rst:18 msgid "" "The announcements can posted on each level in the :guilabel:`Manage` menu, " "using :guilabel:`Post announcement`:" msgstr "" +"Обавештења се могу објавити на сваком нивоу у :guilabel:`Manage` менију, " +"користећи :guilabel:`Post announcement`:" #: ../../admin/announcements.rst:21 msgid "" @@ -4061,48 +4059,48 @@ msgstr "" #: ../../admin/announcements.rst:24 msgid "It can be also added using the admin interface:" -msgstr "" +msgstr "Такође се може додати коришћењем администраторског интерфејса:" #: ../../admin/announcements.rst:28 msgid "The announcements are then shown based on their specified context:" -msgstr "" +msgstr "Обавештења се затим приказују на основу њиховог одређеног контекста:" #: ../../admin/announcements.rst:30 msgid "No context specified" -msgstr "" +msgstr "Нема одређеног контекста" #: ../../admin/announcements.rst:32 msgid "Shown on dashboard (landing page)." -msgstr "" +msgstr "Приказано на контролној табли (почетна страница)." #: ../../admin/announcements.rst:34 msgid "Project specified" -msgstr "" +msgstr "Пројекат одређен" #: ../../admin/announcements.rst:36 msgid "" "Shown within the project, including all its components and translations." -msgstr "" +msgstr "Приказано унутар пројекта, укључујући све његове компоненте и преводе." #: ../../admin/announcements.rst:38 msgid "Component specified" -msgstr "" +msgstr "Компонента одређена" #: ../../admin/announcements.rst:40 msgid "Shown for a given component and all its translations." -msgstr "" +msgstr "Приказано за дату компоненту и све њене преводе." #: ../../admin/announcements.rst:42 msgid "Language specified" -msgstr "" +msgstr "Језик одређен" #: ../../admin/announcements.rst:44 msgid "Shown on the language overview and all translations in that language." -msgstr "" +msgstr "Приказано на прегледу језика и свим преводима на том језику." #: ../../admin/announcements.rst:47 msgid "This is how it looks on the language overview page:" -msgstr "" +msgstr "Овако изгледа на страници прегледа језика:" #: ../../admin/announcements.rst:49 msgid "" @@ -4125,20 +4123,26 @@ msgid "" "new user can contribute or authenticate by using one of the third party " "services." msgstr "" +"Подразумевано постављање за Веблејт је да користи python-social-auth, форму " +"на вебсајту за обраду регистрације нових корисника. Након потврде њиховог " +"имејла, нови корисник може допринети или се аутентификовати коришћењем једне " +"од услуга треће стране." #: ../../admin/auth.rst:11 msgid "" "You can also turn off registration of new users using :setting:" "`REGISTRATION_OPEN`." msgstr "" +"Такође можете искључити регистрацију нових корисника користећи " +":setting:`REGISTRATION_OPEN`." #: ../../admin/auth.rst:14 msgid "The authentication attempts are subject to :ref:`rate-limit`." -msgstr "" +msgstr "Покушаји аутентификације су предмет :ref:`rate-limit`." #: ../../admin/auth.rst:18 msgid "Authentication backends" -msgstr "" +msgstr "Аутентификациони бекендови" #: ../../admin/auth.rst:20 msgid "" @@ -4151,28 +4155,36 @@ msgstr "" msgid "" "Django can additionally be set up to authenticate against other means too." msgstr "" +"Django се додатно може поставити да се такође аутентификује против других " +"средстава." #: ../../admin/auth.rst:29 msgid "" ":ref:`docker-auth` describes how to configure authentication in the official " "Docker image." msgstr "" +":ref:`docker-auth` описује како конфигурисати аутентификацију у званичној " +"Docker слици." #: ../../admin/auth.rst:33 msgid "Social authentication" -msgstr "" +msgstr "Социјална аутентификација" #: ../../admin/auth.rst:35 msgid "" "Thanks to :doc:`psa:index`, Weblate support authentication using many third " "party services such as GitLab, Ubuntu, Fedora, etc." msgstr "" +"Захваљујући :doc:`psa:index`, Веблејт подржава аутентификацију користећи " +"многе услуге треће стране као што су GitLab, Ubuntu, Fedora, итд." #: ../../admin/auth.rst:38 msgid "" "Please check their documentation for generic configuration instructions in :" "doc:`psa:configuration/django`." msgstr "" +"Молимо вас проверите њихову документацију за општа упутства за конфигурацију " +"у :doc:`psa:configuration/django`." #: ../../admin/auth.rst:43 msgid "" @@ -4181,10 +4193,14 @@ msgid "" "support this, please enforce e-mail validation on the Weblate side by " "configuring FORCE_EMAIL_VALIDATION for them. For example:" msgstr "" +"Подразумевано, Веблејт се ослања на услуге аутентификације треће стране да " +"пруже верификовану имејл адресу. Ако неке од услуга које желите да користите " +"не подржавају ово, молимо вас да на Веблејт страни примените верификацију " +"имејла конфигурисањем FORCE_EMAIL_VALIDATION за њих. На пример:" #: ../../admin/auth.rst:52 msgid ":doc:`psa:pipeline`" -msgstr "" +msgstr ":doc:`psa:pipeline`" #: ../../admin/auth.rst:54 msgid "" @@ -4206,11 +4222,11 @@ msgstr "" #: ../../admin/auth.rst:68 msgid ":doc:`Python Social Auth backend `" -msgstr "" +msgstr ":doc:`Python Social Auth backend `" #: ../../admin/auth.rst:71 msgid "OpenID authentication" -msgstr "" +msgstr "OpenID аутентификација" #: ../../admin/auth.rst:73 msgid "" @@ -4221,11 +4237,11 @@ msgstr "" #: ../../admin/auth.rst:89 msgid ":doc:`psa:backends/openid`" -msgstr "" +msgstr ":doc:`psa:backends/openid`" #: ../../admin/auth.rst:94 msgid "GitHub authentication" -msgstr "" +msgstr "GitHub аутентификација" #: ../../admin/auth.rst:96 msgid "" @@ -4255,10 +4271,13 @@ msgid "" "domain. In case you get errors about URL mismatch, you might want to fix " "this, see :ref:`production-site`." msgstr "" +"Веблејт пружа URL за повратни позив током аутентификације који укључује " +"конфигурисани домен. У случају да добијете грешке о неслагању URL-а, можда " +"ћете желети да ово поправите, погледајте :ref:`production-site`." #: ../../admin/auth.rst:126 msgid ":doc:`psa:backends/github`" -msgstr "" +msgstr ":doc:`psa:backends/github`" #: ../../admin/auth.rst:131 #, fuzzy @@ -4292,17 +4311,19 @@ msgstr "" #: ../../admin/auth.rst:168 msgid "Bitbucket authentication" -msgstr "" +msgstr "Bitbucket аутентификација" #: ../../admin/auth.rst:170 msgid "" "You need to register an application on Bitbucket and then tell Weblate all " "its secrets:" msgstr "" +"Потребно је да региструјете апликацију на Bitbucket-у и затим кажете " +"Веблејту све њене тајне:" #: ../../admin/auth.rst:190 msgid ":doc:`psa:backends/bitbucket`" -msgstr "" +msgstr ":doc:`psa:backends/bitbucket`" #: ../../admin/auth.rst:195 msgid "Google OAuth 2" @@ -4319,33 +4340,40 @@ msgid "" "The redirect URL is ``https://WEBLATE SERVER/accounts/complete/google-oauth2/" "``" msgstr "" +"URL за преусмеравање је ``https://WEBLATE SERVER/accounts/complete/" +"google-oauth2/``" #: ../../admin/auth.rst:219 msgid ":doc:`psa:backends/google`" -msgstr "" +msgstr ":doc:`psa:backends/google`" #: ../../admin/auth.rst:224 msgid "Facebook OAuth 2" -msgstr "" +msgstr "Facebook OAuth 2" #: ../../admin/auth.rst:226 msgid "" "As per usual with OAuth 2 services, you need to register your application " "with Facebook. Once this is done, you can set up Weblate to use it:" msgstr "" +"Као и обично са OAuth 2 услугама, потребно је да региструјете вашу " +"апликацију са Facebook-ом. Када је ово завршено, можете поставити Веблејт да " +"је користи:" #: ../../admin/auth.rst:229 msgid "" "The redirect URL is ``https://WEBLATE SERVER/accounts/complete/facebook/``" msgstr "" +"URL за преусмеравање је ``https://WEBLATE SERVER/accounts/complete/facebook/" +"``" #: ../../admin/auth.rst:249 msgid ":doc:`psa:backends/facebook`" -msgstr "" +msgstr ":doc:`psa:backends/facebook`" #: ../../admin/auth.rst:255 msgid "GitLab OAuth 2" -msgstr "" +msgstr "GitLab OAuth 2" #: ../../admin/auth.rst:257 msgid "" @@ -4358,10 +4386,12 @@ msgid "" "The redirect URL is ``https://WEBLATE SERVER/accounts/complete/gitlab/`` and " "ensure you mark the `read_user` scope." msgstr "" +"URL за преусмеравање је ``https://WEBLATE SERVER/accounts/complete/gitlab/`` " +"и осигурајте да означите `read_user` опсег." #: ../../admin/auth.rst:284 msgid ":doc:`psa:backends/gitlab`" -msgstr "" +msgstr ":doc:`psa:backends/gitlab`" #: ../../admin/auth.rst:289 msgid "Gitea OAuth 2" @@ -4391,13 +4421,15 @@ msgstr "" #: ../../admin/auth.rst:327 msgid "Microsoft Azure Active Directory" -msgstr "" +msgstr "Активни директоријум на Microsoft Azure" #: ../../admin/auth.rst:329 msgid "" "Weblate can be configured to use common or specific tenants for " "authentication." msgstr "" +"Веблејт може бити конфигурисан за употребу заједничких или специфичних " +"закупаца за аутентификацију." #: ../../admin/auth.rst:331 msgid "" @@ -4430,11 +4462,11 @@ msgstr "" #: ../../admin/auth.rst:378 msgid ":doc:`psa:backends/azuread`" -msgstr "" +msgstr ":doc:`psa:backends/azuread`" #: ../../admin/auth.rst:383 ../../admin/install/docker.rst:1330 msgid "Slack" -msgstr "" +msgstr "Слек" #: ../../admin/auth.rst:385 msgid "" @@ -4446,10 +4478,11 @@ msgstr "" msgid "" "The redirect URL is ``https://WEBLATE SERVER/accounts/complete/slack/``." msgstr "" +"URL за преусмеравање је ``https://WEBLATE SERVER/accounts/complete/slack/``." #: ../../admin/auth.rst:407 msgid ":doc:`psa:backends/slack`" -msgstr "" +msgstr ":doc:`psa:backends/slack`" #: ../../admin/auth.rst:411 msgid "Overriding authentication method names and icons" @@ -4464,7 +4497,7 @@ msgstr "" #: ../../admin/auth.rst:425 msgid "Turning off password authentication" -msgstr "" +msgstr "Искључивање аутентификације лозинком" #: ../../admin/auth.rst:427 msgid "" @@ -4491,44 +4524,49 @@ msgid "" "For example authentication using only the openSUSE Open ID provider can be " "achieved using the following:" msgstr "" +"На пример, аутентификација користећи само openSUSE Open ID провајдер може се " +"постићи користећи следеће:" #: ../../admin/auth.rst:455 msgid "Password authentication" -msgstr "" +msgstr "Аутентификација лозинком" #: ../../admin/auth.rst:457 msgid "" "The default :file:`settings.py` comes with a reasonable set of :setting:" "`django:AUTH_PASSWORD_VALIDATORS`:" msgstr "" +"Подразумевани :file:`settings.py` долази са разумним сетом " +":setting:`django:AUTH_PASSWORD_VALIDATORS`:" #: ../../admin/auth.rst:460 msgid "Passwords can't be too similar to your other personal info." -msgstr "" +msgstr "Лозинке не могу бити превише сличне вашој другој личној информацији." #: ../../admin/auth.rst:461 msgid "Passwords must contain at least 10 characters." -msgstr "" +msgstr "Лозинке морају садржати најмање 10 карактера." #: ../../admin/auth.rst:462 msgid "Passwords can't be a commonly used password." -msgstr "" +msgstr "Лозинке не могу бити уобичајено коришћене лозинке." #: ../../admin/auth.rst:463 msgid "Passwords can't be entirely numeric." -msgstr "" +msgstr "Лозинке не могу бити у потпуности нумеричке." #: ../../admin/auth.rst:464 msgid "Passwords can't consist of a single character or only whitespace." msgstr "" +"Лозинке не могу се састојати од једног карактера или само празног простора." #: ../../admin/auth.rst:465 msgid "Passwords can't match a password you have used in the past." -msgstr "" +msgstr "Лозинке не могу подударати са лозинком коју сте користили у прошлости." #: ../../admin/auth.rst:467 msgid "You can customize this setting to match your password policy." -msgstr "" +msgstr "Можете прилагодити ово подешавање да одговара вашој политици лозинки." #: ../../admin/auth.rst:469 msgid "" @@ -4536,6 +4574,9 @@ msgid "" "project/django-zxcvbn-password/>`_ which gives quite realistic estimates of " "password difficulty and allows rejecting passwords below a certain threshold." msgstr "" +"Додатно, можете такође инсталирати `django-zxcvbn-password `_ који даје сасвим реалистичне процене " +"тежине лозинке и омогућава одбацивање лозинки испод одређеног прага." #: ../../admin/auth.rst:476 msgid ":envvar:`WEBLATE_MIN_PASSWORD_SCORE`" @@ -4543,23 +4584,27 @@ msgstr "" #: ../../admin/auth.rst:481 msgid "SAML authentication" -msgstr "" +msgstr "SAML аутентификација" #: ../../admin/auth.rst:485 msgid "" "Please follow the Python Social Auth instructions for configuration. Notable " "differences:" msgstr "" +"Молимо вас да пратите упутства за Python Social Auth за конфигурацију. " +"Значајне разлике:" #: ../../admin/auth.rst:487 msgid "" "Weblate supports single IDP which has to be called ``weblate`` in " "``SOCIAL_AUTH_SAML_ENABLED_IDPS``." msgstr "" +"Веблејт подржава један IDP који мора бити назван ``weblate`` у " +"``SOCIAL_AUTH_SAML_ENABLED_IDPS``." #: ../../admin/auth.rst:489 msgid "The SAML XML metadata URL is ``/accounts/metadata/saml/``." -msgstr "" +msgstr "SAML XML метаподаци URL је ``/accounts/metadata/saml/``." #: ../../admin/auth.rst:490 msgid "" @@ -4567,11 +4612,14 @@ msgid "" "``SOCIAL_AUTH_SAML_SP_ENTITY_ID``, ``SOCIAL_AUTH_SAML_TECHNICAL_CONTACT``, " "``SOCIAL_AUTH_SAML_SUPPORT_CONTACT``" msgstr "" +"Следећа подешавања су аутоматски попуњена: ``SOCIAL_AUTH_SAML_SP_ENTITY_ID``" +", ``SOCIAL_AUTH_SAML_TECHNICAL_CONTACT``, " +"``SOCIAL_AUTH_SAML_SUPPORT_CONTACT``" #: ../../admin/auth.rst:494 ../../admin/install/docker.rst:1452 #: ../../admin/install/docker.rst:1470 msgid "Example configuration:" -msgstr "" +msgstr "Пример конфигурације:" #: ../../admin/auth.rst:535 msgid "" @@ -4643,16 +4691,19 @@ msgstr "" msgid "" ":ref:`Configuring SAML in Docker `, :doc:`psa:backends/saml`" msgstr "" +":ref:`Configuring SAML in Docker `, :doc:`psa:backends/saml`" #: ../../admin/auth.rst:565 msgid "LDAP authentication" -msgstr "" +msgstr "LDAP аутентификација" #: ../../admin/auth.rst:567 msgid "" "LDAP authentication can be best achieved using the `django-auth-ldap` " "package. You can install it via usual means:" msgstr "" +"LDAP аутентификација може се најбоље постићи коришћењем `django-auth-ldap` " +"пакета. Можете га инсталирати на уобичајен начин:" #: ../../admin/auth.rst:580 msgid "" @@ -4667,12 +4718,18 @@ msgid "" "'module' object has no attribute '_trace_level' `_, downgrading python-ldap to 3.0.0 might help." msgstr "" +"Дошло је до неких некомпатибилности у Python LDAP 3.1.0 модулу, што може " +"спречити употребу те верзије. Ако добијете грешку `AttributeError: 'module' " +"object has no attribute '_trace_level' `_, смањивање верзије python-ldap на 3.0.0 може " +"помоћи." #: ../../admin/auth.rst:590 msgid "" "Once you have the package installed, you can hook it into the Django " "authentication:" msgstr "" +"Када имате инсталиран пакет, можете га повезати у Django аутентификацију:" #: ../../admin/auth.rst:627 msgid "" @@ -4687,13 +4744,16 @@ msgstr "" #: ../../admin/auth.rst:636 msgid "Using bind password" -msgstr "" +msgstr "Коришћење лозинке за везивање" #: ../../admin/auth.rst:638 msgid "" "If you can not use direct bind for authentication, you will need to use " "search, and provide a user to bind for the search. For example:" msgstr "" +"Ако не можете користити директно везивање за аутентификацију, биће вам " +"потребно да користите претрагу и пружите корисника за везивање за претрагу. " +"На пример:" #: ../../admin/auth.rst:653 msgid "Active Directory integration" @@ -4701,16 +4761,18 @@ msgstr "" #: ../../admin/auth.rst:686 msgid ":doc:`ldap:index`, :doc:`ldap:authentication`" -msgstr "" +msgstr ":doc:`ldap:index`, :doc:`ldap:authentication`" #: ../../admin/auth.rst:693 msgid "CAS authentication" -msgstr "" +msgstr "CAS аутентификација" #: ../../admin/auth.rst:695 msgid "" "CAS authentication can be achieved using a package such as `django-cas-ng`." msgstr "" +"CAS аутентификација може се постићи коришћењем пакета као што је `django-cas-" +"ng`." #: ../../admin/auth.rst:697 msgid "" @@ -4718,14 +4780,18 @@ msgid "" "configured on the CAS server itself, and requires you run at least CAS v2 " "since CAS v1 doesn't support attributes at all." msgstr "" +"Први корак је откривање поља имејл корисника преко CAS-а. Ово мора бити " +"конфигурисано на самом CAS серверу и захтева да покренете најмање CAS v2 " +"пошто CAS v1 уопште не подржава атрибуте." #: ../../admin/auth.rst:701 msgid "Step two is updating Weblate to use your CAS server and attributes." msgstr "" +"Други корак је ажурирање Веблејта за употребу вашег CAS сервера и атрибута." #: ../../admin/auth.rst:703 msgid "To install `django-cas-ng`:" -msgstr "" +msgstr "Да бисте инсталирали `django-cas-ng`:" #: ../../admin/auth.rst:709 msgid "" @@ -4740,23 +4806,29 @@ msgid "" "package and connect your code with this signal. Doing this in settings file " "can cause problems, therefore it's suggested to put it:" msgstr "" +"На крају, signal може бити коришћен за мапирање поља имејл на објекат " +"корисника. Да би ово радило, морате увозити signal из `django-cas-ng` пакета " +"и повезати ваш код са овим signal-ом. Радити ово у фајлу подешавања може " +"изазвати проблеме, стога се предлаже да га поставите:" #: ../../admin/auth.rst:732 msgid "" "In your app config's :py:meth:`django:django.apps.AppConfig.ready` method" msgstr "" +"У :py:meth:`django:django.apps.AppConfig.ready` метод вашег конфигурације " +"апликације" #: ../../admin/auth.rst:733 msgid "In the project's :file:`urls.py` file (when no models exist)" -msgstr "" +msgstr "У :file:`urls.py` фајлу пројекта (када не постоје модели)" #: ../../admin/auth.rst:750 msgid "`Django CAS NG `_" -msgstr "" +msgstr "`Django CAS NG `_" #: ../../admin/auth.rst:753 msgid "Configuring third party Django authentication" -msgstr "" +msgstr "Конфигурисање треће стране Django аутентификације" #: ../../admin/auth.rst:755 msgid "" @@ -4764,10 +4836,13 @@ msgid "" "follow the instructions for the plugin, just remember to keep the Weblate " "user backend installed." msgstr "" +"Генерално, било који Django аутентификациони додатак би требало да ради са " +"Веблејтом. Само пратите упутства за додатак, само запамтите да задржите " +"инсталиран Веблејт кориснички бекенд." #: ../../admin/auth.rst:761 msgid ":ref:`ldap-auth`, :ref:`cas-auth`" -msgstr "" +msgstr ":ref:`ldap-auth`, :ref:`cas-auth`" #: ../../admin/auth.rst:764 msgid "" @@ -4775,18 +4850,21 @@ msgid "" "to :setting:`django:AUTHENTICATION_BACKENDS` and installing an " "authentication app (if there is any) into :setting:`django:INSTALLED_APPS`:" msgstr "" +"Типично, инсталација ће се састојати од додавања аутентификационог бекенда у " +":setting:`django:AUTHENTICATION_BACKENDS` и инсталирања аутентификационе " +"апликације (ако постоји) у :setting:`django:INSTALLED_APPS`:" #: ../../admin/auth.rst:783 -#, fuzzy -#| msgid "Authentication" msgid "Two-factor authentication" -msgstr "Аутентификација" +msgstr "Двофакторска аутентификација" #: ../../admin/auth.rst:789 msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Двофакторска аутентификација додаје још један слој безбедности вашем налогу " +"захтевајући више од само лозинке за пријаву." #: ../../admin/auth.rst:791 #, fuzzy @@ -4796,7 +4874,7 @@ msgstr "Стање Веблејт подршке" #: ../../admin/auth.rst:793 msgid "Security keys (WebAuthn)" -msgstr "" +msgstr "Безбедносни кључеви (WebAuthn)" #: ../../admin/auth.rst:794 #, fuzzy @@ -4832,13 +4910,16 @@ msgstr "" #: ../../admin/auth.rst:806 msgid "Recovery codes" -msgstr "" +msgstr "Кодови за опоравак" #: ../../admin/auth.rst:807 msgid "" "Recovery codes can be used to access your account if you lose access to your " "device and cannot receive two-factor authentication codes." msgstr "" +"Кодови за опоравак могу се користити за приступ вашем налогу ако изгубите " +"приступ свом уређају и не можете да примите кодове за двофакторску " +"аутентификацију." #: ../../admin/auth.rst:809 msgid "" @@ -4866,7 +4947,7 @@ msgstr "" #: ../../admin/backup.rst:4 msgid "Backing up and moving Weblate" -msgstr "" +msgstr "Резервна копија и премештање Веблејта" #: ../../admin/backup.rst:9 #, fuzzy @@ -4965,7 +5046,7 @@ msgstr "" #: ../../admin/backup.rst:68 msgid "Borg encryption key" -msgstr "" +msgstr "Борг кључ за енкрипцију" #: ../../admin/backup.rst:70 msgid "" @@ -4982,7 +5063,7 @@ msgstr "" #: ../../admin/backup.rst:79 msgid ":doc:`borg:usage/init`" -msgstr "" +msgstr ":doc:`borg:usage/init`" #: ../../admin/backup.rst:82 #, fuzzy @@ -5044,7 +5125,7 @@ msgstr "" #: ../../admin/backup.rst:111 msgid "Using custom backup storage" -msgstr "" +msgstr "Коришћење прилагођеног складиштења резервних копија" #: ../../admin/backup.rst:113 msgid "" @@ -5055,7 +5136,7 @@ msgstr "" #: ../../admin/backup.rst:119 msgid ":doc:`borg:usage/general` in the Borg documentation" -msgstr "" +msgstr ":doc:`borg:usage/general` у документацији Борга" #: ../../admin/backup.rst:122 msgid "Local filesystem" @@ -5150,12 +5231,14 @@ msgstr "" #: ../../admin/backup.rst:175 msgid "Restoring from BorgBackup" -msgstr "" +msgstr "Обнављање из BorgBackup" #: ../../admin/backup.rst:177 msgid "" "Restore access to your backup repository and prepare your backup passphrase." msgstr "" +"Вратите приступ вашем складишту резервних копија и припремите вашу резервну " +"фразу." #: ../../admin/backup.rst:179 msgid "List all the backups on the server using ``borg list REPOSITORY``." @@ -5172,6 +5255,8 @@ msgid "" "Restore the database from the SQL dump placed in the ``backup`` directory in " "the Weblate data dir (see :ref:`backup-dumps`)." msgstr "" +"Вратите базу података из SQL дампа смештеног у директоријум ``backup`` у " +"Веблејт директоријуму података (види :ref:`backup-dumps`)." #: ../../admin/backup.rst:185 msgid "" @@ -5211,11 +5296,11 @@ msgstr "" #: ../../admin/backup.rst:212 msgid ":doc:`borg:usage/list`, :doc:`borg:usage/extract`" -msgstr "" +msgstr ":doc:`borg:usage/list`, :doc:`borg:usage/extract`" #: ../../admin/backup.rst:220 msgid "Manual backup" -msgstr "" +msgstr "Ручна резервна копија" #: ../../admin/backup.rst:222 msgid "" @@ -5233,11 +5318,11 @@ msgstr "" #: ../../admin/backup.rst:236 ../../admin/install.rst:138 msgid "Database" -msgstr "" +msgstr "База података" #: ../../admin/backup.rst:238 msgid "The actual storage location depends on your database setup." -msgstr "" +msgstr "Стварна локација складиштења зависи од вашег подешавања базе података." #: ../../admin/backup.rst:242 msgid "" @@ -5247,7 +5332,7 @@ msgstr "" #: ../../admin/backup.rst:246 msgid "Native database backup" -msgstr "" +msgstr "Нативна резервна копија базе података" #: ../../admin/backup.rst:248 msgid "" @@ -5266,7 +5351,7 @@ msgstr "" #: ../../admin/backup.rst:257 msgid "Django database backup" -msgstr "" +msgstr "Django резервна копија базе података" #: ../../admin/backup.rst:259 msgid "" @@ -5306,7 +5391,7 @@ msgstr "" #: ../../admin/backup.rst:290 msgid "Dumped data for backups" -msgstr "" +msgstr "Дамповани подаци за резервне копије" #: ../../admin/backup.rst:294 msgid "" @@ -5316,7 +5401,7 @@ msgstr "" #: ../../admin/backup.rst:297 msgid "Stored in :setting:`DATA_DIR` ``/backups``." -msgstr "" +msgstr "Сачувано у :setting:`DATA_DIR` ``/backups``." #: ../../admin/backup.rst:299 msgid "" @@ -5324,16 +5409,21 @@ msgid "" "complete backups. The files are updated daily (requires a running Celery " "beats server, see :ref:`celery`). Currently, this includes:" msgstr "" +"Веблејт овде дампова различите податке, и можете укључити ове фајлове за " +"потпуније резервне копије. Фајлови се ажурирају дневно (потребан је покренут " +"Celery beats сервер, види :ref:`celery`). Тренутно, ово укључује:" #: ../../admin/backup.rst:303 msgid "" "Weblate settings as :file:`settings.py` (there is also expanded version in :" "file:`settings-expanded.py`)." msgstr "" +"Веблејт подешавања као :file:`settings.py` (такође постоји проширена верзија " +"у :file:`settings-expanded.py`)." #: ../../admin/backup.rst:304 msgid "PostgreSQL database backup as :file:`database.sql`." -msgstr "" +msgstr "PostgreSQL резервна копија базе података као :file:`database.sql`." #: ../../admin/backup.rst:305 msgid "Environment dump as :file:`environment.yml`." @@ -5352,11 +5442,11 @@ msgstr "" #: ../../admin/backup.rst:317 msgid "Version control repositories" -msgstr "" +msgstr "Резервни репозиторији контроле верзија" #: ../../admin/backup.rst:319 msgid "Stored in :setting:`DATA_DIR` ``/vcs``." -msgstr "" +msgstr "Сачувано у :setting:`DATA_DIR` ``/vcs``." #: ../../admin/backup.rst:321 msgid "" @@ -5370,12 +5460,13 @@ msgstr "" #: ../../admin/backup.rst:328 msgid "SSH and GPG keys" -msgstr "" +msgstr "SSH и GPG кључеви" #: ../../admin/backup.rst:330 msgid "" "Stored in :setting:`DATA_DIR` ``/ssh`` and :setting:`DATA_DIR` ``/home``." msgstr "" +"Сачувано у :setting:`DATA_DIR` ``/ssh`` и :setting:`DATA_DIR` ``/home``." #: ../../admin/backup.rst:332 msgid "" @@ -5386,11 +5477,11 @@ msgstr "" #: ../../admin/backup.rst:337 msgid "User uploaded files" -msgstr "" +msgstr "Фајлови које је корисник отпремио" #: ../../admin/backup.rst:339 msgid "Stored in :setting:`DATA_DIR` ``/media``." -msgstr "" +msgstr "Сачувано у :setting:`DATA_DIR` ``/media``." #: ../../admin/backup.rst:341 msgid "You should back up all user uploaded files (e.g. :ref:`screenshots`)." @@ -5398,7 +5489,7 @@ msgstr "" #: ../../admin/backup.rst:344 msgid "Celery tasks" -msgstr "" +msgstr "Celery задаци" #: ../../admin/backup.rst:346 msgid "" @@ -5430,11 +5521,11 @@ msgstr "" #: ../../admin/backup.rst:371 msgid "Restoring manual backup" -msgstr "" +msgstr "Обнављање ручне резервне копије" #: ../../admin/backup.rst:373 msgid "Restore all data you have backed up." -msgstr "" +msgstr "Вратите све податке које сте резервисали." #: ../../admin/backup.rst:375 msgid "Update all repositories using :wladmin:`updategit`." @@ -5442,7 +5533,7 @@ msgstr "" #: ../../admin/backup.rst:382 msgid "Moving a Weblate installation" -msgstr "" +msgstr "Премештање Веблејт инсталације" #: ../../admin/backup.rst:384 msgid "" @@ -5459,35 +5550,44 @@ msgstr "" #: ../../admin/checks.rst:2 ../../user/checks.rst:2 msgid "Checks and fixups" -msgstr "" +msgstr "Провере и поправке" #: ../../admin/checks.rst:7 msgid "Custom automatic fixups" -msgstr "" +msgstr "Прилагођене аутоматске поправке" #: ../../admin/checks.rst:9 msgid "" "You can also implement your own automatic fixup in addition to the standard " "ones and include them in :setting:`AUTOFIX_LIST`." msgstr "" +"Такође можете имплементирати своје аутоматске поправке поред стандардних и " +"укључити их у :setting:`AUTOFIX_LIST`." #: ../../admin/checks.rst:12 msgid "" "The automatic fixes are powerful, but can also cause damage; be careful " "when writing one." msgstr "" +"Аутоматске поправке су моћне, али могу и да нанесу штету; будите опрезни " +"када пишете једну." #: ../../admin/checks.rst:15 msgid "" "For example, the following automatic fixup would replace every occurrence of " "the string ``foo`` in a translation with ``bar``:" msgstr "" +"На пример, следећа аутоматска поправка би заменили сваку појаву ниске ``foo``" +" у преводу са ``bar``:" #: ../../admin/checks.rst:21 msgid "" "To install custom checks, provide a fully-qualified path to the Python class " "in the :setting:`AUTOFIX_LIST`, see :ref:`custom-check-modules`." msgstr "" +"Да бисте инсталирали прилагођене провере, пружите потпуно квалификовану " +"путању до Python класе у :setting:`AUTOFIX_LIST`, види :ref:`custom-check-" +"modules`." #: ../../admin/checks.rst:27 msgid "Customizing behavior using flags" @@ -5554,7 +5654,7 @@ msgstr "" #: ../../admin/checks.rst:69 msgid "Here is a list of flags currently accepted:" -msgstr "" +msgstr "Ево листе флага који се тренутно прихватају:" #: ../../admin/checks.rst:71 ../../devel/sphinx.rst:41 msgid "``rst-text``" @@ -5574,12 +5674,17 @@ msgid "" "Uses DOS end-of-line markers instead of Unix ones (``\\r\\n`` instead of " "``\\n``)." msgstr "" +"Користи DOS маркере краја линије уместо Unix маркера (``\\r\\n" +"`` уместо ``\\n" +"``)." #: ../../admin/checks.rst:76 msgid "" "The string is read-only and should not be edited in Weblate, see :ref:`read-" "only-strings`." msgstr "" +"Ниска је само за читање и не би требало да се уређује у Веблејту, види :ref" +":`read-only-strings`." #: ../../admin/checks.rst:77 msgid "``terminology``" @@ -5594,7 +5699,7 @@ msgstr "" #: ../../admin/checks.rst:79 msgid "``priority:N``" -msgstr "" +msgstr "``priority:N``" #: ../../admin/checks.rst:80 msgid "" @@ -5602,10 +5707,13 @@ msgid "" "translation. The default priority is 100, the higher priority a string has, " "the earlier it is offered for translation." msgstr "" +"Приоритет ниске. Више приоритете ниске се прво представљају за превод. " +"Подразумевани приоритет је 100, што значи да што је нижа приоритет ниске, " +"раније ће бити понуђена за превод." #: ../../admin/checks.rst:83 msgid "``max-length:N``" -msgstr "" +msgstr "``max-length:N``" #: ../../admin/checks.rst:84 msgid "" @@ -5622,34 +5730,36 @@ msgid "" "Treat text as XML document, affects :ref:`check-xml-invalid` and :ref:`check-" "xml-tags`." msgstr "" +"Третирај текст као XML документ, утиче на :ref:`check-xml-invalid` и :ref" +":`check-xml-tags`." #: ../../admin/checks.rst:87 msgid "``font-family:NAME``" -msgstr "" +msgstr "``font-family:NAME``" #: ../../admin/checks.rst:88 msgid "Define font-family for rendering checks, see :ref:`fonts`." -msgstr "" +msgstr "Дефинишите font-family за провере рендеровања, види :ref:`fonts`." #: ../../admin/checks.rst:89 msgid "``font-weight:WEIGHT``" -msgstr "" +msgstr "``font-weight:WEIGHT``" #: ../../admin/checks.rst:90 msgid "Define font-weight for rendering checks, see :ref:`fonts`." -msgstr "" +msgstr "Дефинишите font-weight за провере рендеровања, види :ref:`fonts`." #: ../../admin/checks.rst:91 msgid "``font-size:SIZE``" -msgstr "" +msgstr "``font-size:SIZE``" #: ../../admin/checks.rst:92 msgid "Define font-size for rendering checks, see :ref:`fonts`." -msgstr "" +msgstr "Дефинишите font-size за провере рендеровања, види :ref:`fonts`." #: ../../admin/checks.rst:93 msgid "``font-spacing:SPACING``" -msgstr "" +msgstr "``font-spacing:SPACING``" #: ../../admin/checks.rst:94 msgid "Define letter spacing for rendering checks, see :ref:`fonts`." @@ -5686,7 +5796,7 @@ msgstr "" #: ../../admin/checks.rst:100 msgid "" "Placeholder strings expected in translation, see :ref:`check-placeholders`." -msgstr "" +msgstr "Држачи места очекивани у преводу, види :ref:`check-placeholders`." #: ../../admin/checks.rst:101 msgid "``replacements:FROM:TO:FROM2:TO2...``" @@ -5712,7 +5822,7 @@ msgstr "" #: ../../admin/checks.rst:108 msgid "``regex:REGEX``" -msgstr "" +msgstr "``regex:REGEX``" #: ../../admin/checks.rst:109 msgid "Regular expression to match translation, see :ref:`check-regex`." @@ -6659,6 +6769,9 @@ msgid "" "Generally the rule is named ``ignore-*`` for any check, using its " "identifier, so you can use this even for your custom checks." msgstr "" +"Углавном, правило је именовано ``ignore-*`` за сваку проверу, користећи њен " +"идентификатор, тако да можете користити ово чак и за ваше прилагођене " +"провере." #: ../../admin/checks.rst:308 msgid "" @@ -6666,10 +6779,12 @@ msgid "" "string settings and in the translation file itself (for example in GNU " "gettext)." msgstr "" +"Ови флагови се разумеју и у :ref:`component` подешавањима, по подешавањима " +"извора и у самом фајлу превода (на пример у GNU gettext)." #: ../../admin/checks.rst:314 msgid "Enforcing checks" -msgstr "" +msgstr "Спровођење провера" #: ../../admin/checks.rst:316 msgid "" @@ -6693,7 +6808,7 @@ msgstr "Контрола приступа пројекту" #: ../../admin/checks.rst:334 msgid "Managing fonts" -msgstr "" +msgstr "Управљање фонтовима" #: ../../admin/checks.rst:338 msgid "" @@ -6721,26 +6836,32 @@ msgid "" "The font-groups allow you to define different fonts for different languages, " "which is typically needed for non-latin languages:" msgstr "" +"Групе фонтови вам омогућавају да дефинишете различите фонтове за различите " +"језике, што је обично потребно за не-латиничне језике:" #: ../../admin/checks.rst:356 msgid "" "The font-groups are identified by name, which can not contain whitespace or " "special characters, so that it can be easily used in the check definition:" msgstr "" +"Групе фонтови се идентификују по имену, које не може садржати размака или " +"специјалне карактере, тако да се може лако користити у дефиницији провере:" #: ../../admin/checks.rst:361 msgid "Font-family and style is automatically recognized after uploading them:" -msgstr "" +msgstr "Фонт-фамилија и стил се аутоматски препознају након што их отпремите:" #: ../../admin/checks.rst:365 msgid "You can have a number of fonts loaded into Weblate:" -msgstr "" +msgstr "Можете имати број фонтовa учитаних у Веблејт:" #: ../../admin/checks.rst:369 msgid "" "To use the fonts for checking the string length, pass it the appropriate " "flags (see :ref:`custom-checks`). You will probably need the following ones:" msgstr "" +"Да бисте користили фонтове за проверу дужине ниске, пренесите одговарајуће " +"флагове (види :ref:`custom-checks`). Вероватно ће вам бити потребни следећи:" #: ../../admin/checks.rst:372 msgid "``max-size:500`` / ``max-size:300:5``" @@ -6754,15 +6875,16 @@ msgstr "" #: ../../admin/checks.rst:374 msgid "``font-family:ubuntu``" -msgstr "" +msgstr "``font-family:ubuntu``" #: ../../admin/checks.rst:375 msgid "Defines font group to use by specifying its identifier." msgstr "" +"Дефинише групу фонтовa за употребу тако што спецификује њен идентификатор." #: ../../admin/checks.rst:376 msgid "``font-size:22``" -msgstr "" +msgstr "``font-size:22``" #: ../../admin/checks.rst:377 msgid "Defines font size in pixels." @@ -6770,7 +6892,7 @@ msgstr "" #: ../../admin/checks.rst:383 msgid "Writing own checks" -msgstr "" +msgstr "Писање сопствених провера" #: ../../admin/checks.rst:385 msgid "" @@ -6779,14 +6901,18 @@ msgid "" "checks can be adjusted using :setting:`CHECK_LIST`, and you can also add " "custom checks." msgstr "" +"Широк спектар квалитетних провера је уграђен, (види :ref:`checks`), иако " +"можда не покрива све што желите да проверите. Листа извршених провера може " +"се прилагодити коришћењем :setting:`CHECK_LIST`, а можете и додати " +"прилагођене провере." #: ../../admin/checks.rst:389 msgid "Subclass the `weblate.checks.Check`" -msgstr "" +msgstr "Подкласа `weblate.checks.Check`" #: ../../admin/checks.rst:390 msgid "Set a few attributes." -msgstr "" +msgstr "Поставите неколико атрибута." #: ../../admin/checks.rst:391 msgid "" @@ -6796,37 +6922,44 @@ msgstr "" #: ../../admin/checks.rst:394 msgid "Some examples:" -msgstr "" +msgstr "Нека примери:" #: ../../admin/checks.rst:396 msgid "" "To install custom checks, provide a fully-qualified path to the Python class " "in the :setting:`CHECK_LIST`, see :ref:`custom-check-modules`." msgstr "" +"Да бисте инсталирали прилагођене провере, пружите потпуно квалификовану " +"путању до Python класе у :setting:`CHECK_LIST`, видите :ref:`custom-check-" +"modules`." #: ../../admin/checks.rst:400 msgid "Checking translation text does not contain \"foo\"" -msgstr "" +msgstr "Провера да текст превода не садржи \"foo\"" #: ../../admin/checks.rst:402 msgid "" "This is a pretty simple check which just checks whether the translation is " "missing the string \"foo\"." msgstr "" +"Ово је прилично једноставна провера која само проверава да ли превод " +"недостаје низ \"foo\"." #: ../../admin/checks.rst:409 msgid "Checking that Czech translation text plurals differ" -msgstr "" +msgstr "Провера да се множински облик чешког превода разликује" #: ../../admin/checks.rst:411 msgid "" "Check using language info to verify the two plural forms in Czech language " "are not same." msgstr "" +"Провера коришћењем информација о језику да се потврди да два множинска " +"облика у чешком језику нису исти." #: ../../admin/componentlists.rst:4 msgid "Component Lists" -msgstr "" +msgstr "Листе компоненти" #: ../../admin/componentlists.rst:6 msgid "" @@ -6834,12 +6967,17 @@ msgid "" "dashboard, from which users can pick one as their default view. See :ref:" "`dashboard` to learn more." msgstr "" +"Спецификујте више листа компоненти које ће се појавити као опције на " +"контролној табли корисника, из којих корисници могу изабрати једну као свој " +"подразумевани поглед. Види :ref:`dashboard` да бисте сазнали више." #: ../../admin/componentlists.rst:12 msgid "" "A status will be presented for each component list presented on the " "dashboard." msgstr "" +"Статус ће бити представљен за сваку листу компоненти представљену на " +"контролној табли." #: ../../admin/componentlists.rst:14 msgid "" @@ -6848,6 +6986,10 @@ msgid "" "have a name that is displayed to the user, and a slug representing it in the " "URL." msgstr "" +"Имена и садржај листа компоненти могу се специфицирати у администраторском " +"интерфејсу, у секцији :guilabel:`Листе компоненти`. Свака листа компоненти " +"мора имати име које се приказује кориснику, и слаг који је представља у " +"URL-у." #: ../../admin/componentlists.rst:22 msgid "" @@ -6857,13 +6999,15 @@ msgstr "" #: ../../admin/componentlists.rst:26 msgid "Automatic component lists" -msgstr "" +msgstr "Аутоматске листе компоненти" #: ../../admin/componentlists.rst:28 msgid "" "Add components to the list automatically based on their slug by creating :" "guilabel:`Automatic component list assignment` rules." msgstr "" +"Додајте компоненте у листу аутоматски на основу њиховог слага креирањем " +"правила :guilabel:`Аутоматско додељивање листе компоненти`." #: ../../admin/componentlists.rst:31 msgid "" @@ -6877,6 +7021,8 @@ msgid "" "Make a component list containing all the components of your Weblate " "installation." msgstr "" +"Направите листу компоненти која садржи све компоненте ваше Веблејт " +"инсталације." #: ../../admin/componentlists.rst:38 msgid "" @@ -6884,6 +7030,9 @@ msgid "" "regular expression in both the project and the component fields, as shown on " "this image:" msgstr "" +"1. Дефинишите :guilabel:`Аутоматско додељивање листе компоненти` са ``^.*$`` " +"као регуларни израз у пољима пројекта и компоненте, као што је приказано на " +"овој слици:" #: ../../admin/componentlists.rst:41 msgid "" @@ -6895,6 +7044,8 @@ msgstr "" msgid "" "All settings are stored in :file:`settings.py` (as is usual for Django)." msgstr "" +"Сва подешавања су сачувана у :file:`settings.py` (као што је уобичајено за " +"Django)." #: ../../admin/config.rst:10 msgid "" @@ -6913,6 +7064,8 @@ msgid "" "Please also check :doc:`Django's documentation ` for " "parameters configuring Django itself." msgstr "" +"Молимо вас да такође проверите :doc:`Django-ову документацију ` за параметре који конфигуришу сам Django." #: ../../admin/config.rst:24 msgid "ADMINS_CONTACT" @@ -6936,7 +7089,7 @@ msgstr "" #: ../../admin/config.rst:43 msgid "AKISMET_API_KEY" -msgstr "" +msgstr "AKISMET_API_KEY" #: ../../admin/config.rst:45 msgid "" @@ -6944,14 +7097,17 @@ msgid "" "Visit `akismet.com `_ to purchase an API key and " "associate it with a site." msgstr "" +"Веблејт може користити Akismet за проверу долазних анонимних сугестија на " +"спам. Посетите `akismet.com `_ да купите API кључ и " +"повежете га са сајтом." #: ../../admin/config.rst:52 msgid "ANONYMOUS_USER_NAME" -msgstr "" +msgstr "ANONYMOUS_USER_NAME" #: ../../admin/config.rst:54 msgid "Username of users that are not signed in." -msgstr "" +msgstr "Корисничко име корисника који нису пријављени." #: ../../admin/config.rst:58 msgid ":ref:`access-control`" @@ -6959,7 +7115,7 @@ msgstr ":ref:`access-control`" #: ../../admin/config.rst:63 msgid "AUDITLOG_EXPIRY" -msgstr "" +msgstr "AUDITLOG_EXPIRY" #: ../../admin/config.rst:65 msgid "" @@ -6969,21 +7125,23 @@ msgstr "" #: ../../admin/config.rst:68 ../../admin/config.rst:159 msgid "Defaults to 180 days." -msgstr "" +msgstr "Подразумевано 180 дана." #: ../../admin/config.rst:73 msgid "AUTH_LOCK_ATTEMPTS" -msgstr "" +msgstr "AUTH_LOCK_ATTEMPTS" #: ../../admin/config.rst:75 msgid "" "Maximum number of failed authentication attempts before rate limiting is " "applied." msgstr "" +"Максималан број неуспешних покушаја аутентификације пре него што се примени " +"ограничење брзине." #: ../../admin/config.rst:77 msgid "This is currently applied in the following locations:" -msgstr "" +msgstr "Ово се тренутно примењује на следећим локацијама:" #: ../../admin/config.rst:79 msgid "" @@ -6999,7 +7157,7 @@ msgstr "" #: ../../admin/config.rst:84 msgid "Defaults to 10." -msgstr "" +msgstr "Подразумевано 10." #: ../../admin/config.rst:88 msgid ":ref:`rate-limit`" @@ -7007,23 +7165,27 @@ msgstr ":ref:`rate-limit`" #: ../../admin/config.rst:93 msgid "AUTO_UPDATE" -msgstr "" +msgstr "AUTO_UPDATE" #: ../../admin/config.rst:95 msgid "Updates all repositories on a daily basis." -msgstr "" +msgstr "Ажурира све репозиторије на дневној бази." #: ../../admin/config.rst:99 msgid "" "Useful if you are not using :ref:`hooks` to update Weblate repositories " "automatically." msgstr "" +"Корисно ако не користите :ref:`hooks` за аутоматско ажурирање Веблејт " +"репозиторија." #: ../../admin/config.rst:103 msgid "" "On/off options exist in addition to string selection for backward " "compatibility." msgstr "" +"Опције укључивања/искључивања постоје поред избора низа за задовољавање " +"компатибилности." #: ../../admin/config.rst:105 msgid "The options are:" @@ -7031,43 +7193,47 @@ msgstr "" #: ../../admin/config.rst:107 ../../admin/config.rst:475 msgid "``\"none\"``" -msgstr "" +msgstr "``\"none\"``" #: ../../admin/config.rst:108 msgid "No daily updates." -msgstr "" +msgstr "Нема дневних ажурирања." #: ../../admin/config.rst:109 msgid "``\"remote\"`` also ``False``" -msgstr "" +msgstr "``\"remote\"`` такође ``False``" #: ../../admin/config.rst:110 msgid "Only update remotes." -msgstr "" +msgstr "Ажурирајте само реномиране." #: ../../admin/config.rst:111 msgid "``\"full\"`` also ``True``" -msgstr "" +msgstr "``\"full\"`` такође ``True``" #: ../../admin/config.rst:112 msgid "Update remotes and merge working copy." -msgstr "" +msgstr "Ажурирајте удаљене и спојите радну копију." #: ../../admin/config.rst:116 msgid "" "This requires that :ref:`celery` is working, and will take effect after it " "is restarted." msgstr "" +"Ово захтева да :ref:`celery` ради, и имаће ефекат након што се поново " +"покрене." #: ../../admin/config.rst:121 msgid "AVATAR_URL_PREFIX" -msgstr "" +msgstr "AVATAR_URL_PREFIX" #: ../../admin/config.rst:123 msgid "" "Prefix for constructing avatar URLs as: ``${AVATAR_URL_PREFIX}/avatar/" "${MAIL_HASH}?${PARAMS}``. The following services are known to work:" msgstr "" +"Префикс за конструисање УРЛ-ова аватара као: ``${AVATAR_URL_PREFIX}/avatar/" +"${MAIL_HASH}?${PARAMS}``. Следеће услуге су познате да раде:" #: ../../admin/config.rst:127 msgid "Gravatar (default), as per https://gravatar.com/" @@ -7075,7 +7241,7 @@ msgstr "" #: ../../admin/config.rst:128 msgid "``AVATAR_URL_PREFIX = 'https://www.gravatar.com/'``" -msgstr "" +msgstr "``AVATAR_URL_PREFIX = 'https://www.gravatar.com/'``" #: ../../admin/config.rst:129 msgid "Libravatar, as per https://www.libravatar.org/" @@ -7083,16 +7249,17 @@ msgstr "" #: ../../admin/config.rst:130 msgid "``AVATAR_URL_PREFIX = 'https://www.libravatar.org/'``" -msgstr "" +msgstr "``AVATAR_URL_PREFIX = 'https://www.libravatar.org/'``" #: ../../admin/config.rst:134 msgid "" ":ref:`production-cache-avatar`, :setting:`ENABLE_AVATARS`, :ref:`avatars`" msgstr "" +":ref:`production-cache-avatar`, :setting:`ENABLE_AVATARS`, :ref:`avatars`" #: ../../admin/config.rst:141 msgid "AUTH_TOKEN_VALID" -msgstr "" +msgstr "AUTH_TOKEN_VALID" #: ../../admin/config.rst:143 msgid "" @@ -7103,7 +7270,7 @@ msgstr "" #: ../../admin/config.rst:148 msgid "AUTH_PASSWORD_DAYS" -msgstr "" +msgstr "AUTH_PASSWORD_DAYS" #: ../../admin/config.rst:150 #, fuzzy @@ -7123,14 +7290,16 @@ msgid "" "Password changes made prior to Weblate 2.15 will not be accounted for in " "this policy." msgstr "" +"Промене лозинке направљене пре Веблејт 2.15 неће бити узете у обзир у овој " +"политици." #: ../../admin/config.rst:164 msgid "AUTOFIX_LIST" -msgstr "" +msgstr "AUTOFIX_LIST" #: ../../admin/config.rst:166 msgid "List of automatic fixes to apply when saving a string." -msgstr "" +msgstr "Листа аутоматских исправки за примену када се чува ниска." #: ../../admin/config.rst:170 msgid "" @@ -7140,11 +7309,11 @@ msgstr "" #: ../../admin/config.rst:173 msgid "Available fixes:" -msgstr "" +msgstr "Доступне исправке:" #: ../../admin/config.rst:175 msgid "``weblate.trans.autofixes.whitespace.SameBookendingWhitespace``" -msgstr "" +msgstr "``weblate.trans.autofixes.whitespace.SameBookendingWhitespace``" #: ../../admin/config.rst:176 msgid "Matches whitespace at the start and end of the string to the source." @@ -7152,7 +7321,7 @@ msgstr "" #: ../../admin/config.rst:177 msgid "``weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis``" -msgstr "" +msgstr "``weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis``" #: ../../admin/config.rst:178 msgid "" @@ -7162,19 +7331,19 @@ msgstr "" #: ../../admin/config.rst:179 msgid "``weblate.trans.autofixes.chars.RemoveZeroSpace``" -msgstr "" +msgstr "``weblate.trans.autofixes.chars.RemoveZeroSpace``" #: ../../admin/config.rst:180 msgid "Removes zero-width space characters if the source does not contain any." -msgstr "" +msgstr "Уклања карактере нулте ширине ако извор не садржи ниједан." #: ../../admin/config.rst:181 msgid "``weblate.trans.autofixes.chars.RemoveControlChars``" -msgstr "" +msgstr "``weblate.trans.autofixes.chars.RemoveControlChars``" #: ../../admin/config.rst:182 msgid "Removes control characters if the source does not contain any." -msgstr "" +msgstr "Уклања контролне карактере ако извор не садржи ниједан." #: ../../admin/config.rst:183 msgid "``weblate.trans.autofixes.chars.DevanagariDanda``" @@ -7187,21 +7356,23 @@ msgstr "" #: ../../admin/config.rst:185 msgid "``weblate.trans.autofixes.html.BleachHTML``" -msgstr "" +msgstr "``weblate.trans.autofixes.html.BleachHTML``" #: ../../admin/config.rst:186 msgid "" "Removes unsafe HTML markup from strings flagged as ``safe-html`` (see :ref:" "`check-safe-html`)." msgstr "" +"Уклања небезбедне HTML ознаке из низова означених као ``safe-html`` (" +"погледајте :ref:`check-safe-html`)." #: ../../admin/config.rst:188 msgid "You can select which ones to use:" -msgstr "" +msgstr "Можете изабрати које да употребите:" #: ../../admin/config.rst:199 msgid ":ref:`autofix`, :ref:`custom-autofix`" -msgstr "" +msgstr ":ref:`autofix`, :ref:`custom-autofix`" #: ../../admin/config.rst:204 msgid "BACKGROUND_TASKS" @@ -7317,7 +7488,7 @@ msgstr "" #: ../../admin/config.rst:292 ../../admin/config.rst:427 msgid "The following subdirectories usually exist:" -msgstr "" +msgstr "Следећи поддиректоријуми обично постоје:" #: ../../admin/config.rst:294 msgid ":file:`fonts`" @@ -7378,17 +7549,19 @@ msgstr "" #: ../../admin/config.rst:334 msgid "CHECK_LIST" -msgstr "" +msgstr "CHECK_LIST" #: ../../admin/config.rst:336 msgid "List of quality checks to perform on a translation." -msgstr "" +msgstr "Листа провера квалитета за извршавање на преводу." #: ../../admin/config.rst:340 msgid "" "Provide a fully-qualified path to the Python class implementing the check " "interface." msgstr "" +"Пружите потпуно квалификовану путању до Python класе која имплементира " +"интерфејс провере." #: ../../admin/config.rst:343 msgid "Adjust the list of checks to include ones relevant to you." @@ -7404,11 +7577,11 @@ msgstr "" #: ../../admin/config.rst:349 msgid "You can turn off all checks:" -msgstr "" +msgstr "Можете искључити све провере:" #: ../../admin/config.rst:355 msgid "You can turn on only a few:" -msgstr "" +msgstr "Можете укључити само неколико:" #: ../../admin/config.rst:367 msgid "" @@ -7419,21 +7592,23 @@ msgstr "" #: ../../admin/config.rst:373 ../../admin/translating.rst:88 msgid ":ref:`checks`, :ref:`custom-checks`" -msgstr "" +msgstr ":ref:`checks`, :ref:`custom-checks`" #: ../../admin/config.rst:378 msgid "COMMENT_CLEANUP_DAYS" -msgstr "" +msgstr "COMMENT_CLEANUP_DAYS" #: ../../admin/config.rst:380 msgid "" "Delete comments after a given number of days. Defaults to ``None``, meaning " "no deletion at all." msgstr "" +"Обришите коментаре након датог броја дана. Подразумевано је ``None``, што " +"значи да нема брисања уопште." #: ../../admin/config.rst:386 msgid "COMMIT_PENDING_HOURS" -msgstr "" +msgstr "COMMIT_PENDING_HOURS" #: ../../admin/config.rst:388 msgid "" @@ -7483,7 +7658,7 @@ msgstr "" #: ../../admin/config.rst:422 msgid "DATA_DIR" -msgstr "" +msgstr "DATA_DIR" #: ../../admin/config.rst:424 msgid "" @@ -7498,7 +7673,7 @@ msgstr ":file:`home`" #: ../../admin/config.rst:430 msgid "Home directory used for invoking scripts." -msgstr "" +msgstr "Почетни директоријум који се користи за покретање скрипти." #: ../../admin/config.rst:431 msgid ":file:`ssh`" @@ -7506,7 +7681,7 @@ msgstr ":file:`ssh`" #: ../../admin/config.rst:432 msgid "SSH keys and configuration." -msgstr "" +msgstr "SSH кључеви и конфигурација." #: ../../admin/config.rst:433 msgid ":file:`media`" @@ -7563,6 +7738,7 @@ msgid "" "The easiest way to achieve this is to make the user the owner of the " "directory:" msgstr "" +"Најлакши начин да се ово постигне је да корисник буде власник директоријума:" #: ../../admin/config.rst:457 msgid "" @@ -7575,21 +7751,23 @@ msgstr "" #: ../../admin/config.rst:468 msgid "DATABASE_BACKUP" -msgstr "" +msgstr "DATABASE_BACKUP" #: ../../admin/config.rst:470 msgid "" "Whether the database backups should be stored as plain text, compressed or " "skipped. The authorized values are:" msgstr "" +"Да ли би резервне копије базе података требало да буду сачуване као обичан " +"текст, компримоване или прескочене. Дозвољене вредности су:" #: ../../admin/config.rst:473 msgid "``\"plain\"``" -msgstr "" +msgstr "``\"plain\"``" #: ../../admin/config.rst:474 msgid "``\"compressed\"``" -msgstr "" +msgstr "``\"compressed\"``" #: ../../admin/config.rst:479 msgid ":ref:`backup`" @@ -7597,7 +7775,7 @@ msgstr ":ref:`backup`" #: ../../admin/config.rst:484 msgid "DEFAULT_ACCESS_CONTROL" -msgstr "" +msgstr "DEFAULT_ACCESS_CONTROL" #: ../../admin/config.rst:486 msgid "The default access-control setting for new projects:" @@ -7647,11 +7825,11 @@ msgstr ":ref:`subscriptions`" #: ../../admin/config.rst:522 msgid "DEFAULT_RESTRICTED_COMPONENT" -msgstr "" +msgstr "DEFAULT_RESTRICTED_COMPONENT" #: ../../admin/config.rst:526 msgid "The default value for component restriction." -msgstr "" +msgstr "Подразумевана вредност за ограничење компоненте." #: ../../admin/config.rst:530 msgid ":ref:`component-restricted`, :ref:`perm-check`" @@ -7662,6 +7840,8 @@ msgid "" "DEFAULT_ADD_MESSAGE, DEFAULT_ADDON_MESSAGE, DEFAULT_COMMIT_MESSAGE, " "DEFAULT_DELETE_MESSAGE, DEFAULT_MERGE_MESSAGE" msgstr "" +"DEFAULT_ADD_MESSAGE, DEFAULT_ADDON_MESSAGE, DEFAULT_COMMIT_MESSAGE, " +"DEFAULT_DELETE_MESSAGE, DEFAULT_MERGE_MESSAGE" #: ../../admin/config.rst:542 msgid "" @@ -7671,11 +7851,11 @@ msgstr "" #: ../../admin/config.rst:547 msgid ":ref:`markup`, :ref:`component`, :ref:`component-commit_message`" -msgstr "" +msgstr ":ref:`markup`, :ref:`component`, :ref:`component-commit_message`" #: ../../admin/config.rst:555 msgid "DEFAULT_ADDONS" -msgstr "" +msgstr "DEFAULT_ADDONS" #: ../../admin/config.rst:557 msgid "Default add-ons to install for every created component." @@ -7683,7 +7863,7 @@ msgstr "" #: ../../admin/config.rst:561 msgid "This setting affects only newly created components." -msgstr "" +msgstr "Ово подешавање утиче само на новокреиране компоненте." #: ../../admin/config.rst:563 ../../admin/config.rst:1082 #: ../../admin/config.rst:1325 ../../admin/config.rst:1524 @@ -7691,7 +7871,7 @@ msgstr "" #: ../../admin/management.rst:92 ../../admin/management.rst:146 #: ../../admin/management.rst:716 ../../wlc.rst:51 msgid "Example:" -msgstr "" +msgstr "Пример:" #: ../../admin/config.rst:583 msgid ":wladmin:`install_addon`, :doc:`addons`, :setting:`WEBLATE_ADDONS`" @@ -7699,7 +7879,7 @@ msgstr "" #: ../../admin/config.rst:590 msgid "DEFAULT_COMMITER_EMAIL" -msgstr "" +msgstr "DEFAULT_COMMITER_EMAIL" #: ../../admin/config.rst:592 msgid "Committer e-mail address, defaulting to ``noreply@weblate.org``." @@ -7711,7 +7891,7 @@ msgstr "" #: ../../admin/config.rst:601 msgid "DEFAULT_COMMITER_NAME" -msgstr "" +msgstr "DEFAULT_COMMITER_NAME" #: ../../admin/config.rst:603 msgid "Committer name, defaulting to ``Weblate``." @@ -7741,7 +7921,7 @@ msgstr "" #: ../../admin/config.rst:628 msgid "DEFAULT_MERGE_STYLE" -msgstr "" +msgstr "DEFAULT_MERGE_STYLE" #: ../../admin/config.rst:630 msgid ":ref:`component-merge_style` for any new components." @@ -7749,15 +7929,15 @@ msgstr "" #: ../../admin/config.rst:632 msgid "`rebase` - default" -msgstr "" +msgstr "`ребејз` - подразумевани" #: ../../admin/config.rst:633 msgid "`merge`" -msgstr "" +msgstr "`спојити`" #: ../../admin/config.rst:637 msgid ":ref:`component`, :ref:`component-merge_style`" -msgstr "" +msgstr ":ref:`component`, :ref:`component-merge_style`" #: ../../admin/config.rst:643 msgid "DEFAULT_SHARED_TM" @@ -7771,19 +7951,20 @@ msgstr "" #: ../../admin/config.rst:650 msgid "DEFAULT_TRANSLATION_PROPAGATION" -msgstr "" +msgstr "DEFAULT_TRANSLATION_PROPAGATION" #: ../../admin/config.rst:652 msgid "Default setting for translation propagation, defaults to ``True``." msgstr "" +"Подразумевано подешавање за пропагацију превода, подразумевано је ``истина``." #: ../../admin/config.rst:656 msgid ":ref:`component`, :ref:`component-allow_translation_propagation`" -msgstr "" +msgstr ":ref:`component`, :ref:`component-allow_translation_propagation`" #: ../../admin/config.rst:664 msgid "DEFAULT_PULL_MESSAGE" -msgstr "" +msgstr "DEFAULT_PULL_MESSAGE" #: ../../admin/config.rst:666 msgid "Configures the default title and message for pull requests." @@ -7791,7 +7972,7 @@ msgstr "" #: ../../admin/config.rst:671 msgid "ENABLE_AVATARS" -msgstr "" +msgstr "ENABLE_AVATARS" #: ../../admin/config.rst:673 msgid "Whether to turn on Gravatar-based avatars for users. On by default." @@ -7802,15 +7983,18 @@ msgid "" "Avatars are fetched and cached on the server, lowering the risk of leaking " "private info, speeding up the user experience." msgstr "" +"Аватари се преузимају и кеширају на серверу, смањујући ризик од цурења " +"приватних информација, убрзавајући корисничко искуство." #: ../../admin/config.rst:680 msgid "" ":ref:`production-cache-avatar`, :setting:`AVATAR_URL_PREFIX`, :ref:`avatars`" msgstr "" +":ref:`production-cache-avatar`, :setting:`AVATAR_URL_PREFIX`, :ref:`avatars`" #: ../../admin/config.rst:687 msgid "ENABLE_HOOKS" -msgstr "" +msgstr "ENABLE_HOOKS" #: ../../admin/config.rst:689 msgid "Whether to turn on anonymous remote hooks." @@ -7822,7 +8006,7 @@ msgstr ":ref:`hooks`" #: ../../admin/config.rst:698 msgid "ENABLE_HTTPS" -msgstr "" +msgstr "ENABLE_HTTPS" #: ../../admin/config.rst:702 msgid "Weblate now requires https for WebAuthn support." @@ -7833,6 +8017,8 @@ msgid "" "Whether to send links to Weblate as HTTPS or HTTP. This setting affects sent " "e-mails and generated absolute URLs." msgstr "" +"Да ли да се везе ка Веблејту шаљу као HTTPS или HTTP. Ово подешавање утиче " +"на послате имејлове и генерисане апсолутне URL-ове." #: ../../admin/config.rst:707 msgid "" @@ -7869,7 +8055,7 @@ msgstr "" #: ../../admin/config.rst:734 msgid "ENABLE_SHARING" -msgstr "" +msgstr "ENABLE_SHARING" #: ../../admin/config.rst:736 msgid "" @@ -8037,16 +8223,18 @@ msgstr "" #: ../../admin/config.rst:917 msgid "GOOGLE_ANALYTICS_ID" -msgstr "" +msgstr "GOOGLE_ANALYTICS_ID" #: ../../admin/config.rst:919 msgid "" "Google Analytics ID to turn on monitoring of Weblate using Google Analytics." msgstr "" +"Google Analytics ID за укључивање надгледања Веблејта користећи Google " +"Analytics." #: ../../admin/config.rst:924 msgid "HIDE_REPO_CREDENTIALS" -msgstr "" +msgstr "HIDE_REPO_CREDENTIALS" #: ../../admin/config.rst:926 msgid "" @@ -8061,6 +8249,9 @@ msgid "" "will show just ``https://git.example.com/repo.git``. It tries to clean up " "VCS error messages too in a similar manner." msgstr "" +"На пример, уместо ``https://user:password@git.example.com/repo.git`` " +"приказаће само ``https://git.example.com/repo.git``. Такође покушава да " +"очисти VCS поруке о грешкама на сличан начин." #: ../../admin/config.rst:936 msgid "On by default." @@ -8111,11 +8302,11 @@ msgstr "" #: ../../admin/config.rst:977 msgid "IP_BEHIND_REVERSE_PROXY" -msgstr "" +msgstr "IP_BEHIND_REVERSE_PROXY" #: ../../admin/config.rst:979 msgid "Indicates whether Weblate is running behind a reverse proxy." -msgstr "" +msgstr "Означава да ли Веблејт ради иза реверсног проксија." #: ../../admin/config.rst:981 msgid "" @@ -8128,30 +8319,36 @@ msgid "" "Ensure you are actually using a reverse proxy and that it sets this header, " "otherwise users will be able to fake the IP address." msgstr "" +"Осигурати да заиста користите реверсни прокси и да он поставља ово заглавље, " +"у супротном корисници ће моћи да лажирају IP адресу." #: ../../admin/config.rst:991 msgid "This is not on by default." -msgstr "" +msgstr "Ово није укључено подразумевано." #: ../../admin/config.rst:995 msgid "" ":ref:`reverse-proxy`, :ref:`rate-limit`, :setting:`IP_PROXY_HEADER`, :" "setting:`IP_PROXY_OFFSET`" msgstr "" +":ref:`reverse-proxy`, :ref:`rate-limit`, :setting:`IP_PROXY_HEADER`, " +":setting:`IP_PROXY_OFFSET`" #: ../../admin/config.rst:1003 msgid "IP_PROXY_HEADER" -msgstr "" +msgstr "IP_PROXY_HEADER" #: ../../admin/config.rst:1005 msgid "" "Indicates which header Weblate should obtain the IP address from when :" "setting:`IP_BEHIND_REVERSE_PROXY` is turned on." msgstr "" +"Означава из ког заглавља Веблејт треба да добије IP адресу када је " +":setting:`IP_BEHIND_REVERSE_PROXY` укључено." #: ../../admin/config.rst:1008 msgid "Defaults to ``HTTP_X_FORWARDED_FOR``." -msgstr "" +msgstr "Подразумевано је ``HTTP_X_FORWARDED_FOR``." #: ../../admin/config.rst:1012 msgid "" @@ -8159,10 +8356,13 @@ msgid "" "SECURE_PROXY_SSL_HEADER`, :setting:`IP_BEHIND_REVERSE_PROXY`, :setting:" "`IP_PROXY_OFFSET`" msgstr "" +":ref:`reverse-proxy`, :ref:`rate-limit`, " +":setting:`django:SECURE_PROXY_SSL_HEADER`, :setting:`IP_BEHIND_REVERSE_PROXY`" +", :setting:`IP_PROXY_OFFSET`" #: ../../admin/config.rst:1021 msgid "IP_PROXY_OFFSET" -msgstr "" +msgstr "IP_PROXY_OFFSET" #: ../../admin/config.rst:1025 #, fuzzy @@ -8175,6 +8375,8 @@ msgid "" "Indicates which part of :setting:`IP_PROXY_HEADER` is used as client IP " "address." msgstr "" +"Означава који део :setting:`IP_PROXY_HEADER` се користи као IP адреса " +"клијента." #: ../../admin/config.rst:1030 msgid "" @@ -8203,6 +8405,9 @@ msgid "" "SECURE_PROXY_SSL_HEADER`, :setting:`IP_BEHIND_REVERSE_PROXY`, :setting:" "`IP_PROXY_HEADER`" msgstr "" +":ref:`reverse-proxy`, :ref:`rate-limit`, " +":setting:`django:SECURE_PROXY_SSL_HEADER`, :setting:`IP_BEHIND_REVERSE_PROXY`" +", :setting:`IP_PROXY_HEADER`" #: ../../admin/config.rst:1053 msgid "LEGAL_TOS_DATE" @@ -8220,11 +8425,11 @@ msgstr "" #: ../../admin/config.rst:1073 msgid "LEGAL_URL" -msgstr "" +msgstr "LEGAL_URL" #: ../../admin/config.rst:1075 msgid "URL where your Weblate instance shows its legal documents." -msgstr "" +msgstr "URL где ваша Веблејт инстанца приказује своја правна документа." #: ../../admin/config.rst:1079 msgid "" @@ -8238,27 +8443,29 @@ msgstr "" #: ../../admin/config.rst:1095 msgid "LICENSE_EXTRA" -msgstr "" +msgstr "LICENSE_EXTRA" #: ../../admin/config.rst:1097 msgid "Additional licenses to include in the license choices." -msgstr "" +msgstr "Додатне лиценце за укључивање у избор лиценци." #: ../../admin/config.rst:1101 msgid "" "Each license definition should be tuple of its short name, a long name and " "an URL." msgstr "" +"Свака дефиниција лиценце треба да буде пар кратког имена, дугог имена и " +"URL-а." #: ../../admin/config.rst:1103 ../../admin/config.rst:1131 #: ../../admin/config.rst:1258 ../../admin/projects.rst:464 #: ../../formats/xliff.rst:77 msgid "For example:" -msgstr "" +msgstr "На пример:" #: ../../admin/config.rst:1118 msgid "LICENSE_FILTER" -msgstr "" +msgstr "LICENSE_FILTER" #: ../../admin/config.rst:1122 msgid "Setting this to blank value now disables license alert." @@ -8272,7 +8479,7 @@ msgstr "" #: ../../admin/config.rst:1129 msgid "This filter uses the short license names." -msgstr "" +msgstr "Овај филтер користи кратка имена лиценци." #: ../../admin/config.rst:1137 msgid "Following disables the license alert:" @@ -8284,19 +8491,19 @@ msgstr ":ref:`alerts`" #: ../../admin/config.rst:1150 msgid "LICENSE_REQUIRED" -msgstr "" +msgstr "LICENSE_REQUIRED" #: ../../admin/config.rst:1152 msgid "Defines whether the license attribute in :ref:`component` is required." -msgstr "" +msgstr "Дефинише да ли је атрибут лиценце у :ref:`component` обавезан." #: ../../admin/config.rst:1156 msgid "This is off by default." -msgstr "" +msgstr "Ово је искључено подразумевано." #: ../../admin/config.rst:1161 msgid "LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH" -msgstr "" +msgstr "LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH" #: ../../admin/config.rst:1163 msgid "" @@ -8312,7 +8519,7 @@ msgstr "" #: ../../admin/config.rst:1172 msgid "Defaults to ``True``." -msgstr "" +msgstr "Подразумевано је ``истина``." #: ../../admin/config.rst:1178 msgid "LOCALIZE_CDN_URL and LOCALIZE_CDN_PATH" @@ -8336,7 +8543,7 @@ msgstr ":ref:`addon-weblate.cdn.cdnjs`" #: ../../admin/config.rst:1196 msgid "LOGIN_REQUIRED_URLS" -msgstr "" +msgstr "LOGIN_REQUIRED_URLS" #: ../../admin/config.rst:1198 msgid "" @@ -8346,13 +8553,15 @@ msgstr "" #: ../../admin/config.rst:1202 msgid "This allows you to password protect a whole installation using:" -msgstr "" +msgstr "Ово вам омогућава да лозинком заштитите целу инсталацију користећи:" #: ../../admin/config.rst:1213 msgid "" "It is desirable to lock down API access as well, as shown in the above " "example." msgstr "" +"Пожељно је закључати приступ API-ју такође, као што је приказано у горњем " +"примеру." #: ../../admin/config.rst:1217 msgid ":setting:`REQUIRE_LOGIN`" @@ -8360,7 +8569,7 @@ msgstr "" #: ../../admin/config.rst:1222 msgid "LOGIN_REQUIRED_URLS_EXCEPTIONS" -msgstr "" +msgstr "LOGIN_REQUIRED_URLS_EXCEPTIONS" #: ../../admin/config.rst:1224 msgid "" @@ -8376,7 +8585,7 @@ msgstr "" #: ../../admin/config.rst:1233 msgid "MATOMO_SITE_ID" -msgstr "" +msgstr "MATOMO_SITE_ID" #: ../../admin/config.rst:1235 msgid "" @@ -8386,15 +8595,15 @@ msgstr "" #: ../../admin/config.rst:1239 ../../admin/config.rst:1256 msgid "This integration does not support the Matomo Tag Manager." -msgstr "" +msgstr "Ова интеграција не подржава Matomo Менаџер Ознака." #: ../../admin/config.rst:1243 msgid ":setting:`MATOMO_URL`" -msgstr "" +msgstr ":setting:`MATOMO_URL`" #: ../../admin/config.rst:1249 msgid "MATOMO_URL" -msgstr "" +msgstr "MATOMO_URL" #: ../../admin/config.rst:1251 msgid "" @@ -8405,17 +8614,19 @@ msgstr "" #: ../../admin/config.rst:1267 msgid ":setting:`MATOMO_SITE_ID`" -msgstr "" +msgstr ":setting:`MATOMO_SITE_ID`" #: ../../admin/config.rst:1272 msgid "NEARBY_MESSAGES" -msgstr "" +msgstr "NEARBY_MESSAGES" #: ../../admin/config.rst:1274 msgid "" "How many strings to show around the currently translated string. This is " "just a default value, users can adjust this in :ref:`user-profile`." msgstr "" +"Колико низова приказати око тренутно преведене ниске. Ово је само " +"подразумевана вредност, корисници могу прилагодити ово у :ref:`user-profile`." #: ../../admin/config.rst:1279 msgid "DEFAULT_PAGE_LIMIT" @@ -8591,29 +8802,34 @@ msgstr "" #: ../../admin/config.rst:1467 msgid "RATELIMIT_ATTEMPTS" -msgstr "" +msgstr "RATELIMIT_ATTEMPTS" #: ../../admin/config.rst:1469 msgid "" "Maximum number of authentication attempts before rate limiting is applied." msgstr "" +"Максималан број покушаја аутентификације пре него што се примени ограничење " +"брзине." #: ../../admin/config.rst:1471 msgid "Defaults to 5." -msgstr "" +msgstr "Подразумевано је 5." #: ../../admin/config.rst:1475 msgid "" ":ref:`rate-limit`, :setting:`RATELIMIT_WINDOW`, :setting:`RATELIMIT_LOCKOUT`" msgstr "" +":ref:`rate-limit`, :setting:`RATELIMIT_WINDOW`, :setting:`RATELIMIT_LOCKOUT`" #: ../../admin/config.rst:1482 msgid "RATELIMIT_WINDOW" -msgstr "" +msgstr "RATELIMIT_WINDOW" #: ../../admin/config.rst:1484 msgid "How long authentication is accepted after rate limiting applies." msgstr "" +"Колико дуго је аутентификација прихваћена након што се примени ограничење " +"брзине." #: ../../admin/config.rst:1486 msgid "An amount of seconds, defaulting to 300 (5 minutes)." @@ -8624,27 +8840,32 @@ msgid "" ":ref:`rate-limit`, :setting:`RATELIMIT_ATTEMPTS`, :setting:" "`RATELIMIT_LOCKOUT`" msgstr "" +":ref:`rate-limit`, :setting:`RATELIMIT_ATTEMPTS`, " +":setting:`RATELIMIT_LOCKOUT`" #: ../../admin/config.rst:1497 msgid "RATELIMIT_LOCKOUT" -msgstr "" +msgstr "RATELIMIT_LOCKOUT" #: ../../admin/config.rst:1499 msgid "How long authentication is locked after rate limiting applies." msgstr "" +"Колико дуго је аутентификација закључана након што се примени ограничење " +"брзине." #: ../../admin/config.rst:1501 msgid "An amount of seconds defaulting to 600 (10 minutes)." -msgstr "" +msgstr "Количина секунди која подразумевано износи 600 (10 минута)." #: ../../admin/config.rst:1505 msgid "" ":ref:`rate-limit`, :setting:`RATELIMIT_ATTEMPTS`, :setting:`RATELIMIT_WINDOW`" msgstr "" +":ref:`rate-limit`, :setting:`RATELIMIT_ATTEMPTS`, :setting:`RATELIMIT_WINDOW`" #: ../../admin/config.rst:1512 msgid "REGISTRATION_ALLOW_BACKENDS" -msgstr "" +msgstr "REGISTRATION_ALLOW_BACKENDS" #: ../../admin/config.rst:1516 msgid "" @@ -8670,7 +8891,7 @@ msgstr "" #: ../../admin/config.rst:1542 msgid "REGISTRATION_CAPTCHA" -msgstr "" +msgstr "REGISTRATION_CAPTCHA" #: ../../admin/config.rst:1544 msgid "" @@ -8683,42 +8904,45 @@ msgid "" "If turned on, a CAPTCHA is added to all pages where a users enters their e-" "mail address:" msgstr "" +"Ако је укључено, капча се додаје на све странице где корисници уносе своју " +"имејл адресу:" #: ../../admin/config.rst:1548 msgid "New account registration." -msgstr "" +msgstr "Регистрација новог налога." #: ../../admin/config.rst:1549 msgid "Password recovery." -msgstr "" +msgstr "Опоравак лозинке." #: ../../admin/config.rst:1550 msgid "Adding e-mail to an account." -msgstr "" +msgstr "Додавање имејла на налог." #: ../../admin/config.rst:1551 msgid "Contact form for users that are not signed in." -msgstr "" +msgstr "Контакт форма за кориснике који нису пријављени." #: ../../admin/config.rst:1556 msgid "REGISTRATION_EMAIL_MATCH" -msgstr "" +msgstr "REGISTRATION_EMAIL_MATCH" #: ../../admin/config.rst:1558 msgid "Allows you to filter which e-mail addresses can register." -msgstr "" +msgstr "Омогућава вам да филтрирате које имејл адресе могу да се региструју." #: ../../admin/config.rst:1560 msgid "Defaults to ``.*``, which allows any e-mail address to be registered." msgstr "" +"Подразумевано је ``.*``, што омогућава регистрацију било које имејл адресе." #: ../../admin/config.rst:1562 msgid "You can use it to restrict registration to a single e-mail domain:" -msgstr "" +msgstr "Можете га користити да ограничите регистрацију на један имејл домен:" #: ../../admin/config.rst:1571 msgid "REGISTRATION_OPEN" -msgstr "" +msgstr "REGISTRATION_OPEN" #: ../../admin/config.rst:1573 msgid "" @@ -8739,6 +8963,9 @@ msgid "" "just hides the registration form, but new users might still be able to sign " "in and create accounts." msgstr "" +"Ако користите методе аутентификације треће стране као што је :ref:`ldap-auth`" +", само скрива форму за регистрацију, али нови корисници можда и даље могу да " +"се пријаве и креирају налоге." #: ../../admin/config.rst:1588 msgid "" @@ -8765,13 +8992,15 @@ msgstr "" #: ../../admin/config.rst:1611 msgid "REPOSITORY_ALERT_THRESHOLD" -msgstr "" +msgstr "REPOSITORY_ALERT_THRESHOLD" #: ../../admin/config.rst:1615 msgid "" "Threshold for triggering an alert for outdated repositories, or ones that " "contain too many changes. Defaults to 25." msgstr "" +"Праг за покретање упозорења за застарела складишта, или она која садрже " +"превише промена. Подразумевано је 25." #: ../../admin/config.rst:1625 msgid "REQUIRE_LOGIN" @@ -8791,11 +9020,11 @@ msgstr "" #: ../../admin/config.rst:1640 msgid "SENTRY_DSN" -msgstr "" +msgstr "SENTRY_DSN" #: ../../admin/config.rst:1642 msgid "Sentry DSN to use for :ref:`collecting-errors`." -msgstr "" +msgstr "Sentry DSN за употребу при :ref:`collecting-errors`." #: ../../admin/config.rst:1646 msgid "" @@ -8871,7 +9100,7 @@ msgstr "" #: ../../admin/config.rst:1705 msgid "SIMPLIFY_LANGUAGES" -msgstr "" +msgstr "SIMPLIFY_LANGUAGES" #: ../../admin/config.rst:1707 msgid "" @@ -8880,10 +9109,14 @@ msgid "" "usually the desired behavior, as it simplifies listing languages for these " "default combinations." msgstr "" +"Користите једноставне кодове језика за подразумеване комбинације језика/" +"држава. На пример, превод ``fr_FR`` ће користити код језика ``fr``. Ово је " +"обично жељено понашање, јер поједностављује листање језика за ове " +"подразумеване комбинације." #: ../../admin/config.rst:1712 msgid "Turn this off if you want to different translations for each variant." -msgstr "" +msgstr "Искључите ово ако желите различите преводе за сваку варијанту." #: ../../admin/config.rst:1717 msgid "SITE_DOMAIN" @@ -8920,15 +9153,15 @@ msgstr "" #: ../../admin/config.rst:1756 msgid "SITE_TITLE" -msgstr "" +msgstr "SITE_TITLE" #: ../../admin/config.rst:1758 msgid "Site title to be used for the website and sent e-mails." -msgstr "" +msgstr "Наслов сајта који ће се користити за вебсајт и послате имејлове." #: ../../admin/config.rst:1763 msgid "SPECIAL_CHARS" -msgstr "" +msgstr "SPECIAL_CHARS" #: ../../admin/config.rst:1765 msgid "" @@ -8938,11 +9171,11 @@ msgstr "" #: ../../admin/config.rst:1767 msgid "The default value is:" -msgstr "" +msgstr "Подразумевана вредност је:" #: ../../admin/config.rst:1776 msgid "SINGLE_PROJECT" -msgstr "" +msgstr "SINGLE_PROJECT" #: ../../admin/config.rst:1778 msgid "" @@ -8981,7 +9214,7 @@ msgstr "" #: ../../admin/config.rst:1818 msgid "STATUS_URL" -msgstr "" +msgstr "STATUS_URL" #: ../../admin/config.rst:1820 msgid "The URL where your Weblate instance reports its status." @@ -8989,13 +9222,15 @@ msgstr "" #: ../../admin/config.rst:1825 msgid "SUGGESTION_CLEANUP_DAYS" -msgstr "" +msgstr "SUGGESTION_CLEANUP_DAYS" #: ../../admin/config.rst:1827 msgid "" "Automatically deletes suggestions after a given number of days. Defaults to " "``None``, meaning no deletions." msgstr "" +"Аутоматски брише сугестије након датог броја дана. Подразумевано је ``None``" +", што значи нема брисања." #: ../../admin/config.rst:1833 msgid "SUPPORT_STATUS_CHECK" @@ -9050,7 +9285,7 @@ msgstr ":ref:`included-languages`" #: ../../admin/config.rst:1879 msgid "URL_PREFIX" -msgstr "" +msgstr "URL_PREFIKS" #: ../../admin/config.rst:1881 msgid "" @@ -9064,16 +9299,21 @@ msgid "" "prefix. For example with WSGI, this can be achieved by setting " "``WSGIScriptAlias``." msgstr "" +"Да бисте користили ово подешавање, такође је потребно да конфигуришете ваш " +"сервер да уклони овај префикс. На пример, са WSGI, ово се може постићи " +"подешавањем ``WSGIScriptAlias``." #: ../../admin/config.rst:1891 msgid "The prefix should start with a ``/``." -msgstr "" +msgstr "Префикс треба да почиње са ``/``." #: ../../admin/config.rst:1901 msgid "" "This setting does not work with Django's built-in server, you would have to " "adjust :file:`urls.py` to contain this prefix." msgstr "" +"Ово подешавање не ради са уграђеним сервером Django, мораћете да прилагодите " +":file:`urls.py` да садржи овај префикс." #: ../../admin/config.rst:1907 msgid "VCS_API_DELAY" @@ -9104,11 +9344,11 @@ msgstr "" #: ../../admin/config.rst:1924 msgid "VCS_BACKENDS" -msgstr "" +msgstr "VCS_BACKENDI" #: ../../admin/config.rst:1926 msgid "Configuration of available VCS backends." -msgstr "" +msgstr "Конфигурација доступних VCS бекенда." #: ../../admin/config.rst:1930 msgid "Weblate tries to use all supported back-ends you have the tools for." @@ -9117,6 +9357,7 @@ msgstr "" #: ../../admin/config.rst:1934 msgid "You can limit choices or add custom VCS back-ends by using this." msgstr "" +"Можете ограничити изборе или додати прилагођене VCS бекенде користећи ово." #: ../../admin/config.rst:1942 ../../faq.rst:517 msgid ":ref:`vcs`" @@ -9124,11 +9365,11 @@ msgstr ":ref:`vcs`" #: ../../admin/config.rst:1947 msgid "VCS_CLONE_DEPTH" -msgstr "" +msgstr "VCS_CLONE_DEPTH" #: ../../admin/config.rst:1949 msgid "Configures how deep cloning of repositories Weblate should do." -msgstr "" +msgstr "Конфигурише колико дубоко Weblate треба да клонира складишта." #: ../../admin/config.rst:1953 msgid "" @@ -9138,6 +9379,11 @@ msgid "" "`addons`), you might want to increase the depth or turn off shallow clones " "completely by setting this to 0." msgstr "" +"Тренутно је ово подржано само у :ref:`vcs-git`. По подразумеваној вредности, " +"Weblate ради површне клонирања складишта како би клонирање било брже и " +"уштедело простор на диску. У зависности од ваше употребе (на пример, када " +"користите прилагођене :ref:`addons`), можда ћете желети да повећате дубину " +"или потпуно искључите плитке клонове подешавањем ове вредности на 0." #: ../../admin/config.rst:1960 msgid "" @@ -9145,10 +9391,13 @@ msgid "" "'`` error when pushing from Weblate, turn off shallow clones " "completely by setting:" msgstr "" +"У случају да добијете ``fatal: protocol error: expected old/new/ref, got " +"'shallow '`` грешку када покушавате да пошаљете из Веблејта, " +"искључите потпуно плитке клонове подешавањем:" #: ../../admin/config.rst:1970 msgid "WEBLATE_ADDONS" -msgstr "" +msgstr "WEBLATE_ADDONS" #: ../../admin/config.rst:1972 msgid "" @@ -9200,11 +9449,11 @@ msgstr "" #: ../../admin/config.rst:2050 msgid "List of file formats available for use." -msgstr "" +msgstr "Листа формата фајлова доступних за употребу." #: ../../admin/config.rst:2054 msgid "The default list already has the common formats." -msgstr "" +msgstr "Подразумевана листа већ има уобичајене формате." #: ../../admin/config.rst:2064 msgid "WEBLATE_MACHINERY" @@ -9225,6 +9474,7 @@ msgstr "" #: ../../admin/config.rst:2079 msgid "Identity used by Weblate to sign Git commits, for example:" msgstr "" +"Идентитет који Веблејт користи за пријављивање Git урезивања, на пример:" #: ../../admin/config.rst:2085 msgid "" @@ -9300,6 +9550,9 @@ msgid "" "development. This way translators can work on translations the entire time, " "instead of working through huge amount of new text just prior to release." msgstr "" +"Постоји инфраструктура која омогућава да ваш превод блиско прати развој. На " +"овај начин преводиоци могу радити на преводима цело време, уместо да раде " +"кроз огромну количину новог текста непосредно пре објаве." #: ../../admin/continuous.rst:12 msgid "" @@ -9309,11 +9562,11 @@ msgstr "" #: ../../admin/continuous.rst:15 msgid "This is the process:" -msgstr "" +msgstr "Ово је процес:" #: ../../admin/continuous.rst:17 msgid "Developers make changes and push them to the VCS repository." -msgstr "" +msgstr "Развојни програмери праве промене и шаљу их у VCS складиште." #: ../../admin/continuous.rst:18 msgid "" @@ -9331,6 +9584,8 @@ msgid "" "Translators submit translations using the Weblate web interface, or upload " "offline changes." msgstr "" +"Преводиоци предају преводе користећи Веблејт веб интерфејс, или учитавају " +"офлајн промене." #: ../../admin/continuous.rst:21 msgid "" @@ -9353,13 +9608,14 @@ msgstr "" #: ../../admin/continuous.rst:79 msgid "Updating repositories" -msgstr "" +msgstr "Ажурирање складишта" #: ../../admin/continuous.rst:81 msgid "" "You should set up some way of updating backend repositories from their " "source." msgstr "" +"Треба да поставите неки начин ажурирања бекенд складишта из њиховог извора." #: ../../admin/continuous.rst:84 msgid "" @@ -9395,12 +9651,16 @@ msgid "" "Manually trigger update either in the repository management or using :ref:" "`api` or :ref:`wlc`" msgstr "" +"Ручно активирајте ажурирање било у управљању складиштем или користећи " +":ref:`api` или :ref:`wlc`" #: ../../admin/continuous.rst:95 msgid "" "Enable :setting:`AUTO_UPDATE` to automatically update all components on your " "Weblate instance" msgstr "" +"Омогућите :setting:`AUTO_UPDATE` да аутоматски ажурира све компоненте на " +"вашој Веблејт инстанци." #: ../../admin/continuous.rst:97 msgid "" @@ -9416,7 +9676,7 @@ msgstr "" #: ../../admin/continuous.rst:105 msgid "Avoiding merge conflicts" -msgstr "" +msgstr "Избегавање конфликата спајања" #: ../../admin/continuous.rst:107 msgid "" @@ -9425,6 +9685,10 @@ msgid "" "edits outside Weblate or integrate Weblate into your updating process, so " "that it flushes changes prior to updating the files outside Weblate." msgstr "" +"Конфликти спајања из Веблејта настају када је исти фајл промењен и у " +"Веблејту и ван њега. Постоје два приступа за решавање тога - избегавање " +"измена ван Веблејта или интегрисање Веблејта у ваш процес ажурирања, тако да " +"очисти промене пре него што ажурира фајлове ван Веблејта." #: ../../admin/continuous.rst:112 msgid "" @@ -9445,16 +9709,21 @@ msgid "" "push all pending changes and lock the translation while you are doing " "changes on your side." msgstr "" +"Други приступ може се постићи коришћењем :ref:`api` да принудите Веблејт да " +"пошаље све промене на чекању и закључа превод док правите промене на вашој " +"страни." #: ../../admin/continuous.rst:126 msgid "The script for doing updates can look like this:" -msgstr "" +msgstr "Скрипта за извршавање ажурирања може изгледати овако:" #: ../../admin/continuous.rst:147 msgid "" "If you have multiple components sharing same repository, you need to lock " "them all separately:" msgstr "" +"Ако имате више компоненти које деле исто складиште, требате их све закључати " +"одвојено:" #: ../../admin/continuous.rst:158 msgid "" @@ -9462,6 +9731,9 @@ msgid "" "to control Weblate remotely. You can also achieve this using any HTTP client " "instead of wlc, e.g. curl, see :ref:`api`." msgstr "" +"Пример користи :ref:`wlc`, који захтева конфигурацију (API кључеве) да би " +"могао да контролише Веблејт на даљину. Ово можете постићи и коришћењем било " +"ког HTTP клијента уместо wlc, нпр. curl, погледајте :ref:`api`." #: ../../admin/continuous.rst:163 msgid "Avoiding merge conflicts on Weblate originated changes" @@ -9526,11 +9798,11 @@ msgstr ":ref:`wlc`" #: ../../admin/continuous.rst:194 msgid "Automatically receiving changes from GitHub" -msgstr "" +msgstr "Аутоматско примање промена из GitHub-а" #: ../../admin/continuous.rst:196 msgid "Weblate comes with native support for GitHub." -msgstr "" +msgstr "Веблејт долази са нативном подршком за GitHub." #: ../../admin/continuous.rst:198 msgid "" @@ -9539,6 +9811,10 @@ msgid "" "correct setup without having to set much up. It can also be used for pushing " "changes back." msgstr "" +"Ако користите Хостовани Веблејт, препоручени приступ је да инсталирате `" +"Веблејт апликацију `_, на тај начин ћете " +"добити исправно подешавање без потребе за много подешавања. Такође се може " +"користити за слање промена назад." #: ../../admin/continuous.rst:203 msgid "" @@ -9546,6 +9822,9 @@ msgid "" "Weblate Webhook in the repository settings (:guilabel:`Webhooks`) as shown " "on the image below:" msgstr "" +"Да бисте добили обавештења о сваком пуштању у GitHub складиште, додајте " +"Веблејт вебхук у подешавањима складишта (:guilabel:`Webhooks`) као што је " +"приказано на слици испод:" #: ../../admin/continuous.rst:209 msgid "" @@ -9553,20 +9832,25 @@ msgid "" "example for the Hosted Weblate service, this is ``https://hosted.weblate.org/" "hooks/github/``." msgstr "" +"За URL терета, додајте ``/hooks/github/`` на ваш Веблејт URL, на пример за " +"Хостовани Веблејт сервис, ово је ``https://hosted.weblate.org/hooks/github/" +"``." #: ../../admin/continuous.rst:212 msgid "" "You can leave other values at default settings (Weblate can handle both " "content types and consumes just the `push` event)." msgstr "" +"Можете оставити друге вредности на подразумеваним подешавањима (Веблејт може " +"да обрађује оба типа садржаја и конзумира само `push` догађај)." #: ../../admin/continuous.rst:217 msgid ":http:post:`/hooks/github/`, :ref:`hosted-push`" -msgstr "" +msgstr ":http:post:`/hooks/github/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:222 msgid "Automatically receiving changes from Bitbucket" -msgstr "" +msgstr "Аутоматско примање промена из Bitbucket-а" #: ../../admin/continuous.rst:224 msgid "" @@ -9575,14 +9859,18 @@ msgid "" "Weblate installation (for example ``https://hosted.weblate.org/hooks/" "bitbucket/``)." msgstr "" +"Веблејт има подршку за Bitbucket вебхукове, додајте вебкуку која се активира " +"при пуштању у складиште, са одредиштем на ``/hooks/bitbucket/`` URL на вашој " +"Веблејт инсталацији (на пример ``https://hosted.weblate.org/hooks/bitbucket/" +"``)." #: ../../admin/continuous.rst:233 msgid ":http:post:`/hooks/bitbucket/`, :ref:`hosted-push`" -msgstr "" +msgstr ":http:post:`/hooks/bitbucket/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:238 msgid "Automatically receiving changes from GitLab" -msgstr "" +msgstr "Аутоматско примање промена из GitLab-а" #: ../../admin/continuous.rst:240 msgid "" @@ -9590,14 +9878,17 @@ msgid "" "to ``/hooks/gitlab/`` URL on your Weblate installation (for example " "``https://hosted.weblate.org/hooks/gitlab/``)." msgstr "" +"Веблејт има подршку за GitLab куке, додајте вебкуку пројекта са дестинацијом " +"на ``/hooks/gitlab/`` URL на вашој Веблејт инсталацији (на пример " +"``https://hosted.weblate.org/hooks/gitlab/``)." #: ../../admin/continuous.rst:246 msgid ":http:post:`/hooks/gitlab/`, :ref:`hosted-push`" -msgstr "" +msgstr ":http:post:`/hooks/gitlab/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:251 msgid "Automatically receiving changes from Pagure" -msgstr "" +msgstr "Аутоматско примање промена из Pagure-а" #: ../../admin/continuous.rst:253 msgid "" @@ -9606,14 +9897,18 @@ msgid "" "hosted.weblate.org/hooks/pagure/``). This can be done in :guilabel:`Activate " "Web-hooks` under :guilabel:`Project options`:" msgstr "" +"Веблејт има подршку за Pagure куке, додајте вебкуку са дестинацијом на ``/" +"hooks/pagure/`` URL на вашој Веблејт инсталацији (на пример ``https://hosted." +"weblate.org/hooks/pagure/``). Ово се може урадити у :guilabel:`Активирајте " +"веб-куке` под :guilabel:`Опције пројекта`:" #: ../../admin/continuous.rst:262 msgid ":http:post:`/hooks/pagure/`, :ref:`hosted-push`" -msgstr "" +msgstr ":http:post:`/hooks/pagure/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:267 msgid "Automatically receiving changes from Azure Repos" -msgstr "" +msgstr "Аутоматско примање промена из Azure Repos" #: ../../admin/continuous.rst:269 msgid "" @@ -9633,7 +9928,7 @@ msgstr "" #: ../../admin/continuous.rst:284 msgid "Automatically receiving changes from Gitea Repos" -msgstr "" +msgstr "Аутоматско примање промена из Gitea Repos" #: ../../admin/continuous.rst:286 msgid "" @@ -9643,16 +9938,23 @@ msgid "" "gitea/``). This can be done in :guilabel:`Webhooks` under repository :" "guilabel:`Settings`." msgstr "" +"Веблејт има подршку за Gitea вебкуке, додајте :guilabel:`Gitea вебкуку` за " +":guilabel:`Push догађаје` догађај са дестинацијом на ``/hooks/gitea/`` URL " +"на вашој Веблејт инсталацији (на пример ``https://hosted.weblate.org/hooks/" +"gitea/``). Ово се може урадити у :guilabel:`Вебкукама` под складиштем " +":guilabel:`Подешавања`." #: ../../admin/continuous.rst:293 msgid "" "`Webhooks in Gitea manual `_, :http:" "post:`/hooks/gitea/`, :ref:`hosted-push`" msgstr "" +"`Вебкуке у Gitea приручнику `_, " +":http:post:`/hooks/gitea/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:299 msgid "Automatically receiving changes from Gitee Repos" -msgstr "" +msgstr "Аутоматско примање промена из Gitee Repos" #: ../../admin/continuous.rst:301 msgid "" @@ -9662,16 +9964,23 @@ msgid "" "``). This can be done in :guilabel:`WebHooks` under repository :guilabel:" "`Management`." msgstr "" +"Веблејт има подршку за Gitee вебкуке, додајте :guilabel:`WebHook` за " +":guilabel:`Push` догађај са дестинацијом на ``/hooks/gitee/`` URL на вашој " +"Веблејт инсталацији (на пример ``https://hosted.weblate.org/hooks/gitee/``). " +"Ово се може урадити у :guilabel:`WebHooks` под складиштем " +":guilabel:`Управљање`." #: ../../admin/continuous.rst:308 msgid "" "`Webhooks in Gitee manual `_, :http:" "post:`/hooks/gitee/`, :ref:`hosted-push`" msgstr "" +"`Вебкуке у Gitee приручнику `_, " +":http:post:`/hooks/gitee/`, :ref:`hosted-push`" #: ../../admin/continuous.rst:312 msgid "Automatically updating repositories nightly" -msgstr "" +msgstr "Аутоматско ажурирање складишта сваке ноћи" #: ../../admin/continuous.rst:314 msgid "" @@ -9679,10 +9988,13 @@ msgid "" "performance when merging changes later. You can optionally turn this into " "doing nightly merges as well, by enabling :setting:`AUTO_UPDATE`." msgstr "" +"Веблејт аутоматски преузима удаљена складишта сваке ноћи како би побољшао " +"перформансе при спајању промена касније. Можете опционално претворити ово у " +"ноћна спајања, омогућавајући :setting:`AUTO_UPDATE`." #: ../../admin/continuous.rst:321 msgid "Pushing changes from Weblate" -msgstr "" +msgstr "Пуштање промена из Веблејта" #: ../../admin/continuous.rst:323 msgid "" @@ -9700,6 +10012,8 @@ msgid "" "The push options differ based on the :ref:`vcs` used, more details are found " "in that chapter." msgstr "" +"Опције пуштања се разликују у зависности од :ref:`vcs` који се користи, више " +"детаља се налази у том поглављу." #: ../../admin/continuous.rst:332 msgid "" @@ -9719,7 +10033,7 @@ msgstr "" #: ../../admin/continuous.rst:342 msgid "Desired setup" -msgstr "" +msgstr "Пожељно подешавање" #: ../../admin/continuous.rst:342 ../../api.rst:1255 msgid ":ref:`component-vcs`" @@ -9735,7 +10049,7 @@ msgstr ":ref:`component-push_branch`" #: ../../admin/continuous.rst:344 ../../admin/continuous.rst:350 msgid "No push" -msgstr "" +msgstr "Нема пуштања" #: ../../admin/continuous.rst:344 ../../admin/continuous.rst:346 #: ../../admin/continuous.rst:348 @@ -9748,16 +10062,16 @@ msgstr ":ref:`vcs-git`" #: ../../admin/continuous.rst:364 ../../admin/continuous.rst:368 #: ../../admin/continuous.rst:372 msgid "`empty`" -msgstr "" +msgstr "`празно`" #: ../../admin/continuous.rst:346 ../../admin/continuous.rst:352 msgid "Push directly" -msgstr "" +msgstr "Пуштајте директно" #: ../../admin/continuous.rst:346 ../../admin/continuous.rst:348 #: ../../admin/continuous.rst:352 ../../admin/continuous.rst:354 msgid "SSH URL" -msgstr "" +msgstr "SSH URL" #: ../../admin/continuous.rst:348 ../../admin/continuous.rst:354 msgid "Push to separate branch" @@ -9768,7 +10082,7 @@ msgstr "" #: ../../admin/continuous.rst:366 ../../admin/continuous.rst:370 #: ../../admin/continuous.rst:374 msgid "Branch name" -msgstr "" +msgstr "Име гране" #: ../../admin/continuous.rst:350 ../../admin/continuous.rst:352 #: ../../admin/continuous.rst:354 ../../admin/install.rst:241 @@ -9777,7 +10091,7 @@ msgstr ":ref:`vcs-mercurial`" #: ../../admin/continuous.rst:356 msgid "GitHub pull request from fork" -msgstr "" +msgstr "GitHub захтев за повлачење из форка" #: ../../admin/continuous.rst:356 ../../admin/continuous.rst:358 msgid ":ref:`vcs-github`" @@ -9785,7 +10099,7 @@ msgstr ":ref:`vcs-github`" #: ../../admin/continuous.rst:358 msgid "GitHub pull request from branch" -msgstr "" +msgstr "GitHub захтев за повлачење из гране" #: ../../admin/continuous.rst:358 ../../admin/continuous.rst:362 #: ../../admin/continuous.rst:366 ../../admin/continuous.rst:370 @@ -9795,7 +10109,7 @@ msgstr "" #: ../../admin/continuous.rst:360 msgid "GitLab merge request from fork" -msgstr "" +msgstr "GitLab захтев за спајање из форка" #: ../../admin/continuous.rst:360 ../../admin/continuous.rst:362 msgid ":ref:`vcs-gitlab`" @@ -9806,20 +10120,16 @@ msgid "GitLab merge request from branch" msgstr "" #: ../../admin/continuous.rst:364 -#, fuzzy -#| msgid "Invalid merge request!" msgid "Gitea merge request from fork" -msgstr "Неисправан захтев за стапање!" +msgstr "Неисправан захтев за спајање!" #: ../../admin/continuous.rst:364 ../../admin/continuous.rst:366 msgid ":ref:`vcs-gitea`" msgstr ":ref:`vcs-gitea`" #: ../../admin/continuous.rst:366 -#, fuzzy -#| msgid "Invalid merge request!" msgid "Gitea merge request from branch" -msgstr "Неисправан захтев за стапање!" +msgstr "" #: ../../admin/continuous.rst:368 msgid "Pagure merge request from fork" @@ -9859,16 +10169,20 @@ msgid "" "You can also enable automatic pushing of changes after Weblate commits, this " "can be done in :ref:`component-push_on_commit`." msgstr "" +"Такође можете омогућити аутоматско пуштање променa након што Веблејт уради " +"урезивање, ово се може урадити у :ref:`component-push_on_commit`." #: ../../admin/continuous.rst:387 msgid "" "See :ref:`vcs-repos` for setting up SSH keys, and :ref:`lazy-commit` for " "info about when Weblate decides to commit changes." msgstr "" +"Погледајте :ref:`vcs-repos` за подешавање SSH кључева, и :ref:`lazy-commit` " +"за информације о томе када Веблејт одлучује да уради урезивање променa." #: ../../admin/continuous.rst:391 msgid "Protected branches" -msgstr "" +msgstr "Заштићене гране" #: ../../admin/continuous.rst:393 msgid "" @@ -9880,15 +10194,15 @@ msgstr "" #: ../../admin/continuous.rst:398 msgid "For example on GitHub this can be done in the repository configuration:" -msgstr "" +msgstr "На пример, на GitHub-у ово се може урадити у конфигурацији складишта:" #: ../../admin/continuous.rst:403 msgid "Interacting with others" -msgstr "" +msgstr "Интеракција са другима" #: ../../admin/continuous.rst:405 msgid "Weblate makes it easy to interact with others using its API." -msgstr "" +msgstr "Веблејт олакшава интеракцију са другима користећи свој API." #: ../../admin/continuous.rst:409 msgid ":ref:`api`" @@ -9896,7 +10210,7 @@ msgstr ":ref:`api`" #: ../../admin/continuous.rst:414 msgid "Lazy commits" -msgstr "" +msgstr "Лењи захтеви" #: ../../admin/continuous.rst:416 msgid "" @@ -9912,18 +10226,19 @@ msgid "" "The changes in this mode are committed once any of the following conditions " "are fulfilled:" msgstr "" +"Промене у овом режиму се урезују када се испуни било који од следећих услова:" #: ../../admin/continuous.rst:425 msgid "Somebody else changes an already changed string." -msgstr "" +msgstr "Неко други промени већ промењену ниску." #: ../../admin/continuous.rst:426 msgid "A merge from upstream occurs." -msgstr "" +msgstr "Долази до спајања из узводног." #: ../../admin/continuous.rst:427 msgid "An explicit commit is requested." -msgstr "" +msgstr "Експлицитно је затражено урезивање." #: ../../admin/continuous.rst:428 msgid "A file download is requested." @@ -9954,7 +10269,7 @@ msgstr "" #: ../../admin/continuous.rst:447 msgid "Processing repository with scripts" -msgstr "" +msgstr "Обрада складишта са скриптама" #: ../../admin/continuous.rst:449 msgid "" @@ -9965,7 +10280,7 @@ msgstr "" #: ../../admin/continuous.rst:456 msgid "Keeping translations same across components" -msgstr "" +msgstr "Одржавање истих превода у различитим компонентама" #: ../../admin/continuous.rst:458 msgid "" @@ -9973,10 +10288,12 @@ msgid "" "the same strings have same translation. This can be achieved at several " "levels." msgstr "" +"Када имате више компоненти за превод, можда ћете желети да осигурите да исте " +"ниске имају исти превод. Ово се може постићи на неколико нивоа." #: ../../admin/continuous.rst:462 msgid "Translation propagation" -msgstr "" +msgstr "Пропагирање превода" #: ../../admin/continuous.rst:464 msgid "" @@ -9991,10 +10308,12 @@ msgid "" "The translation propagation requires the key to be match for monolingual " "translation formats, so keep that in mind when creating translation keys." msgstr "" +"Пропагирање превода захтева да кључ буде подударан за монолингвалне формате " +"превода, па то имајте на уму када стварате кључеве за превод." #: ../../admin/continuous.rst:475 msgid "Consistency check" -msgstr "" +msgstr "Провера доследности" #: ../../admin/continuous.rst:477 msgid "" @@ -10002,6 +10321,9 @@ msgid "" "different. You can utilize this to review such differences manually and " "choose the right translation." msgstr "" +":ref:`check-inconsistent` провера се активира када су низови различити. " +"Можете искористити ово да ручно прегледате такве разлике и изаберете прави " +"превод." #: ../../admin/continuous.rst:486 msgid "" @@ -10014,7 +10336,7 @@ msgstr "" #: ../../admin/customize.rst:2 msgid "Customizing Weblate" -msgstr "" +msgstr "Прилагођавање Веблејта" #: ../../admin/customize.rst:4 msgid "" @@ -10023,6 +10345,10 @@ msgid "" "code in Weblate is taken care of when changing internal interfaces or " "refactoring the code." msgstr "" +"Проширите и прилагодите користећи Django и Python. Допринесите својим " +"променама узводно како би сви могли имати користи. Ово смањује ваше трошкове " +"одржавања; код у Веблејту се брине о променама унутрашњих интерфејса или " +"рефакторисању кода." #: ../../admin/customize.rst:11 msgid "You can also customize Weblate look in :ref:`manage-appearance`." @@ -10041,7 +10367,7 @@ msgstr ":ref:`contributing`" #: ../../admin/customize.rst:27 msgid "Creating a Python module" -msgstr "" +msgstr "Креирање Python модула" #: ../../admin/customize.rst:29 msgid "" @@ -10049,6 +10375,9 @@ msgid "" "Beginners `_, explaining the " "basics and pointing to further tutorials." msgstr "" +"Ако нисте упознати са Python-ом, можда ћете желети да погледате `Python за " +"почетнике `_, који објашњава " +"основе и указује на даље туторијале." #: ../../admin/customize.rst:33 msgid "" @@ -10068,11 +10397,11 @@ msgstr "" #: ../../admin/customize.rst:45 msgid "Better yet, turn your customization into a proper Python package:" -msgstr "" +msgstr "Још боље, претворите своје прилагођавање у прави Python пакет:" #: ../../admin/customize.rst:47 msgid "Create a folder for your package (we will use `weblate_customization`)." -msgstr "" +msgstr "Креирајте фасциклу за ваш пакет (користићемо `weblate_customization`)." #: ../../admin/customize.rst:48 msgid "Within it, create a :file:`setup.py` file to describe the package:" @@ -10083,6 +10412,8 @@ msgid "" "Create a folder for the Python module (also called " "``weblate_customization``) for the customization code." msgstr "" +"Креирајте фасциклу за Python модул (такође назван ``weblate_customization``) " +"за код прилагођавања." #: ../../admin/customize.rst:67 msgid "" @@ -10095,12 +10426,16 @@ msgid "" "This package can now be installed using :command:`pip install -e`. More info " "to be found in :ref:`pip:editable-installs`." msgstr "" +"Овај пакет се сада може инсталирати користећи :command:`pip install -e`. " +"Више информација можете пронаћи у :ref:`pip:editable-installs`." #: ../../admin/customize.rst:69 msgid "" "Once installed, the module can be used in the Weblate configuration (for " "example ``weblate_customization.checks.FooCheck``)." msgstr "" +"Када се инсталира, модул се може користити у конфигурацији Веблејта (на " +"пример ``weblate_customization.checks.FooCheck``)." #: ../../admin/customize.rst:72 msgid "Your package structure should look like this:" @@ -10111,10 +10446,12 @@ msgid "" "You can find an example of customizing Weblate at , it covers all the topics described below." msgstr "" +"Можете пронаћи пример прилагођавања Веблејта на , покрива све теме описане у наставку." #: ../../admin/customize.rst:88 msgid "Changing the logo" -msgstr "" +msgstr "Мењање логотипа" #: ../../admin/customize.rst:90 msgid "" @@ -10124,7 +10461,7 @@ msgstr "" #: ../../admin/customize.rst:93 msgid "Branding appears in the following files:" -msgstr "" +msgstr "Брендирање се појављује у следећим фајловима:" #: ../../admin/customize.rst:95 msgid ":file:`icons/weblate.svg`" @@ -10132,15 +10469,15 @@ msgstr ":file:`icons/weblate.svg`" #: ../../admin/customize.rst:96 msgid "Logo shown in the navigation bar." -msgstr "" +msgstr "Логотип који се приказује у навигационом бару." #: ../../admin/customize.rst:97 msgid ":file:`logo-*.png`" -msgstr "" +msgstr ":file:`logo-*.png`" #: ../../admin/customize.rst:98 msgid "Web icons depending on screen resolution and web-browser." -msgstr "" +msgstr "Веб иконице зависно од резолуције екрана и веб-прегледача." #: ../../admin/customize.rst:99 msgid ":file:`favicon.ico`" @@ -10148,17 +10485,19 @@ msgstr ":file:`favicon.ico`" #: ../../admin/customize.rst:100 msgid "Web icon used by legacy browsers." -msgstr "" +msgstr "Веб иконица која се користи од стране наслеђених прегледача." #: ../../admin/customize.rst:101 msgid ":file:`weblate-*.png`" -msgstr "" +msgstr ":file:`weblate-*.png`" #: ../../admin/customize.rst:102 msgid "" "Avatars for bots or anonymous users. Some web-browsers use these as shortcut " "icons." msgstr "" +"Аватари за ботове или анонимне кориснике. Неки веб-прегледачи користе ове " +"као иконице пречице." #: ../../admin/customize.rst:103 msgid ":file:`email-logo.png`" @@ -10166,7 +10505,7 @@ msgstr ":file:`email-logo.png`" #: ../../admin/customize.rst:104 msgid "Used in notifications e-mails." -msgstr "" +msgstr "Користи се у обавештењима имејл-ова." #: ../../admin/customize.rst:106 msgid "Add it to :setting:`django:INSTALLED_APPS`:" @@ -10177,10 +10516,12 @@ msgid "" "Run :samp:`weblate collectstatic --noinput`, to collect static files served " "to clients." msgstr "" +"Покрените :samp:`weblate collectstatic --noinput`, да сакупите статичне " +"фајлове који се сервирају клијентима." #: ../../admin/customize.rst:121 msgid ":doc:`django:howto/static-files/index`, :ref:`static-files`" -msgstr "" +msgstr ":doc:`django:howto/static-files/index`, :ref:`static-files`" #: ../../admin/customize.rst:128 msgid "Custom quality checks, add-ons and auto-fixes" @@ -10203,6 +10544,9 @@ msgid "" "Add its fully-qualified path to the Python class in the dedicated settings (:" "setting:`WEBLATE_ADDONS`, :setting:`CHECK_LIST` or :setting:`AUTOFIX_LIST`):" msgstr "" +"Додајте његову потпуну путању до Python класе у посебна подешавања " +"(:setting:`WEBLATE_ADDONS`, :setting:`CHECK_LIST` или " +":setting:`AUTOFIX_LIST`):" #: ../../admin/customize.rst:151 msgid "" @@ -10212,7 +10556,7 @@ msgstr "" #: ../../admin/deployments.rst:4 msgid "Weblate deployments" -msgstr "" +msgstr "Веблејт распоређивања" #: ../../admin/deployments.rst:6 msgid "" @@ -15134,10 +15478,8 @@ msgstr "" #: ../../admin/languages.rst:137 ../../api.rst:728 ../../api.rst:741 #: ../../api.rst:781 ../../api.rst:792 -#, fuzzy -#| msgid "Number of strings" msgid "Number of speakers" -msgstr "Број ниски" +msgstr "Број говорника" #: ../../admin/languages.rst:139 #, fuzzy @@ -15514,7 +15856,7 @@ msgstr "сомалијски" #: ../../admin/machine.rst:146 msgid "Uses the specified formality if language is not specified as (in)formal" -msgstr "" +msgstr "Користи одређену формалност ако језик није наведен као (не)формалан" #: ../../admin/machine.rst:148 msgid "``context``" @@ -15528,7 +15870,7 @@ msgstr "" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." -msgstr "" +msgstr "Описати контекст превода да бисте побољшали тачност превода." #: ../../admin/machine.rst:151 msgid "" @@ -15876,6 +16218,7 @@ msgstr "Аутентификација" #: ../../admin/machine.rst:341 msgid "Regional or multi-service can be specified using region field below." msgstr "" +"Регионални или мулти-услуга може бити назначен коришћењем поља регион испод." #: ../../admin/machine.rst:345 msgid "``api.cognitive.microsoft.com`` -- Global" @@ -15990,6 +16333,8 @@ msgid "" "Describe the persona of translator to improve the accuracy of the " "translation. For example: “You are a squirrel breeder.”" msgstr "" +"Опишите личност преводиоца да бисте побољшали тачност превода. На пример: „" +"Ви сте узгајивач веверица.“" #: ../../admin/machine.rst:399 ../../admin/machine.rst:513 #, fuzzy @@ -16000,7 +16345,7 @@ msgstr "Фајл превода" #: ../../admin/machine.rst:399 ../../admin/machine.rst:513 msgid "" "Describe the style of translation. For example: “Use informal language.”" -msgstr "" +msgstr "Опишите стил превода. На пример: „Користите неформалан језик.“" #: ../../admin/machine.rst:401 msgid "``azure_endpoint``" @@ -16013,7 +16358,7 @@ msgstr "" #: ../../admin/machine.rst:401 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." -msgstr "" +msgstr "URL крајње тачке инстанце, нпр: https://my-instance.openai.azure.com." #: ../../admin/machine.rst:403 msgid "``deployment``" @@ -16025,7 +16370,7 @@ msgstr "" #: ../../admin/machine.rst:403 msgid "The model's unique deployment name." -msgstr "" +msgstr "Јединствено име модела за примену." #: ../../admin/machine.rst:406 msgid "Performs translation using `OpenAI`_ hosted on Azure." @@ -16051,7 +16396,7 @@ msgstr "Контекст" #: ../../admin/machine.rst:425 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" -msgstr "" +msgstr "Листа ИД_меморије:тежина одвојених зарезом. нпр: 1234:0.123,4567:0.456" #: ../../admin/machine.rst:432 msgid "`ModernMT API `_" @@ -16125,7 +16470,7 @@ msgstr "" #: ../../admin/machine.rst:491 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "Основни URL OpenAI API, ако се разликује од подразумеваног OpenAI URL" #: ../../admin/machine.rst:493 msgid "``model``" @@ -16181,7 +16526,7 @@ msgstr "Прилагоди назив компоненте" #: ../../admin/machine.rst:509 msgid "Only needed when model is set to 'Custom model'" -msgstr "" +msgstr "Потребно само када је модел постављен на 'Прилагођен модел'" #: ../../admin/machine.rst:516 msgid "Performs translation using `OpenAI`_." @@ -16261,6 +16606,8 @@ msgid "" "The ID of a translation domain, for example, BC. If you do not specify a " "domain, the method searches for translations in all available domains." msgstr "" +"ИД домена превода, на пример, BC. Ако не наведете домен, метода тражи " +"преводе у свим доступним доменима." #: ../../admin/machine.rst:559 msgid "Machine translation service provided by SAP." @@ -18385,7 +18732,7 @@ msgstr "" #: ../../admin/projects.rst:206 msgid "Enforced two-factor authentication" -msgstr "" +msgstr "Принудна двофакторска аутентификација" #: ../../admin/projects.rst:210 msgid "" @@ -18706,10 +19053,8 @@ msgid ":ref:`bimono`, :ref:`faq-duplicate-files`" msgstr "" #: ../../admin/projects.rst:452 -#, fuzzy -#| msgid "Screenshot details" msgid "Screenshot file mask" -msgstr "Детаљи снимка екрана" +msgstr "Маска фајла за снимак екрана" #: ../../admin/projects.rst:454 msgid "" @@ -18968,10 +19313,8 @@ msgstr "" #: ../../admin/projects.rst:616 ../../workflows.rst:119 ../../workflows.rst:150 #: ../../workflows.rst:184 -#, fuzzy -#| msgid "Automatic suggestions" msgid "Automatically accept suggestions" -msgstr "Аутоматски предлози" +msgstr "Аутоматски прихвати предлоге" #: ../../admin/projects.rst:618 msgid "Automatically accept voted suggestions, see :ref:`voting`." @@ -19142,7 +19485,7 @@ msgstr "" #: ../../admin/projects.rst:736 msgid "Default based on the file format" -msgstr "Подразумевано на основу формата датотеке." +msgstr "Подразумевано на основу формата датотеке" #: ../../admin/projects.rst:737 msgid "Dependent on file format, for most of them POSIX is used." @@ -19160,7 +19503,7 @@ msgstr "" #: ../../admin/projects.rst:741 msgid "POSIX style using underscore as a separator, lower cased" -msgstr "" +msgstr "POSIX стил користећи доњу црту као сепаратор, малим словима" #: ../../admin/projects.rst:744 msgid "POSIX style using underscore as a separator, including country code" @@ -19177,6 +19520,8 @@ msgid "" "POSIX style using underscore as a separator, including country code, lower " "cased" msgstr "" +"POSIX стил користећи доњу црту као сепаратор, укључујући код земље, малим " +"словима" #: ../../admin/projects.rst:748 msgid "" @@ -19205,7 +19550,7 @@ msgstr "" #: ../../admin/projects.rst:756 msgid "BCP style using hyphen as a separator, legacy language codes" -msgstr "" +msgstr "BCP стил користећи цртицу као сепаратор, наслеђени језички кодови" #: ../../admin/projects.rst:757 msgid "Uses legacy codes for Chinese and BCP style notation." @@ -19213,7 +19558,7 @@ msgstr "" #: ../../admin/projects.rst:758 msgid "BCP style using hyphen as a separator, lower cased" -msgstr "" +msgstr "BCP стил користећи цртицу као сепаратор, малим словима" #: ../../admin/projects.rst:759 msgid "BCP style notation, all in lower case (for example ``cs-cz``)." @@ -19221,7 +19566,7 @@ msgstr "" #: ../../admin/projects.rst:760 msgid "Apple App Store metadata style" -msgstr "" +msgstr "Стил метаподатака за Apple App Store" #: ../../admin/projects.rst:761 msgid "Style suitable for uploading metadata to Apple App Store." @@ -19229,7 +19574,7 @@ msgstr "" #: ../../admin/projects.rst:762 msgid "Google Play metadata style" -msgstr "" +msgstr "Стил метаподатака за Google Play" #: ../../admin/projects.rst:763 msgid "Style suitable for uploading metadata to Google Play Store." @@ -19237,17 +19582,15 @@ msgstr "" #: ../../admin/projects.rst:764 msgid "Android style" -msgstr "Android стил." +msgstr "Android стил" #: ../../admin/projects.rst:765 msgid "Only used in Android apps, produces language codes like ``pt-rBR``." msgstr "" #: ../../admin/projects.rst:767 -#, fuzzy -#| msgid "Language code style" msgid "Linux style" -msgstr "Облик кода језика" +msgstr "Linux стил" #: ../../admin/projects.rst:768 msgid "" @@ -19256,10 +19599,8 @@ msgid "" msgstr "" #: ../../admin/projects.rst:769 -#, fuzzy -#| msgid "Language code style" msgid "Linux style, lower cased" -msgstr "Облик кода језика" +msgstr "Linux стил, малим словима" #: ../../admin/projects.rst:770 msgid "" @@ -19298,6 +19639,8 @@ msgid "" "Rebasing can cause you trouble in case of complicated merges, so carefully " "consider whether or not you want to enable them." msgstr "" +"Ребазирање може изазвати проблеме у случају компликованих спајања, па " +"пажљиво размислите да ли желите да их омогућите." #: ../../admin/projects.rst:794 msgid "" @@ -19318,7 +19661,7 @@ msgstr "" #: ../../admin/projects.rst:802 msgid "Merge without fast-forward" -msgstr "" +msgstr "Спојити без брзог премотавања унапред" #: ../../admin/projects.rst:803 msgid "" @@ -38637,7 +38980,7 @@ msgstr "" #: ../../faq.rst:453 ../../vcs.rst:559 msgid ":setting:`DATA_DIR`" -msgstr "" +msgstr ":setting:`DATA_DIR`" #: ../../faq.rst:457 msgid "When accessing the site I get a \"Bad Request (400)\" error" @@ -39231,7 +39574,7 @@ msgstr "" #: ../../formats.rst:404 msgid "Source string description" -msgstr "Опис изворног низа" +msgstr "Опис изворне ниске" #: ../../formats.rst:406 msgid "" @@ -39897,10 +40240,8 @@ msgid "`Fluent file`" msgstr "Фајл фонта" #: ../../formats/formatjs.rst:4 -#, fuzzy -#| msgid "gettext PO file" msgid "Format.JS JSON file" -msgstr "Геттекст ПО фајл" +msgstr "Format.JS JSON фајл" #: ../../formats/formatjs.rst:8 msgid "" @@ -40226,7 +40567,7 @@ msgstr "" #: ../../formats/i18next.rst:27 msgid "i18next JSON file v4" -msgstr "" +msgstr "i18next JSON фајл верзија 4" #: ../../formats/i18next.rst:29 msgid "" @@ -40513,7 +40854,7 @@ msgstr "" #: ../../formats/laravel.rst:4 msgid "Laravel PHP strings" -msgstr "Laravel PHP низови" +msgstr "Laravel PHP ниске" #: ../../formats/laravel.rst:8 msgid "The Laravel PHP localization files are supported as well with plurals:" @@ -41809,7 +42150,7 @@ msgstr "Интеграција у контролу верзија" #: ../../user/checks.rst:44 msgid "Devanagari danda" -msgstr "" +msgstr "Деванагари данда" #: ../../user/checks.rst:46 msgid "Replaces wrong full stop in Devanagari by Devanagari danda (``।``)." @@ -41889,7 +42230,7 @@ msgstr "Ваш резиме" #: ../../user/checks.rst:102 msgid "BBCode in translation does not match source" -msgstr "" +msgstr "BBCode у преводу се не подудара са извором" #: ../../user/checks.rst:103 ../../user/checks.rst:126 #: ../../user/checks.rst:147 ../../user/checks.rst:172 @@ -42071,14 +42412,12 @@ msgid "" msgstr "" #: ../../user/checks.rst:184 -#, fuzzy -#| msgid "Font file" msgid "Fluent parts" -msgstr "Фајл фонта" +msgstr "Fluent делови" #: ../../user/checks.rst:188 msgid "Fluent parts should match" -msgstr "" +msgstr "Fluent делови треба да се подударају" #: ../../user/checks.rst:190 #, fuzzy @@ -42123,14 +42462,12 @@ msgid "" msgstr "" #: ../../user/checks.rst:224 -#, fuzzy -#| msgid "Preferences" msgid "Fluent references" -msgstr "Подешавања" +msgstr "Fluent референце" #: ../../user/checks.rst:228 msgid "Fluent references should match" -msgstr "" +msgstr "Fluent референце треба да се подударају" #: ../../user/checks.rst:230 #, fuzzy @@ -42208,14 +42545,12 @@ msgid "" msgstr "" #: ../../user/checks.rst:295 -#, fuzzy -#| msgid "Create translation" msgid "Fluent translation inner HTML" -msgstr "Направи превод" +msgstr "Fluent превод унутрашњи HTML" #: ../../user/checks.rst:299 msgid "Fluent target should be valid inner HTML that matches" -msgstr "" +msgstr "Fluent мета треба да буде валидан унутрашњи HTML који се подудара" #: ../../user/checks.rst:301 #, fuzzy @@ -42296,16 +42631,12 @@ msgid "" msgstr "" #: ../../user/checks.rst:363 -#, fuzzy -#| msgid "Create translation" msgid "Fluent translation syntax" -msgstr "Направи превод" +msgstr "Fluent преводна синтакса" #: ../../user/checks.rst:367 -#, fuzzy -#| msgid "Comment on own translation" msgid "Fluent syntax error in translation" -msgstr "Коментар на мој превод" +msgstr "Fluent синтаксна грешка у преводу" #: ../../user/checks.rst:369 #, fuzzy @@ -42570,7 +42901,7 @@ msgid "" "Syntax errors and/or placeholder mismatches in ICU MessageFormat strings." msgstr "" "Синтаксне грешке и/или неслагања резервисаних места у ICU MessageFormat " -"низовима." +"нискама." #: ../../user/checks.rst:524 #, fuzzy @@ -42776,7 +43107,7 @@ msgstr "JavaScript формат" #: ../../user/checks.rst:640 msgid "JavaScript format string does not match source" -msgstr "JavaScript формат низ не одговара извору" +msgstr "JavaScript формат ниска не одговара извору" #: ../../user/checks.rst:642 msgid "``weblate.checks.format.JavaScriptFormatCheck``" @@ -42820,7 +43151,7 @@ msgstr "Object Pascal формат" #: ../../user/checks.rst:676 msgid "Object Pascal format string does not match source" -msgstr "Object Pascal форматни низ се не поклапа са извором" +msgstr "Object Pascal форматна ниска се не поклапа са извором" #: ../../user/checks.rst:678 msgid "``weblate.checks.format.ObjectPascalFormatCheck``" @@ -42842,7 +43173,7 @@ msgstr "" #: ../../user/checks.rst:694 msgid "Percent placeholders" -msgstr "Држач за проценат" +msgstr "Држач места за проценат" #: ../../user/checks.rst:698 msgid "The percent placeholders do not match source" @@ -42861,16 +43192,12 @@ msgid "``There are %number% apples``" msgstr "" #: ../../user/checks.rst:713 -#, fuzzy -#| msgid "Perl format" msgid "Perl brace format" -msgstr "Перл формат" +msgstr "Perl формат са заградама" #: ../../user/checks.rst:715 -#, fuzzy -#| msgid "Perl format string does not match source" msgid "Perl brace format string does not match source" -msgstr "Перл ознаке у преводу не одговарају извору" +msgstr "Perl формат са заградама не подудара се са извором" #: ../../user/checks.rst:717 #, fuzzy @@ -42979,7 +43306,7 @@ msgstr "Python формат" #: ../../user/checks.rst:793 msgid "Python format string does not match source" -msgstr "Python формат низ не одговара извору" +msgstr "Python формат ниска не одговара извору" #: ../../user/checks.rst:795 msgid "``weblate.checks.format.PythonFormatCheck``" @@ -43102,7 +43429,7 @@ msgstr "Scheme формат" #: ../../user/checks.rst:870 msgid "Scheme format string does not match source" -msgstr "Scheme форматни низ се не поклапа са извором" +msgstr "Scheme форматна ниска се не поклапа са извором" #: ../../user/checks.rst:872 msgid "``weblate.checks.format.SchemeFormatCheck``" @@ -43206,15 +43533,11 @@ msgid "Inconsistent" msgstr "Недоследност" #: ../../user/checks.rst:925 -#, fuzzy -#| msgid "" -#| "This string has more than one translation in this project or is not " -#| "translated in some components." msgid "" "This string has more than one translation in this project or is untranslated " "in some components." msgstr "" -"Ова иста ниска има више различитих превода у пројекту или није преведена у " +"Ова ниска има више од једног превода у овом пројекту или је непреведена у " "неким компонентама." #: ../../user/checks.rst:927 @@ -43719,10 +44042,8 @@ msgid "Missing plurals" msgstr "Недостају множине" #: ../../user/checks.rst:1277 -#, fuzzy -#| msgid "Some plural forms are not translated" msgid "Some plural forms are untranslated" -msgstr "Неки од облика множине нису преведени" +msgstr "Неке множинске форме су непреведене" #: ../../user/checks.rst:1279 #, fuzzy @@ -43749,7 +44070,7 @@ msgstr "" #: ../../user/checks.rst:1292 msgid "Placeholders" -msgstr "Замене" +msgstr "Држачи места" #: ../../user/checks.rst:1294 msgid "Translation is missing some placeholders" @@ -43839,14 +44160,12 @@ msgid "" msgstr "" #: ../../user/checks.rst:1377 -#, fuzzy -#| msgid "Removed translation" msgid "Reused translation" -msgstr "Уклоњени превод" +msgstr "Поново коришћени превод" #: ../../user/checks.rst:1381 msgid "Different strings are translated the same." -msgstr "Различити низови се преводе исто." +msgstr "Различите ниске се преводе исто." #: ../../user/checks.rst:1383 #, fuzzy @@ -44224,11 +44543,11 @@ msgstr "" #: ../../user/checks.rst:1643 msgid "Fluent source inner HTML" -msgstr "" +msgstr "Fluent извор унутрашњи HTML" #: ../../user/checks.rst:1647 msgid "Fluent source should be valid inner HTML" -msgstr "" +msgstr "Fluent извор треба да буде валидан унутрашњи HTML" #: ../../user/checks.rst:1649 #, fuzzy @@ -44465,11 +44784,11 @@ msgstr "" #: ../../user/checks.rst:1729 msgid "Fluent source syntax" -msgstr "" +msgstr "Fluent изворна синтакса" #: ../../user/checks.rst:1733 msgid "Fluent syntax error in source" -msgstr "" +msgstr "Fluent синтаксна грешка у извору" #: ../../user/checks.rst:1735 #, fuzzy @@ -44507,7 +44826,7 @@ msgstr "ICU MessageFormat синтакса" #: ../../user/checks.rst:1758 msgid "Syntax errors in ICU MessageFormat strings." -msgstr "Синтаксне грешке у ICU MessageFormat низовима." +msgstr "Синтаксне грешке у ICU MessageFormat нискама." #: ../../user/checks.rst:1760 #, fuzzy @@ -44584,7 +44903,7 @@ msgid "" "There are multiple unnamed variables in the string, making it impossible for " "translators to reorder them" msgstr "" -"Постоји више неименованих варијабли у низу, што онемогућава преводиоцима да " +"Постоји више неименованих варијабли у ниски, што онемогућава преводиоцима да " "их преуреде" #: ../../user/checks.rst:1812 diff --git a/docs/locales/uk/LC_MESSAGES/docs.po b/docs/locales/uk/LC_MESSAGES/docs.po index cb3231ece188..ebce12492fd4 100644 --- a/docs/locales/uk/LC_MESSAGES/docs.po +++ b/docs/locales/uk/LC_MESSAGES/docs.po @@ -14,7 +14,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-24 02:26+0000\n" +"PO-Revision-Date: 2024-10-09 00:14+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -27522,7 +27522,7 @@ msgstr "" #: ../../changes.rst:98 msgid ":ref:`2fa` can be enforced at the team or project level." -msgstr ":ref:`2fa` може бути застосовано на рівні команди або проекту." +msgstr ":ref:`2fa` може бути застосовано на рівні команди або проєкту." #: ../../changes.rst:99 msgid "" @@ -27547,7 +27547,7 @@ msgid "" "of existing strings." msgstr "" ":ref:`mt-openai` тепер підтримує користувацькі моделі та URL-адреси, а також " -"пропонує перефразування існуючих рядків." +"пропонує перефразування наявних рядків." #: ../../changes.rst:103 msgid ":ref:`mt-cyrtranslit` automatic suggestion service." diff --git a/docs/locales/zh_Hans/LC_MESSAGES/docs.po b/docs/locales/zh_Hans/LC_MESSAGES/docs.po index 718ec0bb74fc..4ad97427755e 100644 --- a/docs/locales/zh_Hans/LC_MESSAGES/docs.po +++ b/docs/locales/zh_Hans/LC_MESSAGES/docs.po @@ -21,9 +21,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 14:27+0200\n" -"PO-Revision-Date: 2024-09-21 06:12+0000\n" -"Last-Translator: 大王叫我来巡山 \n" +"PO-Revision-Date: 2024-10-09 00:14+0000\n" +"Last-Translator: JY3 \n" "Language-Team: Chinese (Simplified Han script) \n" "Language: zh_Hans\n" @@ -47844,7 +47843,7 @@ msgstr "``is:TEXT``" #: ../../user/search.rst:56 msgid "Filters string on a condition:" -msgstr "使用条件筛选字符串:" +msgstr "按条件筛选字符串:" #: ../../user/search.rst:58 msgid "``read-only`` or ``readonly``" @@ -47852,7 +47851,7 @@ msgstr "``read-only`` 或 ``readonly``" #: ../../user/search.rst:59 msgid "Read-only strings, same as ``state:read-only``." -msgstr "只读字符串,同 ``state:read-only`` 。" +msgstr "只读字符串,同 ``state:read-only``。" #: ../../user/search.rst:60 msgid "``approved``" @@ -47868,11 +47867,11 @@ msgstr "``needs-editing`` 或 ``fuzzy``" #: ../../user/search.rst:63 msgid "Needing editing strings, same as ``state:needs-editing``." -msgstr "需要编辑的字符串,同 ``state:needs-editing`` 。" +msgstr "需要编辑的字符串,同 ``state:needs-editing``。" #: ../../user/search.rst:65 msgid "Translated strings, same as ``state:>translated``." -msgstr "已翻译的字符串, 同 ``state:>translated``." +msgstr "已翻译的字符串, 同 ``state:>translated``。" #: ../../user/search.rst:66 msgid "``untranslated``:" @@ -47880,7 +47879,7 @@ msgstr "``untranslated``" #: ../../user/search.rst:67 msgid "Untranslated strings, same as ``state:=10.3.0 pygments==2.18.0 requests>=2.32.0 -Sphinx==8.0.2 +Sphinx==8.1.2 sphinx-copybutton==0.5.2 sphinx-jsonschema==1.19.1 sphinxcontrib-httpdomain==1.8.1 diff --git a/pyproject.toml b/pyproject.toml index da3b2a333653..2a2eb2a92edd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ "django-appconf>=1.0.3,<1.1", "django-celery-beat>=2.6.0,<2.8", "django-compressor>=4.4,<5", - "django-cors-headers>=4.3.0,<4.5", + "django-cors-headers>=4.3.0,<4.6", "django-crispy-forms>=2.3,<2.4", "django-filter>=23.4,<24.4", "django-redis>=5.4.0,<6.0", @@ -81,7 +81,7 @@ dependencies = [ "social-auth-app-django>=5.4.1,<6.0.0", "social-auth-core>=4.5.0,<5.0.0", "tesserocr>=2.6.1,<2.8.0", - "translate-toolkit>=3.13.1,<3.14", + "translate-toolkit>=3.13.4,<3.14", "translation-finder>=2.16,<3.0", "user-agents>=2.0,<2.3", "weblate-language-data>=2024.6", @@ -115,7 +115,7 @@ antispam = [ "python-akismet>=0.4.2,<0.5" ] ci = [ - "coverage==7.6.1", + "coverage==7.6.2", "twine==5.1.1" ] dev = [ @@ -133,17 +133,17 @@ google = [ "google-cloud-translate>=3.13.0,<4.0" ] ldap = [ - "django-auth-ldap>=4.6.0,<5.0.0" + "django-auth-ldap>=4.6.0,<5.1.0" ] lint = [ - "pre-commit==4.0.0", + "pre-commit==4.0.1", "pylint==3.3.1" ] mercurial = [ "mercurial>=6.8.0,<7.0" ] mypy = [ - "boto3-stubs==1.35.34", + "boto3-stubs==1.35.39", "celery-types==0.22.0", "django-stubs-ext==5.1.0", "django-stubs==5.1.0", diff --git a/scripts/yarn-update b/scripts/yarn-update index d4cf628e4ce6..2e38eaf3d5ac 100755 --- a/scripts/yarn-update +++ b/scripts/yarn-update @@ -20,9 +20,6 @@ cp node_modules/mousetrap/mousetrap.js ../../weblate/static/vendor/ # Mousetrap global bind cp node_modules/mousetrap-global-bind/mousetrap-global-bind.js ../../weblate/static/vendor/ -# Tribute -cp node_modules/tributejs/dist/tribute.js ../../weblate/static/vendor/ - # Prismjs cp node_modules/prismjs/components/prism-core.js ../../weblate/static/vendor/prism/ cp node_modules/prismjs/components/prism-markup.js ../../weblate/static/vendor/prism/ diff --git a/scripts/yarn/package.json b/scripts/yarn/package.json index 84315b52ea08..7bb6d137f0f3 100644 --- a/scripts/yarn/package.json +++ b/scripts/yarn/package.json @@ -6,7 +6,6 @@ "dependencies": { "@tarekraafat/autocomplete.js": "^10.2.7", "autosize": "6.0.1", - "bootstrap-rtl": "3.3.4", "daterangepicker": "^3.1.0", "mousetrap": "1.6.5", "mousetrap-global-bind": "1.1.0", @@ -14,7 +13,6 @@ "prismjs": "1.29.0", "slugify": "1.6.6", "source-code-pro": "2.38.0", - "source-sans": "3.46.0", - "tributejs": "5.1.3" + "source-sans": "3.46.0" } } diff --git a/scripts/yarn/yarn.lock b/scripts/yarn/yarn.lock index ee56bf63a7d3..0ee84039d4ae 100644 --- a/scripts/yarn/yarn.lock +++ b/scripts/yarn/yarn.lock @@ -12,18 +12,6 @@ autosize@6.0.1: resolved "https://registry.yarnpkg.com/autosize/-/autosize-6.0.1.tgz#64ee78dd7029be959eddd3afbbd33235b957e10f" integrity sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ== -bootstrap-rtl@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/bootstrap-rtl/-/bootstrap-rtl-3.3.4.tgz#4f813e6fce91aa9f47ad47f48172355af61c1b11" - integrity sha512-3KgW8iyEj2b9DhqldLG193ualcnEKn/ZHyfw0ZwFwq5mxoxAwdn8Mt250zC4SJsYs983gOcUu7zxPRQejK9aQw== - dependencies: - bootstrap "^3.3.4" - -bootstrap@^3.3.4: - version "3.4.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" - integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== - daterangepicker@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/daterangepicker/-/daterangepicker-3.1.0.tgz#718d606614331df3e774c9aba82ccd8838d45da1" @@ -76,8 +64,3 @@ source-sans@3.46.0: version "3.46.0" resolved "https://registry.yarnpkg.com/source-sans/-/source-sans-3.46.0.tgz#6af0a47ead682fa8971f0c83e9692e75ef3cbb86" integrity sha512-bVC2YX4VNiv5vMcy77dL0XKsNp794ThfynNsr+FqSAwk8TGG0pZsg7eUQi6yHwaRBMVmZ3Aaf4FY46dxIIGgsg== - -tributejs@5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/tributejs/-/tributejs-5.1.3.tgz#980600fc72865be5868893078b4bfde721129eae" - integrity sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ== diff --git a/weblate/addons/base.py b/weblate/addons/base.py index 0cd24fb954a9..0020b3808e1f 100644 --- a/weblate/addons/base.py +++ b/weblate/addons/base.py @@ -437,9 +437,10 @@ def post_update( self, component: Component, previous_head: str, skip_push: bool ) -> None: # Ignore file parse error, it will be properly tracked as an alert - with suppress(FileParseError): - self.update_translations(component, previous_head) - self.commit_and_push(component, skip_push=skip_push) + with component.repository.lock: + with suppress(FileParseError): + self.update_translations(component, previous_head) + self.commit_and_push(component, skip_push=skip_push) class StoreBaseAddon(BaseAddon): diff --git a/weblate/addons/consistency.py b/weblate/addons/consistency.py index 0a908e8f658d..59a61e39076d 100644 --- a/weblate/addons/consistency.py +++ b/weblate/addons/consistency.py @@ -2,6 +2,8 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +import warnings + from django.utils.translation import gettext_lazy from weblate.addons.base import BaseAddon @@ -9,7 +11,7 @@ from weblate.addons.tasks import language_consistency -class LangaugeConsistencyAddon(BaseAddon): +class LanguageConsistencyAddon(BaseAddon): events = (AddonEvent.EVENT_DAILY, AddonEvent.EVENT_POST_ADD) name = "weblate.consistency.languages" verbose = gettext_lazy("Add missing languages") @@ -35,3 +37,11 @@ def post_add(self, translation) -> None: [translation.language_id], translation.component.project_id, ) + + +class LangaugeConsistencyAddon(LanguageConsistencyAddon): + warnings.warn( + "LangaugeConsistencyAddon is deprecated, use LanguageConsistencyAddon", + DeprecationWarning, + stacklevel=1, + ) diff --git a/weblate/addons/tasks.py b/weblate/addons/tasks.py index 3753770bd187..d751533145cb 100644 --- a/weblate/addons/tasks.py +++ b/weblate/addons/tasks.py @@ -105,7 +105,9 @@ def language_consistency( ) if new_lang is None: component.log_warning( - "could not add %s language for language consistency", language + "could not add %s language for language consistency: %s", + language, + component.new_lang_error_message, ) else: new_lang.log_info("added for language consistency") diff --git a/weblate/api/tests.py b/weblate/api/tests.py index cf4144227003..197cd42e8704 100644 --- a/weblate/api/tests.py +++ b/weblate/api/tests.py @@ -3327,7 +3327,11 @@ def test_add_plural(self) -> None: ) def test_delete(self) -> None: - start_count = Translation.objects.count() + def _translation_count(): + # exclude glossaries because stale glossaries are also cleaned out + return Translation.objects.filter(component__is_glossary=False).count() + + start_count = _translation_count() self.do_request( "api:translation-detail", self.translation_kwargs, method="delete", code=403 ) @@ -3338,7 +3342,8 @@ def test_delete(self) -> None: superuser=True, code=204, ) - self.assertEqual(Translation.objects.count(), start_count - 1) + + self.assertEqual(_translation_count(), start_count - 1) class UnitAPITest(APIBaseTest): diff --git a/weblate/formats/ttkit.py b/weblate/formats/ttkit.py index a620e7710510..c0eed4d80491 100644 --- a/weblate/formats/ttkit.py +++ b/weblate/formats/ttkit.py @@ -56,6 +56,7 @@ STATE_APPROVED, STATE_EMPTY, STATE_FUZZY, + STATE_READONLY, STATE_TRANSLATED, ) @@ -1080,6 +1081,16 @@ def is_readonly(self) -> bool: return False +class AndroidUnit(MonolingualIDUnit): + """Wrapper unit for Android Resource.""" + + def set_state(self, state) -> None: + """Tag unit as translatable/readonly aside from fuzzy and approved flags.""" + super().set_state(state) + if state == STATE_READONLY: + self.unit.marktranslatable(False) + + class BasePoFormat(TTKitFormat): loader = pofile plural_preference = None @@ -1433,7 +1444,7 @@ class AndroidFormat(TTKitFormat): format_id = "aresource" loader = ("aresource", "AndroidResourceFile") monolingual = True - unit_class = MonolingualIDUnit + unit_class = AndroidUnit new_translation = '\n' autoload: tuple[str, ...] = ("strings*.xml", "values*.xml") language_format = "android" diff --git a/weblate/glossary/tasks.py b/weblate/glossary/tasks.py index 6942a80d1703..77c0e5426fb3 100644 --- a/weblate/glossary/tasks.py +++ b/weblate/glossary/tasks.py @@ -4,10 +4,15 @@ from __future__ import annotations +from django.db import transaction +from django.db.models import F + +from weblate.auth.models import get_anonymous from weblate.lang.models import Language -from weblate.trans.models import Component +from weblate.trans.models import Component, Project, Translation from weblate.utils.celery import app from weblate.utils.lock import WeblateLockTimeoutError +from weblate.utils.stats import prefetch_stats @app.task( @@ -40,6 +45,66 @@ def sync_glossary_languages(pk: int, component: Component | None = None) -> None component.create_translations_task() +@app.task(trail=False, autoretry_for=(Project.DoesNotExist, WeblateLockTimeoutError)) +def cleanup_stale_glossaries(project: int | Project) -> None: + """ + Delete stale glossaries. + + A glossary translation is considered stale when it meets the following conditions: + - glossary.language is not used in any other non-glossary components + - glossary.language is different from glossary.component.source_language + - It has no translation + + Stale glossary is not removed if: + - the component only has one glossary component + - if is managed outside weblate (i.e repo != 'local:') + """ + if isinstance(project, int): + project = Project.objects.get(pk=project) + + languages_in_non_glossary_components: set[int] = set( + Translation.objects.filter( + component__project=project, component__is_glossary=False + ).values_list("language_id", flat=True) + ) + + glossary_translations = prefetch_stats( + Translation.objects.filter( + component__project=project, component__is_glossary=True + ) + .prefetch() + .exclude(language__id__in=languages_in_non_glossary_components) + .exclude(language=F("component__source_language")) + ) + + component_to_check = [] + + def can_delete(_glossary: Translation) -> bool: + """ + Check if a glossary can be deleted. + + It is possible to delete a glossary if: + - it has no translations + - it is not the only glossary in the project + - it is managed by Weblate (i.e. repo == 'local:') + """ + return all( + [ + _glossary.stats.translated == 0, + _glossary.component.repo == "local:", + ] + ) + + for glossary in glossary_translations: + if can_delete(glossary): + glossary.remove(get_anonymous()) + if glossary.component not in component_to_check: + component_to_check.append(glossary.component) + + for component in component_to_check: + transaction.on_commit(component.schedule_update_checks) + + @app.task( trail=False, autoretry_for=(Component.DoesNotExist, WeblateLockTimeoutError), diff --git a/weblate/glossary/tests.py b/weblate/glossary/tests.py index bbd8af0c64ba..c34d501b54c3 100644 --- a/weblate/glossary/tests.py +++ b/weblate/glossary/tests.py @@ -11,7 +11,11 @@ from django.urls import reverse from weblate.glossary.models import get_glossary_terms, get_glossary_tsv -from weblate.glossary.tasks import sync_terminology +from weblate.glossary.tasks import ( + cleanup_stale_glossaries, + sync_terminology, +) +from weblate.lang.models import Language from weblate.trans.models import Unit from weblate.trans.tests.test_views import ViewTestCase from weblate.trans.tests.utils import get_test_file @@ -472,3 +476,31 @@ def test_tsv(self) -> None: lines = list(reader) self.assertEqual(len(lines), 163) self.assertTrue(all(len(line) == 2 for line in lines)) + + def test_stale_glossaries_cleanup(self) -> None: + # setup: make glossary managed outside weblate + self.glossary_component.repo = "git://example.com/test/project.git" + self.glossary_component.save() + + initial_count = self.glossary_component.translation_set.count() + + # check glossary not deleted because it has a valid translation + cleanup_stale_glossaries(self.project.id) + self.assertEqual(self.glossary_component.translation_set.count(), initial_count) + + # delete translation: should trigger cleanup_stale_glossary task + german = Language.objects.get(code="de") + self.component.translation_set.get(language=german).remove(self.user) + + cleanup_stale_glossaries(self.project.id) + self.assertEqual(self.glossary_component.translation_set.count(), initial_count) + + # make glossary managed by weblate + self.glossary_component.repo = "local:" + self.glossary_component.save() + + # check that one glossary has been deleted + cleanup_stale_glossaries(self.project.id) + self.assertEqual( + self.glossary_component.translation_set.count(), initial_count - 1 + ) diff --git a/weblate/locale/cs/LC_MESSAGES/django.po b/weblate/locale/cs/LC_MESSAGES/django.po index c7f95ed71d0f..4b4b8c796a8f 100644 --- a/weblate/locale/cs/LC_MESSAGES/django.po +++ b/weblate/locale/cs/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-01 17:34+0000\n" +"PO-Revision-Date: 2024-10-10 10:08+0000\n" "Last-Translator: Fjuro \n" "Language-Team: Czech \n" @@ -10137,7 +10137,7 @@ msgstr "Zobrazit dohodu s přispěvatelem" #: weblate/templates/snippets/component/lock.html:14 msgid "Get notified when this project is unlocked again" -msgstr "Upozornit jakmile se tento projekt odemkne" +msgstr "Upozornit, jakmile se tento projekt odemkne" #: weblate/templates/snippets/component/lock.html:17 msgid "" @@ -11902,7 +11902,7 @@ msgstr "Tento překlad" #: weblate/templates/trans/other-row.html:15 msgid "Propagated" -msgstr "Rozšiřováno" +msgstr "Distribuováno" #: weblate/templates/trans/other-row.html:18 #: weblate/trans/models/component.py:511 diff --git a/weblate/locale/cy/LC_MESSAGES/django.po b/weblate/locale/cy/LC_MESSAGES/django.po index 8859282192a2..857847d2c692 100644 --- a/weblate/locale/cy/LC_MESSAGES/django.po +++ b/weblate/locale/cy/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-09-20 19:19+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-10-09 18:52+0000\n" +"Last-Translator: Rhoslyn Prys \n" "Language-Team: Welsh \n" "Language: cy\n" @@ -340,33 +340,31 @@ msgid "Add team" msgstr "Ychwanegu tîm" #: weblate/accounts/forms.py:954 -#, fuzzy -#| msgid "Authentication" msgid "Name your authentication app" -msgstr "Dilysu" +msgstr "Enwch eich ap dilysu" #: weblate/accounts/forms.py:957 msgid "Verify the code from the app" -msgstr "" +msgstr "Gwiriwch y cod o'r ap" #: weblate/accounts/forms.py:971 -#, fuzzy -#| msgid "The translation is not valid XML" msgid "Entered token is not valid." -msgstr "Nid yw'r cyfieithiad yn XML dilys" +msgstr "Nid yw'r cyfieithiad yn XML dilys." #: weblate/accounts/forms.py:1039 msgid "Recovery token" -msgstr "" +msgstr "Tocyn adfer" #: weblate/accounts/forms.py:1041 msgid "" "Recovery token can be used just once, mark your token as used after using it." msgstr "" +"Dim ond unwaith y gellir defnyddio tocyn adfer, marciwch eich tocyn fel y'i " +"defnyddiwyd ar ôl ei ddefnyddio." #: weblate/accounts/forms.py:1098 msgid "Enter the code from the app" -msgstr "" +msgstr "Rhowch y cod o'r" #: weblate/accounts/models.py:167 msgid "Password changed." @@ -504,26 +502,26 @@ msgstr "Cafodd y defnyddiwr ei dynnu o dîm {team} gan {username}." #: weblate/accounts/models.py:201 msgid "Two-factor authentication recovery codes were generated" -msgstr "" +msgstr "Cynhyrchwyd codau adfer dilysu dau ffactor" #: weblate/accounts/models.py:204 msgid "Two-factor authentication recovery codes were viewed" -msgstr "" +msgstr "Edrychwyd ar godau adfer dilysu dau ffactor" #: weblate/accounts/models.py:206 #, python-brace-format msgid "Two-factor authentication added: {device}" -msgstr "" +msgstr "Dilysiad dau ffactor wedi'i ychwanegu: {device}" #: weblate/accounts/models.py:207 #, python-brace-format msgid "Two-factor authentication removed: {device}" -msgstr "" +msgstr "Dilysiad dau ffactor wedi'i dynnu: {device}" #: weblate/accounts/models.py:208 #, python-brace-format msgid "Two-factor authentication sign in using {device}" -msgstr "" +msgstr "Mewngofnodi dilysu dau ffactor gan ddefnyddio {device}" #: weblate/accounts/models.py:213 msgid "Configured password to sign in." @@ -877,18 +875,14 @@ msgid "Suggestion was added" msgstr "Ychwanegwyd awgrym" #: weblate/accounts/notifications.py:557 -#, fuzzy -#| msgid "Long untranslated" msgctxt "Notification name" msgid "Language was translated" -msgstr "Testunau hir heb eu cyfieithu" +msgstr "Cyfieithwyd yr iaith" #: weblate/accounts/notifications.py:565 -#, fuzzy -#| msgid "Import as translated" msgctxt "Notification name" msgid "Component was translated" -msgstr "Mewnforio fel cyfieithwyd" +msgstr "Cyfieithwyd y gydran" #: weblate/accounts/notifications.py:573 msgctxt "Notification name" @@ -1007,29 +1001,25 @@ msgstr "" #: weblate/accounts/templatetags/authnames.py:53 msgid "Use security key (WebAuthn)" -msgstr "" +msgstr "Defnyddio allwedd ddiogelwch (WebAuthn)" #: weblate/accounts/templatetags/authnames.py:54 -#, fuzzy -#| msgid "Authentication" msgid "Use authentication app (TOTP)" -msgstr "Dilysu" +msgstr "Defnyddiwch ap dilysu (TOTP)" #: weblate/accounts/templatetags/authnames.py:55 msgid "Use recovery codes" -msgstr "" +msgstr "Defnyddiwch godau adfer" #: weblate/accounts/utils.py:170 -#, fuzzy, python-format -#| msgid "Security Policy" +#, python-format msgid "Security key (%s)" -msgstr "Polisi Diogelwch" +msgstr "Allwedd ddiogelwch (%s)" #: weblate/accounts/utils.py:176 -#, fuzzy, python-format -#| msgid "Authentication" +#, python-format msgid "Authentication app (%s)" -msgstr "Dilysu" +msgstr "Ap dilysu (%s)" #: weblate/accounts/views.py:205 weblate/accounts/views.py:1046 #: weblate/accounts/views.py:1112 weblate/templates/accounts/reset.html:7 @@ -1114,10 +1104,8 @@ msgid "Sign in" msgstr "Mewngofnodi" #: weblate/accounts/views.py:869 -#, fuzzy -#| msgid "Sign out" msgid "Signed out" -msgstr "Allgofnodi" +msgstr "Wedi allgofnodi" #: weblate/accounts/views.py:975 msgid "Register e-mail" @@ -1147,10 +1135,9 @@ msgstr "" "Ychwanegu manylion adnabod eraill trwy gadarnhau eich cyfeiriad e-bost." #: weblate/accounts/views.py:1335 -#, fuzzy, python-format -#| msgid "Could not generate key: %s" +#, python-format msgid "Could not authenticate: %s" -msgstr "Methu cynhyrchu allwedd: %s" +msgstr "Methu â dilysu: %s" #: weblate/accounts/views.py:1345 msgid "Could not complete registration." @@ -1230,32 +1217,26 @@ msgstr "" "ffurfweddu hysbysiadau." #: weblate/accounts/views.py:1649 -#, fuzzy -#| msgid "User invitation was removed." msgid "The security key was removed." -msgstr "Cafodd gwahoddiad defnyddiwr ei ddileu." +msgstr "Tynnwyd yr allwedd ddiogelwch." #: weblate/accounts/views.py:1650 #, python-format msgid "The security key %s was registered." -msgstr "" +msgstr "Cofrestrwyd yr allwedd ddiogelwch %s." #: weblate/accounts/views.py:1687 -#, fuzzy -#| msgid "User invitation was removed." msgid "The authentication app was removed." -msgstr "Cafodd gwahoddiad defnyddiwr ei ddileu." +msgstr "Tynnwyd yr ap dilysu." #: weblate/accounts/views.py:1688 #, python-format msgid "The authentication app %s was registered." -msgstr "" +msgstr "Cofrestrwyd yr ap dilysu %s." #: weblate/accounts/views.py:1821 -#, fuzzy -#| msgid "Last sign in" msgid "Second factor sign in" -msgstr "Mewngofnodiad diwethaf" +msgstr "Mewngofnodi ail ffactor" #: weblate/addons/autotranslate.py:18 weblate/templates/translation.html:73 #: weblate/templates/translation.html:242 @@ -1783,7 +1764,7 @@ msgstr "Rhaid i’r ieithoedd ffynhonnell a tharged fod yn wahanol." #: weblate/addons/forms.py:645 msgid "Enable case-sensitive key sorting" -msgstr "" +msgstr "Galluogi didoli allwedd sy'n sensitif i faint" #: weblate/addons/generate.py:33 msgid "Statistics generator" @@ -2088,10 +2069,8 @@ msgstr "Ychwanegu cofnod geirfa" #. Translators: Permission name #: weblate/auth/data.py:37 -#, fuzzy -#| msgid "Add glossary entry" msgid "Add glossary terminology" -msgstr "Ychwanegu cofnod geirfa" +msgstr "Ychwanegu geirfa derminoleg" #. Translators: Permission name #: weblate/auth/data.py:39 @@ -2645,13 +2624,13 @@ msgstr "Gall y gweinyddwr ychwanegu neu dynnu defnyddwyr o dîm." #: weblate/auth/models.py:194 weblate/trans/models/project.py:193 msgid "Enforced two-factor authentication" -msgstr "" +msgstr "Dilysiad dau ffactor gorfodol" #: weblate/auth/models.py:197 -#, fuzzy -#| msgid "Redirecting you to the authentication provider." msgid "Requires users to have two-factor authentication configured." -msgstr "Eich ailgyfeirio at y darparwr dilysu." +msgstr "" +"Mae'n ei gwneud yn ofynnol i ddefnyddwyr gael dilysiad dau ffactor wedi'i " +"ffurfweddu." #: weblate/auth/models.py:398 weblate/utils/forms.py:71 #: weblate/utils/validators.py:173 @@ -2762,6 +2741,8 @@ msgid "" "This project requires two-factor authentication; configure it in your " "profile." msgstr "" +"Mae angen dilysu dau ffactor ar gyfer y prosiect hwn; ffurfweddwch ef yn " +"eich proffil." #: weblate/auth/permissions.py:184 weblate/templates/translate.html:175 #: weblate/templates/translate.html:231 @@ -3830,7 +3811,7 @@ msgstr "Nid yw llinyn fformat brace Python yn cyfateb i'r ffynhonnell" #: weblate/checks/format.py:611 msgid "Single {} encountered in the format string." -msgstr "" +msgstr "Wedi dod ar draws {} sengl yn y llinyn fformat." #: weblate/checks/format.py:638 msgid "C# format" @@ -4543,7 +4524,7 @@ msgstr "Ffeil Fluent" #: weblate/formats/txt.py:89 msgid "Should be a directory with metadata files!" -msgstr "" +msgstr "Dylai fod yn gyfeiriadur gyda ffeiliau metadata!" #: weblate/formats/txt.py:196 msgid "App store metadata files" @@ -5172,26 +5153,25 @@ msgid "Region ID" msgstr "ID rhanbarth" #: weblate/machinery/forms.py:260 -#, fuzzy -#| msgid "Context" msgctxt "Automatic suggestion service configuration" msgid "Context vector" -msgstr "Cyd-destun" +msgstr "Fector cyd-destun" #: weblate/machinery/forms.py:263 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Rhestr o IDau cof IDs:weight. wedi'u gwahanu gan goma, e.e: 1234:0.123,4567:0" +".456" #: weblate/machinery/forms.py:276 -#, fuzzy, python-format -#| msgid "The translation is not valid XML" +#, python-format msgid "The context vector is not valid: %s" -msgstr "Nid yw'r cyfieithiad yn XML dilys" +msgstr "Nid yw'r fector cyd-destun yn ddilys: %s" #: weblate/machinery/forms.py:280 #, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "Rhaid i'r gwerth pwysau fod rhwng 0 ac 1: %s" #: weblate/machinery/forms.py:291 msgctxt "Automatic suggestion service configuration" @@ -5205,23 +5185,15 @@ msgstr "" "(an)ffurfiol" #: weblate/machinery/forms.py:308 -#, fuzzy -#| msgid "Translation comment" msgctxt "Automatic suggestion service configuration" msgid "Translation context" -msgstr "Sylw ar gyfieithiad" +msgstr "Cyd-destun cyfieithu" #: weblate/machinery/forms.py:312 -#, fuzzy -#| msgid "" -#| "Describe the persona of translator to improve the accuracy of the " -#| "translation. For example: “You are a squirrel breeder.”" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." -msgstr "" -"Disgrifiwch bersona'r cyfieithydd i wella cywirdeb y cyfieithiad. Er " -"enghraifft: “Rydych chi'n fridiwr gwiwerod.”" +msgstr "Disgrifiwch gyd-destun y cyfieithiad i wella cywirdeb y cyfieithiad." #: weblate/machinery/forms.py:322 msgctxt "Automatic suggestion service configuration" @@ -5254,20 +5226,18 @@ msgid "Automatic selection" msgstr "Dewis awtomatig" #: weblate/machinery/forms.py:354 -#, fuzzy -#| msgid "Custom" msgctxt "OpenAI model selection" msgid "Custom model" -msgstr "Cyfaddas" +msgstr "Model cyfaddas" #: weblate/machinery/forms.py:359 msgctxt "Automatic suggestion service configuration" msgid "OpenAI API base URL" -msgstr "" +msgstr "URL sylfaen API OpenAI" #: weblate/machinery/forms.py:363 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "URL sylfaenol yr API OpenAI, os yw'n wahanol i URL rhagosodedig OpenAI" #: weblate/machinery/forms.py:370 msgctxt "Automatic suggestion service configuration" @@ -5275,44 +5245,41 @@ msgid "OpenAI model" msgstr "Model OpenAI" #: weblate/machinery/forms.py:378 -#, fuzzy -#| msgid "Customize the component name" msgctxt "OpenAI model selection" msgid "Custom model name" -msgstr "Cyfaddasu enw cydran" +msgstr "Enw model cyfaddas" #: weblate/machinery/forms.py:380 msgid "Only needed when model is set to 'Custom model'" -msgstr "" +msgstr "Dim ond ei angen pan fydd y model wedi'i osod i 'Model cyfaddas'" #: weblate/machinery/forms.py:390 -#, fuzzy -#| msgid "Missing username or e-mail." msgid "Missing custom model name." -msgstr "Enw defnyddiwr neu e-bost ar goll." +msgstr "Enw model cyfaddas ar goll." #: weblate/machinery/forms.py:394 msgid "Choose custom model here to enable it." -msgstr "" +msgstr "Dewiswch fodel cyfaddas yma i'w alluogi." #: weblate/machinery/forms.py:403 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI endpoint URL" -msgstr "" +msgstr "URL diweddbwynt Azure OpenAI" #: weblate/machinery/forms.py:407 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." msgstr "" +"URL diweddbwynt yr enghraifft, e.e: https://my-instance.openai.azure.com." #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Defnydd Azure OpenAI" #: weblate/machinery/forms.py:416 msgid "The model's unique deployment name." -msgstr "" +msgstr "Enw defnydd unigryw'r model." #: weblate/machinery/views.py:404 msgid "Service is currently not available." @@ -5536,48 +5503,33 @@ msgid "CSRF verification failed. Request aborted." msgstr "Gwirio CSRF wedi methu. Ataliwyd y cais." #: weblate/templates/403_csrf.html:15 -#, fuzzy -#| msgid "" -#| "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 your browser is not hijacked by third-parties." msgid "" "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, ensuring " "that your browser is not being hijacked by third parties." msgstr "" -"Mae'r wefan HTTPS hon angen pennyn 'Cyfeirwyr' i'w anfon gan eich porwr gwe, " -"ond ni anfonwyd yr un. Mae angen y pennyn hwn am resymau diogelwch, er mwyn " -"sicrhau na chaiff eich porwr ei herwgipio gan drydydd partïon." +"Mae'r wefan HTTPS hon angen pennawd 'Cyfeirwyr' i'w anfon gan eich porwr " +"gwe, ond ni anfonwyd yr un. Mae angen y pennawd hwn am resymau diogelwch, " +"gan sicrhau nad yw eich porwr yn cael ei herwgipio gan drydydd parti." #: weblate/templates/403_csrf.html:16 -#, fuzzy -#| msgid "" -#| "If you have set up your web browser to not send 'Referer' headers, please " -#| "turn that on (at-least for this site, for HTTPS connections, or for 'same-" -#| "origin' requests)." msgid "" "If you have set up your web browser to not send 'Referer' headers, you need " "to turn that on (at least for this site, HTTPS connections, or 'same-origin' " "requests)." msgstr "" -"Os ydych chi wedi gosod eich porwr gwe i beidio ag anfon penynnau " -"'Cyfeiriwr', trowch hwnnw ymlaen (o leiaf ar gyfer y wefan hon, ar gyfer " -"cysylltiadau HTTPS, neu ar gyfer ceisiadau 'yr un tarddiad')." +"Os ydych wedi sefydlu'ch porwr gwe i beidio ag anfon penawdau 'Cyfeirwyr', " +"mae angen i chi droi hynny ymlaen (o leiaf ar gyfer y wefan hon, " +"cysylltiadau HTTPS, neu geisiadau 'un-darddiad')." #: weblate/templates/403_csrf.html:18 -#, fuzzy -#| msgid "" -#| "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 "" "Our site requires a session cookie to make the forms work. This cookie is " "required for security reasons, ensuring that your browser is not being " "hijacked by third parties." msgstr "" -"Mae angen cwci CSRF ar y wefan hon wrth gyflwyno ffurflenni. Mae angen y " -"cwci hwn am resymau diogelwch, er mwyn sicrhau nad yw eich porwr yn cael ei " +"Mae angen cwci CSRF ar ein gwefan i'r ffurflenni weithio. Mae angen y cwci " +"hwn am resymau diogelwch, er mwyn sicrhau nad yw eich porwr yn cael ei " "herwgipio gan drydydd partïon." #: weblate/templates/403_csrf.html:19 @@ -5586,18 +5538,18 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Gallai fod wedi digwydd bod eich cwci sesiwn wedi dod i ben oherwydd " +"anweithgarwch. Gall hyn ddigwydd yn hawdd ar gyfer ceisiadau heb eu dilysu " +"lle mae dilysrwydd sesiwn yn gyfyngedig. Efallai y byddwch am roi cynnig ar " +"y camau a fwriadwyd gennych eto mewn achos o'r fath." #: weblate/templates/403_csrf.html:20 -#, fuzzy -#| msgid "" -#| "If you have set up your browser to not save cookies, please turn them on " -#| "again (at-least for this site, or for 'same-origin' requests)." msgid "" "If you have set up your browser to not save cookies, you need to enable " "saving them (at least for this site, or 'same-origin' requests)." msgstr "" -"Os ydych wedi gosod eich porwr i beidio â chadw cwcis, trowch nhw ymlaen eto " -"(o leiaf ar gyfer y wefan hon, neu ar gyfer ceisiadau 'un tarddiad')." +"Os ydych chi wedi gosod eich porwr i beidio â chadw cwcis, mae angen i chi " +"alluogi eu cadw (ar gyfer y wefan hon o leiaf, neu geisiadau 'un tarddiad')." #: weblate/templates/403_csrf.html:22 #, python-format @@ -5817,11 +5769,11 @@ msgstr "Ystadegau" #: weblate/templates/accounts/2fa.html:24 msgid "Second factor sign-in" -msgstr "" +msgstr "Mewngofnodi ail ffactor" #: weblate/templates/accounts/2fa.html:30 msgid "Please complete your sign-in using second factor credential." -msgstr "" +msgstr "Cwblhewch eich mewngofnodi gan ddefnyddio manylion ail ffactor." #: weblate/templates/accounts/confirm.html:7 #: weblate/templates/accounts/password.html:6 @@ -6199,26 +6151,24 @@ msgstr "Ychwanegu hunaniaeth defnyddiwr newydd" #: weblate/templates/accounts/profile.html:188 #: weblate/templates/accounts/user.html:354 -#, fuzzy -#| msgid "Authentication" msgid "Two-factor authentication" -msgstr "Dilysu" +msgstr "Dilysu dau ffactor" #: weblate/templates/accounts/profile.html:192 msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Mae dilysu dau ffactor yn ychwanegu haen arall o ddiogelwch i'ch cyfrif trwy " +"ofyn am fwy na chyfrinair yn unig i fewngofnodi." #: weblate/templates/accounts/profile.html:196 msgid "Security keys (WebAuthn)" -msgstr "" +msgstr "Allweddi diogelwch (WebAuthn)" #: weblate/templates/accounts/profile.html:198 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no WebAuthn keys registered." -msgstr "Nid oes copïau wrth gefn ar gael ar hyn o bryd." +msgstr "Nid oes unrhyw allweddi WebAuthn wedi'u cofrestru ar hyn o bryd." #: weblate/templates/accounts/profile.html:203 #: weblate/templates/accounts/profile.html:235 @@ -6234,72 +6184,62 @@ msgstr "Tynnu" #: weblate/templates/accounts/profile.html:213 msgid "Name your security key" -msgstr "" +msgstr "Enwch eich allwedd ddiogelwch" #: weblate/templates/accounts/profile.html:214 -#, fuzzy -#| msgid "Register new account" msgid "Register new security key" -msgstr "Cofrestru cyfrif newydd" +msgstr "Cofrestru allwedd diogelwch newydd" #: weblate/templates/accounts/profile.html:220 #: weblate/templates/accounts/webauthn.html:12 msgid "Unfortunately, your browser has no WebAuthn support." -msgstr "" +msgstr "Yn anffodus, nid oes gan eich porwr unrhyw gefnogaeth WebAuthn." #: weblate/templates/accounts/profile.html:228 -#, fuzzy -#| msgid "Authentication" msgid "Authenticator apps (TOTP)" -msgstr "Dilysu" +msgstr "Apiau Dilyswr (TOTP)" #: weblate/templates/accounts/profile.html:230 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no authenticator apps registered." -msgstr "Nid oes copïau wrth gefn ar gael ar hyn o bryd." +msgstr "Nid oes unrhyw apiau dilysu wedi'u cofrestru ar hyn o bryd." #: weblate/templates/accounts/profile.html:242 #: weblate/templates/accounts/totp.html:11 #: weblate/templates/accounts/totp.html:22 -#, fuzzy -#| msgid "Register new account" msgid "Register new authenticator app" -msgstr "Cofrestru cyfrif newydd" +msgstr "Cofrestru ap dilysu newydd" #: weblate/templates/accounts/profile.html:245 #: weblate/templates/accounts/recovery-codes.html:11 #: weblate/templates/accounts/recovery-codes.html:33 msgid "Recovery codes" -msgstr "" +msgstr "Codau adfer" #: weblate/templates/accounts/profile.html:247 #: weblate/templates/accounts/recovery-codes.html:41 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no recovery codes generated." -msgstr "Nid oes copïau wrth gefn ar gael ar hyn o bryd." +msgstr "Nid oes unrhyw godau adfer wedi'u cynhyrchu ar hyn o bryd." #: weblate/templates/accounts/profile.html:248 #: weblate/templates/accounts/recovery-codes.html:44 #: weblate/templates/accounts/recovery-codes.html:51 msgid "Generate new recovery codes" -msgstr "" +msgstr "Cynhyrchwch godau adfer newydd" #: weblate/templates/accounts/profile.html:251 #, python-format msgid "%(count)s recovery code is available." msgid_plural "%(count)s recovery codes are available." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" -msgstr[4] "" -msgstr[5] "" +msgstr[0] "Does dim codau adfer ar gael." +msgstr[1] "Mae %(count)s cod adfer ar gael." +msgstr[2] "Mae %(count)s cod adfer ar gael." +msgstr[3] "Mae %(count)s cod adfer ar gael." +msgstr[4] "Mae %(count)s cod adfer ar gael." +msgstr[5] "Mae %(count)s cod adfer ar gael." #: weblate/templates/accounts/profile.html:257 msgid "View recovery codes" -msgstr "" +msgstr "Gweld codau adfer" #: weblate/templates/accounts/profile.html:269 msgid "User data" @@ -6470,13 +6410,15 @@ msgstr "Trwyddedau ar gyfer cyfieithiadau unigol" #: weblate/templates/accounts/recovery-codes.html:20 msgid "Two-factor recovery codes" -msgstr "" +msgstr "Codau adfer dau ffactor" #: weblate/templates/accounts/recovery-codes.html:25 msgid "" "Recovery codes can be used to access your account if you lose access to your " "device and cannot receive two-factor authentication codes." msgstr "" +"Gellir defnyddio codau adfer i gael mynediad i'ch cyfrif os byddwch yn colli " +"mynediad i'ch dyfais ac yn methu â derbyn codau dilysu dau ffactor." #: weblate/templates/accounts/recovery-codes.html:29 msgid "" @@ -6485,29 +6427,31 @@ msgid "" "password and other second factors. If you cannot find these codes when " "needed, you will lose access to your account." msgstr "" +"Cadwch eich codau adfer mewn man diogel, fel mewn rheolwr cyfrinair. Y codau " +"hyn yw'r dewis olaf ar gyfer cyrchu'ch cyfrif rhag ofn i chi golli'ch " +"cyfrinair ac ail ffactorau eraill. Os na allwch ddod o hyd i'r codau hyn pan " +"fo angen, byddwch yn colli mynediad i'ch cyfrif." #: weblate/templates/accounts/recovery-codes.html:39 -#, fuzzy -#| msgid "Repository URL copied to clipboard." msgid "Recovery codes copied to clipboard." -msgstr "URL y storfa wedi'i gopïo i'r clipfwrdd." +msgstr "Codau adfer wedi'u copïo i'r clipfwrdd." #: weblate/templates/accounts/recovery-codes.html:47 msgid "" "When you generate new recovery codes, you must download or print the new " "codes." msgstr "" +"Pan fyddwch chi'n cynhyrchu codau adfer newydd, rhaid i chi lwytho i lawr " +"neu argraffu'r codau newydd." #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Bydd eich hen godau'n dod yn annilys ac ni fyddant yn gweithio mwyach." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 -#, fuzzy -#| msgid "Edit component settings" msgid "Back to account settings" -msgstr "Golygu gosodiadau cydran" +msgstr "Yn ôl i osodiadau cyfrif" #: weblate/templates/accounts/redirect.html:14 #: weblate/templates/accounts/token.html:12 @@ -6584,20 +6528,20 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"Mae apiau Dilysu yn cynhyrchu cyfrineiriau un-amser a ddefnyddir fel ail " +"ffactor i wirio'ch hunaniaeth pan ofynnir i chi wrth fewngofnodi." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" -msgstr "" +msgstr "Sganiwch y cod QR" #: weblate/templates/accounts/totp.html:37 msgid "You can also enter the secret key manually:" -msgstr "" +msgstr "Gallwch hefyd nodi'r allwedd gyfrinachol â llaw:" #: weblate/templates/accounts/totp.html:40 -#, fuzzy -#| msgid "API key copied to clipboard." msgid "Secret key copied to clipboard." -msgstr "Allwedd API wedi'i chopïo i'r clipfwrdd." +msgstr "Allwedd gyfrinachol wedi'i chopïo i'r clipfwrdd." #: weblate/templates/accounts/totp.html:45 #: weblate/templates/mail/shared-registration.html:22 @@ -6757,10 +6701,8 @@ msgid "Edit" msgstr "Golygu" #: weblate/templates/accounts/user.html:171 -#, fuzzy -#| msgid "No recent activity found!" msgid "No recent contributions found." -msgstr "Dim gweithgaredd diweddar!" +msgstr "Ni ddarganfuwyd unrhyw gyfraniadau diweddar." #: weblate/templates/accounts/user.html:172 msgid "Browse all translations with contribution" @@ -6788,10 +6730,8 @@ msgid "User ID" msgstr "ID defnyddiwr" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" -msgstr "Hysbysiadau" +msgstr "Hysbysiad" #: weblate/templates/accounts/user.html:237 weblate/trans/forms.py:1078 msgid "Scope" @@ -6799,7 +6739,7 @@ msgstr "Cwmpas" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Amlder" #: weblate/templates/accounts/user.html:241 msgid "One-time" @@ -6837,31 +6777,24 @@ msgid "Unblock user" msgstr "Dadflocio defnyddiwr" #: weblate/templates/accounts/user.html:342 -#, fuzzy -#| msgctxt "Access-control role" -#| msgid "Edit source" msgid "Edit user" -msgstr "Golygu ffynhonnell" +msgstr "Golygu defnyddiwr" #: weblate/templates/accounts/user.html:359 msgid "User has two-factor authentication configured." -msgstr "" +msgstr "Mae gan y defnyddiwr ddilysiad dau ffactor wedi'i ffurfweddu." #: weblate/templates/accounts/user.html:361 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "User doesn't have two-factor authentication configured." -msgstr "Nid yw'r gweinydd yn caniatáu dilysu." +msgstr "Nid oes gan y defnyddiwr ddilysiad dau ffactor wedi'i ffurfweddu." #: weblate/templates/accounts/user.html:366 msgid "Disable two-factor authentication" -msgstr "" +msgstr "Analluogu dilysu dau ffactor" #: weblate/templates/accounts/user.html:373 -#, fuzzy -#| msgid "Account removal deletes all your private data." msgid "Account removal deletes all user private data." -msgstr "Mae dileu cyfrif yn dileu eich holl ddata preifat." +msgstr "Mae dileu cyfrif yn dileu'r holl ddata preifat defnyddwyr." #: weblate/templates/accounts/user.html:376 #: weblate/templates/accounts/user.html:390 @@ -6929,7 +6862,7 @@ msgstr "Cyfieithiadau gyda chyfraniad" #: weblate/templates/accounts/webauthn.html:7 msgid "Sign in using the security key" -msgstr "" +msgstr "Mewngofnodwch gan ddefnyddio'r allwedd ddiogelwch" #: weblate/templates/addons/addon_detail.html:10 #: weblate/templates/addons/addon_detail.html:12 @@ -6948,18 +6881,13 @@ msgid "Configure add-on" msgstr "Ffurfweddu ychwanegyn" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Mae'r ychwanegyn hwn yn gweithredo sgript." +msgstr "Nid oes gan yr ychwanegyn hwn unrhyw osodiadau." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 -#, fuzzy -#| msgid "Add-ons can be installed on project and component scope as well." msgid "The add-on can only be installed on the component." -msgstr "" -"Mae modd gosod ychwanegynnau ar gylch gorchwyl prosiect a chydran hefyd." +msgstr "Dim ond ar y gydran y gellir gosod yr ychwanegyn." #: weblate/templates/addons/addon_head.html:9 msgid "This add-on is used for all components sharing this repository." @@ -7353,10 +7281,8 @@ msgid "Automatic assignment" msgstr "Aseiniad awtomatig" #: weblate/templates/auth/teams-name.html:4 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "Requires two-factor authentication" -msgstr "Nid yw'r gweinydd yn caniatáu dilysu." +msgstr "Mae angen dilysu dau ffactor" #: weblate/templates/auth/teams-roles.html:5 msgid "Access only" @@ -8043,10 +7969,9 @@ msgstr "Mae'r gydran yn cael ei diweddaru…" #: weblate/templates/component-progress.html:31 #: weblate/templates/multi-progress.html:26 -#, fuzzy, python-format -#| msgid "Invitation to %(project_name)s" +#, python-format msgid "Continue to %(return_target)s" -msgstr "Gwahoddiad i %(project_name)s" +msgstr "Parhau i %(return_target)s" #: weblate/templates/component-progress.html:33 msgid "Abort the update" @@ -8054,10 +7979,8 @@ msgstr "Atal y diweddariad" #: weblate/templates/component-progress.html:38 #: weblate/templates/multi-progress.html:30 -#, fuzzy -#| msgid "Return to the component after completion" msgid "Continue after completion" -msgstr "Nôl i'r gydran ar ôl ei chwblhau" +msgstr "Parhewch ar ôl cwblhau" #: weblate/templates/component.html:36 weblate/wladmin/views.py:80 msgid "Alerts" @@ -9589,16 +9512,14 @@ msgstr[4] "%(count)s llinyn heb eu gorffen" msgstr[5] "%(count)s llinyn heb eu gorffen" #: weblate/templates/mail/translated_component_subject.txt:3 -#, fuzzy, python-format -#| msgid "The translations in several languages have failing checks" +#, python-format msgid "Translations in all languages have been completed in %(component)s" -msgstr "Mae yna gwiriadau anghyflawn ar gyfieithiadau mewn sawl iaith" +msgstr "Mae cyfieithiadau ym mhob iaith wedi'u cwblhau yn %(component)s" #: weblate/templates/mail/translated_language_subject.txt:3 -#, fuzzy, python-format -#| msgid "Translations have been updated." +#, python-format msgid "%(translation)s has been completed" -msgstr "Mae'r cyfieithiadau wedi'u diweddaru." +msgstr "Mae %(translation)s wedi'u cwblhau" #: weblate/templates/manage/alerts.html:7 msgid "Component alerts" @@ -10131,10 +10052,8 @@ msgid "Delete announcement" msgstr "Dileu cyhoeddiad" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" -msgstr "Mae'r gydran yn cael ei diweddaru…" +msgstr "Mae cydrannau yn cael eu diweddaru…" #: weblate/templates/new-language.html:25 msgid "" @@ -10303,16 +10222,12 @@ msgid "Please try again later." msgstr "Ceisiwch eto nes ymlaen." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Diolch am ddefnyddio Weblate." +msgstr "Diolch am ddefnyddio Weblate" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Dangos ar ddangosffwrdd" +msgstr "Dychwelyd i'r dangosfwrdd" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10374,10 +10289,8 @@ msgid "Add to screenshot" msgstr "Ychwanegu i llun sgrin" #: weblate/templates/screenshots/snippets/paste-button.html:4 -#, fuzzy -#| msgid "Copy token to clipboard" msgid "Paste from clipboard" -msgstr "Copïo tocyn i'r clipfwrdd" +msgstr "Gludo o'r clipfwrdd" #: weblate/templates/search.html:25 #: weblate/templates/snippets/embed-units.html:114 @@ -10534,19 +10447,23 @@ msgstr "Wrthi’n llwytho canlyniadau…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Ffurfweddu dilysu dau ffactor" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Mae'r prosiect hwn yn gofyn am ddilysiad dau ffactor gan yr holl gyfranwyr. " +"Ni fyddwch yn gallu cyfrannu nes i chi ei ffurfweddu." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"Rydych chi'n aelod o'r tîm sydd angen dilysu dau ffactor. Ni fyddwch yn " +"gallu defnyddio unrhyw un o'i freintiau nes i chi ffurfweddu 2FA." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10670,8 +10587,8 @@ msgstr[0] "" "Mae awgrymiadau'n cael eu derbyn fel cyfieithiad unwaith iddyn nhw gael " "%(count)s pleidlais." msgstr[1] "" -"Mae awgrymiadau gydag un bleidlais yn cael eu derbyn yn awtomatig fel " -"cyfieithiadau." +"Mae awgrymiadau'n cael ei dderbyn fel cyfieithiad unwaith iddo gael %(count)" +"s pleidlais." msgstr[2] "" "Mae awgrymiadau'n cael eu derbyn fel cyfieithiad unwaith iddyn nhw gael " "%(count)s pleidlais." @@ -10906,16 +10823,12 @@ msgstr "" "%(link_fsf_start)sa gydnabyddir yn rhydd gan FSF%(link_end)s." #: weblate/templates/snippets/libre-basic.html:10 -#, fuzzy -#| msgid "" -#| "All the source code has to be publicly available in a supported version " -#| "control system." msgid "" "All the source code has to be libre-licensed and publicly available in a " "supported version control system." msgstr "" -"Rhaid i'r holl god ffynhonnell fod ar gael i'r cyhoedd mewn system rheoli " -"fersiwn a gefnogir." +"Mae'n rhaid i'r holl god ffynhonnell fod wedi'i drwyddedu'n rhydd ac ar gael " +"i'r cyhoedd mewn system rheoli fersiwn a gefnogir." #: weblate/templates/snippets/libre-basic.html:11 msgid "" @@ -11249,7 +11162,7 @@ msgstr "Pob llinyn heb ei gyfieithu a ychwanegwyd yn ystod y mis diwethaf" #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Newidiodd yr hidlydd llinynnau 2 wythnos yn ôl" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" @@ -13623,10 +13536,8 @@ msgid "Untranslatable term" msgstr "Term anghyfieithiadwy" #: weblate/trans/forms.py:2506 -#, fuzzy -#| msgid "You currently do not have permission to create projects." msgid "You do not have permission to create terminology." -msgstr "Nid oes gennych ganiatâd i greu prosiectau ar hyn o bryd." +msgstr "Nid oes gennych ganiatâd i greu terminoleg." #: weblate/trans/forms.py:2572 msgid "State to set" @@ -13699,10 +13610,8 @@ msgid "Author username" msgstr "Enw defnyddiwr yr awdur" #: weblate/trans/forms.py:2767 -#, fuzzy -#| msgid "Changes pushed" msgid "Change period" -msgstr "Newidiadau wedi'u gwthio" +msgstr "Newid cyfnod" #: weblate/trans/forms.py:2779 msgid "Could not find matching user!" @@ -14342,10 +14251,8 @@ msgstr "Cyfieithiad diweddarwyd gan ffynhonnell llwytho i fyny" #. Translators: Name of event in the history #: weblate/trans/models/change.py:508 -#, fuzzy -#| msgid "Translation completed" msgid "Component translation completed" -msgstr "Cwblhawyd y cyfieithiad" +msgstr "Cyfieithiad cydran wedi'i gwblhau" #: weblate/trans/models/change.py:592 msgid "The component was automatically locked because of an alert." @@ -14363,10 +14270,9 @@ msgstr "%(action)s am %(time)s ar %(translation)s gan %(user)s" #. Translators: condensed rendering of a change action in history #: weblate/trans/models/change.py:681 -#, fuzzy, python-format -#| msgid "%(action)s at %(time)s on %(translation)s by %(user)s" +#, python-format msgid "%(action)s at %(time)s on %(translation)s" -msgstr "%(action)s am %(time)s ar %(translation)s gan %(user)s" +msgstr "%(action)s am %(time)s ar %(translation)s" #: weblate/trans/models/change.py:850 msgid "The “{}” file was changed." @@ -15141,10 +15047,8 @@ msgid "Component list to assign" msgstr "Rhestr cydrannau i'w neilltuo" #: weblate/trans/models/label.py:28 -#, fuzzy -#| msgid "Description" msgid "Label description" -msgstr "Disgrifiad" +msgstr "Disgrifiad label" #: weblate/trans/models/project.py:129 msgid "Public" @@ -15206,6 +15110,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Yn ei gwneud yn ofynnol i gyfranwyr gael dilysu dau-ffactor wedi'i " +"ffurfweddu cyn gallu cyfrannu." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15892,6 +15798,8 @@ msgstr "Mae cais am gyfieithiad newydd wedi ei anfon at gynhalwyr y prosiect." #: weblate/trans/views/basic.py:766 msgid "All languages have been added, updates of translations are in progress." msgstr "" +"Mae pob iaith wedi'i hychwanegu, mae diweddariadau o gyfieithiadau ar y " +"gweill." #: weblate/trans/views/changes.py:63 #, python-format @@ -15970,10 +15878,8 @@ msgid "Your suggestion has been identified as spam!" msgstr "Mae'ch awgrym wedi'i nodi fel sbam!" #: weblate/trans/views/edit.py:319 -#, fuzzy -#| msgid "Memory will be then populated with the current translations." msgid "Your suggestion is similar to the current translation!" -msgstr "Yna bydd y cof yn cael ei boblogi gyda'r cyfieithiadau cyfredol." +msgstr "Mae eich awgrym yn debyg i'r cyfieithiad presennol!" #: weblate/trans/views/edit.py:324 msgid "Your suggestion already exists!" @@ -16123,17 +16029,19 @@ msgstr "Methu cloi'r storfa, mae gweithrediad arall ar y gweill." msgid "" "All repositories have been updated, updates of translations are in progress." msgstr "" +"Mae'r holl storfeydd wedi'u diweddaru, mae diweddariadau o gyfieithiadau ar " +"y gweill." #: weblate/trans/views/git.py:84 msgid "All repositories were pushed." msgstr "Gwthiwyd pob storfa." #: weblate/trans/views/git.py:99 -#, fuzzy -#| msgid "All repositories have been reset." msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Mae'r holl ystorfeydd wedi'u hailosod." +msgstr "" +"Mae'r holl storfe3ydd wedi'u hailosod, mae diweddariadau o gyfieithiadau ar " +"y gweill." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." @@ -16144,10 +16052,8 @@ msgid "Translation files have been synchronized." msgstr "Mae ffeiliau cyfieithu wedi'u cydweddu." #: weblate/trans/views/git.py:155 -#, fuzzy -#| msgid "Automatic translation in progress" msgid "Updates of translations are in progress." -msgstr "Cyfieithu awtomatig yn digwydd" +msgstr "Mae diweddariadau o gyfieithiadau ar y gweill." #: weblate/trans/views/git.py:178 msgid "All pending translations were committed." @@ -16524,10 +16430,8 @@ msgid "This e-mail address is disallowed." msgstr "Ni chaniateir y cyfeiriad e-bost hwn." #: weblate/utils/validators.py:195 -#, fuzzy -#| msgid "Enter a valid e-mail address." msgid "Invalid e-mail address: {}" -msgstr "Rhowch gyfeiriad e-bost dilys." +msgstr "Cyfeiriad e-bost annilys: {}" #: weblate/utils/validators.py:207 msgid "Could not evaluate plural formula: {}" diff --git a/weblate/locale/gl/LC_MESSAGES/django.po b/weblate/locale/gl/LC_MESSAGES/django.po index 779a9ea12710..dd0c2e41f11e 100644 --- a/weblate/locale/gl/LC_MESSAGES/django.po +++ b/weblate/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-03 06:52+0000\n" +"PO-Revision-Date: 2024-10-10 10:08+0000\n" "Last-Translator: \"Miguel A. Bouzada\" \n" "Language-Team: Galician \n" @@ -5192,15 +5192,15 @@ msgstr "" #: weblate/machinery/forms.py:322 msgctxt "Automatic suggestion service configuration" msgid "Translator persona" -msgstr "Tradutor persoa" +msgstr "Persona do tradutor" #: weblate/machinery/forms.py:326 msgid "" "Describe the persona of translator to improve the accuracy of the " "translation. For example: “You are a squirrel breeder.”" msgstr "" -"Describa a personalidade do tradutor para mellorar a precisión da tradución. " -"Por exemplo: «Vde. é un criador de esquíos.»" +"Describa a persona do tradutor para mellorar a precisión da tradución. Por " +"exemplo: «Vde. é un criador de esquíos.»" #: weblate/machinery/forms.py:333 msgctxt "Automatic suggestion service configuration" diff --git a/weblate/locale/id/LC_MESSAGES/django.po b/weblate/locale/id/LC_MESSAGES/django.po index 6e6f7f620c7a..ef3bfbe6ef5c 100644 --- a/weblate/locale/id/LC_MESSAGES/django.po +++ b/weblate/locale/id/LC_MESSAGES/django.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-09-20 19:19+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-10-11 16:27+0000\n" +"Last-Translator: Linerly \n" "Language-Team: Indonesian \n" "Language: id\n" @@ -1109,10 +1109,8 @@ msgid "Sign in" msgstr "Masuk" #: weblate/accounts/views.py:869 -#, fuzzy -#| msgid "Sign out" msgid "Signed out" -msgstr "Keluar" +msgstr "Telah keluar" #: weblate/accounts/views.py:975 msgid "Register e-mail" @@ -1141,10 +1139,9 @@ msgid "Add another identity by confirming your e-mail address first." msgstr "Tambah identitas lain dengan mengonfirmasi surel Anda terlebih dahulu." #: weblate/accounts/views.py:1335 -#, fuzzy, python-format -#| msgid "Could not generate key: %s" +#, python-format msgid "Could not authenticate: %s" -msgstr "Tidak dapat membuat kunci: %s" +msgstr "Tidak dapat mengautentikasi: %s" #: weblate/accounts/views.py:1345 msgid "Could not complete registration." @@ -5135,26 +5132,24 @@ msgid "Region ID" msgstr "ID kawasan" #: weblate/machinery/forms.py:260 -#, fuzzy -#| msgid "Context" msgctxt "Automatic suggestion service configuration" msgid "Context vector" -msgstr "Konteks" +msgstr "Vektor konteks" #: weblate/machinery/forms.py:263 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Daftar berisi ID:berat memori terpisah oleh koma. Mis. 1234:0.123,4567:0.456" #: weblate/machinery/forms.py:276 -#, fuzzy, python-format -#| msgid "The translation is not valid XML" +#, python-format msgid "The context vector is not valid: %s" -msgstr "Terjemahan bukan XML yang valid" +msgstr "Vektor konteks ini tidak valid: %s" #: weblate/machinery/forms.py:280 #, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "Nilai berat harus antara 0 dan 1: %s" #: weblate/machinery/forms.py:291 msgctxt "Automatic suggestion service configuration" @@ -5168,23 +5163,16 @@ msgstr "" "(tidak) formal" #: weblate/machinery/forms.py:308 -#, fuzzy -#| msgid "Translation comment" msgctxt "Automatic suggestion service configuration" msgid "Translation context" -msgstr "Komentar terjemahan" +msgstr "Konteks terjemahan" #: weblate/machinery/forms.py:312 -#, fuzzy -#| msgid "" -#| "Describe the persona of translator to improve the accuracy of the " -#| "translation. For example: “You are a squirrel breeder.”" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." msgstr "" -"Deskripsikan persona penerjemah untuk meningkatkan akurasi terjemahan. " -"Misalnya: “Anda adalah peternak tupai.”" +"Deskripsikan konteks penerjemahan untuk meningkatkan akurasi terjemahan." #: weblate/machinery/forms.py:322 msgctxt "Automatic suggestion service configuration" @@ -5252,26 +5240,23 @@ msgid "Choose custom model here to enable it." msgstr "Pilih model khusus di sini untuk mengaktifkannya." #: weblate/machinery/forms.py:403 -#, fuzzy -#| msgctxt "Automatic suggestion service configuration" -#| msgid "Application endpoint URL" msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI endpoint URL" -msgstr "URL titik akhir aplikasi" +msgstr "URL titik akhir OpenAI Azure" #: weblate/machinery/forms.py:407 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." -msgstr "" +msgstr "URL titik akhir server, mis. https://server-aya.openai.azure.com." #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Penyebaran OpenAI Azure" #: weblate/machinery/forms.py:416 msgid "The model's unique deployment name." -msgstr "" +msgstr "Nama penyebaran unik model." #: weblate/machinery/views.py:404 msgid "Service is currently not available." @@ -5498,11 +5483,6 @@ msgid "CSRF verification failed. Request aborted." msgstr "Verifikasi CSRF gagal, Permintaan dibatalkan." #: weblate/templates/403_csrf.html:15 -#, fuzzy -#| msgid "" -#| "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 your browser is not hijacked by third-parties." msgid "" "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, ensuring " @@ -5513,32 +5493,22 @@ msgstr "" "keamanan, untuk memastikan peramban Anda tidak dibajak oleh pihak ketiga." #: weblate/templates/403_csrf.html:16 -#, fuzzy -#| msgid "" -#| "If you have set up your web browser to not send 'Referer' headers, please " -#| "turn that on (at-least for this site, for HTTPS connections, or for 'same-" -#| "origin' requests)." msgid "" "If you have set up your web browser to not send 'Referer' headers, you need " "to turn that on (at least for this site, HTTPS connections, or 'same-origin' " "requests)." msgstr "" "Jika Anda telah mengatur peramban web Anda untuk tidak mengirim kepala " -"'Referer', mohon untuk mengaktifkannya (setidaknya untuk situs ini, untuk " -"koneksi HTTPS, atau untuk permintaan 'same-origin')." +"'Referer', Anda perlu mengaktifkannya (setidaknya untuk situs ini, koneksi " +"HTTPS, atau permintaan 'same-origin')." #: weblate/templates/403_csrf.html:18 -#, fuzzy -#| msgid "" -#| "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 "" "Our site requires a session cookie to make the forms work. This cookie is " "required for security reasons, ensuring that your browser is not being " "hijacked by third parties." msgstr "" -"Situs ini memerlukan kuki CSRF saat mengirimkan formulir. Kuki ini " +"Situs kami memerlukan kuki sesi until menggunakan formulir. Kuki ini " "diperlukan demi alasan keamanan, untuk memastikan bahwa peramban Anda tidak " "dibajak oleh pihak ketiga." @@ -5548,18 +5518,18 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Mungkin saja kuki sesi Anda kedaluwarsa karena tidak aktif. Hal ini dapat " +"dengan mudah terjadi pada permintaan yang tidak diautentikasi di mana " +"validitas sesi terbatas. Anda mungkin ingin mencoba tindakan yang Anda " +"maksudkan lagi dalam kasus seperti ini." #: weblate/templates/403_csrf.html:20 -#, fuzzy -#| msgid "" -#| "If you have set up your browser to not save cookies, please turn them on " -#| "again (at-least for this site, or for 'same-origin' requests)." msgid "" "If you have set up your browser to not save cookies, you need to enable " "saving them (at least for this site, or 'same-origin' requests)." msgstr "" -"Jika Anda telah mengatur peramban Anda untuk tidak menyimpan kuki, harap " -"aktifkan kembali (setidaknya untuk situs ini atau untuk permintaan 'same-" +"Jika Anda telah mengatur peramban Anda untuk tidak menyimpan kuki, Anda " +"harus mengaktifkannya lagi (setidaknya untuk situs ini atau permintaan 'same-" "origin')." #: weblate/templates/403_csrf.html:22 @@ -6699,8 +6669,6 @@ msgid "User ID" msgstr "ID Pengguna" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" msgstr "Notifikasi" @@ -6710,7 +6678,7 @@ msgstr "Cakupan" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Frekuensi" #: weblate/templates/accounts/user.html:241 msgid "One-time" @@ -6852,10 +6820,8 @@ msgid "Configure add-on" msgstr "Mengonfigurasi pengaya" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Pengaya ini mengeksekusi suatu skrip." +msgstr "Pengaya ini tidak memiliki pengaturan." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 @@ -9884,8 +9850,6 @@ msgid "Delete announcement" msgstr "Hapus pengumuman" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" msgstr "Komponen sedang diperbarui…" @@ -10053,16 +10017,12 @@ msgid "Please try again later." msgstr "Silakan coba lagi nanti." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Terima kasih telah menggunakan Weblate." +msgstr "Terima kasih telah menggunakan Weblate" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Perlihatkan di dasbor" +msgstr "Kembali ke dasbor" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10972,7 +10932,7 @@ msgstr "Semua string yang tidak diterjemahkan ditambahkan bulan lalu" #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Filter mengubah string 2 minggu yang lalu" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" diff --git a/weblate/locale/it/LC_MESSAGES/django.po b/weblate/locale/it/LC_MESSAGES/django.po index 49e45406f58c..e23babe12366 100644 --- a/weblate/locale/it/LC_MESSAGES/django.po +++ b/weblate/locale/it/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-09-21 12:00+0000\n" +"PO-Revision-Date: 2024-10-09 00:14+0000\n" "Last-Translator: Massimo Pissarello \n" "Language-Team: Italian \n" diff --git a/weblate/locale/lt/LC_MESSAGES/django.po b/weblate/locale/lt/LC_MESSAGES/django.po index da32035b637f..f7ae87632ce2 100644 --- a/weblate/locale/lt/LC_MESSAGES/django.po +++ b/weblate/locale/lt/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-09-20 19:19+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-10-07 17:53+0000\n" +"Last-Translator: Vaclovas Intas \n" "Language-Team: Lithuanian \n" "Language: lt\n" @@ -2097,7 +2097,7 @@ msgstr "" #: weblate/api/views.py:1945 msgid "User" -msgstr "Naudotojas/Vartotojas" +msgstr "Naudotojas" #: weblate/api/views.py:1953 weblate/fonts/models.py:148 #: weblate/templates/category.html:109 weblate/templates/component.html:123 diff --git a/weblate/locale/pl/LC_MESSAGES/django.po b/weblate/locale/pl/LC_MESSAGES/django.po index 169ce78c891f..cb4ef6af4a76 100644 --- a/weblate/locale/pl/LC_MESSAGES/django.po +++ b/weblate/locale/pl/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-06 23:36+0000\n" +"PO-Revision-Date: 2024-10-09 00:14+0000\n" "Last-Translator: Agnieszka C \n" "Language-Team: Polish \n" @@ -5122,7 +5122,7 @@ msgstr "ID klucza dostępu" #: weblate/machinery/forms.py:246 msgctxt "Alibaba Translate configuration" msgid "Access key secret" -msgstr "Sekret klucza dostępu" +msgstr "Tajny klucz dostępu" #: weblate/machinery/forms.py:249 msgctxt "Alibaba Translate configuration" @@ -6407,29 +6407,31 @@ msgid "" "password and other second factors. If you cannot find these codes when " "needed, you will lose access to your account." msgstr "" +"Przechowuj kody odzyskiwania w bezpiecznym miejscu, np. w menedżerze haseł. " +"Kody te są ostatnią deską ratunku, jeśli chodzi o dostęp do konta, jeśli " +"zgubisz hasło i inne metody odzyskiwania. Jeśli nie będziesz w stanie " +"odnaleźć tych kodów w razie potrzeby, utracisz dostęp do swojego konta." #: weblate/templates/accounts/recovery-codes.html:39 -#, fuzzy -#| msgid "Repository URL copied to clipboard." msgid "Recovery codes copied to clipboard." -msgstr "Adres URL repozytorium skopiowany do schowka." +msgstr "Kody odzyskiwania skopiowano do schowka." #: weblate/templates/accounts/recovery-codes.html:47 msgid "" "When you generate new recovery codes, you must download or print the new " "codes." msgstr "" +"Kiedy generujesz nowe kody odzyskiwania, musisz pobrać lub wydrukować nowe " +"kody." #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Twoje stare kody staną się nieważne i nie będą już działać." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 -#, fuzzy -#| msgid "Edit component settings" msgid "Back to account settings" -msgstr "Edytuj ustawienia komponentów" +msgstr "Powrót do ustawień konta" #: weblate/templates/accounts/redirect.html:14 #: weblate/templates/accounts/token.html:12 @@ -6504,20 +6506,20 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"Aplikacje uwierzytelniające generują jednorazowe hasła, które są używane " +"jako drugi czynnik do weryfikacji tożsamości podczas logowania." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" -msgstr "" +msgstr "Zeskanuj kod QR" #: weblate/templates/accounts/totp.html:37 msgid "You can also enter the secret key manually:" -msgstr "" +msgstr "Możesz również wprowadzić klucz tajny ręcznie:" #: weblate/templates/accounts/totp.html:40 -#, fuzzy -#| msgid "API key copied to clipboard." msgid "Secret key copied to clipboard." -msgstr "Klucz API skopiowany do schowka." +msgstr "Klucz tajny skopiowano do schowka." #: weblate/templates/accounts/totp.html:45 #: weblate/templates/mail/shared-registration.html:22 @@ -6664,10 +6666,8 @@ msgid "Edit" msgstr "Edytuj" #: weblate/templates/accounts/user.html:171 -#, fuzzy -#| msgid "No recent activity found!" msgid "No recent contributions found." -msgstr "Nie znaleziono żadnej ostatniej aktywności!" +msgstr "Nie znaleziono żadnych ostatnich wkładów." #: weblate/templates/accounts/user.html:172 msgid "Browse all translations with contribution" @@ -6695,10 +6695,8 @@ msgid "User ID" msgstr "ID użytkownika" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" -msgstr "Powiadomienia" +msgstr "Powiadomienie" #: weblate/templates/accounts/user.html:237 weblate/trans/forms.py:1078 msgid "Scope" @@ -6706,7 +6704,7 @@ msgstr "Zakres" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Częstotliwość" #: weblate/templates/accounts/user.html:241 msgid "One-time" @@ -6830,7 +6828,7 @@ msgstr "Tłumaczenia z udziałem" #: weblate/templates/accounts/webauthn.html:7 msgid "Sign in using the security key" -msgstr "" +msgstr "Zaloguj się za pomocą klucza bezpieczeństwa" #: weblate/templates/addons/addon_detail.html:10 #: weblate/templates/addons/addon_detail.html:12 @@ -6849,18 +6847,13 @@ msgid "Configure add-on" msgstr "Konfiguruj wtyczkę" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Ten dodatek wykonuje skrypt." +msgstr "Ten dodatek nie ma żadnych ustawień." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 -#, fuzzy -#| msgid "Add-ons can be installed on project and component scope as well." msgid "The add-on can only be installed on the component." -msgstr "" -"Dodatki mogą być również instalowane w zakresie projektów i komponentów." +msgstr "Dodatek można zainstalować tylko na komponencie." #: weblate/templates/addons/addon_head.html:9 msgid "This add-on is used for all components sharing this repository." @@ -7242,10 +7235,8 @@ msgid "Automatic assignment" msgstr "Automatyczne przypisywanie" #: weblate/templates/auth/teams-name.html:4 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "Requires two-factor authentication" -msgstr "Serwer nie zezwala na uwierzytelnianie." +msgstr "Wymaga uwierzytelniania dwuskładnikowego" #: weblate/templates/auth/teams-roles.html:5 msgid "Access only" @@ -7929,10 +7920,9 @@ msgstr "Komponent jest aktualizowany…" #: weblate/templates/component-progress.html:31 #: weblate/templates/multi-progress.html:26 -#, fuzzy, python-format -#| msgid "Invitation to %(project_name)s" +#, python-format msgid "Continue to %(return_target)s" -msgstr "Zaproszenie do %(project_name)s" +msgstr "Kontynuuj do %(return_target)s" #: weblate/templates/component-progress.html:33 msgid "Abort the update" @@ -7940,10 +7930,8 @@ msgstr "Przerwij aktualizację" #: weblate/templates/component-progress.html:38 #: weblate/templates/multi-progress.html:30 -#, fuzzy -#| msgid "Return to the component after completion" msgid "Continue after completion" -msgstr "Wróć do komponentu po zakończeniu" +msgstr "Kontynuuj po zakończeniu" #: weblate/templates/component.html:36 weblate/wladmin/views.py:80 msgid "Alerts" @@ -9412,16 +9400,14 @@ msgstr[1] "%(count)s niedokończone ciągi" msgstr[2] "%(count)s niedokończonych ciągów" #: weblate/templates/mail/translated_component_subject.txt:3 -#, fuzzy, python-format -#| msgid "The translations in several languages have failing checks" +#, python-format msgid "Translations in all languages have been completed in %(component)s" -msgstr "Tłumaczenia w kilku językach nie przeszły kontroli" +msgstr "Tłumaczenia we wszystkich językach zostały ukończone w %(component)s" #: weblate/templates/mail/translated_language_subject.txt:3 -#, fuzzy, python-format -#| msgid "Translations have been updated." +#, python-format msgid "%(translation)s has been completed" -msgstr "Tłumaczenia zostały zaktualizowane." +msgstr "projekt %(translation)s został ukończony" #: weblate/templates/manage/alerts.html:7 msgid "Component alerts" @@ -9943,10 +9929,8 @@ msgid "Delete announcement" msgstr "Usuń ogłoszenie" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" -msgstr "Komponent jest aktualizowany…" +msgstr "Komponenty są aktualizowane…" #: weblate/templates/new-language.html:25 msgid "" @@ -10114,16 +10098,12 @@ msgid "Please try again later." msgstr "Spróbuj ponownie później." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Dziękujemy za korzystanie z Weblate." +msgstr "Dziękujemy za korzystanie z Weblate" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Pokaż na kokpicie" +msgstr "Wróć do kokpitu" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10186,10 +10166,8 @@ msgid "Add to screenshot" msgstr "Dodaj do zrzutu ekranu" #: weblate/templates/screenshots/snippets/paste-button.html:4 -#, fuzzy -#| msgid "Copy token to clipboard" msgid "Paste from clipboard" -msgstr "Skopiuj token do schowka" +msgstr "Wklej ze schowka" #: weblate/templates/search.html:25 #: weblate/templates/snippets/embed-units.html:114 @@ -10345,19 +10323,24 @@ msgstr "Wczytywanie wyników…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Skonfiguruj uwierzytelnianie dwuskładnikowe" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Ten projekt wymaga uwierzytelniania dwuskładnikowego od wszystkich " +"współtwórców. Nie będziesz mógł wnieść wkładu, dopóki go nie skonfigurujesz." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"Jesteś członkiem zespołu, który wymaga uwierzytelniania dwuskładnikowego. " +"Nie będziesz mógł korzystać z żadnych jego uprawnień, dopóki nie " +"skonfigurujesz 2FA." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10708,16 +10691,12 @@ msgstr "" "%(link_fsf_start)suznanej za wolną przez FSF%(link_end)s." #: weblate/templates/snippets/libre-basic.html:10 -#, fuzzy -#| msgid "" -#| "All the source code has to be publicly available in a supported version " -#| "control system." msgid "" "All the source code has to be libre-licensed and publicly available in a " "supported version control system." msgstr "" -"Cały kod źródłowy musi być publicznie dostępny w obsługiwanym systemie " -"kontroli wersji." +"Cały kod źródłowy musi być objęty wolną licencją i publicznie dostępny w " +"obsługiwanym systemie kontroli wersji." #: weblate/templates/snippets/libre-basic.html:11 msgid "" @@ -11048,7 +11027,7 @@ msgstr "Wszystkie nieprzetłumaczone ciągi dodane w ciągu ostatniego miesiąca #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Filtr zmienił ciągi 2 tygodnie temu" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" @@ -13367,10 +13346,8 @@ msgid "Untranslatable term" msgstr "Termin nieprzetłumaczalny" #: weblate/trans/forms.py:2506 -#, fuzzy -#| msgid "You currently do not have permission to create projects." msgid "You do not have permission to create terminology." -msgstr "Obecnie nie masz uprawnień do tworzenia projektów." +msgstr "Nie masz uprawnienia do tworzenia terminologii." #: weblate/trans/forms.py:2572 msgid "State to set" @@ -13444,10 +13421,8 @@ msgid "Author username" msgstr "Nazwa użytkownika autora" #: weblate/trans/forms.py:2767 -#, fuzzy -#| msgid "Changes pushed" msgid "Change period" -msgstr "Wypchnięto zmiany" +msgstr "Zmień okres" #: weblate/trans/forms.py:2779 msgid "Could not find matching user!" @@ -14089,10 +14064,8 @@ msgstr "Zaktualizowano tłumaczenie przez przesłanie źródło" #. Translators: Name of event in the history #: weblate/trans/models/change.py:508 -#, fuzzy -#| msgid "Translation completed" msgid "Component translation completed" -msgstr "Zakończono tłumaczenie" +msgstr "Zakończono tłumaczenie komponentu" #: weblate/trans/models/change.py:592 msgid "The component was automatically locked because of an alert." @@ -14110,10 +14083,9 @@ msgstr "%(action)s o %(time)s w projekcie %(translation)s przez %(user)s" #. Translators: condensed rendering of a change action in history #: weblate/trans/models/change.py:681 -#, fuzzy, python-format -#| msgid "%(action)s at %(time)s on %(translation)s by %(user)s" +#, python-format msgid "%(action)s at %(time)s on %(translation)s" -msgstr "%(action)s o %(time)s w projekcie %(translation)s przez %(user)s" +msgstr "%(action)s o %(time)s w projekcie %(translation)s" #: weblate/trans/models/change.py:850 msgid "The “{}” file was changed." @@ -14890,10 +14862,8 @@ msgid "Component list to assign" msgstr "Lista komponentów do przypisania" #: weblate/trans/models/label.py:28 -#, fuzzy -#| msgid "Description" msgid "Label description" -msgstr "Opis" +msgstr "Opis etykiety" #: weblate/trans/models/project.py:129 msgid "Public" @@ -14956,6 +14926,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Wymaga, aby współtwórcy mieli skonfigurowane uwierzytelnianie " +"dwuskładnikowe, zanim będą mogli wnieść swój wkład." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15580,7 +15552,7 @@ msgstr "Wysłano żądanie nowego tłumaczenia do utrzymujących projekt." #: weblate/trans/views/basic.py:766 msgid "All languages have been added, updates of translations are in progress." -msgstr "" +msgstr "Wszystkie języki zostały dodane, aktualizacje tłumaczeń są w toku." #: weblate/trans/views/changes.py:63 #, python-format @@ -15659,10 +15631,8 @@ msgid "Your suggestion has been identified as spam!" msgstr "Twoja sugestia została zidentyfikowana jako spam!" #: weblate/trans/views/edit.py:319 -#, fuzzy -#| msgid "Only suggestions are allowed in this translation!" msgid "Your suggestion is similar to the current translation!" -msgstr "Tylko sugestie są dozwolone w tym tłumaczeniu!" +msgstr "Twoja sugestia jest podobna do aktualnego tłumaczenia!" #: weblate/trans/views/edit.py:324 msgid "Your suggestion already exists!" @@ -15803,17 +15773,18 @@ msgstr "Nie udało się zablokować repozytorium, trwa inna operacja." msgid "" "All repositories have been updated, updates of translations are in progress." msgstr "" +"Wszystkie repozytoria zostały zaktualizowane, aktualizacje tłumaczeń są w " +"toku." #: weblate/trans/views/git.py:84 msgid "All repositories were pushed." msgstr "Wypchnięto wszystkie repozytoria." #: weblate/trans/views/git.py:99 -#, fuzzy -#| msgid "All repositories have been reset." msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Zresetowano wszystkie repozytoria." +msgstr "" +"Wszystkie repozytoria zostały zresetowane, aktualizacje tłumaczeń są w toku." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." @@ -15824,10 +15795,8 @@ msgid "Translation files have been synchronized." msgstr "Pliki tłumaczeń zostały zsynchronizowane." #: weblate/trans/views/git.py:155 -#, fuzzy -#| msgid "Automatic translation in progress" msgid "Updates of translations are in progress." -msgstr "Automatyczne tłumaczenie w toku" +msgstr "Aktualizacje tłumaczeń są w toku." #: weblate/trans/views/git.py:178 msgid "All pending translations were committed." @@ -16200,10 +16169,8 @@ msgid "This e-mail address is disallowed." msgstr "Ten adres e-mail jest niedozwolony." #: weblate/utils/validators.py:195 -#, fuzzy -#| msgid "Enter a valid e-mail address." msgid "Invalid e-mail address: {}" -msgstr "Wprowadź aktualny adres e-mail." +msgstr "Nieprawidłowy adres e-mail: {}" #: weblate/utils/validators.py:207 msgid "Could not evaluate plural formula: {}" diff --git a/weblate/locale/pt/LC_MESSAGES/django.po b/weblate/locale/pt/LC_MESSAGES/django.po index de8333c8a1e4..7ce43f1d81e5 100644 --- a/weblate/locale/pt/LC_MESSAGES/django.po +++ b/weblate/locale/pt/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-06 23:36+0000\n" +"PO-Revision-Date: 2024-10-07 17:53+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -341,33 +341,31 @@ msgid "Add team" msgstr "Adicionar equipa" #: weblate/accounts/forms.py:954 -#, fuzzy -#| msgid "Name of the translation" msgid "Name your authentication app" -msgstr "Nome da tradução" +msgstr "Nomeie a app de autenticação" #: weblate/accounts/forms.py:957 msgid "Verify the code from the app" -msgstr "" +msgstr "Verifique o código da app" #: weblate/accounts/forms.py:971 -#, fuzzy -#| msgid "The translation is not valid XML" msgid "Entered token is not valid." -msgstr "A tradução não é XML válido" +msgstr "O token inserido não é válido." #: weblate/accounts/forms.py:1039 msgid "Recovery token" -msgstr "" +msgstr "Token de recuperação" #: weblate/accounts/forms.py:1041 msgid "" "Recovery token can be used just once, mark your token as used after using it." msgstr "" +"O token de recuperação pode ser usado apenas uma vez, marque o seu token " +"como usado após utilizá-lo." #: weblate/accounts/forms.py:1098 msgid "Enter the code from the app" -msgstr "" +msgstr "Insira o código da app" #: weblate/accounts/models.py:167 msgid "Password changed." @@ -503,26 +501,27 @@ msgstr "O usuário foi removido da {team} por {username}." #: weblate/accounts/models.py:201 msgid "Two-factor authentication recovery codes were generated" -msgstr "" +msgstr "Foram gerados códigos de recuperação de autenticação de dois fatores" #: weblate/accounts/models.py:204 msgid "Two-factor authentication recovery codes were viewed" msgstr "" +"Os códigos de recuperação da autenticação de dois fatores foram visualizados" #: weblate/accounts/models.py:206 #, python-brace-format msgid "Two-factor authentication added: {device}" -msgstr "" +msgstr "Autenticação de dois fatores adicionada: {device}" #: weblate/accounts/models.py:207 #, python-brace-format msgid "Two-factor authentication removed: {device}" -msgstr "" +msgstr "A autenticação de dois fatores foi removida: {device}" #: weblate/accounts/models.py:208 #, python-brace-format msgid "Two-factor authentication sign in using {device}" -msgstr "" +msgstr "Login com autenticação de dois fatores usando {device}" #: weblate/accounts/models.py:213 msgid "Configured password to sign in." @@ -880,18 +879,14 @@ msgid "Suggestion was added" msgstr "Sugestão foi adicionada" #: weblate/accounts/notifications.py:557 -#, fuzzy -#| msgid "Message is translated" msgctxt "Notification name" msgid "Language was translated" -msgstr "A mensagem está traduzida" +msgstr "Idioma foi traduzido" #: weblate/accounts/notifications.py:565 -#, fuzzy -#| msgid "Import as translated" msgctxt "Notification name" msgid "Component was translated" -msgstr "Importar como traduzida" +msgstr "Componente foi traduzido" #: weblate/accounts/notifications.py:573 msgctxt "Notification name" @@ -1009,29 +1004,25 @@ msgstr "" #: weblate/accounts/templatetags/authnames.py:53 msgid "Use security key (WebAuthn)" -msgstr "" +msgstr "Use a chave de segurança (WebAuthn)" #: weblate/accounts/templatetags/authnames.py:54 -#, fuzzy -#| msgid "Authentication" msgid "Use authentication app (TOTP)" -msgstr "Autenticação" +msgstr "Use a app de autenticação (TOTP)" #: weblate/accounts/templatetags/authnames.py:55 msgid "Use recovery codes" -msgstr "" +msgstr "Use códigos de recuperação" #: weblate/accounts/utils.py:170 -#, fuzzy, python-format -#| msgid "Security Policy" +#, python-format msgid "Security key (%s)" -msgstr "Política de segurança" +msgstr "Chave de segurança (%s)" #: weblate/accounts/utils.py:176 -#, fuzzy, python-format -#| msgid "Authentication" +#, python-format msgid "Authentication app (%s)" -msgstr "Autenticação" +msgstr "App de autenticação (%s)" #: weblate/accounts/views.py:205 weblate/accounts/views.py:1046 #: weblate/accounts/views.py:1112 weblate/templates/accounts/reset.html:7 @@ -1114,10 +1105,8 @@ msgid "Sign in" msgstr "Iniciar sessão" #: weblate/accounts/views.py:869 -#, fuzzy -#| msgid "Sign out" msgid "Signed out" -msgstr "Terminar sessão" +msgstr "Sair" #: weblate/accounts/views.py:975 msgid "Register e-mail" @@ -1149,10 +1138,9 @@ msgstr "" "Adicione outra identidade para confirmar o seu endereço de e-mail primeiro." #: weblate/accounts/views.py:1335 -#, fuzzy, python-format -#| msgid "Failed to generate key: %s" +#, python-format msgid "Could not authenticate: %s" -msgstr "Impossível gerar a chave: %s" +msgstr "Não foi possível autenticar: %s" #: weblate/accounts/views.py:1345 msgid "Could not complete registration." @@ -1233,32 +1221,26 @@ msgstr "" "inicie a sessão para configurar as notificações." #: weblate/accounts/views.py:1649 -#, fuzzy -#| msgid "User invitation was removed." msgid "The security key was removed." -msgstr "O convite do utilizador foi removido." +msgstr "A chave de segurança foi removida." #: weblate/accounts/views.py:1650 #, python-format msgid "The security key %s was registered." -msgstr "" +msgstr "A chave de segurança %s foi registada." #: weblate/accounts/views.py:1687 -#, fuzzy -#| msgid "User invitation was removed." msgid "The authentication app was removed." -msgstr "O convite do utilizador foi removido." +msgstr "A app de autenticação foi removido." #: weblate/accounts/views.py:1688 #, python-format msgid "The authentication app %s was registered." -msgstr "" +msgstr "A app de autenticação %s foi registado." #: weblate/accounts/views.py:1821 -#, fuzzy -#| msgid "Last sign in" msgid "Second factor sign in" -msgstr "Última sessão" +msgstr "Login de segundo fator" #: weblate/addons/autotranslate.py:18 weblate/templates/translation.html:73 #: weblate/templates/translation.html:242 @@ -1783,7 +1765,7 @@ msgstr "A origem e o destino devem ser idiomas diferentes." #: weblate/addons/forms.py:645 msgid "Enable case-sensitive key sorting" -msgstr "" +msgstr "Ativar a ordenação de chaves sensível a maiúsculas e minúsculas" #: weblate/addons/generate.py:33 msgid "Statistics generator" @@ -2088,10 +2070,8 @@ msgstr "Adicionar entrada de glossário" #. Translators: Permission name #: weblate/auth/data.py:37 -#, fuzzy -#| msgid "Add glossary entry" msgid "Add glossary terminology" -msgstr "Adicionar entrada de glossário" +msgstr "Adicionar terminologia ao Glossário" #. Translators: Permission name #: weblate/auth/data.py:39 @@ -2645,13 +2625,12 @@ msgstr "O administrador pode adicionar ou remover utilizadores de uma equipa." #: weblate/auth/models.py:194 weblate/trans/models/project.py:193 msgid "Enforced two-factor authentication" -msgstr "" +msgstr "Autenticação de dois fatores obrigatória" #: weblate/auth/models.py:197 -#, fuzzy -#| msgid "Redirecting you to the authentication provider." msgid "Requires users to have two-factor authentication configured." -msgstr "A redireccionar para o fornecedor de autenticação." +msgstr "" +"Requer que os utilizadores tenham a autenticação em duas etapas configurada." #: weblate/auth/models.py:398 weblate/utils/forms.py:71 #: weblate/utils/validators.py:173 @@ -2762,6 +2741,7 @@ msgid "" "This project requires two-factor authentication; configure it in your " "profile." msgstr "" +"Este projeto requer autenticação de dois fatores; configure-a no seu perfil." #: weblate/auth/permissions.py:184 weblate/templates/translate.html:175 #: weblate/templates/translate.html:231 @@ -3815,7 +3795,7 @@ msgstr "O formato de chaveta Python da cadeia não coincide com a fonte" #: weblate/checks/format.py:611 msgid "Single {} encountered in the format string." -msgstr "" +msgstr "Foi encontrado um único {} na cadeia de formato." #: weblate/checks/format.py:638 msgid "C# format" @@ -4446,10 +4426,8 @@ msgid "gotext JSON file" msgstr "Ficheiro de gotext JSON" #: weblate/formats/ttkit.py:1559 -#, fuzzy -#| msgid "gotext JSON file" msgid "Format.JS JSON file" -msgstr "Arquivo de Format.JS JSON" +msgstr "Ficheiro Format.JS JSON" #: weblate/formats/ttkit.py:1567 msgid "CSV file" @@ -4533,7 +4511,7 @@ msgstr "Ficheiro fluente" #: weblate/formats/txt.py:89 msgid "Should be a directory with metadata files!" -msgstr "" +msgstr "Deve ser um diretório com ficheiros de metadados!" #: weblate/formats/txt.py:196 msgid "App store metadata files" @@ -5164,26 +5142,25 @@ msgid "Region ID" msgstr "ID da região" #: weblate/machinery/forms.py:260 -#, fuzzy -#| msgid "Context" msgctxt "Automatic suggestion service configuration" msgid "Context vector" -msgstr "Contexto" +msgstr "Vetor de contexto" #: weblate/machinery/forms.py:263 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Lista separada por vírgulas de IDs de memória:peso. Por exemplo: 1234:0." +"123,4567:0.456" #: weblate/machinery/forms.py:276 -#, fuzzy, python-format -#| msgid "The translation is not valid XML" +#, python-format msgid "The context vector is not valid: %s" -msgstr "A tradução não é XML válido" +msgstr "O vetor de contexto não é válido: %s" #: weblate/machinery/forms.py:280 #, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "O valor do peso deve estar entre 0 e 1: %s" #: weblate/machinery/forms.py:291 msgctxt "Automatic suggestion service configuration" @@ -5197,31 +5174,20 @@ msgstr "" "(in)formal" #: weblate/machinery/forms.py:308 -#, fuzzy -#| msgid "Translation comment" msgctxt "Automatic suggestion service configuration" msgid "Translation context" -msgstr "Comentário à tradução" +msgstr "Contexto da tradução" #: weblate/machinery/forms.py:312 -#, fuzzy -#| msgid "" -#| "Describe the persona of translator to improve the accuracy of the " -#| "translation. For example: “You are a squirrel breeder.”" msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." -msgstr "" -"Could not parse JSON file: %sDescreva a personalidade do tradutor para " -"melhorar a precisão da tradução. Por exemplo: “Você é um criador de " -"esquilos.”" +msgstr "Descreva o contexto da tradução para melhorar a precisão da tradução." #: weblate/machinery/forms.py:322 -#, fuzzy -#| msgid "Translation reports" msgctxt "Automatic suggestion service configuration" msgid "Translator persona" -msgstr "pessoa do tradutor" +msgstr "Personagem do tradutor" #: weblate/machinery/forms.py:326 msgid "" @@ -5248,20 +5214,18 @@ msgid "Automatic selection" msgstr "Seleção automática" #: weblate/machinery/forms.py:354 -#, fuzzy -#| msgid "Custom" msgctxt "OpenAI model selection" msgid "Custom model" -msgstr "Personalizado" +msgstr "Modelo personalizado" #: weblate/machinery/forms.py:359 msgctxt "Automatic suggestion service configuration" msgid "OpenAI API base URL" -msgstr "" +msgstr "URL base da API da OpenAI" #: weblate/machinery/forms.py:363 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "URL base da API do OpenAI, se for diferente do URL padrão do OpenAI" #: weblate/machinery/forms.py:370 msgctxt "Automatic suggestion service configuration" @@ -5269,47 +5233,44 @@ msgid "OpenAI model" msgstr "Modelo OpenAI" #: weblate/machinery/forms.py:378 -#, fuzzy -#| msgid "Customize the component name" msgctxt "OpenAI model selection" msgid "Custom model name" -msgstr "Personalizar nome do componente" +msgstr "Nome do modelo personalizado" #: weblate/machinery/forms.py:380 msgid "Only needed when model is set to 'Custom model'" msgstr "" +"Necessário apenas quando o modelo estiver definido como \"Modelo " +"personalizado\"" #: weblate/machinery/forms.py:390 -#, fuzzy -#| msgid "Missing username or e-mail." msgid "Missing custom model name." -msgstr "Nome de utilizador ou e-mail ausente." +msgstr "Falta o nome de modelo personalizado." #: weblate/machinery/forms.py:394 msgid "Choose custom model here to enable it." -msgstr "" +msgstr "Escolha o modelo personalizado aqui para habilitá-lo." #: weblate/machinery/forms.py:403 -#, fuzzy -#| msgctxt "Automatic suggestion service configuration" -#| msgid "Application endpoint URL" msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI endpoint URL" -msgstr "URL do endpoint da aplicação" +msgstr "URL para o endpoint do Azure OpenAI" #: weblate/machinery/forms.py:407 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." msgstr "" +"URL para o endpoint da instância, por exemplo: https://my-instance.openai." +"azure.com." #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Implementação do Azure OpenAI" #: weblate/machinery/forms.py:416 msgid "The model's unique deployment name." -msgstr "" +msgstr "O nome de implementação exclusivo do modelo." #: weblate/machinery/views.py:404 msgid "Service is currently not available." @@ -5535,49 +5496,35 @@ msgid "CSRF verification failed. Request aborted." msgstr "A verificação de CSRF falhou. Pedido abortado." #: weblate/templates/403_csrf.html:15 -#, fuzzy -#| msgid "" -#| "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 your browser is not hijacked by third-parties." msgid "" "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, ensuring " "that your browser is not being hijacked by third parties." msgstr "" -"Esta página HTTPS requer que um cabeçalho 'Referer' seja enviado pelo seu " -"navegador, mas nenhum foi enviado. Este cabeçalho é requerido por motivos " -"securitários, para garantir que o seu navegador não é desviado por terceiros." +"Este site HTTPS exige que um cabeçalho \"Referer\" seja enviado pelo seu " +"navegador da Web, mas nenhum foi enviado. Este cabeçalho é necessário por " +"motivos de segurança, garantindo que o seu navegador não seja invadido por " +"terceiros." #: weblate/templates/403_csrf.html:16 -#, fuzzy -#| msgid "" -#| "If you have set up your web browser to not send 'Referer' headers, please " -#| "turn that on (at-least for this site, for HTTPS connections, or for 'same-" -#| "origin' requests)." msgid "" "If you have set up your web browser to not send 'Referer' headers, you need " "to turn that on (at least for this site, HTTPS connections, or 'same-origin' " "requests)." msgstr "" -"Se configurou o seu navegador para desativar cabeçalhos 'Referer', por favor " -"ative-os novamente, pelo menos para esta página, para ligações HTTPS ou para " -"pedidos 'same-origin'." +"Se configurou o seu navegador da Web para não enviar cabeçalhos \"Referer\", " +"é necessário ativá-lo (pelo menos para este site, conexões HTTPS ou " +"solicitações de \"same-origin\")." #: weblate/templates/403_csrf.html:18 -#, fuzzy -#| msgid "" -#| "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 "" "Our site requires a session cookie to make the forms work. This cookie is " "required for security reasons, ensuring that your browser is not being " "hijacked by third parties." msgstr "" -"Esta página requer um cookie CSRF quando submete formulários. Este cookie é " -"requerido por razões de segurança, para garantir que o seu navegador não " -"está a ser desviado por terceiros." +"O nosso site requer um cookie de sessão para que os formulários funcionem. " +"Este cookie é necessário por motivos de segurança, garantindo que o seu " +"navegador não seja invadido por terceiros." #: weblate/templates/403_csrf.html:19 msgid "" @@ -5585,18 +5532,18 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Pode ter acontecido que o cookie da sua sessão tenha expirado devido à " +"inatividade. Isto pode acontecer facilmente com solicitações não " +"autenticadas em que a validade da sessão é limitada. Pode tentar a ação " +"pretendida novamente nesse caso." #: weblate/templates/403_csrf.html:20 -#, fuzzy -#| msgid "" -#| "If you have set up your browser to not save cookies, please turn them on " -#| "again (at-least for this site, or for 'same-origin' requests)." msgid "" "If you have set up your browser to not save cookies, you need to enable " "saving them (at least for this site, or 'same-origin' requests)." msgstr "" -"Se configurou o seu navegador para desativar os cookies, por favor, ative-os " -"novamente (pelo menos para esta página ou para pedidos 'same-origin')." +"Se configurou o seu navegador para não gravar cookies, precisa ativar a " +"gravação deles (pelo menos para este site ou solicitações de 'same-origin')." #: weblate/templates/403_csrf.html:22 #, python-format @@ -5803,11 +5750,11 @@ msgstr "Estatísticas" #: weblate/templates/accounts/2fa.html:24 msgid "Second factor sign-in" -msgstr "" +msgstr "Login de segundo fator" #: weblate/templates/accounts/2fa.html:30 msgid "Please complete your sign-in using second factor credential." -msgstr "" +msgstr "Por favor, complete o seu login usando a credencial do segundo fator." #: weblate/templates/accounts/confirm.html:7 #: weblate/templates/accounts/password.html:6 @@ -6193,26 +6140,24 @@ msgstr "Adicionar nova identidade de utilizador" #: weblate/templates/accounts/profile.html:188 #: weblate/templates/accounts/user.html:354 -#, fuzzy -#| msgid "Authentication" msgid "Two-factor authentication" -msgstr "Autenticação" +msgstr "Autenticação de dois fatores" #: weblate/templates/accounts/profile.html:192 msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"A autenticação de dois fatores adiciona outra camada de segurança à sua " +"conta, exigindo mais do que apenas uma palavra-passe para fazer login." #: weblate/templates/accounts/profile.html:196 msgid "Security keys (WebAuthn)" -msgstr "" +msgstr "Chaves de segurança (WebAuthn)" #: weblate/templates/accounts/profile.html:198 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no WebAuthn keys registered." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente não há chaves WebAuthn registadas." #: weblate/templates/accounts/profile.html:203 #: weblate/templates/accounts/profile.html:235 @@ -6228,68 +6173,58 @@ msgstr "Remover" #: weblate/templates/accounts/profile.html:213 msgid "Name your security key" -msgstr "" +msgstr "Nomeie a sua chave de segurança" #: weblate/templates/accounts/profile.html:214 -#, fuzzy -#| msgid "Register new account" msgid "Register new security key" -msgstr "Registar nova conta" +msgstr "Registar nova chave de segurança" #: weblate/templates/accounts/profile.html:220 #: weblate/templates/accounts/webauthn.html:12 msgid "Unfortunately, your browser has no WebAuthn support." -msgstr "" +msgstr "Infelizmente, o seu navegador não tem suporte ao WebAuthn." #: weblate/templates/accounts/profile.html:228 -#, fuzzy -#| msgid "Authentication" msgid "Authenticator apps (TOTP)" -msgstr "Autenticação" +msgstr "Apps de autenticação (TOTP)" #: weblate/templates/accounts/profile.html:230 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no authenticator apps registered." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente, não há aplicações autenticadoras registados." #: weblate/templates/accounts/profile.html:242 #: weblate/templates/accounts/totp.html:11 #: weblate/templates/accounts/totp.html:22 -#, fuzzy -#| msgid "Register new account" msgid "Register new authenticator app" -msgstr "Registar nova conta" +msgstr "Registar nova aplicação autenticadora" #: weblate/templates/accounts/profile.html:245 #: weblate/templates/accounts/recovery-codes.html:11 #: weblate/templates/accounts/recovery-codes.html:33 msgid "Recovery codes" -msgstr "" +msgstr "Códigos de recuperação" #: weblate/templates/accounts/profile.html:247 #: weblate/templates/accounts/recovery-codes.html:41 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no recovery codes generated." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente, não há códigos de recuperação gerados." #: weblate/templates/accounts/profile.html:248 #: weblate/templates/accounts/recovery-codes.html:44 #: weblate/templates/accounts/recovery-codes.html:51 msgid "Generate new recovery codes" -msgstr "" +msgstr "Gerar novos códigos de recuperação" #: weblate/templates/accounts/profile.html:251 #, python-format msgid "%(count)s recovery code is available." msgid_plural "%(count)s recovery codes are available." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(count)s código de recuperação está disponível." +msgstr[1] "%(count)s códigos de recuperação estão disponíveis." #: weblate/templates/accounts/profile.html:257 msgid "View recovery codes" -msgstr "" +msgstr "Exibir códigos de recuperação" #: weblate/templates/accounts/profile.html:269 msgid "User data" @@ -6460,13 +6395,16 @@ msgstr "Licenças para traduções individuais" #: weblate/templates/accounts/recovery-codes.html:20 msgid "Two-factor recovery codes" -msgstr "" +msgstr "Códigos de recuperação de dois fatores" #: weblate/templates/accounts/recovery-codes.html:25 msgid "" "Recovery codes can be used to access your account if you lose access to your " "device and cannot receive two-factor authentication codes." msgstr "" +"Os códigos de recuperação podem ser usados para aceder a sua conta caso " +"perca o acesso ao seu dispositivo e não consiga receber os códigos de " +"autenticação em duas etapas." #: weblate/templates/accounts/recovery-codes.html:29 msgid "" @@ -6475,29 +6413,32 @@ msgid "" "password and other second factors. If you cannot find these codes when " "needed, you will lose access to your account." msgstr "" +"Mantenha os seus códigos de recuperação num local seguro, como num gestor de " +"palavras-passe. Estes códigos são o último recurso para aceder a sua conta " +"caso perca a sua palavra-passe e outros fatores de autenticação. Se não " +"conseguir encontrar estes códigos quando necessário, perderá o acesso à sua " +"conta." #: weblate/templates/accounts/recovery-codes.html:39 -#, fuzzy -#| msgid "Repository URL copied to clipboard." msgid "Recovery codes copied to clipboard." -msgstr "URL do repositório copiado para a área de transferência." +msgstr "Códigos de recuperação copiados para a área de transferência." #: weblate/templates/accounts/recovery-codes.html:47 msgid "" "When you generate new recovery codes, you must download or print the new " "codes." msgstr "" +"Quando gerar novos códigos de recuperação, tem de descarregar ou imprimir os " +"códigos novos." #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Os seus códigos antigos tornarão-se inválidos e já não funcionarão." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 -#, fuzzy -#| msgid "Edit component settings" msgid "Back to account settings" -msgstr "Editar definições de componente" +msgstr "Voltar para configurações da conta" #: weblate/templates/accounts/redirect.html:14 #: weblate/templates/accounts/token.html:12 @@ -6571,20 +6512,21 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"As apps autenticadoras geram palavras-passe de uso único que são usadas como " +"um segundo fator para verificar a sua identidade quando solicitado durante o " +"login." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" -msgstr "" +msgstr "Escanear o código QR" #: weblate/templates/accounts/totp.html:37 msgid "You can also enter the secret key manually:" -msgstr "" +msgstr "Também pode inserir a chave secreta manualmente:" #: weblate/templates/accounts/totp.html:40 -#, fuzzy -#| msgid "API key copied to clipboard." msgid "Secret key copied to clipboard." -msgstr "Chave API copiada para área de transferência." +msgstr "Chave secreta copiada para a área de transferência." #: weblate/templates/accounts/totp.html:45 #: weblate/templates/mail/shared-registration.html:22 @@ -6726,10 +6668,8 @@ msgid "Edit" msgstr "Editar" #: weblate/templates/accounts/user.html:171 -#, fuzzy -#| msgid "No recent activity found!" msgid "No recent contributions found." -msgstr "Nenhuma atividade recente registada!" +msgstr "Nenhuma contribuição recente encontrada." #: weblate/templates/accounts/user.html:172 msgid "Browse all translations with contribution" @@ -6757,10 +6697,8 @@ msgid "User ID" msgstr "Id. do Utilizador" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" -msgstr "Notificações" +msgstr "Notificação" #: weblate/templates/accounts/user.html:237 weblate/trans/forms.py:1078 msgid "Scope" @@ -6768,7 +6706,7 @@ msgstr "Âmbito" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Freqüência" #: weblate/templates/accounts/user.html:241 msgid "One-time" @@ -6806,33 +6744,24 @@ msgid "Unblock user" msgstr "Desbloquear utilizador" #: weblate/templates/accounts/user.html:342 -#, fuzzy -#| msgctxt "Access-control role" -#| msgid "Edit source" msgid "Edit user" -msgstr "Editar fonte" +msgstr "Editar utilizador" #: weblate/templates/accounts/user.html:359 -#, fuzzy -#| msgid "Used to authenticate user if configured" msgid "User has two-factor authentication configured." -msgstr "Usado para autenticar o utilizador, se configurado" +msgstr "O utilizador tem a autenticação de dois fatores configurada." #: weblate/templates/accounts/user.html:361 -#, fuzzy -#| msgid "Used to authenticate user if configured" msgid "User doesn't have two-factor authentication configured." -msgstr "Usado para autenticar o utilizador, se configurado" +msgstr "O utilizador não tem a autenticação de dois fatores configurada." #: weblate/templates/accounts/user.html:366 msgid "Disable two-factor authentication" -msgstr "" +msgstr "Desativar a autenticação de dois fatores" #: weblate/templates/accounts/user.html:373 -#, fuzzy -#| msgid "Account removal deletes all your private data." msgid "Account removal deletes all user private data." -msgstr "A remoção da conta apaga todos os dados privados." +msgstr "A remoção da conta apaga todos os dados privados do utilizador." #: weblate/templates/accounts/user.html:376 #: weblate/templates/accounts/user.html:390 @@ -6900,7 +6829,7 @@ msgstr "Traduções com contribuição" #: weblate/templates/accounts/webauthn.html:7 msgid "Sign in using the security key" -msgstr "" +msgstr "Faça login usando a chave de segurança" #: weblate/templates/addons/addon_detail.html:10 #: weblate/templates/addons/addon_detail.html:12 @@ -6919,17 +6848,13 @@ msgid "Configure add-on" msgstr "Configurar extensão" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Esta extensão executa um script." +msgstr "Esta extensão não tem configurações." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 -#, fuzzy -#| msgid "Add-ons can be installed on project and component scope as well." msgid "The add-on can only be installed on the component." -msgstr "Extensões podem ser instaladas em projetos e também em componentes." +msgstr "A extensão só pode ser instalada no componente." #: weblate/templates/addons/addon_head.html:9 msgid "This add-on is used for all components sharing this repository." @@ -7042,10 +6967,8 @@ msgid "Browse all add-on changes" msgstr "Explorar todas as alterações de extensões" #: weblate/templates/addons/addon_logs.html:27 -#, fuzzy -#| msgid "Account activity" msgid "Add-on Activity Logs" -msgstr "Atividade da conta" +msgstr "Registos de atividades complementares" #: weblate/templates/addons/addon_logs.html:32 msgid "Status" @@ -7311,10 +7234,8 @@ msgid "Automatic assignment" msgstr "Atribuição automática" #: weblate/templates/auth/teams-name.html:4 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "Requires two-factor authentication" -msgstr "O servidor não permite autenticação." +msgstr "Requer autenticação de dois fatores" #: weblate/templates/auth/teams-roles.html:5 msgid "Access only" @@ -8000,10 +7921,9 @@ msgstr "O componente está a ser atualizado…" #: weblate/templates/component-progress.html:31 #: weblate/templates/multi-progress.html:26 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Continue to %(return_target)s" -msgstr "Convite para %(site_title)s" +msgstr "Continuar para %(return_target)s" #: weblate/templates/component-progress.html:33 msgid "Abort the update" @@ -8011,10 +7931,8 @@ msgstr "Abortar a atualização" #: weblate/templates/component-progress.html:38 #: weblate/templates/multi-progress.html:30 -#, fuzzy -#| msgid "Return to the component after completion" msgid "Continue after completion" -msgstr "Voltar ao componente após concluir" +msgstr "Continuar após a conclusão" #: weblate/templates/component.html:36 weblate/wladmin/views.py:80 msgid "Alerts" @@ -9466,16 +9384,14 @@ msgstr[0] "%(count)s cadeia não finalizada" msgstr[1] "%(count)s cadeias não finalizadas" #: weblate/templates/mail/translated_component_subject.txt:3 -#, fuzzy, python-format -#| msgid "The translations in several languages have failing checks" +#, python-format msgid "Translations in all languages have been completed in %(component)s" -msgstr "As traduções em várias línguas têm verificações falhadas" +msgstr "As traduções em todos os idiomas foram concluídas em %(component)s" #: weblate/templates/mail/translated_language_subject.txt:3 -#, fuzzy, python-format -#| msgid "Translation comment has been deleted." +#, python-format msgid "%(translation)s has been completed" -msgstr "O comentário da tradução foi eliminado." +msgstr "%(translation)s foi concluído" #: weblate/templates/manage/alerts.html:7 msgid "Component alerts" @@ -9995,10 +9911,8 @@ msgid "Delete announcement" msgstr "Apagar anúncio" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" -msgstr "O componente está a ser atualizado…" +msgstr "A atualizar componentes…" #: weblate/templates/new-language.html:25 msgid "" @@ -10168,16 +10082,12 @@ msgid "Please try again later." msgstr "Por favor, tente novamente mais tarde." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Obrigado por utilizar o Weblate." +msgstr "Obrigado por usar o Weblate" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Mostrar no painel" +msgstr "Voltar ao painel" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10240,10 +10150,8 @@ msgid "Add to screenshot" msgstr "Adicionar à captura do ecrã" #: weblate/templates/screenshots/snippets/paste-button.html:4 -#, fuzzy -#| msgid "Copy token to clipboard" msgid "Paste from clipboard" -msgstr "Copiar token para área de transferência" +msgstr "Colar da área de transferência" #: weblate/templates/search.html:25 #: weblate/templates/snippets/embed-units.html:114 @@ -10394,19 +10302,23 @@ msgstr "A carregar os resultados…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Configurar a autenticação de dois fatores" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Este projeto requer autenticação de dois fatores de todos os contribuidores. " +"Não poderá contribuir até configurá-lo." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"é um membro da equipa que requer autenticação de dois fatores. Não poderá " +"usar nenhum dos seus privilégios até configurar o 2FA." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10754,16 +10666,12 @@ msgstr "" "%(link_fsf_start)sreconhecida como libre pela FSF%(link_end)s." #: weblate/templates/snippets/libre-basic.html:10 -#, fuzzy -#| msgid "" -#| "All the source code has to be publicly available in a supported version " -#| "control system." msgid "" "All the source code has to be libre-licensed and publicly available in a " "supported version control system." msgstr "" -"Todo o código-fonte tem de estar disponível publicamente num sistema de " -"controlo de versões suportado." +"Todo o código-fonte deve ter licença livre e estar disponível publicamente " +"num sistema de controle de versão compatível." #: weblate/templates/snippets/libre-basic.html:11 msgid "" @@ -10915,19 +10823,14 @@ msgstr "" "contribuição sob a licença definida por cada projeto traduzido." #: weblate/templates/snippets/login-info.html:31 -#, fuzzy -#| msgid "" -#| "By registering you agree to use your name and e-mail in version control " -#| "system commits and provide your contribution under license defined by " -#| "each translated project." msgid "" "By registering you agree to use your name in version control system commits " "and provide your contribution under license defined by each translated " "project." msgstr "" -"Ao registar-se, está a concordar em utilizar o seu nome e o ''e-mail'' nas " -"confirmações do sistema de controlo de versões e em disponibilizar a sua " -"contribuição sob a licença definida por cada projeto traduzido." +"Ao registar-se concorda a usar o seu nome nos commits do sistema de controle " +"de versão e fornecer a sua contribuição sob licença definida por cada " +"projeto traduzido." #: weblate/templates/snippets/plural-formula.html:4 msgid "" @@ -11100,7 +11003,7 @@ msgstr "Todas as cadeias não traduzidas adicionadas no mês passado" #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Filtrar por cadeias alteradas há mais que 2 semanas" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" @@ -11765,11 +11668,9 @@ msgstr "" "sinalizadores de cadeia ou componente." #: weblate/templates/trans/alert/unusedscreenshot.html:2 -#, fuzzy -#| msgid "" -#| "There is at least one screenshot which is not assigned to any strings." msgid "At least one screenshot has no string assigned to it." -msgstr "Há pelo menos um screenshot que não é atribuído a qualquer cadeia." +msgstr "" +"Pelo menos uma captura de ecrã não possui nenhuma cadeias lhe atribuída." #: weblate/templates/trans/alert/unusedscreenshot.html:4 msgid "Manage screenshots" @@ -11982,10 +11883,8 @@ msgstr "Os seguintes componentes de tradução serão removidos:" #: weblate/templates/trans/delete-category.html:21 #: weblate/templates/trans/delete-project.html:23 -#, fuzzy -#| msgid "The following translations will be removed:" msgid "The following translation categories will be removed:" -msgstr "As seguintes traduções serão removidas:" +msgstr "As seguintes categorias de tradução serão removidas:" #: weblate/templates/trans/delete-category.html:31 #: weblate/templates/trans/delete-project.html:33 @@ -12010,16 +11909,13 @@ msgid "I understand the consequences, delete this translation" msgstr "Compreendo as consequências, apagar esta tradução" #: weblate/templates/trans/delete-project.html:5 -#, fuzzy, python-format -#| msgid "" -#| "This action cannot be undone. This will permanently delete the %(object)s " -#| "project and all related content." +#, python-format msgid "" "This action cannot be undone. This will permanently delete the %(object)s " "category and all related content." msgstr "" -"Esta ação não pode ser anulada. Isto irá eliminar permanentemente o projeto " -"%(object)s e de todo o conteúdo relacionado." +"Esta ação não pode ser desfeita. Isto apagará permanentemente a categoria " +"%(object)s e todo o conteúdo relacionado." #: weblate/templates/trans/delete-project.html:10 #, python-format @@ -12029,16 +11925,12 @@ msgstr[0] "%(count)s componente será removido por esta ação." msgstr[1] "%(count)s componentes serão removidos por esta ação." #: weblate/templates/trans/delete-translation.html:6 -#, fuzzy -#| msgid "" -#| "The “Add missing languages” add-on is installed on this component, " -#| "removed language might be re-added by it again." msgid "" "The “Add missing languages” add-on is installed on this component, a removed " "language might be re-added by it again." msgstr "" -"A extensão de \"adicionar idiomas ausentes\" está instalada neste " -"componente, o idioma removido pode ser adicionado novamente por ela." +"O complemento “Adicionar idiomas ausentes” está instalado neste componente, " +"um idioma removido pode ser adicionado novamente por ele." #: weblate/templates/trans/delete-translation.html:11 msgid "" @@ -12140,10 +12032,9 @@ msgid "Edit team membership for %(username)s" msgstr "Editar membro da equipa para %(username)s" #: weblate/templates/trans/project-access.html:92 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation for %(email)s" -msgstr "Convite para %(site_title)s" +msgstr "Convite para %(email)s" #: weblate/templates/trans/project-access.html:121 msgid "" @@ -12257,10 +12148,8 @@ msgstr "" "componente de tradução." #: weblate/templates/translate.html:51 -#, fuzzy -#| msgid "Edit in Zen mode" msgid "Open in Zen mode" -msgstr "Editar em modo Zen" +msgstr "Abrir no modo Zen" #: weblate/templates/translate.html:51 weblate/templates/translation.html:204 #: weblate/templates/zen.html:22 @@ -12391,13 +12280,10 @@ msgid "Difference to current string" msgstr "Diferença para a cadeia atual" #: weblate/templates/translate.html:322 -#, fuzzy -#| msgid "The following string has the same context and source." -#| msgid_plural "The following strings have the same context and source." msgid "This string has the same context and source." msgid_plural "These strings have the same context and source." -msgstr[0] "A cadeia seguinte tem o mesmo contexto e fonte." -msgstr[1] "As cadeias seguintes têm o mesmo contexto e fonte." +msgstr[0] "Esta cadeia tem o mesmo contexto e origem." +msgstr[1] "Estas cadeias têm o mesmo contexto e origem." #: weblate/templates/translate.html:330 msgid "This string has a different context, but the same source." @@ -12531,10 +12417,8 @@ msgid "String age" msgstr "Idade da cadeia" #: weblate/templates/translate.html:695 weblate/utils/views.py:183 -#, fuzzy -#| msgid "Past due date" msgid "Last updated" -msgstr "Após a data de conclusão" +msgstr "Ultima atualização" #: weblate/templates/translate.html:701 msgid "Source string age" @@ -12603,10 +12487,8 @@ msgstr "Palavras" #: weblate/templates/translation.html:145 #: weblate/templates/translation.html:172 -#, fuzzy -#| msgid "Characters percent" msgid "Characters" -msgstr "Percentagem de caracteres" +msgstr "Caracteres" #: weblate/templates/translation.html:153 msgid "This translation is being used as source strings within this component." @@ -12705,44 +12587,33 @@ msgstr "" "eliminação." #: weblate/templates/weblate_auth/invitation_detail.html:9 -#, fuzzy -#| msgid "Information" msgid "Invitations" -msgstr "Informação" +msgstr "Convites" #: weblate/templates/weblate_auth/invitation_detail.html:10 -#, fuzzy -#| msgid "Resend invitation" msgid "Invitation" -msgstr "Reenviar convite" +msgstr "Convite" #: weblate/templates/weblate_auth/invitation_detail.html:18 -#, fuzzy -#| msgid "Donate to Weblate" msgid "Invitation to Weblate" -msgstr "Doar ao Weblate" +msgstr "Convite para Weblate" #: weblate/templates/weblate_auth/invitation_detail.html:21 -#, fuzzy -#| msgid "Please sign in to see the alerts." msgid "Please sign-in to view this invitation." -msgstr "Por favor, inicie a sessão para ver os alertas." +msgstr "Faça login para visualizar este convite." #: weblate/templates/weblate_auth/invitation_detail.html:23 msgid "This invitation belongs to a different user." -msgstr "" +msgstr "Este convite pertence a um utilizador diferente." #: weblate/templates/weblate_auth/invitation_detail.html:41 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation to %(project_name)s" -msgstr "Convite para %(site_title)s" +msgstr "Convite para %(project_name)s" #: weblate/templates/weblate_auth/invitation_detail.html:47 -#, fuzzy -#| msgid "Resend invitation" msgid "Accept invitation" -msgstr "Reenviar convite" +msgstr "Aceitar convite" #: weblate/templates/widgets.html:6 msgid "Widgets" @@ -12977,10 +12848,8 @@ msgid "Labeled: {}" msgstr "Etiquetado: {}" #: weblate/trans/forms.py:155 -#, fuzzy -#| msgid "Invalid image!" msgid "Invalid date!" -msgstr "Imagem inválida!" +msgstr "Data inválida!" #: weblate/trans/forms.py:164 msgid "The starting date has to be before the ending date." @@ -13031,16 +12900,12 @@ msgid "Additional explanation to clarify meaning or usage of the string." msgstr "Explicação adicional para esclarecer o significado ou uso da cadeia." #: weblate/trans/forms.py:560 -#, fuzzy -#| msgid "Source string location" msgid "Source string explanation" -msgstr "Localização da cadeia fonte" +msgstr "Explicação da cadeia fonte" #: weblate/trans/forms.py:562 -#, fuzzy -#| msgid "Translation notifications" msgid "Translation explanation" -msgstr "Notificações de tradução" +msgstr "Explicação da tradução" #: weblate/trans/forms.py:579 msgid "The source string has changed meanwhile. Please check your changes." @@ -13382,10 +13247,9 @@ msgid "ZIP file containing project backup" msgstr "O ficheiro ZIP contém a cópia de segurança do projeto" #: weblate/trans/forms.py:2284 -#, fuzzy, python-format -#| msgid "Failed to load project backup: %s" +#, python-format msgid "Could not load project backup: %s" -msgstr "Não foi possível carregar a cópia de segurança do projeto: %s" +msgstr "Não foi possível carregar o backup do projeto: %s" #: weblate/trans/forms.py:2293 msgid "Optional additional filter applied to the strings" @@ -13457,10 +13321,8 @@ msgid "Untranslatable term" msgstr "Termo intraduzível" #: weblate/trans/forms.py:2506 -#, fuzzy -#| msgid "You currently do not have permission to create projects." msgid "You do not have permission to create terminology." -msgstr "Não tem permissão para criar projectos." +msgstr "Não tem permissão para criar terminologia." #: weblate/trans/forms.py:2572 msgid "State to set" @@ -13513,20 +13375,16 @@ msgid "Please type in the slug of the project to confirm." msgstr "Por favor, digite o nome completo do projeto para confirmar." #: weblate/trans/forms.py:2716 -#, fuzzy -#| msgid "Please type in the slug of the project to confirm." msgid "Please type in the slug of the category to confirm." -msgstr "Por favor, digite o nome completo do projeto para confirmar." +msgstr "Digite o slug da categoria para confirmar." #: weblate/trans/forms.py:2726 msgid "Please type in the slug of the project and language to confirm." msgstr "Por favor, digite o slug do projeto e idioma para confirmar." #: weblate/trans/forms.py:2737 -#, fuzzy -#| msgid "Please type in the slug of the project and language to confirm." msgid "Please type in the slug of the category and language to confirm." -msgstr "Por favor, digite o slug do projeto e idioma para confirmar." +msgstr "Digite o slug da categoria e do idioma para confirmar." #: weblate/trans/forms.py:2758 msgid "Action" @@ -13537,26 +13395,20 @@ msgid "Author username" msgstr "Nome de utilizador do autor" #: weblate/trans/forms.py:2767 -#, fuzzy -#| msgid "Change password" msgid "Change period" -msgstr "Alterar palavra-passe" +msgstr "Período de mudança" #: weblate/trans/forms.py:2779 -#, fuzzy -#| msgid "Failed to find matching user!" msgid "Could not find matching user!" -msgstr "Impossível encontrar um utilizador idêntico!" +msgstr "Não foi possível encontrar o utilizador correspondente!" #: weblate/trans/forms.py:2852 msgid "Expiry cannot be in the past." msgstr "A data de expiração não pode estar no passado." #: weblate/trans/forms.py:2891 -#, fuzzy -#| msgid "Start new translation into more languages" msgid "Customize translation workflow for this language" -msgstr "Iniciar nova tradução para mais idiomas" +msgstr "Personalizar fluxo de trabalho para tradução deste idioma" #: weblate/trans/forms.py:2893 msgid "" @@ -13567,10 +13419,8 @@ msgstr "" "ativar a personalização aqui, substitui essas configurações para este idioma." #: weblate/trans/forms.py:2936 -#, fuzzy -#| msgid "Start new translation into more languages" msgid "Customize translation workflow for this language in this project" -msgstr "Iniciar nova tradução para mais idiomas" +msgstr "Personalizar fluxo de trabalho para tradução deste idioma neste projeto" #: weblate/trans/forms.py:2939 msgid "" @@ -13628,30 +13478,26 @@ msgid "Use flags to indicate special strings in your translation." msgstr "Utilize sinalizadores para indicar cadeias especiais na sua tradução." #: weblate/trans/guide.py:216 -#, fuzzy -#| msgid "Add safe-html flag to avoid dangerous HTML from translators." msgid "" "Add safe-html flag to avoid dangerous HTML from translators for strings " "which are rendered as HTML." msgstr "" -"Adicionar o sinalizador safe-html para evitar HTML perigoso dos tradutores." +"Adicione o sinalizador safe-html para evitar HTML perigoso de tradutores " +"para cadeias renderizadas como HTML." #: weblate/trans/guide.py:247 msgid "Workflow customization" msgstr "Personalização do fluxo de trabalho" #: weblate/trans/mixins.py:144 -#, fuzzy -#| msgid "Component with this URL slug already exists in the project." msgid "" "Component or category with the same URL slug already exists at this level." -msgstr "Um componente com este URL já existe no projeto." +msgstr "" +"O componente ou categoria com o mesmo slug de URL já existe neste nível." #: weblate/trans/mixins.py:151 -#, fuzzy -#| msgid "A component with the same name already exists." msgid "Component or category with the same name already exists at this level." -msgstr "Já existe um componente com o mesmo nome." +msgstr "O componente ou categoria com o mesmo nome já existe neste nível." #. Translators: Name of an alert #: weblate/trans/models/alert.py:191 @@ -13766,22 +13612,16 @@ msgid "Component seems unused." msgstr "O componente parece não utilizado." #: weblate/trans/models/alert.py:666 -#, fuzzy -#| msgid "The translation uses monolingual files." msgid "Glossary using monolingual files." -msgstr "A tradução utiliza ficheiros monolingue." +msgstr "Glossário usando ficheiros monolíngues." #: weblate/trans/models/announcement.py:104 -#, fuzzy -#| msgid "Security" msgid "Severity" -msgstr "Segurança" +msgstr "Gravidade" #: weblate/trans/models/announcement.py:105 -#, fuzzy -#| msgid "Category defines color used for the message." msgid "Severity defines color used for the message." -msgstr "A categoria define a cor usada para a mensagem." +msgstr "A gravidade define a cor usada para a mensagem." #: weblate/trans/models/announcement.py:107 msgid "Info (light blue)" @@ -13825,10 +13665,8 @@ msgid "Do not specify both component and project!" msgstr "Não especifique ambos, componente e projeto!" #: weblate/trans/models/category.py:48 -#, fuzzy -#| msgid "Category" msgid "Category name" -msgstr "Categoria" +msgstr "Nome da categoria" #: weblate/trans/models/category.py:50 weblate/trans/models/component.py:343 #: weblate/trans/models/componentlist.py:28 weblate/trans/models/project.py:139 @@ -13854,17 +13692,13 @@ msgid "Parent category has to be in the same project!" msgstr "A categoria pai deve estar no mesmo projeto!" #: weblate/trans/models/category.py:176 -#, fuzzy -#| msgid "First and last name should be different!" msgid "Parent category has to be different!" -msgstr "O primeiro e último nome devem ser diferentes!" +msgstr "A categoria pai tem que ser diferente!" #. Translators: Name of event in the history #: weblate/trans/models/change.py:367 -#, fuzzy -#| msgid "Resource update" msgid "Resource updated" -msgstr "Atualização de recurso" +msgstr "Recurso atualizado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:369 @@ -13878,10 +13712,8 @@ msgstr "Tradução alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:373 -#, fuzzy -#| msgid "Translations made" msgid "Translation added" -msgstr "Traduções efetuadas" +msgstr "Tradução adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:375 @@ -13910,10 +13742,8 @@ msgstr "Tradução enviada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:387 -#, fuzzy -#| msgid "Source string age" msgid "Source string added" -msgstr "Idade da cadeia fonte" +msgstr "Cadeia-fonte adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:389 @@ -13927,73 +13757,53 @@ msgstr "Componente desbloqueado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:393 -#, fuzzy -#| msgid "Change word" msgid "Changes committed" -msgstr "Alterar palavra" +msgstr "Alterações confirmadas" #. Translators: Name of event in the history #: weblate/trans/models/change.py:395 -#, fuzzy -#| msgid "Change password" msgid "Changes pushed" -msgstr "Alterar palavra-passe" +msgstr "Alterações enviadas" #. Translators: Name of event in the history #: weblate/trans/models/change.py:397 -#, fuzzy -#| msgid "Repository browser" msgid "Repository reset" -msgstr "Navegador do repositório" +msgstr "Redefinição do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:399 -#, fuzzy -#| msgid "Repository changes" msgid "Repository merged" -msgstr "Alterações do repositório" +msgstr "Repositório mesclado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:401 -#, fuzzy -#| msgid "Repository details" msgid "Repository rebased" -msgstr "Detalhes do repositório" +msgstr "Repositório rebaseado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:403 -#, fuzzy -#| msgid "Repository operation" msgid "Repository merge failed" -msgstr "Operação de repositório" +msgstr "Falha na mesclagem do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:405 -#, fuzzy -#| msgid "Repository operation" msgid "Repository rebase failed" -msgstr "Operação de repositório" +msgstr "Falha na rebase do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:407 -#, fuzzy -#| msgid "Repository failure" msgid "Repository push failed" -msgstr "Falha no repositório" +msgstr "Falha ao enviar para o repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:409 -#, fuzzy -#| msgid "Failing file" msgid "Parsing failed" -msgstr "Falha de ficheiro" +msgstr "Falha na análise" #. Translators: Name of event in the history #: weblate/trans/models/change.py:411 -#, fuzzy -#| msgid "Translation to remove" msgid "Translation removed" -msgstr "Tradução a remover" +msgstr "Tradução removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:413 @@ -14002,10 +13812,8 @@ msgstr "Sugestão removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:415 -#, fuzzy -#| msgid "Translation uploaded" msgid "Translation replaced" -msgstr "Tradução enviada" +msgstr "Tradução substituída" #. Translators: Name of event in the history #: weblate/trans/models/change.py:417 @@ -14019,38 +13827,28 @@ msgstr "Cadeia original alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:421 -#, fuzzy -#| msgid "String age" msgid "String added" -msgstr "Idade da cadeia" +msgstr "Cadeia adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:423 -#, fuzzy -#| msgid "Bulk status change" msgid "Bulk status changed" -msgstr "Modificação de estado em lote" +msgstr "Alterado estados em massa" #. Translators: Name of event in the history #: weblate/trans/models/change.py:425 -#, fuzzy -#| msgid "Last change" msgid "Visibility changed" -msgstr "Última alteração" +msgstr "Visibilidade alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:427 -#, fuzzy -#| msgid "User to add" msgid "User added" -msgstr "Utilizador a adicionar" +msgstr "Utilizador adicionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:429 -#, fuzzy -#| msgid "User profile" msgid "User removed" -msgstr "Perfil do utilizador" +msgstr "Utilizador removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:431 @@ -14064,31 +13862,23 @@ msgstr "Marcada para edição" #. Translators: Name of event in the history #: weblate/trans/models/change.py:435 -#, fuzzy -#| msgid "Component to remove" msgid "Component removed" -msgstr "Componente a remover" +msgstr "Componente removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:437 -#, fuzzy -#| msgid "Project to remove" msgid "Project removed" -msgstr "Projeto a remover" +msgstr "Projeto removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:439 -#, fuzzy -#| msgid "Project name" msgid "Project renamed" -msgstr "Nome do projeto" +msgstr "Projeto renomeado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:441 -#, fuzzy -#| msgid "Component name" msgid "Component renamed" -msgstr "Nome do componente" +msgstr "Componente renomeado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:443 @@ -14097,17 +13887,13 @@ msgstr "Componente deslocado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:445 -#, fuzzy -#| msgid "Contributors" msgid "Contributor joined" -msgstr "Colaboradores" +msgstr "Colaborador entrou" #. Translators: Name of event in the history #: weblate/trans/models/change.py:447 -#, fuzzy -#| msgid "Announcements" msgid "Announcement posted" -msgstr "Anúncios" +msgstr "Anúncio postado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:449 @@ -14116,52 +13902,38 @@ msgstr "Alerta acionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:451 -#, fuzzy -#| msgid "Language code" msgid "Language added" -msgstr "Código do idioma" +msgstr "Idioma adicionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:453 -#, fuzzy -#| msgid "Language code style" msgid "Language requested" -msgstr "Estilo de código de idioma" +msgstr "Idioma solicitado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:455 -#, fuzzy -#| msgid "Project name" msgid "Project created" -msgstr "Nome do projeto" +msgstr "Projeto criado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:457 -#, fuzzy -#| msgid "Component locked" msgid "Component created" -msgstr "Componente bloqueado" +msgstr "Componente criado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:459 -#, fuzzy -#| msgid "User identities" msgid "User invited" -msgstr "Identidades do utilizador" +msgstr "Utilizador convidado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:461 -#, fuzzy -#| msgid "Received repository notification" msgid "Repository notification received" -msgstr "Notificação de repositório recebido" +msgstr "Notificação de repositório recebida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:463 -#, fuzzy -#| msgid "Replaced file by upload" msgid "Translation replaced file by upload" -msgstr "Ficheiro substituído por envio" +msgstr "Ficheiro de tradução substituído por upload" #. Translators: Name of event in the history #: weblate/trans/models/change.py:465 @@ -14210,10 +13982,8 @@ msgstr "Cadeia removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:483 -#, fuzzy -#| msgid "Component to remove" msgid "Comment removed" -msgstr "Componente a remover" +msgstr "Comentário removido" #: weblate/trans/models/change.py:487 msgctxt "Name of event in the history" @@ -14237,17 +14007,13 @@ msgstr "Categoria renomeada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:496 -#, fuzzy -#| msgid "Category" msgid "Category moved" -msgstr "Categoria" +msgstr "Categoria movida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:498 -#, fuzzy -#| msgid "Failing file" msgid "Saving string failed" -msgstr "Falha de ficheiro" +msgstr "Falha ao gravar a cadeia" #. Translators: Name of event in the history #: weblate/trans/models/change.py:500 @@ -14256,31 +14022,23 @@ msgstr "Cadeia adicionada ao repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:502 -#, fuzzy -#| msgid "String updated in the repository" msgid "String updated in the upload" -msgstr "Cadeia atualizada no repositório" +msgstr "Cadeia atualizada via envio" #. Translators: Name of event in the history #: weblate/trans/models/change.py:504 -#, fuzzy -#| msgid "String updated in the repository" msgid "String added in the upload" -msgstr "Cadeia atualizada no repositório" +msgstr "Cadeia adicionada via envio" #. Translators: Name of event in the history #: weblate/trans/models/change.py:506 -#, fuzzy -#| msgid "Replaced file by upload" msgid "Translation updated by source upload" -msgstr "Ficheiro substituído por envio" +msgstr "Tradução atualizada via upload da fonte" #. Translators: Name of event in the history #: weblate/trans/models/change.py:508 -#, fuzzy -#| msgid "Translation completed" msgid "Component translation completed" -msgstr "Tradução concluída" +msgstr "Tradução de componentes concluída" #: weblate/trans/models/change.py:592 msgid "The component was automatically locked because of an alert." @@ -14298,28 +14056,21 @@ msgstr "%(action)s a %(time)s em %(translation)s por %(user)s" #. Translators: condensed rendering of a change action in history #: weblate/trans/models/change.py:681 -#, fuzzy, python-format -#| msgid "%(action)s at %(time)s on %(translation)s by %(user)s" +#, python-format msgid "%(action)s at %(time)s on %(translation)s" -msgstr "%(action)s a %(time)s em %(translation)s por %(user)s" +msgstr "%(action)s às %(time)s em %(translation)s" #: weblate/trans/models/change.py:850 -#, fuzzy -#| msgid "The \"{}\" file was changed." msgid "The “{}” file was changed." -msgstr "O ficheiro \"{}\" foi alterado." +msgstr "O ficheiro “{}” foi alterado." #: weblate/trans/models/change.py:852 -#, fuzzy -#| msgid "Parsing of the \"{}\" file was enforced." msgid "Parsing of the “{}” file was enforced." -msgstr "A análise do ficheiro \"{}\" foi forçada." +msgstr "A análise do ficheiro “{}” foi aplicada." #: weblate/trans/models/change.py:854 -#, fuzzy -#| msgid "File {} was added." msgid "File “{}” was added." -msgstr "O ficheiro {} foi adicionado." +msgstr "O ficheiro “{}” foi adicionado." #: weblate/trans/models/change.py:860 msgctxt "License information not available" @@ -14340,11 +14091,8 @@ msgid "Original revision: {}" msgstr "Revisão original: {}" #: weblate/trans/models/change.py:919 -#, fuzzy -#| msgctxt "Translation memory category" -#| msgid "Personal: {}" msgid "New revision: {}" -msgstr "Pessoal: {}" +msgstr "Nova revisão: {}" #. Translators: Action when adding new translation #: weblate/trans/models/component.py:117 @@ -14375,10 +14123,8 @@ msgid "POSIX style using underscore as a separator" msgstr "Estilo POSIX utilizando o sublinhado como um separador" #: weblate/trans/models/component.py:130 -#, fuzzy -#| msgid "POSIX style using underscore as a separator" msgid "POSIX style using underscore as a separator, lower cased" -msgstr "Estilo POSIX utilizando o sublinhado como um separador" +msgstr "Estilo POSIX usando sublinhado como separador em letras minúsculas" #: weblate/trans/models/component.py:132 msgid "BCP style using hyphen as a separator" @@ -14391,14 +14137,12 @@ msgstr "" "código do país" #: weblate/trans/models/component.py:142 -#, fuzzy -#| msgid "POSIX style using underscore as a separator, including country code" msgid "" "POSIX style using underscore as a separator, including country code, lower " "cased" msgstr "" -"Estilo de POSIX utilizando o sublinhado como um separador, incluindo o " -"código do país" +"Estilo POSIX usando sublinhado como separador, incluindo o código do país em " +"letras minúsculas" #: weblate/trans/models/component.py:147 msgid "BCP style using hyphen as a separator, including country code" @@ -14432,10 +14176,8 @@ msgid "Linux style" msgstr "Estilo Linux" #: weblate/trans/models/component.py:158 -#, fuzzy -#| msgid "Linux style" msgid "Linux style, lower cased" -msgstr "Estilo Linux" +msgstr "Estilo Linux em letras minúsculas" #: weblate/trans/models/component.py:162 msgid "Merge" @@ -14534,10 +14276,8 @@ msgstr "" "po." #: weblate/trans/models/component.py:453 -#, fuzzy -#| msgid "Screenshot details" msgid "Screenshot file mask" -msgstr "Detalhes da captura de ecrã" +msgstr "Máscara de ficheiro da captura de ecrã" #: weblate/trans/models/component.py:458 msgid "" @@ -14548,16 +14288,12 @@ msgstr "" "docs/screenshots/*.png." #: weblate/trans/models/component.py:467 -#, fuzzy -#| msgid "" -#| "Filename of translation base file, containing all strings and their " -#| "source; it is recommended for monolingual translation formats." msgid "" "Filename of translation base file, containing all strings and their source " "for monolingual translations." msgstr "" -"Nome do ficheiro base de tradução, que contém todas as cadeias e as " -"respetivas fontes; é recomendado para os formatos de tradução monolingue." +"Nome do ficheiro base de tradução, contendo todas as cadeias e a sua fonte " +"para traduções monolingues." #: weblate/trans/models/component.py:474 msgid "Edit base file" @@ -14605,8 +14341,6 @@ msgstr "" "diretas." #: weblate/trans/models/component.py:541 weblate/trans/models/workflow.py:43 -#, fuzzy -#| msgid "Autoaccept suggestions" msgid "Automatically accept suggestions" msgstr "Aceitar sugestões automaticamente" @@ -14837,10 +14571,9 @@ msgid "File does not exist." msgstr "O ficheiro não existe." #: weblate/trans/models/component.py:1783 -#, fuzzy, python-format -#| msgid "Failed to parse file %(file)s: %(error)s" +#, python-format msgid "Could not push %(component)s: %(error_text)s" -msgstr "Impossível analisar o ficheiro %(file)s: %(error)s" +msgstr "Não foi possível enviar %(component)s: %(error_text)s" #: weblate/trans/models/component.py:1810 #, python-format @@ -14868,16 +14601,12 @@ msgid "Could not merge remote branch into %s." msgstr "Não foi possível unir branch remoto com %s." #: weblate/trans/models/component.py:2733 -#, fuzzy -#| msgid "User has been blocked on this project." msgid "Category does not belong to this project." -msgstr "O utilizador foi bloqueado neste projeto." +msgstr "A categoria não pertence a este projeto." #: weblate/trans/models/component.py:2737 -#, fuzzy -#| msgid "Component list can not be chosen when unused." msgid "Categorized component can not be shared." -msgstr "A lista de componentes não pode ser seleccionada quando não for usada." +msgstr "O componente categorizado não pode ser partilhado." #: weblate/trans/models/component.py:2749 msgid "Invalid link to a Weblate project, use weblate://project/component." @@ -14941,10 +14670,9 @@ msgstr "" "não forneceu um ficheiro base para o fazer." #: weblate/trans/models/component.py:2878 -#, fuzzy, python-format -#| msgid "Failed to parse base file for new translations: %s" +#, python-format msgid "Could not parse base file for new translations: %s" -msgstr "Falha ao analisar o ficheiro base por novas traduções: %s" +msgstr "Não foi possível analisar o ficheiro base para novas traduções: %s" #: weblate/trans/models/component.py:2882 msgid "Unrecognized base file for new translations." @@ -14985,16 +14713,12 @@ msgid "Template language ({0}) does not match source language ({1})!" msgstr "O idioma do modelo {0} não corresponde ao idioma fonte ({1})!" #: weblate/trans/models/component.py:2972 -#, fuzzy -#| msgid "No remote repository" msgid "Choose No remote repository for local: URL." -msgstr "Sem repositório remoto" +msgstr "Escolheu Nenhum repositório remoto para o local: URL." #: weblate/trans/models/component.py:2977 -#, fuzzy -#| msgid "Push URL is not used when repository is linked!" msgid "Push URL is not used without a remote repository." -msgstr "O URL de envio não é usado quando o repositório está ligado!" +msgstr "A URL de envio não é usado sem um repositório remoto." #: weblate/trans/models/component.py:2991 msgid "" @@ -15115,10 +14839,8 @@ msgid "Component list to assign" msgstr "Lista de componentes a atribuir" #: weblate/trans/models/label.py:28 -#, fuzzy -#| msgid "Description" msgid "Label description" -msgstr "Descrição" +msgstr "Descrição da etiqueta" #: weblate/trans/models/project.py:129 msgid "Public" @@ -15178,6 +14900,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Exige que os colaboradores tenham a autenticação de dois fatores configurada " +"antes de poderem contribuir." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15217,10 +14941,8 @@ msgstr "" "exemplo: pt_GB:pt,pt_US:pt" #: weblate/trans/models/suggestion.py:155 -#, fuzzy -#| msgid "Failed to accept suggestion!" msgid "Could not accept suggestion!" -msgstr "Falha ao aceitar ao sugestão!" +msgstr "Não foi possível aceitar a sugestão!" #: weblate/trans/models/translation.py:235 #, python-format @@ -15232,24 +14954,20 @@ msgstr "" "adicione o ficheiro de idioma ao repositório." #: weblate/trans/models/translation.py:244 -#, fuzzy, python-format -#| msgid "Failed to parse file %(file)s: %(error)s" +#, python-format msgid "Could not parse file %(file)s: %(error)s" -msgstr "Impossível analisar o ficheiro %(file)s: %(error)s" +msgstr "Não foi possível analisar o ficheiro %(file)s: %(error)s" #: weblate/trans/models/translation.py:1108 #: weblate/trans/models/translation.py:1164 #: weblate/trans/models/translation.py:1258 -#, fuzzy, python-format -#| msgid "Failed to commit pending changes: %s" +#, python-format msgid "Could not commit pending changes: %s" -msgstr "Falha ao submeter alterações pendentes: %s" +msgstr "Não foi possível confirmar as alterações pendentes: %s" #: weblate/trans/models/translation.py:1671 -#, fuzzy -#| msgid "Unsupported file format." msgid "Plurals are not supported by the file format!" -msgstr "Formato não suportado." +msgstr "Os plurais não são suportados pelo formato de ficheiro!" #: weblate/trans/models/translation.py:1676 weblate/trans/models/unit.py:708 #, python-format @@ -15412,28 +15130,22 @@ msgid "{target} [{source}]" msgstr "{target} [{source}]" #: weblate/trans/templatetags/translations.py:273 -#, fuzzy -#| msgid "Forbidden translation" msgid "Forbidden translation:" msgid_plural "Forbidden translations:" -msgstr[0] "Tradução proibida" -msgstr[1] "Tradução proibida" +msgstr[0] "Tradução proibida:" +msgstr[1] "Traduções proibidas:" #: weblate/trans/templatetags/translations.py:286 -#, fuzzy -#| msgid "Untranslatable term" msgid "Untranslatable term:" msgid_plural "Untranslatable terms:" -msgstr[0] "Termo intraduzível" -msgstr[1] "Termo intraduzível" +msgstr[0] "Termo intraduzível:" +msgstr[1] "Termos intraduzíveis:" #: weblate/trans/templatetags/translations.py:299 -#, fuzzy -#| msgid "Glossary term" msgid "Glossary term:" msgid_plural "Glossary terms:" -msgstr[0] "Termo de glossário" -msgstr[1] "Termo de glossário" +msgstr[0] "Termo do glossário:" +msgstr[1] "Termos do glossário:" #: weblate/trans/templatetags/translations.py:373 msgid "New line" @@ -15721,22 +15433,17 @@ msgid "File mask does not contain * as a language placeholder!" msgstr "A máscara de ficheiro não contém * como um símbolo de idioma!" #: weblate/trans/validators.py:31 -#, fuzzy -#| msgid "" -#| "A value of 1 is not allowed for autoaccept as it would permit users to " -#| "vote on their own suggestions." msgid "" "A value of 1 is not allowed for automatic acceptance as it would permit " "users to vote on their own suggestions." msgstr "" -"Um valor de 1 não é permitido para a autoaceitação, pois permitiria que os " +"O valor 1 não é permitido para aceitação automática, pois permitiria que os " "utilizadores votassem nas suas próprias sugestões." #: weblate/trans/validators.py:42 -#, fuzzy, python-format -#| msgid "Failed to parse flags: %s" +#, python-format msgid "Could not parse flags: %s" -msgstr "Falha ao analisar os sinalizadores: %s" +msgstr "Não foi possível analisar os sinalizadores: %s" #: weblate/trans/validators.py:51 #, python-format @@ -15760,10 +15467,8 @@ msgid "Keys" msgstr "Chaves" #: weblate/trans/views/about.py:23 weblate/trans/views/about.py:130 -#, fuzzy -#| msgid "Support Weblate at {0}" msgid "Support Weblate" -msgstr "Suporte o Weblate em {0}" +msgstr "Suporte ao Weblate" #: weblate/trans/views/about.py:65 msgid "Weblate statistics" @@ -15807,6 +15512,8 @@ msgstr "" #: weblate/trans/views/basic.py:766 msgid "All languages have been added, updates of translations are in progress." msgstr "" +"Todos os idiomas foram adicionados, as atualizações das traduções estão em " +"andamento." #: weblate/trans/views/changes.py:63 #, python-format @@ -15844,10 +15551,8 @@ msgid "Detected license as %s, please check whether it is correct." msgstr "Licença detetada como %s, por favor verifique se está correta." #: weblate/trans/views/create.py:396 -#, fuzzy -#| msgid "Failed to parse uploaded ZIP file." msgid "Could not parse uploaded ZIP file." -msgstr "Impossível processar o ficheiro ZIP enviado." +msgstr "Não foi possível analisar o ficheiro ZIP enviado." #: weblate/trans/views/dashboard.py:151 msgid "" @@ -15887,26 +15592,21 @@ msgid "Your suggestion has been identified as spam!" msgstr "A sua sugestão foi identificada como spam!" #: weblate/trans/views/edit.py:319 -#, fuzzy -#| msgid "Only suggestions are allowed in this translation!" msgid "Your suggestion is similar to the current translation!" -msgstr "Só são aceites sugestões nesta tradução!" +msgstr "A sua sugestão é semelhante à tradução atual!" #: weblate/trans/views/edit.py:324 msgid "Your suggestion already exists!" msgstr "A sua sugestão já existe!" #: weblate/trans/views/edit.py:383 -#, fuzzy, python-format -#| msgid "" -#| "Added %(project)s to your watched projects. You can adjust them and this " -#| "behavior in the settings." +#, python-format msgid "" "Added %(project)s to your watched projects. You can adjust this behavior in " "the settings." msgstr "" -"Adicionado %(project)s aos seus projetos monitorados. Pode editá-los e " -"alterar esse comportamento nas configurações." +"Adicionado %(project)s aos seus projetos monitorados. Pode ajustar este " +"comportamento nas configurações." #: weblate/trans/views/edit.py:402 #, python-brace-format @@ -15951,10 +15651,8 @@ msgstr "Cadeia de pesquisa inválido!" #: weblate/trans/views/edit.py:759 weblate/trans/views/search.py:56 #: weblate/trans/views/search.py:208 -#, fuzzy -#| msgid "Failed to process form!" msgid "Could not process form!" -msgstr "Falha ao processar o formulário!" +msgstr "Não foi possível processar o formulário!" #: weblate/trans/views/edit.py:781 msgid "Automatic translation in progress" @@ -15969,10 +15667,8 @@ msgid "Posted new comment" msgstr "Novo comentário publicado" #: weblate/trans/views/edit.py:823 -#, fuzzy -#| msgid "Failed to add comment!" msgid "Could not add comment!" -msgstr "Falha ao adicionar comentário!" +msgstr "Não foi possível adicionar o comentário!" #: weblate/trans/views/edit.py:843 msgid "Comment has been deleted." @@ -15987,10 +15683,9 @@ msgid "New string has been added." msgstr "Nova cadeia adicionada." #: weblate/trans/views/edit.py:1056 -#, fuzzy, python-format -#| msgid "Failed to remove the string: %s" +#, python-format msgid "Could not remove the string: %s" -msgstr "Falha ao remover a cadeia: %s" +msgstr "Não foi possível remover a cadeia: %s" #: weblate/trans/views/error.py:28 msgid "Bad Request" @@ -16030,26 +15725,27 @@ msgid "File upload has failed: %s" msgstr "O envio do ficheiro falhou: %s" #: weblate/trans/views/git.py:38 -#, fuzzy -#| msgid "Failed to lock the repository, another operation is in progress." msgid "Could not lock the repository, another operation is in progress." -msgstr "Falha ao bloquear o repositório, está em curso outra operação." +msgstr "" +"Não foi possível bloquear o repositório, outra operação está em andamento." #: weblate/trans/views/git.py:61 msgid "" "All repositories have been updated, updates of translations are in progress." msgstr "" +"Todos os repositórios foram atualizados, as atualizações das traduções estão " +"em andamento." #: weblate/trans/views/git.py:84 msgid "All repositories were pushed." msgstr "Todos os repositórios foram enviados." #: weblate/trans/views/git.py:99 -#, fuzzy -#| msgid "All repositories have been reset." msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Todos os repositórios foram repostos." +msgstr "" +"Todos os repositórios foram redefinidos, atualizações das traduções estão em " +"andamento." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." @@ -16060,10 +15756,8 @@ msgid "Translation files have been synchronized." msgstr "Os ficheiros de tradução foram sincronizados." #: weblate/trans/views/git.py:155 -#, fuzzy -#| msgid "Automatic translation in progress" msgid "Updates of translations are in progress." -msgstr "Fonte da tradução automática em progresso" +msgstr "Atualizações das traduções estão em andamento." #: weblate/trans/views/git.py:178 msgid "All pending translations were committed." @@ -16082,10 +15776,8 @@ msgid "Component is now open for translation updates." msgstr "O componente agora está aberto para atualizações." #: weblate/trans/views/lock.py:60 -#, fuzzy -#| msgid "All components are now locked for translation updates!" msgid "All components are now open for translation updates." -msgstr "Todos os componentes estão agora bloqueados para atualizações!" +msgstr "Todos os componentes estão agora abertos para atualizações de tradução." #: weblate/trans/views/search.py:115 msgid "Search and replace completed, no strings were updated." @@ -16149,10 +15841,8 @@ msgid "The translation component was scheduled for removal." msgstr "O compenente de tradução está agendado para ser removido." #: weblate/trans/views/settings.py:209 -#, fuzzy -#| msgid "The project was scheduled for removal." msgid "The category was scheduled for removal." -msgstr "O projeto está agendado para ser removido." +msgstr "A categoria estava marcada para remoção." #: weblate/trans/views/settings.py:213 msgid "The project was scheduled for removal." @@ -16163,27 +15853,23 @@ msgid "A language in the project was removed." msgstr "O idioma do projeto foi removido." #: weblate/trans/views/settings.py:225 -#, fuzzy -#| msgid "A language in the project was removed." msgid "A language in the category was removed." -msgstr "O idioma do projeto foi removido." +msgstr "Um idioma da categoria foi removido." #: weblate/trans/views/settings.py:240 -#, fuzzy, python-format -#| msgid "Cannot rename due to outstanding issue in the configuration: %s" +#, python-format msgid "Could not change %s due to outstanding issue in its settings: %s" msgstr "" -"Não é possível renomear devido a um problema pendente na configuração: %s" +"Não foi possível alterar %s devido a um problema pendente nas configurações: " +"%s" #: weblate/trans/views/settings.py:413 msgid "Backup scheduled. It will be available soon." msgstr "Cópia de segurança agendada. Estará disponível em breve." #: weblate/trans/views/source.py:64 -#, fuzzy -#| msgid "Failed to change additional string info!" msgid "Could not change additional string info!" -msgstr "Falta ao alterar informações adicionais da cadeia!" +msgstr "Não foi possível alterar informações adicionais da cadeia!" #: weblate/trans/widgets.py:262 msgid "Big status badge" @@ -16209,20 +15895,16 @@ msgid "Component {}" msgstr "Componente {}" #: weblate/trans/widgets.py:378 -#, fuzzy -#| msgid "Status badge" msgid "SVG status badge" -msgstr "Emblema de estado" +msgstr "Emblema de estado SVG" #: weblate/trans/widgets.py:381 msgid "translated" msgstr "traduzido" #: weblate/trans/widgets.py:416 -#, fuzzy -#| msgid "Big status badge" msgid "PNG status badge" -msgstr "Emblema grande de estado" +msgstr "Emblema de estado PNG" #: weblate/trans/widgets.py:425 msgctxt "Status widget name" @@ -16340,10 +16022,8 @@ msgid "Undefined variable: \"%s\"" msgstr "Variável indefinida: \"%s\"" #: weblate/utils/render.py:111 -#, fuzzy -#| msgid "Failed to render template: {}" msgid "Could not render template: {}" -msgstr "Falha ao desenhar o modelo: {}" +msgstr "Não foi possível renderizar o modelo: {}" #: weblate/utils/render.py:170 msgid "" @@ -16447,10 +16127,8 @@ msgid "This e-mail address is disallowed." msgstr "Este endereço de e-mail não é permitido." #: weblate/utils/validators.py:195 -#, fuzzy -#| msgid "Enter a valid e-mail address." msgid "Invalid e-mail address: {}" -msgstr "Insira um endereço de <i>e-mail</i> válido." +msgstr "Endereço de e-mail inválido: {}" #: weblate/utils/validators.py:207 msgid "Could not evaluate plural formula: {}" @@ -16514,18 +16192,12 @@ msgid "Error in parameter %(field)s: %(error)s" msgstr "Erro no parâmetro %(field)s: %(error)s" #: weblate/vcs/base.py:68 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório upstream." #: weblate/vcs/git.py:72 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Git repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório Git upstream." #: weblate/vcs/git.py:548 msgid "Possible cleanups:" @@ -16544,23 +16216,17 @@ msgid "Git with force push" msgstr "Git com push forçado" #: weblate/vcs/git.py:772 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will force push changes to the upstream repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto forçará as alterações de envio para o repositório upstream." #: weblate/vcs/git.py:1222 -#, fuzzy -#| msgid "Bitbucket Server pull request" msgid "Azure DevOps pull request" -msgstr "«Pull request» do servidor Bitbucket" +msgstr "Solicitação `pull` do Azure DevOps" #: weblate/vcs/git.py:1230 -#, fuzzy -#| msgid "Bitbucket Server pull request" msgid "This will push changes and create a Azure DevOps pull request." -msgstr "«Pull request» do servidor Bitbucket" +msgstr "" +"Isto enviará alterações e criará uma solicitação `pull` do Azure DevOps." #: weblate/vcs/git.py:1468 msgid "GitHub pull request" @@ -16609,11 +16275,8 @@ msgstr "" "Isto fará o push das alterações e criará um pull request do Bitbucket Server." #: weblate/vcs/mercurial.py:45 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Mercurial repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório Mercurial upstream." #: weblate/vcs/ssh.py:46 msgctxt "SSH key type" @@ -16631,10 +16294,9 @@ msgid "[hostname hashed]" msgstr "[nome de servidor com hash]" #: weblate/vcs/ssh.py:185 -#, fuzzy, python-format -#| msgid "Failed to generate key: %s" +#, python-format msgid "Could not generate key: %s" -msgstr "Impossível gerar a chave: %s" +msgstr "Não foi possível gerar a chave: %s" #: weblate/vcs/ssh.py:192 msgid "Created new SSH key." @@ -16654,16 +16316,14 @@ msgstr "" "(%(keytype)s), verifique se está correcta." #: weblate/vcs/ssh.py:243 weblate/vcs/ssh.py:249 -#, fuzzy, python-format -#| msgid "Failed to fetch public key for a host!" +#, python-format msgid "Could not fetch public key for a host: %s" -msgstr "Não foi possível obter a chave pública para um hospedeiro!" +msgstr "Não foi possível buscar a chave pública para um host: %s" #: weblate/vcs/ssh.py:253 -#, fuzzy, python-format -#| msgid "Failed to get host key: %s" +#, python-format msgid "Could not get host key: %s" -msgstr "Não foi possível obter a chave do hospedeiro: %s" +msgstr "Não foi possível obter a chave do host: %s" #: weblate/wladmin/forms.py:15 msgid "Activation token" @@ -16826,14 +16486,10 @@ msgstr "" "Weblate no discover." #: weblate/wladmin/views.py:206 weblate/wladmin/views.py:223 -#, fuzzy -#| msgid "" -#| "Could not activate your installation. Please ensure your activation token " -#| "is correct." msgid "Could not activate your installation. Please try again later." msgstr "" -"Não foi possível ativar a sua instalação. Certifique-se de que o seu token " -"de ativação está correto." +"Não foi possível ativar a sua instalação. Por favor, tente novamente mais " +"tarde." #: weblate/wladmin/views.py:215 msgid "" @@ -16844,10 +16500,9 @@ msgstr "" "de ativação está correto." #: weblate/wladmin/views.py:230 -#, fuzzy, python-format -#| msgid "Failed to fetch translation: %s" +#, python-format msgid "Could not activate your installation: %s" -msgstr "Falha ao obter tradução: %s" +msgstr "Não foi possível ativar a sua instalação: %s" #: weblate/wladmin/views.py:234 msgid "Activation completed." diff --git a/weblate/locale/pt/LC_MESSAGES/djangojs.po b/weblate/locale/pt/LC_MESSAGES/djangojs.po index d68104911a9d..f0d499cb2dc0 100644 --- a/weblate/locale/pt/LC_MESSAGES/djangojs.po +++ b/weblate/locale/pt/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:27+0000\n" -"PO-Revision-Date: 2024-01-24 21:39+0000\n" +"PO-Revision-Date: 2024-10-07 17:53+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4-dev\n" +"X-Generator: Weblate 5.8-dev\n" #: weblate/static/editor/base.js:89 msgid "Please select target plural by clicking." @@ -85,16 +85,16 @@ msgstr "" #: weblate/static/js/screenshots/clipboard-paste.js:38 msgid "Image Pasted!" -msgstr "" +msgstr "Imagem colada!" #: weblate/static/js/screenshots/clipboard-paste.js:40 #: weblate/static/js/screenshots/clipboard-paste.js:56 msgid "Something went wrong!" -msgstr "" +msgstr "Algo correu mal!" #: weblate/static/js/screenshots/clipboard-paste.js:53 msgid "No image found in clipboard" -msgstr "" +msgstr "Nenhuma imagem encontrada na área de transferência" #: weblate/static/loader-bootstrap.js:171 msgid "Error loading search results!" @@ -145,60 +145,39 @@ msgstr "" #: weblate/static/loader-bootstrap.js:1432 msgid "Custom range" -msgstr "" +msgstr "Intervalo personalizado" #: weblate/static/loader-bootstrap.js:1434 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Su" msgctxt "Short name of day" msgid "Su" msgstr "Do" #: weblate/static/loader-bootstrap.js:1435 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Mo" msgctxt "Short name of day" msgid "Mo" -msgstr "2ª" +msgstr "Se" #: weblate/static/loader-bootstrap.js:1436 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Tu" msgctxt "Short name of day" msgid "Tu" -msgstr "3ª" +msgstr "Te" #: weblate/static/loader-bootstrap.js:1437 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "We" msgctxt "Short name of day" msgid "We" -msgstr "4ª" +msgstr "Qu" #: weblate/static/loader-bootstrap.js:1438 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Th" msgctxt "Short name of day" msgid "Th" -msgstr "5ª" +msgstr "Qu" #: weblate/static/loader-bootstrap.js:1439 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Fr" msgctxt "Short name of day" msgid "Fr" -msgstr "6ª" +msgstr "Se" #: weblate/static/loader-bootstrap.js:1440 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Sa" msgctxt "Short name of day" msgid "Sa" msgstr "Sá" @@ -269,31 +248,31 @@ msgstr "Hoje" #: weblate/static/loader-bootstrap.js:1459 msgid "Yesterday" -msgstr "" +msgstr "Ontem" #: weblate/static/loader-bootstrap.js:1463 msgid "Last 7 days" -msgstr "" +msgstr "Últimos 7 dias" #: weblate/static/loader-bootstrap.js:1464 msgid "Last 30 days" -msgstr "" +msgstr "Últimos 30 dias" #: weblate/static/loader-bootstrap.js:1465 msgid "This month" -msgstr "" +msgstr "Este mês" #: weblate/static/loader-bootstrap.js:1469 msgid "Last month" -msgstr "" +msgstr "Mês passado" #: weblate/static/loader-bootstrap.js:1473 msgid "This year" -msgstr "" +msgstr "Este ano" #: weblate/static/loader-bootstrap.js:1477 msgid "Last year" -msgstr "" +msgstr "Ano passado" #: weblate/static/loader-bootstrap.js:1548 msgctxt "Alert to user when opening browser developer console" diff --git a/weblate/locale/pt_BR/LC_MESSAGES/django.po b/weblate/locale/pt_BR/LC_MESSAGES/django.po index b67d8c90bcde..956da7bbb656 100644 --- a/weblate/locale/pt_BR/LC_MESSAGES/django.po +++ b/weblate/locale/pt_BR/LC_MESSAGES/django.po @@ -10,13 +10,14 @@ # Euclides Paulo de Siqueira Junior , 2024. # Jose Delvani , 2024. # Alefsander Ribeiro Nascimento , 2024. +# Alan Marques , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-09-20 19:19+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-10-10 03:06+0000\n" +"Last-Translator: Alan Marques \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -66,7 +67,7 @@ msgstr "E-mail de commit" #: weblate/accounts/forms.py:191 msgid "Use account e-mail address" -msgstr "Usar endereço de e-mail da conta" +msgstr "Use o endereço de e-mail da conta" #: weblate/accounts/forms.py:193 msgid "" @@ -74,8 +75,8 @@ msgid "" "forever once changes are committed by Weblate." msgstr "" "Usado em commits de controle de versão. O endereço permanecerá no " -"repositório para sempre assim que as alterações sejam armazenados em um " -"commit pelo Weblate." +"repositório para sempre uma vez que as alterações sejam commitadas pelo " +"Weblate." #: weblate/accounts/forms.py:225 weblate/accounts/models.py:654 msgid "Public e-mail" @@ -83,7 +84,7 @@ msgstr "E-mail público" #: weblate/accounts/forms.py:226 msgid "Do not publicly display e-mail address" -msgstr "Não exibir publicamente o e-mail" +msgstr "Não exiba publicamente o endereço de e-mail" #: weblate/accounts/forms.py:332 #, python-format @@ -99,7 +100,7 @@ msgid "" "Used for e-mail notifications and as a commit e-mail if it is not configured " "below." msgstr "" -"Usado para notificações por e-mail e como e-mail de commit se não estiver " +"Usado para notificações por e-mail e como e-mail de commit, caso não esteja " "configurado abaixo." #: weblate/accounts/forms.py:407 @@ -125,8 +126,8 @@ msgid "" "Please contact us in English, otherwise we might be unable to process your " "request." msgstr "" -"Entre em contato conosco somente em inglês, caso contrário, talvez não " -"possamos processar sua solicitação." +"Por favor, entre em contato conosco em inglês, caso contrário, pode ser que " +"não consigamos processar sua solicitação." #: weblate/accounts/forms.py:432 weblate/accounts/templatetags/authnames.py:33 #: weblate/auth/models.py:413 weblate/auth/models.py:1126 @@ -139,7 +140,7 @@ msgstr "E-mail" #: weblate/accounts/forms.py:433 msgid "E-mail with a confirmation link will be sent here." -msgstr "O e-mail com um link de confirmação será enviado para cá." +msgstr "O e-mail com um link de confirmação será enviado aqui." #: weblate/accounts/forms.py:475 msgid "New password" @@ -163,7 +164,7 @@ msgstr "Quanto é %s?" #. Translators: Shown on wrong answer to the mathematics-based CAPTCHA #: weblate/accounts/forms.py:554 msgid "That was not correct, please try again." -msgstr "Isso não estava correto, por favor tente de novo." +msgstr "Isso não está correto, por favor, tente de novo." #: weblate/accounts/forms.py:581 msgid "Current password" @@ -171,7 +172,7 @@ msgstr "Senha atual" #: weblate/accounts/forms.py:582 msgid "Leave empty if you have not yet set a password." -msgstr "Deixe vazio se você ainda não definiu uma senha." +msgstr "Deixe em branco se você ainda não definiu uma senha." #: weblate/accounts/forms.py:596 msgid "You have entered an invalid password." @@ -179,7 +180,7 @@ msgstr "Você inseriu uma senha inválida." #: weblate/accounts/forms.py:610 msgid "Username or e-mail" -msgstr "Digite seu usuário ou e-mail" +msgstr "Nome de usuário ou e-mail" #: weblate/accounts/forms.py:611 weblate/accounts/templatetags/authnames.py:32 msgid "Password" @@ -187,7 +188,7 @@ msgstr "Senha" #: weblate/accounts/forms.py:615 msgid "Please enter the correct username and password." -msgstr "Por favor digite seu usuário e a senha corretamente." +msgstr "Por favor insira o seu usuário e a senha corretamente." #: weblate/accounts/forms.py:617 msgid "This account is inactive." @@ -203,7 +204,7 @@ msgstr "Notificações da tradução" #: weblate/accounts/forms.py:759 msgid "Use default setting" -msgstr "Usar configurações padrão" +msgstr "Usar configuração padrão" #: weblate/accounts/forms.py:791 msgid "Other projects" @@ -265,8 +266,8 @@ msgid "" "You will only receive these notifications for your translated languages in " "non-watched projects." msgstr "" -"Você só receberá estas notificações para os seus idiomas traduzidos nos " -"projetos não monitorados." +"Você receberá essas notificações apenas para suas línguas traduzidas em " +"projetos não observados." #: weblate/accounts/forms.py:834 msgid "" @@ -311,7 +312,7 @@ msgstr "Usuário" #: weblate/accounts/forms.py:885 weblate/auth/models.py:437 msgid "Date joined" -msgstr "Data na qual entrou" +msgstr "Data de adesão" #: weblate/accounts/forms.py:886 msgid "Translations made" @@ -343,7 +344,7 @@ msgstr "Adicionar equipe" #: weblate/accounts/forms.py:954 msgid "Name your authentication app" -msgstr "Nomeie o aplicativo de autenticação" +msgstr "Nomeie seu aplicativo de autenticação" #: weblate/accounts/forms.py:957 msgid "Verify the code from the app" diff --git a/weblate/locale/pt_BR/LC_MESSAGES/djangojs.po b/weblate/locale/pt_BR/LC_MESSAGES/djangojs.po index 5ab783a696f0..dec2139b264a 100644 --- a/weblate/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/weblate/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -4,13 +4,14 @@ # Claudio Filho F Filho , 2023. # Jose Delvani , 2024. # Jose Delvani , 2024. +# Alan Marques , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:27+0000\n" -"PO-Revision-Date: 2024-09-08 11:09+0000\n" -"Last-Translator: Jose Delvani \n" +"PO-Revision-Date: 2024-10-10 03:06+0000\n" +"Last-Translator: Alan Marques \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -331,8 +332,8 @@ msgid "" "Please contact us in English, otherwise we might be unable to process your " "request." msgstr "" -"Entre em contato conosco somente em inglês, caso contrário, talvez não " -"possamos processar sua solicitação." +"Por favor, entre em contato conosco em inglês, caso contrário, pode ser que " +"não consigamos processar sua solicitação." #: weblate/static/zammad.js:51 msgid "Attachments" diff --git a/weblate/locale/pt_PT/LC_MESSAGES/django.po b/weblate/locale/pt_PT/LC_MESSAGES/django.po index 6174405be7b8..52a934829ea0 100644 --- a/weblate/locale/pt_PT/LC_MESSAGES/django.po +++ b/weblate/locale/pt_PT/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-06 23:37+0000\n" +"PO-Revision-Date: 2024-10-07 17:53+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" @@ -337,33 +337,31 @@ msgid "Add team" msgstr "Adicionar equipa" #: weblate/accounts/forms.py:954 -#, fuzzy -#| msgid "Authentication" msgid "Name your authentication app" -msgstr "Autenticação" +msgstr "Nomeie a app de autenticação" #: weblate/accounts/forms.py:957 msgid "Verify the code from the app" -msgstr "" +msgstr "Verifique o código da app" #: weblate/accounts/forms.py:971 -#, fuzzy -#| msgid "The translation is not valid XML" msgid "Entered token is not valid." -msgstr "A tradução não é XML válido" +msgstr "O token inserido não é válido." #: weblate/accounts/forms.py:1039 msgid "Recovery token" -msgstr "" +msgstr "Token de recuperação" #: weblate/accounts/forms.py:1041 msgid "" "Recovery token can be used just once, mark your token as used after using it." msgstr "" +"O token de recuperação pode ser usado apenas uma vez, marque o seu token " +"como usado após utilizá-lo." #: weblate/accounts/forms.py:1098 msgid "Enter the code from the app" -msgstr "" +msgstr "Insira o código da app" #: weblate/accounts/models.py:167 msgid "Password changed." @@ -499,26 +497,27 @@ msgstr "O utilizador foi removido da equipa {team} pelo {username}." #: weblate/accounts/models.py:201 msgid "Two-factor authentication recovery codes were generated" -msgstr "" +msgstr "Foram gerados códigos de recuperação de autenticação de dois fatores" #: weblate/accounts/models.py:204 msgid "Two-factor authentication recovery codes were viewed" msgstr "" +"Os códigos de recuperação da autenticação de dois fatores foram visualizados" #: weblate/accounts/models.py:206 #, python-brace-format msgid "Two-factor authentication added: {device}" -msgstr "" +msgstr "Autenticação de dois fatores adicionada: {device}" #: weblate/accounts/models.py:207 #, python-brace-format msgid "Two-factor authentication removed: {device}" -msgstr "" +msgstr "A autenticação de dois fatores foi removida: {device}" #: weblate/accounts/models.py:208 #, python-brace-format msgid "Two-factor authentication sign in using {device}" -msgstr "" +msgstr "Login com autenticação de dois fatores usando {device}" #: weblate/accounts/models.py:213 msgid "Configured password to sign in." @@ -876,18 +875,14 @@ msgid "Suggestion was added" msgstr "Sugestão foi adicionada" #: weblate/accounts/notifications.py:557 -#, fuzzy -#| msgid "Long untranslated" msgctxt "Notification name" msgid "Language was translated" -msgstr "Não traduzido há muito tempo" +msgstr "Idioma foi traduzido" #: weblate/accounts/notifications.py:565 -#, fuzzy -#| msgid "Import as translated" msgctxt "Notification name" msgid "Component was translated" -msgstr "Importar como traduzida" +msgstr "Componente foi traduzido" #: weblate/accounts/notifications.py:573 msgctxt "Notification name" @@ -1005,29 +1000,25 @@ msgstr "" #: weblate/accounts/templatetags/authnames.py:53 msgid "Use security key (WebAuthn)" -msgstr "" +msgstr "Use a chave de segurança (WebAuthn)" #: weblate/accounts/templatetags/authnames.py:54 -#, fuzzy -#| msgid "Authentication" msgid "Use authentication app (TOTP)" -msgstr "Autenticação" +msgstr "Use a app de autenticação (TOTP)" #: weblate/accounts/templatetags/authnames.py:55 msgid "Use recovery codes" -msgstr "" +msgstr "Use códigos de recuperação" #: weblate/accounts/utils.py:170 -#, fuzzy, python-format -#| msgid "Security Policy" +#, python-format msgid "Security key (%s)" -msgstr "Política de segurança" +msgstr "Chave de segurança (%s)" #: weblate/accounts/utils.py:176 -#, fuzzy, python-format -#| msgid "Authentication" +#, python-format msgid "Authentication app (%s)" -msgstr "Autenticação" +msgstr "App de autenticação (%s)" #: weblate/accounts/views.py:205 weblate/accounts/views.py:1046 #: weblate/accounts/views.py:1112 weblate/templates/accounts/reset.html:7 @@ -1110,10 +1101,8 @@ msgid "Sign in" msgstr "Iniciar sessão" #: weblate/accounts/views.py:869 -#, fuzzy -#| msgid "Sign out" msgid "Signed out" -msgstr "Terminar sessão" +msgstr "Sair" #: weblate/accounts/views.py:975 msgid "Register e-mail" @@ -1145,10 +1134,9 @@ msgstr "" "Adicione outra identidade para confirmar o seu endereço de e-mail primeiro." #: weblate/accounts/views.py:1335 -#, fuzzy, python-format -#| msgid "Failed to generate key: %s" +#, python-format msgid "Could not authenticate: %s" -msgstr "Não foi possível gerar a chave: %s" +msgstr "Não foi possível autenticar: %s" #: weblate/accounts/views.py:1345 msgid "Could not complete registration." @@ -1229,32 +1217,26 @@ msgstr "" "inicie a sessão para configurar as notificações." #: weblate/accounts/views.py:1649 -#, fuzzy -#| msgid "User invitation was removed." msgid "The security key was removed." -msgstr "O convite do utilizador foi removido." +msgstr "A chave de segurança foi removida." #: weblate/accounts/views.py:1650 #, python-format msgid "The security key %s was registered." -msgstr "" +msgstr "A chave de segurança %s foi registada." #: weblate/accounts/views.py:1687 -#, fuzzy -#| msgid "User invitation was removed." msgid "The authentication app was removed." -msgstr "O convite do utilizador foi removido." +msgstr "A app de autenticação foi removido." #: weblate/accounts/views.py:1688 #, python-format msgid "The authentication app %s was registered." -msgstr "" +msgstr "A app de autenticação %s foi registado." #: weblate/accounts/views.py:1821 -#, fuzzy -#| msgid "Last sign in" msgid "Second factor sign in" -msgstr "Última sessão" +msgstr "Login de segundo fator" #: weblate/addons/autotranslate.py:18 weblate/templates/translation.html:73 #: weblate/templates/translation.html:242 @@ -2644,10 +2626,9 @@ msgid "Enforced two-factor authentication" msgstr "Autenticação de dois fatores obrigatória" #: weblate/auth/models.py:197 -#, fuzzy -#| msgid "Redirecting you to the authentication provider." msgid "Requires users to have two-factor authentication configured." -msgstr "A redireccionar para o fornecedor de autenticação." +msgstr "" +"Requer que os utilizadores tenham a autenticação em duas etapas configurada." #: weblate/auth/models.py:398 weblate/utils/forms.py:71 #: weblate/utils/validators.py:173 @@ -2761,6 +2742,7 @@ msgid "" "This project requires two-factor authentication; configure it in your " "profile." msgstr "" +"Este projeto requer autenticação de dois fatores; configure-a no seu perfil." #: weblate/auth/permissions.py:184 weblate/templates/translate.html:175 #: weblate/templates/translate.html:231 @@ -2944,7 +2926,7 @@ msgstr "Número de alterações" #: weblate/billing/models.py:298 weblate/wladmin/models.py:215 msgid "Hosted strings" -msgstr "Entradas alojadas" +msgstr "Cadeias hospedadas" #: weblate/billing/models.py:310 weblate/trans/admin.py:95 msgid "Source words" @@ -3812,7 +3794,7 @@ msgstr "O formato de chaveta Python da cadeia não coincide com a fonte" #: weblate/checks/format.py:611 msgid "Single {} encountered in the format string." -msgstr "" +msgstr "Foi encontrado um único {} na cadeia de formato." #: weblate/checks/format.py:638 msgid "C# format" @@ -4528,7 +4510,7 @@ msgstr "Ficheiro fluente" #: weblate/formats/txt.py:89 msgid "Should be a directory with metadata files!" -msgstr "" +msgstr "Deve ser um diretório com ficheiros de metadados!" #: weblate/formats/txt.py:196 msgid "App store metadata files" @@ -5159,11 +5141,9 @@ msgid "Region ID" msgstr "ID da região" #: weblate/machinery/forms.py:260 -#, fuzzy -#| msgid "Context" msgctxt "Automatic suggestion service configuration" msgid "Context vector" -msgstr "Contexto" +msgstr "Vetor de contexto" #: weblate/machinery/forms.py:263 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" @@ -5172,15 +5152,14 @@ msgstr "" "123,4567:0.456" #: weblate/machinery/forms.py:276 -#, fuzzy, python-format -#| msgid "The translation is not valid XML" +#, python-format msgid "The context vector is not valid: %s" -msgstr "A tradução não é XML válido" +msgstr "O vetor de contexto não é válido: %s" #: weblate/machinery/forms.py:280 #, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "O valor do peso deve estar entre 0 e 1: %s" #: weblate/machinery/forms.py:291 msgctxt "Automatic suggestion service configuration" @@ -5234,16 +5213,14 @@ msgid "Automatic selection" msgstr "Seleção automática" #: weblate/machinery/forms.py:354 -#, fuzzy -#| msgid "Custom" msgctxt "OpenAI model selection" msgid "Custom model" -msgstr "Personalizado" +msgstr "Modelo personalizado" #: weblate/machinery/forms.py:359 msgctxt "Automatic suggestion service configuration" msgid "OpenAI API base URL" -msgstr "" +msgstr "URL base da API da OpenAI" #: weblate/machinery/forms.py:363 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" @@ -5255,11 +5232,9 @@ msgid "OpenAI model" msgstr "Modelo OpenAI" #: weblate/machinery/forms.py:378 -#, fuzzy -#| msgid "Customize the component name" msgctxt "OpenAI model selection" msgid "Custom model name" -msgstr "Personalizar nome do componente" +msgstr "Nome do modelo personalizado" #: weblate/machinery/forms.py:380 msgid "Only needed when model is set to 'Custom model'" @@ -5268,22 +5243,17 @@ msgstr "" "personalizado\"" #: weblate/machinery/forms.py:390 -#, fuzzy -#| msgid "Missing username or e-mail." msgid "Missing custom model name." -msgstr "Nome de utilizador ou e-mail ausente." +msgstr "Falta o nome de modelo personalizado." #: weblate/machinery/forms.py:394 msgid "Choose custom model here to enable it." -msgstr "" +msgstr "Escolha o modelo personalizado aqui para habilitá-lo." #: weblate/machinery/forms.py:403 -#, fuzzy -#| msgctxt "Automatic suggestion service configuration" -#| msgid "Application endpoint URL" msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI endpoint URL" -msgstr "URL de «endpoint» da aplicação" +msgstr "URL para o endpoint do Azure OpenAI" #: weblate/machinery/forms.py:407 msgid "" @@ -5295,7 +5265,7 @@ msgstr "" #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Implementação do Azure OpenAI" #: weblate/machinery/forms.py:416 msgid "The model's unique deployment name." @@ -5525,49 +5495,35 @@ msgid "CSRF verification failed. Request aborted." msgstr "A verificação de CSRF falhou. Pedido abortado." #: weblate/templates/403_csrf.html:15 -#, fuzzy -#| msgid "" -#| "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 your browser is not hijacked by third-parties." msgid "" "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, ensuring " "that your browser is not being hijacked by third parties." msgstr "" -"Esta página HTTPS requer que um cabeçalho 'Referer' seja enviado pelo seu " -"navegador, mas nenhum foi enviado. Este cabeçalho é requerido por motivos " -"securitários, para garantir que o seu navegador não é desviado por terceiros." +"Este site HTTPS exige que um cabeçalho \"Referer\" seja enviado pelo seu " +"navegador da Web, mas nenhum foi enviado. Este cabeçalho é necessário por " +"motivos de segurança, garantindo que o seu navegador não seja invadido por " +"terceiros." #: weblate/templates/403_csrf.html:16 -#, fuzzy -#| msgid "" -#| "If you have set up your web browser to not send 'Referer' headers, please " -#| "turn that on (at-least for this site, for HTTPS connections, or for 'same-" -#| "origin' requests)." msgid "" "If you have set up your web browser to not send 'Referer' headers, you need " "to turn that on (at least for this site, HTTPS connections, or 'same-origin' " "requests)." msgstr "" -"Se configurou o seu navegador para desativar cabeçalhos 'Referer', por favor " -"ative-os novamente, pelo menos para esta página, para ligações HTTPS ou para " -"pedidos 'same-origin'." +"Se configurou o seu navegador da Web para não enviar cabeçalhos \"Referer\", " +"é necessário ativá-lo (pelo menos para este site, conexões HTTPS ou " +"solicitações de \"same-origin\")." #: weblate/templates/403_csrf.html:18 -#, fuzzy -#| msgid "" -#| "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 "" "Our site requires a session cookie to make the forms work. This cookie is " "required for security reasons, ensuring that your browser is not being " "hijacked by third parties." msgstr "" -"Esta página requer um cookie CSRF quando submete formulários. Este cookie é " -"requerido por razões de segurança, para garantir que o seu navegador não " -"está a ser desviado por terceiros." +"O nosso site requer um cookie de sessão para que os formulários funcionem. " +"Este cookie é necessário por motivos de segurança, garantindo que o seu " +"navegador não seja invadido por terceiros." #: weblate/templates/403_csrf.html:19 msgid "" @@ -5575,18 +5531,18 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Pode ter acontecido que o cookie da sua sessão tenha expirado devido à " +"inatividade. Isto pode acontecer facilmente com solicitações não " +"autenticadas em que a validade da sessão é limitada. Pode tentar a ação " +"pretendida novamente nesse caso." #: weblate/templates/403_csrf.html:20 -#, fuzzy -#| msgid "" -#| "If you have set up your browser to not save cookies, please turn them on " -#| "again (at-least for this site, or for 'same-origin' requests)." msgid "" "If you have set up your browser to not save cookies, you need to enable " "saving them (at least for this site, or 'same-origin' requests)." msgstr "" -"Se configurou o seu navegador para desativar os cookies, por favor, ative-os " -"novamente (pelo menos para esta página ou para pedidos 'same-origin')." +"Se configurou o seu navegador para não gravar cookies, precisa ativar a " +"gravação deles (pelo menos para este site ou solicitações de 'same-origin')." #: weblate/templates/403_csrf.html:22 #, python-format @@ -5793,11 +5749,11 @@ msgstr "Estatísticas" #: weblate/templates/accounts/2fa.html:24 msgid "Second factor sign-in" -msgstr "" +msgstr "Login de segundo fator" #: weblate/templates/accounts/2fa.html:30 msgid "Please complete your sign-in using second factor credential." -msgstr "" +msgstr "Por favor, complete o seu login usando a credencial do segundo fator." #: weblate/templates/accounts/confirm.html:7 #: weblate/templates/accounts/password.html:6 @@ -6201,10 +6157,8 @@ msgid "Security keys (WebAuthn)" msgstr "Chaves de segurança (WebAuthn)" #: weblate/templates/accounts/profile.html:198 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no WebAuthn keys registered." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente não há chaves WebAuthn registadas." #: weblate/templates/accounts/profile.html:203 #: weblate/templates/accounts/profile.html:235 @@ -6220,38 +6174,30 @@ msgstr "Remover" #: weblate/templates/accounts/profile.html:213 msgid "Name your security key" -msgstr "" +msgstr "Nomeie a sua chave de segurança" #: weblate/templates/accounts/profile.html:214 -#, fuzzy -#| msgid "Register new account" msgid "Register new security key" -msgstr "Registar nova conta" +msgstr "Registar nova chave de segurança" #: weblate/templates/accounts/profile.html:220 #: weblate/templates/accounts/webauthn.html:12 msgid "Unfortunately, your browser has no WebAuthn support." -msgstr "" +msgstr "Infelizmente, o seu navegador não tem suporte ao WebAuthn." #: weblate/templates/accounts/profile.html:228 -#, fuzzy -#| msgid "Authentication" msgid "Authenticator apps (TOTP)" -msgstr "Autenticação" +msgstr "Apps de autenticação (TOTP)" #: weblate/templates/accounts/profile.html:230 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no authenticator apps registered." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente, não há aplicações autenticadoras registados." #: weblate/templates/accounts/profile.html:242 #: weblate/templates/accounts/totp.html:11 #: weblate/templates/accounts/totp.html:22 -#, fuzzy -#| msgid "Register new account" msgid "Register new authenticator app" -msgstr "Registar nova conta" +msgstr "Registar nova aplicação autenticadora" #: weblate/templates/accounts/profile.html:245 #: weblate/templates/accounts/recovery-codes.html:11 @@ -6261,27 +6207,25 @@ msgstr "Códigos de recuperação" #: weblate/templates/accounts/profile.html:247 #: weblate/templates/accounts/recovery-codes.html:41 -#, fuzzy -#| msgid "There are currently no backups." msgid "There are currently no recovery codes generated." -msgstr "Atualmente, não existem cópias de segurança." +msgstr "Atualmente, não há códigos de recuperação gerados." #: weblate/templates/accounts/profile.html:248 #: weblate/templates/accounts/recovery-codes.html:44 #: weblate/templates/accounts/recovery-codes.html:51 msgid "Generate new recovery codes" -msgstr "" +msgstr "Gerar novos códigos de recuperação" #: weblate/templates/accounts/profile.html:251 #, python-format msgid "%(count)s recovery code is available." msgid_plural "%(count)s recovery codes are available." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(count)s código de recuperação está disponível." +msgstr[1] "%(count)s códigos de recuperação estão disponíveis." #: weblate/templates/accounts/profile.html:257 msgid "View recovery codes" -msgstr "" +msgstr "Exibir códigos de recuperação" #: weblate/templates/accounts/profile.html:269 msgid "User data" @@ -6452,7 +6396,7 @@ msgstr "Licenças para traduções individuais" #: weblate/templates/accounts/recovery-codes.html:20 msgid "Two-factor recovery codes" -msgstr "" +msgstr "Códigos de recuperação de dois fatores" #: weblate/templates/accounts/recovery-codes.html:25 msgid "" @@ -6470,29 +6414,32 @@ msgid "" "password and other second factors. If you cannot find these codes when " "needed, you will lose access to your account." msgstr "" +"Mantenha os seus códigos de recuperação num local seguro, como num gestor de " +"palavras-passe. Estes códigos são o último recurso para aceder a sua conta " +"caso perca a sua palavra-passe e outros fatores de autenticação. Se não " +"conseguir encontrar estes códigos quando necessário, perderá o acesso à sua " +"conta." #: weblate/templates/accounts/recovery-codes.html:39 -#, fuzzy -#| msgid "Repository URL copied to clipboard." msgid "Recovery codes copied to clipboard." -msgstr "URL do repositório copiado para a área de transferência." +msgstr "Códigos de recuperação copiados para a área de transferência." #: weblate/templates/accounts/recovery-codes.html:47 msgid "" "When you generate new recovery codes, you must download or print the new " "codes." msgstr "" +"Quando gerar novos códigos de recuperação, tem de descarregar ou imprimir os " +"códigos novos." #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Os seus códigos antigos tornarão-se inválidos e já não funcionarão." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 -#, fuzzy -#| msgid "Edit component settings" msgid "Back to account settings" -msgstr "Editar definições de componente" +msgstr "Voltar para configurações da conta" #: weblate/templates/accounts/redirect.html:14 #: weblate/templates/accounts/token.html:12 @@ -6566,20 +6513,21 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"As apps autenticadoras geram palavras-passe de uso único que são usadas como " +"um segundo fator para verificar a sua identidade quando solicitado durante o " +"login." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" -msgstr "" +msgstr "Escanear o código QR" #: weblate/templates/accounts/totp.html:37 msgid "You can also enter the secret key manually:" -msgstr "" +msgstr "Também pode inserir a chave secreta manualmente:" #: weblate/templates/accounts/totp.html:40 -#, fuzzy -#| msgid "API key copied to clipboard." msgid "Secret key copied to clipboard." -msgstr "Chave API copiada para área de transferência." +msgstr "Chave secreta copiada para a área de transferência." #: weblate/templates/accounts/totp.html:45 #: weblate/templates/mail/shared-registration.html:22 @@ -6721,10 +6669,8 @@ msgid "Edit" msgstr "Editar" #: weblate/templates/accounts/user.html:171 -#, fuzzy -#| msgid "No recent activity found!" msgid "No recent contributions found." -msgstr "Nenhuma atividade recente encontrada!" +msgstr "Nenhuma contribuição recente encontrada." #: weblate/templates/accounts/user.html:172 msgid "Browse all translations with contribution" @@ -6752,10 +6698,8 @@ msgid "User ID" msgstr "Id. do Utilizador" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" -msgstr "Notificações" +msgstr "Notificação" #: weblate/templates/accounts/user.html:237 weblate/trans/forms.py:1078 msgid "Scope" @@ -6763,7 +6707,7 @@ msgstr "Âmbito" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Freqüência" #: weblate/templates/accounts/user.html:241 msgid "One-time" @@ -6801,31 +6745,24 @@ msgid "Unblock user" msgstr "Desbloquear utilizador" #: weblate/templates/accounts/user.html:342 -#, fuzzy -#| msgctxt "Access-control role" -#| msgid "Edit source" msgid "Edit user" -msgstr "Editar fonte" +msgstr "Editar utilizador" #: weblate/templates/accounts/user.html:359 msgid "User has two-factor authentication configured." -msgstr "" +msgstr "O utilizador tem a autenticação de dois fatores configurada." #: weblate/templates/accounts/user.html:361 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "User doesn't have two-factor authentication configured." -msgstr "O servidor não permite autenticação." +msgstr "O utilizador não tem a autenticação de dois fatores configurada." #: weblate/templates/accounts/user.html:366 msgid "Disable two-factor authentication" -msgstr "" +msgstr "Desativar a autenticação de dois fatores" #: weblate/templates/accounts/user.html:373 -#, fuzzy -#| msgid "Account removal deletes all your private data." msgid "Account removal deletes all user private data." -msgstr "A remoção da conta elimina todos os dados privados." +msgstr "A remoção da conta apaga todos os dados privados do utilizador." #: weblate/templates/accounts/user.html:376 #: weblate/templates/accounts/user.html:390 @@ -6893,7 +6830,7 @@ msgstr "Traduções com contribuição" #: weblate/templates/accounts/webauthn.html:7 msgid "Sign in using the security key" -msgstr "" +msgstr "Faça login usando a chave de segurança" #: weblate/templates/addons/addon_detail.html:10 #: weblate/templates/addons/addon_detail.html:12 @@ -6912,19 +6849,13 @@ msgid "Configure add-on" msgstr "Configurar extensão" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Esta extensão executa um ''script''." +msgstr "Esta extensão não tem configurações." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 -#, fuzzy -#| msgid "Add-ons can be installed on project and component scope as well." msgid "The add-on can only be installed on the component." -msgstr "" -"As extensões também podem ser instaladas no escopo do projeto e do " -"componente." +msgstr "A extensão só pode ser instalada no componente." #: weblate/templates/addons/addon_head.html:9 msgid "This add-on is used for all components sharing this repository." @@ -7039,10 +6970,8 @@ msgid "Browse all add-on changes" msgstr "Explorar todas as alterações de extensões" #: weblate/templates/addons/addon_logs.html:27 -#, fuzzy -#| msgid "Account activity" msgid "Add-on Activity Logs" -msgstr "Atividade da conta" +msgstr "Registos de atividades complementares" #: weblate/templates/addons/addon_logs.html:32 msgid "Status" @@ -7308,10 +7237,8 @@ msgid "Automatic assignment" msgstr "Atribuição automática" #: weblate/templates/auth/teams-name.html:4 -#, fuzzy -#| msgid "The server does not allow authentication." msgid "Requires two-factor authentication" -msgstr "O servidor não permite autenticação." +msgstr "Requer autenticação de dois fatores" #: weblate/templates/auth/teams-roles.html:5 msgid "Access only" @@ -7997,10 +7924,9 @@ msgstr "O componente está a ser atualizado…" #: weblate/templates/component-progress.html:31 #: weblate/templates/multi-progress.html:26 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Continue to %(return_target)s" -msgstr "Convite para %(site_title)s" +msgstr "Continuar para %(return_target)s" #: weblate/templates/component-progress.html:33 msgid "Abort the update" @@ -8008,10 +7934,8 @@ msgstr "Abortar a atualização" #: weblate/templates/component-progress.html:38 #: weblate/templates/multi-progress.html:30 -#, fuzzy -#| msgid "Return to the component after completion" msgid "Continue after completion" -msgstr "Voltar ao componente após concluir" +msgstr "Continuar após a conclusão" #: weblate/templates/component.html:36 weblate/wladmin/views.py:80 msgid "Alerts" @@ -9462,16 +9386,14 @@ msgstr[0] "%(count)s texto não finalizado" msgstr[1] "%(count)s textos não finalizados" #: weblate/templates/mail/translated_component_subject.txt:3 -#, fuzzy, python-format -#| msgid "The translations in several languages have failing checks" +#, python-format msgid "Translations in all languages have been completed in %(component)s" -msgstr "As traduções em várias línguas têm verificações falhadas" +msgstr "As traduções em todos os idiomas foram concluídas em %(component)s" #: weblate/templates/mail/translated_language_subject.txt:3 -#, fuzzy, python-format -#| msgid "Translation comment has been deleted." +#, python-format msgid "%(translation)s has been completed" -msgstr "O comentário da tradução foi eliminado." +msgstr "%(translation)s foi concluído" #: weblate/templates/manage/alerts.html:7 msgid "Component alerts" @@ -9991,10 +9913,8 @@ msgid "Delete announcement" msgstr "Apagar anúncio" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" -msgstr "O componente está a ser atualizado…" +msgstr "A atualizar componentes…" #: weblate/templates/new-language.html:25 msgid "" @@ -10164,16 +10084,12 @@ msgid "Please try again later." msgstr "Por favor, tente novamente mais tarde." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Obrigado por utilizar o Weblate." +msgstr "Obrigado por usar o Weblate" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Mostrar no painel" +msgstr "Voltar ao painel" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10236,10 +10152,8 @@ msgid "Add to screenshot" msgstr "Adicionar à captura do ecrã" #: weblate/templates/screenshots/snippets/paste-button.html:4 -#, fuzzy -#| msgid "Copy token to clipboard" msgid "Paste from clipboard" -msgstr "Copiar token para área de transferência" +msgstr "Colar da área de transferência" #: weblate/templates/search.html:25 #: weblate/templates/snippets/embed-units.html:114 @@ -10391,19 +10305,23 @@ msgstr "A carregar os resultados…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Configurar a autenticação de dois fatores" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Este projeto requer autenticação de dois fatores de todos os contribuidores. " +"Não poderá contribuir até configurá-lo." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"é um membro da equipa que requer autenticação de dois fatores. Não poderá " +"usar nenhum dos seus privilégios até configurar o 2FA." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10751,16 +10669,12 @@ msgstr "" "%(link_fsf_start)sreconhecida como libre pela FSF%(link_end)s." #: weblate/templates/snippets/libre-basic.html:10 -#, fuzzy -#| msgid "" -#| "All the source code has to be publicly available in a supported version " -#| "control system." msgid "" "All the source code has to be libre-licensed and publicly available in a " "supported version control system." msgstr "" -"Todo o código-fonte tem de estar disponível publicamente num sistema de " -"controlo de versões suportado." +"Todo o código-fonte deve ter licença livre e estar disponível publicamente " +"num sistema de controle de versão compatível." #: weblate/templates/snippets/libre-basic.html:11 msgid "" @@ -10912,19 +10826,14 @@ msgstr "" "contribuição sob a licença definida por cada projeto traduzido." #: weblate/templates/snippets/login-info.html:31 -#, fuzzy -#| msgid "" -#| "By registering you agree to use your name and e-mail in version control " -#| "system commits and provide your contribution under license defined by " -#| "each translated project." msgid "" "By registering you agree to use your name in version control system commits " "and provide your contribution under license defined by each translated " "project." msgstr "" -"Ao registar-se, está a concordar em utilizar o seu nome e o ''e-mail'' nas " -"confirmações do sistema de controlo de versões e em disponibilizar a sua " -"contribuição sob a licença definida por cada projeto traduzido." +"Ao registar-se concorda a usar o seu nome nos commits do sistema de controle " +"de versão e fornecer a sua contribuição sob licença definida por cada " +"projeto traduzido." #: weblate/templates/snippets/plural-formula.html:4 msgid "" @@ -11097,7 +11006,7 @@ msgstr "Todas as cadeias não traduzidas adicionadas no mês passado" #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Filtrar por cadeias alteradas há mais que 2 semanas" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" @@ -11761,11 +11670,9 @@ msgstr "" "sinalizadores de cadeia ou componente." #: weblate/templates/trans/alert/unusedscreenshot.html:2 -#, fuzzy -#| msgid "" -#| "There is at least one screenshot which is not assigned to any strings." msgid "At least one screenshot has no string assigned to it." -msgstr "Há pelo menos um screenshot que não é atribuído a qualquer cadeia." +msgstr "" +"Pelo menos uma captura de ecrã não possui nenhuma cadeias lhe atribuída." #: weblate/templates/trans/alert/unusedscreenshot.html:4 msgid "Manage screenshots" @@ -11978,10 +11885,8 @@ msgstr "Os seguintes componentes de tradução serão removidos:" #: weblate/templates/trans/delete-category.html:21 #: weblate/templates/trans/delete-project.html:23 -#, fuzzy -#| msgid "The following translations will be removed:" msgid "The following translation categories will be removed:" -msgstr "As seguintes traduções serão removidas:" +msgstr "As seguintes categorias de tradução serão removidas:" #: weblate/templates/trans/delete-category.html:31 #: weblate/templates/trans/delete-project.html:33 @@ -12006,16 +11911,13 @@ msgid "I understand the consequences, delete this translation" msgstr "Compreendo as consequências, apagar esta tradução" #: weblate/templates/trans/delete-project.html:5 -#, fuzzy, python-format -#| msgid "" -#| "This action cannot be undone. This will permanently delete the %(object)s " -#| "project and all related content." +#, python-format msgid "" "This action cannot be undone. This will permanently delete the %(object)s " "category and all related content." msgstr "" -"Esta ação não pode ser anulada. Isto irá eliminar permanentemente o projeto " -"%(object)s e de todo o conteúdo relacionado." +"Esta ação não pode ser desfeita. Isto apagará permanentemente a categoria " +"%(object)s e todo o conteúdo relacionado." #: weblate/templates/trans/delete-project.html:10 #, python-format @@ -12025,16 +11927,12 @@ msgstr[0] "%(count)s componente será removido por esta ação." msgstr[1] "%(count)s componentes serão removidos por esta ação." #: weblate/templates/trans/delete-translation.html:6 -#, fuzzy -#| msgid "" -#| "The “Add missing languages” add-on is installed on this component, " -#| "removed language might be re-added by it again." msgid "" "The “Add missing languages” add-on is installed on this component, a removed " "language might be re-added by it again." msgstr "" -"A extensão de \"adicionar idiomas ausentes\" está instalada neste " -"componente, o idioma removido pode ser adicionado novamente por ela." +"O complemento “Adicionar idiomas ausentes” está instalado neste componente, " +"um idioma removido pode ser adicionado novamente por ele." #: weblate/templates/trans/delete-translation.html:11 msgid "" @@ -12136,10 +12034,9 @@ msgid "Edit team membership for %(username)s" msgstr "Editar membro da equipa para %(username)s" #: weblate/templates/trans/project-access.html:92 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation for %(email)s" -msgstr "Convite para %(site_title)s" +msgstr "Convite para %(email)s" #: weblate/templates/trans/project-access.html:121 msgid "" @@ -12253,10 +12150,8 @@ msgstr "" "componente de tradução." #: weblate/templates/translate.html:51 -#, fuzzy -#| msgid "Edit in Zen mode" msgid "Open in Zen mode" -msgstr "Editar em modo Zen" +msgstr "Abrir no modo Zen" #: weblate/templates/translate.html:51 weblate/templates/translation.html:204 #: weblate/templates/zen.html:22 @@ -12387,13 +12282,10 @@ msgid "Difference to current string" msgstr "Diferença para a cadeia atual" #: weblate/templates/translate.html:322 -#, fuzzy -#| msgid "The following string has the same context and source." -#| msgid_plural "The following strings have the same context and source." msgid "This string has the same context and source." msgid_plural "These strings have the same context and source." -msgstr[0] "A cadeia seguinte tem o mesmo contexto e fonte." -msgstr[1] "As cadeias seguintes têm o mesmo contexto e fonte." +msgstr[0] "Esta cadeia tem o mesmo contexto e origem." +msgstr[1] "Estas cadeias têm o mesmo contexto e origem." #: weblate/templates/translate.html:330 msgid "This string has a different context, but the same source." @@ -12527,10 +12419,8 @@ msgid "String age" msgstr "Idade da cadeia" #: weblate/templates/translate.html:695 weblate/utils/views.py:183 -#, fuzzy -#| msgid "Past due date" msgid "Last updated" -msgstr "Após a data de conclusão" +msgstr "Ultima atualização" #: weblate/templates/translate.html:701 msgid "Source string age" @@ -12699,44 +12589,33 @@ msgstr "" "eliminação." #: weblate/templates/weblate_auth/invitation_detail.html:9 -#, fuzzy -#| msgid "Resend invitation" msgid "Invitations" -msgstr "Reenviar convite" +msgstr "Convites" #: weblate/templates/weblate_auth/invitation_detail.html:10 -#, fuzzy -#| msgid "Resend invitation" msgid "Invitation" -msgstr "Reenviar convite" +msgstr "Convite" #: weblate/templates/weblate_auth/invitation_detail.html:18 -#, fuzzy -#| msgid "Donate to Weblate" msgid "Invitation to Weblate" -msgstr "Doar ao Weblate" +msgstr "Convite para Weblate" #: weblate/templates/weblate_auth/invitation_detail.html:21 -#, fuzzy -#| msgid "Please sign in to see the alerts." msgid "Please sign-in to view this invitation." -msgstr "Por favor, inicie a sessão para ver os alertas." +msgstr "Faça login para visualizar este convite." #: weblate/templates/weblate_auth/invitation_detail.html:23 msgid "This invitation belongs to a different user." msgstr "Este convite pertence a um utilizador diferente." #: weblate/templates/weblate_auth/invitation_detail.html:41 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation to %(project_name)s" -msgstr "Convite para %(site_title)s" +msgstr "Convite para %(project_name)s" #: weblate/templates/weblate_auth/invitation_detail.html:47 -#, fuzzy -#| msgid "Resend invitation" msgid "Accept invitation" -msgstr "Reenviar convite" +msgstr "Aceitar convite" #: weblate/templates/widgets.html:6 msgid "Widgets" @@ -13023,16 +12902,12 @@ msgid "Additional explanation to clarify meaning or usage of the string." msgstr "Explicação adicional para esclarecer o significado ou uso da cadeia." #: weblate/trans/forms.py:560 -#, fuzzy -#| msgid "Source string location" msgid "Source string explanation" -msgstr "Localização da cadeia fonte" +msgstr "Explicação da cadeia fonte" #: weblate/trans/forms.py:562 -#, fuzzy -#| msgid "Translation notifications" msgid "Translation explanation" -msgstr "Notificações de tradução" +msgstr "Explicação da tradução" #: weblate/trans/forms.py:579 msgid "The source string has changed meanwhile. Please check your changes." @@ -13374,10 +13249,9 @@ msgid "ZIP file containing project backup" msgstr "O ficheiro ZIP contém a cópia de segurança do projeto" #: weblate/trans/forms.py:2284 -#, fuzzy, python-format -#| msgid "Failed to load project backup: %s" +#, python-format msgid "Could not load project backup: %s" -msgstr "Não foi possível carregar a cópia de segurança do projeto: %s" +msgstr "Não foi possível carregar o backup do projeto: %s" #: weblate/trans/forms.py:2293 msgid "Optional additional filter applied to the strings" @@ -13449,10 +13323,8 @@ msgid "Untranslatable term" msgstr "Termo intraduzível" #: weblate/trans/forms.py:2506 -#, fuzzy -#| msgid "You currently do not have permission to create projects." msgid "You do not have permission to create terminology." -msgstr "Não tem permissão para criar projectos." +msgstr "Não tem permissão para criar terminologia." #: weblate/trans/forms.py:2572 msgid "State to set" @@ -13505,20 +13377,16 @@ msgid "Please type in the slug of the project to confirm." msgstr "Por favor, digite o nome completo do projeto para confirmar." #: weblate/trans/forms.py:2716 -#, fuzzy -#| msgid "Please type in the slug of the project to confirm." msgid "Please type in the slug of the category to confirm." -msgstr "Por favor, digite o nome completo do projeto para confirmar." +msgstr "Digite o slug da categoria para confirmar." #: weblate/trans/forms.py:2726 msgid "Please type in the slug of the project and language to confirm." msgstr "Por favor, digite o slug do projeto e idioma para confirmar." #: weblate/trans/forms.py:2737 -#, fuzzy -#| msgid "Please type in the slug of the project and language to confirm." msgid "Please type in the slug of the category and language to confirm." -msgstr "Por favor, digite o slug do projeto e idioma para confirmar." +msgstr "Digite o slug da categoria e do idioma para confirmar." #: weblate/trans/forms.py:2758 msgid "Action" @@ -13529,26 +13397,20 @@ msgid "Author username" msgstr "Nome de utilizador do autor" #: weblate/trans/forms.py:2767 -#, fuzzy -#| msgid "Change password" msgid "Change period" -msgstr "Alterar palavra-passe" +msgstr "Período de mudança" #: weblate/trans/forms.py:2779 -#, fuzzy -#| msgid "Failed to find matching user!" msgid "Could not find matching user!" -msgstr "Falha ao encontrar um utilizador idêntico!" +msgstr "Não foi possível encontrar o utilizador correspondente!" #: weblate/trans/forms.py:2852 msgid "Expiry cannot be in the past." msgstr "A data de expiração não pode estar no passado." #: weblate/trans/forms.py:2891 -#, fuzzy -#| msgid "The component contains translation file for the source language." msgid "Customize translation workflow for this language" -msgstr "O componente contém o ficheiro de tradução para o idioma fonte." +msgstr "Personalizar fluxo de trabalho para tradução deste idioma" #: weblate/trans/forms.py:2893 msgid "" @@ -13559,10 +13421,8 @@ msgstr "" "ativar a personalização aqui, substitui essas configurações para este idioma." #: weblate/trans/forms.py:2936 -#, fuzzy -#| msgid "The component contains translation file for the source language." msgid "Customize translation workflow for this language in this project" -msgstr "O componente contém o ficheiro de tradução para o idioma fonte." +msgstr "Personalizar fluxo de trabalho para tradução deste idioma neste projeto" #: weblate/trans/forms.py:2939 msgid "" @@ -13620,30 +13480,26 @@ msgid "Use flags to indicate special strings in your translation." msgstr "Utilize sinalizadores para indicar cadeias especiais na sua tradução." #: weblate/trans/guide.py:216 -#, fuzzy -#| msgid "Add safe-html flag to avoid dangerous HTML from translators." msgid "" "Add safe-html flag to avoid dangerous HTML from translators for strings " "which are rendered as HTML." msgstr "" -"Adicionar o sinalizador safe-html para evitar HTML perigoso dos tradutores." +"Adicione o sinalizador safe-html para evitar HTML perigoso de tradutores " +"para cadeias renderizadas como HTML." #: weblate/trans/guide.py:247 msgid "Workflow customization" msgstr "Personalização de fluxo de trabalho" #: weblate/trans/mixins.py:144 -#, fuzzy -#| msgid "Component with this URL slug already exists in the project." msgid "" "Component or category with the same URL slug already exists at this level." -msgstr "Um componente com este URL já existe no projeto." +msgstr "" +"O componente ou categoria com o mesmo slug de URL já existe neste nível." #: weblate/trans/mixins.py:151 -#, fuzzy -#| msgid "A component with the same name already exists." msgid "Component or category with the same name already exists at this level." -msgstr "Já existe um componente com o mesmo nome." +msgstr "O componente ou categoria com o mesmo nome já existe neste nível." #. Translators: Name of an alert #: weblate/trans/models/alert.py:191 @@ -13758,22 +13614,16 @@ msgid "Component seems unused." msgstr "O componente parece não utilizado." #: weblate/trans/models/alert.py:666 -#, fuzzy -#| msgid "The translation uses monolingual files." msgid "Glossary using monolingual files." -msgstr "A tradução utiliza ficheiros monolingue." +msgstr "Glossário usando ficheiros monolíngues." #: weblate/trans/models/announcement.py:104 -#, fuzzy -#| msgid "Security" msgid "Severity" -msgstr "Segurança" +msgstr "Gravidade" #: weblate/trans/models/announcement.py:105 -#, fuzzy -#| msgid "Category defines color used for the message." msgid "Severity defines color used for the message." -msgstr "A categoria define a cor usada para a mensagem." +msgstr "A gravidade define a cor usada para a mensagem." #: weblate/trans/models/announcement.py:107 msgid "Info (light blue)" @@ -13817,10 +13667,8 @@ msgid "Do not specify both component and project!" msgstr "Não especifique ambos, componente e projeto!" #: weblate/trans/models/category.py:48 -#, fuzzy -#| msgid "Category" msgid "Category name" -msgstr "Categoria" +msgstr "Nome da categoria" #: weblate/trans/models/category.py:50 weblate/trans/models/component.py:343 #: weblate/trans/models/componentlist.py:28 weblate/trans/models/project.py:139 @@ -13847,14 +13695,12 @@ msgstr "A categoria pai deve estar no mesmo projeto!" #: weblate/trans/models/category.py:176 msgid "Parent category has to be different!" -msgstr "A categoria fonte tem de ser diferente!" +msgstr "A categoria pai tem que ser diferente!" #. Translators: Name of event in the history #: weblate/trans/models/change.py:367 -#, fuzzy -#| msgid "Resource update" msgid "Resource updated" -msgstr "Atualização de recurso" +msgstr "Recurso atualizado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:369 @@ -13868,10 +13714,8 @@ msgstr "Tradução alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:373 -#, fuzzy -#| msgid "Translations made" msgid "Translation added" -msgstr "Traduções efetuadas" +msgstr "Tradução adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:375 @@ -13900,10 +13744,8 @@ msgstr "Tradução enviada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:387 -#, fuzzy -#| msgid "Source string age" msgid "Source string added" -msgstr "Idade da cadeia fonte" +msgstr "Cadeia-fonte adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:389 @@ -13917,73 +13759,53 @@ msgstr "Componente desbloqueado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:393 -#, fuzzy -#| msgid "Change word" msgid "Changes committed" -msgstr "Alterar palavra" +msgstr "Alterações confirmadas" #. Translators: Name of event in the history #: weblate/trans/models/change.py:395 -#, fuzzy -#| msgid "Change password" msgid "Changes pushed" -msgstr "Alterar palavra-passe" +msgstr "Alterações enviadas" #. Translators: Name of event in the history #: weblate/trans/models/change.py:397 -#, fuzzy -#| msgid "Repository browser" msgid "Repository reset" -msgstr "Navegador do repositório" +msgstr "Redefinição do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:399 -#, fuzzy -#| msgid "Repository changes" msgid "Repository merged" -msgstr "Alterações do repositório" +msgstr "Repositório mesclado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:401 -#, fuzzy -#| msgid "Repository details" msgid "Repository rebased" -msgstr "Detalhes do repositório" +msgstr "Repositório rebaseado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:403 -#, fuzzy -#| msgid "Repository operation" msgid "Repository merge failed" -msgstr "Operação de repositório" +msgstr "Falha na mesclagem do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:405 -#, fuzzy -#| msgid "Repository operation" msgid "Repository rebase failed" -msgstr "Operação de repositório" +msgstr "Falha na rebase do repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:407 -#, fuzzy -#| msgid "Repository failure" msgid "Repository push failed" -msgstr "Falha no repositório" +msgstr "Falha ao enviar para o repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:409 -#, fuzzy -#| msgid "Failing file" msgid "Parsing failed" -msgstr "Falha de ficheiro" +msgstr "Falha na análise" #. Translators: Name of event in the history #: weblate/trans/models/change.py:411 -#, fuzzy -#| msgid "Translation to remove" msgid "Translation removed" -msgstr "Tradução a remover" +msgstr "Tradução removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:413 @@ -13992,10 +13814,8 @@ msgstr "Sugestão removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:415 -#, fuzzy -#| msgid "Translation uploaded" msgid "Translation replaced" -msgstr "Tradução enviada" +msgstr "Tradução substituída" #. Translators: Name of event in the history #: weblate/trans/models/change.py:417 @@ -14009,38 +13829,28 @@ msgstr "Cadeia original alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:421 -#, fuzzy -#| msgid "String age" msgid "String added" -msgstr "Idade da cadeia" +msgstr "Cadeia adicionada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:423 -#, fuzzy -#| msgid "Bulk status change" msgid "Bulk status changed" -msgstr "Modificação de estado em lote" +msgstr "Alterado estados em massa" #. Translators: Name of event in the history #: weblate/trans/models/change.py:425 -#, fuzzy -#| msgid "Last change" msgid "Visibility changed" -msgstr "Última alteração" +msgstr "Visibilidade alterada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:427 -#, fuzzy -#| msgid "User to add" msgid "User added" -msgstr "Utilizador a adicionar" +msgstr "Utilizador adicionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:429 -#, fuzzy -#| msgid "User profile" msgid "User removed" -msgstr "Perfil do utilizador" +msgstr "Utilizador removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:431 @@ -14054,31 +13864,23 @@ msgstr "Marcada para edição" #. Translators: Name of event in the history #: weblate/trans/models/change.py:435 -#, fuzzy -#| msgid "Component to remove" msgid "Component removed" -msgstr "Componente a remover" +msgstr "Componente removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:437 -#, fuzzy -#| msgid "Project to remove" msgid "Project removed" -msgstr "Projeto a remover" +msgstr "Projeto removido" #. Translators: Name of event in the history #: weblate/trans/models/change.py:439 -#, fuzzy -#| msgid "Project name" msgid "Project renamed" -msgstr "Nome do projeto" +msgstr "Projeto renomeado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:441 -#, fuzzy -#| msgid "Component name" msgid "Component renamed" -msgstr "Nome do componente" +msgstr "Componente renomeado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:443 @@ -14087,17 +13889,13 @@ msgstr "Componente deslocado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:445 -#, fuzzy -#| msgid "Contributors" msgid "Contributor joined" -msgstr "Colaboradores" +msgstr "Colaborador entrou" #. Translators: Name of event in the history #: weblate/trans/models/change.py:447 -#, fuzzy -#| msgid "Announcements" msgid "Announcement posted" -msgstr "Anúncios" +msgstr "Anúncio postado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:449 @@ -14106,52 +13904,38 @@ msgstr "Alerta acionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:451 -#, fuzzy -#| msgid "Language code" msgid "Language added" -msgstr "Código do idioma" +msgstr "Idioma adicionado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:453 -#, fuzzy -#| msgid "Language code style" msgid "Language requested" -msgstr "Estilo de código de idioma" +msgstr "Idioma solicitado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:455 -#, fuzzy -#| msgid "Project name" msgid "Project created" -msgstr "Nome do projeto" +msgstr "Projeto criado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:457 -#, fuzzy -#| msgid "Component locked" msgid "Component created" -msgstr "Componente bloqueado" +msgstr "Componente criado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:459 -#, fuzzy -#| msgid "User identities" msgid "User invited" -msgstr "Identidades do utilizador" +msgstr "Utilizador convidado" #. Translators: Name of event in the history #: weblate/trans/models/change.py:461 -#, fuzzy -#| msgid "Received repository notification" msgid "Repository notification received" -msgstr "Notificação de repositório recebido" +msgstr "Notificação de repositório recebida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:463 -#, fuzzy -#| msgid "Replaced file by upload" msgid "Translation replaced file by upload" -msgstr "Ficheiro substituído por envio" +msgstr "Ficheiro de tradução substituído por upload" #. Translators: Name of event in the history #: weblate/trans/models/change.py:465 @@ -14200,10 +13984,8 @@ msgstr "Cadeia removida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:483 -#, fuzzy -#| msgid "Component to remove" msgid "Comment removed" -msgstr "Componente a remover" +msgstr "Comentário removido" #: weblate/trans/models/change.py:487 msgctxt "Name of event in the history" @@ -14227,17 +14009,13 @@ msgstr "Categoria renomeada" #. Translators: Name of event in the history #: weblate/trans/models/change.py:496 -#, fuzzy -#| msgid "Category" msgid "Category moved" -msgstr "Categoria" +msgstr "Categoria movida" #. Translators: Name of event in the history #: weblate/trans/models/change.py:498 -#, fuzzy -#| msgid "Failing file" msgid "Saving string failed" -msgstr "Falha de ficheiro" +msgstr "Falha ao gravar a cadeia" #. Translators: Name of event in the history #: weblate/trans/models/change.py:500 @@ -14246,31 +14024,23 @@ msgstr "Cadeia adicionada ao repositório" #. Translators: Name of event in the history #: weblate/trans/models/change.py:502 -#, fuzzy -#| msgid "String updated in the repository" msgid "String updated in the upload" -msgstr "Cadeia atualizada no repositório" +msgstr "Cadeia atualizada via envio" #. Translators: Name of event in the history #: weblate/trans/models/change.py:504 -#, fuzzy -#| msgid "String updated in the repository" msgid "String added in the upload" -msgstr "Cadeia atualizada no repositório" +msgstr "Cadeia adicionada via envio" #. Translators: Name of event in the history #: weblate/trans/models/change.py:506 -#, fuzzy -#| msgid "Replaced file by upload" msgid "Translation updated by source upload" -msgstr "Ficheiro substituído por envio" +msgstr "Tradução atualizada via upload da fonte" #. Translators: Name of event in the history #: weblate/trans/models/change.py:508 -#, fuzzy -#| msgid "Translation completed" msgid "Component translation completed" -msgstr "Tradução concluída" +msgstr "Tradução de componentes concluída" #: weblate/trans/models/change.py:592 msgid "The component was automatically locked because of an alert." @@ -14288,28 +14058,21 @@ msgstr "%(action)s a %(time)s em %(translation)s por %(user)s" #. Translators: condensed rendering of a change action in history #: weblate/trans/models/change.py:681 -#, fuzzy, python-format -#| msgid "%(action)s at %(time)s on %(translation)s by %(user)s" +#, python-format msgid "%(action)s at %(time)s on %(translation)s" -msgstr "%(action)s a %(time)s em %(translation)s por %(user)s" +msgstr "%(action)s às %(time)s em %(translation)s" #: weblate/trans/models/change.py:850 -#, fuzzy -#| msgid "The \"{}\" file was changed." msgid "The “{}” file was changed." -msgstr "O ficheiro \"{}\" foi alterado." +msgstr "O ficheiro “{}” foi alterado." #: weblate/trans/models/change.py:852 -#, fuzzy -#| msgid "Parsing of the \"{}\" file was enforced." msgid "Parsing of the “{}” file was enforced." -msgstr "A análise do ficheiro \"{}\" foi forçada." +msgstr "A análise do ficheiro “{}” foi aplicada." #: weblate/trans/models/change.py:854 -#, fuzzy -#| msgid "File {} was added." msgid "File “{}” was added." -msgstr "O ficheiro {} foi adicionado." +msgstr "O ficheiro “{}” foi adicionado." #: weblate/trans/models/change.py:860 msgctxt "License information not available" @@ -14330,11 +14093,8 @@ msgid "Original revision: {}" msgstr "Revisão original: {}" #: weblate/trans/models/change.py:919 -#, fuzzy -#| msgctxt "Translation memory category" -#| msgid "Personal: {}" msgid "New revision: {}" -msgstr "Pessoal: {}" +msgstr "Nova revisão: {}" #. Translators: Action when adding new translation #: weblate/trans/models/component.py:117 @@ -14530,16 +14290,12 @@ msgstr "" "docs/screenshots/*.png." #: weblate/trans/models/component.py:467 -#, fuzzy -#| msgid "" -#| "Filename of translation base file, containing all strings and their " -#| "source; it is recommended for monolingual translation formats." msgid "" "Filename of translation base file, containing all strings and their source " "for monolingual translations." msgstr "" -"Nome do ficheiro base de tradução, que contém todas as cadeias e as " -"respetivas fontes; é recomendado para os formatos de tradução monolingue." +"Nome do ficheiro base de tradução, contendo todas as cadeias e a sua fonte " +"para traduções monolingues." #: weblate/trans/models/component.py:474 msgid "Edit base file" @@ -14817,10 +14573,9 @@ msgid "File does not exist." msgstr "O ficheiro não existe." #: weblate/trans/models/component.py:1783 -#, fuzzy, python-format -#| msgid "Failed to parse file %(file)s: %(error)s" +#, python-format msgid "Could not push %(component)s: %(error_text)s" -msgstr "Falha ao analisar o ficheiro %(file)s: %(error)s" +msgstr "Não foi possível enviar %(component)s: %(error_text)s" #: weblate/trans/models/component.py:1810 #, python-format @@ -14848,10 +14603,8 @@ msgid "Could not merge remote branch into %s." msgstr "Não foi possível unir branch remoto com %s." #: weblate/trans/models/component.py:2733 -#, fuzzy -#| msgid "User has been blocked on this project." msgid "Category does not belong to this project." -msgstr "O utilizador foi bloqueado neste projeto." +msgstr "A categoria não pertence a este projeto." #: weblate/trans/models/component.py:2737 msgid "Categorized component can not be shared." @@ -14919,10 +14672,9 @@ msgstr "" "não forneceu um ficheiro base para o fazer." #: weblate/trans/models/component.py:2878 -#, fuzzy, python-format -#| msgid "Failed to parse base file for new translations: %s" +#, python-format msgid "Could not parse base file for new translations: %s" -msgstr "Falha ao analisar o ficheiro base por novas traduções: %s" +msgstr "Não foi possível analisar o ficheiro base para novas traduções: %s" #: weblate/trans/models/component.py:2882 msgid "Unrecognized base file for new translations." @@ -14963,16 +14715,12 @@ msgid "Template language ({0}) does not match source language ({1})!" msgstr "O idioma do modelo {0} não corresponde ao idioma fonte ({1})!" #: weblate/trans/models/component.py:2972 -#, fuzzy -#| msgid "No remote repository" msgid "Choose No remote repository for local: URL." -msgstr "Sem repositório remoto" +msgstr "Escolheu Nenhum repositório remoto para o local: URL." #: weblate/trans/models/component.py:2977 -#, fuzzy -#| msgid "Push changes to the remote repository" msgid "Push URL is not used without a remote repository." -msgstr "Submeter as alterações no repositório remoto" +msgstr "A URL de envio não é usado sem um repositório remoto." #: weblate/trans/models/component.py:2991 msgid "" @@ -15093,10 +14841,8 @@ msgid "Component list to assign" msgstr "Lista de componentes a atribuir" #: weblate/trans/models/label.py:28 -#, fuzzy -#| msgid "Description" msgid "Label description" -msgstr "Descrição" +msgstr "Descrição da etiqueta" #: weblate/trans/models/project.py:129 msgid "Public" @@ -15156,6 +14902,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Exige que os colaboradores tenham a autenticação de dois fatores configurada " +"antes de poderem contribuir." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15195,10 +14943,8 @@ msgstr "" "exemplo: pt_GB:pt,pt_US:pt" #: weblate/trans/models/suggestion.py:155 -#, fuzzy -#| msgid "Failed to accept suggestion!" msgid "Could not accept suggestion!" -msgstr "Falha ao aceitar ao sugestão!" +msgstr "Não foi possível aceitar a sugestão!" #: weblate/trans/models/translation.py:235 #, python-format @@ -15210,24 +14956,20 @@ msgstr "" "adicione o ficheiro de idioma ao repositório." #: weblate/trans/models/translation.py:244 -#, fuzzy, python-format -#| msgid "Failed to parse file %(file)s: %(error)s" +#, python-format msgid "Could not parse file %(file)s: %(error)s" -msgstr "Falha ao analisar o ficheiro %(file)s: %(error)s" +msgstr "Não foi possível analisar o ficheiro %(file)s: %(error)s" #: weblate/trans/models/translation.py:1108 #: weblate/trans/models/translation.py:1164 #: weblate/trans/models/translation.py:1258 -#, fuzzy, python-format -#| msgid "Failed to commit pending changes: %s" +#, python-format msgid "Could not commit pending changes: %s" -msgstr "Falha ao submeter alterações pendentes: %s" +msgstr "Não foi possível confirmar as alterações pendentes: %s" #: weblate/trans/models/translation.py:1671 -#, fuzzy -#| msgid "Unsupported file format." msgid "Plurals are not supported by the file format!" -msgstr "Formato não suportado." +msgstr "Os plurais não são suportados pelo formato de ficheiro!" #: weblate/trans/models/translation.py:1676 weblate/trans/models/unit.py:708 #, python-format @@ -15390,28 +15132,22 @@ msgid "{target} [{source}]" msgstr "{target} [{source}]" #: weblate/trans/templatetags/translations.py:273 -#, fuzzy -#| msgid "Forbidden translation" msgid "Forbidden translation:" msgid_plural "Forbidden translations:" -msgstr[0] "Tradução proibida" -msgstr[1] "Tradução proibida" +msgstr[0] "Tradução proibida:" +msgstr[1] "Traduções proibidas:" #: weblate/trans/templatetags/translations.py:286 -#, fuzzy -#| msgid "Untranslatable term" msgid "Untranslatable term:" msgid_plural "Untranslatable terms:" -msgstr[0] "Termo intraduzível" -msgstr[1] "Termo intraduzível" +msgstr[0] "Termo intraduzível:" +msgstr[1] "Termos intraduzíveis:" #: weblate/trans/templatetags/translations.py:299 -#, fuzzy -#| msgid "Glossary term" msgid "Glossary term:" msgid_plural "Glossary terms:" -msgstr[0] "Termo de glossário" -msgstr[1] "Termo de glossário" +msgstr[0] "Termo do glossário:" +msgstr[1] "Termos do glossário:" #: weblate/trans/templatetags/translations.py:373 msgid "New line" @@ -15699,20 +15435,15 @@ msgid "File mask does not contain * as a language placeholder!" msgstr "A máscara de ficheiro não contém * como um símbolo de idioma!" #: weblate/trans/validators.py:31 -#, fuzzy -#| msgid "" -#| "A value of 1 is not allowed for autoaccept as it would permit users to " -#| "vote on their own suggestions." msgid "" "A value of 1 is not allowed for automatic acceptance as it would permit " "users to vote on their own suggestions." msgstr "" -"Um valor de 1 não é permitido para a aceitação automática, porque este iria " -"permitir que os utilizadores votassem nas suas próprias sugestões." +"O valor 1 não é permitido para aceitação automática, pois permitiria que os " +"utilizadores votassem nas suas próprias sugestões." #: weblate/trans/validators.py:42 -#, fuzzy, python-format -#| msgid "Failed to parse flags: %s" +#, python-format msgid "Could not parse flags: %s" msgstr "Não foi possível analisar os sinalizadores: %s" @@ -15738,10 +15469,8 @@ msgid "Keys" msgstr "Chaves" #: weblate/trans/views/about.py:23 weblate/trans/views/about.py:130 -#, fuzzy -#| msgid "About Weblate" msgid "Support Weblate" -msgstr "Sobre o Weblate" +msgstr "Suporte ao Weblate" #: weblate/trans/views/about.py:65 msgid "Weblate statistics" @@ -15785,6 +15514,8 @@ msgstr "" #: weblate/trans/views/basic.py:766 msgid "All languages have been added, updates of translations are in progress." msgstr "" +"Todos os idiomas foram adicionados, as atualizações das traduções estão em " +"andamento." #: weblate/trans/views/changes.py:63 #, python-format @@ -15822,10 +15553,8 @@ msgid "Detected license as %s, please check whether it is correct." msgstr "Licença detetada como %s, por favor verifique se está correta." #: weblate/trans/views/create.py:396 -#, fuzzy -#| msgid "Failed to parse uploaded ZIP file." msgid "Could not parse uploaded ZIP file." -msgstr "Falha ao processar o ficheiro ZIP enviado." +msgstr "Não foi possível analisar o ficheiro ZIP enviado." #: weblate/trans/views/dashboard.py:151 msgid "" @@ -15865,26 +15594,21 @@ msgid "Your suggestion has been identified as spam!" msgstr "A sua sugestão foi identificada como spam!" #: weblate/trans/views/edit.py:319 -#, fuzzy -#| msgid "Memory will be then populated with the current translations." msgid "Your suggestion is similar to the current translation!" -msgstr "A memória será então preenchida com as traduções atuais." +msgstr "A sua sugestão é semelhante à tradução atual!" #: weblate/trans/views/edit.py:324 msgid "Your suggestion already exists!" msgstr "A sua sugestão já existe!" #: weblate/trans/views/edit.py:383 -#, fuzzy, python-format -#| msgid "" -#| "Added %(project)s to your watched projects. You can adjust them and this " -#| "behavior in the settings." +#, python-format msgid "" "Added %(project)s to your watched projects. You can adjust this behavior in " "the settings." msgstr "" -"Adicionado %(project)s aos seus projetos monitorados. Pode editá-los e " -"alterar esse comportamento nas configurações." +"Adicionado %(project)s aos seus projetos monitorados. Pode ajustar este " +"comportamento nas configurações." #: weblate/trans/views/edit.py:402 #, python-brace-format @@ -15929,10 +15653,8 @@ msgstr "Cadeia de pesquisa inválido!" #: weblate/trans/views/edit.py:759 weblate/trans/views/search.py:56 #: weblate/trans/views/search.py:208 -#, fuzzy -#| msgid "Failed to process form!" msgid "Could not process form!" -msgstr "Falha ao processar o formulário!" +msgstr "Não foi possível processar o formulário!" #: weblate/trans/views/edit.py:781 msgid "Automatic translation in progress" @@ -15947,10 +15669,8 @@ msgid "Posted new comment" msgstr "Novo comentário publicado" #: weblate/trans/views/edit.py:823 -#, fuzzy -#| msgid "Failed to add comment!" msgid "Could not add comment!" -msgstr "Falha ao adicionar comentário!" +msgstr "Não foi possível adicionar o comentário!" #: weblate/trans/views/edit.py:843 msgid "Comment has been deleted." @@ -15965,10 +15685,9 @@ msgid "New string has been added." msgstr "Nova cadeia adicionada." #: weblate/trans/views/edit.py:1056 -#, fuzzy, python-format -#| msgid "Failed to remove the string: %s" +#, python-format msgid "Could not remove the string: %s" -msgstr "Falha ao remover a cadeia: %s" +msgstr "Não foi possível remover a cadeia: %s" #: weblate/trans/views/error.py:28 msgid "Bad Request" @@ -16008,26 +15727,27 @@ msgid "File upload has failed: %s" msgstr "O envio do ficheiro falhou: %s" #: weblate/trans/views/git.py:38 -#, fuzzy -#| msgid "Failed to lock the repository, another operation is in progress." msgid "Could not lock the repository, another operation is in progress." -msgstr "Falha ao bloquear o repositório, está em curso outra operação." +msgstr "" +"Não foi possível bloquear o repositório, outra operação está em andamento." #: weblate/trans/views/git.py:61 msgid "" "All repositories have been updated, updates of translations are in progress." msgstr "" +"Todos os repositórios foram atualizados, as atualizações das traduções estão " +"em andamento." #: weblate/trans/views/git.py:84 msgid "All repositories were pushed." msgstr "Todos os repositórios foram enviados." #: weblate/trans/views/git.py:99 -#, fuzzy -#| msgid "All repositories have been reset." msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Todos os repositórios foram repostos." +msgstr "" +"Todos os repositórios foram redefinidos, atualizações das traduções estão em " +"andamento." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." @@ -16038,10 +15758,8 @@ msgid "Translation files have been synchronized." msgstr "Os ficheiros de tradução foram sincronizados." #: weblate/trans/views/git.py:155 -#, fuzzy -#| msgid "Automatic translation in progress" msgid "Updates of translations are in progress." -msgstr "Fonte da tradução automática em progresso" +msgstr "Atualizações das traduções estão em andamento." #: weblate/trans/views/git.py:178 msgid "All pending translations were committed." @@ -16060,10 +15778,8 @@ msgid "Component is now open for translation updates." msgstr "O componente agora está aberto para atualizações." #: weblate/trans/views/lock.py:60 -#, fuzzy -#| msgid "All components are now locked for translation updates!" msgid "All components are now open for translation updates." -msgstr "Todos os componentes estão agora bloqueados para atualizações!" +msgstr "Todos os componentes estão agora abertos para atualizações de tradução." #: weblate/trans/views/search.py:115 msgid "Search and replace completed, no strings were updated." @@ -16127,10 +15843,8 @@ msgid "The translation component was scheduled for removal." msgstr "O compenente de tradução está agendado para ser removido." #: weblate/trans/views/settings.py:209 -#, fuzzy -#| msgid "The project was scheduled for removal." msgid "The category was scheduled for removal." -msgstr "O projeto foi agendado para remoção." +msgstr "A categoria estava marcada para remoção." #: weblate/trans/views/settings.py:213 msgid "The project was scheduled for removal." @@ -16141,27 +15855,23 @@ msgid "A language in the project was removed." msgstr "O idioma do projeto foi removido." #: weblate/trans/views/settings.py:225 -#, fuzzy -#| msgid "A language in the project was removed." msgid "A language in the category was removed." -msgstr "O idioma do projeto foi removido." +msgstr "Um idioma da categoria foi removido." #: weblate/trans/views/settings.py:240 -#, fuzzy, python-format -#| msgid "Cannot rename due to outstanding issue in the configuration: %s" +#, python-format msgid "Could not change %s due to outstanding issue in its settings: %s" msgstr "" -"Não é possível renomear devido a um problema pendente na configuração: %s" +"Não foi possível alterar %s devido a um problema pendente nas configurações: " +"%s" #: weblate/trans/views/settings.py:413 msgid "Backup scheduled. It will be available soon." msgstr "Cópia de segurança agendada. Estará disponível em breve." #: weblate/trans/views/source.py:64 -#, fuzzy -#| msgid "Failed to change additional string info!" msgid "Could not change additional string info!" -msgstr "Não foi possível alterar a informação adicional da entrada!" +msgstr "Não foi possível alterar informações adicionais da cadeia!" #: weblate/trans/widgets.py:262 msgid "Big status badge" @@ -16187,20 +15897,16 @@ msgid "Component {}" msgstr "Componente {}" #: weblate/trans/widgets.py:378 -#, fuzzy -#| msgid "Status badge" msgid "SVG status badge" -msgstr "Emblema de estado" +msgstr "Emblema de estado SVG" #: weblate/trans/widgets.py:381 msgid "translated" msgstr "traduzido" #: weblate/trans/widgets.py:416 -#, fuzzy -#| msgid "Big status badge" msgid "PNG status badge" -msgstr "Emblema grande de estado" +msgstr "Emblema de estado PNG" #: weblate/trans/widgets.py:425 msgctxt "Status widget name" @@ -16318,8 +16024,6 @@ msgid "Undefined variable: \"%s\"" msgstr "Variável indefinida: \"%s\"" #: weblate/utils/render.py:111 -#, fuzzy -#| msgid "Failed to render template: {}" msgid "Could not render template: {}" msgstr "Não foi possível renderizar o modelo: {}" @@ -16425,10 +16129,8 @@ msgid "This e-mail address is disallowed." msgstr "Este endereço de e-mail não é permitido." #: weblate/utils/validators.py:195 -#, fuzzy -#| msgid "Enter a valid e-mail address." msgid "Invalid e-mail address: {}" -msgstr "Insira um endereço de <i>e-mail</i> válido." +msgstr "Endereço de e-mail inválido: {}" #: weblate/utils/validators.py:207 msgid "Could not evaluate plural formula: {}" @@ -16492,18 +16194,12 @@ msgid "Error in parameter %(field)s: %(error)s" msgstr "Erro no parâmetro %(field)s: %(error)s" #: weblate/vcs/base.py:68 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório upstream." #: weblate/vcs/git.py:72 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Git repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório Git upstream." #: weblate/vcs/git.py:548 msgid "Possible cleanups:" @@ -16522,23 +16218,17 @@ msgid "Git with force push" msgstr "Git com push forçado" #: weblate/vcs/git.py:772 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will force push changes to the upstream repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto forçará as alterações de envio para o repositório upstream." #: weblate/vcs/git.py:1222 -#, fuzzy -#| msgid "Bitbucket Server pull request" msgid "Azure DevOps pull request" -msgstr "«Pull request» do servidor Bitbucket" +msgstr "Solicitação `pull` do Azure DevOps" #: weblate/vcs/git.py:1230 -#, fuzzy -#| msgid "Bitbucket Server pull request" msgid "This will push changes and create a Azure DevOps pull request." -msgstr "«Pull request» do servidor Bitbucket" +msgstr "" +"Isto enviará alterações e criará uma solicitação `pull` do Azure DevOps." #: weblate/vcs/git.py:1468 msgid "GitHub pull request" @@ -16587,11 +16277,8 @@ msgstr "" "Isto fará o push das alterações e criará um pull request do Bitbucket Server." #: weblate/vcs/mercurial.py:45 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Mercurial repository." -msgstr "" -"Weblate não conseguiu submeter as alterações para o repositório principal." +msgstr "Isto enviará as alterações para o repositório Mercurial upstream." #: weblate/vcs/ssh.py:46 msgctxt "SSH key type" @@ -16609,8 +16296,7 @@ msgid "[hostname hashed]" msgstr "[nome de servidor com hash]" #: weblate/vcs/ssh.py:185 -#, fuzzy, python-format -#| msgid "Failed to generate key: %s" +#, python-format msgid "Could not generate key: %s" msgstr "Não foi possível gerar a chave: %s" @@ -16632,16 +16318,14 @@ msgstr "" "(%(keytype)s), verifique se está correcta." #: weblate/vcs/ssh.py:243 weblate/vcs/ssh.py:249 -#, fuzzy, python-format -#| msgid "Failed to fetch public key for a host!" +#, python-format msgid "Could not fetch public key for a host: %s" -msgstr "Não foi possível obter a chave pública para um hospedeiro!" +msgstr "Não foi possível buscar a chave pública para um host: %s" #: weblate/vcs/ssh.py:253 -#, fuzzy, python-format -#| msgid "Failed to get host key: %s" +#, python-format msgid "Could not get host key: %s" -msgstr "Não foi possível obter a chave do hospedeiro: %s" +msgstr "Não foi possível obter a chave do host: %s" #: weblate/wladmin/forms.py:15 msgid "Activation token" @@ -16804,14 +16488,10 @@ msgstr "" "Weblate no discover." #: weblate/wladmin/views.py:206 weblate/wladmin/views.py:223 -#, fuzzy -#| msgid "" -#| "Could not activate your installation. Please ensure your activation token " -#| "is correct." msgid "Could not activate your installation. Please try again later." msgstr "" -"Não foi possível ativar a sua instalação. Por favor, certifique-se que o seu " -"código de ativação está correto." +"Não foi possível ativar a sua instalação. Por favor, tente novamente mais " +"tarde." #: weblate/wladmin/views.py:215 msgid "" @@ -16822,10 +16502,9 @@ msgstr "" "de ativação está correto." #: weblate/wladmin/views.py:230 -#, fuzzy, python-format -#| msgid "Failed to fetch translation: %s" +#, python-format msgid "Could not activate your installation: %s" -msgstr "Falha ao obter tradução: %s" +msgstr "Não foi possível ativar a sua instalação: %s" #: weblate/wladmin/views.py:234 msgid "Activation completed." diff --git a/weblate/locale/pt_PT/LC_MESSAGES/djangojs.po b/weblate/locale/pt_PT/LC_MESSAGES/djangojs.po index 5655f9315e4a..cf5fbdb1962c 100644 --- a/weblate/locale/pt_PT/LC_MESSAGES/djangojs.po +++ b/weblate/locale/pt_PT/LC_MESSAGES/djangojs.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:27+0000\n" -"PO-Revision-Date: 2024-04-28 15:59+0000\n" -"Last-Translator: Manuela Silva \n" +"PO-Revision-Date: 2024-10-07 17:53+0000\n" +"Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" "Language: pt_PT\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5.1\n" +"X-Generator: Weblate 5.8-dev\n" #: weblate/static/editor/base.js:89 msgid "Please select target plural by clicking." @@ -86,16 +86,16 @@ msgstr "" #: weblate/static/js/screenshots/clipboard-paste.js:38 msgid "Image Pasted!" -msgstr "" +msgstr "Imagem colada!" #: weblate/static/js/screenshots/clipboard-paste.js:40 #: weblate/static/js/screenshots/clipboard-paste.js:56 msgid "Something went wrong!" -msgstr "" +msgstr "Algo correu mal!" #: weblate/static/js/screenshots/clipboard-paste.js:53 msgid "No image found in clipboard" -msgstr "" +msgstr "Nenhuma imagem encontrada na área de transferência" #: weblate/static/loader-bootstrap.js:171 msgid "Error loading search results!" @@ -146,60 +146,39 @@ msgstr "" #: weblate/static/loader-bootstrap.js:1432 msgid "Custom range" -msgstr "" +msgstr "Intervalo personalizado" #: weblate/static/loader-bootstrap.js:1434 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Su" msgctxt "Short name of day" msgid "Su" msgstr "Do" #: weblate/static/loader-bootstrap.js:1435 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Mo" msgctxt "Short name of day" msgid "Mo" -msgstr "2ª" +msgstr "Se" #: weblate/static/loader-bootstrap.js:1436 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Tu" msgctxt "Short name of day" msgid "Tu" -msgstr "3ª" +msgstr "Te" #: weblate/static/loader-bootstrap.js:1437 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "We" msgctxt "Short name of day" msgid "We" -msgstr "4ª" +msgstr "Qu" #: weblate/static/loader-bootstrap.js:1438 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Th" msgctxt "Short name of day" msgid "Th" -msgstr "5ª" +msgstr "Qu" #: weblate/static/loader-bootstrap.js:1439 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Fr" msgctxt "Short name of day" msgid "Fr" -msgstr "6ª" +msgstr "Se" #: weblate/static/loader-bootstrap.js:1440 -#, fuzzy -#| msgctxt "Minimal (for example two letter) name of day in week" -#| msgid "Sa" msgctxt "Short name of day" msgid "Sa" msgstr "Sá" @@ -270,31 +249,31 @@ msgstr "Hoje" #: weblate/static/loader-bootstrap.js:1459 msgid "Yesterday" -msgstr "" +msgstr "Ontem" #: weblate/static/loader-bootstrap.js:1463 msgid "Last 7 days" -msgstr "" +msgstr "Últimos 7 dias" #: weblate/static/loader-bootstrap.js:1464 msgid "Last 30 days" -msgstr "" +msgstr "Últimos 30 dias" #: weblate/static/loader-bootstrap.js:1465 msgid "This month" -msgstr "" +msgstr "Este mês" #: weblate/static/loader-bootstrap.js:1469 msgid "Last month" -msgstr "" +msgstr "Mês passado" #: weblate/static/loader-bootstrap.js:1473 msgid "This year" -msgstr "" +msgstr "Este ano" #: weblate/static/loader-bootstrap.js:1477 msgid "Last year" -msgstr "" +msgstr "Ano passado" #: weblate/static/loader-bootstrap.js:1548 msgctxt "Alert to user when opening browser developer console" diff --git a/weblate/locale/ru/LC_MESSAGES/django.po b/weblate/locale/ru/LC_MESSAGES/django.po index 2ec995901170..9020793b7796 100644 --- a/weblate/locale/ru/LC_MESSAGES/django.po +++ b/weblate/locale/ru/LC_MESSAGES/django.po @@ -20,13 +20,14 @@ # Сергей , 2024. # Vin , 2024. # Andrey , 2024. +# Victor K , 2024. msgid "" msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-03 17:26+0000\n" -"Last-Translator: Andrey \n" +"PO-Revision-Date: 2024-10-12 21:17+0000\n" +"Last-Translator: Blueberry \n" "Language-Team: Russian \n" "Language: ru\n" @@ -533,9 +534,9 @@ msgid "Two-factor authentication removed: {device}" msgstr "Двухфакторная авторизация удалена: {device}" #: weblate/accounts/models.py:208 -#, python-brace-format +#, fuzzy, python-brace-format msgid "Two-factor authentication sign in using {device}" -msgstr "" +msgstr "Для входа в систему с двухфакторной авторизацией использован {device}" #: weblate/accounts/models.py:213 msgid "Configured password to sign in." @@ -2733,11 +2734,12 @@ msgstr "Введите имя или эл. почту существующей #: weblate/auth/models.py:1103 msgid "Suggest username for the user. It can be changed later." -msgstr "" +msgstr "Предложите имя пользователя. Его можно будет изменить позже." #: weblate/auth/models.py:1112 +#, fuzzy msgid "Suggest full name for the user. It can be changed later." -msgstr "" +msgstr "Предложите полное имя для пользователя. Его можно будет изменить позже." #: weblate/auth/models.py:1118 weblate/templates/accounts/profile.html:326 #: weblate/templates/accounts/user.html:294 @@ -3812,8 +3814,9 @@ msgid "Python brace format string does not match source" msgstr "Форматирование фигурных скобок в Python не соответствует источнику" #: weblate/checks/format.py:611 +#, fuzzy msgid "Single {} encountered in the format string." -msgstr "" +msgstr "В строке формата обнаружен один символ {}." #: weblate/checks/format.py:638 msgid "C# format" @@ -4085,9 +4088,11 @@ msgid "Translation rendered text should not exceed given size" msgstr "Отрисованный текст перевода не должен превышать заданный размер" #: weblate/checks/render.py:107 +#, fuzzy msgid "" "It fits into given boundaries. The rendering is shown for your convenience." msgstr "" +"Он соответствует заданным границам. Отображение показано для вашего удобства." #: weblate/checks/ruby.py:54 msgid "Ruby format" @@ -4530,8 +4535,9 @@ msgid "Fluent file" msgstr "Файл Fluent" #: weblate/formats/txt.py:89 +#, fuzzy msgid "Should be a directory with metadata files!" -msgstr "" +msgstr "Должен быть каталог с файлами метаданных!" #: weblate/formats/txt.py:196 msgid "App store metadata files" @@ -5071,10 +5077,13 @@ msgid "Category" msgstr "Категория" #: weblate/machinery/forms.py:173 +#, fuzzy msgctxt "Automatic suggestion service configuration" msgid "" "Specify a customized system category ID to use it instead of general one." msgstr "" +"Укажите настраиваемый идентификатор системной категории, чтобы использовать " +"его вместо общего." #: weblate/machinery/forms.py:184 msgctxt "Automatic suggestion service configuration" @@ -5168,8 +5177,11 @@ msgid "Context vector" msgstr "Вектор контекста" #: weblate/machinery/forms.py:263 +#, fuzzy msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" msgstr "" +"Разделённый запятыми список заметок Идентификатор:вес. Например: 1234:0." +"123,4567:0.456" #: weblate/machinery/forms.py:276 #, python-format @@ -5177,9 +5189,9 @@ msgid "The context vector is not valid: %s" msgstr "Некорректный вектор контекста: %s" #: weblate/machinery/forms.py:280 -#, python-format +#, fuzzy, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "Значение веса должно находиться в диапазоне от 0 до 1: %s" #: weblate/machinery/forms.py:291 msgctxt "Automatic suggestion service configuration" @@ -5236,13 +5248,14 @@ msgid "Custom model" msgstr "Настраиваемая модель" #: weblate/machinery/forms.py:359 +#, fuzzy msgctxt "Automatic suggestion service configuration" msgid "OpenAI API base URL" -msgstr "" +msgstr "Базовый URL API OpenAI" #: weblate/machinery/forms.py:363 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "Базовый URL API OpenAI, если он отличается от URL OpenAI по умолчанию" #: weblate/machinery/forms.py:370 msgctxt "Automatic suggestion service configuration" @@ -5255,8 +5268,11 @@ msgid "Custom model name" msgstr "Название настраиваемой модели" #: weblate/machinery/forms.py:380 +#, fuzzy msgid "Only needed when model is set to 'Custom model'" msgstr "" +"Требуется только в том случае, если для модели установлено значение «" +"Пользовательская модель»" #: weblate/machinery/forms.py:390 msgid "Missing custom model name." @@ -5264,7 +5280,7 @@ msgstr "Не указано название настраиваемой моде #: weblate/machinery/forms.py:394 msgid "Choose custom model here to enable it." -msgstr "" +msgstr "Выберите пользовательскую модель для её включения." #: weblate/machinery/forms.py:403 #, fuzzy @@ -5275,18 +5291,22 @@ msgid "Azure OpenAI endpoint URL" msgstr "Конечный URL приложения" #: weblate/machinery/forms.py:407 +#, fuzzy msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." msgstr "" +"URL конечной точки экземпляра, например: https://my-instance.openai.azure." +"com." #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Развёртывание Azure OpenAI" #: weblate/machinery/forms.py:416 +#, fuzzy msgid "The model's unique deployment name." -msgstr "" +msgstr "Уникальное имя развёртывания модели." #: weblate/machinery/views.py:404 msgid "Service is currently not available." @@ -5553,6 +5573,10 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Возможно, ваш сеансовый куки-файл истёк из-за бездействия. Это может легко " +"произойти для неавторизованных запросов, где срок действия сеанса ограничен. " +"В таком случае вы можете попробовать выполнить предполагаемое действие ещё " +"раз." #: weblate/templates/403_csrf.html:20 #, fuzzy @@ -5625,9 +5649,12 @@ msgid "Welcome and thank you for choosing Weblate" msgstr "Добро пожаловать и благодарим за выбор Weblate" #: weblate/templates/about/donate.html:23 +#, fuzzy msgid "" "the privacy-respecting localization platform committed to open-source values." msgstr "" +"платформа локализации, уважающая конфиденциальность и придерживающаяся " +"ценностей открытого исходного кода." #: weblate/templates/about/donate.html:29 msgctxt "Label on engage page" @@ -5683,10 +5710,13 @@ msgstr "" #: weblate/templates/about/index.html:32 #: weblate/templates/accounts/hosting.html:58 +#, fuzzy msgid "" "Start your gratis trial today and explore our competitively priced " "commercial hosting solutions." msgstr "" +"Начните свой ознакомительный срок сегодня и изучите наши конкурентоспособные " +"по цене коммерческие решения для хостинга." #: weblate/templates/about/index.html:36 weblate/templates/base.html:258 #: weblate/templates/snippets/billing-failure.html:9 @@ -5771,12 +5801,14 @@ msgid "Statistics" msgstr "Статистика" #: weblate/templates/accounts/2fa.html:24 +#, fuzzy msgid "Second factor sign-in" -msgstr "" +msgstr "Вход по второму фактору" #: weblate/templates/accounts/2fa.html:30 +#, fuzzy msgid "Please complete your sign-in using second factor credential." -msgstr "" +msgstr "Пожалуйста, завершите вход, используя учётные данные второго фактора." #: weblate/templates/accounts/confirm.html:7 #: weblate/templates/accounts/password.html:6 @@ -5983,6 +6015,8 @@ msgid "" "We reserve our right to reject inappropriate content (erotic, gambling, " "etc.)." msgstr "" +"Мы оставляем за собой право отклонять неприемлемый контент (эротический, " +"азартные игры и т.д.)." #: weblate/templates/accounts/hosting.html:45 msgid "Get started" @@ -6168,6 +6202,8 @@ msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Двухфакторная авторизация добавляет ещё один уровень безопасности вашей " +"учётной записи, требуя для входа больше, чем просто пароль." #: weblate/templates/accounts/profile.html:196 msgid "Security keys (WebAuthn)" @@ -6200,7 +6236,7 @@ msgstr "Зарегистрировать новый ключ безопасно #: weblate/templates/accounts/profile.html:220 #: weblate/templates/accounts/webauthn.html:12 msgid "Unfortunately, your browser has no WebAuthn support." -msgstr "" +msgstr "К сожалению, ваш браузер не поддерживает WebAuthn." #: weblate/templates/accounts/profile.html:228 msgid "Authenticator apps (TOTP)" @@ -6454,7 +6490,7 @@ msgstr "" #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Ваши старые коды станут недействительными и больше не будут работать." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 @@ -6534,6 +6570,9 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"Приложения авторизации генерируют одноразовые пароли, используемые в " +"качестве второго фактора для подтверждения вашей личности при запросе на " +"вход." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" @@ -6735,12 +6774,13 @@ msgid "Scope" msgstr "Область" #: weblate/templates/accounts/user.html:238 +#, fuzzy msgid "Frequency" -msgstr "" +msgstr "Периодичность" #: weblate/templates/accounts/user.html:241 msgid "One-time" -msgstr "Один раз" +msgstr "Единовременно" #: weblate/templates/accounts/user.html:295 weblate/templates/auth/team.html:31 #: weblate/templates/manage/teams.html:30 @@ -7025,8 +7065,9 @@ msgid "Status" msgstr "Статус" #: weblate/templates/addons/addon_logs.html:33 +#, fuzzy msgid "Event" -msgstr "" +msgstr "Событие" #: weblate/templates/addons/addon_logs.html:34 #, fuzzy @@ -7035,12 +7076,14 @@ msgid "Details" msgstr "Подробности" #: weblate/templates/addons/addon_logs.html:35 +#, fuzzy msgid "Timestamp" -msgstr "" +msgstr "Метка времени" #: weblate/templates/addons/addon_logs.html:58 +#, fuzzy msgid "No add-on activity logs available." -msgstr "" +msgstr "Журналы активности надстроек отсутствуют." #: weblate/templates/addons/addon_logs.html:71 #: weblate/templates/snippets/position-field.html:9 @@ -10314,20 +10357,28 @@ msgid "" "While Weblate remains free for all users, its development requires " "continuous investment." msgstr "" +"Хотя Weblate остаётся бесплатным для всех пользователей, его развитие " +"требует постоянных инвестиций." #: weblate/templates/snippets/donate.html:4 msgid "We prioritize your privacy; we never display ads or sell your data." msgstr "" +"Мы уделяем первостепенное внимание вашей конфиденциальности; мы никогда не " +"показываем рекламу и не продаём ваши данные." #: weblate/templates/snippets/donate.html:5 msgid "" "The invaluable support of the community through subscriptions and donations " "ensures that Weblate continues to grow and thrive." msgstr "" +"Благодаря неоценимой поддержке сообщества в виде подписки и пожертвований " +"Weblate продолжает расти и процветать." #: weblate/templates/snippets/donate.html:6 msgid "Join us in shaping the future of localization and contribute today!" msgstr "" +"Присоединяйтесь к нам в формировании будущего локализации и вносите свой " +"вклад сегодня!" #: weblate/templates/snippets/donate.html:11 msgid "Purchase a support package" @@ -10368,19 +10419,23 @@ msgstr "Результаты загружаются…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Настройка двухфакторной авторизации" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Для этого проекта требуется двухфакторная авторизация от всех участников. " +"Пока вы её не настроите, вы не сможете внести свой вклад." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"Вы являетесь членом команды, которая требует двухфакторной авторизации. Вы " +"не сможете использовать какие-либо из его привилегий до её настройки." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10750,7 +10805,7 @@ msgstr "" #: weblate/templates/snippets/libre-basic.html:12 msgid "Non-code projects are welcome as well." -msgstr "" +msgstr "Проекты, не связанные с кодом также приветствуются." #: weblate/templates/snippets/libre-basic.html:15 msgid "Project approval" @@ -10776,8 +10831,9 @@ msgid "Established projects" msgstr "Отслеживаемые проекты" #: weblate/templates/snippets/libre-basic.html:23 +#, fuzzy msgid "The project receives a reasonable number of contributions." -msgstr "" +msgstr "Проект получает разумное количество вкладов." #: weblate/templates/snippets/libre-basic.html:24 msgid "The project has had active development for at least three months." @@ -11598,6 +11654,8 @@ msgid "" "You can continue using the glossary this way, but some features will be " "unavailable." msgstr "" +"Вы можете продолжать пользоваться словарём таким образом, но некоторые " +"функции будут недоступны." #: weblate/templates/trans/alert/monolingualtranslation.html:2 msgid "" @@ -12676,8 +12734,9 @@ msgid "Please sign-in to view this invitation." msgstr "Войдите в систему, чтобы посмотреть приглашение." #: weblate/templates/weblate_auth/invitation_detail.html:23 +#, fuzzy msgid "This invitation belongs to a different user." -msgstr "" +msgstr "Это приглашение принадлежит другому пользователю." #: weblate/templates/weblate_auth/invitation_detail.html:41 #, python-format @@ -14987,6 +15046,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Для участия переводчикам необходимо предварительно настроить двухфакторную " +"авторизацию." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15844,7 +15905,7 @@ msgstr "Все репозитории отправлены." #: weblate/trans/views/git.py:99 msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Все репозитории сброшены, идет обновление переводов." +msgstr "Все репозитории сброшены, идёт обновление переводов." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." diff --git a/weblate/locale/sr/LC_MESSAGES/django.po b/weblate/locale/sr/LC_MESSAGES/django.po index 5a41b64e2c44..c3d7325c6e42 100644 --- a/weblate/locale/sr/LC_MESSAGES/django.po +++ b/weblate/locale/sr/LC_MESSAGES/django.po @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: Weblate 5.8\n" "Report-Msgid-Bugs-To: https://github.com/WeblateOrg/weblate/issues\n" "POT-Creation-Date: 2024-09-20 12:26+0000\n" -"PO-Revision-Date: 2024-10-03 06:52+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-10-11 04:11+0000\n" +"Last-Translator: Reno Tx \n" "Language-Team: Serbian \n" "Language: sr\n" @@ -492,30 +492,30 @@ msgstr "{username} вас је додао на {team}." #: weblate/accounts/models.py:199 #, python-brace-format msgid "User was removed from the {team} team by {username}." -msgstr "" +msgstr "Корисник је уклоњен из {team} тима од стране {username}." #: weblate/accounts/models.py:201 msgid "Two-factor authentication recovery codes were generated" -msgstr "" +msgstr "Генерисани су кодови за опоравак двофакторске аутентификације" #: weblate/accounts/models.py:204 msgid "Two-factor authentication recovery codes were viewed" -msgstr "" +msgstr "Погледани су кодови за опоравак двофакторске аутентификације" #: weblate/accounts/models.py:206 #, python-brace-format msgid "Two-factor authentication added: {device}" -msgstr "" +msgstr "Додата је двофакторска аутентификација: {device}" #: weblate/accounts/models.py:207 #, python-brace-format msgid "Two-factor authentication removed: {device}" -msgstr "" +msgstr "Уклоњена је двофакторска аутентификација: {device}" #: weblate/accounts/models.py:208 #, python-brace-format msgid "Two-factor authentication sign in using {device}" -msgstr "" +msgstr "Пријавите се користећи двофакторску аутентификацију {device}" #: weblate/accounts/models.py:213 msgid "Configured password to sign in." @@ -539,10 +539,8 @@ msgid "Invited to {project} by {username}." msgstr "{username} вас позива на {project}." #: weblate/accounts/models.py:222 -#, fuzzy -#| msgid "Password changed." msgid "Password configured." -msgstr "Лозинка измењена." +msgstr "Лозинка конфигурисана." #: weblate/accounts/models.py:228 msgid "To restore access to your account, please reset your password." @@ -557,6 +555,8 @@ msgstr "" msgid "" "If it was you, please use a password reset to regain access to your account." msgstr "" +"Ако сте то били ви, молимо вас употребите ресетовање лозинке да повратите " +"приступ вашем налогу." #: weblate/accounts/models.py:358 weblate/templates/accounts/profile.html:403 #: weblate/templates/accounts/user.html:271 @@ -676,7 +676,7 @@ msgstr "" #: weblate/accounts/models.py:531 msgid "Number of nearby strings" -msgstr "Број сродних низова" +msgstr "Број сродних ниски" #: weblate/accounts/models.py:535 msgid "Number of nearby strings to show in each direction in the full editor." @@ -689,7 +689,7 @@ msgstr "Аутоматски надгледај пројекте којима с #: weblate/accounts/models.py:542 msgid "" "Whenever you translate a string in a project, you will start watching it." -msgstr "Када год преведете низ у пројекту, почећете да га пратите." +msgstr "Када год преведете ниску у пројекту, почећете да пратите пројекат." #: weblate/accounts/models.py:553 weblate/templates/dashboard/user.html:21 msgid "Watched translations" @@ -855,14 +855,12 @@ msgstr "Грешка" #: weblate/accounts/notifications.py:529 msgctxt "Notification name" msgid "String is available for translation" -msgstr "Нови низови за превод су доступни" +msgstr "Нове ниске за превод су доступне" #: weblate/accounts/notifications.py:539 -#, fuzzy -#| msgid "Contribute to shared translation memory" msgctxt "Notification name" msgid "Contributor made their first translation" -msgstr "Допуни дељену преводилачку меморију" +msgstr "Допринесиоц је направио свој први превод" #: weblate/accounts/notifications.py:548 msgctxt "Notification name" @@ -920,37 +918,29 @@ msgid "New translation component was created" msgstr "Нова компонента превода је направљена" #: weblate/accounts/notifications.py:702 -#, fuzzy -#| msgid "Announcement" msgctxt "Notification name" msgid "Announcement was published" -msgstr "Објава" +msgstr "Обавештење је објављено" #: weblate/accounts/notifications.py:717 -#, fuzzy -#| msgid "New alert on %(component)s" msgctxt "Notification name" msgid "New alert emerged in a component" -msgstr "Ново упозорење за %(component)s" +msgstr "Ново упозорење се појавило у компоненти" #: weblate/accounts/notifications.py:765 -#, fuzzy -#| msgid "Repository operation" msgctxt "Notification name" msgid "Repository operation failed" -msgstr "Операција складишта" +msgstr "Операција складишта није успела" #: weblate/accounts/notifications.py:839 -#, fuzzy -#| msgid "Pending suggestions" msgctxt "Notification name" msgid "Pending suggestions exist" -msgstr "Понуђени предлози" +msgstr "Постоје предлози на чекању" #: weblate/accounts/notifications.py:849 msgctxt "Notification name" msgid "Unfinished strings exist" -msgstr "Постоје недовршени низови" +msgstr "Постоје недовршене ниске" #: weblate/accounts/password_validation.py:21 msgid "This password consists of only whitespace." @@ -998,7 +988,7 @@ msgstr "Ваша е-адреса не припада овереном налог #: weblate/accounts/templatetags/authnames.py:53 msgid "Use security key (WebAuthn)" -msgstr "" +msgstr "Употребите безбедносни кључ (WebAuthn)" #: weblate/accounts/templatetags/authnames.py:54 msgid "Use authentication app (TOTP)" @@ -1006,12 +996,12 @@ msgstr "Користи апликацију за аутентификацију #: weblate/accounts/templatetags/authnames.py:55 msgid "Use recovery codes" -msgstr "" +msgstr "Употребите кодове за опоравак" #: weblate/accounts/utils.py:170 #, python-format msgid "Security key (%s)" -msgstr "" +msgstr "Безбедносни кључ (%s)" #: weblate/accounts/utils.py:176 #, python-format @@ -1099,10 +1089,8 @@ msgid "Sign in" msgstr "Пријава" #: weblate/accounts/views.py:869 -#, fuzzy -#| msgid "Sign out" msgid "Signed out" -msgstr "Одјава" +msgstr "Одјављени сте" #: weblate/accounts/views.py:975 msgid "Register e-mail" @@ -1133,10 +1121,9 @@ msgstr "" "Додајте други идентитет тако што ћете прво потврдити своју адресу е-поште." #: weblate/accounts/views.py:1335 -#, fuzzy, python-format -#| msgid "Could not send test e-mail: %s" +#, python-format msgid "Could not authenticate: %s" -msgstr "Не могу да пошаљем пробну е-пошту: %s" +msgstr "Нисам могао да се аутентификујем: %s" #: weblate/accounts/views.py:1345 msgid "Could not complete registration." @@ -1156,6 +1143,8 @@ msgid "" "Try registering again to verify your identity, the confirmation link " "probably expired." msgstr "" +"Покушајте да се поново региструјете да бисте потврдили свој идентитет, линк " +"за потврду је вероватно истекао." #: weblate/accounts/views.py:1370 msgid "Could not authenticate due to invalid session state." @@ -1213,32 +1202,26 @@ msgstr "" "конфигуришете обавештења." #: weblate/accounts/views.py:1649 -#, fuzzy -#| msgid "Activation e-mail will be sent here." msgid "The security key was removed." -msgstr "Активациона порука ће бити послата овде." +msgstr "Безбедносни кључ је уклоњен." #: weblate/accounts/views.py:1650 #, python-format msgid "The security key %s was registered." -msgstr "" +msgstr "Безбедносни кључ %s је регистрован." #: weblate/accounts/views.py:1687 -#, fuzzy -#| msgid "Activation e-mail will be sent here." msgid "The authentication app was removed." -msgstr "Активациона порука ће бити послата овде." +msgstr "Апликација за аутентификацију је уклоњена." #: weblate/accounts/views.py:1688 #, python-format msgid "The authentication app %s was registered." -msgstr "" +msgstr "Апликација за аутентификацију %s је регистрована." #: weblate/accounts/views.py:1821 -#, fuzzy -#| msgid "Last login" msgid "Second factor sign in" -msgstr "Последње пријављивање" +msgstr "Пријава са другим фактором" #: weblate/addons/autotranslate.py:18 weblate/templates/translation.html:73 #: weblate/templates/translation.html:242 @@ -1250,7 +1233,7 @@ msgid "" "Automatically translates strings using machine translation or other " "components." msgstr "" -"Аутоматски преводи низове користећи машински превод или друге компоненте." +"Аутоматски преводи ниске користећи машински превод или друге компоненте." #: weblate/addons/base.py:398 weblate/trans/views/create.py:251 msgid "" @@ -1370,9 +1353,9 @@ msgid "" "source string, it is flagged as needing editing in Weblate. Especially " "useful for file formats that include source strings for untranslated strings." msgstr "" -"Када год се нови преводиви низ увезе из VCS-а и поклапа се са изворним " -"низом, означава се као потребан за уређивање у Веблејту. Посебно корисно за " -"формате фајлова који укључују изворне низове за непреведене низове." +"Када год се нови преводива ниска увезе из VCS-а и поклапа се са изворном " +"ниском, означава се као потребан за уређивање у Веблејту. Посебно корисно за " +"формате фајлова који укључују изворне ниске за непреведене ниске." #: weblate/addons/flags.py:96 weblate/templates/category-project.html:42 #: weblate/templates/category-project.html:108 @@ -1387,7 +1370,7 @@ msgstr "Пакетно уређивање" #: weblate/addons/flags.py:97 msgid "Bulk edit flags, labels, or states of strings." -msgstr "Масовно уређивање застава, ознака или стања низова." +msgstr "Масовно уређивање застава, ознака или стања ниски." #: weblate/addons/forms.py:48 msgid "Path of generated MO file" @@ -1398,16 +1381,15 @@ msgid "If not specified, the location of the PO file will be used." msgstr "Ако није наведено, користиће се локација PO датотеке." #: weblate/addons/forms.py:56 -#, fuzzy -#| msgid "Import as string needing edit" msgid "Include strings needing editing" -msgstr "Увези као ниску коју треба уредити" +msgstr "Укључите ниске које треба уредити" #: weblate/addons/forms.py:59 msgid "" "Strings needing editing (fuzzy) are typically not ready for use as " "translations." msgstr "" +"Ниске које треба уредити (фази) обично нису спремне за употребу као преводи." #: weblate/addons/forms.py:85 msgid "Name of generated file" @@ -1422,16 +1404,13 @@ msgid "Long lines wrapping" msgstr "Прелом дугих линија" #: weblate/addons/forms.py:124 -#, fuzzy -#| msgid "Wrap lines at 77 characters and at newlines" msgid "Wrap lines at 77 characters and at newlines (xgettext default)" -msgstr "Прелом на 77 знакова или знаку за нови ред" +msgstr "" +"Преломи линије на 77 карактера и на новим линијама (подразумевани xgettext)" #: weblate/addons/forms.py:129 -#, fuzzy -#| msgid "Only wrap lines at newlines" msgid "Only wrap lines at newlines (like 'xgettext --no-wrap')" -msgstr "Редове преломи само где је карактер за прелом" +msgstr "Преломи линије само на новим линијама (као 'xgettext --no-wrap')" #: weblate/addons/forms.py:131 weblate/addons/forms.py:243 msgid "No line wrapping" @@ -1525,7 +1504,7 @@ msgstr "Табови" #: weblate/addons/forms.py:222 msgid "Include closing tag for blank XML tags" -msgstr "" +msgstr "Укључите затварајућу ознаку за празне XML ознаке" #: weblate/addons/forms.py:230 msgid "YAML indentation" @@ -1624,29 +1603,27 @@ msgid "" msgstr "" "Име фајла посредног преводног фајла. У већини случајева ово је преводни фајл " "који обезбеђују програмери и користи се приликом креирања стварних изворних " -"низова." +"ниски." #: weblate/addons/forms.py:320 weblate/trans/models/component.py:709 msgid "Language filter" msgstr "Филтер језика" #: weblate/addons/forms.py:325 -#, fuzzy -#| msgid "" -#| "Regular expression to filter translation files against when scanning for " -#| "filemask." msgid "" "Regular expression to filter translation files against when scanning for " "file mask." -msgstr "Регуларни израз за филтрирање фајлова превода по претрази маске фајла." +msgstr "" +"Регуларни израз за филтрирање преводних фајлова од када се скенира за маску " +"фајла." #: weblate/addons/forms.py:331 msgid "Clone add-ons from the main component to the newly created ones" -msgstr "" +msgstr "Клонирајте додатке из главне компоненте у новокреиране" #: weblate/addons/forms.py:337 msgid "Remove components for inexistent files" -msgstr "" +msgstr "Уклонити компоненте за непостојеће фајлове" #: weblate/addons/forms.py:340 msgid "I confirm the above matches look correct" @@ -1702,13 +1679,12 @@ msgid "" "translatable strings." msgstr "" "Листа имена фајлова у тренутном складишту или удаљених URL-ова за парсирање " -"преводивих низова." +"преводивих ниски." #: weblate/addons/forms.py:549 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not parse CSS selector: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисам могао парсирати CSS селектор: %s" #: weblate/addons/forms.py:561 weblate/billing/models.py:290 #: weblate/templates/snippets/query-builder.html:14 @@ -1724,47 +1700,38 @@ msgstr "Циљни превод" #: weblate/addons/forms.py:568 msgid "All strings in this translation will be overwritten" -msgstr "Сви низови у овом преводу ће бити преписани" +msgstr "Све ниске у овом преводу ће бити преписане" #: weblate/addons/forms.py:573 weblate/templates/addons/pseudolocale.html:11 -#, fuzzy -#| msgid "String prefix" msgid "Fixed string prefix" -msgstr "Префикс ниске" +msgstr "Фиксни префикс ниске" #: weblate/addons/forms.py:578 weblate/templates/addons/pseudolocale.html:12 -#, fuzzy -#| msgid "String prefix" msgid "Variable string prefix" -msgstr "Префикс ниске" +msgstr "Променљиви префикс ниске" #: weblate/addons/forms.py:583 weblate/templates/addons/pseudolocale.html:15 -#, fuzzy -#| msgid "String suffix" msgid "Fixed string suffix" -msgstr "Префикс ниске" +msgstr "Фиксни суфикс ниске" #: weblate/addons/forms.py:588 weblate/templates/addons/pseudolocale.html:14 -#, fuzzy -#| msgid "String suffix" msgid "Variable string suffix" -msgstr "Префикс ниске" +msgstr "Променљиви суфикс ниске" #: weblate/addons/forms.py:593 msgid "Variable part multiplier" -msgstr "" +msgstr "Мултипликатор променљивог дела" #: weblate/addons/forms.py:597 msgid "" "How many times to repeat the variable part depending on the length of the " "source string." msgstr "" +"Колико пута поновити променљиви део у зависности од дужине изворне ниске." #: weblate/addons/forms.py:602 -#, fuzzy -#| msgid "Read only strings" msgid "Include read-only strings" -msgstr "Ниске само за читање" +msgstr "Укључи низове само за читање" #: weblate/addons/forms.py:632 msgid "The source and target have to be different languages." @@ -1772,7 +1739,7 @@ msgstr "Изворни и циљни морају бити различити ј #: weblate/addons/forms.py:645 msgid "Enable case-sensitive key sorting" -msgstr "" +msgstr "Омогући разликовање великог и малог слова при сортирању кључева" #: weblate/addons/generate.py:33 msgid "Statistics generator" @@ -1791,31 +1758,23 @@ msgid "" "Generates a translation by adding prefix and suffix to source strings " "automatically." msgstr "" -"Генерише превод додавањем префикса и суфикса изворним низовима аутоматски." +"Генерише превод додавањем префикса и суфикса изворним нискама аутоматски." #: weblate/addons/generate.py:201 -#, fuzzy -#| msgid "Automatic translation source" msgid "Prefill translation with source" -msgstr "Извор аутоматског превођења" +msgstr "Унапред попунити превод са извором" #: weblate/addons/generate.py:202 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "Fills in translation strings with source string." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Попуњава преводне ниске са изворном ниском." #: weblate/addons/generate.py:232 -#, fuzzy -#| msgid "Automatic translation source" msgid "Fill read-only strings with source" -msgstr "Извор аутоматског превођења" +msgstr "Попуните ниске само за читање из изворне" #: weblate/addons/generate.py:234 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "Fills in translation of read-only strings with source string." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Попуњава превод ниски само за читање из изворне ниске." #: weblate/addons/gettext.py:33 msgid "Generate MO files" @@ -1854,6 +1813,9 @@ msgid "" "Updates all PO files (as configured by \"File mask\") to match the POT file " "(as configured by \"Template for new translations\") using msgmerge." msgstr "" +"Ажурира све PO фајлове (како је конфигурисано са \"Фајл маска\") да се " +"подударају са POT фајлом (како је конфигурисано са \"Шаблон за нове преводе\"" +") користећи msgmerge." #: weblate/addons/gettext.py:326 msgid "Customize gettext output" @@ -1896,10 +1858,8 @@ msgstr "" "Омогућава подешавање понашања JSON излаза, на пример увлачење или сортирање." #: weblate/addons/properties.py:140 -#, fuzzy -#| msgid "Formats the Java properties file" msgid "Format the Java properties file" -msgstr "Форматира фајл Јава својстава" +msgstr "Форматирајте Java properties фајл" #: weblate/addons/properties.py:141 msgid "Formats and sorts the Java properties file." @@ -1932,8 +1892,8 @@ msgid "" "string." msgstr "" "Ажурирајте све преводне фајлове да одговарају једнојезичном узводном базном " -"фајлу. Неискоришћени низови се уклањају, а нови се додају као копије " -"изворног низа." +"фајлу. Неискоришћене ниске се уклањају, а нове се додају као копије изворне " +"ниске." #: weblate/addons/views.py:126 #, python-format @@ -1946,11 +1906,11 @@ msgstr "Додатак инсталиран, молимо вас да прегл #: weblate/addons/xml.py:26 msgid "Customize XML output" -msgstr "" +msgstr "Прилагодите XML излаз" #: weblate/addons/xml.py:28 msgid "Allows adjusting XML output behavior, for example closing tags." -msgstr "" +msgstr "Омогућава подешавање понашања XML излаза, на пример затварање ознака." #: weblate/addons/yaml.py:15 msgid "Customize YAML output" @@ -2058,10 +2018,8 @@ msgstr "Брише коментаре" #. Translators: Permission name #: weblate/auth/data.py:29 -#, fuzzy -#| msgid "Resolved comment" msgid "Resolve comment" -msgstr "Решени коментар" +msgstr "Реши коментар" #. Translators: Permission name #: weblate/auth/data.py:31 @@ -2080,10 +2038,8 @@ msgstr "Додаје унос у појмовник" #. Translators: Permission name #: weblate/auth/data.py:37 -#, fuzzy -#| msgid "Add glossary entry" msgid "Add glossary terminology" -msgstr "Додаје унос у појмовник" +msgstr "Додај терминологију у глосар" #. Translators: Permission name #: weblate/auth/data.py:39 @@ -2299,10 +2255,8 @@ msgstr "Управља дефиницијама језика" #. Translators: Permission name #: weblate/auth/data.py:129 weblate/templates/manage/teams.html:19 -#, fuzzy -#| msgid "Manage users" msgid "Manage teams" -msgstr "Управља корисницима" +msgstr "Управљање тимовима" #. Translators: Permission name #: weblate/auth/data.py:131 weblate/templates/manage/users.html:18 @@ -2326,10 +2280,8 @@ msgstr "Управља преводилачком меморијом" #. Translators: Permission name #: weblate/auth/data.py:139 -#, fuzzy -#| msgid "Machame" msgid "Manage machinery" -msgstr "мачаме" +msgstr "Управљање машинеријом" #. Translators: Permission name #: weblate/auth/data.py:141 @@ -2344,10 +2296,8 @@ msgstr "Управљајте наплатама" #. Translators: Permission name #: weblate/auth/data.py:145 -#, fuzzy -#| msgid "Example addon" msgid "Manage site-wide add-ons" -msgstr "Пример додатка" +msgstr "Управљање додатцима на нивоу целог сајта" #: weblate/auth/data.py:176 msgctxt "Access-control role" @@ -2450,11 +2400,9 @@ msgid "Managers" msgstr "Менаџери" #: weblate/auth/data.py:257 -#, fuzzy -#| msgid "Project Information" msgctxt "Access-control team name" msgid "Project creators" -msgstr "Информације о пројекту" +msgstr "Креатори пројекта" #: weblate/auth/data.py:266 msgctxt "Per-project access-control team name" @@ -2545,10 +2493,8 @@ msgid "Roles" msgstr "Улоге" #: weblate/auth/models.py:129 -#, fuzzy -#| msgid "Choose roles granted to this group." msgid "Choose roles granted to this team." -msgstr "Изаберите улоге за ову групу." +msgstr "Изабери улоге додељене овом тиму." #: weblate/auth/models.py:141 msgid "Project selection" @@ -2600,10 +2546,8 @@ msgid "Components" msgstr "Компоненте" #: weblate/auth/models.py:159 -#, fuzzy -#| msgid "You do not have permission to create components in any projects." msgid "Empty selection grants access to all components in project scope." -msgstr "Немате дозволе да правите компоненте за било који пројекат." +msgstr "Празан избор даје приступ свим компонентама у обиму пројекта." #: weblate/auth/models.py:169 msgid "Language selection" @@ -2635,28 +2579,25 @@ msgid "Languages" msgstr "Језици" #: weblate/auth/models.py:181 -#, fuzzy -#| msgid "Internal Weblate group" msgid "Internal Weblate team" -msgstr "Интерна Веблејт група" +msgstr "Унутрашњи Веблејт тим" #: weblate/auth/models.py:186 -#, fuzzy -#| msgid "Administrators" msgid "Team administrators" -msgstr "Администратори" +msgstr "Администратори тима" #: weblate/auth/models.py:189 msgid "The administrator can add or remove users from a team." -msgstr "" +msgstr "Администратор може додати или уклонити кориснике из тима." #: weblate/auth/models.py:194 weblate/trans/models/project.py:193 msgid "Enforced two-factor authentication" -msgstr "" +msgstr "Принудна двофакторска аутентификација" #: weblate/auth/models.py:197 msgid "Requires users to have two-factor authentication configured." msgstr "" +"Захтева од корисника да имају конфигурисану двофакторску аутентификацију." #: weblate/auth/models.py:398 weblate/utils/forms.py:71 #: weblate/utils/validators.py:173 @@ -2702,12 +2643,12 @@ msgstr "Истиче" #: weblate/templates/trans/project-access.html:284 weblate/trans/forms.py:2873 #: weblate/wladmin/views.py:83 msgid "Teams" -msgstr "" +msgstr "Тимови" #: weblate/auth/models.py:444 weblate/auth/models.py:1120 msgid "" "The user is granted all permissions included in membership of these teams." -msgstr "" +msgstr "Корисник има све дозволе укључене у чланство ових тимова." #: weblate/auth/models.py:892 msgid "Regular expression for e-mail address" @@ -2715,13 +2656,11 @@ msgstr "Регуларни израз за адресу е-поште" #: weblate/auth/models.py:896 msgid "Users with e-mail addresses found to match will be added to this team." -msgstr "" +msgstr "Корисници са имејл адресама које се подударају биће додати у овај тим." #: weblate/auth/models.py:901 -#, fuzzy -#| msgid "Group to assign" msgid "Team to assign" -msgstr "Група за доделу" +msgstr "Тим за доделу" #: weblate/auth/models.py:916 weblate/trans/forms.py:1275 msgid "User to block" @@ -2742,26 +2681,28 @@ msgstr "Молимо унесите постојеће име налога на #: weblate/auth/models.py:1103 msgid "Suggest username for the user. It can be changed later." -msgstr "" +msgstr "Предложи корисничко име за корисника. Може се променити касније." #: weblate/auth/models.py:1112 msgid "Suggest full name for the user. It can be changed later." -msgstr "" +msgstr "Предложи пуно име за корисника. Може се променити касније." #: weblate/auth/models.py:1118 weblate/templates/accounts/profile.html:326 #: weblate/templates/accounts/user.html:294 msgid "Team" -msgstr "" +msgstr "Тим" #: weblate/auth/permissions.py:169 msgid "Can not perform this operation without an e-mail address." -msgstr "" +msgstr "Не може се извршити ова операција без имејл адресе." #: weblate/auth/permissions.py:177 msgid "" "This project requires two-factor authentication; configure it in your " "profile." msgstr "" +"Овај пројекат захтева двофакторску аутентификацију; конфигуришите је у вашем " +"профилу." #: weblate/auth/permissions.py:184 weblate/templates/translate.html:175 #: weblate/templates/translate.html:231 @@ -2774,19 +2715,15 @@ msgstr "Овај превод је тренутно закључан." msgid "" "Contributing to this translation requires agreeing to its contributor " "agreement." -msgstr "" +msgstr "Допринос овом преводу захтева сагласност са споразумом о доприносу." #: weblate/auth/permissions.py:200 -#, fuzzy -#| msgid "Please sign in to save translations." msgid "Sign in to save the translation." -msgstr "Пријавите се да сачувате преводе." +msgstr "Пријавите се да сачувате превод." #: weblate/auth/permissions.py:203 -#, fuzzy -#| msgid "Insufficient privileges for saving translations." msgid "Insufficient privileges for approving translations." -msgstr "Немате права за чување превода." +msgstr "Недовољна права за одобравање превода." #: weblate/auth/permissions.py:205 weblate/trans/views/edit.py:431 #: weblate/trans/views/edit.py:453 weblate/trans/views/edit.py:473 @@ -2817,26 +2754,20 @@ msgid "Source string reviews are not enabled." msgstr "Прегледи изворних стрингова нису омогућени." #: weblate/auth/permissions.py:247 -#, fuzzy -#| msgid "This translation is locked." msgid "Translation reviews are not enabled." -msgstr "Овај превод је закључан." +msgstr "Прегледи превода нису омогућени." #: weblate/auth/permissions.py:259 -#, fuzzy -#| msgid "Service is currently not available." msgid "Reviews are not enabled." -msgstr "Сервис тренутно није доступан." +msgstr "Прегледи нису омогућени." #: weblate/auth/permissions.py:273 weblate/templates/translate.html:157 msgid "The source string needs review." msgstr "Изворни стринг треба прегледати." #: weblate/auth/permissions.py:274 -#, fuzzy -#| msgid "This string seems to already exist." msgid "The string is read only." -msgstr "Ова ниска већ постоји." +msgstr "Ниска је само за читање." #: weblate/auth/permissions.py:284 msgid "" @@ -2847,14 +2778,12 @@ msgstr "" "мислите да би ниска требало да се промени." #: weblate/auth/permissions.py:290 -#, fuzzy -#| msgid "This translation is locked." msgid "The translation is read only." -msgstr "Овај превод је закључан." +msgstr "Превод је само за читање." #: weblate/auth/permissions.py:307 msgid "Add the string to the source language instead." -msgstr "" +msgstr "Додајте ниску у изворни језик уместо тога." #: weblate/auth/permissions.py:311 msgid "Adding strings is disabled in the component configuration." @@ -2863,22 +2792,19 @@ msgstr "Додавање стрингова је онемогућено у ко #: weblate/auth/permissions.py:326 msgid "Cannot remove terminology translation, remove source string instead." msgstr "" +"Не може се уклонити превод терминологије, уместо тога уклоните изворну ниску." #: weblate/auth/permissions.py:338 weblate/auth/permissions.py:355 -#, fuzzy -#| msgid "File does not exist." msgid "File format does not support this." -msgstr "Фајл не постоји." +msgstr "Формат фајла не подржава ово." #: weblate/auth/views.py:121 msgid "Cannot remove built-in team!" -msgstr "" +msgstr "Не може се уклонити уграђени тим!" #: weblate/auth/views.py:186 -#, fuzzy -#| msgid "Activation e-mail will be sent here." msgid "User invitation was removed." -msgstr "Активациона порука ће бити послата овде." +msgstr "Позивница корисника је уклоњена." #: weblate/auth/views.py:225 #, python-format @@ -2955,7 +2881,7 @@ msgstr "Број измена" #: weblate/billing/models.py:298 weblate/wladmin/models.py:215 msgid "Hosted strings" -msgstr "Хостовани низови" +msgstr "Хостоване ниске" #: weblate/billing/models.py:310 weblate/trans/admin.py:95 msgid "Source words" @@ -3026,16 +2952,12 @@ msgid "AngularJS interpolation strings do not match source" msgstr "AngularJS интерполациони стрингови не одговарају извору" #: weblate/checks/base.py:306 -#, fuzzy -#| msgid "Following format strings are missing: {}" msgid "The following format strings are missing: {}" -msgstr "Следеће ознаке форматирања недостају: {}" +msgstr "Следеће форматске ниске недостају: {}" #: weblate/checks/base.py:311 -#, fuzzy -#| msgid "Following format strings are extra: {}" msgid "The following format strings are extra: {}" -msgstr "Следеће ознаке форматирања су вишак: {}" +msgstr "Следеће форматске ниске су вишак: {}" #: weblate/checks/chars.py:36 msgid "Starting newline" @@ -3114,10 +3036,8 @@ msgid "Mismatched interrobang" msgstr "Неусклађен упит" #: weblate/checks/chars.py:312 -#, fuzzy -#| msgid "Source and translation do not both end with an ellipsis" msgid "Source and translation do not both end with an interrobang expression" -msgstr "Извор и превод не завршавају тротачком" +msgstr "Извор и превод не завршавају се обоје са интеробанг изразом" #: weblate/checks/chars.py:326 msgid "Mismatched ellipsis" @@ -3188,10 +3108,8 @@ msgid "Missing plurals" msgstr "Недостају множине" #: weblate/checks/consistency.py:27 -#, fuzzy -#| msgid "Some plural forms are not translated" msgid "Some plural forms are untranslated" -msgstr "Неки од облика множине нису преведени" +msgstr "Неке множинске форме су непреведене" #: weblate/checks/consistency.py:53 msgid "Same plurals" @@ -3206,39 +3124,33 @@ msgid "Inconsistent" msgstr "Недоследност" #: weblate/checks/consistency.py:75 -#, fuzzy -#| msgid "" -#| "This string has more than one translation in this project or is not " -#| "translated in some components." msgid "" "This string has more than one translation in this project or is untranslated " "in some components." msgstr "" -"Ова иста ниска има више различитих превода у пројекту или није преведена у " +"Ова ниска има више од једног превода у овом пројекту или је непреведена у " "неким компонентама." #: weblate/checks/consistency.py:160 -#, fuzzy -#| msgid "Removed translation" msgid "Reused translation" -msgstr "Уклоњени превод" +msgstr "Поново коришћени превод" #: weblate/checks/consistency.py:161 msgid "Different strings are translated the same." -msgstr "Различити низови се преводе исто." +msgstr "Различите ниске се преводе исто." #: weblate/checks/consistency.py:199 #, python-format msgid "Other source string: %s" msgid_plural "Other source strings: %s" -msgstr[0] "Други изворни низ: %s" -msgstr[1] "Других изворних низова: %s" -msgstr[2] "Других изворних низова: %s" +msgstr[0] "Друга изворна ниска: %s" +msgstr[1] "Друге изворне ниске: %s" +msgstr[2] "Других изворних ниски: %s" #: weblate/checks/consistency.py:200 #, python-format msgid "“%s”" -msgstr "" +msgstr "“%s”" #: weblate/checks/consistency.py:251 msgid "Has been translated" @@ -3298,10 +3210,8 @@ msgid "Strict unchanged check" msgstr "Строга провера непромењености" #: weblate/checks/flags.py:51 -#, fuzzy -#| msgid "Strict unchanged check" msgid "Strict format string checks" -msgstr "Строга провера непромењености" +msgstr "Строге провере форматских ниски" #: weblate/checks/flags.py:52 weblate/trans/forms.py:2474 msgid "Forbidden translation" @@ -3312,16 +3222,12 @@ msgid "Terminology" msgstr "Терминологија" #: weblate/checks/flags.py:54 -#, fuzzy -#| msgid "Ignored checks" msgid "Ignore all checks" -msgstr "Игнорисано" +msgstr "Игнорисати све провере" #: weblate/checks/flags.py:55 -#, fuzzy -#| msgid "Percent placeholders" msgid "Use case insensitive placeholders" -msgstr "Држач за проценат" +msgstr "Користите држаче места који не разликују велика и мала слова" #: weblate/checks/flags.py:57 weblate/fonts/models.py:24 #: weblate/templates/fonts/font_detail.html:18 @@ -3342,16 +3248,12 @@ msgid "Font spacing" msgstr "Размак фонта" #: weblate/checks/flags.py:65 -#, fuzzy -#| msgid "Java MessageFormat" msgid "ICU MessageFormat flags" -msgstr "Формат Јава порука" +msgstr "ICU MessageFormat заставице" #: weblate/checks/flags.py:67 -#, fuzzy -#| msgid "Java MessageFormat" msgid "ICU MessageFormat tag prefix" -msgstr "Формат Јава порука" +msgstr "ICU MessageFormat префикс ознаке" #: weblate/checks/flags.py:69 weblate/trans/models/component.py:731 #: weblate/utils/views.py:178 @@ -3367,10 +3269,8 @@ msgid "String variant" msgstr "Варијација ниске" #: weblate/checks/flags.py:79 -#, fuzzy -#| msgid "Font file" msgid "Fluent type" -msgstr "Фајл фонта" +msgstr "Fluent тип" #: weblate/checks/flags.py:294 #, python-format @@ -3378,10 +3278,9 @@ msgid "Invalid translation flag: \"%s\"" msgstr "Неважећа застава превода: \"%s\"" #: weblate/checks/flags.py:298 -#, fuzzy, python-format -#| msgid "Translation flags to remove" +#, python-format msgid "The translation flag has no parameters: \"%s\"" -msgstr "Заставице за уклањање" +msgstr "Заставица превода нема параметре: \"%s\"" #: weblate/checks/flags.py:304 #, python-format @@ -3399,6 +3298,8 @@ msgid "" "The Fluent reference in {sequence} may expand into a HTML tag. Maybe use " "{suggestion}." msgstr "" +"Fluent референца у {sequence} може се проширити у HTML ознаку. Можда " +"користите {suggestion}." #: weblate/checks/fluent/inner_html.py:143 #, python-brace-format @@ -3406,6 +3307,8 @@ msgid "" "The Fluent reference in {sequence} may expand into a HTML character " "reference. Maybe use {suggestion}." msgstr "" +"Fluent референца у {sequence} може се проширити у HTML референцу карактера. " +"Можда користите {suggestion}." #: weblate/checks/fluent/inner_html.py:171 #, python-brace-format @@ -3413,6 +3316,9 @@ msgid "" "The sequence {sequence} begins with a HTML closing tag, but the name or " "syntax is not valid. If you do not want a closing tag, use {suggestion}." msgstr "" +"Секвенца {sequence} почиње са HTML затварајућом ознаком, али име или " +"синтакса нису валидни. Ако не желите затварајућу ознаку, употребите " +"{suggestion}." #: weblate/checks/fluent/inner_html.py:184 #, python-brace-format @@ -3420,6 +3326,8 @@ msgid "" "The sequence {sequence} begins with a HTML tag, but the name is not valid. " "If you do not want to begin a HTML tag, use {suggestion}." msgstr "" +"Секвенца {sequence} почиње са HTML ознаком, али име није валидно. Ако не " +"желите да почнете HTML ознаку, употребите {suggestion}." #: weblate/checks/fluent/inner_html.py:197 #, python-brace-format @@ -3427,12 +3335,17 @@ msgid "" "The sequence {sequence} begins with a HTML tag, but the tag is never closed " "by {close}. If you do not want to begin a HTML tag, use {suggestion}." msgstr "" +"Секвенца {sequence} почиње са HTML ознаком, али ознака никада није затворена " +"од стране {close}. Ако не желите да почнете HTML ознаку, употребите " +"{suggestion}." #: weblate/checks/fluent/inner_html.py:211 #, python-brace-format msgid "" "Fluent inner HTML should not include {sequence}. Maybe use {suggestion}." msgstr "" +"Fluent унутрашњи HTML не би требало да укључује {sequence}. Можда користите " +"{suggestion}." #: weblate/checks/fluent/inner_html.py:227 #, python-brace-format @@ -3441,11 +3354,14 @@ msgid "" "is not a valid attribute with a value. If you do not want to begin a HTML " "tag, use {suggestion}." msgstr "" +"Секвенца {sequence} почиње са HTML ознаком, али секвенца {attribute} није " +"валидан атрибут са вредношћу. Ако не желите да почнете HTML ознаку, " +"употребите {suggestion}." #: weblate/checks/fluent/inner_html.py:245 #, python-brace-format msgid "The HTML attribute name {name} for the {tag} tag is not valid." -msgstr "" +msgstr "Име атрибута HTML {name} за ознаку {tag} није валидно." #: weblate/checks/fluent/inner_html.py:260 #, python-brace-format @@ -3453,21 +3369,23 @@ msgid "" "The HTML {name} attribute value {value} for the {tag} tag is not a valid " "quoted value." msgstr "" +"Вредност атрибута HTML {name} {value} за ознаку {tag} није валидна цитирана " +"вредност." #: weblate/checks/fluent/inner_html.py:276 #, python-brace-format msgid "The HTML {name} attribute appears twice for the {tag} tag." -msgstr "" +msgstr "Атрибут HTML {name} се појављује два пута за ознаку {tag}." #: weblate/checks/fluent/inner_html.py:288 #, python-brace-format msgid "Unmatched HTML end tag: {tag}." -msgstr "" +msgstr "Неуспешна HTML крајња ознака: {tag}." #: weblate/checks/fluent/inner_html.py:298 #, python-brace-format msgid "The HTML {name} void element should not have an end tag: {end}." -msgstr "" +msgstr "HTML {name} елемент не би требало да има крајњу ознаку: {end}." #: weblate/checks/fluent/inner_html.py:311 #, python-brace-format @@ -3475,11 +3393,13 @@ msgid "" "The HTML {name} element is not a known void element, so should not have a " "self-closing tag: {self_close}." msgstr "" +"HTML {name} елемент није познати void елемент, па не би требало да има " +"самозатворену ознаку: {self_close}." #: weblate/checks/fluent/inner_html.py:325 #, python-brace-format msgid "The HTML {tag} tag is missing a matching end tag: {end}." -msgstr "" +msgstr "HTML {tag} ознака недостаје одговарајућа крајња ознака: {end}." #: weblate/checks/fluent/inner_html.py:341 #, python-brace-format @@ -3488,24 +3408,27 @@ msgid "" "end with {semicolon}. If you do not want a character reference, use " "{suggestion}." msgstr "" +"Секвенца {sequence} ће започети HTML референцом карактера, али се не " +"завршава са {semicolon}. Ако не желите референцу карактера, употребите " +"{suggestion}." #: weblate/checks/fluent/inner_html.py:359 #, python-brace-format msgid "The sequence {sequence} is not a valid HTML character reference." -msgstr "" +msgstr "Секвенца {sequence} није валидна HTML референца карактера." #: weblate/checks/fluent/inner_html.py:943 msgid "Fluent source inner HTML" -msgstr "" +msgstr "Fluent извор унутрашњи HTML" #: weblate/checks/fluent/inner_html.py:944 msgid "Fluent source should be valid inner HTML" -msgstr "" +msgstr "Fluent извор треба да буде валидан унутрашњи HTML" #: weblate/checks/fluent/inner_html.py:1015 #, python-brace-format msgid "Fluent value is missing a HTML {tag} tag." -msgstr "" +msgstr "Fluent вредности недостаје HTML {tag} ознака." #: weblate/checks/fluent/inner_html.py:1020 #, python-brace-format @@ -3513,11 +3436,13 @@ msgid "" "Fluent value is missing a HTML {tag} tag for the following variants: " "{variant_list}." msgstr "" +"Fluent вредности недостаје HTML {tag} ознака за следеће варијанте: " +"{variant_list}." #: weblate/checks/fluent/inner_html.py:1034 #, python-brace-format msgid "Fluent value has an unexpected extra HTML {tag} tag." -msgstr "" +msgstr "Fluent вредност има неочекивану додатну HTML {tag} ознака." #: weblate/checks/fluent/inner_html.py:1039 #, python-brace-format @@ -3525,6 +3450,8 @@ msgid "" "Fluent value has an unexpected extra HTML {tag} tag for the following " "variants: {variant_list}." msgstr "" +"Fluent вредност има неочекивану додатну HTML {tag} ознака за следеће " +"варијанте: {variant_list}." #: weblate/checks/fluent/inner_html.py:1116 #, python-brace-format @@ -3533,12 +3460,17 @@ msgid "" "matching variant in the translation with the same set of HTML elements: " "{variant_list}." msgstr "" +"Следеће варијанте у оригиналној Fluent вредности немају бар једну " +"подударајућу варијанту у преводу са истим сетом HTML елемената: " +"{variant_list}." #: weblate/checks/fluent/inner_html.py:1131 msgid "" "The translated Fluent value does not have a matching variant in the original " "with the same set of HTML elements." msgstr "" +"Преведена Fluent вредност нема подударајућу варијанту у оригиналу са истим " +"сетом HTML елемената." #: weblate/checks/fluent/inner_html.py:1138 #, python-brace-format @@ -3546,49 +3478,47 @@ msgid "" "The following variants in the translated Fluent value do not have a matching " "variant in the original with the same set of HTML elements: {variant_list}." msgstr "" +"Следеће варијанте у преведеној Fluent вредности немају подударајућу " +"варијанту у оригиналу са истим сетом HTML елемената: {variant_list}." #: weblate/checks/fluent/inner_html.py:1219 -#, fuzzy -#| msgid "Create translation" msgid "Fluent translation inner HTML" -msgstr "Направи превод" +msgstr "Fluent превод унутрашњи HTML" #: weblate/checks/fluent/inner_html.py:1220 msgid "Fluent target should be valid inner HTML that matches" -msgstr "" +msgstr "Fluent мета треба да буде валидан унутрашњи HTML који се подудара" #: weblate/checks/fluent/parts.py:63 msgid "Fluent value is empty." -msgstr "" +msgstr "Fluent вредност је празна." #: weblate/checks/fluent/parts.py:65 msgid "Fluent value should be empty." -msgstr "" +msgstr "Fluent вредност треба да буде празна." #: weblate/checks/fluent/parts.py:71 #, python-brace-format msgid "Missing Fluent attribute: {hint}" -msgstr "" +msgstr "Недостаје Fluent атрибут: {hint}" #: weblate/checks/fluent/parts.py:80 #, python-brace-format msgid "Unexpected Fluent attribute: {hint}" -msgstr "" +msgstr "Неочекиван Fluent атрибут: {hint}" #: weblate/checks/fluent/parts.py:112 -#, fuzzy -#| msgid "Font file" msgid "Fluent parts" -msgstr "Фајл фонта" +msgstr "Fluent делови" #: weblate/checks/fluent/parts.py:113 msgid "Fluent parts should match" -msgstr "" +msgstr "Fluent делови треба да се подударају" #: weblate/checks/fluent/references.py:373 #, python-brace-format msgid "Fluent {attribute} attribute is missing a {reference} Fluent reference." -msgstr "" +msgstr "Fluent {attribute} атрибут недостаје {reference} Fluent референца." #: weblate/checks/fluent/references.py:381 #, python-brace-format @@ -3596,11 +3526,13 @@ msgid "" "Fluent {attribute} attribute is missing a {reference} Fluent reference for " "the following variants: {variant_list}." msgstr "" +"Fluent {attribute} атрибут недостаје {reference} Fluent референца за следеће " +"варијанте: {variant_list}." #: weblate/checks/fluent/references.py:390 #, python-brace-format msgid "Fluent value is missing a {reference} Fluent reference." -msgstr "" +msgstr "Fluent вредност недостаје {reference} Fluent референца." #: weblate/checks/fluent/references.py:395 #, python-brace-format @@ -3608,6 +3540,8 @@ msgid "" "Fluent value is missing a {reference} Fluent reference for the following " "variants: {variant_list}." msgstr "" +"Fluent вредност недостаје {reference} Fluent референца за следеће варијанте: " +"{variant_list}." #: weblate/checks/fluent/references.py:411 #, python-brace-format @@ -3615,6 +3549,8 @@ msgid "" "Fluent {attribute} attribute has an unexpected extra {reference} Fluent " "reference." msgstr "" +"Fluent {attribute} атрибут има неочекивану додатну {reference} Fluent " +"референца." #: weblate/checks/fluent/references.py:419 #, python-brace-format @@ -3622,11 +3558,13 @@ msgid "" "Fluent {attribute} attribute has an unexpected extra {reference} Fluent " "reference for the following variants: {variant_list}." msgstr "" +"Fluent {attribute} атрибут има неочекивану додатну {reference} Fluent " +"референца за следеће варијанте: {variant_list}." #: weblate/checks/fluent/references.py:429 #, python-brace-format msgid "Fluent value has an unexpected extra {reference} Fluent reference." -msgstr "" +msgstr "Fluent вредност има неочекивану додатну {reference} Fluent референца." #: weblate/checks/fluent/references.py:435 #, python-brace-format @@ -3634,6 +3572,8 @@ msgid "" "Fluent value has an unexpected extra {reference} Fluent reference for the " "following variants: {variant_list}." msgstr "" +"Fluent вредност има неочекивану додатну {reference} Fluent референца за " +"следеће варијанте: {variant_list}." #: weblate/checks/fluent/references.py:524 #, python-brace-format @@ -3642,6 +3582,9 @@ msgid "" "have at least one matching variant in the translation with the same set of " "Fluent references: {variant_list}." msgstr "" +"Следеће варијанте у оригиналном Fluent {attribute} атрибуту немају бар једну " +"подударајућу варијанту у преводу са истим сетом Fluent референци: " +"{variant_list}." #: weblate/checks/fluent/references.py:534 #, python-brace-format @@ -3650,6 +3593,9 @@ msgid "" "matching variant in the translation with the same set of Fluent references: " "{variant_list}." msgstr "" +"Следеће варијанте у оригиналној Fluent вредности немају бар једну " +"подударајућу варијанту у преводу са истим сетом Fluent референци: " +"{variant_list}." #: weblate/checks/fluent/references.py:550 #, python-brace-format @@ -3657,6 +3603,8 @@ msgid "" "The translated Fluent {attribute} attribute does not have a matching variant " "in the original with the same set of Fluent references." msgstr "" +"Преведени Fluent {attribute} атрибут нема подударајућу варијанту у оригиналу " +"са истим сетом Fluent референци." #: weblate/checks/fluent/references.py:558 #, python-brace-format @@ -3665,12 +3613,17 @@ msgid "" "have a matching variant in the original with the same set of Fluent " "references: {variant_list}." msgstr "" +"Следеће варијанте у преведеном Fluent {attribute} атрибуту немају " +"подударајућу варијанту у оригиналу са истим сетом Fluent референци: " +"{variant_list}." #: weblate/checks/fluent/references.py:569 msgid "" "The translated Fluent value does not have a matching variant in the original " "with the same set of Fluent references." msgstr "" +"Преведена Fluent вредност нема подударајућу варијанту у оригиналу са истим " +"сетом Fluent референци." #: weblate/checks/fluent/references.py:576 #, python-brace-format @@ -3679,47 +3632,42 @@ msgid "" "variant in the original with the same set of Fluent references: " "{variant_list}." msgstr "" +"Следеће варијанте у преведеној Fluent вредности немају подударајућу " +"варијанту у оригиналу са истим сетом Fluent референци: {variant_list}." #: weblate/checks/fluent/references.py:670 -#, fuzzy -#| msgid "Preferences" msgid "Fluent references" -msgstr "Подешавања" +msgstr "Fluent референце" #: weblate/checks/fluent/references.py:671 msgid "Fluent references should match" -msgstr "" +msgstr "Fluent референце треба да се подударају" #: weblate/checks/fluent/syntax.py:38 #, python-brace-format msgid "Fluent syntax error: {error}." -msgstr "" +msgstr "Fluent синтаксна грешка: {error}." #: weblate/checks/fluent/syntax.py:46 msgid "Fluent source syntax" -msgstr "" +msgstr "Fluent изворна синтакса" #: weblate/checks/fluent/syntax.py:47 msgid "Fluent syntax error in source" -msgstr "" +msgstr "Fluent синтаксна грешка у извору" #: weblate/checks/fluent/syntax.py:63 -#, fuzzy -#| msgid "Create translation" msgid "Fluent translation syntax" -msgstr "Направи превод" +msgstr "Fluent преводна синтакса" #: weblate/checks/fluent/syntax.py:64 -#, fuzzy -#| msgid "Comment on own translation" msgid "Fluent syntax error in translation" -msgstr "Коментар на мој превод" +msgstr "Fluent синтаксна грешка у преводу" #: weblate/checks/format.py:423 -#, fuzzy, python-format -#| msgid "Following format strings are extra: %s" +#, python-format msgid "The following format strings are in the wrong order: %s" -msgstr "Следеће ознаке форматирања су вишак: %s" +msgstr "Следећи формат низа је у погрешном редоследу: %s" #: weblate/checks/format.py:507 msgid "Python format" @@ -3727,7 +3675,7 @@ msgstr "Python формат" #: weblate/checks/format.py:508 msgid "Python format string does not match source" -msgstr "Python формат низ не одговара извору" +msgstr "Python формат ниска не одговара извору" #: weblate/checks/format.py:516 msgid "PHP format" @@ -3746,16 +3694,12 @@ msgid "C format string does not match source" msgstr "C формат стринг не одговара извору" #: weblate/checks/format.py:532 -#, fuzzy -#| msgid "Perl format" msgid "Perl brace format" -msgstr "Перл формат" +msgstr "Perl формат са заградама" #: weblate/checks/format.py:533 -#, fuzzy -#| msgid "Perl format string does not match source" msgid "Perl brace format string does not match source" -msgstr "Перл ознаке у преводу не одговарају извору" +msgstr "Perl формат са заградама не подудара се са извором" #: weblate/checks/format.py:545 msgid "Perl format" @@ -3771,7 +3715,7 @@ msgstr "JavaScript формат" #: weblate/checks/format.py:554 msgid "JavaScript format string does not match source" -msgstr "JavaScript формат низ не одговара извору" +msgstr "JavaScript формат ниска не одговара извору" #: weblate/checks/format.py:561 msgid "Lua format" @@ -3787,7 +3731,7 @@ msgstr "Object Pascal формат" #: weblate/checks/format.py:570 msgid "Object Pascal format string does not match source" -msgstr "Object Pascal форматни низ се не поклапа са извором" +msgstr "Object Pascal форматна ниска се не поклапа са извором" #: weblate/checks/format.py:578 msgid "Scheme format" @@ -3795,7 +3739,7 @@ msgstr "Scheme формат" #: weblate/checks/format.py:579 msgid "Scheme format string does not match source" -msgstr "Scheme форматни низ се не поклапа са извором" +msgstr "Scheme форматна ниска се не поклапа са извором" #: weblate/checks/format.py:590 msgid "Python brace format" @@ -3807,7 +3751,7 @@ msgstr "Python формат са заградама не одговара изв #: weblate/checks/format.py:611 msgid "Single {} encountered in the format string." -msgstr "" +msgstr "Један {} нађен у формату ниске." #: weblate/checks/format.py:638 msgid "C# format" @@ -3855,7 +3799,7 @@ msgstr "ECMAScript шаблонски литерали не одговарају #: weblate/checks/format.py:735 msgid "Percent placeholders" -msgstr "Држач за проценат" +msgstr "Држач места за проценат" #: weblate/checks/format.py:736 msgid "The percent placeholders do not match source" @@ -3878,7 +3822,7 @@ msgid "" "There are multiple unnamed variables in the string, making it impossible for " "translators to reorder them" msgstr "" -"Постоји више неименованих варијабли у низу, што онемогућава преводиоцима да " +"Постоји више неименованих варијабли у ниски, што онемогућава преводиоцима да " "их преуреде" #: weblate/checks/glossary.py:22 @@ -3891,7 +3835,7 @@ msgstr "Превод не следи терминологију дефиниса #: weblate/checks/glossary.py:80 msgid "Following terms are not translated according to glossary: {}" -msgstr "" +msgstr "Следећи термини нису преведени према глосару: {}" #: weblate/checks/icu.py:253 msgid "ICU MessageFormat syntax" @@ -3899,7 +3843,7 @@ msgstr "ICU MessageFormat синтакса" #: weblate/checks/icu.py:254 msgid "Syntax errors in ICU MessageFormat strings." -msgstr "Синтаксне грешке у ICU MessageFormat низовима." +msgstr "Синтаксне грешке у ICU MessageFormat нискама." #: weblate/checks/icu.py:282 msgid "ICU MessageFormat" @@ -3910,7 +3854,7 @@ msgid "" "Syntax errors and/or placeholder mismatches in ICU MessageFormat strings." msgstr "" "Синтаксне грешке и/или неслагања резервисаних места у ICU MessageFormat " -"низовима." +"нискама." #: weblate/checks/icu.py:455 #, python-format @@ -3979,7 +3923,7 @@ msgstr "ББ кôд означавање" #: weblate/checks/markup.py:71 msgid "BBCode in translation does not match source" -msgstr "" +msgstr "BBCode у преводу се не подудара са извором" #: weblate/checks/markup.py:151 msgid "XML syntax" @@ -4035,7 +3979,7 @@ msgstr "Превод користи небезбедно ХТМЛ означав #: weblate/checks/placeholders.py:31 msgid "Placeholders" -msgstr "Замене" +msgstr "Држачи места" #: weblate/checks/placeholders.py:32 msgid "Translation is missing some placeholders" @@ -4081,6 +4025,7 @@ msgstr "Превод не би требао да премаши задату д msgid "" "It fits into given boundaries. The rendering is shown for your convenience." msgstr "" +"Уклапа се у задате границе. Рендеровање је приказано ради ваше погодности." #: weblate/checks/ruby.py:54 msgid "Ruby format" @@ -4209,10 +4154,8 @@ msgid "Unsupported file format." msgstr "Неподржан формат фајла." #: weblate/fonts/views.py:71 -#, fuzzy -#| msgid "Entry by the same name already exists." msgid "Font with the same name already exists." -msgstr "Унос са истим називом већ постоји." +msgstr "Фонт са истим именом већ постоји." #: weblate/fonts/views.py:78 msgid "Creation failed, please fix the errors below." @@ -4223,10 +4166,8 @@ msgid "Font deleted." msgstr "Фонт избрисан." #: weblate/fonts/views.py:140 weblate/fonts/views.py:156 -#, fuzzy -#| msgid "Entry by the same name already exists." msgid "Font group with the same name already exists." -msgstr "Унос са истим називом већ постоји." +msgstr "Група фонта са истим именом већ постоји." #: weblate/fonts/views.py:169 msgid "No override found." @@ -4239,16 +4180,15 @@ msgstr "Група фонта је обрисана." #: weblate/formats/base.py:363 msgid "Could not load strings from the file, try choosing other format." msgstr "" +"Нисмо могли учитати низове из фајла, покушајте да изаберете други формат." #: weblate/formats/convert.py:278 msgid "HTML file" msgstr "ХТМЛ фајл" #: weblate/formats/convert.py:312 -#, fuzzy -#| msgid "Markdown text" msgid "Markdown file" -msgstr "Маркдаун текст" +msgstr "Markdown фајл" #: weblate/formats/convert.py:345 msgid "OpenDocument file" @@ -4328,7 +4268,7 @@ msgstr "Excel Open XML" #: weblate/formats/multi.py:177 msgid "Multivalue CSV file (UTF-8)" -msgstr "" +msgstr "Вишевредносни CSV фајл (UTF-8)" #: weblate/formats/ttkit.py:1149 msgid "gettext PO file" @@ -4343,22 +4283,20 @@ msgid "Qt Linguist translation file" msgstr "Qt Linguist датотека превода" #: weblate/formats/ttkit.py:1254 -#, fuzzy -#| msgid "Translation file" msgid "XLIFF 1.2 translation file" -msgstr "Фајл превода" +msgstr "XLIFF 1.2 фајл за превод" #: weblate/formats/ttkit.py:1284 msgid "XLIFF 1.2 with placeables support" -msgstr "" +msgstr "XLIFF 1.2 са подршком за места" #: weblate/formats/ttkit.py:1291 msgid "XLIFF 1.2 with gettext extensions" -msgstr "" +msgstr "XLIFF 1.2 са gettext проширењима" #: weblate/formats/ttkit.py:1322 msgid "iOS strings (UTF-16)" -msgstr "iOS низови (UTF-16)" +msgstr "iOS ниске (UTF-16)" #: weblate/formats/ttkit.py:1331 msgid "iOS strings (UTF-8)" @@ -4382,11 +4320,11 @@ msgstr "Џумла фајл језика" #: weblate/formats/ttkit.py:1378 msgid "GWT properties (UTF-8)" -msgstr "" +msgstr "GWT својства (UTF-8)" #: weblate/formats/ttkit.py:1388 msgid "GWT properties (ISO-8859-1)" -msgstr "" +msgstr "GWT својства (ISO-8859-1)" #: weblate/formats/ttkit.py:1394 msgid "PHP strings" @@ -4394,7 +4332,7 @@ msgstr "PHP стрингови" #: weblate/formats/ttkit.py:1413 msgid "Laravel PHP strings" -msgstr "Laravel PHP низови" +msgstr "Laravel PHP ниске" #: weblate/formats/ttkit.py:1420 msgid ".NET resource file" @@ -4402,13 +4340,12 @@ msgstr ".NET ресурсна датотека" #: weblate/formats/ttkit.py:1452 msgid "Mobile Kotlin Resource" -msgstr "" +msgstr "Мобилни Kotlin ресурс" #: weblate/formats/ttkit.py:1466 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not parse the key: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисам могао да парсирам кључ: %s" #: weblate/formats/ttkit.py:1471 msgid "JSON file" @@ -4424,35 +4361,27 @@ msgstr "i18next JSON фајл v3" #: weblate/formats/ttkit.py:1518 msgid "i18next JSON file v4" -msgstr "" +msgstr "i18next JSON фајл верзија 4" #: weblate/formats/ttkit.py:1524 -#, fuzzy -#| msgid "gettext PO file" msgid "go-i18n v1 JSON file" -msgstr "Геттекст ПО фајл" +msgstr "go-i18n v1 JSON фајл" #: weblate/formats/ttkit.py:1533 -#, fuzzy -#| msgid "gettext PO file" msgid "go-i18n v2 JSON file" -msgstr "Геттекст ПО фајл" +msgstr "go-i18n v2 JSON фајл" #: weblate/formats/ttkit.py:1541 msgid "ARB file" msgstr "АРБ фајл" #: weblate/formats/ttkit.py:1550 -#, fuzzy -#| msgid "gettext PO file" msgid "gotext JSON file" -msgstr "Геттекст ПО фајл" +msgstr "gotext JSON фајл" #: weblate/formats/ttkit.py:1559 -#, fuzzy -#| msgid "gettext PO file" msgid "Format.JS JSON file" -msgstr "Геттекст ПО фајл" +msgstr "Format.JS JSON фајл" #: weblate/formats/ttkit.py:1567 msgid "CSV file" @@ -4460,7 +4389,7 @@ msgstr "CSV фајл" #: weblate/formats/ttkit.py:1667 msgid "CSV file (UTF-8)" -msgstr "" +msgstr "CSV фајл (UTF-8)" #: weblate/formats/ttkit.py:1674 msgid "Simple CSV file" @@ -4472,7 +4401,7 @@ msgstr "Једноставан CSV фајл (ISO-8859-1)" #: weblate/formats/ttkit.py:1699 msgid "Simple CSV file (UTF-8)" -msgstr "" +msgstr "Једноставан CSV фајл (UTF-8)" #: weblate/formats/ttkit.py:1706 msgid "YAML file" @@ -4507,10 +4436,8 @@ msgid "Flat XML file" msgstr "Flat XML фајл" #: weblate/formats/ttkit.py:1821 -#, fuzzy -#| msgid "Repository failure" msgid "ResourceDictionary file" -msgstr "Грешка складишта" +msgstr "ResourceDictionary фајл" #: weblate/formats/ttkit.py:1834 msgid "INI file" @@ -4538,7 +4465,7 @@ msgstr "Fluent фајл" #: weblate/formats/txt.py:89 msgid "Should be a directory with metadata files!" -msgstr "" +msgstr "Треба да буде директоријум са метаподацима!" #: weblate/formats/txt.py:196 msgid "App store metadata files" @@ -4653,10 +4580,8 @@ msgid "Right to left" msgstr "здесна на лево" #: weblate/lang/models.py:607 weblate/templates/snippets/info.html:39 -#, fuzzy -#| msgid "Number of strings" msgid "Number of speakers" -msgstr "Број ниски" +msgstr "Број говорника" #: weblate/lang/models.py:608 msgid "Number of people speaking this language." @@ -4668,20 +4593,14 @@ msgid "None" msgstr "Ништа" #: weblate/lang/models.py:703 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "One/other/two" msgctxt "Plural type" msgid "One/other" -msgstr "један/остало/два" +msgstr "Један/други" #: weblate/lang/models.py:707 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "One/two/few/other" msgctxt "Plural type" msgid "One/few/other" -msgstr "један/два/неколико/остало" +msgstr "Један/неколико/други" #: weblate/lang/models.py:711 msgctxt "Plural type" @@ -4769,36 +4688,24 @@ msgid "Zero/one/few/many/other" msgstr "Нула/један/неколико/много/друго" #: weblate/lang/models.py:779 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "One/few/many/other" msgctxt "Plural type" msgid "One/many/other" -msgstr "један/неколико/много/остало" +msgstr "Један/много/друго" #: weblate/lang/models.py:783 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "Zero/one/two/few/many/other" msgctxt "Plural type" msgid "Zero/one/many/other" -msgstr "нула/један/два/неколико/много/остало" +msgstr "Нула/jedan/mnogo/drugi" #: weblate/lang/models.py:787 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "One/few/many/other" msgctxt "Plural type" msgid "One/few/many" -msgstr "један/неколико/много/остало" +msgstr "Један/неколико/mnogo" #: weblate/lang/models.py:791 -#, fuzzy -#| msgctxt "Plural type" -#| msgid "One/two/few/other" msgctxt "Plural type" msgid "One/zero/few/other" -msgstr "један/два/неколико/остало" +msgstr "Један/нула/неколико/остало" #: weblate/lang/models.py:795 msgctxt "Plural type" @@ -4819,23 +4726,19 @@ msgstr "gettext формула за множину" #: weblate/lang/models.py:811 msgid "CLDR plural with zero" -msgstr "" +msgstr "CLDR множина са нулом" #: weblate/lang/models.py:812 msgid "CLDR v38+ plural" -msgstr "" +msgstr "CLDR v38+ множински" #: weblate/lang/models.py:813 -#, fuzzy -#| msgid "Translations with failing checks" msgid "Android plural" -msgstr "преводи са неуспелом провером" +msgstr "Android множински" #: weblate/lang/models.py:814 -#, fuzzy -#| msgid "Translations with failing checks" msgid "Qt Linguist plural" -msgstr "преводи са неуспелом провером" +msgstr "Qt Linguist множинa" #: weblate/lang/models.py:815 msgid "Manually entered formula" @@ -4856,7 +4759,7 @@ msgstr "Тип множине" #: weblate/lang/models.py:922 msgid "Example counts for this plural form." -msgstr "" +msgstr "Пример бројева за ову множинску форму." #: weblate/lang/models.py:931 weblate/templates/translation.html:310 #: weblate/templates/translation.html:336 @@ -4891,6 +4794,8 @@ msgid "" "We have a new version of the Terms of Service document, please read it and " "confirm that you agree with it." msgstr "" +"Имамо нову верзију документа Услови коришћења, молимо вас да га прочитате и " +"потврдите да се слажете са њим." #: weblate/legal/templates/legal/confirm.html:6 #: weblate/legal/templates/legal/contracts.html:6 @@ -5001,10 +4906,9 @@ msgid "Overview" msgstr "Преглед" #: weblate/machinery/base.py:147 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not fetch supported languages: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли добити подржане језике: %s" #: weblate/machinery/base.py:153 #, python-format @@ -5026,19 +4930,17 @@ msgstr "API повезница" #: weblate/machinery/forms.py:48 msgctxt "Automatic suggestion service configuration" msgid "Client ID" -msgstr "" +msgstr "Клијент ID" #: weblate/machinery/forms.py:52 msgctxt "Automatic suggestion service configuration" msgid "Client secret" -msgstr "" +msgstr "Клијент тајна" #: weblate/machinery/forms.py:71 -#, fuzzy -#| msgid "Send test e-mail" msgctxt "Automatic suggestion service configuration" msgid "Contact e-mail" -msgstr "Пошаљи пробну е-пошту" +msgstr "Контакт имејл" #: weblate/machinery/forms.py:76 msgctxt "Automatic suggestion service configuration" @@ -5046,60 +4948,51 @@ msgid "Username" msgstr "Корисничко име" #: weblate/machinery/forms.py:92 -#, fuzzy -#| msgid "Author username" msgctxt "Automatic suggestion service configuration" msgid "SAP username" -msgstr "Корисничко име аутора" +msgstr "SAP корисничко име" #: weblate/machinery/forms.py:98 -#, fuzzy -#| msgid "Set password" msgctxt "Automatic suggestion service configuration" msgid "SAP password" -msgstr "Постави лозинку" +msgstr "SAP лозинка" #: weblate/machinery/forms.py:105 -#, fuzzy -#| msgid "Machine translation" msgctxt "Automatic suggestion service configuration" msgid "Enable machine translation" -msgstr "Машинско превођење" +msgstr "Омогућити машински превод" #: weblate/machinery/forms.py:112 -#, fuzzy -#| msgid "Translation Information" msgctxt "Automatic suggestion service configuration" msgid "Translation domain" -msgstr "Информације о преводу" +msgstr "Домен превода" #: weblate/machinery/forms.py:115 msgid "" "The ID of a translation domain, for example, BC. If you do not specify a " "domain, the method searches for translations in all available domains." msgstr "" +"ИД домена превода, на пример, BC. Ако не наведете домен, метода тражи " +"преводе у свим доступним доменима." #: weblate/machinery/forms.py:128 -#, fuzzy -#| msgid "Please enter the correct username and password." msgid "Please provide either key or username and password." -msgstr "Унесите исправно корисничко име и лозинку." +msgstr "Молимо вас пружите или кључ или корисничко име и лозинку." #: weblate/machinery/forms.py:136 msgctxt "Automatic suggestion service configuration" msgid "Application base URL" -msgstr "" +msgstr "Основни URL апликације" #: weblate/machinery/forms.py:150 -#, fuzzy -#| msgid "Authentication" msgctxt "Automatic suggestion service configuration" msgid "Authentication service URL" -msgstr "Аутентификација" +msgstr "УРЛ услуге аутентификације" #: weblate/machinery/forms.py:159 msgid "Regional or multi-service can be specified using region field below." msgstr "" +"Регионални или мулти-услуга може бити назначен коришћењем поља регион испод." #: weblate/machinery/forms.py:165 msgctxt "Automatic suggestion service configuration" @@ -5116,35 +5009,32 @@ msgctxt "Automatic suggestion service configuration" msgid "" "Specify a customized system category ID to use it instead of general one." msgstr "" +"Наведи прилагођени ID категорије система да га користиш уместо генералног." #: weblate/machinery/forms.py:184 msgctxt "Automatic suggestion service configuration" msgid "Google Translate service account info" -msgstr "" +msgstr "Google Translate налог за услугу информације" #: weblate/machinery/forms.py:189 msgctxt "Google Cloud Translation configuration" msgid "Enter a JSON key for the service account." -msgstr "" +msgstr "Унесите JSON кључ за налог услуге." #: weblate/machinery/forms.py:194 -#, fuzzy -#| msgid "Promoting translation projects" msgctxt "Automatic suggestion service configuration" msgid "Google Translate project" -msgstr "Промоција пројеката превода" +msgstr "Google Translate пројекат" #: weblate/machinery/forms.py:198 msgctxt "Google Cloud Translation configuration" msgid "Enter the numeric or alphanumeric ID of your Google Cloud project." -msgstr "" +msgstr "Унесите нумерички или алфанумерички ID вашег Google Cloud пројекта." #: weblate/machinery/forms.py:203 -#, fuzzy -#| msgid "Translation notifications" msgctxt "Automatic suggestion service configuration" msgid "Google Translate location" -msgstr "Обавештења о преводима" +msgstr "Google Translate локација" #: weblate/machinery/forms.py:208 msgctxt "Google Cloud Translation configuration" @@ -5152,181 +5042,153 @@ msgid "" "Choose a Google Cloud Translation region that is used for the Google Cloud " "project or is closest to you." msgstr "" +"Изаберите Google Cloud Translation регион који се користи за Google Cloud " +"пројекат или је најближи вама." #: weblate/machinery/forms.py:212 msgctxt "Google Cloud region" msgid "Global" -msgstr "" +msgstr "Глобално" #: weblate/machinery/forms.py:213 msgctxt "Google Cloud region" msgid "Europe" -msgstr "" +msgstr "Европа" #: weblate/machinery/forms.py:214 msgctxt "Google Cloud region" msgid "US" -msgstr "" +msgstr "САД" #: weblate/machinery/forms.py:224 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not parse JSON: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли парсирати JSON: %s" #: weblate/machinery/forms.py:231 -#, fuzzy -#| msgid "Access control" msgctxt "AWS Translate configuration" msgid "Access key ID" -msgstr "Контрола приступа" +msgstr "ID приступног кључа" #: weblate/machinery/forms.py:234 -#, fuzzy -#| msgid "Add host key" msgctxt "AWS Translate configuration" msgid "API secret key" -msgstr "Додај кључ домаћина" +msgstr "API тајни кључ" #: weblate/machinery/forms.py:237 -#, fuzzy -#| msgid "Rename" msgctxt "AWS Translate configuration" msgid "Region name" -msgstr "Преименуј" +msgstr "Име региона" #: weblate/machinery/forms.py:243 -#, fuzzy -#| msgid "Access control" msgctxt "Alibaba Translate configuration" msgid "Access key ID" -msgstr "Контрола приступа" +msgstr "ID приступног кључа" #: weblate/machinery/forms.py:246 -#, fuzzy -#| msgid "Access control" msgctxt "Alibaba Translate configuration" msgid "Access key secret" -msgstr "Контрола приступа" +msgstr "Тајна приступног кључа" #: weblate/machinery/forms.py:249 -#, fuzzy -#| msgid "Rename" msgctxt "Alibaba Translate configuration" msgid "Region ID" -msgstr "Преименуј" +msgstr "ID региона" #: weblate/machinery/forms.py:260 -#, fuzzy -#| msgid "Context" msgctxt "Automatic suggestion service configuration" msgid "Context vector" -msgstr "Контекст" +msgstr "Вектор контекста" #: weblate/machinery/forms.py:263 msgid "Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456" -msgstr "" +msgstr "Листа ИД_меморије:тежина одвојених зарезом. нпр: 1234:0.123,4567:0.456" #: weblate/machinery/forms.py:276 -#, fuzzy, python-format -#| msgid "The translation is not valid XML" +#, python-format msgid "The context vector is not valid: %s" -msgstr "Превод није исправан ИксМЛ" +msgstr "Вектор контекста није важећи: %s" #: weblate/machinery/forms.py:280 #, python-format msgid "The weight value must be between 0 and 1: %s" -msgstr "" +msgstr "Вредност тежине мора бити између 0 и 1: %s" #: weblate/machinery/forms.py:291 -#, fuzzy -#| msgid "Somali" msgctxt "Automatic suggestion service configuration" msgid "Formality" -msgstr "сомалијски" +msgstr "Формалност" #: weblate/machinery/forms.py:293 msgid "Uses the specified formality if language is not specified as (in)formal" -msgstr "" +msgstr "Користи одређену формалност ако језик није наведен као (не)формалан" #: weblate/machinery/forms.py:308 -#, fuzzy -#| msgid "Translation comment" msgctxt "Automatic suggestion service configuration" msgid "Translation context" -msgstr "Коментар превода" +msgstr "Контекст превода" #: weblate/machinery/forms.py:312 msgid "" "Describe the context of the translation to improve the accuracy of the " "translation." -msgstr "" +msgstr "Описати контекст превода да бисте побољшали тачност превода." #: weblate/machinery/forms.py:322 -#, fuzzy -#| msgid "Translation reports" msgctxt "Automatic suggestion service configuration" msgid "Translator persona" -msgstr "Извештаји превода" +msgstr "Личност преводиоца" #: weblate/machinery/forms.py:326 msgid "" "Describe the persona of translator to improve the accuracy of the " "translation. For example: “You are a squirrel breeder.”" msgstr "" +"Опишите личност преводиоца да бисте побољшали тачност превода. На пример: „" +"Ви сте узгајивач веверица.“" #: weblate/machinery/forms.py:333 -#, fuzzy -#| msgid "Translation file" msgctxt "Automatic suggestion service configuration" msgid "Translator style" -msgstr "Фајл превода" +msgstr "Стил преводиоца" #: weblate/machinery/forms.py:337 msgid "" "Describe the style of translation. For example: “Use informal language.”" -msgstr "" +msgstr "Опишите стил превода. На пример: „Користите неформалан језик.“" #: weblate/machinery/forms.py:346 -#, fuzzy -#| msgid "Automatic suggestions" msgctxt "OpenAI model selection" msgid "Automatic selection" -msgstr "Аутоматски предлози" +msgstr "Аутоматски избор" #: weblate/machinery/forms.py:354 -#, fuzzy -#| msgid "Custom" msgctxt "OpenAI model selection" msgid "Custom model" -msgstr "Прилагођено" +msgstr "Прилагођен модел" #: weblate/machinery/forms.py:359 msgctxt "Automatic suggestion service configuration" msgid "OpenAI API base URL" -msgstr "" +msgstr "Основни URL OpenAI API" #: weblate/machinery/forms.py:363 msgid "Base URL of the OpenAI API, if it differs from the OpenAI default URL" -msgstr "" +msgstr "Основни URL OpenAI API, ако се разликује од подразумеваног OpenAI URL" #: weblate/machinery/forms.py:370 -#, fuzzy -#| msgid "Zen mode" msgctxt "Automatic suggestion service configuration" msgid "OpenAI model" -msgstr "Зен режим" +msgstr "OpenAI модел" #: weblate/machinery/forms.py:378 -#, fuzzy -#| msgid "Customize the component name" msgctxt "OpenAI model selection" msgid "Custom model name" -msgstr "Прилагоди назив компоненте" +msgstr "Име прилагођеног модела" #: weblate/machinery/forms.py:380 msgid "Only needed when model is set to 'Custom model'" -msgstr "" +msgstr "Потребно само када је модел постављен на 'Прилагођен модел'" #: weblate/machinery/forms.py:390 msgid "Missing custom model name." @@ -5334,26 +5196,26 @@ msgstr "Недостаје назив прилагођеног модела." #: weblate/machinery/forms.py:394 msgid "Choose custom model here to enable it." -msgstr "" +msgstr "Изаберите прилагођени модел овде да бисте га омогућили." #: weblate/machinery/forms.py:403 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI endpoint URL" -msgstr "" +msgstr "Azure OpenAI крајња тачка URL" #: weblate/machinery/forms.py:407 msgid "" "Endpoint URL of the instance, e.g: https://my-instance.openai.azure.com." -msgstr "" +msgstr "URL крајње тачке инстанце, нпр: https://my-instance.openai.azure.com." #: weblate/machinery/forms.py:413 msgctxt "Automatic suggestion service configuration" msgid "Azure OpenAI deployment" -msgstr "" +msgstr "Azure OpenAI примена" #: weblate/machinery/forms.py:416 msgid "The model's unique deployment name." -msgstr "" +msgstr "Јединствено име модела за примену." #: weblate/machinery/views.py:404 msgid "Service is currently not available." @@ -5382,10 +5244,9 @@ msgid "No valid entries found in the uploaded file!" msgstr "Нема исправних уноса у отпремљеном фајлу!" #: weblate/memory/models.py:179 weblate/memory/models.py:186 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not parse JSON file: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли парсирати JSON фајл: %s" #: weblate/memory/models.py:224 #, python-format @@ -5394,7 +5255,7 @@ msgstr "Није могуће анализирати TMX датотеку: %s" #: weblate/memory/models.py:233 msgid "Source language not defined in the TMX file!" -msgstr "" +msgstr "Изворни језик није дефинисан у TMX фајлу!" #: weblate/memory/models.py:239 weblate/memory/models.py:257 #, python-format @@ -5422,18 +5283,15 @@ msgid "File: {}" msgstr "Фајл: {}" #: weblate/memory/views.py:78 -#, fuzzy -#| msgid "Entries deleted." msgid "Entries were deleted." -msgstr "Уноси обрисани." +msgstr "Уноси су уклоњени." #: weblate/memory/views.py:118 -#, fuzzy -#| msgid "The translation will be updated in the background." msgid "" "Entries were deleted and the translation memory will be rebuilt in the " "background." -msgstr "Превод ће бити освежен у позадини." +msgstr "" +"Уноси су уклоњени и меморија превода ће бити поново изграђена у позадини." #: weblate/memory/views.py:138 msgid "File processed, the entries will appear shortly." @@ -5500,10 +5358,9 @@ msgid "Dec" msgstr "дец" #: weblate/middleware.py:259 -#, fuzzy, python-format -#| msgid "This translation is currently locked." +#, python-format msgid "%s translation is currently not available, but can be added." -msgstr "Овај превод је тренутно закључан." +msgstr "%s превод тренутно није доступан, али може бити додат." #: weblate/screenshots/models.py:54 #: weblate/templates/screenshots/screenshot_list.html:47 @@ -5511,14 +5368,12 @@ msgid "Screenshot name" msgstr "Назив за снимак" #: weblate/screenshots/models.py:57 -#, fuzzy -#| msgid "Repository branch to translate" msgid "Repository path to screenshot" -msgstr "Грана складишта за превођење" +msgstr "Путања складишта до снимка екрана" #: weblate/screenshots/models.py:58 msgid "Scan for screenshot file change on repository update." -msgstr "" +msgstr "Скенирајте за промену фајла снимка екрана при ажурирању складишта." #: weblate/screenshots/models.py:63 #: weblate/templates/screenshots/screenshot_detail.html:71 @@ -5527,20 +5382,17 @@ msgid "Image" msgstr "Слика" #: weblate/screenshots/models.py:64 -#, fuzzy -#| msgid "Upload JPEG or PNG images up to 2000x2000 pixels." msgid "Upload image up to 2000x2000 pixels." -msgstr "Отпремите ЈПЕГ или ПНГ слике до 2000x2000 пиксела." +msgstr "Учитајте слику до 2000x2000 пиксела." #: weblate/screenshots/views.py:243 msgid "Screenshot has been uploaded, you can now assign it to source strings." msgstr "Снимак екрана је отпремљен. Сада га можете доделити нискама." #: weblate/screenshots/views.py:249 -#, fuzzy -#| msgid "Failed to upload screenshot, please fix errors below." msgid "Could not upload screenshot, please fix errors below." -msgstr "Неуспело отпремање снимка екрана. Отклоните грешке испод." +msgstr "" +"Нисмо могли учитати снимак екрана, молимо вас да исправите грешке испод." #: weblate/screenshots/views.py:305 #, python-format @@ -5586,50 +5438,34 @@ msgid "CSRF verification failed. Request aborted." msgstr "CSRF верификација није прошла. Захтев одбијен." #: weblate/templates/403_csrf.html:15 -#, fuzzy -#| msgid "" -#| "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 your browser is not hijacked by third-parties." msgid "" "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, ensuring " "that your browser is not being hijacked by third parties." msgstr "" -"Овај ХТТПС сајт захтева да „Referer header“ буде послат од стране вашег " -"интернет претраживача, што тренутно није случај. Поменуто заглавље је " -"потребно ради безбедоносних разлога, да би се осигурало да ваш претраживач " -"није под контролом трећих лица." +"Овај HTTPS сајт захтева да 'Referer' заглавље буде послато од вашег веб " +"прегледача, али ниједно није послато. Ово заглавље је потребно из " +"безбедносних разлога, како би се осигурало да ваш прегледач није преузет од " +"стране трећих страна." #: weblate/templates/403_csrf.html:16 -#, fuzzy -#| msgid "" -#| "If you have set up your web browser to not send 'Referer' headers, please " -#| "turn that on (at-least for this site, for HTTPS connections, or for 'same-" -#| "origin' requests)." msgid "" "If you have set up your web browser to not send 'Referer' headers, you need " "to turn that on (at least for this site, HTTPS connections, or 'same-origin' " "requests)." msgstr "" -"Ако сте подесили интернет претраживач са искљученим „Referer“ заглављима, " -"поново их укључите, барем за овај сајт, или за ХТТПС везе, или за 'same-" -"origin' захтеве." +"Ако сте подесили свој веб прегледач да не шаље 'Referer' заглавља, морате то " +"укључити (барем за овај сајт, HTTPS везе или 'истог порекла' захтеве)." #: weblate/templates/403_csrf.html:18 -#, fuzzy -#| msgid "" -#| "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 "" "Our site requires a session cookie to make the forms work. This cookie is " "required for security reasons, ensuring that your browser is not being " "hijacked by third parties." msgstr "" -"Овај сајт захтева „CSRF“ колачић када се прослеђује образац. Колачић је " -"неопходан из безбедносних разлога, да би се осигурало да прегледач не " -"контролише трећа страна." +"Наш сајт захтева колачић сесије да би форме радиле. Овај колачић је потребан " +"из безбедносних разлога, како би се осигурало да ваш прегледач није преузет " +"од стране трећих страна." #: weblate/templates/403_csrf.html:19 msgid "" @@ -5637,23 +5473,23 @@ msgid "" "This can easily happen for unauthenticated requests where session validity " "is limited. You might want to try your intended action again in such a case." msgstr "" +"Могло је да се догоди да је ваш колачић сесије истекао због неактивности. " +"Ово се лако може десити за неаутентификоване захтеве где је ваљаност сесије " +"ограничена. Можда ћете желети да поново покушате своју намеравану акцију у " +"таквом случају." #: weblate/templates/403_csrf.html:20 -#, fuzzy -#| msgid "" -#| "If you have set up your browser to not save cookies, please turn them on " -#| "again (at-least for this site, or for 'same-origin' requests)." msgid "" "If you have set up your browser to not save cookies, you need to enable " "saving them (at least for this site, or 'same-origin' requests)." msgstr "" -"Ако сте подесили свој претраживач да не чува колачиће, укључите то поново " -"(бар за ову страницу, или за захтеве истог порекла)." +"Ако сте подесили свој прегледач да не чува колачиће, морате омогућити њихово " +"чување (барем за овај сајт или захтеве 'истог порекла' - 'same-origin')." #: weblate/templates/403_csrf.html:22 #, python-format msgid "CSRF failure reason: %(reason)s" -msgstr "" +msgstr "Разлог неуспеха CSRF: %(reason)s" #: weblate/templates/404.html:5 weblate/templates/404.html:11 #: weblate/trans/views/error.py:33 @@ -5769,13 +5605,13 @@ msgid "" "Start your gratis trial today and explore our competitively priced " "commercial hosting solutions." msgstr "" +"Покрените свој бесплатни пробни период данас и истражите наша конкурентно " +"ценовна комерцијална хостинг решења." #: weblate/templates/about/index.html:36 weblate/templates/base.html:258 #: weblate/templates/snippets/billing-failure.html:9 -#, fuzzy -#| msgid "Ask for project hosting" msgid "Ask for Libre hosting" -msgstr "Питајте за хостинг пројекта" +msgstr "Питајте за Libre хостинг" #: weblate/templates/about/index.html:37 #: weblate/templates/billing/overview.html:20 @@ -5856,11 +5692,11 @@ msgstr "Статистика" #: weblate/templates/accounts/2fa.html:24 msgid "Second factor sign-in" -msgstr "" +msgstr "Пријава са другим фактором" #: weblate/templates/accounts/2fa.html:30 msgid "Please complete your sign-in using second factor credential." -msgstr "" +msgstr "Молимо вас да завршите пријаву користећи акредитив другог фактора." #: weblate/templates/accounts/confirm.html:7 #: weblate/templates/accounts/password.html:6 @@ -5874,10 +5710,8 @@ msgid "Your profile" msgstr "Ваш профил" #: weblate/templates/accounts/confirm.html:14 -#, fuzzy -#| msgid "Could not remove user identity" msgid "Confirm adding user identity" -msgstr "Не могу да уклоним идентитет корисника" +msgstr "Потврдите додавање идентитета корисника" #. Translators: backend_verbose is name of authentication backend, for example GitHub or Facebook, uid is user identifier, it can be username, email, number or URL #: weblate/templates/accounts/confirm.html:18 @@ -5890,16 +5724,13 @@ msgstr "" "%(backend_verbose)s (%(uid)s)." #: weblate/templates/accounts/confirm.html:24 -#, fuzzy -#| msgid "Configure" msgid "Confirm" -msgstr "Подеси" +msgstr "Потврдите" #: weblate/templates/accounts/contact.html:17 -#, fuzzy, python-format -#| msgid "You can contact maintainers of this server here." +#, python-format msgid "You can only contact administrators of %(site_title)s server here." -msgstr "Овде можете контактирати одржаваоца овог сервера." +msgstr "Овде можете контактирати само администраторе %(site_title)s сервера." #: weblate/templates/accounts/contact.html:19 msgid "You can only contact administrators of the whole server here." @@ -5910,19 +5741,19 @@ msgid "" "For questions about a specific translation project, don’t use this form. " "Refer to the project’s Info tab and contact its maintainers." msgstr "" +"За питања о специфичном пројекту превода, не користите ову форму. Погледајте " +"картицу информације пројекта и контактирајте његове одржаваче." #: weblate/templates/accounts/contact.html:27 -#, fuzzy, python-format -#| msgid "" -#| "If you are looking for support for Weblate or want to file bug reports " -#| "check its website at %(weblate_link)s." +#, python-format msgid "" "If you seek support for any other Weblate deployment than %(site_title)s, " "please check support offerings at %(weblate_link)s or use this form on the " "correct server." msgstr "" -"Ако вам треба подршка за Веблејт или желите да пријавите грешку идите на " -"%(weblate_link)s." +"Ако тражите подршку за било коју другу Веблејт инсталацију осим %(site_title)" +"s, молимо вас проверите понуде подршке на %(weblate_link)s или користите ову " +"форму на исправном серверу." #: weblate/templates/accounts/contact.html:31 #, python-format @@ -5930,6 +5761,8 @@ msgid "" "Weblate development ideas and questions can be sent to the " "%(link_start)sWeblate issue tracker%(link_end)s." msgstr "" +"Идеје и питања за развој Веблејта могу се послати на %(link_start)sВеблејт " +"трагач проблема%(link_end)s." #: weblate/templates/accounts/contact.html:38 msgid "Contact server administrators" @@ -5969,6 +5802,7 @@ msgid "" "Remove your account by clicking the confirmation link sent to your e-mail " "inbox." msgstr "" +"Уклоните ваш налог кликом на потврду линка послатог на вашу имејл пошту." #: weblate/templates/accounts/email-sent.html:30 msgid "" @@ -5981,15 +5815,17 @@ msgstr "" #: weblate/templates/accounts/email-sent.html:35 msgid "Please look into your spam folder if you cannot see it in your inbox." msgstr "" +"Молимо вас погледајте у вашу фасциклу са нежељеном поштом ако не можете да " +"га видите у вашој пошти." #: weblate/templates/accounts/email-sent.html:39 #: weblate/templates/mail/shared-registration.html:11 #, python-format msgid "The confirmation link will expire after %(count)s hour." msgid_plural "The confirmation link will expire after %(count)s hours." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Линк за потврду ће истећи након %(count)s сата." +msgstr[1] "Линк за потврду ће истећи након %(count)s сата." +msgstr[2] "Линк за потврду ће истећи након %(count)s сати." #: weblate/templates/accounts/email-sent.html:41 msgid "Request a new confirmation link if it expires." @@ -6004,6 +5840,8 @@ msgid "" "E-mail is not an instant technology. Please wait for the confirmation e-mail " "at least 30 minutes before you write to us about issues." msgstr "" +"Имејл није тренутна технологија. Молимо сачекајте потврду имејла најмање 30 " +"минута пре него што нам пишете о проблемима." #: weblate/templates/accounts/email-sent.html:52 #: weblate/templates/mail/shared-registration.html:27 @@ -6018,10 +5856,8 @@ msgstr "Молимо исправите грешке у формулару за #: weblate/templates/accounts/email.html:17 #: weblate/templates/accounts/profile.html:126 -#, fuzzy -#| msgid "User e-mail" msgid "Verify new e-mail address" -msgstr "Е-пошта корисника" +msgstr "Потврдите нову имејл адресу" #: weblate/templates/accounts/email.html:27 #: weblate/templates/accounts/register.html:52 weblate/templates/base.html:231 @@ -6034,16 +5870,12 @@ msgid "Trial subscriptions" msgstr "Пробне претплате" #: weblate/templates/accounts/hosting.html:30 -#, fuzzy -#| msgid "Translate your libre project" msgid "Set up your libre project" -msgstr "Преведите свој слободни пројекат" +msgstr "Поставите ваш Libre пројекат" #: weblate/templates/accounts/hosting.html:35 -#, fuzzy -#| msgid "Your trial offer" msgid "Your trial" -msgstr "Ваша пробна понуда" +msgstr "Ваша пробна верзија" #: weblate/templates/accounts/hosting.html:37 msgid "You will have 14 days to set up your project." @@ -6062,6 +5894,8 @@ msgid "" "We reserve our right to reject inappropriate content (erotic, gambling, " "etc.)." msgstr "" +"Задржавамо наше право да одбијемо неприкладан садржај (еротски, коцкање, " +"итд.)." #: weblate/templates/accounts/hosting.html:45 msgid "Get started" @@ -6215,14 +6049,12 @@ msgid "Notification settings" msgstr "Поставке обавештења" #: weblate/templates/accounts/profile.html:89 -#, fuzzy -#| msgid "Change subscription settings" msgid "Remove this notification setting" -msgstr "Измена поставки претплате" +msgstr "Уклоните ово подешавање обавештења" #: weblate/templates/accounts/profile.html:128 msgid "The e-mail address can be chosen from verified addresses only." -msgstr "" +msgstr "Имејл адреса може бити изабрана само из потврђених адреса." #: weblate/templates/accounts/profile.html:140 msgid "Current user identities" @@ -6237,33 +6069,29 @@ msgid "Disconnect" msgstr "Искључи" #: weblate/templates/accounts/profile.html:173 -#, fuzzy -#| msgid "Add a user" msgid "Add new user identity" -msgstr "Додај корисника" +msgstr "Додајте нови идентитет корисника" #: weblate/templates/accounts/profile.html:188 #: weblate/templates/accounts/user.html:354 -#, fuzzy -#| msgid "Authentication" msgid "Two-factor authentication" -msgstr "Аутентификација" +msgstr "Двофакторска аутентификација" #: weblate/templates/accounts/profile.html:192 msgid "" "Two-factor authentication adds another layer of security to your account by " "requiring more than just a password to sign in." msgstr "" +"Двофакторска аутентификација додаје још један слој безбедности вашем налогу " +"захтевајући више од само лозинке за пријаву." #: weblate/templates/accounts/profile.html:196 msgid "Security keys (WebAuthn)" -msgstr "" +msgstr "Безбедносни кључеви (WebAuthn)" #: weblate/templates/accounts/profile.html:198 -#, fuzzy -#| msgid "There are no addons currently installed." msgid "There are currently no WebAuthn keys registered." -msgstr "Тренутно нема инсталираних додатака." +msgstr "Тренутно нема регистрованих WebAuthn кључева." #: weblate/templates/accounts/profile.html:203 #: weblate/templates/accounts/profile.html:235 @@ -6279,69 +6107,59 @@ msgstr "Уклони" #: weblate/templates/accounts/profile.html:213 msgid "Name your security key" -msgstr "" +msgstr "Именујте свој безбедносни кључ" #: weblate/templates/accounts/profile.html:214 -#, fuzzy -#| msgid "Register new account" msgid "Register new security key" -msgstr "Региструј нови налог" +msgstr "Региструјте нови безбедносни кључ" #: weblate/templates/accounts/profile.html:220 #: weblate/templates/accounts/webauthn.html:12 msgid "Unfortunately, your browser has no WebAuthn support." -msgstr "" +msgstr "Нажалост, ваш прегледач не подржава WebAuthn." #: weblate/templates/accounts/profile.html:228 -#, fuzzy -#| msgid "Authentication" msgid "Authenticator apps (TOTP)" -msgstr "Аутентификација" +msgstr "Апликације за аутентификацију (TOTP)" #: weblate/templates/accounts/profile.html:230 -#, fuzzy -#| msgid "There are no addons currently installed." msgid "There are currently no authenticator apps registered." -msgstr "Тренутно нема инсталираних додатака." +msgstr "Тренутно нема регистрованих апликација за аутентификацију." #: weblate/templates/accounts/profile.html:242 #: weblate/templates/accounts/totp.html:11 #: weblate/templates/accounts/totp.html:22 -#, fuzzy -#| msgid "Register new account" msgid "Register new authenticator app" -msgstr "Региструј нови налог" +msgstr "Региструјте нову апликацију за аутентификацију" #: weblate/templates/accounts/profile.html:245 #: weblate/templates/accounts/recovery-codes.html:11 #: weblate/templates/accounts/recovery-codes.html:33 msgid "Recovery codes" -msgstr "" +msgstr "Кодови за опоравак" #: weblate/templates/accounts/profile.html:247 #: weblate/templates/accounts/recovery-codes.html:41 -#, fuzzy -#| msgid "There are no addons currently installed." msgid "There are currently no recovery codes generated." -msgstr "Тренутно нема инсталираних додатака." +msgstr "Тренутно нема генерисаних кодова за опоравак." #: weblate/templates/accounts/profile.html:248 #: weblate/templates/accounts/recovery-codes.html:44 #: weblate/templates/accounts/recovery-codes.html:51 msgid "Generate new recovery codes" -msgstr "" +msgstr "Генеришите нове кодове за опоравак" #: weblate/templates/accounts/profile.html:251 #, python-format msgid "%(count)s recovery code is available." msgid_plural "%(count)s recovery codes are available." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%(count)s код за опоравак је доступан." +msgstr[1] "%(count)s кода за опоравак је доступно." +msgstr[2] "%(count)s кодова за опоравак је доступно." #: weblate/templates/accounts/profile.html:257 msgid "View recovery codes" -msgstr "" +msgstr "Погледајте кодове за опоравак" #: weblate/templates/accounts/profile.html:269 msgid "User data" @@ -6394,10 +6212,8 @@ msgstr "Аватаре омогућава %(avatar_url_prefix)s." #: weblate/templates/accounts/profile.html:365 #: weblate/templates/trans/project-access.html:95 -#, fuzzy -#| msgid "Resend invitation" msgid "Pending invitation" -msgstr "Понови слање позивнице" +msgstr "Позивница на чекању" #: weblate/templates/accounts/profile.html:391 #: weblate/templates/project-labels.html:20 @@ -6449,10 +6265,8 @@ msgstr "Ваш лични АПИ кључ:" #: weblate/templates/accounts/profile.html:439 weblate/templates/data.html:83 #: weblate/templates/data.html:127 #: weblate/templates/trans/project-access.html:327 -#, fuzzy -#| msgid "Changed visibility" msgid "Toggle API key visibility" -msgstr "Измењена видљивост" +msgstr "Пребацивање видљивости API кључа" #: weblate/templates/accounts/profile.html:440 #: weblate/templates/trans/project-access.html:328 @@ -6515,13 +6329,16 @@ msgstr "Лиценце за појединачне преводе" #: weblate/templates/accounts/recovery-codes.html:20 msgid "Two-factor recovery codes" -msgstr "" +msgstr "Кодови за опоравак са двофакторском аутентификацијом" #: weblate/templates/accounts/recovery-codes.html:25 msgid "" "Recovery codes can be used to access your account if you lose access to your " "device and cannot receive two-factor authentication codes." msgstr "" +"Кодови за опоравак могу се користити за приступ вашем налогу ако изгубите " +"приступ свом уређају и не можете да примите кодове за двофакторску " +"аутентификацију." #: weblate/templates/accounts/recovery-codes.html:29 msgid "" @@ -6530,6 +6347,10 @@ msgid "" "password and other second factors. If you cannot find these codes when " "needed, you will lose access to your account." msgstr "" +"Чувајте своје кодове за опоравак на сигурном месту, као што је менаџер " +"лозинки. Ови кодови су последња опција за приступ вашем налогу у случају да " +"изгубите своју лозинку и остале друге факторе. Ако не можете да пронађете " +"ове кодове када су вам потребни, изгубићете приступ свом налогу." #: weblate/templates/accounts/recovery-codes.html:39 msgid "Recovery codes copied to clipboard." @@ -6540,17 +6361,17 @@ msgid "" "When you generate new recovery codes, you must download or print the new " "codes." msgstr "" +"Када генеришете нове кодове за опоравак, морате преузети или одштампати нове " +"кодове." #: weblate/templates/accounts/recovery-codes.html:48 msgid "Your old codes will become invalid and won't work anymore." -msgstr "" +msgstr "Ваши стари кодови ће постати неважећи и неће више радити." #: weblate/templates/accounts/recovery-codes.html:55 #: weblate/templates/accounts/totp.html:49 -#, fuzzy -#| msgid "Edit component settings" msgid "Back to account settings" -msgstr "Уреди поставке компоненте" +msgstr "Назад на подешавања налога" #: weblate/templates/accounts/redirect.html:14 #: weblate/templates/accounts/token.html:12 @@ -6559,7 +6380,7 @@ msgstr "Преусмеравање на провајдера за аутенти #: weblate/templates/accounts/register.html:20 msgid "Please complete the registration to accept the invitation." -msgstr "" +msgstr "Молимо вас да завршите регистрацију да бисте прихватили позивницу." #: weblate/templates/accounts/register.html:38 msgid "Register in Weblate" @@ -6624,14 +6445,16 @@ msgid "" "Authenticator apps generate one-time passwords that are used as a second " "factor to verify your identity when prompted during sign-in." msgstr "" +"Апликације за аутентификацију генеришу једнократне лозинке које се користе " +"као други фактор за потврду вашег идентитета када се затражи током пријаве." #: weblate/templates/accounts/totp.html:30 msgid "Scan the QR code" -msgstr "" +msgstr "Скенирајте QR код" #: weblate/templates/accounts/totp.html:37 msgid "You can also enter the secret key manually:" -msgstr "" +msgstr "Такође можете ручно унети тајни кључ:" #: weblate/templates/accounts/totp.html:40 msgid "Secret key copied to clipboard." @@ -6657,6 +6480,8 @@ msgstr "Пробни период вам траје 14 дана." #: weblate/templates/accounts/trial.html:24 msgid "Your trial will run the 640k plan, but you can choose any plan later." msgstr "" +"Ваша пробна верзија ће користити план од 640k, али можете изабрати било који " +"план касније." #: weblate/templates/accounts/trial.html:25 msgid "No credit card is needed, but you can set the payment method anytime." @@ -6742,10 +6567,8 @@ msgstr[1] "%(count)s коментара" msgstr[2] "%(count)s коментара" #: weblate/templates/accounts/user.html:150 -#, fuzzy -#| msgid "New contributor" msgid "Contributed to" -msgstr "Нови доприносилац" +msgstr "Доприношено у" #: weblate/templates/accounts/user.html:153 msgid "Activity" @@ -6786,29 +6609,21 @@ msgid "No recent contributions found." msgstr "Недавни доприноси нису пронађени." #: weblate/templates/accounts/user.html:172 -#, fuzzy -#| msgid "Projects with contribution" msgid "Browse all translations with contribution" -msgstr "Допринос пројектима" +msgstr "Прегледајте све преводе са доприносом" #: weblate/templates/accounts/user.html:180 #: weblate/templates/dashboard/user.html:72 -#, fuzzy -#| msgid "Browse all projects" msgid "Browse all managed projects" -msgstr "Прегледај све пројекте" +msgstr "Прегледајте све управљане пројекте" #: weblate/templates/accounts/user.html:189 -#, fuzzy -#| msgid "Browse all projects" msgid "Browse all watched projects" -msgstr "Прегледај све пројекте" +msgstr "Прегледајте све праћене пројекте" #: weblate/templates/accounts/user.html:202 -#, fuzzy -#| msgid "Browse all changes for user" msgid "Browse all changes made by this user" -msgstr "Прегледајте све измене корисника" +msgstr "Прегледајте све промене које је направио овај корисник" #: weblate/templates/accounts/user.html:211 msgid "Identity" @@ -6819,10 +6634,8 @@ msgid "User ID" msgstr "Кориснички ИД" #: weblate/templates/accounts/user.html:236 -#, fuzzy -#| msgid "Notifications" msgid "Notification" -msgstr "Обавештења" +msgstr "Обавештење" #: weblate/templates/accounts/user.html:237 weblate/trans/forms.py:1078 msgid "Scope" @@ -6830,11 +6643,11 @@ msgstr "Обим" #: weblate/templates/accounts/user.html:238 msgid "Frequency" -msgstr "" +msgstr "Учесталост" #: weblate/templates/accounts/user.html:241 msgid "One-time" -msgstr "једнократно" +msgstr "Једнократно" #: weblate/templates/accounts/user.html:295 weblate/templates/auth/team.html:31 #: weblate/templates/manage/teams.html:30 @@ -6849,7 +6662,7 @@ msgstr "Ништа" #: weblate/templates/accounts/user.html:310 msgid "Remove user from this team" -msgstr "" +msgstr "Уклони корисника из овог тима" #: weblate/templates/accounts/user.html:321 #: weblate/templates/trans/project-access.html:65 @@ -6868,29 +6681,24 @@ msgid "Unblock user" msgstr "Деблокирај корисника" #: weblate/templates/accounts/user.html:342 -#, fuzzy -#| msgctxt "Access-control role" -#| msgid "Edit source" msgid "Edit user" -msgstr "Уреди извор" +msgstr "Уреди корисника" #: weblate/templates/accounts/user.html:359 msgid "User has two-factor authentication configured." -msgstr "" +msgstr "Корисник има конфигурисану двофакторску аутентификацију." #: weblate/templates/accounts/user.html:361 msgid "User doesn't have two-factor authentication configured." -msgstr "" +msgstr "Корисник нема конфигурисану двофакторску аутентификацију." #: weblate/templates/accounts/user.html:366 msgid "Disable two-factor authentication" -msgstr "" +msgstr "Искључите двофакторску аутентификацију" #: weblate/templates/accounts/user.html:373 -#, fuzzy -#| msgid "Account removal deletes all your private data." msgid "Account removal deletes all user private data." -msgstr "Уклањање налога брише све ваше личне податке." +msgstr "Уклањање налога брише све корисничке приватне податке." #: weblate/templates/accounts/user.html:376 #: weblate/templates/accounts/user.html:390 @@ -6950,7 +6758,7 @@ msgstr "Да ли сте апсолутно сигурни?" #: weblate/templates/accounts/user.html:387 #, python-format msgid "This will remove %(user)s from Weblate." -msgstr "" +msgstr "Ово ће уклонити %(user)s из Веблејта." #: weblate/templates/accounts/user_contributions.html:14 msgid "Translations with contribution" @@ -6958,7 +6766,7 @@ msgstr "Преводи са доприносом" #: weblate/templates/accounts/webauthn.html:7 msgid "Sign in using the security key" -msgstr "" +msgstr "Пријавите се користећи безбедносни кључ" #: weblate/templates/addons/addon_detail.html:10 #: weblate/templates/addons/addon_detail.html:12 @@ -6977,10 +6785,8 @@ msgid "Configure add-on" msgstr "Конфигуриши додатак" #: weblate/templates/addons/addon_detail.html:44 -#, fuzzy -#| msgid "This add-on executes a script." msgid "This add-on has no settings." -msgstr "Овај додатак извршава скрипту." +msgstr "Овај додатак нема подешавања." #: weblate/templates/addons/addon_head.html:7 #: weblate/templates/addons/addon_list.html:86 @@ -6989,7 +6795,7 @@ msgstr "Додатак се може инсталирати само на ову #: weblate/templates/addons/addon_head.html:9 msgid "This add-on is used for all components sharing this repository." -msgstr "" +msgstr "Овај додатак се користи за све компоненте које деле ово складиште." #: weblate/templates/addons/addon_head.html:9 msgid "repository wide" @@ -7041,11 +6847,8 @@ msgid "Uninstall" msgstr "Деинсталирати" #: weblate/templates/addons/addon_list.html:45 -#, fuzzy -#| msgctxt "Access-control team name" -#| msgid "Viewers" msgid "View Logs" -msgstr "Прегледачи" +msgstr "Погледајте записе" #: weblate/templates/addons/addon_list.html:47 weblate/templates/guide.html:55 #: weblate/templates/machinery/list.html:41 @@ -7055,7 +6858,7 @@ msgstr "Подеси" #: weblate/templates/addons/addon_list.html:56 msgid "Add-ons can be installed on project and component scope as well." -msgstr "" +msgstr "Додаци могу бити инсталирани и на нивоу пројекта и компоненте." #: weblate/templates/addons/addon_list.html:60 #, python-format @@ -7069,9 +6872,9 @@ msgstr[2] "Управљај додацима за читав пројекат (% #, python-format msgid "Manage site-wide add-ons (%(count)s installed)" msgid_plural "Manage site-wide add-ons (%(count)s installed)" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Управљање додатцима на нивоу целог сајта (%(count)s инсталиран)" +msgstr[1] "Управљање додатцима на нивоу целог сајта (%(count)s инсталирана)" +msgstr[2] "Управљање додатцима на нивоу целог сајта (%(count)s инсталираних)" #: weblate/templates/addons/addon_list.html:75 msgid "Available add-ons" @@ -7096,16 +6899,12 @@ msgid "Some add-ons will ask for additional configuration during installation." msgstr "Неки додаци ће тражити додатну конфигурацију током инсталације." #: weblate/templates/addons/addon_list.html:107 -#, fuzzy -#| msgid "Browse all translation changes" msgid "Browse all add-on changes" -msgstr "Прегледај све измене превода" +msgstr "Прегледајте све промене додатака" #: weblate/templates/addons/addon_logs.html:27 -#, fuzzy -#| msgid "Account activity" msgid "Add-on Activity Logs" -msgstr "Активност налога" +msgstr "Записи активности додатака" #: weblate/templates/addons/addon_logs.html:32 msgid "Status" @@ -7113,21 +6912,19 @@ msgstr "Стање" #: weblate/templates/addons/addon_logs.html:33 msgid "Event" -msgstr "" +msgstr "Догађај" #: weblate/templates/addons/addon_logs.html:34 -#, fuzzy -#| msgid "View details" msgid "Details" -msgstr "Преглед детаља" +msgstr "Детаљи" #: weblate/templates/addons/addon_logs.html:35 msgid "Timestamp" -msgstr "" +msgstr "Временска ознака" #: weblate/templates/addons/addon_logs.html:58 msgid "No add-on activity logs available." -msgstr "" +msgstr "Нема доступних записа активности додатака." #: weblate/templates/addons/addon_logs.html:71 #: weblate/templates/snippets/position-field.html:9 @@ -7234,14 +7031,12 @@ msgid "Project URL slug" msgstr "Слаг URL-а пројекта" #: weblate/templates/addons/pseudolocale.html:4 -#, fuzzy -#| msgid "Translated strings" msgid "Generated strings" -msgstr "Преведене ниске" +msgstr "Генерисане ниске" #: weblate/templates/addons/pseudolocale.html:7 msgid "The strings will be generated using following pattern:" -msgstr "" +msgstr "Ниске ће бити генерисане користећи следећи образац:" #: weblate/templates/addons/pseudolocale.html:13 #: weblate/templates/mail/snippets/source-string.html:9 @@ -7283,35 +7078,29 @@ msgid "Settings" msgstr "Поставке" #: weblate/templates/auth/team.html:28 -#, fuzzy -#| msgid "Automatic group assignments" msgid "Automatic assignments" -msgstr "Аутоматске доделе групи" +msgstr "Аутоматска додељивања" #: weblate/templates/auth/team.html:64 msgid "" "Automatically add newly created users to this team based on their e-mail " "address." msgstr "" +"Аутоматски додајте новокреиране кориснике у овај тим на основу њихове имејл " +"адресе." #: weblate/templates/auth/team.html:70 -#, fuzzy -#| msgid "Automatic group assignment" msgid "Add automatic assignment" -msgstr "Аутоматско додељивање групи" +msgstr "Додај аутоматско додељивање" #: weblate/templates/auth/team.html:90 #: weblate/templates/trans/project-access.html:41 -#, fuzzy -#| msgid "Last login" msgid "Last sign in" -msgstr "Последње пријављивање" +msgstr "Последња пријава" #: weblate/templates/auth/team.html:100 weblate/trans/forms.py:1268 -#, fuzzy -#| msgid "Administrators" msgid "Team administrator" -msgstr "Администратори" +msgstr "Администратор тима" #: weblate/templates/auth/team.html:110 #: weblate/templates/trans/project-access-row.html:25 @@ -7320,16 +7109,12 @@ msgid "Not yet signed in" msgstr "Још увек нисте пријављени" #: weblate/templates/auth/team.html:117 -#, fuzzy -#| msgid "Weblate administration" msgid "Revoke administration" -msgstr "Веблејт администрација" +msgstr "Одузми администраторске привилегије" #: weblate/templates/auth/team.html:122 -#, fuzzy -#| msgid "Weblate administration" msgid "Grant administration" -msgstr "Веблејт администрација" +msgstr "Додели администраторске привилегије" #: weblate/templates/auth/team.html:139 weblate/templates/auth/team.html:181 #: weblate/templates/trans/project-access.html:132 @@ -7370,30 +7155,24 @@ msgid "Add" msgstr "Додај" #: weblate/templates/auth/teams-components.html:6 -#, fuzzy -#| msgid "Project, component or language must be specified" msgid "No components specified" -msgstr "Пројекат, компонента или језик морају бити наведени" +msgstr "Нису наведене компоненте" #: weblate/templates/auth/teams-count.html:5 msgid "Automatic assignment of users is configured for this team" -msgstr "" +msgstr "Аутоматско додељивање корисника је конфигурисано за овај тим" #: weblate/templates/auth/teams-count.html:5 -#, fuzzy -#| msgid "Automatic group assignments" msgid "Automatic assignment" -msgstr "Аутоматске доделе групи" +msgstr "Аутоматско додељивање" #: weblate/templates/auth/teams-name.html:4 msgid "Requires two-factor authentication" -msgstr "" +msgstr "Захтева двофакторску аутентификацију" #: weblate/templates/auth/teams-roles.html:5 -#, fuzzy -#| msgid "Access control" msgid "Access only" -msgstr "Контрола приступа" +msgstr "Само приступ" #: weblate/templates/base.html:119 msgid "Toggle navigation" @@ -7435,22 +7214,19 @@ msgid "Checks" msgstr "Провере" #: weblate/templates/base.html:177 -#, fuzzy, python-format -#| msgid "Failed checks in %(project)s — %(language)s" +#, python-format msgid "Failing checks in %(project)s — %(language)s" -msgstr "Грешке у пројекту %(project)s — %(language)s" +msgstr "Неуспешне провере у %(project)s — %(language)s" #: weblate/templates/base.html:188 -#, fuzzy, python-format -#| msgid "Failed checks in %(project)s" +#, python-format msgid "Failing checks in %(project)s" -msgstr "Грешке у %(project)s" +msgstr "Неуспешне провере у %(project)s" #: weblate/templates/base.html:194 -#, fuzzy, python-format -#| msgid "Failed checks in %(project)s — %(language)s" +#, python-format msgid "Failing checks in %(language)s" -msgstr "Грешке у пројекту %(project)s — %(language)s" +msgstr "Неуспешне провере у %(language)s" #: weblate/templates/base.html:198 msgid "Checks overview" @@ -7492,7 +7268,7 @@ msgstr "Започни нови превод" #: weblate/templates/base.html:256 msgid "Try Weblate for free" -msgstr "" +msgstr "Покушајте Веблејт бесплатно" #: weblate/templates/base.html:282 #: weblate/templates/trans/alert/billinglimit.html:4 @@ -7547,6 +7323,7 @@ msgstr "Допринос Weblate-у" msgid "" "Your Weblate is exceeding service limits. Please upgrade the subscription." msgstr "" +"Ваш Веблејт превазилази лимите услуге. Молимо вас да надоградите претплату." #: weblate/templates/base.html:375 #: weblate/templates/screenshots/screenshot_detail.html:95 @@ -7721,7 +7498,7 @@ msgstr "Годишња цена" #: weblate/templates/billing/status.html:80 msgid "Hosted strings limit" -msgstr "Ограничење броја низова уживо" +msgstr "Ограничење броја ниски уживо" #: weblate/templates/billing/status.html:85 msgid "Strings limit" @@ -7885,18 +7662,14 @@ msgstr "Тражи и замени" #: weblate/templates/category.html:86 weblate/templates/component.html:110 #: weblate/templates/language-project.html:61 #: weblate/templates/project.html:128 weblate/templates/translation.html:97 -#, fuzzy -#| msgid "Translation to remove" msgid "Organize or remove" -msgstr "Превод за уклањање" +msgstr "Организуј или уклони" #: weblate/templates/category-project.html:66 #: weblate/templates/language-project.html:94 #: weblate/templates/language.html:58 -#, fuzzy -#| msgid "Browse all changes for user" msgid "Browse all changes for this language" -msgstr "Прегледајте све измене корисника" +msgstr "Прегледајте све промене за овај језик" #: weblate/templates/category-project.html:95 #: weblate/templates/category.html:145 weblate/templates/component.html:186 @@ -7931,30 +7704,22 @@ msgstr "Преузми фајлове превода као ЗИП фајл" #: weblate/templates/category.html:52 weblate/templates/component.html:58 #: weblate/templates/language-project.html:42 weblate/templates/project.html:58 -#, fuzzy -#| msgid "Download translation files as ZIP file" msgid "Download translations as CSV in a ZIP file" -msgstr "Преузми фајлове превода као ЗИП фајл" +msgstr "Преузмите преводе као CSV у ZIP фајлу" #: weblate/templates/category.html:53 weblate/templates/component.html:59 #: weblate/templates/language-project.html:43 weblate/templates/project.html:59 -#, fuzzy -#| msgid "Download translation as XLIFF 1.2" msgid "Download translations as XLIFF 1.1 in a ZIP file" -msgstr "Преузми превод као XLIFF 1.2" +msgstr "Преузмите преводе као XLIFF 1.1 у ZIP фајлу" #: weblate/templates/category.html:54 weblate/templates/component.html:60 #: weblate/templates/language-project.html:44 weblate/templates/project.html:60 -#, fuzzy -#| msgid "Download translation files as ZIP file" msgid "Download translations as XLSX in a ZIP file" -msgstr "Преузми фајлове превода као ЗИП фајл" +msgstr "Преузмите преводе као XLSX у ZIP фајлу" #: weblate/templates/category.html:78 weblate/templates/project.html:93 -#, fuzzy -#| msgid "Add a user" msgid "Add new category" -msgstr "Додај корисника" +msgstr "Додај нову категорију" #: weblate/templates/category.html:82 weblate/templates/category.html:229 #: weblate/templates/component.html:95 weblate/templates/component.html:223 @@ -7973,21 +7738,19 @@ msgid "Browse all project changes" msgstr "Прегледај све промене пројекта" #: weblate/templates/category.html:178 weblate/templates/project.html:242 -#, fuzzy -#| msgid "Add a user" msgid "Add a category" -msgstr "Додај корисника" +msgstr "Додај категорију" #: weblate/templates/category.html:199 -#, fuzzy -#| msgid "Rename project" msgid "Organize category" -msgstr "Преименуј пројекат" +msgstr "Организујте категорију" #: weblate/templates/category.html:203 msgid "" "Moving or renaming the category will also change URLs for all its components." msgstr "" +"Премештање или преименовање категорије ће такође променити URL-ове за све " +"њене компоненте." #: weblate/templates/category.html:204 weblate/templates/component.html:250 #: weblate/templates/project.html:269 @@ -7995,13 +7758,13 @@ msgid "" "Users will need to update their bookmarks, references in cloned " "repositories, or API calls!" msgstr "" +"Корисницима ће бити потребно да ажурирају своје обележиваче, референце у " +"клонираним складиштима, или API позиве!" #: weblate/templates/category.html:210 weblate/templates/component.html:256 #: weblate/templates/project.html:275 -#, fuzzy -#| msgid "Translation to remove" msgid "Organize" -msgstr "Превод за уклањање" +msgstr "Организујте" #: weblate/templates/category.html:235 #: weblate/templates/language-project.html:169 @@ -8072,10 +7835,8 @@ msgid "Translated" msgstr "Преведено" #: weblate/templates/check_list.html:89 -#, fuzzy -#| msgid "Documentation" msgid "View check documentation" -msgstr "Документација" +msgstr "Погледај документацију провере" #: weblate/templates/component-list.html:16 weblate/templates/language.html:24 msgid "Information" @@ -8092,10 +7853,9 @@ msgstr "Компонента се ажурира…" #: weblate/templates/component-progress.html:31 #: weblate/templates/multi-progress.html:26 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Continue to %(return_target)s" -msgstr "Позивница на %(site_title)s" +msgstr "Наставите на %(return_target)s" #: weblate/templates/component-progress.html:33 msgid "Abort the update" @@ -8103,10 +7863,8 @@ msgstr "Прекини ажурирање" #: weblate/templates/component-progress.html:38 #: weblate/templates/multi-progress.html:30 -#, fuzzy -#| msgid "Return to the component after completion" msgid "Continue after completion" -msgstr "Врати се на компоненту након завршавања" +msgstr "Наставите након завршетка" #: weblate/templates/component.html:36 weblate/wladmin/views.py:80 msgid "Alerts" @@ -8179,14 +7937,13 @@ msgstr "" "трајно док се не обрише." #: weblate/templates/component.html:245 -#, fuzzy -#| msgid "Create component" msgid "Organize component" -msgstr "Направи компоненту" +msgstr "Организујте компоненту" #: weblate/templates/component.html:249 msgid "Moving or renaming the component will also change its URLs." msgstr "" +"Премештање или преименовање компоненте ће такође променити њене URL-ове." #: weblate/templates/component.html:273 weblate/templates/project.html:291 #: weblate/templates/translate.html:366 weblate/templates/translation.html:474 @@ -8488,10 +8245,9 @@ msgid "Translate" msgstr "Преведи" #: weblate/templates/engage.html:68 -#, fuzzy, python-format -#| msgid "%(language)s glossary for %(project)s" +#, python-format msgid "%(language)s in %(project)s" -msgstr "Појмовник за %(project)s — %(language)s" +msgstr "%(language)s у %(project)s" #: weblate/templates/engage.html:70 msgid "View project languages" @@ -8721,46 +8477,40 @@ msgid "Commit" msgstr "Урезивање" #: weblate/templates/js/git-status.html:29 -#, fuzzy, python-format -#| msgid "%(count)s string" -#| msgid_plural "%(count)s strings" +#, python-format msgid "%(count)s pending change" msgid_plural "%(count)s pending changes" -msgstr[0] "%(count)s ниска" -msgstr[1] "%(count)s ниске" -msgstr[2] "%(count)s ниски" +msgstr[0] "%(count)s промена на чекању" +msgstr[1] "%(count)s промене на чекању" +msgstr[2] "%(count)s променa на чекању" #: weblate/templates/js/git-status.html:32 -#, fuzzy -#| msgid "Commit pending changes to the Weblate repository" msgid "" "This will commit any pending changes present in Weblate and not in the " "repository." -msgstr "Предај наступајуће измене у Веблејт складиште" +msgstr "" +"Ово ће урезати све промене на чекању присутне у Веблејту које још увек нису " +"у складишту." #: weblate/templates/js/git-status.html:38 msgid "Push" msgstr "Гурање" #: weblate/templates/js/git-status.html:41 -#, fuzzy, python-format -#| msgid "%(count)s comment" -#| msgid_plural "%(count)s comments" +#, python-format msgid "%(count)s outgoing commit" msgid_plural "%(count)s outgoing commits" -msgstr[0] "%(count)s коментар" -msgstr[1] "%(count)s коментара" -msgstr[2] "%(count)s коментара" +msgstr[0] "%(count)s одлазеће урезивање" +msgstr[1] "%(count)s одлазећа урезивања" +msgstr[2] "%(count)s одлазећих урезивања" #: weblate/templates/js/git-status.html:43 -#, fuzzy, python-format -#| msgid "%(count)s comment" -#| msgid_plural "%(count)s comments" +#, python-format msgid "(%(count)s missing in the push branch)" msgid_plural "(%(count)s missing in the push branch)" -msgstr[0] "%(count)s коментар" -msgstr[1] "%(count)s коментара" -msgstr[2] "%(count)s коментара" +msgstr[0] "(%(count)s недостаје у push грани)" +msgstr[1] "(%(count)s недостају у push грани)" +msgstr[2] "(%(count)s недостаје у push грани)" #: weblate/templates/js/git-status.html:54 msgid "Update" @@ -8768,33 +8518,27 @@ msgstr "Ажурирање" #: weblate/templates/js/git-status.html:61 msgid "Update with merge" -msgstr "" +msgstr "Ажурирајте спајањем" #: weblate/templates/js/git-status.html:64 msgid "Update with rebase" -msgstr "" +msgstr "Ажурирајте ребејзом" #: weblate/templates/js/git-status.html:67 -#, fuzzy -#| msgid "Pull changes from the remote repository" msgid "Update with merge without fast-forward" -msgstr "Довуци измене из удаљеног складишта" +msgstr "Ажурирајте спајањем без брзог напредовања" #: weblate/templates/js/git-status.html:73 -#, fuzzy, python-format -#| msgid "%(count)s comment" -#| msgid_plural "%(count)s comments" +#, python-format msgid "%(count)s missing commit" msgid_plural "%(count)s missing commits" -msgstr[0] "%(count)s коментар" -msgstr[1] "%(count)s коментара" -msgstr[2] "%(count)s коментара" +msgstr[0] "%(count)s недостајуће урезивање" +msgstr[1] "%(count)s недостајућа урезивања" +msgstr[2] "%(count)s недостајућих урезивања" #: weblate/templates/js/git-status.html:76 -#, fuzzy -#| msgid "Locking the translation will prevent others to work on translation." msgid "This will update the Weblate repository with the upstream changes." -msgstr "Закључавање превода ће спречити друге да раде на преводу." +msgstr "Ово ће ажурирати Веблејт складиште са узводним променама." #: weblate/templates/js/git-status.html:83 msgid "Allow changes to the Weblate repository" @@ -8814,24 +8558,20 @@ msgid "Lock" msgstr "Закључај" #: weblate/templates/js/git-status.html:90 -#, fuzzy -#| msgid "Weblate translations" msgid "Weblate translations are locked" -msgstr "Веблејт преводи" +msgstr "Веблејт преводи су закључани" #: weblate/templates/js/git-status.html:92 -#, fuzzy -#| msgid "Weblate translations" msgid "Weblate translations are unlocked" -msgstr "Веблејт преводи" +msgstr "Веблејт преводи су откључани" #: weblate/templates/js/git-status.html:96 msgid "Locking prevents translators from doing changes." -msgstr "" +msgstr "Закључавање спречава преводиоце да праве промене." #: weblate/templates/js/git-status.html:108 msgid "Danger zone" -msgstr "" +msgstr "Опасна зона" #: weblate/templates/js/git-status.html:113 #: weblate/templates/translate.html:512 @@ -8843,18 +8583,19 @@ msgid "Reset all changes in the Weblate repository" msgstr "Поништи све измене у Веблејт складишту" #: weblate/templates/js/git-status.html:118 -#, fuzzy -#| msgid "Reset all changes in the Weblate repository" msgid "" "Resetting removes all changes in Weblate so that the repository matches " "upstream." -msgstr "Поништи све измене у Веблејт складишту" +msgstr "" +"Ресетовање уклања све промене у Веблејту тако да складиште одговара узводном." #: weblate/templates/js/git-status.html:119 msgid "" "Use when you want to discard changes in Weblate and bring it in sync with " "upstream repository." msgstr "" +"Користите када желите да одбаците промене у Веблејту и синхронизујете их са " +"узводним складиштем." #: weblate/templates/js/git-status.html:123 msgid "Cleanup" @@ -8869,64 +8610,57 @@ msgid "" "Cleanup removes all files which are not tracked by the version control from " "the repository." msgstr "" +"Чишћење уклања све фајлове који нису праћени верзијом контроле из складишта." #: weblate/templates/js/git-status.html:129 msgid "It also removes stale branches which are not used by Weblate." -msgstr "" +msgstr "Такође уклања застареле гране које нису коришћене од стране Веблејта." #: weblate/templates/js/git-status.html:130 -#, fuzzy -#| msgid "Prevent any changes in the Weblate repository" msgid "Use when there is some garbage left in the Weblate repository." -msgstr "Спречи било какве промене у Веблејт складишту" +msgstr "Користите када у Веблејт складишту остане неки отпад." #: weblate/templates/js/git-status.html:134 msgid "Synchronize" -msgstr "" +msgstr "Синхронизујте" #: weblate/templates/js/git-status.html:136 msgid "Force writing all translations to the Weblate repository" msgstr "Присилно писање свих превода у Веблејт складиште" #: weblate/templates/js/git-status.html:139 -#, fuzzy -#| msgid "Reset all changes in the Weblate repository" msgid "Forces writing all strings to the translation files." -msgstr "Поништи све измене у Веблејт складишту" +msgstr "Присиљавање писања свих низова у фајлове превода." #: weblate/templates/js/git-status.html:140 msgid "" "Use this when repository files became out of sync with Weblate for some " "reason." msgstr "" +"Користите ово када су фајлови складишта постали несинхронизовани са " +"Веблејтом из неког разлога." #: weblate/templates/js/git-status.html:144 msgid "Rescan" -msgstr "" +msgstr "Поновно скенирање" #: weblate/templates/js/git-status.html:146 -#, fuzzy -#| msgid "Cleanup all untracked files in the Weblate repository" msgid "Rescan all translation files in the Weblate repository" -msgstr "Очисти све непраћене фајлове у локалном складишту" +msgstr "Поновно скенирање свих фајлова превода у Веблејт складишту" #: weblate/templates/js/git-status.html:149 -#, fuzzy -#| msgid "Removes current translation from the repository." msgid "Loads translations from the files into Weblate." -msgstr "Уклања тренутни превод из складишта." +msgstr "Учитава преводе из фајлова у Веблејт." #: weblate/templates/js/git-status.html:150 -#, fuzzy -#| msgid "" -#| "Weblate could not merge upstream changes while updating the repository." msgid "" "Use when Weblate missed some of the strings after updating the repository." -msgstr "Веблејт не може да стопи измене из извора док се складиште ажурира." +msgstr "" +"Користите када Веблејт пропусти неке од ниски након ажурирања складишта." #: weblate/templates/js/git-status.html:155 msgid "Use these operations with caution, they can lead to data loss." -msgstr "" +msgstr "Користите ове операције са опрезом, могу довести до губитка података." #: weblate/templates/js/git-status.html:164 #, python-format @@ -8953,11 +8687,11 @@ msgstr "Радни ток" #: weblate/templates/lang/plural_form.html:15 msgid "Changing plural rules might not have a desired effect." -msgstr "" +msgstr "Промена множинских правила можда неће имати жељени ефекат." #: weblate/templates/lang/plural_form.html:16 msgid "Please see a documentation for more info." -msgstr "" +msgstr "Молимо вас да погледате документацију за више информација." #: weblate/templates/last-changes-content.html:16 msgid "Revert" @@ -8984,7 +8718,7 @@ msgstr "Преглед детаља" #: weblate/templates/last-changes-content.html:53 #: weblate/templates/snippets/suggestions.html:44 msgid "Rejection reason" -msgstr "" +msgstr "Разлог одбијања" #. Translators: Number of edits on a change in Damerau–Levenshtein distance #: weblate/templates/last-changes-content.html:65 @@ -9010,7 +8744,7 @@ msgstr "Решени коментар" #: weblate/templates/list-comments.html:15 msgid "Source string comment" -msgstr "Коментар изворног низа" +msgstr "Коментар изворне ниске" #: weblate/templates/list-comments.html:17 msgid "Translation comment" @@ -9027,27 +8761,23 @@ msgstr "Означи као спам" #: weblate/templates/machinery/detail.html:7 msgid "This service is installed site wide." -msgstr "" +msgstr "Ова услуга је инсталирана на нивоу сајта." #: weblate/templates/machinery/detail.html:7 -#, fuzzy -#| msgid "repository wide" msgid "site wide" -msgstr "у целом складишту" +msgstr "на нивоу сајта" #: weblate/templates/machinery/detail.html:10 msgid "This service is installed site wide, but disabled." -msgstr "" +msgstr "Ова услуга је инсталирана на нивоу сајта, али је онемогућена." #: weblate/templates/machinery/detail.html:10 msgid "disabled" -msgstr "" +msgstr "онемогућено" #: weblate/templates/machinery/detail.html:17 -#, fuzzy -#| msgid "Service is currently not available." msgid "Service is no longer available" -msgstr "Сервис тренутно није доступан." +msgstr "Услуга више није доступна" #: weblate/templates/machinery/edit.html:12 #: weblate/templates/machinery/edit.html:16 @@ -9058,42 +8788,32 @@ msgid "Automatic suggestions" msgstr "Аутоматски предлози" #: weblate/templates/machinery/list.html:23 -#, fuzzy -#| msgid "Use automatic suggestions" msgid "Configured automatic suggestion services" -msgstr "Користи аутоматске предлоге" +msgstr "Конфигурисане услуге аутоматских предлога" #: weblate/templates/machinery/list.html:34 msgid "Disable" -msgstr "" +msgstr "Онемогући" #: weblate/templates/machinery/list.html:36 -#, fuzzy -#| msgid "Enable reviews" msgid "Enable" -msgstr "Укључи оверавање" +msgstr "Омогућити" #: weblate/templates/machinery/list.html:50 -#, fuzzy -#| msgid "There are no addons currently installed." msgid "There are no services currently installed." -msgstr "Тренутно нема инсталираних додатака." +msgstr "Тренутно нема услуга инсталираних." #: weblate/templates/machinery/list.html:52 -#, fuzzy, python-format -#| msgid "There is currently %(count)s addon installed." -#| msgid_plural "There are currently %(count)s addons installed." +#, python-format msgid "There is currently %(count)s service installed." msgid_plural "There are currently %(count)s services installed." -msgstr[0] "Тренутно је %(count)s додатак инсталиран." -msgstr[1] "Тренутно је %(count)s додатка инсталирано." -msgstr[2] "Тренутно је %(count)s додатака инсталирано." +msgstr[0] "Тренутно је %(count)s услуга инсталирана." +msgstr[1] "Тренутно су %(count)s услуге инсталиране." +msgstr[2] "Тренутно је %(count)s услуга инсталирано." #: weblate/templates/machinery/list.html:61 -#, fuzzy -#| msgid "Use automatic suggestions" msgid "Available automatic suggestion services" -msgstr "Користи аутоматске предлоге" +msgstr "Доступне услуге аутоматског предлога" #: weblate/templates/machinery/list.html:79 msgid "Could not find any additional services." @@ -9102,13 +8822,12 @@ msgstr "Није могуће пронаћи додатне услуге." #: weblate/templates/machinery/list.html:81 msgid "" "Some services will ask for additional configuration during installation." -msgstr "" +msgstr "Неке услуге ће тражити додатну конфигурацију током инсталације." #: weblate/templates/mail/account_activity.html:7 -#, fuzzy, python-format -#| msgid "There has been a change in your account at %(site_title)s:" +#, python-format msgid "The following activity has occurred on your account at %(site_title)s:" -msgstr "Има промена у вашем налогу на %(site_title)s:" +msgstr "Следећа активност се догодила на вашем налогу на %(site_title)s:" #: weblate/templates/mail/account_activity_subject.txt:4 #, python-format @@ -9187,10 +8906,10 @@ msgstr "" msgid "" "Your billing plan has expired. Please renew it to continue using the service." msgstr "" +"Ваш план наплате је истекао. Молимо вас да га обновите да бисте наставили да " +"користите услугу." #: weblate/templates/mail/billing_expired.html:23 -#, fuzzy -#| msgid "This billing plan covers following projects:" msgid "This billing plan covers the following projects:" msgstr "Овај план наплате покрива следеће пројекте:" @@ -9203,6 +8922,8 @@ msgid "" "There are no projects attached to this billing plan. (There might be " "projects in other billing plans of yours.)" msgstr "" +"Нема пројеката повезаних са овим планом наплате. (Могу постојати пројекти у " +"другим вашим плановима наплате.)" #: weblate/templates/mail/billing_expired.html:40 msgid "All projects covered by this billing plan have been removed." @@ -9214,6 +8935,8 @@ msgid "" "If you don't issue the payment, all projects within this billing plan will " "be removed on %(date)s." msgstr "" +"Ако не извршите уплату, сви пројекти унутар овог плана наплате биће уклоњени " +"на %(date)s." #: weblate/templates/mail/billing_expired.html:46 #, python-format @@ -9221,6 +8944,8 @@ msgid "" "If your Libre hosting is not approved for it, all projects within this " "billing plan will be removed on %(date)s." msgstr "" +"Ако ваш слободан хостинг није одобрен за то, сви пројекти унутар овог плана " +"наплате биће уклоњени на %(date)s." #: weblate/templates/mail/billing_expired_subject.txt:3 msgid "Your translation project was removed" @@ -9307,18 +9032,16 @@ msgid "Digest: %(notification_name)s" msgstr "Сажетак: %(notification_name)s" #: weblate/templates/mail/invite.html:12 -#, fuzzy -#| msgid "Resend invitation" msgid "View invitation" -msgstr "Понови слање позивнице" +msgstr "Погледајте позивницу" #: weblate/templates/mail/invite.html:16 #, python-format msgid "The invitation will expire after %(count)s hour." msgid_plural "The invitation will expire after %(count)s hours." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Позивница ће истећи након %(count)s сат." +msgstr[1] "Позивница ће истећи након %(count)s сата." +msgstr[2] "Позивница ће истећи након %(count)s сати." #: weblate/templates/mail/invite_subject.txt:4 #, python-format @@ -9424,11 +9147,9 @@ msgid "New language request in %(component)s" msgstr "Захтев за новим језиком у %(component)s" #: weblate/templates/mail/new_string_subject.txt:3 -#, fuzzy, python-format -#| msgid "New string to translate in %(translation)s" -#| msgid_plural "New strings to translate in %(translation)s" +#, python-format msgid "String to translate in %(translation)s" -msgstr "Нове ниске за превод у пројекту %(translation)s" +msgstr "Ниска за превод у %(translation)s" #: weblate/templates/mail/new_suggestion.html:9 msgid "Suggestion" @@ -9524,13 +9245,12 @@ msgid "Password reset on %(site_title)s" msgstr "Ресетовање лозинке на %(site_title)s" #: weblate/templates/mail/shared-activity.html:18 -#, fuzzy -#| msgid "" -#| "If you did not request this change, please report it as soon as possible." msgid "" "If you didn’t initiate this, please report it to the server administrators " "by clicking the button below." -msgstr "Ако нисте ви затражили ову измену, пријавите нам у најкраћем року." +msgstr "" +"Ако нисте иницирали ово, молимо вас пријавите то администраторима сервера " +"кликом на дугме испод." #: weblate/templates/mail/shared-activity.html:22 msgid "Report" @@ -9555,10 +9275,8 @@ msgid "Confirm account removal" msgstr "Потврди уклањање налога" #: weblate/templates/mail/shared-registration.html:20 -#, fuzzy -#| msgid "Confirm registration" msgid "Confirm invitation" -msgstr "Потврди регистрацију" +msgstr "Потврдите позивницу" #: weblate/templates/mail/snippets/source-string.html:14 #: weblate/templates/snippets/glossary.html:29 @@ -9566,7 +9284,7 @@ msgstr "Потврди регистрацију" #: weblate/templates/snippets/query-builder.html:21 #: weblate/templates/translate.html:644 msgid "Source string description" -msgstr "Опис изворног низа" +msgstr "Опис изворне ниске" #: weblate/templates/mail/snippets/unit-screenshots.html:5 #: weblate/templates/translate.html:682 @@ -9580,35 +9298,29 @@ msgstr "Контекст снимка екрана" #: weblate/templates/mail/todo_strings.html:8 weblate/trans/filter.py:26 #: weblate/trans/filter.py:123 -#, fuzzy -#| msgid "Translated strings" msgid "Unfinished strings" -msgstr "Преведене ниске" +msgstr "Незавршене ниске" #: weblate/templates/mail/todo_strings_subject.txt:4 -#, fuzzy, python-format -#| msgid "%(count)s pending suggestion in %(component)s" -#| msgid_plural "%(count)s pending suggestions in %(component)s" +#, python-format msgid "%(count)s unfinished string in %(component)s" msgid_plural "%(count)s unfinished strings in %(component)s" -msgstr[0] "%(count)s необрађен предлог у %(component)s" -msgstr[1] "%(count)s необрађена предлога у %(component)s" -msgstr[2] "%(count)s необрађених предлога у %(component)s" +msgstr[0] "%(count)s незавршена ниска у %(component)s" +msgstr[1] "%(count)s незавршене ниске у %(component)s" +msgstr[2] "%(count)s незавршених ниски у %(component)s" #: weblate/templates/mail/todo_strings_subject.txt:6 -#, fuzzy, python-format -#| msgid "%(count)s string" -#| msgid_plural "%(count)s strings" +#, python-format msgid "%(count)s unfinished string" msgid_plural "%(count)s unfinished strings" -msgstr[0] "%(count)s ниска" -msgstr[1] "%(count)s ниске" -msgstr[2] "%(count)s ниски" +msgstr[0] "%(count)s незавршена ниска" +msgstr[1] "%(count)s незавршене ниске" +msgstr[2] "%(count)s незавршених ниски" #: weblate/templates/mail/translated_component_subject.txt:3 #, python-format msgid "Translations in all languages have been completed in %(component)s" -msgstr "" +msgstr "Преводи на свим језицима су завршени у %(component)s" #: weblate/templates/mail/translated_language_subject.txt:3 #, python-format @@ -9712,16 +9424,12 @@ msgid "Support status" msgstr "Стање подршке" #: weblate/templates/manage/index.html:42 -#, fuzzy -#| msgid "Weblate support status" msgid "Refresh support status" -msgstr "Стање Веблејт подршке" +msgstr "Освежите статус подршке" #: weblate/templates/manage/index.html:55 -#, fuzzy -#| msgid "Support status" msgid "Support package limits" -msgstr "Стање подршке" +msgstr "Ограничења пакета подршке" #: weblate/templates/manage/index.html:67 msgid "Support expiry" @@ -9834,11 +9542,11 @@ msgstr "Кашњење кеша" #: weblate/templates/manage/performance.html:163 msgid "Celery latency" -msgstr "" +msgstr "Celery кашњење" #: weblate/templates/manage/performance.html:164 msgid "Not yet measured" -msgstr "" +msgstr "Још није измерено" #: weblate/templates/manage/repos.html:6 #: weblate/wladmin/templates/admin/weblate-index.html:20 @@ -9846,10 +9554,8 @@ msgid "Status of repositories" msgstr "Статус складишта" #: weblate/templates/manage/repos.html:11 -#, fuzzy -#| msgid "This component is linked to the %(target)s repository." msgid "Show components with linked repositories" -msgstr "Ова компонента је везана за %(target)s складиште." +msgstr "Прикажи компоненте са повезаним складиштима" #: weblate/templates/manage/repos.html:17 msgid "This repository is linked to:" @@ -9907,28 +9613,23 @@ msgid "SSH keys" msgstr "SSH кључеви" #: weblate/templates/manage/ssh.html:22 -#, fuzzy, python-format -#| msgid "Generate SSH key" +#, python-format msgid "Generate %(key_type)s SSH key" -msgstr "Генериши ССХ кључ" +msgstr "Генеришите %(key_type)s SSH кључ" #: weblate/templates/manage/ssh.html:26 -#, fuzzy, python-format -#| msgid "" -#| "You don't seem to have existing SSH key, by pressing button below Weblate " -#| "will generate one for you." +#, python-format msgid "" "You don't seem to have existing %(key_type)s SSH key, by pressing button " "below Weblate will generate one for you." msgstr "" -"Изгледа да немате ССХ кључ. Притиском на дугме испод, Веблејт ће га " -"генерисати за вас." +"Чини се да немате постојећи %(key_type)s SSH кључ, притиском на дугме испод " +"Веблејт ће генерисати један за вас." #: weblate/templates/manage/ssh.html:32 -#, fuzzy, python-format -#| msgid "Generate SSH key" +#, python-format msgid "Generate new %(key_type)s SSH key" -msgstr "Генериши ССХ кључ" +msgstr "Генеришите нови %(key_type)s SSH кључ" #: weblate/templates/manage/ssh.html:44 msgid "Known host keys" @@ -9961,7 +9662,7 @@ msgstr "" #: weblate/templates/manage/teams.html:75 #, python-format msgid "This will delete the group %(name)s." -msgstr "" +msgstr "Ово ће обрисати групу %(name)s." #: weblate/templates/manage/teams.html:77 #, python-format @@ -9972,15 +9673,16 @@ msgid_plural "" "There are %(count)s members of this group. Deleting the group might affect " "their access." msgstr[0] "" +"Ова група има %(count)s члана. Брисање групе може утицати на њихов приступ." msgstr[1] "" +"Ова група има %(count)s члана. Брисање групе може утицати на њихов приступ." msgstr[2] "" +"Ова група има %(count)s чланова. Брисање групе може утицати на њихов приступ." #: weblate/templates/manage/teams.html:102 #: weblate/templates/trans/project-access.html:258 -#, fuzzy -#| msgid "Create new glossary" msgid "Create new team" -msgstr "Направи нови појмовник" +msgstr "Креирајте нови тим" #: weblate/templates/manage/tools.html:35 #: weblate/templates/manage/tools.html:42 @@ -10012,10 +9714,8 @@ msgid "Add new user" msgstr "Додај новог корисника" #: weblate/templates/manage/users.html:41 -#, fuzzy -#| msgid "Resend invitation" msgid "Pending invitations" -msgstr "Понови слање позивнице" +msgstr "Позивнице на чекању" #: weblate/templates/manage/users.html:77 #: weblate/templates/trans/project-access.html:103 @@ -10024,23 +9724,17 @@ msgstr "Понови слање позивнице" #: weblate/templates/manage/users.html:81 #: weblate/templates/trans/project-access.html:107 -#, fuzzy -#| msgid "Repository operation" msgid "Invitation link copied to clipboard." -msgstr "Операција складишта" +msgstr "Линк за позивницу је копиран у клипборд." #: weblate/templates/manage/users.html:85 #: weblate/templates/trans/project-access.html:111 -#, fuzzy -#| msgid "Resend invitation" msgid "Remove invitation" -msgstr "Понови слање позивнице" +msgstr "Уклоните позивницу" #: weblate/templates/matrix-table.html:13 -#, fuzzy -#| msgid "String age" msgid "String missing" -msgstr "Старост ниске" +msgstr "Ниска недостаје" #: weblate/templates/matrix.html:9 msgid "Matrix" @@ -10105,19 +9799,17 @@ msgstr[2] "Ово ће трајно обрисати %(count)s уноса из #: weblate/templates/memory/index.html:135 #: weblate/templates/memory/index.html:152 msgid "Rebuild" -msgstr "" +msgstr "Поново изгради" #: weblate/templates/memory/index.html:84 #: weblate/templates/memory/index.html:149 -#, fuzzy -#| msgid "The uploaded file will be merged with the current translation." msgid "Memory will be then populated with the current translations." -msgstr "Отпремљени фајл ће бити спојен са тренутним преводом." +msgstr "Меморија ће тада бити попуњена са тренутним преводима." #: weblate/templates/memory/index.html:164 #, python-format msgid "Entries for %(source_language)s to %(target_language)s" -msgstr "" +msgstr "Записи за %(source_language)s до %(target_language)s" #: weblate/templates/memory/index.html:175 msgid "Shared translation memory" @@ -10134,32 +9826,24 @@ msgid "off" msgstr "искључено" #: weblate/templates/memory/index.html:197 -#, fuzzy -#| msgid "Number of shared entries" msgid "Number of shared entries in this Weblate instance" -msgstr "Број дељених уноса" +msgstr "Број дељених уноса у овој Веблејт инстанци" #: weblate/templates/memory/index.html:209 -#, fuzzy -#| msgid "Total number of entries" msgid "Total number of entries in this Weblate instance" -msgstr "Укупан број уноса" +msgstr "Укупан број уноса у овој Веблејт инстанци" #: weblate/templates/memory/index.html:226 msgid "Import translation memory" msgstr "Увoз преводилачке меморије" #: weblate/templates/message.html:15 -#, fuzzy -#| msgid "New announcement" msgid "Delete announcement" -msgstr "Нова објава" +msgstr "Обрисати обавештење" #: weblate/templates/multi-progress.html:15 -#, fuzzy -#| msgid "Component is being updated…" msgid "Components are being updated…" -msgstr "Компонента се ажурира…" +msgstr "Компоненте се ажурирају…" #: weblate/templates/new-language.html:25 msgid "" @@ -10180,14 +9864,14 @@ msgid "" "all strings untranslated." msgstr "" "Преводни фајл ће бити креиран на основу %(new_base)s са свим " -"низовима непреведеним." +"нисмака непреведеним." #: weblate/templates/new-language.html:35 msgid "" "An empty translation file will be created and new strings added as they are " "translated." msgstr "" -"Празан преводни фајл ће бити креиран и нови низови ће бити додати како буду " +"Празан преводни фајл ће бити креиран и нове ниске ће бити додати како буду " "преведени." #: weblate/templates/new-language.html:40 @@ -10198,7 +9882,7 @@ msgid "" "translated." msgstr "" "Преводни фајл ће бити креиран као копија %(new_base)s са свим " -"низовима означеним као \"Потребно уређивање\" и замењени како буду преведени." +"нискама означеним као \"Потребно уређивање\" и замењени како буду преведени." #: weblate/templates/new-language.html:47 msgid "" @@ -10206,7 +9890,7 @@ msgid "" "created as strings are translated." msgstr "" "Празан директоријум ће бити креиран за преводе, са појединачним фајловима " -"који ће бити креирани како буду преведени низови." +"који ће бити креирани како буду преведене ниске." #: weblate/templates/new-language.html:54 msgid "" @@ -10283,10 +9967,8 @@ msgid "Color" msgstr "Боја" #: weblate/templates/project-labels.html:21 -#, fuzzy -#| msgid "Update source strings" msgid "Labeled source strings" -msgstr "Ажурирај изворне ниске" +msgstr "Означене изворне ниске" #: weblate/templates/project-labels.html:22 #: weblate/templates/snippets/embed-units.html:70 @@ -10298,14 +9980,13 @@ msgid "Add label" msgstr "Додај ознаку" #: weblate/templates/project.html:264 -#, fuzzy -#| msgid "Create project" msgid "Organize project" -msgstr "Направи пројекат" +msgstr "Организујте пројекат" #: weblate/templates/project.html:268 msgid "Renaming the project will also change URLs for all its components." msgstr "" +"Преименовање пројекта ће такође променити URL-ове за све његове компоненте." #: weblate/templates/projects.html:19 msgid "Ask for project hosting" @@ -10326,16 +10007,12 @@ msgid "Please try again later." msgstr "Покушајте поново касније." #: weblate/templates/registration/logged_out.html:14 -#, fuzzy -#| msgid "Thank you for using Weblate." msgid "Thank you for using Weblate" -msgstr "Хвала што користите Веблејт." +msgstr "Хвала вам што користите Веблејт" #: weblate/templates/registration/logged_out.html:17 -#, fuzzy -#| msgid "Show on dashboard" msgid "Return to dashboard" -msgstr "Прикажи на контролној табли" +msgstr "Вратите се на контролну таблу" #: weblate/templates/replace.html:13 msgid "Please review and confirm the search and replace results." @@ -10346,6 +10023,8 @@ msgid "" "Showing and replacing only the first 250 matches. Perform the replacement " "again to replace more." msgstr "" +"Приказује и замењује само првих 250 подударања. Извршите замену поново да " +"замените више." #: weblate/templates/screenshots/screenshot_detail.html:34 msgid "Assigned source strings" @@ -10394,10 +10073,8 @@ msgid "Add to screenshot" msgstr "Додај на снимак екрана" #: weblate/templates/screenshots/snippets/paste-button.html:4 -#, fuzzy -#| msgid "Repository operation" msgid "Paste from clipboard" -msgstr "Операција складишта" +msgstr "Налепите из клипборда" #: weblate/templates/search.html:25 #: weblate/templates/snippets/embed-units.html:114 @@ -10405,22 +10082,16 @@ msgid "No matching strings found." msgstr "Нема одговарајућих ниски." #: weblate/templates/snippets/about.html:3 -#, fuzzy -#| msgid "" -#| "Weblate is a web based translation tool with tight version control " -#| "integration. It features a simple and clean user interface, propagation " -#| "of translations across components, quality checks and automatic linking " -#| "to source files." msgid "" "Weblate is a web-based translation tool with tight version control " "integration. It features a simple and clean user interface, propagation of " "translations across components, quality checks and automatic linking to " "source files." msgstr "" -"Веблејт је слободан, веб оријентисан алат са тесном интеграцијом са системом " -"за контролу верзија. Има једноставно и прегледно окружење, простирање " -"превода кроз компоненте, проверу квалитета и аутоматско везивање за изворне " -"фајлове." +"Веблејт је веб-базирани алат за превођење са чврстом интеграцијом контроле " +"верзија. Карактерише га једноставан и чист кориснички интерфејс, пропагација " +"превода кроз компоненте, провере квалитета и аутоматско повезивање са " +"изворним фајловима." #: weblate/templates/snippets/about.html:5 #, python-format @@ -10434,17 +10105,13 @@ msgstr "" "донације." #: weblate/templates/snippets/activity.html:10 -#, fuzzy -#| msgid "Last month" msgid "Last 12 months" -msgstr "Прошли месец" +msgstr "Последњих 12 месеци" #: weblate/templates/snippets/activity.html:14 -#, fuzzy -#| msgid "Previous" msgctxt "Previous 12 months" msgid "Previous" -msgstr "Претходна" +msgstr "Претходни" #: weblate/templates/snippets/activity.html:16 msgid "Activity in last 12 months" @@ -10501,33 +10168,40 @@ msgid "" "While Weblate remains free for all users, its development requires " "continuous investment." msgstr "" +"Док Веблејт остаје бесплатан за све кориснике, његов развој захтева " +"континуирана улагања." #: weblate/templates/snippets/donate.html:4 msgid "We prioritize your privacy; we never display ads or sell your data." msgstr "" +"Приоритет дајемо вашој приватности; никада не приказујемо огласе и не " +"продајемо ваше податке." #: weblate/templates/snippets/donate.html:5 msgid "" "The invaluable support of the community through subscriptions and donations " "ensures that Weblate continues to grow and thrive." msgstr "" +"Невероватна подршка заједнице кроз претплате и донације осигурава да Веблејт " +"настави да расте и напредује." #: weblate/templates/snippets/donate.html:6 msgid "Join us in shaping the future of localization and contribute today!" msgstr "" +"Придружите нам се у обликовању будућности локализације и допринесите данас!" #: weblate/templates/snippets/donate.html:11 msgid "Purchase a support package" -msgstr "" +msgstr "Купите пакет подршке" #: weblate/templates/snippets/donate.html:13 msgid "Give to Weblate" -msgstr "Дај Weblate-у" +msgstr "Донирај Weblate-у" #: weblate/templates/snippets/editor.html:11 msgid "" "The maximal string length is determined from the source string or flags." -msgstr "Максимална дужина низа се одређује из изворног низа или застава." +msgstr "Максимална дужина ниске се одређује из изворне ниске или заставица." #: weblate/templates/snippets/editor.html:15 msgid "Source string length" @@ -10539,10 +10213,8 @@ msgid "Clone to translation" msgstr "Kloniraj do prevoda" #: weblate/templates/snippets/embed-units.html:48 weblate/utils/views.py:181 -#, fuzzy -#| msgid "Target strings" msgid "Target string" -msgstr "Циљне ниске" +msgstr "Циљна ниска" #: weblate/templates/snippets/embed-units.html:67 msgid "Assigned screenshots" @@ -10554,19 +10226,23 @@ msgstr "Учитавам резултате…" #: weblate/templates/snippets/enforced_2fa.html:7 msgid "Configure two-factor authentication" -msgstr "" +msgstr "Конфигуришите двофакторску аутентификацију" #: weblate/templates/snippets/enforced_2fa.html:9 msgid "" "This project requires two-factor authentication from all contributors. You " "won’t be able to contribute until you configure it." msgstr "" +"Овај пројекат захтева двофакторску аутентификацију од свих доприносиоца. " +"Нећете моћи да допринесете док не конфигуришете то." #: weblate/templates/snippets/enforced_2fa.html:11 msgid "" "You are a member of the team that requires two-factor authentication. You " "won’t be able to use any of its privileges until you configure 2FA." msgstr "" +"Ви сте члан тима који захтева двофакторску аутентификацију. Нећете моћи да " +"користите ниједну од његових привилегија док не конфигуришете 2FA." #: weblate/templates/snippets/git-info.html:10 #: weblate/trans/models/component.py:377 @@ -10626,16 +10302,12 @@ msgid "Edit glossary term" msgstr "Уреди термин појмовника" #: weblate/templates/snippets/glossary.html:38 -#, fuzzy -#| msgid "Translation notifications" msgid "Glossary translation explanation" -msgstr "Обавештења о преводима" +msgstr "Објашњење превода глосара" #: weblate/templates/snippets/glossary.html:47 -#, fuzzy -#| msgid "Source string location" msgid "Glossary string explanation" -msgstr "Локација изворне ниске" +msgstr "Објашњење ниске глосара" #: weblate/templates/snippets/glossary.html:56 msgid "No related strings found in the glossary." @@ -10709,10 +10381,8 @@ msgid "Translation suggestions are turned off." msgstr "Предлози за превод су искључени." #: weblate/templates/snippets/info.html:191 -#, fuzzy -#| msgid "Translation comment has been deleted." msgid "Translations are reviewed by dedicated reviewers." -msgstr "Коментар превода је обрисан." +msgstr "Преводи се прегледају од стране посвећених рецензената." #: weblate/templates/snippets/info.html:199 msgid "The translation uses monolingual files." @@ -10758,18 +10428,18 @@ msgstr "Прегледај све кориснике" #: weblate/templates/snippets/info.html:283 msgid "String statistics" -msgstr "Статистика низова" +msgstr "Статистика ниски" #: weblate/templates/snippets/info.html:289 msgid "Strings percent" -msgstr "Проценат низова" +msgstr "Проценат ниски" #: weblate/templates/snippets/info.html:290 #: weblate/templates/snippets/info.html:483 #: weblate/templates/snippets/info.html:520 msgctxt "Number of hosted strings" msgid "Hosted strings" -msgstr "Хостовани низови" +msgstr "Хостоване ниске" #: weblate/templates/snippets/info.html:291 msgid "Words percent" @@ -10792,15 +10462,11 @@ msgid "Hosted characters" msgstr "Смештени знакови" #: weblate/templates/snippets/info.html:299 -#, fuzzy -#| msgid "Total" msgctxt "Number of strings" msgid "Total" msgstr "Укупно" #: weblate/templates/snippets/info.html:309 -#, fuzzy -#| msgid "Source" msgctxt "Number of strings" msgid "Source" msgstr "Извор" @@ -10816,8 +10482,6 @@ msgid "Waiting for review" msgstr "Чека на преглед" #: weblate/templates/snippets/info.html:339 -#, fuzzy -#| msgid "Translated" msgctxt "Number of strings" msgid "Translated" msgstr "Преведено" @@ -10828,32 +10492,24 @@ msgid "Needs editing" msgstr "Треба уредити" #: weblate/templates/snippets/info.html:357 -#, fuzzy -#| msgid "Read only" msgctxt "Number of strings" msgid "Read-only" msgstr "Само за читање" #: weblate/templates/snippets/info.html:366 -#, fuzzy -#| msgid "Failing checks" msgctxt "Number of strings" msgid "Failing checks" -msgstr "Грешке при провери" +msgstr "Неуспеле провере" #: weblate/templates/snippets/info.html:375 -#, fuzzy -#| msgid "Strings with suggestions" msgctxt "Number of strings" msgid "Strings with suggestions" msgstr "Ниске са предлозима" #: weblate/templates/snippets/info.html:384 -#, fuzzy -#| msgid "Translated strings" msgctxt "Number of strings" msgid "Untranslated strings" -msgstr "Преведене ниске" +msgstr "Непреведене ниске" #: weblate/templates/snippets/info.html:400 msgid "Global numbers" @@ -10884,6 +10540,8 @@ msgid "" "You were invited to %(site_title)s by %(invitation_author)s to collaborate " "on %(project_name)s and join the %(team_name)s team." msgstr "" +"Позвани сте на %(site_title)s од %(invitation_author)s да сарађујете на " +"%(project_name)s и придружите се тиму %(team_name)s." #: weblate/templates/snippets/invite-info.html:6 #, python-format @@ -10891,6 +10549,8 @@ msgid "" "You were invited to %(site_title)s by %(invitation_author)s to join the " "%(team_name)s team." msgstr "" +"Позвани сте на %(site_title)s од %(invitation_author)s да се придружите тиму " +"%(team_name)s." #: weblate/templates/snippets/labels_description.html:7 #, python-format @@ -10915,32 +10575,26 @@ msgstr "" #: weblate/templates/snippets/libre-basic.html:7 msgid "Libre project with open-source code" -msgstr "" +msgstr "Слободан пројекат са отвореним изворним кодом" #: weblate/templates/snippets/libre-basic.html:9 -#, fuzzy, python-format -#| msgid "" -#| "Translated content has to be released under a license approved by OSI or " -#| "recognized as libre by FSF." +#, python-format msgid "" "Translated content has to be released under a license " "%(link_osi_start)sapproved by OSI%(link_end)s or " "%(link_fsf_start)srecognized as libre by FSF%(link_end)s." msgstr "" -"Преведени садржај мора бити издат под лиценцом одобреном од стране ОСИ или " -"прихваћеном као слободном од ФСФ." +"Преведени садржај мора бити објављен под лиценцом %(link_osi_start)" +"sодобреном од OSI%(link_end)s или %(link_fsf_start)sпризнатом као слободна " +"од FSF%(link_end)s." #: weblate/templates/snippets/libre-basic.html:10 -#, fuzzy -#| msgid "" -#| "All the source code has to be publicly available in a supported version " -#| "control system." msgid "" "All the source code has to be libre-licensed and publicly available in a " "supported version control system." msgstr "" -"Сав изворни кôд мора бити јавно доступан у подржаном систему контроле " -"верзија." +"Сав изворни код мора бити лиценциран као слободан и јавно доступан у " +"подржаном систему контроле верзија." #: weblate/templates/snippets/libre-basic.html:11 msgid "" @@ -10952,13 +10606,11 @@ msgstr "" #: weblate/templates/snippets/libre-basic.html:12 msgid "Non-code projects are welcome as well." -msgstr "Пројекти који нису кодирани су такође добродошли." +msgstr "Пројекти без кодирања су такође добродошли." #: weblate/templates/snippets/libre-basic.html:15 -#, fuzzy -#| msgid "Project to remove" msgid "Project approval" -msgstr "Пројекат за укљањање" +msgstr "Одобрење пројекта" #: weblate/templates/snippets/libre-basic.html:17 msgid "Using Weblate has been approved by the upstream project." @@ -10973,14 +10625,12 @@ msgstr "" "преводиоце и такође помоћи Веблејту да буде бесплатан за више пројеката." #: weblate/templates/snippets/libre-basic.html:21 -#, fuzzy -#| msgid "Watched projects" msgid "Established projects" -msgstr "Надгледани пројекти" +msgstr "Успостављени пројекти" #: weblate/templates/snippets/libre-basic.html:23 msgid "The project receives a reasonable number of contributions." -msgstr "" +msgstr "Пројекат прима разуман број доприноса." #: weblate/templates/snippets/libre-basic.html:24 msgid "The project has had active development for at least three months." @@ -10988,13 +10638,11 @@ msgstr "Пројекат је имао активан развој најмањ #: weblate/templates/snippets/libre-checklist.html:18 msgid "Review guidelines from the community localization checklist." -msgstr "" +msgstr "Прегледајте смернице из контролне листе локализације заједнице." #: weblate/templates/snippets/list-objects.html:35 -#, fuzzy -#| msgid "Add new projects" msgid "Add project" -msgstr "Додаје нове пројекте" +msgstr "Додај пројекат" #: weblate/templates/snippets/list-objects.html:39 #: weblate/templates/snippets/list-objects.html:50 @@ -11016,20 +10664,15 @@ msgstr "Одобрено" #: weblate/templates/snippets/list-objects.html:75 msgid "Unfinished" -msgstr "" +msgstr "Незавршено" #: weblate/templates/snippets/list-objects.html:85 -#, fuzzy -#| msgid "Untranslated words" msgid "Unfinished words" -msgstr "Непреведене речи" +msgstr "Незавршене речи" #: weblate/templates/snippets/list-objects.html:95 -#, fuzzy -#| msgctxt "Number of hosted characters" -#| msgid "Hosted characters" msgid "Unfinished characters" -msgstr "Смештени знакови" +msgstr "Незавршени карактери" #: weblate/templates/snippets/list-objects.html:105 msgid "Untranslated" @@ -11052,10 +10695,8 @@ msgid "Create translation" msgstr "Направи превод" #: weblate/templates/snippets/list-objects.html:193 -#, fuzzy -#| msgid "Could not add new translation file." msgid "Cannot add translation right now" -msgstr "Не могу да додам нови фајл превода." +msgstr "Не може се тренутно додати превод" #: weblate/templates/snippets/list-objects.html:197 #: weblate/templates/translate.html:24 weblate/templates/translation.html:131 @@ -11066,7 +10707,7 @@ msgstr "Преведи" #: weblate/templates/snippets/list-objects.html:247 #: weblate/templates/snippets/project-workflow-settings.html:11 msgid "Customized workflow" -msgstr "" +msgstr "Прилагођен радни ток" #: weblate/templates/snippets/list-objects.html:280 msgid "Nothing to list here." @@ -11089,6 +10730,8 @@ msgid "" "Quick overview of the Terms of Service and the Privacy Policy, but you " "should still read the original documents to fully understand them:" msgstr "" +"Брзи преглед Услова коришћења и Политике приватности, али ипак треба да " +"прочитате оригиналне документе да бисте их у потпуности разумели:" #: weblate/templates/snippets/login-info.html:27 msgid "" @@ -11100,18 +10743,14 @@ msgstr "" "систем за контролу верзија по лиценци одређеној за сваки пројекат." #: weblate/templates/snippets/login-info.html:31 -#, fuzzy -#| msgid "" -#| "By registering you agree to use your name and e-mail in version control " -#| "system commits and provide your contribution under license defined by " -#| "each translated project." msgid "" "By registering you agree to use your name in version control system commits " "and provide your contribution under license defined by each translated " "project." msgstr "" -"Региструјући се, слажете се да се ваше име и е-адреса користи при предаји на " -"систем за контролу верзија по лиценци одређеној за сваки пројекат." +"Регистрацијом се слажете да користите ваше име у урезивањима у систем за " +"контролу верзија и пружите ваш допринос под лиценцом дефинисаном од стране " +"сваког преведеног пројекта." #: weblate/templates/snippets/plural-formula.html:4 msgid "" @@ -11175,12 +10814,17 @@ msgid "" "announcement and/or lock it if you don’t want contributions until you finish " "the setup." msgstr "" +"Овај пројекат је у пробном периоду и јавно је доступан. Објавите обавештење " +"и/или закључајте га ако не желите доприносе док не завршите постављање." #: weblate/templates/snippets/project/billing-libre-trial.html:14 msgid "" "This project is in a trial period, be cautious while contributing. Setup can " "still change before being approved as a libre project." msgstr "" +"Овај пројекат је у пробном периоду, будите опрезни док доприносите. " +"Постављање може и даље да се промени пре него што буде одобрено као слободан " +"пројекат." #: weblate/templates/snippets/project/billing-trial.html:8 msgid "This project is in the trial period." @@ -11278,7 +10922,7 @@ msgstr "Све непреведене ниске додате у последњ #: weblate/templates/snippets/query-builder.html:111 msgid "Filter changed strings 2 weeks ago" -msgstr "" +msgstr "Филтер је променио низове пре 2 недеље" #: weblate/templates/snippets/query-builder.html:118 msgid "Translated strings in a certain language" @@ -11286,7 +10930,7 @@ msgstr "Преведене ниске у неком језику" #: weblate/templates/snippets/query-field.html:6 msgid "Filters" -msgstr "" +msgstr "Филтери" #: weblate/templates/snippets/query-field.html:15 #: weblate/templates/snippets/user-query-field.html:5 weblate/utils/forms.py:27 @@ -11298,8 +10942,8 @@ msgid "" "Don’t worry about messing up the strings. This is a two-step process showing " "a preview of edited strings before the actual change is confirmed." msgstr "" -"Не брините око кварења низова. Ово је процес у два корака који приказује " -"преглед уређених низова пре него што се стварна промена потврди." +"Не брините око кварења ниски. Ово је процес у два корака који приказује " +"преглед уређених ниски пре него што се стварна промена потврди." #: weblate/templates/snippets/settings-organize.html:6 #, python-format @@ -11307,6 +10951,8 @@ msgid "" "Organize the project to change its URL slug or " "remove it." msgstr "" +"Организуј пројекат да промениш његов URL слаг или да " +"га уклониш." #: weblate/templates/snippets/settings-organize.html:8 #, python-format @@ -11314,6 +10960,8 @@ msgid "" "Organize the component to change its URL slug, move " "or remove it." msgstr "" +"Организуј компоненту да промениш њен URL слаг, " +"преместиш или уклониш." #: weblate/templates/snippets/share-menu.html:6 msgid "Share" @@ -11330,16 +10978,12 @@ msgid "Translate %(object)s using %%23Weblate at %(share_url)s!" msgstr "Преведите %(object)s користећи %%23Weblate на %(share_url)s!" #: weblate/templates/snippets/share-menu.html:11 -#, fuzzy -#| msgid "Share on Facebook" msgid "Share on X" -msgstr "Подели на Фејсбуку" +msgstr "Делити на X" #: weblate/templates/snippets/share-menu.html:14 -#, fuzzy -#| msgid "Share on Facebook" msgid "Share on Fediverse" -msgstr "Подели на Фејсбуку" +msgstr "Делити на Федиверзуму" #: weblate/templates/snippets/share-menu.html:17 msgid "Engage page" @@ -11357,22 +11001,17 @@ msgid "Sort By" msgstr "Сортирај по" #: weblate/templates/snippets/sort-field.html:24 -#, fuzzy -#| msgid "Browse pending" msgid "Ascending" -msgstr "Прегледај наступајуће" +msgstr "Растуће" #: weblate/templates/snippets/sort-field.html:27 -#, fuzzy -#| msgid "Browse pending" msgid "Descending" -msgstr "Прегледај наступајуће" +msgstr "Опадајуће" #: weblate/templates/snippets/ssh-key.html:11 -#, fuzzy, python-format -#| msgid "Public SSH key" +#, python-format msgid "Public %(key_type)s SSH key" -msgstr "Јавни ССХ кључ" +msgstr "Јавни %(key_type)s SSH кључ" #: weblate/templates/snippets/ssh-key.html:16 msgid "" @@ -11383,28 +11022,25 @@ msgstr "" "кључ се налази испод, можете га користити да дате Веблејту приступ складишту." #: weblate/templates/snippets/ssh-key.html:24 -#, fuzzy, python-format -#| msgid "Download private key" +#, python-format msgid "Download %(key_type)s private key" -msgstr "Преузми лични кључ" +msgstr "Преузмите %(key_type)s приватни кључ" #: weblate/templates/snippets/ssh-key.html:37 -#, fuzzy -#| msgid "IP address" msgid "IP addresses" -msgstr "ИП адреса" +msgstr "IP адресе" #: weblate/templates/snippets/ssh-key.html:41 msgid "" "Weblate utilizes the IP addresses listed below to access repositories or " "initiate webhooks." msgstr "" +"Веблејт користи IP адресе наведене испод за приступ складиштима или " +"иницирање вебхукова." #: weblate/templates/snippets/ssh-key.html:46 -#, fuzzy -#| msgid "Repository operation" msgid "IP address copied to clipboard." -msgstr "Операција складишта" +msgstr "IP адреса копирана у клипборд." #. Translators: Name of event in the history #: weblate/templates/snippets/suggestions.html:12 @@ -11433,20 +11069,16 @@ msgid "Accept" msgstr "Прихвати" #: weblate/templates/snippets/suggestions.html:36 -#, fuzzy -#| msgid "Accept and edit" msgid "Accept and approve" -msgstr "Прихвати и уреди" +msgstr "Прихвати и одобри" #: weblate/templates/snippets/suggestions.html:38 msgid "Accept and edit" msgstr "Прихвати и уреди" #: weblate/templates/snippets/suggestions.html:45 -#, fuzzy -#| msgid "Delete suggestion" msgid "Reject suggestion" -msgstr "Обриши предлог" +msgstr "Одбиј предлог" #: weblate/templates/snippets/suggestions.html:58 msgid "Suggested change:" @@ -11454,11 +11086,9 @@ msgstr "Предложена измена:" #: weblate/templates/snippets/suggestions.html:63 #: weblate/trans/templatetags/translations.py:861 -#, fuzzy -#| msgid "Failing checks:" msgctxt "String state" msgid "Failing checks:" -msgstr "Грешке при провери:" +msgstr "Неуспешне провере:" #: weblate/templates/snippets/unit-readonly-badge.html:4 msgid "Source in review" @@ -11466,7 +11096,7 @@ msgstr "Извор у прегледу" #: weblate/templates/snippets/unit-readonly-badge.html:6 msgid "Source string editing is disabled." -msgstr "Уређивање изворног низа је онемогућено." +msgstr "Уређивање изворне ниске је онемогућено." #: weblate/templates/snippets/unit-readonly-badge.html:8 msgid "Source strings can’t be edited. You can delete them and add new ones." @@ -11474,7 +11104,7 @@ msgstr "Изворне ниске не могу бити уређене. Мож #: weblate/templates/snippets/unit-readonly-badge.html:10 msgid "The source string cannot be edited." -msgstr "Изворни низ не може бити уређен." +msgstr "Изворна ниска не може бити уређена." #: weblate/templates/snippets/user-list.html:21 weblate/utils/forms.py:122 msgid "Could not find any such user." @@ -11517,7 +11147,7 @@ msgstr "Надгледај %(component)s" #: weblate/templates/trans/alert/addonscripterror.html:4 msgid "Weblate could not execute script add-on." -msgstr "" +msgstr "Веблејт није могао да изврши скрипт додатка." #: weblate/templates/trans/alert/addonscripterror.html:6 #: weblate/templates/trans/alert/ambiguouslanguage.html:9 @@ -11579,6 +11209,8 @@ msgid "" "In case the above links work for you, they might just require " "authentication, and it is safe to dismiss this alert." msgstr "" +"У случају да горње везе раде за вас, можда само захтевају аутентификацију, и " +"безбедно је одбацити ово упозорење." #: weblate/templates/trans/alert/brokenbrowserurl.html:12 msgid "" @@ -11610,12 +11242,16 @@ msgid "" "The upstream repository was not found. Please check whether it exists and is " "accessible to Weblate." msgstr "" +"Узводно складиште није пронађено. Молимо проверите да ли постоји и да ли је " +"доступно Веблејту." #: weblate/templates/trans/alert/common-repo.html:8 msgid "" "The upstream repository could not be accessed. Please check whether it is " "accessible to Weblate." msgstr "" +"Узводно складиште није могло да се приступи. Молимо проверите да ли је " +"доступно Веблејту." #: weblate/templates/trans/alert/common-repo.html:12 msgid "" @@ -11623,18 +11259,25 @@ msgid "" "forge author permissions for the repository/branch or have to use the squash " "addon on this component in Weblate." msgstr "" +"Gerrit је забранио овај пуш. Можда ће ти бити потребан gerrit-налог који има " +"дозволе аутора за складиште/грану или ћеш морати да користиш squash додатак " +"на овој компоненти у Веблејту." #: weblate/templates/trans/alert/common-repo.html:16 msgid "" "The upstream repository could not be temporarily accessed. Please try it " "again later." msgstr "" +"Узводно складиште није могло привремено да се приступи. Молимо покушајте " +"поново касније." #: weblate/templates/trans/alert/common-repo.html:20 msgid "" "Your repository URL seems to miss credentials. Either provide them in the " "URL or use SSH with key based authentication." msgstr "" +"Ваша URL адреса складишта изгледа да нема акредитиве. Или их пружите у URL-у " +"или користите SSH са аутентификацијом заснованом на кључу." #: weblate/templates/trans/alert/common-repo.html:24 msgid "You might want to use following URL instead:" @@ -11646,32 +11289,37 @@ msgid "" "the component configuration to overwrite the remote repository after " "rebasing commits in Weblate." msgstr "" +"Можда ћете желети да изаберете Git са форсираним пушом као систем контроле " +"верзија у конфигурацији компоненте да бисте преписали удаљено складиште " +"након ребазирања урезивања у Веблејту." #: weblate/templates/trans/alert/common-repo.html:33 msgid "" "The Weblate repository is missing some commits from upstream. Perhaps it is " "not receiving notifications upon updates of the remote repository." msgstr "" +"Веблејт складишту недостају нека урезивања из узводног. Можда не прима " +"обавештења о новостима удаљеног складишта." #: weblate/templates/trans/alert/common-repo.html:37 msgid "" "Weblate will retry the operation once it is needed again, so the alert might " "disappear for the temporary issues." msgstr "" +"Веблејт ће поново покушати операцију када буде поново потребна, тако да " +"упозорење може нестати због привремених проблема." #: weblate/templates/trans/alert/duplicatefilemask.html:3 msgid "Some linked components have the same file mask." -msgstr "" +msgstr "Неке повезане компоненте имају исту фајл маску." #: weblate/templates/trans/alert/duplicatefilemask.html:4 msgid "Please fix this by removing one of them." msgstr "Средите ово уклањањем једне од њих." #: weblate/templates/trans/alert/duplicatefilemask.html:7 -#, fuzzy -#| msgid "The following filemasks were found multiple times:" msgid "The following file masks were found multiple times:" -msgstr "Следеће маске фајлова се појављују више пута:" +msgstr "Следеће маске фајлова су пронађене више пута:" #: weblate/templates/trans/alert/duplicatelanguage.html:6 msgid "The component contains translation file for the source language." @@ -11739,14 +11387,12 @@ msgid "Language codes" msgstr "Кодови језика" #: weblate/templates/trans/alert/duplicatelanguage.html:41 -#, fuzzy -#| msgid "Filename" msgid "File names" -msgstr "Назив фајла" +msgstr "Имена фајлова" #: weblate/templates/trans/alert/duplicatestring.html:4 msgid "The component contains several duplicated translation strings." -msgstr "Компонента садржи неколико дуплираних преводних низова." +msgstr "Компонента садржи неколико дуплираних преводних ниски." #: weblate/templates/trans/alert/duplicatestring.html:10 #: weblate/templates/translate.html:309 weblate/templates/translate.html:390 @@ -11758,7 +11404,7 @@ msgid "" "Please fix this by removing duplicated strings with same identifier from the " "translation files." msgstr "" -"Молимо поправите ово уклањањем дуплираних низова са истим идентификатором из " +"Молимо поправите ово уклањањем дуплираних ниски са истим идентификатором из " "преводних фајлова." #: weblate/templates/trans/alert/inexistantfiles.html:4 @@ -11787,12 +11433,16 @@ msgid "" "Using monolingual files as a glossary is not recommended because adding " "strings to target language only is not possible in monolingual files." msgstr "" +"Употреба једнојезичних фајлова као глосара није препоручена јер додавање " +"ниски само у мета језик није могуће у једнојезичним фајловима." #: weblate/templates/trans/alert/monolingualglossary.html:6 msgid "" "You can continue using the glossary this way, but some features will be " "unavailable." msgstr "" +"Можете наставити да користите глосар на овај начин, али неке функције ће " +"бити недоступне." #: weblate/templates/trans/alert/monolingualtranslation.html:2 msgid "" @@ -11819,6 +11469,8 @@ msgid "" "Starting new translations directly in Weblate is possible, and creates files " "based on the file mask." msgstr "" +"Покретање нових превода директно у Веблејту је могуће и ствара фајлове на " +"основу маске фајла." #: weblate/templates/trans/alert/nomaskmatches.html:8 #, python-format @@ -11826,6 +11478,8 @@ msgid "" "Check whether the file mask %(filemask)s matches files in your " "version control system repository." msgstr "" +"Проверите да ли фајл маска %(filemask)s одговара фајловима у " +"вашем складишту система за контролу верзија." #. Translators: This is shown when an alert contains too many occurrences, the count will be always at least 100 #: weblate/templates/trans/alert/occurrences-limit.html:5 @@ -11848,10 +11502,8 @@ msgid "Weblate could not push changes to the upstream repository." msgstr "Веблејт не може да дотури измене у изворно складиште." #: weblate/templates/trans/alert/pushfailure.html:13 -#, fuzzy -#| msgid "Reset repository" msgid "Push the repository" -msgstr "Ресетуј складиште" +msgstr "Пушујте складиште" #: weblate/templates/trans/alert/repositorychanges.html:4 msgid "" @@ -11893,7 +11545,7 @@ msgstr[2] "Компонента није примила никакав прев #: weblate/templates/trans/alert/unusedcomponent.html:5 msgid "Please consider removing the component if it is no longer useful." -msgstr "" +msgstr "Молимо вас да размотрите уклањање компоненте ако више није корисна." #: weblate/templates/trans/alert/unusedenforcedcheck.html:4 msgid "Following enforced checks are not used anywhere:" @@ -11902,7 +11554,7 @@ msgstr "Следеће провере се нигде не користе:" #: weblate/templates/trans/alert/unusedenforcedcheck.html:9 #, python-format msgid "%(check)s quality check is enforced, but it is not available." -msgstr "" +msgstr "%(check)s провера квалитета је примењена, али није доступна." #: weblate/templates/trans/alert/unusedenforcedcheck.html:11 #, python-format @@ -11910,16 +11562,20 @@ msgid "" "%(check)s quality check is enforced, but not turned on using %(flag)s flag." msgstr "" +"%(check)s провера квалитета је примењена, али није укључена користећи " +"%(flag)s заставицу." #: weblate/templates/trans/alert/unusedenforcedcheck.html:17 msgid "" "The check can be turned on by adding the corresponding flag to string or " "component flags." msgstr "" +"Провера се може укључити додавањем одговарајуће заставице низу или " +"заставицама компоненте." #: weblate/templates/trans/alert/unusedscreenshot.html:2 msgid "At least one screenshot has no string assigned to it." -msgstr "" +msgstr "Најмање један снимак екрана нема додељену ниску." #: weblate/templates/trans/alert/unusedscreenshot.html:4 msgid "Manage screenshots" @@ -11931,37 +11587,29 @@ msgstr "" "Веблејт није могао да преузме узводне промене приликом ажурирања складишта." #: weblate/templates/trans/alert/updatefailure.html:13 -#, fuzzy -#| msgid "Update VCS repository" msgid "Update the repository" -msgstr "Ажурирај ВЦС складиште" +msgstr "Ажурирајте складиште" #: weblate/templates/trans/backups.html:21 -#, fuzzy -#| msgid "There are no addons currently installed." msgid "There are currently no backups." -msgstr "Тренутно нема инсталираних додатака." +msgstr "Тренутно нема резервних копија." #: weblate/templates/trans/backups.html:28 #: weblate/templates/trans/backups.html:37 -#, fuzzy -#| msgid "Perform backup" msgid "Trigger backup" -msgstr "Направи резервну копију" +msgstr "Окидач резервне копије" #: weblate/templates/trans/backups.html:32 -#, fuzzy -#| msgid "The translation will be updated in the background." msgid "Backup will be generated in the background." -msgstr "Превод ће бити освежен у позадини." +msgstr "Резервна копија ће бити генерисана у позадини." #: weblate/templates/trans/backups.html:33 #, python-format msgid "Backups are removed after %(keep_days)s day." msgid_plural "Backups are removed after %(keep_days)s days." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Резервне копије се уклањају након %(keep_days)s дан." +msgstr[1] "Резервне копије се уклањају након %(keep_days)s дана." +msgstr[2] "Резервне копије се уклањају након %(keep_days)s дана." #: weblate/templates/trans/change_list.html:11 #: weblate/templates/trans/change_list.html:13 @@ -12059,8 +11707,8 @@ msgid "" "Create a new translation component from an uploaded ZIP file containing " "strings for translation." msgstr "" -"Креирајте нову компоненту превода из отпремљеног ZIP фајла који садржи " -"низове за превод." +"Креирајте нову компоненту превода из отпремљеног ZIP фајла који садржи ниске " +"за превод." #: weblate/templates/trans/component_create.html:92 msgid "The filenames within the archive need to have locale codes in them." @@ -12137,10 +11785,8 @@ msgstr "Следеће компоненте превода биће уклоње #: weblate/templates/trans/delete-category.html:21 #: weblate/templates/trans/delete-project.html:23 -#, fuzzy -#| msgid "The following translations will be removed:" msgid "The following translation categories will be removed:" -msgstr "Следећи преводи биће уклоњени:" +msgstr "Следеће категорије превода ће бити уклоњене:" #: weblate/templates/trans/delete-category.html:31 #: weblate/templates/trans/delete-project.html:33 @@ -12170,6 +11816,8 @@ msgid "" "This action cannot be undone. This will permanently delete the %(object)s " "category and all related content." msgstr "" +"Ова акција не може бити поништена. Ово ће трајно обрисати %(object)s " +"категорију и сав повезани садржај." #: weblate/templates/trans/delete-project.html:10 #, python-format @@ -12184,12 +11832,16 @@ msgid "" "The “Add missing languages” add-on is installed on this component, a removed " "language might be re-added by it again." msgstr "" +"Додатак “Додај недостајуће језике” је инсталиран на овој компоненти, " +"уклоњени језик може бити поново додат." #: weblate/templates/trans/delete-translation.html:11 msgid "" "The glossary component automatically maintains translation for each language " "used in the project, a removed language might be re-added again." msgstr "" +"Глосарна компонента аутоматски одржава превод за сваки језик коришћен у " +"пројекту, уклоњени језик може бити поново додат." #: weblate/templates/trans/delete-translation.html:16 #, python-format @@ -12210,7 +11862,7 @@ msgstr "Откривени формат фајла није подржан." #: weblate/templates/trans/guide/addon.html:3 msgid "Enable add-on:" -msgstr "" +msgstr "Омогућити додатак:" #: weblate/templates/trans/merge_instructions.html:6 msgid "Typical workflow for fixing merge conflicts" @@ -12219,7 +11871,7 @@ msgstr "Типичан ток рада за решавање конфликат #: weblate/templates/trans/merge_instructions.html:10 msgid "" "Open an existing checkout of the upstream repository or perform a fresh one." -msgstr "" +msgstr "Отвори постојећи checkout узводног складишта или изврши нови." #: weblate/templates/trans/merge_instructions.html:13 msgid "" @@ -12236,10 +11888,8 @@ msgid "Merge Weblate changes and resolve any conflicts." msgstr "Спојите Веблејт промене и решите све конфликте." #: weblate/templates/trans/merge_instructions.html:26 -#, fuzzy -#| msgid "Rebase Weblate changes onto the remote repository" msgid "Rebase Weblate changes on top of upstream and resolve any conflicts." -msgstr "Пресложи Веблејт измене у удаљено складиште" +msgstr "Ребејзујте Веблејт промене на врху узводног и решите све конфликте." #: weblate/templates/trans/merge_instructions.html:31 msgid "Push changes into upstream repository." @@ -12275,13 +11925,12 @@ msgstr "Закључано" #: weblate/templates/trans/project-access-row.html:69 #, python-format msgid "Edit team membership for %(username)s" -msgstr "" +msgstr "Уредити чланство у тиму за %(username)s" #: weblate/templates/trans/project-access.html:92 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation for %(email)s" -msgstr "Позивница на %(site_title)s" +msgstr "Позивница за %(email)s" #: weblate/templates/trans/project-access.html:121 msgid "" @@ -12305,7 +11954,7 @@ msgstr "Позови" #: weblate/templates/trans/project-access.html:235 #, python-format msgid "This will delete the team %(name)s from this project." -msgstr "" +msgstr "Ово ће обрисати тим %(name)s из овог пројекта." #: weblate/templates/trans/project-access.html:237 #, python-format @@ -12316,8 +11965,14 @@ msgid_plural "" "This team contains %(count)s members. Deleting the team might affect their " "access to the project." msgstr[0] "" +"Овај тим има %(count)s члана. Брисање тима може утицати на њихов приступ " +"пројекту." msgstr[1] "" +"Овај тим има %(count)s члана. Брисање тима може утицати на њихов приступ " +"пројекту." msgstr[2] "" +"Овај тим има %(count)s чланова. Брисање тима може утицати на њихов приступ " +"пројекту." #: weblate/templates/trans/project-access.html:303 msgid "Create a project token" @@ -12346,27 +12001,21 @@ msgid "You currently do not have permission to create projects." msgstr "Тренутно немате дозволе да правите пројекте." #: weblate/templates/trans/project_form.html:24 -#, fuzzy -#| msgid "Promoting translation projects" msgid "Import translation project" -msgstr "Промоција пројеката превода" +msgstr "Увоз пројекта превода" #: weblate/templates/trans/project_import.html:8 -#, fuzzy -#| msgid "Create project" msgid "Import project" -msgstr "Направи пројекат" +msgstr "Увоз пројекта" #: weblate/templates/trans/project_import_info.html:5 -#, fuzzy -#| msgid "Perform backup" msgid "Importing backup" -msgstr "Направи резервну копију" +msgstr "Увоз резервне копије" #: weblate/templates/trans/project_import_info.html:7 #, python-format msgid "Created on %(server)s (%(domain)s) by Weblate %(version)s" -msgstr "" +msgstr "Креирано на %(server)s (%(domain)s) од Веблејт %(version)s" #: weblate/templates/trans/projecttoken-created.html:4 msgid "Token copied to clipboard." @@ -12381,6 +12030,8 @@ msgstr "Копирај токен у клипборд" msgid "" "Token created. Please save it now, as it won't be displayed again: %(token)s" msgstr "" +"Токен креиран. Молимо вас сачувајте га одмах, јер неће бити приказан поново: " +"%(token)s" #: weblate/templates/trans/repo_help.html:2 msgid "" @@ -12395,10 +12046,8 @@ msgstr "" "компоненту превода." #: weblate/templates/translate.html:51 -#, fuzzy -#| msgid "Edit in Zen mode" msgid "Open in Zen mode" -msgstr "Уреди у зен режиму" +msgstr "Отвори у Zen режиму" #: weblate/templates/translate.html:51 weblate/templates/translation.html:204 #: weblate/templates/zen.html:22 @@ -12452,10 +12101,8 @@ msgid "Add variant of this string" msgstr "Додај варијанту ове ниске" #: weblate/templates/translate.html:199 -#, fuzzy -#| msgid "Add as translation" msgid "Add alternative translation" -msgstr "Додај као превод" +msgstr "Додај алтернативни превод" #: weblate/templates/translate.html:213 msgid "Save and continue" @@ -12532,30 +12179,30 @@ msgstr "Разлика у односу на тренутну ниску" #: weblate/templates/translate.html:322 msgid "This string has the same context and source." msgid_plural "These strings have the same context and source." -msgstr[0] "Овај низ има исти контекст и извор." -msgstr[1] "Ова низа имају исти контекст и извор." -msgstr[2] "Ових низова имају исти контекст и извор." +msgstr[0] "Ова ниска има исти контекст и извор." +msgstr[1] "Ове ниске имају исти контекст и извор." +msgstr[2] "Ове ниске имају исти контекст и извор." #: weblate/templates/translate.html:330 msgid "This string has a different context, but the same source." msgid_plural "These strings have differing context, but the same source." -msgstr[0] "Овај низ има другачији контекст, али исти извор." -msgstr[1] "Ова низа имају другачији контекст, али исти извор." -msgstr[2] "Ових низова имају другачији контекст, али исти извор." +msgstr[0] "Ова ниска има другачији контекст, али исти извор." +msgstr[1] "Ове ниске имају другачији контекст, али исти извор." +msgstr[2] "Ове ниске имају другачији контекст, али исти извор." #: weblate/templates/translate.html:338 msgid "This string has a different source, but the same context." msgid_plural "These strings have differing sources, but the same context." -msgstr[0] "Овај низ има другачији извор, али исти контекст." -msgstr[1] "Ова низа имају другачији извор, али исти контекст." -msgstr[2] "Ових низова имају другачији извор, али исти контекст." +msgstr[0] "Ова ниска има другачији извор, али исти контекст." +msgstr[1] "Ове ниске имају другачији извор, али исти контекст." +msgstr[2] "Ове ниске имају другачији извор, али исти контекст." #: weblate/templates/translate.html:346 msgid "This string has a different source and context." msgid_plural "These strings have differing sources and context." -msgstr[0] "Овај низ има другачији извор и контекст." -msgstr[1] "Ова низа имају различите изворе и контекст." -msgstr[2] "Ових низова имају различите изворе и контекст." +msgstr[0] "Ова ниска има другачији извор и контекст." +msgstr[1] "Ове ниске имају различите изворе и контекст." +msgstr[2] "Ове ниске имају различите изворе и контекст." #: weblate/templates/translate.html:356 msgid "Apply selected translation to all propagated strings" @@ -12566,10 +12213,8 @@ msgid "Apply selected translation to current string" msgstr "Примени изабрани превод на тренутну ниску" #: weblate/templates/translate.html:372 -#, fuzzy -#| msgid "Browse all translation changes" msgid "Browse all string changes" -msgstr "Прегледај све измене превода" +msgstr "Прегледајте све промене низова" #: weblate/templates/translate.html:389 msgid "Suggested change" @@ -12618,17 +12263,15 @@ msgstr "За све језике" #: weblate/templates/translate.html:509 msgid "Selecting this option will set the corresponding ignore flag." -msgstr "" +msgstr "Избор ове опције ће поставити одговарајућу заставицу за игнорисање." #: weblate/templates/translate.html:538 -#, fuzzy, python-format -#| msgid "There is %(count)s comment for this string." -#| msgid_plural "There are %(count)s comments for this string." +#, python-format msgid "There is %(count)s unresolved comment for this string." msgid_plural "There are %(count)s unresolved comments for this string." -msgstr[0] "Постоји %(count)s коментар за ову ниску." -msgstr[1] "Постоје %(count)s коментара за ову ниску." -msgstr[2] "Постоји %(count)s коментара за ову ниску." +msgstr[0] "Дошло је %(count)s нерешен коментар за ову ниску." +msgstr[1] "Дошло је %(count)s нерешена коментара за ову ниску." +msgstr[2] "Дошло је %(count)s нерешених коментара за ову ниску." #: weblate/templates/translate.html:552 #, python-format @@ -12650,7 +12293,7 @@ msgstr "Додај појам у појмовник" #: weblate/templates/translate.html:600 msgid "String information" -msgstr "Информације о низу" +msgstr "Информације о ниски" #: weblate/templates/translate.html:612 msgid "No screenshot currently associated." @@ -12677,10 +12320,8 @@ msgid "String age" msgstr "Старост ниске" #: weblate/templates/translate.html:695 weblate/utils/views.py:183 -#, fuzzy -#| msgid "Last change" msgid "Last updated" -msgstr "Последња промена" +msgstr "Последње ажурирано" #: weblate/templates/translate.html:701 msgid "Source string age" @@ -12749,14 +12390,12 @@ msgstr "Речи" #: weblate/templates/translation.html:145 #: weblate/templates/translation.html:172 -#, fuzzy -#| msgid "Control characters" msgid "Characters" -msgstr "Контролни знакови" +msgstr "Карактери" #: weblate/templates/translation.html:153 msgid "This translation is being used as source strings within this component." -msgstr "Овај превод се користи као изворни низови унутар ове компоненте." +msgstr "Овај превод се користи као изворне ниске унутар ове компоненте." #: weblate/templates/translation.html:163 msgid "Strings status" @@ -12817,7 +12456,7 @@ msgid "" "All strings, converted files enriched with comments; suitable for offline " "translation" msgstr "" -"Сви низови, конвертовани фајлови обогаћени коментарима; погодни за офлајн " +"Све ниске, конвертовани фајлови обогаћени коментарима; погодни за офлајн " "превод" #: weblate/templates/translation.html:385 @@ -12825,6 +12464,8 @@ msgid "" "Unfinished strings, converted files enriched with comments; suitable for " "offline translation" msgstr "" +"Незавршене ниске, конвертовани фајлови обогаћени коментарима; погодни за " +"офлајн превод" #: weblate/templates/translation.html:427 msgid "The uploaded file will be merged with the current translation." @@ -12835,6 +12476,7 @@ msgid "" "Select it from the dropdown menu if you want to overwrite already translated " "strings." msgstr "" +"Изаберите га из падајућег менија ако желите да препишете већ преведене ниске." #: weblate/templates/translation.html:455 msgid "" @@ -12843,44 +12485,33 @@ msgid "" msgstr "Порука се приказује на страници за превођење, до истека или брисања." #: weblate/templates/weblate_auth/invitation_detail.html:9 -#, fuzzy -#| msgid "Resend invitation" msgid "Invitations" -msgstr "Понови слање позивнице" +msgstr "Позивнице" #: weblate/templates/weblate_auth/invitation_detail.html:10 -#, fuzzy -#| msgid "Resend invitation" msgid "Invitation" -msgstr "Понови слање позивнице" +msgstr "Позивница" #: weblate/templates/weblate_auth/invitation_detail.html:18 -#, fuzzy -#| msgid "Donate to Weblate" msgid "Invitation to Weblate" -msgstr "Донирајте Weblate-у" +msgstr "Позивница за Веблејт" #: weblate/templates/weblate_auth/invitation_detail.html:21 -#, fuzzy -#| msgid "Please sign in to see the alerts." msgid "Please sign-in to view this invitation." -msgstr "Пријавите се да видите упозорења." +msgstr "Молимо вас да се пријавите да бисте видели ову позивницу." #: weblate/templates/weblate_auth/invitation_detail.html:23 msgid "This invitation belongs to a different user." -msgstr "" +msgstr "Ова позивница припада другом кориснику." #: weblate/templates/weblate_auth/invitation_detail.html:41 -#, fuzzy, python-format -#| msgid "Invitation to %(site_title)s" +#, python-format msgid "Invitation to %(project_name)s" -msgstr "Позивница на %(site_title)s" +msgstr "Позивница за %(project_name)s" #: weblate/templates/weblate_auth/invitation_detail.html:47 -#, fuzzy -#| msgid "Resend invitation" msgid "Accept invitation" -msgstr "Понови слање позивнице" +msgstr "Прихвати позивницу" #: weblate/templates/widgets.html:6 msgid "Widgets" @@ -12934,10 +12565,8 @@ msgid "BBCode" msgstr "ББ кôд" #: weblate/templates/widgets.html:59 -#, fuzzy -#| msgid "Markdown text" msgid "Markdown" -msgstr "Маркдаун текст" +msgstr "Markdown" #: weblate/templates/widgets.html:60 weblate/trans/forms.py:1302 msgid "reStructuredText" @@ -13001,7 +12630,7 @@ msgstr "Контролни знакови" #: weblate/trans/autofixes/chars.py:80 msgid "Devanagari danda" -msgstr "" +msgstr "Деванагари данда" #: weblate/trans/autofixes/custom.py:31 msgid "Apostrophes in Java MessageFormat" @@ -13021,10 +12650,8 @@ msgstr "" "Овај сајт покреће Веблејт ради локализације разних софтверских пројеката." #: weblate/trans/discovery.py:300 -#, fuzzy -#| msgid "View translation component" msgid "File mask matches the main component." -msgstr "Погледај компоненте превода" +msgstr "Фајл маска одговара главној компоненти." #: weblate/trans/discovery.py:308 #, python-brace-format @@ -13050,10 +12677,8 @@ msgid "Read-only strings" msgstr "Низови само за читање" #: weblate/trans/filter.py:25 weblate/trans/filter.py:122 -#, fuzzy -#| msgid "Translated strings" msgid "Untranslated strings" -msgstr "Преведене ниске" +msgstr "Непреведене ниске" #: weblate/trans/filter.py:28 weblate/trans/filter.py:125 msgid "Strings marked for edit" @@ -13064,10 +12689,8 @@ msgid "Strings with variants" msgstr "Ниске са варијантама" #: weblate/trans/filter.py:31 -#, fuzzy -#| msgid "Strings with comments" msgid "Strings with screenshots" -msgstr "Ниске са коментарима" +msgstr "Ниске са снимцима екрана" #: weblate/trans/filter.py:32 msgid "Strings with labels" @@ -13078,10 +12701,8 @@ msgid "Strings with context" msgstr "Ниске са контекстом" #: weblate/trans/filter.py:36 weblate/trans/filter.py:127 -#, fuzzy -#| msgid "Approved strings with suggestions" msgid "Unfinished strings without suggestions" -msgstr "Одобрене ниске са предлозима" +msgstr "Незавршене ниске без предлога" #: weblate/trans/filter.py:43 msgid "Translated strings with any failing checks" @@ -13100,10 +12721,8 @@ msgid "Strings waiting for review" msgstr "Ниске које чекају оверу" #: weblate/trans/filter.py:64 -#, fuzzy -#| msgid "Strings with comments" msgid "Strings without screenshots" -msgstr "Ниске са коментарима" +msgstr "Ниске без снимка екрана" #: weblate/trans/filter.py:67 msgid "Strings without a label" @@ -13126,14 +12745,12 @@ msgid "Labeled: {}" msgstr "означено: {}" #: weblate/trans/forms.py:155 -#, fuzzy -#| msgid "Invalid image!" msgid "Invalid date!" -msgstr "Неисправна слика!" +msgstr "Неважећи датум!" #: weblate/trans/forms.py:164 msgid "The starting date has to be before the ending date." -msgstr "" +msgstr "Почетни датум мора бити пре завршног датума." #: weblate/trans/forms.py:188 msgid "Invalid checksum specified!" @@ -13144,10 +12761,8 @@ msgid "Toggle text direction" msgstr "Пребаци правац текста" #: weblate/trans/forms.py:364 -#, fuzzy -#| msgid "Create translation" msgid "Alternative translation" -msgstr "Направи превод" +msgstr "Алтернативни превод" #: weblate/trans/forms.py:428 msgid "Search filter" @@ -13179,31 +12794,27 @@ msgstr "Стање прегледа" #: weblate/trans/forms.py:509 weblate/trans/models/unit.py:400 msgid "Additional explanation to clarify meaning or usage of the string." -msgstr "Додатно објашњење за разјашњење значења или употребе низа." +msgstr "Додатно објашњење за разјашњење значења или употребе ниски." #: weblate/trans/forms.py:560 -#, fuzzy -#| msgid "Source string location" msgid "Source string explanation" -msgstr "Локација изворне ниске" +msgstr "Објашњење изворне ниске" #: weblate/trans/forms.py:562 -#, fuzzy -#| msgid "Translation notifications" msgid "Translation explanation" -msgstr "Обавештења о преводима" +msgstr "Објашњење превода" #: weblate/trans/forms.py:579 msgid "The source string has changed meanwhile. Please check your changes." msgstr "" +"Изворна ниска се променила у међувремену. Молимо вас проверите ваше промене." #: weblate/trans/forms.py:590 -#, fuzzy -#| msgid "Translations of this string in the other languages" msgid "" "The translation of the string has changed meanwhile. Please check your " "changes." -msgstr "Преводи ове ниске на другим језицима" +msgstr "" +"Превод ниске се променио у међувремену. Молимо вас проверите ваше промене." #: weblate/trans/forms.py:601 msgid "Translation text too long!" @@ -13242,20 +12853,16 @@ msgid "Add new strings" msgstr "Додај нове ниске" #: weblate/trans/forms.py:673 -#, fuzzy -#| msgid "Processing of strings needing edit" msgid "Processing of \"Needs editing\" strings" -msgstr "Обрада ниски које треба уредити" +msgstr "Обрада \"Потребно уређивање\" ниски" #: weblate/trans/forms.py:675 msgid "Do not import" msgstr "Не увози" #: weblate/trans/forms.py:676 -#, fuzzy -#| msgid "Needs editing" msgid "Import as \"Needs editing\"" -msgstr "Треба уредити" +msgstr "Увези као \"Потребно уређивање\"" #: weblate/trans/forms.py:677 msgid "Import as translated" @@ -13272,22 +12879,16 @@ msgid "" msgstr "Да ли уписати преко постојећих превода ако је ниска већ преведена." #: weblate/trans/forms.py:708 -#, fuzzy -#| msgid "Update only non translated strings" msgid "Change only untranslated strings" -msgstr "Ажурирај само непреведене ниске" +msgstr "Промени само непреведене ниске" #: weblate/trans/forms.py:709 -#, fuzzy -#| msgid "Translated strings" msgid "Change translated strings" -msgstr "Преведене ниске" +msgstr "Промени преведене ниске" #: weblate/trans/forms.py:712 -#, fuzzy -#| msgid "Update translated and approved strings" msgid "Change translated and approved strings" -msgstr "Ажурирај преведене и одобрене ниске" +msgstr "Промени преведене и одобрене ниске" #: weblate/trans/forms.py:723 msgid "Author name" @@ -13298,10 +12899,8 @@ msgid "Author e-mail" msgstr "Е-пошта аутора" #: weblate/trans/forms.py:880 -#, fuzzy -#| msgid "Could not update the repository." msgid "Could not find the merged string." -msgstr "Неуспело ажурирање складишта." +msgstr "Не може се пронаћи спојена ниска." #: weblate/trans/forms.py:885 msgid "Could not find merged string." @@ -13320,13 +12919,11 @@ msgid "" "Please note that translating all strings will discard all existing " "translations." msgstr "" -"Имајте на уму да ће превођење свих низова одбацити све постојеће преводе." +"Имајте на уму да ће превођење свих ниски одбацити све постојеће преводе." #: weblate/trans/forms.py:925 -#, fuzzy -#| msgid "Perform automatic translation" msgid "Source of automated translations" -msgstr "Обавља аутоматско превођење" +msgstr "Извор аутоматских превода" #: weblate/trans/forms.py:927 msgid "Other translation components" @@ -13357,16 +12954,16 @@ msgid "" "Enter slug of a component to use as source, keep blank to use all components " "in the current project." msgstr "" +"Унесите слаг компоненте за употребу као извор, оставите празно да користите " +"све компоненте у тренутном пројекту." #: weblate/trans/forms.py:993 msgid "All components in current project" msgstr "Све компоненте у тренутном пројекту" #: weblate/trans/forms.py:1028 -#, fuzzy -#| msgid "Add as needing edit" msgid "Add as \"Needing edit\"" -msgstr "Додај тако да треба уредити" +msgstr "Додај као \"Потребно уређивање\"" #: weblate/trans/forms.py:1051 weblate/trans/forms.py:1056 #: weblate/trans/forms.py:1061 @@ -13375,12 +12972,13 @@ msgstr "Компонента није пронађена!" #: weblate/trans/forms.py:1068 msgid "Source component needs to have same source language as target one." -msgstr "" +msgstr "Изворна компонента мора имати исти изворни језик као мета." #: weblate/trans/forms.py:1080 msgid "" "Is your comment specific to this translation, or generic for all of them?" msgstr "" +"Да ли је ваш коментар специфичан за овај превод, или је општи за све њих?" #: weblate/trans/forms.py:1091 msgid "Source string comment, suggestions for changes to this string" @@ -13405,7 +13003,7 @@ msgstr "Изаберите" #: weblate/trans/forms.py:1269 msgid "Allow user to add or remove users from a team." -msgstr "" +msgstr "Дозволите кориснику да додаје или уклања кориснике из тима." #: weblate/trans/forms.py:1281 msgid "Block duration" @@ -13413,29 +13011,27 @@ msgstr "Трајање блокаде" #: weblate/trans/forms.py:1283 msgid "Block the user until I unblock" -msgstr "" +msgstr "Блокирајте корисника док не деблокирам" #: weblate/trans/forms.py:1284 msgid "Block the user for one day" -msgstr "" +msgstr "Блокирајте корисника на један дан" #: weblate/trans/forms.py:1285 msgid "Block the user for one week" -msgstr "" +msgstr "Блокирајте корисника на једну недељу" #: weblate/trans/forms.py:1286 msgid "Block the user for one month" -msgstr "" +msgstr "Блокирајте корисника на један месец" #: weblate/trans/forms.py:1299 msgid "Report format" msgstr "Формат извештаја" #: weblate/trans/forms.py:1300 -#, fuzzy -#| msgid "Choose translation files to import" msgid "Choose a file format for the report" -msgstr "Изаберите фајлове превода за увоз" +msgstr "Изаберите формат фајла за извештај" #: weblate/trans/forms.py:1308 msgid "Report period" @@ -13498,10 +13094,8 @@ msgid "Adding new languages" msgstr "Додавање нових језика" #: weblate/trans/forms.py:1716 -#, fuzzy -#| msgid "Unsupported component configuration" msgid "Select an existing component configuration to copy." -msgstr "Неподржана постава компоненте" +msgstr "Изаберите постојећу конфигурацију компоненте за копирање." #: weblate/trans/forms.py:1830 msgid "ZIP file containing translations" @@ -13536,20 +13130,17 @@ msgid "" msgstr "Користи и доприноси базену заједничких превода између пројеката." #: weblate/trans/forms.py:2259 -#, fuzzy -#| msgid "ZIP file containing translations" msgid "ZIP file containing project backup" -msgstr "ЗИП фајл са преводима" +msgstr "ZIP фајл који садржи резервну копију пројекта" #: weblate/trans/forms.py:2284 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not load project backup: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли учитати резервну копију пројекта: %s" #: weblate/trans/forms.py:2293 msgid "Optional additional filter applied to the strings" -msgstr "" +msgstr "Опциони додатни филтер примењен на ниске" #: weblate/trans/forms.py:2296 msgid "Search string" @@ -13557,7 +13148,7 @@ msgstr "Претрага ниске" #: weblate/trans/forms.py:2300 msgid "Case-sensitive string to search for and replace." -msgstr "" +msgstr "Ниска осетљива на велика и мала слова за претрагу и замену." #: weblate/trans/forms.py:2303 msgid "Replacement string" @@ -13572,6 +13163,8 @@ msgid "" "Key used to identify the string in the translation file. File-format " "specific rules might apply." msgstr "" +"Кључ који се користи за идентификацију ниске у фајлу превода. Правила " +"специфична за формат фајла могу се применити." #: weblate/trans/forms.py:2408 msgid "Source language text" @@ -13590,13 +13183,11 @@ msgstr "Контекст" #: weblate/trans/forms.py:2426 msgid "Optional context to clarify the source strings." -msgstr "Опциони контекст за разјашњење изворних низова." +msgstr "Опциони контекст за разјашњење изворних ниски." #: weblate/trans/forms.py:2433 -#, fuzzy -#| msgid "Entry by the same name already exists." msgid "Auto-adjust context when an identical string already exists." -msgstr "Унос са истим називом већ постоји." +msgstr "Аутоматско прилагођавање контекста када идентична ниска већ постоји." #: weblate/trans/forms.py:2453 msgid "Translated string" @@ -13615,10 +13206,8 @@ msgid "Untranslatable term" msgstr "Непреводив термин" #: weblate/trans/forms.py:2506 -#, fuzzy -#| msgid "You currently do not have permission to create projects." msgid "You do not have permission to create terminology." -msgstr "Тренутно немате дозволе да правите пројекте." +msgstr "Немате дозволу да креирате терминологију." #: weblate/trans/forms.py:2572 msgid "State to set" @@ -13671,20 +13260,16 @@ msgid "Please type in the slug of the project to confirm." msgstr "Унесите пуни назив пројекта да бисте потврдили." #: weblate/trans/forms.py:2716 -#, fuzzy -#| msgid "Please type in the slug of the project to confirm." msgid "Please type in the slug of the category to confirm." -msgstr "Унесите пуни назив пројекта да бисте потврдили." +msgstr "Молимо вас укуцајте слаг категорије да потврдите." #: weblate/trans/forms.py:2726 msgid "Please type in the slug of the project and language to confirm." msgstr "Унесите пуни назив пројекта и језика да бисте потврдили." #: weblate/trans/forms.py:2737 -#, fuzzy -#| msgid "Please type in the slug of the project and language to confirm." msgid "Please type in the slug of the category and language to confirm." -msgstr "Унесите пуни назив пројекта и језика да бисте потврдили." +msgstr "Молимо вас укуцајте слаг категорије и језика да потврдите." #: weblate/trans/forms.py:2758 msgid "Action" @@ -13695,38 +13280,32 @@ msgid "Author username" msgstr "Корисничко име аутора" #: weblate/trans/forms.py:2767 -#, fuzzy -#| msgid "Change password" msgid "Change period" -msgstr "Измени лозинку" +msgstr "Промена периода" #: weblate/trans/forms.py:2779 -#, fuzzy -#| msgid "Failed to add new translation file!" msgid "Could not find matching user!" -msgstr "Није успело додавање фајла превода!" +msgstr "Нисмо могли пронаћи одговарајућег корисника!" #: weblate/trans/forms.py:2852 msgid "Expiry cannot be in the past." -msgstr "" +msgstr "Истек не може бити у прошлости." #: weblate/trans/forms.py:2891 -#, fuzzy -#| msgid "Start new translation" msgid "Customize translation workflow for this language" -msgstr "Започните нови превод" +msgstr "Прилагодите радни ток превода за овај језик" #: weblate/trans/forms.py:2893 msgid "" "The translation workflow is configured at project and component. By enabling " "customization here, you override these settings for this language." msgstr "" +"Радни ток превода је конфигурисан на нивоу пројекта и компоненте. " +"Омогућавањем прилагођавања овде, надјачавате ова подешавања за овај језик." #: weblate/trans/forms.py:2936 -#, fuzzy -#| msgid "Start new translation" msgid "Customize translation workflow for this language in this project" -msgstr "Започните нови превод" +msgstr "Прилагоди радни ток превода за овај језик у овом пројекту" #: weblate/trans/forms.py:2939 msgid "" @@ -13734,6 +13313,9 @@ msgid "" "By enabling customization here, you override these settings for this " "language in this project." msgstr "" +"Радни ток превода је подешен на нивоу пројекта, компоненте и језика. " +"Омогућавањем прилагођавања овде, надмашујеш ова подешавања за овај језик у " +"овом пројекту." #: weblate/trans/guide.py:72 msgid "Version control integration" @@ -13770,7 +13352,7 @@ msgstr "Омогућава контекст за преводиоце" #: weblate/trans/guide.py:181 msgid "Add screenshots to show where strings are being used." -msgstr "Додајте снимке екрана да покажете где се користе низови." +msgstr "Додајте снимке екрана да покажете где се користе ниске." #: weblate/trans/guide.py:196 msgid "Use flags to indicate special strings in your translation." @@ -13781,23 +13363,22 @@ msgid "" "Add safe-html flag to avoid dangerous HTML from translators for strings " "which are rendered as HTML." msgstr "" +"Додај safe-html заставицу да избегнеш опасан HTML од преводилаца за низове " +"који се рендерују као HTML." #: weblate/trans/guide.py:247 msgid "Workflow customization" msgstr "Прилагођавање тока рада" #: weblate/trans/mixins.py:144 -#, fuzzy -#| msgid "Component with this name already exists in the project." msgid "" "Component or category with the same URL slug already exists at this level." -msgstr "Компонента са тим именом већ постоји у пројекту." +msgstr "" +"Компонента или категорија са истим URL слагом већ постоји на овом нивоу." #: weblate/trans/mixins.py:151 -#, fuzzy -#| msgid "Entry by the same name already exists." msgid "Component or category with the same name already exists at this level." -msgstr "Унос са истим називом већ постоји." +msgstr "Компонента или категорија са истим именом већ постоји на овом нивоу." #. Translators: Name of an alert #: weblate/trans/models/alert.py:191 @@ -13811,15 +13392,13 @@ msgstr "Дуплиран превод." #. Translators: Name of an alert #: weblate/trans/models/alert.py:220 -#, fuzzy -#| msgid "Duplicated filemask." msgid "Duplicated file mask." -msgstr "Дуплирана маска фајла." +msgstr "Дуплирана фајл маска." #. Translators: Name of an alert #: weblate/trans/models/alert.py:233 msgid "Could not merge the repository." -msgstr "Неуспело стапање складишта." +msgstr "Неуспело спајање складишта." #. Translators: Name of an alert #: weblate/trans/models/alert.py:242 @@ -13860,7 +13439,7 @@ msgstr "Недостају подаци о лиценци." #: weblate/trans/models/alert.py:381 weblate/trans/models/alert.py:388 #: weblate/trans/models/alert.py:396 msgid "Could not run add-on." -msgstr "" +msgstr "Није могуће покренути додатак." #. Translators: Name of an alert #: weblate/trans/models/alert.py:404 @@ -13903,33 +13482,27 @@ msgstr "Некоришћене обавезне провере." #: weblate/trans/models/alert.py:596 msgid "No file mask matches." -msgstr "" +msgstr "Нема подударања фајл маске." #: weblate/trans/models/alert.py:616 msgid "Inexistent files." -msgstr "" +msgstr "Непостојећи фајлови." #: weblate/trans/models/alert.py:638 -#, fuzzy -#| msgid "Component Information" msgid "Component seems unused." -msgstr "Подаци о компоненти" +msgstr "Чини се да компонента није коришћена." #: weblate/trans/models/alert.py:666 -#, fuzzy -#| msgid "The translation uses monolingual files." msgid "Glossary using monolingual files." -msgstr "Превод користи једно-језичне фајлове." +msgstr "Глосар користећи једнојезичне фајлове." #: weblate/trans/models/announcement.py:104 -#, fuzzy -#| msgid "Revert" msgid "Severity" -msgstr "Врати" +msgstr "Озбиљност" #: weblate/trans/models/announcement.py:105 msgid "Severity defines color used for the message." -msgstr "" +msgstr "Озбиљност дефинише боју која се користи за поруку." #: weblate/trans/models/announcement.py:107 msgid "Info (light blue)" @@ -13965,17 +13538,15 @@ msgstr "Обавести кориснике" #: weblate/trans/models/announcement.py:129 msgid "Send notification to subscribed users." -msgstr "" +msgstr "Пошаљи обавештење претплаћеним корисницима." #: weblate/trans/models/announcement.py:144 msgid "Do not specify both component and project!" msgstr "Не наводите и компоненту и пројекат!" #: weblate/trans/models/category.py:48 -#, fuzzy -#| msgid "Author name" msgid "Category name" -msgstr "Име аутора" +msgstr "Име категорије" #: weblate/trans/models/category.py:50 weblate/trans/models/component.py:343 #: weblate/trans/models/componentlist.py:28 weblate/trans/models/project.py:139 @@ -13994,22 +13565,20 @@ msgstr "Име које се користи у URL-овима и именима #: weblate/trans/models/category.py:166 msgid "Too deep nesting of categories!" -msgstr "" +msgstr "Превише дубоко угнежђивање категорија!" #: weblate/trans/models/category.py:171 msgid "Parent category has to be in the same project!" -msgstr "" +msgstr "Родитељска категорија мора бити у истом пројекту!" #: weblate/trans/models/category.py:176 msgid "Parent category has to be different!" -msgstr "" +msgstr "Родитељска категорија мора бити другачија!" #. Translators: Name of event in the history #: weblate/trans/models/change.py:367 -#, fuzzy -#| msgid "Repository outdated." msgid "Resource updated" -msgstr "Складиште застарело." +msgstr "Ресурс ажуриран" #. Translators: Name of event in the history #: weblate/trans/models/change.py:369 @@ -14023,10 +13592,8 @@ msgstr "Превод промењен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:373 -#, fuzzy -#| msgid "Translations made" msgid "Translation added" -msgstr "Превода дато" +msgstr "Превод додат" #. Translators: Name of event in the history #: weblate/trans/models/change.py:375 @@ -14055,10 +13622,8 @@ msgstr "Превод отпремљен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:387 -#, fuzzy -#| msgid "Source string age" msgid "Source string added" -msgstr "Старост изворне ниске" +msgstr "Изворна ниска додата" #. Translators: Name of event in the history #: weblate/trans/models/change.py:389 @@ -14072,73 +13637,53 @@ msgstr "Компонента откључана" #. Translators: Name of event in the history #: weblate/trans/models/change.py:393 -#, fuzzy -#| msgid "Change word" msgid "Changes committed" -msgstr "Промени реч" +msgstr "Промене урезане" #. Translators: Name of event in the history #: weblate/trans/models/change.py:395 -#, fuzzy -#| msgid "Change password" msgid "Changes pushed" -msgstr "Измени лозинку" +msgstr "Промене пуштене" #. Translators: Name of event in the history #: weblate/trans/models/change.py:397 -#, fuzzy -#| msgid "Repository browser" msgid "Repository reset" -msgstr "Прегледач складишта" +msgstr "Складиште ресетовано" #. Translators: Name of event in the history #: weblate/trans/models/change.py:399 -#, fuzzy -#| msgid "Repository changes" msgid "Repository merged" -msgstr "Измене складишта" +msgstr "Складиште спојено" #. Translators: Name of event in the history #: weblate/trans/models/change.py:401 -#, fuzzy -#| msgid "Repository details" msgid "Repository rebased" -msgstr "Детаљи складишта" +msgstr "Складиште ребејзовано" #. Translators: Name of event in the history #: weblate/trans/models/change.py:403 -#, fuzzy -#| msgid "Repository operation" msgid "Repository merge failed" -msgstr "Операција складишта" +msgstr "Спој складишта није успео" #. Translators: Name of event in the history #: weblate/trans/models/change.py:405 -#, fuzzy -#| msgid "Repository operation" msgid "Repository rebase failed" -msgstr "Операција складишта" +msgstr "Ребејз складишта није успео" #. Translators: Name of event in the history #: weblate/trans/models/change.py:407 -#, fuzzy -#| msgid "Repository failure" msgid "Repository push failed" -msgstr "Грешка складишта" +msgstr "Пуштање складишта није успело" #. Translators: Name of event in the history #: weblate/trans/models/change.py:409 -#, fuzzy -#| msgid "Failing file" msgid "Parsing failed" -msgstr "Фајл са грешком" +msgstr "Парсирање није успело" #. Translators: Name of event in the history #: weblate/trans/models/change.py:411 -#, fuzzy -#| msgid "Translation to remove" msgid "Translation removed" -msgstr "Превод за уклањање" +msgstr "Превод уклоњен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:413 @@ -14147,10 +13692,8 @@ msgstr "Сугестија уклоњена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:415 -#, fuzzy -#| msgid "Translation threshold" msgid "Translation replaced" -msgstr "Праг превода" +msgstr "Превод замењен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:417 @@ -14164,38 +13707,28 @@ msgstr "Изворна ниска измењена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:421 -#, fuzzy -#| msgid "String age" msgid "String added" -msgstr "Старост ниске" +msgstr "Ниска додата" #. Translators: Name of event in the history #: weblate/trans/models/change.py:423 -#, fuzzy -#| msgid "Bulk status change" msgid "Bulk status changed" -msgstr "Пакетна промена стања" +msgstr "Статус у великом обиму промењен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:425 -#, fuzzy -#| msgid "Last change" msgid "Visibility changed" -msgstr "Последња промена" +msgstr "Видљивост промењена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:427 -#, fuzzy -#| msgid "User agent" msgid "User added" -msgstr "Прегледач" +msgstr "Корисник додат" #. Translators: Name of event in the history #: weblate/trans/models/change.py:429 -#, fuzzy -#| msgid "User profile" msgid "User removed" -msgstr "Кориснички профил" +msgstr "Корисник уклоњен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:431 @@ -14209,31 +13742,23 @@ msgstr "Означено за уређивање" #. Translators: Name of event in the history #: weblate/trans/models/change.py:435 -#, fuzzy -#| msgid "Component to remove" msgid "Component removed" -msgstr "Компоненте за уклањање" +msgstr "Компонента уклоњена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:437 -#, fuzzy -#| msgid "Project to remove" msgid "Project removed" -msgstr "Пројекат за укљањање" +msgstr "Пројекат уклоњен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:439 -#, fuzzy -#| msgid "Project name" msgid "Project renamed" -msgstr "Назив пројекта" +msgstr "Пројекат преименован" #. Translators: Name of event in the history #: weblate/trans/models/change.py:441 -#, fuzzy -#| msgid "Component to remove" msgid "Component renamed" -msgstr "Компоненте за уклањање" +msgstr "Компонента преименована" #. Translators: Name of event in the history #: weblate/trans/models/change.py:443 @@ -14242,71 +13767,53 @@ msgstr "Премештена компонента" #. Translators: Name of event in the history #: weblate/trans/models/change.py:445 -#, fuzzy -#| msgid "New contributor" msgid "Contributor joined" -msgstr "Нови доприносилац" +msgstr "Доприносиоц се придружио" #. Translators: Name of event in the history #: weblate/trans/models/change.py:447 -#, fuzzy -#| msgid "Announcement" msgid "Announcement posted" -msgstr "Објава" +msgstr "Обавештење објављено" #. Translators: Name of event in the history #: weblate/trans/models/change.py:449 msgid "Alert triggered" -msgstr "" +msgstr "Упозорење активирано" #. Translators: Name of event in the history #: weblate/trans/models/change.py:451 -#, fuzzy -#| msgid "Language code" msgid "Language added" -msgstr "Код језика" +msgstr "Језик додат" #. Translators: Name of event in the history #: weblate/trans/models/change.py:453 -#, fuzzy -#| msgid "Language code style" msgid "Language requested" -msgstr "Облик кода језика" +msgstr "Језик затражен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:455 -#, fuzzy -#| msgid "Project name" msgid "Project created" -msgstr "Назив пројекта" +msgstr "Пројекат креиран" #. Translators: Name of event in the history #: weblate/trans/models/change.py:457 -#, fuzzy -#| msgid "Component alerts" msgid "Component created" -msgstr "Упозорења компоненте" +msgstr "Компонента креирана" #. Translators: Name of event in the history #: weblate/trans/models/change.py:459 -#, fuzzy -#| msgid "Current user identities" msgid "User invited" -msgstr "Идентитети тренутних корисника" +msgstr "Корисник позван" #. Translators: Name of event in the history #: weblate/trans/models/change.py:461 -#, fuzzy -#| msgid "Received repository notification" msgid "Repository notification received" -msgstr "Примљено обавештење складишта" +msgstr "Обавештење о складишту добијено" #. Translators: Name of event in the history #: weblate/trans/models/change.py:463 -#, fuzzy -#| msgid "Translation comment has been deleted." msgid "Translation replaced file by upload" -msgstr "Коментар превода је обрисан." +msgstr "Превод замењен фајлом путем отпремања" #. Translators: Name of event in the history #: weblate/trans/models/change.py:465 @@ -14320,130 +13827,98 @@ msgstr "Споразум о доприносу је измењен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:469 -#, fuzzy -#| msgid "Screenshot name" msgid "Screenshot added" -msgstr "Назив за снимак" +msgstr "Додат снимак екрана" #. Translators: Name of event in the history #: weblate/trans/models/change.py:471 -#, fuzzy -#| msgid "Screenshots uploaded" msgid "Screenshot uploaded" -msgstr "Отпремљени снимци екрана" +msgstr "Отпремљен снимак екрана" #. Translators: Name of event in the history #: weblate/trans/models/change.py:473 -#, fuzzy -#| msgid "Could not update the repository." msgid "String updated in the repository" -msgstr "Неуспело ажурирање складишта." +msgstr "Ниска ажурирана у складишту" #. Translators: Name of event in the history #: weblate/trans/models/change.py:475 msgid "Add-on installed" -msgstr "" +msgstr "Додатак инсталираних" #. Translators: Name of event in the history #: weblate/trans/models/change.py:477 msgid "Add-on configuration changed" -msgstr "" +msgstr "Конфигурација додатка промењена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:479 msgid "Add-on uninstalled" -msgstr "" +msgstr "Додатак деинсталираних" #. Translators: Name of event in the history #: weblate/trans/models/change.py:481 -#, fuzzy -#| msgid "Suggestion removed" msgid "String removed" -msgstr "Сугестија уклоњена" +msgstr "Ниска уклоњена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:483 -#, fuzzy -#| msgid "Component to remove" msgid "Comment removed" -msgstr "Компоненте за уклањање" +msgstr "Коментар уклоњен" #: weblate/trans/models/change.py:487 -#, fuzzy -#| msgid "Translation comment has been resolved." msgctxt "Name of event in the history" msgid "Comment resolved" -msgstr "Коментар превода је разрешен." +msgstr "Коментар решен" #. Translators: Name of event in the history #: weblate/trans/models/change.py:490 -#, fuzzy -#| msgid "Explanation" msgid "Explanation updated" -msgstr "Објашњење" +msgstr "Објашњење ажурирано" #. Translators: Name of event in the history #: weblate/trans/models/change.py:492 -#, fuzzy -#| msgid "Author name" msgid "Category removed" -msgstr "Име аутора" +msgstr "Категорија уклоњена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:494 -#, fuzzy -#| msgid "Author name" msgid "Category renamed" -msgstr "Име аутора" +msgstr "Категорија преименована" #. Translators: Name of event in the history #: weblate/trans/models/change.py:496 -#, fuzzy -#| msgid "Author name" msgid "Category moved" -msgstr "Име аутора" +msgstr "Категорија премештена" #. Translators: Name of event in the history #: weblate/trans/models/change.py:498 -#, fuzzy -#| msgid "Failing file" msgid "Saving string failed" -msgstr "Фајл са грешком" +msgstr "Чување ниске није успело" #. Translators: Name of event in the history #: weblate/trans/models/change.py:500 -#, fuzzy -#| msgid "Could not update the repository." msgid "String added in the repository" -msgstr "Неуспело ажурирање складишта." +msgstr "Низ додат у складиште" #. Translators: Name of event in the history #: weblate/trans/models/change.py:502 -#, fuzzy -#| msgid "Could not update the repository." msgid "String updated in the upload" -msgstr "Неуспело ажурирање складишта." +msgstr "Ниска ажурирана у отпремању" #. Translators: Name of event in the history #: weblate/trans/models/change.py:504 -#, fuzzy -#| msgid "Could not update the repository." msgid "String added in the upload" -msgstr "Неуспело ажурирање складишта." +msgstr "Ниска додата у отпремању" #. Translators: Name of event in the history #: weblate/trans/models/change.py:506 -#, fuzzy -#| msgid "Translation comment has been deleted." msgid "Translation updated by source upload" -msgstr "Коментар превода је обрисан." +msgstr "Превод ажуриран од стране отпремања извора" #. Translators: Name of event in the history #: weblate/trans/models/change.py:508 -#, fuzzy -#| msgid "View translation component" msgid "Component translation completed" -msgstr "Погледај компоненте превода" +msgstr "Превод компоненте завршен" #: weblate/trans/models/change.py:592 msgid "The component was automatically locked because of an alert." @@ -14461,25 +13936,21 @@ msgstr "%(action)s у %(time)s на %(translation)s од %(user)s" #. Translators: condensed rendering of a change action in history #: weblate/trans/models/change.py:681 -#, fuzzy, python-format -#| msgid "New string to translate in %(translation)s" -#| msgid_plural "New strings to translate in %(translation)s" +#, python-format msgid "%(action)s at %(time)s on %(translation)s" -msgstr "Нове ниске за превод у пројекту %(translation)s" +msgstr "%(action)s у %(time)s на %(translation)s" #: weblate/trans/models/change.py:850 -#, fuzzy -#| msgid "Bulk status change" msgid "The “{}” file was changed." -msgstr "Пакетна промена стања" +msgstr "Фајл “{}” је промењен." #: weblate/trans/models/change.py:852 msgid "Parsing of the “{}” file was enforced." -msgstr "" +msgstr "Парсирање фајла “{}” је примењено." #: weblate/trans/models/change.py:854 msgid "File “{}” was added." -msgstr "" +msgstr "Фајл “{}” је додат." #: weblate/trans/models/change.py:860 msgctxt "License information not available" @@ -14496,14 +13967,11 @@ msgstr "" #: weblate/trans/models/change.py:915 msgid "Original revision: {}" -msgstr "" +msgstr "Оригинална ревизија: {}" #: weblate/trans/models/change.py:919 -#, fuzzy -#| msgctxt "Translation memory category" -#| msgid "Personal: {}" msgid "New revision: {}" -msgstr "Лично: {}" +msgstr "Нова ревизија: {}" #. Translators: Action when adding new translation #: weblate/trans/models/component.py:117 @@ -14527,7 +13995,7 @@ msgstr "Искључи додавање нових превода" #: weblate/trans/models/component.py:126 msgid "Default based on the file format" -msgstr "Подразумевано на основу формата датотеке." +msgstr "Подразумевано на основу формата датотеке" #: weblate/trans/models/component.py:127 msgid "POSIX style using underscore as a separator" @@ -14535,7 +14003,7 @@ msgstr "POSIX стил користи доњу црту као сепарато #: weblate/trans/models/component.py:130 msgid "POSIX style using underscore as a separator, lower cased" -msgstr "" +msgstr "POSIX стил користећи доњу црту као сепаратор, малим словима" #: weblate/trans/models/component.py:132 msgid "BCP style using hyphen as a separator" @@ -14550,6 +14018,8 @@ msgid "" "POSIX style using underscore as a separator, including country code, lower " "cased" msgstr "" +"POSIX стил користећи доњу црту као сепаратор, укључујући код земље, малим " +"словима" #: weblate/trans/models/component.py:147 msgid "BCP style using hyphen as a separator, including country code" @@ -14557,35 +14027,31 @@ msgstr "BCP стил користећи цртицу као сепаратор, #: weblate/trans/models/component.py:151 msgid "BCP style using hyphen as a separator, legacy language codes" -msgstr "" +msgstr "BCP стил користећи цртицу као сепаратор, наслеђени језички кодови" #: weblate/trans/models/component.py:153 msgid "BCP style using hyphen as a separator, lower cased" -msgstr "" +msgstr "BCP стил користећи цртицу као сепаратор, малим словима" #: weblate/trans/models/component.py:154 msgid "Android style" -msgstr "Android стил." +msgstr "Android стил" #: weblate/trans/models/component.py:155 msgid "Apple App Store metadata style" -msgstr "" +msgstr "Стил метаподатака за Apple App Store" #: weblate/trans/models/component.py:156 msgid "Google Play metadata style" -msgstr "" +msgstr "Стил метаподатака за Google Play" #: weblate/trans/models/component.py:157 -#, fuzzy -#| msgid "Language code style" msgid "Linux style" -msgstr "Облик кода језика" +msgstr "Linux стил" #: weblate/trans/models/component.py:158 -#, fuzzy -#| msgid "Language code style" msgid "Linux style, lower cased" -msgstr "Облик кода језика" +msgstr "Linux стил, малим словима" #: weblate/trans/models/component.py:162 msgid "Merge" @@ -14597,7 +14063,7 @@ msgstr "Пребазирање" #: weblate/trans/models/component.py:164 msgid "Merge without fast-forward" -msgstr "" +msgstr "Спојити без брзог премотавања унапред" #: weblate/trans/models/component.py:368 msgid "" @@ -14645,7 +14111,7 @@ msgstr "Извезени URL репозиторијума" #: weblate/trans/models/component.py:414 msgid "URL of repository where users can fetch changes from Weblate" -msgstr "УРЛ складишта где корисници могу преузети промене из Веблејта." +msgstr "УРЛ складишта где корисници могу преузети промене из Веблејта" #: weblate/trans/models/component.py:419 msgid "Source string bug reporting address" @@ -14656,8 +14122,8 @@ msgid "" "E-mail address for reports on errors in source strings. Leave empty for no e-" "mails." msgstr "" -"Адреса е-поште за извештаје о грешкама у изворним низовима. Оставите празно " -"за без е-поште." +"Адреса имејла за извештаје о грешкама у изворним нискама. Оставите празно за " +"без имејла." #: weblate/trans/models/component.py:429 msgid "Repository branch to translate" @@ -14680,22 +14146,24 @@ msgstr "" "кода језика, нпр: po/*.po или locale/*/LC_MESSAGES/django.po." #: weblate/trans/models/component.py:453 -#, fuzzy -#| msgid "Screenshot details" msgid "Screenshot file mask" -msgstr "Детаљи снимка екрана" +msgstr "Маска фајла за снимак екрана" #: weblate/trans/models/component.py:458 msgid "" "Path of screenshots relative to repository root, for example: docs/" "screenshots/*.png." msgstr "" +"Путања снимка екрана у односу на корен складишта, на пример: docs/" +"screenshots/*.png." #: weblate/trans/models/component.py:467 msgid "" "Filename of translation base file, containing all strings and their source " "for monolingual translations." msgstr "" +"Име фајла основног фајла за превод, који садржи све низове и њихов извор за " +"монолингвалне преводе." #: weblate/trans/models/component.py:474 msgid "Edit base file" @@ -14742,10 +14210,8 @@ msgstr "" "Корисници могу само гласати за предлоге и не могу правити директне преводе." #: weblate/trans/models/component.py:541 weblate/trans/models/workflow.py:43 -#, fuzzy -#| msgid "Automatic suggestions" msgid "Automatically accept suggestions" -msgstr "Аутоматски предлози" +msgstr "Аутоматски прихвати предлоге" #: weblate/trans/models/component.py:544 weblate/trans/models/workflow.py:46 msgid "" @@ -14809,9 +14275,9 @@ msgid "" "are extracted from the source code or managed externally you probably want " "to keep it disabled." msgstr "" -"Омогућава додавање и уклањање низова директно из Веблејта. Ако су ваши " -"низови извучени из изворног кода или управљани екстерно, вероватно желите да " -"ово остане онемогућено." +"Омогућава додавање и уклањање ниски директно из Веблејта. Ако су ваше ниске " +"извучене из изворног кода или управљане екстерно, вероватно желите да ово " +"остане онемогућено." #: weblate/trans/models/component.py:614 msgid "Merge style" @@ -14853,11 +14319,11 @@ msgstr "Порука комита при спајању превода" #: weblate/trans/models/component.py:660 msgid "Commit message when add-on makes a change" -msgstr "" +msgstr "Порука урезивања када додатак направи промену" #: weblate/trans/models/component.py:669 msgid "Merge request message" -msgstr "" +msgstr "Порука захтева за спајање" #: weblate/trans/models/component.py:678 msgid "Push on commit" @@ -14894,14 +14360,12 @@ msgid "Language used for source strings in all components" msgstr "Језик који се користи за изворне стрингове у свим компонентама" #: weblate/trans/models/component.py:713 -#, fuzzy -#| msgid "" -#| "Regular expression to filter translation files against when scanning for " -#| "filemask." msgid "" "Regular expression used to filter translation files when scanning for file " "mask." -msgstr "Регуларни израз за филтрирање фајлова превода по претрази маске фајла." +msgstr "" +"Регуларни израз коришћен за филтрирање преводних фајлова када се скенира за " +"фајл маску." #: weblate/trans/models/component.py:718 msgid "Variants regular expression" @@ -14909,7 +14373,7 @@ msgstr "Варијанте регуларног израза" #: weblate/trans/models/component.py:724 msgid "Regular expression used to determine variants of a string." -msgstr "Регуларни израз који се користи за одређивање варијанти низа." +msgstr "Регуларни израз који се користи за одређивање варијанти ниске." #: weblate/trans/models/component.py:733 msgid "Components with higher priority are offered first to translators." @@ -14971,7 +14435,7 @@ msgstr "Фајл не постоји." #: weblate/trans/models/component.py:1783 #, python-format msgid "Could not push %(component)s: %(error_text)s" -msgstr "" +msgstr "Нисмо могли да пошаљемо %(component)s: %(error_text)s" #: weblate/trans/models/component.py:1810 #, python-format @@ -14999,16 +14463,12 @@ msgid "Could not merge remote branch into %s." msgstr "Нисам могао да стопим удаљену грану у %s." #: weblate/trans/models/component.py:2733 -#, fuzzy -#| msgid "User has been removed from this project." msgid "Category does not belong to this project." -msgstr "Корисник је уклоњен из овог пројекта." +msgstr "Категорија не припада овом пројекту." #: weblate/trans/models/component.py:2737 -#, fuzzy -#| msgid "Component list must not be selected when not used." msgid "Categorized component can not be shared." -msgstr "Списак компоненти не сме бити одабран ако се не користи." +msgstr "Категоризована компонента не може бити дељена." #: weblate/trans/models/component.py:2749 msgid "Invalid link to a Weblate project, use weblate://project/component." @@ -15029,10 +14489,12 @@ msgid "" "Option is not available for linked repositories. Setting from linked " "component will be used." msgstr "" +"Опција није доступна за повезана складишта. Користиће се подешавање из " +"повезане компоненте." #: weblate/trans/models/component.py:2791 msgid "The file mask did not match any files." -msgstr "" +msgstr "Фајл маска се није подударила ни са једним фајлом." #: weblate/trans/models/component.py:2801 #, python-format @@ -15041,10 +14503,15 @@ msgid "" "%(filename2)s Please adjust the file mask and use components for translating " "different resources." msgstr "" +"Постоји више од једног фајла за %(language)s језик: %(filename1)s, " +"%(filename2)s. Молимо вас да прилагодите маску фајла и користите компоненте " +"за превођење различитих ресурса." #: weblate/trans/models/component.py:2819 msgid "Could not find any matching language, please check the file mask." msgstr "" +"Није могуће пронаћи ниједан подударајући језик, молимо вас проверите фајл " +"маску." #: weblate/trans/models/component.py:2839 #, python-format @@ -15063,10 +14530,9 @@ msgstr "" "датотеку за то." #: weblate/trans/models/component.py:2878 -#, fuzzy, python-format -#| msgid "Define the base file for new translations" +#, python-format msgid "Could not parse base file for new translations: %s" -msgstr "Одреди основни фајл за нове преводе" +msgstr "Нисмо могли парсирати основни фајл за нове преводе: %s" #: weblate/trans/models/component.py:2882 msgid "Unrecognized base file for new translations." @@ -15074,7 +14540,7 @@ msgstr "Непознат основни фајл за нове преводе." #: weblate/trans/models/component.py:2897 msgid "Editing template is not supported with this file format." -msgstr "" +msgstr "Уређивање шаблона није подржано са овим форматом фајла." #: weblate/trans/models/component.py:2903 #: weblate/trans/models/component.py:2919 @@ -15105,16 +14571,12 @@ msgid "Template language ({0}) does not match source language ({1})!" msgstr "Језик шаблона ({0}) не одговара изворном језику ({1})!" #: weblate/trans/models/component.py:2972 -#, fuzzy -#| msgid "No remote repository" msgid "Choose No remote repository for local: URL." -msgstr "Нема удаљеног складишта" +msgstr "Изаберите Нема удаљеног складишта за локал: URL." #: weblate/trans/models/component.py:2977 -#, fuzzy -#| msgid "Push changes to the remote repository" msgid "Push URL is not used without a remote repository." -msgstr "Отпреми измене у удаљено складиште" +msgstr "URL за слање није коришћен без удаљеног складишта." #: weblate/trans/models/component.py:2991 msgid "" @@ -15159,35 +14621,25 @@ msgid "Could not add new translation file." msgstr "Не могу да додам нови фајл превода." #: weblate/trans/models/component.py:3473 -#, fuzzy -#| msgid "You don't have permission to start a new translation" msgid "You do not have permissions to add new translation file." -msgstr "Немате дозволе да покренете нов превод" +msgstr "Немате дозволе да додате нови фајл превода." #: weblate/trans/models/component.py:3481 #: weblate/trans/models/component.py:3489 -#, fuzzy -#| msgid "The translation base language is editable." msgid "The monolingual base language file is invalid." -msgstr "Основни језик превода се може уређивати." +msgstr "Фајл основног језика је неважећи." #: weblate/trans/models/component.py:3494 -#, fuzzy -#| msgid "Template for new translations" msgid "The template for new translations is invalid." -msgstr "Шаблон за нове преводе" +msgstr "Шаблон за нове преводе је неважећи." #: weblate/trans/models/component.py:3536 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "The given language is used as a source language." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Дати језик се користи као изворни језик." #: weblate/trans/models/component.py:3544 -#, fuzzy -#| msgid "Entry by the same name already exists." msgid "The given language already exists." -msgstr "Унос са истим називом већ постоји." +msgstr "Дати језик већ постоји." #: weblate/trans/models/component.py:3553 msgid "The given language is filtered by the language filter." @@ -15247,10 +14699,8 @@ msgid "Component list to assign" msgstr "Списак компоненти за додељивање" #: weblate/trans/models/label.py:28 -#, fuzzy -#| msgid "Description" msgid "Label description" -msgstr "Опис" +msgstr "Опис ознаке" #: weblate/trans/models/project.py:129 msgid "Public" @@ -15312,6 +14762,8 @@ msgid "" "Requires contributors to have two-factor authentication configured before " "being able to contribute." msgstr "" +"Захтева од доприноса да имају конфигурисану двофакторску аутентификацију пре " +"него што могу да допринесу." #: weblate/trans/models/project.py:201 weblate/trans/models/workflow.py:23 msgid "Enable reviews" @@ -15350,10 +14802,8 @@ msgstr "" "en_GB:en,en_US:en" #: weblate/trans/models/suggestion.py:155 -#, fuzzy -#| msgid "Failed to accept suggestion!" msgid "Could not accept suggestion!" -msgstr "Неуспело прихватање предлога!" +msgstr "Нисмо могли прихватити предлог!" #: weblate/trans/models/translation.py:235 #, python-format @@ -15365,50 +14815,45 @@ msgstr "" "језички фајл у складиште." #: weblate/trans/models/translation.py:244 -#, fuzzy, python-format -#| msgid "Error in parameter %(field)s: %(error)s" +#, python-format msgid "Could not parse file %(file)s: %(error)s" -msgstr "Грешка параметра %(field)s: %(error)s" +msgstr "Нисмо могли парсирати фајл %(file)s: %(error)s" #: weblate/trans/models/translation.py:1108 #: weblate/trans/models/translation.py:1164 #: weblate/trans/models/translation.py:1258 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not commit pending changes: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли да урежемо промене на чекању: %s" #: weblate/trans/models/translation.py:1671 msgid "Plurals are not supported by the file format!" -msgstr "" +msgstr "Множине нису подржане од стране формата фајла!" #: weblate/trans/models/translation.py:1676 weblate/trans/models/unit.py:708 -#, fuzzy, python-format -#| msgid "Control characters" +#, python-format msgid "String contains control character: %s" -msgstr "Контролни знакови" +msgstr "Ниска садржи контролни карактер: %s" #: weblate/trans/models/translation.py:1681 msgid "Empty state is supported for blank strings only." -msgstr "" +msgstr "Празно стање је подржано само за празне ниске." #: weblate/trans/models/translation.py:1684 msgid "Blank strings require an empty state." -msgstr "" +msgstr "Празне ниске захтевају празно стање." #: weblate/trans/models/translation.py:1688 msgid "Approved state is not available as reviews are not enabled." -msgstr "" +msgstr "Одобрено стање није доступно јер рецензије нису омогућене." #: weblate/trans/models/translation.py:1696 msgid "This string seems to already exist." msgstr "Ова ниска већ постоји." #: weblate/trans/models/translation.py:1703 -#, fuzzy -#| msgid "Notification on new string to translate" msgid "Failed adding string, no translation found." -msgstr "о новим порукама за превођење" +msgstr "Неуспело додавање ниске, превод није пронађен." #: weblate/trans/models/unit.py:1052 #, python-format @@ -15428,16 +14873,12 @@ msgid "Mark as read-only" msgstr "Означи као само за читање" #: weblate/trans/models/unit.py:1740 -#, fuzzy -#| msgid "Unmark as forbidden translation" msgid "Unmark as untranslatable" -msgstr "Уклони забрану са превода" +msgstr "Скини ознаку као непреводиво" #: weblate/trans/models/unit.py:1744 -#, fuzzy -#| msgid "Mark as forbidden translation" msgid "Mark as untranslatable" -msgstr "Означи као забрањен превод" +msgstr "Означи као непреводиво" #: weblate/trans/models/unit.py:1751 msgid "Unmark as forbidden translation" @@ -15469,11 +14910,11 @@ msgstr "Уметни хоризонталну елипсу" #: weblate/trans/specialchars.py:17 msgid "Insert a soft hyphen" -msgstr "" +msgstr "Уметните меку цртицу" #: weblate/trans/specialchars.py:18 msgid "Insert a non-breaking space" -msgstr "" +msgstr "Уметни непокретни размак" #: weblate/trans/specialchars.py:258 #, python-brace-format @@ -15482,21 +14923,19 @@ msgstr "Уметни карактер {0}" #: weblate/trans/specialchars.py:271 msgid "Main opening quote" -msgstr "" +msgstr "Главни почетни наводник" #: weblate/trans/specialchars.py:272 -#, fuzzy -#| msgid "Mailing list" msgid "Main closing quote" -msgstr "Дописна листа" +msgstr "Главни завршни наводник" #: weblate/trans/specialchars.py:273 msgid "Alternative opening quote" -msgstr "" +msgstr "Алтернативни почетни наводник" #: weblate/trans/specialchars.py:274 msgid "Alternative closing quote" -msgstr "" +msgstr "Алтернативни завршни наводник" #: weblate/trans/specialchars.py:278 msgid "Hyphen" @@ -15515,10 +14954,9 @@ msgid "User configured character: {}" msgstr "Кориснички конфигурисан карактер: {}" #: weblate/trans/tasks.py:488 -#, fuzzy, python-format -#| msgid "Automatic translation mode" +#, python-format msgid "Automatic translation failed: %s" -msgstr "Режим аутоматског превођења" +msgstr "Аутоматски превод није успео: %s" #: weblate/trans/tasks.py:495 msgid "Automatic translation completed, no strings were updated." @@ -15549,7 +14987,7 @@ msgstr "Могућа конфигурација" #, python-brace-format msgctxt "glossary term" msgid "{target} [{source}]" -msgstr "" +msgstr "{target} [{source}]" #: weblate/trans/templatetags/translations.py:273 msgid "Forbidden translation:" @@ -15770,10 +15208,8 @@ msgid "string ID %s" msgstr "ИД ниске %s" #: weblate/trans/templatetags/translations.py:1061 -#, fuzzy -#| msgid "This translation is used for source strings." msgid "This language is used for source strings." -msgstr "Овај превод се користи за изворне ниске." +msgstr "Овај језик се користи за изворне ниске." #: weblate/trans/templatetags/translations.py:1085 #: weblate/trans/templatetags/translations.py:1105 @@ -15817,13 +15253,13 @@ msgstr "омогућено" #: weblate/trans/templatetags/translations.py:1250 #, python-format msgid "%s M" -msgstr "" +msgstr "%s M" #. Translators: Number format, in thousands (kilo) #: weblate/trans/templatetags/translations.py:1254 #, python-format msgid "%s k" -msgstr "" +msgstr "%s k" #: weblate/trans/templatetags/translations.py:1460 #, python-format @@ -15834,11 +15270,8 @@ msgstr[1] "Завршен превод са %(count)s стринга" msgstr[2] "Завршен превод са %(count)s стрингова" #: weblate/trans/templatetags/translations.py:1470 -#, fuzzy -#| msgid "New string to translate" -#| msgid_plural "New strings to translate" msgid "No strings to translate" -msgstr "Ниске за превођење" +msgstr "Нема ниски за превођење" #: weblate/trans/templatetags/translations.py:1488 #, python-format @@ -15871,28 +15304,32 @@ msgid "" "{0} is being translated into {1} languages using Weblate. Join the " "translation or start translating your own project." msgstr "" +"{0} се преводи на {1} језика користећи Веблејт. Придружите се преводу или " +"покренете превођење вашег пројекта." #: weblate/trans/validators.py:22 msgid "File mask does not contain * as a language placeholder!" -msgstr "" +msgstr "Фајл маска не садржи * као држач места за језик!" #: weblate/trans/validators.py:31 msgid "" "A value of 1 is not allowed for automatic acceptance as it would permit " "users to vote on their own suggestions." msgstr "" +"Вредност од 1 није дозвољена за аутоматских прихватање јер би омогућила " +"корисницима да гласају за своје предлоге." #: weblate/trans/validators.py:42 -#, fuzzy, python-format -#| msgid "Failed to parse JSON file: {!s}" +#, python-format msgid "Could not parse flags: %s" -msgstr "Не могу да рашчланим „JSON“ фајл: {!s}" +msgstr "Нисмо могли парсирати заставице: %s" #: weblate/trans/validators.py:51 #, python-format msgid "" "The language code for \"%(filename)s\" is empty, please check the file mask." msgstr "" +"Код језика за \"%(filename)s\" је празан, молимо вас проверите маску фајла." #: weblate/trans/validators.py:57 #, python-format @@ -15900,16 +15337,16 @@ msgid "" "The language code \"%(code)s\" for \"%(filename)s\" is too long, please " "check the file mask." msgstr "" +"Код језика \"%(code)s\" за \"%(filename)s\" је превише дугачак, молимо вас " +"проверите маску фајла." #: weblate/trans/views/about.py:22 msgid "Keys" msgstr "Кључеви" #: weblate/trans/views/about.py:23 weblate/trans/views/about.py:130 -#, fuzzy -#| msgid "About Weblate" msgid "Support Weblate" -msgstr "О Веблејту" +msgstr "Подршка Веблејт" #: weblate/trans/views/about.py:65 msgid "Weblate statistics" @@ -15932,10 +15369,8 @@ msgid "User is already blocked on this project." msgstr "Корисник је већ блокиран на овом пројекту." #: weblate/trans/views/acl.py:207 -#, fuzzy -#| msgid "User has been removed from this project." msgid "Token has been removed from this project." -msgstr "Корисник је уклоњен из овог пројекта." +msgstr "Токен је уклоњен из овог пројекта." #: weblate/trans/views/acl.py:211 msgid "User has been removed from this project." @@ -15953,15 +15388,13 @@ msgstr "Захтев за нови превод је послат одржава #: weblate/trans/views/basic.py:766 msgid "All languages have been added, updates of translations are in progress." -msgstr "" +msgstr "Сви језици су додати, освежавање превода је у току." #: weblate/trans/views/changes.py:63 -#, fuzzy, python-format -#| msgctxt "Changes in translation" -#| msgid "Changes in %s" +#, python-format msgctxt "Changes of string in a translation" msgid "Changes of string in %s" -msgstr "Измене у преводу %s" +msgstr "Промене низа у %s" #: weblate/trans/views/changes.py:69 #, python-format @@ -15993,10 +15426,8 @@ msgid "Detected license as %s, please check whether it is correct." msgstr "Откривена лиценца као %s, молимо проверите да ли је исправна." #: weblate/trans/views/create.py:396 -#, fuzzy -#| msgid "Failed to parse uploaded ZIP file." msgid "Could not parse uploaded ZIP file." -msgstr "Не могу да рашчланим отпремљени ЗИП фајл." +msgstr "Нисмо могли парсирати учитани ZIP фајл." #: weblate/trans/views/dashboard.py:151 msgid "" @@ -16049,6 +15480,8 @@ msgid "" "Added %(project)s to your watched projects. You can adjust this behavior in " "the settings." msgstr "" +"Додат %(project)s у ваше праћене пројекте. Можете прилагодити ово понашање у " +"подешавањима." #: weblate/trans/views/edit.py:402 #, python-brace-format @@ -16059,7 +15492,7 @@ msgstr "Превод је сачуван, међутим постоје неки #: weblate/trans/views/edit.py:446 msgid "Invalid merge request!" -msgstr "Неисправан захтев за стапање!" +msgstr "Неважећи захтев за спајање!" #: weblate/trans/views/edit.py:466 msgid "Invalid revert request!" @@ -16091,10 +15524,8 @@ msgstr "Неисправан појам за претрагу!" #: weblate/trans/views/edit.py:759 weblate/trans/views/search.py:56 #: weblate/trans/views/search.py:208 -#, fuzzy -#| msgid "Failed to process form!" msgid "Could not process form!" -msgstr "Неуспела обрада обрасца!" +msgstr "Нисмо могли обрадити форму!" #: weblate/trans/views/edit.py:781 msgid "Automatic translation in progress" @@ -16109,32 +15540,25 @@ msgid "Posted new comment" msgstr "Постављен нови коментар" #: weblate/trans/views/edit.py:823 -#, fuzzy -#| msgid "Failed to add comment!" msgid "Could not add comment!" -msgstr "Неуспело додавање коментара!" +msgstr "Нисмо могли додати коментар!" #: weblate/trans/views/edit.py:843 -#, fuzzy -#| msgid "Translation comment has been resolved." msgid "Comment has been deleted." -msgstr "Коментар превода је разрешен." +msgstr "Коментар је обрисан." #: weblate/trans/views/edit.py:861 -#, fuzzy -#| msgid "Translation comment has been resolved." msgid "Comment has been resolved." -msgstr "Коментар превода је разрешен." +msgstr "Коментар је решен." #: weblate/trans/views/edit.py:1036 msgid "New string has been added." msgstr "Нова ниска је додата." #: weblate/trans/views/edit.py:1056 -#, fuzzy, python-format -#| msgid "Failed to parse query string: {}" +#, python-format msgid "Could not remove the string: %s" -msgstr "Не могу да рашчланим ниску упита: {}" +msgstr "Нисмо могли уклонити ниску: %s" #: weblate/trans/views/error.py:28 msgid "Bad Request" @@ -16177,26 +15601,22 @@ msgid "File upload has failed: %s" msgstr "Неуспело слање фајла: %s" #: weblate/trans/views/git.py:38 -#, fuzzy -#| msgid "Failed to lock the repository, another operation is in progress." msgid "Could not lock the repository, another operation is in progress." -msgstr "Неуспело закључавање складишта. Друга операција је у току." +msgstr "Нисмо могли закључати складиште, друга операција је у току." #: weblate/trans/views/git.py:61 msgid "" "All repositories have been updated, updates of translations are in progress." -msgstr "" +msgstr "Сва складишта су ажурирана, освежавања превода су у току." #: weblate/trans/views/git.py:84 msgid "All repositories were pushed." msgstr "Сва спремишта су послата." #: weblate/trans/views/git.py:99 -#, fuzzy -#| msgid "All repositories have been reset." msgid "" "All repositories have been reset, updates of translations are in progress." -msgstr "Сва спремишта су ресетована." +msgstr "Сва складишта су ресетована, освежавања превода су у току." #: weblate/trans/views/git.py:123 msgid "All repositories have been cleaned up." @@ -16207,10 +15627,8 @@ msgid "Translation files have been synchronized." msgstr "Преводни фајлови су синхронизовани." #: weblate/trans/views/git.py:155 -#, fuzzy -#| msgid "Automatic translation in progress" msgid "Updates of translations are in progress." -msgstr "Напредак аутоматског превођења" +msgstr "Освежавања превода су у току." #: weblate/trans/views/git.py:178 msgid "All pending translations were committed." @@ -16277,64 +15695,53 @@ msgstr "Поставке сачуване" #: weblate/trans/views/settings.py:82 weblate/trans/views/settings.py:111 #: weblate/trans/views/settings.py:134 msgid "Invalid settings. Please check the form for errors." -msgstr "" +msgstr "Неважећа подешавања. Молимо вас да проверите форму за грешке." #: weblate/trans/views/settings.py:146 msgid "" "The repository is outdated. You might not get expected results until you " "update it." msgstr "" +"Складиште је застарело. Можда нећете добити очекиване резултате док га не " +"ажурирате." #: weblate/trans/views/settings.py:199 -#, fuzzy -#| msgid "Translation has been removed." msgid "The translation has been removed." msgstr "Превод је уклоњен." #: weblate/trans/views/settings.py:204 -#, fuzzy -#| msgid "Translation component was scheduled for removal." msgid "The translation component was scheduled for removal." msgstr "Компонента превода је планирана за уклањање." #: weblate/trans/views/settings.py:209 -#, fuzzy -#| msgid "Project was scheduled for removal." msgid "The category was scheduled for removal." -msgstr "Пројекат је планиран за уклањање." +msgstr "Категорија је заказана за уклањање." #: weblate/trans/views/settings.py:213 -#, fuzzy -#| msgid "Project was scheduled for removal." msgid "The project was scheduled for removal." msgstr "Пројекат је планиран за уклањање." #: weblate/trans/views/settings.py:219 -#, fuzzy -#| msgid "Language of the project was removed." msgid "A language in the project was removed." -msgstr "Језик пројекта је уклоњен." +msgstr "Језик у пројекту је уклоњен." #: weblate/trans/views/settings.py:225 -#, fuzzy -#| msgid "Language of the project was removed." msgid "A language in the category was removed." -msgstr "Језик пројекта је уклоњен." +msgstr "Језик у категорији је уклоњен." #: weblate/trans/views/settings.py:240 #, python-format msgid "Could not change %s due to outstanding issue in its settings: %s" msgstr "" +"Није могуће променити %s због нерешеног проблема у његовим подешавањима: %s" #: weblate/trans/views/settings.py:413 msgid "Backup scheduled. It will be available soon." -msgstr "" +msgstr "Прављење резервна копије је заказано. Биће доступна ускоро." #: weblate/trans/views/source.py:64 -#, fuzzy -#| msgid "Failed to change additional string info!" msgid "Could not change additional string info!" -msgstr "Не могу да изменим додатне податке ниске!" +msgstr "Нисмо могли променити додатне информације о ниски!" #: weblate/trans/widgets.py:262 msgid "Big status badge" @@ -16356,26 +15763,20 @@ msgstr "Пројекат {}" #. Translators: Text on OpenGraph image #: weblate/trans/widgets.py:344 -#, fuzzy -#| msgid "Component: {}" msgid "Component {}" -msgstr "Компонентa: {}" +msgstr "Компонента {}" #: weblate/trans/widgets.py:378 -#, fuzzy -#| msgid "Status badge" msgid "SVG status badge" -msgstr "Значка статуса" +msgstr "SVG статус значка" #: weblate/trans/widgets.py:381 msgid "translated" msgstr "преведено" #: weblate/trans/widgets.py:416 -#, fuzzy -#| msgid "Big status badge" msgid "PNG status badge" -msgstr "Велика значка статуса" +msgstr "PNG статус значка" #: weblate/trans/widgets.py:425 msgctxt "Status widget name" @@ -16480,10 +15881,8 @@ msgid "Could not parse query string: {}" msgstr "Нисам могао да парсирам низ упита: {}" #: weblate/utils/forms.py:117 -#, fuzzy -#| msgid "Username or e-mail" msgid "Missing username or e-mail." -msgstr "Корисничко име или е-адреса" +msgstr "Недостаје корисничко име или имејл." #: weblate/utils/forms.py:124 msgid "More possible users were found." @@ -16495,10 +15894,8 @@ msgid "Undefined variable: \"%s\"" msgstr "Неодређена променљива: „%s“" #: weblate/utils/render.py:111 -#, fuzzy -#| msgid "Failed to render template: {}" msgid "Could not render template: {}" -msgstr "Неуспешно прављење шаблона: {0}" +msgstr "Нисмо могли рендеровати шаблон: {}" #: weblate/utils/render.py:170 msgid "" @@ -16602,10 +15999,8 @@ msgid "This e-mail address is disallowed." msgstr "Ова адреса е-поште није дозвољена." #: weblate/utils/validators.py:195 -#, fuzzy -#| msgid "Enter a valid e-mail address." msgid "Invalid e-mail address: {}" -msgstr "Унесите важећу имејл адресу." +msgstr "Неважећа имејл адреса: {}" #: weblate/utils/validators.py:207 msgid "Could not evaluate plural formula: {}" @@ -16634,10 +16029,8 @@ msgstr "Синтаксна грешка у алијасима језика." #: weblate/utils/validators.py:286 weblate/utils/validators.py:295 #: weblate/utils/validators.py:304 -#, fuzzy -#| msgid "This name is prohibited" msgid "This URL is prohibited" -msgstr "Овај назив је забрањен" +msgstr "Овај УРЛ је забрањен" #: weblate/utils/views.py:176 weblate/utils/views.py:202 msgid "Position and priority" @@ -16660,10 +16053,8 @@ msgid "Number of failing checks" msgstr "Број неуспелих провера" #: weblate/utils/views.py:188 -#, fuzzy -#| msgid "Source string location" msgid "String location" -msgstr "Локација изворне ниске" +msgstr "Локација ниске" #: weblate/utils/views.py:573 #, python-format @@ -16671,40 +16062,32 @@ msgid "Error in parameter %(field)s: %(error)s" msgstr "Грешка параметра %(field)s: %(error)s" #: weblate/vcs/base.py:68 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream repository." -msgstr "Веблејт не може да дотури измене у изворно складиште." +msgstr "Ово ће послати промене у узводно складиште." #: weblate/vcs/git.py:72 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Git repository." -msgstr "Веблејт не може да дотури измене у изворно складиште." +msgstr "Ово ће послати промене у узводно Git складиште." #: weblate/vcs/git.py:548 msgid "Possible cleanups:" -msgstr "" +msgstr "Могућа чишћења:" #: weblate/vcs/git.py:556 msgid "This will push changes to Gerrit for a review." -msgstr "" +msgstr "Ово ће послати промене у Gerrit на преглед." #: weblate/vcs/git.py:601 -#, fuzzy -#| msgid "Commit changes to the internal repository" msgid "This will commit changes to the Subversion repository." -msgstr "Предаје измене у локално складиште" +msgstr "Ово ће урезати промене у Subversion складиште." #: weblate/vcs/git.py:768 msgid "Git with force push" msgstr "Git са force push" #: weblate/vcs/git.py:772 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will force push changes to the upstream repository." -msgstr "Веблејт не може да дотури измене у изворно складиште." +msgstr "Ово ће принудно послати промене у узводно складиште." #: weblate/vcs/git.py:1222 msgid "Azure DevOps pull request" @@ -16716,7 +16099,7 @@ msgstr "Ово ће покренути промене и креирати Azure #: weblate/vcs/git.py:1468 msgid "GitHub pull request" -msgstr "" +msgstr "GitHub захтев за повлачење" #: weblate/vcs/git.py:1473 msgid "This will push changes and create a GitHub pull request." @@ -16762,22 +16145,18 @@ msgstr "" "послуживача." #: weblate/vcs/mercurial.py:45 -#, fuzzy -#| msgid "Weblate could not push changes to the upstream repository." msgid "This will push changes to the upstream Mercurial repository." -msgstr "Веблејт не може да дотури измене у изворно складиште." +msgstr "Ово ће послати промене у узводно Mercurial складиште." #: weblate/vcs/ssh.py:46 -#, fuzzy -#| msgid "RSS" msgctxt "SSH key type" msgid "RSA" -msgstr "RSS" +msgstr "RSA" #: weblate/vcs/ssh.py:52 msgctxt "SSH key type" msgid "Ed25519" -msgstr "" +msgstr "Ed25519" #. Translators: placeholder SSH hashed hostname #: weblate/vcs/ssh.py:85 @@ -16785,10 +16164,9 @@ msgid "[hostname hashed]" msgstr "[hostname hashed]" #: weblate/vcs/ssh.py:185 -#, fuzzy, python-format -#| msgid "Could not send test e-mail: %s" +#, python-format msgid "Could not generate key: %s" -msgstr "Не могу да пошаљем пробну е-пошту: %s" +msgstr "Нисмо могли генерисати кључ: %s" #: weblate/vcs/ssh.py:192 msgid "Created new SSH key." @@ -16808,16 +16186,14 @@ msgstr "" "молимо проверите да ли је исправан." #: weblate/vcs/ssh.py:243 weblate/vcs/ssh.py:249 -#, fuzzy, python-format -#| msgid "Could not fetch the repository: %s" +#, python-format msgid "Could not fetch public key for a host: %s" -msgstr "Неуспело добављање складишта: %s" +msgstr "Нисам могао да добијем јавни кључ за домаћина: %s" #: weblate/vcs/ssh.py:253 -#, fuzzy, python-format -#| msgid "Could not fetch the repository: %s" +#, python-format msgid "Could not get host key: %s" -msgstr "Неуспело добављање складишта: %s" +msgstr "Нисмо могли добити кључ домаћина: %s" #: weblate/wladmin/forms.py:15 msgid "Activation token" @@ -16918,7 +16294,7 @@ msgstr "Избрисана најстарија резервна копија" #: weblate/wladmin/models.py:309 msgid "Cleaned up backup storage" -msgstr "" +msgstr "Очишћено складиште резервних копија" #: weblate/wladmin/models.py:310 msgid "Repository initialization" @@ -16975,12 +16351,13 @@ msgid "" "Please change SITE_TITLE in settings to make your Weblate easy to recognize " "in discover." msgstr "" +"Молимо вас да промените SITE_TITLE у подешавањима да бисте ваш Веблејт " +"учинили лако препознатљивим у откривању." #: weblate/wladmin/views.py:206 weblate/wladmin/views.py:223 -#, fuzzy -#| msgid "Too many search queries, please try again later." msgid "Could not activate your installation. Please try again later." -msgstr "Превише упита за претрагу. Покушајте касније." +msgstr "" +"Није могуће активирати вашу инсталацију. Молимо вас покушајте поново касније." #: weblate/wladmin/views.py:215 msgid "" diff --git a/weblate/machinery/apertium.py b/weblate/machinery/apertium.py index 0f38284ba03a..43c9d0e8d2ef 100644 --- a/weblate/machinery/apertium.py +++ b/weblate/machinery/apertium.py @@ -4,6 +4,9 @@ from functools import reduce +from django.core.exceptions import ValidationError +from django.utils.translation import gettext + from .base import ( DownloadTranslations, ResponseStatusMachineTranslation, @@ -91,6 +94,28 @@ def map_language_code(self, code): return LANGUAGE_MAP[code] return code + def validate_settings(self) -> None: + try: + languages = self.download_languages() + except Exception as error: + raise ValidationError( + gettext("Could not fetch supported languages: %s") % error + ) from error + try: + source, language = languages[0] + except IndexError as error: + raise ValidationError( + gettext("No supported languages found: %s") % error + ) from error + try: + self.download_multiple_translations( + source, language, [("test", None)], None, 75 + ) + except Exception as error: + raise ValidationError( + gettext("Could not fetch translation: %s") % error + ) from error + def download_languages(self): """Download list of supported languages from a service.""" data = self.request("get", self.get_api_url("listPairs")).json() diff --git a/weblate/machinery/tests.py b/weblate/machinery/tests.py index d89e570ef461..e91025598743 100644 --- a/weblate/machinery/tests.py +++ b/weblate/machinery/tests.py @@ -543,6 +543,16 @@ def mock_response(self) -> None: }, ) + @responses.activate + def test_validate_settings(self): + self.mock_response() + machine = self.get_machine() + machine.validate_settings() + self.assertEqual(len(responses.calls), 2) + _, call_2 = responses.calls + self.assertIn("langpair", call_2.request.params) + self.assertEqual("eng|spa", call_2.request.params["langpair"]) + @responses.activate def test_translations_cache(self) -> None: self.mock_response() diff --git a/weblate/static/js/vendor/sentry.js b/weblate/static/js/vendor/sentry.js index 0a3bac927065..fb033cc5c059 100644 --- a/weblate/static/js/vendor/sentry.js +++ b/weblate/static/js/vendor/sentry.js @@ -1 +1 @@ -(()=>{"use strict";const t="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,e="8.33.1",n=globalThis;function r(t,r,o){const s=o||n,i=s.__SENTRY__=s.__SENTRY__||{},a=i[e]=i[e]||{};return a[t]||(a[t]=r())}const o=["debug","info","warn","error","log","assert","trace"],s={};function i(t){if(!("console"in n))return t();const e=n.console,r={},o=Object.keys(s);o.forEach((t=>{const n=s[t];r[t]=e[t],e[t]=n}));try{return t()}finally{o.forEach((t=>{e[t]=r[t]}))}}const a=r("logger",(function(){let e=!1;const r={enable:()=>{e=!0},disable:()=>{e=!1},isEnabled:()=>e};return t?o.forEach((t=>{r[t]=(...r)=>{e&&i((()=>{n.console[t](`Sentry Logger [${t}]:`,...r)}))}})):o.forEach((t=>{r[t]=()=>{}})),r})),c=Object.prototype.toString;function u(t){switch(c.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return v(t,Error)}}function l(t,e){return c.call(t)===`[object ${e}]`}function p(t){return l(t,"ErrorEvent")}function d(t){return l(t,"DOMError")}function f(t){return l(t,"String")}function h(t){return"object"==typeof t&&null!==t&&"__sentry_template_string__"in t&&"__sentry_template_values__"in t}function m(t){return null===t||h(t)||"object"!=typeof t&&"function"!=typeof t}function _(t){return l(t,"Object")}function g(t){return"undefined"!=typeof Event&&v(t,Event)}function y(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function v(t,e){try{return t instanceof e}catch(t){return!1}}function E(t){return!("object"!=typeof t||null===t||!t.__isVue&&!t._isVue)}const b=n,S=80;function x(t,e={}){if(!t)return"";try{let n=t;const r=5,o=[];let s=0,i=0;const a=" > ",c=a.length;let u;const l=Array.isArray(e)?e:e.keyAttrs,p=!Array.isArray(e)&&e.maxStringLength||S;for(;n&&s++1&&i+o.length*c+u.length>=p));)o.push(u),i+=u.length,n=n.parentNode;return o.reverse().join(a)}catch(t){return""}}function w(t,e){const n=t,r=[];if(!n||!n.tagName)return"";if(b.HTMLElement&&n instanceof HTMLElement&&n.dataset){if(n.dataset.sentryComponent)return n.dataset.sentryComponent;if(n.dataset.sentryElement)return n.dataset.sentryElement}r.push(n.tagName.toLowerCase());const o=e&&e.length?e.filter((t=>n.getAttribute(t))).map((t=>[t,n.getAttribute(t)])):null;if(o&&o.length)o.forEach((t=>{r.push(`[${t[0]}="${t[1]}"]`)}));else{n.id&&r.push(`#${n.id}`);const t=n.className;if(t&&f(t)){const e=t.split(/\s+/);for(const t of e)r.push(`.${t}`)}}const s=["aria-label","type","name","title","alt"];for(const t of s){const e=n.getAttribute(t);e&&r.push(`[${t}="${e}"]`)}return r.join("")}function k(t,e=0){return"string"!=typeof t||0===e||t.length<=e?t:`${t.slice(0,e)}...`}function $(t,e){if(!Array.isArray(t))return"";const n=[];for(let e=0;eO(t,e,n)))}function D(t,e,n){if(!(e in t))return;const r=t[e],o=n(r);"function"==typeof o&&I(o,r),t[e]=o}function N(e,n,r){try{Object.defineProperty(e,n,{value:r,writable:!0,configurable:!0})}catch(r){t&&a.log(`Failed to add non-enumerable property "${n}" to object`,e)}}function I(t,e){try{const n=e.prototype||{};t.prototype=e.prototype=n,N(t,"__sentry_original__",e)}catch(t){}}function P(t){return t.__sentry_original__}function R(t){if(u(t))return{message:t.message,name:t.name,stack:t.stack,...j(t)};if(g(t)){const e={type:t.type,target:C(t.target),currentTarget:C(t.currentTarget),...j(t)};return"undefined"!=typeof CustomEvent&&v(t,CustomEvent)&&(e.detail=t.detail),e}return t}function C(t){try{return e=t,"undefined"!=typeof Element&&v(e,Element)?x(t):Object.prototype.toString.call(t)}catch(t){return""}var e}function j(t){if("object"==typeof t&&null!==t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}return{}}function A(t){return L(t,new Map)}function L(t,e){if(function(t){if(!_(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||"Object"===e}catch(t){return!0}}(t)){const n=e.get(t);if(void 0!==n)return n;const r={};e.set(t,r);for(const n of Object.getOwnPropertyNames(t))void 0!==t[n]&&(r[n]=L(t[n],e));return r}if(Array.isArray(t)){const n=e.get(t);if(void 0!==n)return n;const r=[];return e.set(t,r),t.forEach((t=>{r.push(L(t,e))})),r}return t}function M(){const t=n,e=t.crypto||t.msCrypto;let r=()=>16*Math.random();try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(r=()=>{const t=new Uint8Array(1);return e.getRandomValues(t),t[0]})}catch(t){}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,(t=>(t^(15&r())>>t/4).toString(16)))}function U(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function q(t){const{message:e,event_id:n}=t;if(e)return e;const r=U(t);return r?r.type&&r.value?`${r.type}: ${r.value}`:r.type||r.value||n||"":n||""}function F(t,e,n){const r=t.exception=t.exception||{},o=r.values=r.values||[],s=o[0]=o[0]||{};s.value||(s.value=e||""),s.type||(s.type=n||"Error")}function Y(t,e){const n=U(t);if(!n)return;const r=n.mechanism;if(n.mechanism={type:"generic",handled:!0,...r,...e},e&&"data"in e){const t={...r&&r.data,...e.data};n.mechanism.data=t}}function B(t){if(t&&t.__sentry_captured__)return!0;try{N(t,"__sentry_captured__",!0)}catch(t){}return!1}function H(t){return Array.isArray(t)?t:[t]}const G="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,W=[];function z(t){const e=t.defaultIntegrations||[],n=t.integrations;let r;e.forEach((t=>{t.isDefaultInstance=!0})),r=Array.isArray(n)?[...e,...n]:"function"==typeof n?H(n(e)):e;const o=function(t){const e={};return t.forEach((t=>{const{name:n}=t,r=e[n];r&&!r.isDefaultInstance&&t.isDefaultInstance||(e[n]=t)})),Object.values(e)}(r),s=o.findIndex((t=>"Debug"===t.name));if(s>-1){const[t]=o.splice(s,1);o.push(t)}return o}function J(t,e){for(const n of e)n&&n.afterAllSetup&&n.afterAllSetup(t)}function V(t,e,n){if(n[e.name])G&&a.log(`Integration skipped because it was already installed: ${e.name}`);else{if(n[e.name]=e,-1===W.indexOf(e.name)&&"function"==typeof e.setupOnce&&(e.setupOnce(),W.push(e.name)),e.setup&&"function"==typeof e.setup&&e.setup(t),"function"==typeof e.preprocessEvent){const n=e.preprocessEvent.bind(e);t.on("preprocessEvent",((e,r)=>n(e,r,t)))}if("function"==typeof e.processEvent){const n=e.processEvent.bind(e),r=Object.assign(((e,r)=>n(e,r,t)),{id:e.name});t.addEventProcessor(r)}G&&a.log(`Integration installed: ${e.name}`)}}const K=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/,/^ResizeObserver loop completed with undelivered notifications.$/,/^Cannot redefine property: googletag$/,"undefined is not an object (evaluating 'a.L')",'can\'t redefine non-configurable property "solana"',"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)","Can't find variable: _AutofillCallbackHandler"],X=(t={})=>({name:"InboundFilters",processEvent(e,n,r){const o=r.getOptions(),s=function(t={},e={}){return{allowUrls:[...t.allowUrls||[],...e.allowUrls||[]],denyUrls:[...t.denyUrls||[],...e.denyUrls||[]],ignoreErrors:[...t.ignoreErrors||[],...e.ignoreErrors||[],...t.disableErrorDefaults?[]:K],ignoreTransactions:[...t.ignoreTransactions||[],...e.ignoreTransactions||[]],ignoreInternal:void 0===t.ignoreInternal||t.ignoreInternal}}(t,o);return function(t,e){if(e.ignoreInternal&&function(t){try{return"SentryError"===t.exception.values[0].type}catch(t){}return!1}(t))return G&&a.warn(`Event dropped due to being internal Sentry Error.\nEvent: ${q(t)}`),!0;if(function(t,e){if(t.type||!e||!e.length)return!1;return function(t){const e=[];t.message&&e.push(t.message);let n;try{n=t.exception.values[t.exception.values.length-1]}catch(t){}n&&n.value&&(e.push(n.value),n.type&&e.push(`${n.type}: ${n.value}`));return e}(t).some((t=>T(t,e)))}(t,e.ignoreErrors))return G&&a.warn(`Event dropped due to being matched by \`ignoreErrors\` option.\nEvent: ${q(t)}`),!0;if(function(t){if(t.type)return!1;if(!t.exception||!t.exception.values||0===t.exception.values.length)return!1;return!t.message&&!t.exception.values.some((t=>t.stacktrace||t.type&&"Error"!==t.type||t.value))}(t))return G&&a.warn(`Event dropped due to not having an error message, error type or stacktrace.\nEvent: ${q(t)}`),!0;if(function(t,e){if("transaction"!==t.type||!e||!e.length)return!1;const n=t.transaction;return!!n&&T(n,e)}(t,e.ignoreTransactions))return G&&a.warn(`Event dropped due to being matched by \`ignoreTransactions\` option.\nEvent: ${q(t)}`),!0;if(function(t,e){if(!e||!e.length)return!1;const n=Q(t);return!!n&&T(n,e)}(t,e.denyUrls))return G&&a.warn(`Event dropped due to being matched by \`denyUrls\` option.\nEvent: ${q(t)}.\nUrl: ${Q(t)}`),!0;if(!function(t,e){if(!e||!e.length)return!0;const n=Q(t);return!n||T(n,e)}(t,e.allowUrls))return G&&a.warn(`Event dropped due to not being matched by \`allowUrls\` option.\nEvent: ${q(t)}.\nUrl: ${Q(t)}`),!0;return!1}(e,s)?null:e}});function Q(t){try{let e;try{e=t.exception.values[0].stacktrace.frames}catch(t){}return e?function(t=[]){for(let e=t.length-1;e>=0;e--){const n=t[e];if(n&&""!==n.filename&&"[native code]"!==n.filename)return n.filename||null}return null}(e):null}catch(e){return G&&a.error(`Cannot extract url for event ${q(t)}`),null}}function Z(){return tt(n),n}function tt(t){const n=t.__SENTRY__=t.__SENTRY__||{};return n.version=n.version||e,n[e]=n[e]||{}}function et(){return{traceId:M(),spanId:M().substring(16)}}const nt=1e3;function rt(){return Date.now()/nt}const ot=function(){const{performance:t}=n;if(!t||!t.now)return rt;const e=Date.now()-t.now(),r=null==t.timeOrigin?e:t.timeOrigin;return()=>(r+t.now())/nt}();let st;(()=>{const{performance:t}=n;if(!t||!t.now)return void(st="none");const e=36e5,r=t.now(),o=Date.now(),s=t.timeOrigin?Math.abs(t.timeOrigin+r-o):e,i=sfunction(t){return A({sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(n)};return t&&at(n,t),n}function at(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),t.did||e.did||(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||ot(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=32===e.sid.length?e.sid:M()),void 0!==e.init&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),"number"==typeof e.started&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof e.duration)t.duration=e.duration;else{const e=t.timestamp-t.started;t.duration=e>=0?e:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),"number"==typeof e.errors&&(t.errors=e.errors),e.status&&(t.status=e.status)}const ct="_sentrySpan";function ut(t,e){e?N(t,ct,e):delete t[ct]}function lt(t){return t[ct]}class pt{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext=et()}clone(){const t=new pt;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._extra={...this._extra},t._contexts={...this._contexts},t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._requestSession=this._requestSession,t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,ut(t,lt(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&at(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}getRequestSession(){return this._requestSession}setRequestSession(t){return this._requestSession=t,this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,e){return this._tags={...this._tags,[t]:e},this._notifyScopeListeners(),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,e){return this._extra={...this._extra,[t]:e},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,e){return null===e?delete this._contexts[t]:this._contexts[t]=e,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const e="function"==typeof t?t(this):t,[n,r]=e instanceof dt?[e.getScopeData(),e.getRequestSession()]:_(e)?[t,t.requestSession]:[],{tags:o,extra:s,user:i,contexts:a,level:c,fingerprint:u=[],propagationContext:l}=n||{};return this._tags={...this._tags,...o},this._extra={...this._extra,...s},this._contexts={...this._contexts,...a},i&&Object.keys(i).length&&(this._user=i),c&&(this._level=c),u.length&&(this._fingerprint=u),l&&(this._propagationContext=l),r&&(this._requestSession=r),this}clear(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._requestSession=void 0,this._session=void 0,ut(this,void 0),this._attachments=[],this._propagationContext=et(),this._notifyScopeListeners(),this}addBreadcrumb(t,e){const n="number"==typeof e?e:100;if(n<=0)return this;const r={timestamp:rt(),...t},o=this._breadcrumbs;return o.push(r),this._breadcrumbs=o.length>n?o.slice(-n):o,this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:lt(this)}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata={...this._sdkProcessingMetadata,...t},this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,e){const n=e&&e.event_id?e.event_id:M();if(!this._client)return a.warn("No client configured on scope - will not capture exception!"),n;const r=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:r,...e,event_id:n},this),n}captureMessage(t,e,n){const r=n&&n.event_id?n.event_id:M();if(!this._client)return a.warn("No client configured on scope - will not capture message!"),r;const o=new Error(t);return this._client.captureMessage(t,e,{originalException:t,syntheticException:o,...n,event_id:r},this),r}captureEvent(t,e){const n=e&&e.event_id?e.event_id:M();return this._client?(this._client.captureEvent(t,{...e,event_id:n},this),n):(a.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach((t=>{t(this)})),this._notifyingListeners=!1)}}const dt=pt;class ft{constructor(t,e){let n,r;n=t||new dt,r=e||new dt,this._stack=[{scope:n}],this._isolationScope=r}withScope(t){const e=this._pushScope();let n;try{n=t(e)}catch(t){throw this._popScope(),t}return y(n)?n.then((t=>(this._popScope(),t)),(t=>{throw this._popScope(),t})):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return!(this._stack.length<=1)&&!!this._stack.pop()}}function ht(){const t=tt(Z());return t.stack=t.stack||new ft(r("defaultCurrentScope",(()=>new dt)),r("defaultIsolationScope",(()=>new dt)))}function mt(t){return ht().withScope(t)}function _t(t,e){const n=ht();return n.withScope((()=>(n.getStackTop().scope=t,e(t))))}function gt(t){return ht().withScope((()=>t(ht().getIsolationScope())))}function yt(t){const e=tt(t);return e.acs?e.acs:{withIsolationScope:gt,withScope:mt,withSetScope:_t,withSetIsolationScope:(t,e)=>gt(e),getCurrentScope:()=>ht().getScope(),getIsolationScope:()=>ht().getIsolationScope()}}function vt(){return yt(Z()).getCurrentScope()}function Et(){return yt(Z()).getIsolationScope()}function bt(){return vt().getClient()}let St;const xt=new WeakMap,wt=()=>({name:"FunctionToString",setupOnce(){St=Function.prototype.toString;try{Function.prototype.toString=function(...t){const e=P(this),n=xt.has(bt())&&void 0!==e?e:this;return St.apply(n,t)}}catch(t){}},setup(t){xt.set(t,!0)}}),kt=50,$t="?",Ot=/\(error: (.*)\)/,Tt=/captureMessage|captureException/;function Dt(...t){const e=t.sort(((t,e)=>t[0]-e[0])).map((t=>t[1]));return(t,n=0,r=0)=>{const o=[],s=t.split("\n");for(let t=n;t1024)continue;const i=Ot.test(n)?n.replace(Ot,"$1"):n;if(!i.match(/\S*Error: /)){for(const t of e){const e=t(i);if(e){o.push(e);break}}if(o.length>=kt+r)break}}return function(t){if(!t.length)return[];const e=Array.from(t);/sentryWrapped/.test(Nt(e).function||"")&&e.pop();e.reverse(),Tt.test(Nt(e).function||"")&&(e.pop(),Tt.test(Nt(e).function||"")&&e.pop());return e.slice(0,kt).map((t=>({...t,filename:t.filename||Nt(e).filename,function:t.function||$t})))}(o.slice(r))}}function Nt(t){return t[t.length-1]||{}}const It="";function Pt(t){try{return t&&"function"==typeof t&&t.name||It}catch(t){return It}}function Rt(t){const e=t.exception;if(e){const t=[];try{return e.values.forEach((e=>{e.stacktrace.frames&&t.push(...e.stacktrace.frames)})),t}catch(t){return}}}const Ct=()=>{let t;return{name:"Dedupe",processEvent(e){if(e.type)return e;try{if(function(t,e){if(!e)return!1;if(function(t,e){const n=t.message,r=e.message;if(!n&&!r)return!1;if(n&&!r||!n&&r)return!1;if(n!==r)return!1;if(!At(t,e))return!1;if(!jt(t,e))return!1;return!0}(t,e))return!0;if(function(t,e){const n=Lt(e),r=Lt(t);if(!n||!r)return!1;if(n.type!==r.type||n.value!==r.value)return!1;if(!At(t,e))return!1;if(!jt(t,e))return!1;return!0}(t,e))return!0;return!1}(e,t))return G&&a.warn("Event dropped due to being a duplicate of previously captured event."),null}catch(t){}return t=e}}};function jt(t,e){let n=Rt(t),r=Rt(e);if(!n&&!r)return!0;if(n&&!r||!n&&r)return!1;if(r.length!==n.length)return!1;for(let t=0;t{console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.")})));vt().update(e.initialScope);const n=new t(e);return function(t){vt().setClient(t)}(n),n.init(),n}const Ut="production";function qt(t,e=100,n=1/0){try{return Yt("",t,e,n)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function Ft(t,e=3,n=102400){const r=qt(t,e);return o=r,function(t){return~-encodeURI(t).split(/%..|./).length}(JSON.stringify(o))>n?Ft(t,e-1,n):r;var o}function Yt(t,e,n=1/0,r=1/0,o=function(){const t="function"==typeof WeakSet,e=t?new WeakSet:[];return[function(n){if(t)return!!e.has(n)||(e.add(n),!1);for(let t=0;t=r){l[t]="[MaxProperties ~]";break}const e=d[t];l[t]=Yt(t,e,c-1,r,o),p++}return i(e),l}var Bt;function Ht(t){return new Wt((e=>{e(t)}))}function Gt(t){return new Wt(((e,n)=>{n(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(Bt||(Bt={}));class Wt{constructor(t){Wt.prototype.__init.call(this),Wt.prototype.__init2.call(this),Wt.prototype.__init3.call(this),Wt.prototype.__init4.call(this),this._state=Bt.PENDING,this._handlers=[];try{t(this._resolve,this._reject)}catch(t){this._reject(t)}}then(t,e){return new Wt(((n,r)=>{this._handlers.push([!1,e=>{if(t)try{n(t(e))}catch(t){r(t)}else n(e)},t=>{if(e)try{n(e(t))}catch(t){r(t)}else r(t)}]),this._executeHandlers()}))}catch(t){return this.then((t=>t),t)}finally(t){return new Wt(((e,n)=>{let r,o;return this.then((e=>{o=!1,r=e,t&&t()}),(e=>{o=!0,r=e,t&&t()})).then((()=>{o?n(r):e(r)}))}))}__init(){this._resolve=t=>{this._setResult(Bt.RESOLVED,t)}}__init2(){this._reject=t=>{this._setResult(Bt.REJECTED,t)}}__init3(){this._setResult=(t,e)=>{this._state===Bt.PENDING&&(y(e)?e.then(this._resolve,this._reject):(this._state=t,this._value=e,this._executeHandlers()))}}__init4(){this._executeHandlers=()=>{if(this._state===Bt.PENDING)return;const t=this._handlers.slice();this._handlers=[],t.forEach((t=>{t[0]||(this._state===Bt.RESOLVED&&t[1](this._value),this._state===Bt.REJECTED&&t[2](this._value),t[0]=!0)}))}}}function zt(t,e,n,r=0){return new Wt(((o,s)=>{const i=t[r];if(null===e||"function"!=typeof i)o(e);else{const c=i({...e},n);G&&i.id&&null===c&&a.log(`Event processor "${i.id}" dropped event`),y(c)?c.then((e=>zt(t,e,n,r+1).then(o))).then(null,s):zt(t,c,n,r+1).then(o).then(null,s)}}))}const Jt="sentry-",Vt=/^sentry-/;function Kt(t){const e=function(t){if(!t||!f(t)&&!Array.isArray(t))return;if(Array.isArray(t))return t.reduce(((t,e)=>{const n=Xt(e);return Object.entries(n).forEach((([e,n])=>{t[e]=n})),t}),{});return Xt(t)}(t);if(!e)return;const n=Object.entries(e).reduce(((t,[e,n])=>{if(e.match(Vt)){t[e.slice(Jt.length)]=n}return t}),{});return Object.keys(n).length>0?n:void 0}function Xt(t){return t.split(",").map((t=>t.split("=").map((t=>decodeURIComponent(t.trim()))))).reduce(((t,[e,n])=>(e&&n&&(t[e]=n),t)),{})}const Qt="sentry.source",Zt="sentry.sample_rate",te="sentry.op",ee="sentry.origin";const ne="_sentryMetrics";function re(t){const e=t[ne];if(!e)return;const n={};for(const[,[t,r]]of e){(n[t]||(n[t]=[])).push(A(r))}return n}const oe=0,se=1;const ie=1;function ae(t){const{spanId:e,traceId:n}=t.spanContext(),{parent_span_id:r}=le(t);return A({parent_span_id:r,span_id:e,trace_id:n})}function ce(t){return"number"==typeof t?ue(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?ue(t.getTime()):ot()}function ue(t){return t>9999999999?t/1e3:t}function le(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();try{const{spanId:e,traceId:n}=t.spanContext();if(function(t){const e=t;return!!(e.attributes&&e.startTime&&e.name&&e.endTime&&e.status)}(t)){const{attributes:r,startTime:o,name:s,endTime:i,parentSpanId:a,status:c}=t;return A({span_id:e,trace_id:n,data:r,description:s,parent_span_id:a,start_timestamp:ce(o),timestamp:ce(i)||void 0,status:de(c),op:r[te],origin:r[ee],_metrics_summary:re(t)})}return{span_id:e,trace_id:n}}catch(t){return{}}}function pe(t){const{traceFlags:e}=t.spanContext();return e===ie}function de(t){if(t&&t.code!==oe)return t.code===se?"ok":t.message||"unknown_error"}const fe="_sentryRootSpan";function he(t){return t[fe]||t}const me="_frozenDsc";function _e(t,e){const n=e.getOptions(),{publicKey:r}=e.getDsn()||{},o=A({environment:n.environment||Ut,release:n.release,public_key:r,trace_id:t});return e.emit("createDsc",o),o}function ge(t){const e=bt();if(!e)return{};const n=_e(le(t).trace_id||"",e),r=he(t),o=r[me];if(o)return o;const s=r.spanContext().traceState,i=s&&s.get("sentry.dsc"),a=i&&Kt(i);if(a)return a;const c=le(r),u=c.data||{},l=u[Zt];null!=l&&(n.sample_rate=`${l}`);const p=u[Qt],d=c.description;return"url"!==p&&d&&(n.transaction=d),function(t){if("boolean"==typeof __SENTRY_TRACING__&&!__SENTRY_TRACING__)return!1;const e=bt(),n=t||e&&e.getOptions();return!!n&&(n.enableTracing||"tracesSampleRate"in n||"tracesSampler"in n)}()&&(n.sampled=String(pe(r))),e.emit("createDsc",n,r),n}function ye(t,e){const{fingerprint:n,span:r,breadcrumbs:o,sdkProcessingMetadata:s}=e;!function(t,e){const{extra:n,tags:r,user:o,contexts:s,level:i,transactionName:a}=e,c=A(n);c&&Object.keys(c).length&&(t.extra={...c,...t.extra});const u=A(r);u&&Object.keys(u).length&&(t.tags={...u,...t.tags});const l=A(o);l&&Object.keys(l).length&&(t.user={...l,...t.user});const p=A(s);p&&Object.keys(p).length&&(t.contexts={...p,...t.contexts});i&&(t.level=i);a&&"transaction"!==t.type&&(t.transaction=a)}(t,e),r&&function(t,e){t.contexts={trace:ae(e),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:ge(e),...t.sdkProcessingMetadata};const n=he(e),r=le(n).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,e){t.fingerprint=t.fingerprint?H(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e));t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}(t,n),function(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}(t,o),function(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}(t,s)}function ve(t,e){const{extra:n,tags:r,user:o,contexts:s,level:i,sdkProcessingMetadata:a,breadcrumbs:c,fingerprint:u,eventProcessors:l,attachments:p,propagationContext:d,transactionName:f,span:h}=e;Ee(t,"extra",n),Ee(t,"tags",r),Ee(t,"user",o),Ee(t,"contexts",s),Ee(t,"sdkProcessingMetadata",a),i&&(t.level=i),f&&(t.transactionName=f),h&&(t.span=h),c.length&&(t.breadcrumbs=[...t.breadcrumbs,...c]),u.length&&(t.fingerprint=[...t.fingerprint,...u]),l.length&&(t.eventProcessors=[...t.eventProcessors,...l]),p.length&&(t.attachments=[...t.attachments,...p]),t.propagationContext={...t.propagationContext,...d}}function Ee(t,e,n){if(n&&Object.keys(n).length){t[e]={...t[e]};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[e][r]=n[r])}}function be(t,e,o,s,i,a){const{normalizeDepth:c=3,normalizeMaxBreadth:u=1e3}=t,l={...e,event_id:e.event_id||o.event_id||M(),timestamp:e.timestamp||rt()},p=o.integrations||t.integrations.map((t=>t.name));!function(t,e){const{environment:n,release:r,dist:o,maxValueLength:s=250}=e;"environment"in t||(t.environment="environment"in e?n:Ut);void 0===t.release&&void 0!==r&&(t.release=r);void 0===t.dist&&void 0!==o&&(t.dist=o);t.message&&(t.message=k(t.message,s));const i=t.exception&&t.exception.values&&t.exception.values[0];i&&i.value&&(i.value=k(i.value,s));const a=t.request;a&&a.url&&(a.url=k(a.url,s))}(l,t),function(t,e){e.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=[...t.sdk.integrations||[],...e])}(l,p),i&&i.emit("applyFrameMetadata",e),void 0===e.type&&function(t,e){const r=n._sentryDebugIds;if(!r)return;let o;const s=Se.get(e);s?o=s:(o=new Map,Se.set(e,o));const i=Object.entries(r).reduce(((t,[n,r])=>{let s;const i=o.get(n);i?s=i:(s=e(n),o.set(n,s));for(let e=s.length-1;e>=0;e--){const n=s[e];if(n.filename){t[n.filename]=r;break}}return t}),{});try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.filename&&(t.debug_id=i[t.filename])}))}))}catch(t){}}(l,t.stackParser);const d=function(t,e){if(!e)return t;const n=t?t.clone():new dt;return n.update(e),n}(s,o.captureContext);o.mechanism&&Y(l,o.mechanism);const f=i?i.getEventProcessors():[],h=r("globalScope",(()=>new dt)).getScopeData();if(a){ve(h,a.getScopeData())}if(d){ve(h,d.getScopeData())}const m=[...o.attachments||[],...h.attachments];m.length&&(o.attachments=m),ye(l,h);return zt([...f,...h.eventProcessors],l,o).then((t=>(t&&function(t){const e={};try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.debug_id&&(t.abs_path?e[t.abs_path]=t.debug_id:t.filename&&(e[t.filename]=t.debug_id),delete t.debug_id)}))}))}catch(t){}if(0===Object.keys(e).length)return;t.debug_meta=t.debug_meta||{},t.debug_meta.images=t.debug_meta.images||[];const n=t.debug_meta.images;Object.entries(e).forEach((([t,e])=>{n.push({type:"sourcemap",code_file:t,debug_id:e})}))}(t),"number"==typeof c&&c>0?function(t,e,n){if(!t)return null;const r={...t,...t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map((t=>({...t,...t.data&&{data:qt(t.data,e,n)}})))},...t.user&&{user:qt(t.user,e,n)},...t.contexts&&{contexts:qt(t.contexts,e,n)},...t.extra&&{extra:qt(t.extra,e,n)}};t.contexts&&t.contexts.trace&&r.contexts&&(r.contexts.trace=t.contexts.trace,t.contexts.trace.data&&(r.contexts.trace.data=qt(t.contexts.trace.data,e,n)));t.spans&&(r.spans=t.spans.map((t=>({...t,...t.data&&{data:qt(t.data,e,n)}}))));return r}(t,c,u):t)))}const Se=new WeakMap;function xe(t){if(t)return function(t){return t instanceof dt||"function"==typeof t}(t)||function(t){return Object.keys(t).some((t=>we.includes(t)))}(t)?{captureContext:t}:t}const we=["user","level","extra","contexts","tags","fingerprint","requestSession","propagationContext"];function ke(t,e){return vt().captureEvent(t,e)}function $e(t){const e=bt(),r=Et(),o=vt(),{release:s,environment:i=Ut}=e&&e.getOptions()||{},{userAgent:a}=n.navigator||{},c=it({release:s,environment:i,user:o.getUser()||r.getUser(),...a&&{userAgent:a},...t}),u=r.getSession();return u&&"ok"===u.status&&at(u,{status:"exited"}),Oe(),r.setSession(c),o.setSession(c),c}function Oe(){const t=Et(),e=vt(),n=e.getSession()||t.getSession();n&&function(t,e){let n={};e?n={status:e}:"ok"===t.status&&(n={status:"exited"}),at(t,n)}(n),Te(),t.setSession(),e.setSession()}function Te(){const t=Et(),e=vt(),n=bt(),r=e.getSession()||t.getSession();r&&n&&n.captureSession(r)}function De(t=!1){t?Oe():Te()}const Ne=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/;function Ie(t,e=!1){const{host:n,path:r,pass:o,port:s,projectId:i,protocol:a,publicKey:c}=t;return`${a}://${c}${e&&o?`:${o}`:""}@${n}${s?`:${s}`:""}/${r?`${r}/`:r}${i}`}function Pe(t){return{protocol:t.protocol,publicKey:t.publicKey||"",pass:t.pass||"",host:t.host,port:t.port||"",path:t.path||"",projectId:t.projectId}}function Re(e){const n="string"==typeof e?function(t){const e=Ne.exec(t);if(!e)return void i((()=>{console.error(`Invalid Sentry Dsn: ${t}`)}));const[n,r,o="",s="",a="",c=""]=e.slice(1);let u="",l=c;const p=l.split("/");if(p.length>1&&(u=p.slice(0,-1).join("/"),l=p.pop()),l){const t=l.match(/^\d+/);t&&(l=t[0])}return Pe({host:s,pass:o,path:u,projectId:l,port:a,protocol:n,publicKey:r})}(e):Pe(e);if(n&&function(e){if(!t)return!0;const{port:n,projectId:r,protocol:o}=e;return!(["protocol","publicKey","host","projectId"].find((t=>!e[t]&&(a.error(`Invalid Sentry Dsn: ${t} missing`),!0)))||(r.match(/^\d+$/)?function(t){return"http"===t||"https"===t}(o)?n&&isNaN(parseInt(n,10))&&(a.error(`Invalid Sentry Dsn: Invalid port ${n}`),1):(a.error(`Invalid Sentry Dsn: Invalid protocol ${o}`),1):(a.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),1)))}(n))return n}const Ce="7";function je(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}function Ae(t,e){return n={sentry_key:t.publicKey,sentry_version:Ce,...e&&{sentry_client:`${e.name}/${e.version}`}},Object.keys(n).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(n[t])}`)).join("&");var n}function Le(t,e,n){return e||`${function(t){return`${je(t)}${t.projectId}/envelope/`}(t)}?${Ae(t,n)}`}const Me=n;function Ue(){if(!("fetch"in Me))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch(t){return!1}}function qe(t){return t&&/^function\s+\w+\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}const Fe={},Ye={};function Be(t,e){Fe[t]=Fe[t]||[],Fe[t].push(e)}function He(t,e){Ye[t]||(e(),Ye[t]=!0)}function Ge(e,n){const r=e&&Fe[e];if(r)for(const o of r)try{o(n)}catch(n){t&&a.error(`Error while triggering instrumentation handler.\nType: ${e}\nName: ${Pt(o)}\nError:`,n)}}const We=n;const ze=n;let Je;function Ve(t){const e="history";Be(e,t),He(e,Ke)}function Ke(){if(!function(){const t=We.chrome,e=t&&t.app&&t.app.runtime,n="history"in We&&!!We.history.pushState&&!!We.history.replaceState;return!e&&n}())return;const t=ze.onpopstate;function e(t){return function(...e){const n=e.length>2?e[2]:void 0;if(n){const t=Je,e=String(n);Je=e;Ge("history",{from:t,to:e})}return t.apply(this,e)}}ze.onpopstate=function(...e){const n=ze.location.href,r=Je;Je=n;if(Ge("history",{from:r,to:n}),t)try{return t.apply(this,e)}catch(t){}},D(ze.history,"pushState",e),D(ze.history,"replaceState",e)}function Xe(t,e=[]){return[t,e]}function Qe(t,e){const[n,r]=t;return[n,[...r,e]]}function Ze(t,e){const n=t[1];for(const t of n){if(e(t,t[0].type))return!0}return!1}function tn(t){return n.__SENTRY__&&n.__SENTRY__.encodePolyfill?n.__SENTRY__.encodePolyfill(t):(new TextEncoder).encode(t)}function en(t){const[e,n]=t;let r=JSON.stringify(e);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[tn(r),t]:r.push("string"==typeof t?tn(t):t)}for(const t of n){const[e,n]=t;if(o(`\n${JSON.stringify(e)}\n`),"string"==typeof n||n instanceof Uint8Array)o(n);else{let t;try{t=JSON.stringify(n)}catch(e){t=JSON.stringify(qt(n))}o(t)}}return"string"==typeof r?r:function(t){const e=t.reduce(((t,e)=>t+e.length),0),n=new Uint8Array(e);let r=0;for(const e of t)n.set(e,r),r+=e.length;return n}(r)}function nn(t){const e="string"==typeof t.data?tn(t.data):t.data;return[A({type:"attachment",length:e.length,filename:t.filename,content_type:t.contentType,attachment_type:t.attachmentType}),e]}const rn={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",profile_chunk:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function on(t){return rn[t]}function sn(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}class an extends Error{constructor(t,e="warn"){super(t),this.message=t,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=e}}function cn(t,e,n,r){const o=sn(n),s=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,e){e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]])}(t,n&&n.sdk);const i=function(t,e,n,r){const o=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:Ie(r)},...o&&{trace:A({...o})}}}(t,o,r,e);delete t.sdkProcessingMetadata;return Xe(i,[[{type:s},t]])}const un="Not capturing exception because it's already been captured.";class ln{constructor(t){if(this._options=t,this._integrations={},this._numProcessing=0,this._outcomes={},this._hooks={},this._eventProcessors=[],t.dsn?this._dsn=Re(t.dsn):G&&a.warn("No DSN provided, client will not send events."),this._dsn){const e=Le(this._dsn,t.tunnel,t._metadata?t._metadata.sdk:void 0);this._transport=t.transport({tunnel:this._options.tunnel,recordDroppedEvent:this.recordDroppedEvent.bind(this),...t.transportOptions,url:e})}}captureException(t,e,n){const r=M();if(B(t))return G&&a.log(un),r;const o={event_id:r,...e};return this._process(this.eventFromException(t,o).then((t=>this._captureEvent(t,o,n)))),o.event_id}captureMessage(t,e,n,r){const o={event_id:M(),...n},s=h(t)?t:String(t),i=m(t)?this.eventFromMessage(s,e,o):this.eventFromException(t,o);return this._process(i.then((t=>this._captureEvent(t,o,r)))),o.event_id}captureEvent(t,e,n){const r=M();if(e&&e.originalException&&B(e.originalException))return G&&a.log(un),r;const o={event_id:r,...e},s=(t.sdkProcessingMetadata||{}).capturedSpanScope;return this._process(this._captureEvent(t,o,s||n)),o.event_id}captureSession(t){"string"!=typeof t.release?G&&a.warn("Discarded session because of missing or non-string release"):(this.sendSession(t),at(t,{init:!1}))}getDsn(){return this._dsn}getOptions(){return this._options}getSdkMetadata(){return this._options._metadata}getTransport(){return this._transport}flush(t){const e=this._transport;return e?(this.emit("flush"),this._isClientDoneProcessing(t).then((n=>e.flush(t).then((t=>n&&t))))):Ht(!0)}close(t){return this.flush(t).then((t=>(this.getOptions().enabled=!1,this.emit("close"),t)))}getEventProcessors(){return this._eventProcessors}addEventProcessor(t){this._eventProcessors.push(t)}init(){(this._isEnabled()||this._options.integrations.some((({name:t})=>t.startsWith("Spotlight"))))&&this._setupIntegrations()}getIntegrationByName(t){return this._integrations[t]}addIntegration(t){const e=this._integrations[t.name];V(this,t,this._integrations),e||J(this,[t])}sendEvent(t,e={}){this.emit("beforeSendEvent",t,e);let n=cn(t,this._dsn,this._options._metadata,this._options.tunnel);for(const t of e.attachments||[])n=Qe(n,nn(t));const r=this.sendEnvelope(n);r&&r.then((e=>this.emit("afterSendEvent",t,e)),null)}sendSession(t){const e=function(t,e,n,r){const o=sn(n);return Xe({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&e&&{dsn:Ie(e)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(t,this._dsn,this._options._metadata,this._options.tunnel);this.sendEnvelope(e)}recordDroppedEvent(t,e,n){if(this._options.sendClientReports){const r="number"==typeof n?n:1,o=`${t}:${e}`;G&&a.log(`Recording outcome: "${o}"${r>1?` (${r} times)`:""}`),this._outcomes[o]=(this._outcomes[o]||0)+r}}on(t,e){const n=this._hooks[t]=this._hooks[t]||[];return n.push(e),()=>{const t=n.indexOf(e);t>-1&&n.splice(t,1)}}emit(t,...e){const n=this._hooks[t];n&&n.forEach((t=>t(...e)))}sendEnvelope(t){return this.emit("beforeEnvelope",t),this._isEnabled()&&this._transport?this._transport.send(t).then(null,(t=>(G&&a.error("Error while sending event:",t),t))):(G&&a.error("Transport disabled"),Ht({}))}_setupIntegrations(){const{integrations:t}=this._options;this._integrations=function(t,e){const n={};return e.forEach((e=>{e&&V(t,e,n)})),n}(this,t),J(this,t)}_updateSessionFromEvent(t,e){let n=!1,r=!1;const o=e.exception&&e.exception.values;if(o){r=!0;for(const t of o){const e=t.mechanism;if(e&&!1===e.handled){n=!0;break}}}const s="ok"===t.status;(s&&0===t.errors||s&&n)&&(at(t,{...n&&{status:"crashed"},errors:t.errors||Number(r||n)}),this.captureSession(t))}_isClientDoneProcessing(t){return new Wt((e=>{let n=0;const r=setInterval((()=>{0==this._numProcessing?(clearInterval(r),e(!0)):(n+=1,t&&n>=t&&(clearInterval(r),e(!1)))}),1)}))}_isEnabled(){return!1!==this.getOptions().enabled&&void 0!==this._transport}_prepareEvent(t,e,n,r=Et()){const o=this.getOptions(),s=Object.keys(this._integrations);return!e.integrations&&s.length>0&&(e.integrations=s),this.emit("preprocessEvent",t,e),t.type||r.setLastEventId(t.event_id||e.event_id),be(o,t,e,n,this,r).then((t=>{if(null===t)return t;const e={...r.getPropagationContext(),...n?n.getPropagationContext():void 0};if(!(t.contexts&&t.contexts.trace)&&e){const{traceId:n,spanId:r,parentSpanId:o,dsc:s}=e;t.contexts={trace:A({trace_id:n,span_id:r,parent_span_id:o}),...t.contexts};const i=s||_e(n,this);t.sdkProcessingMetadata={dynamicSamplingContext:i,...t.sdkProcessingMetadata}}return t}))}_captureEvent(t,e={},n){return this._processEvent(t,e,n).then((t=>t.event_id),(t=>{if(G){const e=t;"log"===e.logLevel?a.log(e.message):a.warn(e)}}))}_processEvent(t,e,n){const r=this.getOptions(),{sampleRate:o}=r,s=dn(t),i=pn(t),c=t.type||"error",u=`before send for type \`${c}\``,l=void 0===o?void 0:function(t){if("boolean"==typeof t)return Number(t);const e="string"==typeof t?parseFloat(t):t;if(!("number"!=typeof e||isNaN(e)||e<0||e>1))return e;G&&a.warn(`[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(t)} of type ${JSON.stringify(typeof t)}.`)}(o);if(i&&"number"==typeof l&&Math.random()>l)return this.recordDroppedEvent("sample_rate","error",t),Gt(new an(`Discarding event because it's not included in the random sample (sampling rate = ${o})`,"log"));const p="replay_event"===c?"replay":c,d=(t.sdkProcessingMetadata||{}).capturedSpanIsolationScope;return this._prepareEvent(t,e,n,d).then((n=>{if(null===n)throw this.recordDroppedEvent("event_processor",p,t),new an("An event processor returned `null`, will not send event.","log");if(e.data&&!0===e.data.__sentry__)return n;const o=function(t,e,n,r){const{beforeSend:o,beforeSendTransaction:s,beforeSendSpan:i}=e;if(pn(n)&&o)return o(n,r);if(dn(n)){if(n.spans&&i){const e=[];for(const r of n.spans){const n=i(r);n?e.push(n):t.recordDroppedEvent("before_send","span")}n.spans=e}if(s){if(n.spans){const t=n.spans.length;n.sdkProcessingMetadata={...n.sdkProcessingMetadata,spanCountBeforeProcessing:t}}return s(n,r)}}return n}(this,r,n,e);return function(t,e){const n=`${e} must return \`null\` or a valid event.`;if(y(t))return t.then((t=>{if(!_(t)&&null!==t)throw new an(n);return t}),(t=>{throw new an(`${e} rejected with ${t}`)}));if(!_(t)&&null!==t)throw new an(n);return t}(o,u)})).then((r=>{if(null===r){if(this.recordDroppedEvent("before_send",p,t),s){const e=1+(t.spans||[]).length;this.recordDroppedEvent("before_send","span",e)}throw new an(`${u} returned \`null\`, will not send event.`,"log")}const o=n&&n.getSession();if(!s&&o&&this._updateSessionFromEvent(o,r),s){const t=(r.sdkProcessingMetadata&&r.sdkProcessingMetadata.spanCountBeforeProcessing||0)-(r.spans?r.spans.length:0);t>0&&this.recordDroppedEvent("before_send","span",t)}const i=r.transaction_info;if(s&&i&&r.transaction!==t.transaction){const t="custom";r.transaction_info={...i,source:t}}return this.sendEvent(r,e),r})).then(null,(t=>{if(t instanceof an)throw t;throw this.captureException(t,{data:{__sentry__:!0},originalException:t}),new an(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${t}`)}))}_process(t){this._numProcessing++,t.then((t=>(this._numProcessing--,t)),(t=>(this._numProcessing--,t)))}_clearOutcomes(){const t=this._outcomes;return this._outcomes={},Object.entries(t).map((([t,e])=>{const[n,r]=t.split(":");return{reason:n,category:r,quantity:e}}))}_flushOutcomes(){G&&a.log("Flushing outcomes...");const t=this._clearOutcomes();if(0===t.length)return void(G&&a.log("No outcomes to send"));if(!this._dsn)return void(G&&a.log("No dsn provided, will not send outcomes"));G&&a.log("Sending outcomes:",t);const e=(n=t,Xe((r=this._options.tunnel&&Ie(this._dsn))?{dsn:r}:{},[[{type:"client_report"},{timestamp:o||rt(),discarded_events:n}]]));var n,r,o;this.sendEnvelope(e)}}function pn(t){return void 0===t.type}function dn(t){return"transaction"===t.type}const fn="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__;function hn(t,e){const n=gn(t,e),r={type:e&&e.name,value:vn(e)};return n.length&&(r.stacktrace={frames:n}),void 0===r.type&&""===r.value&&(r.value="Unrecoverable error caught"),r}function mn(t,e,n,r){const o=bt(),s=o&&o.getOptions().normalizeDepth,i=function(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e)){const n=t[e];if(n instanceof Error)return n}return}(e),a={__serialized__:Ft(e,s)};if(i)return{exception:{values:[hn(t,i)]},extra:a};const c={exception:{values:[{type:g(e)?e.constructor.name:r?"UnhandledRejection":"Error",value:Sn(e,{isUnhandledRejection:r})}]},extra:a};if(n){const e=gn(t,n);e.length&&(c.exception.values[0].stacktrace={frames:e})}return c}function _n(t,e){return{exception:{values:[hn(t,e)]}}}function gn(t,e){const n=e.stacktrace||e.stack||"",r=function(t){if(t&&yn.test(t.message))return 1;return 0}(e),o=function(t){if("number"==typeof t.framesToPop)return t.framesToPop;return 0}(e);try{return t(n,r,o)}catch(t){}return[]}const yn=/Minified React error #\d+;/i;function vn(t){const e=t&&t.message;return e?e.error&&"string"==typeof e.error.message?e.error.message:e:"No error message"}function En(t,e,n,r,o){let s;if(p(e)&&e.error){return _n(t,e.error)}if(d(e)||l(e,"DOMException")){const o=e;if("stack"in e)s=_n(t,e);else{const e=o.name||(d(o)?"DOMError":"DOMException"),i=o.message?`${e}: ${o.message}`:e;s=bn(t,i,n,r),F(s,i)}return"code"in o&&(s.tags={...s.tags,"DOMException.code":`${o.code}`}),s}if(u(e))return _n(t,e);if(_(e)||g(e)){return s=mn(t,e,n,o),Y(s,{synthetic:!0}),s}return s=bn(t,e,n,r),F(s,`${e}`,void 0),Y(s,{synthetic:!0}),s}function bn(t,e,n,r){const o={};if(r&&n){const r=gn(t,n);r.length&&(o.exception={values:[{value:e,stacktrace:{frames:r}}]})}if(h(e)){const{__sentry_template_string__:t,__sentry_template_values__:n}=e;return o.logentry={message:t,params:n},o}return o.message=e,o}function Sn(t,{isUnhandledRejection:e}){const n=function(t,e=40){const n=Object.keys(R(t));n.sort();const r=n[0];if(!r)return"[object has no keys]";if(r.length>=e)return k(r,e);for(let t=n.length;t>0;t--){const r=n.slice(0,t).join(", ");if(!(r.length>e))return t===n.length?r:k(r,e)}return""}(t),r=e?"promise rejection":"exception";if(p(t))return`Event \`ErrorEvent\` captured as ${r} with message \`${t.message}\``;if(g(t)){return`Event \`${function(t){try{const e=Object.getPrototypeOf(t);return e?e.constructor.name:void 0}catch(t){}}(t)}\` (type=${t.type}) captured as ${r}`}return`Object captured as ${r} with keys: ${n}`}const xn=n;let wn=0;function kn(){return wn>0}function $n(t,e={},n){if("function"!=typeof t)return t;try{const e=t.__sentry_wrapped__;if(e)return"function"==typeof e?e:t;if(P(t))return t}catch(e){return t}const r=function(){const r=Array.prototype.slice.call(arguments);try{n&&"function"==typeof n&&n.apply(this,arguments);const o=r.map((t=>$n(t,e)));return t.apply(this,o)}catch(t){throw wn++,setTimeout((()=>{wn--})),function(...t){const e=yt(Z());if(2===t.length){const[n,r]=t;return n?e.withSetScope(n,r):e.withScope(r)}e.withScope(t[0])}((n=>{var o,s;n.addEventProcessor((t=>(e.mechanism&&(F(t,void 0,void 0),Y(t,e.mechanism)),t.extra={...t.extra,arguments:r},t))),o=t,vt().captureException(o,xe(s))})),t}};try{for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])}catch(t){}I(r,t),N(t,"__sentry_wrapped__",r);try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get:()=>t.name})}catch(t){}return r}class On extends ln{constructor(t){const n={parentSpanIsAlwaysRootSpan:!0,...t};!function(t,n,r=[n],o="npm"){const s=t._metadata||{};s.sdk||(s.sdk={name:`sentry.javascript.${n}`,packages:r.map((t=>({name:`${o}:@sentry/${t}`,version:e}))),version:e}),t._metadata=s}(n,"browser",["browser"],xn.SENTRY_SDK_SOURCE||"npm"),super(n),n.sendClientReports&&xn.document&&xn.document.addEventListener("visibilitychange",(()=>{"hidden"===xn.document.visibilityState&&this._flushOutcomes()}))}eventFromException(t,e){return function(t,e,n,r){const o=En(t,e,n&&n.syntheticException||void 0,r);return Y(o),o.level="error",n&&n.event_id&&(o.event_id=n.event_id),Ht(o)}(this._options.stackParser,t,e,this._options.attachStacktrace)}eventFromMessage(t,e="info",n){return function(t,e,n="info",r,o){const s=bn(t,e,r&&r.syntheticException||void 0,o);return s.level=n,r&&r.event_id&&(s.event_id=r.event_id),Ht(s)}(this._options.stackParser,t,e,n,this._options.attachStacktrace)}captureUserFeedback(t){if(!this._isEnabled())return void(fn&&a.warn("SDK not enabled, will not capture user feedback."));const e=function(t,{metadata:e,tunnel:n,dsn:r}){const o={event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&e.sdk&&{sdk:{name:e.sdk.name,version:e.sdk.version}},...!!n&&!!r&&{dsn:Ie(r)}},s=function(t){return[{type:"user_report"},t]}(t);return Xe(o,[s])}(t,{metadata:this.getSdkMetadata(),dsn:this.getDsn(),tunnel:this.getOptions().tunnel});this.sendEnvelope(e)}_prepareEvent(t,e,n){return t.platform=t.platform||"javascript",super._prepareEvent(t,e,n)}}const Tn=1e3;let Dn,Nn,In;function Pn(){if(!ze.document)return;const t=Ge.bind(null,"dom"),e=Rn(t,!0);ze.document.addEventListener("click",e,!1),ze.document.addEventListener("keypress",e,!1),["EventTarget","Node"].forEach((e=>{const n=ze[e]&&ze[e].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(D(n,"addEventListener",(function(e){return function(n,r,o){if("click"===n||"keypress"==n)try{const r=this,s=r.__sentry_instrumentation_handlers__=r.__sentry_instrumentation_handlers__||{},i=s[n]=s[n]||{refCount:0};if(!i.handler){const r=Rn(t);i.handler=r,e.call(this,n,r,o)}i.refCount++}catch(t){}return e.call(this,n,r,o)}})),D(n,"removeEventListener",(function(t){return function(e,n,r){if("click"===e||"keypress"==e)try{const n=this,o=n.__sentry_instrumentation_handlers__||{},s=o[e];s&&(s.refCount--,s.refCount<=0&&(t.call(this,e,s.handler,r),s.handler=void 0,delete o[e]),0===Object.keys(o).length&&delete n.__sentry_instrumentation_handlers__)}catch(t){}return t.call(this,e,n,r)}})))}))}function Rn(t,e=!1){return n=>{if(!n||n._sentryCaptured)return;const r=function(t){try{return t.target}catch(t){return null}}(n);if(function(t,e){return"keypress"===t&&(!e||!e.tagName||"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName&&!e.isContentEditable)}(n.type,r))return;N(n,"_sentryCaptured",!0),r&&!r._sentryId&&N(r,"_sentryId",M());const o="keypress"===n.type?"input":n.type;if(!function(t){if(t.type!==Nn)return!1;try{if(!t.target||t.target._sentryId!==In)return!1}catch(t){}return!0}(n)){t({event:n,name:o,global:e}),Nn=n.type,In=r?r._sentryId:void 0}clearTimeout(Dn),Dn=ze.setTimeout((()=>{In=void 0,Nn=void 0}),Tn)}}const Cn="__sentry_xhr_v3__";function jn(){if(!ze.XMLHttpRequest)return;const t=XMLHttpRequest.prototype;t.open=new Proxy(t.open,{apply(t,e,n){const r=1e3*ot(),o=f(n[0])?n[0].toUpperCase():void 0,s=function(t){if(f(t))return t;try{return t.toString()}catch(t){}return}(n[1]);if(!o||!s)return t.apply(e,n);e[Cn]={method:o,url:s,request_headers:{}},"POST"===o&&s.match(/sentry_key/)&&(e.__sentry_own_request__=!0);const i=()=>{const t=e[Cn];if(t&&4===e.readyState){try{t.status_code=e.status}catch(t){}Ge("xhr",{endTimestamp:1e3*ot(),startTimestamp:r,xhr:e})}};return"onreadystatechange"in e&&"function"==typeof e.onreadystatechange?e.onreadystatechange=new Proxy(e.onreadystatechange,{apply:(t,e,n)=>(i(),t.apply(e,n))}):e.addEventListener("readystatechange",i),e.setRequestHeader=new Proxy(e.setRequestHeader,{apply(t,e,n){const[r,o]=n,s=e[Cn];return s&&f(r)&&f(o)&&(s.request_headers[r.toLowerCase()]=o),t.apply(e,n)}}),t.apply(e,n)}}),t.send=new Proxy(t.send,{apply(t,e,n){const r=e[Cn];if(!r)return t.apply(e,n);void 0!==n[0]&&(r.body=n[0]);return Ge("xhr",{startTimestamp:1e3*ot(),xhr:e}),t.apply(e,n)}})}const An=100;function Ln(t,e){const n=bt(),r=Et();if(!n)return;const{beforeBreadcrumb:o=null,maxBreadcrumbs:s=An}=n.getOptions();if(s<=0)return;const a={timestamp:rt(),...t},c=o?i((()=>o(a,e))):a;null!==c&&(n.emit&&n.emit("beforeAddBreadcrumb",c,e),r.addBreadcrumb(c,s))}function Mn(){"console"in n&&o.forEach((function(t){t in n.console&&D(n.console,t,(function(e){return s[t]=e,function(...e){Ge("console",{args:e,level:t});const r=s[t];r&&r.apply(n.console,e)}}))}))}function Un(e,r=!1){r&&!function(){if("string"==typeof EdgeRuntime)return!0;if(!Ue())return!1;if(qe(Me.fetch))return!0;let e=!1;const n=Me.document;if(n&&"function"==typeof n.createElement)try{const t=n.createElement("iframe");t.hidden=!0,n.head.appendChild(t),t.contentWindow&&t.contentWindow.fetch&&(e=qe(t.contentWindow.fetch)),n.head.removeChild(t)}catch(e){t&&a.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",e)}return e}()||D(n,"fetch",(function(t){return function(...r){const{method:o,url:s}=function(t){if(0===t.length)return{method:"GET",url:""};if(2===t.length){const[e,n]=t;return{url:Fn(e),method:qn(n,"method")?String(n.method).toUpperCase():"GET"}}const e=t[0];return{url:Fn(e),method:qn(e,"method")?String(e.method).toUpperCase():"GET"}}(r),i={args:r,fetchData:{method:o,url:s},startTimestamp:1e3*ot()};e||Ge("fetch",{...i});const a=(new Error).stack;return t.apply(n,r).then((async t=>(e?e(t):Ge("fetch",{...i,endTimestamp:1e3*ot(),response:t}),t)),(t=>{throw Ge("fetch",{...i,endTimestamp:1e3*ot(),error:t}),u(t)&&void 0===t.stack&&(t.stack=a,N(t,"framesToPop",1)),t}))}}))}function qn(t,e){return!!t&&"object"==typeof t&&!!t[e]}function Fn(t){return"string"==typeof t?t:t?qn(t,"url")?t.url:t.toString?t.toString():"":""}const Yn=["fatal","error","warning","log","info","debug"];function Bn(t){return"warn"===t?"warning":Yn.includes(t)?t:"log"}function Hn(t){return void 0===t?void 0:t>=400&&t<500?"warning":t>=500?"error":void 0}function Gn(t){if(!t)return{};const e=t.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!e)return{};const n=e[6]||"",r=e[8]||"";return{host:e[4],path:e[5],protocol:e[2],search:n,hash:r,relative:e[5]+n+r}}const Wn=1024,zn=(t={})=>{const e={console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0,...t};return{name:"Breadcrumbs",setup(t){var n;e.console&&function(t){const e="console";Be(e,t),He(e,Mn)}(function(t){return function(e){if(bt()!==t)return;const n={category:"console",data:{arguments:e.args,logger:"console"},level:Bn(e.level),message:$(e.args," ")};if("assert"===e.level){if(!1!==e.args[0])return;n.message=`Assertion failed: ${$(e.args.slice(1)," ")||"console.assert"}`,n.data.arguments=e.args.slice(1)}Ln(n,{input:e.args,level:e.level})}}(t)),e.dom&&(n=function(t,e){return function(n){if(bt()!==t)return;let r,o,s="object"==typeof e?e.serializeAttribute:void 0,i="object"==typeof e&&"number"==typeof e.maxStringLength?e.maxStringLength:void 0;i&&i>Wn&&(fn&&a.warn(`\`dom.maxStringLength\` cannot exceed 1024, but a value of ${i} was configured. Sentry will use 1024 instead.`),i=Wn),"string"==typeof s&&(s=[s]);try{const t=n.event,e=function(t){return!!t&&!!t.target}(t)?t.target:t;r=x(e,{keyAttrs:s,maxStringLength:i}),o=function(t){if(!b.HTMLElement)return null;let e=t;for(let t=0;t<5;t++){if(!e)return null;if(e instanceof HTMLElement){if(e.dataset.sentryComponent)return e.dataset.sentryComponent;if(e.dataset.sentryElement)return e.dataset.sentryElement}e=e.parentNode}return null}(e)}catch(t){r=""}if(0===r.length)return;const c={category:`ui.${n.name}`,message:r};o&&(c.data={"ui.component_name":o}),Ln(c,{event:n.event,name:n.name,global:n.global})}}(t,e.dom),Be("dom",n),He("dom",Pn)),e.xhr&&function(t){Be("xhr",t),He("xhr",jn)}(function(t){return function(e){if(bt()!==t)return;const{startTimestamp:n,endTimestamp:r}=e,o=e.xhr[Cn];if(!n||!r||!o)return;const{method:s,url:i,status_code:a,body:c}=o,u={method:s,url:i,status_code:a},l={xhr:e.xhr,input:c,startTimestamp:n,endTimestamp:r};Ln({category:"xhr",data:u,type:"http",level:Hn(a)},l)}}(t)),e.fetch&&function(t,e){const n="fetch";Be(n,t),He(n,(()=>Un(void 0,e)))}(function(t){return function(e){if(bt()!==t)return;const{startTimestamp:n,endTimestamp:r}=e;if(r&&(!e.fetchData.url.match(/sentry_key/)||"POST"!==e.fetchData.method))if(e.error){Ln({category:"fetch",data:e.fetchData,level:"error",type:"http"},{data:e.error,input:e.args,startTimestamp:n,endTimestamp:r})}else{const t=e.response,o={...e.fetchData,status_code:t&&t.status},s={input:e.args,response:t,startTimestamp:n,endTimestamp:r};Ln({category:"fetch",data:o,type:"http",level:Hn(o.status_code)},s)}}}(t)),e.history&&Ve(function(t){return function(e){if(bt()!==t)return;let n=e.from,r=e.to;const o=Gn(xn.location.href);let s=n?Gn(n):void 0;const i=Gn(r);s&&s.path||(s=o),o.protocol===i.protocol&&o.host===i.host&&(r=i.relative),o.protocol===s.protocol&&o.host===s.host&&(n=s.relative),Ln({category:"navigation",data:{from:n,to:r}})}}(t)),e.sentry&&t.on("beforeSendEvent",function(t){return function(e){bt()===t&&Ln({category:"sentry."+("transaction"===e.type?"transaction":"event"),event_id:e.event_id,level:e.level,message:q(e)},{event:e})}}(t))}}};const Jn=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","BroadcastChannel","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","SharedWorker","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],Vn=(t={})=>{const e={XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0,...t};return{name:"BrowserApiErrors",setupOnce(){e.setTimeout&&D(xn,"setTimeout",Kn),e.setInterval&&D(xn,"setInterval",Kn),e.requestAnimationFrame&&D(xn,"requestAnimationFrame",Xn),e.XMLHttpRequest&&"XMLHttpRequest"in xn&&D(XMLHttpRequest.prototype,"send",Qn);const t=e.eventTarget;if(t){(Array.isArray(t)?t:Jn).forEach(Zn)}}}};function Kn(t){return function(...e){const n=e[0];return e[0]=$n(n,{mechanism:{data:{function:Pt(t)},handled:!1,type:"instrument"}}),t.apply(this,e)}}function Xn(t){return function(e){return t.apply(this,[$n(e,{mechanism:{data:{function:"requestAnimationFrame",handler:Pt(t)},handled:!1,type:"instrument"}})])}}function Qn(t){return function(...e){const n=this;return["onload","onerror","onprogress","onreadystatechange"].forEach((t=>{t in n&&"function"==typeof n[t]&&D(n,t,(function(e){const n={mechanism:{data:{function:t,handler:Pt(e)},handled:!1,type:"instrument"}},r=P(e);return r&&(n.mechanism.data.handler=Pt(r)),$n(e,n)}))})),t.apply(this,e)}}function Zn(t){const e=xn,n=e[t]&&e[t].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(D(n,"addEventListener",(function(e){return function(n,r,o){try{"function"==typeof r.handleEvent&&(r.handleEvent=$n(r.handleEvent,{mechanism:{data:{function:"handleEvent",handler:Pt(r),target:t},handled:!1,type:"instrument"}}))}catch(t){}return e.apply(this,[n,$n(r,{mechanism:{data:{function:"addEventListener",handler:Pt(r),target:t},handled:!1,type:"instrument"}}),o])}})),D(n,"removeEventListener",(function(t){return function(e,n,r){const o=n;try{const n=o&&o.__sentry_wrapped__;n&&t.call(this,e,n,r)}catch(t){}return t.call(this,e,o,r)}})))}let tr=null;function er(){tr=n.onerror,n.onerror=function(t,e,n,r,o){return Ge("error",{column:r,error:o,line:n,msg:t,url:e}),!(!tr||tr.__SENTRY_LOADER__)&&tr.apply(this,arguments)},n.onerror.__SENTRY_INSTRUMENTED__=!0}let nr=null;function rr(){nr=n.onunhandledrejection,n.onunhandledrejection=function(t){return Ge("unhandledrejection",t),!(nr&&!nr.__SENTRY_LOADER__)||nr.apply(this,arguments)},n.onunhandledrejection.__SENTRY_INSTRUMENTED__=!0}const or=(t={})=>{const e={onerror:!0,onunhandledrejection:!0,...t};return{name:"GlobalHandlers",setupOnce(){Error.stackTraceLimit=50},setup(t){e.onerror&&(!function(t){!function(t){const e="error";Be(e,t),He(e,er)}((e=>{const{stackParser:n,attachStacktrace:r}=ir();if(bt()!==t||kn())return;const{msg:o,url:s,line:i,column:a,error:c}=e,u=function(t,e,n,r){const o=t.exception=t.exception||{},s=o.values=o.values||[],i=s[0]=s[0]||{},a=i.stacktrace=i.stacktrace||{},c=a.frames=a.frames||[],u=isNaN(parseInt(r,10))?void 0:r,l=isNaN(parseInt(n,10))?void 0:n,p=f(e)&&e.length>0?e:function(){try{return b.document.location.href}catch(t){return""}}();0===c.length&&c.push({colno:u,filename:p,function:$t,in_app:!0,lineno:l});return t}(En(n,c||o,void 0,r,!1),s,i,a);u.level="error",ke(u,{originalException:c,mechanism:{handled:!1,type:"onerror"}})}))}(t),sr("onerror")),e.onunhandledrejection&&(!function(t){!function(t){const e="unhandledrejection";Be(e,t),He(e,rr)}((e=>{const{stackParser:n,attachStacktrace:r}=ir();if(bt()!==t||kn())return;const o=function(t){if(m(t))return t;try{if("reason"in t)return t.reason;if("detail"in t&&"reason"in t.detail)return t.detail.reason}catch(t){}return t}(e),s=m(o)?{exception:{values:[{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(o)}`}]}}:En(n,o,void 0,r,!0);s.level="error",ke(s,{originalException:o,mechanism:{handled:!1,type:"onunhandledrejection"}})}))}(t),sr("onunhandledrejection"))}}};function sr(t){fn&&a.log(`Global Handler attached: ${t}`)}function ir(){const t=bt();return t&&t.getOptions()||{stackParser:()=>[],attachStacktrace:!1}}const ar=()=>({name:"HttpContext",preprocessEvent(t){if(!xn.navigator&&!xn.location&&!xn.document)return;const e=t.request&&t.request.url||xn.location&&xn.location.href,{referrer:n}=xn.document||{},{userAgent:r}=xn.navigator||{},o={...t.request&&t.request.headers,...n&&{Referer:n},...r&&{"User-Agent":r}},s={...t.request,...e&&{url:e},headers:o};t.request=s}});function cr(t,e,n=250,r,o,s,i){if(!(s.exception&&s.exception.values&&i&&v(i.originalException,Error)))return;const a=s.exception.values.length>0?s.exception.values[s.exception.values.length-1]:void 0;var c,u;a&&(s.exception.values=(c=ur(t,e,o,i.originalException,r,s.exception.values,a,0),u=n,c.map((t=>(t.value&&(t.value=k(t.value,u)),t)))))}function ur(t,e,n,r,o,s,i,a){if(s.length>=n+1)return s;let c=[...s];if(v(r[o],Error)){lr(i,a);const s=t(e,r[o]),u=c.length;pr(s,o,u,a),c=ur(t,e,n,r[o],o,[s,...c],s,u)}return Array.isArray(r.errors)&&r.errors.forEach(((r,s)=>{if(v(r,Error)){lr(i,a);const u=t(e,r),l=c.length;pr(u,`errors[${s}]`,l,a),c=ur(t,e,n,r,o,[u,...c],u,l)}})),c}function lr(t,e){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,..."AggregateError"===t.type&&{is_exception_group:!0},exception_id:e}}function pr(t,e,n,r){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,type:"chained",source:e,exception_id:n,parent_id:r}}const dr=(t={})=>{const e=t.limit||5,n=t.key||"cause";return{name:"LinkedErrors",preprocessEvent(t,r,o){const s=o.getOptions();cr(hn,s.stackParser,s.maxValueLength,n,e,t,r)}}};function fr(t,e,n,r){const o={filename:t,function:""===e?$t:e,in_app:!0};return void 0!==n&&(o.lineno=n),void 0!==r&&(o.colno=r),o}const hr=/^\s*at (\S+?)(?::(\d+))(?::(\d+))\s*$/i,mr=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,_r=/\((\S*)(?::(\d+))(?::(\d+))\)/,gr=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,yr=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,vr=Dt(...[[30,t=>{const e=hr.exec(t);if(e){const[,t,n,r]=e;return fr(t,$t,+n,+r)}const n=mr.exec(t);if(n){if(n[2]&&0===n[2].indexOf("eval")){const t=_r.exec(n[2]);t&&(n[2]=t[1],n[3]=t[2],n[4]=t[3])}const[t,e]=Er(n[1]||$t,n[2]);return fr(e,t,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],[50,t=>{const e=gr.exec(t);if(e){if(e[3]&&e[3].indexOf(" > eval")>-1){const t=yr.exec(e[3]);t&&(e[1]=e[1]||"eval",e[3]=t[1],e[4]=t[2],e[5]="")}let t=e[3],n=e[1]||$t;return[n,t]=Er(n,t),fr(t,n,e[4]?+e[4]:void 0,e[5]?+e[5]:void 0)}}]]),Er=(t,e)=>{const n=-1!==t.indexOf("safari-extension"),r=-1!==t.indexOf("safari-web-extension");return n||r?[-1!==t.indexOf("@")?t.split("@")[0]:$t,n?`safari-extension:${e}`:`safari-web-extension:${e}`]:[t,e]},br="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,Sr={};function xr(t){const e=Sr[t];if(e)return e;let n=ze[t];if(qe(n))return Sr[t]=n.bind(ze);const r=ze.document;if(r&&"function"==typeof r.createElement)try{const e=r.createElement("iframe");e.hidden=!0,r.head.appendChild(e);const o=e.contentWindow;o&&o[t]&&(n=o[t]),r.head.removeChild(e)}catch(e){br&&a.warn(`Could not create sandbox iframe for ${t} check, bailing to window.${t}: `,e)}return n?Sr[t]=n.bind(ze):n}function wr(t){Sr[t]=void 0}function kr(t){const e=[];function n(t){return e.splice(e.indexOf(t),1)[0]||Promise.resolve(void 0)}return{$:e,add:function(r){if(!(void 0===t||e.lengthn(o))).then(null,(()=>n(o).then(null,(()=>{})))),o},drain:function(t){return new Wt(((n,r)=>{let o=e.length;if(!o)return n(!0);const s=setTimeout((()=>{t&&t>0&&n(!1)}),t);e.forEach((t=>{Ht(t).then((()=>{--o||(clearTimeout(s),n(!0))}),r)}))}))}}}const $r=6e4;function Or(t,{statusCode:e,headers:n},r=Date.now()){const o={...t},s=n&&n["x-sentry-rate-limits"],i=n&&n["retry-after"];if(s)for(const t of s.trim().split(",")){const[e,n,,,s]=t.split(":",5),i=parseInt(e,10),a=1e3*(isNaN(i)?60:i);if(n)for(const t of n.split(";"))"metric_bucket"===t&&s&&!s.split(";").includes("custom")||(o[t]=r+a);else o.all=r+a}else i?o.all=r+function(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return 1e3*n;const r=Date.parse(`${t}`);return isNaN(r)?$r:r-e}(i,r):429===e&&(o.all=r+6e4);return o}const Tr=64;function Dr(t,e,n=kr(t.bufferSize||Tr)){let r={};return{send:function(o){const s=[];if(Ze(o,((e,n)=>{const o=on(n);if(function(t,e,n=Date.now()){return function(t,e){return t[e]||t.all||0}(t,e)>n}(r,o)){const r=Nr(e,n);t.recordDroppedEvent("ratelimit_backoff",o,r)}else s.push(e)})),0===s.length)return Ht({});const i=Xe(o[0],s),c=e=>{Ze(i,((n,r)=>{const o=Nr(n,r);t.recordDroppedEvent(e,on(r),o)}))};return n.add((()=>e({body:en(i)}).then((t=>(void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&G&&a.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=Or(r,t),t)),(t=>{throw c("network_error"),t})))).then((t=>t),(t=>{if(t instanceof an)return G&&a.error("Skipped sending event because buffer is full."),c("queue_overflow"),Ht({});throw t}))},flush:t=>n.drain(t)}}function Nr(t,e){if("event"===e||"transaction"===e)return Array.isArray(t)?t[1]:void 0}function Ir(t,e=xr("fetch")){let n=0,r=0;return Dr(t,(function(o){const s=o.body.length;n+=s,r++;const i={body:o.body,method:"POST",referrerPolicy:"origin",headers:t.headers,keepalive:n<=6e4&&r<15,...t.fetchOptions};if(!e)return wr("fetch"),Gt("No fetch implementation available");try{return e(t.url,i).then((t=>(n-=s,r--,{statusCode:t.status,headers:{"x-sentry-rate-limits":t.headers.get("X-Sentry-Rate-Limits"),"retry-after":t.headers.get("Retry-After")}})))}catch(t){return wr("fetch"),n-=s,r--,Gt(t)}}))}const Pr={init:function(t={}){const e=function(t={}){const e={defaultIntegrations:[X(),wt(),Vn(),zn(),or(),dr(),Ct(),ar()],release:"string"==typeof __SENTRY_RELEASE__?__SENTRY_RELEASE__:xn.SENTRY_RELEASE&&xn.SENTRY_RELEASE.id?xn.SENTRY_RELEASE.id:void 0,autoSessionTracking:!0,sendClientReports:!0};return null==t.defaultIntegrations&&delete t.defaultIntegrations,{...e,...t}}(t);if(function(){const t=void 0!==xn.window&&xn;if(!t)return!1;const e=t[t.chrome?"chrome":"browser"],n=e&&e.runtime&&e.runtime.id,r=xn.location&&xn.location.href||"",o=!!n&&xn===xn.top&&["chrome-extension:","moz-extension:","ms-browser-extension:","safari-web-extension:"].some((t=>r.startsWith(`${t}//`))),s=void 0!==t.nw;return!!n&&!o&&!s}())return void i((()=>{console.error("[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/")}));fn&&(Ue()||a.warn("No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill."));const n={...e,stackParser:(r=e.stackParser||vr,Array.isArray(r)?Dt(...r):r),integrations:z(e),transport:e.transport||Ir};var r;const o=Mt(On,n);return e.autoSessionTracking&&function(){if(void 0===xn.document)return void(fn&&a.warn("Session tracking in non-browser environment with @sentry/browser is not supported."));$e({ignoreDuration:!0}),De(),Ve((({from:t,to:e})=>{void 0!==t&&t!==e&&($e({ignoreDuration:!0}),De())}))}(),o},showReportDialog:function(t={}){if(!xn.document)return void(fn&&a.error("Global document not defined in showReportDialog call"));const e=vt(),n=e.getClient(),r=n&&n.getDsn();if(!r)return void(fn&&a.error("DSN not configured for showReportDialog call"));if(e&&(t.user={...e.getUser(),...t.user}),!t.eventId){const e=Et().lastEventId();e&&(t.eventId=e)}const o=xn.document.createElement("script");o.async=!0,o.crossOrigin="anonymous",o.src=function(t,e){const n=Re(t);if(!n)return"";const r=`${je(n)}embed/error-page/`;let o=`dsn=${Ie(n)}`;for(const t in e)if("dsn"!==t&&"onClose"!==t)if("user"===t){const t=e.user;if(!t)continue;t.name&&(o+=`&name=${encodeURIComponent(t.name)}`),t.email&&(o+=`&email=${encodeURIComponent(t.email)}`)}else o+=`&${encodeURIComponent(t)}=${encodeURIComponent(e[t])}`;return`${r}?${o}`}(r,t),t.onLoad&&(o.onload=t.onLoad);const{onClose:s}=t;if(s){const t=e=>{if("__sentry_reportdialog_closed__"===e.data)try{s()}finally{xn.removeEventListener("message",t)}};xn.addEventListener("message",t)}const i=xn.document.head||xn.document.body;i?i.appendChild(o):fn&&a.error("Not injecting report dialog. No injection point found in HTML")}};window.Sentry=Pr})(); \ No newline at end of file +(()=>{"use strict";const t="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,e="8.34.0",n=globalThis;function r(t,r,s){const o=s||n,i=o.__SENTRY__=o.__SENTRY__||{},a=i[e]=i[e]||{};return a[t]||(a[t]=r())}const s=["debug","info","warn","error","log","assert","trace"],o={};function i(t){if(!("console"in n))return t();const e=n.console,r={},s=Object.keys(o);s.forEach((t=>{const n=o[t];r[t]=e[t],e[t]=n}));try{return t()}finally{s.forEach((t=>{e[t]=r[t]}))}}const a=r("logger",(function(){let e=!1;const r={enable:()=>{e=!0},disable:()=>{e=!1},isEnabled:()=>e};return t?s.forEach((t=>{r[t]=(...r)=>{e&&i((()=>{n.console[t](`Sentry Logger [${t}]:`,...r)}))}})):s.forEach((t=>{r[t]=()=>{}})),r})),c=Object.prototype.toString;function u(t){switch(c.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return v(t,Error)}}function l(t,e){return c.call(t)===`[object ${e}]`}function p(t){return l(t,"ErrorEvent")}function d(t){return l(t,"DOMError")}function f(t){return l(t,"String")}function h(t){return"object"==typeof t&&null!==t&&"__sentry_template_string__"in t&&"__sentry_template_values__"in t}function m(t){return null===t||h(t)||"object"!=typeof t&&"function"!=typeof t}function _(t){return l(t,"Object")}function g(t){return"undefined"!=typeof Event&&v(t,Event)}function y(t){return Boolean(t&&t.then&&"function"==typeof t.then)}function v(t,e){try{return t instanceof e}catch(t){return!1}}function E(t){return!("object"!=typeof t||null===t||!t.__isVue&&!t._isVue)}const b=n,S=80;function x(t,e={}){if(!t)return"";try{let n=t;const r=5,s=[];let o=0,i=0;const a=" > ",c=a.length;let u;const l=Array.isArray(e)?e:e.keyAttrs,p=!Array.isArray(e)&&e.maxStringLength||S;for(;n&&o++1&&i+s.length*c+u.length>=p));)s.push(u),i+=u.length,n=n.parentNode;return s.reverse().join(a)}catch(t){return""}}function w(t,e){const n=t,r=[];if(!n||!n.tagName)return"";if(b.HTMLElement&&n instanceof HTMLElement&&n.dataset){if(n.dataset.sentryComponent)return n.dataset.sentryComponent;if(n.dataset.sentryElement)return n.dataset.sentryElement}r.push(n.tagName.toLowerCase());const s=e&&e.length?e.filter((t=>n.getAttribute(t))).map((t=>[t,n.getAttribute(t)])):null;if(s&&s.length)s.forEach((t=>{r.push(`[${t[0]}="${t[1]}"]`)}));else{n.id&&r.push(`#${n.id}`);const t=n.className;if(t&&f(t)){const e=t.split(/\s+/);for(const t of e)r.push(`.${t}`)}}const o=["aria-label","type","name","title","alt"];for(const t of o){const e=n.getAttribute(t);e&&r.push(`[${t}="${e}"]`)}return r.join("")}function k(t,e=0){return"string"!=typeof t||0===e||t.length<=e?t:`${t.slice(0,e)}...`}function $(t,e){if(!Array.isArray(t))return"";const n=[];for(let e=0;eO(t,e,n)))}function D(t,e,n){if(!(e in t))return;const r=t[e],s=n(r);"function"==typeof s&&I(s,r),t[e]=s}function N(e,n,r){try{Object.defineProperty(e,n,{value:r,writable:!0,configurable:!0})}catch(r){t&&a.log(`Failed to add non-enumerable property "${n}" to object`,e)}}function I(t,e){try{const n=e.prototype||{};t.prototype=e.prototype=n,N(t,"__sentry_original__",e)}catch(t){}}function P(t){return t.__sentry_original__}function R(t){if(u(t))return{message:t.message,name:t.name,stack:t.stack,...j(t)};if(g(t)){const e={type:t.type,target:C(t.target),currentTarget:C(t.currentTarget),...j(t)};return"undefined"!=typeof CustomEvent&&v(t,CustomEvent)&&(e.detail=t.detail),e}return t}function C(t){try{return e=t,"undefined"!=typeof Element&&v(e,Element)?x(t):Object.prototype.toString.call(t)}catch(t){return""}var e}function j(t){if("object"==typeof t&&null!==t){const e={};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}return{}}function A(t){return L(t,new Map)}function L(t,e){if(function(t){if(!_(t))return!1;try{const e=Object.getPrototypeOf(t).constructor.name;return!e||"Object"===e}catch(t){return!0}}(t)){const n=e.get(t);if(void 0!==n)return n;const r={};e.set(t,r);for(const n of Object.getOwnPropertyNames(t))void 0!==t[n]&&(r[n]=L(t[n],e));return r}if(Array.isArray(t)){const n=e.get(t);if(void 0!==n)return n;const r=[];return e.set(t,r),t.forEach((t=>{r.push(L(t,e))})),r}return t}function M(){const t=n,e=t.crypto||t.msCrypto;let r=()=>16*Math.random();try{if(e&&e.randomUUID)return e.randomUUID().replace(/-/g,"");e&&e.getRandomValues&&(r=()=>{const t=new Uint8Array(1);return e.getRandomValues(t),t[0]})}catch(t){}return([1e7]+1e3+4e3+8e3+1e11).replace(/[018]/g,(t=>(t^(15&r())>>t/4).toString(16)))}function U(t){return t.exception&&t.exception.values?t.exception.values[0]:void 0}function q(t){const{message:e,event_id:n}=t;if(e)return e;const r=U(t);return r?r.type&&r.value?`${r.type}: ${r.value}`:r.type||r.value||n||"":n||""}function F(t,e,n){const r=t.exception=t.exception||{},s=r.values=r.values||[],o=s[0]=s[0]||{};o.value||(o.value=e||""),o.type||(o.type=n||"Error")}function Y(t,e){const n=U(t);if(!n)return;const r=n.mechanism;if(n.mechanism={type:"generic",handled:!0,...r,...e},e&&"data"in e){const t={...r&&r.data,...e.data};n.mechanism.data=t}}function B(t){if(t&&t.__sentry_captured__)return!0;try{N(t,"__sentry_captured__",!0)}catch(t){}return!1}function H(t){return Array.isArray(t)?t:[t]}const G="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,W=[];function z(t){const e=t.defaultIntegrations||[],n=t.integrations;let r;e.forEach((t=>{t.isDefaultInstance=!0})),r=Array.isArray(n)?[...e,...n]:"function"==typeof n?H(n(e)):e;const s=function(t){const e={};return t.forEach((t=>{const{name:n}=t,r=e[n];r&&!r.isDefaultInstance&&t.isDefaultInstance||(e[n]=t)})),Object.values(e)}(r),o=s.findIndex((t=>"Debug"===t.name));if(o>-1){const[t]=s.splice(o,1);s.push(t)}return s}function J(t,e){for(const n of e)n&&n.afterAllSetup&&n.afterAllSetup(t)}function V(t,e,n){if(n[e.name])G&&a.log(`Integration skipped because it was already installed: ${e.name}`);else{if(n[e.name]=e,-1===W.indexOf(e.name)&&"function"==typeof e.setupOnce&&(e.setupOnce(),W.push(e.name)),e.setup&&"function"==typeof e.setup&&e.setup(t),"function"==typeof e.preprocessEvent){const n=e.preprocessEvent.bind(e);t.on("preprocessEvent",((e,r)=>n(e,r,t)))}if("function"==typeof e.processEvent){const n=e.processEvent.bind(e),r=Object.assign(((e,r)=>n(e,r,t)),{id:e.name});t.addEventProcessor(r)}G&&a.log(`Integration installed: ${e.name}`)}}const K=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/,/^ResizeObserver loop completed with undelivered notifications.$/,/^Cannot redefine property: googletag$/,"undefined is not an object (evaluating 'a.L')",'can\'t redefine non-configurable property "solana"',"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)","Can't find variable: _AutofillCallbackHandler"],X=(t={})=>({name:"InboundFilters",processEvent(e,n,r){const s=r.getOptions(),o=function(t={},e={}){return{allowUrls:[...t.allowUrls||[],...e.allowUrls||[]],denyUrls:[...t.denyUrls||[],...e.denyUrls||[]],ignoreErrors:[...t.ignoreErrors||[],...e.ignoreErrors||[],...t.disableErrorDefaults?[]:K],ignoreTransactions:[...t.ignoreTransactions||[],...e.ignoreTransactions||[]],ignoreInternal:void 0===t.ignoreInternal||t.ignoreInternal}}(t,s);return function(t,e){if(e.ignoreInternal&&function(t){try{return"SentryError"===t.exception.values[0].type}catch(t){}return!1}(t))return G&&a.warn(`Event dropped due to being internal Sentry Error.\nEvent: ${q(t)}`),!0;if(function(t,e){if(t.type||!e||!e.length)return!1;return function(t){const e=[];t.message&&e.push(t.message);let n;try{n=t.exception.values[t.exception.values.length-1]}catch(t){}n&&n.value&&(e.push(n.value),n.type&&e.push(`${n.type}: ${n.value}`));return e}(t).some((t=>T(t,e)))}(t,e.ignoreErrors))return G&&a.warn(`Event dropped due to being matched by \`ignoreErrors\` option.\nEvent: ${q(t)}`),!0;if(function(t){if(t.type)return!1;if(!t.exception||!t.exception.values||0===t.exception.values.length)return!1;return!t.message&&!t.exception.values.some((t=>t.stacktrace||t.type&&"Error"!==t.type||t.value))}(t))return G&&a.warn(`Event dropped due to not having an error message, error type or stacktrace.\nEvent: ${q(t)}`),!0;if(function(t,e){if("transaction"!==t.type||!e||!e.length)return!1;const n=t.transaction;return!!n&&T(n,e)}(t,e.ignoreTransactions))return G&&a.warn(`Event dropped due to being matched by \`ignoreTransactions\` option.\nEvent: ${q(t)}`),!0;if(function(t,e){if(!e||!e.length)return!1;const n=Q(t);return!!n&&T(n,e)}(t,e.denyUrls))return G&&a.warn(`Event dropped due to being matched by \`denyUrls\` option.\nEvent: ${q(t)}.\nUrl: ${Q(t)}`),!0;if(!function(t,e){if(!e||!e.length)return!0;const n=Q(t);return!n||T(n,e)}(t,e.allowUrls))return G&&a.warn(`Event dropped due to not being matched by \`allowUrls\` option.\nEvent: ${q(t)}.\nUrl: ${Q(t)}`),!0;return!1}(e,o)?null:e}});function Q(t){try{let e;try{e=t.exception.values[0].stacktrace.frames}catch(t){}return e?function(t=[]){for(let e=t.length-1;e>=0;e--){const n=t[e];if(n&&""!==n.filename&&"[native code]"!==n.filename)return n.filename||null}return null}(e):null}catch(e){return G&&a.error(`Cannot extract url for event ${q(t)}`),null}}function Z(){return tt(n),n}function tt(t){const n=t.__SENTRY__=t.__SENTRY__||{};return n.version=n.version||e,n[e]=n[e]||{}}function et(){return{traceId:M(),spanId:M().substring(16)}}const nt=1e3;function rt(){return Date.now()/nt}const st=function(){const{performance:t}=n;if(!t||!t.now)return rt;const e=Date.now()-t.now(),r=null==t.timeOrigin?e:t.timeOrigin;return()=>(r+t.now())/nt}();let ot;(()=>{const{performance:t}=n;if(!t||!t.now)return void(ot="none");const e=36e5,r=t.now(),s=Date.now(),o=t.timeOrigin?Math.abs(t.timeOrigin+r-s):e,i=ofunction(t){return A({sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}})}(n)};return t&&at(n,t),n}function at(t,e={}){if(e.user&&(!t.ipAddress&&e.user.ip_address&&(t.ipAddress=e.user.ip_address),t.did||e.did||(t.did=e.user.id||e.user.email||e.user.username)),t.timestamp=e.timestamp||st(),e.abnormal_mechanism&&(t.abnormal_mechanism=e.abnormal_mechanism),e.ignoreDuration&&(t.ignoreDuration=e.ignoreDuration),e.sid&&(t.sid=32===e.sid.length?e.sid:M()),void 0!==e.init&&(t.init=e.init),!t.did&&e.did&&(t.did=`${e.did}`),"number"==typeof e.started&&(t.started=e.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof e.duration)t.duration=e.duration;else{const e=t.timestamp-t.started;t.duration=e>=0?e:0}e.release&&(t.release=e.release),e.environment&&(t.environment=e.environment),!t.ipAddress&&e.ipAddress&&(t.ipAddress=e.ipAddress),!t.userAgent&&e.userAgent&&(t.userAgent=e.userAgent),"number"==typeof e.errors&&(t.errors=e.errors),e.status&&(t.status=e.status)}const ct="_sentrySpan";function ut(t,e){e?N(t,ct,e):delete t[ct]}function lt(t){return t[ct]}class pt{constructor(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._attachments=[],this._user={},this._tags={},this._extra={},this._contexts={},this._sdkProcessingMetadata={},this._propagationContext=et()}clone(){const t=new pt;return t._breadcrumbs=[...this._breadcrumbs],t._tags={...this._tags},t._extra={...this._extra},t._contexts={...this._contexts},t._user=this._user,t._level=this._level,t._session=this._session,t._transactionName=this._transactionName,t._fingerprint=this._fingerprint,t._eventProcessors=[...this._eventProcessors],t._requestSession=this._requestSession,t._attachments=[...this._attachments],t._sdkProcessingMetadata={...this._sdkProcessingMetadata},t._propagationContext={...this._propagationContext},t._client=this._client,t._lastEventId=this._lastEventId,ut(t,lt(this)),t}setClient(t){this._client=t}setLastEventId(t){this._lastEventId=t}getClient(){return this._client}lastEventId(){return this._lastEventId}addScopeListener(t){this._scopeListeners.push(t)}addEventProcessor(t){return this._eventProcessors.push(t),this}setUser(t){return this._user=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this._session&&at(this._session,{user:t}),this._notifyScopeListeners(),this}getUser(){return this._user}getRequestSession(){return this._requestSession}setRequestSession(t){return this._requestSession=t,this}setTags(t){return this._tags={...this._tags,...t},this._notifyScopeListeners(),this}setTag(t,e){return this._tags={...this._tags,[t]:e},this._notifyScopeListeners(),this}setExtras(t){return this._extra={...this._extra,...t},this._notifyScopeListeners(),this}setExtra(t,e){return this._extra={...this._extra,[t]:e},this._notifyScopeListeners(),this}setFingerprint(t){return this._fingerprint=t,this._notifyScopeListeners(),this}setLevel(t){return this._level=t,this._notifyScopeListeners(),this}setTransactionName(t){return this._transactionName=t,this._notifyScopeListeners(),this}setContext(t,e){return null===e?delete this._contexts[t]:this._contexts[t]=e,this._notifyScopeListeners(),this}setSession(t){return t?this._session=t:delete this._session,this._notifyScopeListeners(),this}getSession(){return this._session}update(t){if(!t)return this;const e="function"==typeof t?t(this):t,[n,r]=e instanceof dt?[e.getScopeData(),e.getRequestSession()]:_(e)?[t,t.requestSession]:[],{tags:s,extra:o,user:i,contexts:a,level:c,fingerprint:u=[],propagationContext:l}=n||{};return this._tags={...this._tags,...s},this._extra={...this._extra,...o},this._contexts={...this._contexts,...a},i&&Object.keys(i).length&&(this._user=i),c&&(this._level=c),u.length&&(this._fingerprint=u),l&&(this._propagationContext=l),r&&(this._requestSession=r),this}clear(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._requestSession=void 0,this._session=void 0,ut(this,void 0),this._attachments=[],this._propagationContext=et(),this._notifyScopeListeners(),this}addBreadcrumb(t,e){const n="number"==typeof e?e:100;if(n<=0)return this;const r={timestamp:rt(),...t},s=this._breadcrumbs;return s.push(r),this._breadcrumbs=s.length>n?s.slice(-n):s,this._notifyScopeListeners(),this}getLastBreadcrumb(){return this._breadcrumbs[this._breadcrumbs.length-1]}clearBreadcrumbs(){return this._breadcrumbs=[],this._notifyScopeListeners(),this}addAttachment(t){return this._attachments.push(t),this}clearAttachments(){return this._attachments=[],this}getScopeData(){return{breadcrumbs:this._breadcrumbs,attachments:this._attachments,contexts:this._contexts,tags:this._tags,extra:this._extra,user:this._user,level:this._level,fingerprint:this._fingerprint||[],eventProcessors:this._eventProcessors,propagationContext:this._propagationContext,sdkProcessingMetadata:this._sdkProcessingMetadata,transactionName:this._transactionName,span:lt(this)}}setSDKProcessingMetadata(t){return this._sdkProcessingMetadata={...this._sdkProcessingMetadata,...t},this}setPropagationContext(t){return this._propagationContext=t,this}getPropagationContext(){return this._propagationContext}captureException(t,e){const n=e&&e.event_id?e.event_id:M();if(!this._client)return a.warn("No client configured on scope - will not capture exception!"),n;const r=new Error("Sentry syntheticException");return this._client.captureException(t,{originalException:t,syntheticException:r,...e,event_id:n},this),n}captureMessage(t,e,n){const r=n&&n.event_id?n.event_id:M();if(!this._client)return a.warn("No client configured on scope - will not capture message!"),r;const s=new Error(t);return this._client.captureMessage(t,e,{originalException:t,syntheticException:s,...n,event_id:r},this),r}captureEvent(t,e){const n=e&&e.event_id?e.event_id:M();return this._client?(this._client.captureEvent(t,{...e,event_id:n},this),n):(a.warn("No client configured on scope - will not capture event!"),n)}_notifyScopeListeners(){this._notifyingListeners||(this._notifyingListeners=!0,this._scopeListeners.forEach((t=>{t(this)})),this._notifyingListeners=!1)}}const dt=pt;class ft{constructor(t,e){let n,r;n=t||new dt,r=e||new dt,this._stack=[{scope:n}],this._isolationScope=r}withScope(t){const e=this._pushScope();let n;try{n=t(e)}catch(t){throw this._popScope(),t}return y(n)?n.then((t=>(this._popScope(),t)),(t=>{throw this._popScope(),t})):(this._popScope(),n)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this._isolationScope}getStackTop(){return this._stack[this._stack.length-1]}_pushScope(){const t=this.getScope().clone();return this._stack.push({client:this.getClient(),scope:t}),t}_popScope(){return!(this._stack.length<=1)&&!!this._stack.pop()}}function ht(){const t=tt(Z());return t.stack=t.stack||new ft(r("defaultCurrentScope",(()=>new dt)),r("defaultIsolationScope",(()=>new dt)))}function mt(t){return ht().withScope(t)}function _t(t,e){const n=ht();return n.withScope((()=>(n.getStackTop().scope=t,e(t))))}function gt(t){return ht().withScope((()=>t(ht().getIsolationScope())))}function yt(t){const e=tt(t);return e.acs?e.acs:{withIsolationScope:gt,withScope:mt,withSetScope:_t,withSetIsolationScope:(t,e)=>gt(e),getCurrentScope:()=>ht().getScope(),getIsolationScope:()=>ht().getIsolationScope()}}function vt(){return yt(Z()).getCurrentScope()}function Et(){return yt(Z()).getIsolationScope()}function bt(){return vt().getClient()}let St;const xt=new WeakMap,wt=()=>({name:"FunctionToString",setupOnce(){St=Function.prototype.toString;try{Function.prototype.toString=function(...t){const e=P(this),n=xt.has(bt())&&void 0!==e?e:this;return St.apply(n,t)}}catch(t){}},setup(t){xt.set(t,!0)}}),kt=50,$t="?",Ot=/\(error: (.*)\)/,Tt=/captureMessage|captureException/;function Dt(...t){const e=t.sort(((t,e)=>t[0]-e[0])).map((t=>t[1]));return(t,n=0,r=0)=>{const s=[],o=t.split("\n");for(let t=n;t1024)continue;const i=Ot.test(n)?n.replace(Ot,"$1"):n;if(!i.match(/\S*Error: /)){for(const t of e){const e=t(i);if(e){s.push(e);break}}if(s.length>=kt+r)break}}return function(t){if(!t.length)return[];const e=Array.from(t);/sentryWrapped/.test(Nt(e).function||"")&&e.pop();e.reverse(),Tt.test(Nt(e).function||"")&&(e.pop(),Tt.test(Nt(e).function||"")&&e.pop());return e.slice(0,kt).map((t=>({...t,filename:t.filename||Nt(e).filename,function:t.function||$t})))}(s.slice(r))}}function Nt(t){return t[t.length-1]||{}}const It="";function Pt(t){try{return t&&"function"==typeof t&&t.name||It}catch(t){return It}}function Rt(t){const e=t.exception;if(e){const t=[];try{return e.values.forEach((e=>{e.stacktrace.frames&&t.push(...e.stacktrace.frames)})),t}catch(t){return}}}const Ct=()=>{let t;return{name:"Dedupe",processEvent(e){if(e.type)return e;try{if(function(t,e){if(!e)return!1;if(function(t,e){const n=t.message,r=e.message;if(!n&&!r)return!1;if(n&&!r||!n&&r)return!1;if(n!==r)return!1;if(!At(t,e))return!1;if(!jt(t,e))return!1;return!0}(t,e))return!0;if(function(t,e){const n=Lt(e),r=Lt(t);if(!n||!r)return!1;if(n.type!==r.type||n.value!==r.value)return!1;if(!At(t,e))return!1;if(!jt(t,e))return!1;return!0}(t,e))return!0;return!1}(e,t))return G&&a.warn("Event dropped due to being a duplicate of previously captured event."),null}catch(t){}return t=e}}};function jt(t,e){let n=Rt(t),r=Rt(e);if(!n&&!r)return!0;if(n&&!r||!n&&r)return!1;if(r.length!==n.length)return!1;for(let t=0;t{console.warn("[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.")})));vt().update(e.initialScope);const n=new t(e);return function(t){vt().setClient(t)}(n),n.init(),n}const Ut="production";function qt(t,e=100,n=1/0){try{return Yt("",t,e,n)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function Ft(t,e=3,n=102400){const r=qt(t,e);return s=r,function(t){return~-encodeURI(t).split(/%..|./).length}(JSON.stringify(s))>n?Ft(t,e-1,n):r;var s}function Yt(t,e,n=1/0,r=1/0,s=function(){const t="function"==typeof WeakSet,e=t?new WeakSet:[];return[function(n){if(t)return!!e.has(n)||(e.add(n),!1);for(let t=0;t=r){l[t]="[MaxProperties ~]";break}const e=d[t];l[t]=Yt(t,e,c-1,r,s),p++}return i(e),l}var Bt;function Ht(t){return new Wt((e=>{e(t)}))}function Gt(t){return new Wt(((e,n)=>{n(t)}))}!function(t){t[t.PENDING=0]="PENDING";t[t.RESOLVED=1]="RESOLVED";t[t.REJECTED=2]="REJECTED"}(Bt||(Bt={}));class Wt{constructor(t){Wt.prototype.__init.call(this),Wt.prototype.__init2.call(this),Wt.prototype.__init3.call(this),Wt.prototype.__init4.call(this),this._state=Bt.PENDING,this._handlers=[];try{t(this._resolve,this._reject)}catch(t){this._reject(t)}}then(t,e){return new Wt(((n,r)=>{this._handlers.push([!1,e=>{if(t)try{n(t(e))}catch(t){r(t)}else n(e)},t=>{if(e)try{n(e(t))}catch(t){r(t)}else r(t)}]),this._executeHandlers()}))}catch(t){return this.then((t=>t),t)}finally(t){return new Wt(((e,n)=>{let r,s;return this.then((e=>{s=!1,r=e,t&&t()}),(e=>{s=!0,r=e,t&&t()})).then((()=>{s?n(r):e(r)}))}))}__init(){this._resolve=t=>{this._setResult(Bt.RESOLVED,t)}}__init2(){this._reject=t=>{this._setResult(Bt.REJECTED,t)}}__init3(){this._setResult=(t,e)=>{this._state===Bt.PENDING&&(y(e)?e.then(this._resolve,this._reject):(this._state=t,this._value=e,this._executeHandlers()))}}__init4(){this._executeHandlers=()=>{if(this._state===Bt.PENDING)return;const t=this._handlers.slice();this._handlers=[],t.forEach((t=>{t[0]||(this._state===Bt.RESOLVED&&t[1](this._value),this._state===Bt.REJECTED&&t[2](this._value),t[0]=!0)}))}}}function zt(t,e,n,r=0){return new Wt(((s,o)=>{const i=t[r];if(null===e||"function"!=typeof i)s(e);else{const c=i({...e},n);G&&i.id&&null===c&&a.log(`Event processor "${i.id}" dropped event`),y(c)?c.then((e=>zt(t,e,n,r+1).then(s))).then(null,o):zt(t,c,n,r+1).then(s).then(null,o)}}))}const Jt="sentry-",Vt=/^sentry-/;function Kt(t){const e=function(t){if(!t||!f(t)&&!Array.isArray(t))return;if(Array.isArray(t))return t.reduce(((t,e)=>{const n=Xt(e);return Object.entries(n).forEach((([e,n])=>{t[e]=n})),t}),{});return Xt(t)}(t);if(!e)return;const n=Object.entries(e).reduce(((t,[e,n])=>{if(e.match(Vt)){t[e.slice(Jt.length)]=n}return t}),{});return Object.keys(n).length>0?n:void 0}function Xt(t){return t.split(",").map((t=>t.split("=").map((t=>decodeURIComponent(t.trim()))))).reduce(((t,[e,n])=>(e&&n&&(t[e]=n),t)),{})}const Qt="sentry.source",Zt="sentry.sample_rate",te="sentry.op",ee="sentry.origin";const ne="_sentryMetrics";function re(t){const e=t[ne];if(!e)return;const n={};for(const[,[t,r]]of e){(n[t]||(n[t]=[])).push(A(r))}return n}const se=0,oe=1;const ie=1;function ae(t){const{spanId:e,traceId:n}=t.spanContext(),{parent_span_id:r}=le(t);return A({parent_span_id:r,span_id:e,trace_id:n})}function ce(t){return"number"==typeof t?ue(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?ue(t.getTime()):st()}function ue(t){return t>9999999999?t/1e3:t}function le(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();try{const{spanId:e,traceId:n}=t.spanContext();if(function(t){const e=t;return!!(e.attributes&&e.startTime&&e.name&&e.endTime&&e.status)}(t)){const{attributes:r,startTime:s,name:o,endTime:i,parentSpanId:a,status:c}=t;return A({span_id:e,trace_id:n,data:r,description:o,parent_span_id:a,start_timestamp:ce(s),timestamp:ce(i)||void 0,status:de(c),op:r[te],origin:r[ee],_metrics_summary:re(t)})}return{span_id:e,trace_id:n}}catch(t){return{}}}function pe(t){const{traceFlags:e}=t.spanContext();return e===ie}function de(t){if(t&&t.code!==se)return t.code===oe?"ok":t.message||"unknown_error"}const fe="_sentryRootSpan";function he(t){return t[fe]||t}const me="_frozenDsc";function _e(t,e){const n=e.getOptions(),{publicKey:r}=e.getDsn()||{},s=A({environment:n.environment||Ut,release:n.release,public_key:r,trace_id:t});return e.emit("createDsc",s),s}function ge(t){const e=bt();if(!e)return{};const n=_e(le(t).trace_id||"",e),r=he(t),s=r[me];if(s)return s;const o=r.spanContext().traceState,i=o&&o.get("sentry.dsc"),a=i&&Kt(i);if(a)return a;const c=le(r),u=c.data||{},l=u[Zt];null!=l&&(n.sample_rate=`${l}`);const p=u[Qt],d=c.description;return"url"!==p&&d&&(n.transaction=d),function(t){if("boolean"==typeof __SENTRY_TRACING__&&!__SENTRY_TRACING__)return!1;const e=bt(),n=t||e&&e.getOptions();return!!n&&(n.enableTracing||"tracesSampleRate"in n||"tracesSampler"in n)}()&&(n.sampled=String(pe(r))),e.emit("createDsc",n,r),n}function ye(t,e){const{fingerprint:n,span:r,breadcrumbs:s,sdkProcessingMetadata:o}=e;!function(t,e){const{extra:n,tags:r,user:s,contexts:o,level:i,transactionName:a}=e,c=A(n);c&&Object.keys(c).length&&(t.extra={...c,...t.extra});const u=A(r);u&&Object.keys(u).length&&(t.tags={...u,...t.tags});const l=A(s);l&&Object.keys(l).length&&(t.user={...l,...t.user});const p=A(o);p&&Object.keys(p).length&&(t.contexts={...p,...t.contexts});i&&(t.level=i);a&&"transaction"!==t.type&&(t.transaction=a)}(t,e),r&&function(t,e){t.contexts={trace:ae(e),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:ge(e),...t.sdkProcessingMetadata};const n=he(e),r=le(n).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,e){t.fingerprint=t.fingerprint?H(t.fingerprint):[],e&&(t.fingerprint=t.fingerprint.concat(e));t.fingerprint&&!t.fingerprint.length&&delete t.fingerprint}(t,n),function(t,e){const n=[...t.breadcrumbs||[],...e];t.breadcrumbs=n.length?n:void 0}(t,s),function(t,e){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...e}}(t,o)}function ve(t,e){const{extra:n,tags:r,user:s,contexts:o,level:i,sdkProcessingMetadata:a,breadcrumbs:c,fingerprint:u,eventProcessors:l,attachments:p,propagationContext:d,transactionName:f,span:h}=e;Ee(t,"extra",n),Ee(t,"tags",r),Ee(t,"user",s),Ee(t,"contexts",o),Ee(t,"sdkProcessingMetadata",a),i&&(t.level=i),f&&(t.transactionName=f),h&&(t.span=h),c.length&&(t.breadcrumbs=[...t.breadcrumbs,...c]),u.length&&(t.fingerprint=[...t.fingerprint,...u]),l.length&&(t.eventProcessors=[...t.eventProcessors,...l]),p.length&&(t.attachments=[...t.attachments,...p]),t.propagationContext={...t.propagationContext,...d}}function Ee(t,e,n){if(n&&Object.keys(n).length){t[e]={...t[e]};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[e][r]=n[r])}}function be(t,e,s,o,i,a){const{normalizeDepth:c=3,normalizeMaxBreadth:u=1e3}=t,l={...e,event_id:e.event_id||s.event_id||M(),timestamp:e.timestamp||rt()},p=s.integrations||t.integrations.map((t=>t.name));!function(t,e){const{environment:n,release:r,dist:s,maxValueLength:o=250}=e;"environment"in t||(t.environment="environment"in e?n:Ut);void 0===t.release&&void 0!==r&&(t.release=r);void 0===t.dist&&void 0!==s&&(t.dist=s);t.message&&(t.message=k(t.message,o));const i=t.exception&&t.exception.values&&t.exception.values[0];i&&i.value&&(i.value=k(i.value,o));const a=t.request;a&&a.url&&(a.url=k(a.url,o))}(l,t),function(t,e){e.length>0&&(t.sdk=t.sdk||{},t.sdk.integrations=[...t.sdk.integrations||[],...e])}(l,p),i&&i.emit("applyFrameMetadata",e),void 0===e.type&&function(t,e){const r=n._sentryDebugIds;if(!r)return;let s;const o=Se.get(e);o?s=o:(s=new Map,Se.set(e,s));const i=Object.entries(r).reduce(((t,[n,r])=>{let o;const i=s.get(n);i?o=i:(o=e(n),s.set(n,o));for(let e=o.length-1;e>=0;e--){const n=o[e];if(n.filename){t[n.filename]=r;break}}return t}),{});try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.filename&&(t.debug_id=i[t.filename])}))}))}catch(t){}}(l,t.stackParser);const d=function(t,e){if(!e)return t;const n=t?t.clone():new dt;return n.update(e),n}(o,s.captureContext);s.mechanism&&Y(l,s.mechanism);const f=i?i.getEventProcessors():[],h=r("globalScope",(()=>new dt)).getScopeData();if(a){ve(h,a.getScopeData())}if(d){ve(h,d.getScopeData())}const m=[...s.attachments||[],...h.attachments];m.length&&(s.attachments=m),ye(l,h);return zt([...f,...h.eventProcessors],l,s).then((t=>(t&&function(t){const e={};try{t.exception.values.forEach((t=>{t.stacktrace.frames.forEach((t=>{t.debug_id&&(t.abs_path?e[t.abs_path]=t.debug_id:t.filename&&(e[t.filename]=t.debug_id),delete t.debug_id)}))}))}catch(t){}if(0===Object.keys(e).length)return;t.debug_meta=t.debug_meta||{},t.debug_meta.images=t.debug_meta.images||[];const n=t.debug_meta.images;Object.entries(e).forEach((([t,e])=>{n.push({type:"sourcemap",code_file:t,debug_id:e})}))}(t),"number"==typeof c&&c>0?function(t,e,n){if(!t)return null;const r={...t,...t.breadcrumbs&&{breadcrumbs:t.breadcrumbs.map((t=>({...t,...t.data&&{data:qt(t.data,e,n)}})))},...t.user&&{user:qt(t.user,e,n)},...t.contexts&&{contexts:qt(t.contexts,e,n)},...t.extra&&{extra:qt(t.extra,e,n)}};t.contexts&&t.contexts.trace&&r.contexts&&(r.contexts.trace=t.contexts.trace,t.contexts.trace.data&&(r.contexts.trace.data=qt(t.contexts.trace.data,e,n)));t.spans&&(r.spans=t.spans.map((t=>({...t,...t.data&&{data:qt(t.data,e,n)}}))));return r}(t,c,u):t)))}const Se=new WeakMap;function xe(t){if(t)return function(t){return t instanceof dt||"function"==typeof t}(t)||function(t){return Object.keys(t).some((t=>we.includes(t)))}(t)?{captureContext:t}:t}const we=["user","level","extra","contexts","tags","fingerprint","requestSession","propagationContext"];function ke(t,e){return vt().captureEvent(t,e)}function $e(t){const e=bt(),r=Et(),s=vt(),{release:o,environment:i=Ut}=e&&e.getOptions()||{},{userAgent:a}=n.navigator||{},c=it({release:o,environment:i,user:s.getUser()||r.getUser(),...a&&{userAgent:a},...t}),u=r.getSession();return u&&"ok"===u.status&&at(u,{status:"exited"}),Oe(),r.setSession(c),s.setSession(c),c}function Oe(){const t=Et(),e=vt(),n=e.getSession()||t.getSession();n&&function(t,e){let n={};e?n={status:e}:"ok"===t.status&&(n={status:"exited"}),at(t,n)}(n),Te(),t.setSession(),e.setSession()}function Te(){const t=Et(),e=vt(),n=bt(),r=e.getSession()||t.getSession();r&&n&&n.captureSession(r)}function De(t=!1){t?Oe():Te()}const Ne=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/;function Ie(t,e=!1){const{host:n,path:r,pass:s,port:o,projectId:i,protocol:a,publicKey:c}=t;return`${a}://${c}${e&&s?`:${s}`:""}@${n}${o?`:${o}`:""}/${r?`${r}/`:r}${i}`}function Pe(t){return{protocol:t.protocol,publicKey:t.publicKey||"",pass:t.pass||"",host:t.host,port:t.port||"",path:t.path||"",projectId:t.projectId}}function Re(e){const n="string"==typeof e?function(t){const e=Ne.exec(t);if(!e)return void i((()=>{console.error(`Invalid Sentry Dsn: ${t}`)}));const[n,r,s="",o="",a="",c=""]=e.slice(1);let u="",l=c;const p=l.split("/");if(p.length>1&&(u=p.slice(0,-1).join("/"),l=p.pop()),l){const t=l.match(/^\d+/);t&&(l=t[0])}return Pe({host:o,pass:s,path:u,projectId:l,port:a,protocol:n,publicKey:r})}(e):Pe(e);if(n&&function(e){if(!t)return!0;const{port:n,projectId:r,protocol:s}=e;return!(["protocol","publicKey","host","projectId"].find((t=>!e[t]&&(a.error(`Invalid Sentry Dsn: ${t} missing`),!0)))||(r.match(/^\d+$/)?function(t){return"http"===t||"https"===t}(s)?n&&isNaN(parseInt(n,10))&&(a.error(`Invalid Sentry Dsn: Invalid port ${n}`),1):(a.error(`Invalid Sentry Dsn: Invalid protocol ${s}`),1):(a.error(`Invalid Sentry Dsn: Invalid projectId ${r}`),1)))}(n))return n}const Ce="7";function je(t){const e=t.protocol?`${t.protocol}:`:"",n=t.port?`:${t.port}`:"";return`${e}//${t.host}${n}${t.path?`/${t.path}`:""}/api/`}function Ae(t,e){return n={sentry_key:t.publicKey,sentry_version:Ce,...e&&{sentry_client:`${e.name}/${e.version}`}},Object.keys(n).map((t=>`${encodeURIComponent(t)}=${encodeURIComponent(n[t])}`)).join("&");var n}function Le(t,e,n){return e||`${function(t){return`${je(t)}${t.projectId}/envelope/`}(t)}?${Ae(t,n)}`}const Me=n;function Ue(){if(!("fetch"in Me))return!1;try{return new Headers,new Request("http://www.example.com"),new Response,!0}catch(t){return!1}}function qe(t){return t&&/^function\s+\w+\(\)\s+\{\s+\[native code\]\s+\}$/.test(t.toString())}const Fe={},Ye={};function Be(t,e){Fe[t]=Fe[t]||[],Fe[t].push(e)}function He(t,e){Ye[t]||(e(),Ye[t]=!0)}function Ge(e,n){const r=e&&Fe[e];if(r)for(const s of r)try{s(n)}catch(n){t&&a.error(`Error while triggering instrumentation handler.\nType: ${e}\nName: ${Pt(s)}\nError:`,n)}}const We=n;const ze=n;let Je;function Ve(t){const e="history";Be(e,t),He(e,Ke)}function Ke(){if(!function(){const t=We.chrome,e=t&&t.app&&t.app.runtime,n="history"in We&&!!We.history.pushState&&!!We.history.replaceState;return!e&&n}())return;const t=ze.onpopstate;function e(t){return function(...e){const n=e.length>2?e[2]:void 0;if(n){const t=Je,e=String(n);Je=e;Ge("history",{from:t,to:e})}return t.apply(this,e)}}ze.onpopstate=function(...e){const n=ze.location.href,r=Je;Je=n;if(Ge("history",{from:r,to:n}),t)try{return t.apply(this,e)}catch(t){}},D(ze.history,"pushState",e),D(ze.history,"replaceState",e)}function Xe(t,e=[]){return[t,e]}function Qe(t,e){const[n,r]=t;return[n,[...r,e]]}function Ze(t,e){const n=t[1];for(const t of n){if(e(t,t[0].type))return!0}return!1}function tn(t){return n.__SENTRY__&&n.__SENTRY__.encodePolyfill?n.__SENTRY__.encodePolyfill(t):(new TextEncoder).encode(t)}function en(t){const[e,n]=t;let r=JSON.stringify(e);function s(t){"string"==typeof r?r="string"==typeof t?r+t:[tn(r),t]:r.push("string"==typeof t?tn(t):t)}for(const t of n){const[e,n]=t;if(s(`\n${JSON.stringify(e)}\n`),"string"==typeof n||n instanceof Uint8Array)s(n);else{let t;try{t=JSON.stringify(n)}catch(e){t=JSON.stringify(qt(n))}s(t)}}return"string"==typeof r?r:function(t){const e=t.reduce(((t,e)=>t+e.length),0),n=new Uint8Array(e);let r=0;for(const e of t)n.set(e,r),r+=e.length;return n}(r)}function nn(t){const e="string"==typeof t.data?tn(t.data):t.data;return[A({type:"attachment",length:e.length,filename:t.filename,content_type:t.contentType,attachment_type:t.attachmentType}),e]}const rn={session:"session",sessions:"session",attachment:"attachment",transaction:"transaction",event:"error",client_report:"internal",user_report:"default",profile:"profile",profile_chunk:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",feedback:"feedback",span:"span",statsd:"metric_bucket"};function sn(t){return rn[t]}function on(t){if(!t||!t.sdk)return;const{name:e,version:n}=t.sdk;return{name:e,version:n}}class an extends Error{constructor(t,e="warn"){super(t),this.message=t,this.name=new.target.prototype.constructor.name,Object.setPrototypeOf(this,new.target.prototype),this.logLevel=e}}function cn(t,e,n,r){const s=on(n),o=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,e){e&&(t.sdk=t.sdk||{},t.sdk.name=t.sdk.name||e.name,t.sdk.version=t.sdk.version||e.version,t.sdk.integrations=[...t.sdk.integrations||[],...e.integrations||[]],t.sdk.packages=[...t.sdk.packages||[],...e.packages||[]])}(t,n&&n.sdk);const i=function(t,e,n,r){const s=t.sdkProcessingMetadata&&t.sdkProcessingMetadata.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&{sdk:e},...!!n&&r&&{dsn:Ie(r)},...s&&{trace:A({...s})}}}(t,s,r,e);delete t.sdkProcessingMetadata;return Xe(i,[[{type:o},t]])}const un="Not capturing exception because it's already been captured.";class ln{constructor(t){if(this._options=t,this._integrations={},this._numProcessing=0,this._outcomes={},this._hooks={},this._eventProcessors=[],t.dsn?this._dsn=Re(t.dsn):G&&a.warn("No DSN provided, client will not send events."),this._dsn){const e=Le(this._dsn,t.tunnel,t._metadata?t._metadata.sdk:void 0);this._transport=t.transport({tunnel:this._options.tunnel,recordDroppedEvent:this.recordDroppedEvent.bind(this),...t.transportOptions,url:e})}}captureException(t,e,n){const r=M();if(B(t))return G&&a.log(un),r;const s={event_id:r,...e};return this._process(this.eventFromException(t,s).then((t=>this._captureEvent(t,s,n)))),s.event_id}captureMessage(t,e,n,r){const s={event_id:M(),...n},o=h(t)?t:String(t),i=m(t)?this.eventFromMessage(o,e,s):this.eventFromException(t,s);return this._process(i.then((t=>this._captureEvent(t,s,r)))),s.event_id}captureEvent(t,e,n){const r=M();if(e&&e.originalException&&B(e.originalException))return G&&a.log(un),r;const s={event_id:r,...e},o=(t.sdkProcessingMetadata||{}).capturedSpanScope;return this._process(this._captureEvent(t,s,o||n)),s.event_id}captureSession(t){"string"!=typeof t.release?G&&a.warn("Discarded session because of missing or non-string release"):(this.sendSession(t),at(t,{init:!1}))}getDsn(){return this._dsn}getOptions(){return this._options}getSdkMetadata(){return this._options._metadata}getTransport(){return this._transport}flush(t){const e=this._transport;return e?(this.emit("flush"),this._isClientDoneProcessing(t).then((n=>e.flush(t).then((t=>n&&t))))):Ht(!0)}close(t){return this.flush(t).then((t=>(this.getOptions().enabled=!1,this.emit("close"),t)))}getEventProcessors(){return this._eventProcessors}addEventProcessor(t){this._eventProcessors.push(t)}init(){(this._isEnabled()||this._options.integrations.some((({name:t})=>t.startsWith("Spotlight"))))&&this._setupIntegrations()}getIntegrationByName(t){return this._integrations[t]}addIntegration(t){const e=this._integrations[t.name];V(this,t,this._integrations),e||J(this,[t])}sendEvent(t,e={}){this.emit("beforeSendEvent",t,e);let n=cn(t,this._dsn,this._options._metadata,this._options.tunnel);for(const t of e.attachments||[])n=Qe(n,nn(t));const r=this.sendEnvelope(n);r&&r.then((e=>this.emit("afterSendEvent",t,e)),null)}sendSession(t){const e=function(t,e,n,r){const s=on(n);return Xe({sent_at:(new Date).toISOString(),...s&&{sdk:s},...!!r&&e&&{dsn:Ie(e)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(t,this._dsn,this._options._metadata,this._options.tunnel);this.sendEnvelope(e)}recordDroppedEvent(t,e,n){if(this._options.sendClientReports){const r="number"==typeof n?n:1,s=`${t}:${e}`;G&&a.log(`Recording outcome: "${s}"${r>1?` (${r} times)`:""}`),this._outcomes[s]=(this._outcomes[s]||0)+r}}on(t,e){const n=this._hooks[t]=this._hooks[t]||[];return n.push(e),()=>{const t=n.indexOf(e);t>-1&&n.splice(t,1)}}emit(t,...e){const n=this._hooks[t];n&&n.forEach((t=>t(...e)))}sendEnvelope(t){return this.emit("beforeEnvelope",t),this._isEnabled()&&this._transport?this._transport.send(t).then(null,(t=>(G&&a.error("Error while sending event:",t),t))):(G&&a.error("Transport disabled"),Ht({}))}_setupIntegrations(){const{integrations:t}=this._options;this._integrations=function(t,e){const n={};return e.forEach((e=>{e&&V(t,e,n)})),n}(this,t),J(this,t)}_updateSessionFromEvent(t,e){let n=!1,r=!1;const s=e.exception&&e.exception.values;if(s){r=!0;for(const t of s){const e=t.mechanism;if(e&&!1===e.handled){n=!0;break}}}const o="ok"===t.status;(o&&0===t.errors||o&&n)&&(at(t,{...n&&{status:"crashed"},errors:t.errors||Number(r||n)}),this.captureSession(t))}_isClientDoneProcessing(t){return new Wt((e=>{let n=0;const r=setInterval((()=>{0==this._numProcessing?(clearInterval(r),e(!0)):(n+=1,t&&n>=t&&(clearInterval(r),e(!1)))}),1)}))}_isEnabled(){return!1!==this.getOptions().enabled&&void 0!==this._transport}_prepareEvent(t,e,n,r=Et()){const s=this.getOptions(),o=Object.keys(this._integrations);return!e.integrations&&o.length>0&&(e.integrations=o),this.emit("preprocessEvent",t,e),t.type||r.setLastEventId(t.event_id||e.event_id),be(s,t,e,n,this,r).then((t=>{if(null===t)return t;const e={...r.getPropagationContext(),...n?n.getPropagationContext():void 0};if(!(t.contexts&&t.contexts.trace)&&e){const{traceId:n,spanId:r,parentSpanId:s,dsc:o}=e;t.contexts={trace:A({trace_id:n,span_id:r,parent_span_id:s}),...t.contexts};const i=o||_e(n,this);t.sdkProcessingMetadata={dynamicSamplingContext:i,...t.sdkProcessingMetadata}}return t}))}_captureEvent(t,e={},n){return this._processEvent(t,e,n).then((t=>t.event_id),(t=>{if(G){const e=t;"log"===e.logLevel?a.log(e.message):a.warn(e)}}))}_processEvent(t,e,n){const r=this.getOptions(),{sampleRate:s}=r,o=dn(t),i=pn(t),c=t.type||"error",u=`before send for type \`${c}\``,l=void 0===s?void 0:function(t){if("boolean"==typeof t)return Number(t);const e="string"==typeof t?parseFloat(t):t;if(!("number"!=typeof e||isNaN(e)||e<0||e>1))return e;G&&a.warn(`[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(t)} of type ${JSON.stringify(typeof t)}.`)}(s);if(i&&"number"==typeof l&&Math.random()>l)return this.recordDroppedEvent("sample_rate","error",t),Gt(new an(`Discarding event because it's not included in the random sample (sampling rate = ${s})`,"log"));const p="replay_event"===c?"replay":c,d=(t.sdkProcessingMetadata||{}).capturedSpanIsolationScope;return this._prepareEvent(t,e,n,d).then((n=>{if(null===n)throw this.recordDroppedEvent("event_processor",p,t),new an("An event processor returned `null`, will not send event.","log");if(e.data&&!0===e.data.__sentry__)return n;const s=function(t,e,n,r){const{beforeSend:s,beforeSendTransaction:o,beforeSendSpan:i}=e;if(pn(n)&&s)return s(n,r);if(dn(n)){if(n.spans&&i){const e=[];for(const r of n.spans){const n=i(r);n?e.push(n):t.recordDroppedEvent("before_send","span")}n.spans=e}if(o){if(n.spans){const t=n.spans.length;n.sdkProcessingMetadata={...n.sdkProcessingMetadata,spanCountBeforeProcessing:t}}return o(n,r)}}return n}(this,r,n,e);return function(t,e){const n=`${e} must return \`null\` or a valid event.`;if(y(t))return t.then((t=>{if(!_(t)&&null!==t)throw new an(n);return t}),(t=>{throw new an(`${e} rejected with ${t}`)}));if(!_(t)&&null!==t)throw new an(n);return t}(s,u)})).then((r=>{if(null===r){if(this.recordDroppedEvent("before_send",p,t),o){const e=1+(t.spans||[]).length;this.recordDroppedEvent("before_send","span",e)}throw new an(`${u} returned \`null\`, will not send event.`,"log")}const s=n&&n.getSession();if(!o&&s&&this._updateSessionFromEvent(s,r),o){const t=(r.sdkProcessingMetadata&&r.sdkProcessingMetadata.spanCountBeforeProcessing||0)-(r.spans?r.spans.length:0);t>0&&this.recordDroppedEvent("before_send","span",t)}const i=r.transaction_info;if(o&&i&&r.transaction!==t.transaction){const t="custom";r.transaction_info={...i,source:t}}return this.sendEvent(r,e),r})).then(null,(t=>{if(t instanceof an)throw t;throw this.captureException(t,{data:{__sentry__:!0},originalException:t}),new an(`Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${t}`)}))}_process(t){this._numProcessing++,t.then((t=>(this._numProcessing--,t)),(t=>(this._numProcessing--,t)))}_clearOutcomes(){const t=this._outcomes;return this._outcomes={},Object.entries(t).map((([t,e])=>{const[n,r]=t.split(":");return{reason:n,category:r,quantity:e}}))}_flushOutcomes(){G&&a.log("Flushing outcomes...");const t=this._clearOutcomes();if(0===t.length)return void(G&&a.log("No outcomes to send"));if(!this._dsn)return void(G&&a.log("No dsn provided, will not send outcomes"));G&&a.log("Sending outcomes:",t);const e=(n=t,Xe((r=this._options.tunnel&&Ie(this._dsn))?{dsn:r}:{},[[{type:"client_report"},{timestamp:s||rt(),discarded_events:n}]]));var n,r,s;this.sendEnvelope(e)}}function pn(t){return void 0===t.type}function dn(t){return"transaction"===t.type}const fn="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__;function hn(t,e){const n=gn(t,e),r={type:En(e),value:bn(e)};return n.length&&(r.stacktrace={frames:n}),void 0===r.type&&""===r.value&&(r.value="Unrecoverable error caught"),r}function mn(t,e,n,r){const s=bt(),o=s&&s.getOptions().normalizeDepth,i=function(t){for(const e in t)if(Object.prototype.hasOwnProperty.call(t,e)){const n=t[e];if(n instanceof Error)return n}return}(e),a={__serialized__:Ft(e,o)};if(i)return{exception:{values:[hn(t,i)]},extra:a};const c={exception:{values:[{type:g(e)?e.constructor.name:r?"UnhandledRejection":"Error",value:wn(e,{isUnhandledRejection:r})}]},extra:a};if(n){const e=gn(t,n);e.length&&(c.exception.values[0].stacktrace={frames:e})}return c}function _n(t,e){return{exception:{values:[hn(t,e)]}}}function gn(t,e){const n=e.stacktrace||e.stack||"",r=function(t){if(t&&yn.test(t.message))return 1;return 0}(e),s=function(t){if("number"==typeof t.framesToPop)return t.framesToPop;return 0}(e);try{return t(n,r,s)}catch(t){}return[]}const yn=/Minified React error #\d+;/i;function vn(t){return"undefined"!=typeof WebAssembly&&void 0!==WebAssembly.Exception&&t instanceof WebAssembly.Exception}function En(t){const e=t&&t.name;if(!e&&vn(t)){return t.message&&Array.isArray(t.message)&&2==t.message.length?t.message[0]:"WebAssembly.Exception"}return e}function bn(t){const e=t&&t.message;return e?e.error&&"string"==typeof e.error.message?e.error.message:vn(t)&&Array.isArray(t.message)&&2==t.message.length?t.message[1]:e:"No error message"}function Sn(t,e,n,r,s){let o;if(p(e)&&e.error){return _n(t,e.error)}if(d(e)||l(e,"DOMException")){const s=e;if("stack"in e)o=_n(t,e);else{const e=s.name||(d(s)?"DOMError":"DOMException"),i=s.message?`${e}: ${s.message}`:e;o=xn(t,i,n,r),F(o,i)}return"code"in s&&(o.tags={...o.tags,"DOMException.code":`${s.code}`}),o}if(u(e))return _n(t,e);if(_(e)||g(e)){return o=mn(t,e,n,s),Y(o,{synthetic:!0}),o}return o=xn(t,e,n,r),F(o,`${e}`,void 0),Y(o,{synthetic:!0}),o}function xn(t,e,n,r){const s={};if(r&&n){const r=gn(t,n);r.length&&(s.exception={values:[{value:e,stacktrace:{frames:r}}]})}if(h(e)){const{__sentry_template_string__:t,__sentry_template_values__:n}=e;return s.logentry={message:t,params:n},s}return s.message=e,s}function wn(t,{isUnhandledRejection:e}){const n=function(t,e=40){const n=Object.keys(R(t));n.sort();const r=n[0];if(!r)return"[object has no keys]";if(r.length>=e)return k(r,e);for(let t=n.length;t>0;t--){const r=n.slice(0,t).join(", ");if(!(r.length>e))return t===n.length?r:k(r,e)}return""}(t),r=e?"promise rejection":"exception";if(p(t))return`Event \`ErrorEvent\` captured as ${r} with message \`${t.message}\``;if(g(t)){return`Event \`${function(t){try{const e=Object.getPrototypeOf(t);return e?e.constructor.name:void 0}catch(t){}}(t)}\` (type=${t.type}) captured as ${r}`}return`Object captured as ${r} with keys: ${n}`}const kn=n;let $n=0;function On(){return $n>0}function Tn(t,e={},n){if("function"!=typeof t)return t;try{const e=t.__sentry_wrapped__;if(e)return"function"==typeof e?e:t;if(P(t))return t}catch(e){return t}const r=function(){const r=Array.prototype.slice.call(arguments);try{n&&"function"==typeof n&&n.apply(this,arguments);const s=r.map((t=>Tn(t,e)));return t.apply(this,s)}catch(t){throw $n++,setTimeout((()=>{$n--})),function(...t){const e=yt(Z());if(2===t.length){const[n,r]=t;return n?e.withSetScope(n,r):e.withScope(r)}e.withScope(t[0])}((n=>{var s,o;n.addEventProcessor((t=>(e.mechanism&&(F(t,void 0,void 0),Y(t,e.mechanism)),t.extra={...t.extra,arguments:r},t))),s=t,vt().captureException(s,xe(o))})),t}};try{for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])}catch(t){}I(r,t),N(t,"__sentry_wrapped__",r);try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get:()=>t.name})}catch(t){}return r}class Dn extends ln{constructor(t){const n={parentSpanIsAlwaysRootSpan:!0,...t};!function(t,n,r=[n],s="npm"){const o=t._metadata||{};o.sdk||(o.sdk={name:`sentry.javascript.${n}`,packages:r.map((t=>({name:`${s}:@sentry/${t}`,version:e}))),version:e}),t._metadata=o}(n,"browser",["browser"],kn.SENTRY_SDK_SOURCE||"npm"),super(n),n.sendClientReports&&kn.document&&kn.document.addEventListener("visibilitychange",(()=>{"hidden"===kn.document.visibilityState&&this._flushOutcomes()}))}eventFromException(t,e){return function(t,e,n,r){const s=Sn(t,e,n&&n.syntheticException||void 0,r);return Y(s),s.level="error",n&&n.event_id&&(s.event_id=n.event_id),Ht(s)}(this._options.stackParser,t,e,this._options.attachStacktrace)}eventFromMessage(t,e="info",n){return function(t,e,n="info",r,s){const o=xn(t,e,r&&r.syntheticException||void 0,s);return o.level=n,r&&r.event_id&&(o.event_id=r.event_id),Ht(o)}(this._options.stackParser,t,e,n,this._options.attachStacktrace)}captureUserFeedback(t){if(!this._isEnabled())return void(fn&&a.warn("SDK not enabled, will not capture user feedback."));const e=function(t,{metadata:e,tunnel:n,dsn:r}){const s={event_id:t.event_id,sent_at:(new Date).toISOString(),...e&&e.sdk&&{sdk:{name:e.sdk.name,version:e.sdk.version}},...!!n&&!!r&&{dsn:Ie(r)}},o=function(t){return[{type:"user_report"},t]}(t);return Xe(s,[o])}(t,{metadata:this.getSdkMetadata(),dsn:this.getDsn(),tunnel:this.getOptions().tunnel});this.sendEnvelope(e)}_prepareEvent(t,e,n){return t.platform=t.platform||"javascript",super._prepareEvent(t,e,n)}}const Nn=1e3;let In,Pn,Rn;function Cn(){if(!ze.document)return;const t=Ge.bind(null,"dom"),e=jn(t,!0);ze.document.addEventListener("click",e,!1),ze.document.addEventListener("keypress",e,!1),["EventTarget","Node"].forEach((e=>{const n=ze[e]&&ze[e].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(D(n,"addEventListener",(function(e){return function(n,r,s){if("click"===n||"keypress"==n)try{const r=this,o=r.__sentry_instrumentation_handlers__=r.__sentry_instrumentation_handlers__||{},i=o[n]=o[n]||{refCount:0};if(!i.handler){const r=jn(t);i.handler=r,e.call(this,n,r,s)}i.refCount++}catch(t){}return e.call(this,n,r,s)}})),D(n,"removeEventListener",(function(t){return function(e,n,r){if("click"===e||"keypress"==e)try{const n=this,s=n.__sentry_instrumentation_handlers__||{},o=s[e];o&&(o.refCount--,o.refCount<=0&&(t.call(this,e,o.handler,r),o.handler=void 0,delete s[e]),0===Object.keys(s).length&&delete n.__sentry_instrumentation_handlers__)}catch(t){}return t.call(this,e,n,r)}})))}))}function jn(t,e=!1){return n=>{if(!n||n._sentryCaptured)return;const r=function(t){try{return t.target}catch(t){return null}}(n);if(function(t,e){return"keypress"===t&&(!e||!e.tagName||"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName&&!e.isContentEditable)}(n.type,r))return;N(n,"_sentryCaptured",!0),r&&!r._sentryId&&N(r,"_sentryId",M());const s="keypress"===n.type?"input":n.type;if(!function(t){if(t.type!==Pn)return!1;try{if(!t.target||t.target._sentryId!==Rn)return!1}catch(t){}return!0}(n)){t({event:n,name:s,global:e}),Pn=n.type,Rn=r?r._sentryId:void 0}clearTimeout(In),In=ze.setTimeout((()=>{Rn=void 0,Pn=void 0}),Nn)}}const An="__sentry_xhr_v3__";function Ln(){if(!ze.XMLHttpRequest)return;const t=XMLHttpRequest.prototype;t.open=new Proxy(t.open,{apply(t,e,n){const r=1e3*st(),s=f(n[0])?n[0].toUpperCase():void 0,o=function(t){if(f(t))return t;try{return t.toString()}catch(t){}return}(n[1]);if(!s||!o)return t.apply(e,n);e[An]={method:s,url:o,request_headers:{}},"POST"===s&&o.match(/sentry_key/)&&(e.__sentry_own_request__=!0);const i=()=>{const t=e[An];if(t&&4===e.readyState){try{t.status_code=e.status}catch(t){}Ge("xhr",{endTimestamp:1e3*st(),startTimestamp:r,xhr:e})}};return"onreadystatechange"in e&&"function"==typeof e.onreadystatechange?e.onreadystatechange=new Proxy(e.onreadystatechange,{apply:(t,e,n)=>(i(),t.apply(e,n))}):e.addEventListener("readystatechange",i),e.setRequestHeader=new Proxy(e.setRequestHeader,{apply(t,e,n){const[r,s]=n,o=e[An];return o&&f(r)&&f(s)&&(o.request_headers[r.toLowerCase()]=s),t.apply(e,n)}}),t.apply(e,n)}}),t.send=new Proxy(t.send,{apply(t,e,n){const r=e[An];if(!r)return t.apply(e,n);void 0!==n[0]&&(r.body=n[0]);return Ge("xhr",{startTimestamp:1e3*st(),xhr:e}),t.apply(e,n)}})}const Mn=100;function Un(t,e){const n=bt(),r=Et();if(!n)return;const{beforeBreadcrumb:s=null,maxBreadcrumbs:o=Mn}=n.getOptions();if(o<=0)return;const a={timestamp:rt(),...t},c=s?i((()=>s(a,e))):a;null!==c&&(n.emit&&n.emit("beforeAddBreadcrumb",c,e),r.addBreadcrumb(c,o))}function qn(){"console"in n&&s.forEach((function(t){t in n.console&&D(n.console,t,(function(e){return o[t]=e,function(...e){Ge("console",{args:e,level:t});const r=o[t];r&&r.apply(n.console,e)}}))}))}function Fn(e,r=!1){r&&!function(){if("string"==typeof EdgeRuntime)return!0;if(!Ue())return!1;if(qe(Me.fetch))return!0;let e=!1;const n=Me.document;if(n&&"function"==typeof n.createElement)try{const t=n.createElement("iframe");t.hidden=!0,n.head.appendChild(t),t.contentWindow&&t.contentWindow.fetch&&(e=qe(t.contentWindow.fetch)),n.head.removeChild(t)}catch(e){t&&a.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",e)}return e}()||D(n,"fetch",(function(t){return function(...r){const{method:s,url:o}=function(t){if(0===t.length)return{method:"GET",url:""};if(2===t.length){const[e,n]=t;return{url:Bn(e),method:Yn(n,"method")?String(n.method).toUpperCase():"GET"}}const e=t[0];return{url:Bn(e),method:Yn(e,"method")?String(e.method).toUpperCase():"GET"}}(r),i={args:r,fetchData:{method:s,url:o},startTimestamp:1e3*st()};e||Ge("fetch",{...i});const a=(new Error).stack;return t.apply(n,r).then((async t=>(e?e(t):Ge("fetch",{...i,endTimestamp:1e3*st(),response:t}),t)),(t=>{throw Ge("fetch",{...i,endTimestamp:1e3*st(),error:t}),u(t)&&void 0===t.stack&&(t.stack=a,N(t,"framesToPop",1)),t}))}}))}function Yn(t,e){return!!t&&"object"==typeof t&&!!t[e]}function Bn(t){return"string"==typeof t?t:t?Yn(t,"url")?t.url:t.toString?t.toString():"":""}const Hn=["fatal","error","warning","log","info","debug"];function Gn(t){return"warn"===t?"warning":Hn.includes(t)?t:"log"}function Wn(t){return void 0===t?void 0:t>=400&&t<500?"warning":t>=500?"error":void 0}function zn(t){if(!t)return{};const e=t.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!e)return{};const n=e[6]||"",r=e[8]||"";return{host:e[4],path:e[5],protocol:e[2],search:n,hash:r,relative:e[5]+n+r}}const Jn=1024,Vn=(t={})=>{const e={console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0,...t};return{name:"Breadcrumbs",setup(t){var n;e.console&&function(t){const e="console";Be(e,t),He(e,qn)}(function(t){return function(e){if(bt()!==t)return;const n={category:"console",data:{arguments:e.args,logger:"console"},level:Gn(e.level),message:$(e.args," ")};if("assert"===e.level){if(!1!==e.args[0])return;n.message=`Assertion failed: ${$(e.args.slice(1)," ")||"console.assert"}`,n.data.arguments=e.args.slice(1)}Un(n,{input:e.args,level:e.level})}}(t)),e.dom&&(n=function(t,e){return function(n){if(bt()!==t)return;let r,s,o="object"==typeof e?e.serializeAttribute:void 0,i="object"==typeof e&&"number"==typeof e.maxStringLength?e.maxStringLength:void 0;i&&i>Jn&&(fn&&a.warn(`\`dom.maxStringLength\` cannot exceed 1024, but a value of ${i} was configured. Sentry will use 1024 instead.`),i=Jn),"string"==typeof o&&(o=[o]);try{const t=n.event,e=function(t){return!!t&&!!t.target}(t)?t.target:t;r=x(e,{keyAttrs:o,maxStringLength:i}),s=function(t){if(!b.HTMLElement)return null;let e=t;for(let t=0;t<5;t++){if(!e)return null;if(e instanceof HTMLElement){if(e.dataset.sentryComponent)return e.dataset.sentryComponent;if(e.dataset.sentryElement)return e.dataset.sentryElement}e=e.parentNode}return null}(e)}catch(t){r=""}if(0===r.length)return;const c={category:`ui.${n.name}`,message:r};s&&(c.data={"ui.component_name":s}),Un(c,{event:n.event,name:n.name,global:n.global})}}(t,e.dom),Be("dom",n),He("dom",Cn)),e.xhr&&function(t){Be("xhr",t),He("xhr",Ln)}(function(t){return function(e){if(bt()!==t)return;const{startTimestamp:n,endTimestamp:r}=e,s=e.xhr[An];if(!n||!r||!s)return;const{method:o,url:i,status_code:a,body:c}=s,u={method:o,url:i,status_code:a},l={xhr:e.xhr,input:c,startTimestamp:n,endTimestamp:r};Un({category:"xhr",data:u,type:"http",level:Wn(a)},l)}}(t)),e.fetch&&function(t,e){const n="fetch";Be(n,t),He(n,(()=>Fn(void 0,e)))}(function(t){return function(e){if(bt()!==t)return;const{startTimestamp:n,endTimestamp:r}=e;if(r&&(!e.fetchData.url.match(/sentry_key/)||"POST"!==e.fetchData.method))if(e.error){Un({category:"fetch",data:e.fetchData,level:"error",type:"http"},{data:e.error,input:e.args,startTimestamp:n,endTimestamp:r})}else{const t=e.response,s={...e.fetchData,status_code:t&&t.status},o={input:e.args,response:t,startTimestamp:n,endTimestamp:r};Un({category:"fetch",data:s,type:"http",level:Wn(s.status_code)},o)}}}(t)),e.history&&Ve(function(t){return function(e){if(bt()!==t)return;let n=e.from,r=e.to;const s=zn(kn.location.href);let o=n?zn(n):void 0;const i=zn(r);o&&o.path||(o=s),s.protocol===i.protocol&&s.host===i.host&&(r=i.relative),s.protocol===o.protocol&&s.host===o.host&&(n=o.relative),Un({category:"navigation",data:{from:n,to:r}})}}(t)),e.sentry&&t.on("beforeSendEvent",function(t){return function(e){bt()===t&&Un({category:"sentry."+("transaction"===e.type?"transaction":"event"),event_id:e.event_id,level:e.level,message:q(e)},{event:e})}}(t))}}};const Kn=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","BroadcastChannel","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","SharedWorker","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"],Xn=(t={})=>{const e={XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0,...t};return{name:"BrowserApiErrors",setupOnce(){e.setTimeout&&D(kn,"setTimeout",Qn),e.setInterval&&D(kn,"setInterval",Qn),e.requestAnimationFrame&&D(kn,"requestAnimationFrame",Zn),e.XMLHttpRequest&&"XMLHttpRequest"in kn&&D(XMLHttpRequest.prototype,"send",tr);const t=e.eventTarget;if(t){(Array.isArray(t)?t:Kn).forEach(er)}}}};function Qn(t){return function(...e){const n=e[0];return e[0]=Tn(n,{mechanism:{data:{function:Pt(t)},handled:!1,type:"instrument"}}),t.apply(this,e)}}function Zn(t){return function(e){return t.apply(this,[Tn(e,{mechanism:{data:{function:"requestAnimationFrame",handler:Pt(t)},handled:!1,type:"instrument"}})])}}function tr(t){return function(...e){const n=this;return["onload","onerror","onprogress","onreadystatechange"].forEach((t=>{t in n&&"function"==typeof n[t]&&D(n,t,(function(e){const n={mechanism:{data:{function:t,handler:Pt(e)},handled:!1,type:"instrument"}},r=P(e);return r&&(n.mechanism.data.handler=Pt(r)),Tn(e,n)}))})),t.apply(this,e)}}function er(t){const e=kn,n=e[t]&&e[t].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(D(n,"addEventListener",(function(e){return function(n,r,s){try{"function"==typeof r.handleEvent&&(r.handleEvent=Tn(r.handleEvent,{mechanism:{data:{function:"handleEvent",handler:Pt(r),target:t},handled:!1,type:"instrument"}}))}catch(t){}return e.apply(this,[n,Tn(r,{mechanism:{data:{function:"addEventListener",handler:Pt(r),target:t},handled:!1,type:"instrument"}}),s])}})),D(n,"removeEventListener",(function(t){return function(e,n,r){const s=n;try{const n=s&&s.__sentry_wrapped__;n&&t.call(this,e,n,r)}catch(t){}return t.call(this,e,s,r)}})))}let nr=null;function rr(){nr=n.onerror,n.onerror=function(t,e,n,r,s){return Ge("error",{column:r,error:s,line:n,msg:t,url:e}),!(!nr||nr.__SENTRY_LOADER__)&&nr.apply(this,arguments)},n.onerror.__SENTRY_INSTRUMENTED__=!0}let sr=null;function or(){sr=n.onunhandledrejection,n.onunhandledrejection=function(t){return Ge("unhandledrejection",t),!(sr&&!sr.__SENTRY_LOADER__)||sr.apply(this,arguments)},n.onunhandledrejection.__SENTRY_INSTRUMENTED__=!0}const ir=(t={})=>{const e={onerror:!0,onunhandledrejection:!0,...t};return{name:"GlobalHandlers",setupOnce(){Error.stackTraceLimit=50},setup(t){e.onerror&&(!function(t){!function(t){const e="error";Be(e,t),He(e,rr)}((e=>{const{stackParser:n,attachStacktrace:r}=cr();if(bt()!==t||On())return;const{msg:s,url:o,line:i,column:a,error:c}=e,u=function(t,e,n,r){const s=t.exception=t.exception||{},o=s.values=s.values||[],i=o[0]=o[0]||{},a=i.stacktrace=i.stacktrace||{},c=a.frames=a.frames||[],u=isNaN(parseInt(r,10))?void 0:r,l=isNaN(parseInt(n,10))?void 0:n,p=f(e)&&e.length>0?e:function(){try{return b.document.location.href}catch(t){return""}}();0===c.length&&c.push({colno:u,filename:p,function:$t,in_app:!0,lineno:l});return t}(Sn(n,c||s,void 0,r,!1),o,i,a);u.level="error",ke(u,{originalException:c,mechanism:{handled:!1,type:"onerror"}})}))}(t),ar("onerror")),e.onunhandledrejection&&(!function(t){!function(t){const e="unhandledrejection";Be(e,t),He(e,or)}((e=>{const{stackParser:n,attachStacktrace:r}=cr();if(bt()!==t||On())return;const s=function(t){if(m(t))return t;try{if("reason"in t)return t.reason;if("detail"in t&&"reason"in t.detail)return t.detail.reason}catch(t){}return t}(e),o=m(s)?{exception:{values:[{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(s)}`}]}}:Sn(n,s,void 0,r,!0);o.level="error",ke(o,{originalException:s,mechanism:{handled:!1,type:"onunhandledrejection"}})}))}(t),ar("onunhandledrejection"))}}};function ar(t){fn&&a.log(`Global Handler attached: ${t}`)}function cr(){const t=bt();return t&&t.getOptions()||{stackParser:()=>[],attachStacktrace:!1}}const ur=()=>({name:"HttpContext",preprocessEvent(t){if(!kn.navigator&&!kn.location&&!kn.document)return;const e=t.request&&t.request.url||kn.location&&kn.location.href,{referrer:n}=kn.document||{},{userAgent:r}=kn.navigator||{},s={...t.request&&t.request.headers,...n&&{Referer:n},...r&&{"User-Agent":r}},o={...t.request,...e&&{url:e},headers:s};t.request=o}});function lr(t,e,n=250,r,s,o,i){if(!(o.exception&&o.exception.values&&i&&v(i.originalException,Error)))return;const a=o.exception.values.length>0?o.exception.values[o.exception.values.length-1]:void 0;var c,u;a&&(o.exception.values=(c=pr(t,e,s,i.originalException,r,o.exception.values,a,0),u=n,c.map((t=>(t.value&&(t.value=k(t.value,u)),t)))))}function pr(t,e,n,r,s,o,i,a){if(o.length>=n+1)return o;let c=[...o];if(v(r[s],Error)){dr(i,a);const o=t(e,r[s]),u=c.length;fr(o,s,u,a),c=pr(t,e,n,r[s],s,[o,...c],o,u)}return Array.isArray(r.errors)&&r.errors.forEach(((r,o)=>{if(v(r,Error)){dr(i,a);const u=t(e,r),l=c.length;fr(u,`errors[${o}]`,l,a),c=pr(t,e,n,r,s,[u,...c],u,l)}})),c}function dr(t,e){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,..."AggregateError"===t.type&&{is_exception_group:!0},exception_id:e}}function fr(t,e,n,r){t.mechanism=t.mechanism||{type:"generic",handled:!0},t.mechanism={...t.mechanism,type:"chained",source:e,exception_id:n,parent_id:r}}const hr=(t={})=>{const e=t.limit||5,n=t.key||"cause";return{name:"LinkedErrors",preprocessEvent(t,r,s){const o=s.getOptions();lr(hn,o.stackParser,o.maxValueLength,n,e,t,r)}}};function mr(t,e,n,r){const s={filename:t,function:""===e?$t:e,in_app:!0};return void 0!==n&&(s.lineno=n),void 0!==r&&(s.colno=r),s}const _r=/^\s*at (\S+?)(?::(\d+))(?::(\d+))\s*$/i,gr=/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,yr=/\((\S*)(?::(\d+))(?::(\d+))\)/,vr=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i,Er=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,br=Dt(...[[30,t=>{const e=_r.exec(t);if(e){const[,t,n,r]=e;return mr(t,$t,+n,+r)}const n=gr.exec(t);if(n){if(n[2]&&0===n[2].indexOf("eval")){const t=yr.exec(n[2]);t&&(n[2]=t[1],n[3]=t[2],n[4]=t[3])}const[t,e]=Sr(n[1]||$t,n[2]);return mr(e,t,n[3]?+n[3]:void 0,n[4]?+n[4]:void 0)}}],[50,t=>{const e=vr.exec(t);if(e){if(e[3]&&e[3].indexOf(" > eval")>-1){const t=Er.exec(e[3]);t&&(e[1]=e[1]||"eval",e[3]=t[1],e[4]=t[2],e[5]="")}let t=e[3],n=e[1]||$t;return[n,t]=Sr(n,t),mr(t,n,e[4]?+e[4]:void 0,e[5]?+e[5]:void 0)}}]]),Sr=(t,e)=>{const n=-1!==t.indexOf("safari-extension"),r=-1!==t.indexOf("safari-web-extension");return n||r?[-1!==t.indexOf("@")?t.split("@")[0]:$t,n?`safari-extension:${e}`:`safari-web-extension:${e}`]:[t,e]},xr="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,wr={};function kr(t){const e=wr[t];if(e)return e;let n=ze[t];if(qe(n))return wr[t]=n.bind(ze);const r=ze.document;if(r&&"function"==typeof r.createElement)try{const e=r.createElement("iframe");e.hidden=!0,r.head.appendChild(e);const s=e.contentWindow;s&&s[t]&&(n=s[t]),r.head.removeChild(e)}catch(e){xr&&a.warn(`Could not create sandbox iframe for ${t} check, bailing to window.${t}: `,e)}return n?wr[t]=n.bind(ze):n}function $r(t){wr[t]=void 0}function Or(t){const e=[];function n(t){return e.splice(e.indexOf(t),1)[0]||Promise.resolve(void 0)}return{$:e,add:function(r){if(!(void 0===t||e.lengthn(s))).then(null,(()=>n(s).then(null,(()=>{})))),s},drain:function(t){return new Wt(((n,r)=>{let s=e.length;if(!s)return n(!0);const o=setTimeout((()=>{t&&t>0&&n(!1)}),t);e.forEach((t=>{Ht(t).then((()=>{--s||(clearTimeout(o),n(!0))}),r)}))}))}}}const Tr=6e4;function Dr(t,{statusCode:e,headers:n},r=Date.now()){const s={...t},o=n&&n["x-sentry-rate-limits"],i=n&&n["retry-after"];if(o)for(const t of o.trim().split(",")){const[e,n,,,o]=t.split(":",5),i=parseInt(e,10),a=1e3*(isNaN(i)?60:i);if(n)for(const t of n.split(";"))"metric_bucket"===t&&o&&!o.split(";").includes("custom")||(s[t]=r+a);else s.all=r+a}else i?s.all=r+function(t,e=Date.now()){const n=parseInt(`${t}`,10);if(!isNaN(n))return 1e3*n;const r=Date.parse(`${t}`);return isNaN(r)?Tr:r-e}(i,r):429===e&&(s.all=r+6e4);return s}const Nr=64;function Ir(t,e,n=Or(t.bufferSize||Nr)){let r={};return{send:function(s){const o=[];if(Ze(s,((e,n)=>{const s=sn(n);if(function(t,e,n=Date.now()){return function(t,e){return t[e]||t.all||0}(t,e)>n}(r,s)){const r=Pr(e,n);t.recordDroppedEvent("ratelimit_backoff",s,r)}else o.push(e)})),0===o.length)return Ht({});const i=Xe(s[0],o),c=e=>{Ze(i,((n,r)=>{const s=Pr(n,r);t.recordDroppedEvent(e,sn(r),s)}))};return n.add((()=>e({body:en(i)}).then((t=>(void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&G&&a.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=Dr(r,t),t)),(t=>{throw c("network_error"),t})))).then((t=>t),(t=>{if(t instanceof an)return G&&a.error("Skipped sending event because buffer is full."),c("queue_overflow"),Ht({});throw t}))},flush:t=>n.drain(t)}}function Pr(t,e){if("event"===e||"transaction"===e)return Array.isArray(t)?t[1]:void 0}function Rr(t,e=kr("fetch")){let n=0,r=0;return Ir(t,(function(s){const o=s.body.length;n+=o,r++;const i={body:s.body,method:"POST",referrerPolicy:"origin",headers:t.headers,keepalive:n<=6e4&&r<15,...t.fetchOptions};if(!e)return $r("fetch"),Gt("No fetch implementation available");try{return e(t.url,i).then((t=>(n-=o,r--,{statusCode:t.status,headers:{"x-sentry-rate-limits":t.headers.get("X-Sentry-Rate-Limits"),"retry-after":t.headers.get("Retry-After")}})))}catch(t){return $r("fetch"),n-=o,r--,Gt(t)}}))}const Cr={init:function(t={}){const e=function(t={}){const e={defaultIntegrations:[X(),wt(),Xn(),Vn(),ir(),hr(),Ct(),ur()],release:"string"==typeof __SENTRY_RELEASE__?__SENTRY_RELEASE__:kn.SENTRY_RELEASE&&kn.SENTRY_RELEASE.id?kn.SENTRY_RELEASE.id:void 0,autoSessionTracking:!0,sendClientReports:!0};return null==t.defaultIntegrations&&delete t.defaultIntegrations,{...e,...t}}(t);if(function(){const t=void 0!==kn.window&&kn;if(!t)return!1;const e=t[t.chrome?"chrome":"browser"],n=e&&e.runtime&&e.runtime.id,r=kn.location&&kn.location.href||"",s=!!n&&kn===kn.top&&["chrome-extension:","moz-extension:","ms-browser-extension:","safari-web-extension:"].some((t=>r.startsWith(`${t}//`))),o=void 0!==t.nw;return!!n&&!s&&!o}())return void i((()=>{console.error("[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/")}));fn&&(Ue()||a.warn("No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill."));const n={...e,stackParser:(r=e.stackParser||br,Array.isArray(r)?Dt(...r):r),integrations:z(e),transport:e.transport||Rr};var r;const s=Mt(Dn,n);return e.autoSessionTracking&&function(){if(void 0===kn.document)return void(fn&&a.warn("Session tracking in non-browser environment with @sentry/browser is not supported."));$e({ignoreDuration:!0}),De(),Ve((({from:t,to:e})=>{void 0!==t&&t!==e&&($e({ignoreDuration:!0}),De())}))}(),s},showReportDialog:function(t={}){if(!kn.document)return void(fn&&a.error("Global document not defined in showReportDialog call"));const e=vt(),n=e.getClient(),r=n&&n.getDsn();if(!r)return void(fn&&a.error("DSN not configured for showReportDialog call"));if(e&&(t.user={...e.getUser(),...t.user}),!t.eventId){const e=Et().lastEventId();e&&(t.eventId=e)}const s=kn.document.createElement("script");s.async=!0,s.crossOrigin="anonymous",s.src=function(t,e){const n=Re(t);if(!n)return"";const r=`${je(n)}embed/error-page/`;let s=`dsn=${Ie(n)}`;for(const t in e)if("dsn"!==t&&"onClose"!==t)if("user"===t){const t=e.user;if(!t)continue;t.name&&(s+=`&name=${encodeURIComponent(t.name)}`),t.email&&(s+=`&email=${encodeURIComponent(t.email)}`)}else s+=`&${encodeURIComponent(t)}=${encodeURIComponent(e[t])}`;return`${r}?${s}`}(r,t),t.onLoad&&(s.onload=t.onLoad);const{onClose:o}=t;if(o){const t=e=>{if("__sentry_reportdialog_closed__"===e.data)try{o()}finally{kn.removeEventListener("message",t)}};kn.addEventListener("message",t)}const i=kn.document.head||kn.document.body;i?i.appendChild(s):fn&&a.error("Not injecting report dialog. No injection point found in HTML")}};window.Sentry=Cr})(); \ No newline at end of file diff --git a/weblate/static/js/vendor/tribute.js b/weblate/static/js/vendor/tribute.js new file mode 100644 index 000000000000..eed3ce959b8f --- /dev/null +++ b/weblate/static/js/vendor/tribute.js @@ -0,0 +1 @@ +(()=>{var e={897:function(e){e.exports=function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;n>>0,r=arguments[1],o=0;o container for the click");n.selectItemAtIndex(i.getAttribute("data-index"),t),n.hideMenu()}else n.current.element&&!n.current.externalTrigger&&(n.current.externalTrigger=!1,setTimeout((function(){return n.hideMenu()})))}},{key:"keyup",value:function(e,t){if(e.inputEvent&&(e.inputEvent=!1),e.updateSelection(this),27!==t.keyCode){if(!e.tribute.allowSpaces&&e.tribute.hasTrailingSpace)return e.tribute.hasTrailingSpace=!1,e.commandEvent=!0,void e.callbacks().space(t,this);if(!e.tribute.isActive)if(e.tribute.autocompleteMode)e.callbacks().triggerChar(t,this,"");else{var n=e.getKeyCode(e,this,t);if(isNaN(n)||!n)return;var i=e.tribute.triggers().find((function(e){return e.charCodeAt(0)===n}));void 0!==i&&e.callbacks().triggerChar(t,this,i)}e.tribute.current.mentionText.length=r.current.collection.menuShowMinLength&&r.inputEvent&&r.showMenuFor(n,!0)},enter:function(t,n){e.tribute.isActive&&e.tribute.current.filteredItems&&(t.preventDefault(),t.stopPropagation(),setTimeout((function(){e.tribute.selectItemAtIndex(e.tribute.menuSelected,t),e.tribute.hideMenu()}),0))},escape:function(t,n){e.tribute.isActive&&(t.preventDefault(),t.stopPropagation(),e.tribute.isActive=!1,e.tribute.hideMenu())},tab:function(t,n){e.callbacks().enter(t,n)},space:function(t,n){e.tribute.isActive&&(e.tribute.spaceSelectsMatch?e.callbacks().enter(t,n):e.tribute.allowSpaces||(t.stopPropagation(),setTimeout((function(){e.tribute.hideMenu(),e.tribute.isActive=!1}),0)))},up:function(t,n){if(e.tribute.isActive&&e.tribute.current.filteredItems){t.preventDefault(),t.stopPropagation();var i=e.tribute.current.filteredItems.length,r=e.tribute.menuSelected;i>r&&r>0?(e.tribute.menuSelected--,e.setActiveLi()):0===r&&(e.tribute.menuSelected=i-1,e.setActiveLi(),e.tribute.menu.scrollTop=e.tribute.menu.scrollHeight)}},down:function(t,n){if(e.tribute.isActive&&e.tribute.current.filteredItems){t.preventDefault(),t.stopPropagation();var i=e.tribute.current.filteredItems.length-1,r=e.tribute.menuSelected;i>r?(e.tribute.menuSelected++,e.setActiveLi()):i===r&&(e.tribute.menuSelected=0,e.setActiveLi(),e.tribute.menu.scrollTop=0)}},delete:function(t,n){e.tribute.isActive&&e.tribute.current.mentionText.length<1?e.tribute.hideMenu():e.tribute.isActive&&e.tribute.showMenuFor(n)}}}},{key:"setActiveLi",value:function(e){var t=this.tribute.menu.querySelectorAll("li"),n=t.length>>>0;e&&(this.tribute.menuSelected=parseInt(e));for(var i=0;iu.bottom){var l=o.bottom-u.bottom;this.tribute.menu.scrollTop+=l}else if(o.topi.width&&(r.left||r.right),u=window.innerHeight>i.height&&(r.top||r.bottom);(o||u)&&(n.tribute.menu.style.cssText="display: none",n.positionMenuAtCaret(e))}),0)}else this.tribute.menu.style.cssText="display: none"}},{key:"selectElement",value:function(e,t,n){var i,r=e;if(t)for(var o=0;o=0&&(t=i.substring(0,r))}}else{var o=this.tribute.current.element;if(o){var u=o.selectionStart;o.value&&u>=0&&(t=o.value.substring(0,u))}}return t}},{key:"getLastWordInText",value:function(e){var t=(e=e.replace(/\u00A0/g," ")).split(/\s+/);return t[t.length-1].trim()}},{key:"getTriggerInfo",value:function(e,t,n,i,r){var o,u,l,s=this,a=this.tribute.current;if(this.isContentEditable(a.element)){var c=this.getContentEditableSelectedPath(a);c&&(o=c.selected,u=c.path,l=c.offset)}else o=this.tribute.current.element;var h=this.getTextPrecedingCurrentSelection(),d=this.getLastWordInText(h);if(r)return{mentionPosition:h.length-d.length,mentionText:d,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:l};if(null!=h){var f,m=-1;if(this.tribute.collection.forEach((function(e){var t=e.trigger,i=e.requireLeadingSpace?s.lastIndexWithLeadingSpace(h,t):h.lastIndexOf(t);i>m&&(m=i,f=t,n=e.requireLeadingSpace)})),m>=0&&(0===m||!n||/[\xA0\s]/g.test(h.substring(m-1,m)))){var p=h.substring(m+f.length,h.length);f=h.substring(m,m+f.length);var v=p.substring(0,1),g=p.length>0&&(" "===v||" "===v);t&&(p=p.trim());var b=i?/[^\S ]/g:/[\xA0\s]/g;if(this.tribute.hasTrailingSpace=b.test(p),!g&&(e||!b.test(p)))return{mentionPosition:m,mentionText:p,mentionSelectedElement:o,mentionSelectedPath:u,mentionSelectedOffset:l,mentionTriggerChar:f}}}}},{key:"lastIndexWithLeadingSpace",value:function(e,t){for(var n=e.split("").reverse().join(""),i=-1,r=0,o=e.length;r=0;a--)if(t[a]!==n[r-a]){s=!1;break}if(s&&(u||l)){i=e.length-1-r;break}}return i}},{key:"isContentEditable",value:function(e){return"INPUT"!==e.nodeName&&"TEXTAREA"!==e.nodeName}},{key:"isMenuOffScreen",value:function(e,t){var n=window.innerWidth,i=window.innerHeight,r=document.documentElement,o=(window.pageXOffset||r.scrollLeft)-(r.clientLeft||0),u=(window.pageYOffset||r.scrollTop)-(r.clientTop||0),l="number"==typeof e.top?e.top:u+i-e.bottom-t.height,s="number"==typeof e.right?e.right:e.left+t.width,a="number"==typeof e.bottom?e.bottom:e.top+t.height,c="number"==typeof e.left?e.left:o+n-e.right-t.width;return{top:lMath.ceil(o+n),bottom:a>Math.ceil(u+i),left:cparseInt(u.height)&&(o.overflowY="scroll")):o.overflow="hidden",r.textContent=e.value.substring(0,t),"INPUT"===e.nodeName&&(r.textContent=r.textContent.replace(/\s/g," "));var l=this.getDocument().createElement("span");l.textContent=e.value.substring(t)||".",r.appendChild(l);var s=e.getBoundingClientRect(),a=document.documentElement,c=(window.pageXOffset||a.scrollLeft)-(a.clientLeft||0),h=(window.pageYOffset||a.scrollTop)-(a.clientTop||0),d=0,f=0;this.menuContainerIsBody&&(d=s.top,f=s.left);var m={top:d+h+l.offsetTop+parseInt(u.borderTopWidth)+parseInt(u.fontSize)-e.scrollTop,left:f+c+l.offsetLeft+parseInt(u.borderLeftWidth)},p=window.innerWidth,v=window.innerHeight,g=this.getMenuDimensions(),b=this.isMenuOffScreen(m,g);b.right&&(m.right=p-m.left,m.left="auto");var y=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(b.bottom){var w=y-(v-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);m.bottom=w+(v-s.top-l.offsetTop),m.top="auto"}return(b=this.isMenuOffScreen(m,g)).left&&(m.left=p>g.width?c+p-g.width:c,delete m.right),b.top&&(m.top=v>g.height?h+v-g.height:h,delete m.bottom),this.getDocument().body.removeChild(r),m}},{key:"getContentEditableCaretPosition",value:function(e){var t,n=this.getWindowSelection();(t=this.getDocument().createRange()).setStart(n.anchorNode,e),t.setEnd(n.anchorNode,e),t.collapse(!1);var i=t.getBoundingClientRect(),r=document.documentElement,o=(window.pageXOffset||r.scrollLeft)-(r.clientLeft||0),u=(window.pageYOffset||r.scrollTop)-(r.clientTop||0),l={left:i.left+o,top:i.top+i.height+u},s=window.innerWidth,a=window.innerHeight,c=this.getMenuDimensions(),h=this.isMenuOffScreen(l,c);h.right&&(l.left="auto",l.right=s-i.left-o);var d=this.tribute.menuContainer?this.tribute.menuContainer.offsetHeight:this.getDocument().body.offsetHeight;if(h.bottom){var f=d-(a-(this.tribute.menuContainer?this.tribute.menuContainer.getBoundingClientRect():this.getDocument().body.getBoundingClientRect()).top);l.top="auto",l.bottom=f+(a-i.top)}return(h=this.isMenuOffScreen(l,c)).left&&(l.left=s>c.width?o+s-c.width:o,delete l.right),h.top&&(l.top=a>c.height?u+a-c.height:u,delete l.bottom),this.menuContainerIsBody||(l.left=l.left?l.left-this.tribute.menuContainer.offsetLeft:l.left,l.top=l.top?l.top-this.tribute.menuContainer.offsetTop:l.top),l}},{key:"scrollIntoView",value:function(e){var t,n=this.menu;if(void 0!==n){for(;void 0===t||0===t.height;)if(0===(t=n.getBoundingClientRect()).height&&(void 0===(n=n.childNodes[0])||!n.getBoundingClientRect))return;var i=t.top,r=i+t.height;if(i<0)window.scrollTo(0,window.pageYOffset+t.top-20);else if(r>window.innerHeight){var o=window.pageYOffset+t.top-20;o-window.pageYOffset>100&&(o=window.pageYOffset+100);var u=window.pageYOffset-(window.innerHeight-r);u>o&&(u=o),window.scrollTo(0,u)}}}},{key:"menuContainerIsBody",get:function(){return this.tribute.menuContainer===document.body||!this.tribute.menuContainer}}]),t}(),s=function(){function t(n){e(this,t),this.tribute=n,this.tribute.search=this}return n(t,[{key:"simpleFilter",value:function(e,t){var n=this;return t.filter((function(t){return n.test(e,t)}))}},{key:"test",value:function(e,t){return null!==this.match(e,t)}},{key:"match",value:function(e,t,n){n=n||{},t.length;var i=n.pre||"",r=n.post||"",o=n.caseSensitive&&t||t.toLowerCase();if(n.skip)return{rendered:t,score:0};e=n.caseSensitive&&e||e.toLowerCase();var u=this.traverse(o,e,0,0,[]);return u?{rendered:this.render(t,u.cache,i,r),score:u.score}:null}},{key:"traverse",value:function(e,t,n,i,r){if(t.length===i)return{score:this.calculateScore(r),cache:r.slice()};if(!(e.length===n||t.length-i>e.length-n)){for(var o,u,l=t[i],s=e.indexOf(l,n);s>-1;){if(r.push(s),u=this.traverse(e,t,s+1,i+1,r),r.pop(),!u)return o;(!o||o.score0&&(e[r-1]+1===i?n+=n+1:n=1),t+=n})),t}},{key:"render",value:function(e,t,n,i){var r=e.substring(0,t[0]);return t.forEach((function(o,u){r+=n+e[o]+i+e.substring(o+1,t[u+1]?t[u+1]:e.length)})),r}},{key:"filter",value:function(e,t,n){var i=this;return n=n||{},t.reduce((function(t,r,o,u){var l=r;n.extract&&((l=n.extract(r))||(l=""));var s=i.match(e,l,n);return null!=s&&(t[t.length]={string:s.rendered,score:s.score,index:o,original:r}),t}),[]).sort((function(e,t){return t.score-e.score||e.index-t.index}))}}]),t}();return function(){function t(n){var i,r=this,a=n.values,c=void 0===a?null:a,h=n.iframe,d=void 0===h?null:h,f=n.selectClass,m=void 0===f?"highlight":f,p=n.containerClass,v=void 0===p?"tribute-container":p,g=n.itemClass,b=void 0===g?"":g,y=n.trigger,w=void 0===y?"@":y,T=n.autocompleteMode,C=void 0!==T&&T,S=n.selectTemplate,E=void 0===S?null:S,k=n.menuItemTemplate,x=void 0===k?null:k,M=n.lookup,A=void 0===M?"key":M,L=n.fillAttr,I=void 0===L?"value":L,N=n.collection,O=void 0===N?null:N,P=n.menuContainer,D=void 0===P?null:P,R=n.noMatchTemplate,W=void 0===R?null:R,H=n.requireLeadingSpace,B=void 0===H||H,_=n.allowSpaces,F=void 0!==_&&_,j=n.replaceTextSuffix,Y=void 0===j?null:j,z=n.positionMenu,K=void 0===z||z,q=n.spaceSelectsMatch,U=void 0!==q&&q,X=n.searchOpts,Q=void 0===X?{}:X,V=n.menuItemLimit,G=void 0===V?null:V,J=n.menuShowMinLength,Z=void 0===J?0:J;if(e(this,t),this.autocompleteMode=C,this.menuSelected=0,this.current={},this.inputEvent=!1,this.isActive=!1,this.menuContainer=D,this.allowSpaces=F,this.replaceTextSuffix=Y,this.positionMenu=K,this.hasTrailingSpace=!1,this.spaceSelectsMatch=U,this.autocompleteMode&&(w="",F=!1),c)this.collection=[{trigger:w,iframe:d,selectClass:m,containerClass:v,itemClass:b,selectTemplate:(E||t.defaultSelectTemplate).bind(this),menuItemTemplate:(x||t.defaultMenuItemTemplate).bind(this),noMatchTemplate:(i=W,"string"==typeof i?""===i.trim()?null:i:"function"==typeof i?i.bind(r):W||function(){return"
  • No Match Found!
  • "}.bind(r)),lookup:A,fillAttr:I,values:c,requireLeadingSpace:B,searchOpts:Q,menuItemLimit:G,menuShowMinLength:Z}];else{if(!O)throw new Error("[Tribute] No collection specified.");this.autocompleteMode&&console.warn("Tribute in autocomplete mode does not work for collections"),this.collection=O.map((function(e){return{trigger:e.trigger||w,iframe:e.iframe||d,selectClass:e.selectClass||m,containerClass:e.containerClass||v,itemClass:e.itemClass||b,selectTemplate:(e.selectTemplate||t.defaultSelectTemplate).bind(r),menuItemTemplate:(e.menuItemTemplate||t.defaultMenuItemTemplate).bind(r),noMatchTemplate:function(e){return"string"==typeof e?""===e.trim()?null:e:"function"==typeof e?e.bind(r):W||function(){return"
  • No Match Found!
  • "}.bind(r)}(W),lookup:e.lookup||A,fillAttr:e.fillAttr||I,values:e.values,requireLeadingSpace:e.requireLeadingSpace,searchOpts:e.searchOpts||Q,menuItemLimit:e.menuItemLimit||G,menuShowMinLength:e.menuShowMinLength||Z}}))}new l(this),new o(this),new u(this),new s(this)}return n(t,[{key:"triggers",value:function(){return this.collection.map((function(e){return e.trigger}))}},{key:"attach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n",post:n.current.collection.searchOpts.post||"",skip:n.current.collection.searchOpts.skip,extract:function(e){if("string"==typeof n.current.collection.lookup)return e[n.current.collection.lookup];if("function"==typeof n.current.collection.lookup)return n.current.collection.lookup(e,n.current.mentionText);throw new Error("Invalid lookup attribute, lookup must be string or function.")}});n.current.collection.menuItemLimit&&(r=r.slice(0,n.current.collection.menuItemLimit)),n.current.filteredItems=r;var o=n.menu.querySelector("ul");if(n.range.positionMenuAtCaret(t),!r.length){var u=new CustomEvent("tribute-no-match",{detail:n.menu});return n.current.element.dispatchEvent(u),void("function"==typeof n.current.collection.noMatchTemplate&&!n.current.collection.noMatchTemplate()||!n.current.collection.noMatchTemplate?n.hideMenu():"function"==typeof n.current.collection.noMatchTemplate?o.innerHTML=n.current.collection.noMatchTemplate():o.innerHTML=n.current.collection.noMatchTemplate)}o.innerHTML="";var l=n.range.getDocument().createDocumentFragment();r.forEach((function(e,t){var r=n.range.getDocument().createElement("li");r.setAttribute("data-index",t),r.className=n.current.collection.itemClass,r.addEventListener("mousemove",(function(e){var t=i(n._findLiTarget(e.target),2),r=(t[0],t[1]);0!==e.movementY&&n.events.setActiveLi(r)})),n.menuSelected===t&&r.classList.add(n.current.collection.selectClass),r.innerHTML=n.current.collection.menuItemTemplate(e),l.appendChild(r)})),o.appendChild(l)}};"function"==typeof this.current.collection.values?this.current.collection.values(this.current.mentionText,r):r(this.current.collection.values)}}},{key:"_findLiTarget",value:function(e){if(!e)return[];var t=e.getAttribute("data-index");return t?[e,t]:this._findLiTarget(e.parentNode)}},{key:"showMenuForCollection",value:function(e,t){e!==document.activeElement&&this.placeCaretAtEnd(e),this.current.collection=this.collection[t||0],this.current.externalTrigger=!0,this.current.element=e,e.isContentEditable?this.insertTextAtCursor(this.current.collection.trigger):this.insertAtCaret(e,this.current.collection.trigger),this.showMenuFor(e)}},{key:"placeCaretAtEnd",value:function(e){if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var t=document.createRange();t.selectNodeContents(e),t.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(t)}else if(void 0!==document.body.createTextRange){var i=document.body.createTextRange();i.moveToElementText(e),i.collapse(!1),i.select()}}},{key:"insertTextAtCursor",value:function(e){var t,n;(n=(t=window.getSelection()).getRangeAt(0)).deleteContents();var i=document.createTextNode(e);n.insertNode(i),n.selectNodeContents(i),n.collapse(!1),t.removeAllRanges(),t.addRange(n)}},{key:"insertAtCaret",value:function(e,t){var n=e.scrollTop,i=e.selectionStart,r=e.value.substring(0,i),o=e.value.substring(e.selectionEnd,e.value.length);e.value=r+t+o,i+=t.length,e.selectionStart=i,e.selectionEnd=i,e.focus(),e.scrollTop=n}},{key:"hideMenu",value:function(){this.menu&&(this.menu.style.cssText="display: none;",this.isActive=!1,this.menuSelected=0,this.current={})}},{key:"selectItemAtIndex",value:function(e,t){if("number"==typeof(e=parseInt(e))&&!isNaN(e)){var n=this.current.filteredItems[e],i=this.current.collection.selectTemplate(n);null!==i&&this.replaceText(i,t,n)}}},{key:"replaceText",value:function(e,t,n){this.range.replaceTriggerText(e,!0,!0,t,n)}},{key:"_append",value:function(e,t,n){if("function"==typeof e.values)throw new Error("Unable to append to values, as it is a function.");e.values=n?t:e.values.concat(t)}},{key:"append",value:function(e,t,n){var i=parseInt(e);if("number"!=typeof i)throw new Error("please provide an index for the collection to update.");var r=this.collection[i];this._append(r,t,n)}},{key:"appendCurrent",value:function(e,t){if(!this.isActive)throw new Error("No active state. Please use append instead and pass an index.");this._append(this.current.collection,e,t)}},{key:"detach",value:function(e){if(!e)throw new Error("[Tribute] Must pass in a DOM node or NodeList.");if("undefined"!=typeof jQuery&&e instanceof jQuery&&(e=e.get()),e.constructor===NodeList||e.constructor===HTMLCollection||e.constructor===Array)for(var t=e.length,n=0;n'+(this.current.collection.trigger+e.original[this.current.collection.fillAttr])+"":this.current.collection.trigger+e.original[this.current.collection.fillAttr]}},{key:"defaultMenuItemTemplate",value:function(e){return e.string}},{key:"inputTypes",value:function(){return["TEXTAREA","INPUT"]}}]),t}()}()}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";var e=n(897),t=n.n(e);window.Tribute=t()})()})(); \ No newline at end of file diff --git a/weblate/static/js/vendor/tribute.js.license b/weblate/static/js/vendor/tribute.js.license new file mode 100644 index 000000000000..c326699aaa40 --- /dev/null +++ b/weblate/static/js/vendor/tribute.js.license @@ -0,0 +1,3 @@ +Copyright (c) 2017-2020 ZURB, Inc. + +SPDX-License-Identifier: MIT diff --git a/weblate/static/styles/main.css b/weblate/static/styles/main.css index be4178354eb8..b1060c716dd3 100644 --- a/weblate/static/styles/main.css +++ b/weblate/static/styles/main.css @@ -329,6 +329,8 @@ span.replaced { .editor-toolbar { margin: 3px 0; + overflow-y: auto; + max-width: 100%; } .panel-body .table-condensed { diff --git a/weblate/static/vendor/tribute.js b/weblate/static/vendor/tribute.js deleted file mode 100644 index 3100f6848cdb..000000000000 --- a/weblate/static/vendor/tribute.js +++ /dev/null @@ -1,1860 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.Tribute = factory()); -}(this, (function () { 'use strict'; - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArrayLimit(arr, i) { - if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { - return; - } - - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_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; - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - - if (!Array.prototype.find) { - Array.prototype.find = function (predicate) { - if (this === null) { - throw new TypeError('Array.prototype.find called on null or undefined'); - } - - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - - for (var i = 0; i < length; i++) { - value = list[i]; - - if (predicate.call(thisArg, value, i, list)) { - return value; - } - } - - return undefined; - }; - } - - if (window && typeof window.CustomEvent !== "function") { - var CustomEvent$1 = function CustomEvent(event, params) { - params = params || { - bubbles: false, - cancelable: false, - detail: undefined - }; - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); - return evt; - }; - - if (typeof window.Event !== 'undefined') { - CustomEvent$1.prototype = window.Event.prototype; - } - - window.CustomEvent = CustomEvent$1; - } - - var TributeEvents = /*#__PURE__*/function () { - function TributeEvents(tribute) { - _classCallCheck(this, TributeEvents); - - this.tribute = tribute; - this.tribute.events = this; - } - - _createClass(TributeEvents, [{ - key: "bind", - value: function bind(element) { - element.boundKeydown = this.keydown.bind(element, this); - element.boundKeyup = this.keyup.bind(element, this); - element.boundInput = this.input.bind(element, this); - element.addEventListener("keydown", element.boundKeydown, false); - element.addEventListener("keyup", element.boundKeyup, false); - element.addEventListener("input", element.boundInput, false); - } - }, { - key: "unbind", - value: function unbind(element) { - element.removeEventListener("keydown", element.boundKeydown, false); - element.removeEventListener("keyup", element.boundKeyup, false); - element.removeEventListener("input", element.boundInput, false); - delete element.boundKeydown; - delete element.boundKeyup; - delete element.boundInput; - } - }, { - key: "keydown", - value: function keydown(instance, event) { - if (instance.shouldDeactivate(event)) { - instance.tribute.isActive = false; - instance.tribute.hideMenu(); - } - - var element = this; - instance.commandEvent = false; - TributeEvents.keys().forEach(function (o) { - if (o.key === event.keyCode) { - instance.commandEvent = true; - instance.callbacks()[o.value.toLowerCase()](event, element); - } - }); - } - }, { - key: "input", - value: function input(instance, event) { - instance.inputEvent = true; - instance.keyup.call(this, instance, event); - } - }, { - key: "click", - value: function click(instance, event) { - var tribute = instance.tribute; - - if (tribute.menu && tribute.menu.contains(event.target)) { - var li = event.target; - event.preventDefault(); - event.stopPropagation(); - - while (li.nodeName.toLowerCase() !== "li") { - li = li.parentNode; - - if (!li || li === tribute.menu) { - throw new Error("cannot find the
  • container for the click"); - } - } - - tribute.selectItemAtIndex(li.getAttribute("data-index"), event); - tribute.hideMenu(); // TODO: should fire with externalTrigger and target is outside of menu - } else if (tribute.current.element && !tribute.current.externalTrigger) { - tribute.current.externalTrigger = false; - setTimeout(function () { - return tribute.hideMenu(); - }); - } - } - }, { - key: "keyup", - value: function keyup(instance, event) { - if (instance.inputEvent) { - instance.inputEvent = false; - } - - instance.updateSelection(this); - if (event.keyCode === 27) return; - - if (!instance.tribute.allowSpaces && instance.tribute.hasTrailingSpace) { - instance.tribute.hasTrailingSpace = false; - instance.commandEvent = true; - instance.callbacks()["space"](event, this); - return; - } - - if (!instance.tribute.isActive) { - if (instance.tribute.autocompleteMode) { - instance.callbacks().triggerChar(event, this, ""); - } else { - var keyCode = instance.getKeyCode(instance, this, event); - if (isNaN(keyCode) || !keyCode) return; - var trigger = instance.tribute.triggers().find(function (trigger) { - return trigger.charCodeAt(0) === keyCode; - }); - - if (typeof trigger !== "undefined") { - instance.callbacks().triggerChar(event, this, trigger); - } - } - } - - if (instance.tribute.current.mentionText.length < instance.tribute.current.collection.menuShowMinLength) { - return; - } - - if ((instance.tribute.current.trigger || instance.tribute.autocompleteMode) && instance.commandEvent === false || instance.tribute.isActive && event.keyCode === 8) { - instance.tribute.showMenuFor(this, true); - } - } - }, { - key: "shouldDeactivate", - value: function shouldDeactivate(event) { - if (!this.tribute.isActive) return false; - - if (this.tribute.current.mentionText.length === 0) { - var eventKeyPressed = false; - TributeEvents.keys().forEach(function (o) { - if (event.keyCode === o.key) eventKeyPressed = true; - }); - return !eventKeyPressed; - } - - return false; - } - }, { - key: "getKeyCode", - value: function getKeyCode(instance, el, event) { - - var tribute = instance.tribute; - var info = tribute.range.getTriggerInfo(false, tribute.hasTrailingSpace, true, tribute.allowSpaces, tribute.autocompleteMode); - - if (info) { - return info.mentionTriggerChar.charCodeAt(0); - } else { - return false; - } - } - }, { - key: "updateSelection", - value: function updateSelection(el) { - this.tribute.current.element = el; - var info = this.tribute.range.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode); - - if (info) { - this.tribute.current.selectedPath = info.mentionSelectedPath; - this.tribute.current.mentionText = info.mentionText; - this.tribute.current.selectedOffset = info.mentionSelectedOffset; - } - } - }, { - key: "callbacks", - value: function callbacks() { - var _this = this; - - return { - triggerChar: function triggerChar(e, el, trigger) { - var tribute = _this.tribute; - tribute.current.trigger = trigger; - var collectionItem = tribute.collection.find(function (item) { - return item.trigger === trigger; - }); - tribute.current.collection = collectionItem; - - if (tribute.current.mentionText.length >= tribute.current.collection.menuShowMinLength && tribute.inputEvent) { - tribute.showMenuFor(el, true); - } - }, - enter: function enter(e, el) { - // choose selection - if (_this.tribute.isActive && _this.tribute.current.filteredItems) { - e.preventDefault(); - e.stopPropagation(); - setTimeout(function () { - _this.tribute.selectItemAtIndex(_this.tribute.menuSelected, e); - - _this.tribute.hideMenu(); - }, 0); - } - }, - escape: function escape(e, el) { - if (_this.tribute.isActive) { - e.preventDefault(); - e.stopPropagation(); - _this.tribute.isActive = false; - - _this.tribute.hideMenu(); - } - }, - tab: function tab(e, el) { - // choose first match - _this.callbacks().enter(e, el); - }, - space: function space(e, el) { - if (_this.tribute.isActive) { - if (_this.tribute.spaceSelectsMatch) { - _this.callbacks().enter(e, el); - } else if (!_this.tribute.allowSpaces) { - e.stopPropagation(); - setTimeout(function () { - _this.tribute.hideMenu(); - - _this.tribute.isActive = false; - }, 0); - } - } - }, - up: function up(e, el) { - // navigate up ul - if (_this.tribute.isActive && _this.tribute.current.filteredItems) { - e.preventDefault(); - e.stopPropagation(); - var count = _this.tribute.current.filteredItems.length, - selected = _this.tribute.menuSelected; - - if (count > selected && selected > 0) { - _this.tribute.menuSelected--; - - _this.setActiveLi(); - } else if (selected === 0) { - _this.tribute.menuSelected = count - 1; - - _this.setActiveLi(); - - _this.tribute.menu.scrollTop = _this.tribute.menu.scrollHeight; - } - } - }, - down: function down(e, el) { - // navigate down ul - if (_this.tribute.isActive && _this.tribute.current.filteredItems) { - e.preventDefault(); - e.stopPropagation(); - var count = _this.tribute.current.filteredItems.length - 1, - selected = _this.tribute.menuSelected; - - if (count > selected) { - _this.tribute.menuSelected++; - - _this.setActiveLi(); - } else if (count === selected) { - _this.tribute.menuSelected = 0; - - _this.setActiveLi(); - - _this.tribute.menu.scrollTop = 0; - } - } - }, - "delete": function _delete(e, el) { - if (_this.tribute.isActive && _this.tribute.current.mentionText.length < 1) { - _this.tribute.hideMenu(); - } else if (_this.tribute.isActive) { - _this.tribute.showMenuFor(el); - } - } - }; - } - }, { - key: "setActiveLi", - value: function setActiveLi(index) { - var lis = this.tribute.menu.querySelectorAll("li"), - length = lis.length >>> 0; - if (index) this.tribute.menuSelected = parseInt(index); - - for (var i = 0; i < length; i++) { - var li = lis[i]; - - if (i === this.tribute.menuSelected) { - li.classList.add(this.tribute.current.collection.selectClass); - var liClientRect = li.getBoundingClientRect(); - var menuClientRect = this.tribute.menu.getBoundingClientRect(); - - if (liClientRect.bottom > menuClientRect.bottom) { - var scrollDistance = liClientRect.bottom - menuClientRect.bottom; - this.tribute.menu.scrollTop += scrollDistance; - } else if (liClientRect.top < menuClientRect.top) { - var _scrollDistance = menuClientRect.top - liClientRect.top; - - this.tribute.menu.scrollTop -= _scrollDistance; - } - } else { - li.classList.remove(this.tribute.current.collection.selectClass); - } - } - } - }, { - key: "getFullHeight", - value: function getFullHeight(elem, includeMargin) { - var height = elem.getBoundingClientRect().height; - - if (includeMargin) { - var style = elem.currentStyle || window.getComputedStyle(elem); - return height + parseFloat(style.marginTop) + parseFloat(style.marginBottom); - } - - return height; - } - }], [{ - key: "keys", - value: function keys() { - return [{ - key: 9, - value: "TAB" - }, { - key: 8, - value: "DELETE" - }, { - key: 13, - value: "ENTER" - }, { - key: 27, - value: "ESCAPE" - }, { - key: 32, - value: "SPACE" - }, { - key: 38, - value: "UP" - }, { - key: 40, - value: "DOWN" - }]; - } - }]); - - return TributeEvents; - }(); - - var TributeMenuEvents = /*#__PURE__*/function () { - function TributeMenuEvents(tribute) { - _classCallCheck(this, TributeMenuEvents); - - this.tribute = tribute; - this.tribute.menuEvents = this; - this.menu = this.tribute.menu; - } - - _createClass(TributeMenuEvents, [{ - key: "bind", - value: function bind(menu) { - var _this = this; - - this.menuClickEvent = this.tribute.events.click.bind(null, this); - this.menuContainerScrollEvent = this.debounce(function () { - if (_this.tribute.isActive) { - _this.tribute.showMenuFor(_this.tribute.current.element, false); - } - }, 300, false); - this.windowResizeEvent = this.debounce(function () { - if (_this.tribute.isActive) { - _this.tribute.range.positionMenuAtCaret(true); - } - }, 300, false); // fixes IE11 issues with mousedown - - this.tribute.range.getDocument().addEventListener("MSPointerDown", this.menuClickEvent, false); - this.tribute.range.getDocument().addEventListener("mousedown", this.menuClickEvent, false); - window.addEventListener("resize", this.windowResizeEvent); - - if (this.menuContainer) { - this.menuContainer.addEventListener("scroll", this.menuContainerScrollEvent, false); - } else { - window.addEventListener("scroll", this.menuContainerScrollEvent); - } - } - }, { - key: "unbind", - value: function unbind(menu) { - this.tribute.range.getDocument().removeEventListener("mousedown", this.menuClickEvent, false); - this.tribute.range.getDocument().removeEventListener("MSPointerDown", this.menuClickEvent, false); - window.removeEventListener("resize", this.windowResizeEvent); - - if (this.menuContainer) { - this.menuContainer.removeEventListener("scroll", this.menuContainerScrollEvent, false); - } else { - window.removeEventListener("scroll", this.menuContainerScrollEvent); - } - } - }, { - key: "debounce", - value: function debounce(func, wait, immediate) { - var _arguments = arguments, - _this2 = this; - - var timeout; - return function () { - var context = _this2, - args = _arguments; - - var later = function later() { - timeout = null; - if (!immediate) func.apply(context, args); - }; - - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - }; - } - }]); - - return TributeMenuEvents; - }(); - - var TributeRange = /*#__PURE__*/function () { - function TributeRange(tribute) { - _classCallCheck(this, TributeRange); - - this.tribute = tribute; - this.tribute.range = this; - } - - _createClass(TributeRange, [{ - key: "getDocument", - value: function getDocument() { - var iframe; - - if (this.tribute.current.collection) { - iframe = this.tribute.current.collection.iframe; - } - - if (!iframe) { - return document; - } - - return iframe.contentWindow.document; - } - }, { - key: "positionMenuAtCaret", - value: function positionMenuAtCaret(scrollTo) { - var _this = this; - - var context = this.tribute.current, - coordinates; - var info = this.getTriggerInfo(false, this.tribute.hasTrailingSpace, true, this.tribute.allowSpaces, this.tribute.autocompleteMode); - - if (typeof info !== 'undefined') { - if (!this.tribute.positionMenu) { - this.tribute.menu.style.cssText = "display: block;"; - return; - } - - if (!this.isContentEditable(context.element)) { - coordinates = this.getTextAreaOrInputUnderlinePosition(this.tribute.current.element, info.mentionPosition); - } else { - coordinates = this.getContentEditableCaretPosition(info.mentionPosition); - } - - this.tribute.menu.style.cssText = "top: ".concat(coordinates.top, "px;\n left: ").concat(coordinates.left, "px;\n right: ").concat(coordinates.right, "px;\n bottom: ").concat(coordinates.bottom, "px;\n position: absolute;\n display: block;"); - - if (coordinates.left === 'auto') { - this.tribute.menu.style.left = 'auto'; - } - - if (coordinates.top === 'auto') { - this.tribute.menu.style.top = 'auto'; - } - - if (scrollTo) this.scrollIntoView(); - window.setTimeout(function () { - var menuDimensions = { - width: _this.tribute.menu.offsetWidth, - height: _this.tribute.menu.offsetHeight - }; - - var menuIsOffScreen = _this.isMenuOffScreen(coordinates, menuDimensions); - - var menuIsOffScreenHorizontally = window.innerWidth > menuDimensions.width && (menuIsOffScreen.left || menuIsOffScreen.right); - var menuIsOffScreenVertically = window.innerHeight > menuDimensions.height && (menuIsOffScreen.top || menuIsOffScreen.bottom); - - if (menuIsOffScreenHorizontally || menuIsOffScreenVertically) { - _this.tribute.menu.style.cssText = 'display: none'; - - _this.positionMenuAtCaret(scrollTo); - } - }, 0); - } else { - this.tribute.menu.style.cssText = 'display: none'; - } - } - }, { - key: "selectElement", - value: function selectElement(targetElement, path, offset) { - var range; - var elem = targetElement; - - if (path) { - for (var i = 0; i < path.length; i++) { - elem = elem.childNodes[path[i]]; - - if (elem === undefined) { - return; - } - - while (elem.length < offset) { - offset -= elem.length; - elem = elem.nextSibling; - } - - if (elem.childNodes.length === 0 && !elem.length) { - elem = elem.previousSibling; - } - } - } - - var sel = this.getWindowSelection(); - range = this.getDocument().createRange(); - range.setStart(elem, offset); - range.setEnd(elem, offset); - range.collapse(true); - - try { - sel.removeAllRanges(); - } catch (error) {} - - sel.addRange(range); - targetElement.focus(); - } - }, { - key: "replaceTriggerText", - value: function replaceTriggerText(text, requireLeadingSpace, hasTrailingSpace, originalEvent, item) { - var info = this.getTriggerInfo(true, hasTrailingSpace, requireLeadingSpace, this.tribute.allowSpaces, this.tribute.autocompleteMode); - - if (info !== undefined) { - var context = this.tribute.current; - var replaceEvent = new CustomEvent('tribute-replaced', { - detail: { - item: item, - instance: context, - context: info, - event: originalEvent - } - }); - - if (!this.isContentEditable(context.element)) { - var myField = this.tribute.current.element; - var textSuffix = typeof this.tribute.replaceTextSuffix == 'string' ? this.tribute.replaceTextSuffix : ' '; - text += textSuffix; - var startPos = info.mentionPosition; - var endPos = info.mentionPosition + info.mentionText.length + textSuffix.length; - - if (!this.tribute.autocompleteMode) { - endPos += info.mentionTriggerChar.length - 1; - } - - myField.value = myField.value.substring(0, startPos) + text + myField.value.substring(endPos, myField.value.length); - myField.selectionStart = startPos + text.length; - myField.selectionEnd = startPos + text.length; - } else { - // add a space to the end of the pasted text - var _textSuffix = typeof this.tribute.replaceTextSuffix == 'string' ? this.tribute.replaceTextSuffix : '\xA0'; - - text += _textSuffix; - - var _endPos = info.mentionPosition + info.mentionText.length; - - if (!this.tribute.autocompleteMode) { - _endPos += info.mentionTriggerChar.length; - } - - this.pasteHtml(text, info.mentionPosition, _endPos); - } - - context.element.dispatchEvent(new CustomEvent('input', { - bubbles: true - })); - context.element.dispatchEvent(replaceEvent); - } - } - }, { - key: "pasteHtml", - value: function pasteHtml(html, startPos, endPos) { - var range, sel; - sel = this.getWindowSelection(); - range = this.getDocument().createRange(); - range.setStart(sel.anchorNode, startPos); - range.setEnd(sel.anchorNode, endPos); - range.deleteContents(); - var el = this.getDocument().createElement('div'); - el.innerHTML = html; - var frag = this.getDocument().createDocumentFragment(), - node, - lastNode; - - while (node = el.firstChild) { - lastNode = frag.appendChild(node); - } - - range.insertNode(frag); // Preserve the selection - - if (lastNode) { - range = range.cloneRange(); - range.setStartAfter(lastNode); - range.collapse(true); - sel.removeAllRanges(); - sel.addRange(range); - } - } - }, { - key: "getWindowSelection", - value: function getWindowSelection() { - if (this.tribute.collection.iframe) { - return this.tribute.collection.iframe.contentWindow.getSelection(); - } - - return window.getSelection(); - } - }, { - key: "getNodePositionInParent", - value: function getNodePositionInParent(element) { - if (element.parentNode === null) { - return 0; - } - - for (var i = 0; i < element.parentNode.childNodes.length; i++) { - var node = element.parentNode.childNodes[i]; - - if (node === element) { - return i; - } - } - } - }, { - key: "getContentEditableSelectedPath", - value: function getContentEditableSelectedPath(ctx) { - var sel = this.getWindowSelection(); - var selected = sel.anchorNode; - var path = []; - var offset; - - if (selected != null) { - var i; - var ce = selected.contentEditable; - - while (selected !== null && ce !== 'true') { - i = this.getNodePositionInParent(selected); - path.push(i); - selected = selected.parentNode; - - if (selected !== null) { - ce = selected.contentEditable; - } - } - - path.reverse(); // getRangeAt may not exist, need alternative - - offset = sel.getRangeAt(0).startOffset; - return { - selected: selected, - path: path, - offset: offset - }; - } - } - }, { - key: "getTextPrecedingCurrentSelection", - value: function getTextPrecedingCurrentSelection() { - var context = this.tribute.current, - text = ''; - - if (!this.isContentEditable(context.element)) { - var textComponent = this.tribute.current.element; - - if (textComponent) { - var startPos = textComponent.selectionStart; - - if (textComponent.value && startPos >= 0) { - text = textComponent.value.substring(0, startPos); - } - } - } else { - var selectedElem = this.getWindowSelection().anchorNode; - - if (selectedElem != null) { - var workingNodeContent = selectedElem.textContent; - var selectStartOffset = this.getWindowSelection().getRangeAt(0).startOffset; - - if (workingNodeContent && selectStartOffset >= 0) { - text = workingNodeContent.substring(0, selectStartOffset); - } - } - } - - return text; - } - }, { - key: "getLastWordInText", - value: function getLastWordInText(text) { - text = text.replace(/\u00A0/g, ' '); // https://stackoverflow.com/questions/29850407/how-do-i-replace-unicode-character-u00a0-with-a-space-in-javascript - - var wordsArray = text.split(/\s+/); - var worldsCount = wordsArray.length - 1; - return wordsArray[worldsCount].trim(); - } - }, { - key: "getTriggerInfo", - value: function getTriggerInfo(menuAlreadyActive, hasTrailingSpace, requireLeadingSpace, allowSpaces, isAutocomplete) { - var _this2 = this; - - var ctx = this.tribute.current; - var selected, path, offset; - - if (!this.isContentEditable(ctx.element)) { - selected = this.tribute.current.element; - } else { - var selectionInfo = this.getContentEditableSelectedPath(ctx); - - if (selectionInfo) { - selected = selectionInfo.selected; - path = selectionInfo.path; - offset = selectionInfo.offset; - } - } - - var effectiveRange = this.getTextPrecedingCurrentSelection(); - var lastWordOfEffectiveRange = this.getLastWordInText(effectiveRange); - - if (isAutocomplete) { - return { - mentionPosition: effectiveRange.length - lastWordOfEffectiveRange.length, - mentionText: lastWordOfEffectiveRange, - mentionSelectedElement: selected, - mentionSelectedPath: path, - mentionSelectedOffset: offset - }; - } - - if (effectiveRange !== undefined && effectiveRange !== null) { - var mostRecentTriggerCharPos = -1; - var triggerChar; - this.tribute.collection.forEach(function (config) { - var c = config.trigger; - var idx = config.requireLeadingSpace ? _this2.lastIndexWithLeadingSpace(effectiveRange, c) : effectiveRange.lastIndexOf(c); - - if (idx > mostRecentTriggerCharPos) { - mostRecentTriggerCharPos = idx; - triggerChar = c; - requireLeadingSpace = config.requireLeadingSpace; - } - }); - - if (mostRecentTriggerCharPos >= 0 && (mostRecentTriggerCharPos === 0 || !requireLeadingSpace || /[\xA0\s]/g.test(effectiveRange.substring(mostRecentTriggerCharPos - 1, mostRecentTriggerCharPos)))) { - var currentTriggerSnippet = effectiveRange.substring(mostRecentTriggerCharPos + triggerChar.length, effectiveRange.length); - triggerChar = effectiveRange.substring(mostRecentTriggerCharPos, mostRecentTriggerCharPos + triggerChar.length); - var firstSnippetChar = currentTriggerSnippet.substring(0, 1); - var leadingSpace = currentTriggerSnippet.length > 0 && (firstSnippetChar === ' ' || firstSnippetChar === '\xA0'); - - if (hasTrailingSpace) { - currentTriggerSnippet = currentTriggerSnippet.trim(); - } - - var regex = allowSpaces ? /[^\S ]/g : /[\xA0\s]/g; - this.tribute.hasTrailingSpace = regex.test(currentTriggerSnippet); - - if (!leadingSpace && (menuAlreadyActive || !regex.test(currentTriggerSnippet))) { - return { - mentionPosition: mostRecentTriggerCharPos, - mentionText: currentTriggerSnippet, - mentionSelectedElement: selected, - mentionSelectedPath: path, - mentionSelectedOffset: offset, - mentionTriggerChar: triggerChar - }; - } - } - } - } - }, { - key: "lastIndexWithLeadingSpace", - value: function lastIndexWithLeadingSpace(str, trigger) { - var reversedStr = str.split('').reverse().join(''); - var index = -1; - - for (var cidx = 0, len = str.length; cidx < len; cidx++) { - var firstChar = cidx === str.length - 1; - var leadingSpace = /\s/.test(reversedStr[cidx + 1]); - var match = true; - - for (var triggerIdx = trigger.length - 1; triggerIdx >= 0; triggerIdx--) { - if (trigger[triggerIdx] !== reversedStr[cidx - triggerIdx]) { - match = false; - break; - } - } - - if (match && (firstChar || leadingSpace)) { - index = str.length - 1 - cidx; - break; - } - } - - return index; - } - }, { - key: "isContentEditable", - value: function isContentEditable(element) { - return element.nodeName !== 'INPUT' && element.nodeName !== 'TEXTAREA'; - } - }, { - key: "isMenuOffScreen", - value: function isMenuOffScreen(coordinates, menuDimensions) { - var windowWidth = window.innerWidth; - var windowHeight = window.innerHeight; - var doc = document.documentElement; - var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0); - var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); - var menuTop = typeof coordinates.top === 'number' ? coordinates.top : windowTop + windowHeight - coordinates.bottom - menuDimensions.height; - var menuRight = typeof coordinates.right === 'number' ? coordinates.right : coordinates.left + menuDimensions.width; - var menuBottom = typeof coordinates.bottom === 'number' ? coordinates.bottom : coordinates.top + menuDimensions.height; - var menuLeft = typeof coordinates.left === 'number' ? coordinates.left : windowLeft + windowWidth - coordinates.right - menuDimensions.width; - return { - top: menuTop < Math.floor(windowTop), - right: menuRight > Math.ceil(windowLeft + windowWidth), - bottom: menuBottom > Math.ceil(windowTop + windowHeight), - left: menuLeft < Math.floor(windowLeft) - }; - } - }, { - key: "getMenuDimensions", - value: function getMenuDimensions() { - // Width of the menu depends of its contents and position - // We must check what its width would be without any obstruction - // This way, we can achieve good positioning for flipping the menu - var dimensions = { - width: null, - height: null - }; - this.tribute.menu.style.cssText = "top: 0px;\n left: 0px;\n position: fixed;\n display: block;\n visibility; hidden;"; - dimensions.width = this.tribute.menu.offsetWidth; - dimensions.height = this.tribute.menu.offsetHeight; - this.tribute.menu.style.cssText = "display: none;"; - return dimensions; - } - }, { - key: "getTextAreaOrInputUnderlinePosition", - value: function getTextAreaOrInputUnderlinePosition(element, position, flipped) { - var properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX', 'overflowY', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch', 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily', 'textAlign', 'textTransform', 'textIndent', 'textDecoration', 'letterSpacing', 'wordSpacing']; - var isFirefox = window.mozInnerScreenX !== null; - var div = this.getDocument().createElement('div'); - div.id = 'input-textarea-caret-position-mirror-div'; - this.getDocument().body.appendChild(div); - var style = div.style; - var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle; - style.whiteSpace = 'pre-wrap'; - - if (element.nodeName !== 'INPUT') { - style.wordWrap = 'break-word'; - } // position off-screen - - - style.position = 'absolute'; - style.visibility = 'hidden'; // transfer the element's properties to the div - - properties.forEach(function (prop) { - style[prop] = computed[prop]; - }); - - if (isFirefox) { - style.width = "".concat(parseInt(computed.width) - 2, "px"); - if (element.scrollHeight > parseInt(computed.height)) style.overflowY = 'scroll'; - } else { - style.overflow = 'hidden'; - } - - div.textContent = element.value.substring(0, position); - - if (element.nodeName === 'INPUT') { - div.textContent = div.textContent.replace(/\s/g, ' '); - } - - var span = this.getDocument().createElement('span'); - span.textContent = element.value.substring(position) || '.'; - div.appendChild(span); - var rect = element.getBoundingClientRect(); - var doc = document.documentElement; - var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0); - var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); - var top = 0; - var left = 0; - - if (this.menuContainerIsBody) { - top = rect.top; - left = rect.left; - } - - var coordinates = { - top: top + windowTop + span.offsetTop + parseInt(computed.borderTopWidth) + parseInt(computed.fontSize) - element.scrollTop, - left: left + windowLeft + span.offsetLeft + parseInt(computed.borderLeftWidth) - }; - var windowWidth = window.innerWidth; - var windowHeight = window.innerHeight; - var menuDimensions = this.getMenuDimensions(); - var menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions); - - if (menuIsOffScreen.right) { - coordinates.right = windowWidth - coordinates.left; - coordinates.left = 'auto'; - } - - var parentHeight = this.tribute.menuContainer ? this.tribute.menuContainer.offsetHeight : this.getDocument().body.offsetHeight; - - if (menuIsOffScreen.bottom) { - var parentRect = this.tribute.menuContainer ? this.tribute.menuContainer.getBoundingClientRect() : this.getDocument().body.getBoundingClientRect(); - var scrollStillAvailable = parentHeight - (windowHeight - parentRect.top); - coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top - span.offsetTop); - coordinates.top = 'auto'; - } - - menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions); - - if (menuIsOffScreen.left) { - coordinates.left = windowWidth > menuDimensions.width ? windowLeft + windowWidth - menuDimensions.width : windowLeft; - delete coordinates.right; - } - - if (menuIsOffScreen.top) { - coordinates.top = windowHeight > menuDimensions.height ? windowTop + windowHeight - menuDimensions.height : windowTop; - delete coordinates.bottom; - } - - this.getDocument().body.removeChild(div); - return coordinates; - } - }, { - key: "getContentEditableCaretPosition", - value: function getContentEditableCaretPosition(selectedNodePosition) { - var range; - var sel = this.getWindowSelection(); - range = this.getDocument().createRange(); - range.setStart(sel.anchorNode, selectedNodePosition); - range.setEnd(sel.anchorNode, selectedNodePosition); - range.collapse(false); - var rect = range.getBoundingClientRect(); - var doc = document.documentElement; - var windowLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0); - var windowTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); - var left = rect.left; - var top = rect.top; - var coordinates = { - left: left + windowLeft, - top: top + rect.height + windowTop - }; - var windowWidth = window.innerWidth; - var windowHeight = window.innerHeight; - var menuDimensions = this.getMenuDimensions(); - var menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions); - - if (menuIsOffScreen.right) { - coordinates.left = 'auto'; - coordinates.right = windowWidth - rect.left - windowLeft; - } - - var parentHeight = this.tribute.menuContainer ? this.tribute.menuContainer.offsetHeight : this.getDocument().body.offsetHeight; - - if (menuIsOffScreen.bottom) { - var parentRect = this.tribute.menuContainer ? this.tribute.menuContainer.getBoundingClientRect() : this.getDocument().body.getBoundingClientRect(); - var scrollStillAvailable = parentHeight - (windowHeight - parentRect.top); - coordinates.top = 'auto'; - coordinates.bottom = scrollStillAvailable + (windowHeight - rect.top); - } - - menuIsOffScreen = this.isMenuOffScreen(coordinates, menuDimensions); - - if (menuIsOffScreen.left) { - coordinates.left = windowWidth > menuDimensions.width ? windowLeft + windowWidth - menuDimensions.width : windowLeft; - delete coordinates.right; - } - - if (menuIsOffScreen.top) { - coordinates.top = windowHeight > menuDimensions.height ? windowTop + windowHeight - menuDimensions.height : windowTop; - delete coordinates.bottom; - } - - if (!this.menuContainerIsBody) { - coordinates.left = coordinates.left ? coordinates.left - this.tribute.menuContainer.offsetLeft : coordinates.left; - coordinates.top = coordinates.top ? coordinates.top - this.tribute.menuContainer.offsetTop : coordinates.top; - } - - return coordinates; - } - }, { - key: "scrollIntoView", - value: function scrollIntoView(elem) { - var reasonableBuffer = 20, - clientRect; - var maxScrollDisplacement = 100; - var e = this.menu; - if (typeof e === 'undefined') return; - - while (clientRect === undefined || clientRect.height === 0) { - clientRect = e.getBoundingClientRect(); - - if (clientRect.height === 0) { - e = e.childNodes[0]; - - if (e === undefined || !e.getBoundingClientRect) { - return; - } - } - } - - var elemTop = clientRect.top; - var elemBottom = elemTop + clientRect.height; - - if (elemTop < 0) { - window.scrollTo(0, window.pageYOffset + clientRect.top - reasonableBuffer); - } else if (elemBottom > window.innerHeight) { - var maxY = window.pageYOffset + clientRect.top - reasonableBuffer; - - if (maxY - window.pageYOffset > maxScrollDisplacement) { - maxY = window.pageYOffset + maxScrollDisplacement; - } - - var targetY = window.pageYOffset - (window.innerHeight - elemBottom); - - if (targetY > maxY) { - targetY = maxY; - } - - window.scrollTo(0, targetY); - } - } - }, { - key: "menuContainerIsBody", - get: function get() { - return this.tribute.menuContainer === document.body || !this.tribute.menuContainer; - } - }]); - - return TributeRange; - }(); - - // Thanks to https://github.com/mattyork/fuzzy - var TributeSearch = /*#__PURE__*/function () { - function TributeSearch(tribute) { - _classCallCheck(this, TributeSearch); - - this.tribute = tribute; - this.tribute.search = this; - } - - _createClass(TributeSearch, [{ - key: "simpleFilter", - value: function simpleFilter(pattern, array) { - var _this = this; - - return array.filter(function (string) { - return _this.test(pattern, string); - }); - } - }, { - key: "test", - value: function test(pattern, string) { - return this.match(pattern, string) !== null; - } - }, { - key: "match", - value: function match(pattern, string, opts) { - opts = opts || {}; - var len = string.length, - pre = opts.pre || '', - post = opts.post || '', - compareString = opts.caseSensitive && string || string.toLowerCase(); - - if (opts.skip) { - return { - rendered: string, - score: 0 - }; - } - - pattern = opts.caseSensitive && pattern || pattern.toLowerCase(); - var patternCache = this.traverse(compareString, pattern, 0, 0, []); - - if (!patternCache) { - return null; - } - - return { - rendered: this.render(string, patternCache.cache, pre, post), - score: patternCache.score - }; - } - }, { - key: "traverse", - value: function traverse(string, pattern, stringIndex, patternIndex, patternCache) { - // if the pattern search at end - if (pattern.length === patternIndex) { - // calculate score and copy the cache containing the indices where it's found - return { - score: this.calculateScore(patternCache), - cache: patternCache.slice() - }; - } // if string at end or remaining pattern > remaining string - - - if (string.length === stringIndex || pattern.length - patternIndex > string.length - stringIndex) { - return undefined; - } - - var c = pattern[patternIndex]; - var index = string.indexOf(c, stringIndex); - var best, temp; - - while (index > -1) { - patternCache.push(index); - temp = this.traverse(string, pattern, index + 1, patternIndex + 1, patternCache); - patternCache.pop(); // if downstream traversal failed, return best answer so far - - if (!temp) { - return best; - } - - if (!best || best.score < temp.score) { - best = temp; - } - - index = string.indexOf(c, index + 1); - } - - return best; - } - }, { - key: "calculateScore", - value: function calculateScore(patternCache) { - var score = 0; - var temp = 1; - patternCache.forEach(function (index, i) { - if (i > 0) { - if (patternCache[i - 1] + 1 === index) { - temp += temp + 1; - } else { - temp = 1; - } - } - - score += temp; - }); - return score; - } - }, { - key: "render", - value: function render(string, indices, pre, post) { - var rendered = string.substring(0, indices[0]); - indices.forEach(function (index, i) { - rendered += pre + string[index] + post + string.substring(index + 1, indices[i + 1] ? indices[i + 1] : string.length); - }); - return rendered; - } - }, { - key: "filter", - value: function filter(pattern, arr, opts) { - var _this2 = this; - - opts = opts || {}; - return arr.reduce(function (prev, element, idx, arr) { - var str = element; - - if (opts.extract) { - str = opts.extract(element); - - if (!str) { - // take care of undefineds / nulls / etc. - str = ''; - } - } - - var rendered = _this2.match(pattern, str, opts); - - if (rendered != null) { - prev[prev.length] = { - string: rendered.rendered, - score: rendered.score, - index: idx, - original: element - }; - } - - return prev; - }, []).sort(function (a, b) { - var compare = b.score - a.score; - if (compare) return compare; - return a.index - b.index; - }); - } - }]); - - return TributeSearch; - }(); - - var Tribute = /*#__PURE__*/function () { - function Tribute(_ref) { - var _this = this; - - var _ref$values = _ref.values, - values = _ref$values === void 0 ? null : _ref$values, - _ref$iframe = _ref.iframe, - iframe = _ref$iframe === void 0 ? null : _ref$iframe, - _ref$selectClass = _ref.selectClass, - selectClass = _ref$selectClass === void 0 ? "highlight" : _ref$selectClass, - _ref$containerClass = _ref.containerClass, - containerClass = _ref$containerClass === void 0 ? "tribute-container" : _ref$containerClass, - _ref$itemClass = _ref.itemClass, - itemClass = _ref$itemClass === void 0 ? "" : _ref$itemClass, - _ref$trigger = _ref.trigger, - trigger = _ref$trigger === void 0 ? "@" : _ref$trigger, - _ref$autocompleteMode = _ref.autocompleteMode, - autocompleteMode = _ref$autocompleteMode === void 0 ? false : _ref$autocompleteMode, - _ref$selectTemplate = _ref.selectTemplate, - selectTemplate = _ref$selectTemplate === void 0 ? null : _ref$selectTemplate, - _ref$menuItemTemplate = _ref.menuItemTemplate, - menuItemTemplate = _ref$menuItemTemplate === void 0 ? null : _ref$menuItemTemplate, - _ref$lookup = _ref.lookup, - lookup = _ref$lookup === void 0 ? "key" : _ref$lookup, - _ref$fillAttr = _ref.fillAttr, - fillAttr = _ref$fillAttr === void 0 ? "value" : _ref$fillAttr, - _ref$collection = _ref.collection, - collection = _ref$collection === void 0 ? null : _ref$collection, - _ref$menuContainer = _ref.menuContainer, - menuContainer = _ref$menuContainer === void 0 ? null : _ref$menuContainer, - _ref$noMatchTemplate = _ref.noMatchTemplate, - noMatchTemplate = _ref$noMatchTemplate === void 0 ? null : _ref$noMatchTemplate, - _ref$requireLeadingSp = _ref.requireLeadingSpace, - requireLeadingSpace = _ref$requireLeadingSp === void 0 ? true : _ref$requireLeadingSp, - _ref$allowSpaces = _ref.allowSpaces, - allowSpaces = _ref$allowSpaces === void 0 ? false : _ref$allowSpaces, - _ref$replaceTextSuffi = _ref.replaceTextSuffix, - replaceTextSuffix = _ref$replaceTextSuffi === void 0 ? null : _ref$replaceTextSuffi, - _ref$positionMenu = _ref.positionMenu, - positionMenu = _ref$positionMenu === void 0 ? true : _ref$positionMenu, - _ref$spaceSelectsMatc = _ref.spaceSelectsMatch, - spaceSelectsMatch = _ref$spaceSelectsMatc === void 0 ? false : _ref$spaceSelectsMatc, - _ref$searchOpts = _ref.searchOpts, - searchOpts = _ref$searchOpts === void 0 ? {} : _ref$searchOpts, - _ref$menuItemLimit = _ref.menuItemLimit, - menuItemLimit = _ref$menuItemLimit === void 0 ? null : _ref$menuItemLimit, - _ref$menuShowMinLengt = _ref.menuShowMinLength, - menuShowMinLength = _ref$menuShowMinLengt === void 0 ? 0 : _ref$menuShowMinLengt; - - _classCallCheck(this, Tribute); - - this.autocompleteMode = autocompleteMode; - this.menuSelected = 0; - this.current = {}; - this.inputEvent = false; - this.isActive = false; - this.menuContainer = menuContainer; - this.allowSpaces = allowSpaces; - this.replaceTextSuffix = replaceTextSuffix; - this.positionMenu = positionMenu; - this.hasTrailingSpace = false; - this.spaceSelectsMatch = spaceSelectsMatch; - - if (this.autocompleteMode) { - trigger = ""; - allowSpaces = false; - } - - if (values) { - this.collection = [{ - // symbol that starts the lookup - trigger: trigger, - // is it wrapped in an iframe - iframe: iframe, - // class applied to selected item - selectClass: selectClass, - // class applied to the Container - containerClass: containerClass, - // class applied to each item - itemClass: itemClass, - // function called on select that retuns the content to insert - selectTemplate: (selectTemplate || Tribute.defaultSelectTemplate).bind(this), - // function called that returns content for an item - menuItemTemplate: (menuItemTemplate || Tribute.defaultMenuItemTemplate).bind(this), - // function called when menu is empty, disables hiding of menu. - noMatchTemplate: function (t) { - if (typeof t === "string") { - if (t.trim() === "") return null; - return t; - } - - if (typeof t === "function") { - return t.bind(_this); - } - - return noMatchTemplate || function () { - return "
  • No Match Found!
  • "; - }.bind(_this); - }(noMatchTemplate), - // column to search against in the object - lookup: lookup, - // column that contains the content to insert by default - fillAttr: fillAttr, - // array of objects or a function returning an array of objects - values: values, - requireLeadingSpace: requireLeadingSpace, - searchOpts: searchOpts, - menuItemLimit: menuItemLimit, - menuShowMinLength: menuShowMinLength - }]; - } else if (collection) { - if (this.autocompleteMode) console.warn("Tribute in autocomplete mode does not work for collections"); - this.collection = collection.map(function (item) { - return { - trigger: item.trigger || trigger, - iframe: item.iframe || iframe, - selectClass: item.selectClass || selectClass, - containerClass: item.containerClass || containerClass, - itemClass: item.itemClass || itemClass, - selectTemplate: (item.selectTemplate || Tribute.defaultSelectTemplate).bind(_this), - menuItemTemplate: (item.menuItemTemplate || Tribute.defaultMenuItemTemplate).bind(_this), - // function called when menu is empty, disables hiding of menu. - noMatchTemplate: function (t) { - if (typeof t === "string") { - if (t.trim() === "") return null; - return t; - } - - if (typeof t === "function") { - return t.bind(_this); - } - - return noMatchTemplate || function () { - return "
  • No Match Found!
  • "; - }.bind(_this); - }(noMatchTemplate), - lookup: item.lookup || lookup, - fillAttr: item.fillAttr || fillAttr, - values: item.values, - requireLeadingSpace: item.requireLeadingSpace, - searchOpts: item.searchOpts || searchOpts, - menuItemLimit: item.menuItemLimit || menuItemLimit, - menuShowMinLength: item.menuShowMinLength || menuShowMinLength - }; - }); - } else { - throw new Error("[Tribute] No collection specified."); - } - - new TributeRange(this); - new TributeEvents(this); - new TributeMenuEvents(this); - new TributeSearch(this); - } - - _createClass(Tribute, [{ - key: "triggers", - value: function triggers() { - return this.collection.map(function (config) { - return config.trigger; - }); - } - }, { - key: "attach", - value: function attach(el) { - if (!el) { - throw new Error("[Tribute] Must pass in a DOM node or NodeList."); - } // Check if it is a jQuery collection - - - if (typeof jQuery !== "undefined" && el instanceof jQuery) { - el = el.get(); - } // Is el an Array/Array-like object? - - - if (el.constructor === NodeList || el.constructor === HTMLCollection || el.constructor === Array) { - var length = el.length; - - for (var i = 0; i < length; ++i) { - this._attach(el[i]); - } - } else { - this._attach(el); - } - } - }, { - key: "_attach", - value: function _attach(el) { - if (el.hasAttribute("data-tribute")) { - console.warn("Tribute was already bound to " + el.nodeName); - } - - this.ensureEditable(el); - this.events.bind(el); - el.setAttribute("data-tribute", true); - } - }, { - key: "ensureEditable", - value: function ensureEditable(element) { - if (Tribute.inputTypes().indexOf(element.nodeName) === -1) { - if (element.contentEditable) { - element.contentEditable = true; - } else { - throw new Error("[Tribute] Cannot bind to " + element.nodeName); - } - } - } - }, { - key: "createMenu", - value: function createMenu(containerClass) { - var wrapper = this.range.getDocument().createElement("div"), - ul = this.range.getDocument().createElement("ul"); - wrapper.className = containerClass; - wrapper.appendChild(ul); - - if (this.menuContainer) { - return this.menuContainer.appendChild(wrapper); - } - - return this.range.getDocument().body.appendChild(wrapper); - } - }, { - key: "showMenuFor", - value: function showMenuFor(element, scrollTo) { - var _this2 = this; - - // Only proceed if menu isn't already shown for the current element & mentionText - if (this.isActive && this.current.element === element && this.current.mentionText === this.currentMentionTextSnapshot) { - return; - } - - this.currentMentionTextSnapshot = this.current.mentionText; // create the menu if it doesn't exist. - - if (!this.menu) { - this.menu = this.createMenu(this.current.collection.containerClass); - element.tributeMenu = this.menu; - this.menuEvents.bind(this.menu); - } - - this.isActive = true; - this.menuSelected = 0; - - if (!this.current.mentionText) { - this.current.mentionText = ""; - } - - var processValues = function processValues(values) { - // Tribute may not be active any more by the time the value callback returns - if (!_this2.isActive) { - return; - } - - var items = _this2.search.filter(_this2.current.mentionText, values, { - pre: _this2.current.collection.searchOpts.pre || "", - post: _this2.current.collection.searchOpts.post || "", - skip: _this2.current.collection.searchOpts.skip, - extract: function extract(el) { - if (typeof _this2.current.collection.lookup === "string") { - return el[_this2.current.collection.lookup]; - } else if (typeof _this2.current.collection.lookup === "function") { - return _this2.current.collection.lookup(el, _this2.current.mentionText); - } else { - throw new Error("Invalid lookup attribute, lookup must be string or function."); - } - } - }); - - if (_this2.current.collection.menuItemLimit) { - items = items.slice(0, _this2.current.collection.menuItemLimit); - } - - _this2.current.filteredItems = items; - - var ul = _this2.menu.querySelector("ul"); - - _this2.range.positionMenuAtCaret(scrollTo); - - if (!items.length) { - var noMatchEvent = new CustomEvent("tribute-no-match", { - detail: _this2.menu - }); - - _this2.current.element.dispatchEvent(noMatchEvent); - - if (typeof _this2.current.collection.noMatchTemplate === "function" && !_this2.current.collection.noMatchTemplate() || !_this2.current.collection.noMatchTemplate) { - _this2.hideMenu(); - } else { - typeof _this2.current.collection.noMatchTemplate === "function" ? ul.innerHTML = _this2.current.collection.noMatchTemplate() : ul.innerHTML = _this2.current.collection.noMatchTemplate; - } - - return; - } - - ul.innerHTML = ""; - - var fragment = _this2.range.getDocument().createDocumentFragment(); - - items.forEach(function (item, index) { - var li = _this2.range.getDocument().createElement("li"); - - li.setAttribute("data-index", index); - li.className = _this2.current.collection.itemClass; - li.addEventListener("mousemove", function (e) { - var _this2$_findLiTarget = _this2._findLiTarget(e.target), - _this2$_findLiTarget2 = _slicedToArray(_this2$_findLiTarget, 2), - li = _this2$_findLiTarget2[0], - index = _this2$_findLiTarget2[1]; - - if (e.movementY !== 0) { - _this2.events.setActiveLi(index); - } - }); - - if (_this2.menuSelected === index) { - li.classList.add(_this2.current.collection.selectClass); - } - - li.innerHTML = _this2.current.collection.menuItemTemplate(item); - fragment.appendChild(li); - }); - ul.appendChild(fragment); - }; - - if (typeof this.current.collection.values === "function") { - this.current.collection.values(this.current.mentionText, processValues); - } else { - processValues(this.current.collection.values); - } - } - }, { - key: "_findLiTarget", - value: function _findLiTarget(el) { - if (!el) return []; - var index = el.getAttribute("data-index"); - return !index ? this._findLiTarget(el.parentNode) : [el, index]; - } - }, { - key: "showMenuForCollection", - value: function showMenuForCollection(element, collectionIndex) { - if (element !== document.activeElement) { - this.placeCaretAtEnd(element); - } - - this.current.collection = this.collection[collectionIndex || 0]; - this.current.externalTrigger = true; - this.current.element = element; - if (element.isContentEditable) this.insertTextAtCursor(this.current.collection.trigger);else this.insertAtCaret(element, this.current.collection.trigger); - this.showMenuFor(element); - } // TODO: make sure this works for inputs/textareas - - }, { - key: "placeCaretAtEnd", - value: function placeCaretAtEnd(el) { - el.focus(); - - if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") { - var range = document.createRange(); - range.selectNodeContents(el); - range.collapse(false); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } else if (typeof document.body.createTextRange != "undefined") { - var textRange = document.body.createTextRange(); - textRange.moveToElementText(el); - textRange.collapse(false); - textRange.select(); - } - } // for contenteditable - - }, { - key: "insertTextAtCursor", - value: function insertTextAtCursor(text) { - var sel, range; - sel = window.getSelection(); - range = sel.getRangeAt(0); - range.deleteContents(); - var textNode = document.createTextNode(text); - range.insertNode(textNode); - range.selectNodeContents(textNode); - range.collapse(false); - sel.removeAllRanges(); - sel.addRange(range); - } // for regular inputs - - }, { - key: "insertAtCaret", - value: function insertAtCaret(textarea, text) { - var scrollPos = textarea.scrollTop; - var caretPos = textarea.selectionStart; - var front = textarea.value.substring(0, caretPos); - var back = textarea.value.substring(textarea.selectionEnd, textarea.value.length); - textarea.value = front + text + back; - caretPos = caretPos + text.length; - textarea.selectionStart = caretPos; - textarea.selectionEnd = caretPos; - textarea.focus(); - textarea.scrollTop = scrollPos; - } - }, { - key: "hideMenu", - value: function hideMenu() { - if (this.menu) { - this.menu.style.cssText = "display: none;"; - this.isActive = false; - this.menuSelected = 0; - this.current = {}; - } - } - }, { - key: "selectItemAtIndex", - value: function selectItemAtIndex(index, originalEvent) { - index = parseInt(index); - if (typeof index !== "number" || isNaN(index)) return; - var item = this.current.filteredItems[index]; - var content = this.current.collection.selectTemplate(item); - if (content !== null) this.replaceText(content, originalEvent, item); - } - }, { - key: "replaceText", - value: function replaceText(content, originalEvent, item) { - this.range.replaceTriggerText(content, true, true, originalEvent, item); - } - }, { - key: "_append", - value: function _append(collection, newValues, replace) { - if (typeof collection.values === "function") { - throw new Error("Unable to append to values, as it is a function."); - } else if (!replace) { - collection.values = collection.values.concat(newValues); - } else { - collection.values = newValues; - } - } - }, { - key: "append", - value: function append(collectionIndex, newValues, replace) { - var index = parseInt(collectionIndex); - if (typeof index !== "number") throw new Error("please provide an index for the collection to update."); - var collection = this.collection[index]; - - this._append(collection, newValues, replace); - } - }, { - key: "appendCurrent", - value: function appendCurrent(newValues, replace) { - if (this.isActive) { - this._append(this.current.collection, newValues, replace); - } else { - throw new Error("No active state. Please use append instead and pass an index."); - } - } - }, { - key: "detach", - value: function detach(el) { - if (!el) { - throw new Error("[Tribute] Must pass in a DOM node or NodeList."); - } // Check if it is a jQuery collection - - - if (typeof jQuery !== "undefined" && el instanceof jQuery) { - el = el.get(); - } // Is el an Array/Array-like object? - - - if (el.constructor === NodeList || el.constructor === HTMLCollection || el.constructor === Array) { - var length = el.length; - - for (var i = 0; i < length; ++i) { - this._detach(el[i]); - } - } else { - this._detach(el); - } - } - }, { - key: "_detach", - value: function _detach(el) { - var _this3 = this; - - this.events.unbind(el); - - if (el.tributeMenu) { - this.menuEvents.unbind(el.tributeMenu); - } - - setTimeout(function () { - el.removeAttribute("data-tribute"); - _this3.isActive = false; - - if (el.tributeMenu) { - el.tributeMenu.remove(); - } - }); - } - }, { - key: "isActive", - get: function get() { - return this._isActive; - }, - set: function set(val) { - if (this._isActive != val) { - this._isActive = val; - - if (this.current.element) { - var noMatchEvent = new CustomEvent("tribute-active-".concat(val)); - this.current.element.dispatchEvent(noMatchEvent); - } - } - } - }], [{ - key: "defaultSelectTemplate", - value: function defaultSelectTemplate(item) { - if (typeof item === "undefined") return "".concat(this.current.collection.trigger).concat(this.current.mentionText); - - if (this.range.isContentEditable(this.current.element)) { - return '' + (this.current.collection.trigger + item.original[this.current.collection.fillAttr]) + ""; - } - - return this.current.collection.trigger + item.original[this.current.collection.fillAttr]; - } - }, { - key: "defaultMenuItemTemplate", - value: function defaultMenuItemTemplate(matchItem) { - return matchItem.string; - } - }, { - key: "inputTypes", - value: function inputTypes() { - return ["TEXTAREA", "INPUT"]; - } - }]); - - return Tribute; - }(); - - /** - * Tribute.js - * Native ES6 JavaScript @mention Plugin - **/ - - return Tribute; - -}))); diff --git a/weblate/static/vendor/tribute.js.license b/weblate/static/vendor/tribute.js.license deleted file mode 100644 index 61a4d2700e1c..000000000000 --- a/weblate/static/vendor/tribute.js.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: Jordan Humphreys - -SPDX-License-Identifier: MIT diff --git a/weblate/templates/addons/addon_logs.html b/weblate/templates/addons/addon_logs.html index 824eb352a853..3c552b2e3167 100644 --- a/weblate/templates/addons/addon_logs.html +++ b/weblate/templates/addons/addon_logs.html @@ -51,7 +51,7 @@

    {% trans "Add-on Activity Logs" %}

    {{ log.get_event_display }} {{ log.details.result }} - {{ log.created|date:"Y-m-d H:i" }} + {{ log.created|naturaltime }} {% empty %} diff --git a/weblate/templates/base.html b/weblate/templates/base.html index d465117bc7ff..40bd48f6ad3e 100644 --- a/weblate/templates/base.html +++ b/weblate/templates/base.html @@ -65,7 +65,7 @@ - + diff --git a/weblate/trans/forms.py b/weblate/trans/forms.py index d3e00b2bbe40..2f9541be1e07 100644 --- a/weblate/trans/forms.py +++ b/weblate/trans/forms.py @@ -1850,6 +1850,13 @@ class ComponentDocCreateForm(ComponentProjectForm): validators=[validate_file_extension], ) + target_language = forms.ModelChoiceField( + widget=SortedSelect, + label=gettext_lazy("Target language"), + help_text=gettext_lazy("Target language of the document for bilingual files"), + queryset=Language.objects.all(), + required=False, + ) field_order = ["docfile", "project", "name", "slug"] def __init__(self, *args, **kwargs) -> None: diff --git a/weblate/trans/models/change.py b/weblate/trans/models/change.py index 7b9d44796ac7..4125dd5dd92d 100644 --- a/weblate/trans/models/change.py +++ b/weblate/trans/models/change.py @@ -820,11 +820,15 @@ def get_details_display(self): # noqa: C901 from weblate.utils.markdown import render_markdown details = self.details + action = self.action - if self.action in {self.ACTION_ANNOUNCEMENT, self.ACTION_AGREEMENT_CHANGE}: + if action in {self.ACTION_ANNOUNCEMENT, self.ACTION_AGREEMENT_CHANGE}: return render_markdown(self.target) - if self.action in { + if action == self.ACTION_COMMENT_DELETE and "comment" in details: + return render_markdown(details["comment"]) + + if action in { self.ACTION_ADDON_CREATE, self.ACTION_ADDON_CHANGE, self.ACTION_ADDON_REMOVE, @@ -834,10 +838,10 @@ def get_details_display(self): # noqa: C901 except KeyError: return self.target - if self.action in self.AUTO_ACTIONS and self.auto_status: - return str(self.AUTO_ACTIONS[self.action]) + if action in self.AUTO_ACTIONS and self.auto_status: + return str(self.AUTO_ACTIONS[action]) - if self.action == self.ACTION_UPDATE: + if action == self.ACTION_UPDATE: reason = details.get("reason", "content changed") filename = format_html( "{}", @@ -856,7 +860,7 @@ def get_details_display(self): # noqa: C901 raise ValueError(f"Unknown reason: {reason}") return format_html(escape(message), filename) - if self.action == self.ACTION_LICENSE_CHANGE: + if action == self.ACTION_LICENSE_CHANGE: not_available = pgettext("License information not available", "N/A") return gettext( 'The license of the "%(component)s" component was changed ' @@ -875,12 +879,12 @@ def get_details_display(self): # noqa: C901 self.ACTION_INVITE_USER, self.ACTION_REMOVE_USER, } - if self.action == self.ACTION_ACCESS_EDIT: + if action == self.ACTION_ACCESS_EDIT: for number, name in Project.ACCESS_CHOICES: if number == details["access_control"]: return name return "Unknown {}".format(details["access_control"]) - if self.action in user_actions: + if action in user_actions: if "username" in details: result = details["username"] else: @@ -888,7 +892,7 @@ def get_details_display(self): # noqa: C901 if "group" in details: result = f"{result} ({details['group']})" return result - if self.action in { + if action in { self.ACTION_ADDED_LANGUAGE, self.ACTION_REQUESTED_LANGUAGE, }: @@ -896,18 +900,18 @@ def get_details_display(self): # noqa: C901 return Language.objects.get(code=details["language"]) except Language.DoesNotExist: return details["language"] - if self.action == self.ACTION_ALERT: + if action == self.ACTION_ALERT: try: return ALERTS[details["alert"]].verbose except KeyError: return details["alert"] - if self.action == self.ACTION_PARSE_ERROR: + if action == self.ACTION_PARSE_ERROR: return "{filename}: {error_message}".format(**details) - if self.action == self.ACTION_HOOK: + if action == self.ACTION_HOOK: return "{service_long_name}: {repo_url}, {branch}".format(**details) - if self.action == self.ACTION_COMMENT and "comment" in details: + if action == self.ACTION_COMMENT and "comment" in details: return render_markdown(details["comment"]) - if self.action in {self.ACTION_RESET, self.ACTION_MERGE, self.ACTION_REBASE}: + if action in {self.ACTION_RESET, self.ACTION_MERGE, self.ACTION_REBASE}: return format_html( "{}

    {}
    {}", self.get_action_display(), diff --git a/weblate/trans/models/component.py b/weblate/trans/models/component.py index cf009444f018..dfc4c08efabf 100644 --- a/weblate/trans/models/component.py +++ b/weblate/trans/models/component.py @@ -106,10 +106,12 @@ from weblate.vcs.ssh import add_host_key if TYPE_CHECKING: + from collections.abc import Iterable from datetime import datetime from weblate.addons.models import Addon from weblate.auth.models import AuthenticatedHttpRequest, User + from weblate.checks.base import BaseCheck from weblate.trans.models import Unit NEW_LANG_CHOICES = ( @@ -3483,13 +3485,16 @@ def all_flags(self): def is_multivalue(self): return self.file_format_cls.has_multiple_strings - def can_add_new_language(self, user: User, fast: bool = False): + def can_add_new_language(self, user: User | None, fast: bool = False): """ Check if a new language can be added. Generic users can add only if configured, in other situations it works if there is valid new base. """ + # Consistency and possibly other add-ons + if user is not None and user.is_bot and user.username.startswith("addon:"): + user = None # The user is None in case of consistency or cli invocation # The component.edit permission is intentional here as it allows overriding # of new_lang configuration for admins and add languages even if adding @@ -3747,7 +3752,7 @@ def _schedule_sync_terminology(self) -> None: for glossary in self.project.glossaries: sync_glossary_languages.delay(glossary.pk) - def get_unused_enforcements(self): + def get_unused_enforcements(self) -> Iterable[dict | BaseCheck]: from weblate.trans.models import Unit for current in self.enforced_checks: @@ -3755,6 +3760,7 @@ def get_unused_enforcements(self): check = CHECKS[current] except KeyError: yield {"name": current, "notsupported": True} + continue # Check is always enabled if not check.default_disabled: continue diff --git a/weblate/trans/models/suggestion.py b/weblate/trans/models/suggestion.py index 1151a1462fc9..7812c505056e 100644 --- a/weblate/trans/models/suggestion.py +++ b/weblate/trans/models/suggestion.py @@ -224,7 +224,6 @@ def get_checks(self): fake_unit = copy(self.unit) fake_unit.target = self.target fake_unit.state = STATE_TRANSLATED - fake_unit.id = -self.pk source = fake_unit.get_source_plurals() target = fake_unit.get_target_plurals() diff --git a/weblate/trans/models/translation.py b/weblate/trans/models/translation.py index 6896a2e77d36..61dda519686e 100644 --- a/weblate/trans/models/translation.py +++ b/weblate/trans/models/translation.py @@ -1213,6 +1213,7 @@ def handle_add_upload( split_plural(unit.source), split_plural(unit.target) if not self.is_source else [], is_batch_update=True, + state=STATE_READONLY if unit.is_readonly() else None, ) existing.add(idkey) accepted += 1 @@ -1360,7 +1361,9 @@ def get_export_url(self): return self.component.get_export_url() def remove(self, user: User) -> None: - """Remove translation from the VCS.""" + """Remove translation from the Database and VCS.""" + from weblate.glossary.tasks import cleanup_stale_glossaries + author = user.get_author_name() # Log self.log_info("removing %s as %s", self.filenames, author) @@ -1389,6 +1392,8 @@ def remove(self, user: User) -> None: user=user, author=user, ) + if not self.component.is_glossary: + cleanup_stale_glossaries.delay(self.component.project.id) def handle_store_change( self, diff --git a/weblate/trans/tests/data/strings-with-readonly.xml b/weblate/trans/tests/data/strings-with-readonly.xml new file mode 100644 index 000000000000..c61b776e8a61 --- /dev/null +++ b/weblate/trans/tests/data/strings-with-readonly.xml @@ -0,0 +1,6 @@ + + + String One + String Two + String Three + diff --git a/weblate/trans/tests/test_create.py b/weblate/trans/tests/test_create.py index 5504425ea412..b63f7fb71053 100644 --- a/weblate/trans/tests/test_create.py +++ b/weblate/trans/tests/test_create.py @@ -8,13 +8,14 @@ from django.test.utils import modify_settings, override_settings from django.urls import reverse -from weblate.lang.models import get_default_lang +from weblate.lang.models import Language, get_default_lang from weblate.trans.tests.test_views import ViewTestCase from weblate.trans.tests.utils import create_test_billing, get_test_file from weblate.vcs.git import GitRepository TEST_ZIP = get_test_file("translations.zip") TEST_HTML = get_test_file("cs.html") +TEST_PO = get_test_file("cs.po") class CreateTest(ViewTestCase): @@ -370,6 +371,26 @@ def test_create_doc_category(self) -> None: self.assertContains(response, "Adding new translation") self.assertContains(response, "*.html") + @modify_settings(INSTALLED_APPS={"remove": "weblate.billing"}) + def test_create_doc_bilingual(self) -> None: + self.user.is_superuser = True + self.user.save() + + with open(TEST_PO) as handle, override_settings(CREATE_GLOSSARIES=False): + response = self.client.post( + reverse("create-component-doc"), + { + "docfile": handle, + "name": "Bilingual Component From Doc", + "slug": "bilingual-component-from-doc", + "project": self.project.pk, + "source_language": get_default_lang(), + "target_language": Language.objects.get(code="cs").id, + }, + ) + self.assertContains(response, "Choose translation files to import") + self.assertNotContains(response, "gettext PO file (monolingual)") + @modify_settings(INSTALLED_APPS={"remove": "weblate.billing"}) def test_create_scratch(self) -> None: @override_settings(CREATE_GLOSSARIES=self.CREATE_GLOSSARIES) diff --git a/weblate/trans/tests/test_files.py b/weblate/trans/tests/test_files.py index fe4cee9d9cb2..7f73cf6ec027 100644 --- a/weblate/trans/tests/test_files.py +++ b/weblate/trans/tests/test_files.py @@ -16,6 +16,7 @@ from weblate.trans.models import Change, ComponentList from weblate.trans.tests.test_views import ViewTestCase from weblate.trans.tests.utils import get_test_file +from weblate.utils.state import STATE_READONLY TEST_PO = get_test_file("cs.po") TEST_CSV = get_test_file("cs.csv") @@ -29,6 +30,7 @@ TEST_MO = get_test_file("cs.mo") TEST_XLIFF = get_test_file("cs.poxliff") TEST_ANDROID = get_test_file("strings-cs.xml") +TEST_ANDROID_READONLY = get_test_file("strings-with-readonly.xml") TEST_XLSX = get_test_file("cs.xlsx") TEST_TBX = get_test_file("terms.tbx") @@ -380,6 +382,43 @@ def test_replace(self) -> None: translation.change_set.filter(action=Change.ACTION_REPLACE_UPLOAD).exists() ) + def test_readonly_upload_download(self) -> None: + """Test upload and download with a file containing a non-translatable string.""" + project = self.component.project + component = self.create_android(name="Component", project=project) + self.user.is_superuser = True + self.user.save() + with open(TEST_ANDROID_READONLY, "rb") as handle: + response = self.client.post( + reverse( + "upload", + kwargs={"path": component.source_translation.get_url_path()}, + ), + { + "file": handle, + "method": "replace", + "author_name": self.user.full_name, + "author_email": self.user.email, + }, + follow=True, + ) + messages = list(response.context["messages"]) + self.assertIn("updated: 3", messages[0].message) + unit = component.source_translation.unit_set.get(context="string_two") + self.assertEqual(unit.state, STATE_READONLY) + + response = self.client.get( + reverse( + "download", + kwargs={"path": component.source_translation.get_url_path()}, + ), + follow=True, + ) + self.assertIn( + 'name="string_two" translatable="false"', + response.getvalue().decode("utf-8"), + ) + class CSVImportTest(ViewTestCase): test_file = TEST_CSV diff --git a/weblate/trans/views/create.py b/weblate/trans/views/create.py index a28b39e2680f..9510a624baf3 100644 --- a/weblate/trans/views/create.py +++ b/weblate/trans/views/create.py @@ -415,9 +415,10 @@ def form_valid(self, form): return super().form_valid(form) fake = create_component_from_doc( - form.cleaned_data, form.cleaned_data.pop("docfile") + form.cleaned_data, + form.cleaned_data.pop("docfile"), + form.cleaned_data.pop("target_language", None), ) - # Move to discover phase self.stage = "discover" self.initial = form.cleaned_data diff --git a/weblate/utils/apps.py b/weblate/utils/apps.py index 019eadcc5225..fb37fe7996e8 100644 --- a/weblate/utils/apps.py +++ b/weblate/utils/apps.py @@ -17,6 +17,7 @@ from django.conf import settings from django.core.cache import cache from django.core.checks import CheckMessage, Error, Info, register +from django.core.exceptions import ImproperlyConfigured from django.core.mail import get_connection from django.db import DatabaseError from django.db.models import CharField, TextField @@ -27,6 +28,7 @@ from .celery import is_celery_queue_long from .checks import weblate_check +from .classloader import ClassLoader from .data import data_dir from .db import ( MySQLSearchLookup, @@ -283,6 +285,22 @@ def check_settings( return errors +@register(deploy=True) +def check_class_loader( + *, + app_configs: Sequence[AppConfig] | None, + databases: Sequence[str] | None, + **kwargs, +) -> Iterable[CheckMessage]: + errors: list[CheckMessage] = [] + for instance in ClassLoader.instances.values(): + try: + instance.load_data() + except ImproperlyConfigured as error: + errors.append(weblate_check("weblate.E028", str(error))) + return errors + + @register def check_data_writable( *, diff --git a/weblate/utils/checks.py b/weblate/utils/checks.py index c7505357a77e..7a85d0b452b5 100644 --- a/weblate/utils/checks.py +++ b/weblate/utils/checks.py @@ -55,6 +55,7 @@ "weblate.W025": ("admin/install", "optional-deps"), "weblate.E026": ("admin/install", "celery"), "weblate.E027": ("admin/install", "file-permissions"), + "weblate.E028": ("admin/config",), "weblate.I028": ("admin/backup",), "weblate.C029": ("admin/backup",), "weblate.C030": ("admin/install", "celery"), diff --git a/weblate/utils/classloader.py b/weblate/utils/classloader.py index ebe029abaecc..7332e27088bd 100644 --- a/weblate/utils/classloader.py +++ b/weblate/utils/classloader.py @@ -2,7 +2,10 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +from __future__ import annotations + from importlib import import_module +from weakref import WeakValueDictionary from django.conf import settings from django.core.exceptions import ImproperlyConfigured @@ -34,6 +37,8 @@ def load_class(name, setting): class ClassLoader: """Dict like object to lazy load list of classes.""" + instances: WeakValueDictionary[str, ClassLoader] = WeakValueDictionary() + def __init__( self, name: str, @@ -47,6 +52,9 @@ def __init__( self.collect_errors = collect_errors self.errors: dict[str, str | Exception] = {} self.base_class: type = base_class + obj = self.instances.get(name) + if obj is None: + self.instances[name] = self def get_settings(self): result = getattr(settings, self.name) diff --git a/weblate/utils/tests/test_checks.py b/weblate/utils/tests/test_checks.py index 0562db986c29..01688ce5e447 100644 --- a/weblate/utils/tests/test_checks.py +++ b/weblate/utils/tests/test_checks.py @@ -7,8 +7,12 @@ from django.core.cache import cache from django.test import SimpleTestCase +from django.test.utils import override_settings +from weblate.addons.base import BaseAddon +from weblate.utils.apps import check_class_loader from weblate.utils.celery import is_celery_queue_long +from weblate.utils.classloader import ClassLoader class CeleryQueueTest(SimpleTestCase): @@ -56,3 +60,24 @@ def test_translate(self) -> None: self.assertFalse(is_celery_queue_long()) self.set_cache({int(time.time() / 3600) - 1: {"translate": 2000}}) self.assertTrue(is_celery_queue_long()) + + +class ClassLoaderCheckTestCase(SimpleTestCase): + @override_settings(TEST_ADDONS=("weblate.addons.cleanup.CleanupAddon",)) + def test_load(self) -> None: + loader = ClassLoader("TEST_ADDONS", construct=False, base_class=BaseAddon) + loader.load_data() + self.assertEqual(len(list(loader.keys())), 1) + + @override_settings(TEST_ADDONS=("weblate.addons.cleanup.CleanupAddon")) + def test_invalid(self) -> None: + loader = ClassLoader("TEST_ADDONS", construct=False, base_class=BaseAddon) # noqa: F841 + errors = check_class_loader(app_configs=None, databases=None) + self.assertEqual(len(errors), 1) + + @override_settings(TEST_ADDONS=("weblate.addons.not_found",)) + def test_not_found(self) -> None: + loader = ClassLoader("TEST_ADDONS", construct=False, base_class=BaseAddon) # noqa: F841 + errors = check_class_loader(app_configs=None, databases=None) + self.assertEqual(len(errors), 1) + self.assertIn("does not define a 'not_found' class", errors[0].msg) diff --git a/weblate/utils/tests/test_classloader.py b/weblate/utils/tests/test_classloader.py index 3ce2989b98a0..2006579da68f 100644 --- a/weblate/utils/tests/test_classloader.py +++ b/weblate/utils/tests/test_classloader.py @@ -53,6 +53,14 @@ def test_invalid(self) -> None: ): loader.load_data() + @override_settings(TEST_SERVICES=("weblate.addons.not_found",)) + def test_not_found(self) -> None: + loader = ClassLoader("TEST_SERVICES", construct=False, base_class=BaseAddon) + with self.assertRaisesRegex( + ImproperlyConfigured, "does not define a 'not_found' class" + ): + loader.load_data() + @override_settings(TEST_SERVICES=("weblate.addons.cleanup",)) def test_module(self) -> None: loader = ClassLoader("TEST_SERVICES", construct=False, base_class=BaseAddon) diff --git a/weblate/utils/views.py b/weblate/utils/views.py index 5f3e43dbca11..567d6f2c8c66 100644 --- a/weblate/utils/views.py +++ b/weblate/utils/views.py @@ -386,26 +386,31 @@ def guess_filemask_from_doc(data, docfile=None) -> None: data["filemask"] = "{}/{}{}".format(data.get("slug", "translations"), "*", ext) -def create_component_from_doc(data, docfile): +def create_component_from_doc(data, docfile, target_language: Language | None = None): # Calculate filename uploaded = docfile or data["docfile"] guess_filemask_from_doc(data, uploaded) filemask = data["filemask"] - filename = filemask.replace( - "*", - data["source_language"].code + file_language_code = ( + target_language.code + if target_language # bilingual file + else data["source_language"].code if "source_language" in data - else settings.DEFAULT_LANGUAGE, + else settings.DEFAULT_LANGUAGE ) + filename = filemask.replace("*", file_language_code) # Create fake component (needed to calculate path) fake = Component( project=data["project"], slug=data["slug"], name=data["name"], category=data.get("category", None), - template=filename, filemask=filemask, ) + + if not target_language: + fake.template = filename + # Create repository LocalRepository.from_files(fake.full_path, {filename: uploaded.read()}) return fake diff --git a/weblate/wladmin/models.py b/weblate/wladmin/models.py index f7c04389e86e..b076c98f3581 100644 --- a/weblate/wladmin/models.py +++ b/weblate/wladmin/models.py @@ -328,12 +328,12 @@ class SupportStatusDict(TypedDict): def get_support_status(request: AuthenticatedHttpRequest) -> SupportStatusDict: if hasattr(request, "weblate_support_status"): - support_status = request.weblate_support_status + support_status: SupportStatusDict = request.weblate_support_status else: support_status = cache.get(SUPPORT_STATUS_CACHE_KEY) if support_status is None: support_status_instance = SupportStatus.objects.get_current() - support_status: SupportStatusDict = { + support_status = { "has_support": support_status_instance.name != "community", "in_limits": support_status_instance.in_limits, } diff --git a/weblate/wladmin/sites.py b/weblate/wladmin/sites.py index 9f993c711bea..c24580341017 100644 --- a/weblate/wladmin/sites.py +++ b/weblate/wladmin/sites.py @@ -38,7 +38,7 @@ def site_url(self): return settings.URL_PREFIX return "/" - def each_context(self, request: AuthenticatedHttpRequest): + def each_context(self, request: AuthenticatedHttpRequest): # type: ignore[override] from weblate.wladmin.models import ConfigurationError result = super().each_context(request) diff --git a/weblate/wladmin/views.py b/weblate/wladmin/views.py index a4597b0695d0..45cc04b11070 100644 --- a/weblate/wladmin/views.py +++ b/weblate/wladmin/views.py @@ -50,6 +50,7 @@ from weblate.utils.version import GIT_LINK, GIT_REVISION from weblate.utils.views import show_form_errors from weblate.vcs.ssh import ( + KeyType, add_host_key, can_generate_key, generate_ssh_key, @@ -322,9 +323,8 @@ def performance(request: AuthenticatedHttpRequest) -> HttpResponse: @management_access def ssh_key(request: AuthenticatedHttpRequest) -> HttpResponse: - filename, data = get_key_data_raw( - key_type=request.GET.get("type", "rsa"), kind="private" - ) + key_type = cast(KeyType, request.GET.get("type", "rsa")) + filename, data = get_key_data_raw(key_type=key_type, kind="private") if data is None: raise Http404 @@ -345,7 +345,8 @@ def ssh(request: AuthenticatedHttpRequest) -> HttpResponse: # Generate key if it does not exist yet if can_generate and action == "generate": - generate_ssh_key(request, key_type=request.POST.get("type", "rsa")) + key_type = cast(KeyType, request.POST.get("type", "rsa")) + generate_ssh_key(request, key_type=key_type) return redirect("manage-ssh") # Read key data if it exists @@ -429,14 +430,14 @@ def users_check(request: AuthenticatedHttpRequest) -> HttpResponse: # Legacy links for care.weblate.org integration if "email" in data and "q" not in data: data = data.copy() - data["q"] = data["email"] + data.setlist("q", data.getlist("email")) form = AdminUserSearchForm(data) user_list = None if form.is_valid(): - user_list = User.objects.search( - form.cleaned_data.get("q", ""), parser=form.fields["q"].parser - )[:2] + query = form.cleaned_data.get("q", "") + parser = getattr(form.fields["q"], "parser", "unit") + user_list = User.objects.search(query, parser=parser)[:2] if user_list.count() != 1: return redirect_param( "manage-users", "?q={}".format(quote(form.cleaned_data["q"]))