diff --git a/.env.example b/.env.example
index c3ed2a91b..9b5bcd444 100755
--- a/.env.example
+++ b/.env.example
@@ -47,3 +47,80 @@ PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+# Single sign-on (social login). Set to "true" to show the configured buttons on
+# the login page. Individual providers appear only when their CLIENT_ID is set.
+ENABLE_SOCIAL_LOGIN=false
+
+# Generic OpenID Connect SSO. Works against any OIDC issuer via discovery
+# ({OIDC_ISSUER}/.well-known/openid-configuration): Zitadel, Keycloak, Authentik,
+# Entra, Auth0, Okta, Google, etc. The id_token is fully validated (signature via
+# the issuer's JWKS with automatic key-rotation, iss, aud/azp, exp, nonce, at_hash)
+# and PKCE is used. New users are provisioned from a provider-verified email.
+# The callback is derived per request from the host being served, so one instance works
+# across every apex/domain it answers on — register each apex's callback with the IdP:
+# {each-apex}/social-auth/openidconnect/callback and {each-apex}/social-auth/logout/callback
+# Set OIDC_REDIRECT_URI below to pin a single redirect instead of deriving it.
+OIDC_ISSUER=
+OIDC_CLIENT_ID=
+OIDC_CLIENT_SECRET=
+
+# Shown on the sign-in button, as "Sign in with {OIDC_DISPLAY_NAME}".
+OIDC_DISPLAY_NAME="OpenID Connect"
+
+# Icon on that button: any Bootstrap Icons class, e.g. bi-key or bi-building.
+# Set it empty for a button with no icon at all.
+# OIDC_ICON=bi-shield-lock
+
+# Connection overrides:
+# OIDC_SCOPES="openid profile email"
+# OIDC_REDIRECT_URI= # pin one redirect instead of deriving it per host
+# OIDC_POST_LOGOUT_REDIRECT_URI= # where the IdP returns after ending its session
+
+# Claim mapping. Providers disagree over which claim carries which field, so each takes a
+# comma-separated list and the first claim actually released wins. The defaults are the
+# standard OIDC claims; override only for a provider that differs.
+# OIDC_EMAIL_CLAIM=email
+# OIDC_USERNAME_CLAIM=preferred_username,nickname
+# OIDC_NAME_CLAIM=name
+# OIDC_PICTURE_CLAIM=picture
+# OIDC_GROUPS_CLAIM=groups
+
+# Provisioning. Defaults match how social login behaved before: an unknown user is created,
+# a known email is adopted, and an address the IdP flags unverified is refused.
+# OIDC_AUTO_REGISTER=true # false: only users who already exist may sign in
+# OIDC_LINK_EXISTING_USER=true # false: refuse rather than adopt a matching local account
+# OIDC_REQUIRE_VERIFIED_EMAIL=true # reject sign-in when the IdP flags email unverified
+# OIDC_REQUIRE_EMAIL=false # fail the login when no email is released at all
+# OIDC_UPDATE_PROFILE_ON_LOGIN=false # true: the provider's name/picture overwrite local edits
+
+# Authorization. Empty places no restriction; naming a list makes it the allow-list, and it
+# is re-checked on every sign-in so access can be withdrawn at the provider.
+# OIDC_ALLOWED_GROUPS= # e.g. linkstack-users,staff
+# OIDC_ALLOWED_DOMAINS= # e.g. example.com,example.org
+# OIDC_ADMIN_GROUP= # members get the admin role; unset leaves roles alone
+
+# Sign-in flow:
+# OIDC_AUTO_LAUNCH=false # true: /login goes straight to the provider.
+# # /login?local=1 still reaches the form
+# OIDC_IDP_LOGOUT=false # true: signing out also ends the session at the
+# # provider, and so in every other application using it
+
+# Host header allow-list. Empty trusts the APP_URL domain and its subdomains, which is
+# right for a single-domain instance. Serving several apexes from one instance requires
+# listing them here — the OIDC callback is derived from the incoming host, so an
+# unlisted host is rejected rather than trusted.
+# ALLOWED_HOSTS=bio.example.com,bio.example.org
+ALLOWED_HOSTS=
+
+# Who may embed this instance in a frame, written into the CSP frame-ancestors directive.
+# Empty sends no directive and embedding is unrestricted. Entries are origins, since
+# frame-ancestors matches on origin and ignores any path; 'self' is always included.
+# ALLOWED_FRAME_ORIGINS=https://apps.example.com
+ALLOWED_FRAME_ORIGINS=
+
+# Session cookie SameSite policy. Embedding this instance in a frame on another site
+# needs "none" (which also requires a secure cookie), otherwise the browser withholds
+# the session and the framed page renders logged out. Leave as lax unless embedding.
+# SESSION_SAME_SITE=lax | none | strict
+SESSION_SAME_SITE=lax
diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php
index 49e971e74..30d383ba1 100755
--- a/app/Http/Controllers/Auth/AuthenticatedSessionController.php
+++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php
@@ -32,6 +32,15 @@ public function create(Request $request)
return redirect('/update?finishing');
}
+ // Straight to the provider when this instance signs in only through it, so no one is
+ // shown a form nobody uses. ?local=1 still reaches the form, so local accounts — and
+ // an instance whose provider is down — always keep a way in.
+ if (! $request->has('local')
+ && config('services.openidconnect.auto_launch')
+ && ! empty(config('services.openidconnect.client_id'))) {
+ return redirect()->route('social.redirect', 'openidconnect');
+ }
+
return view('auth.login');
}
@@ -129,6 +138,21 @@ private function getStoredSecurityKey(): ?array
*/
public function destroy(Request $request)
{
+ $oidc = $request->session()->get('oidc_logout');
+
+ // OIDC session: RP-initiated logout. Hand off to the IdP's end_session_endpoint
+ // (logout() mints a state and keeps the session for it); the local logout is
+ // completed in the post-logout callback after that state is validated. Local and
+ // non-OIDC social sessions fall straight through to the plain logout below.
+ if (is_array($oidc) && ! empty($oidc['provider'])) {
+ try {
+ return \Socialite::driver($oidc['provider'])
+ ->logout($oidc['id_token'] ?? null, route('social.logout.callback'));
+ } catch (\Throwable $e) {
+ // IdP advertises no end_session_endpoint (or driver gone) — logout locally.
+ }
+ }
+
Auth::guard('web')->logout();
$request->session()->invalidate();
diff --git a/app/Http/Controllers/Auth/SocialLoginController.php b/app/Http/Controllers/Auth/SocialLoginController.php
index aff1d7111..62d81e0f0 100644
--- a/app/Http/Controllers/Auth/SocialLoginController.php
+++ b/app/Http/Controllers/Auth/SocialLoginController.php
@@ -3,64 +3,406 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
-use Illuminate\Http\Request;
-use App\Models\User;
use App\Models\SocialAccount;
+use App\Models\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Str;
class SocialLoginController extends Controller
{
public function redirectToProvider(String $provider)
{
- return \Socialite::driver($provider)->redirect();
+ return \Socialite::driver($provider)
+ ->redirectUrl($this->callbackUrl($provider))
+ ->redirect();
}
public function providerCallback(String $provider)
{
try {
- $social_user = \Socialite::driver($provider)->user();
+ // Same redirect_uri as the outbound leg — OAuth requires the value at token
+ // exchange to match the one sent at authorization.
+ $social_user = \Socialite::driver($provider)
+ ->redirectUrl($this->callbackUrl($provider))
+ ->user();
- // First Find Social Account
+ // Restrictions are re-applied on every sign-in rather than only at provisioning,
+ // so removing someone from a group upstream ends their access here too.
+ if ($denied = $this->authorizationError($provider, $social_user)) {
+ return redirect()->route('login')->withErrors($denied);
+ }
+
+ $profile = $this->profile($provider, $social_user);
+
+ // 1) Primary identity match is the immutable provider subject id (OIDC `sub`),
+ // never the email — an email can be reassigned upstream and must not be a
+ // login key on its own.
$account = SocialAccount::where([
'provider_name' => $provider,
- 'provider_id' => $social_user->getId()
+ 'provider_id' => $social_user->getId(),
])->first();
- // If Social Account Exist then Find User and Login
if ($account) {
+ $this->syncProfile($account->user, $provider, $profile);
+ $this->applyAdminGroup($account->user, $provider, $profile);
auth()->login($account->user);
+ $this->rememberSsoSession($provider, $social_user);
+
return redirect('/studio/index');
}
- // Find User
- $user = User::where([
- 'email' => $social_user->getEmail()
- ])->first();
+ // Beyond this point we fall back to the email to bridge/provision an account,
+ // so an email is required and — to avoid account takeover via an unverified,
+ // attacker-controlled address — it must be verified by the provider.
+ $email = $social_user->getEmail();
+
+ if (empty($email)) {
+ return redirect()->route('login')->withErrors(
+ __('messages.Your identity provider did not release an email address.')
+ );
+ }
+
+ if ($this->flag($provider, 'require_verified_email', true) && $this->emailIsUnverified($social_user)) {
+ return redirect()->route('login')->withErrors(
+ __('messages.Your email address is not verified with the identity provider.')
+ );
+ }
+
+ // 2) Bridge to an existing local user by (verified) email, else 3) provision a
+ // new user mirroring the shape of a locally-registered account (role, block,
+ // a hashed random password, a valid unique slug). The two are separately
+ // refusable, so an instance can permit one without the other.
+ $user = User::where('email', $email)->first();
+
+ if ($user && ! $this->flag($provider, 'link_existing_user', true)) {
+ return redirect()->route('login')->withErrors(
+ __('messages.An account with this email address already exists.')
+ );
+ }
+
+ if (! $user) {
+ if (! $this->flag($provider, 'auto_register', true)) {
+ return redirect()->route('login')->withErrors(
+ __('messages.This instance does not create accounts from single sign-on.')
+ );
+ }
- // If User not found, then create new user
- if (!$user) {
$user = User::create([
- 'email' => $social_user->getEmail(),
- 'name' => $social_user->getName(),
- 'image' => $social_user->getAvatar(),
- 'littlelink_name' => $social_user->getNickname(),
+ 'name' => $profile['name'] ?: Str::before($email, '@'),
+ 'email' => $email,
+ 'image' => $profile['avatar'],
+ 'littlelink_name' => $this->uniqueLittlelinkName(
+ $profile['username'] ?: Str::before($email, '@')
+ ),
+ 'password' => Hash::make(Str::random(64)),
'email_verified_at' => now(),
]);
+
+ $user->role = 'user';
+ $user->block = env('MANUAL_USER_VERIFICATION') == true ? 'yes' : 'no';
+ $user->save();
}
- // Create Social Accounts
+ $this->applyAdminGroup($user, $provider, $profile);
+
+ // Link the social identity so subsequent logins match on the immutable sub.
$user->socialAccounts()->create([
- 'provider_id' => $social_user->getId(),
- 'provider_name' => $provider
+ 'provider_id' => $social_user->getId(),
+ 'provider_name' => $provider,
]);
- // Login
auth()->login($user);
+ $this->rememberSsoSession($provider, $social_user);
+
return redirect('/studio/index');
- } catch (\Exception $e) {
+ } catch (\Throwable $e) {
return redirect()->route('login')->withErrors($e->getMessage());
}
}
-}
+ /**
+ * OAuth callback URL for a provider.
+ *
+ * A redirect the operator configured for the provider wins — that stays proxy-immune
+ * and honours non-standard callback paths, so no existing setup regresses. Otherwise
+ * the URL is derived from the current request host, so one instance serves every
+ * apex/domain it answers on with no per-domain configuration (each apex's callback
+ * must be registered with the provider; the derive path expects TrustProxies to be
+ * set when running behind a reverse proxy). Resolved per request, so config:cache-safe.
+ */
+ protected function callbackUrl(string $provider): string
+ {
+ $configured = config('services.'.$provider.'.redirect');
+
+ if (! empty($configured) && $configured !== 'http://example.com/callback-url') {
+ return $configured;
+ }
+
+ return url('/social-auth/'.$provider.'/callback');
+ }
+
+ /**
+ * Post-logout landing for RP-initiated logout. The IdP redirects here after ending its
+ * session; validate the state logout() minted (consumed on first use, so replays fail),
+ * then complete the local logout. Fails closed if the state can't be validated.
+ */
+ public function logoutCallback(Request $request)
+ {
+ $oidc = $request->session()->get('oidc_logout');
+ $provider = is_array($oidc) && ! empty($oidc['provider']) ? $oidc['provider'] : 'openidconnect';
+
+ try {
+ if (! \Socialite::driver($provider)->validateLogoutState($request)) {
+ abort(403);
+ }
+ } catch (\Throwable $e) {
+ abort(403);
+ }
+
+ auth()->guard('web')->logout();
+ $request->session()->invalidate();
+ $request->session()->regenerateToken();
+
+ return redirect('/');
+ }
+
+ /**
+ * Whether the provider is an OpenID Connect connection. The controls below are specific
+ * to it — the built-in providers have a fixed profile shape and release no claims.
+ */
+ protected function isOidc(string $provider): bool
+ {
+ return Str::startsWith($provider, ['oidc', 'openidconnect']);
+ }
+
+ /**
+ * A boolean control from the provider's services entry.
+ */
+ protected function flag(string $provider, string $key, bool $default): bool
+ {
+ if (! $this->isOidc($provider)) {
+ return $default;
+ }
+
+ return filter_var(config('services.'.$provider.'.'.$key, $default), FILTER_VALIDATE_BOOLEAN);
+ }
+
+ /**
+ * A configured list, in the order entries should be tried. Written as a comma-separated
+ * string or an array; both are accepted because a .env can only express the former.
+ */
+ protected function listConfig(string $provider, string $key, string $default): array
+ {
+ $configured = config('services.'.$provider.'.'.$key, $default);
+ $configured = is_array($configured) ? $configured : explode(',', (string) $configured);
+ return array_values(array_filter(array_map('trim', $configured), static fn ($v) => $v !== ''));
+ }
+ /**
+ * First claim in $names that the provider actually released.
+ */
+ protected function claim(array $raw, array $names): ?string
+ {
+ foreach ($names as $name) {
+ $value = $raw[$name] ?? null;
+
+ if (is_scalar($value) && (string) $value !== '') {
+ return (string) $value;
+ }
+ }
+
+ return null;
+ }
+
+ protected function rawClaims($social_user): array
+ {
+ return method_exists($social_user, 'getRaw') ? (array) $social_user->getRaw() : [];
+ }
+
+ /**
+ * Profile fields for a social user.
+ *
+ * Socialite's accessors suit the built-in providers, whose profile shape is fixed.
+ * OpenID Connect's is not: providers disagree over which claim carries a username, a
+ * display name is sometimes only given_name/family_name, and the driver maps neither
+ * preferred_username nor picture at all. So for OIDC every field is read from a
+ * configurable list of claims, the first one present winning. The defaults are the
+ * standard OIDC claims, which is what most providers release.
+ */
+ protected function profile(string $provider, $social_user): array
+ {
+ if (! $this->isOidc($provider)) {
+ return [
+ 'name' => $social_user->getName(),
+ 'username' => $social_user->getNickname(),
+ 'avatar' => $social_user->getAvatar(),
+ 'groups' => [],
+ ];
+ }
+
+ $raw = $this->rawClaims($social_user);
+ $name = $this->claim($raw, $this->listConfig($provider, 'name_claim', 'name'));
+
+ if (empty($name)) {
+ // No display-name claim: compose one from the standard name parts.
+ $name = trim(($raw['given_name'] ?? '').' '.($raw['family_name'] ?? '')) ?: null;
+ }
+
+ return [
+ 'name' => $name ?: $social_user->getName(),
+ 'username' => $this->claim($raw, $this->listConfig($provider, 'username_claim', 'preferred_username,nickname'))
+ ?: $social_user->getNickname(),
+ 'avatar' => $this->claim($raw, $this->listConfig($provider, 'picture_claim', 'picture'))
+ ?: $social_user->getAvatar(),
+ 'groups' => $this->groups($provider, $raw),
+ ];
+ }
+
+ /**
+ * Group memberships from whichever claim carries them. A list and a comma-separated
+ * string are both accepted, since providers send both shapes.
+ */
+ protected function groups(string $provider, array $raw): array
+ {
+ foreach ($this->listConfig($provider, 'groups_claim', 'groups') as $name) {
+ $value = $raw[$name] ?? null;
+
+ if (is_array($value)) {
+ return array_values(array_map('strval', array_filter($value, 'is_scalar')));
+ }
+
+ if (is_scalar($value) && (string) $value !== '') {
+ return array_values(array_filter(array_map('trim', explode(',', (string) $value)), static fn ($v) => $v !== ''));
+ }
+ }
+
+ return [];
+ }
+
+ /**
+ * Who may sign in. Both lists are empty by default, which is no restriction at all;
+ * naming either one turns it into the allow-list for this instance.
+ */
+ protected function authorizationError(string $provider, $social_user): ?string
+ {
+ if (! $this->isOidc($provider)) {
+ return null;
+ }
+
+ $refused = __('messages.Your account is not permitted to sign in to this instance.');
+
+ if ($domains = $this->listConfig($provider, 'allowed_domains', '')) {
+ $email = (string) $social_user->getEmail();
+ $domain = Str::lower(Str::after($email, '@'));
+
+ if ($email === '' || ! in_array($domain, array_map('strtolower', $domains), true)) {
+ return $refused;
+ }
+ }
+
+ if ($allowed = $this->listConfig($provider, 'allowed_groups', '')) {
+ if (! array_intersect($allowed, $this->groups($provider, $this->rawClaims($social_user)))) {
+ return $refused;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Mirror the instance's admin role onto an identity-provider group when one is named.
+ * Unset — the default — the role stays entirely the instance's own business. Membership
+ * is re-read on every sign-in so a grant can be withdrawn upstream, with the first
+ * account exempt so an instance can never be locked out of its own admin panel.
+ */
+ protected function applyAdminGroup(User $user, string $provider, array $profile): void
+ {
+ $group = (string) config('services.'.$provider.'.admin_group', '');
+
+ if (! $this->isOidc($provider) || $group === '' || (int) $user->id === 1) {
+ return;
+ }
+
+ $role = in_array($group, $profile['groups'], true) ? 'admin' : 'user';
+
+ if ($user->role !== $role) {
+ $user->role = $role;
+ $user->save();
+ }
+ }
+
+ /**
+ * Refresh the stored profile from the provider on each sign-in. Off by default, so
+ * whatever a user edited locally stands; on, the provider is authoritative.
+ */
+ protected function syncProfile(User $user, string $provider, array $profile): void
+ {
+ if (! $this->flag($provider, 'update_profile_on_login', false)) {
+ return;
+ }
+
+ if (! empty($profile['name'])) {
+ $user->name = $profile['name'];
+ }
+
+ if (! empty($profile['avatar'])) {
+ $user->image = $profile['avatar'];
+ }
+
+ if ($user->isDirty()) {
+ $user->save();
+ }
+ }
+
+ /**
+ * True only when the provider explicitly asserts the email is NOT verified. A missing
+ * claim is treated as verified so providers that never send `email_verified` still work.
+ */
+ protected function emailIsUnverified($social_user): bool
+ {
+ $claims = $this->rawClaims($social_user);
+
+ if (! array_key_exists('email_verified', $claims)) {
+ return false;
+ }
+
+ return ! filter_var($claims['email_verified'], FILTER_VALIDATE_BOOLEAN);
+ }
+
+ /**
+ * Derive a slug that satisfies the same rules registration enforces
+ * (max 50, unique, /^[\p{L}0-9-_]+$/u), disambiguating on collision.
+ */
+ protected function uniqueLittlelinkName(string $seed): string
+ {
+ $base = preg_replace('/[^\p{L}0-9\-_]/u', '', $seed);
+ $base = $base !== '' ? mb_substr($base, 0, 50) : 'user';
+
+ $name = $base;
+ $suffix = 1;
+
+ while (User::where('littlelink_name', $name)->exists()) {
+ $tail = '-'.$suffix++;
+ $name = mb_substr($base, 0, 50 - mb_strlen($tail)).$tail;
+ }
+
+ return $name;
+ }
+
+ /**
+ * Stash the OIDC id_token so logout can perform an RP-initiated end-session round-trip.
+ */
+ protected function rememberSsoSession(string $provider, $social_user): void
+ {
+ if (! $this->isOidc($provider) || ! $this->flag($provider, 'idp_logout', true)) {
+ return;
+ }
+
+ session()->put('oidc_logout', [
+ 'provider' => $provider,
+ 'id_token' => $social_user->accessTokenResponseBody['id_token'] ?? null,
+ ]);
+ }
+}
diff --git a/app/Http/Middleware/Headers.php b/app/Http/Middleware/Headers.php
index 7662a93ac..a19e85631 100644
--- a/app/Http/Middleware/Headers.php
+++ b/app/Http/Middleware/Headers.php
@@ -9,14 +9,32 @@ class Headers
{
public function handle(Request $request, Closure $next)
{
+ $csp = [];
+
// Check if FORCE_HTTPS is set to true
- if (env('FORCE_HTTPS') == 'true') {
+ if (config('app.force_https')) {
\URL::forceScheme('https'); // Force HTTPS
- header("Content-Security-Policy: upgrade-insecure-requests");
+ $csp[] = 'upgrade-insecure-requests';
+ }
+
+ // Who may embed this instance in a frame, written into frame-ancestors. Empty
+ // sends no directive and embedding stays unrestricted, which is the long-standing
+ // behaviour; naming anyone opts in, with 'self' always kept so an instance never
+ // locks out its own pages. Read through config so a cached config keeps working.
+ // Note embedding across sites also needs SESSION_SAME_SITE=none, or the browser
+ // withholds the session cookie inside the frame and the page renders logged out.
+ $frameAncestors = (array) config('app.allowed_frame_origins', []);
+
+ if (! empty($frameAncestors)) {
+ $csp[] = "frame-ancestors 'self' ".implode(' ', $frameAncestors);
+ }
+
+ if (! empty($csp)) {
+ header('Content-Security-Policy: '.implode('; ', $csp));
}
// Check if FORCE_ROUTE_HTTPS is set to true
- if (env('FORCE_ROUTE_HTTPS') == 'true' && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off')) {
+ if (config('app.force_route_https') && (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off')) {
$redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header("Location: $redirect_url");
exit();
diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php
index b0550cfc7..9ee7c0c65 100755
--- a/app/Http/Middleware/TrustHosts.php
+++ b/app/Http/Middleware/TrustHosts.php
@@ -9,12 +9,34 @@ class TrustHosts extends Middleware
/**
* Get the host patterns that should be trusted.
*
+ * One instance may serve several apexes, and the OIDC redirect is derived from the
+ * incoming host so each visitor returns to the domain they arrived on. That derivation
+ * is only safe while the host itself is trusted — an unchecked Host header would let a
+ * forged request aim the authorization redirect at somebody else's domain.
+ *
+ * Configured by ALLOWED_HOSTS, read through config so a cached config keeps working.
+ * Left unset the behaviour is unchanged: the application URL's domain and subdomains,
+ * which is what a single-domain instance wants.
+ *
* @return array
*/
public function hosts()
{
- return [
- $this->allSubdomainsOfApplicationUrl(),
- ];
+ $configured = (array) config('app.allowed_hosts', []);
+
+ if (empty($configured)) {
+ return [
+ $this->allSubdomainsOfApplicationUrl(),
+ ];
+ }
+
+ return array_map(static function (string $host): string {
+ // Already a pattern — Symfony matches these as regex, so pass it through.
+ if (str_starts_with($host, '^') || str_ends_with($host, '$')) {
+ return $host;
+ }
+
+ return '^'.preg_quote($host, '#').'$';
+ }, $configured);
}
}
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index a9f10a631..e28fee278 100755
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -18,6 +18,14 @@ class EventServiceProvider extends ServiceProvider
Registered::class => [
SendEmailVerificationNotification::class,
],
+
+ // SocialiteProviders packages register their driver by listening for this event;
+ // without the mapping Socialite has no "openidconnect" driver and every SSO
+ // request fails with "Driver [openidconnect] not supported", however complete the
+ // configuration is. Installing the package alone is not enough.
+ \SocialiteProviders\Manager\SocialiteWasCalled::class => [
+ \SocialiteProviders\OpenIDConnect\OpenIDConnectExtendSocialite::class.'@handle',
+ ],
];
/**
diff --git a/composer.json b/composer.json
index 88bc8c8f0..6875e9517 100644
--- a/composer.json
+++ b/composer.json
@@ -14,6 +14,7 @@
"livewire/livewire": "^3.5",
"rappasoft/laravel-livewire-tables": "^3.0",
"simplesoftwareio/simple-qrcode": "~4",
+ "socialiteproviders/openidconnect": "^1.0",
"spatie/laravel-backup": "^9.1",
"symfony/yaml": "^6.0|^7.0"
},
diff --git a/composer.lock b/composer.lock
index d65ebfc72..77b86b980 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "2e2650a54d80624a1e15999354099494",
+ "content-hash": "c0b90cac435aa7942faa747fa016dd16",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -4387,6 +4387,142 @@
},
"time": "2021-02-08T20:43:55+00:00"
},
+ {
+ "name": "socialiteproviders/manager",
+ "version": "4.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/SocialiteProviders/Manager.git",
+ "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/35372dc62787e61e91cfec73f45fd5d5ae0f8891",
+ "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": "^11.0 || ^12.0 || ^13.0",
+ "laravel/socialite": "^5.5",
+ "php": "^8.2"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.2",
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "SocialiteProviders\\Manager\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SocialiteProviders\\Manager\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andy Wendt",
+ "email": "andy@awendt.com"
+ },
+ {
+ "name": "Anton Komarev",
+ "email": "a.komarev@cybercog.su"
+ },
+ {
+ "name": "Miguel Piedrafita",
+ "email": "soy@miguelpiedrafita.com"
+ },
+ {
+ "name": "atymic",
+ "email": "atymicq@gmail.com",
+ "homepage": "https://atymic.dev"
+ }
+ ],
+ "description": "Easily add new or override built-in providers in Laravel Socialite.",
+ "homepage": "https://socialiteproviders.com",
+ "keywords": [
+ "laravel",
+ "manager",
+ "oauth",
+ "providers",
+ "socialite"
+ ],
+ "support": {
+ "issues": "https://github.com/socialiteproviders/manager/issues",
+ "source": "https://github.com/socialiteproviders/manager"
+ },
+ "time": "2026-03-18T22:13:24+00:00"
+ },
+ {
+ "name": "socialiteproviders/openidconnect",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/SocialiteProviders/OpenIDConnect.git",
+ "reference": "3a4946bd620cea34738e7495fab3f0080227506f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/SocialiteProviders/OpenIDConnect/zipball/3a4946bd620cea34738e7495fab3f0080227506f",
+ "reference": "3a4946bd620cea34738e7495fab3f0080227506f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-openssl": "*",
+ "firebase/php-jwt": "^7.0",
+ "illuminate/http": "^11.0 | ^12.0 | ^13.0",
+ "illuminate/support": "^11.0 | ^12.0 | ^13.0",
+ "php": "^8.2",
+ "socialiteproviders/manager": "^4.4"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "SocialiteProviders\\OpenIDConnect\\OpenIDConnectServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SocialiteProviders\\OpenIDConnect\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "adrum"
+ }
+ ],
+ "description": "Generic OpenID Connect Provider for Laravel Socialite",
+ "keywords": [
+ "OpenId",
+ "laravel",
+ "oauth",
+ "oidc",
+ "openid-connect",
+ "provider",
+ "socialite"
+ ],
+ "support": {
+ "docs": "https://socialiteproviders.com/openidconnect",
+ "issues": "https://github.com/socialiteproviders/providers/issues",
+ "source": "https://github.com/socialiteproviders/providers"
+ },
+ "time": "2026-08-16T01:21:38+00:00"
+ },
{
"name": "spatie/db-dumper",
"version": "3.8.3",
@@ -10641,12 +10777,12 @@
],
"aliases": [],
"minimum-stability": "dev",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^8.2"
},
- "platform-dev": [],
- "plugin-api-version": "2.6.0"
+ "platform-dev": {},
+ "plugin-api-version": "2.9.0"
}
diff --git a/config/app.php b/config/app.php
index 90f1330e7..d244cca47 100755
--- a/config/app.php
+++ b/config/app.php
@@ -172,7 +172,13 @@
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
- Laravel\Socialite\SocialiteServiceProvider::class,
+ // Socialite is bound by SocialiteProviders\Manager\ServiceProvider instead, which
+ // extends this one and adds the extendSocialite hook that community drivers
+ // register through. Listing Laravel's provider here binds the plain factory first,
+ // and every added driver then fails with "Driver [...] not supported" — built-in
+ // providers (Google, Facebook, Twitter, GitHub) are unaffected either way, since
+ // the replacement is a superset. Registered automatically via package discovery.
+ // Laravel\Socialite\SocialiteServiceProvider::class,
App\Providers\LivewireServiceProvider::class,
@@ -247,4 +253,43 @@
],
+ /*
+ |--------------------------------------------------------------------------
+ | Trusted Hosts & Frame Embedding
+ |--------------------------------------------------------------------------
+ |
+ | ALLOWED_HOSTS is the Host header allow-list. Left empty the application URL's
+ | domain and its subdomains are trusted, which is right for a single-domain
+ | instance; name hosts here when one instance answers on several apexes, since
+ | the OIDC redirect is derived from the incoming host and must not be forgeable.
+ |
+ | ALLOWED_FRAME_ORIGINS lists who may embed this instance, written into the CSP
+ | frame-ancestors directive. Empty sends no directive and embedding stays
+ | unrestricted, matching long-standing behaviour. Entries are origins
+ | (https://apps.example.com) because frame-ancestors matches on origin and
+ | ignores any path. Embedding across sites also needs SESSION_SAME_SITE=none,
+ | or the browser withholds the session cookie inside the frame.
+ |
+ */
+
+ /*
+ | Scheme forcing. Previously read from the environment at request time, which a
+ | cached config silently turns into null; declared here so `config:cache` keeps
+ | them working. Values and defaults are unchanged.
+ */
+
+ 'force_https' => filter_var(env('FORCE_HTTPS', false), FILTER_VALIDATE_BOOLEAN),
+
+ 'force_route_https' => filter_var(env('FORCE_ROUTE_HTTPS', false), FILTER_VALIDATE_BOOLEAN),
+
+ 'allowed_hosts' => array_values(array_filter(array_map(
+ 'trim',
+ explode(',', (string) env('ALLOWED_HOSTS', ''))
+ ))),
+
+ 'allowed_frame_origins' => array_values(array_filter(array_map(
+ 'trim',
+ explode(',', (string) env('ALLOWED_FRAME_ORIGINS', ''))
+ ))),
+
];
diff --git a/config/services.php b/config/services.php
index 49a7bbdcb..dc1fc5559 100755
--- a/config/services.php
+++ b/config/services.php
@@ -51,4 +51,67 @@
'redirect' => 'http://example.com/callback-url',
],
+ // Generic OpenID Connect (socialiteproviders/openidconnect), driver "openidconnect".
+ // Points at any OIDC issuer via discovery ({OIDC_ISSUER}/.well-known/openid-configuration).
+ // Every id_token is validated (signature/iss/aud/azp/exp/nonce/at_hash) with PKCE and
+ // automatic JWKS key-rotation.
+ 'openidconnect' => [
+
+ // ── Connection ──────────────────────────────────────────────────────────────
+ 'base_url' => env('OIDC_ISSUER'),
+ 'client_id' => env('OIDC_CLIENT_ID'),
+ 'client_secret' => env('OIDC_CLIENT_SECRET'),
+ 'scopes' => env('OIDC_SCOPES', 'openid profile email'),
+
+ // Deliberately no fallback: SocialLoginController derives the callback from the
+ // request host when this is empty, which is what lets one instance serve several
+ // apexes. Defaulting it to APP_URL makes that derivation unreachable and sends
+ // every visitor back to a single domain.
+ 'redirect' => env('OIDC_REDIRECT_URI'),
+ 'post_logout_redirect_uri' => env('OIDC_POST_LOGOUT_REDIRECT_URI', env('APP_URL')),
+
+ // Shown on the sign-in button, as "Sign in with {display_name}". The icon is a
+ // Bootstrap Icons class, as used elsewhere on the page; set it empty for no icon.
+ 'display_name' => env('OIDC_DISPLAY_NAME', 'OpenID Connect'),
+ 'icon' => env('OIDC_ICON', 'bi-shield-lock'),
+
+ // ── Claim mapping ───────────────────────────────────────────────────────────
+ // Providers disagree over which claim carries which field, so each accepts a
+ // comma-separated list and the first claim actually released wins. Defaults are
+ // the standard OIDC claims. `email_claims` is read by the driver itself, which is
+ // why it is the one plural name here.
+ 'email_claims' => env('OIDC_EMAIL_CLAIM', 'email'),
+ 'username_claim' => env('OIDC_USERNAME_CLAIM', 'preferred_username,nickname'),
+ 'name_claim' => env('OIDC_NAME_CLAIM', 'name'),
+ 'picture_claim' => env('OIDC_PICTURE_CLAIM', 'picture'),
+ 'groups_claim' => env('OIDC_GROUPS_CLAIM', 'groups'),
+
+ // ── Provisioning ────────────────────────────────────────────────────────────
+ 'auto_register' => filter_var(env('OIDC_AUTO_REGISTER', true), FILTER_VALIDATE_BOOLEAN),
+ 'link_existing_user' => filter_var(env('OIDC_LINK_EXISTING_USER', true), FILTER_VALIDATE_BOOLEAN),
+
+ // An unverified address must not bridge to an existing account, or anyone able to
+ // set an email at the provider could take one over.
+ 'require_verified_email' => filter_var(env('OIDC_REQUIRE_VERIFIED_EMAIL', true), FILTER_VALIDATE_BOOLEAN),
+ 'update_profile_on_login' => filter_var(env('OIDC_UPDATE_PROFILE_ON_LOGIN', false), FILTER_VALIDATE_BOOLEAN),
+ 'require_email' => filter_var(env('OIDC_REQUIRE_EMAIL', false), FILTER_VALIDATE_BOOLEAN),
+
+ // ── Authorization ───────────────────────────────────────────────────────────
+ // Empty places no restriction; naming either list makes it the allow-list, and it
+ // is re-checked on every sign-in so access can be withdrawn upstream. admin_group
+ // unset leaves the role entirely to the instance.
+ 'allowed_groups' => env('OIDC_ALLOWED_GROUPS', ''),
+ 'allowed_domains' => env('OIDC_ALLOWED_DOMAINS', ''),
+ 'admin_group' => env('OIDC_ADMIN_GROUP', ''),
+
+ // ── Sign-in flow ────────────────────────────────────────────────────────────
+ // auto_launch sends /login straight to the provider; ?local=1 still reaches the
+ // form, so an instance that sets it can never lock out its local accounts.
+ 'auto_launch' => filter_var(env('OIDC_AUTO_LAUNCH', false), FILTER_VALIDATE_BOOLEAN),
+ // idp_logout ends the provider's session as well, which signs the user out of every
+ // other application relying on it. Off by default: a sign-out here should not reach
+ // beyond here unless an operator asks for it.
+ 'idp_logout' => filter_var(env('OIDC_IDP_LOGOUT', false), FILTER_VALIDATE_BOOLEAN),
+ ],
+
];
diff --git a/config/session.php b/config/session.php
index 4e0f66cda..1fba5eb34 100755
--- a/config/session.php
+++ b/config/session.php
@@ -196,6 +196,6 @@
|
*/
- 'same_site' => 'lax',
+ 'same_site' => env('SESSION_SAME_SITE', 'lax'),
];
diff --git a/resources/lang/ar/messages.php b/resources/lang/ar/messages.php
index 71a3838fa..159300ac3 100644
--- a/resources/lang/ar/messages.php
+++ b/resources/lang/ar/messages.php
@@ -1137,4 +1137,8 @@
'next' => 'التالي »',
+
+ 'or' => 'أو',
+
+ 'Sign in with :provider' => 'تسجيل الدخول باستخدام :provider',
];
diff --git a/resources/lang/bg/messages.php b/resources/lang/bg/messages.php
index 6431d2468..c86b593d0 100644
--- a/resources/lang/bg/messages.php
+++ b/resources/lang/bg/messages.php
@@ -584,4 +584,6 @@
'throttle' => 'Твърде много опити за влизане. Моля, опитайте отново след :seconds секунди.',
'previous' => '« Предишен',
'next' => 'Следващия "',
+ 'or' => 'или',
+ 'Sign in with :provider' => 'Влез с :provider',
);
diff --git a/resources/lang/de/messages.php b/resources/lang/de/messages.php
index 104645ad2..2bb310b6f 100644
--- a/resources/lang/de/messages.php
+++ b/resources/lang/de/messages.php
@@ -1145,4 +1145,6 @@
'next' => 'Nächste »',
+ 'or' => 'oder',
+ 'Sign in with :provider' => 'Mit :provider anmelden',
];
diff --git a/resources/lang/el/messages.php b/resources/lang/el/messages.php
index c5528cc02..1452acb83 100644
--- a/resources/lang/el/messages.php
+++ b/resources/lang/el/messages.php
@@ -633,4 +633,6 @@
'throttle' => 'Πάρα πολλές προσπάθειες σύνδεσης. Δοκιμάστε ξανά σε :δευτερόλεπτα.',
'previous' => '«Προηγούμενο',
'next' => 'Επόμενο »',
+ 'or' => 'ή',
+ 'Sign in with :provider' => 'Σύνδεση με :provider',
);
diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php
index 7b9f44c6c..dc11ca9be 100644
--- a/resources/lang/en/messages.php
+++ b/resources/lang/en/messages.php
@@ -1140,4 +1140,14 @@
'next' => 'Next »',
+
+ // Single sign-on
+ 'or' => 'or',
+ 'Sign in with :provider' => 'Sign in with :provider',
+ 'Your identity provider did not release an email address.' => 'Your identity provider did not release an email address.',
+ 'Your email address is not verified with the identity provider.' => 'Your email address is not verified with the identity provider.',
+ 'An account with this email address already exists.' => 'An account with this email address already exists.',
+ 'This instance does not create accounts from single sign-on.' => 'This instance does not create accounts from single sign-on.',
+ 'Your account is not permitted to sign in to this instance.' => 'Your account is not permitted to sign in to this instance.',
+
];
diff --git a/resources/lang/es/messages.php b/resources/lang/es/messages.php
index da7c6118b..4809c2f3d 100644
--- a/resources/lang/es/messages.php
+++ b/resources/lang/es/messages.php
@@ -1063,4 +1063,6 @@
'Add new link' => 'Agregar nuevo enlace',
+ 'or' => 'o',
+ 'Sign in with :provider' => 'Iniciar sesión con :provider',
);
diff --git a/resources/lang/fr/messages.php b/resources/lang/fr/messages.php
index 6b6fc9d89..b20a25b5d 100644
--- a/resources/lang/fr/messages.php
+++ b/resources/lang/fr/messages.php
@@ -1078,4 +1078,6 @@
+ 'or' => 'ou',
+ 'Sign in with :provider' => 'Se connecter avec :provider',
);
diff --git a/resources/lang/gl/messages.php b/resources/lang/gl/messages.php
index a1b91d204..9873b1207 100644
--- a/resources/lang/gl/messages.php
+++ b/resources/lang/gl/messages.php
@@ -1062,4 +1062,6 @@
'Add new link' => 'Engadir novo enlace',
+ 'or' => 'ou',
+ 'Sign in with :provider' => 'Iniciar sesión con :provider',
);
diff --git a/resources/lang/pt-BR/messages.php b/resources/lang/pt-BR/messages.php
index 5a97520e3..8a8c0e787 100644
--- a/resources/lang/pt-BR/messages.php
+++ b/resources/lang/pt-BR/messages.php
@@ -1033,4 +1033,6 @@
'Add new link' => 'Adicionar novo link',
+ 'or' => 'ou',
+ 'Sign in with :provider' => 'Entrar com :provider',
);
diff --git a/resources/lang/ru/messages.php b/resources/lang/ru/messages.php
index ada81275c..0e5bb0942 100644
--- a/resources/lang/ru/messages.php
+++ b/resources/lang/ru/messages.php
@@ -1137,4 +1137,6 @@
'next' => 'Следующая ⮕',
+ 'or' => 'или',
+ 'Sign in with :provider' => 'Войти через :provider',
];
diff --git a/resources/lang/sv/messages.php b/resources/lang/sv/messages.php
index c57f5e2ff..2dc834a32 100644
--- a/resources/lang/sv/messages.php
+++ b/resources/lang/sv/messages.php
@@ -1,1136 +1,1138 @@
- 'Logga in',
- 'Register' => 'Registrera',
-
- 'Dashboard' => 'Panel',
- 'Copyright' => 'Upphovsrätt',
- 'Made with' => 'Skapad med',
- 'by' => 'av',
-
- 'HOME.MESSAGE' => '
-
Få grepp om din onlineprofil med LinkStack,
- en länkplattform med integritet och öppen källkod. Skapa en anpassningsbar profil för att hantera
- dina viktigaste länkar på ett och samma ställe och ge din omgivning en sömlös surfupplevelse.
- ',
-
-
- /*
- |--------------------------------------------------------------------------
- | Demosida/Hemsidoexempel
- |--------------------------------------------------------------------------
- |
- | resources/views/demo.blade.php
- |
- */
-
- 'Example page' => 'Exempelsida',
-
-
- /*
- |--------------------------------------------------------------------------
- | Verifikationssidor
- |--------------------------------------------------------------------------
- |
- | Inlogg, registration, glömt lösenord etc.
- | Detta inkluderar verifikationsmail som lösenåterställning och mailbekräftelse.
- | resources/views/auth
- |
- */
-
- # Inloggningssida
- 'Sign In' => 'Logga in',
- 'Login to stay connected' => 'Logga in för att hålla dig uppkopplad',
- 'Email' => 'Email',
- 'Password' => 'Lösenord',
- 'Remember Me' => 'Kom ihåg mig',
- 'Forgot Password?' => 'Glömt Lösenord?',
- 'or sign in with other accounts?' => 'eller logga in med andra konton?',
- 'Don’t have an account?' => 'Har du inget konto?',
- 'Click here to sign up' => 'Klicka här för att registrera dig',
-
-
- # Återställ Lösenord
- 'Forgot your password?' => 'Glömt ditt lösenord?',
- 'No problem' => 'Inga problem. Ange din mailadress så skickar vi en länk för att återställa ditt lösenord.',
- 'Email Password Reset Link' => 'Maila Lösenordsåterställning',
-
-
- # Registreringssida
- 'Sign Up' => 'Registrera',
- 'Register to stay connected' => 'Registrera dig för att hålla dig uppkopplad',
- 'Display Name' => 'Visningsnamn',
- 'Confirm Password' => 'Bekräfta lösenord',
- 'Already have an account?' => 'Har du redan ett konto?',
- 'Click here to sign in' => 'Klicka här för att logga in',
-
-
- # Väntar verifikation från admin
- 'Verification Status' => 'Verifieringsstatus',
- 'auth_pending' => 'itt konto väntar fortfarande på verifiering',
- 'auth_unverified' => 'Ditt konto är för närvarande overifierat och kräver manuell verifiering av en administratör.',
- 'Log out' => 'Logga ut',
-
-
- # Lösenordsbekräftelse
- 'auth_password' => 'Detta är ett säkert område av applikationen. Vänligen bekräfta ditt lösenord innan du fortsätter.',
- 'Confirm' => 'Bekräfta',
-
-
- # Lösenordsåterställning
- 'Reset Password' => 'Återställ lösenord',
- 'Enter a new password' => 'Ange ett nytt lösenord',
-
-
- # Testa e-mail
- 'Test E-Mail' => 'Testa E-Mail',
-
-
- # Registreringsnotis via mail
- 'A new user has registered on' => 'En ny användare har registrerat sig på',
- 'and is awaiting verification' => 'och väntar på verifiering',
- 'The user' => 'Användaren',
- 'with the email' => 'med mailadressen',
- 'has registered a new account on' => 'har registrerat ett nytt konto på',
- 'and is awaiting confirmation by an admin' => 'och väntar på bekräftelse från en administratör.',
- 'Click' => 'Klicka',
- 'here' => 'här',
- 'to verify the user' => 'för att verifiera användaren.',
- 'Manage Users' => 'Hantera användare',
-
-
- # Maila bekräftelsemail
- 'auth_thanks' => 'Tack för att du registrerade dig! Innan du börjar, kan du verifiera din e-mailadress genom att klicka på länken vi just skickade till dig via e-mail? Om du inte har fått e-mailmeddelandet skickar vi gärna ett till. Om du inte ser e-mailmeddelandet inom några minuter, kontrollera din skräppost.',
- 'auth_verification' => 'En ny bekräftelselänk har skickats till mailadressen du angav under registreringen.',
- 'Resend Verification Email' => 'Skicka verifieringsmail igen',
-
-
- /*
- |--------------------------------------------------------------------------
- | Anpassning Sidofält
- |--------------------------------------------------------------------------
- |
- | resources/views/layouts/sidebar.blade.php
- |
- */
-
- 'Settings' => 'Inställningar',
- 'Scheme' => 'Schema',
- 'Auto' => 'Auto',
- 'Dark' => 'Mörkt',
- 'Light' => 'Ljust',
- 'Color Customizer' => 'Färganpassare',
- 'Sidebar Color' => 'Färg på Sidofältet',
- 'Default' => 'Standard',
- 'Color' => 'Färg',
- 'Transparent' => 'Genomskinlig',
- 'Sidebar Types' => 'Typer av Sidofält',
- 'Mini' => 'Mini',
- 'Hover' => 'Sväva',
- 'Boxed' => 'Boxad',
- 'Sidebar Active Style' => 'Aktiv stil i sidofältet',
- 'Rounded One Side' => 'Rundad på en sida',
- 'Rounded All' => 'Rundad på alla sidor',
- 'Pill One Side' => 'Piller på en sida',
- 'Pill All' => 'Piller på alla sidor',
-
-
- /*
- |--------------------------------------------------------------------------
- | Anpassning
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/site.blade.php
- |
- */
-
- 'Home' => 'Hem',
- 'Add Link' => 'Lägg till länk',
- 'Administration' => 'Administration',
- 'Admin' => 'Admin',
- 'Config' => 'Konfiguration',
- 'Footer Pages' => 'Sidfötter',
- 'Site Customization' => 'Webbplatsanpassning',
- 'Site Logo' => 'Webbplatsens logga',
- 'Personalization' => 'Anpassning',
- 'Links' => 'Länkar',
- 'Appearance' => 'Utseende',
- 'Themes' => 'Teman',
- 'Site logo' => 'Webbplatsens logga',
- 'Favicon' => 'Favicon',
- 'Home message' => 'Hemmedelande',
-
-
- /*
- |--------------------------------------------------------------------------
- | Navbar
- |--------------------------------------------------------------------------
- |
- | resources/views/layouts/sidebar.blade.php
- |
- */
-
- 'View Page' => 'Visa Sida',
- 'Share your profile' => 'Dela din profil',
- 'Share your profile:' => 'Dela din profil:',
- 'Error sharing:' => 'Fel vid delning:',
- 'Text copied to clipboard!' => 'Text kopierad till urklipp!',
- 'Error copying text:' => 'Fel vid kopiering av text:',
- 'QR Code' => 'QR-kod',
- 'Scan QR Code' => 'Skanna QR-kod',
- 'QR code could not be generated' => 'QR-kod kunde inte skapas',
- 'Reason:' => 'Anledning:',
-
- # QR-kod-meny
- 'Close' => 'Stäng',
- 'Dismiss' => 'Avvisa',
-
- # Notis-meny
- 'All Notifications' => 'Alla Notiser',
-
- # Uppdateringsmeny
- 'Updater' => 'Uppdaterare',
- 'Beta Mode' => 'Beta-läge',
- 'Local version' => 'Lokal version',
- 'Latest beta' => 'Senaste beta',
- 'Run updater' => 'Kör uppdaterare',
- 'Update available' => 'Uppdatering tillgänglig',
- 'Up to date' => 'Senaste version installerad',
- 'Check again' => 'Kontrollera igen',
-
- # Användarsektion i navbar
- 'Administrator' => 'Administratör',
- 'Verified user' => 'Verifierad användare',
- 'User' => 'Användare',
- 'Profile' => 'Profil',
- 'Styling' => 'Formgivning',
- 'Logout' => 'Logga ut',
-
-
- /*
- |--------------------------------------------------------------------------
- | Panelsida
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/index.blade.php
- |
- */
-
- # Header med bild
- 'Hi' => 'Hej',
- 'stranger' => 'främling',
- 'welcome' => 'Välkommen till :appName!',
- 'Set a handle' => 'Ställ in användarnamn',
-
- # Panelsida
- 'Total Links:' => 'Totalt antal länkar:',
- 'Link Clicks:' => 'Länkklick:',
- 'View/Edit Links' => 'Visa/Redigera Länkar',
- 'Top Links:' => 'Topplänkar:',
- 'You haven’t added any links yet' => 'Du har inte lagt till några länkar än.',
- 'clicks' => 'klick',
- 'Clicks' => 'Klick',
- 'Site statistics:' => 'Sidostatistik:',
- 'Total links' => 'Totalt antal länkar',
- 'Total clicks' => 'Antal klick',
- 'Total users' => 'Totalt antal användare',
- 'Registrations:' => 'Registrationer:',
- 'Last 30 days' => 'Sista 30 dagarna',
- 'Last 7 days' => 'Sista 7 dagarna',
- 'Last 24 hours' => 'Sista 24 timmarna',
- 'Active users:' => 'Aktiva användare:',
-
-
-
- /*
- |--------------------------------------------------------------------------
- | Knappredigerare
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/button-editor.blade.php
- |
- */
-
- 'Button Editor' => 'Knappredigerare',
- 'Back' => 'Tillbaka',
- 'Custom Button' => 'Egenanpassad Knapp',
- 'CSS' => 'CSS',
- 'background' => 'bakgrund',
- 'gradient' => 'övertoning',
- 'Show CSS' => 'Visa CSS',
- 'Custom CSS' => 'Egen CSS',
- 'Save' => 'Spara',
- 'Reset to default' => 'Återställ till standard',
- 'Result' => 'Resultat:',
- 'Custom Icon' => 'Anpassad Ikon',
- 'Custom Alert' => 'Din anpassade ikons shortcode innehåller inte "fa-". Använd alltid ikoner i följande format: fa-ghost, till exempel.',
- 'cb.description.1-4' => 'Anpassade ikoner kan tillämpas knappar via Font Awesome. Du kan använda vilken ikon du vill från listan nedan, du kan nå den här listan genom att klicka på "Se alla ikoner"-knappen. Varje ikon på den listan har en shortcode, som du kan klistra in i "Anpassad Ikon"-fältet.',
- 'cb.description.2-4' => 'Varje ikons shortcode består av ett prefix och en huvuddel. Om shortcoden inte representerar ett märke, så kan du skriva koden i följande format: fa-ikon-namn. Formatteringen "fa-..." har betydelse. Till exempel "fa-kod".',
- 'cb.description.3-4' => 'Om shortcoden representerar ett märke, så är det viktigt att inkludera "fab" som prefix. "fa-..."-formatteringen gäller fortfarande här. Till exempel, "fab fa-github"',
- 'cb.description.4-4' => 'För att tillämpa färg till dina ikoner, så kan du enkelt fylla i färgnamnet eller HEX-värdet innan ikonen, följt av ";". Det är viktigt att färgen definieras innan ikonen. Färgkoden måste avslutas med semikolon. En lista med tillgängliga färger finns här.',
- 'Style' => 'Stil',
- 'Prefix' => 'Prefix',
- 'Icon' => 'Ikon',
- 'Short Code' => 'Shortcode',
- 'Regular' => 'Standard',
- 'Brands' => 'Märken',
- 'Color name' => 'färg_namn',
- 'Color HEX' => 'Färg HEX',
- 'Color HEX1' => 'Färg HEX',
- 'Update icon' => 'Uppdatera ikon',
- 'See all icons' => 'Se alla ikoner',
-
-
- /*
- |--------------------------------------------------------------------------
- | Ändra länksida
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/edit-link.blade.php
- |
- */
-
- 'Edit' => 'Redigera',
- 'Add' => 'Lägg till',
- 'Block' => 'Block',
- 'Blocks' => 'Block: ',
- 'Select Block' => 'Välj Block ',
- 'Toggle Dropdown' => 'Växla Meny',
- 'Cancel' => 'Avbryt',
- 'Save and Add More' => 'Spara och lägg till fler',
- 'Click to change link blocks' => 'Klicka för att ändra länkblock',
- 'Click for a list of available link blocks' => 'Klicka för en lista med tillgängliga länkblock',
-
-
- /*
- |--------------------------------------------------------------------------
- | Länksida
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/links.blade.php
- |
- */
-
- 'My Links' => 'Mina Länkar',
- 'Add new Link' => 'Lägg till ny Länk',
- 'No Link Added' => 'Du har inte lagt till några länkar än.',
- 'Download' => 'Ladda ner',
- 'Preview' => ' Förhandsvisning:',
- 'No compatible browser' => 'Din webbläsare är ej kompatibel',
- 'Page Icons' => 'Sidikoner',
- 'Save links' => 'Spara länkar',
-
- # Tooltips
- 'Customize' => 'Anpassa',
- 'Delete' => 'Radera',
- 'Clear icon cache' => 'Rensa cacheminne för ikoner',
-
- 'confirm_delete' => 'Är du säker på att du vill radera :title?',
-
-
- /*
- |--------------------------------------------------------------------------
- | "Min Profil"/Utseendesida
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/page.blade.php
- |
- */
-
- 'My Profile'=> 'Min Profil',
- 'Profile Picture' => 'Profilbild',
- 'Page URL' => 'Sido-URL',
- 'Display name' => 'Visningsnamn',
- 'Name:' => 'Namn:',
- 'Page Description' => 'Sidobeskrivning',
- 'Show checkmark' => 'Visa verifieringsbock',
- 'disableverified' => 'Du är en verifierad användare. Med den här inställningen kan du dölja din verifieringsbock.',
- 'Show share button' => 'Visa delningsknapp',
- 'disablesharebutton' => 'Med den här inställningen kan du dölja knappen för att dela din profil.',
-
-
- /*
- |--------------------------------------------------------------------------
- | Personlig inställningssida
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/profile.blade.php
- |
- */
-
- 'Account Settings' => 'Kontoinställningar',
- 'Change email' => 'Ändra email',
- 'Change password' => 'Ändra lösenord',
- 'Export user data' => 'Exportera användardata',
- 'Export your user data' => 'Exportera din användardata för att föra över till en annan instans.',
- 'Export all data' => 'Exportera all data',
- 'Export links only' => 'Exportera enbart länkar',
- 'Import user data' => 'Importera användardata',
- 'import.user.alert' => 'Är du säker på att du vill importera den här filen? Detta kommer att ersätta all nuvarande data, inklusive länkar!',
- 'Import your user data from another instance' => 'Importera din användardata från en annan instans.',
- 'Import' => 'Importera',
- 'Delete your account' => 'Radera ditt konto',
- 'You are about to delete' => 'Du är på väg att radera ditt konto!',
- 'You are about to delete This action cannot be undone' => 'Du är på väg att radera ditt konto! Det är en permanent ändring och går ej att återställa.',
- 'Delete account' => 'Radera konto',
-
- # Alerts
- 'Profile updated successfully!' => 'Profilen uppdaterades!',
- 'An error occurred while updating your profile.' => 'Ett fel uppstod medans din profil uppdaterades.',
-
- 'That handle has already been taken' => 'Det angivna användarnamnet är upptaget.',
- 'The selected file must be an image' => 'Den valda filen måste bestå av en bild.',
- 'The image must be' => 'Bilden måste:',
- 'The image size should not exceed 2MB' => 'Bildstorleken bör ej överskrida 2MB.',
- 'Please select an image' => 'Vänligen välj en bild.',
-
- /*
- |--------------------------------------------------------------------------
- | Tema-anpassningssida
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/theme.blade.php
- |
- */
-
- 'Select a theme' => 'Välj ett tema',
- 'Select theme' => 'Välj tema',
- 'Custom background' => 'Egen bakgrund',
- 'No image selected' => 'Ingen bild vald',
- 'Remove background' => 'Radera bakgrund',
- 'Manage themes' => 'Hantera teman',
- 'Loading...' => 'Laddar...',
- 'Upload themes' => 'Ladda upp teman',
- 'Delete themes' => 'Radera teman',
- 'Download themes' => 'Ladda ner teman',
- 'Delete a theme' => 'Radera ett tema',
-
-
- /*
- |--------------------------------------------------------------------------
- | Temauppdaterare
- |--------------------------------------------------------------------------
- |
- | resources/views/studio/theme-updater.blade.php
- |
- */
-
- 'Theme Updater' => 'Temauppdaterare',
- 'Theme name' => 'Temanamn:',
- 'Update status' => 'Uppdateringsstatus:',
- 'Version' => 'Version:',
- 'Error!' => 'Fel!',
- 'Update manually' => 'Uppdatera manuellt',
- 'Update all themes' => 'Uppdatera alla teman',
-
-
- /*
- |--------------------------------------------------------------------------
- | Hantera Användare
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/edit-user.blade.php
- |
- */
-
- 'Edit User' => 'Redigera Användare',
- 'Logo' => 'Logga',
- 'Page description' => 'Sidbeskrivning',
- 'Role' => 'Roll',
-
-
- /*
- |--------------------------------------------------------------------------
- | Länksida
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/links.blade.php
- |
- */
-
- 'Title' => 'Titel',
-
-
- /*
- |--------------------------------------------------------------------------
- | Länksida (Admin)
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/links.blade.php
- |
- */
-
- 'Link' => 'Länk',
-
-
- /*
- |--------------------------------------------------------------------------
- | PHP info-sida
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/phpinfo.blade.php
- |
- */
-
- 'Information about PHP’s configuration' => 'Information om PHP:s konfiguration',
- 'Outputs information about the current state of PHP' => 'Visar information om PHP:s nuvarande tillstånd',
-
-
- /*
- |--------------------------------------------------------------------------
- | Radera teman
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/theme.blade.php
- |
- */
-
- 'Delete theme' => 'Radera tema',
-
-
- /*
- |--------------------------------------------------------------------------
- | Hantera Användare
- |--------------------------------------------------------------------------
- |
- | resources/views/panel/users.blade.php
- |
- */
-
- 'Users:' => 'Användare:',
- 'Search user' => 'Sök användare',
- 'ID' => 'ID',
- 'Name' => 'Namn',
- 'E-Mail' => 'E-Mail',
- 'Page' => 'Sida',
- 'Created at' => 'Skapad',
- 'Last seen' => 'Senast sedd',
- 'Status' => 'Status',
- 'Action' => 'Handling',
- 'N/A' => 'Otillgänglig',
- 'Pending' => 'Väntar',
- 'Verified' => 'Verifierad',
- 'Approved' => 'Godkänd',
- 'Add new user' => 'Lägg till ny användare',
-
- # Tooltips
- 'tt.Delete' => 'Radera',
- 'tt.Impersonate' => 'Imitera',
- 'tt.Edit' => 'Redigera',
- 'tt.All links' => 'Alla länkar',
-
- 'confirm.delete.user' => 'Är du säker på att du vill ta bort den här användaren? \nDetta är permanent!',
-
- # Datumformat
- 'date.format' => 'd/m/Å',
-
- 'days ago' => 'dagar sedan',
- '1 day ago' => '1 dag sedan',
- 'Today' => 'Idag',
- '1 year ago' => '1 år sedan',
- 'years ago' => 'år sedan',
-
-
- /*
- |--------------------------------------------------------------------------
- | Konfigurationssida
- |--------------------------------------------------------------------------
- |
- | resources/views/components/config/
- | resources/views/panel/config-editor.blade.php
- |
- */
-
- 'Advanced Config' => 'Avancerad Konfiguration',
- 'Take Backup' => 'Skapa Backup',
- 'All Backups' => 'Alla Backups',
- 'Diagnosis' => 'Diagnos',
-
- 'Alternative Config Editor' => 'Alternativ Konfigurationsredigerare',
- 'Use the Alternative Config Editor to edit the config directly' => 'Använd den Alternativa Konfigurationsredigeraren för att redigera konfigurationen direkt',
-
- 'PHP info' => 'PHP info',
- 'Display debugging information about your PHP setup' => 'Visa felsökningsinformation om din PHP-instans',
-
- 'Jump directly to:' => 'Hoppa direkt till:',
-
- 'Application' => 'Applikation',
- 'Panel settings' => 'Panelinställningar',
- 'Security' => 'Säkerhet',
- 'Advanced' => 'Avancerat',
- 'SMTP' => 'SMTP',
- 'Footer links' => 'Sidfotslänkar',
- 'Debug' => 'Felsök',
- 'Language' => 'Språk',
-
- 'default' => 'standard',
- 'Apply' => 'Verkställ',
-
- 'AC.description' => 'Tillåter redigering av webbplatsens frontsystem. Bl.a. tillåter den här filen redigering av: Hemsida, länkar, titlar, Google Analytics och meta-taggar.',
- 'Advanced Configuration file.' => 'Avancerad konfigurationsfil.',
- 'Restore defaults' => 'Återställ till standard',
-
- 'Backup' => 'Backup',
- 'You can back up your entire instance:' => 'Du kan skapa en backup av hela din instans:',
- 'The backup system won’t save more than two backups at a time' => 'Backupsystemet sparar ej fler än två backups åt gången.',
- 'Backup Instance' => 'Skapa Backup av Instans',
-
- 'wtrue' => 'Allt fungerar som avsett!',
- 'wfalse' => 'Den här filen kan ej skrivas till. Detta kan förhindra normal drift.',
- 'utrue' => 'En säkerhetsrisk har upptäckts. Den här filen kan nås av utomstående. Omedelbar handling krävs!',
- 'ufalse' => 'Allt fungerar som avsett!',
- 'unull' => 'Något gick fel. Detta kan vara normalt om instansen ligger bakom en proxy eller en docker-container.',
- 'Debugging information' => 'Felsökningsinformation',
- 'security.risk' => 'En säkerhetsrisk har upptäckts. Den här filen kan nås av utomstående. Omedelbar handling krävs! Klicka på detta meddelande för mer information.',
- 'security.risk.1-3' => 'Här kan du enkelt kontrollera om kritiska systemfiler kan nås av utomstående. Det är viktigt att ingen utomstående kan nå filerna, annars kan användardata som lösenord läckas. Fält markerade med ett',
- 'security.risk.2-3' => 'kan ej nås av utomstående, fält markerade med ett',
- 'security.risk.3-3' => 'kan nås av vem som helst och kräver omedelbar handling för att skydda din data.',
- 'Hover for more' => 'Sväva för mer',
- 'Write access' => 'Skrivåtkomst',
- 'Write access.description.1-3' => 'Här kan du enkelt kontrollera om viktiga systemfiler har skrivåtkomst. Detta är viktigt för att alla funktioner ska fungera som tänkt. Fält markerade med ett',
- 'Write access.description.2-3' => 'fungerar som avsett, fält markerade med ett',
- 'Write access.description.3-3' => 'fungerar inte som avsett.',
- 'File' => 'Fil',
- 'Dependencies' => '',
- 'Required PHP modules' => 'Obligatoriska PHP-moduler.',
- 'PHP Extension' => 'PHP-tillägg',
- 'No backups found' => 'Ingen backup hittad',
- 'Backup your instance' => 'Skapa Backup av din instans',
-
- 'Go back' => 'Gå tillbaka',
-
- 'Strings with a # in front of them are comments and wont affect anything' => 'Teckensträngar med # framför dem är kommentarer och påverkar ingenting.',
-
- 'Download your updater backups:' => 'Ladda ner backups från uppdateraren:',
- 'The server will never store more that two backups at a time' => 'Servern lagrar aldrig fler än två backups åt gången.',
-
- 'SMTP.title' => 'Använd inbyggd SMTP-server',
- 'SMTP.description' => 'Använder LinkStacks egna SMTP-server. Är ej nödvändigtvis 100% pålitlig. Måste inaktiveras för att använda en egen SMTP-server.',
- 'SMTP.description.alt' => '(Spara ändringar med "Verkställ ändringar" nedan)',
- 'Enable' => 'Aktivera',
- 'Custom SMTP server:' => 'Egen SMTP-server:',
- 'Host' => 'Värd',
- 'Port' => 'Port',
- 'Username' => 'Användarnamn',
- 'Encryption type' => 'Krypteringstyp',
- 'From address' => 'Från-adress',
- 'Apply changes' => 'Verkställ ändringar',
- 'Test E-Mail setup:' => 'Testa E-Mail-konfiguration:',
- 'Send Test E-Mail' => 'Skicka Testmail',
-
- 'Debug.title' => 'Felsökningsläge',
- 'Debug.description' => 'Bör inaktiveras i produktion. Användbar vid felsökning under uppstart.',
-
- 'DISPLAY_FOOTER_HOME.title' => 'Sidfotslänk hemsida',
- 'DISPLAY_FOOTER_HOME.description' => 'Aktivera sidfot på hemsidan.',
- 'REGISTER_AUTH.title' => 'Aktivera mailverifikation',
- 'REGISTER_AUTH.description' => 'Avgör om användare måste bekräfta sin email när de registrerar sig.',
- 'ALLOW_REGISTRATION.title' => 'Aktivera registrering',
- 'ALLOW_REGISTRATION.description' => 'Avgör om användare kan registrera sig till din instans.',
- 'NOTIFY_EVENTS.title' => 'Notis vid händelser',
- 'NOTIFY_EVENTS.description' => 'Visar en notis när något händer.',
- 'NOTIFY_UPDATES.title' => 'Notis vid uppdatering',
- 'NOTIFY_UPDATES.description' => 'Visar en notis om en ny uppdatering finns tillgänglig.',
- 'DISPLAY_FOOTER.title' => 'Visa sidfot',
- 'DISPLAY_FOOTER.description' => 'Avgör om sidfotslänkar ska visas.',
- 'DISPLAY_CREDIT.title' => 'Visa källhänvisning på användarsidor',
- 'DISPLAY_CREDIT.description' => 'Avgör om källhänvisningen ska visas på användarsidor.',
- 'DISPLAY_CREDIT_FOOTER.title' => 'Visa källhänvisning i sidfot',
- 'DISPLAY_CREDIT_FOOTER.description' => 'Avgör om källhänvisningen ska visas i sidfötterna.',
- 'HOME_URL.title' => 'Ställ in användarsida som Hemsida',
- 'HOME_URL.description' => 'Ställer in användarsida som hemsida. Detta flyttar den vanliga hemsidan till example.com/home.',
- 'ALLOW_USER_HTML.title' => 'Tillåt utökad syntax i användares biografier',
- 'ALLOW_USER_HTML.description' => 'Detta tillåter användare att tillämpa speciell formattering som rubriker och länkar i deras sidobiografi. Detta anses generellt vara säkert.',
- 'APP_NAME.title' => 'Applikationstitel',
- 'APP_NAME.description' => 'Avgör titeln på din app. Ändring av detta värde loggar ut alla aktiva användare.',
- 'APP_KEY.title' => 'APP_KEY',
- 'APP_KEY.description' => 'APP_KEY',
- 'APP_URL.title' => 'APP_URL',
- 'APP_URL.description' => 'APP_URL',
- 'ENABLE_BUTTON_EDITOR.title' => 'Aktivera Knappredigerare',
- 'ENABLE_BUTTON_EDITOR.description' => 'Avgör om användare får anpassa sina egna knappar med hjälp av CSS.',
- 'APP_DEBUG.title' => 'APP_DEBUG',
- 'APP_DEBUG.description' => 'APP_DEBUG',
- 'APP_ENV.title' => 'APP_ENV',
- 'APP_ENV.description' => 'APP_ENV',
- 'LOG_CHANNEL.title' => 'LOG_CHANNEL',
- 'LOG_CHANNEL.description' => 'LOG_CHANNEL',
- 'LOG_LEVEL.title' => 'LOG_LEVEL',
- 'LOG_LEVEL.description' => 'LOG_LEVEL',
- 'MAINTENANCE_MODE.title' => 'Aktivera Underhållsläge',
- 'MAINTENANCE_MODE.description' => 'Visar att underhåll pågår på alla publika sidor. Detta inaktiverar även inloggningssidorna.',
- 'MAIL_MAILER.title' => 'MAIL_MAILER',
- 'MAIL_MAILER.description' => 'MAIL_MAILER',
- 'MAIL_HOST.title' => 'MAIL_HOST',
- 'MAIL_HOST.description' => 'MAIL_HOST',
- 'MAIL_PORT.title' => 'MAIL_PORT',
- 'MAIL_PORT.description' => 'MAIL_PORT',
- 'MAIL_USERNAME.title' => 'MAIL_USERNAME',
- 'MAIL_USERNAME.description' => 'MAIL_USERNAME',
- 'MAIL_PASSWORD.title' => 'MAIL_PASSWORD',
- 'MAIL_PASSWORD.description' => 'MAIL_PASSWORD',
- 'MAIL_ENCRYPTION.title' => 'MAIL_ENCRYPTION',
- 'MAIL_ENCRYPTION.description' => 'MAIL_ENCRYPTION',
- 'MAIL_FROM_ADDRESS.title' => 'MAIL_FROM_ADDRESS',
- 'MAIL_FROM_ADDRESS.description' => 'MAIL_FROM_ADDRESS',
- 'JOIN_BETA.title' => 'Gå med i beta-programmet',
- 'JOIN_BETA.description' => 'Aktiverar betaversioner vid uppdatering. Läs mer om detta här.',
- 'SKIP_UPDATE_BACKUP.title' => 'Skippa backup vid uppdatering',
- 'SKIP_UPDATE_BACKUP.description' => 'Skippar backups vid uppdatering. Detta alternativ rekommenderas att alltid vara inaktiverat, men kan i vissa konfigurationer skapa problem.',
- 'CUSTOM_META_TAGS.title' => 'Aktivera egna meta-taggar',
- 'CUSTOM_META_TAGS.description' => 'Aktiverar anpassningsbara meta-taggar i "head"-stycket på alla sidor. Definieras i Advancerad Konfiguration.',
- 'FORCE_HTTPS.title' => 'Tvinga HTTPS på länkar',
- 'FORCE_HTTPS.description' => 'Tvingar alla länkar att använda HTTPS som standard. Detta alternativ rekommenderas om omvänd proxy är i bruk.',
- 'ALLOW_CUSTOM_CODE_IN_THEMES.title' => 'Tillåt anpassad kod i teman',
- 'ALLOW_CUSTOM_CODE_IN_THEMES.description' => 'Tillåter bruk av anpassad kod i teman. Om du använder teman från okännda källor, så kan detta innebära en säkerhetsrisk.',
- 'ENABLE_THEME_UPDATER.title' => 'Aktivera Temauppdateraren',
- 'ENABLE_THEME_UPDATER.description' => 'Avgör om temauppdateraren ska vara aktiv.',
- 'ENABLE_ADMIN_BAR_USERS.title' => 'Aktivera administrationsfält för alla användare',
- 'ENABLE_ADMIN_BAR_USERS.description' => 'Om det här alternativet är aktivt kommer alla inloggade användare att ha ett administrationsfält tillgängligt på deras länksidor.',
- 'ENABLE_SOCIAL_LOGIN.title' => 'Aktivera social inloggning',
- 'ENABLE_SOCIAL_LOGIN.description' => 'Aktiverar inloggning via sociala medier. Det här alternativer kräver vidare konfiguration. Läs mer om detta här.',
- 'USE_THEME_PREVIEW_IFRAME.title' => 'Använd iframe som temaförhandsvisning',
- 'USE_THEME_PREVIEW_IFRAME.description' => 'Avgör om en intern iframe skall användas som förhandsvisning för teman på temasidan.',
- 'FORCE_ROUTE_HTTPS.title' => 'Omdirigera alla sidor till HTTPS',
- 'FORCE_ROUTE_HTTPS.description' => 'Det här alternativet kommer att förstöra din konfiguration om du använder omvänd proxy.',
- 'DISPLAY_FOOTER_TERMS.title' => 'Sidfotslänk för villkor',
- 'DISPLAY_FOOTER_TERMS.description' => 'Aktiverar länk i sidfot för villkor.',
- 'DISPLAY_FOOTER_PRIVACY.title' => 'Sidfotslänk för Integritet',
- 'DISPLAY_FOOTER_PRIVACY.description' => 'Aktiverar länk i sidfot för Integritet.',
- 'DISPLAY_FOOTER_CONTACT.title' => 'Sidfotslänk för Kontakt',
- 'DISPLAY_FOOTER_CONTACT.description' => 'Aktiverar länk i sidfot för Kontakt.',
- 'TITLE_FOOTER_HOME.title' => '',
- 'TITLE_FOOTER_HOME.description' => 'Titel för sidfotslänk till hem.',
- 'TITLE_FOOTER_TERMS.title' => '',
- 'TITLE_FOOTER_TERMS.description' => 'Titel för sidfotslänk till villkor.',
- 'TITLE_FOOTER_PRIVACY.title' => '',
- 'TITLE_FOOTER_PRIVACY.description' => 'Titel för sidfotslänk till integritet.',
- 'TITLE_FOOTER_CONTACT.title' => '',
- 'TITLE_FOOTER_CONTACT.description' => 'Titel för sidfotslänk till kontakt.',
- 'HOME_FOOTER_LINK.title' => '
Home footer link URL
',
- 'HOME_FOOTER_LINK.description' => 'Ange valfri URL för att omdirigera din hemlänks URL. Lämna fältet tomt för standard.',
- 'ALLOW_CUSTOM_BACKGROUNDS.title' => 'Tillåt egna bakgrunder',
- 'ALLOW_CUSTOM_BACKGROUNDS.description' => 'Tillåter användare att ladda upp egna bakgrundsbilder till deras sidor.',
- 'ALLOW_USER_IMPORT.title' => 'Tillåt användare att importera profiler från andra instanser',
- 'ALLOW_USER_IMPORT.description' => 'Tillåter användera att importera deras profiler och länkar från en extern fil.',
- 'ALLOW_USER_EXPORT.title' => 'Tillåt användare att exportera deras profil',
- 'ALLOW_USER_EXPORT.description' => 'Tillåter användera att exportera deras egna profiler och länkar.',
- 'MANUAL_USER_VERIFICATION.title' => 'Verifiera användare manuellt',
- 'MANUAL_USER_VERIFICATION.description' => 'Avgör om administratörer ska verifiera nyregistrerade medlemmar manuellt.',
- 'ADMIN_EMAIL.title' => 'Administratörsmail',
- 'ADMIN_EMAIL.description' => 'Används för att skicka notiser via mail.',
- 'HIDE_VERIFICATION_CHECKMARK.title' => 'Dölj verifieringsbock',
- 'HIDE_VERIFICATION_CHECKMARK.description' => 'Döljer verifieringsbock som visas på administratörers samt VIP-medlemmars sidor.',
- 'ENABLE_REPORT_ICON.title' => 'Aktivera rapportikon',
- 'ENABLE_REPORT_ICON.description' => 'Visar en ikon på användarsidor som låter användare rapportera sidor.',
- 'LOCALE.title' => 'Appspråk',
- 'LOCALE.description' => 'Ändrar språket på din applikation',
-
-
- /*
- |--------------------------------------------------------------------------
- | Installerare
- |--------------------------------------------------------------------------
- |
- | resources/views/installer/installer.blade.php
- |
- */
-
- # Title Tag
- 'LinkStack setup' => 'Installation av LinkStack',
-
- 'Setup LinkStack' => 'Installera LinkStack',
- 'Welcome to the setup for LinkStack!' => 'Välkommen till installationsguiden för LinkStack!',
- 'This setup will:' => 'Den här installationsguiden kommer att:',
- 'Check the server dependencies' => '1. Kontrollera serverkrav',
- 'Setup the database' => '2. Installera databasen',
- 'Create the admin user' => '3. Skapa administratörsanvändaren',
- 'Configure the app' => '4. Konfigurera applikationen',
- 'Choose a language' => 'Välj ett språk',
-
- 'Next' => 'Nästa',
- 'Yes' => 'Ja',
- 'No' => 'Nej',
- 'Finish setup' => 'Slutför installationen',
-
- 'Setup failed' => 'Installation misslyckades',
- 'An error has occured. Please try again' => 'Ett fel har uppstått. Var vänlig och försök igen.',
- 'Depending on your database type:' => 'Beroende på din typ av databas:',
- 'Try again' => 'Försök igen',
-
- 'Dependency check' => 'Kontroll av systemkrav',
- 'Required PHP modules:' => 'Obligatoriska PHP-moduler:',
-
- 'Select a database type' => 'Välj en typ av database',
- 'Under most circumstances, we recommend using SQLite' => 'I de flesta fall rekommenderar vi SQLite.',
- 'MySQL requires a separate, empty MySQL database' => 'MySQL kräver en separat och tom MySQL-databas.',
-
- 'Database type:' => 'Databastyp:',
- 'Database host:' => 'Databasvärd:',
- 'Database port:' => 'Databasport:',
- 'Database name:' => 'Databasenamn:',
- 'Database username:' => 'Databasens användarnamn:',
- 'Database password:' => 'Databasens lösenord:',
-
- 'Create an admin account' => 'Skapa ett administrationskonto.',
- 'Admin email:' => 'Administratörens email:',
- 'Admin password:' => 'Administratörens password:',
- 'Handle:' => 'Användarnamn:',
- 'Name:' => 'Namn:',
-
- 'Configure your page' => 'Konfigurera din sida',
- 'Enable registration:' => 'Aktivera registrering:',
- 'Enable email verification:' => 'Aktivera mailbekräftelse:',
- 'Set your page as Home Page' => 'Använd din sida som hemsida',
- 'This will move the Home Page to /home' => 'Detta flyttar den ordinarie hemsidan till /home',
- 'App Name:' => 'Appnamn:',
-
-
- /*
- |--------------------------------------------------------------------------
- | Uppdaterare/Uppdaterar-backup
- |--------------------------------------------------------------------------
- |
- | resources/views/update.blade.php
- |
- */
-
- # Titel-tagg
- 'Update LinkStack' => 'Uppdatera LinkStack',
-
- 'Latest beta version' => 'Senaste betaversion',
- 'Installed beta version' => 'Installerad betaversion',
- 'none' => 'ingen',
- 'You need to update to the latest mainline release' => 'Du behöver uppdatera till den senaste mainline-versionen',
- 'You’re running the latest mainline release' => 'Du använder den senaste mainline-versionen',
-
- 'update.manually' => 'Du kan uppdatera din installation automatiskt eller ladda ner och installera uppdateringen manuellt:',
- 'update.windows' => 'Windows-användare kan använda den alternativa uppdateraren. Den här uppdateraren skapar ingen backup. Använd efter eget omdöme.',
- 'Update automatically' => 'Uppdatera automatiskt',
-
- 'Updating' => 'Uppdaterar',
- 'Creating backup' => 'Skapar backup',
- 'Preparing update' => 'Förbereder uppdatering',
- 'No new version' => 'Ingen ny version',
- 'There is no new version available' => 'Det finns ingen ny version tillgänglig',
- 'Admin Panel' => 'Administrationspanel',
- 'Finishing up' => 'Slutför',
- 'Success!' => 'Lyckades!',
- 'The update was successful' => 'Uppdateringen lyckades, du kan nu återvända till Administrationspanelen.',
- 'View the release notes' => 'Visa versionsnoteringar',
- 'Run again' => 'Kör igen',
- 'Error' => 'Fel',
- 'Something went wrong with the update' => 'Något gick fel med uppdateringen',
-
-
- /*
- |--------------------------------------------------------------------------
- | Backup
- |--------------------------------------------------------------------------
- |
- | resources/views/backup.blade.php
- |
- */
-
- # Title Tag
- 'Backup.title' => 'Backup',
-
- 'The backup was successful' => 'Skapandet av backup lyckades, du kan nu gå tillbaka till Administrationspanelen eller se alla dina backups.',
-
-
- /*
- |--------------------------------------------------------------------------
- | Sidblock
- |--------------------------------------------------------------------------
- |
- | Parts are stored in the database.
- | resources/views/studio/edit-link.blade.php
- |
- */
-
- # fördefinierat
- 'block.title.predefined' => 'Förinställd Sida',
- 'block.description.predefined' => 'Välj från en lista över förinställda webbplatser och låt din länk automatiskt stilhanteras med hjälp av webbplatsens färger och ikon.',
-
- # länk
- 'block.title.link' => 'Egen Länk',
- 'block.description.link' => 'Skapa en egen länk som leder till valfri webbplats. Anpassa knappens stil och ikon, eller använd webbplatsens favicon som knappens ikon.',
-
- # vcard
- 'block.title.vcard' => 'Vcard',
- 'block.description.vcard' => 'Skapa eller ladda upp ett elektroniskt visitkort.',
-
- # email
- 'block.title.email' => 'E-Mail adress',
- 'block.description.email' => 'Lägg till en mailadress som öppnar enhetens standardapp för att skriva ett mail till den adressen.',
-
- # telefon
- 'block.title.telephone' => 'Telefonnummer',
- 'block.description.telephone' => 'Lägg till ett telefonnummer som öppnar enhetens standardapp för att ringa till det numret.',
-
- # rubrik
- 'block.title.heading' => 'Rubrik',
- 'block.description.heading' => 'Använd rubriker för att organisera dina länkar och dela in dem i grupper.',
-
- # Tomrum
- 'block.title.spacer' => 'Tomrum',
- 'block.description.spacer' => 'Lägg till tomrum i din länklista. Du kan ställa in höjden.',
-
- # text
- 'block.title.text' => 'Text',
- 'block.description.text' => 'Lägg till fast text som ej går att klicka på.',
-
-
- /*
- |--------------------------------------------------------------------------
- | Sidobjekt
- |--------------------------------------------------------------------------
- |
- | resources/views/components/pageitems/
- |
- */
-
- 'Default Email' => 'Standardmail',
- 'Custom Title' => 'Egen Titel',
- 'Leave blank for default title' => 'Lämna fältet tomt för standardtitel',
- 'E-Mail address' => 'Mailadress',
- 'Enter your E-Mail' => 'Ange din E-Mail',
-
- 'Heading Text:' => 'Rubriktext:',
-
- 'URL' => 'URL',
- 'Show website icon on button' => 'Visa webbplatsens ikon på knappen',
-
- 'Select a predefined site' => 'Välj en förinställd sida',
- 'Enter the link URL' => 'Ange länkens URL',
-
- 'Spacing height' => 'Tomrumshöjd',
-
- 'Phone' => 'Telefon',
- 'Telephone number' => 'Telefonnummer',
- 'Enter your telephone number' => 'Ange ditt telefonnummer',
-
- 'Text to display' => 'Text att visa',
-
- 'Vcard' => 'Vcard',
- 'First Name' => 'Förnamn',
- 'Middle Name' => 'Mellannamn',
- 'Last Name' => 'Efternamn',
- 'Suffix' => 'Suffix',
- 'Work' => 'Arbete',
- 'Organization' => 'Organisation',
- 'Work URL' => 'URL till arbete',
- 'Emails' => 'Email',
- 'Enter your personal email' => 'Ange din personliga email',
- 'Work Email' => 'Email till arbete',
- 'Enter your work email' => 'Ange ditt arbetes email',
- 'Phones' => 'Telefoner',
- 'Home Phone' => 'Hemtelefon',
- 'Work Phone' => 'Jobbtelefon',
- 'Cell Phone' => 'Mobiltelefon',
- 'Home Address' => 'Hemadress',
- 'Label' => 'Etikett',
- 'Street' => 'Gata',
- 'City' => 'Stad',
- 'State/Province' => 'Landskap',
- 'Zip/Postal Code' => 'Postkod',
- 'Country' => 'Land',
- 'Work Address' => 'Jobbadress',
-
- 'URL to the video' => 'URL till videon',
-
-
- /*
- |--------------------------------------------------------------------------
- | Underhållssida
- |--------------------------------------------------------------------------
- |
- | resources/views/mainenance.blade.php
- |
- */
-
- 'Maintenance Mode' => 'Underhållsläge',
- 'We are performing scheduled site maintenance at this time' => 'Vi utför schemalagt underhåll av webbplatsen för tillfället.',
- 'Please check back with us later' => 'Återkom vänligen senare.',
- 'Admin options:' => 'Administratörsalternativ:',
- 'Turn off' => 'Inaktivera',
- 'Warn.Disable.Maintenance' => 'Du är på väg att inaktivera Underhållsläget. Är du säker?',
-
-
- /*
- |--------------------------------------------------------------------------
- | LinkStack (Länk-sida)
- |--------------------------------------------------------------------------
- |
- | resources/views/littlelink.blade.php
- |
- */
-
- 'Share this page' => 'Dela den här sidan',
- 'Share' => 'Dela',
- 'Copy URL to clipboard' => 'Kopiera URL',
- 'URL has been copied to your clipboard!' => 'URL:en har kopierats till ditt urklipp!',
-
-
- 'Delete User' => 'Radera användare',
- 'Block User' => 'Blockera användare',
- 'Users Theme' => 'Tema',
- 'Search User' => 'Leta upp användare',
-
- 'Edit my profile' => 'Redigera min profil',
-
-
- /*
- |--------------------------------------------------------------------------
- | Sidfot
- |--------------------------------------------------------------------------
- |
- | Added to the bottom of certain pages.
- | resources/views/layouts/footer.blade.php
- |
- */
-
- 'Learn more about LinkStack' => 'Lär dig mer om LinkStack',
- 'Learn more' => 'Lär dig mer',
-
- /*
- |--------------------------------------------------------------------------
- | Notismeddelanden
- |--------------------------------------------------------------------------
- |
- | All internal notifications.
- | resources/views/layouts/notifications.blade.php
- |
- */
-
- 'No notifications' => 'No notifications',
-
- # Säkerhetsnotis
- 'Your security is at risk!' => 'Din säkerhet riskeras!',
- 'Immediate action is required!' => 'Omedelbar handling krävs!',
- 'security.msg1' => 'Din säkerhet riskeras.',
- 'security.msg2' => 'Vissa filer kan nås av utomstående. Omedelbar handling krävs!',
- 'security.msg3' => 'Vissa viktiga filer kan nås av allmänheten, detta sätter din säkerhet på spel. Vänligen ta omedelbart handling för att dra in allmän tillgång till dessa filer för att förhindra obehörig tillgång till känslig information.',
- 'security.msg4' => 'Lär dig mer',
-
- # "Hjälp oss"-notis
- 'Hide this notification' => 'Dölj den här notisen',
- 'Help Us Out' => 'Hjälp Oss',
- 'Enjoying Linkstack?' => 'Gillar du LinkStack?',
- 'Support Linkstack' => 'Stöd LinkStack',
- 'support.msg1' => 'Om du har fått nöje av att använda LinkStack, så skulle vi verkligen uppskatta om du kunde',
- 'support.msg2' => 'stjärnmarkera projektet på GitHub',
- 'support.msg3' => 'Ditt stöd hjälper oss nå en bredare publik och förbättrar kvalitén på vårt projekt.',
- 'support.msg4' => 'Om du har möjlighet att',
- 'support.msg5' => 'stödja oss finansiellt, så skulle även en liten summa hjälpa oss att täcka kostnaderna för underhåll och förbättring av LinkStack.',
- 'support.msg6' => 'Tack för ditt stöd och för att du är en del av LinkStacks gemenskap!',
-
-
- /*
- |--------------------------------------------------------------------------
- | Sidfotslänkar
- |--------------------------------------------------------------------------
- |
- */
-
- 'footer.Home' => 'Hem',
- 'footer.Terms' => 'Villkor',
- 'footer.Privacy' => 'Integritet',
- 'footer.Contact' => 'Kontakt',
-
-
- /*
- |--------------------------------------------------------------------------
- | Rapportsida
- |--------------------------------------------------------------------------
- |
- */
-
- 'report_violation' => 'Rapportera missbruk',
- 'url_label' => 'URL till sidan du vill rapportera',
- 'report_type_label' => 'Typ av rapport',
- 'hate_speech' => 'Hets mot folkgrupp eller trakasseri',
- 'violence_threats' => 'Våld eller hot',
- 'illegal_activities' => 'Olagliga aktiviteter',
- 'copyright_infringement' => 'Missbruk av upphovsrätt',
- 'misinformation_fake_news' => 'Desinformation',
- 'identity_theft' => 'Identitetsstöld',
- 'drug_related_content' => 'Drogrelaterat innehåll',
- 'weapons_harmful_objects' => 'Vapen eller farliga objekt',
- 'child_exploitation' => 'Utnyttjande av barn',
- 'fraud_scams' => 'Bedrägeri',
- 'privacy_violation' => 'Integritetskränkning',
- 'impersonation' => 'Personifiering',
- 'other_specify' => 'Annat (specifiera)',
- 'additional_comments_label' => 'Övriga kommentarer',
- 'submit_button' => 'Skicka',
-
-
- 'report_mail_admin_subject' => 'Profilrapport',
- 'report_mail_admin_report' => 'En profil har rapporterats',
-
- 'report_mail_reported_profile' => 'Rapporterad profil',
- 'report_mail_reported_url' => 'Rapporterad URL',
- 'report_mail_type' => 'Typ',
- 'report_mail_message' => 'Meddelande',
-
- 'report_mail_report_submitted_by' => 'Rapport inskickad av',
- 'report_mail_reported_by' => 'Rapporterad av',
- 'report_mail_profile' => 'Profil',
-
- 'report_mail_button_profile' => 'Visa på användarens sida',
- 'report_mail_button_delete' => 'Radera användarrapport',
-
-
- 'report_error' => 'Profilen kunde inte rapporteras',
- 'report_success' => 'Profilen har rapporterats',
-
-
- #=============================================================================#
- # Laravel internal translations #
- #=============================================================================#
-
-
- /*
- |--------------------------------------------------------------------------
- | Authentication Language Lines
- |--------------------------------------------------------------------------
- |
- | The following language lines are used during authentication for various
- | messages that we need to display to the user. You are free to modify
- | these language lines according to your application's requirements.
- |
- */
-
- 'failed' => 'Dessa värden stämmer inte överens med vår data.',
- 'password' => 'Det angiivna lösenorder är ej korrekt.',
- 'throttle' => 'För många inloggningsförsök. Vänligen försök igen om :seconds sekunder.',
-
-
- /*
- |--------------------------------------------------------------------------
- | Pagination Language Lines
- |--------------------------------------------------------------------------
- |
- | The following language lines are used by the paginator library to build
- | the simple pagination links. You are free to change them to anything
- | you want to customize your views to better match your application.
- |
- */
-
- 'previous' => '« Föregående',
- 'next' => 'Nästa »',
-
-
-];
+ 'Logga in',
+ 'Register' => 'Registrera',
+
+ 'Dashboard' => 'Panel',
+ 'Copyright' => 'Upphovsrätt',
+ 'Made with' => 'Skapad med',
+ 'by' => 'av',
+
+ 'HOME.MESSAGE' => '
+
Få grepp om din onlineprofil med LinkStack,
+ en länkplattform med integritet och öppen källkod. Skapa en anpassningsbar profil för att hantera
+ dina viktigaste länkar på ett och samma ställe och ge din omgivning en sömlös surfupplevelse.
+ ',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Demosida/Hemsidoexempel
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/demo.blade.php
+ |
+ */
+
+ 'Example page' => 'Exempelsida',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Verifikationssidor
+ |--------------------------------------------------------------------------
+ |
+ | Inlogg, registration, glömt lösenord etc.
+ | Detta inkluderar verifikationsmail som lösenåterställning och mailbekräftelse.
+ | resources/views/auth
+ |
+ */
+
+ # Inloggningssida
+ 'Sign In' => 'Logga in',
+ 'Login to stay connected' => 'Logga in för att hålla dig uppkopplad',
+ 'Email' => 'Email',
+ 'Password' => 'Lösenord',
+ 'Remember Me' => 'Kom ihåg mig',
+ 'Forgot Password?' => 'Glömt Lösenord?',
+ 'or sign in with other accounts?' => 'eller logga in med andra konton?',
+ 'Don’t have an account?' => 'Har du inget konto?',
+ 'Click here to sign up' => 'Klicka här för att registrera dig',
+
+
+ # Återställ Lösenord
+ 'Forgot your password?' => 'Glömt ditt lösenord?',
+ 'No problem' => 'Inga problem. Ange din mailadress så skickar vi en länk för att återställa ditt lösenord.',
+ 'Email Password Reset Link' => 'Maila Lösenordsåterställning',
+
+
+ # Registreringssida
+ 'Sign Up' => 'Registrera',
+ 'Register to stay connected' => 'Registrera dig för att hålla dig uppkopplad',
+ 'Display Name' => 'Visningsnamn',
+ 'Confirm Password' => 'Bekräfta lösenord',
+ 'Already have an account?' => 'Har du redan ett konto?',
+ 'Click here to sign in' => 'Klicka här för att logga in',
+
+
+ # Väntar verifikation från admin
+ 'Verification Status' => 'Verifieringsstatus',
+ 'auth_pending' => 'itt konto väntar fortfarande på verifiering',
+ 'auth_unverified' => 'Ditt konto är för närvarande overifierat och kräver manuell verifiering av en administratör.',
+ 'Log out' => 'Logga ut',
+
+
+ # Lösenordsbekräftelse
+ 'auth_password' => 'Detta är ett säkert område av applikationen. Vänligen bekräfta ditt lösenord innan du fortsätter.',
+ 'Confirm' => 'Bekräfta',
+
+
+ # Lösenordsåterställning
+ 'Reset Password' => 'Återställ lösenord',
+ 'Enter a new password' => 'Ange ett nytt lösenord',
+
+
+ # Testa e-mail
+ 'Test E-Mail' => 'Testa E-Mail',
+
+
+ # Registreringsnotis via mail
+ 'A new user has registered on' => 'En ny användare har registrerat sig på',
+ 'and is awaiting verification' => 'och väntar på verifiering',
+ 'The user' => 'Användaren',
+ 'with the email' => 'med mailadressen',
+ 'has registered a new account on' => 'har registrerat ett nytt konto på',
+ 'and is awaiting confirmation by an admin' => 'och väntar på bekräftelse från en administratör.',
+ 'Click' => 'Klicka',
+ 'here' => 'här',
+ 'to verify the user' => 'för att verifiera användaren.',
+ 'Manage Users' => 'Hantera användare',
+
+
+ # Maila bekräftelsemail
+ 'auth_thanks' => 'Tack för att du registrerade dig! Innan du börjar, kan du verifiera din e-mailadress genom att klicka på länken vi just skickade till dig via e-mail? Om du inte har fått e-mailmeddelandet skickar vi gärna ett till. Om du inte ser e-mailmeddelandet inom några minuter, kontrollera din skräppost.',
+ 'auth_verification' => 'En ny bekräftelselänk har skickats till mailadressen du angav under registreringen.',
+ 'Resend Verification Email' => 'Skicka verifieringsmail igen',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Anpassning Sidofält
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/layouts/sidebar.blade.php
+ |
+ */
+
+ 'Settings' => 'Inställningar',
+ 'Scheme' => 'Schema',
+ 'Auto' => 'Auto',
+ 'Dark' => 'Mörkt',
+ 'Light' => 'Ljust',
+ 'Color Customizer' => 'Färganpassare',
+ 'Sidebar Color' => 'Färg på Sidofältet',
+ 'Default' => 'Standard',
+ 'Color' => 'Färg',
+ 'Transparent' => 'Genomskinlig',
+ 'Sidebar Types' => 'Typer av Sidofält',
+ 'Mini' => 'Mini',
+ 'Hover' => 'Sväva',
+ 'Boxed' => 'Boxad',
+ 'Sidebar Active Style' => 'Aktiv stil i sidofältet',
+ 'Rounded One Side' => 'Rundad på en sida',
+ 'Rounded All' => 'Rundad på alla sidor',
+ 'Pill One Side' => 'Piller på en sida',
+ 'Pill All' => 'Piller på alla sidor',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Anpassning
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/site.blade.php
+ |
+ */
+
+ 'Home' => 'Hem',
+ 'Add Link' => 'Lägg till länk',
+ 'Administration' => 'Administration',
+ 'Admin' => 'Admin',
+ 'Config' => 'Konfiguration',
+ 'Footer Pages' => 'Sidfötter',
+ 'Site Customization' => 'Webbplatsanpassning',
+ 'Site Logo' => 'Webbplatsens logga',
+ 'Personalization' => 'Anpassning',
+ 'Links' => 'Länkar',
+ 'Appearance' => 'Utseende',
+ 'Themes' => 'Teman',
+ 'Site logo' => 'Webbplatsens logga',
+ 'Favicon' => 'Favicon',
+ 'Home message' => 'Hemmedelande',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Navbar
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/layouts/sidebar.blade.php
+ |
+ */
+
+ 'View Page' => 'Visa Sida',
+ 'Share your profile' => 'Dela din profil',
+ 'Share your profile:' => 'Dela din profil:',
+ 'Error sharing:' => 'Fel vid delning:',
+ 'Text copied to clipboard!' => 'Text kopierad till urklipp!',
+ 'Error copying text:' => 'Fel vid kopiering av text:',
+ 'QR Code' => 'QR-kod',
+ 'Scan QR Code' => 'Skanna QR-kod',
+ 'QR code could not be generated' => 'QR-kod kunde inte skapas',
+ 'Reason:' => 'Anledning:',
+
+ # QR-kod-meny
+ 'Close' => 'Stäng',
+ 'Dismiss' => 'Avvisa',
+
+ # Notis-meny
+ 'All Notifications' => 'Alla Notiser',
+
+ # Uppdateringsmeny
+ 'Updater' => 'Uppdaterare',
+ 'Beta Mode' => 'Beta-läge',
+ 'Local version' => 'Lokal version',
+ 'Latest beta' => 'Senaste beta',
+ 'Run updater' => 'Kör uppdaterare',
+ 'Update available' => 'Uppdatering tillgänglig',
+ 'Up to date' => 'Senaste version installerad',
+ 'Check again' => 'Kontrollera igen',
+
+ # Användarsektion i navbar
+ 'Administrator' => 'Administratör',
+ 'Verified user' => 'Verifierad användare',
+ 'User' => 'Användare',
+ 'Profile' => 'Profil',
+ 'Styling' => 'Formgivning',
+ 'Logout' => 'Logga ut',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Panelsida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/index.blade.php
+ |
+ */
+
+ # Header med bild
+ 'Hi' => 'Hej',
+ 'stranger' => 'främling',
+ 'welcome' => 'Välkommen till :appName!',
+ 'Set a handle' => 'Ställ in användarnamn',
+
+ # Panelsida
+ 'Total Links:' => 'Totalt antal länkar:',
+ 'Link Clicks:' => 'Länkklick:',
+ 'View/Edit Links' => 'Visa/Redigera Länkar',
+ 'Top Links:' => 'Topplänkar:',
+ 'You haven’t added any links yet' => 'Du har inte lagt till några länkar än.',
+ 'clicks' => 'klick',
+ 'Clicks' => 'Klick',
+ 'Site statistics:' => 'Sidostatistik:',
+ 'Total links' => 'Totalt antal länkar',
+ 'Total clicks' => 'Antal klick',
+ 'Total users' => 'Totalt antal användare',
+ 'Registrations:' => 'Registrationer:',
+ 'Last 30 days' => 'Sista 30 dagarna',
+ 'Last 7 days' => 'Sista 7 dagarna',
+ 'Last 24 hours' => 'Sista 24 timmarna',
+ 'Active users:' => 'Aktiva användare:',
+
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Knappredigerare
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/button-editor.blade.php
+ |
+ */
+
+ 'Button Editor' => 'Knappredigerare',
+ 'Back' => 'Tillbaka',
+ 'Custom Button' => 'Egenanpassad Knapp',
+ 'CSS' => 'CSS',
+ 'background' => 'bakgrund',
+ 'gradient' => 'övertoning',
+ 'Show CSS' => 'Visa CSS',
+ 'Custom CSS' => 'Egen CSS',
+ 'Save' => 'Spara',
+ 'Reset to default' => 'Återställ till standard',
+ 'Result' => 'Resultat:',
+ 'Custom Icon' => 'Anpassad Ikon',
+ 'Custom Alert' => 'Din anpassade ikons shortcode innehåller inte "fa-". Använd alltid ikoner i följande format: fa-ghost, till exempel.',
+ 'cb.description.1-4' => 'Anpassade ikoner kan tillämpas knappar via Font Awesome. Du kan använda vilken ikon du vill från listan nedan, du kan nå den här listan genom att klicka på "Se alla ikoner"-knappen. Varje ikon på den listan har en shortcode, som du kan klistra in i "Anpassad Ikon"-fältet.',
+ 'cb.description.2-4' => 'Varje ikons shortcode består av ett prefix och en huvuddel. Om shortcoden inte representerar ett märke, så kan du skriva koden i följande format: fa-ikon-namn. Formatteringen "fa-..." har betydelse. Till exempel "fa-kod".',
+ 'cb.description.3-4' => 'Om shortcoden representerar ett märke, så är det viktigt att inkludera "fab" som prefix. "fa-..."-formatteringen gäller fortfarande här. Till exempel, "fab fa-github"',
+ 'cb.description.4-4' => 'För att tillämpa färg till dina ikoner, så kan du enkelt fylla i färgnamnet eller HEX-värdet innan ikonen, följt av ";". Det är viktigt att färgen definieras innan ikonen. Färgkoden måste avslutas med semikolon. En lista med tillgängliga färger finns här.',
+ 'Style' => 'Stil',
+ 'Prefix' => 'Prefix',
+ 'Icon' => 'Ikon',
+ 'Short Code' => 'Shortcode',
+ 'Regular' => 'Standard',
+ 'Brands' => 'Märken',
+ 'Color name' => 'färg_namn',
+ 'Color HEX' => 'Färg HEX',
+ 'Color HEX1' => 'Färg HEX',
+ 'Update icon' => 'Uppdatera ikon',
+ 'See all icons' => 'Se alla ikoner',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Ändra länksida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/edit-link.blade.php
+ |
+ */
+
+ 'Edit' => 'Redigera',
+ 'Add' => 'Lägg till',
+ 'Block' => 'Block',
+ 'Blocks' => 'Block: ',
+ 'Select Block' => 'Välj Block ',
+ 'Toggle Dropdown' => 'Växla Meny',
+ 'Cancel' => 'Avbryt',
+ 'Save and Add More' => 'Spara och lägg till fler',
+ 'Click to change link blocks' => 'Klicka för att ändra länkblock',
+ 'Click for a list of available link blocks' => 'Klicka för en lista med tillgängliga länkblock',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Länksida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/links.blade.php
+ |
+ */
+
+ 'My Links' => 'Mina Länkar',
+ 'Add new Link' => 'Lägg till ny Länk',
+ 'No Link Added' => 'Du har inte lagt till några länkar än.',
+ 'Download' => 'Ladda ner',
+ 'Preview' => ' Förhandsvisning:',
+ 'No compatible browser' => 'Din webbläsare är ej kompatibel',
+ 'Page Icons' => 'Sidikoner',
+ 'Save links' => 'Spara länkar',
+
+ # Tooltips
+ 'Customize' => 'Anpassa',
+ 'Delete' => 'Radera',
+ 'Clear icon cache' => 'Rensa cacheminne för ikoner',
+
+ 'confirm_delete' => 'Är du säker på att du vill radera :title?',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | "Min Profil"/Utseendesida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/page.blade.php
+ |
+ */
+
+ 'My Profile'=> 'Min Profil',
+ 'Profile Picture' => 'Profilbild',
+ 'Page URL' => 'Sido-URL',
+ 'Display name' => 'Visningsnamn',
+ 'Name:' => 'Namn:',
+ 'Page Description' => 'Sidobeskrivning',
+ 'Show checkmark' => 'Visa verifieringsbock',
+ 'disableverified' => 'Du är en verifierad användare. Med den här inställningen kan du dölja din verifieringsbock.',
+ 'Show share button' => 'Visa delningsknapp',
+ 'disablesharebutton' => 'Med den här inställningen kan du dölja knappen för att dela din profil.',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Personlig inställningssida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/profile.blade.php
+ |
+ */
+
+ 'Account Settings' => 'Kontoinställningar',
+ 'Change email' => 'Ändra email',
+ 'Change password' => 'Ändra lösenord',
+ 'Export user data' => 'Exportera användardata',
+ 'Export your user data' => 'Exportera din användardata för att föra över till en annan instans.',
+ 'Export all data' => 'Exportera all data',
+ 'Export links only' => 'Exportera enbart länkar',
+ 'Import user data' => 'Importera användardata',
+ 'import.user.alert' => 'Är du säker på att du vill importera den här filen? Detta kommer att ersätta all nuvarande data, inklusive länkar!',
+ 'Import your user data from another instance' => 'Importera din användardata från en annan instans.',
+ 'Import' => 'Importera',
+ 'Delete your account' => 'Radera ditt konto',
+ 'You are about to delete' => 'Du är på väg att radera ditt konto!',
+ 'You are about to delete This action cannot be undone' => 'Du är på väg att radera ditt konto! Det är en permanent ändring och går ej att återställa.',
+ 'Delete account' => 'Radera konto',
+
+ # Alerts
+ 'Profile updated successfully!' => 'Profilen uppdaterades!',
+ 'An error occurred while updating your profile.' => 'Ett fel uppstod medans din profil uppdaterades.',
+
+ 'That handle has already been taken' => 'Det angivna användarnamnet är upptaget.',
+ 'The selected file must be an image' => 'Den valda filen måste bestå av en bild.',
+ 'The image must be' => 'Bilden måste:',
+ 'The image size should not exceed 2MB' => 'Bildstorleken bör ej överskrida 2MB.',
+ 'Please select an image' => 'Vänligen välj en bild.',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Tema-anpassningssida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/theme.blade.php
+ |
+ */
+
+ 'Select a theme' => 'Välj ett tema',
+ 'Select theme' => 'Välj tema',
+ 'Custom background' => 'Egen bakgrund',
+ 'No image selected' => 'Ingen bild vald',
+ 'Remove background' => 'Radera bakgrund',
+ 'Manage themes' => 'Hantera teman',
+ 'Loading...' => 'Laddar...',
+ 'Upload themes' => 'Ladda upp teman',
+ 'Delete themes' => 'Radera teman',
+ 'Download themes' => 'Ladda ner teman',
+ 'Delete a theme' => 'Radera ett tema',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Temauppdaterare
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/studio/theme-updater.blade.php
+ |
+ */
+
+ 'Theme Updater' => 'Temauppdaterare',
+ 'Theme name' => 'Temanamn:',
+ 'Update status' => 'Uppdateringsstatus:',
+ 'Version' => 'Version:',
+ 'Error!' => 'Fel!',
+ 'Update manually' => 'Uppdatera manuellt',
+ 'Update all themes' => 'Uppdatera alla teman',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Hantera Användare
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/edit-user.blade.php
+ |
+ */
+
+ 'Edit User' => 'Redigera Användare',
+ 'Logo' => 'Logga',
+ 'Page description' => 'Sidbeskrivning',
+ 'Role' => 'Roll',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Länksida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/links.blade.php
+ |
+ */
+
+ 'Title' => 'Titel',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Länksida (Admin)
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/links.blade.php
+ |
+ */
+
+ 'Link' => 'Länk',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | PHP info-sida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/phpinfo.blade.php
+ |
+ */
+
+ 'Information about PHP’s configuration' => 'Information om PHP:s konfiguration',
+ 'Outputs information about the current state of PHP' => 'Visar information om PHP:s nuvarande tillstånd',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Radera teman
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/theme.blade.php
+ |
+ */
+
+ 'Delete theme' => 'Radera tema',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Hantera Användare
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/panel/users.blade.php
+ |
+ */
+
+ 'Users:' => 'Användare:',
+ 'Search user' => 'Sök användare',
+ 'ID' => 'ID',
+ 'Name' => 'Namn',
+ 'E-Mail' => 'E-Mail',
+ 'Page' => 'Sida',
+ 'Created at' => 'Skapad',
+ 'Last seen' => 'Senast sedd',
+ 'Status' => 'Status',
+ 'Action' => 'Handling',
+ 'N/A' => 'Otillgänglig',
+ 'Pending' => 'Väntar',
+ 'Verified' => 'Verifierad',
+ 'Approved' => 'Godkänd',
+ 'Add new user' => 'Lägg till ny användare',
+
+ # Tooltips
+ 'tt.Delete' => 'Radera',
+ 'tt.Impersonate' => 'Imitera',
+ 'tt.Edit' => 'Redigera',
+ 'tt.All links' => 'Alla länkar',
+
+ 'confirm.delete.user' => 'Är du säker på att du vill ta bort den här användaren? \nDetta är permanent!',
+
+ # Datumformat
+ 'date.format' => 'd/m/Å',
+
+ 'days ago' => 'dagar sedan',
+ '1 day ago' => '1 dag sedan',
+ 'Today' => 'Idag',
+ '1 year ago' => '1 år sedan',
+ 'years ago' => 'år sedan',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Konfigurationssida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/components/config/
+ | resources/views/panel/config-editor.blade.php
+ |
+ */
+
+ 'Advanced Config' => 'Avancerad Konfiguration',
+ 'Take Backup' => 'Skapa Backup',
+ 'All Backups' => 'Alla Backups',
+ 'Diagnosis' => 'Diagnos',
+
+ 'Alternative Config Editor' => 'Alternativ Konfigurationsredigerare',
+ 'Use the Alternative Config Editor to edit the config directly' => 'Använd den Alternativa Konfigurationsredigeraren för att redigera konfigurationen direkt',
+
+ 'PHP info' => 'PHP info',
+ 'Display debugging information about your PHP setup' => 'Visa felsökningsinformation om din PHP-instans',
+
+ 'Jump directly to:' => 'Hoppa direkt till:',
+
+ 'Application' => 'Applikation',
+ 'Panel settings' => 'Panelinställningar',
+ 'Security' => 'Säkerhet',
+ 'Advanced' => 'Avancerat',
+ 'SMTP' => 'SMTP',
+ 'Footer links' => 'Sidfotslänkar',
+ 'Debug' => 'Felsök',
+ 'Language' => 'Språk',
+
+ 'default' => 'standard',
+ 'Apply' => 'Verkställ',
+
+ 'AC.description' => 'Tillåter redigering av webbplatsens frontsystem. Bl.a. tillåter den här filen redigering av: Hemsida, länkar, titlar, Google Analytics och meta-taggar.',
+ 'Advanced Configuration file.' => 'Avancerad konfigurationsfil.',
+ 'Restore defaults' => 'Återställ till standard',
+
+ 'Backup' => 'Backup',
+ 'You can back up your entire instance:' => 'Du kan skapa en backup av hela din instans:',
+ 'The backup system won’t save more than two backups at a time' => 'Backupsystemet sparar ej fler än två backups åt gången.',
+ 'Backup Instance' => 'Skapa Backup av Instans',
+
+ 'wtrue' => 'Allt fungerar som avsett!',
+ 'wfalse' => 'Den här filen kan ej skrivas till. Detta kan förhindra normal drift.',
+ 'utrue' => 'En säkerhetsrisk har upptäckts. Den här filen kan nås av utomstående. Omedelbar handling krävs!',
+ 'ufalse' => 'Allt fungerar som avsett!',
+ 'unull' => 'Något gick fel. Detta kan vara normalt om instansen ligger bakom en proxy eller en docker-container.',
+ 'Debugging information' => 'Felsökningsinformation',
+ 'security.risk' => 'En säkerhetsrisk har upptäckts. Den här filen kan nås av utomstående. Omedelbar handling krävs! Klicka på detta meddelande för mer information.',
+ 'security.risk.1-3' => 'Här kan du enkelt kontrollera om kritiska systemfiler kan nås av utomstående. Det är viktigt att ingen utomstående kan nå filerna, annars kan användardata som lösenord läckas. Fält markerade med ett',
+ 'security.risk.2-3' => 'kan ej nås av utomstående, fält markerade med ett',
+ 'security.risk.3-3' => 'kan nås av vem som helst och kräver omedelbar handling för att skydda din data.',
+ 'Hover for more' => 'Sväva för mer',
+ 'Write access' => 'Skrivåtkomst',
+ 'Write access.description.1-3' => 'Här kan du enkelt kontrollera om viktiga systemfiler har skrivåtkomst. Detta är viktigt för att alla funktioner ska fungera som tänkt. Fält markerade med ett',
+ 'Write access.description.2-3' => 'fungerar som avsett, fält markerade med ett',
+ 'Write access.description.3-3' => 'fungerar inte som avsett.',
+ 'File' => 'Fil',
+ 'Dependencies' => '',
+ 'Required PHP modules' => 'Obligatoriska PHP-moduler.',
+ 'PHP Extension' => 'PHP-tillägg',
+ 'No backups found' => 'Ingen backup hittad',
+ 'Backup your instance' => 'Skapa Backup av din instans',
+
+ 'Go back' => 'Gå tillbaka',
+
+ 'Strings with a # in front of them are comments and wont affect anything' => 'Teckensträngar med # framför dem är kommentarer och påverkar ingenting.',
+
+ 'Download your updater backups:' => 'Ladda ner backups från uppdateraren:',
+ 'The server will never store more that two backups at a time' => 'Servern lagrar aldrig fler än två backups åt gången.',
+
+ 'SMTP.title' => 'Använd inbyggd SMTP-server',
+ 'SMTP.description' => 'Använder LinkStacks egna SMTP-server. Är ej nödvändigtvis 100% pålitlig. Måste inaktiveras för att använda en egen SMTP-server.',
+ 'SMTP.description.alt' => '(Spara ändringar med "Verkställ ändringar" nedan)',
+ 'Enable' => 'Aktivera',
+ 'Custom SMTP server:' => 'Egen SMTP-server:',
+ 'Host' => 'Värd',
+ 'Port' => 'Port',
+ 'Username' => 'Användarnamn',
+ 'Encryption type' => 'Krypteringstyp',
+ 'From address' => 'Från-adress',
+ 'Apply changes' => 'Verkställ ändringar',
+ 'Test E-Mail setup:' => 'Testa E-Mail-konfiguration:',
+ 'Send Test E-Mail' => 'Skicka Testmail',
+
+ 'Debug.title' => 'Felsökningsläge',
+ 'Debug.description' => 'Bör inaktiveras i produktion. Användbar vid felsökning under uppstart.',
+
+ 'DISPLAY_FOOTER_HOME.title' => 'Sidfotslänk hemsida',
+ 'DISPLAY_FOOTER_HOME.description' => 'Aktivera sidfot på hemsidan.',
+ 'REGISTER_AUTH.title' => 'Aktivera mailverifikation',
+ 'REGISTER_AUTH.description' => 'Avgör om användare måste bekräfta sin email när de registrerar sig.',
+ 'ALLOW_REGISTRATION.title' => 'Aktivera registrering',
+ 'ALLOW_REGISTRATION.description' => 'Avgör om användare kan registrera sig till din instans.',
+ 'NOTIFY_EVENTS.title' => 'Notis vid händelser',
+ 'NOTIFY_EVENTS.description' => 'Visar en notis när något händer.',
+ 'NOTIFY_UPDATES.title' => 'Notis vid uppdatering',
+ 'NOTIFY_UPDATES.description' => 'Visar en notis om en ny uppdatering finns tillgänglig.',
+ 'DISPLAY_FOOTER.title' => 'Visa sidfot',
+ 'DISPLAY_FOOTER.description' => 'Avgör om sidfotslänkar ska visas.',
+ 'DISPLAY_CREDIT.title' => 'Visa källhänvisning på användarsidor',
+ 'DISPLAY_CREDIT.description' => 'Avgör om källhänvisningen ska visas på användarsidor.',
+ 'DISPLAY_CREDIT_FOOTER.title' => 'Visa källhänvisning i sidfot',
+ 'DISPLAY_CREDIT_FOOTER.description' => 'Avgör om källhänvisningen ska visas i sidfötterna.',
+ 'HOME_URL.title' => 'Ställ in användarsida som Hemsida',
+ 'HOME_URL.description' => 'Ställer in användarsida som hemsida. Detta flyttar den vanliga hemsidan till example.com/home.',
+ 'ALLOW_USER_HTML.title' => 'Tillåt utökad syntax i användares biografier',
+ 'ALLOW_USER_HTML.description' => 'Detta tillåter användare att tillämpa speciell formattering som rubriker och länkar i deras sidobiografi. Detta anses generellt vara säkert.',
+ 'APP_NAME.title' => 'Applikationstitel',
+ 'APP_NAME.description' => 'Avgör titeln på din app. Ändring av detta värde loggar ut alla aktiva användare.',
+ 'APP_KEY.title' => 'APP_KEY',
+ 'APP_KEY.description' => 'APP_KEY',
+ 'APP_URL.title' => 'APP_URL',
+ 'APP_URL.description' => 'APP_URL',
+ 'ENABLE_BUTTON_EDITOR.title' => 'Aktivera Knappredigerare',
+ 'ENABLE_BUTTON_EDITOR.description' => 'Avgör om användare får anpassa sina egna knappar med hjälp av CSS.',
+ 'APP_DEBUG.title' => 'APP_DEBUG',
+ 'APP_DEBUG.description' => 'APP_DEBUG',
+ 'APP_ENV.title' => 'APP_ENV',
+ 'APP_ENV.description' => 'APP_ENV',
+ 'LOG_CHANNEL.title' => 'LOG_CHANNEL',
+ 'LOG_CHANNEL.description' => 'LOG_CHANNEL',
+ 'LOG_LEVEL.title' => 'LOG_LEVEL',
+ 'LOG_LEVEL.description' => 'LOG_LEVEL',
+ 'MAINTENANCE_MODE.title' => 'Aktivera Underhållsläge',
+ 'MAINTENANCE_MODE.description' => 'Visar att underhåll pågår på alla publika sidor. Detta inaktiverar även inloggningssidorna.',
+ 'MAIL_MAILER.title' => 'MAIL_MAILER',
+ 'MAIL_MAILER.description' => 'MAIL_MAILER',
+ 'MAIL_HOST.title' => 'MAIL_HOST',
+ 'MAIL_HOST.description' => 'MAIL_HOST',
+ 'MAIL_PORT.title' => 'MAIL_PORT',
+ 'MAIL_PORT.description' => 'MAIL_PORT',
+ 'MAIL_USERNAME.title' => 'MAIL_USERNAME',
+ 'MAIL_USERNAME.description' => 'MAIL_USERNAME',
+ 'MAIL_PASSWORD.title' => 'MAIL_PASSWORD',
+ 'MAIL_PASSWORD.description' => 'MAIL_PASSWORD',
+ 'MAIL_ENCRYPTION.title' => 'MAIL_ENCRYPTION',
+ 'MAIL_ENCRYPTION.description' => 'MAIL_ENCRYPTION',
+ 'MAIL_FROM_ADDRESS.title' => 'MAIL_FROM_ADDRESS',
+ 'MAIL_FROM_ADDRESS.description' => 'MAIL_FROM_ADDRESS',
+ 'JOIN_BETA.title' => 'Gå med i beta-programmet',
+ 'JOIN_BETA.description' => 'Aktiverar betaversioner vid uppdatering. Läs mer om detta här.',
+ 'SKIP_UPDATE_BACKUP.title' => 'Skippa backup vid uppdatering',
+ 'SKIP_UPDATE_BACKUP.description' => 'Skippar backups vid uppdatering. Detta alternativ rekommenderas att alltid vara inaktiverat, men kan i vissa konfigurationer skapa problem.',
+ 'CUSTOM_META_TAGS.title' => 'Aktivera egna meta-taggar',
+ 'CUSTOM_META_TAGS.description' => 'Aktiverar anpassningsbara meta-taggar i "head"-stycket på alla sidor. Definieras i Advancerad Konfiguration.',
+ 'FORCE_HTTPS.title' => 'Tvinga HTTPS på länkar',
+ 'FORCE_HTTPS.description' => 'Tvingar alla länkar att använda HTTPS som standard. Detta alternativ rekommenderas om omvänd proxy är i bruk.',
+ 'ALLOW_CUSTOM_CODE_IN_THEMES.title' => 'Tillåt anpassad kod i teman',
+ 'ALLOW_CUSTOM_CODE_IN_THEMES.description' => 'Tillåter bruk av anpassad kod i teman. Om du använder teman från okännda källor, så kan detta innebära en säkerhetsrisk.',
+ 'ENABLE_THEME_UPDATER.title' => 'Aktivera Temauppdateraren',
+ 'ENABLE_THEME_UPDATER.description' => 'Avgör om temauppdateraren ska vara aktiv.',
+ 'ENABLE_ADMIN_BAR_USERS.title' => 'Aktivera administrationsfält för alla användare',
+ 'ENABLE_ADMIN_BAR_USERS.description' => 'Om det här alternativet är aktivt kommer alla inloggade användare att ha ett administrationsfält tillgängligt på deras länksidor.',
+ 'ENABLE_SOCIAL_LOGIN.title' => 'Aktivera social inloggning',
+ 'ENABLE_SOCIAL_LOGIN.description' => 'Aktiverar inloggning via sociala medier. Det här alternativer kräver vidare konfiguration. Läs mer om detta här.',
+ 'USE_THEME_PREVIEW_IFRAME.title' => 'Använd iframe som temaförhandsvisning',
+ 'USE_THEME_PREVIEW_IFRAME.description' => 'Avgör om en intern iframe skall användas som förhandsvisning för teman på temasidan.',
+ 'FORCE_ROUTE_HTTPS.title' => 'Omdirigera alla sidor till HTTPS',
+ 'FORCE_ROUTE_HTTPS.description' => 'Det här alternativet kommer att förstöra din konfiguration om du använder omvänd proxy.',
+ 'DISPLAY_FOOTER_TERMS.title' => 'Sidfotslänk för villkor',
+ 'DISPLAY_FOOTER_TERMS.description' => 'Aktiverar länk i sidfot för villkor.',
+ 'DISPLAY_FOOTER_PRIVACY.title' => 'Sidfotslänk för Integritet',
+ 'DISPLAY_FOOTER_PRIVACY.description' => 'Aktiverar länk i sidfot för Integritet.',
+ 'DISPLAY_FOOTER_CONTACT.title' => 'Sidfotslänk för Kontakt',
+ 'DISPLAY_FOOTER_CONTACT.description' => 'Aktiverar länk i sidfot för Kontakt.',
+ 'TITLE_FOOTER_HOME.title' => '',
+ 'TITLE_FOOTER_HOME.description' => 'Titel för sidfotslänk till hem.',
+ 'TITLE_FOOTER_TERMS.title' => '',
+ 'TITLE_FOOTER_TERMS.description' => 'Titel för sidfotslänk till villkor.',
+ 'TITLE_FOOTER_PRIVACY.title' => '',
+ 'TITLE_FOOTER_PRIVACY.description' => 'Titel för sidfotslänk till integritet.',
+ 'TITLE_FOOTER_CONTACT.title' => '',
+ 'TITLE_FOOTER_CONTACT.description' => 'Titel för sidfotslänk till kontakt.',
+ 'HOME_FOOTER_LINK.title' => '
Home footer link URL
',
+ 'HOME_FOOTER_LINK.description' => 'Ange valfri URL för att omdirigera din hemlänks URL. Lämna fältet tomt för standard.',
+ 'ALLOW_CUSTOM_BACKGROUNDS.title' => 'Tillåt egna bakgrunder',
+ 'ALLOW_CUSTOM_BACKGROUNDS.description' => 'Tillåter användare att ladda upp egna bakgrundsbilder till deras sidor.',
+ 'ALLOW_USER_IMPORT.title' => 'Tillåt användare att importera profiler från andra instanser',
+ 'ALLOW_USER_IMPORT.description' => 'Tillåter användera att importera deras profiler och länkar från en extern fil.',
+ 'ALLOW_USER_EXPORT.title' => 'Tillåt användare att exportera deras profil',
+ 'ALLOW_USER_EXPORT.description' => 'Tillåter användera att exportera deras egna profiler och länkar.',
+ 'MANUAL_USER_VERIFICATION.title' => 'Verifiera användare manuellt',
+ 'MANUAL_USER_VERIFICATION.description' => 'Avgör om administratörer ska verifiera nyregistrerade medlemmar manuellt.',
+ 'ADMIN_EMAIL.title' => 'Administratörsmail',
+ 'ADMIN_EMAIL.description' => 'Används för att skicka notiser via mail.',
+ 'HIDE_VERIFICATION_CHECKMARK.title' => 'Dölj verifieringsbock',
+ 'HIDE_VERIFICATION_CHECKMARK.description' => 'Döljer verifieringsbock som visas på administratörers samt VIP-medlemmars sidor.',
+ 'ENABLE_REPORT_ICON.title' => 'Aktivera rapportikon',
+ 'ENABLE_REPORT_ICON.description' => 'Visar en ikon på användarsidor som låter användare rapportera sidor.',
+ 'LOCALE.title' => 'Appspråk',
+ 'LOCALE.description' => 'Ändrar språket på din applikation',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Installerare
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/installer/installer.blade.php
+ |
+ */
+
+ # Title Tag
+ 'LinkStack setup' => 'Installation av LinkStack',
+
+ 'Setup LinkStack' => 'Installera LinkStack',
+ 'Welcome to the setup for LinkStack!' => 'Välkommen till installationsguiden för LinkStack!',
+ 'This setup will:' => 'Den här installationsguiden kommer att:',
+ 'Check the server dependencies' => '1. Kontrollera serverkrav',
+ 'Setup the database' => '2. Installera databasen',
+ 'Create the admin user' => '3. Skapa administratörsanvändaren',
+ 'Configure the app' => '4. Konfigurera applikationen',
+ 'Choose a language' => 'Välj ett språk',
+
+ 'Next' => 'Nästa',
+ 'Yes' => 'Ja',
+ 'No' => 'Nej',
+ 'Finish setup' => 'Slutför installationen',
+
+ 'Setup failed' => 'Installation misslyckades',
+ 'An error has occured. Please try again' => 'Ett fel har uppstått. Var vänlig och försök igen.',
+ 'Depending on your database type:' => 'Beroende på din typ av databas:',
+ 'Try again' => 'Försök igen',
+
+ 'Dependency check' => 'Kontroll av systemkrav',
+ 'Required PHP modules:' => 'Obligatoriska PHP-moduler:',
+
+ 'Select a database type' => 'Välj en typ av database',
+ 'Under most circumstances, we recommend using SQLite' => 'I de flesta fall rekommenderar vi SQLite.',
+ 'MySQL requires a separate, empty MySQL database' => 'MySQL kräver en separat och tom MySQL-databas.',
+
+ 'Database type:' => 'Databastyp:',
+ 'Database host:' => 'Databasvärd:',
+ 'Database port:' => 'Databasport:',
+ 'Database name:' => 'Databasenamn:',
+ 'Database username:' => 'Databasens användarnamn:',
+ 'Database password:' => 'Databasens lösenord:',
+
+ 'Create an admin account' => 'Skapa ett administrationskonto.',
+ 'Admin email:' => 'Administratörens email:',
+ 'Admin password:' => 'Administratörens password:',
+ 'Handle:' => 'Användarnamn:',
+ 'Name:' => 'Namn:',
+
+ 'Configure your page' => 'Konfigurera din sida',
+ 'Enable registration:' => 'Aktivera registrering:',
+ 'Enable email verification:' => 'Aktivera mailbekräftelse:',
+ 'Set your page as Home Page' => 'Använd din sida som hemsida',
+ 'This will move the Home Page to /home' => 'Detta flyttar den ordinarie hemsidan till /home',
+ 'App Name:' => 'Appnamn:',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Uppdaterare/Uppdaterar-backup
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/update.blade.php
+ |
+ */
+
+ # Titel-tagg
+ 'Update LinkStack' => 'Uppdatera LinkStack',
+
+ 'Latest beta version' => 'Senaste betaversion',
+ 'Installed beta version' => 'Installerad betaversion',
+ 'none' => 'ingen',
+ 'You need to update to the latest mainline release' => 'Du behöver uppdatera till den senaste mainline-versionen',
+ 'You’re running the latest mainline release' => 'Du använder den senaste mainline-versionen',
+
+ 'update.manually' => 'Du kan uppdatera din installation automatiskt eller ladda ner och installera uppdateringen manuellt:',
+ 'update.windows' => 'Windows-användare kan använda den alternativa uppdateraren. Den här uppdateraren skapar ingen backup. Använd efter eget omdöme.',
+ 'Update automatically' => 'Uppdatera automatiskt',
+
+ 'Updating' => 'Uppdaterar',
+ 'Creating backup' => 'Skapar backup',
+ 'Preparing update' => 'Förbereder uppdatering',
+ 'No new version' => 'Ingen ny version',
+ 'There is no new version available' => 'Det finns ingen ny version tillgänglig',
+ 'Admin Panel' => 'Administrationspanel',
+ 'Finishing up' => 'Slutför',
+ 'Success!' => 'Lyckades!',
+ 'The update was successful' => 'Uppdateringen lyckades, du kan nu återvända till Administrationspanelen.',
+ 'View the release notes' => 'Visa versionsnoteringar',
+ 'Run again' => 'Kör igen',
+ 'Error' => 'Fel',
+ 'Something went wrong with the update' => 'Något gick fel med uppdateringen',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Backup
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/backup.blade.php
+ |
+ */
+
+ # Title Tag
+ 'Backup.title' => 'Backup',
+
+ 'The backup was successful' => 'Skapandet av backup lyckades, du kan nu gå tillbaka till Administrationspanelen eller se alla dina backups.',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sidblock
+ |--------------------------------------------------------------------------
+ |
+ | Parts are stored in the database.
+ | resources/views/studio/edit-link.blade.php
+ |
+ */
+
+ # fördefinierat
+ 'block.title.predefined' => 'Förinställd Sida',
+ 'block.description.predefined' => 'Välj från en lista över förinställda webbplatser och låt din länk automatiskt stilhanteras med hjälp av webbplatsens färger och ikon.',
+
+ # länk
+ 'block.title.link' => 'Egen Länk',
+ 'block.description.link' => 'Skapa en egen länk som leder till valfri webbplats. Anpassa knappens stil och ikon, eller använd webbplatsens favicon som knappens ikon.',
+
+ # vcard
+ 'block.title.vcard' => 'Vcard',
+ 'block.description.vcard' => 'Skapa eller ladda upp ett elektroniskt visitkort.',
+
+ # email
+ 'block.title.email' => 'E-Mail adress',
+ 'block.description.email' => 'Lägg till en mailadress som öppnar enhetens standardapp för att skriva ett mail till den adressen.',
+
+ # telefon
+ 'block.title.telephone' => 'Telefonnummer',
+ 'block.description.telephone' => 'Lägg till ett telefonnummer som öppnar enhetens standardapp för att ringa till det numret.',
+
+ # rubrik
+ 'block.title.heading' => 'Rubrik',
+ 'block.description.heading' => 'Använd rubriker för att organisera dina länkar och dela in dem i grupper.',
+
+ # Tomrum
+ 'block.title.spacer' => 'Tomrum',
+ 'block.description.spacer' => 'Lägg till tomrum i din länklista. Du kan ställa in höjden.',
+
+ # text
+ 'block.title.text' => 'Text',
+ 'block.description.text' => 'Lägg till fast text som ej går att klicka på.',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sidobjekt
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/components/pageitems/
+ |
+ */
+
+ 'Default Email' => 'Standardmail',
+ 'Custom Title' => 'Egen Titel',
+ 'Leave blank for default title' => 'Lämna fältet tomt för standardtitel',
+ 'E-Mail address' => 'Mailadress',
+ 'Enter your E-Mail' => 'Ange din E-Mail',
+
+ 'Heading Text:' => 'Rubriktext:',
+
+ 'URL' => 'URL',
+ 'Show website icon on button' => 'Visa webbplatsens ikon på knappen',
+
+ 'Select a predefined site' => 'Välj en förinställd sida',
+ 'Enter the link URL' => 'Ange länkens URL',
+
+ 'Spacing height' => 'Tomrumshöjd',
+
+ 'Phone' => 'Telefon',
+ 'Telephone number' => 'Telefonnummer',
+ 'Enter your telephone number' => 'Ange ditt telefonnummer',
+
+ 'Text to display' => 'Text att visa',
+
+ 'Vcard' => 'Vcard',
+ 'First Name' => 'Förnamn',
+ 'Middle Name' => 'Mellannamn',
+ 'Last Name' => 'Efternamn',
+ 'Suffix' => 'Suffix',
+ 'Work' => 'Arbete',
+ 'Organization' => 'Organisation',
+ 'Work URL' => 'URL till arbete',
+ 'Emails' => 'Email',
+ 'Enter your personal email' => 'Ange din personliga email',
+ 'Work Email' => 'Email till arbete',
+ 'Enter your work email' => 'Ange ditt arbetes email',
+ 'Phones' => 'Telefoner',
+ 'Home Phone' => 'Hemtelefon',
+ 'Work Phone' => 'Jobbtelefon',
+ 'Cell Phone' => 'Mobiltelefon',
+ 'Home Address' => 'Hemadress',
+ 'Label' => 'Etikett',
+ 'Street' => 'Gata',
+ 'City' => 'Stad',
+ 'State/Province' => 'Landskap',
+ 'Zip/Postal Code' => 'Postkod',
+ 'Country' => 'Land',
+ 'Work Address' => 'Jobbadress',
+
+ 'URL to the video' => 'URL till videon',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Underhållssida
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/mainenance.blade.php
+ |
+ */
+
+ 'Maintenance Mode' => 'Underhållsläge',
+ 'We are performing scheduled site maintenance at this time' => 'Vi utför schemalagt underhåll av webbplatsen för tillfället.',
+ 'Please check back with us later' => 'Återkom vänligen senare.',
+ 'Admin options:' => 'Administratörsalternativ:',
+ 'Turn off' => 'Inaktivera',
+ 'Warn.Disable.Maintenance' => 'Du är på väg att inaktivera Underhållsläget. Är du säker?',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | LinkStack (Länk-sida)
+ |--------------------------------------------------------------------------
+ |
+ | resources/views/littlelink.blade.php
+ |
+ */
+
+ 'Share this page' => 'Dela den här sidan',
+ 'Share' => 'Dela',
+ 'Copy URL to clipboard' => 'Kopiera URL',
+ 'URL has been copied to your clipboard!' => 'URL:en har kopierats till ditt urklipp!',
+
+
+ 'Delete User' => 'Radera användare',
+ 'Block User' => 'Blockera användare',
+ 'Users Theme' => 'Tema',
+ 'Search User' => 'Leta upp användare',
+
+ 'Edit my profile' => 'Redigera min profil',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sidfot
+ |--------------------------------------------------------------------------
+ |
+ | Added to the bottom of certain pages.
+ | resources/views/layouts/footer.blade.php
+ |
+ */
+
+ 'Learn more about LinkStack' => 'Lär dig mer om LinkStack',
+ 'Learn more' => 'Lär dig mer',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Notismeddelanden
+ |--------------------------------------------------------------------------
+ |
+ | All internal notifications.
+ | resources/views/layouts/notifications.blade.php
+ |
+ */
+
+ 'No notifications' => 'No notifications',
+
+ # Säkerhetsnotis
+ 'Your security is at risk!' => 'Din säkerhet riskeras!',
+ 'Immediate action is required!' => 'Omedelbar handling krävs!',
+ 'security.msg1' => 'Din säkerhet riskeras.',
+ 'security.msg2' => 'Vissa filer kan nås av utomstående. Omedelbar handling krävs!',
+ 'security.msg3' => 'Vissa viktiga filer kan nås av allmänheten, detta sätter din säkerhet på spel. Vänligen ta omedelbart handling för att dra in allmän tillgång till dessa filer för att förhindra obehörig tillgång till känslig information.',
+ 'security.msg4' => 'Lär dig mer',
+
+ # "Hjälp oss"-notis
+ 'Hide this notification' => 'Dölj den här notisen',
+ 'Help Us Out' => 'Hjälp Oss',
+ 'Enjoying Linkstack?' => 'Gillar du LinkStack?',
+ 'Support Linkstack' => 'Stöd LinkStack',
+ 'support.msg1' => 'Om du har fått nöje av att använda LinkStack, så skulle vi verkligen uppskatta om du kunde',
+ 'support.msg2' => 'stjärnmarkera projektet på GitHub',
+ 'support.msg3' => 'Ditt stöd hjälper oss nå en bredare publik och förbättrar kvalitén på vårt projekt.',
+ 'support.msg4' => 'Om du har möjlighet att',
+ 'support.msg5' => 'stödja oss finansiellt, så skulle även en liten summa hjälpa oss att täcka kostnaderna för underhåll och förbättring av LinkStack.',
+ 'support.msg6' => 'Tack för ditt stöd och för att du är en del av LinkStacks gemenskap!',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sidfotslänkar
+ |--------------------------------------------------------------------------
+ |
+ */
+
+ 'footer.Home' => 'Hem',
+ 'footer.Terms' => 'Villkor',
+ 'footer.Privacy' => 'Integritet',
+ 'footer.Contact' => 'Kontakt',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Rapportsida
+ |--------------------------------------------------------------------------
+ |
+ */
+
+ 'report_violation' => 'Rapportera missbruk',
+ 'url_label' => 'URL till sidan du vill rapportera',
+ 'report_type_label' => 'Typ av rapport',
+ 'hate_speech' => 'Hets mot folkgrupp eller trakasseri',
+ 'violence_threats' => 'Våld eller hot',
+ 'illegal_activities' => 'Olagliga aktiviteter',
+ 'copyright_infringement' => 'Missbruk av upphovsrätt',
+ 'misinformation_fake_news' => 'Desinformation',
+ 'identity_theft' => 'Identitetsstöld',
+ 'drug_related_content' => 'Drogrelaterat innehåll',
+ 'weapons_harmful_objects' => 'Vapen eller farliga objekt',
+ 'child_exploitation' => 'Utnyttjande av barn',
+ 'fraud_scams' => 'Bedrägeri',
+ 'privacy_violation' => 'Integritetskränkning',
+ 'impersonation' => 'Personifiering',
+ 'other_specify' => 'Annat (specifiera)',
+ 'additional_comments_label' => 'Övriga kommentarer',
+ 'submit_button' => 'Skicka',
+
+
+ 'report_mail_admin_subject' => 'Profilrapport',
+ 'report_mail_admin_report' => 'En profil har rapporterats',
+
+ 'report_mail_reported_profile' => 'Rapporterad profil',
+ 'report_mail_reported_url' => 'Rapporterad URL',
+ 'report_mail_type' => 'Typ',
+ 'report_mail_message' => 'Meddelande',
+
+ 'report_mail_report_submitted_by' => 'Rapport inskickad av',
+ 'report_mail_reported_by' => 'Rapporterad av',
+ 'report_mail_profile' => 'Profil',
+
+ 'report_mail_button_profile' => 'Visa på användarens sida',
+ 'report_mail_button_delete' => 'Radera användarrapport',
+
+
+ 'report_error' => 'Profilen kunde inte rapporteras',
+ 'report_success' => 'Profilen har rapporterats',
+
+
+ #=============================================================================#
+ # Laravel internal translations #
+ #=============================================================================#
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used during authentication for various
+ | messages that we need to display to the user. You are free to modify
+ | these language lines according to your application's requirements.
+ |
+ */
+
+ 'failed' => 'Dessa värden stämmer inte överens med vår data.',
+ 'password' => 'Det angiivna lösenorder är ej korrekt.',
+ 'throttle' => 'För många inloggningsförsök. Vänligen försök igen om :seconds sekunder.',
+
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pagination Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used by the paginator library to build
+ | the simple pagination links. You are free to change them to anything
+ | you want to customize your views to better match your application.
+ |
+ */
+
+ 'previous' => '« Föregående',
+ 'next' => 'Nästa »',
+
+
+ 'or' => 'eller',
+ 'Sign in with :provider' => 'Logga in med :provider',
+];
diff --git a/resources/lang/vi/messages.php b/resources/lang/vi/messages.php
index 5420911b1..9610051e5 100644
--- a/resources/lang/vi/messages.php
+++ b/resources/lang/vi/messages.php
@@ -1075,4 +1075,6 @@
'next' => 'Tiếp theo & Raquo;',
+ 'or' => 'hoặc',
+ 'Sign in with :provider' => 'Đăng nhập bằng :provider',
];
\ No newline at end of file
diff --git a/resources/lang/zh-TW/messages.php b/resources/lang/zh-TW/messages.php
index fd3e80f2d..5b3a00a45 100644
--- a/resources/lang/zh-TW/messages.php
+++ b/resources/lang/zh-TW/messages.php
@@ -1135,4 +1135,6 @@
'next' => '下一頁 »',
+ 'or' => '或',
+ 'Sign in with :provider' => '使用 :provider 登入',
];
diff --git a/resources/lang/zh/messages.php b/resources/lang/zh/messages.php
index 9419cd09c..981a529dc 100644
--- a/resources/lang/zh/messages.php
+++ b/resources/lang/zh/messages.php
@@ -1137,4 +1137,6 @@
'next' => '下一页 »',
+ 'or' => '或',
+ 'Sign in with :provider' => '使用 :provider 登录',
];
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
index 21d9d4d74..79df799b4 100755
--- a/resources/views/auth/login.blade.php
+++ b/resources/views/auth/login.blade.php
@@ -71,6 +71,35 @@
@if(env('ENABLE_SOCIAL_LOGIN') == 'true')
+ @php($oidcName = config('services.openidconnect.display_name'))
+ @php($oidcEnabled = !empty(config('services.openidconnect.client_id')))
+ @php($oidcIcon = config('services.openidconnect.icon'))
+ @php($ssoText = __('messages.Sign in with :provider', ['provider' => $oidcName]))
+ @php($otherProviders = !empty(env('FACEBOOK_CLIENT_ID')) || !empty(env('TWITTER_CLIENT_ID'))
+ || !empty(env('GOOGLE_CLIENT_ID')) || !empty(env('GITHUB_CLIENT_ID')))
+ {{-- A named provider is a sign-in route in its own right, so it sits with the
+ submit button above and mirrors it exactly — same wrapper, centred and
+ auto-width, same theme colour and hover — rather than becoming one more
+ icon in the row below. --}}
+ @if($oidcEnabled)
+ {{-- Separates the password form from the provider, which otherwise sit flush
+ against each other. --}}
+
+ @endif
+ {{-- The heading introduces the icon row, so it appears only when that row has
+ something in it: an instance with single sign-on alone should not be
+ offered "other accounts" that do not exist. --}}
+ @if($otherProviders)
{{__('messages.or sign in with other accounts?')}}