Compare commits

..

94 Commits

Author SHA1 Message Date
jc21
f02145c5ef Merge pull request #4925 from NginxProxyManager/develop
v2.13.4
2025-11-13 06:57:28 +10:00
jc21
adee0e39de Merge branch 'master' into develop 2025-11-12 23:02:28 +10:00
Jamie Curnow
5dde98cf3e Updates to polish locale after running through automated scripts 2025-11-12 23:01:40 +10:00
jc21
c41451618e Merge pull request #4924 from zdzichu6969/develop
Add Polish locale
2025-11-12 22:59:23 +10:00
jc21
1a3d45f6bc Merge branch 'develop' into develop 2025-11-12 22:14:28 +10:00
jc21
2ea54975b6 Merge pull request #4922 from NginxProxyManager/dodog-slovak
Add Slovak language by @dodog in #4911
2025-11-12 22:13:05 +10:00
Mateusz Gruszczyński
0373017a9f Add Polish locale 2025-11-12 13:10:29 +01:00
Jamie Curnow
2b5182d339 Add Slovak language by @dodog in #4911 2025-11-12 21:49:04 +10:00
jc21
3c5ff81a54 Merge pull request #4910 from 7heMech/develop
Add scheme back in destination
2025-11-12 20:48:56 +10:00
jc21
8aa46c1f40 Merge pull request #4921 from NginxProxyManager/Firfr-chinese
Add Chinese language 添加中文
2025-11-12 20:47:15 +10:00
Jamie Curnow
b26db50ae7 Adds cn to check locales script 2025-11-12 20:26:22 +10:00
firfe
d66bb2104a Add the new translation for "redirection-host.forward-http-code". 2025-11-12 20:23:36 +10:00
firfe
8e900dbc92 Add Chinese HelpDoc 2025-11-12 20:23:34 +10:00
firfe
66aac3eb3e Add Chinese 中文 2025-11-12 20:22:57 +10:00
jc21
221c3eddbc Merge pull request #4919 from lastsamurai26/develop
Fix: German grammatical change
2025-11-12 20:16:58 +10:00
Jamie Curnow
8460b28597 Bump version 2025-11-12 20:13:18 +10:00
Frank
0344bb3c19 fix: Grammatical change
fix: Grammatical change
2025-11-12 10:47:53 +01:00
Frank
1a36bdce76 fix: Grammatical change
fix: Grammatical change
2025-11-12 10:47:51 +01:00
Jamie Curnow
06d7db43f7 Fix Russion locale, compiled file was comitted without a source file 2025-11-12 18:59:37 +10:00
jc21
4557244744 Merge pull request #4870 from kraineff/develop
Add Russian Support
2025-11-12 18:51:43 +10:00
jc21
f649288098 Merge branch 'develop' into develop 2025-11-12 18:39:05 +10:00
jc21
28df6db52b Merge pull request #4848 from Oka-Tak/develop
Add Japanese language support and translations
2025-11-12 18:36:18 +10:00
jc21
eee749652c Merge pull request #4917 from lastsamurai26/develop
Fix: wrong translate and adding missing translations
2025-11-12 18:13:08 +10:00
jc21
f6aa25b9b3 Merge branch 'develop' into develop 2025-11-12 18:12:10 +10:00
Frank
40db26b686 Merge branch 'NginxProxyManager:develop' into develop 2025-11-12 08:06:36 +01:00
Frank
f36d4e6906 Fix: CustomCertificateModal Wrong displayname
Fix: https://github.com/NginxProxyManager/nginx-proxy-manager/issues/4912 Wrong Locale for Custom
2025-11-12 07:47:06 +01:00
Frank
86c7cbddab Add certificate renewal message in German locale
Fix: add missing translation for renew certificates
2025-11-12 07:34:44 +01:00
Frank
e52975bf6c Translate 'Renew Certificate' to German
Fix: add missing translation for renew certificates
2025-11-12 07:34:42 +01:00
Frank
ff792f76af Add translation for 'Renew Certificate' in de.json
Fix: Add missing translation für renew Certificate
2025-11-12 07:32:34 +01:00
Jamie Curnow
711f312b71 Fix up language inconsistenties 2025-11-12 16:30:22 +10:00
Jamie Curnow
9f0f89ff03 Fix wrong translation for EN 2025-11-12 15:13:14 +10:00
jc21
f3633cb696 Merge pull request #4850 from TeenBiscuits/lang-spanish
Add Spanish language support and translations
2025-11-12 15:12:28 +10:00
Pablo Portas López
8773ce25d7 Merge branch 'develop' into lang-spanish 2025-11-12 02:14:09 +01:00
jc21
c3954e9845 Merge pull request #4824 from lastsamurai26/develop
Add German Support
2025-11-12 08:52:07 +10:00
7heMech
441a7262cd Add scheme back in destination 2025-11-11 12:54:01 +00:00
Pablo Portas López
1600599410 Fix column.http-code translation 2025-11-11 13:53:45 +01:00
Pablo Portas López
74d381e7fa Add missing spanish translation 2025-11-11 13:50:23 +01:00
Frank
ba79bbc750 Update German translation for HTTP code
fix: Updated column http code
2025-11-11 08:56:32 +01:00
Frank
a7231777aa FIX: Update HTTP code message in German locale
fix: Updated column http code
2025-11-11 08:56:20 +01:00
jc21
2578105f86 Merge pull request #4907 from NginxProxyManager/develop
v2.13.3
2025-11-11 16:54:38 +10:00
Frank
3a6b221b0c Add HTTP Code translation to German locale
new: redirection-host.forward-http-code added
2025-11-11 07:13:13 +01:00
Frank
12b000abb9 Add HTTP Code message to German locale
new: redirection-host.forward-http-code added
2025-11-11 07:12:57 +01:00
jc21
39c9bbb167 Merge branch 'master' into develop
All checks were successful
Close stale issues and PRs / stale (push) Successful in 18s
2025-11-11 16:06:05 +10:00
jc21
30c2781a02 Merge pull request #4765 from mamasch19/develop
add MC-HOST24 DNS plugin
2025-11-11 16:05:32 +10:00
Jamie Curnow
53e78dcc17 Bump version 2025-11-11 16:01:06 +10:00
jc21
62092b2ddc Merge pull request #4859 from 7heMech/develop
Fix hamburger menu on mobile
2025-11-11 15:37:12 +10:00
Jamie Curnow
2c26ed8b11 Revert "Fix #4831 mobile header menu not working"
This reverts commit 4bd545c88e.
2025-11-11 15:36:46 +10:00
jc21
e3f5cd9a58 Merge pull request #4871 from prospo/develop
chore: Bump certbot-dns-leaseweb to 1.0.3
2025-11-11 15:24:11 +10:00
jc21
fba14817e7 Merge pull request #4894 from eduardpaul/feat-fix-pass_auth-template
Update _access.conf to fix access_list.pass_auth logic
2025-11-11 15:23:22 +10:00
Jamie Curnow
6825a9773b Fix #4854 Added missing forward http code for redirections 2025-11-11 15:17:43 +10:00
Jamie Curnow
8bc3078d87 Fix initial setup user bug, taking the fix from #4836 2025-11-11 14:52:39 +10:00
Jamie Curnow
8aeb2fa661 Fix #4692, #4856 - stick with auto for scheme in db, change it to $scheme when rendering 2025-11-11 14:46:25 +10:00
Jamie Curnow
4bd545c88e Fix #4831 mobile header menu not working 2025-11-11 14:05:26 +10:00
Jamie Curnow
7f0cce944d Relax the email validation in frontend 2025-11-11 08:54:48 +10:00
Pablo Portas López
7cde6ee7ca Add Spanish Test 2025-11-10 21:58:23 +01:00
Pablo Portas López
df1b414c2e Delete Spanish Test 2025-11-10 21:58:01 +01:00
Jamie Curnow
311d6a1541 Tweaks to CI stack for postgres
All checks were successful
Close stale issues and PRs / stale (push) Successful in 20s
2025-11-10 10:30:16 +10:00
mamasch19
5e7276e65b Add MC-HOST24 DNS plugin configuration
added the MC-HOST24 configuration to the new plugin file
2025-11-09 22:31:48 +01:00
Eduard Paul
2bcb942f93 Update _access.conf to ensure Authorization header remove when pass_auth = false or 0
Fixing prev commit as it's negative logic.
2025-11-09 21:02:18 +01:00
Eduard Paul
b3dac3df08 Update _access.conf to fix access_list.pass_auth logic
Wrong logic to pass auth as header: when disabled (pass_auth=0) credentials are included in Authorization header. However as soon as you enable (pass_auth=1) they are not.
2025-11-09 20:11:33 +01:00
jc21
64c5a863f8 Merge pull request #4878 from NginxProxyManager/develop
v2.13.2
2025-11-09 21:16:26 +10:00
Jamie Curnow
cd94863850 Bump version
All checks were successful
Close stale issues and PRs / stale (push) Successful in 25s
2025-11-09 20:25:10 +10:00
Emil
fd1d33444a chore: Bump certbot-dns-leaseweb to 1.0.3 2025-11-08 14:39:23 +01:00
Alexey Krainev
5aa56c63d4 Fixes & New Strings 2025-11-08 17:15:24 +05:00
Alexey Krainev
8fdb6091f3 More strings 2025-11-08 15:51:39 +05:00
Alexey Krainev
58182fcbdf Add Russian case 2025-11-08 15:08:08 +05:00
Alexey Krainev
b3b1e94b8c Add Russian Support 2025-11-08 15:02:05 +05:00
7heMech
6fa2d6a98a Fix hamburger menu on mobile 2025-11-07 19:34:43 +00:00
Jamie Curnow
3c252db46f Fixes #4844 with more defensive date parsing
All checks were successful
Close stale issues and PRs / stale (push) Successful in 23s
2025-11-07 21:37:22 +10:00
Jamie Curnow
8eba31913f Remove pebble certs, they removed the dockerhub image that had armv7 support.
The ghcr image doesn't have it, so it was causing builds to fail.
2025-11-07 11:18:53 +10:00
Jamie Curnow
e4e3415120 Safer handling of backend date formats
and add frontend testing
2025-11-07 11:15:15 +10:00
Jamie Curnow
a03bb7ebce Remove Jenkinsfile, managed in other repo now 2025-11-07 10:54:21 +10:00
Jamie Curnow
51e25d1a40 Attempt to fix race condition with database instantiation 2025-11-07 09:46:00 +10:00
Pablo Portas López
123f7d1999 Add Spanish language support and translations 2025-11-06 01:04:02 +01:00
Takahisa-Okawa
9de40f067b Add Japanese language support and translations
Co-authored-by: kz2870 <kz2870@users.noreply.github.com>
2025-11-05 22:25:15 +09:00
Frank
b21d6d9d78 Fix German translations
Fix: German translations
2025-11-05 08:09:10 +01:00
Frank
bf1ad15ed7 Update de.json
fix: typos
2025-11-05 08:08:50 +01:00
Frank
1209303a1d Update DeadHosts.md
fix: translation "Umgangssprachlich"
2025-11-05 08:00:15 +01:00
Frank
cd3a09ebf6 Update Certificates.md
fix: typo
2025-11-05 07:59:45 +01:00
Frank
d0e20d4f1b Update de.json
fix: typo dark and light mode
2025-11-05 07:57:11 +01:00
Frank
ceb098fcfe Fix typo in German locale for min character length
fix: typo mainimale should be minimale
2025-11-05 07:53:56 +01:00
Frank
639ba3a525 Update de.json
fix: typo 
fix: translate Location with Pfad
2025-11-05 07:52:28 +01:00
jc21
e88d55f1d2 Merge pull request #4839 from NginxProxyManager/develop
v2.13.1
2025-11-05 15:40:32 +10:00
Jamie Curnow
4cb85f6480 Fix #4833 supports the usual proxy env vars for outgoing admin related requests
All checks were successful
Close stale issues and PRs / stale (push) Successful in 20s
2025-11-05 15:16:42 +10:00
jc21
df7dea2d16 Merge branch 'master' into develop 2025-11-05 12:35:06 +10:00
Jamie Curnow
23f4948bde Bump version 2025-11-05 12:33:59 +10:00
Jamie Curnow
0ceb7d0892 Fix #4838 when showing avatars of deleted users 2025-11-05 12:33:13 +10:00
Jamie Curnow
f35671db21 Fix #4837 for those with older config 2025-11-05 10:56:23 +10:00
Jamie Curnow
a3a0614948 Fix #4828 showing incorrect certicificate value 2025-11-05 10:21:55 +10:00
Jamie Curnow
06b67ed4bc Remove user name column from audit log
All checks were successful
Close stale issues and PRs / stale (push) Successful in 20s
2025-11-04 14:57:10 +10:00
Jamie Curnow
4a0e27572e Fix missing translation for renew cert dialog 2025-11-04 14:54:02 +10:00
Frank
7e28d8a5d6 Add files via upload
add german
2025-11-03 17:51:48 +01:00
Frank
8991e88ff3 Update de.json 2025-11-03 14:22:13 +01:00
Frank
e2a8ffa2d3 Add files via upload
Add German
2025-11-03 14:18:08 +01:00
124 changed files with 7049 additions and 438 deletions

View File

@@ -1 +1 @@
2.13.0
2.13.4

285
Jenkinsfile vendored
View File

@@ -1,285 +0,0 @@
import groovy.transform.Field
@Field
def shOutput = ""
def buildxPushTags = ""
pipeline {
agent {
label 'docker-multiarch'
}
options {
buildDiscarder(logRotator(numToKeepStr: '5'))
disableConcurrentBuilds()
ansiColor('xterm')
}
environment {
IMAGE = 'nginx-proxy-manager'
BUILD_VERSION = getVersion()
MAJOR_VERSION = '2'
BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('\\\\', '-').replaceAll('/', '-').replaceAll('\\.', '-')}"
BUILDX_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}"
COMPOSE_INTERACTIVE_NO_CLI = 1
}
stages {
stage('Environment') {
parallel {
stage('Master') {
when {
branch 'master'
}
steps {
script {
buildxPushTags = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION} -t docker.io/jc21/${IMAGE}:latest"
}
}
}
stage('Other') {
when {
not {
branch 'master'
}
}
steps {
script {
// Defaults to the Branch name, which is applies to all branches AND pr's
buildxPushTags = "-t docker.io/nginxproxymanager/${IMAGE}-dev:${BRANCH_LOWER}"
}
}
}
stage('Versions') {
steps {
sh 'cat frontend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge frontend/package.json'
sh 'echo -e "\\E[1;36mFrontend Version is:\\E[1;33m $(cat frontend/package.json | jq -r .version)\\E[0m"'
sh 'cat backend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge backend/package.json'
sh 'echo -e "\\E[1;36mBackend Version is:\\E[1;33m $(cat backend/package.json | jq -r .version)\\E[0m"'
sh 'sed -i -E "s/(version-)[0-9]+\\.[0-9]+\\.[0-9]+(-green)/\\1${BUILD_VERSION}\\2/" README.md'
}
}
stage('Docker Login') {
steps {
withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) {
sh 'docker login -u "${duser}" -p "${dpass}"'
}
}
}
}
}
stage('Builds') {
parallel {
stage('Project') {
steps {
script {
// Frontend and Backend
def shStatusCode = sh(label: 'Checking and Building', returnStatus: true, script: '''
set -e
./scripts/ci/frontend-build > ${WORKSPACE}/tmp-sh-build 2>&1
./scripts/ci/test-and-build > ${WORKSPACE}/tmp-sh-build 2>&1
''')
shOutput = readFile "${env.WORKSPACE}/tmp-sh-build"
if (shStatusCode != 0) {
error "${shOutput}"
}
}
}
post {
always {
sh 'rm -f ${WORKSPACE}/tmp-sh-build'
}
failure {
npmGithubPrComment("CI Error:\n\n```\n${shOutput}\n```", true)
}
}
}
stage('Docs') {
steps {
dir(path: 'docs') {
sh 'yarn install'
sh 'yarn build'
}
}
}
}
}
stage('Test Sqlite') {
environment {
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_sqlite"
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.sqlite.yml'
}
when {
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
steps {
sh 'rm -rf ./test/results/junit/*'
sh './scripts/ci/fulltest-cypress'
}
post {
always {
// Dumps to analyze later
sh 'mkdir -p debug/sqlite'
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/sqlite/docker_fullstack.log 2>&1'
sh 'docker logs $(docker compose ps --all -q stepca) > debug/sqlite/docker_stepca.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns) > debug/sqlite/docker_pdns.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/sqlite/docker_pdns-db.log 2>&1'
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/sqlite/docker_dnsrouter.log 2>&1'
junit 'test/results/junit/*'
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
}
unstable {
dir(path: 'test/results') {
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
}
}
}
}
stage('Test Mysql') {
environment {
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_mysql"
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.mysql.yml'
}
when {
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
steps {
sh 'rm -rf ./test/results/junit/*'
sh './scripts/ci/fulltest-cypress'
}
post {
always {
// Dumps to analyze later
sh 'mkdir -p debug/mysql'
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/mysql/docker_fullstack.log 2>&1'
sh 'docker logs $(docker compose ps --all -q stepca) > debug/mysql/docker_stepca.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns) > debug/mysql/docker_pdns.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/mysql/docker_pdns-db.log 2>&1'
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/mysql/docker_dnsrouter.log 2>&1'
junit 'test/results/junit/*'
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
}
unstable {
dir(path: 'test/results') {
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
}
}
}
}
stage('Test Postgres') {
environment {
COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}_postgres"
COMPOSE_FILE = 'docker/docker-compose.ci.yml:docker/docker-compose.ci.postgres.yml'
}
when {
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
steps {
sh 'rm -rf ./test/results/junit/*'
sh './scripts/ci/fulltest-cypress'
}
post {
always {
// Dumps to analyze later
sh 'mkdir -p debug/postgres'
sh 'docker logs $(docker compose ps --all -q fullstack) > debug/postgres/docker_fullstack.log 2>&1'
sh 'docker logs $(docker compose ps --all -q stepca) > debug/postgres/docker_stepca.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns) > debug/postgres/docker_pdns.log 2>&1'
sh 'docker logs $(docker compose ps --all -q pdns-db) > debug/postgres/docker_pdns-db.log 2>&1'
sh 'docker logs $(docker compose ps --all -q dnsrouter) > debug/postgres/docker_dnsrouter.log 2>&1'
sh 'docker logs $(docker compose ps --all -q db-postgres) > debug/postgres/docker_db-postgres.log 2>&1'
sh 'docker logs $(docker compose ps --all -q authentik) > debug/postgres/docker_authentik.log 2>&1'
sh 'docker logs $(docker compose ps --all -q authentik-redis) > debug/postgres/docker_authentik-redis.log 2>&1'
sh 'docker logs $(docke rcompose ps --all -q authentik-ldap) > debug/postgres/docker_authentik-ldap.log 2>&1'
junit 'test/results/junit/*'
sh 'docker compose down --remove-orphans --volumes -t 30 || true'
}
unstable {
dir(path: 'test/results') {
archiveArtifacts(allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml')
}
}
}
}
stage('MultiArch Build') {
when {
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
steps {
sh "./scripts/buildx --push ${buildxPushTags}"
}
}
stage('Docs / Comment') {
parallel {
stage('Docs Job') {
when {
allOf {
branch pattern: "^(develop|master)\$", comparator: "REGEXP"
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
}
steps {
build wait: false, job: 'nginx-proxy-manager-docs', parameters: [string(name: 'docs_branch', value: "$BRANCH_NAME")]
}
}
stage('PR Comment') {
when {
allOf {
changeRequest()
not {
equals expected: 'UNSTABLE', actual: currentBuild.result
}
}
}
steps {
script {
npmGithubPrComment("""Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/nginxproxymanager/${IMAGE}-dev):
```
nginxproxymanager/${IMAGE}-dev:${BRANCH_LOWER}
```
> [!NOTE]
> Ensure you backup your NPM instance before testing this image! Especially if there are database changes.
> This is a different docker image namespace than the official image.
> [!WARNING]
> Changes and additions to DNS Providers require verification by at least 2 members of the community!
""", true)
}
}
}
}
}
}
post {
always {
sh 'echo Reverting ownership'
sh 'docker run --rm -v "$(pwd):/data" jc21/ci-tools chown -R "$(id -u):$(id -g)" /data'
printResult(true)
}
failure {
archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true)
}
unstable {
archiveArtifacts(artifacts: 'debug/**/*.*', allowEmptyArchive: true)
}
}
}
def getVersion() {
ver = sh(script: 'cat .version', returnStdout: true)
return ver.trim()
}
def getCommit() {
ver = sh(script: 'git log -n 1 --format=%h', returnStdout: true)
return ver.trim()
}

View File

@@ -1,7 +1,7 @@
<p align="center">
<img src="https://nginxproxymanager.com/github.png">
<br><br>
<img src="https://img.shields.io/badge/version-2.13.0-green.svg?style=for-the-badge">
<img src="https://img.shields.io/badge/version-2.13.4-green.svg?style=for-the-badge">
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge">
</a>

View File

@@ -370,7 +370,7 @@
"leaseweb": {
"name": "LeaseWeb",
"package_name": "certbot-dns-leaseweb",
"version": "~=1.0.1",
"version": "~=1.0.3",
"dependencies": "",
"credentials": "dns_leaseweb_api_token = 01234556789",
"full_plugin_name": "dns-leaseweb"
@@ -399,6 +399,14 @@
"credentials": "dns_luadns_email = user@example.com\ndns_luadns_token = 0123456789abcdef0123456789abcdef",
"full_plugin_name": "dns-luadns"
},
"mchost24": {
"name": "MC-HOST24",
"package_name": "certbot-dns-mchost24",
"version": "",
"dependencies": "",
"credentials": "# Obtain API token using https://github.com/JoeJoeTV/mchost24-api-python\ndns_mchost24_api_token=<insert obtained API token here>",
"full_plugin_name": "dns-mchost24"
},
"mijnhost": {
"name": "mijn.host",
"package_name": "certbot-dns-mijn-host",

View File

@@ -1,6 +1,8 @@
import knex from "knex";
import {configGet, configHas} from "./lib/config.js";
let instance = null;
const generateDbConfig = () => {
if (!configHas("database")) {
throw new Error(
@@ -30,4 +32,11 @@ const generateDbConfig = () => {
};
};
export default knex(generateDbConfig());
const getInstance = () => {
if (!instance) {
instance = knex(generateDbConfig());
}
return instance;
}
export default getInstance;

View File

@@ -4,6 +4,7 @@ import path from "path";
import archiver from "archiver";
import _ from "lodash";
import moment from "moment";
import { ProxyAgent } from "proxy-agent";
import tempWrite from "temp-write";
import dnsPlugins from "../certbot/dns-plugins.json" with { type: "json" };
import { installPlugin } from "../lib/certbot.js";
@@ -1114,6 +1115,7 @@ const internalCertificate = {
performTestForDomain: async (domain) => {
logger.info(`Testing http challenge for ${domain}`);
const agent = new ProxyAgent();
const url = `http://${domain}/.well-known/acme-challenge/test-challenge`;
const formBody = `method=G&url=${encodeURI(url)}&bodytype=T&requestbody=&headername=User-Agent&headervalue=None&locationid=1&ch=false&cc=false`;
const options = {
@@ -1123,6 +1125,7 @@ const internalCertificate = {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": Buffer.byteLength(formBody),
},
agent,
};
const result = await new Promise((resolve) => {

View File

@@ -2,6 +2,7 @@ import fs from "node:fs";
import https from "node:https";
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { ProxyAgent } from "proxy-agent";
import errs from "../lib/error.js";
import utils from "../lib/utils.js";
import { ipRanges as logger } from "../logger.js";
@@ -29,10 +30,11 @@ const internalIpRanges = {
},
fetchUrl: (url) => {
const agent = new ProxyAgent();
return new Promise((resolve, reject) => {
logger.info(`Fetching ${url}`);
return https
.get(url, (res) => {
.get(url, { agent }, (res) => {
res.setEncoding("utf8");
let raw_data = "";
res.on("data", (chunk) => {

View File

@@ -216,6 +216,11 @@ const internalNginx = {
}
}
// For redirection hosts, if the scheme is not http or https, set it to $scheme
if (nice_host_type === "redirection_host" && ['http', 'https'].indexOf(host.forward_scheme.toLowerCase()) === -1) {
host.forward_scheme = "$scheme";
}
if (host.locations) {
//logger.info ('host.locations = ' + JSON.stringify(host.locations, null, 2));
origLocations = [].concat(host.locations);

View File

@@ -25,6 +25,12 @@ const configure = () => {
if (configData?.database) {
logger.info(`Using configuration from file: ${filename}`);
// Migrate those who have "mysql" engine to "mysql2"
if (configData.database.engine === "mysql") {
configData.database.engine = mysqlEngine;
}
instance = configData;
instance.keys = getKeys();
return;

View File

@@ -2,9 +2,9 @@ import db from "./db.js";
import { migrate as logger } from "./logger.js";
const migrateUp = async () => {
const version = await db.migrate.currentVersion();
const version = await db().migrate.currentVersion();
logger.info("Current database version:", version);
return await db.migrate.latest({
return await db().migrate.latest({
tableName: "migrations",
directory: "migrations",
});

View File

@@ -0,0 +1,50 @@
import { migrate as logger } from "../logger.js";
const migrateName = "redirect_auto_scheme";
/**
* Migrate
*
* @see http://knexjs.org/#Schema
*
* @param {Object} knex
* @returns {Promise}
*/
const up = (knex) => {
logger.info(`[${migrateName}] Migrating Up...`);
return knex.schema
.table("redirection_host", async (table) => {
// change the column default from $scheme to auto
await table.string("forward_scheme").notNull().defaultTo("auto").alter();
await knex('redirection_host')
.where('forward_scheme', '$scheme')
.update({ forward_scheme: 'auto' });
})
.then(() => {
logger.info(`[${migrateName}] redirection_host Table altered`);
});
};
/**
* Undo Migrate
*
* @param {Object} knex
* @returns {Promise}
*/
const down = (knex) => {
logger.info(`[${migrateName}] Migrating Down...`);
return knex.schema
.table("redirection_host", async (table) => {
await table.string("forward_scheme").notNull().defaultTo("$scheme").alter();
await knex('redirection_host')
.where('forward_scheme', 'auto')
.update({ forward_scheme: '$scheme' });
})
.then(() => {
logger.info(`[${migrateName}] redirection_host Table altered`);
});
};
export { up, down };

View File

@@ -10,7 +10,7 @@ import now from "./now_helper.js";
import ProxyHostModel from "./proxy_host.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted", "satisfy_any", "pass_auth"];

View File

@@ -6,7 +6,7 @@ import db from "../db.js";
import accessListModel from "./access_list.js";
import now from "./now_helper.js";
Model.knex(db);
Model.knex(db());
class AccessListAuth extends Model {
$beforeInsert() {

View File

@@ -6,7 +6,7 @@ import db from "../db.js";
import accessListModel from "./access_list.js";
import now from "./now_helper.js";
Model.knex(db);
Model.knex(db());
class AccessListClient extends Model {
$beforeInsert() {

View File

@@ -6,7 +6,7 @@ import db from "../db.js";
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
class AuditLog extends Model {
$beforeInsert() {

View File

@@ -8,7 +8,7 @@ import { convertBoolFieldsToInt, convertIntFieldsToBool } from "../lib/helpers.j
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted"];

View File

@@ -11,7 +11,7 @@ import redirectionHostModel from "./redirection_host.js";
import streamModel from "./stream.js";
import userModel from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted"];

View File

@@ -8,7 +8,7 @@ import Certificate from "./certificate.js";
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted", "ssl_forced", "http2_support", "enabled", "hsts_enabled", "hsts_subdomains"];

View File

@@ -2,7 +2,7 @@ import { Model } from "objection";
import db from "../db.js";
import { isSqlite } from "../lib/config.js";
Model.knex(db);
Model.knex(db());
export default () => {
if (isSqlite()) {

View File

@@ -9,7 +9,7 @@ import Certificate from "./certificate.js";
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = [
"is_deleted",

View File

@@ -8,7 +8,7 @@ import Certificate from "./certificate.js";
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = [
"is_deleted",

View File

@@ -4,7 +4,7 @@
import { Model } from "objection";
import db from "../db.js";
Model.knex(db);
Model.knex(db());
class Setting extends Model {
$beforeInsert () {

View File

@@ -5,7 +5,7 @@ import Certificate from "./certificate.js";
import now from "./now_helper.js";
import User from "./user.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted", "enabled", "tcp_forwarding", "udp_forwarding"];

View File

@@ -7,7 +7,7 @@ import { convertBoolFieldsToInt, convertIntFieldsToBool } from "../lib/helpers.j
import now from "./now_helper.js";
import UserPermission from "./user_permission.js";
Model.knex(db);
Model.knex(db());
const boolFields = ["is_deleted", "is_disabled"];

View File

@@ -5,7 +5,7 @@ import { Model } from "objection";
import db from "../db.js";
import now from "./now_helper.js";
Model.knex(db);
Model.knex(db());
class UserPermission extends Model {
$beforeInsert () {

View File

@@ -32,6 +32,7 @@
"objection": "3.0.1",
"path": "^0.12.7",
"pg": "^8.16.3",
"proxy-agent": "^6.5.0",
"signale": "1.4.0",
"sqlite3": "^5.1.7",
"temp-write": "^4.0.0"

View File

@@ -37,7 +37,7 @@ const setupDefaultUser = async () => {
const data = {
is_deleted: 0,
email: email,
email: initialAdminEmail,
name: "Administrator",
nickname: "Admin",
avatar: "",
@@ -53,7 +53,7 @@ const setupDefaultUser = async () => {
.insert({
user_id: user.id,
type: "password",
secret: password,
secret: initialAdminPassword,
meta: {},
});

View File

@@ -4,7 +4,7 @@
auth_basic "Authorization required";
auth_basic_user_file /data/access/{{ access_list_id }};
{% if access_list.pass_auth == 0 or access_list.pass_auth == true %}
{% if access_list.pass_auth == 0 or access_list.pass_auth == false %}
proxy_set_header Authorization "";
{% endif %}

View File

@@ -143,6 +143,11 @@
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@tootallnate/quickjs-emscripten@^0.23.0":
version "0.23.0"
resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c"
integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
"@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
@@ -168,6 +173,11 @@ agent-base@6, agent-base@^6.0.2:
dependencies:
debug "4"
agent-base@^7.1.0, agent-base@^7.1.2:
version "7.1.4"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
agentkeepalive@^4.1.3:
version "4.6.0"
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a"
@@ -308,6 +318,13 @@ asn1@^0.2.4:
dependencies:
safer-buffer "~2.1.0"
ast-types@^0.13.4:
version "0.13.4"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
dependencies:
tslib "^2.0.1"
async@^3.2.4:
version "3.2.6"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
@@ -328,6 +345,11 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
basic-ftp@^5.0.2:
version "5.0.5"
resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0"
integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==
batchflow@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/batchflow/-/batchflow-0.4.0.tgz#7d419df79b6b7587b06f9ea34f96ccef6f74e5b5"
@@ -667,6 +689,11 @@ crc32-stream@^4.0.2:
crc-32 "^1.2.0"
readable-stream "^3.4.0"
data-uri-to-buffer@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b"
integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==
db-errors@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2"
@@ -700,6 +727,13 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.3.4:
version "4.4.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
dependencies:
ms "^2.1.3"
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -717,6 +751,15 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
degenerator@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5"
integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==
dependencies:
ast-types "^0.13.4"
escodegen "^2.1.0"
esprima "^4.0.1"
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -846,11 +889,37 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escodegen@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
dependencies:
esprima "^4.0.1"
estraverse "^5.2.0"
esutils "^2.0.2"
optionalDependencies:
source-map "~0.6.1"
esm@^3.2.25:
version "3.2.25"
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
estraverse@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
@@ -1069,6 +1138,15 @@ get-proto@^1.0.1:
dunder-proto "^1.0.1"
es-object-atoms "^1.0.0"
get-uri@^6.0.1:
version "6.0.5"
resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16"
integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==
dependencies:
basic-ftp "^5.0.2"
data-uri-to-buffer "^6.0.2"
debug "^4.3.4"
getopts@2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
@@ -1170,6 +1248,14 @@ http-proxy-agent@^4.0.1:
agent-base "6"
debug "4"
http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1:
version "7.0.2"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
dependencies:
agent-base "^7.1.0"
debug "^4.3.4"
https-proxy-agent@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
@@ -1178,6 +1264,14 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
https-proxy-agent@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9"
integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
dependencies:
agent-base "^7.1.2"
debug "4"
humanize-ms@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
@@ -1747,6 +1841,11 @@ negotiator@^0.6.2, negotiator@~0.6.4:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
netmask@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
node-abi@^3.3.0:
version "3.78.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.78.0.tgz#fd0ecbd0aa89857b98da06bd3909194abb0821ba"
@@ -1924,6 +2023,28 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
pac-proxy-agent@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df"
integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==
dependencies:
"@tootallnate/quickjs-emscripten" "^0.23.0"
agent-base "^7.1.2"
debug "^4.3.4"
get-uri "^6.0.1"
http-proxy-agent "^7.0.0"
https-proxy-agent "^7.0.6"
pac-resolver "^7.0.1"
socks-proxy-agent "^8.0.5"
pac-resolver@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6"
integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
dependencies:
degenerator "^5.0.0"
netmask "^2.0.2"
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
@@ -2120,6 +2241,25 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
proxy-agent@^6.5.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d"
integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==
dependencies:
agent-base "^7.1.2"
debug "^4.3.4"
http-proxy-agent "^7.0.1"
https-proxy-agent "^7.0.6"
lru-cache "^7.14.1"
pac-proxy-agent "^7.1.0"
proxy-from-env "^1.1.0"
socks-proxy-agent "^8.0.5"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
pstree.remy@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
@@ -2422,7 +2562,16 @@ socks-proxy-agent@^6.0.0:
debug "^4.3.3"
socks "^2.6.2"
socks@^2.6.2:
socks-proxy-agent@^8.0.5:
version "8.0.5"
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee"
integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==
dependencies:
agent-base "^7.1.2"
debug "^4.3.4"
socks "^2.8.3"
socks@^2.6.2, socks@^2.8.3:
version "2.8.7"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea"
integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==
@@ -2430,6 +2579,11 @@ socks@^2.6.2:
ip-address "^10.0.1"
smart-buffer "^4.2.0"
source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
split2@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
@@ -2609,6 +2763,11 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
tslib@^2.0.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"

View File

@@ -4,7 +4,6 @@
# This file assumes that the frontend has been built using ./scripts/frontend-build
FROM nginxproxymanager/testca AS testca
FROM letsencrypt/pebble AS pebbleca
FROM nginxproxymanager/nginx-full:certbot-node
ARG TARGETPLATFORM
@@ -46,7 +45,6 @@ RUN yarn install \
# add late to limit cache-busting by modifications
COPY docker/rootfs /
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
# Remove frontend service not required for prod, dev nginx config as well

View File

@@ -1,6 +1,6 @@
AUTHENTIK_SECRET_KEY=gl8woZe8L6IIX8SC0c5Ocsj0xPkX5uJo5DVZCFl+L/QGbzuplfutYuua2ODNLEiDD3aFd9H2ylJmrke0
AUTHENTIK_REDIS__HOST=authentik-redis
AUTHENTIK_POSTGRESQL__HOST=db-postgres
AUTHENTIK_POSTGRESQL__HOST=pgdb.internal
AUTHENTIK_POSTGRESQL__USER=authentik
AUTHENTIK_POSTGRESQL__NAME=authentik
AUTHENTIK_POSTGRESQL__PASSWORD=07EKS5NLI6Tpv68tbdvrxfvj

View File

@@ -1,5 +1,4 @@
FROM nginxproxymanager/testca AS testca
FROM letsencrypt/pebble AS pebbleca
FROM nginxproxymanager/nginx-full:certbot-node
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
@@ -33,7 +32,6 @@ RUN rm -f /etc/nginx/conf.d/production.conf \
&& chmod 644 -R /root/.cache
# Certs for testing purposes
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
EXPOSE 80 81 443

View File

@@ -1,12 +0,0 @@
{
"pebble": {
"listenAddress": "0.0.0.0:443",
"managementListenAddress": "0.0.0.0:15000",
"certificate": "test/certs/localhost/cert.pem",
"privateKey": "test/certs/localhost/key.pem",
"httpPort": 80,
"tlsPort": 443,
"ocspResponderURL": "",
"externalAccountBindingRequired": false
}
}

View File

@@ -6,7 +6,7 @@ services:
fullstack:
environment:
DB_POSTGRES_HOST: "db-postgres"
DB_POSTGRES_HOST: "pgdb.internal"
DB_POSTGRES_PORT: "5432"
DB_POSTGRES_USER: "npm"
DB_POSTGRES_PASSWORD: "npmpass"
@@ -27,7 +27,9 @@ services:
- psql_vol:/var/lib/postgresql/data
- ./ci/postgres:/docker-entrypoint-initdb.d
networks:
- fulltest
fulltest:
aliases:
- pgdb.internal
authentik-redis:
image: "redis:alpine"
@@ -41,6 +43,8 @@ services:
timeout: 3s
volumes:
- redis_vol:/data
networks:
- fulltest
authentik:
image: ghcr.io/goauthentik/server:2024.10.1
@@ -51,6 +55,8 @@ services:
depends_on:
- authentik-redis
- db-postgres
networks:
- fulltest
authentik-worker:
image: ghcr.io/goauthentik/server:2024.10.1
@@ -61,6 +67,8 @@ services:
depends_on:
- authentik-redis
- db-postgres
networks:
- fulltest
authentik-ldap:
image: ghcr.io/goauthentik/ldap:2024.10.1
@@ -71,6 +79,8 @@ services:
restart: unless-stopped
depends_on:
- authentik
networks:
- fulltest
volumes:
psql_vol:

View File

@@ -3,31 +3,30 @@
# This is a base compose file, it should be extended with a
# docker-compose.ci.*.yml file
services:
fullstack:
image: "${IMAGE}:${BRANCH_LOWER}-ci-${BUILD_NUMBER}"
environment:
TZ: "${TZ:-Australia/Brisbane}"
DEBUG: 'true'
CI: 'true'
DEBUG: "true"
CI: "true"
FORCE_COLOR: 1
# Required for DNS Certificate provisioning in CI
LE_SERVER: 'https://ca.internal/acme/acme/directory'
REQUESTS_CA_BUNDLE: '/etc/ssl/certs/NginxProxyManager.crt'
LE_SERVER: "https://ca.internal/acme/acme/directory"
REQUESTS_CA_BUNDLE: "/etc/ssl/certs/NginxProxyManager.crt"
volumes:
- 'npm_data_ci:/data'
- 'npm_le_ci:/etc/letsencrypt'
- './dev/letsencrypt.ini:/etc/letsencrypt.ini:ro'
- './dev/resolv.conf:/etc/resolv.conf:ro'
- '/etc/localtime:/etc/localtime:ro'
- "npm_data_ci:/data"
- "npm_le_ci:/etc/letsencrypt"
- "./dev/letsencrypt.ini:/etc/letsencrypt.ini:ro"
- "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro"
healthcheck:
test: ["CMD", "/usr/bin/check-health"]
interval: 10s
timeout: 3s
expose:
- '80-81/tcp'
- '443/tcp'
- '1500-1503/tcp'
- "80-81/tcp"
- "443/tcp"
- "1500-1503/tcp"
networks:
fulltest:
aliases:
@@ -38,8 +37,8 @@ services:
stepca:
image: jc21/testca
volumes:
- './dev/resolv.conf:/etc/resolv.conf:ro'
- '/etc/localtime:/etc/localtime:ro'
- "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro"
networks:
fulltest:
aliases:
@@ -48,18 +47,18 @@ services:
pdns:
image: pschiffe/pdns-mysql:4.8
volumes:
- '/etc/localtime:/etc/localtime:ro'
- "/etc/localtime:/etc/localtime:ro"
environment:
PDNS_master: 'yes'
PDNS_api: 'yes'
PDNS_api_key: 'npm'
PDNS_webserver: 'yes'
PDNS_webserver_address: '0.0.0.0'
PDNS_webserver_password: 'npm'
PDNS_webserver-allow-from: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
PDNS_version_string: 'anonymous'
PDNS_master: "yes"
PDNS_api: "yes"
PDNS_api_key: "npm"
PDNS_webserver: "yes"
PDNS_webserver_address: "0.0.0.0"
PDNS_webserver_password: "npm"
PDNS_webserver-allow-from: "127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8"
PDNS_version_string: "anonymous"
PDNS_default_ttl: 1500
PDNS_allow_axfr_ips: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
PDNS_allow_axfr_ips: "127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8"
PDNS_gmysql_host: pdns-db
PDNS_gmysql_port: 3306
PDNS_gmysql_user: pdns
@@ -76,14 +75,14 @@ services:
pdns-db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: 'pdns'
MYSQL_DATABASE: 'pdns'
MYSQL_USER: 'pdns'
MYSQL_PASSWORD: 'pdns'
MYSQL_ROOT_PASSWORD: "pdns"
MYSQL_DATABASE: "pdns"
MYSQL_USER: "pdns"
MYSQL_PASSWORD: "pdns"
volumes:
- 'pdns_mysql_vol:/var/lib/mysql'
- '/etc/localtime:/etc/localtime:ro'
- './dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro'
- "pdns_mysql_vol:/var/lib/mysql"
- "/etc/localtime:/etc/localtime:ro"
- "./dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro"
networks:
- fulltest
@@ -100,12 +99,12 @@ services:
context: ../
dockerfile: test/cypress/Dockerfile
environment:
HTTP_PROXY: 'squid:3128'
HTTPS_PROXY: 'squid:3128'
HTTP_PROXY: "squid:3128"
HTTPS_PROXY: "squid:3128"
volumes:
- 'cypress_logs:/test/results'
- './dev/resolv.conf:/etc/resolv.conf:ro'
- '/etc/localtime:/etc/localtime:ro'
- "cypress_logs:/test/results"
- "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro"
command: cypress run --browser chrome --config-file=cypress/config/ci.js
networks:
- fulltest
@@ -113,9 +112,9 @@ services:
squid:
image: ubuntu/squid
volumes:
- './dev/squid.conf:/etc/squid/squid.conf:ro'
- './dev/resolv.conf:/etc/resolv.conf:ro'
- '/etc/localtime:/etc/localtime:ro'
- "./dev/squid.conf:/etc/squid/squid.conf:ro"
- "./dev/resolv.conf:/etc/resolv.conf:ro"
- "/etc/localtime:/etc/localtime:ro"
networks:
- fulltest

View File

@@ -32,7 +32,7 @@ services:
# DB_MYSQL_PASSWORD: 'npm'
# DB_MYSQL_NAME: 'npm'
# db-postgres:
DB_POSTGRES_HOST: "db-postgres"
DB_POSTGRES_HOST: "pgdb.internal"
DB_POSTGRES_PORT: "5432"
DB_POSTGRES_USER: "npm"
DB_POSTGRES_PASSWORD: "npmpass"
@@ -81,8 +81,6 @@ services:
db-postgres:
image: postgres:17
container_name: npm2dev.db-postgres
networks:
- nginx_proxy_manager
environment:
POSTGRES_USER: "npm"
POSTGRES_PASSWORD: "npmpass"
@@ -90,6 +88,10 @@ services:
volumes:
- psql_data:/var/lib/postgresql/data
- ./ci/postgres:/docker-entrypoint-initdb.d
networks:
nginx_proxy_manager:
aliases:
- pgdb.internal
stepca:
image: jc21/testca

View File

@@ -8,7 +8,12 @@
const allLocales = [
["en", "en-US"],
["fa", "fa-IR"],
["es", "es-ES"],
["de", "de-DE"],
["ru", "ru-RU"],
["sk", "sk-SK"],
["zh", "zh-CN"],
["pl", "pl-PL"],
];
const ignoreUnused = [

View File

@@ -4,7 +4,7 @@ import type { ReactNode } from "react";
import Select, { type ActionMeta, components, type OptionProps } from "react-select";
import type { AccessList } from "src/api/backend";
import { useAccessLists } from "src/hooks";
import { DateTimeFormat, intl, T } from "src/locale";
import { formatDateTime, intl, T } from "src/locale";
interface AccessOption {
readonly value: number;
@@ -48,7 +48,7 @@ export function AccessField({ name = "accessListId", label = "access-list", id =
{
users: item?.items?.length,
rules: item?.clients?.length,
date: item?.createdOn ? DateTimeFormat(item?.createdOn) : "N/A",
date: item?.createdOn ? formatDateTime(item?.createdOn) : "N/A",
},
),
icon: <IconLock size={14} className="text-lime" />,

View File

@@ -3,7 +3,7 @@ import { Field, useFormikContext } from "formik";
import Select, { type ActionMeta, components, type OptionProps } from "react-select";
import type { Certificate } from "src/api/backend";
import { useCertificates } from "src/hooks";
import { DateTimeFormat, intl, T } from "src/locale";
import { formatDateTime, intl, T } from "src/locale";
interface CertOption {
readonly value: number | "new";
@@ -75,7 +75,7 @@ export function SSLCertificateField({
data?.map((cert: Certificate) => ({
value: cert.id,
label: cert.niceName,
subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} &mdash; ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? DateTimeFormat(cert.expiresOn) : "N/A" })}`,
subLabel: `${cert.provider === "letsencrypt" ? intl.formatMessage({ id: "lets-encrypt" }) : cert.provider} ${intl.formatMessage({ id: "expires.on" }, { date: cert.expiresOn ? formatDateTime(cert.expiresOn) : "N/A" })}`,
icon: <IconShield size={14} className="text-pink" />,
})) || [];

View File

@@ -190,7 +190,7 @@ export function SiteMenu() {
return (
<header className="navbar-expand-md">
<div className="collapse navbar-collapse">
<div className="collapse navbar-collapse" id="navbar-menu">
<div className="navbar">
<div className="container-xl">
<div className="row flex-column flex-md-row flex-fill align-items-center">

View File

@@ -5,5 +5,14 @@ interface Props {
certificate?: Certificate;
}
export function CertificateFormatter({ certificate }: Props) {
return <T id={certificate ? "lets-encrypt" : "http-only"} />;
let translation = "http-only";
if (certificate) {
translation = certificate.provider;
if (translation === "letsencrypt") {
translation = "lets-encrypt";
} else if (translation === "other") {
translation = "certificates.custom";
}
}
return <T id={translation} />;
}

View File

@@ -1,6 +1,6 @@
import cn from "classnames";
import { differenceInDays, isPast, parseISO } from "date-fns";
import { DateTimeFormat } from "src/locale";
import { differenceInDays, isPast } from "date-fns";
import { formatDateTime, parseDate } from "src/locale";
interface Props {
value: string;
@@ -8,11 +8,12 @@ interface Props {
highlistNearlyExpired?: boolean;
}
export function DateFormatter({ value, highlightPast, highlistNearlyExpired }: Props) {
const dateIsPast = isPast(parseISO(value));
const days = differenceInDays(parseISO(value), new Date());
const d = parseDate(value);
const dateIsPast = d ? isPast(d) : false;
const days = d ? differenceInDays(d, new Date()) : 0;
const cl = cn({
"text-danger": highlightPast && dateIsPast,
"text-warning": highlistNearlyExpired && !dateIsPast && days <= 30 && days >= 0,
});
return <span className={cl}>{DateTimeFormat(value)}</span>;
return <span className={cl}>{formatDateTime(value)}</span>;
}

View File

@@ -1,6 +1,6 @@
import cn from "classnames";
import type { ReactNode } from "react";
import { DateTimeFormat, T } from "src/locale";
import { formatDateTime, T } from "src/locale";
interface Props {
domains: string[];
@@ -53,7 +53,7 @@ export function DomainsFormatter({ domains, createdOn, niceName, provider, color
<div className="font-weight-medium">{...elms}</div>
{createdOn ? (
<div className="text-secondary mt-1">
<T id="created-on" data={{ date: DateTimeFormat(createdOn) }} />
<T id="created-on" data={{ date: formatDateTime(createdOn) }} />
</div>
) : null}
</div>

View File

@@ -1,7 +1,7 @@
import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconShield, IconUser } from "@tabler/icons-react";
import cn from "classnames";
import type { AuditLog } from "src/api/backend";
import { DateTimeFormat, T } from "src/locale";
import { formatDateTime, T } from "src/locale";
const getEventValue = (event: AuditLog) => {
switch (event.objectType) {
@@ -73,7 +73,7 @@ export function EventFormatter({ row }: Props) {
<T id={`object.event.${row.action}`} tData={{ object: row.objectType }} />
&nbsp; &mdash; <span className="badge">{getEventValue(row)}</span>
</div>
<div className="text-secondary mt-1">{DateTimeFormat(row.createdOn)}</div>
<div className="text-secondary mt-1">{formatDateTime(row.createdOn)}</div>
</div>
);
}

View File

@@ -1,5 +1,7 @@
const defaultImg = "/images/default-avatar.jpg";
interface Props {
url: string;
url?: string;
name?: string;
}
export function GravatarFormatter({ url, name }: Props) {
@@ -9,7 +11,7 @@ export function GravatarFormatter({ url, name }: Props) {
title={name}
className="avatar avatar-2 me-2"
style={{
backgroundImage: `url(${url})`,
backgroundImage: `url(${url || defaultImg})`,
}}
/>
</div>

View File

@@ -1,4 +1,4 @@
import { DateTimeFormat, T } from "src/locale";
import { formatDateTime, T } from "src/locale";
interface Props {
value: string;
@@ -13,7 +13,7 @@ export function ValueWithDateFormatter({ value, createdOn, disabled }: Props) {
</div>
{createdOn ? (
<div className={`text-secondary mt-1 ${disabled ? "text-red" : ""}`}>
<T id={disabled ? "disabled" : "created-on"} data={{ date: DateTimeFormat(createdOn) }} />
<T id={disabled ? "disabled" : "created-on"} data={{ date: formatDateTime(createdOn) }} />
</div>
) : null}
</div>

View File

@@ -1,15 +0,0 @@
import { intlFormat, parseISO } from "date-fns";
const DateTimeFormat = (isoDate: string) =>
intlFormat(parseISO(isoDate), {
weekday: "long",
year: "numeric",
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "numeric",
second: "numeric",
hour12: true,
});
export { DateTimeFormat };

57
frontend/src/locale/IntlProvider.tsx Normal file → Executable file
View File

@@ -1,15 +1,45 @@
import { createIntl, createIntlCache } from "react-intl";
import langDe from "./lang/de.json";
import langEn from "./lang/en.json";
import langEs from "./lang/es.json";
import langJa from "./lang/ja.json";
import langList from "./lang/lang-list.json";
import langRu from "./lang/ru.json";
import langSk from "./lang/sk.json";
import langZh from "./lang/zh.json";
import langPl from "./lang/pl.json";
// first item of each array should be the language code,
// not the country code
// Remember when adding to this list, also update check-locales.js script
const localeOptions = [["en", "en-US"]];
const localeOptions = [
["en", "en-US"],
["de", "de-DE"],
["es", "es-ES"],
["ja", "ja-JP"],
["ru", "ru-RU"],
["sk", "sk-SK"],
["zh", "zh-CN"],
["pl", "pl-PL"],
];
const loadMessages = (locale?: string): typeof langList & typeof langEn => {
const thisLocale = locale || "en";
switch (thisLocale.slice(0, 2)) {
case "de":
return Object.assign({}, langList, langEn, langDe);
case "es":
return Object.assign({}, langList, langEn, langEs);
case "ja":
return Object.assign({}, langList, langEn, langJa);
case "ru":
return Object.assign({}, langList, langEn, langRu);
case "sk":
return Object.assign({}, langList, langEn, langSk);
case "zh":
return Object.assign({}, langList, langEn, langZh);
case "pl":
return Object.assign({}, langList, langEn, langPl);
default:
return Object.assign({}, langList, langEn);
}
@@ -17,6 +47,27 @@ const loadMessages = (locale?: string): typeof langList & typeof langEn => {
const getFlagCodeForLocale = (locale?: string) => {
switch (locale) {
case "es-ES":
case "es":
return "ES";
case "de-DE":
case "de":
return "DE";
case "ja-JP":
case "ja":
return "JP";
case "ru-RU":
case "ru":
return "RU";
case "sk-SK":
case "sk":
return "SK";
case "zh":
case "zh-CN":
return "CN";
case "pl":
case "pl-PL":
return "PL";
default:
return "EN";
}
@@ -30,6 +81,10 @@ const getLocale = (short = false) => {
if (short) {
return loc.slice(0, 2);
}
// finally, fallback
if (!loc) {
loc = "en";
}
return loc;
};

View File

@@ -0,0 +1,74 @@
import { formatDateTime } from "src/locale";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
describe("DateFormatter", () => {
// Keep a reference to the real Intl to restore later
const RealIntl = global.Intl;
const desiredTimeZone = "Europe/London";
const desiredLocale = "en-GB";
beforeAll(() => {
// Ensure Node-based libs using TZ behave deterministically
try {
process.env.TZ = desiredTimeZone;
} catch {
// ignore if not available
}
// Mock Intl.DateTimeFormat so formatting is stable regardless of host
const MockedDateTimeFormat = class extends RealIntl.DateTimeFormat {
constructor(_locales?: string | string[], options?: Intl.DateTimeFormatOptions) {
super(desiredLocale, {
...options,
timeZone: desiredTimeZone,
});
}
} as unknown as typeof Intl.DateTimeFormat;
global.Intl = {
...RealIntl,
DateTimeFormat: MockedDateTimeFormat,
};
});
afterAll(() => {
// Restore original Intl after tests
global.Intl = RealIntl;
});
it("format date from iso date", () => {
const value = "2024-01-01T00:00:00.000Z";
const text = formatDateTime(value);
expect(text).toBe("Monday, 01/01/2024, 12:00:00 am");
});
it("format date from unix timestamp number", () => {
const value = 1762476112;
const text = formatDateTime(value);
expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
});
it("format date from unix timestamp string", () => {
const value = "1762476112";
const text = formatDateTime(value);
expect(text).toBe("Friday, 07/11/2025, 12:41:52 am");
});
it("catch bad format from string", () => {
const value = "this is not a good date";
const text = formatDateTime(value);
expect(text).toBe("this is not a good date");
});
it("catch bad format from number", () => {
const value = -100;
const text = formatDateTime(value);
expect(text).toBe("-100");
});
it("catch bad format from number as string", () => {
const value = "-100";
const text = formatDateTime(value);
expect(text).toBe("-100");
});
});

View File

@@ -0,0 +1,42 @@
import { fromUnixTime, intlFormat, parseISO } from "date-fns";
const isUnixTimestamp = (value: unknown): boolean => {
if (typeof value !== "number" && typeof value !== "string") return false;
const num = Number(value);
if (!Number.isFinite(num)) return false;
// Check plausible Unix timestamp range: from 1970 to ~year 3000
// Support both seconds and milliseconds
if (num > 0 && num < 10000000000) return true; // seconds (<= 10 digits)
if (num >= 10000000000 && num < 32503680000000) return true; // milliseconds (<= 13 digits)
return false;
};
const parseDate = (value: string | number): Date | null => {
if (typeof value !== "number" && typeof value !== "string") return null;
try {
return isUnixTimestamp(value) ? fromUnixTime(+value) : parseISO(`${value}`);
} catch {
return null;
}
};
const formatDateTime = (value: string | number): string => {
const d = parseDate(value);
if (!d) return `${value}`;
try {
return intlFormat(d, {
weekday: "long",
year: "numeric",
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "numeric",
second: "numeric",
hour12: true,
});
} catch {
return `${value}`;
}
};
export { formatDateTime, parseDate, isUnixTimestamp };

View File

@@ -1,2 +1,2 @@
export * from "./DateTimeFormat";
export * from "./IntlProvider";
export * from "./Utils";

View File

@@ -0,0 +1,216 @@
{
"access-list": "Zugriffsliste",
"access-list.access-count": "{count} {count, plural, one {Regel} other {Regeln}}",
"access-list.auth-count": "{count} {count, plural, one {User} other {Users}}",
"access-list.help-rules-last": "Wenn mindestens eine Regel vorhanden ist, wird diese Regel zum Ablehnen aller Anfragen als letzte hinzugefügt.",
"access-list.help.rules-order": "Beachten Sie, dass die Anweisungen „Erlauben“ und „Verbieten“ in der Reihenfolge ihrer Definition angewendet werden.",
"access-list.pass-auth": "Authentifizierung an Upstream weiterleiten",
"access-list.public": "Öffentlich",
"access-list.public.subtitle": "Keine Authentifizierung erforderlich",
"access-list.satisfy-any": "Satisfy Any",
"access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Regel} other {Regeln}} - Erstellt: {date}",
"access-lists": "Zugrifflisten",
"action.add": "Hinzufügen",
"action.add-location": "Pfad Hinzufügen",
"action.close": "Schließen",
"action.delete": "Löschen",
"action.disable": "Deaktivieren",
"action.download": "Herunterladen",
"action.edit": "Bearbeiten",
"action.enable": "Aktivieren",
"action.permissions": "Berechtigungen",
"action.renew": "Erneuert",
"action.view-details": "Details",
"auditlogs": "Protokoll",
"cancel": "Abbrechen",
"certificate": "Zertifikat",
"certificate.custom-certificate": "Zertifikat",
"certificate.custom-certificate-key": "Privater Schlüssel",
"certificate.custom-intermediate": "Zwischen Zertifikat",
"certificate.in-use": "In Benutzung",
"certificate.none.subtitle": "Kein Zertifikat zugewiesen",
"certificate.none.subtitle.for-http": "Dieser Host verwendet kein HTTPS.",
"certificate.none.title": "Kein",
"certificate.not-in-use": "Nicht in Benutzung",
"certificate.renew": "Zertifikat erneuern",
"certificates": "Zertifikate",
"certificates.custom": "Benutzerdefiniertes Zertifikat",
"certificates.custom.warning": "Mit einem Passwort geschützte Schlüsseldateien werden nicht unterstützt.",
"certificates.dns.credentials": "Inhalt der Anmeldedaten-Datei",
"certificates.dns.credentials-note": "Dieses Plugin erfordert eine Konfigurationsdatei, die einen API-Token oder andere Anmeldedaten für Ihren Anbieter enthält.",
"certificates.dns.credentials-warning": "Diese Daten werden als Klartext in der Datenbank und in einer Datei gespeichert!",
"certificates.dns.propagation-seconds": "Wartzeit in Sekunden",
"certificates.dns.propagation-seconds-note": "Leer lassen um die Standardwartezeit des Plugins zu nutzen",
"certificates.dns.provider": "DNS Provider",
"certificates.dns.warning": "Dieser Abschnitt erfordert einige Kenntnisse über Certbot und seine DNS-Plugins. Bitte konsultieren Sie die jeweilige Plugin-Dokumentation.",
"certificates.http.reachability-404": "Unter dieser Domain wurde ein Server gefunden, aber es scheint sich nicht um Nginx Proxy Manager zu handeln. Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
"certificates.http.reachability-failed-to-check": "Die Erreichbarkeit konnte aufgrund eines Kommunikationsfehlers mit site24x7.com nicht überprüft werden.",
"certificates.http.reachability-not-resolved": "Unter dieser Domain ist kein Server verfügbar. Bitte stellen Sie sicher, dass Ihre Domain existiert und auf die IP-Adresse verweist, unter der Ihre NPM-Instanz läuft, und dass gegebenenfalls Port 80 in Ihrem Router weitergeleitet wird.",
"certificates.http.reachability-ok": "Ihr Server ist erreichbar und die Erstellung von Zertifikaten sollte möglich sein.",
"certificates.http.reachability-other": "Unter dieser Domain wurde ein Server gefunden, der jedoch einen unerwarteten Statuscode {code} zurückgegeben hat. Handelt es sich um den NPM-Server? Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
"certificates.http.reachability-wrong-data": "Unter dieser Domain wurde ein Server gefunden, der jedoch unerwartete Daten zurückgegeben hat. Handelt es sich um den NPM-Server? Bitte stellen Sie sicher, dass Ihre Domain auf die IP-Adresse verweist, unter der Ihre NPM-Instanz ausgeführt wird.",
"certificates.http.test-results": "Test Ergeniss",
"certificates.http.warning": "Diese Domänen müssen bereits so konfiguriert sein, dass sie auf diese Installation verweisen.",
"certificates.request.subtitle": "Über Let's Encrypt",
"certificates.request.title": "Anfordern eines neuen Zertifikates",
"column.access": "Zugriff",
"column.authorization": "Genehmigung",
"column.authorizations": "Genehmigungen",
"column.custom-locations": "Benutzerdefinierte Pfad",
"column.destination": "Ziel",
"column.details": "Details",
"column.email": "Email",
"column.event": "Ereignis",
"column.expires": "Verfällt am",
"column.http-code": "HTTP Code",
"column.incoming-port": "Eingehender Port",
"column.name": "Name",
"column.protocol": "Protokoll",
"column.provider": "Provider",
"column.roles": "Rollen",
"column.rules": "Regeln",
"column.satisfy": "Satisfy",
"column.satisfy-all": "Alle",
"column.satisfy-any": "Jeder",
"column.scheme": "Schema",
"column.source": "Quelle",
"column.ssl": "SSL",
"column.status": "Status",
"created-on": "Erstelldatum: {date}",
"dashboard": "Dashboard",
"dead-host": "404 Host",
"dead-hosts": "404 Hosts",
"dead-hosts.count": "{count} {count, plural, one {404 Host} other {404 Hosts}}",
"disabled": "Deaktiviert",
"domain-names": "Domain Names",
"domain-names.max": "{count} Maximale Anzahl von Domainnamen",
"domain-names.placeholder": "Eintragen der Domain...",
"domain-names.wildcards-not-permitted": "Wildcards sind für diesen Typ nicht zulässig.",
"domain-names.wildcards-not-supported": "Wildcards werden für diese Zertifizierungsstelle nicht unterstützt.",
"domains.force-ssl": "Erzwinge SSL",
"domains.hsts-enabled": "HSTS aktiviert",
"domains.hsts-subdomains": "HSTS Sub-domains",
"domains.http2-support": "HTTP/2 Support",
"domains.use-dns": "Nutze DNS Challenge",
"email-address": "Email Addresse",
"empty-search": "Keine Ergebnisse gefunden",
"empty-subtitle": "Warum erstellen Sie nicht eine?",
"enabled": "aktiviert",
"error.access.at-least-one": "Entweder eine Genehmigung oder eine Zugriffsregel ist erforderlich.",
"error.access.duplicate-usernames": "Autorisierung Benutzernamen müssen eindeutig sein",
"error.invalid-auth": "Ungültige E-Mail-Adresse oder Passwort",
"error.invalid-domain": "Ungültige Domain: {domain}",
"error.invalid-email": "Ungültige E-Mail-Adresse",
"error.max-character-length": "Die maximale Länge beträgt {max} Zeichen{max, plural, one {} other {s}}",
"error.max-domains": "Zu viele Domains, maximal sind {max}",
"error.maximum": "Maximum ist {max}",
"error.min-character-length": "Die minimale Länge beträgt {min} Zeichen{min, plural, one {} other {s}}",
"error.minimum": "Minimum ist {min}",
"error.passwords-must-match": "Passwörter müssen übereinstimmen",
"error.required": "Dies ist erforderlich.",
"expires.on": "Ablauf am: {date}",
"footer.github-fork": "Fork me on Github",
"host.flags.block-exploits": "Gängige Exploits blockieren",
"host.flags.cache-assets": "Cache Assets",
"host.flags.preserve-path": "Pfad beibehalten",
"host.flags.protocols": "Protokole",
"host.flags.websockets-upgrade": "Websockets Support",
"host.forward-port": "Forward Port",
"host.forward-scheme": "Schema",
"hosts": "Hosts",
"http-only": "HTTP Only",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt via DNS",
"lets-encrypt-via-http": "Let's Encrypt via HTTP",
"loading": "Laden…",
"login.title": "Account Login",
"nginx-config.label": "Benutzerdefinierte Nginx Konfiguration",
"nginx-config.placeholder": "# Geben Sie hier Ihre benutzerdefinierte Nginx-Konfiguration auf eigene Gefahr ein!",
"no-permission-error": "Sie haben keinen Zugriff, um dies anzuzeigen.",
"notfound.action": "Take me home",
"notfound.content": "We are sorry but the page you are looking for was not found",
"notfound.title": "Oops… You just found an error page",
"notification.error": "Error",
"notification.object-deleted": "{object} wurde gelöscht",
"notification.object-disabled": "{object} wurde deaktiviert",
"notification.object-enabled": "{object} wurde aktiviert",
"notification.object-renewed": "{object} wurde erneuert",
"notification.object-saved": "{object} wurde gespeichert",
"notification.success": "Erfolgreich",
"object.actions-title": "{object} #{id}",
"object.add": "{object} hinzufügen",
"object.delete": "{object} löschen",
"object.delete.content": "{object} wirklich löschen?",
"object.edit": "{object} bearbeiten",
"object.empty": "Keine {objects} vorhanden",
"object.event.created": "{object} erstellt",
"object.event.deleted": "{object} gelöscht",
"object.event.disabled": "{object} deaktiviert",
"object.event.enabled": "{object} aktiviert",
"object.event.renewed": "{object} erneuert",
"object.event.updated": "{object} aktualisiert",
"offline": "Offline",
"online": "Online",
"options": "Optionen",
"password": "Passwort",
"password.generate": "Zufälliges Passwort generieren",
"password.hide": "Passwort verstecken",
"password.show": "Passwort anzeigen",
"permissions.hidden": "Versteckt",
"permissions.manage": "Verwalten",
"permissions.view": "Nur anzeigen",
"permissions.visibility.all": "Alle Elemente",
"permissions.visibility.title": "Objekt Sichtbarkeit",
"permissions.visibility.user": "Nur erstellte Elemente",
"proxy-host": "Proxy Host",
"proxy-host.forward-host": "Forward Hostname / IP",
"proxy-hosts": "Proxy Hosts",
"proxy-hosts.count": "{count} {count, plural, one {Proxy Host} other {Proxy Hosts}}",
"public": "Öffentlich",
"redirection-host": "Redirection Host",
"redirection-host.forward-domain": "Forward Domain",
"redirection-host.forward-http-code": "HTTP Code",
"redirection-hosts": "Redirection Hosts",
"redirection-hosts.count": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}",
"role.admin": "Administrator",
"role.standard-user": "Standard User",
"save": "Speichern",
"setting": "Einstellung",
"settings": "Einstellungen",
"settings.default-site": "Standard Seite",
"settings.default-site.404": "404 Page",
"settings.default-site.444": "No Response (444)",
"settings.default-site.congratulations": "Willkommensseite",
"settings.default-site.description": "Was angezeigt wird, wenn der Nginx eine unbekannte Webseitenanfrage bekommt",
"settings.default-site.html": "Benutzerdefinierte HTML",
"settings.default-site.html.placeholder": "<!-- Geben Sie hier Ihren benutzerdefinierten HTML-Inhalt ein. -->",
"settings.default-site.redirect": "Weiterleitung",
"setup.preamble": "Beginnen Sie mit der Erstellung Ihres Administratorkontos.",
"setup.title": "Willkommen!",
"sign-in": "Login",
"ssl-certificate": "SSL Zertifikate",
"stream": "Stream",
"stream.forward-host": "Forward Host",
"stream.incoming-port": "Incoming Port",
"streams": "Streams",
"streams.count": "{count} {count, plural, one {Stream} other {Streams}}",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "Test",
"user": "User",
"user.change-password": "Passwort ändern",
"user.confirm-password": "Passwort wiederholen",
"user.current-password": "Aktuelles Passwort",
"user.edit-profile": "Profil bearbeiten",
"user.full-name": "Name",
"user.login-as": "Einloggen als {name}",
"user.logout": "Ausloggen",
"user.new-password": "Neues Password",
"user.nickname": "Nickname",
"user.set-password": "Passwort setzen",
"user.set-permissions": "Berechtigungen für {name} setzen",
"user.switch-dark": "Zum Dark Mode wechseln",
"user.switch-light": "Zum Light Mode wechslen",
"username": "Benutzername",
"users": "Benutzer"
}

View File

@@ -32,6 +32,7 @@
"certificate.none.subtitle.for-http": "This host will not use HTTPS",
"certificate.none.title": "None",
"certificate.not-in-use": "Not Used",
"certificate.renew": "Renew Certificate",
"certificates": "Certificates",
"certificates.custom": "Custom Certificate",
"certificates.custom.warning": "Key files protected with a passphrase are not supported.",
@@ -61,7 +62,7 @@
"column.email": "Email",
"column.event": "Event",
"column.expires": "Expires",
"column.http-code": "Access",
"column.http-code": "HTTP Code",
"column.incoming-port": "Incoming Port",
"column.name": "Name",
"column.protocol": "Protocol",
@@ -168,6 +169,7 @@
"public": "Public",
"redirection-host": "Redirection Host",
"redirection-host.forward-domain": "Forward Domain",
"redirection-host.forward-http-code": "HTTP Code",
"redirection-hosts": "Redirection Hosts",
"redirection-hosts.count": "{count} {count, plural, one {Redirection Host} other {Redirection Hosts}}",
"role.admin": "Administrator",

View File

@@ -0,0 +1,216 @@
{
"access-list": "Lista de Acceso",
"access-list.access-count": "{count} {count, plural, one {Regla} other {Reglas}}",
"access-list.auth-count": "{count} {count, plural, one {Usuario} other {Usuarios}}",
"access-list.help-rules-last": "Cuando exista al menos 1 regla, esta regla de denegar todo se añadirá al final",
"access-list.help.rules-order": "Ten en cuenta que las directivas de permitir y denegar se aplicarán en el orden en que estén definidas.",
"access-list.pass-auth": "Pasar Autenticación al Upstream",
"access-list.public": "Accesible Públicamente",
"access-list.public.subtitle": "No se requiere autenticación básica",
"access-list.satisfy-any": "Satisfacer Cualquiera",
"access-list.subtitle": "{users} {users, plural, one {Usuario} other {Usuarios}}, {rules} {rules, plural, one {Regla} other {Reglas}} - Creado: {date}",
"access-lists": "Listas de Acceso",
"action.add": "Añadir",
"action.add-location": "Añadir Ubicación",
"action.close": "Cerrar",
"action.delete": "Eliminar",
"action.disable": "Deshabilitar",
"action.download": "Descargar",
"action.edit": "Editar",
"action.enable": "Habilitar",
"action.permissions": "Permisos",
"action.renew": "Renovar",
"action.view-details": "Ver Detalles",
"auditlogs": "Registros de Auditoría",
"cancel": "Cancelar",
"certificate": "Certificado",
"certificate.custom-certificate": "Certificado",
"certificate.custom-certificate-key": "Clave del Certificado",
"certificate.custom-intermediate": "Certificado Intermedio",
"certificate.in-use": "En Uso",
"certificate.none.subtitle": "Sin certificado asignado",
"certificate.none.subtitle.for-http": "Este host no usará HTTPS",
"certificate.none.title": "Ninguno",
"certificate.not-in-use": "Sin Usar",
"certificate.renew": "Renovar Certificado",
"certificates": "Certificados",
"certificates.custom": "Certificado Personalizado",
"certificates.custom.warning": "No se admiten archivos de claves protegidos con contraseña.",
"certificates.dns.credentials": "Contenido del Archivo de Credenciales",
"certificates.dns.credentials-note": "Este plugin requiere un archivo de configuración que contenga un token de API u otras credenciales para tu proveedor",
"certificates.dns.credentials-warning": "¡Estos datos se almacenarán como texto plano en la base de datos y en un archivo!",
"certificates.dns.propagation-seconds": "Segundos de Propagación",
"certificates.dns.propagation-seconds-note": "Dejar vacío para usar el valor predeterminado del plugin. Número de segundos a esperar para la propagación DNS.",
"certificates.dns.provider": "Proveedor DNS",
"certificates.dns.warning": "Esta sección requiere algunos conocimientos sobre Certbot y sus plugins DNS. Consulta la documentación de los plugins respectivos.",
"certificates.http.reachability-404": "Se encontró un servidor en este dominio pero no parece ser Nginx Proxy Manager. Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
"certificates.http.reachability-failed-to-check": "No se pudo verificar la accesibilidad debido a un error de comunicación con site24x7.com.",
"certificates.http.reachability-not-resolved": "No hay ningún servidor disponible en este dominio. Asegúrate de que tu dominio existe y apunta a la IP donde se está ejecutando tu instancia de NPM y, si es necesario, que el puerto 80 esté redirigido en tu router.",
"certificates.http.reachability-ok": "Tu servidor es accesible y debería ser posible crear certificados.",
"certificates.http.reachability-other": "Se encontró un servidor en este dominio pero devolvió un código de estado inesperado {code}. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
"certificates.http.reachability-wrong-data": "Se encontró un servidor en este dominio pero devolvió datos inesperados. ¿Es el servidor NPM? Asegúrate de que tu dominio apunte a la IP donde se está ejecutando tu instancia de NPM.",
"certificates.http.test-results": "Resultados de la Prueba",
"certificates.http.warning": "Estos dominios ya deben estar configurados para apuntar a esta instalación.",
"certificates.request.subtitle": "con Let's Encrypt",
"certificates.request.title": "Solicitar un nuevo Certificado",
"column.access": "Acceso",
"column.authorization": "Autorización",
"column.authorizations": "Autorizaciones",
"column.custom-locations": "Ubicaciones Personalizadas",
"column.destination": "Destino",
"column.details": "Detalles",
"column.email": "Correo Electrónico",
"column.event": "Evento",
"column.expires": "Expira",
"column.http-code": "Código HTTP",
"column.incoming-port": "Puerto de Entrada",
"column.name": "Nombre",
"column.protocol": "Protocolo",
"column.provider": "Proveedor",
"column.roles": "Roles",
"column.rules": "Reglas",
"column.satisfy": "Satisfacer",
"column.satisfy-all": "Todo",
"column.satisfy-any": "Cualquiera",
"column.scheme": "Esquema",
"column.source": "Origen",
"column.ssl": "SSL",
"column.status": "Estado",
"created-on": "Creado: {date}",
"dashboard": "Panel de Control",
"dead-host": "Host 404",
"dead-hosts": "Hosts 404",
"dead-hosts.count": "{count} {count, plural, one {Host 404} other {Hosts 404}}",
"disabled": "Deshabilitado",
"domain-names": "Nombres de Dominio",
"domain-names.max": "{count} nombres de dominio como máximo",
"domain-names.placeholder": "Comienza a escribir para añadir dominio...",
"domain-names.wildcards-not-permitted": "No se permiten comodines para este tipo",
"domain-names.wildcards-not-supported": "No se admiten comodines para esta CA",
"domains.force-ssl": "Forzar SSL",
"domains.hsts-enabled": "HSTS Habilitado",
"domains.hsts-subdomains": "HSTS en Subdominios",
"domains.http2-support": "Soporte HTTP/2",
"domains.use-dns": "Usar Desafío DNS",
"email-address": "Dirección de correo electrónico",
"empty-search": "No se encontraron resultados",
"empty-subtitle": "¿Por qué no creas uno?",
"enabled": "Habilitado",
"error.access.at-least-one": "Se requiere al menos una Autorización o una Regla de Acceso",
"error.access.duplicate-usernames": "Los nombres de usuario de autorización deben ser únicos",
"error.invalid-auth": "Correo electrónico o contraseña no válidos",
"error.invalid-domain": "Dominio no válido: {domain}",
"error.invalid-email": "Dirección de correo electrónico no válida",
"error.max-character-length": "La longitud máxima es {max} caracter{max, plural, one {} other {es}}",
"error.max-domains": "Demasiados dominios, el máximo es {max}",
"error.maximum": "El máximo es {max}",
"error.min-character-length": "La longitud mínima es {min} caracter{min, plural, one {} other {es}}",
"error.minimum": "El mínimo es {min}",
"error.passwords-must-match": "Las contraseñas deben coincidir",
"error.required": "Este campo es obligatorio",
"expires.on": "Expira: {date}",
"footer.github-fork": "Bifúrcame en Github",
"host.flags.block-exploits": "Bloquear Exploits Comunes",
"host.flags.cache-assets": "Cachear Recursos",
"host.flags.preserve-path": "Preservar Ruta",
"host.flags.protocols": "Protocolos",
"host.flags.websockets-upgrade": "Soporte de Websockets",
"host.forward-port": "Puerto de Reenvío",
"host.forward-scheme": "Esquema",
"hosts": "Hosts",
"http-only": "Solo HTTP",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt vía DNS",
"lets-encrypt-via-http": "Let's Encrypt vía HTTP",
"loading": "Cargando…",
"login.title": "Inicia sesión en tu cuenta",
"nginx-config.label": "Configuración Personalizada de Nginx",
"nginx-config.placeholder": "# ¡Introduce aquí tu configuración personalizada de Nginx bajo tu propio riesgo!",
"no-permission-error": "No tienes acceso para ver esto.",
"notfound.action": "Llévame al inicio",
"notfound.content": "Lo sentimos, pero la página que buscas no fue encontrada",
"notfound.title": "Ups… Has encontrado una página de error",
"notification.error": "Error",
"notification.object-deleted": "{object} ha sido eliminado",
"notification.object-disabled": "{object} ha sido deshabilitado",
"notification.object-enabled": "{object} ha sido habilitado",
"notification.object-renewed": "{object} ha sido renovado",
"notification.object-saved": "{object} ha sido guardado",
"notification.success": "Éxito",
"object.actions-title": "{object} #{id}",
"object.add": "Añadir {object}",
"object.delete": "Eliminar {object}",
"object.delete.content": "¿Estás seguro de que quieres eliminar este {object}?",
"object.edit": "Editar {object}",
"object.empty": "No hay {objects}",
"object.event.created": "{object} Creado",
"object.event.deleted": "{object} Eliminado",
"object.event.disabled": "{object} Deshabilitado",
"object.event.enabled": "{object} Habilitado",
"object.event.renewed": "{object} Renovado",
"object.event.updated": "{object} Actualizado",
"offline": "Desconectado",
"online": "Conectado",
"options": "Opciones",
"password": "Contraseña",
"password.generate": "Generar contraseña aleatoria",
"password.hide": "Ocultar Contraseña",
"password.show": "Mostrar Contraseña",
"permissions.hidden": "Oculto",
"permissions.manage": "Gestionar",
"permissions.view": "Solo Ver",
"permissions.visibility.all": "Todos los Elementos",
"permissions.visibility.title": "Visibilidad de Elementos",
"permissions.visibility.user": "Solo Elementos Creados",
"proxy-host": "Host Proxy",
"proxy-host.forward-host": "Nombre de Host / IP de Reenvío",
"proxy-hosts": "Hosts Proxy",
"proxy-hosts.count": "{count} {count, plural, one {Host Proxy} other {Hosts Proxy}}",
"public": "Público",
"redirection-host": "Host de Redirección",
"redirection-host.forward-domain": "Dominio de Reenvío",
"redirection-host.forward-http-code": "Código HTTP",
"redirection-hosts": "Hosts de Redirección",
"redirection-hosts.count": "{count} {count, plural, one {Host de Redirección} other {Hosts de Redirección}}",
"role.admin": "Administrador",
"role.standard-user": "Usuario Estándar",
"save": "Guardar",
"setting": "Configuración",
"settings": "Configuración",
"settings.default-site": "Sitio Predeterminado",
"settings.default-site.404": "Página 404",
"settings.default-site.444": "Sin Respuesta (444)",
"settings.default-site.congratulations": "Página de Felicitaciones",
"settings.default-site.description": "Qué mostrar cuando Nginx recibe un Host desconocido",
"settings.default-site.html": "HTML Personalizado",
"settings.default-site.html.placeholder": "<!-- Introduce aquí tu contenido HTML personalizado -->",
"settings.default-site.redirect": "Redirigir",
"setup.preamble": "Comienza creando tu cuenta de administrador.",
"setup.title": "¡Bienvenido!",
"sign-in": "Iniciar Sesión",
"ssl-certificate": "Certificado SSL",
"stream": "Stream",
"stream.forward-host": "Host de Reenvío",
"stream.incoming-port": "Puerto de Entrada",
"streams": "Streams",
"streams.count": "{count} {count, plural, one {Stream} other {Streams}}",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "Probar",
"user": "Usuario",
"user.change-password": "Cambiar Contraseña",
"user.confirm-password": "Confirmar Contraseña",
"user.current-password": "Contraseña Actual",
"user.edit-profile": "Editar Perfil",
"user.full-name": "Nombre Completo",
"user.login-as": "Iniciar sesión como {name}",
"user.logout": "Cerrar Sesión",
"user.new-password": "Nueva Contraseña",
"user.nickname": "Apodo",
"user.set-password": "Establecer Contraseña",
"user.set-permissions": "Establecer Permisos para {name}",
"user.switch-dark": "Cambiar a modo Oscuro",
"user.switch-light": "Cambiar a modo Claro",
"username": "Nombre de Usuario",
"users": "Usuarios"
}

View File

@@ -0,0 +1,215 @@
{
"access-list": "アクセスリスト",
"access-list.access-count": "{count} ルール",
"access-list.auth-count": "{count} ユーザー",
"access-list.help-rules-last": "少なくとも 1 つのルールが存在する場合、 他のすべてを拒否するルールが最後に追加されます",
"access-list.help.rules-order": "許可コマンドと拒否コマンドは定義された順番で適用されます",
"access-list.pass-auth": "認証情報をアップストリームに送信する",
"access-list.public": "公開されたアクセス",
"access-list.public.subtitle": "ベーシック認証を使用しません",
"access-list.satisfy-any": "いずれかを満たす",
"access-list.subtitle": "{users} ユーザー, {rules} ルール - 作成日時: {date}",
"access-lists": "アクセスリスト",
"action.add": "追加",
"action.add-location": "場所を追加",
"action.close": "閉じる",
"action.delete": "削除",
"action.disable": "無効化",
"action.download": "ダウンロード",
"action.edit": "編集",
"action.enable": "有効化",
"action.permissions": "権限",
"action.renew": "更新",
"action.view-details": "詳細",
"auditlogs": "監査ログ",
"cancel": "キャンセル",
"certificate": "証明書",
"certificate.custom-certificate": "証明書",
"certificate.custom-certificate-key": "証明書キー",
"certificate.custom-intermediate": "中間証明書",
"certificate.in-use": "使用中",
"certificate.none.subtitle": "証明書が割り当てられていません",
"certificate.none.subtitle.for-http": "このホストはHTTPSを使用しません",
"certificate.none.title": "無し",
"certificate.not-in-use": "未使用",
"certificate.renew": "証明書を更新",
"certificates": "証明書",
"certificates.custom": "カスタム証明書",
"certificates.custom.warning": "パスワードによって保護されたキーファイルはサポートされていません",
"certificates.dns.credentials": "資格情報ファイルの内容",
"certificates.dns.credentials-note": "このプラグインはプロバイダーのAPIキーか認証情報を含む設定ファイルが必要です",
"certificates.dns.credentials-warning": "このデータはファイルとデータベースにプレーンテキストとして保存されます",
"certificates.dns.propagation-seconds": "DNS伝播時間(秒)",
"certificates.dns.propagation-seconds-note": "DNSの伝搬時間を秒で指定します。空にするとデフォルトの値を使用します。",
"certificates.dns.provider": "DNSプロバイダー",
"certificates.dns.warning": "このセクションはCertbotとそのDNSプラグインの知識が必要です。各プラグインのドキュメントを参照してください。",
"certificates.http.reachability-404": "このドメインはNginx Proxy Managerではないサーバーを指しているようです。ドメインがこのNPMインスタンスを指していることを確認してください。",
"certificates.http.reachability-failed-to-check": "site24x7.comへの接続でエラーが発生し、到達性チェックに失敗しました",
"certificates.http.reachability-not-resolved": "このドメインには利用可能なサーバーがありません。ドメインが存在し、NPMインスタンスのIPアドレスを指していること、必要に応じてルーターでポート80が転送されていることを確認してください。",
"certificates.http.reachability-ok": "サーバーへ到達可能であり、証明書の作成が可能です。",
"certificates.http.reachability-other": "このドメインでサーバーが見つかりましたが予期しないステータスコード {code} を返しました. NPMサーバーが動いていますか? ドメインがこのNPMインスタンスを指していることを確認してください。",
"certificates.http.reachability-wrong-data": "このドメインでサーバーが見つかりましたが予期しないデータを返しました. NPMサーバーが動いていますか? ドメインがこのNPMインスタンスを指していることを確認してください。",
"certificates.http.test-results": "テスト結果",
"certificates.http.warning": "これらのドメインは、すでにこのインストール先を指すように設定されている必要がありますあ.",
"certificates.request.subtitle": "Let's Encryptを使用する",
"certificates.request.title": "新しい証明書を作成",
"column.access": "アクセス",
"column.authorization": "認証",
"column.authorizations": "認証",
"column.custom-locations": "カスタムロケーション",
"column.destination": "宛先",
"column.details": "詳細",
"column.email": "Email",
"column.event": "イベント",
"column.expires": "期限切れ",
"column.http-code": "アクセス",
"column.incoming-port": "受信ポート",
"column.name": "名前",
"column.protocol": "プロトコル",
"column.provider": "プロバイダー",
"column.roles": "Roles",
"column.rules": "ルール",
"column.satisfy": "Satisfy",
"column.satisfy-all": "すべて",
"column.satisfy-any": "いずれか",
"column.scheme": "スキーム",
"column.source": "ソース",
"column.ssl": "SSL",
"column.status": "ステータス",
"created-on": "作成日時: {date}",
"dashboard": "ダッシュボード",
"dead-host": "404 ホスト",
"dead-hosts": "404 ホスト",
"dead-hosts.count": "{count} 404 ホスト",
"disabled": "無効化",
"domain-names": "ドメイン名",
"domain-names.max": "{count}のドメイン名が最大です",
"domain-names.placeholder": "追加するドメインを入力...",
"domain-names.wildcards-not-permitted": "ワイルドカードはこのタイプでは許可されていません",
"domain-names.wildcards-not-supported": "ワイルドカードはこのCAではサポートされていません",
"domains.force-ssl": "SSLを強制",
"domains.hsts-enabled": "HSTSを有効化",
"domains.hsts-subdomains": "HSTSサブドメイン",
"domains.http2-support": "HTTP/2サポート",
"domains.use-dns": "DNSチャレンジを使用",
"email-address": "Emailアドレス",
"empty-search": "見つかりませんでした",
"empty-subtitle": "作ってみましょう",
"enabled": "有効",
"error.access.at-least-one": "少なくとも一つの認証またはアクセスルールが必要です",
"error.access.duplicate-usernames": "認証のユーザー名は他と同じ名前は使用できません",
"error.invalid-auth": "無効なemailまたはパスワード",
"error.invalid-domain": "無効なドメイン: {domain}",
"error.invalid-email": "無効なemailアドレス",
"error.max-character-length": "文字数は長くとも{max}文字です",
"error.max-domains": "ドメインが多すぎます, 最大値は{max}です",
"error.maximum": "最大値は{max}です",
"error.min-character-length": "文字数は少なくとも{min}文字です",
"error.minimum": "最小値は{min}です",
"error.passwords-must-match": "パスワードは一致する必要があります",
"error.required": "必須項目です",
"expires.on": "有効期限: {date}",
"footer.github-fork": "Fork me on Github",
"host.flags.block-exploits": "一般的なエクスプロイトをブロックする",
"host.flags.cache-assets": "アセットをキャッシュする",
"host.flags.preserve-path": "パスワードは一致する必要があります",
"host.flags.protocols": "プロトコル",
"host.flags.websockets-upgrade": "Websocketsサポート",
"host.forward-port": "転送ポート",
"host.forward-scheme": "スキーム",
"hosts": "ホスト",
"http-only": "HTTP Only",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt via DNS",
"lets-encrypt-via-http": "Let's Encrypt via HTTP",
"loading": "Loading…",
"login.title": "アカウントにログイン",
"nginx-config.label": "カスタムNginx設定",
"nginx-config.placeholder": "# Enter your custom Nginx configuration here at your own risk!",
"no-permission-error": "これを表示する権限がありません",
"notfound.action": "ホームに戻る",
"notfound.content": "申し訳ありませんが探しているページは見つかりませんでした",
"notfound.title": "おっと... エラーページにたどり着いてしまったようです",
"notification.error": "エラー",
"notification.object-deleted": "{object}は削除されました",
"notification.object-disabled": "{object}は無効化されました",
"notification.object-enabled": "{object}は有効化されました",
"notification.object-renewed": "{object}は再作成されました",
"notification.object-saved": "{object}は保存されました",
"notification.success": "成功",
"object.actions-title": "{object} #{id}",
"object.add": "{object}を追加",
"object.delete": "{object}を削除",
"object.delete.content": "本当に{object}を削除しますか?",
"object.edit": "{object}を編集",
"object.empty": "{objects}はありません",
"object.event.created": "{object}を作成済み",
"object.event.deleted": "{object}を削除済み",
"object.event.disabled": "{object}を無効化済み",
"object.event.enabled": "{object}を有効化済み",
"object.event.renewed": "{object}を再作成済み",
"object.event.updated": "{object}を更新済み",
"offline": "Offline",
"online": "Online",
"options": "Options",
"password": "パスワード",
"password.generate": "ランダムなパスワードを生成",
"password.hide": "パスワードを隠す",
"password.show": "パスワードを表示する",
"permissions.hidden": "非公開",
"permissions.manage": "管理",
"permissions.view": "表示のみ",
"permissions.visibility.all": "すべて",
"permissions.visibility.title": "可視性",
"permissions.visibility.user": "作成したもののみ",
"proxy-host": "プロキシホスト",
"proxy-host.forward-host": "転送ホスト名/IP",
"proxy-hosts": "プロキシホスト",
"proxy-hosts.count": "{count} プロキシホスト",
"public": "Public",
"redirection-host": "リダイレクトホスト",
"redirection-host.forward-domain": "転送ホスト",
"redirection-hosts": "リダイレクトホスト",
"redirection-hosts.count": "{count} リダイレクトホスト",
"role.admin": "管理者",
"role.standard-user": "一般ユーザー",
"save": "保存",
"setting": "設定",
"settings": "設定",
"settings.default-site": "デフォルトサイト",
"settings.default-site.404": "404ページ",
"settings.default-site.444": "返答しない (444)",
"settings.default-site.congratulations": "設定ページ",
"settings.default-site.description": "不明なホストを要求されたときにNginxが何を返すかを設定します",
"settings.default-site.html": "カスタムHTML",
"settings.default-site.html.placeholder": "<!-- Enter your custom HTML content here -->",
"settings.default-site.redirect": "リダイレクト",
"setup.preamble": "管理者アカウントを作成して始めましょう",
"setup.title": "ようこそ!",
"sign-in": "サインイン",
"ssl-certificate": "SSL証明書",
"stream": "ストリーム",
"stream.forward-host": "転送ポート",
"stream.incoming-port": "受信ポート",
"streams": "ストリーム",
"streams.count": "{count} ストリーム",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "テスト",
"user": "ユーザー",
"user.change-password": "変更するパスワード",
"user.confirm-password": "変更するパスワードを確認",
"user.current-password": "現在のパスワード",
"user.edit-profile": "プロフィールを編集",
"user.full-name": "フルネーム",
"user.login-as": "{name}としてサインイン",
"user.logout": "ログアウト",
"user.new-password": "新しいパスワード",
"user.nickname": "ニックネーム",
"user.set-password": "パスワードを設定",
"user.set-permissions": "{name}に権限を設定",
"user.switch-dark": "ダークモードに変更",
"user.switch-light": "ライトモードに変更",
"username": "ユーザー名",
"users": "ユーザー"
}

View File

@@ -1,3 +1,10 @@
{
"locale-en-US": "English"
"locale-de-DE": "German",
"locale-en-US": "English",
"locale-es-ES": "Español",
"locale-ja-JP": "日本語",
"locale-pl-PL": "Polski",
"locale-ru-RU": "Русский",
"locale-sk-SK": "Slovak",
"locale-zh-CN": "中文"
}

216
frontend/src/locale/lang/pl.json Executable file
View File

@@ -0,0 +1,216 @@
{
"access-list": "Lista dostępu",
"access-list.access-count": "{count} {count, plural, one {Reguła} few {Reguły} other {Reguł}}",
"access-list.auth-count": "{count} {count, plural, one {Użytkownik} few {Użytkowników} other {Użytkowników}}",
"access-list.help-rules-last": "Gdy istnieje co najmniej 1 reguła, ta reguła blokująca wszystko zostanie dodana na końcu",
"access-list.help.rules-order": "Należy pamiętać, że dyrektywy zezwolenia i odmowy będą stosowane w kolejności, w jakiej zostały zdefiniowane.",
"access-list.pass-auth": "Przekaż uwierzytelnienie do serwera docelowego",
"access-list.public": "Publicznie dostępne",
"access-list.public.subtitle": "Nie wymaga uwierzytelnienia podstawowego",
"access-list.satisfy-any": "Spełnij dowolny warunek",
"access-list.subtitle": "{users} {users, plural, one {Użytkownik} few {Użytkowników} other {Użytkowników}}, {rules} {rules, plural, one {Reguła} few {Reguły} other {Reguł}} - Utworzono: {date}",
"access-lists": "Listy dostępu",
"action.add": "Dodaj",
"action.add-location": "Dodaj lokalizację",
"action.close": "Zamknij",
"action.delete": "Usuń",
"action.disable": "Wyłącz",
"action.download": "Pobierz",
"action.edit": "Edytuj",
"action.enable": "Włącz",
"action.permissions": "Uprawnienia",
"action.renew": "Odnów",
"action.view-details": "Pokaż szczegóły",
"auditlogs": "Logi audytu",
"cancel": "Anuluj",
"certificate": "Certyfikat",
"certificate.custom-certificate": "Certyfikat",
"certificate.custom-certificate-key": "Klucz certyfikatu",
"certificate.custom-intermediate": "Certyfikat pośredni",
"certificate.in-use": "W użyciu",
"certificate.none.subtitle": "Nie przypisano certyfikatu",
"certificate.none.subtitle.for-http": "Ten host nie będzie używał HTTPS",
"certificate.none.title": "Brak",
"certificate.not-in-use": "Nie używany",
"certificate.renew": "Odnów certyfikat",
"certificates": "Certyfikaty",
"certificates.custom": "Certyfikat własny",
"certificates.custom.warning": "Pliki kluczy chronione hasłem nie są obsługiwane.",
"certificates.dns.credentials": "Zawartość pliku z poświadczeniami",
"certificates.dns.credentials-note": "Ta wtyczka wymaga pliku konfiguracyjnego zawierającego token API lub inne poświadczenia dla twojego dostawcy",
"certificates.dns.credentials-warning": "Te dane zostaną zapisane jako zwykły tekst w bazie danych i pliku!",
"certificates.dns.propagation-seconds": "Sekundy propagacji",
"certificates.dns.propagation-seconds-note": "Pozostaw puste, aby użyć domyślnej wartości wtyczki. Liczba sekund oczekiwania na propagację DNS.",
"certificates.dns.provider": "Dostawca DNS",
"certificates.dns.warning": "Ta sekcja wymaga pewnej wiedzy na temat Certbot i jego wtyczek DNS. Zapoznaj się z dokumentacją odpowiednich wtyczek.",
"certificates.http.reachability-404": "Znaleziono serwer pod tą domeną, ale nie wygląda na to, że jest to Nginx Proxy Manager. Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
"certificates.http.reachability-failed-to-check": "Nie udało się sprawdzić dostępności z powodu błędu komunikacji z site24x7.com.",
"certificates.http.reachability-not-resolved": "Brak dostępnego serwera pod tą domeną. Upewnij się, że twoja domena istnieje i wskazuje na adres IP, gdzie działa twoja instancja NPM, oraz w razie potrzeby, że port 80 jest przekierowany w routerze lub owarty w firewall-u.",
"certificates.http.reachability-ok": "Twój serwer jest dostępny i tworzenie certyfikatów powinno być możliwe.",
"certificates.http.reachability-other": "Znaleziono serwer pod tą domeną, ale zwrócił nieoczekiwany kod statusu {code}. Czy to serwer NPM? Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
"certificates.http.reachability-wrong-data": "Znaleziono serwer pod tą domeną, ale zwrócił nieoczekiwane dane. Czy to serwer NPM? Upewnij się, że twoja domena wskazuje na adres IP, gdzie działa twoja instancja NPM.",
"certificates.http.test-results": "Wyniki testu",
"certificates.http.warning": "Te domeny muszą być już skonfigurowane tak, aby wskazywały na ten serwer www",
"certificates.request.subtitle": "z Let's Encrypt",
"certificates.request.title": "Zamów nowy certyfikat",
"column.access": "Dostęp",
"column.authorization": "Autoryzacja",
"column.authorizations": "Autoryzacje",
"column.custom-locations": "Własne lokalizacje",
"column.destination": "Cel",
"column.details": "Szczegóły",
"column.email": "Email",
"column.event": "Zdarzenie",
"column.expires": "Wygasa",
"column.http-code": "Kod HTTP",
"column.incoming-port": "Port przychodzący",
"column.name": "Nazwa",
"column.protocol": "Protokół",
"column.provider": "Dostawca",
"column.roles": "Role",
"column.rules": "Reguły",
"column.satisfy": "Spełnij",
"column.satisfy-all": "Wszystkie",
"column.satisfy-any": "Dowolny",
"column.scheme": "Schemat",
"column.source": "Źródło",
"column.ssl": "SSL",
"column.status": "Status",
"created-on": "Utworzono: {date}",
"dashboard": "Panel",
"dead-host": "Host 404",
"dead-hosts": "Hosty 404",
"dead-hosts.count": "{count} {count, plural, one {Host 404} few {Hosty 404} other {Hostów 404}}",
"disabled": "Wyłączone",
"domain-names": "Nazwy domen",
"domain-names.max": "Maksymalnie {count} nazw domen",
"domain-names.placeholder": "Zacznij pisać, aby dodać domenę...",
"domain-names.wildcards-not-permitted": "Symbole wieloznaczne nie są dozwolone dla tego typu",
"domain-names.wildcards-not-supported": "Symbole wieloznaczne nie są obsługiwane dla tego CA",
"domains.force-ssl": "Wymuś SSL",
"domains.hsts-enabled": "HSTS włączone",
"domains.hsts-subdomains": "HSTS dla subdomen",
"domains.http2-support": "Obsługa HTTP/2",
"domains.use-dns": "Użyj wyzwania DNS",
"email-address": "Adres email",
"empty-search": "Nie znaleziono wyników",
"empty-subtitle": "Może utworzysz nowy?",
"enabled": "Włączone",
"error.access.at-least-one": "Wymagana jest co najmniej jedna autoryzacja lub jedna reguła dostępu",
"error.access.duplicate-usernames": "Nazwy użytkowników autoryzacji muszą być unikalne",
"error.invalid-auth": "Nieprawidłowy email lub hasło",
"error.invalid-domain": "Nieprawidłowa domena: {domain}",
"error.invalid-email": "Nieprawidłowy adres email",
"error.max-character-length": "Maksymalna długość to {max} {max, plural, one {znak} few {znaki} other {znaków}}",
"error.max-domains": "Zbyt wiele domen, maksimum to {max}",
"error.maximum": "Maksimum to {max}",
"error.min-character-length": "Minimalna długość to {min} {min, plural, one {znak} few {znaki} other {znaków}}",
"error.minimum": "Minimum to {min}",
"error.passwords-must-match": "Hasła muszą się zgadzać",
"error.required": "To pole jest wymagane",
"expires.on": "Wygasa: {date}",
"footer.github-fork": "Forkuj mnie na Github",
"host.flags.block-exploits": "Blokuj typowe exploity",
"host.flags.cache-assets": "Buforuj zasoby",
"host.flags.preserve-path": "Zachowaj ścieżkę",
"host.flags.protocols": "Protokoły",
"host.flags.websockets-upgrade": "Obsługa WebSockets",
"host.forward-port": "Port przekierowania",
"host.forward-scheme": "Schemat",
"hosts": "Hosty",
"http-only": "Tylko HTTP",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt przez DNS",
"lets-encrypt-via-http": "Let's Encrypt przez HTTP",
"loading": "Ładowanie…",
"login.title": "Zaloguj się na swoje konto",
"nginx-config.label": "Własna konfiguracja Nginx",
"nginx-config.placeholder": "# Wprowadź tutaj własną konfigurację Nginx na własną odpowiedzialność!",
"no-permission-error": "Nie masz uprawnień do wyświetlenia tego.",
"notfound.action": "Zabierz mnie do strony głównej",
"notfound.content": "Przepraszamy, ale strona, której szukasz, nie została znaleziona",
"notfound.title": "Ups… Właśnie znalazłeś stronę błędu",
"notification.error": "Błąd",
"notification.object-deleted": "{object} został usunięty",
"notification.object-disabled": "{object} został wyłączony",
"notification.object-enabled": "{object} został włączony",
"notification.object-renewed": "{object} został odnowiony",
"notification.object-saved": "{object} został zapisany",
"notification.success": "Sukces",
"object.actions-title": "{object} #{id}",
"object.add": "Dodaj {object}",
"object.delete": "Usuń {object}",
"object.delete.content": "Czy na pewno chcesz usunąć {object}?",
"object.edit": "Edytuj {object}",
"object.empty": "Brak {objects}",
"object.event.created": "Utworzono {object}",
"object.event.deleted": "Usunięto {object}",
"object.event.disabled": "Wyłączono {object}",
"object.event.enabled": "Włączono {object}",
"object.event.renewed": "Odnowiono {object}",
"object.event.updated": "Zaktualizowano {object}",
"offline": "Offline",
"online": "Online",
"options": "Opcje",
"password": "Hasło",
"password.generate": "Wygeneruj losowe hasło",
"password.hide": "Ukryj hasło",
"password.show": "Pokaż hasło",
"permissions.hidden": "Ukryte",
"permissions.manage": "Zarządzaj",
"permissions.view": "Tylko podgląd",
"permissions.visibility.all": "Wszystkie elementy",
"permissions.visibility.title": "Widoczność elementów",
"permissions.visibility.user": "Tylko utworzone elementy",
"proxy-host": "Host proxy",
"proxy-host.forward-host": "Przekieruj na hostname / IP",
"proxy-hosts": "Hosty proxy",
"proxy-hosts.count": "{count} {count, plural, one {Host proxy} few {Hosty proxy} other {Hostów proxy}}",
"public": "Publiczne",
"redirection-host": "Host przekierowania",
"redirection-host.forward-domain": "Domena docelowa",
"redirection-host.forward-http-code": "Kod HTTP",
"redirection-hosts": "Hosty przekierowań",
"redirection-hosts.count": "{count} {count, plural, one {Host przekierowania} few {Hosty przekierowań} other {Hostów przekierowań}}",
"role.admin": "Administrator",
"role.standard-user": "Standardowy użytkownik",
"save": "Zapisz",
"setting": "Ustawienie",
"settings": "Ustawienia",
"settings.default-site": "Domyślna strona",
"settings.default-site.404": "Strona 404",
"settings.default-site.444": "Brak odpowiedzi (444)",
"settings.default-site.congratulations": "Strona gratulacyjna",
"settings.default-site.description": "Co wyświetlić, gdy Nginx otrzyma nieznany Host",
"settings.default-site.html": "Własny HTML",
"settings.default-site.html.placeholder": "<!-- Wprowadź tutaj własną zawartość HTML -->",
"settings.default-site.redirect": "Przekierowanie",
"setup.preamble": "Zacznij od utworzenia konta administratora.",
"setup.title": "Witaj!",
"sign-in": "Zaloguj się",
"ssl-certificate": "Certyfikat SSL",
"stream": "Strumień",
"stream.forward-host": "Host docelowy",
"stream.incoming-port": "Port przychodzący",
"streams": "Strumienie",
"streams.count": "{count} {count, plural, one {Strumień} few {Strumienie} other {Strumieni}}",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "Test",
"user": "Użytkownik",
"user.change-password": "Zmień hasło",
"user.confirm-password": "Potwierdź hasło",
"user.current-password": "Aktualne hasło",
"user.edit-profile": "Edytuj profil",
"user.full-name": "Pełne imię i nazwisko",
"user.login-as": "Zaloguj jako {name}",
"user.logout": "Wyloguj",
"user.new-password": "Nowe hasło",
"user.nickname": "Pseudonim",
"user.set-password": "Ustaw hasło",
"user.set-permissions": "Ustaw uprawnienia dla {name}",
"user.switch-dark": "Przełącz na tryb ciemny",
"user.switch-light": "Przełącz na tryb jasny",
"username": "Nazwa użytkownika",
"users": "Użytkownicy"
}

View File

@@ -0,0 +1,216 @@
{
"access-list": "Список доступа",
"access-list.access-count": "{count} {count, plural, one {правило} few {правила} many {правил} other {правила}}",
"access-list.auth-count": "{count} {count, plural, one {пользователь} few {пользователя} many {пользователей} other {пользователя}}",
"access-list.help-rules-last": "When at least 1 rule exists, this deny all rule will be added last",
"access-list.help.rules-order": "Note that the allow and deny directives will be applied in the order they are defined.",
"access-list.pass-auth": "Pass Auth to Upstream",
"access-list.public": "Публично доступен",
"access-list.public.subtitle": "Без аутентификации",
"access-list.satisfy-any": "Любое совпадение",
"access-list.subtitle": "{users} {users, plural, one {User} other {Users}}, {rules} {rules, plural, one {Rule} other {Rules}} - Created: {date}",
"access-lists": "Списки доступа",
"action.add": "Добавить",
"action.add-location": "Добавить маршрут",
"action.close": "Закрыть",
"action.delete": "Удалить",
"action.disable": "Выключить",
"action.download": "Скачать",
"action.edit": "Изменить",
"action.enable": "Включить",
"action.permissions": "Разрешения",
"action.renew": "Продлить",
"action.view-details": "Просмотреть детали",
"auditlogs": "Журнал аудита",
"cancel": "Отменить",
"certificate": "Сертификат",
"certificate.custom-certificate": "Сертификат",
"certificate.custom-certificate-key": "Ключ сертификата",
"certificate.custom-intermediate": "Промежуточный сертификат",
"certificate.in-use": "Используется",
"certificate.none.subtitle": "Сертификат не назначен",
"certificate.none.subtitle.for-http": "Этот хост не будет использовать HTTPS",
"certificate.none.title": "Нет",
"certificate.not-in-use": "Не используется",
"certificate.renew": "Продлить сертификат",
"certificates": "Сертификаты",
"certificates.custom": "Свой сертификат",
"certificates.custom.warning": "Файлы ключей, защищённые паролем, не поддерживаются.",
"certificates.dns.credentials": "Credentials File Content",
"certificates.dns.credentials-note": "This plugin requires a configuration file containing an API token or other credentials for your provider",
"certificates.dns.credentials-warning": "This data will be stored as plaintext in the database and in a file!",
"certificates.dns.propagation-seconds": "Propagation Seconds",
"certificates.dns.propagation-seconds-note": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation.",
"certificates.dns.provider": "DNS-провайдер",
"certificates.dns.warning": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation.",
"certificates.http.reachability-404": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running.",
"certificates.http.reachability-failed-to-check": "Failed to check the reachability due to a communication error with site24x7.com.",
"certificates.http.reachability-not-resolved": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router.",
"certificates.http.reachability-ok": "Your server is reachable and creating certificates should be possible.",
"certificates.http.reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
"certificates.http.reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
"certificates.http.test-results": "Результаты проверки",
"certificates.http.warning": "These domains must be already configured to point to this installation.",
"certificates.request.subtitle": "через Let's Encrypt",
"certificates.request.title": "Получить новый сертификат",
"column.access": "Доступ",
"column.authorization": "Авторизация",
"column.authorizations": "Авторизации",
"column.custom-locations": "Свои маршруты",
"column.destination": "Назначение",
"column.details": "Детали",
"column.email": "Email",
"column.event": "Событие",
"column.expires": "Истекает",
"column.http-code": "HTTP Code",
"column.incoming-port": "Входящий порт",
"column.name": "Имя",
"column.protocol": "Протокол",
"column.provider": "Провайдер",
"column.roles": "Роли",
"column.rules": "Правила",
"column.satisfy": "Совпадение",
"column.satisfy-all": "Все",
"column.satisfy-any": "Любое",
"column.scheme": "Схема",
"column.source": "Источник",
"column.ssl": "SSL",
"column.status": "Статус",
"created-on": "Создан: {date}",
"dashboard": "Обзор",
"dead-host": "404-хост",
"dead-hosts": "404-хосты",
"dead-hosts.count": "{count} {count, plural, one {404-хост} few {404-хоста} many {404-хостов} other {404-хоста}}",
"disabled": "Выключен",
"domain-names": "Домены",
"domain-names.max": "Максимум доменов: {count}",
"domain-names.placeholder": "Начните ввод, чтобы добавить домен...",
"domain-names.wildcards-not-permitted": "Wildcard'ы не разрешены для этого типа",
"domain-names.wildcards-not-supported": "Wildcard'ы не поддерживаются этим CA",
"domains.force-ssl": "Всегда SSL",
"domains.hsts-enabled": "Поддержка HSTS",
"domains.hsts-subdomains": "Поддомены HSTS",
"domains.http2-support": "Поддержка HTTP/2",
"domains.use-dns": "Использовать DNS Challenge",
"email-address": "Email-адрес",
"empty-search": "Ничего не найдено",
"empty-subtitle": "Почему бы не создать его?",
"enabled": "Включен",
"error.access.at-least-one": "Either one Authorization or one Access Rule is required",
"error.access.duplicate-usernames": "Authorization Usernames must be unique",
"error.invalid-auth": "Неверный email или пароль",
"error.invalid-domain": "Неверный домен: {domain}",
"error.invalid-email": "Неверный email-адрес",
"error.max-character-length": "Maximum length is {max} character{max, plural, one {} other {s}}",
"error.max-domains": "Слишком много доменов, максимум {max}",
"error.maximum": "Максимум {max}",
"error.min-character-length": "Minimum length is {min} character{min, plural, one {} other {s}}",
"error.minimum": "Минимум {min}",
"error.passwords-must-match": "Пароли должны совпадать",
"error.required": "Обязательное поле",
"expires.on": "Истекает: {date}",
"footer.github-fork": "Fork me on Github",
"host.flags.block-exploits": "Блокировать известные эксплойты",
"host.flags.cache-assets": "Кэшировать ресурсы",
"host.flags.preserve-path": "Сохранять путь",
"host.flags.protocols": "Протоколы",
"host.flags.websockets-upgrade": "Поддержка WebSocket",
"host.forward-port": "Порт перенаправления",
"host.forward-scheme": "Схема",
"hosts": "Хосты",
"http-only": "Только HTTP",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt через DNS",
"lets-encrypt-via-http": "Let's Encrypt через HTTP",
"loading": "Загрузка…",
"login.title": "Авторизация",
"nginx-config.label": "Своя Nginx-конфигурация",
"nginx-config.placeholder": "# Введите здесь свою Nginx-конфигурацию, будьте осторожны!",
"no-permission-error": "You do not have access to view this.",
"notfound.action": "Вернуться на главную",
"notfound.content": "Извините, но страница, которую вы ищете, не найдена",
"notfound.title": "Упс… Вы попали на страницу ошибки",
"notification.error": "Ошибка",
"notification.object-deleted": "{object} удален",
"notification.object-disabled": "{object} выключен",
"notification.object-enabled": "{object} включен",
"notification.object-renewed": "{object} продлен",
"notification.object-saved": "{object} сохранен",
"notification.success": "Успешно",
"object.actions-title": "{object} #{id}",
"object.add": "Добавить {object}",
"object.delete": "Удалить {object}",
"object.delete.content": "Вы уверены, что хотите удалить {object}?",
"object.edit": "Изменить {object}",
"object.empty": "{objects} отстутствуют",
"object.event.created": "{object} создан",
"object.event.deleted": "{object} удален",
"object.event.disabled": "{object} выключен",
"object.event.enabled": "{object} включен",
"object.event.renewed": "{object} продлен",
"object.event.updated": "{object} обновлен",
"offline": "Офлайн",
"online": "Онлайн",
"options": "Параметры",
"password": "Пароль",
"password.generate": "Сгенерировать случайный пароль",
"password.hide": "Скрыть пароль",
"password.show": "Показать пароль",
"permissions.hidden": "Скрыто",
"permissions.manage": "Управление",
"permissions.view": "Только просмотр",
"permissions.visibility.all": "Все элементы",
"permissions.visibility.title": "Видимость элементов",
"permissions.visibility.user": "Созданные элементы",
"proxy-host": "Прокси-хост",
"proxy-host.forward-host": "Хост / IP перенаправления",
"proxy-hosts": "Прокси-хосты",
"proxy-hosts.count": "{count} {count, plural, one {прокси-хост} few {прокси-хоста} many {прокси-хостов} other {прокси-хоста}}",
"public": "Публичный",
"redirection-host": "Редирект-хост",
"redirection-host.forward-domain": "Домен перенаправления",
"redirection-host.forward-http-code": "HTTP Code",
"redirection-hosts": "Редирект-хосты",
"redirection-hosts.count": "{count} {count, plural, one {редирект-хост} few {редирект-хоста} many {редирект-хостов} other {редирект-хоста}}",
"role.admin": "Администратор",
"role.standard-user": "Обычный пользователь",
"save": "Сохранить",
"setting": "Настройка",
"settings": "Настройки",
"settings.default-site": "Страница по умолчанию",
"settings.default-site.404": "404-страница",
"settings.default-site.444": "Нет ответа (444)",
"settings.default-site.congratulations": "Страница поздравления",
"settings.default-site.description": "Что показывать, когда Nginx получает неизвестный хост",
"settings.default-site.html": "Свой HTML",
"settings.default-site.html.placeholder": "<!-- Введите здесь свой HTML-контент -->",
"settings.default-site.redirect": "Перенаправление",
"setup.preamble": "Начните с создания учётной записи администратора.",
"setup.title": "Добро пожаловать!",
"sign-in": "Войти",
"ssl-certificate": "SSL-сертификат",
"stream": "Поток",
"stream.forward-host": "Хост перенаправления",
"stream.incoming-port": "Входящий порт",
"streams": "Потоки",
"streams.count": "{count} {count, plural, one {поток} few {потока} many {потоков} other {потока}}",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "Проверить",
"user": "Пользователь",
"user.change-password": "Изменить пароль",
"user.confirm-password": "Повторите пароль",
"user.current-password": "Текущий пароль",
"user.edit-profile": "Изменить профиль",
"user.full-name": "Полное имя",
"user.login-as": "Войти как {name}",
"user.logout": "Выйти",
"user.new-password": "Новый пароль",
"user.nickname": "Псевдоним",
"user.set-password": "Задать пароль",
"user.set-permissions": "Set Permissions for {name}",
"user.switch-dark": "Включить тёмную тему",
"user.switch-light": "Включить светлую тему",
"username": "Логин",
"users": "Пользователи"
}

View File

@@ -0,0 +1,216 @@
{
"access-list": "zoznam prístupov",
"access-list.access-count": "{count} {count, plural, one {pravidlo} few {pravidlá} other {pravidiel}}",
"access-list.auth-count": "{count} {count, plural, one {používateľ} few {používatelia} other {používateľov}}",
"access-list.help-rules-last": "Keď existuje aspoň jedno pravidlo, toto pravidlo „zamietnuť všetko“ bude pridané ako posledné",
"access-list.help.rules-order": "Upozornenie: pravidlá povoliť a zamietnuť budú uplatňované v poradí, v akom sú definované.",
"access-list.pass-auth": "Odoslať overenie na Upstream",
"access-list.public": "Verejne prístupné",
"access-list.public.subtitle": "Nie je potrebné základné overenie",
"access-list.satisfy-any": "Splniť ktorékoľvek",
"access-list.subtitle": "{users} {users, plural, one {používateľ} few {používatelia} other {používateľov}}, {rules} {rules, plural, one {pravidlo} few {pravidlá} other {pravidiel}} - Vytvorené: {date}",
"access-lists": "Zoznamy prístupov",
"action.add": "Pridať",
"action.add-location": "Pridať umiestnenie",
"action.close": "Zavrieť",
"action.delete": "Vymazať",
"action.disable": "Deaktivovať",
"action.download": "Stiahnuť",
"action.edit": "Upraviť",
"action.enable": "Aktivovať",
"action.permissions": "Oprávnenia",
"action.renew": "Obnoviť",
"action.view-details": "Zobraziť podrobnosti",
"auditlogs": "Záznamy auditu",
"cancel": "Zrušiť",
"certificate": "Certifikát",
"certificate.custom-certificate": "Certifikát",
"certificate.custom-certificate-key": "Kľúč certifikátu",
"certificate.custom-intermediate": "Sprostredkovateľský certifikát",
"certificate.in-use": "Používa sa",
"certificate.none.subtitle": "Nie je priradený žiadny certifikát",
"certificate.none.subtitle.for-http": "Tento hostiteľ nebude používať HTTPS",
"certificate.none.title": "Žiadny",
"certificate.not-in-use": "Nepoužíva sa",
"certificate.renew": "Obnoviť certifikát",
"certificates": "Certifikáty",
"certificates.custom": "Vlastný certifikát",
"certificates.custom.warning": "Súbory kľúčov chránené heslom nie sú podporované.",
"certificates.dns.credentials": "Obsah súboru s prihlasovacími údajmi",
"certificates.dns.credentials-note": "Tento doplnok vyžaduje konfiguračný súbor obsahujúci API token alebo iné prihlasovacie údaje vášho poskytovateľa",
"certificates.dns.credentials-warning": "Tieto údaje budú uložené v databáze a v súbore ako obyčajný text!",
"certificates.dns.propagation-seconds": "Propagácia v sekundách",
"certificates.dns.propagation-seconds-note": "Ponechajte prázdne pre predvolenú hodnotu doplnku. Počet sekúnd, počas ktorých sa čaká na propagáciu DNS.",
"certificates.dns.provider": "DNS poskytovateľ",
"certificates.dns.warning": "Táto sekcia vyžaduje znalosť Certbotu a jeho DNS doplnkov. Prosím, pozrite si dokumentáciu príslušného doplnku.",
"certificates.http.reachability-404": "Na tejto doméne bol nájdený server, ale nezdá sa, že ide o Nginx Proxy Manager. Uistite sa, že vaša doména smeruje na IP, kde beží vaša inštancia NPM.",
"certificates.http.reachability-failed-to-check": "Nepodarilo sa overiť dostupnosť kvôli chybe komunikácie so službou site24x7.com.",
"certificates.http.reachability-not-resolved": "Na tejto doméne nie je dostupný žiadny server. Uistite sa, že doména existuje a smeruje na IP adresu s NPM a ak je to potrebné, port 80 je presmerovaný vo vašom smerovači.",
"certificates.http.reachability-ok": "Váš server je dostupný a vytvorenie certifikátu by malo byť možné.",
"certificates.http.reachability-other": "Na tejto doméne bol nájdený server, ale vrátil neočakávaný stavový kód {code}. Je to NPM server? Uistite sa prosím, že doména smeruje na IP, kde beží vaša inštancia NPM.",
"certificates.http.reachability-wrong-data": "Na tejto doméne bol nájdený server, ale vrátil neočakávané údaje. Je to NPM server? Uistite sa, že doména smeruje na IP, kde beží vaša inštancia NPM.",
"certificates.http.test-results": "Výsledky testu",
"certificates.http.warning": "Tieto domény musia byť už nakonfigurované tak, aby smerovali na túto inštaláciu.",
"certificates.request.subtitle": "pomocou Let's Encrypt",
"certificates.request.title": "Vyžiadať nový certifikát",
"column.access": "Prístup",
"column.authorization": "Autorizácia",
"column.authorizations": "Autorizácie",
"column.custom-locations": "Vlastné umiestnenia",
"column.destination": "Cieľ",
"column.details": "Podrobnosti",
"column.email": "Email",
"column.event": "Udalosť",
"column.expires": "Platnosť do",
"column.http-code": "Prístup",
"column.incoming-port": "Vstupný port",
"column.name": "Názov",
"column.protocol": "Protokol",
"column.provider": "Poskytovateľ",
"column.roles": "Roly",
"column.rules": "Pravidlá",
"column.satisfy": "Splniť",
"column.satisfy-all": "Všetky",
"column.satisfy-any": "Ktorékoľvek",
"column.scheme": "Schéma",
"column.source": "Zdroj",
"column.ssl": "SSL",
"column.status": "Stav",
"created-on": "Vytvorené: {date}",
"dashboard": "Panel",
"dead-host": "404 Hostiteľ",
"dead-hosts": "404 Hostitelia",
"dead-hosts.count": "{count} {count, plural, one {404 hostiteľ} few {404 hostitelia} other {404 hostiteľov}}",
"disabled": "Deaktivované",
"domain-names": "Doménové mená",
"domain-names.max": "Maximálne {count} doménových mien",
"domain-names.placeholder": "Začnite písať pre pridanie domény...",
"domain-names.wildcards-not-permitted": "Wildcards nie sú pre tento typ povolené",
"domain-names.wildcards-not-supported": "Wildcards nie sú podporované pre túto certifikačnú autoritu",
"domains.force-ssl": "Vynútiť SSL",
"domains.hsts-enabled": "HSTS povolené",
"domains.hsts-subdomains": "HSTS pre subdomény",
"domains.http2-support": "Podpora HTTP/2",
"domains.use-dns": "Použiť DNS výzvu",
"email-address": "Emailová adresa",
"empty-search": "Nenašli sa žiadne výsledky",
"empty-subtitle": "Prečo nevytvoríte nejaký?",
"enabled": "Aktivované",
"error.access.at-least-one": "Je vyžadovaná aspoň jedna autorizácia alebo jedno prístupové pravidlo",
"error.access.duplicate-usernames": "Používateľské mená pre autorizáciu musia byť jedinečné",
"error.invalid-auth": "Neplatný email alebo heslo",
"error.invalid-domain": "Neplatná doména: {domain}",
"error.invalid-email": "Neplatná emailová adresa",
"error.max-character-length": "Maximálna dĺžka je {max} znak{max, plural, one {} few {y} other {ov}}",
"error.max-domains": "Príliš veľa domén, maximum je {max}",
"error.maximum": "Maximum je {max}",
"error.min-character-length": "Minimálna dĺžka je {min} znak{min, plural, one {} few {y} other {ov}}",
"error.minimum": "Minimum je {min}",
"error.passwords-must-match": "Heslá sa musia zhodovať",
"error.required": "Toto pole je povinné",
"expires.on": "Platnosť do: {date}",
"footer.github-fork": "Forknite ma na GitHube",
"host.flags.block-exploits": "Blokovať bežné exploity",
"host.flags.cache-assets": "Uložiť zdroje do vyrovnávacej pamäte",
"host.flags.preserve-path": "Zachovať cestu",
"host.flags.protocols": "Protokoly",
"host.flags.websockets-upgrade": "Podpora WebSockets",
"host.forward-port": "Port presmerovania",
"host.forward-scheme": "Schéma",
"hosts": "Hostitelia",
"http-only": "Len HTTP",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt cez DNS",
"lets-encrypt-via-http": "Let's Encrypt cez HTTP",
"loading": "Načítava sa…",
"login.title": "Prihláste sa do svojho účtu",
"nginx-config.label": "Vlastná Nginx konfigurácia",
"nginx-config.placeholder": "# Zadajte vlastnú Nginx konfiguráciu na vlastné riziko!",
"no-permission-error": "Nemáte oprávnenie na zobrazenie tohto obsahu.",
"notfound.action": "Späť na hlavnú stránku",
"notfound.content": "Ľutujeme, stránka, ktorú hľadáte, nebola nájdená",
"notfound.title": "Ups… Našli ste chybovú stránku",
"notification.error": "Chyba",
"notification.object-deleted": "{object} bol odstránený",
"notification.object-disabled": "{object} bol deaktivovaný",
"notification.object-enabled": "{object} bol aktivovaný",
"notification.object-renewed": "{object} bol obnovený",
"notification.object-saved": "{object} bol uložené",
"notification.success": "Úspech",
"object.actions-title": "{object} #{id}",
"object.add": "Pridať {object}",
"object.delete": "Vymazať {object}",
"object.delete.content": "Naozaj chcete vymazať tento {object}?",
"object.edit": "Upraviť {object}",
"object.empty": "Nie sú žiadne/y {objects}",
"object.event.created": "Vytvorený {object}",
"object.event.deleted": "Vymazaný {object}",
"object.event.disabled": "Deaktivovaný {object}",
"object.event.enabled": "Aktivovaný {object}",
"object.event.renewed": "Obnovený {object}",
"object.event.updated": "Aktualizovaný {object}",
"offline": "Offline",
"online": "Online",
"options": "Možnosti",
"password": "Heslo",
"password.generate": "Vygenerovať náhodné heslo",
"password.hide": "Skryť heslo",
"password.show": "Zobraziť heslo",
"permissions.hidden": "Skryté",
"permissions.manage": "Spravovať",
"permissions.view": "Len na zobrazenie",
"permissions.visibility.all": "Všetky položky",
"permissions.visibility.title": "Viditeľnosť položky",
"permissions.visibility.user": "Len vytvorené položky",
"proxy-host": "Proxy hostiteľa",
"proxy-host.forward-host": "Cieľový názov hostiteľa / IP",
"proxy-hosts": "Proxy hostitelia",
"proxy-hosts.count": "{count} {count, plural, one {proxy hostiteľ} few {proxy hostitelia} other {proxy hostiteľov}}",
"public": "Verejné",
"redirection-host": "presmerovacieho hostiteľa",
"redirection-host.forward-domain": "Cieľová doména",
"redirection-host.forward-http-code": "HTTP kód",
"redirection-hosts": "Presmerovací hostitelia",
"redirection-hosts.count": "{count} {count, plural, one {presmerovací hostiteľ} few {presmerovací hostitelia} other {presmerovacích hostiteľov}}",
"role.admin": "Administrátor",
"role.standard-user": "Bežný používateľ",
"save": "Uložiť",
"setting": "Nastavenie",
"settings": "Nastavenia",
"settings.default-site": "Predvolená stránka",
"settings.default-site.404": "Stránka 404",
"settings.default-site.444": "Bez odpovede (444)",
"settings.default-site.congratulations": "Gratulačná stránka",
"settings.default-site.description": "Čo zobraziť, keď Nginx zachytí neznámeho hostiteľa",
"settings.default-site.html": "Vlastné HTML",
"settings.default-site.html.placeholder": "<!-- Sem zadajte vlastný HTML obsah -->",
"settings.default-site.redirect": "Presmerovať",
"setup.preamble": "Začnite vytvorením administrátorského účtu.",
"setup.title": "Vitajte!",
"sign-in": "Prihlásiť sa",
"ssl-certificate": "SSL certifikát",
"stream": "Stream",
"stream.forward-host": "Cieľový hostiteľ",
"stream.incoming-port": "Vstupný port",
"streams": "Streamy",
"streams.count": "{count} {count, plural, one {stream} few {streamy} other {streamov}}",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "Test",
"user": "používateľa",
"user.change-password": "Zmeniť heslo",
"user.confirm-password": "Potvrdiť heslo",
"user.current-password": "Aktuálne heslo",
"user.edit-profile": "Upraviť profil",
"user.full-name": "Celé meno",
"user.login-as": "Prihlásiť sa ako {name}",
"user.logout": "Odhlásiť sa",
"user.new-password": "Nové heslo",
"user.nickname": "Prezývka",
"user.set-password": "Nastaviť heslo",
"user.set-permissions": "Nastaviť oprávnenia pre {name}",
"user.switch-dark": "Prepnúť na tmavý režim",
"user.switch-light": "Prepnúť na svetlý režim",
"username": "Používateľské meno",
"users": "Používatelia"
}

216
frontend/src/locale/lang/zh.json Executable file
View File

@@ -0,0 +1,216 @@
{
"access-list": "通信规则",
"access-list.access-count": "{count} 条规则",
"access-list.auth-count": "{count} 个用户",
"access-list.help-rules-last": "当至少存在1条规则时此拒绝所有规则将被添加到最后",
"access-list.help.rules-order": " 允许 (allow) 和禁止 (deny) 规则将按照它们定义的顺序执行。",
"access-list.pass-auth": "将认证传递给上游",
"access-list.public": "公开可访问",
"access-list.public.subtitle": "无需基本认证",
"access-list.satisfy-any": "满足任意条件",
"access-list.subtitle": "{users} 个用户, {rules} 条规则 - 创建时间: {date}",
"access-lists": "通信规则",
"action.add": "添加",
"action.add-location": "添加路径规则(Location)",
"action.close": "关闭",
"action.delete": "删除",
"action.disable": "禁用",
"action.download": "下载",
"action.edit": "编辑",
"action.enable": "启用",
"action.permissions": "权限",
"action.renew": "续期",
"action.view-details": "查看详情",
"auditlogs": "审计日志",
"cancel": "取消",
"certificate": "证书",
"certificate.custom-certificate": "证书",
"certificate.custom-certificate-key": "证书密钥",
"certificate.custom-intermediate": "中间证书",
"certificate.in-use": "使用中",
"certificate.none.subtitle": "未分配证书",
"certificate.none.subtitle.for-http": "此主机将不使用 HTTPS",
"certificate.none.title": "无",
"certificate.not-in-use": "未使用",
"certificate.renew": "续期证书",
"certificates": "证书列表",
"certificates.custom": "自定义证书",
"certificates.custom.warning": "不支持受密码保护的密钥文件。",
"certificates.dns.credentials": "凭据文件内容",
"certificates.dns.credentials-note": "此插件需要一个包含 API 令牌或提供商其他凭证的配置文件",
"certificates.dns.credentials-warning": "此数据将以明文形式存储在数据库和文件中!",
"certificates.dns.propagation-seconds": "传播时间 (秒)",
"certificates.dns.propagation-seconds-note": "留空以使用插件默认值。等待DNS传播的秒数。",
"certificates.dns.provider": "DNS 提供商",
"certificates.dns.warning": "本节需要您具备一些关于 Certbot 及其 DNS 插件的知识,请参阅相应插件的官方文档。",
"certificates.http.reachability-404": "在此域名下找到了一个服务器,但它似乎不是 Nginx 代理管理器。请确保您的域名指向 NPM 实例运行的 IP 地址。",
"certificates.http.reachability-failed-to-check": "由于与site24x7.com通信错误无法检查可达性。",
"certificates.http.reachability-not-resolved": "此域名下没有可用的服务器。请确保您的域名存在并指向NPM实例运行的 IP 地址,如有必要,请在路由器中转发 80 端口。",
"certificates.http.reachability-ok": "您的服务器可以访问,应该可以创建证书。",
"certificates.http.reachability-other": "在此域名下找到了一个服务器,但它返回了意外的状态码 {code}。它是 NPM 服务器吗请确保您的域名指向NPM实例运行的 IP 地址。",
"certificates.http.reachability-wrong-data": "在此域名下找到了一个服务器,但它返回了意外的数据。它是 NPM 服务器吗?请确保您的域名指向 NPM 实例运行的 IP 地址。",
"certificates.http.test-results": "测试结果",
"certificates.http.warning": "这些域名必须配置为指向本设备。",
"certificates.request.subtitle": "使用 Let's Encrypt",
"certificates.request.title": "申请新证书",
"column.access": "访问",
"column.authorization": "授权",
"column.authorizations": "授权列表",
"column.custom-locations": "自定义路径规则 (Locations)",
"column.destination": "目标",
"column.details": "详情",
"column.email": "邮箱",
"column.event": "事件",
"column.expires": "过期时间",
"column.http-code": "访问",
"column.incoming-port": "入站端口",
"column.name": "名称",
"column.protocol": "协议",
"column.provider": "提供商",
"column.roles": "角色",
"column.rules": "规则",
"column.satisfy": "满足",
"column.satisfy-all": "全部",
"column.satisfy-any": "任意",
"column.scheme": "协议",
"column.source": "来源",
"column.ssl": "SSL",
"column.status": "状态",
"created-on": "创建时间: {date}",
"dashboard": "仪表板",
"dead-host": "错误页面",
"dead-hosts": "错误页面列表",
"dead-hosts.count": "{count} 个错误页面列表",
"disabled": "已禁用",
"domain-names": "域名",
"domain-names.max": "{count} 个最多域名数量",
"domain-names.placeholder": "开始输入以添加域名...",
"domain-names.wildcards-not-permitted": "此类型不允许使用通配符",
"domain-names.wildcards-not-supported": "此 CA 不支持通配符",
"domains.force-ssl": "强制 SSL",
"domains.hsts-enabled": "HSTS 已启用",
"domains.hsts-subdomains": "HSTS 子域名",
"domains.http2-support": "HTTP/2 支持",
"domains.use-dns": "使用DNS验证",
"email-address": "邮箱地址",
"empty-search": "未找到结果",
"empty-subtitle": "为什么不由您来创建一个呢?",
"enabled": "已启用",
"error.access.at-least-one": "需要至少一个授权或访问规则",
"error.access.duplicate-usernames": "授权用户名必须唯一",
"error.invalid-auth": "无效的邮箱或密码",
"error.invalid-domain": "无效的域名: {domain}",
"error.invalid-email": "无效的邮箱地址",
"error.max-character-length": "最大长度为 {max} 个字符",
"error.max-domains": "域名过多,最多为 {max} 个",
"error.maximum": "最大值为 {max}",
"error.min-character-length": "最小长度为 {min} 个字符",
"error.minimum": "最小值为 {min}",
"error.passwords-must-match": "密码必须匹配",
"error.required": "此项为必填项",
"expires.on": "过期时间: {date}",
"footer.github-fork": "在 Github 上复刻 (For) 本项目",
"host.flags.block-exploits": "阻止常见攻击",
"host.flags.cache-assets": "缓存资源",
"host.flags.preserve-path": "保留路径",
"host.flags.protocols": "协议",
"host.flags.websockets-upgrade": "Websockets 支持",
"host.forward-port": "转发端口",
"host.forward-scheme": "协议",
"hosts": "主机列表",
"http-only": "仅 HTTP",
"lets-encrypt": "Let's Encrypt",
"lets-encrypt-via-dns": "Let's Encrypt DNS 验证",
"lets-encrypt-via-http": "Let's Encrypt HTTP 验证",
"loading": "加载中···",
"login.title": "登录您的账户",
"nginx-config.label": "自定义 Nginx 配置",
"nginx-config.placeholder": "# 在此输入您的自定义 Nginx 配置,风险自负!",
"no-permission-error": "您无权查看此内容。",
"notfound.action": "返回首页",
"notfound.content": "很抱歉,您要查找的页面未找到",
"notfound.title": "糟糕...您刚刚找到了一个错误页面",
"notification.error": "错误",
"notification.object-deleted": "{object} 已被删除",
"notification.object-disabled": "{object} 已被禁用",
"notification.object-enabled": "{object} 已被启用",
"notification.object-renewed": "{object} 已续期",
"notification.object-saved": "{object} 已保存",
"notification.success": "成功",
"object.actions-title": "{object} #{id}",
"object.add": "添加 {object}",
"object.delete": "删除 {object}",
"object.delete.content": "您确定要删除 {object} 吗?",
"object.edit": "编辑 {object}",
"object.empty": "没有 {objects}",
"object.event.created": "已创建 {object}",
"object.event.deleted": "已删除 {object}",
"object.event.disabled": "已禁用 {object}",
"object.event.enabled": "已启用 {object}",
"object.event.renewed": "已续期 {object}",
"object.event.updated": "已更新 {object}",
"offline": "离线",
"online": "在线",
"options": "选项",
"password": "密码",
"password.generate": "生成随机密码",
"password.hide": "隐藏密码",
"password.show": "显示密码",
"permissions.hidden": "隐藏",
"permissions.manage": "管理",
"permissions.view": "仅查看",
"permissions.visibility.all": "所有项目",
"permissions.visibility.title": "项目可见性",
"permissions.visibility.user": "仅创建的项目",
"proxy-host": "代理服务",
"proxy-host.forward-host": "转发主机名 / IP",
"proxy-hosts": "代理服务列表",
"proxy-hosts.count": "{count} 个代理服务",
"public": "公开",
"redirection-host": "重定向主机",
"redirection-host.forward-domain": "转发域名",
"redirection-host.forward-http-code": "HTTP 状态码",
"redirection-hosts": "重定向主机列表",
"redirection-hosts.count": "{count} 个重定向主机",
"role.admin": "管理员",
"role.standard-user": "标准用户",
"save": "保存",
"setting": "设置",
"settings": "设置列表",
"settings.default-site": "默认站点",
"settings.default-site.404": "错误页面",
"settings.default-site.444": "无响应 (444)",
"settings.default-site.congratulations": "欢迎页面",
"settings.default-site.description": "当 Nginx 遇到未知主机时显示什么",
"settings.default-site.html": "自定义 HTML",
"settings.default-site.html.placeholder": "<!-- 在此输入您的自定义 HTML 内容 -->",
"settings.default-site.redirect": "重定向",
"setup.preamble": "通过创建您的管理员账户开始使用。",
"setup.title": "欢迎!",
"sign-in": "登录",
"ssl-certificate": "SSL 证书",
"stream": "端口转发",
"stream.forward-host": "转发主机",
"stream.incoming-port": "入站端口",
"streams": "端口转发列表",
"streams.count": "{count} 个端口转发",
"streams.tcp": "TCP",
"streams.udp": "UDP",
"test": "测试",
"user": "用户",
"user.change-password": "修改密码",
"user.confirm-password": "确认密码",
"user.current-password": "当前密码",
"user.edit-profile": "编辑资料",
"user.full-name": "全名",
"user.login-as": "登录用户 {name}",
"user.logout": "退出登录",
"user.new-password": "新密码",
"user.nickname": "昵称",
"user.set-password": "设置密码",
"user.set-permissions": "为用户 {name} 设置权限",
"user.switch-dark": "切换到深色模式",
"user.switch-light": "切换到浅色模式",
"username": "用户名",
"users": "用户列表"
}

View File

@@ -0,0 +1,7 @@
## Was ist eine Zugriffsliste?
Zugriffslisten bieten eine Blacklist oder Whitelist mit bestimmten Client-IP-Adressen sowie eine Authentifizierung für die Proxy-Hosts über die grundlegende HTTP-Authentifizierung.
Sie können mehrere Client-Regeln, Benutzernamen und Passwörter für eine einzelne Zugriffsliste konfigurieren und diese dann auf einen oder mehrere Proxy-Hosts anwenden.
Dies ist besonders nützlich für weitergeleitete Webdienste, die keine integrierten Authentifizierungsmechanismen haben, oder wenn Sie sich vor unbekannten Clients schützen möchten.

View File

@@ -0,0 +1,32 @@
## Hilfe zu Zertifikaten
### HTTP-Zertifikat
Ein HTTP-validiertes Zertifikat bedeutet, dass Let's Encrypt-Server
versuchen, Ihre Domains über HTTP (nicht HTTPS!) zu erreichen, und wenn dies erfolgreich ist,
stellen sie Ihr Zertifikat aus.
Für diese Methode müssen Sie einen _Proxy-Host_ für Ihre Domain(s) erstellen, der
über HTTP zugänglich ist und auf diese Nginx-Installation verweist. Nachdem ein Zertifikat
ausgestellt wurde, können Sie den _Proxy-Host_ so ändern, dass dieses Zertifikat auch für HTTPS-Verbindungen
verwendet wird. Der _Proxy-Host_ muss jedoch weiterhin für den HTTP-Zugriff konfiguriert sein,
damit das Zertifikat erneuert werden kann.
Dieser Prozess unterstützt keine Wildcard-Domains.
### DNS-Zertifikat
Für ein DNS-validiertes Zertifikat müssen Sie ein DNS-Provider-Plugin verwenden. Dieser DNS-
Provider wird verwendet, um temporäre Einträge auf Ihrer Domain zu erstellen. Anschließend fragt Let's
Encrypt diese Einträge ab, um sicherzustellen, dass Sie der Eigentümer sind. Bei Erfolg wird
Ihr Zertifikat ausgestellt.
Sie müssen vor der Beantragung dieser Art von Zertifikat keinen _Proxy-Host_ erstellen.
Sie müssen Ihren _Proxy-Host_ auch nicht für den HTTP-Zugriff konfigurieren.
Dieser Prozess unterstützt Wildcard-Domains.
### Benutzerdefiniertes Zertifikat
Verwenden Sie diese Option, um Ihr eigenes SSL-Zertifikat hochzuladen, das Ihnen von Ihrer eigenen
Zertifizierungsstelle bereitgestellt wurde.

View File

@@ -0,0 +1,10 @@
## Was ist ein 404-Host?
Ein 404-Host ist ein Host-Setup, das eine 404-Seite anzeigt.
Dies kann nützlich sein, wenn Ihre Domain in Suchmaschinen gelistet ist und Sie
eine ansprechendere Fehlerseite bereitstellen oder den Suchindexern ausdrücklich mitteilen möchten, dass
die Domain-Seiten nicht mehr existieren.
Ein weiterer Vorteil dieses Hosts besteht darin, dass Sie die Protokolle für Zugriffe darauf verfolgen und
die Verweise anzeigen können.

View File

@@ -0,0 +1,7 @@
## Was ist ein Proxy-Host?
Ein Proxy-Host ist der eingehende Endpunkt für einen Webdienst, den Sie weiterleiten möchten.
Er bietet optionale SSL-Terminierung für Ihren Dienst, der möglicherweise keine integrierte SSL-Unterstützung hat.
Proxy-Hosts sind die häufigste Verwendung für den Nginx Proxy Manager.

View File

@@ -0,0 +1,7 @@
## Was ist ein Redirection Host?
Ein Redirection Host leitet Anfragen von der eingehenden Domain weiter und leitet den
Besucher zu einer anderen Domain weiter.
Der häufigste Grund für die Verwendung dieses Host-Typs ist, wenn Ihre Website die
Domain wechselt, aber Sie noch Suchmaschinen- oder Referrer-Links haben, die auf die alte Domain verweisen.

View File

@@ -0,0 +1,6 @@
## Was ist ein Stream?
Ein Stream ist eine relativ neue Funktion von Nginx, die dazu dient, TCP/UDP-Datenverkehr
direkt an einen anderen Computer im Netzwerk weiterzuleiten.
Wenn Sie Spielserver, FTP- oder SSH-Server betreiben, kann dies sehr nützlich sein.

View File

@@ -0,0 +1,6 @@
export * as AccessLists from "./AccessLists.md";
export * as Certificates from "./Certificates.md";
export * as DeadHosts from "./DeadHosts.md";
export * as ProxyHosts from "./ProxyHosts.md";
export * as RedirectionHosts from "./RedirectionHosts.md";
export * as Streams from "./Streams.md";

View File

@@ -0,0 +1,7 @@
## ¿Qué es una Lista de Acceso?
Las Listas de Acceso proporcionan una lista negra o blanca de direcciones IP de cliente específicas junto con autenticación para los Hosts Proxy a través de Autenticación HTTP Básica.
Puede configurar múltiples reglas de cliente, nombres de usuario y contraseñas para una única Lista de Acceso y luego aplicarla a uno o más _Hosts Proxy_.
Esto es más útil para servicios web reenviados que no tienen mecanismos de autenticación integrados o cuando desea protegerse de clientes desconocidos.

View File

@@ -0,0 +1,32 @@
## Ayuda de Certificados
### Certificado HTTP
Un certificado validado por HTTP significa que los servidores de Let's Encrypt
intentarán acceder a tus dominios a través de HTTP (¡no HTTPS!) y, si tienen éxito,
emitirán tu certificado.
Para este método, deberás tener un _Host Proxy_ creado para tu(s) dominio(s) que
sea accesible por HTTP y que apunte a esta instalación de Nginx. Después de que se
haya emitido un certificado, puedes modificar el _Host Proxy_ para que también use
este certificado para conexiones HTTPS. Sin embargo, el _Host Proxy_ seguirá
necesitando estar configurado para acceso HTTP para que el certificado se renueve.
Este proceso _no_ admite dominios comodín.
### Certificado DNS
Un certificado validado por DNS requiere que uses un complemento de Proveedor de DNS.
Este Proveedor de DNS se usará para crear registros temporales en tu dominio y luego
Let's Encrypt consultará esos registros para asegurarse de que eres el propietario y,
si tiene éxito, emitirá tu certificado.
No necesitas tener un _Host Proxy_ creado antes de solicitar este tipo de certificado.
Tampoco necesitas tener tu _Host Proxy_ configurado para acceso HTTP.
Este proceso __ admite dominios comodín.
### Certificado Personalizado
Usa esta opción para cargar tu propio Certificado SSL, proporcionado por tu propia
Autoridad de Certificación.

View File

@@ -0,0 +1,10 @@
## ¿Qué es un Host 404?
Un Host 404 es simplemente una configuración de host que muestra una página 404.
Esto puede ser útil cuando tu dominio está listado en los motores de búsqueda y deseas
proporcionar una página de error más agradable o específicamente para indicar a los indexadores de búsqueda que
las páginas del dominio ya no existen.
Otro beneficio de tener este host es rastrear los registros de visitas a él y
ver los referentes.

View File

@@ -0,0 +1,7 @@
## ¿Qué es un Host Proxy?
Un Host Proxy es el punto de entrada para un servicio web que deseas reenviar.
Proporciona terminación SSL opcional para tu servicio que podría no tener soporte SSL integrado.
Los Hosts Proxy son el uso más común del Nginx Proxy Manager.

View File

@@ -0,0 +1,7 @@
## ¿Qué es un Host de Redirección?
Un Host de Redirección redirigirá las solicitudes del dominio entrante e impulsará al
visitante a otro dominio.
La razón más común para usar este tipo de host es cuando tu sitio web cambia de
dominios pero aún tienes enlaces de motores de búsqueda o referencias apuntando al dominio anterior.

View File

@@ -0,0 +1,6 @@
## ¿Qué es un Stream?
Una característica relativamente nueva para Nginx, un Stream servirá para reenviar tráfico TCP/UDP
directamente a otra computadora en la red.
Si estás ejecutando servidores de juegos, FTP o servidores SSH esto puede ser muy útil.

View File

@@ -0,0 +1,6 @@
export * as AccessLists from "./AccessLists.md";
export * as Certificates from "./Certificates.md";
export * as DeadHosts from "./DeadHosts.md";
export * as ProxyHosts from "./ProxyHosts.md";
export * as RedirectionHosts from "./RedirectionHosts.md";
export * as Streams from "./Streams.md";

View File

@@ -1,8 +1,11 @@
// import * as de from "./de/index";
// import * as fa from "./fa/index";
import * as de from "./de/index";
import * as en from "./en/index";
import * as ja from "./ja/index";
import * as sk from "./sk/index";
import * as zh from "./zh/index";
import * as pl from "./pl/index";
const items: any = { en };
const items: any = { en, de, ja, sk, zh, pl };
const fallbackLang = "en";

View File

@@ -0,0 +1,8 @@
## アクセスリストとは
アクセスリストは特定のクライアントIPへのブラックリストとホワイトリストを提供し、ベーシック認証によるプロキシホストへの認証を可能にします。
複数のクライアントルールやユーザー名とパスワードを一つのアクセスリストに設定し、一つ以上の _プロキシホスト_ に適応することができます。
これは認証システムを持たないサービスや不明なクライアントからの保護が必要な場合に有効です。

View File

@@ -0,0 +1,21 @@
## 証明書
### HTTP 証明書
HTTPによって検証された証明書はLet's EncryptサーバーがHTTPでドメインにアクセスを試みサーバーを管理していることを確認できた場合に発行される証明書です。
この方法では、HTTPアクセス可能でこのNginxを指しているドメインに対して _プロキシホスト_ を作成する必要があります。証明書が発行された後は、 _プロキシホスト_ を編集してこの証明書をHTTPS接続に使用するように設定できます。ただし、証明書の更新には、_プロキシホスト_ がHTTP接続用に設定された状態を維持する必要があります。
この方法はワイルドカードのドメインをサポート _していません_
### DNS 証明書
DNSによって検証された証明書にはDNSプロバイダープラグインが必要です。このプロバイダーはドメイン上に一時レコードを作成するために使用されます。その後Let's Encryptサーバーがそのレコードを参照し、あなたが所有していることを確認できると証明書が発行されます。
このタイプの証明書を作成する際に、 _プロキシホスト_ を作成する必要はありません。また、_プロキシホスト_ をHTTPアクセス用に設定する必要もありません。
この方法はワイルドカードのドメインをサポート _します_
### カスタム証明書
このオプションでは、あなたの証明書認証局によって提供された自身の証明書をアップロードして使用できます。

View File

@@ -0,0 +1,7 @@
## 404ホストとはなんですか?
404ホストとは、単に404ページを表示するよう設定されたホストです。
これは、検索エンジンに登録されたドメインに分かりやすいエラーページを提供したい場合や、検索エンジンのインデクサーにドメインページがもう存在しないことを伝えたい場合に便利です。
このホストを持つもう一つの利点は、アクセスログを追跡し、参照元を確認できることです。

View File

@@ -0,0 +1,7 @@
## プロキシホストとは何ですか?
プロキシホストは転送したいwebサービスの受信エンドポイントです。
サービスにSSLサーバーが組み込まれていない場合でも、オプションでSSL終端機能を提供します。
プロキシホストはNginx Proxy Managerのもっとも一般的な使用方法です。

View File

@@ -0,0 +1,5 @@
## リダイレクトホストとは何ですか?
リダイレクトホストは受信したリクエストを別のドメインにリダイレクトして訪問者に表示します。
このタイプのもっとも一般的な使用理由は、webサイトのドメインが変更されたが検索エンジンやリンクが古いドメインを指し続けている場合です。

View File

@@ -0,0 +1,5 @@
## ストリームとは何ですか?
Nginxの比較的新しい機能であるストリームは、TCP/UDPトラフィックをネットワーク上の別のコンピュータに直接転送します。
ゲームサーバー、FTPサーバー、SSHサーバーを運用している場合に便利です。

View File

@@ -0,0 +1,6 @@
export * as AccessLists from "./AccessLists.md";
export * as Certificates from "./Certificates.md";
export * as DeadHosts from "./DeadHosts.md";
export * as ProxyHosts from "./ProxyHosts.md";
export * as RedirectionHosts from "./RedirectionHosts.md";
export * as Streams from "./Streams.md";

View File

@@ -0,0 +1,7 @@
## Czym jest lista dostępu?
Listy dostępu zapewniają czarną lub białą listę określonych adresów IP klientów wraz z uwierzytelnianiem dla hostów proxy za pomocą podstawowego uwierzytelniania HTTP.
Możesz skonfigurować wiele reguł klienta, nazw użytkowników i haseł dla pojedynczej listy dostępu, a następnie zastosować ją do jednego lub więcej hostów proxy.
Jest to najbardziej przydatne w przypadku przekierowywanych usług internetowych, które nie mają wbudowanych mechanizmów uwierzytelniania lub gdy chcesz zabezpieczyć się przed nieznanymi klientami.

View File

@@ -0,0 +1,22 @@
## Pomoc dotycząca certyfikatów
### Certyfikat HTTP
Certyfikat weryfikowany przez HTTP oznacza, że serwery Let's Encrypt będą próbowały połączyć się z twoimi domenami przez HTTP (nie HTTPS!) i jeśli się to powiedzie, wydadzą twój certyfikat.
W przypadku tej metody musisz mieć utworzony Host proxy dla swoich domen, który jest dostępny przez HTTP i wskazuje na tę instalację Nginx.
Po otrzymaniu certyfikatu możesz zmodyfikować Host proxy, aby używał również tego certyfikatu do połączeń HTTPS. Jednak Host proxy nadal będzie musiał być skonfigurowany do dostępu przez HTTP, aby certyfikat mógł być odnawiany.
Ten proces nie obsługuje domen wieloznacznych (wildcard).
### Certyfikat DNS
Certyfikat weryfikowany przez DNS wymaga użycia wtyczki dostawcy DNS. Ten dostawca DNS zostanie użyty do utworzenia tymczasowych rekordów w twojej domenie, a następnie Let's Encrypt sprawdzi te rekordy, aby upewnić się, że jesteś właścicielem i jeśli się powiedzie, wydadzą twój certyfikat.
Nie musisz mieć utworzonego Hosta proxy przed wystąpieniem o ten typ certyfikatu. Nie musisz również mieć skonfigurowanego Hosta proxy do dostępu przez HTTP.
Ten proces obsługuje domeny wieloznaczne (wildcard).
### Własny certyfikat
Użyj tej opcji, aby przesłać własny certyfikat SSL, dostarczony przez twój własny urząd certyfikacji.

View File

@@ -0,0 +1,7 @@
## Czym jest host 404?
Host 404 to po prostu konfiguracja hosta, która wyświetla stronę 404.
Może to być przydatne, gdy twoja domena jest indeksowana w wyszukiwarkach i chcesz zapewnić ładniejszą stronę błędu lub konkretnie poinformować roboty indeksujące, że strony domeny już nie istnieją.
Kolejną zaletą posiadania tego hosta jest możliwość śledzenia logów dla odwiedzin oraz przeglądania źródeł ruchu (referrerów).

View File

@@ -0,0 +1,7 @@
## Czym jest host proxy?
Host proxy to punkt wejściowy dla usługi internetowej, którą chcesz przekierować.
Zapewnia opcjonalne zakończenie SSL dla twojej usługi, która może nie mieć wbudowanej obsługi SSL.
Hosty proxy są najpopularniejszym zastosowaniem Nginx Proxy Manager

View File

@@ -0,0 +1,5 @@
## Czym jest host przekierowania?
Host przekierowania przekierowuje żądania z domeny przychodzącej i przenosi odwiedzającego na inną domenę.
Najczęstszym powodem używania tego typu hosta jest sytuacja, gdy twoja strona internetowa zmienia domeny, ale nadal masz linki z wyszukiwarek lub odnośniki wskazujące na starą domenę.

View File

@@ -0,0 +1,5 @@
## Czym jest strumień?
Stosunkowo nowa funkcja dla Nginx, strumień służy do przekazywania ruchu TCP/UDP bezpośrednio na inny komputer/serwer w sieci.
Jeśli prowadzisz serwery gier, FTP lub SSH, może się to okazać przydatne

View File

@@ -0,0 +1,6 @@
export * as AccessLists from "./AccessLists.md";
export * as Certificates from "./Certificates.md";
export * as DeadHosts from "./DeadHosts.md";
export * as ProxyHosts from "./ProxyHosts.md";
export * as RedirectionHosts from "./RedirectionHosts.md";
export * as Streams from "./Streams.md";

View File

@@ -0,0 +1,7 @@
## Čo je zoznam prístupov?
Zoznamy prístupov poskytujú čiernu alebo bielu listinu konkrétnych IP adries klientov spolu s overovaním pre proxy hostiteľov prostredníctvom základného overovania HTTP.
Môžete nakonfigurovať viacero pravidiel pre klientov, používateľských mien a hesiel pre jeden zoznam prístupov a potom ho použiť na jeden alebo viacero proxy hostiteľov.
Toto je najužitočnejšie pre presmerované webové služby, ktoré nemajú zabudované overovacie mechanizmy, alebo ak sa chcete chrániť pred neznámymi klientmi.

View File

@@ -0,0 +1,32 @@
## Pomoc s certifikátmi
### Certifikát HTTP
Certifikát overený protokolom HTTP znamená, že servery Let's Encrypt sa
pokúsia pripojiť k vašim doménam cez protokol HTTP (nie HTTPS!) a v prípade úspechu
vydajú váš certifikát.
Pre túto metódu budete musieť mať pre svoje domény vytvorený _Proxy Host_, ktorý
je prístupný cez HTTP a smeruje na túto inštaláciu Nginx. Po vydaní certifikátu
môžete zmeniť _Proxy Host_ tak, aby tento certifikát používal aj pre HTTPS
pripojenia. _Proxy Host_ však bude stále potrebné nakonfigurovať pre prístup cez HTTP,
aby sa certifikát mohol obnoviť.
Tento proces _nepodporuje_ domény s divokými kartami.
### Certifikát DNS
Certifikát overený DNS vyžaduje použitie pluginu DNS Provider. Tento DNS
Provider sa použije na vytvorenie dočasných záznamov vo vašej doméne a potom Let's
Encrypt overí tieto záznamy, aby sa uistil, že ste vlastníkom, a ak bude úspešný,
vydá váš certifikát.
Pred požiadaním o tento typ certifikátu nie je potrebné vytvoriť _Proxy Host_.
Tiež nie je potrebné mať _Proxy Host_ nakonfigurovaný pre prístup HTTP.
Tento proces _podporuje_ domény s divokými kartami.
### Vlastný certifikát
Túto možnosť použite na nahratie vlastného SSL certifikátu, ktorý vám poskytla vaša
certifikačná autorita.

View File

@@ -0,0 +1,10 @@
## Čo je to 404 Hostiteľ?
404 Hostiteľ je jednoducho nastavenie hostiteľa, ktoré zobrazuje stránku 404.
To môže byť užitočné, ak je vaša doména uvedená vo vyhľadávačoch a chcete
poskytnúť krajšiu stránku s chybou alebo konkrétne oznámiť vyhľadávačom, že
stránky domény už neexistujú.
Ďalšou výhodou tohto hostiteľa je sledovanie protokolov o návštevách a
zobrazenie odkazov.

View File

@@ -0,0 +1,7 @@
## Čo je proxy hostiteľ?
Proxy hostiteľ je prichádzajúci koncový bod pre webovú službu, ktorú chcete presmerovať.
Poskytuje voliteľné ukončenie SSL pre vašu službu, ktorá nemusí mať zabudovanú podporu SSL.
Proxy hostitelia sú najbežnejším použitím pre Nginx Proxy Manager.

View File

@@ -0,0 +1,7 @@
## Čo je presmerovací hostiteľ?
Presmerovací hostiteľ presmeruje požiadavky z prichádzajúcej domény a presmeruje
návštevníka na inú doménu.
Najčastejším dôvodom na použitie tohto typu hostiteľa je situácia, keď vaša webová stránka zmení
doménu, ale stále máte odkazy vo vyhľadávačoch alebo referenčné odkazy smerujúce na starú doménu.

View File

@@ -0,0 +1,6 @@
## Čo je stream?
Stream je relatívne nová funkcia pre Nginx, ktorá slúži na presmerovanie TCP/UDP
dátového toku priamo do iného počítača v sieti.
Ak prevádzkujete herné servery, FTP alebo SSH servery, táto funkcia sa vám môže hodiť.

View File

@@ -0,0 +1,6 @@
export * as AccessLists from "./AccessLists.md";
export * as Certificates from "./Certificates.md";
export * as DeadHosts from "./DeadHosts.md";
export * as ProxyHosts from "./ProxyHosts.md";
export * as RedirectionHosts from "./RedirectionHosts.md";
export * as Streams from "./Streams.md";

View File

@@ -0,0 +1,7 @@
## 什么是通信规则?
通信规则提供了一个特定客户IP地址的黑名单或白名单以及通过基本HTTP认证对代理服务的认证。
你可以为一个通信规则配置多个客户规则、用户名和密码,然后将其应用于代理服务。
这对那些没有内置认证机制的转发网络服务或你想保护其免受未知客户的访问是最有用的。

View File

@@ -0,0 +1,21 @@
## 证书帮助
### HTTP 证书
HTTP 验证的证书表示 Let's Encrypt 服务器将尝试通过 HTTP而非 HTTPS访问您的域名如果成功它们将为您颁发证书。
使用此方法时,您必须为您的域名创建一个可通过 HTTP 访问并指向此 Nginx 安装的 代理主机。在获得证书后,您可以修改该 代理主机,使其也使用此证书处理 HTTPS 连接。然而,为了证书能够续期,该 代理主机 仍需配置为支持 HTTP 访问。
此过程_不支持_通配符域名。
### DNS 证书
DNS 验证的证书要求您使用一个 DNS 服务商插件。该 DNS 服务商将用于在您的域名下创建临时记录,随后 Let's Encrypt 将查询这些记录以确认您是域名所有者,如果成功,它们将为您颁发证书。
请求此类证书前,您无需预先创建 代理主机,也无需将您的 代理主机 配置为支持 HTTP 访问。
此过程_支持_通配符域名。
### 自定义证书
使用此选项上传您自己的 SSL 证书,该证书由您自己的证书颁发机构提供。

View File

@@ -0,0 +1,7 @@
## 什么是错误页面?
错误页面是一个简单的主机设置,显示错误页面。
当你的域名被列入搜索引擎,而你想提供一个更好的错误页面或特别是告诉搜索索引者域名页面不再存在时,这可能是有用的。
拥有这种主机的另一个好处是可以跟踪点击它的日志并查看访问来源。

View File

@@ -0,0 +1,7 @@
## 什么是代理服务?
代理服务是你想转发网络应用的主机。
代理服务可以为没有SSL服务的网络应用提供SSL服务可选
代理服务是Nginx代理管理器的最常见用途之一。

Some files were not shown because too many files have changed in this diff Show More