mirror of
https://github.com/fosrl/pangolin.git
synced 2025-08-04 01:55:10 +02:00
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:
parent
b8ed5ac1c5
commit
731ec1da69
13 changed files with 223 additions and 22 deletions
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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"])
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -10,6 +10,7 @@ import {
|
|||
KeyRound,
|
||||
TicketCheck
|
||||
} from "lucide-react";
|
||||
import { useTranslations } from "next-intl";
|
||||
|
||||
export const orgLangingNavItems: SidebarNavItem[] = [
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
|
|
|
@ -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`,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue