diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index a5c40e4f..98db03e0 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -10,52 +10,58 @@ - 'label': > I have checked the [Wiki](https://github.com/AdguardTeam/AdGuardHome/wiki) and - [Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions) + [Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a) and found no answer 'required': true - 'label': > I have searched other issues and found no duplicates 'required': true - 'label': > - I want to report a bug and not ask a question + I want to report a bug and not [ask a question or ask for + help](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a) + 'required': true + - 'label': > + I have set up AdGuard Home correctly and [configured clients to + use it](https://github.com/AdguardTeam/AdGuardHome/wiki/Clients). + (Use the + [Discussions](https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a) + for help with installing and configuring clients.) 'required': true 'id': 'prerequisites' 'type': 'checkboxes' - 'attributes': - 'description': 'On which operating system type does the issue occur?' - 'label': 'Operating system type' + 'description': 'On which Platform does the issue occur?' + 'label': 'Platform (OS and CPU architecture)' 'options': - - 'FreeBSD' - - 'Linux, OpenWrt' - - 'Linux, Other (please mention the version in the description)' - - 'macOS (aka Darwin)' - - 'OpenBSD' - - 'Windows' - - 'Other (please mention in the description)' + - 'Darwin (aka macOS)/AMD64 (aka x86_64)' + - 'Darwin (aka macOS)/ARM64' + - 'FreeBSD/386' + - 'FreeBSD/AMD64 (aka x86_64)' + - 'FreeBSD/ARM64' + - 'FreeBSD/ARMv5' + - 'FreeBSD/ARMv6' + - 'FreeBSD/ARMv7' + - 'Linux/386' + - 'Linux/AMD64 (aka x86_64)' + - 'Linux/ARM64' + - 'Linux/ARMv5' + - 'Linux/ARMv6' + - 'Linux/ARMv7' + - 'Linux/MIPS LE' + - 'Linux/MIPS' + - 'Linux/MIPS64 LE' + - 'Linux/MIPS64' + - 'Linux/PPC64 LE' + - 'OpenBSD/AMD64 (aka x86_64)' + - 'OpenBSD/ARM64' + - 'Windows/386' + - 'Windows/AMD64 (aka x86_64)' + - 'Windows/ARM64' + - 'Custom (please mention in the description)' 'id': 'os' 'type': 'dropdown' 'validations': 'required': true - - 'attributes': - 'description': 'On which CPU architecture does the issue occur?' - 'label': 'CPU architecture' - 'options': - - 'AMD64' - - 'x86' - - '64-bit ARM' - - 'ARMv5' - - 'ARMv6' - - 'ARMv7' - - '64-bit MIPS' - - '64-bit MIPS LE' - - '32-bit MIPS' - - '32-bit MIPS LE' - - '64-bit PowerPC LE' - - 'Other (please mention in the description)' - 'id': 'arch' - 'type': 'dropdown' - 'validations': - 'required': true - 'attributes': 'description': 'How did you install AdGuard Home?' 'label': 'Installation' @@ -63,7 +69,7 @@ - 'GitHub releases or script from README' - 'Docker' - 'Snapcraft' - - 'Custom port' + - 'Custom package (OpenWrt, HomeAssistant, etc; please mention in the description)' - 'Other (please mention in the description)' 'id': 'install' 'type': 'dropdown' @@ -89,21 +95,55 @@ 'validations': 'required': true - 'attributes': - 'description': 'Please describe the bug' - 'label': 'Description' + 'description': > + Please describe what you did. An `nslookup` or a `dig` command is + the best way. For crashes, please provide a full failure log. + 'label': 'Action' 'value': | - #### What did you do? - - #### Expected result - - #### Actual result - - #### Screenshots (if applicable) - - #### Additional information - 'id': 'description' + ```sh + nslookup -debug -type=a 'www.example.com' '$YOUR_AGH_ADDRESS' + ``` + 'id': 'failing_action' 'type': 'textarea' 'validations': 'required': true -'description': 'File a bug report' + - 'attributes': + 'description': > + What did you expect to see? Please add a description and/or + screenshots, if applicable. + 'label': 'Expected result' + 'placeholder': > + What did you expect to see? + 'id': 'expected' + 'type': 'textarea' + 'validations': + 'required': true + - 'attributes': + 'description': > + What happened instead? Please add a description and/or screenshots, + if applicable. + 'label': 'Actual result' + 'placeholder': > + What did you see instead? + 'id': 'result' + 'type': 'textarea' + 'validations': + 'required': true + - 'attributes': + 'description': > + Please add additional information, such as non-standard OS or port, + here. You can also put screenshots here, if applicable. For + example, it is better to copy and paste text from a terminal instead + of posting a screenshot of the terminal. + 'label': 'Additional information and/or screenshots' + 'placeholder': > + Additional OS information, screenshots of the UI, etc. + 'id': 'additional' + 'type': 'textarea' + 'validations': + 'required': false +'description': > + Open a bug report. Please do not open bug reports for questions or help + with configuring clients. If you want to ask for help, use the Discussions + section. 'name': 'Bug' diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml index 0ad6f5d8..154a137d 100644 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -23,19 +23,32 @@ 'id': 'prerequisites' 'type': 'checkboxes' - 'attributes': - 'description': 'Please describe the request' - 'label': 'Description' - 'value': | - #### What problem are you trying to solve? - - #### Proposed solution - - #### Alternatives considered - - #### Additional information - 'id': 'description' + 'description': 'Please describe the problem you are trying to solve' + 'label': 'The problem' + 'placeholder': > + Please describe the problem you are trying to solve + 'id': 'problem' 'type': 'textarea' 'validations': 'required': true + - 'attributes': + 'description': 'What feature are you proposing to solve this problem?' + 'label': 'Proposed solution' + 'placeholder': > + What feature are you proposing to solve this problem? + 'id': 'proposed_solution' + 'type': 'textarea' + 'validations': + 'required': true + - 'attributes': + 'label': 'Alternatives considered and additional information' + 'placeholder': > + Are there any other ways to solve the problem? + 'id': 'additional' + 'type': 'textarea' + 'validations': + 'required': false 'description': 'Suggest a feature or an enhancement for AdGuard Home' +'labels': + - 'feature request' 'name': 'Feature request or enhancement' diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE new file mode 100644 index 00000000..d969343d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE @@ -0,0 +1,20 @@ +Before submitting a PR please make sure that: + +1. You have discussed your solution in an issue and have got an + approval from a maintainer. + +2. This isn't a localization fix; please send those to our + [CrowdIn](https://crowdin.com/project/adguard-applications/en#/adguard-home) + page. + +3. Your code follows our + [code guidelines](https://github.com/AdguardTeam/CodeGuidelines/blob/master/Go/Go.md). + +Add a short description here. The description should include: + +1. Which issue this PR closes (`Closes #NNNN.`) or updates (`Updates + #NNNN.`). + +2. A short description of how the change achieves that. + +Do not forget to remove these instructions. diff --git a/.github/workflows/potential-duplicates.yml b/.github/workflows/potential-duplicates.yml new file mode 100644 index 00000000..dd065845 --- /dev/null +++ b/.github/workflows/potential-duplicates.yml @@ -0,0 +1,18 @@ +'name': 'potential-duplicates' +'on': + 'issues': + 'types': + - 'opened' +'jobs': + 'run': + 'runs-on': 'ubuntu-latest' + 'steps': + - 'uses': 'wow-actions/potential-duplicates@v1' + 'with': + 'GITHUB_TOKEN': '${{ secrets.GITHUB_TOKEN }}' + 'state': 'all' + 'threshold': 0.6 + 'comment': | + Potential duplicates: {{#issues}} + * [#{{ number }}] {{ title }} ({{ accuracy }}%) + {{/issues}} diff --git a/.gitignore b/.gitignore index bdc4c29f..e5124973 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,13 @@ /dist/ /filtering/tests/filtering.TestLotsOfRules*.pprof /filtering/tests/top-1m.csv +/internal/next/AdGuardHome.yaml /launchpad_credentials /querylog.json* /snapcraft_login -AdGuardHome* +AdGuardHome +AdGuardHome.exe +AdGuardHome.yaml* coverage.txt node_modules/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 88ca9e69..f27a5d13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,34 +14,180 @@ and this project adheres to -### Added - -- The ability to edit rewrite rules via `PUT /control/rewrite/update` HTTP API - ([#1577]). - -[#1577]: https://github.com/AdguardTeam/AdGuardHome/issues/1577 - +## [v0.107.33] - 2023-07-03 + +See also the [v0.107.33 GitHub milestone][ms-v0.107.33]. + +### Added + +- The new command-line flag `--web-addr` is the address to serve the web UI on, + in the host:port format. +- The ability to set inactivity periods for filtering blocked services, both + globally and per client, in the configuration file ([#951]). The UI changes + are coming in the upcoming releases. +- The ability to edit rewrite rules via `PUT /control/rewrite/update` HTTP API + and the Web UI ([#1577]). + +### Changed + +#### Configuration Changes + +In this release, the schema version has changed from 20 to 23. + +- Properties `bind_host`, `bind_port`, and `web_session_ttl` which used to setup + web UI binding configuration, are now moved to a new object `http` containing + new properties `address` and `session_ttl`: + + ```yaml + # BEFORE: + 'bind_host': '1.2.3.4' + 'bind_port': 8080 + 'web_session_ttl': 720 + + # AFTER: + 'http': + 'address': '1.2.3.4:8080' + 'session_ttl': '720h' + ``` + + Note that the new `http.session_ttl` property is now a duration string. To + rollback this change, remove the new object `http`, set back `bind_host`, + `bind_port`, `web_session_ttl`, and change the `schema_version` back to `22`. +- Property `clients.persistent.blocked_services`, which in schema versions 21 + and earlier used to be a list containing ids of blocked services, is now an + object containing ids and schedule for blocked services: + + ```yaml + # BEFORE: + 'clients': + 'persistent': + - 'name': 'client-name' + 'blocked_services': + - id_1 + - id_2 + + # AFTER: + 'clients': + 'persistent': + - 'name': client-name + 'blocked_services': + 'ids': + - id_1 + - id_2 + 'schedule': + 'time_zone': 'Local' + 'sun': + 'start': '0s' + 'end': '24h' + 'mon': + 'start': '1h' + 'end': '23h' + ``` + + To rollback this change, replace `clients.persistent.blocked_services` object + with the list of ids of blocked services and change the `schema_version` back + to `21`. +- Property `dns.blocked_services`, which in schema versions 20 and earlier used + to be a list containing ids of blocked services, is now an object containing + ids and schedule for blocked services: + + ```yaml + # BEFORE: + 'blocked_services': + - id_1 + - id_2 + + # AFTER: + 'blocked_services': + 'ids': + - id_1 + - id_2 + 'schedule': + 'time_zone': 'Local' + 'sun': + 'start': '0s' + 'end': '24h' + 'mon': + 'start': '10m' + 'end': '23h30m' + 'tue': + 'start': '20m' + 'end': '23h' + 'wed': + 'start': '30m' + 'end': '22h30m' + 'thu': + 'start': '40m' + 'end': '22h' + 'fri': + 'start': '50m' + 'end': '21h30m' + 'sat': + 'start': '1h' + 'end': '21h' + ``` + + To rollback this change, replace `dns.blocked_services` object with the list + of ids of blocked services and change the `schema_version` back to `20`. + +### Deprecated + +- `HEALTHCHECK` and `ENTRYPOINT` sections in `Dockerfile` ([#5939]). They cause + a lot of issues, especially with tools like `docker-compose` and `podman`, and + will be removed in a future release. +- Flags `-h`, `--host`, `-p`, `--port` have been deprecated. The `-h` flag + will work as an alias for `--help`, instead of the deprecated `--host` in the + future releases. + +### Fixed + +- Ignoring of `/etc/hosts` file when resolving the hostnames of upstream DNS + servers ([#5902]). +- Excessive error logging when using DNS-over-QUIC ([#5285]). +- Inability to set `bind_host` in `AdGuardHome.yaml` in Docker ([#4231], + [#4235]). +- The blocklists can now be deleted properly ([#5700]). +- Queries with the question-section target `.`, for example `NS .`, are now + counted in the statistics and correctly shown in the query log ([#5910]). +- Safe Search not working with `AAAA` queries for domains that don't have `AAAA` + records ([#5913]). + +[#951]: https://github.com/AdguardTeam/AdGuardHome/issues/951 +[#1577]: https://github.com/AdguardTeam/AdGuardHome/issues/1577 +[#4231]: https://github.com/AdguardTeam/AdGuardHome/issues/4231 +[#4235]: https://github.com/AdguardTeam/AdGuardHome/pull/4235 +[#5285]: https://github.com/AdguardTeam/AdGuardHome/issues/5285 +[#5700]: https://github.com/AdguardTeam/AdGuardHome/issues/5700 +[#5902]: https://github.com/AdguardTeam/AdGuardHome/issues/5902 +[#5910]: https://github.com/AdguardTeam/AdGuardHome/issues/5910 +[#5913]: https://github.com/AdguardTeam/AdGuardHome/issues/5913 +[#5939]: https://github.com/AdguardTeam/AdGuardHome/discussions/5939 + +[ms-v0.107.33]: https://github.com/AdguardTeam/AdGuardHome/milestone/68?closed=1 + + + ## [v0.107.32] - 2023-06-13 ### Fixed - - DNSCrypt upstream not resetting the client and resolver information on - dialing errors ([#5872]). +- DNSCrypt upstream not resetting the client and resolver information on + dialing errors ([#5872]). @@ -2014,11 +2160,12 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2]. -[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.32...HEAD +[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.33...HEAD +[v0.107.33]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.32...v0.107.33 [v0.107.32]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.31...v0.107.32 [v0.107.31]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.30...v0.107.31 [v0.107.30]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.29...v0.107.30 diff --git a/bamboo-specs/bamboo.yaml b/bamboo-specs/bamboo.yaml index 9ff52b59..9eff70ae 100644 --- a/bamboo-specs/bamboo.yaml +++ b/bamboo-specs/bamboo.yaml @@ -1,5 +1,8 @@ ---- -!include test.yaml - --- !include release.yaml + +--- +!include snapcraft.yaml + +--- +!include test.yaml diff --git a/bamboo-specs/release.yaml b/bamboo-specs/release.yaml index 20dbe9b5..d82b6f2f 100644 --- a/bamboo-specs/release.yaml +++ b/bamboo-specs/release.yaml @@ -1,348 +1,290 @@ --- 'version': 2 'plan': - 'project-key': 'AGH' - 'key': 'AGHBSNAPSPECS' - 'name': 'AdGuard Home - Build and publish release' + 'project-key': 'AGH' + 'key': 'AGHBSNAPSPECS' + 'name': 'AdGuard Home - Build and publish release' # Make sure to sync any changes with the branch overrides below. 'variables': - 'channel': 'edge' - 'dockerGo': 'adguard/golang-ubuntu:6.7' + 'channel': 'edge' + 'dockerGo': 'adguard/golang-ubuntu:6.7' 'stages': -- 'Build frontend': - 'manual': false - 'final': false - 'jobs': - - 'Build frontend' + - 'Build frontend': + 'manual': false + 'final': false + 'jobs': + - 'Build frontend' -- 'Make release': - 'manual': false - 'final': false - 'jobs': - - 'Make release' + - 'Make release': + 'manual': false + 'final': false + 'jobs': + - 'Make release' -- 'Make and publish docker': - 'manual': false - 'final': false - 'jobs': - - 'Make and publish docker' + - 'Make and publish docker': + 'manual': false + 'final': false + 'jobs': + - 'Make and publish docker' -- 'Publish to static storage': - 'manual': false - 'final': false - 'jobs': - - 'Publish to static storage' + - 'Publish to static storage': + 'manual': false + 'final': false + 'jobs': + - 'Publish to static storage' -- 'Publish to Snapstore': - 'manual': false - 'final': false - 'jobs': - - 'Publish to Snapstore' - -- 'Publish to GitHub Releases': - 'manual': false - 'final': false - 'jobs': - - 'Publish to GitHub Releases' + - 'Publish to GitHub Releases': + 'manual': false + 'final': false + 'jobs': + - 'Publish to GitHub Releases' 'Build frontend': - 'docker': - 'image': '${bamboo.dockerGo}' - 'volumes': - '${system.YARN_DIR}': '${bamboo.cacheYarn}' - 'key': 'BF' - 'other': - 'clean-working-dir': true - 'tasks': - - 'checkout': - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'docker': + 'image': '${bamboo.dockerGo}' + 'volumes': + '${system.YARN_DIR}': '${bamboo.cacheYarn}' + 'key': 'BF' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - # Explicitly checkout the revision that we need. - git checkout "${bamboo.repository.revision.number}" + # Explicitly checkout the revision that we need. + git checkout "${bamboo.repository.revision.number}" - make js-deps js-build - 'artifacts': - - 'name': 'AdGuardHome frontend' - 'pattern': 'build*/**' - 'shared': true - 'required': true - 'requirements': - - 'adg-docker': 'true' + make js-deps js-build + 'artifacts': + - 'name': 'AdGuardHome frontend' + 'pattern': 'build/**' + 'shared': true + 'required': true + 'requirements': + - 'adg-docker': 'true' 'Make release': - 'docker': - 'image': '${bamboo.dockerGo}' - 'volumes': - '${system.GO_CACHE_DIR}': '${bamboo.cacheGo}' - '${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}' - 'key': 'MR' - 'other': - 'clean-working-dir': true - 'tasks': - - 'checkout': - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'docker': + 'image': '${bamboo.dockerGo}' + 'volumes': + '${system.GO_CACHE_DIR}': '${bamboo.cacheGo}' + '${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}' + 'key': 'MR' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - # Explicitly checkout the revision that we need. - git checkout "${bamboo.repository.revision.number}" + # Explicitly checkout the revision that we need. + git checkout "${bamboo.repository.revision.number}" - # Run the build with the specified channel. - echo "${bamboo.gpgSecretKeyPart1}${bamboo.gpgSecretKeyPart2}"\ - | awk '{ gsub(/\\n/, "\n"); print; }'\ - | gpg --import --batch --yes + # Run the build with the specified channel. + echo "${bamboo.gpgSecretKeyPart1}${bamboo.gpgSecretKeyPart2}"\ + | awk '{ gsub(/\\n/, "\n"); print; }'\ + | gpg --import --batch --yes - make\ - CHANNEL=${bamboo.channel}\ - GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\ - FRONTEND_PREBUILT=1\ - PARALLELISM=1\ - VERBOSE=2\ - build-release - # TODO(a.garipov): Use more fine-grained artifact rules. - 'artifacts': - - 'name': 'AdGuardHome dists' - 'pattern': 'dist/**' - 'shared': true - 'required': true - 'requirements': - - 'adg-docker': 'true' + make\ + CHANNEL=${bamboo.channel}\ + GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\ + FRONTEND_PREBUILT=1\ + PARALLELISM=1\ + VERBOSE=2\ + build-release + # TODO(a.garipov): Use more fine-grained artifact rules. + 'artifacts': + - 'name': 'AdGuardHome dists' + 'pattern': 'dist/**' + 'shared': true + 'required': true + 'requirements': + - 'adg-docker': 'true' 'Make and publish docker': - 'key': 'MPD' - 'other': - 'clean-working-dir': true - 'tasks': - - 'checkout': - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'key': 'MPD' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - COMMIT="${bamboo.repository.revision.number}" - export COMMIT - readonly COMMIT + COMMIT="${bamboo.repository.revision.number}" + export COMMIT + readonly COMMIT - # Explicitly checkout the revision that we need. - git checkout "$COMMIT" + # Explicitly checkout the revision that we need. + git checkout "$COMMIT" - # Install Qemu, create builder. - docker version -f '{{ .Server.Experimental }}' - docker buildx rm buildx-builder || : - docker buildx create --name buildx-builder --driver docker-container\ - --use - docker buildx inspect --bootstrap + # Install Qemu, create builder. + docker version -f '{{ .Server.Experimental }}' + docker buildx rm buildx-builder || : + docker buildx create --name buildx-builder --driver docker-container\ + --use + docker buildx inspect --bootstrap - # Login to DockerHub. - docker login -u="${bamboo.dockerHubUsername}"\ - -p="${bamboo.dockerHubPassword}" + # Login to DockerHub. + docker login -u="${bamboo.dockerHubUsername}"\ + -p="${bamboo.dockerHubPassword}" - # Boot the builder. - docker buildx inspect --bootstrap + # Boot the builder. + docker buildx inspect --bootstrap - # Print Docker info. - docker info + # Print Docker info. + docker info - # Prepare and push the build. - env\ - CHANNEL="${bamboo.channel}"\ - DIST_DIR='dist'\ - DOCKER_IMAGE_NAME='adguard/adguardhome'\ - DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true"\ - VERBOSE='1'\ - sh ./scripts/make/build-docker.sh - 'environment': - DOCKER_CLI_EXPERIMENTAL=enabled - 'final-tasks': - - 'clean' - 'requirements': - - 'adg-docker': 'true' + # Prepare and push the build. + env\ + CHANNEL="${bamboo.channel}"\ + DIST_DIR='dist'\ + DOCKER_IMAGE_NAME='adguard/adguardhome'\ + DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true"\ + VERBOSE='1'\ + sh ./scripts/make/build-docker.sh + 'environment': + DOCKER_CLI_EXPERIMENTAL=enabled + 'final-tasks': + - 'clean' + 'requirements': + - 'adg-docker': 'true' 'Publish to static storage': - 'key': 'PUB' - 'other': - 'clean-working-dir': true - 'tasks': - - 'clean' - - 'checkout': - 'repository': 'bamboo-deploy-publisher' - 'path': 'bamboo-deploy-publisher' - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'key': 'PUB' + 'other': + 'clean-working-dir': true + 'tasks': + - 'clean' + - 'checkout': + 'repository': 'bamboo-deploy-publisher' + 'path': 'bamboo-deploy-publisher' + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - cd ./dist/ + cd ./dist/ - CHANNEL="${bamboo.channel}" - export CHANNEL + CHANNEL="${bamboo.channel}" + export CHANNEL - ../bamboo-deploy-publisher/deploy.sh adguard-home-"$CHANNEL" - 'final-tasks': - - 'clean' - 'requirements': - - 'adg-docker': 'true' - -'Publish to Snapstore': - 'docker': - 'image': '${bamboo.dockerGo}' - 'key': 'PTS' - 'other': - 'clean-working-dir': true - 'tasks': - - 'clean' - - 'checkout': - 'repository': 'bamboo-deploy-publisher' - 'path': 'bamboo-deploy-publisher' - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh - - set -e -f -u -x - - cd ./dist/ - - channel="${bamboo.channel}" - readonly channel - - case "$channel" - in - ('release') - snapchannel='candidate' - ;; - ('beta') - snapchannel='beta' - ;; - ('edge') - snapchannel='edge' - ;; - (*) - echo "invalid channel '$channel'" - exit 1 - ;; - esac - - env\ - SNAPCRAFT_CHANNEL="$snapchannel"\ - SNAPCRAFT_EMAIL="${bamboo.snapcraftEmail}"\ - SNAPCRAFT_STORE_CREDENTIALS="${bamboo.snapcraftMacaroonPassword}"\ - ../bamboo-deploy-publisher/deploy.sh adguard-home-snap - 'final-tasks': - - 'clean' - 'requirements': - - 'adg-docker': 'true' + ../bamboo-deploy-publisher/deploy.sh adguard-home-"$CHANNEL" + 'final-tasks': + - 'clean' + 'requirements': + - 'adg-docker': 'true' 'Publish to GitHub Releases': - 'key': 'PTGR' - 'other': - 'clean-working-dir': true - 'tasks': - - 'clean' - - 'checkout': - 'repository': 'bamboo-deploy-publisher' - 'path': 'bamboo-deploy-publisher' - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'key': 'PTGR' + 'other': + 'clean-working-dir': true + 'tasks': + - 'clean' + - 'checkout': + 'repository': 'bamboo-deploy-publisher' + 'path': 'bamboo-deploy-publisher' + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - channel="${bamboo.channel}" - readonly channel + channel="${bamboo.channel}" + readonly channel - if [ "$channel" != 'release' ] && [ "${channel}" != 'beta' ] - then - echo "don't publish to GitHub Releases for this channel" + if [ "$channel" != 'release' ] && [ "${channel}" != 'beta' ] + then + echo "don't publish to GitHub Releases for this channel" - exit 0 - fi + exit 0 + fi - cd ./dist/ + cd ./dist/ - env\ - GITHUB_TOKEN="${bamboo.githubPublicRepoPassword}"\ - ../bamboo-deploy-publisher/deploy.sh adguard-home-github - 'final-tasks': - - 'clean' - 'requirements': - - 'adg-docker': 'true' + env\ + GITHUB_TOKEN="${bamboo.githubPublicRepoPassword}"\ + ../bamboo-deploy-publisher/deploy.sh adguard-home-github + 'final-tasks': + - 'clean' + 'requirements': + - 'adg-docker': 'true' 'triggers': -# Don't use minute values that end with a zero or a five as these are often used -# in CI and so resources during these minutes can be quite busy. -- 'cron': '0 42 13 ? * MON-FRI *' + # Don't use minute values that end with a zero or a five as these are often + # used in CI and so resources during these minutes can be quite busy. + - 'cron': '0 42 13 ? * MON-FRI *' 'branches': - 'create': 'manually' - 'delete': - 'after-deleted-days': 1 - 'after-inactive-days': 30 - 'integration': - 'push-on-success': false - 'merge-from': 'AdGuard Home - Build and publish release' - 'link-to-jira': true + 'create': 'manually' + 'delete': + 'after-deleted-days': 1 + 'after-inactive-days': 30 + 'integration': + 'push-on-success': false + 'merge-from': 'AdGuard Home - Build and publish release' + 'link-to-jira': true 'notifications': -- 'events': - - 'plan-completed' - 'recipients': - - 'webhook': - 'name': 'Build webhook' - 'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa' + - 'events': + - 'plan-completed' + 'recipients': + - 'webhook': + 'name': 'Build webhook' + 'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa' 'labels': [] 'other': - 'concurrent-build-plugin': 'system-default' + 'concurrent-build-plugin': 'system-default' 'branch-overrides': -# beta-vX.Y branches are the branches into which the commits that are needed to -# release a new patch version are initially cherry-picked. -- '^beta-v[0-9]+\.[0-9]+': - # Build betas on release branches manually. - 'triggers': [] - # Set the default release channel on the release branch to beta, as we may - # need to build a few of these. - 'variables': - 'channel': 'beta' - 'dockerGo': 'adguard/golang-ubuntu:6.7' -# release-vX.Y.Z branches are the branches from which the actual final release -# is built. -- '^release-v[0-9]+\.[0-9]+\.[0-9]+': - # Disable integration branches for release branches. - 'branch-config': - 'integration': - 'push-on-success': false - 'merge-from': 'beta-v0.107' - # Build final releases on release branches manually. - 'triggers': [] - # Set the default release channel on the final branch to release, as these - # are the ones that actually get released. - 'variables': - 'channel': 'release' - 'dockerGo': 'adguard/golang-ubuntu:6.7' + # beta-vX.Y branches are the branches into which the commits that are needed + # to release a new patch version are initially cherry-picked. + - '^beta-v[0-9]+\.[0-9]+': + # Build betas on release branches manually. + 'triggers': [] + # Set the default release channel on the release branch to beta, as we may + # need to build a few of these. + 'variables': + 'channel': 'beta' + 'dockerGo': 'adguard/golang-ubuntu:6.7' + # release-vX.Y.Z branches are the branches from which the actual final + # release is built. + - '^release-v[0-9]+\.[0-9]+\.[0-9]+': + # Disable integration branches for release branches. + 'branch-config': + 'integration': + 'push-on-success': false + 'merge-from': 'beta-v0.107' + # Build final releases on release branches manually. + 'triggers': [] + # Set the default release channel on the final branch to release, as these + # are the ones that actually get released. + 'variables': + 'channel': 'release' + 'dockerGo': 'adguard/golang-ubuntu:6.7' diff --git a/bamboo-specs/snapcraft.yaml b/bamboo-specs/snapcraft.yaml new file mode 100644 index 00000000..53efff41 --- /dev/null +++ b/bamboo-specs/snapcraft.yaml @@ -0,0 +1,211 @@ +--- +# This part of the release build is separate from the one described in +# release.yaml, because the Snapcraft infrastructure is brittle, and timeouts +# during logins and uploads often lead to release blocking. +'version': 2 +'plan': + 'project-key': 'AGH' + 'key': 'AGHSNAP' + 'name': 'AdGuard Home - Build and publish Snapcraft release' +# Make sure to sync any changes with the branch overrides below. +'variables': + 'channel': 'edge' + 'dockerGo': 'adguard/golang-ubuntu:6.7' + 'snapcraftChannel': 'edge' + +'stages': + - 'Download release': + 'manual': false + 'final': false + 'jobs': + - 'Download release' + + - 'Build packages': + 'manual': false + 'final': false + 'jobs': + - 'Build packages' + + - 'Publish to Snapstore': + 'manual': false + 'final': false + 'jobs': + - 'Publish to Snapstore' + +# TODO(a.garipov): Consider using the Artifact Downloader Task if it ever learns +# about plan branches. +'Download release': + 'artifacts': + - 'name': 'i386_binary' + 'pattern': 'AdGuardHome_i386' + 'shared': true + 'required': true + - 'name': 'amd64_binary' + 'pattern': 'AdGuardHome_amd64' + 'shared': true + 'required': true + - 'name': 'armhf_binary' + 'pattern': 'AdGuardHome_armhf' + 'shared': true + 'required': true + - 'name': 'arm64_binary' + 'pattern': 'AdGuardHome_arm64' + 'shared': true + 'required': true + 'docker': + 'image': '${bamboo.dockerGo}' + 'key': 'DR' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh + + set -e -f -u -x + + env\ + CHANNEL="${bamboo.channel}"\ + VERBOSE='1'\ + sh ./scripts/snap/download.sh + 'requirements': + - 'adg-docker': 'true' + +'Build packages': + 'artifact-subscriptions': + - 'artifact': 'i386_binary' + - 'artifact': 'amd64_binary' + - 'artifact': 'armhf_binary' + - 'artifact': 'arm64_binary' + 'artifacts': + - 'name': 'i386_snap' + 'pattern': 'AdGuardHome_i386.snap' + 'shared': true + 'required': true + - 'name': 'amd64_snap' + 'pattern': 'AdGuardHome_amd64.snap' + 'shared': true + 'required': true + - 'name': 'armhf_snap' + 'pattern': 'AdGuardHome_armhf.snap' + 'shared': true + 'required': true + - 'name': 'arm64_snap' + 'pattern': 'AdGuardHome_arm64.snap' + 'shared': true + 'required': true + 'docker': + 'image': '${bamboo.dockerGo}' + 'key': 'BP' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh + + set -e -f -u -x + + env\ + VERBOSE='1'\ + sh ./scripts/snap/build.sh + 'requirements': + - 'adg-docker': 'true' + +'Publish to Snapstore': + 'artifact-subscriptions': + - 'artifact': 'i386_snap' + - 'artifact': 'amd64_snap' + - 'artifact': 'armhf_snap' + - 'artifact': 'arm64_snap' + 'docker': + 'image': '${bamboo.dockerGo}' + 'key': 'PTS' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh + + set -e -f -u -x + + env\ + SNAPCRAFT_CHANNEL="${bamboo.snapcraftChannel}"\ + SNAPCRAFT_STORE_CREDENTIALS="${bamboo.snapcraftMacaroonPassword}"\ + VERBOSE='1'\ + sh ./scripts/snap/upload.sh + 'final-tasks': + - 'clean' + 'requirements': + - 'adg-docker': 'true' + +'triggers': + # Don't use minute values that end with a zero or a five as these are often + # used in CI and so resources during these minutes can be quite busy. + # + # NOTE: The time is chosen to be exactly one hour after the main release + # build as defined as in release.yaml. + - 'cron': '0 42 14 ? * MON-FRI *' +'branches': + 'create': 'manually' + 'delete': + 'after-deleted-days': 1 + 'after-inactive-days': 30 + 'integration': + 'push-on-success': false + 'merge-from': 'AdGuard Home - Build and publish Snapcraft release' + 'link-to-jira': true + +'notifications': + - 'events': + - 'plan-completed' + 'recipients': + - 'webhook': + 'name': 'Build webhook' + 'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa' + +'labels': [] +'other': + 'concurrent-build-plugin': 'system-default' + +'branch-overrides': + # beta-vX.Y branches are the branches into which the commits that are needed + # to release a new patch version are initially cherry-picked. + - '^beta-v[0-9]+\.[0-9]+': + # Build betas on release branches manually. + 'triggers': [] + # Set the default release channel on the release branch to beta, as we may + # need to build a few of these. + 'variables': + 'channel': 'beta' + 'dockerGo': 'adguard/golang-ubuntu:6.7' + 'snapcraftChannel': 'beta' + # release-vX.Y.Z branches are the branches from which the actual final + # release is built. + - '^release-v[0-9]+\.[0-9]+\.[0-9]+': + # Disable integration branches for release branches. + 'branch-config': + 'integration': + 'push-on-success': false + 'merge-from': 'beta-v0.107' + # Build final releases on release branches manually. + 'triggers': [] + # Set the default release channel on the final branch to release, as these + # are the ones that actually get released. + 'variables': + 'channel': 'release' + 'dockerGo': 'adguard/golang-ubuntu:6.7' + 'snapcraftChannel': 'candidate' diff --git a/bamboo-specs/test.yaml b/bamboo-specs/test.yaml index abfa4566..e2cc8caf 100644 --- a/bamboo-specs/test.yaml +++ b/bamboo-specs/test.yaml @@ -1,64 +1,64 @@ --- 'version': 2 'plan': - 'project-key': 'AGH' - 'key': 'AHBRTSPECS' - 'name': 'AdGuard Home - Build and run tests' + 'project-key': 'AGH' + 'key': 'AHBRTSPECS' + 'name': 'AdGuard Home - Build and run tests' 'variables': - 'dockerGo': 'adguard/golang-ubuntu:6.7' + 'dockerGo': 'adguard/golang-ubuntu:6.7' 'stages': -- 'Tests': - 'manual': false - 'final': false - 'jobs': - - 'Test' + - 'Tests': + 'manual': false + 'final': false + 'jobs': + - 'Test' 'Test': - 'docker': - 'image': '${bamboo.dockerGo}' - 'volumes': - '${system.YARN_DIR}': '${bamboo.cacheYarn}' - '${system.GO_CACHE_DIR}': '${bamboo.cacheGo}' - '${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}' - 'key': 'TEST' - 'other': - 'clean-working-dir': true - 'tasks': - - 'checkout': - 'force-clean-build': true - - 'script': - 'interpreter': 'SHELL' - 'scripts': - - | - #!/bin/sh + 'docker': + 'image': '${bamboo.dockerGo}' + 'volumes': + '${system.YARN_DIR}': '${bamboo.cacheYarn}' + '${system.GO_CACHE_DIR}': '${bamboo.cacheGo}' + '${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}' + 'key': 'TEST' + 'other': + 'clean-working-dir': true + 'tasks': + - 'checkout': + 'force-clean-build': true + - 'script': + 'interpreter': 'SHELL' + 'scripts': + - | + #!/bin/sh - set -e -f -u -x + set -e -f -u -x - make VERBOSE=1 ci go-tools lint - 'final-tasks': - - 'clean' - 'requirements': - - 'adg-docker': 'true' + make VERBOSE=1 ci go-tools lint + 'final-tasks': + - 'clean' + 'requirements': + - 'adg-docker': 'true' 'branches': - 'create': 'for-pull-request' - 'delete': - 'after-deleted-days': 1 - 'after-inactive-days': 5 - 'integration': - 'push-on-success': false - 'merge-from': 'AdGuard Home - Build and run tests' - 'link-to-jira': true + 'create': 'for-pull-request' + 'delete': + 'after-deleted-days': 1 + 'after-inactive-days': 5 + 'integration': + 'push-on-success': false + 'merge-from': 'AdGuard Home - Build and run tests' + 'link-to-jira': true 'notifications': -- 'events': - - 'plan-status-changed' - 'recipients': - - 'webhook': - 'name': 'Build webhook' - 'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo' + - 'events': + - 'plan-status-changed' + 'recipients': + - 'webhook': + 'name': 'Build webhook' + 'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo' 'labels': [] 'other': - 'concurrent-build-plugin': 'system-default' + 'concurrent-build-plugin': 'system-default' diff --git a/client/src/__locales/be.json b/client/src/__locales/be.json index 1affd298..5e29a8e4 100644 --- a/client/src/__locales/be.json +++ b/client/src/__locales/be.json @@ -475,7 +475,9 @@ "setup_dns_notice": "Каб выкарыстоўваць <1>DNS-over-HTTPS ці <1>DNS-over-TLS, вам патрэбна <0>наладзіць шыфраванне у наладах AdGuard Home.", "rewrite_added": "Правіла перанакіравання DNS для «{{key}}» паспяхова дададзена", "rewrite_deleted": "Правіла перанакіравання DNS для «{{key}}» паспяхова выдалена", + "rewrite_updated": "Перазапіс DNS паспяхова абноўлены", "rewrite_add": "Дадаць правіла перанакіравання DNS", + "rewrite_edit": "Рэдагаваць перазапіс DNS", "rewrite_not_found": "Не знойдзена правілаў перанакіравання DNS", "rewrite_confirm_delete": "Вы ўпэўнены, што хочаце выдаліць правіла перанакіравання DNS для «{{key}}»?", "rewrite_desc": "Дазваляе лёгка наладзіць карыстацкі DNS-адказ для пэўнага дамена.", diff --git a/client/src/__locales/cs.json b/client/src/__locales/cs.json index 3c7533e9..7289175b 100644 --- a/client/src/__locales/cs.json +++ b/client/src/__locales/cs.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Pro použití <1>DNS skrze HTTPS nebo <1>DNS skrze TLS potřebujete v nastaveních AdGuard Home <0>nakonfigurovat šifrování.", "rewrite_added": "Přesměrování DNS pro „{{key}}“ úspěšně přidáno", "rewrite_deleted": "Přesměrování DNS pro „{{key}}“ úspěšně smazáno", + "rewrite_updated": "Přesměrování DNS bylo úspěšně aktualizováno", "rewrite_add": "Přidat přesměrování DNS", + "rewrite_edit": "Upravit přesměrování DNS", "rewrite_not_found": "Přesměrování DNS nenalezeny", "rewrite_confirm_delete": "Jste si jisti, že chcete smazat přesměrování DNS pro „{{key}}“?", "rewrite_desc": "Umožňuje snadno nakonfigurovat vlastní DNS odezvy pro konkrétní název domény.", diff --git a/client/src/__locales/da.json b/client/src/__locales/da.json index 076f2536..51dc4394 100644 --- a/client/src/__locales/da.json +++ b/client/src/__locales/da.json @@ -478,7 +478,9 @@ "setup_dns_notice": "For at kunne bruge <1>DNS-over-HTTPS eller <1>DNS-over-TLS, skal du <0>opsætte Krypteringen i AdGuard Homes indstillinger.", "rewrite_added": "DNS-omskrivning for \"{{key}}\" blev tilføjet", "rewrite_deleted": "DNS-omskrivning for \"{{key}}\" blev slettet", + "rewrite_updated": "DNS-omskrivning hermed opdateret", "rewrite_add": "Tilføj DNS-omskrivning", + "rewrite_edit": "Redigér DNS-omskrivning", "rewrite_not_found": "Ingen DNS-omskrivninger fundet", "rewrite_confirm_delete": "Sikker på, at du vil slette DNS-omskrivning for \"{{key}}\"?", "rewrite_desc": "Gør det nemt at opsætte det tilpassede DNS-svar for et specifikt domænenavn.", diff --git a/client/src/__locales/de.json b/client/src/__locales/de.json index 230caa3c..dc6010a8 100644 --- a/client/src/__locales/de.json +++ b/client/src/__locales/de.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Um <1>DNS-over-HTTTPS oder <1>DNS-over-TLS verwenden zu können, müssen Sie in den AdGuard Home Einstellungen die <0>Verschlüsselung konfigurieren.", "rewrite_added": "DNS-Umschreibung für „{{key}}“ erfolgreich hinzugefügt", "rewrite_deleted": "DNS-Umschreibung für „{{key}}“ erfolgreich entfernt", + "rewrite_updated": "DNS-Rewrite erfolgreich aktualisiert", "rewrite_add": "DNS-Umschreibung hinzufügen", + "rewrite_edit": "DNS-Rewrite bearbeiten", "rewrite_not_found": "Keine DNS-Umschreibungen gefunden", "rewrite_confirm_delete": "Möchten Sie die DNS-Umschreibung für „{{key}}“ wirklich entfernen?", "rewrite_desc": "Ermöglicht die einfache Konfiguration der benutzerdefinierten DNS-Antwort für einen bestimmten Domainnamen.", diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json index a2633ad8..644f466d 100644 --- a/client/src/__locales/en.json +++ b/client/src/__locales/en.json @@ -478,7 +478,9 @@ "setup_dns_notice": "In order to use <1>DNS-over-HTTPS or <1>DNS-over-TLS, you need to <0>configure Encryption in AdGuard Home settings.", "rewrite_added": "DNS rewrite for \"{{key}}\" successfully added", "rewrite_deleted": "DNS rewrite for \"{{key}}\" successfully deleted", + "rewrite_updated": "DNS rewrite successfully updated", "rewrite_add": "Add DNS rewrite", + "rewrite_edit": "Edit DNS rewrite", "rewrite_not_found": "No DNS rewrites found", "rewrite_confirm_delete": "Are you sure you want to delete DNS rewrite for \"{{key}}\"?", "rewrite_desc": "Allows to easily configure custom DNS response for a specific domain name.", diff --git a/client/src/__locales/es.json b/client/src/__locales/es.json index a4b3292b..addaec9b 100644 --- a/client/src/__locales/es.json +++ b/client/src/__locales/es.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Para utilizar <1>DNS mediante HTTPS o <1>DNS mediante TLS, debes <0>configurar el cifrado en la configuración de AdGuard Home.", "rewrite_added": "Reescritura DNS para \"{{key}}\" añadido correctamente", "rewrite_deleted": "Reescritura DNS para \"{{key}}\" eliminado correctamente", + "rewrite_updated": "Reconfiguración de DNS actualizada correctamente", "rewrite_add": "Añadir reescritura DNS", + "rewrite_edit": "Editar reconfiguración de DNS", "rewrite_not_found": "No se han encontrado reescrituras DNS", "rewrite_confirm_delete": "¿Estás seguro de que deseas eliminar la reescritura DNS para \"{{key}}\"?", "rewrite_desc": "Permite configurar fácilmente la respuesta DNS personalizada para un nombre de dominio específico.", diff --git a/client/src/__locales/fa.json b/client/src/__locales/fa.json index 6b3adb28..4f4bf2f0 100644 --- a/client/src/__locales/fa.json +++ b/client/src/__locales/fa.json @@ -440,7 +440,9 @@ "setup_dns_notice": "به منظور استفاده از <1>DNS-over-HTTPS یا <1>DNS-over-TLS، شما نیاز به <0>پیکربندی رمزگذاری در تنظیمات AdGuard Home دارید.", "rewrite_added": "بازنویسی DNS برای \"{{key}}\" با موفقیت اضافه شد", "rewrite_deleted": "بازنویسی DNS برای \"{{key}}\" با موفقیت حذف شد", + "rewrite_updated": "بازنویسی DNS با موفقیت به روز شد", "rewrite_add": "افزودن بازنویسی DNS", + "rewrite_edit": "بازنویسی DNS را ویرایش کنید", "rewrite_not_found": "بازنویسی DNS یافت نشد", "rewrite_confirm_delete": "آیا واقعا میخواهید بازنویسی DNS برای \"{{key}}\" را حذف کنید؟", "rewrite_desc": "به آسانی اجازه پیکربندی پاسخ DNS دستی برای یک نام دامنه خاص را می دهد.", diff --git a/client/src/__locales/fi.json b/client/src/__locales/fi.json index 1a4c04d5..69272312 100644 --- a/client/src/__locales/fi.json +++ b/client/src/__locales/fi.json @@ -222,7 +222,7 @@ "all_lists_up_to_date_toast": "Kaikki listat ovat ajan tasalla", "updated_upstream_dns_toast": "Ylävirtojen palvelimet tallennettiin", "dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein", - "dns_test_not_ok_toast": "Palvelin \"{{key}}\": ei voitu käyttää, tarkista sen oikeinkirjoitus", + "dns_test_not_ok_toast": "Palvelin \"{{key}}\": Ei voitu käyttää, tarkista oikeinkirjoitus", "dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla", "unblock": "Salli", "block": "Estä", @@ -478,7 +478,9 @@ "setup_dns_notice": "<1>DNS-over-HTTPS tai <1>DNS-over-TLS -toteutuksia varten, on AdGuard Homen <0>Salausasetukset määritettävä.", "rewrite_added": "Kohteen \"{{key}}\" DNS-uudelleenohjaus lisättiin", "rewrite_deleted": "Kohteen \"{{key}}\" DNS-uudelleenohjaus poistettiin", + "rewrite_updated": "DNS-uudelleenohjaukset päivitettiin", "rewrite_add": "Lisää DNS-uudelleenohjaus", + "rewrite_edit": "Muokkaa DNS-uudelleenohjausta", "rewrite_not_found": "DNS-uudelleenohjauksia ei löytynyt", "rewrite_confirm_delete": "Haluatko varmasti poistaa DNS-uudelleenohjauksen kohteelle \"{{key}}\"?", "rewrite_desc": "Mahdollistaa oman DNS-vastauksen helpon määrityksen tietylle verkkotunnukselle.", diff --git a/client/src/__locales/fr.json b/client/src/__locales/fr.json index facc29ee..867beb17 100644 --- a/client/src/__locales/fr.json +++ b/client/src/__locales/fr.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Pour utiliser le <1>DNS-over-HTTPS ou le <1>DNS-over-TLS, vous devez <0>configurer le Chiffrement dans les paramètres de AdGuard Home.", "rewrite_added": "Réécriture DNS pour « {{key}} » ajoutée", "rewrite_deleted": "Réécriture DNS pour « {{key}} » supprimée", + "rewrite_updated": "Réécriture DNS mise à jour", "rewrite_add": "Ajouter une réécriture DNS", + "rewrite_edit": "Modifier la réécriture DNS", "rewrite_not_found": "Aucune réécriture DNS trouvée", "rewrite_confirm_delete": "Voulez-vous vraiment supprimer la réécriture DNS pour « {{key}} » ?", "rewrite_desc": "Permet de configurer facilement la réponse DNS personnalisée pour un nom de domaine spécifique.", diff --git a/client/src/__locales/hr.json b/client/src/__locales/hr.json index 6114d133..32e029d5 100644 --- a/client/src/__locales/hr.json +++ b/client/src/__locales/hr.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Da biste koristili <1>DNS-over-HTTPS ili <1>DNS-over-TLS, morate <0>postaviti šifriranje u AdGuard Home postavkama.", "rewrite_added": "DNS prijepis za \"{{key}}\" je uspješno dodan", "rewrite_deleted": "DNS prijepis za \"{{key}}\" je uspješno uklonjen", + "rewrite_updated": "Prepisivanje DNS-a uspješno ažurirano", "rewrite_add": "Dodaj DNS prijepis", + "rewrite_edit": "Uredite prepisivanje DNS-a", "rewrite_not_found": "Nema DNS prijepisa", "rewrite_confirm_delete": "Jeste li sigurni da želite ukloniti DNS prijepis za \"{{key}}\" klijenta?", "rewrite_desc": "Omogućuje jednostavno postavljanje prilagođenog DNS odgovora za određenu domenu.", diff --git a/client/src/__locales/hu.json b/client/src/__locales/hu.json index 7b885ff3..6ddc9443 100644 --- a/client/src/__locales/hu.json +++ b/client/src/__locales/hu.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Szülői felügyelet engedélyezve", "disabled_safe_search_toast": "Biztonságos keresés letiltva", "enabled_save_search_toast": "Biztonságos keresés engedélyezve", + "updated_save_search_toast": "A Biztonságos keresés beállításai frissítve", "enabled_table_header": "Engedélyezve", "name_table_header": "Név", "list_url_table_header": "Lista URL-je", @@ -290,6 +291,8 @@ "rate_limit": "Kérések korlátozása", "edns_enable": "EDNS kliens alhálózat engedélyezése", "edns_cs_desc": "Adja hozzá az EDNS Client Subnet beállítást (ECS) a felfelé irányuló kérésekhez, és naplózza a kliensek által küldött értékeket a lekérdezési naplóban.", + "edns_use_custom_ip": "Használjon egyéni IP-címet az EDNS-hez", + "edns_use_custom_ip_desc": "Engedélyezze az egyéni IP-cím használatát az EDNS-hez", "rate_limit_desc": "Maximálisan hány kérést küldhet egy kliens másodpercenkén. Ha 0-ra állítja, akkor nincs korlátozás.", "blocking_ipv4_desc": "A blokkolt A kéréshez visszaadandó IP-cím", "blocking_ipv6_desc": "A blokkolt AAAA kéréshez visszaadandó IP-cím", @@ -475,7 +478,9 @@ "setup_dns_notice": "Ahhoz, hogy a <1>DNS-over-HTTPS vagy a <1>DNS-over-TLS valamelyikét használja, muszáj <0>beállítania a titkosítást az AdGuard Home beállításaiban.", "rewrite_added": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen hozzáadva", "rewrite_deleted": "DNS átírás a(z) \"{{key}}\" kulcshoz sikeresen törölve", + "rewrite_updated": "A DNS újraírása sikeresen frissítve", "rewrite_add": "DNS átírás hozzáadása", + "rewrite_edit": "DNS újraírás szerkesztése", "rewrite_not_found": "Nem találhatók DNS átírások", "rewrite_confirm_delete": "Biztosan törölni szeretné a DNS átírást ehhez: \"{{key}}\"?", "rewrite_desc": "Lehetővé teszi, hogy egyszerűen beállítson egyéni DNS választ egy adott domain névhez.", @@ -523,6 +528,10 @@ "statistics_retention_confirm": "Biztos benne, hogy megváltoztatja a statisztika megőrzési idejét? Ha csökkentette az értéket, a megadottnál korábbi adatok elvesznek", "statistics_cleared": "A statisztikák sikeresen vissza lettek állítva", "statistics_enable": "Statisztikák engedélyezése", + "ignore_domains": "Figyelmen kívül hagyott domainek (újsorral elválasztva)", + "ignore_domains_title": "Figyelmen kívül hagyott domainek", + "ignore_domains_desc_stats": "Az ezekre a tartományokra vonatkozó lekérdezések nem kerülnek a statisztikákba", + "ignore_domains_desc_query": "Az ezekhez a tartományokhoz tartozó lekérdezések nem kerülnek a lekérdezési naplóba", "interval_hours": "{{count}} óra", "interval_hours_plural": "{{count}} óra", "filters_configuration": "Szűrők beállításai", @@ -643,5 +652,29 @@ "confirm_dns_cache_clear": "Biztos benne, hogy törölni szeretné a DNS-gyorsítótárat?", "cache_cleared": "A DNS gyorsítótár sikeresen törlődött", "clear_cache": "Gyorsítótár törlése", - "protection_section_label": "Védelem" + "make_static": "Statikussá tétel", + "theme_auto_desc": "Automatikus (az eszköz színsémájától függően)", + "theme_dark_desc": "Sötét téma", + "theme_light_desc": "Világos téma", + "disable_for_seconds": "{{count}} másodpercig", + "disable_for_seconds_plural": "{{count}} másodpercig", + "disable_for_minutes": "{{count}} percig", + "disable_for_minutes_plural": "{{count}} percig", + "disable_for_hours": "{{count}} óráig", + "disable_for_hours_plural": "{{count}} óráig", + "disable_until_tomorrow": "Holnapig", + "disable_notify_for_seconds": "Kapcsolja ki a védelmet {{count}} másodpercre", + "disable_notify_for_seconds_plural": "Kapcsolja ki a védelmet {{count}} másodpercre", + "disable_notify_for_minutes": "Kapcsolja ki a védelmet {{count}} percre", + "disable_notify_for_minutes_plural": "Kapcsolja ki a védelmet {{count}} percre", + "disable_notify_for_hours": "Kapcsolja ki a védelmet {{count}} órára", + "disable_notify_for_hours_plural": "Kapcsolja ki a védelmet {{count}} órára", + "disable_notify_until_tomorrow": "Holnapig kapcsolja ki a védelmet", + "enable_protection_timer": "A védelem {{time}}-kor aktiválódik", + "custom_retention_input": "Adja meg a megőrzést órákban", + "custom_rotation_input": "Írja be a forgatást órákban", + "protection_section_label": "Védelem", + "log_and_stats_section_label": "Lekérdezési napló és statisztikák", + "ignore_query_log": "Figyelmen kívül hagyja ezt az ügyfelet a lekérdezési naplóban", + "ignore_statistics": "Hagyja figyelmen kívül ezt az ügyfelet a statisztikákban" } diff --git a/client/src/__locales/id.json b/client/src/__locales/id.json index 390d3ba3..c83b9581 100644 --- a/client/src/__locales/id.json +++ b/client/src/__locales/id.json @@ -474,7 +474,9 @@ "setup_dns_notice": "Jikalau ingin menggunakan <1>DNS-over-HTTPS atau <1>DNS-over-TLS, Anda perlu <0>mengatur Enkripsi pada pengaturan AdGuard Home.", "rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan", "rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus", + "rewrite_updated": "Penulisan ulang DNS berhasil diperbarui", "rewrite_add": "Tambah DNS rewrite", + "rewrite_edit": "Edit penulisan ulang DNS", "rewrite_not_found": "Tidak ada DNS rewrite ditemukan", "rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?", "rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.", diff --git a/client/src/__locales/it.json b/client/src/__locales/it.json index a42dcda6..548edc03 100644 --- a/client/src/__locales/it.json +++ b/client/src/__locales/it.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Per utilizzare <1>DNS su HTTPS o <1>DNS su TLS, è necessario <0>configurare la crittografia nelle impostazioni di AdGuard Home.", "rewrite_added": "Riscrittura DNS per \"{{key}}\" aggiunta correttamente", "rewrite_deleted": "La riscrittura DNS per \"{{key}}\" è stata eliminata correttamente", + "rewrite_updated": "Riscrittura DNS aggiornata correttamente", "rewrite_add": "Aggiungi la riscrittura DNS", + "rewrite_edit": "Modifica della riscrittura DNS", "rewrite_not_found": "Nessuna riscrittura DNS trovata", "rewrite_confirm_delete": "Sei sicuro di voler cancellare la riscrittura DNS per \"{{key}}\"?", "rewrite_desc": "Consente di configurare facilmente la risposta DNS personalizzata per un nome di dominio specifico.", diff --git a/client/src/__locales/ja.json b/client/src/__locales/ja.json index 25b8942f..f90970c8 100644 --- a/client/src/__locales/ja.json +++ b/client/src/__locales/ja.json @@ -478,7 +478,9 @@ "setup_dns_notice": "<1>DNS-over-HTTPSまたは<1>DNS-over-TLSを使用するには、AdGuard Home 設定の<0>暗号化設定が必要です。", "rewrite_added": "\"{{key}}\" のDNS書き換え情報を追加完了しました", "rewrite_deleted": "\"{{key}}\" のDNS書き換え情報を削除完了しました", + "rewrite_updated": "DNS rewrite を更新完了しました。", "rewrite_add": "DNS書き換え情報を追加する", + "rewrite_edit": "DNS rewrite を編集する", "rewrite_not_found": "DNS書き換え情報はありません", "rewrite_confirm_delete": "\"{{key}}\" のDNS書き換え情報を削除してもよろしいですか?", "rewrite_desc": "特定のドメイン名に対するDNS応答を簡単にカスタマイズすることを可能にします。", diff --git a/client/src/__locales/ko.json b/client/src/__locales/ko.json index 057c1c4e..75afb44f 100644 --- a/client/src/__locales/ko.json +++ b/client/src/__locales/ko.json @@ -478,7 +478,9 @@ "setup_dns_notice": "<1>DNS-over-HTTPS 또는 <1>DNS-over-TLS를 사용하려면 AdGuard Home 설정에서 <0>암호화를 구성해야 합니다.", "rewrite_added": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 추가 됩니다", "rewrite_deleted": "'{{key}}'에 대한 DNS 수정 정보를 성공적으로 삭제 됩니다", + "rewrite_updated": "DNS 다시 쓰기 업데이트 완료", "rewrite_add": "DNS 변환 정보를 추가합니다", + "rewrite_edit": "DNS 다시 쓰기 편집", "rewrite_not_found": "DNS 변경 정보를 찾을 수 없습니다", "rewrite_confirm_delete": "'{{key}}'에 대한 DNS 변경 정보를 삭제하시겠습니까?", "rewrite_desc": "특정 도메인 이름에 대한 사용자 지정 DNS 응답을 쉽게 구성할 수 있습니다.", diff --git a/client/src/__locales/nl.json b/client/src/__locales/nl.json index 610cd9d3..6ec569be 100644 --- a/client/src/__locales/nl.json +++ b/client/src/__locales/nl.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Om <1>DNS-via-HTTPS of <1>DNS-via-TLS te gebruiken, moet je <0>Versleuteling configureren in de AdGuard Home instellingen.", "rewrite_added": "DNS-herschrijving voor \"{{key}}\" met succes toegevoegd", "rewrite_deleted": "DNS-herschrijving voor \"{{key}}\" met succes verwijderd", + "rewrite_updated": "DNS-herschrijven succesvol bijgewerkt", "rewrite_add": "DNS-herschrijving toevoegen", + "rewrite_edit": "DNS-herschrijven bewerken", "rewrite_not_found": "Geen DNS-herschrijving gevonden", "rewrite_confirm_delete": "Bent u zeker dat u DNS-herschrijving \"{{key}}\" wilt verwijderen?", "rewrite_desc": "Hiermee kunt u eenvoudig aangepaste DNS-antwoorden configureren voor een specifieke domeinnaam.", diff --git a/client/src/__locales/no.json b/client/src/__locales/no.json index 7f31ba9b..9607f208 100644 --- a/client/src/__locales/no.json +++ b/client/src/__locales/no.json @@ -457,7 +457,9 @@ "setup_dns_notice": "For å benytte <1>DNS-over-HTTPS eller <1>DNS-over-TLS, må du <0>sette opp Kryptering i AdGuard Home-innstillingene.", "rewrite_added": "DNS-omdirigeringen for «{{key}}» ble vellykket lagt til", "rewrite_deleted": "DNS-omdirigeringen for «{{key}}» ble vellykket slettet", + "rewrite_updated": "DNS-omskriving ble oppdatert", "rewrite_add": "Legg til DNS-omdirigering", + "rewrite_edit": "Rediger DNS-omskriving", "rewrite_not_found": "Ingen DNS-omdirigeringer ble funnet", "rewrite_confirm_delete": "Er du sikker på at du vil slette DNS-omdirigeringen for «{{key}}»?", "rewrite_desc": "Lar deg enkelt konfigurere selvvalgte DNS-tilbakemeldinger for et spesifikt domenenavn.", diff --git a/client/src/__locales/pl.json b/client/src/__locales/pl.json index 0ed2c077..5fb189f7 100644 --- a/client/src/__locales/pl.json +++ b/client/src/__locales/pl.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Aby skorzystać z <1>DNS-over-HTTPS lub <1>DNS-over-TLS, musisz w ustawieniach AdGuard Home <0>skonfigurować szyfrowanie.", "rewrite_added": "Pomyślnie dodano przepisanie DNS dla „{{key}}”", "rewrite_deleted": "Przepisanie DNS dla „{{key}}” zostało pomyślnie usunięte", + "rewrite_updated": "Pomyślnie zaktualizowano przepisywanie DNS", "rewrite_add": "Dodaj przepisywanie DNS", + "rewrite_edit": "Edytuj przepisywanie DNS", "rewrite_not_found": "Nie znaleziono przepisywania DNS", "rewrite_confirm_delete": "Czy na pewno chcesz usunąć przepisywanie DNS dla „{{key}}”?", "rewrite_desc": "Pozwala łatwo skonfigurować niestandardową odpowiedź DNS dla określonej nazwy domeny.", diff --git a/client/src/__locales/pt-br.json b/client/src/__locales/pt-br.json index c0650dd2..e1b7c45b 100644 --- a/client/src/__locales/pt-br.json +++ b/client/src/__locales/pt-br.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS ou <1>DNS-sobre-TLS, você precisa <0>configurar a criptografia nas configurações do AdGuard Home.", "rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso", "rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso", + "rewrite_updated": "Reconfiguração de DNS atualizada com êxito", "rewrite_add": "Adicionar reescrita de DNS", + "rewrite_edit": "Editar reconfiguração de DNS", "rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada", "rewrite_confirm_delete": "Você tem certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?", "rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.", diff --git a/client/src/__locales/pt-pt.json b/client/src/__locales/pt-pt.json index 18d2e176..48eb2845 100644 --- a/client/src/__locales/pt-pt.json +++ b/client/src/__locales/pt-pt.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS ou <1>DNS-sobre-TLS, precisa de <0>configurar a criptografia nas configurações do AdGuard Home.", "rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso", "rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso", + "rewrite_updated": "Reedição de DNS atualizada com sucesso", "rewrite_add": "Adicionar reescrita de DNS", + "rewrite_edit": "Editar reedição de DNS", "rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada", "rewrite_confirm_delete": "Tem a certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?", "rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.", diff --git a/client/src/__locales/ro.json b/client/src/__locales/ro.json index 7c31db97..955dd822 100644 --- a/client/src/__locales/ro.json +++ b/client/src/__locales/ro.json @@ -167,6 +167,7 @@ "enabled_parental_toast": "Control Parental activat", "disabled_safe_search_toast": "Căutare protejată dezactivată", "enabled_save_search_toast": "Căutare protejată activată", + "updated_save_search_toast": "Setări Căutare sigură actualizate", "enabled_table_header": "Activat", "name_table_header": "Nume", "list_url_table_header": "Lista URL", @@ -256,12 +257,12 @@ "query_log_cleared": "Jurnalul de interogare a fost șters cu succes", "query_log_updated": "Jurnalul de solicitări a fost actualizat cu succes", "query_log_clear": "Curăță jurnalele", - "query_log_retention": "Retenție jurnale interogare", + "query_log_retention": "Interogarea jurnalelor de rotație", "query_log_enable": "Activați jurnal", "query_log_configuration": "Configurația jurnalelor", "query_log_disabled": "Jurnalul de interogare este dezactivat și poate fi configurat în <0>setări", "query_log_strict_search": "Utilizați ghilimele duble pentru căutare strictă", - "query_log_retention_confirm": "Sunteți sigur că doriți să schimbați retenția jurnalului de interogare? Reducând valoarea intervalului, unele date vor fi pierdute", + "query_log_retention_confirm": "Sigur doriți să modificați rotația jurnalului de interogări? Dacă micșorați valoarea intervalului, unele date se vor pierde", "anonymize_client_ip": "Anonimizare client IP", "anonymize_client_ip_desc": "Nu salvați adresa IP completă a clientului în jurnale și statistici", "dns_config": "Configurația serverului DNS", @@ -290,6 +291,8 @@ "rate_limit": "Limita ratei", "edns_enable": "Activați subrețeaua de clienți EDNS", "edns_cs_desc": "Adaugă opțiunea EDNS Client Subnet (ECS) la solicitările în amonte și înregistrează valorile trimise de clienți în jurnalul de interogare.", + "edns_use_custom_ip": "Utilizați IP personalizat pentru EDNS", + "edns_use_custom_ip_desc": "Permiteți utilizarea IP-ului personalizat pentru EDNS", "rate_limit_desc": "Numărul de interogări pe secundă permise pe client. Setarea la 0 înseamnă că nu există limită.", "blocking_ipv4_desc": "Adresa IP de returnat pentru o cerere A de blocare", "blocking_ipv6_desc": "Adresa IP de returnat pentru o cerere AAAA de blocare", @@ -475,7 +478,9 @@ "setup_dns_notice": "Pentru a utiliza <1>DNS-over-HTTPS sau <1>DNS-over-TLS, trebuie să <0>configurați Criptarea în setările AdGuard Home.", "rewrite_added": "Rescriere DNS pentru \"{{key}}\" adăugată cu succes", "rewrite_deleted": "Rescriere DNS pentru \"{{key}}\" ștearsă cu succes", + "rewrite_updated": "DNS rescrie actualizat cu succes", "rewrite_add": "Adăugați rescriere DNS", + "rewrite_edit": "Editați rescrierea DNS", "rewrite_not_found": "Nu s-au găsit rescrieri DNS", "rewrite_confirm_delete": "Sunteți sigur că doriți să ștergeți rescrierea DNS pentru \"{{key}}\"?", "rewrite_desc": "Permite configurarea cu ușurință a răspunsului personalizat DNS pentru un nume de domeniu specific.", @@ -523,6 +528,10 @@ "statistics_retention_confirm": "Sunteți sigur că doriți să schimbați păstrarea statisticilor? Dacă reduceți valoarea intervalului, unele date vor fi pierdute", "statistics_cleared": "Statisticile au fost șterse cu succes", "statistics_enable": "Activați statisticile", + "ignore_domains": "Domenii ignorate (separate prin linie nouă)", + "ignore_domains_title": "Domenii ignorate", + "ignore_domains_desc_stats": "Interogările pentru aceste domenii nu sunt scrise în statistici", + "ignore_domains_desc_query": "Interogările pentru aceste domenii nu sunt scrise în jurnalul de interogări", "interval_hours": "{{count}} oră", "interval_hours_plural": "{{count}} ore", "filters_configuration": "Configurația filtrelor", @@ -643,5 +652,29 @@ "confirm_dns_cache_clear": "Sunteți sigur că doriți să ștergeți memoria cache DNS?", "cache_cleared": "Cache-ul DNS a fost golit cu succes", "clear_cache": "Goliți memoria cache", - "protection_section_label": "Protecție" + "make_static": "Faceți static", + "theme_auto_desc": "Auto (pe baza schemei de culori a dispozitivului dvs.)", + "theme_dark_desc": "Temă întunecată", + "theme_light_desc": "Temă luminoasă", + "disable_for_seconds": "Timp de {{count}} secundă", + "disable_for_seconds_plural": "Timp de {{count}} secunde", + "disable_for_minutes": "Timp de {{count}} minut", + "disable_for_minutes_plural": "Timp de {{count}} minute", + "disable_for_hours": "Timp de {{count}} oră", + "disable_for_hours_plural": "Timp de {{count}} ore", + "disable_until_tomorrow": "Până mâine", + "disable_notify_for_seconds": "Dezactivați protecția timp de {{count}} secundă", + "disable_notify_for_seconds_plural": "Dezactivați protecția timp de {{count}} secunde", + "disable_notify_for_minutes": "Dezactivați protecția timp de {{count}} minut", + "disable_notify_for_minutes_plural": "Dezactivați protecția timp de {{count}} minute", + "disable_notify_for_hours": "Dezactivează protecția timp de {{count}} oră", + "disable_notify_for_hours_plural": "Dezactivați protecția timp de {{count}} ore", + "disable_notify_until_tomorrow": "Dezactivează protecția până mâine", + "enable_protection_timer": "Protecția va fi activată în {{time}}", + "custom_retention_input": "Introduceți reținerea în ore", + "custom_rotation_input": "Introduceți rotația în ore", + "protection_section_label": "Protecție", + "log_and_stats_section_label": "Jurnal de interogări și statistici", + "ignore_query_log": "Ignorați acest client în jurnalul de interogări", + "ignore_statistics": "Ignorați acest client în statistici" } diff --git a/client/src/__locales/ru.json b/client/src/__locales/ru.json index 00537670..771d1100 100644 --- a/client/src/__locales/ru.json +++ b/client/src/__locales/ru.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Чтобы использовать <1>DNS-over-HTTPS или <1>DNS-over-TLS, вам нужно <0>настроить шифрование в настройках AdGuard Home.", "rewrite_added": "Правило перезаписи DNS-запросов для «{{key}}» успешно добавлено", "rewrite_deleted": "Правило перезаписи DNS-запросов для «{{key}}» успешно удалено", + "rewrite_updated": "Правило перезаписи DNS-запросов успешно обновлено", "rewrite_add": "Добавить правило перезаписи DNS-запросов", + "rewrite_edit": "Редактировать правило перезаписи DNS-запросов", "rewrite_not_found": "Не найдено правил перезаписи DNS-запросов", "rewrite_confirm_delete": "Вы уверены, что хотите удалить правило перезаписи DNS-запросов для «{{key}}»?", "rewrite_desc": "Позволяет легко настроить пользовательский DNS-ответ для определеннного домена.", diff --git a/client/src/__locales/si-lk.json b/client/src/__locales/si-lk.json index 214acf11..609e2228 100644 --- a/client/src/__locales/si-lk.json +++ b/client/src/__locales/si-lk.json @@ -153,6 +153,7 @@ "enabled_parental_toast": "දෙමාපිය පාලනය සබල කෙරිණි", "disabled_safe_search_toast": "ආරක්‍ෂිත සෙවුම අබල කෙරිණි", "enabled_save_search_toast": "ආරක්‍ෂිත සෙවුම සබල කෙරිණි", + "updated_save_search_toast": "ආරක්‍ෂිත සෙවුමේ සැකසුම් යාවත්කාල විය", "enabled_table_header": "සබලයි", "name_table_header": "නම", "list_url_table_header": "ඒ.ස.නි.(URL) ලැයිස්තුව", @@ -237,12 +238,12 @@ "query_log_cleared": "විමසුම් සටහන සාර්ථකව හිස් කර ඇත", "query_log_updated": "විමසුම් සටහන සාර්ථකව යාවත්කාල කෙරිණි", "query_log_clear": "විමසුම් සටහන් හිස් කරන්න", - "query_log_retention": "විමසුම් සටහන් රඳවා තබා ගැනීම", + "query_log_retention": "විමසුම් සටහන් රැඳවීම", "query_log_enable": "සටහන සබල කරන්න", "query_log_configuration": "සටහන් වින්‍යාසය", "query_log_disabled": "විමසුම් සටහන අබල කර ඇති අතර එය <0>සැකසුම් තුළ වින්‍යාසගත කළ හැකිය", "query_log_strict_search": "ඉතා නිවැරදිව සෙවීමට ද්විත්ව උද්ධෘතය භාවිතා කරන්න", - "query_log_retention_confirm": "විමසුම් සටහන රඳවා තබා ගැනීම වෙනස් කිරීමට ඇවැසි බව ඔබට විශ්වාසද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත", + "query_log_retention_confirm": "විමසුම් සටහන රඳවා තබා ගැනීම වෙනස් කිරීමට වුවමනා ද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත", "anonymize_client_ip": "අනුග්‍රාහකයෙහි අ.ජා.කෙ. (IP) නිර්නාමික කරන්න", "anonymize_client_ip_desc": "සටහන් සහ සංඛ්‍යාලේඛන තුළ අනුග්‍රාහකයේ පූර්ණ අ.ජා.කෙ. ලිපිනය සුරකින්න එපා", "dns_config": "ව.නා.ප. සේවාදායක වින්‍යාසය", @@ -270,6 +271,8 @@ "form_enter_rate_limit": "අනුපාත සීමාව ඇතුල් කරන්න", "rate_limit": "අනුපාත සීමාව", "edns_enable": "EDNS අනුග්‍රාහක අනුජාලය සබල කරන්න", + "edns_use_custom_ip": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. යොදාගන්න", + "edns_use_custom_ip_desc": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. භාවිතයට ඉඩදෙන්න", "rate_limit_desc": "එක් අනුග්‍රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.", "blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය", "blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය", @@ -278,6 +281,9 @@ "blocking_mode_nxdomain": "නොපවතින වසම: NXDOMAIN කේතය සමඟ ප්‍රතිචාර දක්වයි", "blocking_mode_null_ip": "අභිශූන්‍යය අ.ජා.කෙ.: ශුන්‍ය අ.ජා.කෙ. ලිපිනය සමඟ ප්‍රතිචාර දක්වයි (A සඳහා 0.0.0.0; AAAA සඳහා ::)", "blocking_mode_custom_ip": "අභිරුචි අන්තර්ජාල කෙටුම්පත: අතින් සැකසූ අ.ජා. කෙ. ලිපිනයක් සමඟ ප්‍රතිචාර දක්වයි", + "theme_auto": "ස්වයං", + "theme_light": "දීප්ත", + "theme_dark": "අඳුරු", "upstream_dns_client_desc": "ඔබ මෙම ක්ෂේත්‍රය හිස්ව තබා ගන්නේ නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් <0>ව.නා.ප. සැකසුම් හි වින්‍යාසගත කර ඇති සේවාදායක භාවිතා කරනු ඇත.", "tracker_source": "ලුහුබැඳීම් මූලාශ්‍රය", "source_label": "මූලාශ්‍රය", @@ -370,6 +376,7 @@ "encryption_issuer": "නිකුත් කරන්නා", "encryption_hostnames": "ධාරක නාම", "encryption_reset": "සංකේතාංකන සැකසුම් යළි පිහිටුවීමට අවශ්‍ය බව ඔබට විශ්වාස ද?", + "encryption_warning": "අවවාදයයි", "topline_expiring_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත්වීමට ආසන්න වී ඇත. <0>සංකේතන සැකසුම් යාවත්කාල කරන්න.", "topline_expired_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත් වී ඇත. <0>සංකේතන සැකසුම් යාවත්කාල කරන්න.", "form_error_port_range": "80-65535 පරාසය හි තොටක අගයක් ඇතුල් කරන්න", @@ -490,8 +497,10 @@ "statistics_clear": "සංඛ්‍යාලේඛන හිස් කරන්න", "statistics_clear_confirm": "සංඛ්‍යාලේඛන ඉවත් කිරීමට වුවමනා ද?", "statistics_retention_confirm": "සංඛ්‍යාලේඛන රඳවා තබා ගැනීම වෙනස් කිරීමට අවශ්‍ය බව ඔබට විශ්වාසද? ඔබ කාල පරතරයෙහි අගය අඩු කළහොත් සමහර දත්ත නැති වී යනු ඇත", - "statistics_cleared": "සංඛ්‍යාලේඛන සාර්ථකව ඉවත් කෙරිණි", + "statistics_cleared": "සංඛ්‍යාලේඛන සාර්ථකව හිස් කෙරිණි", "statistics_enable": "සංඛ්‍යාලේඛන සබල කරන්න", + "ignore_domains": "නොසලකන වසම් (පේළියකට එක බැගින්)", + "ignore_domains_title": "නොසලකන වසම්", "interval_hours": "පැය {{count}}", "interval_hours_plural": "පැය {{count}}", "filters_configuration": "පෙරහන් වින්‍යාසය", @@ -601,5 +610,31 @@ "parental_control": "දෙමාපිය පාලනය", "safe_browsing": "ආරක්‍ෂිත පිරික්සුම", "served_from_cache": "{{value}} (නිහිතයෙන් ගැනිණි)", - "form_error_password_length": "මුරපදය අවම වශයෙන් අකුරු {{value}} ක් දිගු විය යුතුමයි" + "form_error_password_length": "මුරපදය අවම වශයෙන් අකුරු {{value}} ක් දිගු විය යුතුමයි", + "cache_cleared": "ව.නා.ප. නිහිතය හිස් කෙරිණි", + "clear_cache": "නිහිතය මකන්න", + "make_static": "ස්ථිතික කරන්න", + "theme_dark_desc": "අඳුරු තේමාව", + "theme_light_desc": "දීප්ත තේමාව", + "disable_for_seconds": "තත්පර {{count}} ක්", + "disable_for_seconds_plural": "තත්පර {{count}} ක්", + "disable_for_minutes": "විනාඩි {{count}} ක්", + "disable_for_minutes_plural": "විනාඩි {{count}} ක්", + "disable_for_hours": "පැය {{count}} ක්", + "disable_for_hours_plural": "පැය {{count}} ක්", + "disable_until_tomorrow": "හෙට වනතුරු", + "disable_notify_for_seconds": "තත්. {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_for_seconds_plural": "තත්. {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_for_minutes": "විනාඩි {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_for_minutes_plural": "විනාඩි {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_for_hours": "පැය {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_for_hours_plural": "පැය {{count}} කට රැකවරණය අබල කරන්න", + "disable_notify_until_tomorrow": "හෙට වනතුරු රැකවරණය අබල කරන්න", + "enable_protection_timer": "{{time}} න් රැකවරණය සබල කෙරේ", + "custom_retention_input": "රඳවා ගැනීම පැය වලින්", + "custom_rotation_input": "රඳවා ගැනීම පැය වලින්", + "protection_section_label": "රැකවරණය", + "log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්‍යාලේඛන", + "ignore_query_log": "සටහනෙහි අනුග්‍රාහකය නොසලකන්න", + "ignore_statistics": "සංඛ්‍යාලේඛනයට අනුග්‍රාහකය නොසලකන්න" } diff --git a/client/src/__locales/sk.json b/client/src/__locales/sk.json index f2ee71ab..559007cd 100644 --- a/client/src/__locales/sk.json +++ b/client/src/__locales/sk.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Pre použitie <1>DNS-over-HTTPS alebo <1>DNS-over-TLS, potrebujete v nastaveniach AdGuard Home <0>nakonfigurovať šifrovanie.", "rewrite_added": "DNS prepísanie pre \"{{key}}\" bolo úspešne pridané", "rewrite_deleted": "DNS prepísanie pre \"{{key}}\" bolo úspešne vymazané", + "rewrite_updated": "Prepísanie DNS bolo úspešne aktualizované", "rewrite_add": "Pridať DNS prepísanie", + "rewrite_edit": "Upraviť prepísanie DNS", "rewrite_not_found": "Neboli nájdené žiadne DNS prepísania", "rewrite_confirm_delete": "Naozaj chcete odstrániť prepísanie DNS pre \"{{key}}\"?", "rewrite_desc": "Umožňuje ľahko nakonfigurovať vlastnú odpoveď DNS pre konkrétne meno domény.", diff --git a/client/src/__locales/sl.json b/client/src/__locales/sl.json index a6759019..ba821f3e 100644 --- a/client/src/__locales/sl.json +++ b/client/src/__locales/sl.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Za uporabo <1>DNS-prek-HTTPS ali <1>DNS-prek-TLS, morate <0>konfigurirati šifriranje v nastavitvah AdGuard Home.", "rewrite_added": "Uspešno je dodano DNS prepisovanje za \"{{key}}\"", "rewrite_deleted": "Uspešno je izbrisano DNS prepisovanje za \"{{key}}\"", + "rewrite_updated": "DNS prepisovanje uspešno posodobljen", "rewrite_add": "Dodaj prepisovanje DNS", + "rewrite_edit": "Urejanje prepisa DNS", "rewrite_not_found": "Ni bilo najdenih prepisovanj DNS", "rewrite_confirm_delete": "Ali ste prepričani, da želite izbrisati prepisovanje DNS za \"{{key}}\"?", "rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.", diff --git a/client/src/__locales/sr-cs.json b/client/src/__locales/sr-cs.json index a5162c4e..68eee868 100644 --- a/client/src/__locales/sr-cs.json +++ b/client/src/__locales/sr-cs.json @@ -475,7 +475,9 @@ "setup_dns_notice": "Kako biste koristili <1>DNS-over-HTTPS ili <1>DNS-over-TLS, potrebno je da <0>konfigurišete šifrovanje u AdGuard Home postavkama.", "rewrite_added": "DNS prepisivanje za \"{{key}}\" je uspešno dodato", "rewrite_deleted": "DNS prepisivanje za \"{{key}}\" uspešno izbrisano", + "rewrite_updated": "DNS ponovo napisao uspešno ažuriran", "rewrite_add": "Dodaj DNS prepisivanje", + "rewrite_edit": "Uređivanje DNS prepravke", "rewrite_not_found": "DNS prepisivanja nisu pronađena", "rewrite_confirm_delete": "Jeste li sigurni da želite da izbrišete DNS prepisivanje za \"{{key}}\"?", "rewrite_desc": "Dozvoljava da jednostavno konfigurišete prilagođeni DNS odgovor za određeni domen.", diff --git a/client/src/__locales/sv.json b/client/src/__locales/sv.json index cc004642..1c02da65 100644 --- a/client/src/__locales/sv.json +++ b/client/src/__locales/sv.json @@ -475,7 +475,9 @@ "setup_dns_notice": "För att kunna använda <1>DNS-över-HTTPS eller <1>DNS-över-TLS, behöver du <0>konfigurera Kryptering i AdGuard Home-inställningar.", "rewrite_added": "DNS-omskrivning för \"{{key}}\" lyckad", "rewrite_deleted": "DNS-omskrivning för \"{{key}}\" har tagits bort", + "rewrite_updated": "DNS-omskrivning har uppdaterats", "rewrite_add": "Lägg till DNS omskrivning", + "rewrite_edit": "Redigera DNS-omskrivning", "rewrite_not_found": "Inga DNS omskrivningar hittades", "rewrite_confirm_delete": "Är du säker på att du vill ta bort DNS-omskrivningen för \"{{key}}\"?", "rewrite_desc": "Gör det enkelt att konfigurera anpassat DNS svar för ett specifikt domännamn.", diff --git a/client/src/__locales/tr.json b/client/src/__locales/tr.json index 12611b2d..f87b2f23 100644 --- a/client/src/__locales/tr.json +++ b/client/src/__locales/tr.json @@ -478,7 +478,9 @@ "setup_dns_notice": "<1>DNS-over-HTTPS veya <1>DNS-over-TLS protokolünü kullanmak için AdGuard Home üzerinde <0>Şifreleme ayarları bölümünden ayarları yapmanız gerekir.", "rewrite_added": "\"{{key}}\" için DNS yeniden yazımı başarıyla eklendi", "rewrite_deleted": "\"{{key}}\" için DNS yeniden yazımı başarıyla silindi", + "rewrite_updated": "DNS yeniden yazma başarıyla güncellendi", "rewrite_add": "DNS yeniden yazımı ekle", + "rewrite_edit": "DNS yeniden yazmayı düzenle", "rewrite_not_found": "DNS yeniden yazımı bulunamadı", "rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?", "rewrite_desc": "Belirli bir alan adı için özel DNS yanıtını kolayca yapılandırmanızı sağlar.", diff --git a/client/src/__locales/uk.json b/client/src/__locales/uk.json index 1d1718a0..104e2476 100644 --- a/client/src/__locales/uk.json +++ b/client/src/__locales/uk.json @@ -478,7 +478,9 @@ "setup_dns_notice": "Для використання <1>DNS-over-HTTPS або <1>DNS-over-TLS, вам потрібно <0>налаштувати Шифрування в налаштуваннях AdGuard Home.", "rewrite_added": "Перезапис DNS для «{{key}}» успішно додано", "rewrite_deleted": "Перезапис DNS для «{{key}}» успішно видалено", + "rewrite_updated": "Перезапис DNS успішно оновлено", "rewrite_add": "Додати перезапис DNS", + "rewrite_edit": "Редагувати перезапис DNS", "rewrite_not_found": "Перезаписів DNS не знайдено", "rewrite_confirm_delete": "Ви впевнені, що хочете видалити перезапис DNS для «{{key}}»?", "rewrite_desc": "Дозволяє легко налаштувати власну відповідь DNS для певного доменного імені.", diff --git a/client/src/__locales/vi.json b/client/src/__locales/vi.json index 1f560612..44f8451e 100644 --- a/client/src/__locales/vi.json +++ b/client/src/__locales/vi.json @@ -1,5 +1,5 @@ { - "client_settings": "Cài đặt máy khách", + "client_settings": "Cài đặt thiết bị", "example_upstream_reserved": "ngược dòng <0>cho các miền cụ thể;", "example_upstream_comment": "một lời bình luận.", "upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến", @@ -167,6 +167,7 @@ "enabled_parental_toast": "Đã bật quản lý của phụ huynh", "disabled_safe_search_toast": "Đã tắt tìm kiếm an toàn", "enabled_save_search_toast": "Đã bật tìm kiếm an toàn", + "updated_save_search_toast": "Cài đặt Tìm kiếm an toàn đã được cập nhật", "enabled_table_header": "Kích hoạt", "name_table_header": "Tên", "list_url_table_header": "URL bộ lọc", @@ -256,12 +257,12 @@ "query_log_cleared": "Nhật ký truy vấn đã được xóa thành công", "query_log_updated": "Cập nhật thành công nhật kí truy xuất", "query_log_clear": "Xóa nhật ký truy vấn", - "query_log_retention": "Lưu giữ nhật ký truy vấn", + "query_log_retention": "Xoay vòng nhật ký truy vấn", "query_log_enable": "Bật nhật ký", "query_log_configuration": "Cấu hình nhật ký", "query_log_disabled": "Nhật ký truy vấn bị vô hiệu hóa và có thể được định cấu hình trong <0>cài đặt", "query_log_strict_search": "Sử dụng dấu ngoặc kép để tìm kiếm nghiêm ngặt", - "query_log_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ nhật ký truy vấn? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất", + "query_log_retention_confirm": "Bạn có chắc chắn muốn thay đổi xoay vòng nhật ký truy vấn không? Nếu bạn giảm giá trị khoảng thời gian, một số dữ liệu sẽ bị mất", "anonymize_client_ip": "Ẩn danh IP khách", "anonymize_client_ip_desc": "Không lưu địa chỉ IP đầy đủ của khách hàng trong nhật ký và thống kê", "dns_config": "Thiết lập máy chủ DNS", @@ -290,6 +291,8 @@ "rate_limit": "Giới hạn yêu cầu", "edns_enable": "Bật mạng con EDNS Client", "edns_cs_desc": "Thêm tùy chọn EDNS Client Subnet (ECS) vào các yêu cầu ngược dòng và ghi lại các giá trị được gửi bởi các máy khách trong nhật ký truy vấn.", + "edns_use_custom_ip": "Sử dụng địa chỉ IP tùy chỉnh cho EDNS", + "edns_use_custom_ip_desc": "Cho phép sử dụng địa chỉ IP tùy chỉnh cho EDNS", "rate_limit_desc": "Số lượng yêu cầu mỗi giây mà một khách hàng được phép thực hiện (0: không giới hạn)", "blocking_ipv4_desc": "Địa chỉ IP được trả lại cho một yêu cầu A bị chặn", "blocking_ipv6_desc": "Địa chỉ IP được trả lại cho một yêu cầu AAA bị chặn", @@ -475,7 +478,9 @@ "setup_dns_notice": "Để sử dụng <1>DNS-over-HTTPS hoặc <1>DNS-over-TLS, bạn cần <0>định cấu hình Mã hóa trong cài đặt AdGuard Home.", "rewrite_added": "DNS viết lại cho \"{{key}}\" đã thêm thành công", "rewrite_deleted": "DNS viết lại cho \"{{key}}\" đã xóa thành công", + "rewrite_updated": "Viết lại DNS được cập nhật thành công", "rewrite_add": "Thêm DNS viết lại", + "rewrite_edit": "Chỉnh sửa viết lại DNS", "rewrite_not_found": "Không tìm thấy DNS viết lại", "rewrite_confirm_delete": "Bạn có chắc chắn muốn xóa DNS viết lại cho \"{{key}}\" không?", "rewrite_desc": "Cho phép dễ dàng định cấu hình tùy chỉnh DNS phản hồi cho một tên miền cụ thể.", @@ -523,6 +528,10 @@ "statistics_retention_confirm": "Bạn có chắc chắn muốn thay đổi lưu giữ số liệu thống kê? Nếu bạn giảm giá trị khoảng, một số dữ liệu sẽ bị mất", "statistics_cleared": "Xoá thống kê thành công", "statistics_enable": "Bật thống kê", + "ignore_domains": "Các miền bị bỏ qua (cách nhau bởi dòng mới)", + "ignore_domains_title": "Các miền bị bỏ qua", + "ignore_domains_desc_stats": "Các truy vấn cho các miền này sẽ không được ghi vào thống kê", + "ignore_domains_desc_query": "Các truy vấn cho các miền này sẽ không được ghi vào nhật ký truy vấn", "interval_hours": "{{count}} giờ", "interval_hours_plural": "{{count}} giờ", "filters_configuration": "Cấu hình bộ lọc", @@ -643,5 +652,29 @@ "confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?", "cache_cleared": "Đã xóa thành công bộ đệm DNS", "clear_cache": "Xóa bộ nhớ cache", - "protection_section_label": "Sự bảo vệ" + "make_static": "Chuyển sang tĩnh", + "theme_auto_desc": "Tự động (dựa trên chủ đề màu của thiết bị của bạn)", + "theme_dark_desc": "Chủ đề tối", + "theme_light_desc": "Chủ đề sáng", + "disable_for_seconds": "Trong {{count}} giây", + "disable_for_seconds_plural": "Trong {{count}} giây", + "disable_for_minutes": "Trong {{count}} phút", + "disable_for_minutes_plural": "Trong {{count}} phút", + "disable_for_hours": "Trong {{count}} giờ", + "disable_for_hours_plural": "Trong {{count}} giờ", + "disable_until_tomorrow": "Cho đến ngày mai", + "disable_notify_for_seconds": "Tắt bảo vệ trong {{count}} giây", + "disable_notify_for_seconds_plural": "Tắt bảo vệ trong {{count}} giây", + "disable_notify_for_minutes": "Tắt bảo vệ trong {{count}} phút", + "disable_notify_for_minutes_plural": "Tắt bảo vệ trong {{count}} phút", + "disable_notify_for_hours": "Tắt bảo vệ trong {{count}} giờ", + "disable_notify_for_hours_plural": "Tắt bảo vệ trong {{count}} giờ", + "disable_notify_until_tomorrow": "Vô hiệu hóa bảo vệ cho đến ngày mai", + "enable_protection_timer": "Bảo vệ sẽ được bật trong {{time}}", + "custom_retention_input": "Nhập thời gian giữ lại theo giờ", + "custom_rotation_input": "Nhập chu kỳ theo giờ", + "protection_section_label": "Sự bảo vệ", + "log_and_stats_section_label": "Nhật ký truy vấn và thống kê", + "ignore_query_log": "Bỏ qua máy khách này trong nhật ký truy vấn", + "ignore_statistics": "Bỏ qua máy khách này trong thống kê" } diff --git a/client/src/__locales/zh-cn.json b/client/src/__locales/zh-cn.json index 5c8f2b2e..585fdd9c 100644 --- a/client/src/__locales/zh-cn.json +++ b/client/src/__locales/zh-cn.json @@ -478,7 +478,9 @@ "setup_dns_notice": "为了使用 <1>DNS-over-HTTPS 或者 <1>DNS-over-TLS ,您需要在 AdGuard Home 设置中 <0>配置加密 。", "rewrite_added": "已成功添加 \"{{key}}\" 的 DNS 重写", "rewrite_deleted": "已成功删除 \"{{key}}\" 的 DNS 重写", + "rewrite_updated": "DNS 重写已成功更新", "rewrite_add": "添加 DNS 重写", + "rewrite_edit": "编辑 DNS 重写", "rewrite_not_found": "未找到 DNS 重写", "rewrite_confirm_delete": "您确定要删除 \"{{key}}\" 的 DNS 重写?", "rewrite_desc": "可以轻松地为特定域名配置自定义 DNS 响应。", diff --git a/client/src/__locales/zh-hk.json b/client/src/__locales/zh-hk.json index 3826c8e5..91d3d9f3 100644 --- a/client/src/__locales/zh-hk.json +++ b/client/src/__locales/zh-hk.json @@ -48,6 +48,7 @@ "out_of_range_error": "必須介於 \"{{start}}\" - \"{{end}}\" 範圍之外", "lower_range_start_error": "必須小於起始值", "greater_range_start_error": "必須大於起始值", + "gateway_or_subnet_invalid": "無效子網路", "dhcp_form_gateway_input": "閘道 IP 位址", "dhcp_form_subnet_input": "子網路遮罩", "dhcp_form_range_title": "IP 位址範圍", @@ -195,6 +196,7 @@ "form_error_url_or_path_format": "列表中含有的 URL 網址或絕對路徑", "custom_filter_rules": "自訂過濾規則", "custom_filter_rules_hint": "一行一條規則。您可以使用「adblock」語法或「hosts檔案」的語法。", + "system_host_files": "系統 hosts 檔案", "examples_title": "範例", "example_meaning_filter_block": "封鎖對 example.org 網域及其所有子網域的存取", "example_meaning_filter_whitelist": "解除對 example.org 網域及其所有子網域存取封鎖", @@ -279,6 +281,8 @@ "rate_limit": "速率限制", "edns_enable": "啟用 EDNS Client Subnet", "edns_cs_desc": "傳送用戶端的子網路給 DNS 伺服器。", + "edns_use_custom_ip": "使用自訂 EDNS IP", + "edns_use_custom_ip_desc": "允許使用自訂 EDNS IP", "rate_limit_desc": "限制單一裝置每秒發出的查詢次數(設定為 0 即表示無限制)", "blocking_ipv4_desc": "回覆指定 IPv4 位址給被封鎖的網域的 A 紀錄查詢", "blocking_ipv6_desc": "回覆指定 IPv6 位址給被封鎖的網域的 AAAA 紀錄查詢", @@ -287,6 +291,9 @@ "blocking_mode_nxdomain": "NXDOMAIN:回應 NXDOMAIN 狀態碼", "blocking_mode_null_ip": "Null IP:回應零值的 IP 位址(A 紀錄回應 0.0.0.0 ,AAAA 紀錄回應 ::)", "blocking_mode_custom_ip": "自訂 IP 位址:回應一個自訂的 IP 位址", + "theme_auto": "自動", + "theme_light": "明亮", + "theme_dark": "深色", "upstream_dns_client_desc": "如果您將此欄位留白,AdGuard Home 將使用 <0>DNS 設定 內的設定的 DNS 伺服器。", "tracker_source": "追蹤器來源", "source_label": "來源", @@ -397,6 +404,7 @@ "dns_providers": "下列為常見的<0> DNS 伺服器。", "update_now": "立即更新", "update_failed": "自動更新發生錯誤。請嘗試依照以下步驟 來手動更新。", + "manual_update": "請嘗試依照下列步驟來手動更新。", "processing_update": "請稍候,AdGuard Home 正在更新", "clients_title": "用戶端", "clients_desc": "對已連接到 AdGuard Home 的裝置進行設定", @@ -505,6 +513,7 @@ "statistics_clear_confirm": "您確定要清除統計資料嗎?", "statistics_retention_confirm": "您確定要更改統計資料保存時間嗎?如果您縮短期限部分資料可能將會遺失", "statistics_cleared": "已清除統計資料", + "statistics_enable": "啟用統計數據", "interval_hours": "{{count}} 小時", "interval_hours_plural": "{{count}} 小時", "filters_configuration": "過濾器設定", @@ -613,5 +622,22 @@ "original_response": "原始回應", "click_to_view_queries": "按一下以檢視查詢結果", "port_53_faq_link": "連接埠 53 經常被「DNSStubListener」或「systemd-resolved」服務佔用。請閱讀下列有關解決<0>這個問題的說明", - "adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。" + "adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。", + "safe_browsing": "安全瀏覽", + "served_from_cache": "{{value}} (由快取回應)", + "form_error_password_length": "密碼必須至少 {{value}} 個字元長度", + "theme_dark_desc": "深色主題", + "theme_light_desc": "淺色主題", + "disable_for_seconds": "{{count}} 秒", + "disable_for_seconds_plural": "{{count}} 秒", + "disable_for_minutes": "{{count}} 分鐘", + "disable_for_minutes_plural": "{{count}} 分鐘", + "disable_for_hours": "{{count}} 小時", + "disable_for_hours_plural": "{{count}} 小時", + "disable_until_tomorrow": "直到明天", + "disable_notify_for_seconds": "暫停防護 {{count}} 秒", + "disable_notify_for_seconds_plural": "暫停防護 {{count}} 秒", + "disable_notify_for_minutes": "暫停防護 {{count}} 分鐘", + "disable_notify_for_minutes_plural": "暫停防護 {{count}} 分鐘", + "disable_notify_for_hours": "暫停防護 {{count}} 小時" } diff --git a/client/src/__locales/zh-tw.json b/client/src/__locales/zh-tw.json index 309e71c1..a22be579 100644 --- a/client/src/__locales/zh-tw.json +++ b/client/src/__locales/zh-tw.json @@ -478,7 +478,9 @@ "setup_dns_notice": "為了使用 <1>DNS-over-HTTPS 或 <1>DNS-over-TLS,您需要在 AdGuard Home 設定裡<0>配置加密。", "rewrite_added": "對於 \"{{key}}\" 之 DNS 改寫被成功地加入", "rewrite_deleted": "對於 \"{{key}}\" 之 DNS 改寫被成功地刪除", + "rewrite_updated": "DNS 重寫已成功更新", "rewrite_add": "新增 DNS 改寫", + "rewrite_edit": "編輯 DNS 重寫", "rewrite_not_found": "無已發現之 DNS 改寫", "rewrite_confirm_delete": "您確定您想要刪除對於 \"{{key}}\" 之 DNS 改寫嗎?", "rewrite_desc": "允許輕易地配置自訂的 DNS 回應供特定的域名。", diff --git a/client/src/actions/rewrites.js b/client/src/actions/rewrites.js index 638f8ab6..1fd72b5a 100644 --- a/client/src/actions/rewrites.js +++ b/client/src/actions/rewrites.js @@ -38,6 +38,29 @@ export const addRewrite = (config) => async (dispatch) => { } }; +export const updateRewriteRequest = createAction('UPDATE_REWRITE_REQUEST'); +export const updateRewriteFailure = createAction('UPDATE_REWRITE_FAILURE'); +export const updateRewriteSuccess = createAction('UPDATE_REWRITE_SUCCESS'); + +/** + * @param {Object} config + * @param {string} config.target - current DNS rewrite value + * @param {string} config.update - updated DNS rewrite value + */ +export const updateRewrite = (config) => async (dispatch) => { + dispatch(updateRewriteRequest()); + try { + await apiClient.updateRewrite(config); + dispatch(updateRewriteSuccess()); + dispatch(toggleRewritesModal()); + dispatch(getRewritesList()); + dispatch(addSuccessToast(i18next.t('rewrite_updated', { key: config.domain }))); + } catch (error) { + dispatch(addErrorToast({ error })); + dispatch(updateRewriteFailure()); + } +}; + export const deleteRewriteRequest = createAction('DELETE_REWRITE_REQUEST'); export const deleteRewriteFailure = createAction('DELETE_REWRITE_FAILURE'); export const deleteRewriteSuccess = createAction('DELETE_REWRITE_SUCCESS'); diff --git a/client/src/api/Api.js b/client/src/api/Api.js index 30c2db1d..a01c9d04 100644 --- a/client/src/api/Api.js +++ b/client/src/api/Api.js @@ -455,6 +455,8 @@ class Api { REWRITE_ADD = { path: 'rewrite/add', method: 'POST' }; + REWRITE_UPDATE = { path: 'rewrite/update', method: 'PUT' }; + REWRITE_DELETE = { path: 'rewrite/delete', method: 'POST' }; getRewritesList() { @@ -470,6 +472,14 @@ class Api { return this.makeRequest(path, method, parameters); } + updateRewrite(config) { + const { path, method } = this.REWRITE_UPDATE; + const parameters = { + data: config, + }; + return this.makeRequest(path, method, parameters); + } + deleteRewrite(config) { const { path, method } = this.REWRITE_DELETE; const parameters = { diff --git a/client/src/components/Filters/Rewrites/Form.js b/client/src/components/Filters/Rewrites/Form.js index 6ea545a0..395c0501 100644 --- a/client/src/components/Filters/Rewrites/Form.js +++ b/client/src/components/Filters/Rewrites/Form.js @@ -105,6 +105,7 @@ Form.propTypes = { submitting: PropTypes.bool.isRequired, processingAdd: PropTypes.bool.isRequired, t: PropTypes.func.isRequired, + initialValues: PropTypes.object, }; export default flow([ diff --git a/client/src/components/Filters/Rewrites/Modal.js b/client/src/components/Filters/Rewrites/Modal.js index c7f10de5..4afc138f 100644 --- a/client/src/components/Filters/Rewrites/Modal.js +++ b/client/src/components/Filters/Rewrites/Modal.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Trans, withTranslation } from 'react-i18next'; import ReactModal from 'react-modal'; +import { MODAL_TYPE } from '../../../helpers/constants'; import Form from './Form'; const Modal = (props) => { @@ -12,6 +13,8 @@ const Modal = (props) => { toggleRewritesModal, processingAdd, processingDelete, + modalType, + currentRewrite, } = props; return ( @@ -24,13 +27,18 @@ const Modal = (props) => {

- rewrite_add + {modalType === MODAL_TYPE.EDIT_REWRITE ? ( + rewrite_edit + ) : ( + rewrite_add + )}

( @@ -31,24 +32,44 @@ class Table extends Component { maxWidth: 100, sortable: false, resizable: false, - Cell: (value) => ( -
- -
- ), + Cell: (value) => { + const currentRewrite = { + answer: value.row.answer, + domain: value.row.domain, + }; + + return ( +
+ + + +
+ ); + }, }, ]; @@ -84,7 +105,9 @@ Table.propTypes = { processing: PropTypes.bool.isRequired, processingAdd: PropTypes.bool.isRequired, processingDelete: PropTypes.bool.isRequired, + processingUpdate: PropTypes.bool.isRequired, handleDelete: PropTypes.func.isRequired, + toggleRewritesModal: PropTypes.func.isRequired, }; export default withTranslation()(Table); diff --git a/client/src/components/Filters/Rewrites/index.js b/client/src/components/Filters/Rewrites/index.js index b94e20da..3d47821b 100644 --- a/client/src/components/Filters/Rewrites/index.js +++ b/client/src/components/Filters/Rewrites/index.js @@ -6,16 +6,13 @@ import Table from './Table'; import Modal from './Modal'; import Card from '../../ui/Card'; import PageTitle from '../../ui/PageTitle'; +import { MODAL_TYPE } from '../../../helpers/constants'; class Rewrites extends Component { componentDidMount() { this.props.getRewritesList(); } - handleSubmit = (values) => { - this.props.addRewrite(values); - }; - handleDelete = (values) => { // eslint-disable-next-line no-alert if (window.confirm(this.props.t('rewrite_confirm_delete', { key: values.domain }))) { @@ -23,6 +20,19 @@ class Rewrites extends Component { } }; + handleSubmit = (values) => { + const { modalType, currentRewrite } = this.props.rewrites; + + if (modalType === MODAL_TYPE.EDIT_REWRITE && currentRewrite) { + this.props.updateRewrite({ + target: currentRewrite, + update: values, + }); + } else { + this.props.addRewrite(values); + } + }; + render() { const { t, @@ -36,6 +46,9 @@ class Rewrites extends Component { processing, processingAdd, processingDelete, + processingUpdate, + modalType, + currentRewrite, } = rewrites; return ( @@ -54,13 +67,15 @@ class Rewrites extends Component { processing={processing} processingAdd={processingAdd} processingDelete={processingDelete} + processingUpdate={processingUpdate} handleDelete={this.handleDelete} + toggleRewritesModal={toggleRewritesModal} />