Merge pull request #426 from meienberger/release/1.4.2

release 1.4.2
This commit is contained in:
Nicolas Meienberger 2023-05-23 22:45:30 +02:00 committed by GitHub
commit 91d59d726e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 222 additions and 220 deletions

View file

@ -1,6 +1,6 @@
{
"name": "runtipi",
"version": "1.4.1",
"version": "1.4.2",
"description": "A homeserver for everyone",
"scripts": {
"copy:migrations": "mkdir -p dist/migrations && cp -r ./src/server/migrations dist",

View file

@ -22,11 +22,11 @@ export const AppTile: React.FC<{ app: AppTileInfo; status: AppStatusEnum; update
<div className="card-body">
<div className="d-flex align-items-center">
<span className="me-3">
<AppLogo alt={`${app.name} logo`} className="mr-3 group-hover:scale-105 transition-all" id={app.id} size={60} />
<AppLogo alt={`${app.name} logo`} id={app.id} size={60} />
</span>
<div>
<div className="d-flex h-3 align-items-center">
<span className="h4 me-2 mt-1 fw-bolder">{app.name}</span>
<span className="h4 me-2 mb-1 fw-bolder">{app.name}</span>
<div className={styles.statusContainer}>
<AppStatus lite status={status} />
</div>

View file

@ -124,8 +124,8 @@
"title": "App Store",
"search-placeholder": "Chercher des applications",
"category-placeholder": "Sélectionnez une catégorie",
"no-results": "No app found",
"no-results-subtitle": "Try to refine your search"
"no-results": "Aucune application trouvée",
"no-results-subtitle": "Essayez d'affiner votre recherche"
},
"app-details": {
"install-success": "Application installée avec succès",
@ -249,8 +249,8 @@
"storage-path-hint": "Chemin d'accès au répertoire de stockage. Laisser vide pour les valeurs par défaut (runtipi/app-data). Assurez-vous qu'il s'agit d'un chemin absolu et qu'il existe",
"submit": "Sauvegarder",
"user-settings-title": "Paramètres utilisateur",
"language": "Language",
"help-translate": "Help translate Tipi"
"language": "Langue",
"help-translate": "Aidez à traduire Tipi"
},
"security": {
"tab-title": "Sécurité",

View file

@ -1,295 +1,295 @@
{
"server-messages": {
"errors": {
"invalid-credentials": "Invalid credentials",
"admin-already-exists": "There is already an admin user. Please login to create a new user from the admin panel.",
"missing-email-or-password": "Missing email or password",
"invalid-username": "Invalid username",
"user-already-exists": "User already exists",
"error-creating-user": "Error creating user",
"no-change-password-request": "No change password request found",
"operator-not-found": "Operator user not found",
"user-not-found": "User not found",
"not-allowed-in-demo": "Not allowed in demo mode",
"not-allowed-in-dev": "Not allowed in dev mode",
"invalid-password": "Invalid password",
"invalid-password-length": "Password must be at least 8 characters long",
"invalid-locale": "Invalid locale",
"totp-session-not-found": "2FA session not found",
"totp-not-enabled": "2FA is not enabled for this user",
"totp-invalid-code": "Invalid 2FA code",
"totp-already-enabled": "2FA is already enabled for this user",
"app-not-found": "App {id} not found",
"app-failed-to-start": "Failed to start app {id}, see logs for more details",
"app-failed-to-install": "Failed to install app {id}, see logs for more details",
"app-failed-to-stop": "Failed to stop app {id}, see logs for more details",
"app-failed-to-uninstall": "Failed to uninstall app {id}, see logs for more details",
"app-failed-to-update": "Failed to update app {id}, see logs for more details",
"domain-required-if-expose-app": "Domain is required if app is exposed",
"domain-not-valid": "Domain {domain} is not a valid domain",
"invalid-config": "App {id} has an invalid config.json file",
"app-not-exposable": "App {id} is not exposable",
"app-force-exposed": "App {id} works only with exposed domain",
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"invalid-credentials": "Ogiltiga inloggningsuppgifter",
"admin-already-exists": "Det finns redan en administratörsanvändare. Logga in för att skapa en ny användare från adminpanelen.",
"missing-email-or-password": "E-postadress eller lösenord saknas",
"invalid-username": "Ogiltigt användarnamn",
"user-already-exists": "Användaren finns redan",
"error-creating-user": "Fel vid skapande av användare",
"no-change-password-request": "Ingen begäran om ändring av lösenord hittades",
"operator-not-found": "Operatörsanvändare hittades inte",
"user-not-found": "Användaren kunde inte hittas",
"not-allowed-in-demo": "Inte tillåtet i demoläge",
"not-allowed-in-dev": "Ej tillåtet i dev-läge",
"invalid-password": "Ogiltigt lösenord",
"invalid-password-length": "Lösenordet måste vara minst 8 tecken långt",
"invalid-locale": "Ogiltig språk",
"totp-session-not-found": "2FA session hittades inte",
"totp-not-enabled": "2FA är inte aktiverat för denna användare",
"totp-invalid-code": "Ogiltig 2FA kod",
"totp-already-enabled": "2FA är redan aktiverat för denna användare",
"app-not-found": "Appen {id} hittades inte",
"app-failed-to-start": "Det gick inte att starta app {id}, se loggar för mer information",
"app-failed-to-install": "Det gick inte att installera app {id}, se loggar för mer information",
"app-failed-to-stop": "Det gick inte att stoppa app {id}, se loggar för mer information",
"app-failed-to-uninstall": "Det gick inte att avinstallera app {id}, se loggar för mer information",
"app-failed-to-update": "Det gick inte att uppdatera app {id}, se loggar för mer information",
"domain-required-if-expose-app": "Domän krävs om appen är exponerad",
"domain-not-valid": "Domän {domain} är inte en giltig domän",
"invalid-config": "Appen {id} har en ogiltig config.json-fil",
"app-not-exposable": "Appen {id} kan inte exponeras",
"app-force-exposed": "Appen {id} fungerar endast med exponerad domän",
"domain-already-in-use": "Domän {domain} används redan av appen {id}",
"could-not-get-latest-version": "Kunde inte hämta senaste versionen",
"current-version-is-latest": "Den nuvarande versionen är redan uppdaterad",
"major-version-update": "Huvudversionen har ändrats. Vänligen uppdatera manuellt (instruktioner på GitHub)"
},
"success": {}
},
"auth": {
"login": {
"title": "Login to your account",
"submit": "Login"
"title": "Logga in till ditt konto",
"submit": "Logga in"
},
"totp": {
"title": "Two-factor authentication",
"instructions": "Enter the code from your authenticator app",
"submit": "Confirm"
"title": "Tvåfaktorsautentisering",
"instructions": "Ange koden från din autentiseringsapp",
"submit": "Bekräfta"
},
"register": {
"title": "Register your account",
"submit": "Register"
"title": "Registrera ditt konto",
"submit": "Registrera"
},
"reset-password": {
"title": "Reset your password",
"submit": "Reset password",
"cancel": "Cancel password change request",
"instructions": "Run this command on your server and then refresh this page",
"success-title": "Password reset",
"success": "Your password has been reset. You can now login with your new password. And your email {email}",
"back-to-login": "Back to login"
"title": "Återställ ditt lösenord",
"submit": "Återställ lösenord",
"cancel": "Avbryta begäran om ändring av lösenord",
"instructions": "Kör detta kommando på din server och uppdatera sedan den här sidan",
"success-title": "Återställ lösenord",
"success": "Ditt lösenord har återställts. Du kan nu logga in med ditt nya lösenord. Och din e-postadress {email}",
"back-to-login": "Tillbaka till inloggningen"
},
"form": {
"email": "Email address",
"email-placeholder": "you@example.com",
"password": "Password",
"password-placeholder": "Enter your password",
"password-confirmation": "Confirm password",
"password-confirmation-placeholder": "Confirm your password",
"forgot": "Forgot password?",
"new-password-placeholder": "Your new password",
"new-password-confirmation-placeholder": "Confirm your new password",
"email": "E-postadress",
"email-placeholder": "du@exempel.se",
"password": "Lösenord",
"password-placeholder": "Ange ditt lösenord",
"password-confirmation": "Bekräfta lösenord",
"password-confirmation-placeholder": "Bekräfta ditt lösenord",
"forgot": "Gömt lösenord?",
"new-password-placeholder": "Ditt nya lösenord",
"new-password-confirmation-placeholder": "Bekräfta ditt nya lösenord",
"errors": {
"email": {
"required": "Email address is required",
"email": "Email address is invalid",
"invalid": "Email address is invalid"
"required": "E-postadressen krävs",
"email": "E-postadressen är ogiltig",
"invalid": "E-postadressen är ogiltig"
},
"password": {
"required": "Password is required",
"minlength": "Password must be at least 8 characters"
"required": "Lösenord är obligatoriskt",
"minlength": "Lösenordet måste vara minst 8 tecken"
},
"password-confirmation": {
"required": "Password confirmation is required",
"minlength": "Password confirmation must be at least 8 characters",
"match": "Passwords do not match"
"required": "Lösenordsbekräftelse krävs",
"minlength": "Lösenordsbekräftelse måste vara minst 8 tecken",
"match": "Lösenorden matchar inte"
}
}
}
},
"dashboard": {
"title": "Dashboard",
"title": "Kontrollpanel",
"cards": {
"disk": {
"title": "Disk Space",
"subtitle": "Used out of {total} GB"
"title": "Diskutrymme",
"subtitle": "Används av {total} GB"
},
"memory": {
"title": "Memory Used"
"title": "Använt minne"
},
"cpu": {
"title": "CPU Load",
"subtitle": "Uninstall apps to reduce load"
"title": "CPU Belastning",
"subtitle": "Avinstallera appar för att minska belastning"
}
}
},
"apps": {
"status-running": "Running",
"status-stopped": "Stopped",
"status-starting": "Starting",
"status-stopping": "Stopping",
"status-updating": "Updating",
"status-missing": "Missing",
"status-installing": "Installing",
"status-uninstalling": "Uninstalling",
"update-available": "Update available",
"status-running": "Körs",
"status-stopped": "Stoppad",
"status-starting": "Startar",
"status-stopping": "Stoppar",
"status-updating": "Uppdaterar",
"status-missing": "Saknas",
"status-installing": "Installerar",
"status-uninstalling": "Avinstallerar",
"update-available": "Ny version tillgänglig",
"my-apps": {
"title": "My Apps",
"empty-title": "No app installed",
"empty-subtitle": "Install an app from the app store to get started",
"empty-action": "Go to app store"
"title": "Mina appar",
"empty-title": "Inga appar installerade",
"empty-subtitle": "Installera en app från appbutiken för att komma igång",
"empty-action": "Gå till app store"
},
"app-store": {
"title": "App Store",
"search-placeholder": "Search apps",
"category-placeholder": "Select a category",
"no-results": "No app found",
"no-results-subtitle": "Try to refine your search"
"search-placeholder": "Sök appar",
"category-placeholder": "Välj en kategori",
"no-results": "Ingen app hittades",
"no-results-subtitle": "Försök att förfina din sökning"
},
"app-details": {
"install-success": "App installed successfully",
"uninstall-success": "App uninstalled successfully",
"stop-success": "App stopped successfully",
"update-success": "App updated successfully",
"start-success": "App started successfully",
"update-config-success": "App config updated successfully. Restart the app to apply the changes",
"install-success": "Appen installerades",
"uninstall-success": "Appen avinstallerades",
"stop-success": "Appen stoppades",
"update-success": "Appen uppdaterades",
"start-success": "Appen startades",
"update-config-success": "Appkonfiguration har uppdaterats. Starta om appen för att tillämpa ändringarna",
"version": "Version",
"description": "Description",
"base-info": "Base info",
"source-code": "Source code",
"author": "Author",
"description": "Beskrivning",
"base-info": "Bas info",
"source-code": "Källkod",
"author": "Författare",
"port": "Port",
"categories-title": "Categories",
"link": "Link",
"website": "Website",
"supported-arch": "Supported architectures",
"categories-title": "Kategorier",
"link": "Länk",
"website": "Webbsida",
"supported-arch": "Arkitekturer som stöds",
"categories": {
"data": "Data",
"network": "Network",
"media": "Media",
"development": "Development",
"network": "Nätverk",
"media": "Medier",
"development": "Utveckling",
"automation": "Automation",
"social": "Social",
"utilities": "Utilities",
"security": "Security",
"photography": "Photography",
"featured": "Featured",
"books": "Books",
"music": "Music",
"finance": "Finance",
"gaming": "Gaming",
"utilities": "Verktyg",
"security": "Säkerhet",
"photography": "Fotografi",
"featured": "Utvalda",
"books": "Böcker",
"music": "Musik",
"finance": "Finans",
"gaming": "Spel",
"ai": "AI"
},
"actions": {
"start": "Start",
"remove": "Remove",
"settings": "Settings",
"stop": "Stop",
"open": "Open",
"loading": "Loading",
"cancel": "Cancel",
"install": "Install",
"update": "Update"
"start": "Starta",
"remove": "Radera",
"settings": "Inställningar",
"stop": "Stoppa",
"open": "Öppna",
"loading": "Laddar",
"cancel": "Avbryt",
"install": "Installera",
"update": "Uppdatera"
},
"install-form": {
"title": "Install {name}",
"expose-app": "Expose app",
"domain-name": "Domain name",
"domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
"choose-option": "Choose an option...",
"sumbit-install": "Install",
"submit-update": "Update",
"title": "Installera {name}",
"expose-app": "Exponera app",
"domain-name": "Domännamn",
"domain-name-hint": "Se till att denna exakta domän innehåller en A-rekord som pekar mot din IP.",
"choose-option": "Välj ett alternativ...",
"sumbit-install": "Installera",
"submit-update": "Uppdatera",
"errors": {
"required": "{label} is required",
"regex": "{label} must match the pattern {pattern}",
"max-length": "{label} must be less than {max} characters",
"min-length": "{label} must be at least {min} characters",
"between-length": "{label} must be between {min} and {max} characters",
"invalid-email": "{label} must be a valid email address",
"number": "{label} must be a number",
"fqdn": "{label} must be a valid domain",
"ip": "{label} must be a valid IP address",
"fqdnip": "{label} must be a valid domain or IP address",
"url": "{label} must be a valid URL"
"required": "{label} krävs",
"regex": "{label} måste matcha mönstret {pattern}",
"max-length": "{label} måste vara mindre än {max} tecken",
"min-length": "{label} måste vara minst {min} tecken",
"between-length": "{label} måste vara mellan {min} och {max} tecken",
"invalid-email": "{label} måste vara en giltig e-postadress",
"number": "{label} måste vara ett nummer",
"fqdn": "{label} måste vara en giltig domän",
"ip": "{label} måste vara en giltig IP-adress",
"fqdnip": "{label} måste vara en giltig domän eller IP-adress",
"url": "{label} måste vara en giltig URL"
}
},
"stop-form": {
"title": "Stop {name} ?",
"subtitle": "All data will be retained",
"submit": "Stop"
"title": "Stoppa {name}?",
"subtitle": "All data sparas",
"submit": "Stoppa"
},
"uninstall-form": {
"title": "Uninstall {name} ?",
"subtitle": "All data for this app will be lost.",
"warning": "Are you sure? This action cannot be undone.",
"submit": "Uninstall"
"title": "Avinstallera {name}?",
"subtitle": "Alla data för denna app kommer att försvinna.",
"warning": "Är du säker? Den här åtgärden kan inte ångras.",
"submit": "Avinstallera"
},
"update-form": {
"title": "Update {name} ?",
"subtitle1": "Update app to latest verion :",
"subtitle2": "This will reset your custom configuration (e.g. changes in docker-compose.yml)",
"submit": "Update"
"title": "Uppdatera {name}?",
"subtitle1": "Uppdatera appen till senaste version :",
"subtitle2": "Detta kommer att återställa din anpassade konfiguration (t.ex. ändringar i docker-compose.yml)",
"submit": "Uppdatera"
},
"update-settings-form": {
"title": "Update {name} config"
"title": "Uppdatera {name} konfiguration"
}
}
},
"settings": {
"title": "Settings",
"title": "Inställningar",
"actions": {
"tab-title": "Actions",
"title": "Actions",
"current-version": "Current version: {version}",
"stay-up-to-date": "Stay up to date with the latest version of Tipi",
"new-version": "A new version ({version}) of Tipi is available",
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
"tab-title": "Handlingar",
"title": "Handlingar",
"current-version": "Nuvarande version: {version}",
"stay-up-to-date": "Håll dig uppdaterad med den senaste versionen av Tipi",
"new-version": "En ny version ({version}) av Tipi är tillgänglig",
"maintenance-title": "Underhåll",
"maintenance-subtitle": "Vanliga åtgärder att utföra på din instans",
"restart": "Starta om",
"update": "Uppdatera till {version}",
"already-latest": "Redan uppdaterad"
},
"settings": {
"tab-title": "Settings",
"title": "General settings",
"subtitle": "This will update your settings.json file. Make sure you know what you are doing before updating these values.",
"settings-updated": "Settings updated. Restart your instance to apply new settings.",
"invalid-ip": "Invalid IP address",
"invalid-url": "Invalid URL",
"invalid-domain": "Invalid domain",
"domain-name": "Domain name",
"domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.",
"tab-title": "Inställningar",
"title": "Allmänna inställningar",
"subtitle": "Detta kommer att uppdatera din settings.json fil. Se till att du vet vad du gör innan du uppdaterar dessa värden.",
"settings-updated": "Inställningar uppdaterade. Starta om din instans för att tillämpa nya inställningar.",
"invalid-ip": "Ogiltig IP-adress",
"invalid-url": "Ogiltig URL",
"invalid-domain": "Ogiltig domän",
"domain-name": "Domännamn",
"domain-name-hint": "Se till att denna exakta domän innehåller en A-rekord som pekar mot din IP.",
"dns-ip": "DNS IP",
"internal-ip": "Internal IP",
"internal-ip-hint": "IP address your server is listening on.",
"apps-repo": "Apps repo URL",
"apps-repo-hint": "URL to the apps repository.",
"storage-path": "Storage path",
"storage-path-hint": "Path to the storage directory. Keep empty for default (runtipi/app-data). Make sure it is an absolute path and that it exists",
"submit": "Save",
"user-settings-title": "User settings",
"language": "Language",
"help-translate": "Help translate Tipi"
"internal-ip": "Intern IP",
"internal-ip-hint": "IP-adressen som din server lyssnar på.",
"apps-repo": "Appar repo URL",
"apps-repo-hint": "URL till app-arkivet.",
"storage-path": "Lagring sökväg",
"storage-path-hint": "Sökväg till lagringskatalogen. Behåll tomt för standard (runtipi/app-data). Kontrollera att den är en absolut sökväg och att den finns",
"submit": "Spara",
"user-settings-title": "Användarinställningar",
"language": "Språk",
"help-translate": "Hjälp till att översätta Tipi"
},
"security": {
"tab-title": "Security",
"change-password-title": "Change password",
"change-password-subtitle": "Changing your password will log you out of all devices.",
"password-change-success": "Password changed successfully",
"2fa-title": "Two-factor authentication",
"2fa-subtitle": "Two-factor authentication (2FA) adds an additional layer of security to your account.",
"2fa-subtitle-2": "When enabled, you will be prompted to enter a code from your authenticator app when you log in.",
"2fa-enable-success": "Two-factor authentication enabled",
"2fa-disable-success": "Two-factor authentication disabled",
"scan-qr-code": "Scan this QR code with your authenticator app.",
"enter-key-manually": "Or enter this key manually.",
"enter-2fa-code": "Enter the 6-digit code from your authenticator app",
"enable-2fa": "Enable two-factor authentication",
"disable-2fa": "Disable two-factor authentication",
"password-needed": "Password needed",
"password-needed-hint": "Your password is required to change two-factor authentication settings.",
"tab-title": "Säkerhet",
"change-password-title": "Ändra lösenord",
"change-password-subtitle": "Om du ändrar ditt lösenord loggar du ut från alla enheter.",
"password-change-success": "Lösenordet har ändrats",
"2fa-title": "Tvåfaktorsautentisering",
"2fa-subtitle": "Tvåfaktorsautentisering (2FA) lägger till ytterligare ett säkerhetslager till ditt konto.",
"2fa-subtitle-2": "När den är aktiverad kommer du att uppmanas att ange en kod från din autentiseringsapp när du loggar in.",
"2fa-enable-success": "Tvåfaktorsautentisering aktiverad",
"2fa-disable-success": "Tvåfaktorsautentisering inaktiverad",
"scan-qr-code": "Skanna den här QR-koden med din autentiseringsapp.",
"enter-key-manually": "Eller ange denna nyckel manuellt.",
"enter-2fa-code": "Ange den 6-siffriga koden från din autentiseringsapp",
"enable-2fa": "Aktivera tvåfaktorsautentisering",
"disable-2fa": "Inaktivera tvåfaktorsautentisering",
"password-needed": "Lösenord krävs",
"password-needed-hint": "Ditt lösenord krävs för att ändra tvåfaktorsautentiseringsinställningar.",
"form": {
"password-length": "Password must be at least 8 characters",
"password-match": "Passwords do not match",
"current-password": "Current password",
"new-password": "New password",
"confirm-password": "Confirm new password",
"change-password": "Change password",
"password": "Password"
"password-length": "Lösenordet måste vara minst 8 tecken",
"password-match": "Lösenorden matchar inte",
"current-password": "Nuvarande lösenord",
"new-password": "Nytt lösenord",
"confirm-password": "Bekräfta nytt lösenord",
"change-password": "Byt lösenord",
"password": "Lösenord"
}
}
},
"header": {
"dashboard": "Dashboard",
"my-apps": "My Apps",
"dashboard": "Kontrollpanel",
"my-apps": "Mina appar",
"app-store": "App Store",
"settings": "Settings",
"logout": "Logout",
"dark-mode": "Dark Mode",
"light-mode": "Light Mode",
"settings": "Inställningar",
"logout": "Logga ut",
"dark-mode": "Mörkt läge",
"light-mode": "Ljusläge",
"sponsor": "Sponsor",
"source-code": "Source code",
"update-available": "Update available"
"source-code": "Källkod",
"update-available": "Ny version tillgänglig"
}
}

View file

@ -5,7 +5,7 @@ import type { FormField } from '../../../../core/types';
export const validateField = (field: FormField, value: string | undefined | boolean): string | undefined => {
const { translator } = useUIStore.getState();
if (field.required && !value) {
if (field.required && !value && typeof value !== 'boolean') {
return translator('apps.app-details.install-form.errors.required', { label: field.label });
}

View file

@ -3,6 +3,7 @@ const APP_LOCALES = {
'fr-FR': 'Français',
'ja-JP': '日本語',
'pl-PL': 'Polski',
'sv-SE': 'Svenska',
'ro-RO': 'Română',
'ru-RU': 'Русский',
'zh-CN': '简体中文',
@ -17,6 +18,7 @@ const FALLBACK_LOCALES = [
{ from: 'ru', to: 'ru-RU' },
{ from: 'zh', to: 'zh-CN' },
{ from: 'pl', to: 'pl-PL' },
{ from: 'sv', to: 'sv-SE' },
];
export type Locale = keyof typeof APP_LOCALES;