I18n app other (#24)

* New translation keys in en-US locale

* New translation keys in de-DE locale

* New translation keys in fr-FR locale

* New translation keys in it-IT locale

* New translation keys in pl-PL locale

* New translation keys in pt-PT locale

* New translation keys in tr-TR locale

* Add translation keys in app/invite, app/setup and other files

* Fix build

---------

Co-authored-by: Lokowitz <marvinlokowitz@gmail.com>
This commit is contained in:
vlalx 2025-05-17 19:23:34 +03:00 committed by GitHub
parent b8ed5ac1c5
commit 731ec1da69
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 223 additions and 22 deletions

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Verbindung wird hergestellt...",
"idpConnectingToFinished": "Verbunden",
"idpErrorConnectingTo": "Es gab ein Problem bei der Verbindung zu {name}. Bitte kontaktieren Sie Ihren Administrator.",
"idpErrorNotFound": "IdP nicht gefunden"
"idpErrorNotFound": "IdP nicht gefunden",
"expiresAt": "Läuft ab am",
"inviteInvalid": "Ungültige Einladung",
"inviteInvalidDescription": "Der Einladungslink ist ungültig.",
"inviteErrorWrongUser": "Einladung ist nicht für diesen Benutzer",
"inviteErrorUserNotExists": "Benutzer existiert nicht. Bitte erstelle zuerst ein Konto.",
"inviteErrorLoginRequired": "Du musst angemeldet sein, um eine Einladung anzunehmen",
"inviteErrorExpired": "Die Einladung ist möglicherweise abgelaufen",
"inviteErrorRevoked": "Die Einladung wurde möglicherweise widerrufen",
"inviteErrorTypo": "Es könnte ein Tippfehler im Einladungslink sein",
"pangolinSetup": "Einrichtung - Pangolin",
"orgNameRequired": "Organisationsname ist erforderlich",
"orgIdRequired": "Organisations-ID ist erforderlich",
"orgErrorCreate": "Beim Erstellen der Organisation ist ein Fehler aufgetreten",
"pageNotFound": "Seite nicht gefunden",
"pageNotFoundDescription": "Hoppla! Die gesuchte Seite existiert nicht.",
"overview": "Übersicht",
"home": "Startseite",
"sites": "Standorte",
"resources": "Ressourcen",
"accessControl": "Zugriffskontrolle",
"users": "Benutzer",
"roles": "Rollen",
"share": "Teilbare Links",
"settings": "Einstellungen",
"usersAll": "Alle Benutzer",
"idp": "Identitätsanbieter",
"license": "Lizenz",
"pangolinDashboard": "Dashboard - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Connecting...",
"idpConnectingToFinished": "Connected",
"idpErrorConnectingTo": "There was a problem connecting to {name}. Please contact your administrator.",
"idpErrorNotFound": "IdP not found"
"idpErrorNotFound": "IdP not found",
"expiresAt": "Expires At",
"inviteInvalid": "Invalid Invite",
"inviteInvalidDescription": "The invite link is invalid.",
"inviteErrorWrongUser": "Invite is not for this user",
"inviteErrorUserNotExists": "User does not exist. Please create an account first.",
"inviteErrorLoginRequired": "You must be logged in to accept an invite",
"inviteErrorExpired": "The invite may have expired",
"inviteErrorRevoked": "The invite might have been revoked",
"inviteErrorTypo": "There could be a typo in the invite link",
"pangolinSetup": "Setup - Pangolin",
"orgNameRequired": "Organization name is required",
"orgIdRequired": "Organization ID is required",
"orgErrorCreate": "An error occurred while creating org",
"pageNotFound": "Page Not Found",
"pageNotFoundDescription": "Oops! The page you're looking for doesn't exist.",
"overview": "Overview",
"home": "Home",
"sites": "Sites",
"resources": "Resources",
"accessControl": "Access Control",
"users": "Users",
"roles": "Roles",
"share": "Shareable Links",
"settings": "Settings",
"usersAll": "All Users",
"idp": "Identity Providers",
"license": "License",
"pangolinDashboard": "Dashboard - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Connexion...",
"idpConnectingToFinished": "Connecté",
"idpErrorConnectingTo": "Un problème est survenu lors de la connexion à {name}. Veuillez contacter votre administrateur.",
"idpErrorNotFound": "IdP introuvable"
"idpErrorNotFound": "IdP introuvable",
"expiresAt": "Expire le",
"inviteInvalid": "Invitation invalide",
"inviteInvalidDescription": "Le lien d'invitation n'est pas valide.",
"inviteErrorWrongUser": "L'invitation n'est pas pour cet utilisateur",
"inviteErrorUserNotExists": "L'utilisateur n'existe pas. Veuillez d'abord créer un compte.",
"inviteErrorLoginRequired": "Vous devez être connecté pour accepter une invitation",
"inviteErrorExpired": "L'invitation a peut-être expiré",
"inviteErrorRevoked": "L'invitation a peut-être été révoquée",
"inviteErrorTypo": "Il pourrait y avoir une erreur de frappe dans le lien d'invitation",
"pangolinSetup": "Configuration - Pangolin",
"orgNameRequired": "Le nom de l'organisation est requis",
"orgIdRequired": "L'ID de l'organisation est requis",
"orgErrorCreate": "Une erreur s'est produite lors de la création de l'organisation",
"pageNotFound": "Page non trouvée",
"pageNotFoundDescription": "Oups! La page que vous recherchez n'existe pas.",
"overview": "Vue d'ensemble",
"home": "Accueil",
"sites": "Sites",
"resources": "Ressources",
"accessControl": "Contrôle d'accès",
"users": "Utilisateurs",
"roles": "Rôles",
"share": "Liens partageables",
"settings": "Paramètres",
"usersAll": "Tous les utilisateurs",
"idp": "Fournisseurs d'identité",
"license": "Licence",
"pangolinDashboard": "Tableau de bord - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Connessione in corso...",
"idpConnectingToFinished": "Connesso",
"idpErrorConnectingTo": "Si è verificato un problema durante la connessione a {name}. Contatta il tuo amministratore.",
"idpErrorNotFound": "IdP non trovato"
"idpErrorNotFound": "IdP non trovato",
"expiresAt": "Scade Il",
"inviteInvalid": "Invito Non Valido",
"inviteInvalidDescription": "Il link di invito non è valido.",
"inviteErrorWrongUser": "L'invito non è per questo utente",
"inviteErrorUserNotExists": "L'utente non esiste. Si prega di creare prima un account.",
"inviteErrorLoginRequired": "Devi effettuare l'accesso per accettare un invito",
"inviteErrorExpired": "L'invito potrebbe essere scaduto",
"inviteErrorRevoked": "L'invito potrebbe essere stato revocato",
"inviteErrorTypo": "Potrebbe esserci un errore di battitura nel link di invito",
"pangolinSetup": "Configurazione - Pangolin",
"orgNameRequired": "Il nome dell'organizzazione è obbligatorio",
"orgIdRequired": "L'ID dell'organizzazione è obbligatorio",
"orgErrorCreate": "Si è verificato un errore durante la creazione dell'organizzazione",
"pageNotFound": "Pagina Non Trovata",
"pageNotFoundDescription": "Oops! La pagina che stai cercando non esiste.",
"overview": "Panoramica",
"home": "Home",
"sites": "Siti",
"resources": "Risorse",
"accessControl": "Controllo Accessi",
"users": "Utenti",
"roles": "Ruoli",
"share": "Link Condivisibili",
"settings": "Impostazioni",
"usersAll": "Tutti Gli Utenti",
"idp": "Provider Di Identità",
"license": "Licenza",
"pangolinDashboard": "Dashboard - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Łączenie...",
"idpConnectingToFinished": "Połączono",
"idpErrorConnectingTo": "Wystąpił problem z połączeniem z {name}. Skontaktuj się z administratorem.",
"idpErrorNotFound": "Nie znaleziono IdP"
"idpErrorNotFound": "Nie znaleziono IdP",
"expiresAt": "Wygasa w dniu",
"inviteInvalid": "Nieprawidłowe zaproszenie",
"inviteInvalidDescription": "Link zapraszający jest nieprawidłowy.",
"inviteErrorWrongUser": "Zaproszenie nie jest dla tego użytkownika",
"inviteErrorUserNotExists": "Użytkownik nie istnieje. Najpierw utwórz konto.",
"inviteErrorLoginRequired": "Musisz być zalogowany, aby zaakceptować zaproszenie",
"inviteErrorExpired": "Zaproszenie mogło wygasnąć",
"inviteErrorRevoked": "Zaproszenie mogło zostać odwołane",
"inviteErrorTypo": "W linku zapraszającym może być literówka",
"pangolinSetup": "Konfiguracja - Pangolin",
"orgNameRequired": "Nazwa organizacji jest wymagana",
"orgIdRequired": "ID organizacji jest wymagane",
"orgErrorCreate": "Wystąpił błąd podczas tworzenia organizacji",
"pageNotFound": "Nie znaleziono strony",
"pageNotFoundDescription": "Ups! Strona, której szukasz, nie istnieje.",
"overview": "Przegląd",
"home": "Strona główna",
"sites": "Witryny",
"resources": "Zasoby",
"accessControl": "Kontrola dostępu",
"users": "Użytkownicy",
"roles": "Role",
"share": "Linki do udostępniania",
"settings": "Ustawienia",
"usersAll": "Wszyscy użytkownicy",
"idp": "Dostawcy tożsamości",
"license": "Licencja",
"pangolinDashboard": "Panel - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "A conectar...",
"idpConnectingToFinished": "Conectado",
"idpErrorConnectingTo": "Ocorreu um problema ao ligar a {name}. Por favor, contacte o seu administrador.",
"idpErrorNotFound": "IdP não encontrado"
"idpErrorNotFound": "IdP não encontrado",
"expiresAt": "Expira em",
"inviteInvalid": "Convite Inválido",
"inviteInvalidDescription": "O link do convite é inválido.",
"inviteErrorWrongUser": "O convite não é para este usuário",
"inviteErrorUserNotExists": "O usuário não existe. Por favor, crie uma conta primeiro.",
"inviteErrorLoginRequired": "Você deve estar logado para aceitar um convite",
"inviteErrorExpired": "O convite pode ter expirado",
"inviteErrorRevoked": "O convite pode ter sido revogado",
"inviteErrorTypo": "Pode haver um erro de digitação no link do convite",
"pangolinSetup": "Configuração - Pangolin",
"orgNameRequired": "O nome da organização é obrigatório",
"orgIdRequired": "O ID da organização é obrigatório",
"orgErrorCreate": "Ocorreu um erro ao criar a organização",
"pageNotFound": "Página Não Encontrada",
"pageNotFoundDescription": "Ops! A página que você está procurando não existe.",
"overview": "Visão Geral",
"home": "Início",
"sites": "Sites",
"resources": "Recursos",
"accessControl": "Controle de Acesso",
"users": "Usuários",
"roles": "Funções",
"share": "Links Compartilháveis",
"settings": "Configurações",
"usersAll": "Todos os Usuários",
"idp": "Provedores de Identidade",
"license": "Licença",
"pangolinDashboard": "Painel - Pangolin"
}

View file

@ -886,5 +886,33 @@
"idpConnectingToProcess": "Connecting...",
"idpConnectingToFinished": "Connected",
"idpErrorConnectingTo": "There was a problem connecting to {name}. Please contact your administrator.",
"idpErrorNotFound": "IdP not found"
"idpErrorNotFound": "IdP not found",
"expiresAt": "Expires At",
"inviteInvalid": "Invalid Invite",
"inviteInvalidDescription": "The invite link is invalid.",
"inviteErrorWrongUser": "Invite is not for this user",
"inviteErrorUserNotExists": "User does not exist. Please create an account first.",
"inviteErrorLoginRequired": "You must be logged in to accept an invite",
"inviteErrorExpired": "The invite may have expired",
"inviteErrorRevoked": "The invite might have been revoked",
"inviteErrorTypo": "There could be a typo in the invite link",
"pangolinSetup": "Setup - Pangolin",
"orgNameRequired": "Organization name is required",
"orgIdRequired": "Organization ID is required",
"orgErrorCreate": "An error occurred while creating org",
"pageNotFound": "Page Not Found",
"pageNotFoundDescription": "Oops! The page you're looking for doesn't exist.",
"overview": "Overview",
"home": "Home",
"sites": "Sites",
"resources": "Resources",
"accessControl": "Access Control",
"users": "Users",
"roles": "Roles",
"share": "Shareable Links",
"settings": "Settings",
"usersAll": "All Users",
"idp": "Identity Providers",
"license": "License",
"pangolinDashboard": "Dashboard - Pangolin"
}

View file

@ -57,11 +57,9 @@ const createSiteFormSchema = z.object({
.string()
.min(2, {
message: "Name must be at least 2 characters."
message: "Name must be at least 2 characters."
})
.max(30, {
message: "Name must not be longer than 30 characters."
message: "Name must not be longer than 30 characters."
}),
method: z.enum(["wireguard", "newt", "local"])
});

View file

@ -45,9 +45,9 @@ export default function InviteStatusCard({
{t('inviteErrorNotValid')}
</p>
<ul className="list-disc list-inside text-sm space-y-2">
<li>The invite may have expired</li>
<li>The invite might have been revoked</li>
<li>There could be a typo in the invite link</li>
<li>{t('inviteErrorExpired')}</li>
<li>{t('inviteErrorRevoked')}</li>
<li>{t('inviteErrorTypo')}</li>
</ul>
</div>
);

View file

@ -5,7 +5,10 @@ import { AcceptInviteResponse } from "@server/routers/user";
import { AxiosResponse } from "axios";
import { redirect } from "next/navigation";
import InviteStatusCard from "./InviteStatusCard";
import { formatAxiosError } from "@app/lib/api";;
import { formatAxiosError } from "@app/lib/api";
import { useTranslations } from "next-intl";
;
export default async function InvitePage(props: {
searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
@ -20,12 +23,14 @@ export default async function InvitePage(props: {
const user = await verifySession();
const t = useTranslations();
const parts = tokenParam.split("-");
if (parts.length !== 2) {
return (
<>
<h1>Invalid Invite</h1>
<p>The invite link is invalid.</p>
<h1>{t('inviteInvalid')}</h1>
<p>{t('inviteInvalidDescription')}</p>
</>
);
}
@ -52,15 +57,13 @@ export default async function InvitePage(props: {
}
function cardType() {
if (error.includes("Invite is not for this user")) {
if (error.includes(t('inviteErrorWrongUser'))) {
return "wrong_user";
} else if (
error.includes(
"User does not exist. Please create an account first."
)
error.includes(t('inviteErrorUserNotExists'))
) {
return "user_does_not_exist";
} else if (error.includes("You must be logged in to accept an invite")) {
} else if (error.includes(t('inviteErrorLoginRequired'))) {
return "not_logged_in";
} else {
return "rejected";

View file

@ -10,6 +10,7 @@ import {
KeyRound,
TicketCheck
} from "lucide-react";
import { useTranslations } from "next-intl";
export const orgLangingNavItems: SidebarNavItem[] = [
{

View file

@ -1,14 +1,16 @@
import Link from "next/link";
import { useTranslations } from "next-intl";
export default async function NotFound() {
const t = useTranslations();
return (
<div className="w-full max-w-md mx-auto p-3 md:mt-32 text-center">
<h1 className="text-6xl font-bold mb-4">404</h1>
<h2 className="text-2xl font-semibold text-neutral-500 mb-4">
Page Not Found
{t('pageNotFound')}
</h2>
<p className="text-neutral-500 dark:text-neutral-700 mb-8">
Oops! The page you're looking for doesn't exist.
{t('pageNotFoundDescription')}
</p>
</div>
);

View file

@ -11,6 +11,7 @@ import { ListUserOrgsResponse } from "@server/routers/org";
import { internal } from "@app/lib/api";
import { AxiosResponse } from "axios";
import { authCookieHeader } from "@app/lib/api/cookies";
import { useTranslations } from "next-intl";
export const metadata: Metadata = {
title: `Setup - Pangolin`,