From 34ef216f3f61d6baeff2e63f63ecaf9e1a3822af Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sun, 18 Feb 2024 11:51:26 +0100 Subject: [PATCH 01/16] feat: add environment variable to overwrite oidc scopes --- src/env.js | 60 +++++++++++++++++++++++------------------- src/utils/auth/oidc.ts | 10 ++++--- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/env.js b/src/env.js index 1b7c349cedc..8d0c642d934 100644 --- a/src/env.js +++ b/src/env.js @@ -1,13 +1,14 @@ const { z } = require('zod'); const { createEnv } = require('@t3-oss/env-nextjs'); -const trueStrings = ["1", "t", "T", "TRUE", "true", "True"]; -const falseStrings = ["0", "f", "F", "FALSE", "false", "False"]; +const trueStrings = ['1', 't', 'T', 'TRUE', 'true', 'True']; +const falseStrings = ['0', 'f', 'F', 'FALSE', 'false', 'False']; -const zodParsedBoolean = () => z - .enum([...trueStrings, ...falseStrings]) - .default("false") - .transform((value) => trueStrings.includes(value)) +const zodParsedBoolean = () => + z + .enum([...trueStrings, ...falseStrings]) + .default('false') + .transform((value) => trueStrings.includes(value)); const portSchema = z .string() @@ -40,34 +41,38 @@ const env = createEnv({ HOSTNAME: z.string().optional(), // Authentication - AUTH_PROVIDER: z.string().default('credentials').transform(providers => providers.replaceAll(' ', '').split(',')), + AUTH_PROVIDER: z + .string() + .default('credentials') + .transform((providers) => providers.replaceAll(' ', '').split(',')), // LDAP ...(authProviders.includes('ldap') ? { - AUTH_LDAP_URI: z.string().url(), - AUTH_LDAP_BIND_DN: z.string(), - AUTH_LDAP_BIND_PASSWORD: z.string(), - AUTH_LDAP_BASE: z.string(), - AUTH_LDAP_USERNAME_ATTRIBUTE: z.string().default('uid'), - AUTH_LDAP_GROUP_CLASS: z.string().default('groupOfUniqueNames'), - AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: z.string().default('member'), - AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE: z.string().default('dn'), - AUTH_LDAP_ADMIN_GROUP: z.string().default('admin'), - AUTH_LDAP_OWNER_GROUP: z.string().default('admin'), - } + AUTH_LDAP_URI: z.string().url(), + AUTH_LDAP_BIND_DN: z.string(), + AUTH_LDAP_BIND_PASSWORD: z.string(), + AUTH_LDAP_BASE: z.string(), + AUTH_LDAP_USERNAME_ATTRIBUTE: z.string().default('uid'), + AUTH_LDAP_GROUP_CLASS: z.string().default('groupOfUniqueNames'), + AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: z.string().default('member'), + AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE: z.string().default('dn'), + AUTH_LDAP_ADMIN_GROUP: z.string().default('admin'), + AUTH_LDAP_OWNER_GROUP: z.string().default('admin'), + } : {}), // OIDC ...(authProviders.includes('oidc') ? { - AUTH_OIDC_CLIENT_ID: z.string(), - AUTH_OIDC_CLIENT_SECRET: z.string(), - AUTH_OIDC_URI: z.string().url(), - // Custom Display name, defaults to OIDC - AUTH_OIDC_CLIENT_NAME: z.string().default('OIDC'), - AUTH_OIDC_ADMIN_GROUP: z.string().default('admin'), - AUTH_OIDC_OWNER_GROUP: z.string().default('admin'), - AUTH_OIDC_AUTO_LOGIN: zodParsedBoolean() - } + AUTH_OIDC_CLIENT_ID: z.string(), + AUTH_OIDC_CLIENT_SECRET: z.string(), + AUTH_OIDC_URI: z.string().url(), + // Custom Display name, defaults to OIDC + AUTH_OIDC_CLIENT_NAME: z.string().default('OIDC'), + AUTH_OIDC_ADMIN_GROUP: z.string().default('admin'), + AUTH_OIDC_OWNER_GROUP: z.string().default('admin'), + AUTH_OIDC_AUTO_LOGIN: zodParsedBoolean(), + AUTH_OIDC_SCOPE_OVERWRITE: z.string().default('openid email profile groups'), + } : {}), }, @@ -124,6 +129,7 @@ const env = createEnv({ AUTH_OIDC_ADMIN_GROUP: process.env.AUTH_OIDC_ADMIN_GROUP, AUTH_OIDC_OWNER_GROUP: process.env.AUTH_OIDC_OWNER_GROUP, AUTH_OIDC_AUTO_LOGIN: process.env.AUTH_OIDC_AUTO_LOGIN, + AUTH_OIDC_SCOPE_OVERWRITE: process.env.AUTH_OIDC_SCOPE_OVERWRITE, DEMO_MODE: process.env.DEMO_MODE, }, skipValidation: !!process.env.SKIP_ENV_VALIDATION, diff --git a/src/utils/auth/oidc.ts b/src/utils/auth/oidc.ts index 8d9c3ef7643..bf6e59df34d 100644 --- a/src/utils/auth/oidc.ts +++ b/src/utils/auth/oidc.ts @@ -20,13 +20,17 @@ const provider: OAuthConfig = { clientId: env.AUTH_OIDC_CLIENT_ID, clientSecret: env.AUTH_OIDC_CLIENT_SECRET, wellKnown: `${env.AUTH_OIDC_URI}/.well-known/openid-configuration`, - authorization: { params: { scope: 'openid email profile groups' } }, + authorization: { params: { scope: env.AUTH_OIDC_SCOPE_OVERWRITE } }, idToken: true, async profile(profile) { const user = await adapter.getUserByEmail!(profile.email); - const isAdmin = profile.groups.includes(env.AUTH_OIDC_ADMIN_GROUP); - const isOwner = profile.groups.includes(env.AUTH_OIDC_OWNER_GROUP); + if (!profile.groups) { + Consola.warn('no groups found in profile of oidc user'); + } + + const isAdmin = profile.groups?.includes(env.AUTH_OIDC_ADMIN_GROUP); + const isOwner = profile.groups?.includes(env.AUTH_OIDC_OWNER_GROUP); // check for role update if (user && (user.isAdmin != isAdmin || user.isOwner != isOwner)) { From 83e3800ddf806d6eada444c527c1b3e89f9f664e Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sun, 18 Feb 2024 11:53:44 +0100 Subject: [PATCH 02/16] fix: change groups check to undefined instead of not to not show warning when 0 groups in list --- src/utils/auth/oidc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/auth/oidc.ts b/src/utils/auth/oidc.ts index bf6e59df34d..47076275e3c 100644 --- a/src/utils/auth/oidc.ts +++ b/src/utils/auth/oidc.ts @@ -25,7 +25,7 @@ const provider: OAuthConfig = { async profile(profile) { const user = await adapter.getUserByEmail!(profile.email); - if (!profile.groups) { + if (profile.groups == undefined) { Consola.warn('no groups found in profile of oidc user'); } From 5cd940f3cca7c0387be87d76996a278c1c224d56 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Tue, 20 Feb 2024 20:34:57 +0100 Subject: [PATCH 03/16] Fix redirect OIDC (#1911) * fix: redirect oidc not defined * fix: construct redirect url from x-forwarded prot and host * fix: redirect method does not support comma seperated protocol list and url starting with http(s):// * fix: redirect_uri not specified for oidc as authorization parameter * fix: unit test not modified * docs: add comment why the redirect_uri is constructed * fix: add redirect callback with forwarded headers as redirect url host and protocol * Apply suggestions from code review --- src/pages/api/auth/[...nextauth].ts | 2 +- src/pages/auth/login.tsx | 22 +++++++++- src/server/auth.ts | 20 ++++++---- src/utils/auth/index.ts | 19 ++++++--- src/utils/auth/oidc-redirect.spec.ts | 60 ++++++++++++++++++++++++++++ src/utils/auth/oidc.ts | 36 +++++++++++++++-- 6 files changed, 140 insertions(+), 19 deletions(-) create mode 100644 src/utils/auth/oidc-redirect.spec.ts diff --git a/src/pages/api/auth/[...nextauth].ts b/src/pages/api/auth/[...nextauth].ts index b5a1818de2c..8adfc426b4d 100644 --- a/src/pages/api/auth/[...nextauth].ts +++ b/src/pages/api/auth/[...nextauth].ts @@ -3,5 +3,5 @@ import NextAuth from 'next-auth'; import { constructAuthOptions } from '~/server/auth'; export default async function auth(req: NextApiRequest, res: NextApiResponse) { - return await NextAuth(req, res, constructAuthOptions(req, res)); + return await NextAuth(req, res, await constructAuthOptions(req, res)); } diff --git a/src/pages/auth/login.tsx b/src/pages/auth/login.tsx index eb7f0af2efc..482e1db6e4d 100644 --- a/src/pages/auth/login.tsx +++ b/src/pages/auth/login.tsx @@ -70,7 +70,15 @@ export default function LoginPage({ }; useEffect(() => { - if (oidcAutoLogin) signIn('oidc'); + if (oidcAutoLogin && !isError) + signIn('oidc', { + redirect: false, + callbackUrl: '/', + }).then((response) => { + if (!response?.ok) { + setIsError(true); + } + }); }, [oidcAutoLogin]); const metaTitle = `${t('metaTitle')} • Homarr`; @@ -186,7 +194,17 @@ export default function LoginPage({ )} {providers.includes('oidc') && ( - )} diff --git a/src/server/auth.ts b/src/server/auth.ts index 46ea2f539d3..38094037834 100644 --- a/src/server/auth.ts +++ b/src/server/auth.ts @@ -4,7 +4,8 @@ import { type GetServerSidePropsContext, type NextApiRequest, type NextApiRespon import { type NextAuthOptions, getServerSession } from 'next-auth'; import { Adapter } from 'next-auth/adapters'; import { decode, encode } from 'next-auth/jwt'; -import { adapter, onCreateUser, providers } from '~/utils/auth'; +import { adapter, getProviders, onCreateUser } from '~/utils/auth'; +import { createRedirectUri } from '~/utils/auth/oidc'; import EmptyNextAuthProvider from '~/utils/empty-provider'; import { fromDate, generateSessionToken } from '~/utils/session'; import { colorSchemeParser } from '~/validations/user'; @@ -19,10 +20,10 @@ const sessionMaxAgeInSeconds = 30 * 24 * 60 * 60; // 30 days * * @see https://next-auth.js.org/configuration/options */ -export const constructAuthOptions = ( +export const constructAuthOptions = async ( req: NextApiRequest, res: NextApiResponse -): NextAuthOptions => ({ +): Promise => ({ events: { createUser: onCreateUser, }, @@ -86,6 +87,11 @@ export const constructAuthOptions = ( return true; }, + async redirect({ url, baseUrl }) { + const pathname = new URL(url, baseUrl).pathname; + const redirectUrl = createRedirectUri(req.headers, pathname); + return redirectUrl; + }, }, session: { strategy: 'database', @@ -96,7 +102,7 @@ export const constructAuthOptions = ( error: '/auth/login', }, adapter: adapter as Adapter, - providers: [...providers, EmptyNextAuthProvider()], + providers: [...(await getProviders(req.headers)), EmptyNextAuthProvider()], jwt: { async encode(params) { if (!isCredentialsRequest(req)) { @@ -134,14 +140,14 @@ const isCredentialsRequest = (req: NextApiRequest): boolean => { * * @see https://next-auth.js.org/configuration/nextjs */ -export const getServerAuthSession = (ctx: { +export const getServerAuthSession = async (ctx: { req: GetServerSidePropsContext['req']; res: GetServerSidePropsContext['res']; }) => { - return getServerSession( + return await getServerSession( ctx.req, ctx.res, - constructAuthOptions( + await constructAuthOptions( ctx.req as unknown as NextApiRequest, ctx.res as unknown as NextApiResponse ) diff --git a/src/utils/auth/index.ts b/src/utils/auth/index.ts index 73c7ea5db30..9873486257f 100644 --- a/src/utils/auth/index.ts +++ b/src/utils/auth/index.ts @@ -2,6 +2,8 @@ import { DefaultSession } from 'next-auth'; import { CredentialsConfig, OAuthConfig } from 'next-auth/providers'; import { env } from '~/env'; +import { OidcRedirectCallbackHeaders } from './oidc'; + export { default as adapter, onCreateUser } from './adapter'; /** @@ -38,9 +40,16 @@ declare module 'next-auth/jwt' { } } -export const providers: (CredentialsConfig | OAuthConfig)[] = []; +export const getProviders = async (headers: OidcRedirectCallbackHeaders) => { + const providers: (CredentialsConfig | OAuthConfig)[] = []; + + if (env.AUTH_PROVIDER?.includes('ldap')) providers.push((await import('./ldap')).default); + if (env.AUTH_PROVIDER?.includes('credentials')) + providers.push((await import('./credentials')).default); + if (env.AUTH_PROVIDER?.includes('oidc')) { + const createProvider = (await import('./oidc')).default; + providers.push(createProvider(headers)); + } -if (env.AUTH_PROVIDER?.includes('ldap')) providers.push((await import('./ldap')).default); -if (env.AUTH_PROVIDER?.includes('credentials')) - providers.push((await import('./credentials')).default); -if (env.AUTH_PROVIDER?.includes('oidc')) providers.push((await import('./oidc')).default); + return providers; +}; diff --git a/src/utils/auth/oidc-redirect.spec.ts b/src/utils/auth/oidc-redirect.spec.ts new file mode 100644 index 00000000000..166abb74cd5 --- /dev/null +++ b/src/utils/auth/oidc-redirect.spec.ts @@ -0,0 +1,60 @@ +import { describe, expect, test } from 'vitest'; + +import { createRedirectUri } from './oidc'; + +describe('redirect', () => { + test('Callback should return http url when not defining protocol', async () => { + // Arrange + const headers = { + 'x-forwarded-host': 'localhost:3000', + }; + + // Act + const result = await createRedirectUri(headers, '/api/auth/callback/oidc'); + + // Assert + expect(result).toBe('http://localhost:3000/api/auth/callback/oidc'); + }); + + test('Callback should return https url when defining protocol', async () => { + // Arrange + const headers = { + 'x-forwarded-proto': 'https', + 'x-forwarded-host': 'localhost:3000', + }; + + // Act + const result = await createRedirectUri(headers, '/api/auth/callback/oidc'); + + // Assert + expect(result).toBe('https://localhost:3000/api/auth/callback/oidc'); + }); + + test('Callback should return https url when defining protocol and host', async () => { + // Arrange + const headers = { + 'x-forwarded-proto': 'https', + host: 'something.else', + }; + + // Act + const result = await createRedirectUri(headers, '/api/auth/callback/oidc'); + + // Assert + expect(result).toBe('https://something.else/api/auth/callback/oidc'); + }); + + test('Callback should return https url when defining protocol as http,https and host', async () => { + // Arrange + const headers = { + 'x-forwarded-proto': 'http,https', + 'x-forwarded-host': 'hello.world', + }; + + // Act + const result = await createRedirectUri(headers, '/api/auth/callback/oidc'); + + // Assert + expect(result).toBe('https://hello.world/api/auth/callback/oidc'); + }); +}); diff --git a/src/utils/auth/oidc.ts b/src/utils/auth/oidc.ts index 47076275e3c..f1d3e58a9a5 100644 --- a/src/utils/auth/oidc.ts +++ b/src/utils/auth/oidc.ts @@ -13,14 +13,42 @@ type Profile = { email_verified: boolean; }; -const provider: OAuthConfig = { +export type OidcRedirectCallbackHeaders = { + 'x-forwarded-proto'?: string; + 'x-forwarded-host'?: string; + host?: string; +}; + +// The redirect_uri is constructed to work behind a reverse proxy. It is constructed from the headers x-forwarded-proto and x-forwarded-host. +export const createRedirectUri = (headers: OidcRedirectCallbackHeaders, pathname: string) => { + let protocol = headers['x-forwarded-proto'] ?? 'http'; + + // @see https://support.glitch.com/t/x-forwarded-proto-contains-multiple-protocols/17219 + if (protocol.includes(',')) { + protocol = protocol.includes('https') ? 'https' : 'http'; + } + + const path = pathname.startsWith('/') ? pathname : `/${pathname}`; + + const host = headers['x-forwarded-host'] ?? headers.host; + + + return `${protocol}://${host}${path}`; +}; + +const createProvider = (headers: OidcRedirectCallbackHeaders): OAuthConfig => ({ id: 'oidc', name: env.AUTH_OIDC_CLIENT_NAME, type: 'oauth', clientId: env.AUTH_OIDC_CLIENT_ID, clientSecret: env.AUTH_OIDC_CLIENT_SECRET, wellKnown: `${env.AUTH_OIDC_URI}/.well-known/openid-configuration`, - authorization: { params: { scope: env.AUTH_OIDC_SCOPE_OVERWRITE } }, + authorization: { + params: { + scope: env.AUTH_OIDC_SCOPE_OVERWRITE, + redirect_uri: createRedirectUri(headers, '/api/auth/callback/oidc'), + }, + }, idToken: true, async profile(profile) { const user = await adapter.getUserByEmail!(profile.email); @@ -50,6 +78,6 @@ const provider: OAuthConfig = { isOwner, }; }, -}; +}); -export default provider; +export default createProvider; From db2501633d26a38d7da02458b71d61cef78f8f07 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Sat, 24 Feb 2024 19:40:05 +0100 Subject: [PATCH 04/16] fix: set maximum size for indexer manager to 12 (#1912) --- src/widgets/indexer-manager/IndexerManagerTile.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/indexer-manager/IndexerManagerTile.tsx b/src/widgets/indexer-manager/IndexerManagerTile.tsx index 98807fa8fd4..98b68d80046 100644 --- a/src/widgets/indexer-manager/IndexerManagerTile.tsx +++ b/src/widgets/indexer-manager/IndexerManagerTile.tsx @@ -16,8 +16,8 @@ const definition = defineWidget({ gridstack: { minWidth: 1, minHeight: 1, - maxWidth: 3, - maxHeight: 3, + maxWidth: 12, + maxHeight: 12, }, component: IndexerManagerWidgetTile, }); From b51fcdb3424678d1bd22d9d6297158a657e07463 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Tue, 27 Feb 2024 21:44:52 +0200 Subject: [PATCH 05/16] Add OMV integration / widget (#1879) feat: Add health monitoring widget (OMV) OpenMediaVault as first supported integration. --- .env.example | 2 +- .../locales/en/modules/health-monitoring.json | 37 +++++ .../InputElements/IntegrationSelector.tsx | 5 + src/server/api/root.ts | 2 + src/server/api/routers/openmediavault.ts | 119 ++++++++++++++++ src/tools/server/translation-namespaces.ts | 1 + src/types/app.ts | 4 +- .../health-monitoring/HealthMonitoringCpu.tsx | 111 +++++++++++++++ .../HealthMonitoringFileSystem.tsx | 62 +++++++++ .../HealthMonitoringMemory.tsx | 50 +++++++ .../HealthMonitoringTile.tsx | 130 ++++++++++++++++++ src/widgets/index.ts | 2 + 12 files changed, 523 insertions(+), 2 deletions(-) create mode 100644 public/locales/en/modules/health-monitoring.json create mode 100644 src/server/api/routers/openmediavault.ts create mode 100644 src/widgets/health-monitoring/HealthMonitoringCpu.tsx create mode 100644 src/widgets/health-monitoring/HealthMonitoringFileSystem.tsx create mode 100644 src/widgets/health-monitoring/HealthMonitoringMemory.tsx create mode 100644 src/widgets/health-monitoring/HealthMonitoringTile.tsx diff --git a/.env.example b/.env.example index 2de2526be16..5a434dfc1e1 100644 --- a/.env.example +++ b/.env.example @@ -11,4 +11,4 @@ NEXTAUTH_SECRET="anything" # Disable analytics NEXT_PUBLIC_DISABLE_ANALYTICS="true" -DEFAULT_COLOR_SCHEME="light" \ No newline at end of file +DEFAULT_COLOR_SCHEME="light" \ No newline at end of file diff --git a/public/locales/en/modules/health-monitoring.json b/public/locales/en/modules/health-monitoring.json new file mode 100644 index 00000000000..8642591e69d --- /dev/null +++ b/public/locales/en/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "System Health Monitoring", + "description": "Information about your NAS", + "settings": { + "title": "System Health Monitoring", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Load Average", + "minute": "{{minute}} minute" + }, + "memory": { + "label": "Memory", + "totalMem": "Total memory: {{total}}GB", + "available": "Available: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "File System", + "available": "Available: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Uptime", + "updates": "Updates", + "reboot": "Reboot" + }, + "errors": { + "general": { + "title": "Unable to find your NAS", + "text": "There was a problem connecting to your NAS. Please verify your configuration/integration(s)." + } + } + } \ No newline at end of file diff --git a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx index 21ad225009c..7f79bf2cd19 100644 --- a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx +++ b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx @@ -193,4 +193,9 @@ export const availableIntegrations = [ image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/home-assistant.png', label: 'Home Assistant', }, + { + value: 'openmediavault', + image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/openmediavault.png', + label: 'OpenMediaVault', + }, ] as const satisfies Readonly; diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 0d12680791c..2f12f6a3745 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -14,6 +14,7 @@ import { inviteRouter } from './routers/invite/invite-router'; import { mediaRequestsRouter } from './routers/media-request'; import { mediaServerRouter } from './routers/media-server'; import { notebookRouter } from './routers/notebook'; +import { openmediavaultRouter } from './routers/openmediavault'; import { overseerrRouter } from './routers/overseerr'; import { passwordRouter } from './routers/password'; import { rssRouter } from './routers/rss'; @@ -49,6 +50,7 @@ export const rootRouter = createTRPCRouter({ password: passwordRouter, notebook: notebookRouter, smartHomeEntityState: smartHomeEntityStateRouter, + openmediavault: openmediavaultRouter, }); // export type definition of API diff --git a/src/server/api/routers/openmediavault.ts b/src/server/api/routers/openmediavault.ts new file mode 100644 index 00000000000..76b11ba9268 --- /dev/null +++ b/src/server/api/routers/openmediavault.ts @@ -0,0 +1,119 @@ +import axios from 'axios'; +import Consola from 'consola'; +import { z } from 'zod'; +import { checkIntegrationsType, findAppProperty } from '~/tools/client/app-properties'; +import { getConfig } from '~/tools/config/getConfig'; + +import { createTRPCRouter, publicProcedure } from '../trpc'; + +let sessionId: string | null = null; +let loginToken: string | null = null; + +async function makeOpenMediaVaultRPCCall( + serviceName: string, + method: string, + params: Record, + headers: Record, + input: { configName: string } +) { + const config = getConfig(input.configName); + const app = config.apps.find((app) => checkIntegrationsType(app.integration, ['openmediavault'])); + + if (!app) { + Consola.error(`App not found for configName '${input.configName}'`); + return null; + } + + const appUrl = new URL(app.url); + const response = await axios.post( + `${appUrl.origin}/rpc.php`, + { + service: serviceName, + method: method, + params: params, + }, + { + headers: { + 'Content-Type': 'application/json', + ...headers, + }, + } + ); + return response; +} + +export const openmediavaultRouter = createTRPCRouter({ + fetchData: publicProcedure + .input( + z.object({ + configName: z.string(), + }) + ) + .query(async ({ input }) => { + let authResponse: any = null; + let app: any; + + if (!sessionId || !loginToken) { + app = getConfig(input.configName)?.apps.find((app) => + checkIntegrationsType(app.integration, ['openmediavault']) + ); + + if (!app) { + Consola.error( + `Failed to process request to app '${app.integration}' (${app.id}). Please check username & password` + ); + return null; + } + + authResponse = await makeOpenMediaVaultRPCCall( + 'session', + 'login', + { + username: findAppProperty(app, 'username'), + password: findAppProperty(app, 'password'), + }, + {}, + input + ); + + const cookies = authResponse.headers['set-cookie'] || []; + sessionId = cookies + .find((cookie: any) => cookie.includes('X-OPENMEDIAVAULT-SESSIONID')) + ?.split(';')[0]; + loginToken = cookies + .find((cookie: any) => cookie.includes('X-OPENMEDIAVAULT-LOGIN')) + ?.split(';')[0]; + } + + const [systemInfoResponse, fileSystemResponse, cpuTempResponse] = await Promise.all([ + makeOpenMediaVaultRPCCall( + 'system', + 'getInformation', + {}, + { Cookie: `${loginToken};${sessionId}` }, + input + ), + makeOpenMediaVaultRPCCall( + 'filesystemmgmt', + 'enumerateMountedFilesystems', + { includeroot: true }, + { Cookie: `${loginToken};${sessionId}` }, + input + ), + makeOpenMediaVaultRPCCall( + 'cputemp', + 'get', + {}, + { Cookie: `${loginToken};${sessionId}` }, + input + ), + ]); + + return { + authenticated: authResponse ? authResponse.data.response.authenticated : true, + systemInfo: systemInfoResponse?.data.response, + fileSystem: fileSystemResponse?.data.response, + cpuTemp: cpuTempResponse?.data.response, + }; + }), +}); diff --git a/src/tools/server/translation-namespaces.ts b/src/tools/server/translation-namespaces.ts index 33487f83d95..fe698859f4b 100644 --- a/src/tools/server/translation-namespaces.ts +++ b/src/tools/server/translation-namespaces.ts @@ -21,6 +21,7 @@ export const boardNamespaces = [ 'modules/docker', 'modules/dashdot', 'modules/overseerr', + 'modules/health-monitoring', 'modules/media-server', 'modules/indexer-manager', 'modules/common-media-cards', diff --git a/src/types/app.ts b/src/types/app.ts index 19258278cd4..ec3e4848a75 100644 --- a/src/types/app.ts +++ b/src/types/app.ts @@ -57,7 +57,8 @@ export type IntegrationType = | 'nzbGet' | 'pihole' | 'adGuardHome' - | 'homeAssistant'; + | 'homeAssistant' + | 'openmediavault'; export type AppIntegrationType = { type: IntegrationType | null; @@ -101,6 +102,7 @@ export const integrationFieldProperties: { pihole: ['apiKey'], adGuardHome: ['username', 'password'], homeAssistant: ['apiKey'], + openmediavault: ['username', 'password'], }; export type IntegrationFieldDefinitionType = { diff --git a/src/widgets/health-monitoring/HealthMonitoringCpu.tsx b/src/widgets/health-monitoring/HealthMonitoringCpu.tsx new file mode 100644 index 00000000000..d023d7d43cb --- /dev/null +++ b/src/widgets/health-monitoring/HealthMonitoringCpu.tsx @@ -0,0 +1,111 @@ +import { Center, Flex, Group, HoverCard, RingProgress, Text } from '@mantine/core'; +import { IconCpu } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; + +const HealthMonitoringCpu = ({ info, cpuTemp, fahrenheit }: any) => { + const { t } = useTranslation('modules/health-monitoring'); + const toFahrenheit = (value: number) => { + return Math.round(value * 1.8 + 32); + }; + + interface LoadDataItem { + label: string; + stats: number; + progress: number; + color: string; + } + + const loadData = [ + { + label: `${t('cpu.minute', { minute: 1 })}`, + stats: info.loadAverage['1min'], + progress: info.loadAverage['1min'], + color: 'teal', + }, + { + label: `${t('cpu.minute', { minute: 5 })}`, + stats: info.loadAverage['5min'], + progress: info.loadAverage['5min'], + color: 'blue', + }, + { + label: `${t('cpu.minute', { minute: 15 })}`, + stats: info.loadAverage['15min'], + progress: info.loadAverage['15min'], + color: 'red', + }, + ] as const; + + return ( + + + {info.cpuUtilization.toFixed(2)}% + + + + + + + {t('cpu.load')} + + + {loadData.map((load: LoadDataItem) => ( + + {load.progress} + + } + sections={[{ value: load.progress, color: load.color, tooltip: load.label }]} + /> + ))} + + + + + } + sections={[ + { + value: info.cpuUtilization.toFixed(2), + color: info.cpuUtilization.toFixed(2) > 70 ? 'red' : 'green', + }, + ]} + /> + + {fahrenheit ? `${toFahrenheit(cpuTemp.cputemp)}°F` : `${cpuTemp.cputemp}°C`} + + + } + sections={[ + { + value: cpuTemp.cputemp, + color: cpuTemp.cputemp < 60 ? 'green' : 'red', + }, + ]} + /> + + ); +}; + +export default HealthMonitoringCpu; diff --git a/src/widgets/health-monitoring/HealthMonitoringFileSystem.tsx b/src/widgets/health-monitoring/HealthMonitoringFileSystem.tsx new file mode 100644 index 00000000000..0efa5907044 --- /dev/null +++ b/src/widgets/health-monitoring/HealthMonitoringFileSystem.tsx @@ -0,0 +1,62 @@ +import { Center, Flex, Group, HoverCard, RingProgress, Text } from '@mantine/core'; +import { IconServer } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; +import { humanFileSize } from '~/tools/humanFileSize'; + +import { ringColor } from './HealthMonitoringTile'; + +const HealthMonitoringFileSystem = ({ fileSystem }: any) => { + const { t } = useTranslation('modules/health-monitoring'); + + interface FileSystemDisk { + devicename: string; + used: string; + percentage: number; + available: number; + } + + return ( + + + {fileSystem.map((disk: FileSystemDisk) => ( + + {disk.devicename} + + + + + + + {t('fileSystem.available', { + available: humanFileSize(disk.available), + percentage: 100 - disk.percentage, + })} + + + + + } + sections={[ + { + value: disk.percentage, + color: ringColor(disk.percentage), + tooltip: disk.used, + }, + ]} + /> + ))} + + + ); +}; + +export default HealthMonitoringFileSystem; diff --git a/src/widgets/health-monitoring/HealthMonitoringMemory.tsx b/src/widgets/health-monitoring/HealthMonitoringMemory.tsx new file mode 100644 index 00000000000..8da67b77278 --- /dev/null +++ b/src/widgets/health-monitoring/HealthMonitoringMemory.tsx @@ -0,0 +1,50 @@ +import { Center, Group, HoverCard, RingProgress, Text } from '@mantine/core'; +import { IconBrain } from '@tabler/icons-react'; +import { useTranslation } from 'react-i18next'; + +import { ringColor } from './HealthMonitoringTile'; + +const HealthMonitoringMemory = ({ info }: any) => { + const { t } = useTranslation('modules/health-monitoring'); + const totalMemoryGB: any = (info.memTotal / 1024 ** 3).toFixed(2); + const freeMemoryGB: any = (info.memAvailable / 1024 ** 3).toFixed(2); + const usedMemoryGB: any = ((info.memTotal - info.memAvailable) / 1024 ** 3).toFixed(2); + const percentageUsed: any = ((usedMemoryGB / totalMemoryGB) * 100).toFixed(2); + const percentageFree: any = (100 - percentageUsed).toFixed(2); + + return ( + + + {usedMemoryGB}GiB + + + + + + + {t('memory.totalMem', { total: totalMemoryGB })} + + + {t('memory.available', { available: freeMemoryGB, percentage: percentageFree })} + + + + + } + sections={[ + { + value: percentageUsed, + color: ringColor(percentageUsed), + }, + ]} + /> + + ); +}; + +export default HealthMonitoringMemory; diff --git a/src/widgets/health-monitoring/HealthMonitoringTile.tsx b/src/widgets/health-monitoring/HealthMonitoringTile.tsx new file mode 100644 index 00000000000..251936bc6a9 --- /dev/null +++ b/src/widgets/health-monitoring/HealthMonitoringTile.tsx @@ -0,0 +1,130 @@ +import { Card, Divider, Flex, Group, ScrollArea, Text } from '@mantine/core'; +import { + IconCloudDownload, + IconHeartRateMonitor, + IconInfoSquare, + IconStatusChange, +} from '@tabler/icons-react'; +import { useTranslation } from 'next-i18next'; +import { useConfigContext } from '~/config/provider'; +import { api } from '~/utils/api'; + +import { defineWidget } from '../helper'; +import { WidgetLoading } from '../loading'; +import { IWidget } from '../widgets'; +import HealthMonitoringCpu from './HealthMonitoringCpu'; +import HealthMonitoringFileSystem from './HealthMonitoringFileSystem'; +import HealthMonitoringMemory from './HealthMonitoringMemory'; + +const definition = defineWidget({ + id: 'health-monitoring', + icon: IconHeartRateMonitor, + options: { + fahrenheit: { + type: 'switch', + defaultValue: false, + }, + cpu: { + type: 'switch', + defaultValue: true, + }, + memory: { + type: 'switch', + defaultValue: true, + }, + fileSystem: { + type: 'switch', + defaultValue: true, + }, + }, + gridstack: { + minWidth: 1, + minHeight: 1, + maxWidth: 6, + maxHeight: 6, + }, + component: HealthMonitoringWidgetTile, +}); + +export type IHealthMonitoringWidget = IWidget<(typeof definition)['id'], typeof definition>; + +interface HealthMonitoringWidgetProps { + widget: IHealthMonitoringWidget; +} +function HealthMonitoringWidgetTile({ widget }: HealthMonitoringWidgetProps) { + const { t } = useTranslation('modules/health-monitoring'); + const { isInitialLoading, data } = useOpenmediavaultQuery(); + + if (isInitialLoading || !data) { + return ; + } + + const formatUptime = (uptime: number) => { + const days = Math.floor(uptime / (60 * 60 * 24)); + const remainingHours = Math.floor((uptime % (60 * 60 * 24)) / 3600); + return `${days} days, ${remainingHours} hours`; + }; + + return ( + + + + + + + {t('info.uptime')}: +
+ {formatUptime(data.systemInfo.uptime)} +
+ + {data.systemInfo.availablePkgUpdates === 0 ? ( + '' + ) : ( + + )} + {data.systemInfo.rebootRequired ? : ''} + +
+
+ + + {widget?.properties.cpu && ( + + )} + {widget?.properties.memory && } + + {widget?.properties.fileSystem && ( + <> + + + + )} +
+
+ ); +} + +export const ringColor = (percentage: number) => { + if (percentage < 30) return 'green'; + else if (percentage < 60) return 'yellow'; + else if (percentage < 90) return 'orange'; + else return 'red'; +}; + +export const useOpenmediavaultQuery = () => { + const { name: configName } = useConfigContext(); + return api.openmediavault.fetchData.useQuery( + { + configName: configName!, + }, + { + staleTime: 1000 * 10, + } + ); +}; + +export default definition; diff --git a/src/widgets/index.ts b/src/widgets/index.ts index 1bc9bd18fe7..1666722bf8b 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -5,6 +5,7 @@ import date from './date/DateTile'; import dnsHoleControls from './dnshole/DnsHoleControls'; import dnsHoleSummary from './dnshole/DnsHoleSummary'; import torrentNetworkTraffic from './download-speed/TorrentNetworkTrafficTile'; +import healthMonitoring from './health-monitoring/HealthMonitoringTile'; import iframe from './iframe/IFrameTile'; import indexerManager from './indexer-manager/IndexerManagerTile'; import mediaRequestsList from './media-requests/MediaRequestListTile'; @@ -40,4 +41,5 @@ export default { notebook, 'smart-home/entity-state': smartHomeEntityState, 'smart-home/trigger-automation': smartHomeTriggerAutomation, + 'health-monitoring': healthMonitoring, }; From 9c81d34d66be724833fde9f8fe8dadabc975ecb9 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 9 Mar 2024 16:37:36 +0100 Subject: [PATCH 06/16] feat: add ldap search scope (#1948) --- src/env.js | 4 ++++ src/utils/auth/ldap.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/env.js b/src/env.js index 8d0c642d934..d4354b4689b 100644 --- a/src/env.js +++ b/src/env.js @@ -4,6 +4,8 @@ const { createEnv } = require('@t3-oss/env-nextjs'); const trueStrings = ['1', 't', 'T', 'TRUE', 'true', 'True']; const falseStrings = ['0', 'f', 'F', 'FALSE', 'false', 'False']; +const ldapSearchScope = z.enum(['base', 'one', 'sub']).default('base'); + const zodParsedBoolean = () => z .enum([...trueStrings, ...falseStrings]) @@ -52,6 +54,7 @@ const env = createEnv({ AUTH_LDAP_BIND_DN: z.string(), AUTH_LDAP_BIND_PASSWORD: z.string(), AUTH_LDAP_BASE: z.string(), + AUTH_LDAP_SEARCH_SCOPE: z.enum(['base', 'one', 'sub']).default('base'), AUTH_LDAP_USERNAME_ATTRIBUTE: z.string().default('uid'), AUTH_LDAP_GROUP_CLASS: z.string().default('groupOfUniqueNames'), AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: z.string().default('member'), @@ -115,6 +118,7 @@ const env = createEnv({ AUTH_LDAP_BIND_DN: process.env.AUTH_LDAP_BIND_DN, AUTH_LDAP_BIND_PASSWORD: process.env.AUTH_LDAP_BIND_PASSWORD, AUTH_LDAP_BASE: process.env.AUTH_LDAP_BASE, + AUTH_LDAP_SEARCH_SCOPE: process.env.AUTH_LDAP_SEARCH_SCOPE?.toLowerCase(), AUTH_LDAP_USERNAME_ATTRIBUTE: process.env.AUTH_LDAP_USERNAME_ATTRIBUTE, AUTH_LDAP_GROUP_CLASS: process.env.AUTH_LDAP_GROUP_CLASS, AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: process.env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE, diff --git a/src/utils/auth/ldap.ts b/src/utils/auth/ldap.ts index 91d0761b1e6..879e0ccd8ab 100644 --- a/src/utils/auth/ldap.ts +++ b/src/utils/auth/ldap.ts @@ -20,8 +20,8 @@ type InferrableSearchOptions< type SearchResultIndex = Attributes extends string ? Attributes : Attributes extends readonly string[] - ? Attributes[number] - : string; + ? Attributes[number] + : string; type SearchResult< Attributes extends AttributeConstraint, @@ -101,11 +101,14 @@ export default Credentials({ const ldapUser = ( await ldapSearch(client, env.AUTH_LDAP_BASE, { filter: `(uid=${data.name})`, + scope: env.AUTH_LDAP_SEARCH_SCOPE, // as const for inference attributes: ['uid', 'mail'] as const, }) )[0]; + if (!ldapUser) throw new Error('User not found in LDAP'); + await ldapLogin(ldapUser.dn, data.password).then((client) => client.destroy()); const userGroups = ( @@ -113,6 +116,7 @@ export default Credentials({ filter: `(&(objectclass=${env.AUTH_LDAP_GROUP_CLASS})(${ env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE }=${ldapUser[env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE as 'dn' | 'uid']}))`, + scope: env.AUTH_LDAP_SEARCH_SCOPE, // as const for inference attributes: 'cn', }) From 93379145acc19b576d5c9f95db03e4f095db1846 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Sat, 9 Mar 2024 16:48:52 +0100 Subject: [PATCH 07/16] fix: log when incorrect and show error in login page (#1943) * feat: Add logs for incorrect AUTH_PROVIDER and show in login page * feat: format any entry to lower case for AUTH_PROVIDER * fix: Change simple text to Alert element on login page --- public/locales/en/authentication/login.json | 6 +++++- src/env.js | 17 ++++++++++++++++- src/pages/auth/login.tsx | 16 +++++++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/public/locales/en/authentication/login.json b/public/locales/en/authentication/login.json index 33fcdd9d75b..dbc8be63240 100644 --- a/public/locales/en/authentication/login.json +++ b/public/locales/en/authentication/login.json @@ -14,7 +14,11 @@ "buttons": { "submit": "Sign in" }, - "afterLoginRedirection": "After login, you'll be redirected to {{url}}" + "afterLoginRedirection": "After login, you'll be redirected to {{url}}", + "providersEmpty": { + "title": "Auth Provider Error", + "message": "The provider(s) are unset, please check your logs for more information." + } }, "alert": "Your credentials are incorrect or this account doesn't exist. Please try again." } \ No newline at end of file diff --git a/src/env.js b/src/env.js index d4354b4689b..203a48be940 100644 --- a/src/env.js +++ b/src/env.js @@ -19,6 +19,7 @@ const portSchema = z .optional(); const envSchema = z.enum(['development', 'test', 'production']); +const validAuthProviders = ['credentials', 'ldap', 'oidc']; const authProviders = process.env.AUTH_PROVIDER?.replaceAll(' ', '').split(',') || ['credentials']; const env = createEnv({ @@ -45,8 +46,22 @@ const env = createEnv({ // Authentication AUTH_PROVIDER: z .string() + .min(1) .default('credentials') - .transform((providers) => providers.replaceAll(' ', '').split(',')), + .transform((providers) => + providers + .replaceAll(' ', '') + .toLowerCase() + .split(',') + .filter((provider) => { + if (validAuthProviders.includes(provider)) return provider; + else if (!provider) + console.log( + `One or more of the entries for AUTH_PROVIDER could not be parsed and/or returned null.` + ); + else console.log(`The value entered for AUTH_PROVIDER "${provider}" is incorrect.`); + }) + ), // LDAP ...(authProviders.includes('ldap') ? { diff --git a/src/pages/auth/login.tsx b/src/pages/auth/login.tsx index 482e1db6e4d..19b8442f284 100644 --- a/src/pages/auth/login.tsx +++ b/src/pages/auth/login.tsx @@ -124,9 +124,19 @@ export default function LoginPage({ {t('title')} - - {t('text')} - + {(providers.length < 1 && ( + } + title={t('form.providersEmpty.title')} + mt={5} + > + {t('form.providersEmpty.message')} + + )) || ( + + {t('text')} + + )} {isError && ( } color="red"> From 18bd9c856d17687c1938fbd3a1a24ea9996f4557 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Sat, 9 Mar 2024 16:49:30 +0100 Subject: [PATCH 08/16] config: add Lithuanian support (#1935) --- next-i18next.config.js | 1 + src/tools/language.ts | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/next-i18next.config.js b/next-i18next.config.js index 0fab2457f55..98e4674cc7c 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -33,6 +33,7 @@ module.exports = { 'tw', 'uk', 'vi', + 'lt', ], localeDetection: false, diff --git a/src/tools/language.ts b/src/tools/language.ts index b219b98f1b8..051b438a8b6 100644 --- a/src/tools/language.ts +++ b/src/tools/language.ts @@ -238,6 +238,15 @@ export const languages = [ locale: 'vi', dayJsLocale: 'vi' }, + // Lithuanian + { + shortName: 'lt', + originalName: 'Lietuvių', + translatedName: 'Lithuanian', + country: 'LT', + locale: 'lt', + dayJsLocale: 'lt' + } ] as const satisfies Readonly; export const getLanguageByCode = (code: string | null): Language => From 090642058421f165fd990542e69cb3acd0c9a4d4 Mon Sep 17 00:00:00 2001 From: Tagaishi Date: Sat, 9 Mar 2024 16:52:47 +0100 Subject: [PATCH 09/16] feat: Mention Emby on Jellyfin integration (#1917) --- .../Components/InputElements/IntegrationSelector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx index 7f79bf2cd19..bedb543a2ee 100644 --- a/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx +++ b/src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx @@ -171,7 +171,7 @@ export const availableIntegrations = [ { value: 'jellyfin', image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyfin.png', - label: 'Jellyfin', + label: 'Jellyfin (and Emby)', }, { value: 'plex', From 918585c3e24096312fa185b6af13a6c701116ece Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Sat, 9 Mar 2024 17:57:16 +0200 Subject: [PATCH 10/16] feat: add weekly forecast to weather widget (#1932) --- public/locales/en/modules/weather.json | 6 + src/server/api/routers/weather.ts | 2 + src/widgets/weather/WeatherTile.tsx | 174 ++++++++++++++++--------- 3 files changed, 122 insertions(+), 60 deletions(-) diff --git a/public/locales/en/modules/weather.json b/public/locales/en/modules/weather.json index 9801bb9079d..2568164b646 100644 --- a/public/locales/en/modules/weather.json +++ b/public/locales/en/modules/weather.json @@ -10,6 +10,12 @@ "displayCityName":{ "label":"Display City Name" }, + "displayWeekly":{ + "label": "Display Weekly Forecast" + }, + "forecastDays":{ + "label": "Days To Display" + }, "location": { "label": "Weather location" } diff --git a/src/server/api/routers/weather.ts b/src/server/api/routers/weather.ts index ac83728b3a8..871c33dca4a 100644 --- a/src/server/api/routers/weather.ts +++ b/src/server/api/routers/weather.ts @@ -18,6 +18,8 @@ const weatherSchema = z.object({ temperature: z.number(), }), daily: z.object({ + time: z.array(z.string()), + weathercode: z.array(z.number()), temperature_2m_max: z.array(z.number()), temperature_2m_min: z.array(z.number()), }), diff --git a/src/widgets/weather/WeatherTile.tsx b/src/widgets/weather/WeatherTile.tsx index 1ace6244729..91b8311a958 100644 --- a/src/widgets/weather/WeatherTile.tsx +++ b/src/widgets/weather/WeatherTile.tsx @@ -1,4 +1,4 @@ -import { Center, Flex, Group, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { Card, Center, Flex, Group, Stack, Text, Title } from '@mantine/core'; import { useElementSize } from '@mantine/hooks'; import { IconArrowDownRight, @@ -7,9 +7,11 @@ import { IconMapPin, } from '@tabler/icons-react'; import { useTranslation } from 'react-i18next'; +import { Weather } from '~/server/api/routers/weather'; import { api } from '~/utils/api'; import { defineWidget } from '../helper'; +import { WidgetLoading } from '../loading'; import { IWidget } from '../widgets'; import { WeatherIcon } from './WeatherIcon'; @@ -25,6 +27,17 @@ const definition = defineWidget({ type: 'switch', defaultValue: false, }, + displayWeekly: { + type: 'switch', + defaultValue: false, + }, + forecastDays: { + type: 'slider', + defaultValue: 5, + min: 1, + max: 7, + step: 1, + }, location: { type: 'location', defaultValue: { @@ -55,24 +68,7 @@ function WeatherTile({ widget }: WeatherTileProps) { const { t } = useTranslation('modules/weather'); if (isLoading) { - return ( - - - - - - - - - - - ); + return ; } if (isError) { @@ -83,56 +79,114 @@ function WeatherTile({ widget }: WeatherTileProps) { ); } - // TODO: add widgetWrapper that is generic and uses the definition return ( - - - - - {getPerferedUnit( - weather.current_weather.temperature, - widget.properties.displayInFahrenheit - )} - - + + {(widget?.properties.displayWeekly && ( + <> + + {widget.properties.displayCityName && ( + + + + {widget.properties.location.name} + + + )} + + 20 ? 'red' : 'blue'}> + {getPreferredUnit( + weather.current_weather.temperature, + widget.properties.displayInFahrenheit + )} + + + + + )) || ( + <> + + + + {getPreferredUnit( + weather.current_weather.temperature, + widget.properties.displayInFahrenheit + )} + + - {width > 200 && ( - - - {getPerferedUnit( - weather.daily.temperature_2m_max[0], - widget.properties.displayInFahrenheit + {width > 200 && ( + + + {getPreferredUnit( + weather.daily.temperature_2m_max[0], + widget.properties.displayInFahrenheit + )} + + {getPreferredUnit( + weather.daily.temperature_2m_min[0], + widget.properties.displayInFahrenheit + )} + )} - - {getPerferedUnit( - weather.daily.temperature_2m_min[0], - widget.properties.displayInFahrenheit - )} - - )} - {widget.properties.displayCityName && ( - - - {widget.properties.location.name} - + {widget.properties.displayCityName && ( + + + {widget.properties.location.name} + + )} + )} ); } -const getPerferedUnit = (value: number, isFahrenheit = false): string => +const getPreferredUnit = (value: number, isFahrenheit = false): string => isFahrenheit ? `${(value * (9 / 5) + 32).toFixed(1)}°F` : `${value.toFixed(1)}°C`; +interface ForecastProps { + weather: Weather; + widget: IWeatherWidget; +} + +function Forecast({ weather: { daily }, widget }: ForecastProps) { + const { width } = useElementSize(); + return ( + + {daily.time.slice(0, widget.properties.forecastDays).map((time: any, index: number) => ( + + + + {time.split('-')[2]} + + + + {getPreferredUnit( + daily.temperature_2m_max[index], + widget.properties.displayInFahrenheit + )} + + + {getPreferredUnit( + daily.temperature_2m_min[index], + widget.properties.displayInFahrenheit + )} + + + + ))} + + ); +} + export default definition; From 28bd849af7477e409570d09545929a4af4bb769a Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Sat, 9 Mar 2024 16:58:24 +0100 Subject: [PATCH 11/16] feat: add Estonian language (#1931) Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com> --- next-i18next.config.js | 1 + src/tools/language.ts | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/next-i18next.config.js b/next-i18next.config.js index 98e4674cc7c..4c67b5cf323 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -33,6 +33,7 @@ module.exports = { 'tw', 'uk', 'vi', + 'et', 'lt', ], diff --git a/src/tools/language.ts b/src/tools/language.ts index 051b438a8b6..4fba03a996a 100644 --- a/src/tools/language.ts +++ b/src/tools/language.ts @@ -238,6 +238,14 @@ export const languages = [ locale: 'vi', dayJsLocale: 'vi' }, + { + shortName: 'et', + originalName: 'Eesti', + translatedName: 'Estonian', + country: 'EE', + locale: 'et', + dayJsLocale: 'et' + }, // Lithuanian { shortName: 'lt', From e23e25890aab0113ac14d8c73ad91dc09e146565 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Sat, 9 Mar 2024 17:56:56 +0100 Subject: [PATCH 12/16] chore: new Crowdin updates (#1890) --- .../locales/cn/modules/health-monitoring.json | 37 +++++ .../locales/cn/modules/indexer-manager.json | 19 +++ .../cn/modules/smart-home/entity-state.json | 14 +- .../locales/cr/modules/health-monitoring.json | 37 +++++ .../locales/cr/modules/indexer-manager.json | 19 +++ .../cr/modules/smart-home/entity-state.json | 8 ++ .../locales/cs/modules/health-monitoring.json | 37 +++++ .../locales/cs/modules/indexer-manager.json | 19 +++ .../cs/modules/smart-home/entity-state.json | 8 ++ .../smart-home/trigger-automation.json | 4 +- public/locales/da/common.json | 2 +- public/locales/da/manage/boards.json | 10 +- .../locales/da/modules/health-monitoring.json | 37 +++++ .../locales/da/modules/indexer-manager.json | 19 +++ public/locales/da/modules/rss.json | 2 +- .../da/modules/smart-home/entity-state.json | 8 ++ .../locales/de/modules/health-monitoring.json | 37 +++++ .../locales/de/modules/indexer-manager.json | 19 +++ public/locales/de/modules/rss.json | 2 +- .../de/modules/smart-home/entity-state.json | 8 ++ .../locales/el/modules/health-monitoring.json | 37 +++++ .../locales/el/modules/indexer-manager.json | 19 +++ .../el/modules/smart-home/entity-state.json | 8 ++ .../locales/es/modules/health-monitoring.json | 37 +++++ .../locales/es/modules/indexer-manager.json | 19 +++ .../es/modules/smart-home/entity-state.json | 8 ++ public/locales/et/authentication/invite.json | 35 +++++ public/locales/et/authentication/login.json | 20 +++ public/locales/et/boards/common.json | 5 + public/locales/et/boards/customize.json | 29 ++++ public/locales/et/common.json | 58 ++++++++ public/locales/et/layout/common.json | 25 ++++ .../et/layout/element-selector/selector.json | 26 ++++ .../et/layout/errors/access-denied.json | 1 + .../locales/et/layout/errors/not-found.json | 1 + public/locales/et/layout/header.json | 27 ++++ .../header/actions/toggle-edit-mode.json | 12 ++ public/locales/et/layout/manage.json | 36 +++++ public/locales/et/layout/mobile/drawer.json | 1 + public/locales/et/layout/modals/about.json | 30 ++++ public/locales/et/layout/modals/add-app.json | 128 ++++++++++++++++++ .../et/layout/modals/change-position.json | 1 + public/locales/et/manage/boards.json | 57 ++++++++ public/locales/et/manage/index.json | 23 ++++ public/locales/et/manage/users.json | 44 ++++++ public/locales/et/manage/users/create.json | 52 +++++++ public/locales/et/manage/users/edit.json | 55 ++++++++ public/locales/et/manage/users/invites.json | 48 +++++++ public/locales/et/modules/bookmark.json | 43 ++++++ public/locales/et/modules/calendar.json | 33 +++++ .../et/modules/common-media-cards.json | 6 + public/locales/et/modules/common.json | 10 ++ public/locales/et/modules/dashdot.json | 118 ++++++++++++++++ public/locales/et/modules/date.json | 34 +++++ public/locales/et/modules/dlspeed.json | 35 +++++ .../locales/et/modules/dns-hole-controls.json | 18 +++ .../locales/et/modules/dns-hole-summary.json | 28 ++++ public/locales/et/modules/docker.json | 83 ++++++++++++ .../locales/et/modules/health-monitoring.json | 37 +++++ public/locales/et/modules/iframe.json | 45 ++++++ .../locales/et/modules/indexer-manager.json | 19 +++ .../et/modules/media-requests-list.json | 35 +++++ .../et/modules/media-requests-stats.json | 27 ++++ public/locales/et/modules/media-server.json | 25 ++++ public/locales/et/modules/notebook.json | 59 ++++++++ public/locales/et/modules/overseerr.json | 30 ++++ public/locales/et/modules/ping.json | 11 ++ public/locales/et/modules/rss.json | 40 ++++++ public/locales/et/modules/search.json | 30 ++++ .../et/modules/smart-home/entity-state.json | 29 ++++ .../smart-home/trigger-automation.json | 16 +++ .../locales/et/modules/torrents-status.json | 103 ++++++++++++++ public/locales/et/modules/usenet.json | 49 +++++++ public/locales/et/modules/video-stream.json | 24 ++++ public/locales/et/modules/weather.json | 37 +++++ public/locales/et/password-requirements.json | 1 + public/locales/et/settings/common.json | 38 ++++++ .../et/settings/customization/access.json | 6 + .../et/settings/customization/general.json | 29 ++++ .../et/settings/customization/gridstack.json | 10 ++ .../customization/opacity-selector.json | 1 + .../customization/page-appearance.json | 50 +++++++ .../customization/shade-selector.json | 1 + public/locales/et/tools/docker.json | 32 +++++ public/locales/et/user/preferences.json | 48 +++++++ public/locales/et/widgets/draggable-list.json | 7 + public/locales/et/widgets/error-boundary.json | 14 ++ public/locales/et/zod.json | 22 +++ .../locales/fr/modules/health-monitoring.json | 37 +++++ .../locales/fr/modules/indexer-manager.json | 19 +++ .../fr/modules/smart-home/entity-state.json | 8 ++ .../locales/he/modules/health-monitoring.json | 37 +++++ .../locales/he/modules/indexer-manager.json | 19 +++ .../he/modules/smart-home/entity-state.json | 8 ++ .../locales/hr/modules/health-monitoring.json | 37 +++++ .../locales/hr/modules/indexer-manager.json | 19 +++ .../hr/modules/smart-home/entity-state.json | 8 ++ .../locales/hu/modules/health-monitoring.json | 37 +++++ .../locales/hu/modules/indexer-manager.json | 19 +++ .../hu/modules/smart-home/entity-state.json | 8 ++ .../locales/it/modules/health-monitoring.json | 37 +++++ .../locales/it/modules/indexer-manager.json | 19 +++ .../it/modules/smart-home/entity-state.json | 8 ++ .../locales/ja/modules/health-monitoring.json | 37 +++++ .../locales/ja/modules/indexer-manager.json | 19 +++ .../ja/modules/smart-home/entity-state.json | 8 ++ .../locales/ko/modules/health-monitoring.json | 37 +++++ .../locales/ko/modules/indexer-manager.json | 19 +++ .../ko/modules/smart-home/entity-state.json | 8 ++ public/locales/lt/authentication/invite.json | 35 +++++ public/locales/lt/authentication/login.json | 20 +++ public/locales/lt/boards/common.json | 5 + public/locales/lt/boards/customize.json | 29 ++++ public/locales/lt/common.json | 58 ++++++++ public/locales/lt/layout/common.json | 25 ++++ .../lt/layout/element-selector/selector.json | 26 ++++ .../lt/layout/errors/access-denied.json | 5 + .../locales/lt/layout/errors/not-found.json | 5 + public/locales/lt/layout/header.json | 27 ++++ .../header/actions/toggle-edit-mode.json | 12 ++ public/locales/lt/layout/manage.json | 36 +++++ public/locales/lt/layout/mobile/drawer.json | 3 + public/locales/lt/layout/modals/about.json | 30 ++++ public/locales/lt/layout/modals/add-app.json | 128 ++++++++++++++++++ .../lt/layout/modals/change-position.json | 8 ++ public/locales/lt/manage/boards.json | 57 ++++++++ public/locales/lt/manage/index.json | 23 ++++ public/locales/lt/manage/users.json | 44 ++++++ public/locales/lt/manage/users/create.json | 52 +++++++ public/locales/lt/manage/users/edit.json | 55 ++++++++ public/locales/lt/manage/users/invites.json | 48 +++++++ public/locales/lt/modules/bookmark.json | 43 ++++++ public/locales/lt/modules/calendar.json | 33 +++++ .../lt/modules/common-media-cards.json | 6 + public/locales/lt/modules/common.json | 10 ++ public/locales/lt/modules/dashdot.json | 118 ++++++++++++++++ public/locales/lt/modules/date.json | 34 +++++ public/locales/lt/modules/dlspeed.json | 35 +++++ .../locales/lt/modules/dns-hole-controls.json | 18 +++ .../locales/lt/modules/dns-hole-summary.json | 28 ++++ public/locales/lt/modules/docker.json | 83 ++++++++++++ .../locales/lt/modules/health-monitoring.json | 37 +++++ public/locales/lt/modules/iframe.json | 45 ++++++ .../locales/lt/modules/indexer-manager.json | 19 +++ .../lt/modules/media-requests-list.json | 35 +++++ .../lt/modules/media-requests-stats.json | 27 ++++ public/locales/lt/modules/media-server.json | 25 ++++ public/locales/lt/modules/notebook.json | 59 ++++++++ public/locales/lt/modules/overseerr.json | 30 ++++ public/locales/lt/modules/ping.json | 11 ++ public/locales/lt/modules/rss.json | 40 ++++++ public/locales/lt/modules/search.json | 30 ++++ .../lt/modules/smart-home/entity-state.json | 29 ++++ .../smart-home/trigger-automation.json | 16 +++ .../locales/lt/modules/torrents-status.json | 103 ++++++++++++++ public/locales/lt/modules/usenet.json | 49 +++++++ public/locales/lt/modules/video-stream.json | 24 ++++ public/locales/lt/modules/weather.json | 37 +++++ public/locales/lt/password-requirements.json | 1 + public/locales/lt/settings/common.json | 38 ++++++ .../lt/settings/customization/access.json | 6 + .../lt/settings/customization/general.json | 29 ++++ .../lt/settings/customization/gridstack.json | 10 ++ .../customization/opacity-selector.json | 1 + .../customization/page-appearance.json | 50 +++++++ .../customization/shade-selector.json | 1 + public/locales/lt/tools/docker.json | 32 +++++ public/locales/lt/user/preferences.json | 48 +++++++ public/locales/lt/widgets/draggable-list.json | 7 + public/locales/lt/widgets/error-boundary.json | 14 ++ public/locales/lt/zod.json | 22 +++ .../locales/lv/modules/health-monitoring.json | 37 +++++ .../locales/lv/modules/indexer-manager.json | 19 +++ .../lv/modules/smart-home/entity-state.json | 8 ++ .../locales/nl/modules/health-monitoring.json | 37 +++++ .../locales/nl/modules/indexer-manager.json | 19 +++ .../nl/modules/smart-home/entity-state.json | 8 ++ .../locales/no/modules/health-monitoring.json | 37 +++++ .../locales/no/modules/indexer-manager.json | 19 +++ .../no/modules/smart-home/entity-state.json | 8 ++ .../locales/pl/modules/health-monitoring.json | 37 +++++ .../locales/pl/modules/indexer-manager.json | 19 +++ .../pl/modules/smart-home/entity-state.json | 8 ++ public/locales/pt/common.json | 4 +- .../pt/layout/element-selector/selector.json | 2 +- public/locales/pt/layout/manage.json | 2 +- public/locales/pt/manage/boards.json | 10 +- public/locales/pt/manage/users.json | 8 +- public/locales/pt/manage/users/edit.json | 32 ++--- public/locales/pt/modules/dashdot.json | 2 +- public/locales/pt/modules/date.json | 14 +- public/locales/pt/modules/docker.json | 2 +- .../locales/pt/modules/health-monitoring.json | 37 +++++ .../locales/pt/modules/indexer-manager.json | 19 +++ .../pt/modules/media-requests-list.json | 4 +- public/locales/pt/modules/rss.json | 6 +- public/locales/pt/modules/search.json | 6 +- .../pt/modules/smart-home/entity-state.json | 12 +- .../smart-home/trigger-automation.json | 10 +- .../locales/pt/modules/torrents-status.json | 18 +-- public/locales/pt/modules/weather.json | 8 +- public/locales/pt/settings/common.json | 2 +- .../locales/ru/modules/health-monitoring.json | 37 +++++ .../locales/ru/modules/indexer-manager.json | 19 +++ .../ru/modules/smart-home/entity-state.json | 8 ++ .../locales/sk/modules/health-monitoring.json | 37 +++++ .../locales/sk/modules/indexer-manager.json | 19 +++ .../sk/modules/smart-home/entity-state.json | 8 ++ .../locales/sl/modules/health-monitoring.json | 37 +++++ .../locales/sl/modules/indexer-manager.json | 19 +++ .../sl/modules/smart-home/entity-state.json | 8 ++ .../locales/sv/modules/health-monitoring.json | 37 +++++ .../locales/sv/modules/indexer-manager.json | 19 +++ .../sv/modules/smart-home/entity-state.json | 8 ++ .../locales/tr/modules/health-monitoring.json | 37 +++++ .../locales/tr/modules/indexer-manager.json | 19 +++ .../tr/modules/smart-home/entity-state.json | 8 ++ .../smart-home/trigger-automation.json | 2 +- public/locales/tr/password-requirements.json | 10 +- .../locales/tw/modules/health-monitoring.json | 37 +++++ .../locales/tw/modules/indexer-manager.json | 19 +++ .../tw/modules/smart-home/entity-state.json | 8 ++ .../locales/uk/modules/health-monitoring.json | 37 +++++ .../locales/uk/modules/indexer-manager.json | 19 +++ .../uk/modules/smart-home/entity-state.json | 8 ++ .../locales/vi/modules/health-monitoring.json | 37 +++++ .../locales/vi/modules/indexer-manager.json | 19 +++ public/locales/vi/modules/rss.json | 4 +- .../vi/modules/smart-home/entity-state.json | 8 ++ 229 files changed, 5827 insertions(+), 88 deletions(-) create mode 100644 public/locales/cn/modules/health-monitoring.json create mode 100644 public/locales/cn/modules/indexer-manager.json create mode 100644 public/locales/cr/modules/health-monitoring.json create mode 100644 public/locales/cr/modules/indexer-manager.json create mode 100644 public/locales/cs/modules/health-monitoring.json create mode 100644 public/locales/cs/modules/indexer-manager.json create mode 100644 public/locales/da/modules/health-monitoring.json create mode 100644 public/locales/da/modules/indexer-manager.json create mode 100644 public/locales/de/modules/health-monitoring.json create mode 100644 public/locales/de/modules/indexer-manager.json create mode 100644 public/locales/el/modules/health-monitoring.json create mode 100644 public/locales/el/modules/indexer-manager.json create mode 100644 public/locales/es/modules/health-monitoring.json create mode 100644 public/locales/es/modules/indexer-manager.json create mode 100644 public/locales/et/authentication/invite.json create mode 100644 public/locales/et/authentication/login.json create mode 100644 public/locales/et/boards/common.json create mode 100644 public/locales/et/boards/customize.json create mode 100644 public/locales/et/common.json create mode 100644 public/locales/et/layout/common.json create mode 100644 public/locales/et/layout/element-selector/selector.json create mode 100644 public/locales/et/layout/errors/access-denied.json create mode 100644 public/locales/et/layout/errors/not-found.json create mode 100644 public/locales/et/layout/header.json create mode 100644 public/locales/et/layout/header/actions/toggle-edit-mode.json create mode 100644 public/locales/et/layout/manage.json create mode 100644 public/locales/et/layout/mobile/drawer.json create mode 100644 public/locales/et/layout/modals/about.json create mode 100644 public/locales/et/layout/modals/add-app.json create mode 100644 public/locales/et/layout/modals/change-position.json create mode 100644 public/locales/et/manage/boards.json create mode 100644 public/locales/et/manage/index.json create mode 100644 public/locales/et/manage/users.json create mode 100644 public/locales/et/manage/users/create.json create mode 100644 public/locales/et/manage/users/edit.json create mode 100644 public/locales/et/manage/users/invites.json create mode 100644 public/locales/et/modules/bookmark.json create mode 100644 public/locales/et/modules/calendar.json create mode 100644 public/locales/et/modules/common-media-cards.json create mode 100644 public/locales/et/modules/common.json create mode 100644 public/locales/et/modules/dashdot.json create mode 100644 public/locales/et/modules/date.json create mode 100644 public/locales/et/modules/dlspeed.json create mode 100644 public/locales/et/modules/dns-hole-controls.json create mode 100644 public/locales/et/modules/dns-hole-summary.json create mode 100644 public/locales/et/modules/docker.json create mode 100644 public/locales/et/modules/health-monitoring.json create mode 100644 public/locales/et/modules/iframe.json create mode 100644 public/locales/et/modules/indexer-manager.json create mode 100644 public/locales/et/modules/media-requests-list.json create mode 100644 public/locales/et/modules/media-requests-stats.json create mode 100644 public/locales/et/modules/media-server.json create mode 100644 public/locales/et/modules/notebook.json create mode 100644 public/locales/et/modules/overseerr.json create mode 100644 public/locales/et/modules/ping.json create mode 100644 public/locales/et/modules/rss.json create mode 100644 public/locales/et/modules/search.json create mode 100644 public/locales/et/modules/smart-home/entity-state.json create mode 100644 public/locales/et/modules/smart-home/trigger-automation.json create mode 100644 public/locales/et/modules/torrents-status.json create mode 100644 public/locales/et/modules/usenet.json create mode 100644 public/locales/et/modules/video-stream.json create mode 100644 public/locales/et/modules/weather.json create mode 100644 public/locales/et/password-requirements.json create mode 100644 public/locales/et/settings/common.json create mode 100644 public/locales/et/settings/customization/access.json create mode 100644 public/locales/et/settings/customization/general.json create mode 100644 public/locales/et/settings/customization/gridstack.json create mode 100644 public/locales/et/settings/customization/opacity-selector.json create mode 100644 public/locales/et/settings/customization/page-appearance.json create mode 100644 public/locales/et/settings/customization/shade-selector.json create mode 100644 public/locales/et/tools/docker.json create mode 100644 public/locales/et/user/preferences.json create mode 100644 public/locales/et/widgets/draggable-list.json create mode 100644 public/locales/et/widgets/error-boundary.json create mode 100644 public/locales/et/zod.json create mode 100644 public/locales/fr/modules/health-monitoring.json create mode 100644 public/locales/fr/modules/indexer-manager.json create mode 100644 public/locales/he/modules/health-monitoring.json create mode 100644 public/locales/he/modules/indexer-manager.json create mode 100644 public/locales/hr/modules/health-monitoring.json create mode 100644 public/locales/hr/modules/indexer-manager.json create mode 100644 public/locales/hu/modules/health-monitoring.json create mode 100644 public/locales/hu/modules/indexer-manager.json create mode 100644 public/locales/it/modules/health-monitoring.json create mode 100644 public/locales/it/modules/indexer-manager.json create mode 100644 public/locales/ja/modules/health-monitoring.json create mode 100644 public/locales/ja/modules/indexer-manager.json create mode 100644 public/locales/ko/modules/health-monitoring.json create mode 100644 public/locales/ko/modules/indexer-manager.json create mode 100644 public/locales/lt/authentication/invite.json create mode 100644 public/locales/lt/authentication/login.json create mode 100644 public/locales/lt/boards/common.json create mode 100644 public/locales/lt/boards/customize.json create mode 100644 public/locales/lt/common.json create mode 100644 public/locales/lt/layout/common.json create mode 100644 public/locales/lt/layout/element-selector/selector.json create mode 100644 public/locales/lt/layout/errors/access-denied.json create mode 100644 public/locales/lt/layout/errors/not-found.json create mode 100644 public/locales/lt/layout/header.json create mode 100644 public/locales/lt/layout/header/actions/toggle-edit-mode.json create mode 100644 public/locales/lt/layout/manage.json create mode 100644 public/locales/lt/layout/mobile/drawer.json create mode 100644 public/locales/lt/layout/modals/about.json create mode 100644 public/locales/lt/layout/modals/add-app.json create mode 100644 public/locales/lt/layout/modals/change-position.json create mode 100644 public/locales/lt/manage/boards.json create mode 100644 public/locales/lt/manage/index.json create mode 100644 public/locales/lt/manage/users.json create mode 100644 public/locales/lt/manage/users/create.json create mode 100644 public/locales/lt/manage/users/edit.json create mode 100644 public/locales/lt/manage/users/invites.json create mode 100644 public/locales/lt/modules/bookmark.json create mode 100644 public/locales/lt/modules/calendar.json create mode 100644 public/locales/lt/modules/common-media-cards.json create mode 100644 public/locales/lt/modules/common.json create mode 100644 public/locales/lt/modules/dashdot.json create mode 100644 public/locales/lt/modules/date.json create mode 100644 public/locales/lt/modules/dlspeed.json create mode 100644 public/locales/lt/modules/dns-hole-controls.json create mode 100644 public/locales/lt/modules/dns-hole-summary.json create mode 100644 public/locales/lt/modules/docker.json create mode 100644 public/locales/lt/modules/health-monitoring.json create mode 100644 public/locales/lt/modules/iframe.json create mode 100644 public/locales/lt/modules/indexer-manager.json create mode 100644 public/locales/lt/modules/media-requests-list.json create mode 100644 public/locales/lt/modules/media-requests-stats.json create mode 100644 public/locales/lt/modules/media-server.json create mode 100644 public/locales/lt/modules/notebook.json create mode 100644 public/locales/lt/modules/overseerr.json create mode 100644 public/locales/lt/modules/ping.json create mode 100644 public/locales/lt/modules/rss.json create mode 100644 public/locales/lt/modules/search.json create mode 100644 public/locales/lt/modules/smart-home/entity-state.json create mode 100644 public/locales/lt/modules/smart-home/trigger-automation.json create mode 100644 public/locales/lt/modules/torrents-status.json create mode 100644 public/locales/lt/modules/usenet.json create mode 100644 public/locales/lt/modules/video-stream.json create mode 100644 public/locales/lt/modules/weather.json create mode 100644 public/locales/lt/password-requirements.json create mode 100644 public/locales/lt/settings/common.json create mode 100644 public/locales/lt/settings/customization/access.json create mode 100644 public/locales/lt/settings/customization/general.json create mode 100644 public/locales/lt/settings/customization/gridstack.json create mode 100644 public/locales/lt/settings/customization/opacity-selector.json create mode 100644 public/locales/lt/settings/customization/page-appearance.json create mode 100644 public/locales/lt/settings/customization/shade-selector.json create mode 100644 public/locales/lt/tools/docker.json create mode 100644 public/locales/lt/user/preferences.json create mode 100644 public/locales/lt/widgets/draggable-list.json create mode 100644 public/locales/lt/widgets/error-boundary.json create mode 100644 public/locales/lt/zod.json create mode 100644 public/locales/lv/modules/health-monitoring.json create mode 100644 public/locales/lv/modules/indexer-manager.json create mode 100644 public/locales/nl/modules/health-monitoring.json create mode 100644 public/locales/nl/modules/indexer-manager.json create mode 100644 public/locales/no/modules/health-monitoring.json create mode 100644 public/locales/no/modules/indexer-manager.json create mode 100644 public/locales/pl/modules/health-monitoring.json create mode 100644 public/locales/pl/modules/indexer-manager.json create mode 100644 public/locales/pt/modules/health-monitoring.json create mode 100644 public/locales/pt/modules/indexer-manager.json create mode 100644 public/locales/ru/modules/health-monitoring.json create mode 100644 public/locales/ru/modules/indexer-manager.json create mode 100644 public/locales/sk/modules/health-monitoring.json create mode 100644 public/locales/sk/modules/indexer-manager.json create mode 100644 public/locales/sl/modules/health-monitoring.json create mode 100644 public/locales/sl/modules/indexer-manager.json create mode 100644 public/locales/sv/modules/health-monitoring.json create mode 100644 public/locales/sv/modules/indexer-manager.json create mode 100644 public/locales/tr/modules/health-monitoring.json create mode 100644 public/locales/tr/modules/indexer-manager.json create mode 100644 public/locales/tw/modules/health-monitoring.json create mode 100644 public/locales/tw/modules/indexer-manager.json create mode 100644 public/locales/uk/modules/health-monitoring.json create mode 100644 public/locales/uk/modules/indexer-manager.json create mode 100644 public/locales/vi/modules/health-monitoring.json create mode 100644 public/locales/vi/modules/indexer-manager.json diff --git a/public/locales/cn/modules/health-monitoring.json b/public/locales/cn/modules/health-monitoring.json new file mode 100644 index 00000000000..8ef2b45fa49 --- /dev/null +++ b/public/locales/cn/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "系统健康监测", + "description": "关于NAS的信息", + "settings": { + "title": "系统健康监测", + "fahrenheit": { + "label": "华氏度" + } + } + }, + "cpu": { + "label": "CPU", + "load": "平均负载", + "minute": "{{minute}} 分钟" + }, + "memory": { + "label": "内存", + "totalMem": "内存总量: {{total}}GB", + "available": "可用: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "文件系统", + "available": "可用: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "运行时间", + "updates": "更新", + "reboot": "重启" + }, + "errors": { + "general": { + "title": "找不到您的 NAS", + "text": "连接到您的NAS时出现了问题。请验证您的配置/集成。" + } + } +} \ No newline at end of file diff --git a/public/locales/cn/modules/indexer-manager.json b/public/locales/cn/modules/indexer-manager.json new file mode 100644 index 00000000000..542bd772a0d --- /dev/null +++ b/public/locales/cn/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "索引管理器状态", + "description": "有关索引器的状态", + "settings": { + "title": "索引管理器状态" + } + }, + "indexersStatus": { + "title": "索引管理器", + "testAllButton": "测试全部" + }, + "errors": { + "general": { + "title": "无法找到索引管理器", + "text": "连接索引管理器时出现问题。请验证您的配置/集成。" + } + } +} \ No newline at end of file diff --git a/public/locales/cn/modules/smart-home/entity-state.json b/public/locales/cn/modules/smart-home/entity-state.json index 19be4d740fe..10a84e2becf 100644 --- a/public/locales/cn/modules/smart-home/entity-state.json +++ b/public/locales/cn/modules/smart-home/entity-state.json @@ -1,13 +1,17 @@ { "entityNotFound": "未找到实体", "descriptor": { - "name": "Home Assistant 实体", - "description": "Home Assistant 中实体的当前状态", + "name": "家庭助理实体", + "description": "家庭助理中实体的当前状态", "settings": { "title": "实体状态", "entityId": { "label": "实体 ID", - "info": "Home Assistant 中的唯一实体 ID。通过单击实体 > 单击齿轮图标 > 单击“实体 ID”处的复制按钮进行复制。某些自定义实体可能不受支持。" + "info": "家庭助理中的唯一实体 ID。通过单击实体 > 单击齿轮图标 > 单击“实体 ID”处的复制按钮进行复制。某些自定义实体可能不受支持。" + }, + "appendUnit": { + "label": "附加测量单位", + "info": "将测量单位属性附加到实体状态。" }, "automationId": { "label": "可选自动化 ID", @@ -15,6 +19,10 @@ }, "displayName": { "label": "显示名称" + }, + "displayFriendlyName": { + "label": "显示友好名称", + "info": "显示来自家庭助理的友好名称,而不是显示名称" } } } diff --git a/public/locales/cr/modules/health-monitoring.json b/public/locales/cr/modules/health-monitoring.json new file mode 100644 index 00000000000..cb978df5bf1 --- /dev/null +++ b/public/locales/cr/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "crwdns4202:0crwdne4202:0", + "description": "crwdns4204:0crwdne4204:0", + "settings": { + "title": "crwdns4206:0crwdne4206:0", + "fahrenheit": { + "label": "crwdns4208:0crwdne4208:0" + } + } + }, + "cpu": { + "label": "crwdns4210:0crwdne4210:0", + "load": "crwdns4212:0crwdne4212:0", + "minute": "crwdns4214:0{{minute}}crwdne4214:0" + }, + "memory": { + "label": "crwdns4216:0crwdne4216:0", + "totalMem": "crwdns4218:0{{total}}crwdne4218:0", + "available": "crwdns4220:0{{available}}crwdnd4220:0{{percentage}}crwdne4220:0" + }, + "fileSystem": { + "label": "crwdns4222:0crwdne4222:0", + "available": "crwdns4224:0{{available}}crwdnd4224:0{{percentage}}crwdne4224:0" + }, + "info": { + "uptime": "crwdns4226:0crwdne4226:0", + "updates": "crwdns4228:0crwdne4228:0", + "reboot": "crwdns4230:0crwdne4230:0" + }, + "errors": { + "general": { + "title": "crwdns4232:0crwdne4232:0", + "text": "crwdns4234:0crwdne4234:0" + } + } +} \ No newline at end of file diff --git a/public/locales/cr/modules/indexer-manager.json b/public/locales/cr/modules/indexer-manager.json new file mode 100644 index 00000000000..57d43abf31d --- /dev/null +++ b/public/locales/cr/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "crwdns4188:0crwdne4188:0", + "description": "crwdns4190:0crwdne4190:0", + "settings": { + "title": "crwdns4192:0crwdne4192:0" + } + }, + "indexersStatus": { + "title": "crwdns4194:0crwdne4194:0", + "testAllButton": "crwdns4196:0crwdne4196:0" + }, + "errors": { + "general": { + "title": "crwdns4198:0crwdne4198:0", + "text": "crwdns4200:0crwdne4200:0" + } + } +} \ No newline at end of file diff --git a/public/locales/cr/modules/smart-home/entity-state.json b/public/locales/cr/modules/smart-home/entity-state.json index 6aeb48ab8fe..4de87682e07 100644 --- a/public/locales/cr/modules/smart-home/entity-state.json +++ b/public/locales/cr/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "crwdns4046:0crwdne4046:0", "info": "crwdns4048:0crwdne4048:0" }, + "appendUnit": { + "label": "crwdns4180:0crwdne4180:0", + "info": "crwdns4182:0crwdne4182:0" + }, "automationId": { "label": "crwdns4156:0crwdne4156:0", "info": "crwdns4158:0crwdne4158:0" }, "displayName": { "label": "crwdns4050:0crwdne4050:0" + }, + "displayFriendlyName": { + "label": "crwdns4184:0crwdne4184:0", + "info": "crwdns4186:0crwdne4186:0" } } } diff --git a/public/locales/cs/modules/health-monitoring.json b/public/locales/cs/modules/health-monitoring.json new file mode 100644 index 00000000000..8c12b2567e5 --- /dev/null +++ b/public/locales/cs/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Monitorování stavu systému", + "description": "Informace o Vaší NAS", + "settings": { + "title": "Monitorování stavu systému", + "fahrenheit": { + "label": "Stupně Fahrenheit" + } + } + }, + "cpu": { + "label": "Procesor", + "load": "Průměrné zatížení", + "minute": "{{minute}} minut" + }, + "memory": { + "label": "Pamět", + "totalMem": "Celková paměť: {{total}}GB", + "available": "K dispozici: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Souborový systém", + "available": "K dispozici: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Doba provozu", + "updates": "Aktualizace", + "reboot": "Restartovat" + }, + "errors": { + "general": { + "title": "Nepodařilo se najít Vaší NAS", + "text": "Došlo k problému s připojením k Vaší NAS. Ověřte prosím svou konfiguraci/integraci." + } + } +} \ No newline at end of file diff --git a/public/locales/cs/modules/indexer-manager.json b/public/locales/cs/modules/indexer-manager.json new file mode 100644 index 00000000000..d31ea6a9f51 --- /dev/null +++ b/public/locales/cs/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Stav správce indexeru", + "description": "Stav Vašich indexerů", + "settings": { + "title": "Stav správce indexeru" + } + }, + "indexersStatus": { + "title": "Správce indexeru", + "testAllButton": "Otestovat vše" + }, + "errors": { + "general": { + "title": "Nepodařilo se najít správce indexeru", + "text": "Došlo k problému s připojením k Vašemu správci indexeru. Ověřte prosím svou konfiguraci/integraci." + } + } +} \ No newline at end of file diff --git a/public/locales/cs/modules/smart-home/entity-state.json b/public/locales/cs/modules/smart-home/entity-state.json index 9c3cad9bdf6..72746d7386e 100644 --- a/public/locales/cs/modules/smart-home/entity-state.json +++ b/public/locales/cs/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID entity", "info": "Jedinečné ID entity v aplikaci Home Assistant. Zkopírujte kliknutím na entitu > klikněte na ikonu ozubeného kolečka > klikněte na tlačítko kopírovat \"ID entity\". Některé vlastní entity nemusí být podporovány." }, + "appendUnit": { + "label": "Přidat měrnou jednotku", + "info": "Přidávat atribut měrné jednotky ke stavu entity." + }, "automationId": { "label": "Volitelné ID automatizace", "info": "Vaše unikátní ID automatizace. Vždy začíná s automation.XXXXX. Pokud nebude nastaveno, na widget nebude možné kliknout a bude možné zobrazit pouze stav. Po kliknutí bude stav entity obnoven." }, "displayName": { "label": "Zobrazovaný název" + }, + "displayFriendlyName": { + "label": "Zobrazovat čitelné jméno", + "info": "Zobrazovat přátelské jméno z Home Assistantu místo zobrazovaného jména" } } } diff --git a/public/locales/cs/modules/smart-home/trigger-automation.json b/public/locales/cs/modules/smart-home/trigger-automation.json index b6c09dc4930..d97aae23d82 100644 --- a/public/locales/cs/modules/smart-home/trigger-automation.json +++ b/public/locales/cs/modules/smart-home/trigger-automation.json @@ -1,9 +1,9 @@ { "descriptor": { "name": "Automatizace Home Assistanta", - "description": "Spustit automatizaci", + "description": "Spustí automatizaci", "settings": { - "title": "Spustit automatizaci", + "title": "Spustí automatizaci", "automationId": { "label": "ID automatizace", "info": "Vaše unikátní ID automatizace. Vždy začíná s automation.XXXXX." diff --git a/public/locales/da/common.json b/public/locales/da/common.json index a140a078fef..5525065f393 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -13,7 +13,7 @@ "previous": "Forrige", "confirm": "Bekræft", "enabled": "Aktiveret", - "duplicate": "", + "duplicate": "Duplikér", "disabled": "Deaktiveret", "enableAll": "Aktiver alle", "disableAll": "Deaktiver alle", diff --git a/public/locales/da/manage/boards.json b/public/locales/da/manage/boards.json index bf4f8abd333..8749f32b83a 100644 --- a/public/locales/da/manage/boards.json +++ b/public/locales/da/manage/boards.json @@ -16,15 +16,15 @@ "label": "Slet permanent", "disabled": "Sletning deaktiveret, fordi ældre Homarr-komponenter ikke tillader sletning af standardkonfigurationen. Sletning vil være mulig i fremtiden." }, - "duplicate": "", + "duplicate": "Duplikér", "rename": { - "label": "", + "label": "Omdøb", "modal": { - "title": "", + "title": "Omdøb tavlen {{name}}", "fields": { "name": { - "label": "", - "placeholder": "" + "label": "Nyt navn", + "placeholder": "Nyt tavlenavn" } } } diff --git a/public/locales/da/modules/health-monitoring.json b/public/locales/da/modules/health-monitoring.json new file mode 100644 index 00000000000..d4c524ffa1c --- /dev/null +++ b/public/locales/da/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Systemsundhedsovervågning", + "description": "Oplysninger om din NAS", + "settings": { + "title": "Systemsundhedsovervågning", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Load Gennemsnit", + "minute": "{{minute}} minutter" + }, + "memory": { + "label": "Hukommelse", + "totalMem": "Samlet hukommelse: {{total}}GB", + "available": "Tilgængelig: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Filsystem", + "available": "Tilgængelig: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Oppetid", + "updates": "Opdateringer", + "reboot": "Genstart" + }, + "errors": { + "general": { + "title": "Kan ikke finde din NAS", + "text": "Der opstod et problem med at oprette forbindelse til din NAS. Bekræft venligst din konfiguration/integration(er)." + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/indexer-manager.json b/public/locales/da/modules/indexer-manager.json new file mode 100644 index 00000000000..f03abb67ff1 --- /dev/null +++ b/public/locales/da/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Indekserings manager status", + "description": "Status for dine indekser", + "settings": { + "title": "Indekserings manager status" + } + }, + "indexersStatus": { + "title": "Indexer-manager", + "testAllButton": "Test alle" + }, + "errors": { + "general": { + "title": "Kan ikke finde en indekseringsmanager", + "text": "Der opstod et problem med at oprette forbindelse til din indekseringsmanager. Bekræft venligst din konfiguration/integration(er)." + } + } +} \ No newline at end of file diff --git a/public/locales/da/modules/rss.json b/public/locales/da/modules/rss.json index bedfa45b86f..6ec07a73b47 100644 --- a/public/locales/da/modules/rss.json +++ b/public/locales/da/modules/rss.json @@ -19,7 +19,7 @@ "label": "Klemme til tekstlinjer" }, "sortByPublishDateAscending": { - "label": "" + "label": "Sorter efter udgivelsesdato (stigende)" }, "sortPostsWithoutPublishDateToTheTop": { "label": "Sæt indlæg uden udgivelsesdato øverst" diff --git a/public/locales/da/modules/smart-home/entity-state.json b/public/locales/da/modules/smart-home/entity-state.json index 611cb541765..70a3e853122 100644 --- a/public/locales/da/modules/smart-home/entity-state.json +++ b/public/locales/da/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Entitet ID", "info": "Unikt entitets-id i Home Assistant. Kopier ved at klikke på entitet > Klik på tandhjulsikon > Klik på kopieringsknappen ved 'Entitets-ID'. Nogle brugerdefinerede entiteter understøttes muligvis ikke." }, + "appendUnit": { + "label": "Tilføj måleenhed", + "info": "Føj måleenhedsattributten til enhedstilstanden." + }, "automationId": { "label": "Valgfrit automatiserings ID", "info": "Dit unikke automatiserings ID. Starter altid med automatisering.XXXX. Hvis den ikke er indstillet, vil widget ikke være klikbar og kun vise tilstand. Efter klik vil enhedstilstand blive opdateret." }, "displayName": { "label": "Visningsnavn" + }, + "displayFriendlyName": { + "label": "Vis brugervenligt navn", + "info": "Vis brugervenligt navn fra Home Assistant i stedet for visningsnavn" } } } diff --git a/public/locales/de/modules/health-monitoring.json b/public/locales/de/modules/health-monitoring.json new file mode 100644 index 00000000000..3b105dde35d --- /dev/null +++ b/public/locales/de/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Überwachung des Systemzustands", + "description": "Informationen zu Ihrem NAS", + "settings": { + "title": "Überwachung des Systemzustands", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Durchschnittliche Last", + "minute": "{{minute}} Minuten" + }, + "memory": { + "label": "Arbeitsspeicher", + "totalMem": "Gesamtspeicher: {{total}} GB", + "available": "Verfügbar: {{available}} GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Dateisystem", + "available": "Verfügbar: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Betriebszeit", + "updates": "Aktualisierungen", + "reboot": "Neustart" + }, + "errors": { + "general": { + "title": "Ihr NAS konnte nicht gefunden werden", + "text": "Es gab ein Problem bei der Verbindung zu Ihrem NAS. Bitte überprüfen Sie Ihre Konfiguration/Integration(en)." + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/indexer-manager.json b/public/locales/de/modules/indexer-manager.json new file mode 100644 index 00000000000..1958e5ffe65 --- /dev/null +++ b/public/locales/de/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Status des Indexer-Managers", + "description": "Status ihrer Indexer", + "settings": { + "title": "Status des Indexer-Managers" + } + }, + "indexersStatus": { + "title": "Indexer-Manager", + "testAllButton": "Alle testen" + }, + "errors": { + "general": { + "title": "Es konnte kein Indexer-Manager gefunden werden", + "text": "Beim Herstellen der Verbindung zu Ihrem Indexer-Manager ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Konfiguration/Integration(en)." + } + } +} \ No newline at end of file diff --git a/public/locales/de/modules/rss.json b/public/locales/de/modules/rss.json index 9b8dd14b3e1..3c583818488 100644 --- a/public/locales/de/modules/rss.json +++ b/public/locales/de/modules/rss.json @@ -19,7 +19,7 @@ "label": "Textzeilen Klammer" }, "sortByPublishDateAscending": { - "label": "" + "label": "Nach Veröffentlichungsdatum sortieren (aufsteigend)" }, "sortPostsWithoutPublishDateToTheTop": { "label": "Platzieren Sie Beiträge ohne Veröffentlichungsdatum ganz oben" diff --git a/public/locales/de/modules/smart-home/entity-state.json b/public/locales/de/modules/smart-home/entity-state.json index bc00178ea8f..f6aec720256 100644 --- a/public/locales/de/modules/smart-home/entity-state.json +++ b/public/locales/de/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Eintrag-ID", "info": "Eindeutige Eintrag-ID im Home Assistant. Kopieren durch Anklicken von Eintrag > Anklicken des Zahnradsymbols > Anklicken der Schaltfläche \"Kopieren\" bei \"Eintrag-ID\". Einige benutzerdefinierte Einträge werden möglicherweise nicht unterstützt." }, + "appendUnit": { + "label": "Maßeinheiten anzeigen", + "info": "Fügt die Maßeinheit des Attributs an den Entitätszustand an." + }, "automationId": { "label": "Optionale Automatisierungs-ID", "info": "Ihre eindeutige Automatisierungs-ID. Diese beginnt immer mit automation.XXXXX. Wenn sie nicht festgelegt wird, ist das Widget nicht anklickbar und zeigt nur den Status an. Nach dem Klicken wird der Entitätsstatus aktualisiert." }, "displayName": { "label": "Anzeigename" + }, + "displayFriendlyName": { + "label": "Benutzerdefinierten Namen anzeigen", + "info": "Zeige Zeige Benutzerdefinierten Namen statt Anzeigename vom Home-Assistenten an" } } } diff --git a/public/locales/el/modules/health-monitoring.json b/public/locales/el/modules/health-monitoring.json new file mode 100644 index 00000000000..686a5cf08a8 --- /dev/null +++ b/public/locales/el/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Παρακολούθηση της υγείας του συστήματος", + "description": "Πληροφορίες για το NAS σας", + "settings": { + "title": "Παρακολούθηση της υγείας του συστήματος", + "fahrenheit": { + "label": "Φαρενάιτ (°F)" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Μέσος Όρος Φόρτου", + "minute": "{{minute}} λεπτό" + }, + "memory": { + "label": "Μνήμη", + "totalMem": "Συνολική μνήμη: {{total}}GB", + "available": "Διαθέσιμα: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Σύστημα Αρχείων", + "available": "Διαθέσιμα: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Χρόνος Λειτουργίας", + "updates": "Ενημερώσεις", + "reboot": "Επανεκκίνηση" + }, + "errors": { + "general": { + "title": "Δεν είναι δυνατή η εύρεση του NAS σας", + "text": "Υπήρξε πρόβλημα σύνδεσης με το NAS σας. Παρακαλούμε επαληθεύστε τις ρυθμίσεις/ενσωμάτωση(ες) σας." + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/indexer-manager.json b/public/locales/el/modules/indexer-manager.json new file mode 100644 index 00000000000..86268695eae --- /dev/null +++ b/public/locales/el/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Κατάσταση διαχειριστή indexer", + "description": "Κατάσταση σχετικά με τους indexers σας", + "settings": { + "title": "Κατάσταση διαχειριστή indexer" + } + }, + "indexersStatus": { + "title": "Διαχειριστής indexer", + "testAllButton": "Δοκιμή όλων" + }, + "errors": { + "general": { + "title": "Δεν είναι δυνατή η εύρεση διαχειριστή indexer", + "text": "Υπήρξε πρόβλημα σύνδεσης με τον διαχειριστή των indexers σας. Παρακαλούμε επαληθεύστε τις ρυθμίσεις/ενσωμάτωση(ες) σας." + } + } +} \ No newline at end of file diff --git a/public/locales/el/modules/smart-home/entity-state.json b/public/locales/el/modules/smart-home/entity-state.json index 3063245e7e5..cf850c73439 100644 --- a/public/locales/el/modules/smart-home/entity-state.json +++ b/public/locales/el/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Αναγνωριστικό οντότητας", "info": "Μοναδικό αναγνωριστικό οντότητας στο Home Assistant. Αντιγράψτε κάνοντας κλικ στην οντότητα > Κάντε κλικ στο εικονίδιο με το γρανάζι > Κάντε κλικ στο κουμπί αντιγραφής στο 'Αναγνωριστικό οντότητας'. Ορισμένες προσαρμοσμένες οντότητες ενδέχεται να μην υποστηρίζονται." }, + "appendUnit": { + "label": "Προσθήκη μονάδας μέτρησης", + "info": "Προσθήκη του χαρακτηριστικού μονάδας μέτρησης στην κατάσταση της οντότητας." + }, "automationId": { "label": "Προαιρετικό αναγνωριστικό αυτοματισμού", "info": "Το μοναδικό σας αναγνωριστικό αυτοματισμού. Ξεκινά πάντα με automation.XXXXX. Αν δεν οριστεί, το widget δεν θα μπορεί να κάνει κλικ και θα εμφανίζει μόνο την κατάσταση. Μετά το κλικ, η κατάσταση της οντότητας θα ανανεωθεί." }, "displayName": { "label": "Εμφανιζόμενο όνομα" + }, + "displayFriendlyName": { + "label": "Εμφάνιση φιλικού ονόματος", + "info": "Εμφάνιση φιλικού ονόματος από το Home Assistant αντί για το εμφανιζόμενο όνομα" } } } diff --git a/public/locales/es/modules/health-monitoring.json b/public/locales/es/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/es/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/indexer-manager.json b/public/locales/es/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/es/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/es/modules/smart-home/entity-state.json b/public/locales/es/modules/smart-home/entity-state.json index e6fbda21b61..ea26580f2bc 100644 --- a/public/locales/es/modules/smart-home/entity-state.json +++ b/public/locales/es/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID de la entidad", "info": "ID de entidad única de Home Assistant. Copia haciendo clic en la entidad > Clic en el icono de engranaje > Clic en el botón copiar en 'ID de la entidad'. Algunas entidades personalizadas pueden no ser compatibles." }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "ID de automatización opcional", "info": "Su ID de automatización única. Siempre empieza por automation.XXXXX. Si no está establecida, no se podrá hacer clic en el widget, y solo se mostrará el estado. Al hacer clic, la entidad se refrescará." }, "displayName": { "label": "Nombre a mostrar" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/et/authentication/invite.json b/public/locales/et/authentication/invite.json new file mode 100644 index 00000000000..2d73966c24a --- /dev/null +++ b/public/locales/et/authentication/invite.json @@ -0,0 +1,35 @@ +{ + "metaTitle": "", + "title": "", + "text": "", + "form": { + "fields": { + "username": { + "label": "" + }, + "password": { + "label": "" + }, + "passwordConfirmation": { + "label": "" + } + }, + "buttons": { + "submit": "" + } + }, + "notifications": { + "loading": { + "title": "", + "text": "" + }, + "success": { + "title": "", + "text": "" + }, + "error": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/authentication/login.json b/public/locales/et/authentication/login.json new file mode 100644 index 00000000000..e719a0981b2 --- /dev/null +++ b/public/locales/et/authentication/login.json @@ -0,0 +1,20 @@ +{ + "metaTitle": "", + "title": "", + "text": "", + "form": { + "fields": { + "username": { + "label": "" + }, + "password": { + "label": "" + } + }, + "buttons": { + "submit": "" + }, + "afterLoginRedirection": "" + }, + "alert": "" +} \ No newline at end of file diff --git a/public/locales/et/boards/common.json b/public/locales/et/boards/common.json new file mode 100644 index 00000000000..a70db06bf6a --- /dev/null +++ b/public/locales/et/boards/common.json @@ -0,0 +1,5 @@ +{ + "header": { + "customize": "" + } +} \ No newline at end of file diff --git a/public/locales/et/boards/customize.json b/public/locales/et/boards/customize.json new file mode 100644 index 00000000000..a0524fcc936 --- /dev/null +++ b/public/locales/et/boards/customize.json @@ -0,0 +1,29 @@ +{ + "metaTitle": "", + "pageTitle": "", + "backToBoard": "", + "settings": { + "appearance": { + "primaryColor": "", + "secondaryColor": "" + } + }, + "save": { + "button": "", + "note": "" + }, + "notifications": { + "pending": { + "title": "", + "message": "" + }, + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/common.json b/public/locales/et/common.json new file mode 100644 index 00000000000..273eab35782 --- /dev/null +++ b/public/locales/et/common.json @@ -0,0 +1,58 @@ +{ + "save": "", + "apply": "", + "insert": "", + "about": "", + "cancel": "", + "close": "", + "back": "", + "delete": "", + "ok": "", + "edit": "", + "next": "", + "previous": "", + "confirm": "", + "enabled": "", + "duplicate": "", + "disabled": "", + "enableAll": "", + "disableAll": "", + "version": "", + "changePosition": "", + "remove": "", + "removeConfirm": "", + "createItem": "", + "sections": { + "settings": "", + "dangerZone": "" + }, + "secrets": { + "apiKey": "", + "username": "", + "password": "" + }, + "tip": "", + "time": { + "seconds": "", + "minutes": "", + "hours": "" + }, + "loading": "", + "breakPoints": { + "small": "", + "medium": "", + "large": "" + }, + "seeMore": "", + "position": { + "left": "", + "center": "", + "right": "" + }, + "attributes": { + "width": "", + "height": "" + }, + "public": "", + "restricted": "" +} \ No newline at end of file diff --git a/public/locales/et/layout/common.json b/public/locales/et/layout/common.json new file mode 100644 index 00000000000..4f4c4e6b415 --- /dev/null +++ b/public/locales/et/layout/common.json @@ -0,0 +1,25 @@ +{ + "modals": { + "blockedPopups": { + "title": "", + "text": "", + "list": { + "browserPermission": "", + "adBlockers": "", + "otherBrowser": "" + } + } + }, + "actions": { + "category": { + "openAllInNewTab": "" + } + }, + "menu": { + "moveUp": "", + "moveDown": "", + "addCategory": "", + "addAbove": "", + "addBelow": "" + } +} \ No newline at end of file diff --git a/public/locales/et/layout/element-selector/selector.json b/public/locales/et/layout/element-selector/selector.json new file mode 100644 index 00000000000..6fb7ad74fcf --- /dev/null +++ b/public/locales/et/layout/element-selector/selector.json @@ -0,0 +1,26 @@ +{ + "modal": { + "title": "", + "text": "" + }, + "widgetDescription": "", + "goBack": "", + "actionIcon": { + "tooltip": "" + }, + "apps": "", + "app": { + "defaultName": "" + }, + "widgets": "", + "categories": "", + "category": { + "newName": "", + "defaultName": "", + "created": { + "title": "", + "message": "" + } + }, + "importFromDocker": "" +} diff --git a/public/locales/et/layout/errors/access-denied.json b/public/locales/et/layout/errors/access-denied.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/layout/errors/access-denied.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/layout/errors/not-found.json b/public/locales/et/layout/errors/not-found.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/layout/errors/not-found.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/layout/header.json b/public/locales/et/layout/header.json new file mode 100644 index 00000000000..f273309fe23 --- /dev/null +++ b/public/locales/et/layout/header.json @@ -0,0 +1,27 @@ +{ + "search": { + "label": "", + "engines": { + "web": "", + "youtube": "", + "torrent": "", + "movie": "" + } + }, + "actions": { + "avatar": { + "switchTheme": "", + "preferences": "", + "defaultBoard": "", + "manage": "", + "logout": "", + "login": "" + } + }, + "modals": { + "movie": { + "title": "", + "topResults": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/layout/header/actions/toggle-edit-mode.json b/public/locales/et/layout/header/actions/toggle-edit-mode.json new file mode 100644 index 00000000000..4d1ebe1d9f2 --- /dev/null +++ b/public/locales/et/layout/header/actions/toggle-edit-mode.json @@ -0,0 +1,12 @@ +{ + "description": "", + "button": { + "disabled": "", + "enabled": "" + }, + "popover": { + "title": "", + "text": "" + }, + "unloadEvent": "" +} diff --git a/public/locales/et/layout/manage.json b/public/locales/et/layout/manage.json new file mode 100644 index 00000000000..5b8d0e81b1f --- /dev/null +++ b/public/locales/et/layout/manage.json @@ -0,0 +1,36 @@ +{ + "navigation": { + "home": { + "title": "" + }, + "boards": { + "title": "" + }, + "users": { + "title": "", + "items": { + "manage": "", + "invites": "" + } + }, + "help": { + "title": "", + "items": { + "documentation": "", + "report": "", + "discord": "", + "contribute": "" + } + }, + "tools": { + "title": "", + "items": { + "docker": "", + "api": "" + } + }, + "about": { + "title": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/layout/mobile/drawer.json b/public/locales/et/layout/mobile/drawer.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/public/locales/et/layout/mobile/drawer.json @@ -0,0 +1 @@ +{} diff --git a/public/locales/et/layout/modals/about.json b/public/locales/et/layout/modals/about.json new file mode 100644 index 00000000000..9a09c330dbb --- /dev/null +++ b/public/locales/et/layout/modals/about.json @@ -0,0 +1,30 @@ +{ + "description": "", + "addToDashboard": "", + "tip": "", + "key": "", + "action": "", + "keybinds": "", + "translators": "", + "translatorsDescription": "", + "contributors": "", + "contributorsDescription": "", + "actions": { + "toggleTheme": "", + "focusSearchBar": "", + "openDocker": "", + "toggleEdit": "" + }, + "metrics": { + "configurationSchemaVersion": "", + "version": "", + "nodeEnvironment": "", + "i18n": "", + "locales": "", + "experimental_disableEditMode": "" + }, + "version": { + "new": "", + "dropdown": "" + } +} \ No newline at end of file diff --git a/public/locales/et/layout/modals/add-app.json b/public/locales/et/layout/modals/add-app.json new file mode 100644 index 00000000000..f5a7aa4eaf8 --- /dev/null +++ b/public/locales/et/layout/modals/add-app.json @@ -0,0 +1,128 @@ +{ + "tabs": { + "general": "", + "behaviour": "", + "network": "", + "appearance": "", + "integration": "" + }, + "general": { + "appname": { + "label": "", + "description": "" + }, + "internalAddress": { + "label": "", + "description": "", + "troubleshoot": { + "label": "", + "header": "", + "lines": { + "nothingAfterPort": "", + "protocolCheck": "", + "preferIP": "", + "enablePings": "", + "wget": "", + "iframe": "", + "clearCache": "" + }, + "footer": "" + } + }, + "externalAddress": { + "label": "", + "description": "" + } + }, + "behaviour": { + "isOpeningNewTab": { + "label": "", + "description": "" + }, + "tooltipDescription": { + "label": "", + "description": "" + }, + "customProtocolWarning": "" + }, + "network": { + "statusChecker": { + "label": "", + "description": "" + }, + "statusCodes": { + "label": "", + "description": "" + } + }, + "appearance": { + "icon": { + "label": "", + "description": "", + "autocomplete": { + "title": "", + "text": "" + }, + "noItems": { + "title": "", + "text": "" + } + }, + "appNameFontSize": { + "label": "", + "description": "" + }, + "appNameStatus": { + "label": "", + "description": "", + "dropdown": { + "normal": "", + "hover": "", + "hidden": "" + } + }, + "positionAppName": { + "label": "", + "description": "", + "dropdown": { + "top": "", + "right": "", + "bottom": "", + "left": "" + } + }, + "lineClampAppName": { + "label": "", + "description": "" + } + }, + "integration": { + "type": { + "label": "", + "description": "", + "placeholder": "", + "defined": "", + "undefined": "", + "public": "", + "private": "", + "explanationPrivate": "", + "explanationPublic": "" + }, + "secrets": { + "description": "", + "warning": "", + "clear": "", + "save": "", + "update": "" + } + }, + "validation": { + "popover": "", + "name": "", + "noUrl": "", + "invalidUrl": "", + "noIconUrl": "", + "noExternalUri": "", + "invalidExternalUri": "" + } +} diff --git a/public/locales/et/layout/modals/change-position.json b/public/locales/et/layout/modals/change-position.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/layout/modals/change-position.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/manage/boards.json b/public/locales/et/manage/boards.json new file mode 100644 index 00000000000..11e46ae3449 --- /dev/null +++ b/public/locales/et/manage/boards.json @@ -0,0 +1,57 @@ +{ + "metaTitle": "", + "pageTitle": "", + "cards": { + "statistics": { + "apps": "", + "widgets": "", + "categories": "" + }, + "buttons": { + "view": "" + }, + "menu": { + "setAsDefault": "", + "delete": { + "label": "", + "disabled": "" + }, + "duplicate": "", + "rename": { + "label": "", + "modal": { + "title": "", + "fields": { + "name": { + "label": "", + "placeholder": "" + } + } + } + } + }, + "badges": { + "fileSystem": "", + "default": "" + } + }, + "buttons": { + "create": "" + }, + "modals": { + "delete": { + "title": "", + "text": "" + }, + "create": { + "title": "", + "text": "", + "form": { + "name": { + "label": "" + }, + "submit": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/manage/index.json b/public/locales/et/manage/index.json new file mode 100644 index 00000000000..5c5b4c0b9c5 --- /dev/null +++ b/public/locales/et/manage/index.json @@ -0,0 +1,23 @@ +{ + "metaTitle": "", + "hero": { + "title": "", + "fallbackUsername": "", + "subtitle": "" + }, + "quickActions": { + "title": "", + "boards": { + "title": "", + "subtitle": "" + }, + "inviteUsers": { + "title": "", + "subtitle": "" + }, + "manageUsers": { + "title": "", + "subtitle": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/manage/users.json b/public/locales/et/manage/users.json new file mode 100644 index 00000000000..13977abdb1b --- /dev/null +++ b/public/locales/et/manage/users.json @@ -0,0 +1,44 @@ +{ + "metaTitle": "", + "pageTitle": "", + "buttons": { + "create": "" + }, + "filter": { + "roles": { + "all": "", + "normal": "", + "admin": "", + "owner": "" + } + }, + "table": { + "header": { + "user": "", + "email": "" + } + }, + "tooltips": { + "deleteUser": "", + "demoteAdmin": "", + "promoteToAdmin": "" + }, + "modals": { + "delete": { + "title": "", + "text": "" + }, + "change-role": { + "promote": { + "title": "", + "text": "" + }, + "demote": { + "title": "", + "text": "" + }, + "confirm": "" + } + }, + "searchDoesntMatch": "" +} \ No newline at end of file diff --git a/public/locales/et/manage/users/create.json b/public/locales/et/manage/users/create.json new file mode 100644 index 00000000000..846e81df7a7 --- /dev/null +++ b/public/locales/et/manage/users/create.json @@ -0,0 +1,52 @@ +{ + "metaTitle": "", + "steps": { + "account": { + "title": "", + "text": "", + "username": { + "label": "" + }, + "email": { + "label": "" + } + }, + "security": { + "title": "", + "text": "", + "password": { + "label": "" + } + }, + "finish": { + "title": "", + "text": "", + "card": { + "title": "", + "text": "" + }, + "table": { + "header": { + "property": "", + "value": "", + "username": "", + "email": "", + "password": "" + }, + "notSet": "", + "valid": "" + }, + "failed": "" + }, + "completed": { + "alert": { + "title": "", + "text": "" + } + } + }, + "buttons": { + "generateRandomPassword": "", + "createAnother": "" + } +} \ No newline at end of file diff --git a/public/locales/et/manage/users/edit.json b/public/locales/et/manage/users/edit.json new file mode 100644 index 00000000000..fb95221a8c8 --- /dev/null +++ b/public/locales/et/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "", + "back": "", + "sections": { + "general": { + "title": "", + "inputs": { + "username": { + "label": "" + }, + "eMail": { + "label": "" + } + } + }, + "security": { + "title": "", + "inputs": { + "password": { + "label": "" + }, + "terminateExistingSessions": { + "label": "", + "description": "" + }, + "confirm": { + "label": "", + "description": "" + } + } + }, + "roles": { + "title": "", + "currentRole": "", + "badges": { + "owner": "", + "admin": "", + "normal": "" + } + }, + "deletion": { + "title": "", + "inputs": { + "confirmUsername": { + "label": "", + "description": "" + }, + "confirm": { + "label": "", + "description": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/manage/users/invites.json b/public/locales/et/manage/users/invites.json new file mode 100644 index 00000000000..8ba8ec70ce4 --- /dev/null +++ b/public/locales/et/manage/users/invites.json @@ -0,0 +1,48 @@ +{ + "metaTitle": "", + "pageTitle": "", + "description": "", + "button": { + "createInvite": "", + "deleteInvite": "" + }, + "table": { + "header": { + "id": "", + "creator": "", + "expires": "", + "action": "" + }, + "data": { + "expiresAt": "", + "expiresIn": "" + } + }, + "modals": { + "create": { + "title": "", + "description": "", + "form": { + "expires": "", + "submit": "" + } + }, + "copy": { + "title": "", + "description": "", + "invitationLink": "", + "details": { + "id": "", + "token": "" + }, + "button": { + "close": "" + } + }, + "delete": { + "title": "", + "description": "" + } + }, + "noInvites": "" +} \ No newline at end of file diff --git a/public/locales/et/modules/bookmark.json b/public/locales/et/modules/bookmark.json new file mode 100644 index 00000000000..7d5cd1ab330 --- /dev/null +++ b/public/locales/et/modules/bookmark.json @@ -0,0 +1,43 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "name": { + "label": "", + "info": "" + }, + "items": { + "label": "" + }, + "layout": { + "label": "", + "data": { + "autoGrid": "", + "horizontal": "", + "vertical": "" + } + } + } + }, + "card": { + "noneFound": { + "title": "", + "text": "" + } + }, + "item": { + "validation": { + "length": "", + "invalidLink": "", + "errorMsg": "" + }, + "name": "", + "url": "", + "newTab": "", + "hideHostname": "", + "hideIcon": "", + "delete": "" + } +} diff --git a/public/locales/et/modules/calendar.json b/public/locales/et/modules/calendar.json new file mode 100644 index 00000000000..03c146c390a --- /dev/null +++ b/public/locales/et/modules/calendar.json @@ -0,0 +1,33 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "radarrReleaseType": { + "label": "", + "data": { + "inCinemas": "", + "physicalRelease": "", + "digitalRelease": "" + } + }, + "hideWeekDays": { + "label": "" + }, + "showUnmonitored": { + "label": "" + }, + "fontSize": { + "label": "", + "data": { + "xs": "", + "sm": "", + "md": "", + "lg": "", + "xl": "" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/common-media-cards.json b/public/locales/et/modules/common-media-cards.json new file mode 100644 index 00000000000..9f6da0682ee --- /dev/null +++ b/public/locales/et/modules/common-media-cards.json @@ -0,0 +1,6 @@ +{ + "buttons": { + "play": "", + "request": "" + } +} \ No newline at end of file diff --git a/public/locales/et/modules/common.json b/public/locales/et/modules/common.json new file mode 100644 index 00000000000..ba4f38a1c8b --- /dev/null +++ b/public/locales/et/modules/common.json @@ -0,0 +1,10 @@ +{ + "settings": { + "label": "" + }, + "errors": { + "unmappedOptions": { + "text": "" + } + } +} diff --git a/public/locales/et/modules/dashdot.json b/public/locales/et/modules/dashdot.json new file mode 100644 index 00000000000..98f45c5c2dc --- /dev/null +++ b/public/locales/et/modules/dashdot.json @@ -0,0 +1,118 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "dashName": { + "label": "" + }, + "url": { + "label": "" + }, + "usePercentages": { + "label": "" + }, + "columns": { + "label": "" + }, + "graphHeight": { + "label": "" + }, + "graphsOrder": { + "label": "", + "storage": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "network": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "compactView": { + "label": "" + } + }, + "cpu": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + }, + "multiView": { + "label": "" + } + }, + "ram": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + }, + "gpu": { + "label": "", + "enabled": { + "label": "" + }, + "span": { + "label": "" + } + } + } + } + }, + "card": { + "title": "", + "errors": { + "noService": "", + "noInformation": "", + "protocolDowngrade": { + "title": "", + "text": "" + } + }, + "graphs": { + "storage": { + "title": "", + "label": "" + }, + "network": { + "title": "", + "label": "", + "metrics": { + "download": "", + "upload": "" + } + }, + "cpu": { + "title": "" + }, + "ram": { + "title": "" + }, + "gpu": { + "title": "" + } + } + } +} diff --git a/public/locales/et/modules/date.json b/public/locales/et/modules/date.json new file mode 100644 index 00000000000..0c4dca5345d --- /dev/null +++ b/public/locales/et/modules/date.json @@ -0,0 +1,34 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "timezone": { + "label": "", + "info": "" + }, + "customTitle": { + "label": "" + }, + "display24HourFormat": { + "label": "" + }, + "dateFormat": { + "label": "", + "data": { + "hide": "" + } + }, + "titleState": { + "label": "", + "info": "", + "data": { + "both": "", + "city": "", + "none": "" + } + } + } + } +} diff --git a/public/locales/et/modules/dlspeed.json b/public/locales/et/modules/dlspeed.json new file mode 100644 index 00000000000..1dfd395d36a --- /dev/null +++ b/public/locales/et/modules/dlspeed.json @@ -0,0 +1,35 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "card": { + "table": { + "header": { + "name": "", + "size": "", + "download": "", + "upload": "", + "estimatedTimeOfArrival": "", + "progress": "" + }, + "body": { + "nothingFound": "" + } + }, + "lineChart": { + "title": "", + "download": "", + "upload": "", + "timeSpan": "", + "totalDownload": "", + "totalUpload": "" + }, + "errors": { + "noDownloadClients": { + "title": "", + "text": "" + } + } + } +} diff --git a/public/locales/et/modules/dns-hole-controls.json b/public/locales/et/modules/dns-hole-controls.json new file mode 100644 index 00000000000..3bf25c924a4 --- /dev/null +++ b/public/locales/et/modules/dns-hole-controls.json @@ -0,0 +1,18 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "showToggleAllButtons": { + "label": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/dns-hole-summary.json b/public/locales/et/modules/dns-hole-summary.json new file mode 100644 index 00000000000..a18a2c33d2c --- /dev/null +++ b/public/locales/et/modules/dns-hole-summary.json @@ -0,0 +1,28 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "usePiHoleColors": { + "label": "" + }, + "layout": { + "label": "", + "data": { + "grid": "", + "row": "", + "column": "" + } + } + } + }, + "card": { + "metrics": { + "domainsOnAdlist": "", + "queriesToday": "", + "queriesBlockedTodayPercentage": "", + "queriesBlockedToday": "" + } + } +} diff --git a/public/locales/et/modules/docker.json b/public/locales/et/modules/docker.json new file mode 100644 index 00000000000..7346ebe3916 --- /dev/null +++ b/public/locales/et/modules/docker.json @@ -0,0 +1,83 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "search": { + "placeholder": "" + }, + "table": { + "header": { + "name": "", + "image": "", + "ports": "", + "state": "" + }, + "body": { + "portCollapse": "" + }, + "states": { + "running": "", + "created": "", + "stopped": "", + "unknown": "" + } + }, + "actionBar": { + "addService": { + "title": "", + "message": "" + }, + "restart": { + "title": "" + }, + "stop": { + "title": "" + }, + "start": { + "title": "" + }, + "refreshData": { + "title": "" + }, + "remove": { + "title": "" + }, + "addToHomarr": { + "title": "" + } + }, + "actions": { + "start": { + "start": "", + "end": "" + }, + "stop": { + "start": "", + "end": "" + }, + "restart": { + "start": "", + "end": "" + }, + "remove": { + "start": "", + "end": "" + } + }, + "errors": { + "integrationFailed": { + "title": "", + "message": "" + }, + "unknownError": { + "title": "" + }, + "oneServiceAtATime": { + "title": "" + } + }, + "actionIcon": { + "tooltip": "" + } +} diff --git a/public/locales/et/modules/health-monitoring.json b/public/locales/et/modules/health-monitoring.json new file mode 100644 index 00000000000..a00b40dd507 --- /dev/null +++ b/public/locales/et/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/iframe.json b/public/locales/et/modules/iframe.json new file mode 100644 index 00000000000..cbd07acf784 --- /dev/null +++ b/public/locales/et/modules/iframe.json @@ -0,0 +1,45 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "embedUrl": { + "label": "" + }, + "allowFullScreen": { + "label": "" + }, + "allowTransparency": { + "label": "" + }, + "allowScrolling": { + "label": "" + }, + "allowPayment": { + "label": "" + }, + "allowAutoPlay": { + "label": "" + }, + "allowMicrophone": { + "label": "" + }, + "allowCamera": { + "label": "" + }, + "allowGeolocation": { + "label": "" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "", + "text": "" + }, + "browserSupport": "" + } + } +} diff --git a/public/locales/et/modules/indexer-manager.json b/public/locales/et/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/et/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/media-requests-list.json b/public/locales/et/modules/media-requests-list.json new file mode 100644 index 00000000000..bfa16177ad4 --- /dev/null +++ b/public/locales/et/modules/media-requests-list.json @@ -0,0 +1,35 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "replaceLinksWithExternalHost": { + "label": "" + }, + "openInNewTab": { + "label": "" + } + } + }, + "noRequests": "", + "state": { + "approved": "", + "pendingApproval": "", + "declined": "", + "available": "", + "partial": "" + }, + "tooltips": { + "approve": "", + "decline": "", + "approving": "" + }, + "mutation": { + "approving": "", + "declining": "", + "request": "", + "approved": "", + "declined": "" + } +} diff --git a/public/locales/et/modules/media-requests-stats.json b/public/locales/et/modules/media-requests-stats.json new file mode 100644 index 00000000000..f152af280f4 --- /dev/null +++ b/public/locales/et/modules/media-requests-stats.json @@ -0,0 +1,27 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "replaceLinksWithExternalHost": { + "label": "" + }, + "openInNewTab": { + "label": "" + } + } + }, + "mediaStats": { + "title": "", + "pending": "", + "tvRequests": "", + "movieRequests": "", + "approved": "", + "totalRequests": "" + }, + "userStats": { + "title": "", + "requests": "" + } +} diff --git a/public/locales/et/modules/media-server.json b/public/locales/et/modules/media-server.json new file mode 100644 index 00000000000..3e8852626d9 --- /dev/null +++ b/public/locales/et/modules/media-server.json @@ -0,0 +1,25 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "loading": "", + "card": { + "table": { + "header": { + "session": "", + "user": "", + "currentlyPlaying": "" + } + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/notebook.json b/public/locales/et/modules/notebook.json new file mode 100644 index 00000000000..69b88092c89 --- /dev/null +++ b/public/locales/et/modules/notebook.json @@ -0,0 +1,59 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "showToolbar": { + "label": "" + }, + "allowReadOnlyCheck": { + "label": "" + }, + "content": { + "label": "" + } + } + }, + "card": { + "controls": { + "bold": "", + "italic": "", + "strikethrough": "", + "underline": "", + "colorText": "", + "colorHighlight": "", + "code": "", + "clear": "", + "heading": "", + "align": "", + "blockquote": "", + "horizontalLine": "", + "bulletList": "", + "orderedList": "", + "checkList": "", + "increaseIndent": "", + "decreaseIndent": "", + "link": "", + "unlink": "", + "image": "", + "addTable": "", + "deleteTable": "", + "colorCell": "", + "mergeCell": "", + "addColumnLeft": "", + "addColumnRight": "", + "deleteColumn": "", + "addRowTop": "", + "addRowBelow": "", + "deleteRow": "" + }, + "modals": { + "clearColor": "", + "source": "", + "widthPlaceholder": "", + "columns": "", + "rows": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/overseerr.json b/public/locales/et/modules/overseerr.json new file mode 100644 index 00000000000..e7ff0440217 --- /dev/null +++ b/public/locales/et/modules/overseerr.json @@ -0,0 +1,30 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "popup": { + "item": { + "buttons": { + "askFor": "", + "cancel": "", + "request": "" + }, + "alerts": { + "automaticApproval": { + "title": "", + "text": "" + } + } + }, + "seasonSelector": { + "caption": "", + "table": { + "header": { + "season": "", + "numberOfEpisodes": "" + } + } + } + } +} diff --git a/public/locales/et/modules/ping.json b/public/locales/et/modules/ping.json new file mode 100644 index 00000000000..76a91fe52d5 --- /dev/null +++ b/public/locales/et/modules/ping.json @@ -0,0 +1,11 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "states": { + "online": "", + "offline": "", + "loading": "" + } +} diff --git a/public/locales/et/modules/rss.json b/public/locales/et/modules/rss.json new file mode 100644 index 00000000000..78fa5b25b5f --- /dev/null +++ b/public/locales/et/modules/rss.json @@ -0,0 +1,40 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "rssFeedUrl": { + "label": "", + "description": "" + }, + "refreshInterval": { + "label": "" + }, + "dangerousAllowSanitizedItemContent": { + "label": "", + "info": "" + }, + "textLinesClamp": { + "label": "" + }, + "sortByPublishDateAscending": { + "label": "" + }, + "sortPostsWithoutPublishDateToTheTop": { + "label": "" + }, + "maximumAmountOfPosts": { + "label": "" + } + }, + "card": { + "errors": { + "general": { + "title": "", + "text": "" + } + } + } + } +} diff --git a/public/locales/et/modules/search.json b/public/locales/et/modules/search.json new file mode 100644 index 00000000000..16651d7202f --- /dev/null +++ b/public/locales/et/modules/search.json @@ -0,0 +1,30 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "input": { + "placeholder": "" + }, + "switched-to": "", + "searchEngines": { + "search": { + "name": "", + "description": "" + }, + "youtube": { + "name": "", + "description": "" + }, + "torrents": { + "name": "", + "description": "" + }, + "overseerr": { + "name": "", + "description": "" + } + }, + "tip": "", + "switchedSearchEngine": "" +} diff --git a/public/locales/et/modules/smart-home/entity-state.json b/public/locales/et/modules/smart-home/entity-state.json new file mode 100644 index 00000000000..75dd923c8ad --- /dev/null +++ b/public/locales/et/modules/smart-home/entity-state.json @@ -0,0 +1,29 @@ +{ + "entityNotFound": "", + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "entityId": { + "label": "", + "info": "" + }, + "appendUnit": { + "label": "", + "info": "" + }, + "automationId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/smart-home/trigger-automation.json b/public/locales/et/modules/smart-home/trigger-automation.json new file mode 100644 index 00000000000..37046b5cf74 --- /dev/null +++ b/public/locales/et/modules/smart-home/trigger-automation.json @@ -0,0 +1,16 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "automationId": { + "label": "", + "info": "" + }, + "displayName": { + "label": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/modules/torrents-status.json b/public/locales/et/modules/torrents-status.json new file mode 100644 index 00000000000..2475ec8333a --- /dev/null +++ b/public/locales/et/modules/torrents-status.json @@ -0,0 +1,103 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "refreshInterval": { + "label": "" + }, + "displayCompletedTorrents": { + "label": "" + }, + "displayActiveTorrents": { + "label": "" + }, + "speedLimitOfActiveTorrents": { + "label": "" + }, + "displayStaleTorrents": { + "label": "" + }, + "labelFilterIsWhitelist": { + "label": "" + }, + "labelFilter": { + "label": "", + "description": "" + }, + "displayRatioWithFilter": { + "label": "", + "info": "" + } + } + }, + "card": { + "footer": { + "error": "", + "lastUpdated": "", + "ratioGlobal": "", + "ratioWithFilter": "" + }, + "table": { + "header": { + "isCompleted": "", + "name": "", + "dateAdded": "", + "size": "", + "download": "", + "upload": "", + "estimatedTimeOfArrival": "", + "progress": "", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "", + "stateMessage": "" + }, + "item": { + "text": "" + }, + "body": { + "nothingFound": "", + "filterHidingItems": "" + } + }, + "lineChart": { + "title": "", + "download": "", + "upload": "", + "timeSpan": "", + "totalDownload": "", + "totalUpload": "" + }, + "errors": { + "noDownloadClients": { + "title": "", + "text": "" + }, + "generic": { + "title": "", + "text": "" + } + }, + "loading": { + "title": "", + "description": "" + }, + "popover": { + "introductionPrefix": "", + "metrics": { + "queuePosition": "", + "progress": "", + "totalSelectedSize": "", + "state": "", + "ratio": "", + "completed": "" + } + } + } +} diff --git a/public/locales/et/modules/usenet.json b/public/locales/et/modules/usenet.json new file mode 100644 index 00000000000..dfe4e1e8612 --- /dev/null +++ b/public/locales/et/modules/usenet.json @@ -0,0 +1,49 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "card": { + "errors": { + "noDownloadClients": { + "title": "", + "text": "" + } + } + }, + "tabs": { + "queue": "", + "history": "" + }, + "info": { + "sizeLeft": "", + "paused": "" + }, + "queue": { + "header": { + "name": "", + "size": "", + "eta": "", + "progress": "" + }, + "empty": "", + "error": { + "title": "", + "message": "" + }, + "paused": "" + }, + "history": { + "header": { + "name": "", + "size": "", + "duration": "" + }, + "empty": "", + "error": { + "title": "", + "message": "" + }, + "paused": "" + } +} \ No newline at end of file diff --git a/public/locales/et/modules/video-stream.json b/public/locales/et/modules/video-stream.json new file mode 100644 index 00000000000..539daa1c44f --- /dev/null +++ b/public/locales/et/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/et/modules/weather.json b/public/locales/et/modules/weather.json new file mode 100644 index 00000000000..9e52e237f19 --- /dev/null +++ b/public/locales/et/modules/weather.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "displayInFahrenheit": { + "label": "" + }, + "displayCityName": { + "label": "" + }, + "location": { + "label": "" + } + } + }, + "card": { + "weatherDescriptions": { + "clear": "", + "mainlyClear": "", + "fog": "", + "drizzle": "", + "freezingDrizzle": "", + "rain": "", + "freezingRain": "", + "snowFall": "", + "snowGrains": "", + "rainShowers": "", + "snowShowers": "", + "thunderstorm": "", + "thunderstormWithHail": "", + "unknown": "" + } + }, + "error": "" +} diff --git a/public/locales/et/password-requirements.json b/public/locales/et/password-requirements.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/password-requirements.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/settings/common.json b/public/locales/et/settings/common.json new file mode 100644 index 00000000000..8ff0e555ade --- /dev/null +++ b/public/locales/et/settings/common.json @@ -0,0 +1,38 @@ +{ + "title": "", + "tooltip": "", + "tabs": { + "common": "", + "customizations": "" + }, + "tips": { + "configTip": "" + }, + "credits": { + "madeWithLove": "", + "thirdPartyContent": "", + "thirdPartyContentTable": { + "dependencyName": "", + "dependencyVersion": "" + } + }, + "grow": "", + "layout": { + "preview": { + "title": "", + "subtitle": "" + }, + "divider": "", + "main": "", + "sidebar": "", + "cannotturnoff": "", + "dashboardlayout": "", + "enablersidebar": "", + "enablelsidebar": "", + "enablesearchbar": "", + "enabledocker": "", + "enableping": "", + "enablelsidebardesc": "", + "enablersidebardesc": "" + } +} diff --git a/public/locales/et/settings/customization/access.json b/public/locales/et/settings/customization/access.json new file mode 100644 index 00000000000..cc4d17f613f --- /dev/null +++ b/public/locales/et/settings/customization/access.json @@ -0,0 +1,6 @@ +{ + "allowGuests": { + "label": "", + "description": "" + } +} \ No newline at end of file diff --git a/public/locales/et/settings/customization/general.json b/public/locales/et/settings/customization/general.json new file mode 100644 index 00000000000..6c0cee3ef1a --- /dev/null +++ b/public/locales/et/settings/customization/general.json @@ -0,0 +1,29 @@ +{ + "text": "", + "accordeon": { + "layout": { + "name": "", + "description": "" + }, + "gridstack": { + "name": "", + "description": "" + }, + "pageMetadata": { + "name": "", + "description": "" + }, + "appereance": { + "name": "", + "description": "" + }, + "accessibility": { + "name": "", + "description": "" + }, + "access": { + "name": "", + "description": "" + } + } +} diff --git a/public/locales/et/settings/customization/gridstack.json b/public/locales/et/settings/customization/gridstack.json new file mode 100644 index 00000000000..18c3d82339f --- /dev/null +++ b/public/locales/et/settings/customization/gridstack.json @@ -0,0 +1,10 @@ +{ + "columnsCount": { + "labelPreset": "", + "descriptionPreset": "", + "descriptionExceedsPreset": "" + }, + "unsavedChanges": "", + "applyChanges": "", + "defaultValues": "" +} \ No newline at end of file diff --git a/public/locales/et/settings/customization/opacity-selector.json b/public/locales/et/settings/customization/opacity-selector.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/settings/customization/opacity-selector.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/settings/customization/page-appearance.json b/public/locales/et/settings/customization/page-appearance.json new file mode 100644 index 00000000000..2c806f677eb --- /dev/null +++ b/public/locales/et/settings/customization/page-appearance.json @@ -0,0 +1,50 @@ +{ + "pageTitle": { + "label": "", + "description": "" + }, + "metaTitle": { + "label": "", + "description": "" + }, + "logo": { + "label": "", + "description": "" + }, + "favicon": { + "label": "", + "description": "" + }, + "background": { + "label": "" + }, + "backgroundImageAttachment": { + "label": "", + "options": { + "fixed": "", + "scroll": "" + } + }, + "backgroundImageSize": { + "label": "", + "options": { + "cover": "", + "contain": "" + } + }, + "backgroundImageRepeat": { + "label": "", + "options": { + "repeat": "", + "no-repeat": "", + "repeat-x": "", + "repeat-y": "" + } + }, + "customCSS": { + "label": "", + "description": "", + "placeholder": "", + "applying": "" + } +} diff --git a/public/locales/et/settings/customization/shade-selector.json b/public/locales/et/settings/customization/shade-selector.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/et/settings/customization/shade-selector.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/et/tools/docker.json b/public/locales/et/tools/docker.json new file mode 100644 index 00000000000..54e726b7336 --- /dev/null +++ b/public/locales/et/tools/docker.json @@ -0,0 +1,32 @@ +{ + "title": "", + "alerts": { + "notConfigured": { + "text": "" + } + }, + "modals": { + "selectBoard": { + "title": "", + "text": "", + "form": { + "board": { + "label": "" + }, + "submit": "" + } + } + }, + "notifications": { + "selectBoard": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/et/user/preferences.json b/public/locales/et/user/preferences.json new file mode 100644 index 00000000000..d550a1f0370 --- /dev/null +++ b/public/locales/et/user/preferences.json @@ -0,0 +1,48 @@ +{ + "metaTitle": "", + "pageTitle": "Teie eelistused", + "boards": { + "defaultBoard": { + "label": "" + } + }, + "accessibility": { + "title": "", + "disablePulse": { + "label": "", + "description": "" + }, + "replaceIconsWithDots": { + "label": "", + "description": "" + } + }, + "localization": { + "language": { + "label": "" + }, + "firstDayOfWeek": { + "label": "", + "options": { + "monday": "", + "saturday": "", + "sunday": "" + } + } + }, + "searchEngine": { + "title": "", + "custom": "", + "newTab": { + "label": "" + }, + "autoFocus": { + "label": "", + "description": "" + }, + "template": { + "label": "", + "description": "" + } + } +} \ No newline at end of file diff --git a/public/locales/et/widgets/draggable-list.json b/public/locales/et/widgets/draggable-list.json new file mode 100644 index 00000000000..5d27e99adf6 --- /dev/null +++ b/public/locales/et/widgets/draggable-list.json @@ -0,0 +1,7 @@ +{ + "noEntries": { + "title": "", + "text": "" + }, + "buttonAdd": "" +} diff --git a/public/locales/et/widgets/error-boundary.json b/public/locales/et/widgets/error-boundary.json new file mode 100644 index 00000000000..ce74ad0fc2c --- /dev/null +++ b/public/locales/et/widgets/error-boundary.json @@ -0,0 +1,14 @@ +{ + "card": { + "title": "", + "buttons": { + "details": "", + "tryAgain": "" + } + }, + "modal": { + "text": "", + "label": "", + "reportButton": "" + } +} diff --git a/public/locales/et/zod.json b/public/locales/et/zod.json new file mode 100644 index 00000000000..4c7c8b82ded --- /dev/null +++ b/public/locales/et/zod.json @@ -0,0 +1,22 @@ +{ + "errors": { + "default": "", + "required": "", + "string": { + "startsWith": "", + "endsWith": "", + "includes": "" + }, + "tooSmall": { + "string": "", + "number": "" + }, + "tooBig": { + "string": "", + "number": "" + }, + "custom": { + "passwordMatch": "" + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/health-monitoring.json b/public/locales/fr/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/fr/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/indexer-manager.json b/public/locales/fr/modules/indexer-manager.json new file mode 100644 index 00000000000..a36d3d81227 --- /dev/null +++ b/public/locales/fr/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Statut du gestionnaire d’indexeur", + "description": "Statuts de vos indexeurs", + "settings": { + "title": "Statut du gestionnaire d’indexeur" + } + }, + "indexersStatus": { + "title": "Gestionnaire d’indexeur", + "testAllButton": "Tout tester" + }, + "errors": { + "general": { + "title": "Impossible de trouver un gestionnaire d’indexeur", + "text": "Il y a eu un problème de connexion à votre gestionnaire d’indexeur. Veuillez vérifier votre configuration/intégration(s)." + } + } +} \ No newline at end of file diff --git a/public/locales/fr/modules/smart-home/entity-state.json b/public/locales/fr/modules/smart-home/entity-state.json index b01d360889e..975fd3003fa 100644 --- a/public/locales/fr/modules/smart-home/entity-state.json +++ b/public/locales/fr/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID de l’entité", "info": "ID d’entité unique dans Home Assistant. Copiez en cliquant sur l'entité > Cliquez sur l'icône en forme de rouage > Cliquez sur le bouton Copier sous « ID d'entité ». Certaines entités personnalisées peuvent ne pas être prises en charge." }, + "appendUnit": { + "label": "Ajouter une unité de mesure", + "info": "Ajouter l'attribut d'unité de mesure à l'état de l'entité." + }, "automationId": { "label": "ID d'automatisation optionnelle", "info": "Votre identifiant unique d'automatisation. Commence toujours par automation.XXXXX. S'il n'est pas défini, le widget ne sera pas cliquable et n'affichera que l'état de l'entité. Après un clic, l'état de l'entité sera actualisé." }, "displayName": { "label": "Nom d'affichage" + }, + "displayFriendlyName": { + "label": "Afficher le nom personnalisé", + "info": "Afficher le nom personnalisé de Home Assistant au lieu du nom d'affichage" } } } diff --git a/public/locales/he/modules/health-monitoring.json b/public/locales/he/modules/health-monitoring.json new file mode 100644 index 00000000000..20c70f59a76 --- /dev/null +++ b/public/locales/he/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "ניטור בריאות המערכת", + "description": "מידע על ה-NAS שלך", + "settings": { + "title": "ניטור בריאות המערכת", + "fahrenheit": { + "label": "פרנהייט" + } + } + }, + "cpu": { + "label": "מעבד", + "load": "טעינה ממוצעת", + "minute": "{{minute}} דקה" + }, + "memory": { + "label": "זיכרון", + "totalMem": "סך הזיכרון: {{total}}GB", + "available": "זמין: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "מערכת קבצים", + "available": "זמין: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "זמן פעילות", + "updates": "עדכונים", + "reboot": "אתחול מחדש" + }, + "errors": { + "general": { + "title": "לא מצליח למצוא את ה-NAS שלך", + "text": "הייתה בעיה בחיבור ל-NAS שלך. נא ודא את התצורה/השילובים שלך." + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/indexer-manager.json b/public/locales/he/modules/indexer-manager.json new file mode 100644 index 00000000000..90b6aeebad9 --- /dev/null +++ b/public/locales/he/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "סטטוס מנהל אינדקס", + "description": "סטטוס לגבי האינדקסים שלך", + "settings": { + "title": "סטטוס מנהל אינדקס" + } + }, + "indexersStatus": { + "title": "מנהל אינדקס", + "testAllButton": "בדוק הכל" + }, + "errors": { + "general": { + "title": "לא ניתן למצוא מנהל אינדקס", + "text": "הייתה בעיה בחיבור למנהל האינדקס שלך. אנא בדוק את הגדרות האינטרגציה." + } + } +} \ No newline at end of file diff --git a/public/locales/he/modules/smart-home/entity-state.json b/public/locales/he/modules/smart-home/entity-state.json index 4662fd94f5a..fa9e016b6bc 100644 --- a/public/locales/he/modules/smart-home/entity-state.json +++ b/public/locales/he/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "מזהה ישות", "info": "מזהה ישות ייחודי ב-Home Assistant. העתק על ידי לחיצה על ישות > לחץ על סמל גלגל שיניים > לחץ על כפתור העתק ב'זיהוי ישות'. ייתכן שחלק מהישויות המותאמות אישית אינן נתמכות." }, + "appendUnit": { + "label": "צרף יחידת מדידה", + "info": "הוסף את תכונת יחידת המדידה למצב הישות." + }, "automationId": { "label": "מזהה אוטומציה אופציונלי", "info": "מזהה האוטומציה הייחודי שלך. תמיד מתחיל באוטומציה.XXXXXX. אם לא מוגדר, לא יהיה ניתן ללחוץ על יישומון והוא רק יציג את המצב. לאחר לחיצה, מצב הישות יתרענן." }, "displayName": { "label": "הצג שם" + }, + "displayFriendlyName": { + "label": "הצג שם ידידותי", + "info": "הצג שם ידידותי מ-Home Assistant במקום שם תצוגה" } } } diff --git a/public/locales/hr/modules/health-monitoring.json b/public/locales/hr/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/hr/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/hr/modules/indexer-manager.json b/public/locales/hr/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/hr/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/hr/modules/smart-home/entity-state.json b/public/locales/hr/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/hr/modules/smart-home/entity-state.json +++ b/public/locales/hr/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/hu/modules/health-monitoring.json b/public/locales/hu/modules/health-monitoring.json new file mode 100644 index 00000000000..8efa9674fbb --- /dev/null +++ b/public/locales/hu/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "Processzor", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/hu/modules/indexer-manager.json b/public/locales/hu/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/hu/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/hu/modules/smart-home/entity-state.json b/public/locales/hu/modules/smart-home/entity-state.json index 3bae542a34e..17e2f8abda8 100644 --- a/public/locales/hu/modules/smart-home/entity-state.json +++ b/public/locales/hu/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Egység azonosító", "info": "Egyedi egység ID a Home Assistantben. Másolás az egységre kattintva > Kattintson a fogaskerék ikonra > Kattintson a másolás gombra az „Egység ID”-nél. Előfordulhat, hogy egyes egyéni egységek nem támogatottak." }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "Választható automatizálási azonosító", "info": "Az Ön egyedi automatizálási azonosítója. Mindig az automatizálással kezdődik.XXXX. Ha nincs beállítva, a widget nem kattintható, és csak az állapotot jeleníti meg. A kattintás után az entitás állapota frissül." }, "displayName": { "label": "Megjelenített név" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/it/modules/health-monitoring.json b/public/locales/it/modules/health-monitoring.json new file mode 100644 index 00000000000..5dc0e2d4f9b --- /dev/null +++ b/public/locales/it/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Monitoraggio dello stato del sistema", + "description": "Informazioni sul tuo NAS", + "settings": { + "title": "Monitoraggio dello stato del sistema", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Utilizzo medio", + "minute": "{{minute}} minuto" + }, + "memory": { + "label": "Memoria", + "totalMem": "Memoria totale: {{total}}GB", + "available": "Disponibile: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "File System", + "available": "Disponibile: {{available}}- {{percentage}}%" + }, + "info": { + "uptime": "Uptime", + "updates": "Aggiornamenti", + "reboot": "Riavvio" + }, + "errors": { + "general": { + "title": "Impossibile trovare il tuo NAS", + "text": "Si è verificato un problema di connessione al tuo NAS. Verifica la configurazione/integrazione." + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/indexer-manager.json b/public/locales/it/modules/indexer-manager.json new file mode 100644 index 00000000000..a9d978f90da --- /dev/null +++ b/public/locales/it/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Stato del gestore dell'indicizzatore", + "description": "Stato dei tuoi indicizzatori", + "settings": { + "title": "Stato del gestore dell'indicizzatore" + } + }, + "indexersStatus": { + "title": "Gestore dell'indicizzatore", + "testAllButton": "Prova Tutto" + }, + "errors": { + "general": { + "title": "Impossibile trovare un gestore dell'indicizzatore", + "text": "Si è verificato un problema durante la connessione al gestore dell'indicizzatore. Verifica la tua configurazione/integrazione." + } + } +} \ No newline at end of file diff --git a/public/locales/it/modules/smart-home/entity-state.json b/public/locales/it/modules/smart-home/entity-state.json index 9dc1ce7307c..5c86b3fa134 100644 --- a/public/locales/it/modules/smart-home/entity-state.json +++ b/public/locales/it/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID entità", "info": "ID entità univoco in Home Assistant. Copia facendo clic sull'entità > clic sull'icona della rondella > clic sul pulsante copia in \"ID entità\". Alcune entità personalizzate potrebbero non essere supportate." }, + "appendUnit": { + "label": "Aggiungi unità di misura", + "info": "Aggiungi l'attributo dell'unità di misura allo stato dell'entità." + }, "automationId": { "label": "ID automazione opzionale", "info": "Il tuo ID di automazione univoco. Inizia sempre con automation.XXXXX. Se non impostato, il widget non sarà selezionabile e visualizzerà solo lo stato. Dopo il clic, lo stato dell'entità verrà aggiornato." }, "displayName": { "label": "Visualizza nome" + }, + "displayFriendlyName": { + "label": "Visualizza il nome descrittivo", + "info": "Visualizza il nome descrittivo di Home Assistant invece del nome visualizzato" } } } diff --git a/public/locales/ja/modules/health-monitoring.json b/public/locales/ja/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/ja/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/indexer-manager.json b/public/locales/ja/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/ja/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/ja/modules/smart-home/entity-state.json b/public/locales/ja/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/ja/modules/smart-home/entity-state.json +++ b/public/locales/ja/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/ko/modules/health-monitoring.json b/public/locales/ko/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/ko/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/indexer-manager.json b/public/locales/ko/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/ko/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/ko/modules/smart-home/entity-state.json b/public/locales/ko/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/ko/modules/smart-home/entity-state.json +++ b/public/locales/ko/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/lt/authentication/invite.json b/public/locales/lt/authentication/invite.json new file mode 100644 index 00000000000..f3c8c6f071a --- /dev/null +++ b/public/locales/lt/authentication/invite.json @@ -0,0 +1,35 @@ +{ + "metaTitle": "Sukurti paskyrą", + "title": "Sukurti paskyrą", + "text": "Nurodykite savo kredencialus", + "form": { + "fields": { + "username": { + "label": "" + }, + "password": { + "label": "Slaptažodis" + }, + "passwordConfirmation": { + "label": "Patvirtinti slaptažodį" + } + }, + "buttons": { + "submit": "Sukurti paskyrą" + } + }, + "notifications": { + "loading": { + "title": "Paskyra kuriama", + "text": "Prašome palaukti" + }, + "success": { + "title": "Paskyra sukurta", + "text": "Jūsų paskyra sėkmingai sukurta" + }, + "error": { + "title": "", + "text": "Kažkas nutiko ne taip, gauta ši klaida: {{error}}" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/authentication/login.json b/public/locales/lt/authentication/login.json new file mode 100644 index 00000000000..1c6e2d5485a --- /dev/null +++ b/public/locales/lt/authentication/login.json @@ -0,0 +1,20 @@ +{ + "metaTitle": "Prisijungti", + "title": "Sveiki sugrįžę!", + "text": "Įveskite savo kredencialus", + "form": { + "fields": { + "username": { + "label": "" + }, + "password": { + "label": "Slaptažodis" + } + }, + "buttons": { + "submit": "Prisijungti" + }, + "afterLoginRedirection": "Prisijungę būsite nukreipti į {{url}}" + }, + "alert": "Jūsų kredencialai neteisingi arba šios paskyros nėra. Prašome, pabandyti dar kartą." +} \ No newline at end of file diff --git a/public/locales/lt/boards/common.json b/public/locales/lt/boards/common.json new file mode 100644 index 00000000000..796c1d2e54d --- /dev/null +++ b/public/locales/lt/boards/common.json @@ -0,0 +1,5 @@ +{ + "header": { + "customize": "Koreguokite lentą" + } +} \ No newline at end of file diff --git a/public/locales/lt/boards/customize.json b/public/locales/lt/boards/customize.json new file mode 100644 index 00000000000..43affc92647 --- /dev/null +++ b/public/locales/lt/boards/customize.json @@ -0,0 +1,29 @@ +{ + "metaTitle": "Koreguokite {{name}} Lentą", + "pageTitle": "{{name}} Lentos koregacija", + "backToBoard": "Atgal į lentą", + "settings": { + "appearance": { + "primaryColor": "Pagrindinė spalva", + "secondaryColor": "Antrinė spalva" + } + }, + "save": { + "button": "Išsaugoti pakeitimus", + "note": "Atsargiai, turite neišsaugotų pakeitimų!" + }, + "notifications": { + "pending": { + "title": "Išsaugomi pakeitimai", + "message": "Palaukite, kol išsaugosime jūsų pakeitimus" + }, + "success": { + "title": "Pakeitimai išsaugoti", + "message": "Jūsų pakeitimai sėkmingai išsaugotas" + }, + "error": { + "title": "", + "message": "Nepavyko išsaugoti pakeitimų" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/common.json b/public/locales/lt/common.json new file mode 100644 index 00000000000..13d0b679318 --- /dev/null +++ b/public/locales/lt/common.json @@ -0,0 +1,58 @@ +{ + "save": "", + "apply": "", + "insert": "", + "about": "", + "cancel": "Atšaukti", + "close": "", + "back": "", + "delete": "", + "ok": "", + "edit": "", + "next": "", + "previous": "", + "confirm": "", + "enabled": "", + "duplicate": "Sukurti kopiją", + "disabled": "", + "enableAll": "", + "disableAll": "", + "version": "", + "changePosition": "", + "remove": "Pašalinti", + "removeConfirm": "", + "createItem": "", + "sections": { + "settings": "Nustatymai", + "dangerZone": "" + }, + "secrets": { + "apiKey": "", + "username": "", + "password": "Slaptažodis" + }, + "tip": "", + "time": { + "seconds": "", + "minutes": "", + "hours": "" + }, + "loading": "Kraunama...", + "breakPoints": { + "small": "", + "medium": "", + "large": "" + }, + "seeMore": "", + "position": { + "left": "Kairėje", + "center": "", + "right": "Dešinėje" + }, + "attributes": { + "width": "Plotis", + "height": "Aukštis" + }, + "public": "Vieša", + "restricted": "" +} \ No newline at end of file diff --git a/public/locales/lt/layout/common.json b/public/locales/lt/layout/common.json new file mode 100644 index 00000000000..45f9dc7fe5c --- /dev/null +++ b/public/locales/lt/layout/common.json @@ -0,0 +1,25 @@ +{ + "modals": { + "blockedPopups": { + "title": "Iššokantys langai užblokuoti", + "text": "Jūsų naršyklė užblokavo \"Homarr\" prieigą prie jos API. Dažniausiai taip nutinka dėl \"AdBlockers\" arba uždraustų leidimų. \"Homarr\" negali automatiškai prašyti leidimų.", + "list": { + "browserPermission": "Spustelėkite šalia URL esančią piktogramą ir patikrinkite leidimus. Leisti iššokančius langus ir langus", + "adBlockers": "Išjungti skelbimų blokatorius ir saugumo įrankius naršyklėje", + "otherBrowser": "Išbandykite kitą naršyklę" + } + } + }, + "actions": { + "category": { + "openAllInNewTab": "Atidaryti visus naujame skirtuke" + } + }, + "menu": { + "moveUp": "Pakelti aukštyn", + "moveDown": "Perkelti žemyn", + "addCategory": "Pridėti kategoriją {{location}}", + "addAbove": "aukščiau", + "addBelow": "žemiau" + } +} \ No newline at end of file diff --git a/public/locales/lt/layout/element-selector/selector.json b/public/locales/lt/layout/element-selector/selector.json new file mode 100644 index 00000000000..d0442f7fb93 --- /dev/null +++ b/public/locales/lt/layout/element-selector/selector.json @@ -0,0 +1,26 @@ +{ + "modal": { + "title": "Pridėti naują plytelę", + "text": "Plytelės yra pagrindinis Homarr elementas. Jos naudojamos programėlėms ir kitai informacijai rodyti. Galite pridėti tiek plytelių, kiek norite." + }, + "widgetDescription": "Valdikliai sąveikauja su jūsų programomis, kad galėtumėte geriau valdyti programas. Paprastai prieš naudojant jiems reikia papildomos konfigūracijos.", + "goBack": "Grįžkite prie ankstesnio veiksmo", + "actionIcon": { + "tooltip": "Pridėti naują plytelę" + }, + "apps": "Programėlės", + "app": { + "defaultName": "Jūsų programėlė" + }, + "widgets": "Valdikliai", + "categories": "Kategorijos", + "category": { + "newName": "Naujos kategorijos pavadinimas", + "defaultName": "Nauja kategorija", + "created": { + "title": "Kategorija sukurta", + "message": "Sukurta kategorija {{name}}" + } + }, + "importFromDocker": "Importuoti iš docker" +} diff --git a/public/locales/lt/layout/errors/access-denied.json b/public/locales/lt/layout/errors/access-denied.json new file mode 100644 index 00000000000..7f583d3af1b --- /dev/null +++ b/public/locales/lt/layout/errors/access-denied.json @@ -0,0 +1,5 @@ +{ + "title": "Prieiga uždrausta", + "text": "Neturite pakankamų teisių, kad galėtumėte pasiekti šį puslapį. Jei manote, kad tai padaryta netyčia, kreipkitės į administratorių.", + "switchAccount": "Perjunkite į kitą paskyrą" +} \ No newline at end of file diff --git a/public/locales/lt/layout/errors/not-found.json b/public/locales/lt/layout/errors/not-found.json new file mode 100644 index 00000000000..c75f223842d --- /dev/null +++ b/public/locales/lt/layout/errors/not-found.json @@ -0,0 +1,5 @@ +{ + "title": "Puslapis nerastas", + "text": "Šio puslapio nepavyko rasti. Šio puslapio URL gali būti pasibaigęs, URL netinkamas arba dabar turite reikiamus leidimus pasiekti šį šaltinį.", + "button": "Eiti į pradžią" +} \ No newline at end of file diff --git a/public/locales/lt/layout/header.json b/public/locales/lt/layout/header.json new file mode 100644 index 00000000000..11538873f9c --- /dev/null +++ b/public/locales/lt/layout/header.json @@ -0,0 +1,27 @@ +{ + "search": { + "label": "Ieškoti", + "engines": { + "web": "Ieškoti {{query}} internete", + "youtube": "Ieškoti {{query}} svetainėje YouTube", + "torrent": "Ieškoti {{query}} torrentų", + "movie": "Ieškoti {{query}} {{app}}" + } + }, + "actions": { + "avatar": { + "switchTheme": "Perjugti temą", + "preferences": "Vartotojo nustatymai", + "defaultBoard": "Numatytasis skydelis", + "manage": "Valdyti", + "logout": "Atsijungti nuo {{username}}", + "login": "Prisijungti" + } + }, + "modals": { + "movie": { + "title": "", + "topResults": "Geriausi {{count}} rezultatai {{search}}." + } + } +} \ No newline at end of file diff --git a/public/locales/lt/layout/header/actions/toggle-edit-mode.json b/public/locales/lt/layout/header/actions/toggle-edit-mode.json new file mode 100644 index 00000000000..4df4bb6ffd1 --- /dev/null +++ b/public/locales/lt/layout/header/actions/toggle-edit-mode.json @@ -0,0 +1,12 @@ +{ + "description": "Redagavimo režime galite reguliuoti plytekes ir konfigūruoti programas. Pakeitimai neišsaugomi, kol neišeinate iš redagavimo režimo.", + "button": { + "disabled": "Įjunkite redagavimo režimą", + "enabled": "Išeikite ir išsaugokite" + }, + "popover": { + "title": "Redagavimo režimas įjungtas <1>{{size}} dydžiui", + "text": "Galite koreguoti save programas. Pakeitimai yra neišsaugomi, kol neišeinate iš redagavimo režimo" + }, + "unloadEvent": "Išeikite iš redagavimo režimo, kad išsaugotumėte pakeitimus" +} diff --git a/public/locales/lt/layout/manage.json b/public/locales/lt/layout/manage.json new file mode 100644 index 00000000000..a315987d067 --- /dev/null +++ b/public/locales/lt/layout/manage.json @@ -0,0 +1,36 @@ +{ + "navigation": { + "home": { + "title": "Pagrindinis" + }, + "boards": { + "title": "Lentos" + }, + "users": { + "title": "Vartotojai", + "items": { + "manage": "Valdyti", + "invites": "Pakvietimai" + } + }, + "help": { + "title": "Pagalba", + "items": { + "documentation": "Dokumentacija", + "report": "Pranešti apie problemą / klaidą", + "discord": "Bendruomenės Discord", + "contribute": "Prisidėti" + } + }, + "tools": { + "title": "Įrankiai", + "items": { + "docker": "Docker", + "api": "API" + } + }, + "about": { + "title": "" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/layout/mobile/drawer.json b/public/locales/lt/layout/mobile/drawer.json new file mode 100644 index 00000000000..45011ac3380 --- /dev/null +++ b/public/locales/lt/layout/mobile/drawer.json @@ -0,0 +1,3 @@ +{ + "title": "{{position}} šoninė juosta" +} diff --git a/public/locales/lt/layout/modals/about.json b/public/locales/lt/layout/modals/about.json new file mode 100644 index 00000000000..dc3fee039f8 --- /dev/null +++ b/public/locales/lt/layout/modals/about.json @@ -0,0 +1,30 @@ +{ + "description": "„Homarr“ yra aptakus, šiuolaikiškas prietaisų skydelis, kuriame visos jūsų programos ir paslaugos yra po ranka. Naudodami Homarr viską galite pasiekti ir valdyti vienoje patogioje vietoje. „Homarr“ sklandžiai integruojasi su jūsų pridėtomis programėlėmis, suteikdama jums vertingos informacijos ir suteikdama visišką valdymą. Diegimas yra lengvas, o „Homarr“ palaiko daugybę diegimo metodų.", + "addToDashboard": "Pridėti prie panelės", + "tip": "Mod reiškia jūsų modifikatoriaus klavišą, tai yra Ctrl ir Command / Super / Windows klavišas", + "key": "Spartusis klavišas", + "action": "Veiksmas", + "keybinds": "Klavišų priskyrimas", + "translators": "Vertėjai ({{count}})", + "translatorsDescription": "Šių žmonių dėka Homarr pasiekiamas {{languages}} kalbomis! Norite padėti išversti Homarr į savo kalbą? Skaitykite, kaip tai padaryti čia.", + "contributors": "Bendradarbiautojai ({{count}})", + "contributorsDescription": "Šie žmonės sukūrė kodą, dėl kurio veikia \"Homarr\"! Norite padėti kurti \"Homarr\"? Skaitykite, kaip tai padaryti čia", + "actions": { + "toggleTheme": "Perjungti šviesų / tamsų režimą", + "focusSearchBar": "Sutelkite dėmesį į paieškos juostą", + "openDocker": "Atidaryti \"Docker\" valdiklį", + "toggleEdit": "Perjungti redagavimo režimą" + }, + "metrics": { + "configurationSchemaVersion": "Konfigūracijos schemos versija", + "version": "", + "nodeEnvironment": "Node aplinka", + "i18n": "Įkeltos I18n vertimo vardų erdvės", + "locales": "Sukonfigūruotos I18n lokalės", + "experimental_disableEditMode": "EKSPERIMENTINIS: Išjungti redagavimo režimą" + }, + "version": { + "new": "Nauja: {{newVersion}}", + "dropdown": "Versija {{newVersion}} yra prieinama! Dabartinė versija yra {{currentVersion}}" + } +} \ No newline at end of file diff --git a/public/locales/lt/layout/modals/add-app.json b/public/locales/lt/layout/modals/add-app.json new file mode 100644 index 00000000000..e0d46deeb57 --- /dev/null +++ b/public/locales/lt/layout/modals/add-app.json @@ -0,0 +1,128 @@ +{ + "tabs": { + "general": "Bendras", + "behaviour": "Elgesys", + "network": "Tinklas", + "appearance": "Išvaizda", + "integration": "Integracija" + }, + "general": { + "appname": { + "label": "Programos pavadinimas", + "description": "Naudojama programai rodyti lentelėje." + }, + "internalAddress": { + "label": "Vidinis adresas", + "description": "Programėlės vidinis IP adresas.", + "troubleshoot": { + "label": "Turite problemų?", + "header": "Čia pateikiamas dažniausiai daromų klaidų sąrašas ir jų šalinimas:", + "lines": { + "nothingAfterPort": "Daugeliu, jei ne visais atvejais, neturėtumėte įvesti jokio kelio po prievado. (Netgi „/admin“, skirta pihole, arba „/web“, skirta plex)", + "protocolCheck": "Visada įsitikinkite, kad prieš URL yra http arba https, ir įsitikinkite, kad naudojate tinkamą.", + "preferIP": "Rekomenduojama naudoti tiesioginį kompiuterio ar konteinerio Ip adresą, su kuriuo bandote susisiekti.", + "enablePings": "Patikrinkite, ar IP yra teisingas, įjungę ping. Pritaikyti valdybą -> Maketas -> Įjungti pingus. Programos plytelėse pasirodys mažas raudonas arba žalias burbuliukas, kurį užkliudžius bus nurodytas atsakymo kodas (dažniausiai tikimasi žalio burbuliuko su kodu 200).", + "wget": "Norėdami įsitikinti, kad \"homarr\" gali bendrauti su kitomis programėlėmis, atlikite wget/curl/ping programos IP:prievadas.", + "iframe": "Kalbant apie iframe, jie visada turėtų naudoti tą patį protokolą (http/s) kaip ir Homarr.", + "clearCache": "Kai kuri informacija registruojama talpykloje, todėl integracija gali neveikti, jei neišvalysite talpyklos \"Homarr\" bendrosiose parinktyse." + }, + "footer": "Jei reikia daugiau trikčių šalinimo, susisiekite su mumis per {{discord}}." + } + }, + "externalAddress": { + "label": "Išorinis adresas", + "description": "URL adresas, kuris bus atidarytas spustelėjus programą." + } + }, + "behaviour": { + "isOpeningNewTab": { + "label": "Atidaryti naujame skirtuke", + "description": "Atidarykite programėlę naujame skirtuke, o ne dabartiniame." + }, + "tooltipDescription": { + "label": "Programos aprašymas", + "description": "Įvestas tekstas bus rodomas užvedus pelės žymeklį virš programos.\nNaudokite tai, kad naudotojams pateiktumėte daugiau informacijos apie programą arba palikite tuščią, kad nieko neturėtumėte." + }, + "customProtocolWarning": "Naudojant nestandartinį protokolą. Tam gali prireikti iš anksto įdiegtų programų ir gali kilti saugumo rizika. Įsitikinkite, kad jūsų adresas yra saugus ir patikimas." + }, + "network": { + "statusChecker": { + "label": "Būsenos tikrintuvas", + "description": "Naudodamas paprastą HTTP(S) užklausą patikrina, ar jūsų programa yra prisijungusi." + }, + "statusCodes": { + "label": "HTTP būsenos kodai", + "description": "HTTP būsenos kodai, kurie laikomi prisijungusiais." + } + }, + "appearance": { + "icon": { + "label": "Programėlės piktograma", + "description": "Pradėkite rašyti, kad rastumėte piktogramą. Taip pat galite įklijuoti paveikslėlio URL adresą ir naudoti pasirinktą piktogramą.", + "autocomplete": { + "title": "Rezultatų nerasta", + "text": "Pabandykite naudoti tikslesnę paieškos frazę. Jei nerandate norimos piktogramos, įklijuokite pirmiau pateiktą paveikslėlio URL, kad gautumėte pasirinktinę piktogramą" + }, + "noItems": { + "title": "Įkeliamos išorinės piktogramos", + "text": "Gali užtrukti kelias sekundes" + } + }, + "appNameFontSize": { + "label": "Programos pavadinimo šrifto dydis", + "description": "Nustatykite šrifto dydį, kai programėlės pavadinimas rodomas plytelėje." + }, + "appNameStatus": { + "label": "Programos pavadinimo būsena", + "description": "Pasirinkite, kurioje vietoje norite, kad būtų rodomas pavadinimas, jei apskritai norite, kad jis būtų rodomas.", + "dropdown": { + "normal": "Rodyti pavadinimą tik ant plytelės", + "hover": "Rodyti pavadinimą tik užvedus pelės žymeklį ant patarimo", + "hidden": "Visiškai nerodyti" + } + }, + "positionAppName": { + "label": "Programos pavadinimas Pozicija", + "description": "Programėlės pavadinimo padėtis piktogramos atžvilgiu.", + "dropdown": { + "top": "Viršuje", + "right": "Dešinėje", + "bottom": "Apačioje", + "left": "Kairėje" + } + }, + "lineClampAppName": { + "label": "Programos pavadinimo linijos spaustukas", + "description": "Nustato, kiek eilučių turėtų tilpti į maksimalų pavadinimą. Nustatykite 0, jei norite neriboto skaičiaus." + } + }, + "integration": { + "type": { + "label": "Integracijos konfigūracija", + "description": "Integracijos konfigūracija, kuri bus naudojama prisijungti prie jūsų programos.", + "placeholder": "Pasirinkite integraciją", + "defined": "Nustatyta", + "undefined": "Nenustatyta", + "public": "Vieša", + "private": "Privatu", + "explanationPrivate": "Privati paslaptis į serverį siunčiama tik vieną kartą. Naršyklei atnaujinus puslapį, ji daugiau niekada nebus siunčiama.", + "explanationPublic": "Viešoji paslaptis visada siunčiama klientui ir yra pasiekiama per API. Jame neturėtų būti jokių konfidencialių verčių, pavyzdžiui, naudotojų vardų, slaptažodžių, žetonų, sertifikatų ir pan." + }, + "secrets": { + "description": "Norėdami atnaujinti paslaptį, įveskite reikšmę ir spustelėkite mygtuką Išsaugoti. Jei norite pašalinti paslaptį, naudokite mygtuką ištrinti.", + "warning": "Jūsų prisijungimo duomenys yra jūsų integracijų prieiga, todėl turėtumėte niekada jais nesidalyti su niekuo kitu. \"Homarr\" komanda niekada neprašys pateikti įgaliojimų. Įsitikinkite, kad saugote ir saugiai valdote savo paslaptis.", + "clear": "Trinti paslaptį", + "save": "Išsaugoti paslaptį", + "update": "Atnaujinti paslaptį" + } + }, + "validation": { + "popover": "Jūsų formoje yra neteisingų duomenų. Vadinasi, jo išsaugoti nepavyks. Išspręskite visas problemas ir dar kartą spustelėkite šį mygtuką, kad išsaugotumėte pakeitimus", + "name": "Pavadinimas yra būtinas", + "noUrl": "Reikalingas URL adresas", + "invalidUrl": "Reikšmė nėra galiojantis url", + "noIconUrl": "Šis laukelis yra privalomas", + "noExternalUri": "Reikalingas išorinis URL", + "invalidExternalUri": "Išorinis URL nėra galiojantis URL" + } +} diff --git a/public/locales/lt/layout/modals/change-position.json b/public/locales/lt/layout/modals/change-position.json new file mode 100644 index 00000000000..8e913381408 --- /dev/null +++ b/public/locales/lt/layout/modals/change-position.json @@ -0,0 +1,8 @@ +{ + "xPosition": "X ašies padėtis", + "width": "Plotis", + "height": "Aukštis", + "yPosition": "Y ašies padėtis", + "zeroOrHigher": "0 arba daugiau", + "betweenXandY": "Tarp {{min}} ir {{max}}" +} \ No newline at end of file diff --git a/public/locales/lt/manage/boards.json b/public/locales/lt/manage/boards.json new file mode 100644 index 00000000000..77ffca12f9b --- /dev/null +++ b/public/locales/lt/manage/boards.json @@ -0,0 +1,57 @@ +{ + "metaTitle": "Lentos", + "pageTitle": "Lentos", + "cards": { + "statistics": { + "apps": "Programėlės", + "widgets": "Valdikliai", + "categories": "Kategorijos" + }, + "buttons": { + "view": "Žiūrėti lentą" + }, + "menu": { + "setAsDefault": "Nustatyti kaip numatytąją lentą", + "delete": { + "label": "Ištrinti visam laikui", + "disabled": "Ištrynimas išjungtas, nes senesni \"Homarr\" komponentai neleidžia ištrinti numatytosios konfigūracijos. Ištrinti bus galima ateityje." + }, + "duplicate": "Sukurti kopiją", + "rename": { + "label": "Pervadinti", + "modal": { + "title": "Pervadinti lentą {{name}}", + "fields": { + "name": { + "label": "Naujas pavadinimas", + "placeholder": "Naujas lentos pavadinimas" + } + } + } + } + }, + "badges": { + "fileSystem": "Failų sistema", + "default": "Numatytas" + } + }, + "buttons": { + "create": "Kurti naują lentą" + }, + "modals": { + "delete": { + "title": "Ištrinti lentą", + "text": "Ar tikrai norite ištrinti šią lentą? Šio veiksmo negalima atšaukti ir jūsų duomenys bus prarasti visam laikui." + }, + "create": { + "title": "Sukurti lentą", + "text": "Sukūrus lentą, pavadinimo keisti negalima.", + "form": { + "name": { + "label": "Pavadinimas" + }, + "submit": "Sukurti" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/manage/index.json b/public/locales/lt/manage/index.json new file mode 100644 index 00000000000..e78de607e2c --- /dev/null +++ b/public/locales/lt/manage/index.json @@ -0,0 +1,23 @@ +{ + "metaTitle": "Valdyti", + "hero": { + "title": "Sveiki sugrįžę, {{username}}", + "fallbackUsername": "Anoniminis", + "subtitle": "Sveiki atvykę į jūsų programų centrą. Organizuokite, optimizuokite ir užkariaukite!" + }, + "quickActions": { + "title": "Spartūs veiksmai", + "boards": { + "title": "Jūsų lentos", + "subtitle": "Kurkite ir tvarkykite lentas" + }, + "inviteUsers": { + "title": "Pakviesti naują naudotoją", + "subtitle": "Sukurkite ir išsiųskite registracijos kvietimą" + }, + "manageUsers": { + "title": "Tvarkyti vartotojus", + "subtitle": "Ištrinkite ir tvarkykite vartotojus" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/manage/users.json b/public/locales/lt/manage/users.json new file mode 100644 index 00000000000..5243a0faca8 --- /dev/null +++ b/public/locales/lt/manage/users.json @@ -0,0 +1,44 @@ +{ + "metaTitle": "Vartotojai", + "pageTitle": "Tvarkyti vartotojus", + "buttons": { + "create": "Sukurti" + }, + "filter": { + "roles": { + "all": "Visi", + "normal": "Įprastas", + "admin": "Administratorius", + "owner": "Savininkas" + } + }, + "table": { + "header": { + "user": "Vartotojas", + "email": "El. paštas" + } + }, + "tooltips": { + "deleteUser": "Ištrinti vartotoją", + "demoteAdmin": "Pažeminti administratorių", + "promoteToAdmin": "Paaukštinti į administratorių" + }, + "modals": { + "delete": { + "title": "Ištrinti naudotoją {{name}}", + "text": "Ar tikrai norite ištrinti naudotoją {{name}}? Tai ištrins su šia paskyra susijusius duomenis, bet ne visus šio naudotojo sukurtas lentas." + }, + "change-role": { + "promote": { + "title": "Paaukštinti naudotoją {{name}} į administratorių", + "text": "Ar tikrai norite paaukštinti naudotoją {{name}} iki administratoriaus? Tai suteiks naudotojui prieigą prie visų jūsų \"Homarr\" lentų." + }, + "demote": { + "title": "Pažeminti naudotoją {{name}} iki vartotojo", + "text": "Ar tikrai norite pažeminti naudotoją {{name}} į naudotoją? Tai pašalins vartotojo prieigą prie visų jūsų Homarr lentų." + }, + "confirm": "" + } + }, + "searchDoesntMatch": "Jūsų paieška neatitinka jokių įrašų. Pakoreguokite filtrą." +} \ No newline at end of file diff --git a/public/locales/lt/manage/users/create.json b/public/locales/lt/manage/users/create.json new file mode 100644 index 00000000000..167696688aa --- /dev/null +++ b/public/locales/lt/manage/users/create.json @@ -0,0 +1,52 @@ +{ + "metaTitle": "Sukurti vartotoją", + "steps": { + "account": { + "title": "Pirmieji žingsniai", + "text": "Sukurti paskyrą", + "username": { + "label": "" + }, + "email": { + "label": "El. paštas" + } + }, + "security": { + "title": "Antras žingsnis", + "text": "Slaptažodis", + "password": { + "label": "Slaptažodis" + } + }, + "finish": { + "title": "Patvirtinimas", + "text": "Išsaugoti duomenų bazėje", + "card": { + "title": "Peržiūrėkite įvestus duomenis", + "text": "Pateikus duomenis į duomenų bazę, naudotojas galės prisijungti. Ar esate tikri, kad norite šį naudotoją išsaugoti duomenų bazėje ir aktyvuoti prisijungimą?" + }, + "table": { + "header": { + "property": "Savybė", + "value": "Reikšmė", + "username": "", + "email": "El. paštas", + "password": "Slaptažodis" + }, + "notSet": "Nenustatytas", + "valid": "Galiojantis" + }, + "failed": "Naudotojo sukūrimas nepavyko: {{error}}" + }, + "completed": { + "alert": { + "title": "Vartotojas buvo sukurtas", + "text": "Vartotojas buvo sukurtas duomenų bazėje. Dabar jis gali prisijungti." + } + } + }, + "buttons": { + "generateRandomPassword": "Sugeneruoti atsitiktinį", + "createAnother": "Sukurti kitą" + } +} \ No newline at end of file diff --git a/public/locales/lt/manage/users/edit.json b/public/locales/lt/manage/users/edit.json new file mode 100644 index 00000000000..83abc84eaf7 --- /dev/null +++ b/public/locales/lt/manage/users/edit.json @@ -0,0 +1,55 @@ +{ + "metaTitle": "Vartotojas {{username}}", + "back": "Grįžti į vartotojų valdymą", + "sections": { + "general": { + "title": "Bendras", + "inputs": { + "username": { + "label": "" + }, + "eMail": { + "label": "El. paštas" + } + } + }, + "security": { + "title": "Apsauga", + "inputs": { + "password": { + "label": "Naujas slaptažodis" + }, + "terminateExistingSessions": { + "label": "Nutraukti esamas sesijas", + "description": "Priverčia naudotoją dar kartą prisijungti prie savo įrenginių" + }, + "confirm": { + "label": "", + "description": "Slaptažodis bus atnaujintas. Veiksmų atšaukti negalima." + } + } + }, + "roles": { + "title": "Rolės", + "currentRole": "Dabartinė rolė: ", + "badges": { + "owner": "Savininkas", + "admin": "Administratorius", + "normal": "Įprastas" + } + }, + "deletion": { + "title": "Paskyros ištrynimas", + "inputs": { + "confirmUsername": { + "label": "Patvirtinkite vartotojo vardą", + "description": "Įveskite vartotojo vardą, kad patvirtintumėte ištrynimą" + }, + "confirm": { + "label": "Ištrinti visam laikui", + "description": "Žinau, kad šis veiksmas yra negrįžtamas ir visi paskyros duomenys bus prarasti." + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/manage/users/invites.json b/public/locales/lt/manage/users/invites.json new file mode 100644 index 00000000000..c1e2d6cf24b --- /dev/null +++ b/public/locales/lt/manage/users/invites.json @@ -0,0 +1,48 @@ +{ + "metaTitle": "Vartotojo kvietimai", + "pageTitle": "Tvarkyti naudotojų kvietimus", + "description": "Naudodami kvietimus galite pakviesti naudotojus į savo \"Homarr\" instanciją. Kvietimas galioja tik tam tikrą laiką ir gali būti panaudotas tik vieną kartą. Kvietimo galiojimo laikas turi būti nuo 5 minučių iki 12 mėnesių nuo jo sukūrimo.", + "button": { + "createInvite": "Sukurti kvietimą", + "deleteInvite": "Ištrinti kvietimą" + }, + "table": { + "header": { + "id": "ID", + "creator": "Kūrėjas", + "expires": "Baigs galioti po", + "action": "Veiksmai" + }, + "data": { + "expiresAt": "pasibaigė {{at}}", + "expiresIn": "po {{in}}" + } + }, + "modals": { + "create": { + "title": "Sukurti kvietimą", + "description": "Pasibaigus galiojimo laikui, kvietimas nebegalios ir kvietimo gavėjas negalės sukurti paskyros.", + "form": { + "expires": "Galiojimo pasibaigimo data", + "submit": "Sukurti" + } + }, + "copy": { + "title": "Nukopijuoti kvietimą", + "description": "Jūsų kvietimas sugeneruotas. Po to, kai šis modalinis langas užsidarys, nebegalėsite nukopijuoti šios nuorodos. Jei nebenorite pakviesti minėto asmens, bet kada galite ištrinti šį kvietimą.", + "invitationLink": "Kvietimo nuoroda", + "details": { + "id": "ID", + "token": "Žetonas" + }, + "button": { + "close": "Kopijuoti ir atmesti" + } + }, + "delete": { + "title": "Ištrinti kvietimą", + "description": "Ar tikrai norite ištrinti šį kvietimą? Naudotojai, turintys šią nuorodą, nebegalės sukurti paskyros naudodamiesi šia nuoroda." + } + }, + "noInvites": "Kvietimų dar nėra." +} \ No newline at end of file diff --git a/public/locales/lt/modules/bookmark.json b/public/locales/lt/modules/bookmark.json new file mode 100644 index 00000000000..3c91e49bfa2 --- /dev/null +++ b/public/locales/lt/modules/bookmark.json @@ -0,0 +1,43 @@ +{ + "descriptor": { + "name": "Skirtukas", + "description": "Rodo statinį eilučių arba nuorodų sąrašą", + "settings": { + "title": "Skirtukų nustatymai", + "name": { + "label": "Valdiklio pavadinimas", + "info": "Palikite tuščią, kad pavadinimas būtų paslėptas." + }, + "items": { + "label": "Elementai" + }, + "layout": { + "label": "", + "data": { + "autoGrid": "Automatinis tinklelis", + "horizontal": "Horizontalus", + "vertical": "Vertikalus" + } + } + } + }, + "card": { + "noneFound": { + "title": "Skirtukų sarašas tuščias", + "text": "Naujų elementų įtraukimas į šį sąrašą redagavimo režimu" + } + }, + "item": { + "validation": { + "length": "Ilgis turi būti nuo {{shortest}} iki {{longest}}", + "invalidLink": "Negaliojanti nuoroda", + "errorMsg": "Neišsaugota, nes buvo patvirtinimo klaidų. Prašome pakoreguoti savo įvestus duomenis" + }, + "name": "Pavadinimas", + "url": "URL", + "newTab": "Atidaryti naujame skirtuke", + "hideHostname": "Paslėpti kompiuterio pavadinimą", + "hideIcon": "Paslėpti piktogramą", + "delete": "" + } +} diff --git a/public/locales/lt/modules/calendar.json b/public/locales/lt/modules/calendar.json new file mode 100644 index 00000000000..ca836929eaa --- /dev/null +++ b/public/locales/lt/modules/calendar.json @@ -0,0 +1,33 @@ +{ + "descriptor": { + "name": "Kalendorius", + "description": "Rodo kalendorių su būsimais leidiniais iš palaikomų integracijų.", + "settings": { + "title": "Kalendoriaus valdiklio nustatymai", + "radarrReleaseType": { + "label": "\"Radarr\" išleidimo tipas", + "data": { + "inCinemas": "Kino teatruose", + "physicalRelease": "Fizinė", + "digitalRelease": "Skaitmeninė" + } + }, + "hideWeekDays": { + "label": "Paslėpti savaitės dienas" + }, + "showUnmonitored": { + "label": "Rodyti neprižiūrimus elementus" + }, + "fontSize": { + "label": "Šrifto dydis", + "data": { + "xs": "Labai mažas", + "sm": "Mažas", + "md": "Vidutinis", + "lg": "Didelis", + "xl": "Labai didelis" + } + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/common-media-cards.json b/public/locales/lt/modules/common-media-cards.json new file mode 100644 index 00000000000..992f2e47b43 --- /dev/null +++ b/public/locales/lt/modules/common-media-cards.json @@ -0,0 +1,6 @@ +{ + "buttons": { + "play": "Groti", + "request": "Užklausti" + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/common.json b/public/locales/lt/modules/common.json new file mode 100644 index 00000000000..b8f0ada0b8c --- /dev/null +++ b/public/locales/lt/modules/common.json @@ -0,0 +1,10 @@ +{ + "settings": { + "label": "Nustatymai" + }, + "errors": { + "unmappedOptions": { + "text": "" + } + } +} diff --git a/public/locales/lt/modules/dashdot.json b/public/locales/lt/modules/dashdot.json new file mode 100644 index 00000000000..053745b7b87 --- /dev/null +++ b/public/locales/lt/modules/dashdot.json @@ -0,0 +1,118 @@ +{ + "descriptor": { + "name": "Dash.", + "description": "Rodomi išorinio prietaiso Dash grafikai. Instance viduje Homarr.", + "settings": { + "title": "Dash nustatymai. valdiklis", + "dashName": { + "label": "Dash. Pavadinimas" + }, + "url": { + "label": "Dash. URL" + }, + "usePercentages": { + "label": "Rodyti procentus" + }, + "columns": { + "label": "Rodyti stulpelius" + }, + "graphHeight": { + "label": "Grafikų aukštis" + }, + "graphsOrder": { + "label": "Grafikai (Išdėstymas)", + "storage": { + "label": "Saugykla", + "enabled": { + "label": "Rodyti valdiklyje" + }, + "span": { + "label": "Stulpelio apimtis" + }, + "compactView": { + "label": "Rodyti kaip tekstą (glaustai)" + }, + "multiView": { + "label": "Rodyti kaip kelių diskų peržiūrą" + } + }, + "network": { + "label": "Tinklas", + "enabled": { + "label": "Rodyti valdiklyje" + }, + "span": { + "label": "Stulpelio apimtis" + }, + "compactView": { + "label": "Rodyti kaip tekstą (glaustai)" + } + }, + "cpu": { + "label": "Procesorius", + "enabled": { + "label": "Rodyti valdiklyje" + }, + "span": { + "label": "Stulpelio apimtis" + }, + "multiView": { + "label": "Rodyti kaip kelių branduolių rodinį" + } + }, + "ram": { + "label": "RAM", + "enabled": { + "label": "Rodyti valdiklyje" + }, + "span": { + "label": "Stulpelio apimtis" + } + }, + "gpu": { + "label": "Vaizdo plokštė", + "enabled": { + "label": "Rodyti valdiklyje" + }, + "span": { + "label": "Stulpelio apimtis" + } + } + } + } + }, + "card": { + "title": "Dash.", + "errors": { + "noService": "Nerasta \"Dash.\" paslauga. Pridėkite ją į \"Homarr\" prietaisų skydelį arba nustatykite \"Dash. URL adresą modulio parinktyse", + "noInformation": "Negalima gauti informacijos iš dash. - Ar naudojate naujausią versiją?", + "protocolDowngrade": { + "title": "Aptiktas protokolo sumažinimas", + "text": "Ryšys su jūsų Dash. pavyzdys naudoja HTTP. Tai yra saugumo rizika, nes HTTP yra nešifruotas ir užpuolikai gali piktnaudžiauti šiuo ryšiu. Įsitikinkite, kad Dash. naudoja HTTPS arba sumažinkite Homarr versiją į HTTP (nerekomenduojama)." + } + }, + "graphs": { + "storage": { + "title": "Saugykla", + "label": "Saugykla:" + }, + "network": { + "title": "Tinklas", + "label": "Tinklas:", + "metrics": { + "download": "Žemyn", + "upload": "Aukštyn" + } + }, + "cpu": { + "title": "Procesorius" + }, + "ram": { + "title": "RAM" + }, + "gpu": { + "title": "Vaizdo plokštė" + } + } + } +} diff --git a/public/locales/lt/modules/date.json b/public/locales/lt/modules/date.json new file mode 100644 index 00000000000..0ecb455be7a --- /dev/null +++ b/public/locales/lt/modules/date.json @@ -0,0 +1,34 @@ +{ + "descriptor": { + "name": "Data ir Laikas", + "description": "Rodo dabartinę datą ir laiką.", + "settings": { + "title": "Datos ir laiko valdiklio nustatymai", + "timezone": { + "label": "Laiko juosta", + "info": "Pasirinkite savo laiko juostos pavadinimą, savo rasite čia: " + }, + "customTitle": { + "label": "Miesto pavadinimas arba pasirinktinis pavadinimas" + }, + "display24HourFormat": { + "label": "Rodyti visą laiką (24 val.)" + }, + "dateFormat": { + "label": "Datos formatavimas", + "data": { + "hide": "Paslėpti datą" + } + }, + "titleState": { + "label": "Laikrodžio pavadinimas", + "info": "Pasirinktinis pavadinimas ir laiko juostos kodas gali būti rodomi valdiklyje.
Taip pat galite rodyti tik miestą, nerodyti nė vieno,
arba net rodyti tik laiko juostą, kai pasirenkami abu pavadinimai, bet nepateikiamas pavadinimas.", + "data": { + "both": "Pavadinimas ir laiko juosta", + "city": "Tik pavadinimas", + "none": "Nėra" + } + } + } + } +} diff --git a/public/locales/lt/modules/dlspeed.json b/public/locales/lt/modules/dlspeed.json new file mode 100644 index 00000000000..4882869c1bf --- /dev/null +++ b/public/locales/lt/modules/dlspeed.json @@ -0,0 +1,35 @@ +{ + "descriptor": { + "name": "Atsisiuntimo greitis", + "description": "Rodo palaikomų integracijų atsisiuntimo ir išsiuntimo greitį." + }, + "card": { + "table": { + "header": { + "name": "Pavadinimas", + "size": "", + "download": "Žemyn", + "upload": "Aukštyn", + "estimatedTimeOfArrival": "", + "progress": "" + }, + "body": { + "nothingFound": "Torrentų nerasta" + } + }, + "lineChart": { + "title": "Dabartinis atsisiuntimo greitis", + "download": "Atsiuntimas: {{download}}", + "upload": "Įkelimas: {{upload}}", + "timeSpan": "Prieš {{seconds}} sekundžių", + "totalDownload": "Atsiuntimas: {{download}}/s", + "totalUpload": "Įkelimas: {{upload}}/s" + }, + "errors": { + "noDownloadClients": { + "title": "", + "text": "Pridėti atsisiuntimo paslaugą, kad galėtumėte peržiūrėti dabartinius atsisiuntimus" + } + } + } +} diff --git a/public/locales/lt/modules/dns-hole-controls.json b/public/locales/lt/modules/dns-hole-controls.json new file mode 100644 index 00000000000..e92cb9160e3 --- /dev/null +++ b/public/locales/lt/modules/dns-hole-controls.json @@ -0,0 +1,18 @@ +{ + "descriptor": { + "name": "DNS hole valdymas", + "description": "Valdykite PiHole arba AdGuard iš savo prietaisų skydelio", + "settings": { + "title": "DNS hole valdymo nustatymai", + "showToggleAllButtons": { + "label": "Rodyti mygtukus „Įjungti / išjungti “" + } + }, + "errors": { + "general": { + "title": "Nepavyko rasti DNS hole", + "text": "Kilo problema jungiantis prie jūsų DNS hole. Patikrinkite savo konfigūraciją / integraciją (-as)." + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/dns-hole-summary.json b/public/locales/lt/modules/dns-hole-summary.json new file mode 100644 index 00000000000..7d20a357cf4 --- /dev/null +++ b/public/locales/lt/modules/dns-hole-summary.json @@ -0,0 +1,28 @@ +{ + "descriptor": { + "name": "DNS hole santrauka", + "description": "Rodomi svarbūs PiHole arba AdGuard duomenis", + "settings": { + "title": "DNS hole santraukos nustatymai", + "usePiHoleColors": { + "label": "Naudokite spalvas iš PiHole" + }, + "layout": { + "label": "", + "data": { + "grid": "2 po 2", + "row": "Horizontalus", + "column": "Vertikalus" + } + } + } + }, + "card": { + "metrics": { + "domainsOnAdlist": "Domenai adlistų sąrašuose", + "queriesToday": "Užklausos šiandien", + "queriesBlockedTodayPercentage": "Šiandien užblokuota", + "queriesBlockedToday": "Šiandien užblokuota" + } + } +} diff --git a/public/locales/lt/modules/docker.json b/public/locales/lt/modules/docker.json new file mode 100644 index 00000000000..96b040bc32a --- /dev/null +++ b/public/locales/lt/modules/docker.json @@ -0,0 +1,83 @@ +{ + "descriptor": { + "name": "Docker", + "description": "Leidžia lengvai matyti ir valdyti visus Docker konteinerius." + }, + "search": { + "placeholder": "Ieškokite pagal konteinerio arba nuotraukos pavadinimą" + }, + "table": { + "header": { + "name": "Pavadinimas", + "image": "Nuotrauka", + "ports": "Prievadai", + "state": "Būsena" + }, + "body": { + "portCollapse": "{{ports}} daugiau" + }, + "states": { + "running": "Veikia", + "created": "Sukurta", + "stopped": "Sustabdyta", + "unknown": "Nežinoma" + } + }, + "actionBar": { + "addService": { + "title": "Įtraukti programėlę", + "message": "Pridėti programą prie Homarr" + }, + "restart": { + "title": "Paleisti iš naujo" + }, + "stop": { + "title": "Sustabdyti" + }, + "start": { + "title": "Paleisti" + }, + "refreshData": { + "title": "Atnaujinti duomenis" + }, + "remove": { + "title": "Pašalinti" + }, + "addToHomarr": { + "title": "Pridėti prie Homarr" + } + }, + "actions": { + "start": { + "start": "Paleidžiama", + "end": "Paleista" + }, + "stop": { + "start": "Stabdoma", + "end": "Sustabdyta" + }, + "restart": { + "start": "Paleidžiama iš naujo", + "end": "Paleista iš naujo" + }, + "remove": { + "start": "Trinamas", + "end": "Pašalinta" + } + }, + "errors": { + "integrationFailed": { + "title": "Docker integravimas nepavyko", + "message": "Ar pamiršote prijungti docker lizdą?" + }, + "unknownError": { + "title": "Įvyko klaida" + }, + "oneServiceAtATime": { + "title": "Vienu metu pridėkite tik vieną programą ar paslaugą!" + } + }, + "actionIcon": { + "tooltip": "Docker" + } +} diff --git a/public/locales/lt/modules/health-monitoring.json b/public/locales/lt/modules/health-monitoring.json new file mode 100644 index 00000000000..083c6f96b54 --- /dev/null +++ b/public/locales/lt/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Sistemos būklės stebėjimas", + "description": "Informacija apie jūsų NAS", + "settings": { + "title": "Sistemos būklės stebėjimas", + "fahrenheit": { + "label": "Farenheitas" + } + } + }, + "cpu": { + "label": "Procesorius", + "load": "Apkrovos vidurkis", + "minute": "{{minute}} minutė" + }, + "memory": { + "label": "Atmintis", + "totalMem": "Bendra atmintis: {{total}}GB", + "available": "Galimi: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Failų sistema", + "available": "Galimi: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Veikimo laikas", + "updates": "Atnaujinimai", + "reboot": "Paleisti iš naujo" + }, + "errors": { + "general": { + "title": "Nepavyko rasti jūsų NAS", + "text": "Prisijungiant prie NAS kilo problema. Patikrinkite savo konfigūraciją / integraciją (-as)." + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/iframe.json b/public/locales/lt/modules/iframe.json new file mode 100644 index 00000000000..5310fe9eabb --- /dev/null +++ b/public/locales/lt/modules/iframe.json @@ -0,0 +1,45 @@ +{ + "descriptor": { + "name": "iFrame", + "description": "Įterpkite bet kokį turinį iš interneto. Kai kuriose svetainėse prieiga gali būti ribojama.", + "settings": { + "title": "iFrame nustatymai", + "embedUrl": { + "label": "Įterpimo URL" + }, + "allowFullScreen": { + "label": "Leisti per visą ekraną" + }, + "allowTransparency": { + "label": "Suteikti skaidrumo" + }, + "allowScrolling": { + "label": "Leisti slinkti" + }, + "allowPayment": { + "label": "Leisti mokėti" + }, + "allowAutoPlay": { + "label": "Leisti automatinį paleidimą" + }, + "allowMicrophone": { + "label": "Įgalinti mikrofoną" + }, + "allowCamera": { + "label": "Leisti kamerą" + }, + "allowGeolocation": { + "label": "Leisti nustatyti geografinę buvimo vietą" + } + } + }, + "card": { + "errors": { + "noUrl": { + "title": "Klaidingas URL", + "text": "Įsitikinkite, kad valdiklio konfigūracijoje įvedėte galiojantį adresą." + }, + "browserSupport": "Jūsų naršyklė nepalaiko iframe. Atnaujinkite savo naršyklę." + } + } +} diff --git a/public/locales/lt/modules/indexer-manager.json b/public/locales/lt/modules/indexer-manager.json new file mode 100644 index 00000000000..a210e0566af --- /dev/null +++ b/public/locales/lt/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Indeksavimo tvarkytuvo būsena", + "description": "Būsena apie jūsų indeksavimo įrenginius", + "settings": { + "title": "Indeksavimo tvarkytuvo būsena" + } + }, + "indexersStatus": { + "title": "Indeksavimo tvarkyklė", + "testAllButton": "Išbandyk viską" + }, + "errors": { + "general": { + "title": "Nepavyksta rasti indeksuotojo tvarkytuvo", + "text": "Prisijungiant prie indeksavimo tvarkyklės kilo problema. Patikrinkite savo konfigūraciją / integraciją (-as)." + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/media-requests-list.json b/public/locales/lt/modules/media-requests-list.json new file mode 100644 index 00000000000..31771feeeef --- /dev/null +++ b/public/locales/lt/modules/media-requests-list.json @@ -0,0 +1,35 @@ +{ + "descriptor": { + "name": "Medijų užklausos", + "description": "Peržiūrėkite visų medijų užklausų iš \"Overseerr\" arba \"Jellyseerr\" sąrašą", + "settings": { + "title": "Medijų užklausų sąrašas", + "replaceLinksWithExternalHost": { + "label": "Pakeiskite nuorodas išoriniu pagrindiniu kompiuteriu" + }, + "openInNewTab": { + "label": "Atidaryti naujame skirtuke" + } + } + }, + "noRequests": "Užklausų nerasta. Įsitikinkite, kad teisingai sukonfigūravote savo programas.", + "state": { + "approved": "Patvirtinta", + "pendingApproval": "Laukia patvirtinimo", + "declined": "Atmesta", + "available": "Galima", + "partial": "Dalis" + }, + "tooltips": { + "approve": "Patvirtinti visas užklausas", + "decline": "Atmesti visas užklausas", + "approving": "Patvirtinama užklausa..." + }, + "mutation": { + "approving": "Patvirtinama", + "declining": "Atmetama", + "request": "užklausa...", + "approved": "Užklausa buvo patvirtinta!", + "declined": "Užklausa buvo atmesta!" + } +} diff --git a/public/locales/lt/modules/media-requests-stats.json b/public/locales/lt/modules/media-requests-stats.json new file mode 100644 index 00000000000..e663747729a --- /dev/null +++ b/public/locales/lt/modules/media-requests-stats.json @@ -0,0 +1,27 @@ +{ + "descriptor": { + "name": "Medijų užklausų statistikos", + "description": "Statistikos apie jūsų medijų užklausas", + "settings": { + "title": "Medijų užklausų statistikos", + "replaceLinksWithExternalHost": { + "label": "Pakeiskite nuorodas išoriniu pagrindiniu kompiuteriu" + }, + "openInNewTab": { + "label": "Atidaryti naujame skirtuke" + } + } + }, + "mediaStats": { + "title": "Medijų statistikos", + "pending": "Laukia patvirtinimo", + "tvRequests": "TV užklausos", + "movieRequests": "Filmų užklausos", + "approved": "Jau patvirtinta", + "totalRequests": "Iš viso" + }, + "userStats": { + "title": "Top vartotojai", + "requests": "Užklausos: {{number}}" + } +} diff --git a/public/locales/lt/modules/media-server.json b/public/locales/lt/modules/media-server.json new file mode 100644 index 00000000000..f0a199d7ded --- /dev/null +++ b/public/locales/lt/modules/media-server.json @@ -0,0 +1,25 @@ +{ + "descriptor": { + "name": "Medijų serveris", + "description": "Bendraukite su savo Jellyfin arba Plex medijos serveriu", + "settings": { + "title": "Medijos serverio valdiklio nustatymai" + } + }, + "loading": "Įkeliami srautai", + "card": { + "table": { + "header": { + "session": "Sesija", + "user": "Vartotojas", + "currentlyPlaying": "Dabar grojama" + } + }, + "errors": { + "general": { + "title": "Nepavyko įkelti turinio", + "text": "Nepavyksta gauti informacijos iš serverio. Išsamesnės informacijos ieškokite logs" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/notebook.json b/public/locales/lt/modules/notebook.json new file mode 100644 index 00000000000..813bac99dd1 --- /dev/null +++ b/public/locales/lt/modules/notebook.json @@ -0,0 +1,59 @@ +{ + "descriptor": { + "name": "Užrašai", + "description": "Pažymėjimu pagrįstas interaktyvus valdiklis, skirtas užrašams užsirašyti!", + "settings": { + "title": "Užrašų knygelės valdiklio nustatymai", + "showToolbar": { + "label": "Rodyti įrankių juostą, padedančią rašyti žymėjimą" + }, + "allowReadOnlyCheck": { + "label": "Leidimas tikrinti tik skaitymo režimu" + }, + "content": { + "label": "Užrašų knygelės turinys" + } + } + }, + "card": { + "controls": { + "bold": "Paryškintas", + "italic": "Pasviręs", + "strikethrough": "Perbrauktas", + "underline": "Pabrauktas", + "colorText": "Spalvotas tekstas", + "colorHighlight": "Spalvotas paryškintas tekstas", + "code": "Kodas", + "clear": "Išvalyti formatavimą", + "heading": "Antraštė {{level}}", + "align": "Teksto lygiavimas: {{position}}", + "blockquote": "Kabutės", + "horizontalLine": "Horizontali linija", + "bulletList": "Suženklintasis sąrašas", + "orderedList": "Surikiuotas sąrašas", + "checkList": "Sąrašas", + "increaseIndent": "Padidinti įtrauką", + "decreaseIndent": "Sumažinti įtrauką", + "link": "Nuoroda", + "unlink": "Pašalinti nuorodą", + "image": "Įterpti paveikslėlį", + "addTable": "Pridėti lentelę", + "deleteTable": "Ištrinti lentelę", + "colorCell": "Spalva", + "mergeCell": "Perjungti cell sujungimą", + "addColumnLeft": "Pridėti stulpelį prieš", + "addColumnRight": "Pridėti stulpelį po", + "deleteColumn": "Naikinti stulpelį", + "addRowTop": "Pridėti eilutę prieš", + "addRowBelow": "Pridėti eilutę po", + "deleteRow": "Naikinti eilutę" + }, + "modals": { + "clearColor": "Pašalinti spalvą", + "source": "Šaltinis", + "widthPlaceholder": "Vertė % arba pikseliais", + "columns": "Stulpeliai", + "rows": "Eilutės" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/overseerr.json b/public/locales/lt/modules/overseerr.json new file mode 100644 index 00000000000..cb4e98bef77 --- /dev/null +++ b/public/locales/lt/modules/overseerr.json @@ -0,0 +1,30 @@ +{ + "descriptor": { + "name": "Overseerr", + "description": "Leidžia ieškoti ir pridėti medijos iš Overseerr arba Jellyseerr." + }, + "popup": { + "item": { + "buttons": { + "askFor": "Prašyti {{title}}", + "cancel": "Atšaukti", + "request": "Užklausti" + }, + "alerts": { + "automaticApproval": { + "title": "API rakto naudojimas", + "text": "Šis prašymas bus automatiškai patvirtintas" + } + } + }, + "seasonSelector": { + "caption": "Pažymėkite sezonus, kuriuos norite atsisiųsti", + "table": { + "header": { + "season": "Sezonas", + "numberOfEpisodes": "Epizodų skaičius" + } + } + } + } +} diff --git a/public/locales/lt/modules/ping.json b/public/locales/lt/modules/ping.json new file mode 100644 index 00000000000..6d10977324d --- /dev/null +++ b/public/locales/lt/modules/ping.json @@ -0,0 +1,11 @@ +{ + "descriptor": { + "name": "Ping", + "description": "Rodo būsenos indikatorių, priklausomai nuo konkretaus URL adreso HTTP atsakymo kodo." + }, + "states": { + "online": "Įjungtas {{response}}", + "offline": "Išjungtas {{response}}", + "loading": "Kraunama..." + } +} diff --git a/public/locales/lt/modules/rss.json b/public/locales/lt/modules/rss.json new file mode 100644 index 00000000000..126a4a2136a --- /dev/null +++ b/public/locales/lt/modules/rss.json @@ -0,0 +1,40 @@ +{ + "descriptor": { + "name": "RSS valdiklis", + "description": "RSS valdiklis leidžia rodyti RSS informacijos santraukas prietaisų skydelyje.", + "settings": { + "title": "RSS valdiklio nustatymai", + "rssFeedUrl": { + "label": "RSS kanalų URL adresai", + "description": "RSS kanalų, kuriuos norite rodyti, URL adresai." + }, + "refreshInterval": { + "label": "Atnaujinimo intervalas (minutėmis)" + }, + "dangerousAllowSanitizedItemContent": { + "label": "Leisti HTML formatavimą (Pavojinga)", + "info": "Leidimas formatuoti HTML iš išorės gali būti pavojingas.
Įsitikinkite, kad kanalas yra iš patikimo šaltinio." + }, + "textLinesClamp": { + "label": "Teksto linijų spaustukas" + }, + "sortByPublishDateAscending": { + "label": "Rūšiuoti pagal paskelbimo datą (didėjančia tvarka)" + }, + "sortPostsWithoutPublishDateToTheTop": { + "label": "Įdėkite pranešimus be paskelbimo datos į viršų" + }, + "maximumAmountOfPosts": { + "label": "Didžiausias pranešimų skaičius" + } + }, + "card": { + "errors": { + "general": { + "title": "Nepavyksta gauti RSS kanalo", + "text": "Kilo problema, susijusi su RSS kanalo pasiekiamumu. Įsitikinkite, kad teisingai sukonfigūravote RSS kanalą naudodami galiojantį URL. URL turėtų atitikti oficialią specifikaciją. Atnaujinus kanalą gali tekti atnaujinti prietaisų skydelį." + } + } + } + } +} diff --git a/public/locales/lt/modules/search.json b/public/locales/lt/modules/search.json new file mode 100644 index 00000000000..ea9c6c34821 --- /dev/null +++ b/public/locales/lt/modules/search.json @@ -0,0 +1,30 @@ +{ + "descriptor": { + "name": "Paieškos laukelis", + "description": "Paieškos juosta, kurioje galite ieškoti pasirinktoje paieškos sistemoje, YouTube ir palaikomose integracijose." + }, + "input": { + "placeholder": "Paieška internete..." + }, + "switched-to": "Perjungta į", + "searchEngines": { + "search": { + "name": "Tinklas", + "description": "Ieškoti..." + }, + "youtube": { + "name": "YouTube", + "description": "Ieškokite Youtube" + }, + "torrents": { + "name": "Torrentai", + "description": "Ieškoti torentų" + }, + "overseerr": { + "name": "Overseerr", + "description": "Ieškokite filmų ir TV laidų Overseerr" + } + }, + "tip": "Paieškos juostą galite pasirinkti naudodami sparčiąją nuorodą ", + "switchedSearchEngine": "Pereita prie paieškos su {{searchEngine}}" +} diff --git a/public/locales/lt/modules/smart-home/entity-state.json b/public/locales/lt/modules/smart-home/entity-state.json new file mode 100644 index 00000000000..9222d74438d --- /dev/null +++ b/public/locales/lt/modules/smart-home/entity-state.json @@ -0,0 +1,29 @@ +{ + "entityNotFound": "Subjektas nerastas", + "descriptor": { + "name": "Home Assistant subjektas", + "description": "Dabartinė \"Home Assistant\" subjekto būsena", + "settings": { + "title": "Subjekto būsena", + "entityId": { + "label": "Subjekto ID", + "info": "Unikalus subjekto ID programoje \"Home Assistant\". Kopijuokite spustelėdami ant subjekto > Spustelėkite piktogramą \"cog\" > Spustelėkite mygtuką \"Kopijuoti\" ties \"Subjekto ID\". Kai kurie pasirinktiniai subjektai gali būti nepalaikomi." + }, + "appendUnit": { + "label": "Pridėti matavimo vienetą", + "info": "Prie esybės būsenos pridėti matavimo vieneto atributą." + }, + "automationId": { + "label": "Neprivalomas automatizavimo ID", + "info": "Jūsų unikalus automatizavimo ID. Visada prasideda automation.XXXXX. Jei nenustatytas, valdiklis nebus paspaudžiamas ir bus rodoma tik būsena. Paspaudus, bus atnaujinta esybės būsena." + }, + "displayName": { + "label": "Rodomas vardas" + }, + "displayFriendlyName": { + "label": "Rodyti draugišką pavadinimą", + "info": "Rodyti draugišką vardą iš \"Home Assistant\", o ne rodomą vardą" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/smart-home/trigger-automation.json b/public/locales/lt/modules/smart-home/trigger-automation.json new file mode 100644 index 00000000000..437d853e307 --- /dev/null +++ b/public/locales/lt/modules/smart-home/trigger-automation.json @@ -0,0 +1,16 @@ +{ + "descriptor": { + "name": "\"Home Assistant\" automatizavimas", + "description": "Vykdyti automatizavimą", + "settings": { + "title": "Vykdyti automatizavimą", + "automationId": { + "label": "Automatizavimo ID", + "info": "Jūsų unikalus automatizavimo ID. Visada prasideda automation.XXXXX." + }, + "displayName": { + "label": "Rodomas vardas" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/torrents-status.json b/public/locales/lt/modules/torrents-status.json new file mode 100644 index 00000000000..2e259d5fd87 --- /dev/null +++ b/public/locales/lt/modules/torrents-status.json @@ -0,0 +1,103 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "refreshInterval": { + "label": "" + }, + "displayCompletedTorrents": { + "label": "" + }, + "displayActiveTorrents": { + "label": "" + }, + "speedLimitOfActiveTorrents": { + "label": "" + }, + "displayStaleTorrents": { + "label": "" + }, + "labelFilterIsWhitelist": { + "label": "" + }, + "labelFilter": { + "label": "", + "description": "" + }, + "displayRatioWithFilter": { + "label": "", + "info": "" + } + } + }, + "card": { + "footer": { + "error": "", + "lastUpdated": "", + "ratioGlobal": "", + "ratioWithFilter": "" + }, + "table": { + "header": { + "isCompleted": "", + "name": "Pavadinimas", + "dateAdded": "", + "size": "", + "download": "Žemyn", + "upload": "Aukštyn", + "estimatedTimeOfArrival": "", + "progress": "", + "totalUploaded": "", + "totalDownloaded": "", + "ratio": "", + "seeds": "", + "peers": "", + "label": "", + "state": "Būsena", + "stateMessage": "" + }, + "item": { + "text": "" + }, + "body": { + "nothingFound": "Torrentų nerasta", + "filterHidingItems": "" + } + }, + "lineChart": { + "title": "Dabartinis atsisiuntimo greitis", + "download": "Atsiuntimas: {{download}}", + "upload": "Įkelimas: {{upload}}", + "timeSpan": "Prieš {{seconds}} sekundžių", + "totalDownload": "Atsiuntimas: {{download}}/s", + "totalUpload": "Įkelimas: {{upload}}/s" + }, + "errors": { + "noDownloadClients": { + "title": "", + "text": "" + }, + "generic": { + "title": "", + "text": "" + } + }, + "loading": { + "title": "", + "description": "" + }, + "popover": { + "introductionPrefix": "", + "metrics": { + "queuePosition": "", + "progress": "", + "totalSelectedSize": "", + "state": "", + "ratio": "", + "completed": "" + } + } + } +} diff --git a/public/locales/lt/modules/usenet.json b/public/locales/lt/modules/usenet.json new file mode 100644 index 00000000000..f6c3f42dd42 --- /dev/null +++ b/public/locales/lt/modules/usenet.json @@ -0,0 +1,49 @@ +{ + "descriptor": { + "name": "", + "description": "" + }, + "card": { + "errors": { + "noDownloadClients": { + "title": "", + "text": "" + } + } + }, + "tabs": { + "queue": "", + "history": "" + }, + "info": { + "sizeLeft": "", + "paused": "" + }, + "queue": { + "header": { + "name": "Pavadinimas", + "size": "", + "eta": "", + "progress": "" + }, + "empty": "", + "error": { + "title": "", + "message": "" + }, + "paused": "" + }, + "history": { + "header": { + "name": "Pavadinimas", + "size": "", + "duration": "" + }, + "empty": "", + "error": { + "title": "", + "message": "" + }, + "paused": "" + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/video-stream.json b/public/locales/lt/modules/video-stream.json new file mode 100644 index 00000000000..539daa1c44f --- /dev/null +++ b/public/locales/lt/modules/video-stream.json @@ -0,0 +1,24 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "FeedUrl": { + "label": "" + }, + "autoPlay": { + "label": "" + }, + "muted": { + "label": "" + }, + "controls": { + "label": "" + } + } + }, + "errors": { + "invalidStream": "" + } +} \ No newline at end of file diff --git a/public/locales/lt/modules/weather.json b/public/locales/lt/modules/weather.json new file mode 100644 index 00000000000..47970743d38 --- /dev/null +++ b/public/locales/lt/modules/weather.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "displayInFahrenheit": { + "label": "" + }, + "displayCityName": { + "label": "" + }, + "location": { + "label": "" + } + } + }, + "card": { + "weatherDescriptions": { + "clear": "", + "mainlyClear": "", + "fog": "", + "drizzle": "", + "freezingDrizzle": "", + "rain": "", + "freezingRain": "", + "snowFall": "", + "snowGrains": "", + "rainShowers": "", + "snowShowers": "", + "thunderstorm": "", + "thunderstormWithHail": "", + "unknown": "Nežinoma" + } + }, + "error": "" +} diff --git a/public/locales/lt/password-requirements.json b/public/locales/lt/password-requirements.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/lt/password-requirements.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/lt/settings/common.json b/public/locales/lt/settings/common.json new file mode 100644 index 00000000000..83129f237a1 --- /dev/null +++ b/public/locales/lt/settings/common.json @@ -0,0 +1,38 @@ +{ + "title": "Nustatymai", + "tooltip": "Nustatymai", + "tabs": { + "common": "", + "customizations": "" + }, + "tips": { + "configTip": "" + }, + "credits": { + "madeWithLove": "", + "thirdPartyContent": "", + "thirdPartyContentTable": { + "dependencyName": "", + "dependencyVersion": "" + } + }, + "grow": "", + "layout": { + "preview": { + "title": "", + "subtitle": "" + }, + "divider": "", + "main": "", + "sidebar": "", + "cannotturnoff": "", + "dashboardlayout": "", + "enablersidebar": "", + "enablelsidebar": "", + "enablesearchbar": "", + "enabledocker": "", + "enableping": "", + "enablelsidebardesc": "", + "enablersidebardesc": "" + } +} diff --git a/public/locales/lt/settings/customization/access.json b/public/locales/lt/settings/customization/access.json new file mode 100644 index 00000000000..cc4d17f613f --- /dev/null +++ b/public/locales/lt/settings/customization/access.json @@ -0,0 +1,6 @@ +{ + "allowGuests": { + "label": "", + "description": "" + } +} \ No newline at end of file diff --git a/public/locales/lt/settings/customization/general.json b/public/locales/lt/settings/customization/general.json new file mode 100644 index 00000000000..1be4b818fe5 --- /dev/null +++ b/public/locales/lt/settings/customization/general.json @@ -0,0 +1,29 @@ +{ + "text": "", + "accordeon": { + "layout": { + "name": "", + "description": "" + }, + "gridstack": { + "name": "", + "description": "" + }, + "pageMetadata": { + "name": "", + "description": "" + }, + "appereance": { + "name": "Išvaizda", + "description": "" + }, + "accessibility": { + "name": "", + "description": "" + }, + "access": { + "name": "", + "description": "" + } + } +} diff --git a/public/locales/lt/settings/customization/gridstack.json b/public/locales/lt/settings/customization/gridstack.json new file mode 100644 index 00000000000..18c3d82339f --- /dev/null +++ b/public/locales/lt/settings/customization/gridstack.json @@ -0,0 +1,10 @@ +{ + "columnsCount": { + "labelPreset": "", + "descriptionPreset": "", + "descriptionExceedsPreset": "" + }, + "unsavedChanges": "", + "applyChanges": "", + "defaultValues": "" +} \ No newline at end of file diff --git a/public/locales/lt/settings/customization/opacity-selector.json b/public/locales/lt/settings/customization/opacity-selector.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/lt/settings/customization/opacity-selector.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/lt/settings/customization/page-appearance.json b/public/locales/lt/settings/customization/page-appearance.json new file mode 100644 index 00000000000..2c806f677eb --- /dev/null +++ b/public/locales/lt/settings/customization/page-appearance.json @@ -0,0 +1,50 @@ +{ + "pageTitle": { + "label": "", + "description": "" + }, + "metaTitle": { + "label": "", + "description": "" + }, + "logo": { + "label": "", + "description": "" + }, + "favicon": { + "label": "", + "description": "" + }, + "background": { + "label": "" + }, + "backgroundImageAttachment": { + "label": "", + "options": { + "fixed": "", + "scroll": "" + } + }, + "backgroundImageSize": { + "label": "", + "options": { + "cover": "", + "contain": "" + } + }, + "backgroundImageRepeat": { + "label": "", + "options": { + "repeat": "", + "no-repeat": "", + "repeat-x": "", + "repeat-y": "" + } + }, + "customCSS": { + "label": "", + "description": "", + "placeholder": "", + "applying": "" + } +} diff --git a/public/locales/lt/settings/customization/shade-selector.json b/public/locales/lt/settings/customization/shade-selector.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/public/locales/lt/settings/customization/shade-selector.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/public/locales/lt/tools/docker.json b/public/locales/lt/tools/docker.json new file mode 100644 index 00000000000..c224c68ece9 --- /dev/null +++ b/public/locales/lt/tools/docker.json @@ -0,0 +1,32 @@ +{ + "title": "Docker", + "alerts": { + "notConfigured": { + "text": "" + } + }, + "modals": { + "selectBoard": { + "title": "", + "text": "", + "form": { + "board": { + "label": "" + }, + "submit": "" + } + } + }, + "notifications": { + "selectBoard": { + "success": { + "title": "", + "message": "" + }, + "error": { + "title": "", + "message": "" + } + } + } +} \ No newline at end of file diff --git a/public/locales/lt/user/preferences.json b/public/locales/lt/user/preferences.json new file mode 100644 index 00000000000..6c0e93d28fe --- /dev/null +++ b/public/locales/lt/user/preferences.json @@ -0,0 +1,48 @@ +{ + "metaTitle": "", + "pageTitle": "", + "boards": { + "defaultBoard": { + "label": "" + } + }, + "accessibility": { + "title": "", + "disablePulse": { + "label": "", + "description": "" + }, + "replaceIconsWithDots": { + "label": "", + "description": "" + } + }, + "localization": { + "language": { + "label": "" + }, + "firstDayOfWeek": { + "label": "", + "options": { + "monday": "", + "saturday": "", + "sunday": "" + } + } + }, + "searchEngine": { + "title": "", + "custom": "", + "newTab": { + "label": "" + }, + "autoFocus": { + "label": "", + "description": "" + }, + "template": { + "label": "", + "description": "" + } + } +} \ No newline at end of file diff --git a/public/locales/lt/widgets/draggable-list.json b/public/locales/lt/widgets/draggable-list.json new file mode 100644 index 00000000000..5d27e99adf6 --- /dev/null +++ b/public/locales/lt/widgets/draggable-list.json @@ -0,0 +1,7 @@ +{ + "noEntries": { + "title": "", + "text": "" + }, + "buttonAdd": "" +} diff --git a/public/locales/lt/widgets/error-boundary.json b/public/locales/lt/widgets/error-boundary.json new file mode 100644 index 00000000000..ce74ad0fc2c --- /dev/null +++ b/public/locales/lt/widgets/error-boundary.json @@ -0,0 +1,14 @@ +{ + "card": { + "title": "", + "buttons": { + "details": "", + "tryAgain": "" + } + }, + "modal": { + "text": "", + "label": "", + "reportButton": "" + } +} diff --git a/public/locales/lt/zod.json b/public/locales/lt/zod.json new file mode 100644 index 00000000000..c3b30750fae --- /dev/null +++ b/public/locales/lt/zod.json @@ -0,0 +1,22 @@ +{ + "errors": { + "default": "", + "required": "Šis laukelis yra privalomas", + "string": { + "startsWith": "", + "endsWith": "", + "includes": "" + }, + "tooSmall": { + "string": "", + "number": "" + }, + "tooBig": { + "string": "", + "number": "" + }, + "custom": { + "passwordMatch": "" + } + } +} \ No newline at end of file diff --git a/public/locales/lv/modules/health-monitoring.json b/public/locales/lv/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/lv/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/lv/modules/indexer-manager.json b/public/locales/lv/modules/indexer-manager.json new file mode 100644 index 00000000000..901ea35a5e0 --- /dev/null +++ b/public/locales/lv/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Indeksētāja pārvaldnieka statuss", + "description": "Statuss par jūsu indeksētājiem", + "settings": { + "title": "Indeksētāja pārvaldnieka statuss" + } + }, + "indexersStatus": { + "title": "Indexer pārvaldnieks", + "testAllButton": "Pārbaudīt visu" + }, + "errors": { + "general": { + "title": "Nevar atrast indeksētāja pārvaldnieku", + "text": "Savienojoties ar indeksētāja pārvaldnieku radās problēma. Lūdzu, pārbaudiet savu konfigurāciju/integrāciju(-as)." + } + } +} \ No newline at end of file diff --git a/public/locales/lv/modules/smart-home/entity-state.json b/public/locales/lv/modules/smart-home/entity-state.json index f3e41152f44..e2da207b3f9 100644 --- a/public/locales/lv/modules/smart-home/entity-state.json +++ b/public/locales/lv/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Vienības ID", "info": "Unikāls vienības ID pakalpojumā Home Assistant. Ievietojiet starpliktuvē, noklikšķinot uz vienību > Noklikšķiniet uz zobrata ikonu > Noklikšķiniet uz kopēšanas pogu pie \"Vienības ID\". Dažas pielāgotas vienības var nebūt atbalstītas." }, + "appendUnit": { + "label": "Pievienot mērvienību", + "info": "Pievieno mērvienības atribūtu vienības stāvoklim." + }, "automationId": { "label": "Izvēles automatizācijas ID", "info": "Jūsu unikālais automatizācijas ID. Vienmēr sākas ar automatizāciju.XXXX. Ja tas nav iestatīts, logrīks nebūs noklikšķināms un tiks parādīts tikai statuss. Pēc noklikšķināšanas vienības stāvoklis tiks atsvaidzināts." }, "displayName": { "label": "Parādāmais nosaukums" + }, + "displayFriendlyName": { + "label": "Draudzīgais nosaukums", + "info": "Draudzīgā nosaukuma vietā parādiet no Home Assistant izgulto draudzīgo nosaukumu" } } } diff --git a/public/locales/nl/modules/health-monitoring.json b/public/locales/nl/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/nl/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/indexer-manager.json b/public/locales/nl/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/nl/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/nl/modules/smart-home/entity-state.json b/public/locales/nl/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/nl/modules/smart-home/entity-state.json +++ b/public/locales/nl/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/no/modules/health-monitoring.json b/public/locales/no/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/no/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/indexer-manager.json b/public/locales/no/modules/indexer-manager.json new file mode 100644 index 00000000000..6018869e31f --- /dev/null +++ b/public/locales/no/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Indekserings-behandler status", + "description": "Status om indeksererne dine", + "settings": { + "title": "Indekserings-behandler status" + } + }, + "indexersStatus": { + "title": "Indekserings-behandler", + "testAllButton": "Test alle" + }, + "errors": { + "general": { + "title": "Kan ikke finne en indekserings-behandler", + "text": "Det oppsto et problem med å koble til din indekserings-behandler. Vennligst bekreft konfigurasjonen/integrasjonen(e)." + } + } +} \ No newline at end of file diff --git a/public/locales/no/modules/smart-home/entity-state.json b/public/locales/no/modules/smart-home/entity-state.json index 4a10f20bf24..b48f3453f08 100644 --- a/public/locales/no/modules/smart-home/entity-state.json +++ b/public/locales/no/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Enhets-ID", "info": "Unik enhets-ID i Home Assistant. Kopier ved å klikke på enhet > Klikk på tannhjulikonet > Klikk på kopieringsknappen ved Entitets-ID. Noen egendefinerte enheter støttes kanskje ikke." }, + "appendUnit": { + "label": "Legg til måleenhet", + "info": "Legg til måleenhetsattributtet til enhetstilstanden." + }, "automationId": { "label": "Valgfri automatisering ID", "info": "Din unike automatisering ID. Starter alltid med automation.XXXXX. Hvis den ikke er angitt, vil widgeten ikke være klikkbar og kun vise status Etter klikk vil enhetsstatus bli oppdatert." }, "displayName": { "label": "Visningsnavn" + }, + "displayFriendlyName": { + "label": "Vis brukervennlig navn", + "info": "Vis brukervennlig navn fra Home Assistant i stedet for visningsnavn" } } } diff --git a/public/locales/pl/modules/health-monitoring.json b/public/locales/pl/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/pl/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/indexer-manager.json b/public/locales/pl/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/pl/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/pl/modules/smart-home/entity-state.json b/public/locales/pl/modules/smart-home/entity-state.json index 34458e12c2d..7f5fe40e1b2 100644 --- a/public/locales/pl/modules/smart-home/entity-state.json +++ b/public/locales/pl/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID encji", "info": "Unikalne ID encji w Home Assistant. Kopiuj klikając na encji > Kliknij ikonę koła zębatego > Kliknij na przycisk kopiuj na 'ID encji'. Niektóre niestandardowe obiekty mogą nie być obsługiwane." }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "Opcjonalne ID automatyzacji", "info": "Twój unikalny identyfikator automatyzacji. Zawsze zaczyna się od automation.XXXXX. Jeśli nie jest ustawiony, widżet nie będzie klikalny i będzie wyświetlał tylko stan. Po kliknięciu stan encji zostanie odświeżony." }, "displayName": { "label": "Nazwa wyświetlana" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 491a733568e..72242b38cc9 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -13,14 +13,14 @@ "previous": "Anterior", "confirm": "Confirme", "enabled": "Ativado", - "duplicate": "", + "duplicate": "Duplicar", "disabled": "Desativado", "enableAll": "Habilitar tudo", "disableAll": "Desativar tudo", "version": "Versão", "changePosition": "Mudar de posição", "remove": "Excluir", - "removeConfirm": "Tem certeza de que deseja remover o site {{item}}?", + "removeConfirm": "Tem certeza de que deseja remover o {{item}}?", "createItem": "+ criar {{item}}", "sections": { "settings": "Configurações", diff --git a/public/locales/pt/layout/element-selector/selector.json b/public/locales/pt/layout/element-selector/selector.json index 8a60ba38555..2bf09cc7980 100644 --- a/public/locales/pt/layout/element-selector/selector.json +++ b/public/locales/pt/layout/element-selector/selector.json @@ -22,5 +22,5 @@ "message": "A categoria \"{{name}}\" foi criada" } }, - "importFromDocker": "" + "importFromDocker": "Importar do docker" } diff --git a/public/locales/pt/layout/manage.json b/public/locales/pt/layout/manage.json index f6d16bdd6d0..1e7a5666c4f 100644 --- a/public/locales/pt/layout/manage.json +++ b/public/locales/pt/layout/manage.json @@ -26,7 +26,7 @@ "title": "Ferramentas", "items": { "docker": "Docker", - "api": "" + "api": "API" } }, "about": { diff --git a/public/locales/pt/manage/boards.json b/public/locales/pt/manage/boards.json index 56916e71725..710519d88f4 100644 --- a/public/locales/pt/manage/boards.json +++ b/public/locales/pt/manage/boards.json @@ -16,15 +16,15 @@ "label": "Excluir permanentemente", "disabled": "Exclusão desativada, pois os componentes Homarr mais antigos não permitem a exclusão da configuração padrão. A exclusão será possível no futuro." }, - "duplicate": "", + "duplicate": "Duplicar", "rename": { - "label": "", + "label": "Renomear", "modal": { - "title": "", + "title": "Renomear quadro {{name}}", "fields": { "name": { - "label": "", - "placeholder": "" + "label": "Novo nome", + "placeholder": "Nome do novo quadro" } } } diff --git a/public/locales/pt/manage/users.json b/public/locales/pt/manage/users.json index fc94a8803b8..de584844062 100644 --- a/public/locales/pt/manage/users.json +++ b/public/locales/pt/manage/users.json @@ -6,10 +6,10 @@ }, "filter": { "roles": { - "all": "", - "normal": "", - "admin": "", - "owner": "" + "all": "Todos", + "normal": "Normal", + "admin": "Administrador", + "owner": "Dono" } }, "table": { diff --git a/public/locales/pt/manage/users/edit.json b/public/locales/pt/manage/users/edit.json index f340186645d..9dc88b5040a 100644 --- a/public/locales/pt/manage/users/edit.json +++ b/public/locales/pt/manage/users/edit.json @@ -1,6 +1,6 @@ { - "metaTitle": "", - "back": "", + "metaTitle": "Usuário {{username}}", + "back": "Voltar ao gerenciamento de usuários", "sections": { "general": { "title": "Geral", @@ -14,40 +14,40 @@ } }, "security": { - "title": "", + "title": "Segurança", "inputs": { "password": { - "label": "" + "label": "Nova senha" }, "terminateExistingSessions": { - "label": "", - "description": "" + "label": "Encerrar sessões existentes", + "description": "Força o usuário a fazer login novamente em seus dispositivos" }, "confirm": { "label": "Confirme", - "description": "" + "description": "A senha será atualizada. A ação não pode ser revertida." } } }, "roles": { - "title": "", - "currentRole": "", + "title": "Funções", + "currentRole": "Função atual: ", "badges": { - "owner": "", - "admin": "", - "normal": "" + "owner": "Dono", + "admin": "Administrador", + "normal": "Normal" } }, "deletion": { - "title": "", + "title": "Exclusão de conta", "inputs": { "confirmUsername": { - "label": "", - "description": "" + "label": "Confirmar nome de usuário", + "description": "Digite o nome de usuário para confirmar a exclusão" }, "confirm": { "label": "Excluir permanentemente", - "description": "" + "description": "Estou ciente de que esta ação é permanente e todos os dados da conta serão perdidos." } } } diff --git a/public/locales/pt/modules/dashdot.json b/public/locales/pt/modules/dashdot.json index 6b76641e56d..adea8db3731 100644 --- a/public/locales/pt/modules/dashdot.json +++ b/public/locales/pt/modules/dashdot.json @@ -1,7 +1,7 @@ { "descriptor": { "name": "Dash.", - "description": "Exibe os gráficos de uma instância externa do Dash. Instance dentro da Homarr.", + "description": "Exibe os gráficos de um Dash. externo. Instância dentro de Homarr.", "settings": { "title": "Definições para o Dash. widget", "dashName": { diff --git a/public/locales/pt/modules/date.json b/public/locales/pt/modules/date.json index 67008b0db67..7ce7ba60b98 100644 --- a/public/locales/pt/modules/date.json +++ b/public/locales/pt/modules/date.json @@ -5,11 +5,11 @@ "settings": { "title": "Definições para o widget de Data e Hora", "timezone": { - "label": "", - "info": "" + "label": "Fuso-horário", + "info": "Selecione o nome do seu fuso horário: " }, "customTitle": { - "label": "" + "label": "Nome da cidade ou título personalizado" }, "display24HourFormat": { "label": "Mostrar tempo (24 horas)" @@ -21,11 +21,11 @@ } }, "titleState": { - "label": "", - "info": "", + "label": "Título do relógio", + "info": "O título personalizado e o código do fuso horário podem ser mostrados no seu widget.
Você também pode mostrar apenas a cidade, mostrar nenhuma,
ou até mesmo mostrar apenas o fuso horário quando ambos estiverem selecionados, mas nenhum título for fornecido.", "data": { - "both": "", - "city": "", + "both": "Título e fuso horário", + "city": "Somente título", "none": "Nenhum" } } diff --git a/public/locales/pt/modules/docker.json b/public/locales/pt/modules/docker.json index dfffab0502f..c067974bbdd 100644 --- a/public/locales/pt/modules/docker.json +++ b/public/locales/pt/modules/docker.json @@ -4,7 +4,7 @@ "description": "Permite-lhe ver e gerir facilmente todos os seus Docker Containers." }, "search": { - "placeholder": "Procurar por conainer ou imagem" + "placeholder": "Procurar por container ou imagem" }, "table": { "header": { diff --git a/public/locales/pt/modules/health-monitoring.json b/public/locales/pt/modules/health-monitoring.json new file mode 100644 index 00000000000..bcd7ddacdbd --- /dev/null +++ b/public/locales/pt/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Monitoramento da integridade do sistema", + "description": "Informações sobre o seu NAS", + "settings": { + "title": "Monitoramento da integridade do sistema", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Carga Média", + "minute": "{{minute}} minuto" + }, + "memory": { + "label": "Memória", + "totalMem": "Memória total: {{total}}GB", + "available": "Disponível: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Sistema de arquivos", + "available": "Disponível: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Tempo de Atividade", + "updates": "Atualizações", + "reboot": "Reiniciar" + }, + "errors": { + "general": { + "title": "Não foi possível encontrar seu NAS", + "text": "Ocorreu um problema na conexão com seu NAS. Verifique sua(s) configuração(ões)/integração(ões)." + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/indexer-manager.json b/public/locales/pt/modules/indexer-manager.json new file mode 100644 index 00000000000..271658e04ad --- /dev/null +++ b/public/locales/pt/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Status do Gerenciador de Indexadores", + "description": "Estado dos seus indexadores", + "settings": { + "title": "Status do Gerenciador de Indexadores" + } + }, + "indexersStatus": { + "title": "Gerenciador de indexadores", + "testAllButton": "Testar todos" + }, + "errors": { + "general": { + "title": "Não foi possível localizar um gerenciador de indexador", + "text": "Houve um problema na conexão com seu gerente de indexação. Por favor, verifique sua configuração/integração(ões)." + } + } +} \ No newline at end of file diff --git a/public/locales/pt/modules/media-requests-list.json b/public/locales/pt/modules/media-requests-list.json index fe81f256ffc..61cafdbec2b 100644 --- a/public/locales/pt/modules/media-requests-list.json +++ b/public/locales/pt/modules/media-requests-list.json @@ -17,8 +17,8 @@ "approved": "Aprovado", "pendingApproval": "Aprovação pendente", "declined": "Recusado", - "available": "", - "partial": "" + "available": "Disponível", + "partial": "Parcial" }, "tooltips": { "approve": "Aprovar solicitações", diff --git a/public/locales/pt/modules/rss.json b/public/locales/pt/modules/rss.json index 63acf1bf03b..6ee71381990 100644 --- a/public/locales/pt/modules/rss.json +++ b/public/locales/pt/modules/rss.json @@ -19,13 +19,13 @@ "label": "Grampo de linhas de texto" }, "sortByPublishDateAscending": { - "label": "" + "label": "Ordenar por data de publicação (crescente)" }, "sortPostsWithoutPublishDateToTheTop": { - "label": "" + "label": "Coloque postagens sem data de publicação no topo" }, "maximumAmountOfPosts": { - "label": "" + "label": "Quantidade máxima de postagens" } }, "card": { diff --git a/public/locales/pt/modules/search.json b/public/locales/pt/modules/search.json index 5e1147f7030..a12de17ad63 100644 --- a/public/locales/pt/modules/search.json +++ b/public/locales/pt/modules/search.json @@ -6,7 +6,7 @@ "input": { "placeholder": "Pesquisar na Internet..." }, - "switched-to": "Comutado para", + "switched-to": "Mudou para", "searchEngines": { "search": { "name": "Web", @@ -18,13 +18,13 @@ }, "torrents": { "name": "Torrentes", - "description": "Pesquisa de Torrentes" + "description": "Pesquisa de Torrents" }, "overseerr": { "name": "Overseerr", "description": "Pesquisa de Filmes e Programas de TV no Overseerr" } }, - "tip": "Pode seleccionar a barra de pesquisa com o atalho ", + "tip": "Você pode selecionar a barra de pesquisa com o atalho ", "switchedSearchEngine": "Comutado para pesquisa com {{searchEngine}}" } diff --git a/public/locales/pt/modules/smart-home/entity-state.json b/public/locales/pt/modules/smart-home/entity-state.json index 949c7272852..ba2f751dc85 100644 --- a/public/locales/pt/modules/smart-home/entity-state.json +++ b/public/locales/pt/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID da entidade", "info": "ID de entidade exclusiva do Home Assistant. Copie clicando na entidade > Clique no ícone de engrenagem > Clique no botão copiar em 'ID da entidade'. Algumas entidades personalizadas podem não ser suportadas." }, + "appendUnit": { + "label": "Anexar unidade de medida", + "info": "Acrescentar o atributo da unidade de medida ao estado da entidade." + }, "automationId": { - "label": "", - "info": "" + "label": "ID de automação opcional", + "info": "Seu ID de automação único. Sempre começa com automation.XXXXX. Se não definido, o widget não será clicável e apenas será exibido. Após clicar, o estado da entidade será atualizado." }, "displayName": { "label": "Nome de exibição" + }, + "displayFriendlyName": { + "label": "Exibir nome amigável", + "info": "Exibir nome amigável do Home Assistant em vez do nome de exibição" } } } diff --git a/public/locales/pt/modules/smart-home/trigger-automation.json b/public/locales/pt/modules/smart-home/trigger-automation.json index 030643c7036..d4deff2f503 100644 --- a/public/locales/pt/modules/smart-home/trigger-automation.json +++ b/public/locales/pt/modules/smart-home/trigger-automation.json @@ -1,12 +1,12 @@ { "descriptor": { - "name": "", - "description": "", + "name": "Automação do Home Assistant", + "description": "Executar uma automação", "settings": { - "title": "", + "title": "Executar uma automação", "automationId": { - "label": "", - "info": "" + "label": "ID da automação", + "info": "Seu ID de automação único. Sempre começa com automation.XXXXX." }, "displayName": { "label": "Nome de exibição" diff --git a/public/locales/pt/modules/torrents-status.json b/public/locales/pt/modules/torrents-status.json index cd004536c57..7fa0e918f50 100644 --- a/public/locales/pt/modules/torrents-status.json +++ b/public/locales/pt/modules/torrents-status.json @@ -41,22 +41,22 @@ }, "table": { "header": { - "isCompleted": "", + "isCompleted": "Baixando", "name": "Nome", - "dateAdded": "", + "dateAdded": "Adicionado em", "size": "Tamanho", "download": "Para baixo", "upload": "Para cima", "estimatedTimeOfArrival": "TED", "progress": "Progresso", - "totalUploaded": "", - "totalDownloaded": "", - "ratio": "", - "seeds": "", - "peers": "", - "label": "", + "totalUploaded": "Total enviado", + "totalDownloaded": "Total baixado", + "ratio": "Razão", + "seeds": "Sementes (conectadas)", + "peers": "Pares (conectados)", + "label": "Etiqueta", "state": "Estado", - "stateMessage": "" + "stateMessage": "Mensagem de Estado" }, "item": { "text": "Gerido por {{appName}}, {{ratio}} ratio" diff --git a/public/locales/pt/modules/weather.json b/public/locales/pt/modules/weather.json index 8446e11beb2..1539abb65e4 100644 --- a/public/locales/pt/modules/weather.json +++ b/public/locales/pt/modules/weather.json @@ -20,16 +20,16 @@ "clear": "Limpar", "mainlyClear": "Principalmente claro", "fog": "Névoa", - "drizzle": "Drizzle", + "drizzle": "Chuvisco", "freezingDrizzle": "Chuvisco de congelação", "rain": "Chuva", "freezingRain": "Chuva gelada", "snowFall": "Queda de neve", "snowGrains": "Grãos de neve", "rainShowers": "Duches de chuva", - "snowShowers": "Duches de neve", - "thunderstorm": "Tempestade de trovoada", - "thunderstormWithHail": "Tempestade de trovoada com granizo", + "snowShowers": "Aguaceiros de neve", + "thunderstorm": "Tempestade", + "thunderstormWithHail": "Tempestade com granizo", "unknown": "Desconhecido" } }, diff --git a/public/locales/pt/settings/common.json b/public/locales/pt/settings/common.json index 086096ce382..e0cba753013 100644 --- a/public/locales/pt/settings/common.json +++ b/public/locales/pt/settings/common.json @@ -16,7 +16,7 @@ "dependencyVersion": "Versão" } }, - "grow": "Grelha de cultivo (ocupar todo o espaço)", + "grow": "Grelha de crescimento (ocupar todo o espaço)", "layout": { "preview": { "title": "Pré-visualizar", diff --git a/public/locales/ru/modules/health-monitoring.json b/public/locales/ru/modules/health-monitoring.json new file mode 100644 index 00000000000..ccc017bb33d --- /dev/null +++ b/public/locales/ru/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "ЦПУ", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/indexer-manager.json b/public/locales/ru/modules/indexer-manager.json new file mode 100644 index 00000000000..2d1f8d3a3a5 --- /dev/null +++ b/public/locales/ru/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Статус менеджера индексаторов", + "description": "Информация о статусе ваших индексаторов", + "settings": { + "title": "Статус менеджера индексаторов" + } + }, + "indexersStatus": { + "title": "Статус менеджера индексаторов", + "testAllButton": "Тестировать все" + }, + "errors": { + "general": { + "title": "Не удалось найти менеджера индексаторов", + "text": "Проблема с подключением к вашему менеджеру индексаторов. Пожалуйста, проверьте свои настройки/интеграцию." + } + } +} \ No newline at end of file diff --git a/public/locales/ru/modules/smart-home/entity-state.json b/public/locales/ru/modules/smart-home/entity-state.json index 59e10091cdf..eb48be31590 100644 --- a/public/locales/ru/modules/smart-home/entity-state.json +++ b/public/locales/ru/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID объекта", "info": "Уникальный идентификатор объекта в Home Assistant. Скопируйте, нажав на объект > Щелкните значок шестеренки > Нажмите кнопку копирования в разделе «Идентификатор объекта». Некоторые пользовательские объекты могут не поддерживаться." }, + "appendUnit": { + "label": "Добавить единицу измерения", + "info": "Добавьте атрибут единицы измерения к состоянию объекта." + }, "automationId": { "label": "ID автоматизации (необязательно)", "info": "Ваш уникальный идентификатор автоматизации. Всегда начинается с automation.XXXXX. Если не задан, виджет не будет кликабельным и будет только отображать состояние. После клика состояние объекта будет обновлено." }, "displayName": { "label": "Отображаемое имя" + }, + "displayFriendlyName": { + "label": "Показать собственное имя", + "info": "Показывать собственное имя Home Assistant вместо отображаемого имени" } } } diff --git a/public/locales/sk/modules/health-monitoring.json b/public/locales/sk/modules/health-monitoring.json new file mode 100644 index 00000000000..1019267ae87 --- /dev/null +++ b/public/locales/sk/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Monitorovanie stavu systému", + "description": "Informácie o vašom NAS", + "settings": { + "title": "Monitorovanie stavu systému", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Priemerná záťaž", + "minute": "{minutes} min." + }, + "memory": { + "label": "Pamäť", + "totalMem": "Celková pamäť: {{total}}GB", + "available": "K dispozícii: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Súborový systém", + "available": "K dispozícii: {{available}}GB - {{percentage}}%" + }, + "info": { + "uptime": "Čas prevádzky", + "updates": "Aktualizácie", + "reboot": "Reštartovať" + }, + "errors": { + "general": { + "title": "Nemožno nájsť váš NAS", + "text": "Nastal problém s pripojením k vášmu NAS. Skontrolujte prosím svoju konfiguráciu/integráciu." + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/indexer-manager.json b/public/locales/sk/modules/indexer-manager.json new file mode 100644 index 00000000000..2698af1722b --- /dev/null +++ b/public/locales/sk/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Stav správcu indexovača", + "description": "Stav vašich indexov", + "settings": { + "title": "Stav správcu indexovača" + } + }, + "indexersStatus": { + "title": "Správca indexovača", + "testAllButton": "Otestujte všetky" + }, + "errors": { + "general": { + "title": "Nie je možné nájsť správcu indexera", + "text": "Vyskytol sa problém s pripojením k vášmu správcovi indexera. Overte svoju konfiguráciu/integráciu." + } + } +} \ No newline at end of file diff --git a/public/locales/sk/modules/smart-home/entity-state.json b/public/locales/sk/modules/smart-home/entity-state.json index 454fc780941..c3eccddb461 100644 --- a/public/locales/sk/modules/smart-home/entity-state.json +++ b/public/locales/sk/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID subjektu", "info": "Jedinečné ID subjektu v aplikácii Home Assistant. Kopírujte kliknutím na entitu > kliknite na ikonu ozubeného kolieska > kliknite na tlačidlo Kopírovať pri \"ID entity\". Niektoré vlastné entity nemusia byť podporované." }, + "appendUnit": { + "label": "Pripojte mernú jednotku", + "info": "Pripojte atribút jednotky merania k stavu entity." + }, "automationId": { "label": "Voliteľné ID automatizácie", "info": "Vaše jedinečné ID automatizácie. Vždy začína automatizáciou.XXXXX. Ak nie je nastavené, na miniaplikáciu sa nebude dať kliknúť a bude zobrazovať iba stav. Po kliknutí sa stav entity obnoví." }, "displayName": { "label": "Zobrazenie názvu" + }, + "displayFriendlyName": { + "label": "Zobraziť priateľské meno", + "info": "Namiesto zobrazovaného mena zobraziť popisný názov z Home Assistant" } } } diff --git a/public/locales/sl/modules/health-monitoring.json b/public/locales/sl/modules/health-monitoring.json new file mode 100644 index 00000000000..dd45386b494 --- /dev/null +++ b/public/locales/sl/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "CPU", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/indexer-manager.json b/public/locales/sl/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/sl/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/sl/modules/smart-home/entity-state.json b/public/locales/sl/modules/smart-home/entity-state.json index 4d8d875f6ba..e3b2b290b98 100644 --- a/public/locales/sl/modules/smart-home/entity-state.json +++ b/public/locales/sl/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID subjekta", "info": "Edinstveni identifikator entitete v programu Home Assistant. Kopirajte s klikom na entiteto > kliknite na ikono z zobnikom > kliknite na gumb za kopiranje pri \"ID entitete\". Nekatere entitete po meri morda ne bodo podprte." }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "Prikaži ime" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/sv/modules/health-monitoring.json b/public/locales/sv/modules/health-monitoring.json new file mode 100644 index 00000000000..de23c246644 --- /dev/null +++ b/public/locales/sv/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Övervakning av systemhälsan", + "description": "Information om din NAS", + "settings": { + "title": "Övervakning av systemhälsan", + "fahrenheit": { + "label": "Fahrenheit" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Genomsnittlig belastning", + "minute": "{{minute}} minut" + }, + "memory": { + "label": "Minne", + "totalMem": "Totalt minne: {{total}}GB", + "available": "Tillgängligt: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Filsystem", + "available": "Tillgängligt: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Drifttid", + "updates": "Uppdateringar", + "reboot": "Omstart" + }, + "errors": { + "general": { + "title": "Det gick inte att hitta din NAS", + "text": "Det gick inte att ansluta till din NAS. Vänligen verifiera din konfiguration/integration(er)." + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/indexer-manager.json b/public/locales/sv/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/sv/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/sv/modules/smart-home/entity-state.json b/public/locales/sv/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/sv/modules/smart-home/entity-state.json +++ b/public/locales/sv/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/tr/modules/health-monitoring.json b/public/locales/tr/modules/health-monitoring.json new file mode 100644 index 00000000000..330a479d828 --- /dev/null +++ b/public/locales/tr/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Sistem Sağlığı İzleme", + "description": "NAS'ınız hakkında bilgi", + "settings": { + "title": "Sistem Sağlığı İzleme", + "fahrenheit": { + "label": "Fahrenayt" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Yük Ortalaması", + "minute": "{{minute}} dakika" + }, + "memory": { + "label": "Bellek", + "totalMem": "Toplam bellek: {{total}}GB", + "available": "Mevcut: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Dosya Sistemi", + "available": "Mevcut: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Çalışma süresi", + "updates": "Güncellemeler", + "reboot": "Yeniden başlat" + }, + "errors": { + "general": { + "title": "NAS'ınız bulunamıyor", + "text": "NAS'ınıza bağlanırken bir sorun oluştu. Lütfen yapılandırmanızı/entegrasyonlarınızı kontrol edin." + } + } +} \ No newline at end of file diff --git a/public/locales/tr/modules/indexer-manager.json b/public/locales/tr/modules/indexer-manager.json new file mode 100644 index 00000000000..7fa9f83d5a2 --- /dev/null +++ b/public/locales/tr/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "Dizin oluşturucu yöneticisi statüsü", + "description": "Dizin oluşturucularınızın statüsü", + "settings": { + "title": "Dizin oluşturucu yöneticisi statüsü" + } + }, + "indexersStatus": { + "title": "Dizin oluşturucu yöneticisi", + "testAllButton": "Tümünü test et" + }, + "errors": { + "general": { + "title": "Dizin oluşturucu yöneticisi bulunamıyor", + "text": "Dizin oluşturucu yöneticinize bağlanırken bir sorun oluştu. Lütfen yapılandırmanızı/entegrasyonlarınızı kontrol edin." + } + } +} \ No newline at end of file diff --git a/public/locales/tr/modules/smart-home/entity-state.json b/public/locales/tr/modules/smart-home/entity-state.json index 8a030881b40..8e104239d27 100644 --- a/public/locales/tr/modules/smart-home/entity-state.json +++ b/public/locales/tr/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "Varlık Kimliği", "info": "Home Assistant'ta benzersiz varlık kimliği. Varlığa tıklayın > Çark simgesine tıklayın > 'Varlık Kimliği'ndeki kopyala butonuna tıklayın. Bazı özel varlıklar desteklenmeyebilir." }, + "appendUnit": { + "label": "Ölçü birimini ekle", + "info": "Varlık durumuna ölçü birim özelliğini ekler." + }, "automationId": { "label": "İsteğe bağlı otomasyon kimliği", "info": "Benzersiz otomasyon kimliğiniz. Her zaman automation.XXXXX başlar. Ayarlanmazsa widget etkileşimli olmayacak ve yalnızca durumu görüntüleyecektir. Tıklandığında varlık durumu yenilenecektir." }, "displayName": { "label": "Ekran adı" + }, + "displayFriendlyName": { + "label": "Kolay adı görüntüle", + "info": "Görünen ad yerine Home Assistant'ın kolay adını görüntüler" } } } diff --git a/public/locales/tr/modules/smart-home/trigger-automation.json b/public/locales/tr/modules/smart-home/trigger-automation.json index 3e4369234ed..bf2d7938866 100644 --- a/public/locales/tr/modules/smart-home/trigger-automation.json +++ b/public/locales/tr/modules/smart-home/trigger-automation.json @@ -1,6 +1,6 @@ { "descriptor": { - "name": "Ev Asistanı otomasyonu", + "name": "Home Assistant otomasyonu", "description": "Bir otomasyon yürütün", "settings": { "title": "Bir otomasyon yürütün", diff --git a/public/locales/tr/password-requirements.json b/public/locales/tr/password-requirements.json index 000881dc32b..3f55658536e 100644 --- a/public/locales/tr/password-requirements.json +++ b/public/locales/tr/password-requirements.json @@ -1,7 +1,7 @@ { - "number": "Numara içerir", - "lowercase": "Küçük harf içerir", - "uppercase": "Büyük harf içerir", - "special": "Özel karakterleri dahil et", - "length": "En az {{count}} karakter içerir" + "number": "Rakam içermeli", + "lowercase": "Küçük harf içermeli", + "uppercase": "Büyük harf içermeli", + "special": "Özel karakter içermeli", + "length": "En az {{count}} karakter içermeli" } \ No newline at end of file diff --git a/public/locales/tw/modules/health-monitoring.json b/public/locales/tw/modules/health-monitoring.json new file mode 100644 index 00000000000..915360b657b --- /dev/null +++ b/public/locales/tw/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "處理器", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/tw/modules/indexer-manager.json b/public/locales/tw/modules/indexer-manager.json new file mode 100644 index 00000000000..a9b41c16e9f --- /dev/null +++ b/public/locales/tw/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "索引管理器狀態", + "description": "有關索引器的狀態", + "settings": { + "title": "索引管理器狀態" + } + }, + "indexersStatus": { + "title": "索引管理器", + "testAllButton": "測試全部" + }, + "errors": { + "general": { + "title": "無法找到索引管理器", + "text": "連線索引管理器時出現問題,請驗證您的配置/集成" + } + } +} \ No newline at end of file diff --git a/public/locales/tw/modules/smart-home/entity-state.json b/public/locales/tw/modules/smart-home/entity-state.json index cbc79dfcce4..dd0561c30e6 100644 --- a/public/locales/tw/modules/smart-home/entity-state.json +++ b/public/locales/tw/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "實體 ID", "info": "Home Assistant 中的唯一實體ID,通過點擊實體 > 點擊齒輪圖示 > 點擊實體 ID 觸地的複製按鈕進行複製,某些自定義實體可能不支持" }, + "appendUnit": { + "label": "附加測量單位", + "info": "將測量單位的屬性附加至實體狀態" + }, "automationId": { "label": "可選自動化ID", "info": "自動化ID必須以 automation.XXXX 開頭,當未設定時小部件將不可點擊,且僅顯示狀況,點擊後實體狀態將被更新" }, "displayName": { "label": "顯示名稱" + }, + "displayFriendlyName": { + "label": "顯示友好名稱", + "info": "顯示來自 Home Assistant 的友好名稱,而不是顯示名稱" } } } diff --git a/public/locales/uk/modules/health-monitoring.json b/public/locales/uk/modules/health-monitoring.json new file mode 100644 index 00000000000..43dc6133b50 --- /dev/null +++ b/public/locales/uk/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "", + "fahrenheit": { + "label": "" + } + } + }, + "cpu": { + "label": "Процесор", + "load": "", + "minute": "" + }, + "memory": { + "label": "", + "totalMem": "", + "available": "" + }, + "fileSystem": { + "label": "", + "available": "" + }, + "info": { + "uptime": "", + "updates": "", + "reboot": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/indexer-manager.json b/public/locales/uk/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/uk/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/uk/modules/smart-home/entity-state.json b/public/locales/uk/modules/smart-home/entity-state.json index 0ce4fcc65c6..75dd923c8ad 100644 --- a/public/locales/uk/modules/smart-home/entity-state.json +++ b/public/locales/uk/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "", "info": "" }, + "appendUnit": { + "label": "", + "info": "" + }, "automationId": { "label": "", "info": "" }, "displayName": { "label": "" + }, + "displayFriendlyName": { + "label": "", + "info": "" } } } diff --git a/public/locales/vi/modules/health-monitoring.json b/public/locales/vi/modules/health-monitoring.json new file mode 100644 index 00000000000..f3849cb9080 --- /dev/null +++ b/public/locales/vi/modules/health-monitoring.json @@ -0,0 +1,37 @@ +{ + "descriptor": { + "name": "Giám sát tình trạng hệ thống", + "description": "Cung cấp thông tin về NAS của bạn", + "settings": { + "title": "Giám sát tình trạng hệ thống", + "fahrenheit": { + "label": "Độ F" + } + } + }, + "cpu": { + "label": "CPU", + "load": "Tải trung bình", + "minute": "{{minute}} phút" + }, + "memory": { + "label": "Bộ nhớ", + "totalMem": "Tổng bộ nhớ: {{total}}GB", + "available": "Có sẵn: {{available}}GB - {{percentage}}%" + }, + "fileSystem": { + "label": "Hệ thống tập tin", + "available": "Có sẵn: {{available}} - {{percentage}}%" + }, + "info": { + "uptime": "Thời gian hoạt động", + "updates": "Cập nhật", + "reboot": "Khởi động lại" + }, + "errors": { + "general": { + "title": "Không thể tìm thấy NAS của bạn", + "text": "Đã xảy ra sự cố khi kết nối với NAS của bạn. Vui lòng xác minh (các) cấu hình/tích hợp của bạn." + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/indexer-manager.json b/public/locales/vi/modules/indexer-manager.json new file mode 100644 index 00000000000..9b01e309316 --- /dev/null +++ b/public/locales/vi/modules/indexer-manager.json @@ -0,0 +1,19 @@ +{ + "descriptor": { + "name": "", + "description": "", + "settings": { + "title": "" + } + }, + "indexersStatus": { + "title": "", + "testAllButton": "" + }, + "errors": { + "general": { + "title": "", + "text": "" + } + } +} \ No newline at end of file diff --git a/public/locales/vi/modules/rss.json b/public/locales/vi/modules/rss.json index 090686eb066..1bb1fae4a3e 100644 --- a/public/locales/vi/modules/rss.json +++ b/public/locales/vi/modules/rss.json @@ -22,10 +22,10 @@ "label": "Sắp xếp theo ngày phát hành (tăng dần)" }, "sortPostsWithoutPublishDateToTheTop": { - "label": "" + "label": "Đưa bài viết không có ngày xuất bản lên đầu" }, "maximumAmountOfPosts": { - "label": "" + "label": "Số lượng bài viết tối đa" } }, "card": { diff --git a/public/locales/vi/modules/smart-home/entity-state.json b/public/locales/vi/modules/smart-home/entity-state.json index ab5fc0329ea..2898301b200 100644 --- a/public/locales/vi/modules/smart-home/entity-state.json +++ b/public/locales/vi/modules/smart-home/entity-state.json @@ -9,12 +9,20 @@ "label": "ID thực thể", "info": "ID thực thể độc nhất trong Home Assistant. Sao chép bằng cách nhấp vào thực thể > Nhấp vào biểu tượng răng cưa > Nhấp vào nút sao chép tại 'ID thực thể'. Một số thực thể tùy chỉnh có thể không được hỗ trợ." }, + "appendUnit": { + "label": "Thêm đơn vị đo", + "info": "Thêm thuộc tính đơn vị đo lường vào trạng thái thực thể." + }, "automationId": { "label": "ID tự động hóa tùy chọn", "info": "ID tự động hóa riêng của bạn. Luôn bắt đầu bằng tự động hóa.XXXXX. Nếu không được đặt, tiện ích sẽ không thể tương tác và chỉ hiển thị trạng thái. Sau khi nhấp vào, trạng thái thực thể sẽ được làm mới." }, "displayName": { "label": "Tên hiển thị" + }, + "displayFriendlyName": { + "label": "Hiển thị tên thân thiện", + "info": "Hiển thị tên thân thiện từ Home Assistant thay vì tên hiển thị" } } } From a9df79642d6daec6891d73424069d3849b53774f Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Mon, 11 Mar 2024 06:49:59 +0100 Subject: [PATCH 13/16] fix: death links in readme --- README.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 716484ee042..52dc3546005 100644 --- a/README.md +++ b/README.md @@ -59,40 +59,40 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t ![Widgets & Integrations Section](docs/section-widgets-and-integrations.png) -Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/management/integrations/), that connect to your applications and enable you to control them directly from the dashboard. +Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard. Each widget and integration has a comprehensive documentation Homarr will integrate with the following applications: 📥 Torrent clients -- [Deluge](https://homarr.dev/docs/management/integrations/torrent-deluge) -- [Transmission](https://homarr.dev/docs/management/integrations/torrent-transmission) -- [qBittorent](https://homarr.dev/docs/management/integrations/torrent-qbittorrent) +- [Deluge](https://homarr.dev/docs/integrations/torrent#deluge) +- [Transmission](https://homarr.dev/docs/integrations/torrent#transmission) +- [qBittorent](https://homarr.dev/docs/integrations/torrent#qbittorrent-integration) 📥 Usenet clients -- [SABnzbd](https://homarr.dev/docs/management/integrations/usenet-sabnzbd) -- [NZBGet](https://homarr.dev/docs/management/integrations/usenet-nzbget) +- [SABnzbd](https://homarr.dev/docs/integrations/usenet#sabnzbd) +- [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget) 📺 Media servers -- [Plex](https://homarr.dev/docs/management/integrations/media-server-plex) -- [Jellyfin](https://homarr.dev/docs/management/integrations/media-server-jellyfin) +- [Plex](https://homarr.dev/docs/integrations/usenet#nzbget) +- [Jellyfin](https://homarr.dev/docs/integrations/usenet#nzbget) 📚 Media collection managers -- [Sonarr](https://homarr.dev/docs/management/integrations/servarr-sonarr) -- [Radarr](https://homarr.dev/docs/management/integrations/servarr-radarr) -- [Lidarr](https://homarr.dev/docs/management/integrations/servarr-lidarr) -- [Readarr](https://homarr.dev/docs/management/integrations/servarr-readarr) +- [Sonarr](https://homarr.dev/docs/integrations/servarr#sonarr) +- [Radarr](https://homarr.dev/docs/integrations/servarr#radarr) +- [Lidarr](https://homarr.dev/docs/integrations/servarr#lidarr) +- [Readarr](https://homarr.dev/docs/integrations/servarr#readarr) 🎞️ Media request managers -- [Overseerr](https://homarr.dev/docs/management/integrations/media-requester/) -- [Jellyseerr](https://homarr.dev/docs/management/integrations/media-requester/) +- [Overseerr](https://homarr.dev/docs/integrations/media-requester) +- [Jellyseerr](https://homarr.dev/docs/integrations/media-requester) 🚫 DNS ad-blockers -- [Pihole](https://homarr.dev/docs/management/integrations/dns-pihole) -- [AdGuard Home](https://homarr.dev/docs/management/integrations/dns-adguard-home) +- [Pihole](https://homarr.dev/docs/integrations/dns#pihole) +- [AdGuard Home](https://homarr.dev/docs/integrations/dns#adguard-home) Other integrations -- [🔌 Dash.](https://homarr.dev/docs/management/integrations/hardware-dash) -- [🐳 Docker](https://homarr.dev/docs/management/integrations/containers-docker) +- [🔌 Dash.](https://homarr.dev/docs/integrations/hardware) +- [🐳 Docker](https://homarr.dev/docs/integrations/containers) We're constantly adding new integrations and widgets, which will enhance your experience even further. From 4bafe6bfe762ccca7a9f33402a0b5b26f39e2be5 Mon Sep 17 00:00:00 2001 From: diederbert <162878798+diederbert@users.noreply.github.com> Date: Wed, 13 Mar 2024 17:43:24 +0100 Subject: [PATCH 14/16] perf: Improve TorrentTile rendering performance (#1951) --- src/widgets/torrent/TorrentTile.tsx | 207 ++++++++++++++-------------- 1 file changed, 104 insertions(+), 103 deletions(-) diff --git a/src/widgets/torrent/TorrentTile.tsx b/src/widgets/torrent/TorrentTile.tsx index b030efc827a..5ba2e2167fa 100644 --- a/src/widgets/torrent/TorrentTile.tsx +++ b/src/widgets/torrent/TorrentTile.tsx @@ -1,23 +1,22 @@ -import { type MRT_ColumnDef, MRT_Table, useMantineReactTable } from 'mantine-react-table'; import { Badge, Center, - createStyles, Flex, Group, Loader, Popover, Progress, - ScrollArea, Stack, Text, Title, + createStyles, } from '@mantine/core'; import { useElementSize } from '@mantine/hooks'; import { IconFileDownload } from '@tabler/icons-react'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; import relativeTime from 'dayjs/plugin/relativeTime'; +import { type MRT_ColumnDef, MRT_TableContainer, useMantineReactTable } from 'mantine-react-table'; import { useTranslation } from 'next-i18next'; import { useMemo } from 'react'; import { MIN_WIDTH_MOBILE } from '~/constants/constants'; @@ -109,7 +108,6 @@ function TorrentTile({ widget }: TorrentTileProps) { const filteredTorrents = filterTorrents(widget, torrents); - const difference = new Date().getTime() - dataUpdatedAt; const duration = dayjs.duration(difference, 'ms'); const humanizedDuration = duration.humanize(); @@ -117,90 +115,97 @@ function TorrentTile({ widget }: TorrentTileProps) { const ratioGlobal = getTorrentsRatio(widget, torrents, false); const ratioWithFilter = getTorrentsRatio(widget, torrents, true); - const columns = useMemo[]>(() => [ - { - id: 'dateAdded', - accessorFn: (row) => new Date(row.dateAdded), - header: 'dateAdded', - maxSize: 1, - }, - { - accessorKey: 'name', - header: t('card.table.header.name'), - Cell: ({ cell, row }) => ( - - - - {String(cell.getValue())} - - - - - - - ), - maxSize: 1, - size: 1, - }, - { - accessorKey: 'totalSelected', - header: t('card.table.header.size'), - Cell: ({ cell }) => formatSize(Number(cell.getValue())), - sortDescFirst: true, - maxSize: 1, - }, - { - accessorKey: 'uploadSpeed', - header: t('card.table.header.upload'), - Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), - sortDescFirst: true, - maxSize: 1, - }, - { - accessorKey: 'downloadSpeed', - header: t('card.table.header.download'), - Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), - sortDescFirst: true, - maxSize: 1, - }, - { - accessorKey: 'eta', - header: t('card.table.header.estimatedTimeOfArrival'), - Cell: ({ cell }) => formatETA(Number(cell.getValue())), - sortDescFirst: true, - maxSize: 1, - }, - { - accessorKey: 'progress', - header: t('card.table.header.progress'), - maxSize: 1, - Cell: ({ cell, row }) => ( - - {(Number(cell.getValue()) * 100).toFixed(1)}% - []>( + () => [ + { + id: 'dateAdded', + accessorFn: (row) => new Date(row.dateAdded), + header: 'dateAdded', + maxSize: 1, + }, + { + accessorKey: 'name', + header: t('card.table.header.name'), + Cell: ({ cell, row }) => ( + , - ), - sortDescFirst: true, - }, - ], []); + shadow="sm" + transitionProps={{ + transition: 'pop', + }} + > + + + {String(cell.getValue())} + + + + + + + ), + maxSize: 1, + size: 1, + }, + { + accessorKey: 'totalSelected', + header: t('card.table.header.size'), + Cell: ({ cell }) => formatSize(Number(cell.getValue())), + sortDescFirst: true, + maxSize: 1, + }, + { + accessorKey: 'uploadSpeed', + header: t('card.table.header.upload'), + Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), + sortDescFirst: true, + maxSize: 1, + }, + { + accessorKey: 'downloadSpeed', + header: t('card.table.header.download'), + Cell: ({ cell }) => formatSpeed(Number(cell.getValue())), + sortDescFirst: true, + maxSize: 1, + }, + { + accessorKey: 'eta', + header: t('card.table.header.estimatedTimeOfArrival'), + Cell: ({ cell }) => formatETA(Number(cell.getValue())), + sortDescFirst: true, + maxSize: 1, + }, + { + accessorKey: 'progress', + header: t('card.table.header.progress'), + maxSize: 1, + Cell: ({ cell, row }) => ( + + + {(Number(cell.getValue()) * 100).toFixed(1)}% + + + , + + ), + sortDescFirst: true, + }, + ], + [] + ); const torrentsTable = useMantineReactTable({ columns, @@ -210,6 +215,9 @@ function TorrentTile({ widget }: TorrentTileProps) { enableMultiSort: true, enableColumnActions: false, enableColumnFilters: false, + enableRowVirtualization: true, + rowVirtualizerProps: { overscan: 20 }, + mantineTableContainerProps: { sx: { scrollbarWidth: 'none' } }, enableSorting: true, initialState: { showColumnFilters: false, @@ -238,7 +246,6 @@ function TorrentTile({ widget }: TorrentTileProps) { }, }); - if (isError) { return ( @@ -288,10 +295,8 @@ function TorrentTile({ widget }: TorrentTileProps) { } return ( - - - - + + {data.apps.some((x) => !x.success) && ( @@ -320,7 +325,7 @@ export const filterTorrents = (widget: ITorrent, torrents: TorrentTotalDownload[ (torrent) => !torrent.isCompleted || (widget.properties.displayActiveTorrents && - torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024), + torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024) ); } @@ -328,7 +333,7 @@ export const filterTorrents = (widget: ITorrent, torrents: TorrentTotalDownload[ result = filterTorrentsByLabels( result, widget.properties.labelFilter, - widget.properties.labelFilterIsWhitelist, + widget.properties.labelFilterIsWhitelist ); } @@ -348,7 +353,7 @@ const filterStaleTorrent = (widget: ITorrent, torrents: TorrentTotalDownload['to const filterTorrentsByLabels = ( torrents: TorrentTotalDownload['torrents'], labels: string[], - isWhitelist: boolean, + isWhitelist: boolean ) => { if (isWhitelist) { return torrents.filter((torrent) => torrent.label && labels.includes(torrent.label)); @@ -360,7 +365,7 @@ const filterTorrentsByLabels = ( export const getTorrentsRatio = ( widget: ITorrent, torrents: TorrentTotalDownload['torrents'], - applyAllFilter: boolean, + applyAllFilter: boolean ) => { if (applyAllFilter) { torrents = filterTorrents(widget, torrents); @@ -368,18 +373,14 @@ export const getTorrentsRatio = ( torrents = filterTorrentsByLabels( torrents, widget.properties.labelFilter, - widget.properties.labelFilterIsWhitelist, + widget.properties.labelFilterIsWhitelist ); } - let totalDownloadedSum = torrents.reduce( - (sum, torrent) => sum + torrent.totalDownloaded, - 0, - ); + let totalDownloadedSum = torrents.reduce((sum, torrent) => sum + torrent.totalDownloaded, 0); return totalDownloadedSum > 0 - ? torrents.reduce((sum, torrent) => sum + torrent.totalUploaded, 0) / - totalDownloadedSum + ? torrents.reduce((sum, torrent) => sum + torrent.totalUploaded, 0) / totalDownloadedSum : -1; }; From 4fa51821ef2af4b211f6fd4b72af41eee046c621 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Wed, 13 Mar 2024 17:45:41 +0100 Subject: [PATCH 15/16] Fix: dead links (#1955) * Fix dead link on manage page * Fix: dead link for edit mode toggle --- src/components/layout/Templates/BoardLayout.tsx | 2 +- src/components/layout/Templates/ManageLayout.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/layout/Templates/BoardLayout.tsx b/src/components/layout/Templates/BoardLayout.tsx index f82730dac85..0e7f82609ca 100644 --- a/src/components/layout/Templates/BoardLayout.tsx +++ b/src/components/layout/Templates/BoardLayout.tsx @@ -182,7 +182,7 @@ const ToggleEditModeButton = () => { ), diff --git a/src/components/layout/Templates/ManageLayout.tsx b/src/components/layout/Templates/ManageLayout.tsx index 067840a0596..80c5af53144 100644 --- a/src/components/layout/Templates/ManageLayout.tsx +++ b/src/components/layout/Templates/ManageLayout.tsx @@ -112,7 +112,7 @@ export const ManageLayout = ({ children }: ManageLayoutProps) => { items: { documentation: { icon: IconBook2, - href: 'https://homarr.dev/docs/about', + href: 'https://homarr.dev/about-us', target: '_blank', }, report: { From 1cc4ae5c03b2829f9eb0fa032330a460e2de6587 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Wed, 13 Mar 2024 21:07:51 +0200 Subject: [PATCH 16/16] feat: add column ordering in torrent widget (#1952) --- src/widgets/torrent/TorrentTile.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/widgets/torrent/TorrentTile.tsx b/src/widgets/torrent/TorrentTile.tsx index 5ba2e2167fa..19921f6cee8 100644 --- a/src/widgets/torrent/TorrentTile.tsx +++ b/src/widgets/torrent/TorrentTile.tsx @@ -16,7 +16,7 @@ import { IconFileDownload } from '@tabler/icons-react'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; import relativeTime from 'dayjs/plugin/relativeTime'; -import { type MRT_ColumnDef, MRT_TableContainer, useMantineReactTable } from 'mantine-react-table'; +import { MRT_TableContainer, useMantineReactTable, type MRT_ColumnDef } from 'mantine-react-table'; import { useTranslation } from 'next-i18next'; import { useMemo } from 'react'; import { MIN_WIDTH_MOBILE } from '~/constants/constants'; @@ -218,6 +218,7 @@ function TorrentTile({ widget }: TorrentTileProps) { enableRowVirtualization: true, rowVirtualizerProps: { overscan: 20 }, mantineTableContainerProps: { sx: { scrollbarWidth: 'none' } }, + enableColumnOrdering: true, enableSorting: true, initialState: { showColumnFilters: false,