Skip to content
Merged

v2.13.4 #4925

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
e2a8ffa
Add files via upload
lastsamurai26 Nov 3, 2025
8991e88
Update de.json
lastsamurai26 Nov 3, 2025
7e28d8a
Add files via upload
lastsamurai26 Nov 3, 2025
639ba3a
Update de.json
lastsamurai26 Nov 5, 2025
ceb098f
Fix typo in German locale for min character length
lastsamurai26 Nov 5, 2025
d0e20d4
Update de.json
lastsamurai26 Nov 5, 2025
cd3a09e
Update Certificates.md
lastsamurai26 Nov 5, 2025
1209303
Update DeadHosts.md
lastsamurai26 Nov 5, 2025
bf1ad15
Update de.json
lastsamurai26 Nov 5, 2025
b21d6d9
Fix German translations
lastsamurai26 Nov 5, 2025
9de40f0
Add Japanese language support and translations
Oka-Tak Nov 5, 2025
123f7d1
Add Spanish language support and translations
TeenBiscuits Nov 6, 2025
b3b1e94
Add Russian Support
kraineff Nov 8, 2025
58182fc
Add Russian case
kraineff Nov 8, 2025
8fdb609
More strings
kraineff Nov 8, 2025
5aa56c6
Fixes & New Strings
kraineff Nov 8, 2025
df1b414
Delete Spanish Test
TeenBiscuits Nov 10, 2025
7cde6ee
Add Spanish Test
TeenBiscuits Nov 10, 2025
12b000a
Add HTTP Code message to German locale
lastsamurai26 Nov 11, 2025
3a6b221
Add HTTP Code translation to German locale
lastsamurai26 Nov 11, 2025
a723177
FIX: Update HTTP code message in German locale
lastsamurai26 Nov 11, 2025
ba79bbc
Update German translation for HTTP code
lastsamurai26 Nov 11, 2025
74d381e
Add missing spanish translation
TeenBiscuits Nov 11, 2025
1600599
Fix column.http-code translation
TeenBiscuits Nov 11, 2025
441a726
Add scheme back in destination
7heMech Nov 11, 2025
c3954e9
Merge pull request #4824 from lastsamurai26/develop
jc21 Nov 11, 2025
8773ce2
Merge branch 'develop' into lang-spanish
TeenBiscuits Nov 12, 2025
f3633cb
Merge pull request #4850 from TeenBiscuits/lang-spanish
jc21 Nov 12, 2025
9f0f89f
Fix wrong translation for EN
jc21 Nov 11, 2025
711f312
Fix up language inconsistenties
jc21 Nov 12, 2025
ff792f7
Add translation for 'Renew Certificate' in de.json
lastsamurai26 Nov 12, 2025
e52975b
Translate 'Renew Certificate' to German
lastsamurai26 Nov 12, 2025
86c7cbd
Add certificate renewal message in German locale
lastsamurai26 Nov 12, 2025
f36d4e6
Fix: CustomCertificateModal Wrong displayname
lastsamurai26 Nov 12, 2025
40db26b
Merge branch 'NginxProxyManager:develop' into develop
lastsamurai26 Nov 12, 2025
f6aa25b
Merge branch 'develop' into develop
jc21 Nov 12, 2025
eee7496
Merge pull request #4917 from lastsamurai26/develop
jc21 Nov 12, 2025
28df6db
Merge pull request #4848 from Oka-Tak/develop
jc21 Nov 12, 2025
f649288
Merge branch 'develop' into develop
jc21 Nov 12, 2025
4557244
Merge pull request #4870 from kraineff/develop
jc21 Nov 12, 2025
06d7db4
Fix Russion locale, compiled file was comitted without a source file
jc21 Nov 12, 2025
1a36bdc
fix: Grammatical change
lastsamurai26 Nov 12, 2025
0344bb3
fix: Grammatical change
lastsamurai26 Nov 12, 2025
8460b28
Bump version
jc21 Nov 12, 2025
221c3ed
Merge pull request #4919 from lastsamurai26/develop
jc21 Nov 12, 2025
66aac3e
Add Chinese 中文
Firfr Nov 11, 2025
8e900db
Add Chinese HelpDoc
Firfr Nov 11, 2025
d66bb21
Add the new translation for "redirection-host.forward-http-code".
Firfr Nov 11, 2025
b26db50
Adds cn to check locales script
jc21 Nov 12, 2025
8aa46c1
Merge pull request #4921 from NginxProxyManager/Firfr-chinese
jc21 Nov 12, 2025
3c5ff81
Merge pull request #4910 from 7heMech/develop
jc21 Nov 12, 2025
2b5182d
Add Slovak language by @dodog in #4911
jc21 Nov 12, 2025
0373017
Add Polish locale
Nov 12, 2025
2ea5497
Merge pull request #4922 from NginxProxyManager/dodog-slovak
jc21 Nov 12, 2025
1a3d45f
Merge branch 'develop' into develop
jc21 Nov 12, 2025
c414516
Merge pull request #4924 from zdzichu6969/develop
jc21 Nov 12, 2025
5dde98c
Updates to polish locale after running through automated scripts
jc21 Nov 12, 2025
adee0e3
Merge branch 'master' into develop
jc21 Nov 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.13.3
2.13.4
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -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.3-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>
Expand Down
7 changes: 6 additions & 1 deletion frontend/check-locales.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [
Expand Down
68 changes: 54 additions & 14 deletions frontend/src/locale/IntlProvider.tsx
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,22 +1,73 @@
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);
}
};

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";
}
Expand All @@ -40,10 +91,7 @@ const getLocale = (short = false) => {
const cache = createIntlCache();

const initialMessages = loadMessages(getLocale());
let intl = createIntl(
{ locale: getLocale(), messages: initialMessages },
cache,
);
let intl = createIntl({ locale: getLocale(), messages: initialMessages }, cache);

const changeLocale = (locale: string): void => {
const messages = loadMessages(locale);
Expand Down Expand Up @@ -83,12 +131,4 @@ const T = ({
);
};

export {
localeOptions,
getFlagCodeForLocale,
getLocale,
createIntl,
changeLocale,
intl,
T,
};
export { localeOptions, getFlagCodeForLocale, getLocale, createIntl, changeLocale, intl, T };
216 changes: 216 additions & 0 deletions frontend/src/locale/lang/de.json
Original file line number Diff line number Diff line change
@@ -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"
}
2 changes: 1 addition & 1 deletion frontend/src/locale/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,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",
Expand Down
Loading