🌐 Introduce dynamic domain-based locale and country handling

- Added `DomainMiddleware` to dynamically set locale, language-country session, and app name based on domain.
- Updated views and components to leverage `lang_country` session for language and region-specific content.
- Enhanced country parameter retrieval with `config('app.domain_country')` as fallback.
- Refined language filtering by scanning available language files dynamically.
- Added language-specific assets and translations (`nl.json`, `es.json`) with improved language-region associations.
- Updated `app-logo-icon` to display region-specific images or default SVGs.
- Improved views with cleaner, dynamic rendering and session-aware functionalities.
This commit is contained in:
HolgerHatGarKeineNode
2025-11-23 20:45:29 +01:00
parent c48455a6be
commit 6f7ee806ae
32 changed files with 962 additions and 42 deletions

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Symfony\Component\HttpFoundation\Response;
class DomainMiddleware
{
public function handle(Request $request, Closure $next): Response
{
$domain = $request->getHost(); // Erkennt die aktuelle Domain (via CNAME)
// domains
$domainArray = [
'portal.eenentwintig.net' => [
'locale' => 'nl',
'lang_country' => 'nl-NL',
'app_name' => 'EENENTWINTIG Portaal',
],
];
// App-Locale dynamisch setzen
if (isset($domainArray[$domain]['locale'])) {
session([
'lang_country' => $domainArray[$domain]['lang_country'],
]);
config([
'app.name' => $domainArray[$domain]['app_name'],
'app.domain_country' => $domainArray[$domain]['locale'],
]);
App::setLocale($domainArray[$domain]['locale']);
}
return $next($request);
}
}

View File

@@ -13,6 +13,7 @@ return Application::configure(basePath: dirname(__DIR__))
) )
->withMiddleware(function (Middleware $middleware) { ->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [ $middleware->web(append: [
\App\Http\Middleware\DomainMiddleware::class,
\Stefro\LaravelLangCountry\Middleware\LangCountrySession::class, \Stefro\LaravelLangCountry\Middleware\LangCountrySession::class,
\App\Http\Middleware\SetTimezone::class, \App\Http\Middleware\SetTimezone::class,
]); ]);

View File

@@ -15,6 +15,8 @@ return [
'name' => env('APP_NAME', 'Laravel'), 'name' => env('APP_NAME', 'Laravel'),
'domain_country' => 'de',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Environment | Application Environment

View File

@@ -440,5 +440,22 @@
"Öffnen/RSVP": "", "Öffnen/RSVP": "",
"Über den Dozenten": "", "Über den Dozenten": "",
"Über den Kurs": "", "Über den Kurs": "",
"Über uns": "" "Über uns": "",
"Details": "",
"Die Endzeit muss nach der Startzeit liegen.": "",
"Startdatum": "",
"An welchem Tag beginnt das Event?": "",
"Um wie viel Uhr beginnt das Event?": "",
"Enddatum": "",
"An welchem Tag endet das Event?": "",
"Um wie viel Uhr endet das Event?": "",
"Datum": "",
"An welchem Tag findet das Event statt?": "",
"Uhrzeit": "",
"Um wie viel Uhr startet das Event?": "",
"Zeitzone": "",
"Wähle deine Zeitzone aus...": "",
"Zeitzone erfolgreich aktualisiert": "",
"Wähle deine Zeitzone...": "",
"Suche Zeitzone...": ""
} }

View File

@@ -440,5 +440,22 @@
"Öffnen/RSVP": "Open/RSVP", "Öffnen/RSVP": "Open/RSVP",
"Über den Dozenten": "About the lecturer", "Über den Dozenten": "About the lecturer",
"Über den Kurs": "About the course", "Über den Kurs": "About the course",
"Über uns": "About us" "Über uns": "About us",
"Details": "Details",
"Die Endzeit muss nach der Startzeit liegen.": "The end time must be after the start time.",
"Startdatum": "Start date",
"An welchem Tag beginnt das Event?": "On which day does the event start?",
"Um wie viel Uhr beginnt das Event?": "At what time does the event start?",
"Enddatum": "End date",
"An welchem Tag endet das Event?": "On which day does the event end?",
"Um wie viel Uhr endet das Event?": "At what time does the event end?",
"Datum": "Date",
"An welchem Tag findet das Event statt?": "On which day does the event take place?",
"Uhrzeit": "Time",
"Um wie viel Uhr startet das Event?": "At what time does the event start?",
"Zeitzone": "Timezone",
"Wähle deine Zeitzone aus...": "Select your timezone...",
"Zeitzone erfolgreich aktualisiert": "Timezone successfully updated",
"Wähle deine Zeitzone...": "Choose your timezone...",
"Suche Zeitzone...": "Search timezone..."
} }

View File

@@ -439,5 +439,22 @@
"Öffnen/RSVP": "Abrir/RSVP", "Öffnen/RSVP": "Abrir/RSVP",
"Über den Dozenten": "Sobre el profesor", "Über den Dozenten": "Sobre el profesor",
"Über den Kurs": "Sobre el curso", "Über den Kurs": "Sobre el curso",
"Über uns": "Sobre nosotros" "Über uns": "Sobre nosotros",
"Details": "Detalles",
"Die Endzeit muss nach der Startzeit liegen.": "La hora de finalización debe ser posterior a la hora de inicio.",
"Startdatum": "Fecha de inicio",
"An welchem Tag beginnt das Event?": "¿En qué día comienza el evento?",
"Um wie viel Uhr beginnt das Event?": "¿A qué hora comienza el evento?",
"Enddatum": "Fecha de finalización",
"An welchem Tag endet das Event?": "¿En qué día termina el evento?",
"Um wie viel Uhr endet das Event?": "¿A qué hora termina el evento?",
"Datum": "Fecha",
"An welchem Tag findet das Event statt?": "¿En qué día se lleva a cabo el evento?",
"Uhrzeit": "Hora",
"Um wie viel Uhr startet das Event?": "¿A qué hora comienza el evento?",
"Zeitzone": "Zona horaria",
"Wähle deine Zeitzone aus...": "Selecciona tu zona horaria...",
"Zeitzone erfolgreich aktualisiert": "Zona horaria actualizada exitosamente",
"Wähle deine Zeitzone...": "Elige tu zona horaria...",
"Suche Zeitzone...": "Buscar zona horaria..."
} }

380
lang/nl.json Normal file
View File

@@ -0,0 +1,380 @@
{
"Login - Bitcoin Meetups": "Inloggen - Bitcoin Meetups",
"Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und aan der Community teilzunehmen.": "Log in om toegang te krijgen tot je Bitcoin Meetup-account en deel te nemen aan de community.",
"Dashboard - Bitcoin Meetups": "Dashboard - Bitcoin Meetups",
"Verwalte deine Bitcoin Meetups, Events und Einstellungen in deinem persönlichen Dashboard.": "Beheer je Bitcoin Meetups, evenementen en instellingen in je persoonlijke dashboard.",
"Willkommen bei Bitcoin Meetups": "Welkom bij Bitcoin Meetups",
"Entdecke die Bitcoin Community in deiner Nähe. Finde lokale Meetups und vernetze dich mit Gleichgesinnten.": "Ontdek de Bitcoin-community in je buurt. Vind lokale Meetups en netwerk met gelijkgestemden.",
"Follow the Rabbit - Bitcoin Journey": "Follow the Rabbit - Bitcoin Journey",
"Starte deine Bitcoin-Reise und entdecke spannende Inhalte rund um Bitcoin und Blockchain.": "Start je Bitcoin-reis en ontdek spannende inhoud over Bitcoin en Blockchain.",
"Neue Stadt hinzufügen - Bitcoin Meetups": "Nieuwe stad toevoegen - Bitcoin Meetups",
"Füge eine neue Stadt hinzu, um Bitcoin Meetups in deiner Region zu organisieren.": "Voeg een nieuwe stad toe om Bitcoin Meetups in je regio te organiseren.",
"Stadt bearbeiten - Bitcoin Meetups": "Stad bewerken - Bitcoin Meetups",
"Aktualisiere die Informationen für Bitcoin Meetup Standorte in deiner Stadt.": "Werk de informatie bij voor Bitcoin Meetup-locaties in je stad.",
"Städteübersicht - Bitcoin Meetups": "Stedenoverzicht - Bitcoin Meetups",
"Durchsuche alle Städte mit aktiven Bitcoin Meetups und finde Events in deiner Nähe.": "Doorzoek alle steden met actieve Bitcoin Meetups en vind evenementen in je buurt.",
"Neuen Kurs erstellen - Bitcoin Education": "Nieuwe cursus maken - Bitcoin Education",
"Erstelle einen neuen Bitcoin-Bildungskurs und teile dein Wissen mit der Community.": "Maak een nieuwe Bitcoin-educatiecursus en deel je kennis met de community.",
"Kursevents bearbeiten - Bitcoin Education": "Cursusevenementen bewerken - Bitcoin Education",
"Verwalte die Termine und Details deiner Bitcoin-Bildungsveranstaltungen.": "Beheer de data en details van je Bitcoin-educatie-evenementen.",
"Kurs bearbeiten - Bitcoin Education": "Cursus bewerken - Bitcoin Education",
"Aktualisiere die Inhalte und Informationen deines Bitcoin-Bildungskurses.": "Werk de inhoud en informatie van je Bitcoin-educatiecursus bij.",
"Bitcoin Kurse - Übersicht": "Bitcoin Cursussen - Overzicht",
"Entdecke unsere vielfältigen Bitcoin-Bildungsangebote und Workshops.": "Ontdek onze diverse Bitcoin-educatie-aanbiedingen en workshops.",
"Bitcoin Bildung & Kurse": "Bitcoin Educatie & Cursussen",
"Lerne alles über Bitcoin - von den Grundlagen bis zu fortgeschrittenen Themen.": "Leer alles over Bitcoin - van de basis tot geavanceerde onderwerpen.",
"Dozent werden - Bitcoin Education": "Docent worden - Bitcoin Education",
"Werde Bitcoin-Dozent und teile dein Expertenwissen mit der Community.": "Word Bitcoin-docent en deel je expertise met de community.",
"Dozentenprofil bearbeiten": "Docentenprofiel bewerken",
"Aktualisiere dein Profil als Bitcoin-Dozent und deine Kursangebote.": "Werk je profiel als Bitcoin-docent en je cursusaanbiedingen bij.",
"Bitcoin Dozenten - Übersicht": "Bitcoin Docenten - Overzicht",
"Lerne unsere erfahrenen Bitcoin-Dozenten und ihre Expertise kennen.": "Leer onze ervaren Bitcoin-docenten en hun expertise kennen.",
"Bitcoin Meetup Events verwalten": "Bitcoin Meetup Evenementen beheren",
"Erstelle und bearbeite Bitcoin Meetup Events für deine Community.": "Maak en bewerk Bitcoin Meetup-evenementen voor je community.",
"Meetup bearbeiten - Bitcoin Events": "Meetup bewerken - Bitcoin Evenementen",
"Aktualisiere die Details und Informationen deines Bitcoin Meetups.": "Werk de details en informatie van je Bitcoin Meetup bij.",
"Bitcoin Meetups - Alle Events": "Bitcoin Meetups - Alle Evenementen",
"Finde alle aktuellen Bitcoin Meetups und Events in deiner Region.": "Vind alle huidige Bitcoin Meetups en evenementen in je regio.",
"Bitcoin Meetups - Community Events": "Bitcoin Meetups - Community Evenementen",
"Entdecke Bitcoin Community Events und vernetze dich mit Gleichgesinnten.": "Ontdek Bitcoin Community-evenementen en netwerk met gelijkgestemden.",
"Bitcoin Event Details": "Bitcoin Evenement Details",
"Alle Informationen zum ausgewählten Bitcoin Meetup Event.": "Alle informatie over het geselecteerde Bitcoin Meetup-evenement.",
"Bitcoin Meetups Karte": "Bitcoin Meetups Kaart",
"Finde Bitcoin Meetups in deiner Nähe mit unserer interaktiven Karte.": "Vind Bitcoin Meetups in je buurt met onze interactieve kaart.",
"Erscheinungsbild - Einstellungen": "Uiterlijk - Instellingen",
"Passe das Erscheinungsbild deines Bitcoin Meetup Profils an.": "Pas het uiterlijk van je Bitcoin Meetup-profiel aan.",
"Konto löschen - Bitcoin Meetups": "Account verwijderen - Bitcoin Meetups",
"Informationen zum Löschen deines Bitcoin Meetup Kontos.": "Informatie over het verwijderen van je Bitcoin Meetup-account.",
"Passwort ändern - Bitcoin Meetups": "Wachtwoord wijzigen - Bitcoin Meetups",
"Ändere dein Passwort für mehr Sicherheit deines Bitcoin Meetup Kontos.": "Wijzig je wachtwoord voor meer beveiliging van je Bitcoin Meetup-account.",
"Profil bearbeiten - Bitcoin Meetups": "Profiel bewerken - Bitcoin Meetups",
"Aktualisiere deine persönlichen Informationen und Profileinstellungen.": "Werk je persoonlijke informatie en profielinstellingen bij.",
"Neuen Veranstaltungsort erstellen": "Nieuwe locatie maken",
"Füge einen neuen Ort für Bitcoin Meetups und Events hinzu.": "Voeg een nieuwe locatie toe voor Bitcoin Meetups en evenementen.",
"Veranstaltungsort bearbeiten": "Locatie bewerken",
"Aktualisiere die Details eines Bitcoin Meetup Veranstaltungsortes.": "Werk de details van een Bitcoin Meetup-locatie bij.",
"Veranstaltungsorte - Übersicht": "Locaties - Overzicht",
"Finde alle Veranstaltungsorte für Bitcoin Meetups und Events.": "Vind alle locaties voor Bitcoin Meetups en evenementen.",
"Willkommen": "Welkom",
"Toximalistisches Infotainment für bullische Bitcoiner.": "Toximalistisch infotainment voor bullische Bitcoiners.",
"no location set": "geen locatie ingesteld",
"BooksForPlebs": "BooksForPlebs",
"Lokale Buchausleihe für Bitcoin-Meetups.": "Lokale boekuitlening voor Bitcoin-Meetups.",
"Bitcoin - Rabbit Hole": "Bitcoin - Rabbit Hole",
"Dies ist ein großartiger Überblick über die Bitcoin-Kaninchenhöhle mit Zugängen zu Bereichen, die Bitcoin umfasst. Jedes Thema hat seine eigene Kaninchenhöhle, die durch Infografiken auf einfache und verständliche Weise visualisiert wird, mit QR-Codes, die zu erklärenden Videos und Artikeln führen. Viel Spaß auf Ihrer Entdeckungsreise!": "Dit is een geweldig overzicht van de Bitcoin-rabbithole met toegang tot gebieden die Bitcoin omvatten. Elk onderwerp heeft zijn eigen rabbithole, gevisualiseerd door infographics op een eenvoudige en begrijpelijke manier, met QR-codes die leiden naar uitleggende video's en artikelen. Veel plezier op je ontdekkingstocht!",
"Saved.": "Opgeslagen.",
"Sprache wählen": "Taal selecteren",
"Dashboard": "Dashboard",
"Search": "Zoeken",
"Repository": "Repository",
"Documentation": "Documentatie",
"Settings": "Instellingen",
"Log Out": "Uitloggen",
"Platform": "Platform",
"Success!": "Succes!",
"Copied into clipboard": "Gekopieerd naar klembord",
"App": "App",
"Meetups": "Meetups",
"Karte": "Kaart",
"Kurse": "Cursussen",
"Dozenten": "Docenten",
"Diverses": "Diversen",
"Orte/Gebiete": "Locaties/Gebieden",
"Städte/Gebiete": "Steden/Gebieden",
"Veranstaltungsorte": "Locaties",
"Sprache wechseln": "Taal wisselen",
"Land": "Land",
"Nächster Termin": "Volgende afspraak",
"Zusagen": "Bevestigingen",
"Vielleicht": "Misschien",
"Telegram": "Telegram",
"Website": "Website",
"Twitter": "Twitter",
"Matrix": "Matrix",
"Nostr": "Nostr",
"Simplex": "Simplex",
"Signal": "Signal",
"Details": "Details",
"Profile": "Profiel",
"Password": "Wachtwoord",
"Appearance": "Uiterlijk",
"Unauthorized": "Ongeautoriseerd",
"Payment Required": "Betaling vereist",
"Forbidden": "Verboden",
"Not Found": "Niet gevonden",
"Page Expired": "Pagina verlopen",
"Too Many Requests": "Te veel verzoeken",
"Server Error": "Serverfout",
"Service Unavailable": "Service niet beschikbaar",
"Confirm password": "Bevestig wachtwoord",
"This is a secure area of the application. Please confirm your password before continuing.": "Dit is een beveiligd gebied van de applicatie. Bevestig je wachtwoord voordat je doorgaat.",
"Confirm": "Bevestigen",
"A reset link will be sent if the account exists.": "Er wordt een resetlink verzonden als het account bestaat.",
"Forgot password": "Wachtwoord vergeten",
"Enter your email to receive a password reset link": "Voer je e-mail in om een wachtwoordherstel-link te ontvangen",
"Email Address": "E-mailadres",
"Email password reset link": "E-mail wachtwoordherstel-link",
"Or, return to": "Of, terug naar",
"log in": "inloggen",
"Willkommen zurück": "Welkom terug",
"Log in mit Nostr": "Inloggen met Nostr",
"Copy": "Kopiëren",
"Click to connect": "Klik om te verbinden",
"Create an account": "Account aanmaken",
"Enter your details below to create your account": "Voer je gegevens hieronder in om je account aan te maken",
"Name": "Naam",
"Full name": "Volledige naam",
"Email address": "E-mailadres",
"Create account": "Account aanmaken",
"Already have an account?": "Heb je al een account?",
"Log in": "Inloggen",
"Reset password": "Wachtwoord herstellen",
"Please enter your new password below": "Voer je nieuwe wachtwoord hieronder in",
"Email": "E-mail",
"Please verify your email address by clicking on the link we just emailed to you.": "Verifieer je e-mailadres door op de link te klikken die we net naar je hebben gemaild.",
"A new verification link has been sent to the email address you provided during registration.": "Een nieuwe verificatielink is verzonden naar het e-mailadres dat je tijdens de registratie hebt opgegeven.",
"Resend verification email": "Verificatie-e-mail opnieuw verzenden",
"Log out": "Uitloggen",
"City successfully created!": "Stad succesvol aangemaakt!",
"Create City": "Stad aanmaken",
"Basic Information": "Basisinformatie",
"Country": "Land",
"Select a country": "Selecteer een land",
"Coordinates": "Coördinaten",
"Latitude": "Breedtegraad",
"Longitude": "Lengtegraad",
"Demographics": "Demografie",
"Population": "Bevolking",
"Population Date": "Bevolkingsdatum",
"Cancel": "Annuleren",
"City successfully updated!": "Stad succesvol bijgewerkt!",
"Edit City": "Stad bewerken",
"Update City": "Stad bijwerken",
"Cities": "Steden",
"Search cities...": "Zoek steden...",
"Created By": "Aangemaakt door",
"Actions": "Acties",
"Edit": "Bewerken",
"Wähle dein Land...": "Selecteer je land...",
"Suche dein Land...": "Zoek je land...",
"Die Endzeit muss nach der Startzeit liegen.": "De eindtijd moet na de starttijd liggen.",
"Event erfolgreich aktualisiert!": "Evenement succesvol bijgewerkt!",
"Event erfolgreich erstellt!": "Evenement succesvol aangemaakt!",
"Event erfolgreich gelöscht!": "Evenement succesvol verwijderd!",
"Event bearbeiten": "Evenement bewerken",
"Neues Event erstellen": "Nieuw evenement aanmaken",
"Event Details": "Evenement Details",
"Startdatum": "Startdatum",
"An welchem Tag beginnt das Event?": "Op welke dag begint het evenement?",
"Startzeit": "Starttijd",
"Um wie viel Uhr beginnt das Event?": "Hoe laat begint het evenement?",
"Enddatum": "Einddatum",
"An welchem Tag endet das Event?": "Op welke dag eindigt het evenement?",
"Endzeit": "Eindtijd",
"Um wie viel Uhr endet das Event?": "Hoe laat eindigt het evenement?",
"Veranstaltungsort": "Locatie",
"Ort hinzufügen": "Locatie toevoegen",
"Veranstaltungsort auswählen": "Locatie selecteren",
"Suche nach Ort...": "Zoek naar locatie...",
"Wo findet das Event statt?": "Waar vindt het evenement plaats?",
"Link": "Link",
"Link zu weiteren Informationen oder zur Anmeldung": "Link naar meer informatie of registratie",
"Abbrechen": "Annuleren",
"Bist du sicher, dass du dieses Event löschen möchtest?": "Weet je zeker dat je dit evenement wilt verwijderen?",
"Event löschen": "Evenement verwijderen",
"Event aktualisieren": "Evenement bijwerken",
"Event erstellen": "Evenement aanmaken",
"Veranstaltungsort hinzufügen": "Locatie toevoegen",
"Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Voeg een nieuwe locatie toe aan de database.",
"z.B. Bitcoin Zentrum München": "bijv. Bitcoin Centrum Amsterdam",
"Stadt": "Stad",
"Stadt auswählen": "Stad selecteren",
"Suche passende Stadt...": "Zoek passende stad...",
"Straße": "Straat",
"z.B. Hauptstraße 1": "bijv. Hoofdstraat 1",
"Ort erstellen": "Locatie aanmaken",
"Kurs erfolgreich erstellt!": "Cursus succesvol aangemaakt!",
"Neuen Kurs erstellen": "Nieuwe cursus aanmaken",
"Grundlegende Informationen": "Basisinformatie",
"Der Anzeigename für diesen Kurs": "De weergavenaam voor deze cursus",
"Dozent": "Docent",
"Dozent auswählen": "Docent selecteren",
"Suche passenden Dozenten...": "Zoek passende docent...",
"Der Dozent, der diesen Kurs leitet": "De docent die deze cursus leidt",
"Beschreibung": "Beschrijving",
"Ausführliche Beschreibung des Kurses": "Gedetailleerde beschrijving van de cursus",
"Kurs erstellen": "Cursus aanmaken",
"Kurs erfolgreich aktualisiert!": "Cursus succesvol bijgewerkt!",
"Kurs bearbeiten": "Cursus bewerken",
"ID": "ID",
"System-generierte ID (nur lesbar)": "Systeemgegenereerde ID (alleen-lezen)",
"Systeminformationen": "Systeemgegevens",
"Erstellt von": "Aangemaakt door",
"Unbekannt": "Onbekend",
"Ersteller des Kurses": "Maker van de cursus",
"Erstellt am": "Aangemaakt op",
"Wann dieser Kurs erstellt wurde": "Wanneer deze cursus werd aangemaakt",
"Aktualisiert am": "Bijgewerkt op",
"Letzte Änderungszeit": "Laatste wijzigingstijd",
"Kurs aktualisieren": "Cursus bijwerken",
"Suche nach Kursen...": "Zoek naar cursussen...",
"Neuer Kurs": "Nieuwe cursus",
"Aktionen": "Acties",
"Bearbeiten": "Bewerken",
"Über den Kurs": "Over de cursus",
"Über den Dozenten": "Over de docent",
"Kommende Veranstaltungen": "Aankomende evenementen",
"Anmeldungen": "Registraties",
"Details/Anmelden": "Details/Aanmelden",
"Meine nächsten Meetup Termine": "Mijn volgende Meetup-afspraken",
"Keine bevorstehenden Termine": "Geen aankomende afspraken",
"Meine Meetups": "Mijn Meetups",
"Meetup hinzufügen...": "Meetup toevoegen...",
"Meetup suchen...": "Meetup zoeken...",
"Meetup entfernen?": "Meetup verwijderen?",
"Möchtest du": "Wil je",
"aus deinen Meetups entfernen?": "uit je Meetups verwijderen?",
"Du kannst es jederzeit wieder hinzufügen.": "Je kunt het altijd weer toevoegen.",
"Entfernen": "Verwijderen",
"Keine Meetups zugeordnet": "Geen Meetups toegewezen",
"Dozent erfolgreich erstellt!": "Docent succesvol aangemaakt!",
"Neuen Dozenten erstellen": "Nieuwe docent aanmaken",
"Vollständiger Name des Dozenten": "Volledige naam van de docent",
"Untertitel": "Ondertitel",
"Kurze Berufsbezeichnung oder Rolle": "Korte beroepsaanduiding of rol",
"Status": "Status",
"Ist dieser Dozent aktiv?": "Is deze docent actief?",
"Einführung": "Introductie",
"Kurze Vorstellung (wird auf Kurs-Seiten angezeigt)": "Korte introductie (wordt getoond op cursuspagina's)",
"Ausführliche Beschreibung und Biografie": "Gedetailleerde beschrijving en biografie",
"Links & Soziale Medien": "Links & Sociale media",
"Webseite": "Website",
"Persönliche Webseite oder Portfolio": "Persoonlijke website of portfolio",
"Twitter Benutzername": "Twitter-gebruikersnaam",
"Twitter-Handle ohne @ Symbol": "Twitter-handle zonder @ symbool",
"Nostr öffentlicher Schlüssel": "Nostr publieke sleutel",
"Zahlungsinformationen": "Betaalinformatie",
"Lightning Adresse": "Lightning-adres",
"Lightning-Adresse für Zahlungen": "Lightning-adres voor betalingen",
"LNURL": "LNURL",
"LNURL für Lightning-Zahlungen": "LNURL voor Lightning-betalingen",
"Node ID": "Node ID",
"Lightning Node ID": "Lightning Node ID",
"PayNym": "PayNym",
"PayNym für Bitcoin-Zahlungen": "PayNym voor Bitcoin-betalingen",
"Dozenten erstellen": "Docenten aanmaken",
"Dozent erfolgreich aktualisiert!": "Docent succesvol bijgewerkt!",
"Dozent bearbeiten": "Docent bewerken",
"Ersteller des Dozenten": "Maker van de docent",
"Wann dieser Dozent erstellt wurde": "Wanneer deze docent werd aangemaakt",
"Dozent aktualisieren": "Docent bijwerken",
"Suche nach Dozenten...": "Zoek naar docenten...",
"Dozenten anlegen": "Docenten aanleggen",
"Links": "Links",
"Aktiv": "Actief",
"Inaktiv": "Inactief",
"weitere Termine": "meer afspraken",
"Datum": "Datum",
"An welchem Tag findet das Event statt?": "Op welke dag vindt het evenement plaats?",
"Uhrzeit": "Tijd",
"Um wie viel Uhr startet das Event?": "Hoe laat start het evenement?",
"Ort": "Locatie",
"z.B. Café Mustermann, Hauptstr. 1": "bijv. Café Voorbeeld, Hoofdstr. 1",
"Beschreibe das Event...": "Beschrijf het evenement...",
"Details über das Event": "Details over het evenement",
"Link zu weiteren Informationen": "Link naar meer informatie",
"Meetup erfolgreich erstellt!": "Meetup succesvol aangemaakt!",
"Neues Meetup erstellen": "Nieuwe Meetup aanmaken",
"Der Anzeigename für dieses Meetup": "De weergavenaam voor deze Meetup",
"Stadt hinzufügen": "Stad toevoegen",
"Die nächstgrößte Stadt oder Ort": "De dichtstbijzijnde stad of plaats",
"Auf Karte sichtbar": "Zichtbaar op kaart",
"Soll dieses Meetup auf der Karte angezeigt werden?": "Moet deze Meetup op de kaart worden weergegeven?",
"Kurze Beschreibung des Meetups": "Korte beschrijving van de Meetup",
"Offizielle Webseite oder Landingpage": "Officiële website of landingpagina",
"Telegram Link": "Telegram-link",
"Link zur Telegram-Gruppe oder zum Kanal": "Link naar Telegram-groep of kanaal",
"Matrix Gruppe": "Matrix-groep",
"Matrix-Raum Bezeichner oder Link": "Matrix-ruim-identifier of link",
"Nostr öffentlicher Schlüssel oder Bezeichner": "Nostr publieke sleutel of identifier",
"SimpleX": "SimpleX",
"SimpleX Chat Kontaktinformationen": "SimpleX-chatcontactinformatie",
"Signal Kontakt- of Gruppeninformationen": "Signalcontact- of groepsinformatie",
"Zusätzliche Informationen": "Aanvullende informatie",
"Gemeinschaft": "Gemeenschap",
"Keine": "Geen",
"Gemeinschafts- oder Organisationsname": "Gemeenschaps- of organisatienaam",
"Meetup erstellen": "Meetup aanmaken",
"Füge eine neue Stadt zur Datenbank hinzu.": "Voeg een nieuwe stad toe aan de database.",
"Stadtname": "Stadsnaam",
"z.B. Berlin": "bijv. Amsterdam",
"Land auswählen": "Land selecteren",
"Breitengrad": "Breedtegraad",
"Längengrad": "Lengtegraad",
"Stadt erstellen": "Stad aanmaken",
"Meetup erfolgreich aktualisiert!": "Meetup succesvol bijgewerkt!",
"Meetup bearbeiten": "Meetup bewerken",
"Ersteller des Meetups": "Maker van de Meetup",
"Wann dieses Meetup erstellt wurde": "Wanneer deze Meetup werd aangemaakt",
"Meetup aktualisieren": "Meetup bijwerken",
"Kalender-Stream-URL kopieren": "Kalender-stream-URL kopiëren",
"Suche nach Meetups...": "Zoek naar Meetups...",
"Mehr Informationen": "Meer informatie",
"Teilnahme": "Deelname",
"Du bist nicht eingloggt und musst deshalb den Namen selbst eintippen.": "Je bent niet ingelogd en moet daarom de naam zelf intypen.",
"Dein Name": "Je naam",
"Name eingeben": "Naam invoeren",
"Ich komme": "Ik kom",
"Absagen": "Afmelden",
"Zurück zum Meetup": "Terug naar Meetup",
"Über uns": "Over ons",
"Kontakt & Links": "Contact & Links",
"Standort": "Locatie",
"Zoom = STRG+Scroll": "Zoom = CTRL+Scroll",
"Öffnen/RSVP": "Openen/RSVP",
"Update the appearance settings for your account": "Werk de uiterlijk-instellingen bij voor je account",
"Light": "Licht",
"Dark": "Donker",
"System": "Systeem",
"Delete account": "Account verwijderen",
"Delete your account and all of its resources": "Verwijder je account en al zijn bronnen",
"Are you sure you want to delete your account?": "Weet je zeker dat je je account wilt verwijderen?",
"Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Zodra je account wordt verwijderd, worden al zijn bronnen en gegevens permanent verwijderd. Voer je wachtwoord in om te bevestigen dat je je account permanent wilt verwijderen.",
"Update password": "Wachtwoord bijwerken",
"Ensure your account is using a long, random password to stay secure": "Zorg ervoor dat je account een lang, willekeurig wachtwoord gebruikt om veilig te blijven",
"Current password": "Huidige wachtwoord",
"New password": "Nieuw wachtwoord",
"Confirm Password": "Bevestig wachtwoord",
"Save": "Opslaan",
"Update your name and email address": "Werk je naam en e-mailadres bij",
"Your email address is unverified.": "Je e-mailadres is niet geverifieerd.",
"Click here to re-send the verification email.": "Klik hier om de verificatie-e-mail opnieuw te verzenden.",
"A new verification link has been sent to your email address.": "Een nieuwe verificatielink is verzonden naar je e-mailadres.",
"Zeitzone": "Tijdzone",
"Wähle deine Zeitzone aus...": "Selecteer je tijdzone...",
"Spracheinstellungen": "Taalinstellingen",
"Wähle deine Sprache aus...": "Selecteer je taal...",
"Zeitzone erfolgreich aktualisiert": "Tijdzone succesvol bijgewerkt",
"Wähle deine Zeitzone...": "Selecteer je tijdzone...",
"Suche Zeitzone...": "Zoek tijdzone...",
"Venue successfully created!": "Locatie succesvol aangemaakt!",
"Create Venue": "Locatie aanmaken",
"Venue Information": "Locatie-informatie",
"City": "Stad",
"Select a city": "Selecteer een stad",
"Street": "Straat",
"Venue successfully updated!": "Locatie succesvol bijgewerkt!",
"Edit Venue": "Locatie bewerken",
"Update Venue": "Locatie bijwerken",
"Venues": "Locaties",
"Search venues...": "Zoek locaties...",
"Bitcoin Meetups": "Bitcoin Meetups",
"Alle Meetups anzeigen": "Alle Meetups weergeven",
"Kartenansicht öffnen": "Kartenweergave openen",
"Login": "Inloggen",
"Verbinde dich mit Bitcoinern in deiner Nähe": "Verbind je met Bitcoiners in je buurt",
"Finde deine lokale Community": "Vind je lokale community",
"Manage your profile and account settings": "Beheer je profiel- en accountinstellingen",
"Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und an der Community teilzunehmen.": "Log in om toegang te krijgen tot je Bitcoin Meetup-account en deel te nemen aan de community.",
"Signal Kontakt- oder Gruppeninformationen": "Signal contact- of groepsinformatie"
}

378
lang/pt.json Normal file
View File

@@ -0,0 +1,378 @@
{
"Login - Bitcoin Meetups": "Login - Bitcoin Meetups",
"Logge dich ein, um auf dein Bitcoin Meetup Konto zuzugreifen und an der Community teilzunehmen.": "Faça login para acessar sua conta do Bitcoin Meetup e participar da comunidade.",
"Dashboard - Bitcoin Meetups": "Painel - Bitcoin Meetups",
"Verwalte deine Bitcoin Meetups, Events und Einstellungen in deinem persönlichen Dashboard.": "Gerencie seus Bitcoin Meetups, eventos e configurações em seu painel pessoal.",
"Willkommen bei Bitcoin Meetups": "Bem-vindo aos Bitcoin Meetups",
"Entdecke die Bitcoin Community in deiner Nähe. Finde lokale Meetups und vernetze dich mit Gleichgesinnten.": "Descubra a comunidade Bitcoin perto de você. Encontre meetups locais e conecte-se com pessoas de ideias semelhantes.",
"Follow the Rabbit - Bitcoin Journey": "Follow the Rabbit - Jornada Bitcoin",
"Starte deine Bitcoin-Reise und entdecke spannende Inhalte rund um Bitcoin und Blockchain.": "Inicie sua jornada Bitcoin e descubra conteúdos fascinantes sobre Bitcoin e Blockchain.",
"Neue Stadt hinzufügen - Bitcoin Meetups": "Adicionar nova cidade - Bitcoin Meetups",
"Füge eine neue Stadt hinzu, um Bitcoin Meetups in deiner Region zu organisieren.": "Adicione uma nova cidade para organizar Bitcoin Meetups em sua região.",
"Stadt bearbeiten - Bitcoin Meetups": "Editar cidade - Bitcoin Meetups",
"Aktualisiere die Informationen für Bitcoin Meetup Standorte in deiner Stadt.": "Atualize as informações para locais de Bitcoin Meetup em sua cidade.",
"Städteübersicht - Bitcoin Meetups": "Visão geral das cidades - Bitcoin Meetups",
"Durchsuche alle Städte mit aktiven Bitcoin Meetups und finde Events in deiner Nähe.": "Pesquise todas as cidades com Bitcoin Meetups ativos e encontre eventos perto de você.",
"Neuen Kurs erstellen - Bitcoin Education": "Criar novo curso - Educação Bitcoin",
"Erstelle einen neuen Bitcoin-Bildungskurs und teile dein Wissen mit der Community.": "Crie um novo curso de educação Bitcoin e compartilhe seu conhecimento com a comunidade.",
"Kursevents bearbeiten - Bitcoin Education": "Editar eventos do curso - Educação Bitcoin",
"Verwalte die Termine und Details deiner Bitcoin-Bildungsveranstaltungen.": "Gerencie as datas e detalhes de seus eventos educacionais Bitcoin.",
"Kurs bearbeiten - Bitcoin Education": "Editar curso - Educação Bitcoin",
"Aktualisiere die Inhalte und Informationen deines Bitcoin-Bildungskurses.": "Atualize os conteúdos e informações do seu curso educacional Bitcoin.",
"Bitcoin Kurse - Übersicht": "Cursos Bitcoin - Visão geral",
"Entdecke unsere vielfältigen Bitcoin-Bildungsangebote und Workshops.": "Descubra nossas diversas ofertas educacionais Bitcoin e workshops.",
"Bitcoin Bildung & Kurse": "Educação & Cursos Bitcoin",
"Lerne alles über Bitcoin - von den Grundlagen bis zu fortgeschrittenen Themen.": "Aprenda tudo sobre Bitcoin - dos fundamentos aos tópicos avançados.",
"Dozent werden - Bitcoin Education": "Torne-se professor - Educação Bitcoin",
"Werde Bitcoin-Dozent und teile dein Expertenwissen mit der Community.": "Torne-se um professor de Bitcoin e compartilhe seu conhecimento especializado com a comunidade.",
"Dozentenprofil bearbeiten": "Editar perfil do professor",
"Aktualisiere dein Profil als Bitcoin-Dozent und deine Kursangebote.": "Atualize seu perfil como professor de Bitcoin e suas ofertas de cursos.",
"Bitcoin Dozenten - Übersicht": "Professores Bitcoin - Visão geral",
"Lerne unsere erfahrenen Bitcoin-Dozenten und ihre Expertise kennen.": "Conheça nossos professores experientes de Bitcoin e sua expertise.",
"Bitcoin Meetup Events verwalten": "Gerenciar eventos Bitcoin Meetup",
"Erstelle und bearbeite Bitcoin Meetup Events für deine Community.": "Crie e edite eventos de Bitcoin Meetup para sua comunidade.",
"Meetup bearbeiten - Bitcoin Events": "Editar Meetup - Eventos Bitcoin",
"Aktualisiere die Details und Informationen deines Bitcoin Meetups.": "Atualize os detalhes e informações do seu Bitcoin Meetup.",
"Bitcoin Meetups - Alle Events": "Bitcoin Meetups - Todos os eventos",
"Finde alle aktuellen Bitcoin Meetups und Events in deiner Region.": "Encontre todos os atuais Bitcoin Meetups e eventos em sua região.",
"Bitcoin Meetups - Community Events": "Bitcoin Meetups - Eventos da comunidade",
"Entdecke Bitcoin Community Events und vernetze dich mit Gleichgesinnten.": "Descubra eventos da comunidade Bitcoin e conecte-se com pessoas de ideias semelhantes.",
"Bitcoin Event Details": "Detalhes do evento Bitcoin",
"Alle Informationen zum ausgewählten Bitcoin Meetup Event.": "Todas as informações sobre o evento selecionado de Bitcoin Meetup.",
"Bitcoin Meetups Karte": "Mapa de Bitcoin Meetups",
"Finde Bitcoin Meetups in deiner Nähe mit unserer interaktiven Karte.": "Encontre Bitcoin Meetups perto de você com nosso mapa interativo.",
"Erscheinungsbild - Einstellungen": "Aparência - Configurações",
"Passe das Erscheinungsbild deines Bitcoin Meetup Profils an.": "Personalize a aparência do seu perfil de Bitcoin Meetup.",
"Konto löschen - Bitcoin Meetups": "Excluir conta - Bitcoin Meetups",
"Informationen zum Löschen deines Bitcoin Meetup Kontos.": "Informações sobre como excluir sua conta de Bitcoin Meetup.",
"Passwort ändern - Bitcoin Meetups": "Alterar senha - Bitcoin Meetups",
"Ändere dein Passwort für mehr Sicherheit deines Bitcoin Meetup Kontos.": "Altere sua senha para maior segurança da sua conta de Bitcoin Meetup.",
"Profil bearbeiten - Bitcoin Meetups": "Editar perfil - Bitcoin Meetups",
"Aktualisiere deine persönlichen Informationen und Profileinstellungen.": "Atualize suas informações pessoais e configurações de perfil.",
"Neuen Veranstaltungsort erstellen": "Criar novo local de evento",
"Füge einen neuen Ort für Bitcoin Meetups und Events hinzu.": "Adicione um novo local para Bitcoin Meetups e eventos.",
"Veranstaltungsort bearbeiten": "Editar local de evento",
"Aktualisiere die Details eines Bitcoin Meetup Veranstaltungsortes.": "Atualize os detalhes de um local de evento de Bitcoin Meetup.",
"Veranstaltungsorte - Übersicht": "Locais de eventos - Visão geral",
"Finde alle Veranstaltungsorte für Bitcoin Meetups und Events.": "Encontre todos os locais para Bitcoin Meetups e eventos.",
"Willkommen": "Bem-vindo",
"Toximalistisches Infotainment für bullische Bitcoiner.": "Entretenimento informativo toximalista para bitcoiners bullish.",
"no location set": "nenhum local definido",
"BooksForPlebs": "BooksForPlebs",
"Lokale Buchausleihe für Bitcoin-Meetups.": "Empréstimo local de livros para Bitcoin Meetups.",
"Bitcoin - Rabbit Hole": "Bitcoin - Toca do Coelho",
"Dies ist ein großartiger Überblick über die Bitcoin-Kaninchenhöhle mit Zugängen zu Bereichen, die Bitcoin umfasst. Jedes Thema hat seine eigene Kaninchenhöhle, die durch Infografiken auf einfache und verständliche Weise visualisiert wird, mit QR-Codes, die zu erklärenden Videos und Artikeln führen. Viel Spaß auf Ihrer Entdeckungsreise!": "Este é uma grande visão geral do abismo do coelho Bitcoin com acesso a áreas que abrangem Bitcoin. Cada tópico tem seu próprio abismo do coelho, visualizado de forma simples e compreensível através de infográficos, com códigos QR que levam a vídeos e artigos explicativos. Divirta-se em sua jornada de descoberta!",
"Saved.": "Salvo.",
"Sprache wählen": "Escolher idioma",
"Dashboard": "Painel",
"Search": "Buscar",
"Repository": "Repositório",
"Documentation": "Documentação",
"Settings": "Configurações",
"Log Out": "Sair",
"Platform": "Plataforma",
"Success!": "Sucesso!",
"Copied into clipboard": "Copiado para a área de transferência",
"App": "App",
"Meetups": "Meetups",
"Karte": "Mapa",
"Kurse": "Cursos",
"Dozenten": "Professores",
"Diverses": "Diversos",
"Orte/Gebiete": "Locais/Áreas",
"Städte/Gebiete": "Cidades/Áreas",
"Veranstaltungsorte": "Locais de Eventos",
"Sprache wechseln": "Alterar idioma",
"Land": "País",
"Nächster Termin": "Próxima data",
"Zusagen": "Confirmações",
"Vielleicht": "Talvez",
"Telegram": "Telegram",
"Website": "Website",
"Twitter": "Twitter",
"Matrix": "Matrix",
"Nostr": "Nostr",
"Simplex": "Simplex",
"Signal": "Signal",
"Details": "Detalhes",
"Profile": "Perfil",
"Password": "Senha",
"Appearance": "Aparência",
"Unauthorized": "Não autorizado",
"Payment Required": "Pagamento obrigatório",
"Forbidden": "Proibido",
"Not Found": "Não encontrado",
"Page Expired": "Página expirada",
"Too Many Requests": "Muitas solicitações",
"Server Error": "Erro do servidor",
"Service Unavailable": "Serviço indisponível",
"Confirm password": "Confirmar senha",
"This is a secure area of the application. Please confirm your password before continuing.": "Esta é uma área segura da aplicação. Por favor, confirme sua senha antes de continuar.",
"Confirm": "Confirmar",
"A reset link will be sent if the account exists.": "Um link de redefinição será enviado se a conta existir.",
"Forgot password": "Esqueceu a senha",
"Enter your email to receive a password reset link": "Digite seu e-mail para receber um link de redefinição de senha",
"Email Address": "Endereço de e-mail",
"Email password reset link": "Enviar link de redefinição de senha por e-mail",
"Or, return to": "Ou, retornar para",
"log in": "fazer login",
"Willkommen zurück": "Bem-vindo de volta",
"Log in mit Nostr": "Fazer login com Nostr",
"Copy": "Copiar",
"Click to connect": "Clique para conectar",
"Create an account": "Criar uma conta",
"Enter your details below to create your account": "Digite seus detalhes abaixo para criar sua conta",
"Name": "Nome",
"Full name": "Nome completo",
"Email address": "Endereço de e-mail",
"Create account": "Criar conta",
"Already have an account?": "Já tem uma conta?",
"Log in": "Fazer login",
"Reset password": "Redefinir senha",
"Please enter your new password below": "Por favor, digite sua nova senha abaixo",
"Email": "E-mail",
"Please verify your email address by clicking on the link we just emailed to you.": "Por favor, verifique seu endereço de e-mail clicando no link que acabamos de enviar para você.",
"A new verification link has been sent to the email address you provided during registration.": "Um novo link de verificação foi enviado para o endereço de e-mail que você forneceu durante o registro.",
"Resend verification email": "Reenviar e-mail de verificação",
"Log out": "Sair",
"City successfully created!": "Cidade criada com sucesso!",
"Create City": "Criar Cidade",
"Basic Information": "Informações básicas",
"Country": "País",
"Select a country": "Selecione um país",
"Coordinates": "Coordenadas",
"Latitude": "Latitude",
"Longitude": "Longitude",
"Demographics": "Demografia",
"Population": "População",
"Population Date": "Data da população",
"Cancel": "Cancelar",
"City successfully updated!": "Cidade atualizada com sucesso!",
"Edit City": "Editar Cidade",
"Update City": "Atualizar Cidade",
"Cities": "Cidades",
"Search cities...": "Buscar cidades...",
"Created By": "Criado por",
"Actions": "Ações",
"Edit": "Editar",
"Wähle dein Land...": "Escolha seu país...",
"Suche dein Land...": "Busque seu país...",
"Die Endzeit muss nach der Startzeit liegen.": "A hora de fim deve ser após a hora de início.",
"Event erfolgreich aktualisiert!": "Evento atualizado com sucesso!",
"Event erfolgreich erstellt!": "Evento criado com sucesso!",
"Event erfolgreich gelöscht!": "Evento deletado com sucesso!",
"Event bearbeiten": "Editar evento",
"Neues Event erstellen": "Criar novo evento",
"Event Details": "Detalhes do evento",
"Startdatum": "Data de início",
"An welchem Tag beginnt das Event?": "Em que dia começa o evento?",
"Startzeit": "Hora de início",
"Um wie viel Uhr beginnt das Event?": "A que hora começa o evento?",
"Enddatum": "Data de fim",
"An welchem Tag endet das Event?": "Em que dia termina o evento?",
"Endzeit": "Hora de fim",
"Um wie viel Uhr endet das Event?": "A que hora termina o evento?",
"Veranstaltungsort": "Local do evento",
"Ort hinzufügen": "Adicionar local",
"Veranstaltungsort auswählen": "Selecionar local do evento",
"Suche nach Ort...": "Buscar por local...",
"Wo findet das Event statt?": "Onde acontece o evento?",
"Link": "Link",
"Link zu weiteren Informationen oder zur Anmeldung": "Link para mais informações ou inscrição",
"Abbrechen": "Cancelar",
"Bist du sicher, dass du dieses Event löschen möchtest?": "Tem certeza de que deseja deletar este evento?",
"Event löschen": "Deletar evento",
"Event aktualisieren": "Atualizar evento",
"Event erstellen": "Criar evento",
"Veranstaltungsort hinzufügen": "Adicionar local do evento",
"Füge einen neuen Veranstaltungsort zur Datenbank hinzu.": "Adicione um novo local do evento ao banco de dados.",
"z.B. Bitcoin Zentrum München": "Ex.: Centro Bitcoin München",
"Stadt": "Cidade",
"Stadt auswählen": "Selecionar cidade",
"Suche passende Stadt...": "Buscar cidade adequada...",
"Straße": "Rua",
"z.B. Hauptstraße 1": "Ex.: Rua Principal 1",
"Ort erstellen": "Criar local",
"Kurs erfolgreich erstellt!": "Curso criado com sucesso!",
"Neuen Kurs erstellen": "Criar novo curso",
"Grundlegende Informationen": "Informações básicas",
"Der Anzeigename für diesen Kurs": "O nome de exibição para este curso",
"Dozent": "Professor",
"Dozent auswählen": "Selecionar professor",
"Suche passenden Dozenten...": "Buscar professor adequado...",
"Der Dozent, der diesen Kurs leitet": "O professor que conduz este curso",
"Beschreibung": "Descrição",
"Ausführliche Beschreibung des Kurses": "Descrição detalhada do curso",
"Kurs erstellen": "Criar curso",
"Kurs erfolgreich aktualisiert!": "Curso atualizado com sucesso!",
"Kurs bearbeiten": "Editar curso",
"ID": "ID",
"System-generierte ID (nur lesbar)": "ID gerada pelo sistema (somente leitura)",
"Systeminformationen": "Informações do sistema",
"Erstellt von": "Criado por",
"Unbekannt": "Desconhecido",
"Ersteller des Kurses": "Criador do curso",
"Erstellt am": "Criado em",
"Wann dieser Kurs erstellt wurde": "Quando este curso foi criado",
"Aktualisiert am": "Atualizado em",
"Letzte Änderungszeit": "Última alteração",
"Kurs aktualisieren": "Atualizar curso",
"Suche nach Kursen...": "Buscar cursos...",
"Neuer Kurs": "Novo curso",
"Aktionen": "Ações",
"Bearbeiten": "Editar",
"Über den Kurs": "Sobre o curso",
"Über den Dozenten": "Sobre o professor",
"Kommende Veranstaltungen": "Próximos eventos",
"Anmeldungen": "Inscrições",
"Details/Anmelden": "Detalhes/Inscrever-se",
"Meine nächsten Meetup Termine": "Minhas próximas datas de Meetup",
"Keine bevorstehenden Termine": "Nenhuma data futura",
"Meine Meetups": "Meus Meetups",
"Meetup hinzufügen...": "Adicionar Meetup...",
"Meetup suchen...": "Buscar Meetup...",
"Meetup entfernen?": "Remover Meetup?",
"Möchtest du": "Você deseja",
"aus deinen Meetups entfernen?": "remover dos seus Meetups?",
"Du kannst es jederzeit wieder hinzufügen.": "Você pode adicioná-lo novamente a qualquer momento.",
"Entfernen": "Remover",
"Keine Meetups zugeordnet": "Nenhum Meetup associado",
"Dozent erfolgreich erstellt!": "Professor criado com sucesso!",
"Neuen Dozenten erstellen": "Criar novo professor",
"Vollständiger Name des Dozenten": "Nome completo do professor",
"Untertitel": "Subtítulo",
"Kurze Berufsbezeichnung oder Rolle": "Breve título profissional ou papel",
"Status": "Status",
"Ist dieser Dozent aktiv?": "Este professor está ativo?",
"Einführung": "Introdução",
"Kurze Vorstellung (wird auf Kurs-Seiten angezeigt)": "Apresentação curta (exibida nas páginas do curso)",
"Ausführliche Beschreibung und Biografie": "Descrição detalhada e biografia",
"Links & Soziale Medien": "Links e mídias sociais",
"Webseite": "Website",
"Persönliche Webseite oder Portfolio": "Website pessoal ou portfólio",
"Twitter Benutzername": "Nome de usuário no Twitter",
"Twitter-Handle ohne @ Symbol": "Handle do Twitter sem o símbolo @",
"Nostr öffentlicher Schlüssel": "Chave pública Nostr",
"Zahlungsinformationen": "Informações de pagamento",
"Lightning Adresse": "Endereço Lightning",
"Lightning-Adresse für Zahlungen": "Endereço Lightning para pagamentos",
"LNURL": "LNURL",
"LNURL für Lightning-Zahlungen": "LNURL para pagamentos Lightning",
"Node ID": "Node ID",
"Lightning Node ID": "Lightning Node ID",
"PayNym": "PayNym",
"PayNym für Bitcoin-Zahlungen": "PayNym para pagamentos Bitcoin",
"Dozenten erstellen": "Criar professores",
"Dozent erfolgreich aktualisiert!": "Professor atualizado com sucesso!",
"Dozent bearbeiten": "Editar professor",
"Ersteller des Dozenten": "Criador do professor",
"Wann dieser Dozent erstellt wurde": "Quando este professor foi criado",
"Dozent aktualisieren": "Atualizar professor",
"Suche nach Dozenten...": "Buscar professores...",
"Dozenten anlegen": "Criar professores",
"Links": "Links",
"Aktiv": "Ativo",
"Inaktiv": "Inativo",
"weitere Termine": "mais datas",
"Datum": "Data",
"An welchem Tag findet das Event statt?": "Em que dia ocorre o evento?",
"Uhrzeit": "Hora",
"Um wie viel Uhr startet das Event?": "A que hora começa o evento?",
"Ort": "Local",
"z.B. Café Mustermann, Hauptstr. 1": "Ex.: Café Mustermann, Rua Principal 1",
"Beschreibe das Event...": "Descreva o evento...",
"Details über das Event": "Detalhes sobre o evento",
"Link zu weiteren Informationen": "Link para mais informações",
"Meetup erfolgreich erstellt!": "Meetup criado com sucesso!",
"Neues Meetup erstellen": "Criar novo Meetup",
"Der Anzeigename für dieses Meetup": "O nome de exibição para este Meetup",
"Stadt hinzufügen": "Adicionar cidade",
"Die nächstgrößte Stadt oder Ort": "A próxima maior cidade ou local",
"Auf Karte sichtbar": "Visível no mapa",
"Soll dieses Meetup auf der Karte angezeigt werden?": "Este Meetup deve ser exibido no mapa?",
"Kurze Beschreibung des Meetups": "Descrição curta do Meetup",
"Offizielle Webseite oder Landingpage": "Página oficial ou landing page",
"Telegram Link": "Link do Telegram",
"Link zur Telegram-Gruppe oder zum Kanal": "Link para o grupo ou canal do Telegram",
"Matrix Gruppe": "Grupo Matrix",
"Matrix-Raum Bezeichner oder Link": "Identificador de sala Matrix ou link",
"Nostr öffentlicher Schlüssel oder Bezeichner": "Chave pública Nostr ou identificador",
"SimpleX": "SimpleX",
"SimpleX Chat Kontaktinformationen": "Informações de contato do SimpleX Chat",
"Signal Kontakt- oder Gruppeninformationen": "Informações de contato ou grupo do Signal",
"Zusätzliche Informationen": "Informações adicionais",
"Gemeinschaft": "Comunidade",
"Keine": "Nenhuma",
"Gemeinschafts- oder Organisationsname": "Nome da comunidade ou organização",
"Meetup erstellen": "Criar Meetup",
"Füge eine neue Stadt zur Datenbank hinzu.": "Adicione uma nova cidade ao banco de dados.",
"Stadtname": "Nome da cidade",
"z.B. Berlin": "Ex.: Berlin",
"Land auswählen": "Selecionar país",
"Breitengrad": "Latitude",
"Längengrad": "Longitude",
"Stadt erstellen": "Criar cidade",
"Meetup erfolgreich aktualisiert!": "Meetup atualizado com sucesso!",
"Meetup bearbeiten": "Editar Meetup",
"Ersteller des Meetups": "Criador do Meetup",
"Wann dieses Meetup erstellt wurde": "Quando este Meetup foi criado",
"Meetup aktualisieren": "Atualizar Meetup",
"Kalender-Stream-URL kopieren": "Copiar URL do stream de calendário",
"Suche nach Meetups...": "Buscar Meetups...",
"Mehr Informationen": "Mais informações",
"Teilnahme": "Participação",
"Du bist nicht eingloggt und musst deshalb den Namen selbst eintippen.": "Você não está logado e precisa digitar o nome manualmente.",
"Dein Name": "Seu nome",
"Name eingeben": "Digite o nome",
"Ich komme": "Eu vou",
"Absagen": "Desistir",
"Zurück zum Meetup": "Voltar ao Meetup",
"Über uns": "Sobre nós",
"Kontakt & Links": "Contato e links",
"Standort": "Localização",
"Zoom = STRG+Scroll": "Zoom = CTRL+Scroll",
"Öffnen/RSVP": "Abrir/RSVP",
"Update the appearance settings for your account": "Atualizar as configurações de aparência da sua conta",
"Light": "Claro",
"Dark": "Escuro",
"System": "Sistema",
"Delete account": "Deletar conta",
"Delete your account and all of its resources": "Deletar sua conta e todos os seus recursos",
"Are you sure you want to delete your account?": "Tem certeza de que deseja deletar sua conta?",
"Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Depois que sua conta for deletada, todos os seus recursos e dados serão permanentemente deletados. Por favor, digite sua senha para confirmar que deseja permanetemente deletar sua conta.",
"Update password": "Atualizar senha",
"Ensure your account is using a long, random password to stay secure": "Garanta que sua conta esteja usando uma senha longa e aleatória para permanecer segura",
"Current password": "Senha atual",
"New password": "Nova senha",
"Confirm Password": "Confirmar senha",
"Save": "Salvar",
"Update your name and email address": "Atualize seu nome e endereço de e-mail",
"Your email address is unverified.": "Seu endereço de e-mail não foi verificado.",
"Click here to re-send the verification email.": "Clique aqui para reenviar o e-mail de verificação.",
"A new verification link has been sent to your email address.": "Um novo link de verificação foi enviado para seu endereço de e-mail.",
"Zeitzone": "Fuso horário",
"Wähle deine Zeitzone aus...": "Escolha seu fuso horário...",
"Spracheinstellungen": "Configurações de idioma",
"Wähle deine Sprache aus...": "Escolha seu idioma...",
"Zeitzone erfolgreich aktualisiert": "Fuso horário atualizado com sucesso",
"Wähle deine Zeitzone...": "Escolha seu fuso horário...",
"Suche Zeitzone...": "Buscar fuso horário...",
"Venue successfully created!": "Local criado com sucesso!",
"Create Venue": "Criar Local",
"Venue Information": "Informações do Local",
"City": "Cidade",
"Select a city": "Selecionar uma cidade",
"Street": "Rua",
"Venue successfully updated!": "Local atualizado com sucesso!",
"Edit Venue": "Editar Local",
"Update Venue": "Atualizar Local",
"Venues": "Locais",
"Search venues...": "Buscar locais...",
"Bitcoin Meetups": "Bitcoin Meetups",
"Alle Meetups anzeigen": "Mostrar todos os Meetups",
"Kartenansicht öffnen": "Abrir vista do mapa",
"Login": "Login",
"Verbinde dich mit Bitcoinern in deiner Nähe": "Conecte-se com bitcoiners perto de você",
"Finde deine lokale Community": "Encontre sua comunidade local",
"Manage your profile and account settings": "Gerencie seu perfil e configurações de conta"
}

BIN
public/img/domains/lat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -10,11 +10,25 @@
<flux:accordion.content> <flux:accordion.content>
@php @php
$languages = [ // Scan lang folder for available languages
$availableLanguages = collect(glob(base_path('lang/*.json')))
->map(fn($file) => pathinfo($file, PATHINFO_FILENAME))
->toArray();
$allLanguages = [
'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']], 'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']],
'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']], 'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']],
'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']], 'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']],
'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']],
'pt' => ['name' => 'Português', 'countries' => ['pt-PT']],
]; ];
// Filter languages based on available JSON files and allowed languages
$languages = array_filter($allLanguages, function($data, $key) use ($availableLanguages) {
return in_array($key, $availableLanguages) &&
count(array_intersect($data['countries'], config('lang-country.allowed'))) > 0;
}, ARRAY_FILTER_USE_BOTH);
$currentLangCountry = session('lang_country', config('lang-country.fallback')); $currentLangCountry = session('lang_country', config('lang-country.fallback'));
@endphp @endphp

View File

@@ -32,7 +32,7 @@ class extends Component {
session(['auth.password_confirmed_at' => time()]); session(['auth.password_confirmed_at' => time()]);
$this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), navigate: true); $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false), navigate: true);
} }
}; ?> }; ?>

View File

@@ -36,9 +36,12 @@ class extends Component {
public ?string $url = null; public ?string $url = null;
public ?string $lnurl = null; public ?string $lnurl = null;
public ?string $qrCode = null; public ?string $qrCode = null;
public string $currentLangCountry = 'de-DE';
public function mount(): void public function mount(): void
{ {
$this->currentLangCountry = session('lang_country');
// Nur beim ersten Mount initialisieren // Nur beim ersten Mount initialisieren
if ($this->k1 === null) { if ($this->k1 === null) {
$this->k1 = bin2hex(str()->random(32)); $this->k1 = bin2hex(str()->random(32));
@@ -64,7 +67,7 @@ class extends Component {
Auth::loginUsingId($user->id); Auth::loginUsingId($user->id);
Session::regenerate(); Session::regenerate();
$this->redirectIntended( $this->redirectIntended(
default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false),
navigate: true, navigate: true,
); );
return; return;
@@ -85,9 +88,12 @@ class extends Component {
RateLimiter::clear($this->throttleKey()); RateLimiter::clear($this->throttleKey());
Session::regenerate(); Session::regenerate();
session([
'lang_country' => $this->currentLangCountry,
]);
$this->redirectIntended( $this->redirectIntended(
default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()], absolute: false), default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()], absolute: false),
navigate: true navigate: true
); );
} }
@@ -134,8 +140,12 @@ class extends Component {
\App\Models\User::find(1) \App\Models\User::find(1)
->notify(new ModelCreatedNotification($user, 'users')); ->notify(new ModelCreatedNotification($user, 'users'));
auth()->login($user); auth()->login($user);
Session::regenerate();
session([
'lang_country' => $this->currentLangCountry,
]);
return to_route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]); return to_route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]);
} }
return true; return true;

View File

@@ -35,7 +35,7 @@ class extends Component {
Auth::login($user); Auth::login($user);
$this->redirectIntended(route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false), navigate: true); $this->redirectIntended(route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false), navigate: true);
} }
}; ?> }; ?>

View File

@@ -17,7 +17,7 @@ class extends Component {
public function sendVerification(): void public function sendVerification(): void
{ {
if (Auth::user()->hasVerifiedEmail()) { if (Auth::user()->hasVerifiedEmail()) {
$this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false), navigate: true); $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false), navigate: true);
return; return;
} }

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -9,7 +9,7 @@ new class extends Component {
public function mount(): void public function mount(): void
{ {
$this->currentCountry = request()->route('country', 'de'); $this->currentCountry = request()->route('country', config('app.domain_country'));
$this->currentRouteName = request()->route()->getName(); $this->currentRouteName = request()->route()->getName();
$this->currentRouteParams = request()->route()->parameters(); $this->currentRouteParams = request()->route()->parameters();
} }

View File

@@ -37,7 +37,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
$timezone = auth()->user()->timezone ?? 'Europe/Berlin'; $timezone = auth()->user()->timezone ?? 'Europe/Berlin';
if ($this->event) { if ($this->event) {

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -18,7 +18,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function addMeetup() public function addMeetup()

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -31,7 +31,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
$timezone = auth()->user()->timezone ?? 'Europe/Berlin'; $timezone = auth()->user()->timezone ?? 'Europe/Berlin';
if ($this->event) { if ($this->event) {

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -25,7 +25,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
$this->name = auth()->user()->name ?? ''; $this->name = auth()->user()->name ?? '';
$this->loadAttendees(); $this->loadAttendees();
} }

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -16,7 +16,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
$geoCountry = \Lwwcas\LaravelCountries\Models\Country::query() $geoCountry = \Lwwcas\LaravelCountries\Models\Country::query()
->where('iso_alpha_2', str($this->country)->upper()) ->where('iso_alpha_2', str($this->country)->upper())
->first() ->first()

View File

@@ -64,7 +64,7 @@ class extends Component {
$user = Auth::user(); $user = Auth::user();
if ($user->hasVerifiedEmail()) { if ($user->hasVerifiedEmail()) {
$this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()],absolute: false)); $this->redirectIntended(default: route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()],absolute: false));
return; return;
} }
@@ -127,11 +127,22 @@ class extends Component {
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4"> <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
@php @php
$languages = [ // Scan lang folder for available languages
$availableLanguages = collect(glob(base_path('lang/*.json')))
->map(fn($file) => pathinfo($file, PATHINFO_FILENAME))
->toArray();
$allLanguages = [
'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']], 'de' => ['name' => 'Deutsch', 'countries' => ['de-DE', 'de-AT', 'de-CH']],
'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']], 'en' => ['name' => 'English', 'countries' => ['en-GB', 'en-US', 'en-AU', 'en-CA']],
'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']], 'es' => ['name' => 'Español', 'countries' => ['es-ES', 'es-CL', 'es-CO']],
'nl' => ['name' => 'Nederlands', 'countries' => ['nl-NL', 'nl-BE']],
'pt' => ['name' => 'Português', 'countries' => ['pt-PT', 'pt-BR']],
]; ];
// Filter languages based on available JSON files
$languages = array_filter($allLanguages, fn($key) => in_array($key, $availableLanguages), ARRAY_FILTER_USE_KEY);
$currentLangCountry = session('lang_country', config('lang-country.fallback')); $currentLangCountry = session('lang_country', config('lang-country.fallback'));
@endphp @endphp

View File

@@ -17,7 +17,7 @@ class extends Component {
public function mount(): void public function mount(): void
{ {
$this->country = request()->route('country'); $this->country = request()->route('country', config('app.domain_country'));
} }
public function with(): array public function with(): array

View File

@@ -13,12 +13,12 @@ class extends Component {
public function goToMeetups(): void public function goToMeetups(): void
{ {
$this->redirect(route('meetups.index', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]), navigate: true); $this->redirect(route('meetups.index', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]), navigate: true);
} }
public function goToMap(): void public function goToMap(): void
{ {
$this->redirect(route('meetups.map', ['country' => str(session('lang_country', 'de'))->after('-')->lower()]), navigate: true); $this->redirect(route('meetups.map', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()]), navigate: true);
} }
}; ?> }; ?>
@@ -60,7 +60,7 @@ class extends Component {
{{ __('Kartenansicht öffnen') }} {{ __('Kartenansicht öffnen') }}
</flux:button> </flux:button>
<flux:button :href="route('dashboard', ['country' => str(session('lang_country', 'de'))->after('-')->lower()])" class="cursor-pointer w-full" <flux:button :href="route('dashboard', ['country' => str(session('lang_country', config('app.domain_country')))->after('-')->lower()])" class="cursor-pointer w-full"
icon="arrow-right-start-on-rectangle"> icon="arrow-right-start-on-rectangle">
{{ __('Login') }} {{ __('Login') }}
</flux:button> </flux:button>

View File

@@ -48,6 +48,12 @@ Route::middleware(['auth'])
return redirect('/de/dashboard'); // Zu /de weiterleiten return redirect('/de/dashboard'); // Zu /de weiterleiten
}); });
Route::middleware([])
->prefix('/{country:code?}')
->group(function () {
Volt::route('dashboard', 'dashboard')->name('dashboard');
});
Route::middleware([]) Route::middleware([])
->prefix('/{country:code}') ->prefix('/{country:code}')
->group(function () { ->group(function () {
@@ -83,7 +89,6 @@ Route::middleware([])
Route::middleware(['auth']) Route::middleware(['auth'])
->prefix('/{country:code}') ->prefix('/{country:code}')
->group(function () { ->group(function () {
Volt::route('dashboard', 'dashboard')->name('dashboard');
Volt::route('meetup-create', 'meetups.create')->name('meetups.create'); Volt::route('meetup-create', 'meetups.create')->name('meetups.create');
Volt::route('meetup-edit/{meetup}', 'meetups.edit')->name('meetups.edit'); Volt::route('meetup-edit/{meetup}', 'meetups.edit')->name('meetups.edit');
Volt::route('meetup/{meetup}/events/create', 'meetups.create-edit-events')->name('meetups.events.create'); Volt::route('meetup/{meetup}/events/create', 'meetups.create-edit-events')->name('meetups.events.create');