make it pass build

This commit is contained in:
Graham Steffaniak committed 2026-11-14 19:08:04 -06:00
1 parent 493f8f7417
commit be2b16b0d3
41 files changed
+16079 -16141

No files matched your search

+1
View File
@@ -93,6 +93,7 @@ func TestFillCenter_MatchesImagingFill(t *testing.T) {
for _, tg := range targets {
for fname, f := range filters {
t.Run(fmt.Sprintf("%s/%dx%d/%s", name, tg[0], tg[1], fname), func(t *testing.T) {
t.Parallel()
want := imaging.Fill(src, tg[0], tg[1], imaging.Center, f)
got := fillCenter(src, tg[0], tg[1], f)
require.Equal(t, fmt.Sprintf("%T", want), fmt.Sprintf("%T", got), "image type")
@@ -13,14 +13,15 @@ import (
func withMediaHandlerSettings(t *testing.T) {
t.Helper()
originalTranscode := settings.Config.Integrations.Media.Transcode
originalMedia := settings.CurrentMediaSettings()
originalFFmpeg := settings.Env.FFmpegAvailable
t.Cleanup(func() {
settings.Config.Integrations.Media.Transcode = originalTranscode
settings.Env.FFmpegAvailable = originalFFmpeg
settings.ApplyMediaSettings(originalMedia)
})
settings.Env.FFmpegAvailable = true
settings.Config.Integrations.Media.Transcode = settings.FullAdminTranscode{
media := originalMedia
media.Transcode = settings.FullAdminTranscode{
UserTranscode: settings.UserTranscode{
Enabled: true,
MaxConcurrentPerUser: 2,
@@ -28,6 +29,7 @@ func withMediaHandlerSettings(t *testing.T) {
MaxConcurrent: 3,
Profiles: settings.DefaultTranscodeProfiles(),
}
settings.ApplyMediaSettings(media)
}
func mediaHandlerContext(admin bool) *Context {
@@ -154,7 +156,9 @@ func TestSettingsMediaHandlerFullPayloadForAdmin(t *testing.T) {
// Disabling transcoding at runtime must be visible to non-admin players.
func TestSettingsMediaHandlerReflectsDisabledTranscode(t *testing.T) {
withMediaHandlerSettings(t)
settings.Config.Integrations.Media.Transcode.Enabled = false
disabled := settings.CurrentMediaSettings()
disabled.Transcode.Enabled = false
settings.ApplyMediaSettings(disabled)
transcode := objectField(t, callMediaGet(t, false), "transcode")
if enabled, ok := transcode["enabled"].(bool); !ok || enabled {
+27 -17
View File
@@ -13,21 +13,31 @@ import (
const settingsRedactSentinel = "SENTINEL-SETTINGS-SECRET"
func swapSettingsConfigForTest(t *testing.T, mutate func(*settings.Settings)) {
t.Helper()
cfg := settings.Config
if mutate != nil {
mutate(&cfg)
}
prev := settings.SwapConfigForTest(cfg)
t.Cleanup(func() { settings.SwapConfigForTest(prev) })
}
// TestSettingsGetHandler_redactsSecrets is the end-to-end regression guard for
// GHSA-892f-9h5p-mfc8: GET /api/settings (and ?property=auth) must not return cleartext secrets.
func TestSettingsGetHandler_redactsSecrets(t *testing.T) {
setupTestEnv(t)
prev := settings.Config
t.Cleanup(func() { settings.Config = prev })
settings.Config.Auth.Key = settingsRedactSentinel
settings.Config.Auth.TotpSecret = settingsRedactSentinel
settings.Config.Auth.Methods.PasswordAuth.AdminPassword = settingsRedactSentinel
settings.Config.Auth.Methods.PasswordAuth.Recaptcha.Secret = settingsRedactSentinel
settings.Config.Auth.Methods.OidcAuth.ClientSecret = settingsRedactSentinel
settings.Config.Auth.Methods.LdapAuth.UserPassword = settingsRedactSentinel
settings.Config.Auth.Methods.JwtAuth.Secret = settingsRedactSentinel
settings.Config.Integrations.OnlyOffice.Secret = settingsRedactSentinel
swapSettingsConfigForTest(t, func(cfg *settings.Settings) {
cfg.Auth.Key = settingsRedactSentinel
cfg.Auth.TotpSecret = settingsRedactSentinel
cfg.Auth.Methods.PasswordAuth.AdminPassword = settingsRedactSentinel
cfg.Auth.Methods.PasswordAuth.Recaptcha.Secret = settingsRedactSentinel
cfg.Auth.Methods.OidcAuth.ClientSecret = settingsRedactSentinel
cfg.Auth.Methods.LdapAuth.UserPassword = settingsRedactSentinel
cfg.Auth.Methods.JwtAuth.Secret = settingsRedactSentinel
cfg.Integrations.OnlyOffice.Secret = settingsRedactSentinel
})
admin := &users.User{
FrontendUser: users.FrontendUser{
@@ -62,9 +72,9 @@ func TestSettingsGetHandler_redactsSecrets(t *testing.T) {
func TestSettingsGetHandler_doesNotMutateLiveConfig(t *testing.T) {
setupTestEnv(t)
prev := settings.Config
t.Cleanup(func() { settings.Config = prev })
settings.Config.Auth.Key = settingsRedactSentinel
swapSettingsConfigForTest(t, func(cfg *settings.Settings) {
cfg.Auth.Key = settingsRedactSentinel
})
admin := &users.User{
FrontendUser: users.FrontendUser{
@@ -92,10 +102,10 @@ func TestSettingsGetHandler_doesNotMutateLiveConfig(t *testing.T) {
func TestSettingsGetHandler_keepsNonSecretAuthFields(t *testing.T) {
setupTestEnv(t)
prev := settings.Config
t.Cleanup(func() { settings.Config = prev })
settings.Config.Auth.Key = settingsRedactSentinel
settings.Config.Auth.TokenExpirationHours = 7
swapSettingsConfigForTest(t, func(cfg *settings.Settings) {
cfg.Auth.Key = settingsRedactSentinel
cfg.Auth.TokenExpirationHours = 7
})
admin := &users.User{
FrontendUser: users.FrontendUser{
+2
View File
@@ -804,6 +804,7 @@ async function downloadChunked(file, shareHash = "") {
* @param {((percent: number) => void) | undefined} [onupload]
* @param {Record<string, string | number>} [headers]
* @param {boolean} [isDir]
* @param {(() => void) | undefined} [onsent]
* @returns {Promise<any> & { xhr?: XMLHttpRequest | null, abort?: () => void }}
*/
export function post(
@@ -1431,6 +1432,7 @@ export function getTextPreviewURLPublic(path, viewToken = state.req?.viewToken)
* @param {((percent: number) => void) | undefined} [onupload]
* @param {Record<string, string | number>} [headers]
* @param {boolean} [isDir]
* @param {(() => void) | undefined} [onsent]
* @returns {Promise<any> & { xhr?: XMLHttpRequest | null, abort?: () => void }}
*/
export function postPublic(
@@ -1,75 +0,0 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const { store } = vi.hoisted(() => ({ store: { tool: null, showSelectMultiple: false, mobile: false } }));
vi.mock("@/store", () => ({
state: {
get user() {
return { showSelectMultiple: store.showSelectMultiple };
},
},
mutations: {},
getters: {
currentTool: () => store.tool,
isMobile: () => store.mobile,
},
}));
vi.mock("@/api", () => ({ resourcesApi: {}, shareApi: {}, usersApi: {} }));
vi.mock("@/components/Action.vue", () => ({ default: { render: () => null } }));
vi.mock("@/notify", () => ({ notify: {} }));
vi.mock("@/utils/tooltipHelp.js", () => ({ hideInteractiveTooltip: vi.fn(), showHoverTooltip: vi.fn() }));
vi.mock("@/utils", () => ({ url: {} }));
vi.mock("@/utils/clipboard", () => ({ copyToClipboard: vi.fn() }));
vi.mock("@/utils/constants.js", () => ({ globalVars: {} }));
vi.mock("@/utils/download", () => ({ default: vi.fn() }));
vi.mock("@/utils/nativeShare", () => ({ canNativeShare: vi.fn(), nativeShareFile: vi.fn() }));
vi.mock("@/utils/mimetype", () => ({ isRichTextPreviewMimeType: vi.fn(), getTypeInfoFromExt: vi.fn() }));
vi.mock("@/utils/mediaFile", () => ({ isMediaRequest: vi.fn() }));
vi.mock("@/utils/expandTransition", () => ({ expandBeforeEnter: vi.fn(), expandEnter: vi.fn(), expandLeave: vi.fn() }));
import ContextMenu from "./ContextMenu.vue";
const { computed } = ContextMenu;
const inAdvancedSearch = () => computed.isAdvancedSearch.call({});
describe("ContextMenu in advanced search", () => {
beforeEach(() => {
store.tool = null;
store.showSelectMultiple = false;
store.mobile = false;
});
it("detects the advanced search tool", () => {
expect(inAdvancedSearch()).toBe(false);
store.tool = { component: "DuplicateFinder" };
expect(inAdvancedSearch()).toBe(false);
store.tool = { component: "AdvancedSearch" };
expect(inAdvancedSearch()).toBe(true);
});
it("offers Select multiple on desktop even when the user preference is off", () => {
const menu = (isAdvancedSearch) => ({ showLimitedOptions: false, isMultiple: false, isSearchActive: false, isAdvancedSearch });
expect(computed.showSelectMultiple.call(menu(false))).toBe(false);
expect(computed.showSelectMultiple.call(menu(true))).toBe(true);
});
it("doesn't offer Select multiple once multiple mode is on", () => {
expect(
computed.showSelectMultiple.call({ showLimitedOptions: false, isMultiple: true, isSearchActive: false, isAdvancedSearch: true }),
).toBe(false);
});
it("hides the create (+) toggle, since results have no single folder to create in", () => {
const toggle = (isAdvancedSearch) =>
computed.showCreateToggle.call({ showLimitedOptions: false, createOnly: false, isSearchActive: false, isAdvancedSearch });
expect(toggle(false)).toBe(true);
expect(toggle(true)).toBe(false);
});
it("hides Share when nothing is selected, since the results listing has no folder to share", () => {
const share = (isAdvancedSearch, selectedCount) =>
computed.showShareAction.call({ showLimitedOptions: false, isAdvancedSearch, selectedCount, showShare: true });
expect(share(true, 0)).toBe(false);
expect(share(true, 1)).toBe(true);
expect(share(true, 2)).toBe(false);
expect(share(false, 0)).toBe(true);
});
});
@@ -1,55 +0,0 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const { store } = vi.hoisted(() => ({
store: { share: false, creatable: [], user: { scopes: [{ name: "data" }, { name: "inbox" }] } },
}));
vi.mock("@/store", () => ({
state: { get user() { return store.user; } },
mutations: {},
getters: {
isShare: () => store.share,
canCreateInSource: (source) => store.creatable.includes(source),
},
}));
vi.mock("@/api", () => ({ resourcesApi: {}, shareApi: {}, usersApi: {} }));
vi.mock("@/components/Action.vue", () => ({ default: { render: () => null } }));
vi.mock("@/notify", () => ({ notify: {} }));
vi.mock("@/utils/tooltipHelp.js", () => ({ hideInteractiveTooltip: vi.fn(), showHoverTooltip: vi.fn() }));
vi.mock("@/utils", () => ({ url: {} }));
vi.mock("@/utils/clipboard", () => ({ copyToClipboard: vi.fn() }));
vi.mock("@/utils/constants.js", () => ({ globalVars: {} }));
vi.mock("@/utils/download", () => ({ default: vi.fn() }));
vi.mock("@/utils/nativeShare", () => ({ canNativeShare: vi.fn(), nativeShareFile: vi.fn() }));
vi.mock("@/utils/mimetype", () => ({ isRichTextPreviewMimeType: vi.fn(), getTypeInfoFromExt: vi.fn() }));
vi.mock("@/utils/mediaFile", () => ({ isMediaRequest: vi.fn() }));
vi.mock("@/utils/expandTransition", () => ({ expandBeforeEnter: vi.fn(), expandEnter: vi.fn(), expandLeave: vi.fn() }));
import ContextMenu from "./ContextMenu.vue";
const showCopy = (permissions) =>
ContextMenu.computed.showCopy.call({ showLimitedOptions: false, showCreate: false, selectedCount: 1, permissions });
describe("ContextMenu Copy", () => {
beforeEach(() => {
store.share = false;
store.creatable = ["inbox"];
});
it("is offered in a read-only source, since copying only reads it", () => {
expect(showCopy({ download: true, modify: false })).toBe(true);
});
it("is hidden when no source accepts the copy", () => {
store.creatable = [];
expect(showCopy({ download: true, modify: false })).toBe(false);
});
it("is hidden without download", () => {
expect(showCopy({ download: false, modify: true })).toBe(false);
});
it("in a share, still requires modify, which the server checks for every change", () => {
store.share = true;
expect(showCopy({ download: true, modify: false })).toBe(false);
expect(showCopy({ download: true, modify: true })).toBe(true);
});
});
@@ -1,112 +0,0 @@
import { createApp, h, nextTick } from "vue";
import { afterEach, describe, expect, it, vi } from "vitest";
const { fetchFiles, state } = vi.hoisted(() => ({
fetchFiles: vi.fn(),
state: { req: {}, prompts: [], selected: [], sources: { info: { data: {} } } },
}));
vi.mock("@/api", () => ({ resourcesApi: { fetchFiles } }));
vi.mock("@/store", () => ({
state,
mutations: {},
getters: {
isShare: () => false,
isMobile: () => false,
currentPromptName: () => null,
pickerSorting: () => ({ by: "name", asc: true }),
},
}));
vi.mock("@/utils", async () => {
const { removeLastDir } = await import("@/utils/url.js");
return { url: { removeLastDir } };
});
vi.mock("@/router/index.ts", () => ({ router: {} }));
vi.mock("@/components/files/ListingHeader.vue", () => ({ default: { render: () => null } }));
vi.mock("@/components/files/ListingItem.vue", () => ({
default: {
props: ["name"],
render() {
return h("button", {}, this.name);
},
},
}));
import FileList from "./FileList.vue";
let app, root;
const selection = vi.fn();
function mount(items = [], path = "/child/") {
state.req = { source: "data", path, items };
root = document.createElement("div");
document.body.append(root);
app = createApp(FileList, { hidePathChrome: true, "onUpdate:selected": selection });
app.config.globalProperties.$t = (key) => key;
app.mount(root);
}
function row(name) {
return Array.from(root.querySelectorAll("button")).find((button) => button.textContent === name);
}
afterEach(() => {
app?.unmount();
root?.remove();
fetchFiles.mockReset();
selection.mockReset();
});
describe("file picker parent navigation", () => {
it("loads the parent and shows sibling folders after one click on '..'", async () => {
mount();
fetchFiles.mockResolvedValue({
source: "data",
items: [{ name: "sibling", path: "/sibling/", type: "directory" }],
});
await nextTick();
row("..").click();
expect(selection).toHaveBeenLastCalledWith(expect.objectContaining({ path: "/", source: "data" }));
expect(fetchFiles).toHaveBeenCalledExactlyOnceWith("data", "/");
await vi.waitFor(() => expect(row("sibling")).toBeDefined());
});
it("keeps single-click selection and double-click navigation for ordinary folders", async () => {
mount([{ name: "nested", path: "/child/nested/", type: "directory" }]);
fetchFiles.mockResolvedValue({ source: "data", items: [] });
await nextTick();
row("nested").click();
expect(fetchFiles).not.toHaveBeenCalled();
row("nested").dispatchEvent(new MouseEvent("dblclick", { bubbles: true }));
expect(fetchFiles).toHaveBeenCalledExactlyOnceWith("data", "/child/nested/");
});
it("does not fetch the parent again when the same row receives a double-click", async () => {
mount();
fetchFiles.mockResolvedValue({ source: "data", items: [] });
await nextTick();
const parent = row("..");
parent.click();
parent.click();
parent.dispatchEvent(new MouseEvent("dblclick", { bubbles: true }));
expect(fetchFiles).toHaveBeenCalledExactlyOnceWith("data", "/");
});
it("ignores the rest of a double-click on a replacement parent row", async () => {
mount([], "/parent/child/");
fetchFiles.mockResolvedValue({ source: "data", items: [] });
await nextTick();
const firstParent = row("..");
firstParent.dispatchEvent(new MouseEvent("click", { bubbles: true, detail: 1 }));
await vi.waitFor(() => {
expect(row("..")).toBeDefined();
expect(row("..")).not.toBe(firstParent);
});
const nextParent = row("..");
nextParent.dispatchEvent(new MouseEvent("click", { bubbles: true, detail: 2 }));
nextParent.dispatchEvent(new MouseEvent("dblclick", { bubbles: true, detail: 2 }));
expect(fetchFiles).toHaveBeenCalledExactlyOnceWith("data", "/parent/");
nextParent.dispatchEvent(new MouseEvent("click", { bubbles: true, detail: 1 }));
expect(fetchFiles).toHaveBeenLastCalledWith("data", "/");
expect(fetchFiles).toHaveBeenCalledTimes(2);
});
});
@@ -1,23 +0,0 @@
import { afterEach, describe, expect, it, vi } from "vitest";
vi.mock("@/utils/auth", () => ({ logout: vi.fn() }));
vi.mock("@/utils/constants", () => ({ globalVars: {} }));
vi.mock("@/store", () => ({ state: {}, getters: {}, mutations: {} }));
vi.mock("@/utils/tooltipHelp.js", () => ({ hideInteractiveTooltip: vi.fn(), showHoverTooltip: vi.fn() }));
vi.mock("./Links.vue", () => ({ default: { render: () => null } }));
vi.mock("@/utils", () => ({ url: {} }));
import General from "./General.vue";
describe("sidebar File actions leave transition", () => {
afterEach(() => vi.useRealTimers());
it("finishes even when no transitionend ever fires", () => {
vi.useFakeTimers();
const el = document.createElement("div");
const done = vi.fn();
General.methods.leave(el, done);
expect(done).not.toHaveBeenCalled();
vi.advanceTimersByTime(200);
expect(done).toHaveBeenCalledOnce();
});
});
@@ -0,0 +1,106 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const { store, mutations } = vi.hoisted(() => ({
store: {
share: false,
current: "inbox",
permissions: {
data: { view: true, download: true, modify: false, create: false, delete: false },
inbox: { view: true, download: true, modify: true, create: true, delete: true },
share: { view: true, download: true, modify: false, create: true, delete: false },
},
},
mutations: { showPrompt: vi.fn() },
}));
vi.mock("@/store", () => ({
state: {
get req() {
return { path: "/", source: store.current, items: [] };
},
get route() {
return { path: "/other" };
},
get shareInfo() {
return store.share ? { hash: "h" } : null;
},
},
mutations,
getters: {
isShare: () => store.share,
sourcePermissions: (source?: string) =>
store.permissions[(source ?? store.current) as keyof typeof store.permissions],
},
}));
vi.mock("@/utils/download", () => ({ default: vi.fn() }));
vi.mock("@/api", () => ({
resourcesApi: {
moveCopy: vi.fn().mockResolvedValue(undefined),
moveCopyPublic: vi.fn().mockResolvedValue(undefined),
},
}));
vi.mock("@/router", () => ({ router: {} }));
vi.mock("@/utils/upload.ts", () => ({ checkConflict: vi.fn(() => false) }));
vi.mock("@/utils/appNotifications.js", () => ({ notifyMoveCopyFailure: vi.fn() }));
import {
useListingClipboard,
__setClipboardForTest,
__resetClipboardForTest,
} from "./useListingClipboard.ts";
describe("useListingClipboard internal paste permissions", () => {
beforeEach(() => {
vi.clearAllMocks();
store.share = false;
store.current = "inbox";
__resetClipboardForTest();
});
const { handleInternalPaste } = useListingClipboard();
it("pastes a copy out of a read-only source into a writable one", async () => {
__setClipboardForTest({
key: "c",
path: "/src",
items: [{ from: "/a.txt", fromSource: "data", name: "a.txt", isDir: false }],
});
await handleInternalPaste();
expect(mutations.showPrompt).toHaveBeenCalledOnce();
});
it("refuses a cut out of a source that cannot modify", async () => {
__setClipboardForTest({
key: "x",
path: "/src",
items: [{ from: "/a.txt", fromSource: "data", name: "a.txt", isDir: false }],
});
await handleInternalPaste();
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
it("refuses any paste into a source that cannot create", async () => {
store.current = "data";
__setClipboardForTest({
key: "c",
path: "/src",
items: [{ from: "/a.txt", fromSource: "inbox", name: "a.txt", isDir: false }],
});
await handleInternalPaste();
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
it("in a share, requires modify even for a copy", async () => {
store.share = true;
store.permissions.share.modify = false;
store.permissions.share.create = true;
store.current = "share";
__setClipboardForTest({
key: "c",
path: "/src",
items: [{ from: "/a.txt", fromSource: "share", name: "a.txt", isDir: false }],
});
await handleInternalPaste();
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
});
@@ -149,3 +149,15 @@ async function handleInternalPaste() {
export function useListingClipboard() {
return { copyCut, handleInternalPaste, hasInternalItems, isInternalRecent };
}
/** @internal tests only */
export function __resetClipboardForTest() {
clipboard = { items: [] };
internalClipboardTimestamp = 0;
}
/** @internal tests only */
export function __setClipboardForTest(next: InternalClipboard) {
clipboard = { ...next, items: [...next.items] };
internalClipboardTimestamp = Date.now();
}
+687 -687
View File
File diff suppressed because it is too large. Load diff
+167 -167
View File
@@ -39,6 +39,7 @@
"permanent": "Постоянен{suffix}",
"hash": "Хеш{suffix}",
"of": "от{suffix}",
"source": "{prefix}Източник{suffix}",
"percentage": "{percentage}%",
"type": "Тип{suffix}",
"size": "Размер{suffix}",
@@ -48,6 +49,7 @@
"logout": "Изход{suffix}",
"preview": "Преглед{suffix}",
"settings": "Настройки{suffix}",
"sources": "{prefix}Източници{suffix}",
"links": "Връзки{suffix}",
"tool": "Инструмент{suffix}",
"status": "Статус{suffix}",
@@ -75,8 +77,10 @@
"navigation": "Навигация{suffix}",
"loading": "Зареждане{suffix}",
"add": "Добавяне{suffix}",
"back": "Назад{suffix}",
"stay": "Остани{suffix}",
"cancel": "Отказ{suffix}",
"default": "По подразбиране{suffix}",
"change": "Промяна{suffix}",
"verify": "Потвърждаване{suffix}",
"close": "Затваряне{suffix}",
@@ -108,6 +112,11 @@
"pause": "Пауза{suffix}",
"resume": "Възобновяване{suffix}",
"retry": "Повторен опит{suffix}",
"transcode": "Транскодиране{suffix}",
"off": "Изключено{suffix}",
"quality": "Качество{suffix}",
"balanced": "Балансиран{suffix}",
"dataSaver": "Икономия на данни{suffix}",
"disable": "Изключване{suffix}",
"confirm": "Потвърждаване{suffix}",
"uploading": "Качване{suffix}",
@@ -133,6 +142,10 @@
"actions": "Действия{suffix}",
"enabled": "Включен{suffix}",
"disabled": "Изключен{suffix}",
"limit": "Лимит{suffix}",
"remove": "Премахни{suffix}",
"saved": "Запазено{suffix}",
"removed": "Премахнато{suffix}",
"permissions": "Права{suffix}",
"management": "Управление{suffix}",
"profile": "Профил{suffix}",
@@ -151,6 +164,7 @@
"shareManagement": "Управление на споделяния",
"shareHash": "Хеш на споделяне",
"downloadFiles": "Изтегляне на файлове",
"viewFiles": "Преглед и списък на файловете",
"editFiles": "Редактиране на файлове",
"createFiles": "Създаване на файлове",
"deleteFiles": "Изтриване на файлове",
@@ -164,28 +178,14 @@
"clearSelection": "Изчистване на избора",
"interval": "Интервал{suffix}",
"none": "Няма",
"viewFiles": "Преглед и списък на файловете",
"source": "{prefix}Източник{suffix}",
"sources": "{prefix}Източници{suffix}",
"enforce": "Прилагане{suffix}",
"limit": "Лимит{suffix}",
"remove": "Премахни{suffix}",
"saved": "Запазено{suffix}",
"removed": "Премахнато{suffix}",
"back": "Назад{suffix}",
"media": "Медии",
"unknown": "Неизвестен",
"simple": "Прост",
"normal": "Нормален",
"complex": "Сложен",
"access": "Достъп",
"groups": "Групи",
"transcode": "Транскодиране{suffix}",
"off": "Изключено{suffix}",
"quality": "Качество{suffix}",
"balanced": "Балансиран{suffix}",
"dataSaver": "Икономия на данни{suffix}",
"media": "Медии",
"default": "По подразбиране{suffix}"
"groups": "Групи"
},
"buttons": {
"copySuccess": "Копирано в клипборда!",
@@ -231,8 +231,6 @@
"requestTimedOut": "Изтече времето за изчакване на заявката. Проверете настройките на мрежата си или на обратния прокси сървър."
},
"files": {
"sortByCreationTime": "Сортиране по време на създаване",
"creationTime": "Време на създаване",
"emptyFile": "Празен файл",
"lastModified": "Последна промяна{suffix}",
"duration": "Продължителност{suffix}",
@@ -243,15 +241,17 @@
"sortBySize": "Сортиране по размер",
"sortByType": "Сортиране по тип",
"sortByDuration": "Сортиране по продължителност",
"sortByCreationTime": "Сортиране по време на създаване",
"creationTime": "Време на създаване",
"noPreview": "Преглед не е наличен за този файл.",
"mobilePdfPreviewHint": "Вашият браузър не може да покаже този PDF файл в прегледа на приложението.",
"noDownloadAccess": "Изтегляне не е налично.",
"newFile": "Нов файл{suffix}",
"newFolder": "Нова папка{suffix}",
"sameFolder": "Не може да се премести в същата папка",
"cannotAccesDir": "Няма достъп до папката",
"newFolderMessage": "Напишете името на новата папка.",
"newFolderSuccess": "Папката беше създадена успешно!",
"mobilePdfPreviewHint": "Вашият браузър не може да покаже този PDF файл в прегледа на приложението."
"newFolderSuccess": "Папката беше създадена успешно!"
},
"help": {
"functionKeys": "Функционални клавиши",
@@ -344,6 +344,26 @@
"requirePasswordChangeSuccess": "Паролата е актуализирана. Вече сте влезли в системата.",
"requirePasswordChangeMustDiffer": "Новата парола трябва да е различна от настоящата ви парола"
},
"quotas": {
"title": "Квота за съхранение",
"openDescription": "Отворете диалоговия прозорец за квотата за съхранение на тази папка.",
"folderDescription": "Ограничаване на капацитета за съхранение на тази папка.",
"shareLimit": "Ограничаване на капацитета за съхранение чрез този ресурс",
"shareLimitDescription": "Отчита качванията през този линк. Това се отразява и на квотата на собственика.",
"scopeLimit": "Ограничение за съхранение за този източник",
"scopeLimitDescription": "Капацитет за съхранение за заданието на този потребител по този източник.",
"indexingDisabledMeterHint": "Индексирането е деактивирано за този източник. Достъпна е само статистиката за използване.",
"meterIndexHint": "Използва общия размер на индексираните файлове в тази папка. Включва промените, направени извън FileBrowser при актуализиране на индекса.",
"meterAccountedHint": "Отчита само качвания, запазвания и изтривания, извършени чрез FileBrowser.",
"meterIndexScope": "Индексиран размер",
"meterAccounted": "Проследяване на използването",
"usageCounting": "Преброяване на употребата по",
"usageSyncPending": "Данните за използването все още се синхронизират с индекса.",
"accountedFallback": "Индексираните данни все още не са готови; докато индексът не бъде наличен, се използва информация за проследяване на използването.",
"errors": {
"exceeded": "Превишена квота за съхранение"
}
},
"share": {
"notice": "Забележка: когато споделянето е създадено, то става по-достъпно за обществеността и има различни правила за достъп. Ако вашето споделяне не е сигурно конфигурирано, всеки може да получи достъп до него.",
"readOnlySourceNotice": "Този източник е само за четене. Споделянията за качване и разрешенията за промяна на файлове са изключени.",
@@ -394,6 +414,8 @@
"disableLoginOption": "Скриване на опцията за вход",
"disableLoginOptionDescription": "Скрива бутона за вход в страничната лента за анонимни потребители. Когато е включено, анонимните потребители няма да виждат опцията за вписване.",
"customizeSidebarLinksButton": "Персонализиране на връзките",
"shareDefaults": "Настройки по подразбиране за споделяне",
"shareDefaultsDescription": "Конфигурирайте опциите по подразбиране за нови споделени ресурси и наложете правилата за потребители, които не са администратори.",
"browseFiles": "Разглеждане на файлове",
"selectBannerImage": "Избор на изображение за банер",
"selectFaviconImage": "Избор на изображение за фавикон",
@@ -410,9 +432,7 @@
"shareInfo": "QR код и информация за споделянето",
"shareInfoDescription": "Този линк показва информацията за споделянето, включително заглавие, описание, банер и QR код в изскачащ прозорец.",
"downloadDescription": "Този линк позволява изтегляне на цялото съдържание на споделянето като компресиран файл.",
"deleteFailed": "Неуспешно изтриване на споделяне",
"shareDefaults": "Настройки по подразбиране за споделяне",
"shareDefaultsDescription": "Конфигурирайте опциите по подразбиране за нови споделени ресурси и наложете правилата за потребители, които не са администратори."
"deleteFailed": "Неуспешно изтриване на споделяне"
},
"prompts": {
"mediaInfo": "Информация за медията",
@@ -548,18 +568,19 @@
"openInAdvancedSearch": "Отваряне в разширено търсене"
},
"profileSettings": {
"showTypeColumn": "Показване на колоната Тип",
"showTypeColumnDescription": "Показване на колоната Тип в изглед списък и компактен изглед в основния списък.",
"showCreationDateColumn": "Показване на колоната Дата на създаване",
"showCreationDateColumnDescription": "Показване на колоната Дата на създаване в изглед списък и компактен изглед в основния списък.",
"promptRightCloseButton": "Показване на бутона за затваряне на прозорците вдясно",
"promptRightCloseButtonDescription": "Показване на бутона за затваряне на прозорците от дясната страна вместо от лявата",
"enforcedByAdmin": "Вашият администратор е ограничил възможността на потребителите да променят това свойство",
"hideFileExt": "Скриване на определени файлове (по разширение)",
"hideFileExtDescription": "Списък на файлови разширения, разделени с интервали. Разширенията в това поле ще бъдат скрити от целия потребителски интерфейс (визуално, като в списъка или FileTree) -- Файловете все още са достъпни.",
"preferEditorForMarkdown": "Предпочитане на редактор за Markdown файлове",
"preferEditorForMarkdownDescription": "Когато е включено, отваряйте Markdown файловете в редактора вместо в прегледача на Markdown.",
"deleteAfterArchive": "Изтриване на изходните файлове след създаване/извличане на архиви",
"deleteAfterArchiveDescription": "Когато е включено, ще изтрие изходните файлове след успешно създаване/извличане на архиви.",
"defaultViewMode": "Режим на изглед по подразбиране",
"defaultViewModeDescription": "Режим на първоначално показване в нови браузъри или устройства. Не отменя вече запазените локално настройки за показване.",
"defaultGallerySize": "Стандартен размер на миниатюрите",
"defaultGallerySizeDescription": "Начален мащаб на миниатюрите в галерията или списъка (1–9) при нови браузъри или устройства. Не отменя размерите, които вече са запазени локално.",
"hideFilesInTree": "Скриване на файлове в дървовидната навигация",
"hideFilesInTreeDescription": "Когато е включено, само папки се показват в дървовидната навигация на страничната лента.",
"previewFolderDescription": "Показване на миниатюри за папки с първия елемент като корица -- или няколко елемента, ако е включен преглед на движение.",
@@ -570,6 +591,12 @@
"customTheme": "Избор на вашата тема",
"defaultThemeDescription": "по подразбиране - Темата по подразбиране",
"setDateFormat": "Задаване на точен формат на датата",
"singleClick": "Отваряне на файлове с едно кликване",
"stickySidebar": "Залепена странична лента",
"darkMode": "Тъмен режим",
"darkModeSystem": "Според системата",
"darkModeLight": "Светъл",
"darkModeDark": "Тъмен",
"showHiddenFiles": "Показване на скрити файлове",
"showHiddenFilesDescription": "Показване на скрити файлове в списъка (напр. .thumbnails, ProgramData), но те все още са достъпни ръчно, ако са конфигурирани за индексиране.",
"showQuickDownload": "Показване на икона за бързо изтегляне",
@@ -581,6 +608,10 @@
"popupPreviewDescription": "Изскачащ прозорец ще се покаже върху потребителския интерфейс при задържане върху елементи с миниатюри.",
"disableUpdateNotifications": "Изключване на известията за актуализации",
"disableUpdateNotificationsDescription": "Изключва банера за известие за актуализация, който се показва за администраторите в страничната лента.",
"accountOptions": "Опции за профила",
"showAdvancedProfile": "Покажи разширени настройки на профила",
"showAdvancedProfileDescription": "Показване на настройките на профила по категории в страничната лента вместо опростения изглед на профила.",
"disableHideSidebar": "Винаги показвай страничната лента",
"disableHideSidebarDescription": "Когато е включено, страничната лента няма да се скрива автоматично при преглед или редактиране на файлове.",
"autoplayMedia": "Автоматично възпроизвеждане на медийни файлове при преглед",
"autoplayMediaDescription": "Автоматично възпроизвеждане на медийни файлове при преглед. Това ще работи само ако файлът е медиен файл.",
@@ -595,6 +626,10 @@
"showToolsInSidebarDescription": "Винаги показва връзката за инструменти в страничната лента.",
"showCopyPath": "Показване на копиране на път в контекстното меню",
"showCopyPathDescription": "Показва действие за копиране на път в контекстното меню за файлове и папки.",
"showTypeColumn": "Показване на колоната Тип",
"showTypeColumnDescription": "Показване на колоната Тип в изглед списък и компактен изглед в основния списък.",
"showCreationDateColumn": "Показване на колоната Дата на създаване",
"showCreationDateColumnDescription": "Показване на колоната Дата на създаване в изглед списък и компактен изглед в основния списък.",
"deleteWithoutConfirming": "Изтриване на файлове без прозорец за потвърждение",
"deleteWithoutConfirmingDescription": "Изтриване на файлове без прозорец за потвърждение. Това ще работи само ако файлът е медиен файл.",
"previewOfficeDescription": "Показване на миниатюри за офис файлове в изглед списък.",
@@ -620,30 +655,36 @@
"passkeyDeleteFailed": "Неуспешно изтриване на passkey",
"created": "Създаден",
"lastUsed": "Последно използван",
"passkeyDefaultName": "Passkey",
"enforcedByAdmin": "Вашият администратор е ограничил възможността на потребителите да променят това свойство",
"singleClick": "Отваряне на файлове с едно кликване",
"stickySidebar": "Залепена странична лента",
"darkMode": "Тъмен режим",
"darkModeSystem": "Според системата",
"darkModeLight": "Светъл",
"darkModeDark": "Тъмен",
"defaultViewMode": "Режим на изглед по подразбиране",
"defaultViewModeDescription": "Режим на първоначално показване в нови браузъри или устройства. Не отменя вече запазените локално настройки за показване.",
"defaultGallerySize": "Стандартен размер на миниатюрите",
"defaultGallerySizeDescription": "Начален мащаб на миниатюрите в галерията или списъка (1–9) при нови браузъри или устройства. Не отменя размерите, които вече са запазени локално.",
"disableHideSidebar": "Винаги показвай страничната лента",
"showAdvancedProfile": "Покажи разширени настройки на профила",
"showAdvancedProfileDescription": "Показване на настройките на профила по категории в страничната лента вместо опростения изглед на профила.",
"accountOptions": "Опции за профила"
"passkeyDefaultName": "Passkey"
},
"settings": {
"systemAdmin": "Система и администратор",
"configViewer": "Прегледач на конфигурация",
"configViewerShowFull": "Показване на пълната конфигурация",
"configViewerShowComments": "Показване на коментари",
"configViewerOpen": "Преглед на конфигурацията",
"configViewerDescription": "Отворете изглед „само за четене“ на текущата конфигурация на сървъра.",
"userDefaults": "Настройки по подразбиране за потребителя",
"userEditPreferences": "Потребителски настройки",
"userEditTools": "Достъп до инструменти",
"userEditToolsDescription": "Настройте до кои инструменти този потребител има достъп",
"userEditSidebarLinks": "Връзки в страничната лента",
"userDefaultsDescription": "Конфигурирайте настройките по подразбиране, които се прилагат за новите потребители, и политиката, която се налага за всички потребители.",
"editAsYaml": "Редактирай като YAML",
"lockedFromConfig": "Тази настройка по подразбиране е зададена във файла с конфигурацията и не може да бъде променена тук.",
"accountDefaults": "Настройки по подразбиране на акаунта",
"disableUserSettings": "Деактивиране на страницата с потребителските настройки",
"analyticsView": "Преглед на аналитичните данни",
"analyticsViewDescription": "Отворете изглед „само за четене“ на моменталната снимка на аналитичните данни за внедряването, събрана от този сървър.",
"analyticsEnabled": "Изпращане на аналитични данни за внедряването",
"analyticsEnabledDescription": "Аналитиката за внедряване с изрично съгласие ще изпраща анонимна информация към сървърите на разработчиците на FileBrowser Quantum, за да допринесе за подобряването на приложението.",
"analyticsLoadFailed": "Не успяхме да заредим настройките за анализи",
"analyticsUpdateFailed": "Не успях да актуализирам настройките за анализи",
"analyticsPreviewFailed": "Не успяхме да заредим диагностичната информация за анализите",
"enterPassword": "Въведете парола",
"enterPasswordAgain": "Въведете паролата отново",
"passwordRequirementsMatch": "Паролите съвпадат",
"passwordRequirementsMinLength": "Най-малко {min} символа",
"loginMethod": "Метод за вход",
"modifyOtherUser": "Промяна на потребител:",
"modifyOtherUserTitle": "Промяна на потребител: {username}",
@@ -652,44 +693,63 @@
"searchOptions": "Опции за търсене",
"emptyGlobal": "В момента няма глобални конфигурационни опции. Можете да редактирате конфигурационния yaml файл, за да коригирате системните настройки.",
"scopes": "Дефиниране на разрешени източници и обхвата на потребителя в тях",
"scopePath": "Пътят на обхвата",
"userNotAdmin": "Потребителят не е администратор",
"avoidChanges": "също маркирайте 'промяна на парола', за да приложите тази парола",
"lockPassword": "Предотвратяване на промяна на паролата от потребителя",
"requirePasswordChange": "Да се изисква промяна на паролата при следващото влизане",
"permissions": {
"admin": "Администратор",
"api": "Създаване и управление на дълготрайни API токени",
"realtime": "Включване на връзки и актуализации в реално време"
},
"permissionsHelp": "Общите права на достъп за потребителя важат навсякъде, включително за всички източници и споделени ресурси.",
"sourcePermissionsHelp": "Разгънете реда на източника, за да зададете права за преглед, изтегляне, промяна, създаване и изтриване за този източник.",
"sourceAccessDefaultsHelp": "Прилагат се стандартните права за достъп до файлове за изходните файлове и новите потребители. Опцията „Enforce“ фиксира определена стойност за всички потребители, които не са администратори.",
"settingsUpdated": "Настройките бяха обновени успешно!",
"shareDeleted": "Споделянето беше изтрито!",
"userDeleted": "Потребителят беше изтрит!",
"userUpdated": "Потребителят беше обновен!",
"configViewerOpen": "Преглед на конфигурацията",
"configViewerDescription": "Отворете изглед „само за четене“ на текущата конфигурация на сървъра.",
"analyticsView": "Преглед на аналитичните данни",
"analyticsViewDescription": "Отворете изглед „само за четене“ на моменталната снимка на аналитичните данни за внедряването, събрана от този сървър.",
"analyticsEnabled": "Изпращане на аналитични данни за внедряването",
"analyticsEnabledDescription": "Аналитиката за внедряване с изрично съгласие ще изпраща анонимна информация към сървърите на разработчиците на FileBrowser Quantum, за да допринесе за подобряването на приложението.",
"analyticsLoadFailed": "Не успяхме да заредим настройките за анализи",
"analyticsUpdateFailed": "Не успях да актуализирам настройките за анализи",
"analyticsPreviewFailed": "Не успяхме да заредим диагностичната информация за анализите",
"scopePath": "Пътят на обхвата",
"sourcePermissionsHelp": "Разгънете реда на източника, за да зададете права за преглед, изтегляне, промяна, създаване и изтриване за този източник.",
"permissionsHelp": "Общите права на достъп за потребителя важат навсякъде, включително за всички източници и споделени ресурси.",
"userDefaults": "Настройки по подразбиране за потребителя",
"userDefaultsDescription": "Конфигурирайте настройките по подразбиране, които се прилагат за новите потребители, и политиката, която се налага за всички потребители.",
"accountDefaults": "Настройки по подразбиране на акаунта",
"disableUserSettings": "Деактивиране на страницата с потребителските настройки",
"sourceAccessDefaultsHelp": "Прилагат се стандартните права за достъп до файлове за изходните файлове и новите потребители. Опцията „Enforce“ фиксира определена стойност за всички потребители, които не са администратори.",
"editAsYaml": "Редактирай като YAML",
"lockedFromConfig": "Тази настройка по подразбиране е зададена във файла с конфигурацията и не може да бъде променена тук.",
"userEditPreferences": "Потребителски настройки",
"userEditTools": "Достъп до инструменти",
"userEditToolsDescription": "Настройте до кои инструменти този потребител има достъп",
"userEditSidebarLinks": "Връзки в страничната лента",
"passwordRequirementsMatch": "Паролите съвпадат",
"passwordRequirementsMinLength": "Най-малко {min} символа",
"requirePasswordChange": "Да се изисква промяна на паролата при следващото влизане"
"userUpdated": "Потребителят беше обновен!"
},
"media": {
"accelDevice": "Устройство за ускорение",
"accelDeviceDescription": "GPU устройство, използвано за хардуерно ускорена обработка на мултимедия. CPU (софтуер) деактивира хардуерното ускорение.",
"encoderBackend": "Бекенд на енкодера",
"transcodeProfileEncoderBackendHelp": "Бекенд на енкодера за тази настройка; по подразбиране се използва откритият предпочитан бекенд.",
"alwaysUseFfmpeg": "Винаги използвайте ffmpeg",
"alwaysUseFfmpegDescription": "Винаги използвайте ffmpeg за проверка, метаданни, субтитри и миниатюри на видеоклипове. Това ще отнеме повече време, но може да се окаже по-надеждно.",
"alwaysUseOffice": "Винаги използвайте офисния сървър за миниатюри на документи",
"alwaysUseOfficeDescription": "Винаги използвайте офисния сървър за създаване на миниатюри на документи, вместо да ги генерирате динамично. Това ще отнеме повече време, но може да се окаже по-надеждно.",
"debug": "Регистриране на отладочни събития",
"debugDescription": "Изходът от stdout на ffmpeg за интегриране на мултимедията. Предупреждение: генерира голям обем изходни данни.",
"imagePreview": "Формати за предварителен преглед на изображенията",
"videoPreview": "Формати за предварително преглеждане на видеоклипове",
"imageVideoConversionFormats": "Формати за конвертиране на изображения и видео",
"imageVideoConversionFormatsDescription": "Изберете кои формати на изображения и видеоклипове ffmpeg да конвертира за предварителен преглед.",
"updateFailed": "Не успяхме да актуализираме настройките.",
"maxConcurrentTranscodes": "Максимален брой едновременни транскодирания",
"maxConcurrentTranscodesHelp": "Максималният брой едновременни сесии за възпроизвеждане с прекодиране HLS за този потребител.",
"transcode": "Прекодиране",
"transcodeEnabled": "Активиране на транскодирането",
"transcodeEnabledDescription": "Разрешаване на транскодиране по HLS от страна на сървъра за възпроизвеждане след удостоверяване.",
"transcodeSettings": "Настройки за транскодиране",
"transcodeSettingsDescription": "Ограничения за едновременния достъп, дисковият кеш, както и ограниченията за резолюция и битрейт за всеки профил.",
"transcodeMaxConcurrent": "Общ брой едновременни сесии",
"transcodeMaxConcurrentHelp": "Максимален брой едновременни сесии за транскодиране за всички потребители.",
"transcodeMaxConcurrentPerUser": "Ограничение за сесиите на потребител",
"transcodeMaxConcurrentPerUserHelp": "Строго ограничение за броя на едновременните сесии за транскодиране за всеки отделен потребител. Настройките на потребителя не могат да надвишават това ограничение.",
"transcodeCacheMaxSizeMB": "Ограничение на размера на кеша (МБ)",
"transcodeCacheMaxSizeMBHelp": "Максимално дисково пространство за кеша за транскодиране в МБ. 0 означава неограничено.",
"transcodeCacheRetentionH": "Време на съхранение в кеша (часа)",
"transcodeCacheRetentionHHelp": "Колко дълго се съхраняват неактивните поколения на кеша за транскодиране, преди да бъдат изтрити.",
"transcodeProfileEnabled": "Активирано",
"transcodeProfileEnabledDescription": "Покажи тази настройка за качество в менюто на плейъра.",
"transcodeProfileMaxResolution": "Максимална резолюция",
"transcodeProfileMaxResolutionHelp": "Максимална височина на изхода в пиксели. Стойността 0 запазва резолюцията на източника.",
"transcodeProfileAvgBitrate": "Средна скорост на предаване (kbps)",
"transcodeProfileAvgBitrateHelp": "Целева средна скорост на предаване на видеото в kbps. Стойността 0 запазва скоростта на предаване на изходния файл.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled."
},
"time": {
"time": "{prefix}Време{suffix}",
@@ -706,6 +766,7 @@
"dividerNamePlaceholder": "Текст на разделителя (оставете празно за линия)",
"updateIsAvailable": "Налична е актуализация!",
"fileActions": "Действия с файлове",
"switchMode": "Смяна на режима на страничната лента",
"customizeLinks": "Персонализиране на връзките в страничната лента",
"customizeLinksDescription": "Персонализирайте връзките, показани във вашата странична лента. Плъзнете и пуснете за пренареждане.",
"customizeShareLinksDescription": "Персонализирайте връзките, показани в страничната лента за това споделяне. Плъзнете и пуснете за пренареждане.",
@@ -722,6 +783,8 @@
"usageTextDisk": "използване според диска/раздела",
"showIndexedUsage": "Показване на използване според индекса",
"showDiskUsage": "Показване на използване според диска/раздела",
"rootFilesystemOnly": "Ограничаване на използването на дисково пространство до изходната файлова система",
"rootFilesystemOnlyDescription": "Когато тази опция е активирана, се отчита само файловата система, съдържаща изходния път. Когато е деактивирана (по подразбиране), общият обем на диска включва и файловите системи, монтирани под изходния път, като споделените пулове, например набори от данни в ZFS, се отчитат само веднъж.",
"selectSource": "Избор на източник",
"chooseSource": "Изберете източник",
"selectShare": "Избор на споделяне",
@@ -742,10 +805,7 @@
"sidebarLinkDefaultsDescription": "Конфигурирайте връзките по подразбиране и задължителните връзки в страничната лента за всички потребители.",
"sidebarLinkDefaultsHelp": "Това са връзките по подразбиране, които ще бъдат добавени за всички нови потребители. Ако наложите дадена връзка, тя ще бъде добавена за всички потребители и няма да може да бъде премахната от потребители, които не са администратори.",
"sidebarLinkDefaultSourceHelp": "Приложимо е само когато потребителят има достъп до този източник.",
"sidebarLinkDefaultsYamlInvalid": "Невалиден YAML. Проверете формата и опитайте отново.",
"switchMode": "Смяна на режима на страничната лента",
"rootFilesystemOnly": "Ограничаване на използването на дисково пространство до изходната файлова система",
"rootFilesystemOnlyDescription": "Когато тази опция е активирана, се отчита само файловата система, съдържаща изходния път. Когато е деактивирана (по подразбиране), общият обем на диска включва и файловите системи, монтирани под изходния път, като споделените пулове, например набори от данни в ZFS, се отчитат само веднъж."
"sidebarLinkDefaultsYamlInvalid": "Невалиден YAML. Проверете формата и опитайте отново."
},
"api": {
"title": "API токени",
@@ -794,6 +854,25 @@
"passwordRequiredForGeneration": "Вашата парола е необходима за генериране на код за удостоверяване."
},
"access": {
"newGroup": "Нова група",
"editGroup": "Редактиране на група",
"groupName": "Име на групата",
"userGroupsDescription": "Групи, към които принадлежи този потребител",
"groupMembers": "Членове",
"membersCount": "Членове: {count}",
"userGroupsCount": "Групи: {count}",
"groupNameRequired": "Името на групата е задължително.",
"groupNameTooShort": "Group name must be at least {min} characters.",
"groupNameTooLong": "Името на групата трябва да съдържа не повече от {max} символа.",
"groupNameInvalid": "Името на групата не трябва да съдържа контролни символи.",
"groupExists": "Вече съществува група с това име.",
"deleteGroupConfirm": "Да се изтрие ли групата „{name}“? Тя ще бъде премахната и от всички правила за достъп.",
"groupsOidcNote": "Членовете на групи, синхронизирани чрез OIDC, се нулират от доставчика на идентичност при всяко влизане на тези потребители.",
"selectUser": "Изберете потребител",
"selectUsers": "Изберете потребители",
"selectGroup": "Изберете група",
"selectGroups": "Изберете групи",
"refineSearch": "Показват се първите резултати за „ {count} “. Уточнете търсенето си, за да видите още.",
"all": "Забрана на всички",
"rules": "Правила за достъп",
"deny": "Забрана",
@@ -805,26 +884,7 @@
"defaultBehavior": "Действие по подразбиране{suffix}",
"defaultBehaviorDescription": "Това показва какво се случва, когато потребител се опита да получи достъп до път, където няма специфични правила за достъп. 'Разрешаване' означава, че потребителите могат да имат достъп по подразбиране, 'Забрана' означава, че потребителите са блокирани по подразбиране, освен ако не са изрично разрешени.",
"cascadeDelete": "Рекурсивно изтриване",
"cascadeDeleteDescription": "Когато е включено, изтриването на правило за достъп ще го премахне и от всички подпапки. Това ви позволява напълно да премахнете потребител или група от цялото дърво на папките.",
"newGroup": "Нова група",
"editGroup": "Редактиране на група",
"groupName": "Име на групата",
"groupMembers": "Членове",
"deleteGroupConfirm": "Да се изтрие ли групата „{name}“? Тя ще бъде премахната и от всички правила за достъп.",
"groupsOidcNote": "Членовете на групи, синхронизирани чрез OIDC, се нулират от доставчика на идентичност при всяко влизане на тези потребители.",
"userGroupsDescription": "Групи, към които принадлежи този потребител",
"membersCount": "Членове: {count}",
"userGroupsCount": "Групи: {count}",
"groupNameRequired": "Името на групата е задължително.",
"groupNameTooShort": "Group name must be at least {min} characters.",
"groupNameTooLong": "Името на групата трябва да съдържа не повече от {max} символа.",
"groupNameInvalid": "Името на групата не трябва да съдържа контролни символи.",
"groupExists": "Вече съществува група с това име.",
"selectUser": "Изберете потребител",
"selectUsers": "Изберете потребители",
"selectGroup": "Изберете група",
"selectGroups": "Изберете групи",
"refineSearch": "Показват се първите резултати за „ {count} “. Уточнете търсенето си, за да видите още."
"cascadeDeleteDescription": "Когато е включено, изтриването на правило за достъп ще го премахне и от всички подпапки. Това ви позволява напълно да премахнете потребител или група от цялото дърво на папките."
},
"fileLoading": {
"title": "Качвания и изтегляния",
@@ -965,6 +1025,11 @@
"toggleLyrics": "Превключване на текста",
"closePanel": "Затваряне на панела",
"openPanel": "Отваряне на панела",
"transcodeFailed": "Прекодирането се провали",
"transcodeLoading": "Подготовка на транскодиран поток",
"transcodeUnsupportedFormat": "Този видеоформат не се поддържа от вашия браузър.",
"transcodeUserLimitReached": "Достигнат е лимитът за транскодиране. Вече имате активна сесия за транскодиране:",
"transcodeSystemLimitReached": "Достигнат е лимитът за транскодиране на сървъра ({limit} едновременни). Опитайте отново, когато приключи някоя сесия.",
"visualizer": {
"title": "Визуализатор",
"settings": "Настройки на визуализатора",
@@ -987,12 +1052,7 @@
"maxDecibelsDescription": "Най-силното ниво (dBFS), което лентата регистрира",
"showScalesDescription": "Показване на оси и линии на мрежата върху визуализатора",
"showPeaksDescription": "Малки бели индикатори за пикове над всяка лента"
},
"transcodeFailed": "Прекодирането се провали",
"transcodeLoading": "Подготовка на транскодиран поток",
"transcodeUnsupportedFormat": "Този видеоформат не се поддържа от вашия браузър.",
"transcodeUserLimitReached": "Достигнат е лимитът за транскодиране. Вече имате активна сесия за транскодиране:",
"transcodeSystemLimitReached": "Достигнат е лимитът за транскодиране на сървъра ({limit} едновременни). Опитайте отново, когато приключи някоя сесия."
}
},
"fileSizeAnalyzer": {
"title": "Анализатор на размер на файлове",
@@ -1024,6 +1084,10 @@
"tools": {
"title": "Инструменти",
"description": "Помощни програми и инструменти за анализ на вашите файлове",
"toolAccessDefaults": "Настройки по подразбиране за достъп до инструменти",
"toolAccessDefaultsDescription": "Настройте до кои инструменти новите потребители да имат достъп по подразбиране",
"toolAccessDefaultsHelp": "Активирайте инструментите за новите потребители и, ако желаете, наложете ограничения на достъпа, така че потребителите без администраторски права да не могат да ги променят.",
"accessDenied": "Нямате достъп до този инструмент.",
"sizeAnalyzer": {
"name": "Анализатор на размер на файлове",
"description": "Визуализиране на големи файлове и папки с интерактивна дървовидна карта"
@@ -1073,6 +1137,7 @@
"scopeAccess": "Активност на достъп",
"scopeShares": "Активност на споделяния",
"eventBulkDelete": "Групово изтриване",
"eventFileModify": "Промяна на файл",
"eventShareCreate": "Създаване на споделяне",
"eventShareUpdate": "Обновяване на споделяне",
"eventShareDelete": "Изтриване на споделяне",
@@ -1126,14 +1191,9 @@
"shareFilter": "Филтър по споделяне",
"pathGlob": "Модел на път (glob)",
"viewActivity": "Преглед на активност",
"tableColumns": "Колони на таблицата",
"eventFileModify": "Промяна на файл"
"tableColumns": "Колони на таблицата"
},
"toolNotFound": "Инструментът не е намерен",
"toolAccessDefaults": "Настройки по подразбиране за достъп до инструменти",
"toolAccessDefaultsDescription": "Настройте до кои инструменти новите потребители да имат достъп по подразбиране",
"toolAccessDefaultsHelp": "Активирайте инструментите за новите потребители и, ако желаете, наложете ограничения на достъпа, така че потребителите без администраторски права да не могат да ги променят.",
"accessDenied": "Нямате достъп до този инструмент."
"toolNotFound": "Инструментът не е намерен"
},
"notifications": {
"title": "Известия",
@@ -1216,65 +1276,5 @@
},
"pwa": {
"install": "Инсталиране на приложението"
},
"quotas": {
"title": "Квота за съхранение",
"openDescription": "Отворете диалоговия прозорец за квотата за съхранение на тази папка.",
"folderDescription": "Ограничаване на капацитета за съхранение на тази папка.",
"shareLimit": "Ограничаване на капацитета за съхранение чрез този ресурс",
"shareLimitDescription": "Отчита качванията през този линк. Това се отразява и на квотата на собственика.",
"scopeLimit": "Ограничение за съхранение за този източник",
"scopeLimitDescription": "Капацитет за съхранение за заданието на този потребител по този източник.",
"indexingDisabledMeterHint": "Индексирането е деактивирано за този източник. Достъпна е само статистиката за използване.",
"meterIndexHint": "Използва общия размер на индексираните файлове в тази папка. Включва промените, направени извън FileBrowser при актуализиране на индекса.",
"meterAccountedHint": "Отчита само качвания, запазвания и изтривания, извършени чрез FileBrowser.",
"meterIndexScope": "Индексиран размер",
"meterAccounted": "Проследяване на използването",
"usageCounting": "Преброяване на употребата по",
"usageSyncPending": "Данните за използването все още се синхронизират с индекса.",
"accountedFallback": "Индексираните данни все още не са готови; докато индексът не бъде наличен, се използва информация за проследяване на използването.",
"errors": {
"exceeded": "Превишена квота за съхранение"
}
},
"media": {
"debug": "Регистриране на отладочни събития",
"debugDescription": "Изходът от stdout на ffmpeg за интегриране на мултимедията. Предупреждение: генерира голям обем изходни данни.",
"imagePreview": "Формати за предварителен преглед на изображенията",
"videoPreview": "Формати за предварително преглеждане на видеоклипове",
"imageVideoConversionFormats": "Формати за конвертиране на изображения и видео",
"imageVideoConversionFormatsDescription": "Изберете кои формати на изображения и видеоклипове ffmpeg да конвертира за предварителен преглед.",
"updateFailed": "Не успяхме да актуализираме настройките.",
"maxConcurrentTranscodes": "Максимален брой едновременни транскодирания",
"maxConcurrentTranscodesHelp": "Максималният брой едновременни сесии за възпроизвеждане с прекодиране HLS за този потребител.",
"transcode": "Прекодиране",
"transcodeEnabled": "Активиране на транскодирането",
"transcodeEnabledDescription": "Разрешаване на транскодиране по HLS от страна на сървъра за възпроизвеждане след удостоверяване.",
"transcodeSettings": "Настройки за транскодиране",
"transcodeSettingsDescription": "Ограничения за едновременния достъп, дисковият кеш, както и ограниченията за резолюция и битрейт за всеки профил.",
"transcodeMaxConcurrent": "Общ брой едновременни сесии",
"transcodeMaxConcurrentHelp": "Максимален брой едновременни сесии за транскодиране за всички потребители.",
"transcodeMaxConcurrentPerUser": "Ограничение за сесиите на потребител",
"transcodeMaxConcurrentPerUserHelp": "Строго ограничение за броя на едновременните сесии за транскодиране за всеки отделен потребител. Настройките на потребителя не могат да надвишават това ограничение.",
"transcodeCacheMaxSizeMB": "Ограничение на размера на кеша (МБ)",
"transcodeCacheMaxSizeMBHelp": "Максимално дисково пространство за кеша за транскодиране в МБ. 0 означава неограничено.",
"transcodeCacheRetentionH": "Време на съхранение в кеша (часа)",
"transcodeCacheRetentionHHelp": "Колко дълго се съхраняват неактивните поколения на кеша за транскодиране, преди да бъдат изтрити.",
"transcodeProfileEnabled": "Активирано",
"transcodeProfileEnabledDescription": "Покажи тази настройка за качество в менюто на плейъра.",
"transcodeProfileMaxResolution": "Максимална резолюция",
"transcodeProfileMaxResolutionHelp": "Максимална височина на изхода в пиксели. Стойността 0 запазва резолюцията на източника.",
"transcodeProfileAvgBitrate": "Средна скорост на предаване (kbps)",
"transcodeProfileAvgBitrateHelp": "Целева средна скорост на предаване на видеото в kbps. Стойността 0 запазва скоростта на предаване на изходния файл.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled.",
"accelDevice": "Устройство за ускорение",
"accelDeviceDescription": "GPU устройство, използвано за хардуерно ускорена обработка на мултимедия. CPU (софтуер) деактивира хардуерното ускорение.",
"encoderBackend": "Бекенд на енкодера",
"transcodeProfileEncoderBackendHelp": "Бекенд на енкодера за тази настройка; по подразбиране се използва откритият предпочитан бекенд.",
"alwaysUseFfmpeg": "Винаги използвайте ffmpeg",
"alwaysUseFfmpegDescription": "Винаги използвайте ffmpeg за проверка, метаданни, субтитри и миниатюри на видеоклипове. Това ще отнеме повече време, но може да се окаже по-надеждно.",
"alwaysUseOffice": "Винаги използвайте офисния сървър за миниатюри на документи",
"alwaysUseOfficeDescription": "Винаги използвайте офисния сървър за създаване на миниатюри на документи, вместо да ги генерирате динамично. Това ще отнеме повече време, но може да се окаже по-надеждно."
}
}
+758 -694
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+685 -685
View File
File diff suppressed because it is too large. Load diff
+692 -692
View File
File diff suppressed because it is too large. Load diff
+56 -56
View File
@@ -80,6 +80,7 @@
"back": "Atzera{suffix}",
"stay": "Geratu{suffix}",
"cancel": "Utzi{suffix}",
"default": "Lehenetsia{suffix}",
"change": "Aldatu{suffix}",
"verify": "Egiaztatu{suffix}",
"close": "Itxi{suffix}",
@@ -111,6 +112,11 @@
"pause": "Pausatu{suffix}",
"resume": "Jarraitu{suffix}",
"retry": "Saiatu berriro{suffix}",
"transcode": "Bidali transkodetuta{suffix}",
"off": "Itzali{suffix}",
"quality": "Kalitatea{suffix}",
"balanced": "Orekatuta{suffix}",
"dataSaver": "Datu-gordetzailea{suffix}",
"disable": "Desgaitu{suffix}",
"confirm": "Berretsi{suffix}",
"uploading": "Igotzen{suffix}",
@@ -173,19 +179,13 @@
"interval": "Tartea{suffix}",
"none": "Bat ere ez",
"enforce": "Derrigortu{suffix}",
"media": "Komunikabideak",
"unknown": "Ezezaguna",
"simple": "Sinplea",
"normal": "Normala",
"complex": "Konplexua",
"access": "Sarbidea",
"groups": "Taldeak",
"transcode": "Bidali transkodetuta{suffix}",
"off": "Itzali{suffix}",
"quality": "Kalitatea{suffix}",
"balanced": "Orekatuta{suffix}",
"dataSaver": "Datu-gordetzailea{suffix}",
"media": "Komunikabideak",
"default": "Lehenetsia{suffix}"
"groups": "Taldeak"
},
"buttons": {
"copySuccess": "Arbelean kopiatu da!",
@@ -711,6 +711,46 @@
"userDeleted": "Erabiltzailea ezabatu da!",
"userUpdated": "Erabiltzailea eguneratu da!"
},
"media": {
"accelDevice": "Azelerazio-gailua",
"accelDeviceDescription": "GPU gailua hardware bidez azeleratutako multimedia prozesamendurako erabiltzen da. CPUk (softwareak) hardware azelerazioa desgaitzen du.",
"encoderBackend": "Enkodatzaile atzealdea",
"transcodeProfileEncoderBackendHelp": "Aurrezarpen honen enkoder atzeko plana; hautemandako atzeko plan lehenetsira lehenetsita dago.",
"alwaysUseFfmpeg": "Erabili beti ffmpeg",
"alwaysUseFfmpegDescription": "Erabili beti ffmpeg probak egiteko, metadaturako, azpitituluetarako eta bideo-miniaturentzako. Hau motelagoa izango da, baina fidagarriagoa izan daiteke.",
"alwaysUseOffice": "Erabili beti bulegoko zerbitzaria dokumentu-miniaturak sortzeko.",
"alwaysUseOfficeDescription": "Erabili beti bulegoko zerbitzaria dokumentu-miniaturak sortzeko, prozesuan bertan miniaturak sortzearen ordez. Horrek motelagoa izango da, baina fidagarriagoa izan daiteke.",
"debug": "Akatsen erregistroa",
"debugDescription": "Media integrazioarako ffmpeg-en stdout irteera. Oharra: irteera asko sortzen du.",
"imagePreview": "Irudi aurrebistako formatuak",
"videoPreview": "Bideo aurrebista formatuak",
"imageVideoConversionFormats": "Irudi eta bideo bihurketa formatuak",
"imageVideoConversionFormatsDescription": "Aukeratu ffmpeg-ek aurrebistetarako bihur ditzakeen irudi eta bideo formatuak.",
"updateFailed": "Ezarpenak eguneratzeko huts egin da.",
"maxConcurrentTranscodes": "Maximo aldi bereko transkodetzeak",
"maxConcurrentTranscodesHelp": "Erabiltzaile honentzako aldi berean exekutatu daitezkeen HLS transkodetze-erreprodukzio saioen kopuru maximoa.",
"transcode": "Bihurketa",
"transcodeEnabled": "Transkodaketa gaitzea",
"transcodeEnabledDescription": "Baimentu zerbitzari-aldiko HLS transkodaketa erreprodukzio autentifikaturako.",
"transcodeSettings": "Transkodifikazioko ezarpenak",
"transcodeSettingsDescription": "Paralelismo-mugak, disko-cachea eta profil bakoitzeko bereizmen- eta bitrate-mugak.",
"transcodeMaxConcurrent": "Munduko aldi bereko saioak",
"transcodeMaxConcurrentHelp": "Erabiltzaile guztietan zehar aldi berean exekutatzen diren transkodetze saioen kopuru maximoa.",
"transcodeMaxConcurrentPerUser": "Erabiltzaile bakoitzeko saio-muga",
"transcodeMaxConcurrentPerUserHelp": "Erabiltzaile bakar baterako aldi berean exekutatzen diren transkodetze saioetarako muga zorrotza. Erabiltzailearen ezarpenek ezin dute hori gainditu.",
"transcodeCacheMaxSizeMB": "Kaxearen tamaina-muga (MB)",
"transcodeCacheMaxSizeMBHelp": "Transkodetze-cache-rako disko-espazio maximoa MB-tan. 0k mugagabea adierazten du.",
"transcodeCacheRetentionH": "Gordailuaren iraupena (ordu)",
"transcodeCacheRetentionHHelp": "Zenbat denbora gordetzen dira inaktibo dauden transkodaketa-cache-generazioak kanporatu aurretik?",
"transcodeProfileEnabled": "Gaitu",
"transcodeProfileEnabledDescription": "Eman kalitatezko aurrezarpen hau erreproduzitzaile-menuan ikusteko.",
"transcodeProfileMaxResolution": "Maximo bereizmena",
"transcodeProfileMaxResolutionHelp": "Pixeletan irteerako altuera maximoa. 0-k iturburuaren bereizmena mantentzen du.",
"transcodeProfileAvgBitrate": "Batez besteko bitratea (kbps)",
"transcodeProfileAvgBitrateHelp": "Helburu bideoaren batez besteko bitratea kbps-tan. 0-k iturburuaren bitratea mantentzen du.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled."
},
"time": {
"time": "{prefix}Ordua{suffix}",
"minute": "{prefix}minutu{suffix}",
@@ -985,6 +1025,11 @@
"toggleLyrics": "Erakutsi/ezkutatu letra",
"closePanel": "Itxi panela",
"openPanel": "Ireki panela",
"transcodeFailed": "Transkodaketa huts egin du",
"transcodeLoading": "Transkodatutako korrontea prestatzen",
"transcodeUnsupportedFormat": "Bideo-formatua ez dago zure nabigatzailean onartuta.",
"transcodeUserLimitReached": "Transkodetze-muga gainditu da. Dagoeneko transkodetze-saio aktibo bat duzu:",
"transcodeSystemLimitReached": "Zerbitzariaren transkodetze-muga gainditu da ({limit} aldi berean). Saiatu berriro saio bat amaitzean.",
"visualizer": {
"title": "Bistaratzailea",
"settings": "Bistaratzailearen ezarpenak",
@@ -1007,12 +1052,7 @@
"maxDecibelsDescription": "Barrak erregistratzen duen mailarik altuena (dBFS)",
"showScalesDescription": "Erakutsi ardatzak eta sareta-lerroak bistaratzailean",
"showPeaksDescription": "Gailur-adierazle zuri txikiak barra bakoitzaren gainean"
},
"transcodeFailed": "Transkodaketa huts egin du",
"transcodeLoading": "Transkodatutako korrontea prestatzen",
"transcodeUnsupportedFormat": "Bideo-formatua ez dago zure nabigatzailean onartuta.",
"transcodeUserLimitReached": "Transkodetze-muga gainditu da. Dagoeneko transkodetze-saio aktibo bat duzu:",
"transcodeSystemLimitReached": "Zerbitzariaren transkodetze-muga gainditu da ({limit} aldi berean). Saiatu berriro saio bat amaitzean."
}
},
"fileSizeAnalyzer": {
"title": "Fitxategi-tamainen analizatzailea",
@@ -1097,6 +1137,7 @@
"scopeAccess": "Sarbide-jarduera",
"scopeShares": "Partekatze-jarduera",
"eventBulkDelete": "Ezabatze masiboa",
"eventFileModify": "Fitxategia aldatu",
"eventShareCreate": "Partekatzea sortzea",
"eventShareUpdate": "Partekatzea eguneratzea",
"eventShareDelete": "Partekatzea ezabatzea",
@@ -1150,8 +1191,7 @@
"shareFilter": "Partekatze-iragazkia",
"pathGlob": "Bide-eredua (glob)",
"viewActivity": "Ikusi jarduera",
"tableColumns": "Taularen zutabeak",
"eventFileModify": "Fitxategia aldatu"
"tableColumns": "Taularen zutabeak"
},
"toolNotFound": "Ez da tresna aurkitu"
},
@@ -1236,45 +1276,5 @@
},
"pwa": {
"install": "Instalatu aplikazioa"
},
"media": {
"debug": "Akatsen erregistroa",
"debugDescription": "Media integrazioarako ffmpeg-en stdout irteera. Oharra: irteera asko sortzen du.",
"imagePreview": "Irudi aurrebistako formatuak",
"videoPreview": "Bideo aurrebista formatuak",
"imageVideoConversionFormats": "Irudi eta bideo bihurketa formatuak",
"imageVideoConversionFormatsDescription": "Aukeratu ffmpeg-ek aurrebistetarako bihur ditzakeen irudi eta bideo formatuak.",
"updateFailed": "Ezarpenak eguneratzeko huts egin da.",
"maxConcurrentTranscodes": "Maximo aldi bereko transkodetzeak",
"maxConcurrentTranscodesHelp": "Erabiltzaile honentzako aldi berean exekutatu daitezkeen HLS transkodetze-erreprodukzio saioen kopuru maximoa.",
"transcode": "Bihurketa",
"transcodeEnabled": "Transkodaketa gaitzea",
"transcodeEnabledDescription": "Baimentu zerbitzari-aldiko HLS transkodaketa erreprodukzio autentifikaturako.",
"transcodeSettings": "Transkodifikazioko ezarpenak",
"transcodeSettingsDescription": "Paralelismo-mugak, disko-cachea eta profil bakoitzeko bereizmen- eta bitrate-mugak.",
"transcodeMaxConcurrent": "Munduko aldi bereko saioak",
"transcodeMaxConcurrentHelp": "Erabiltzaile guztietan zehar aldi berean exekutatzen diren transkodetze saioen kopuru maximoa.",
"transcodeMaxConcurrentPerUser": "Erabiltzaile bakoitzeko saio-muga",
"transcodeMaxConcurrentPerUserHelp": "Erabiltzaile bakar baterako aldi berean exekutatzen diren transkodetze saioetarako muga zorrotza. Erabiltzailearen ezarpenek ezin dute hori gainditu.",
"transcodeCacheMaxSizeMB": "Kaxearen tamaina-muga (MB)",
"transcodeCacheMaxSizeMBHelp": "Transkodetze-cache-rako disko-espazio maximoa MB-tan. 0k mugagabea adierazten du.",
"transcodeCacheRetentionH": "Gordailuaren iraupena (ordu)",
"transcodeCacheRetentionHHelp": "Zenbat denbora gordetzen dira inaktibo dauden transkodaketa-cache-generazioak kanporatu aurretik?",
"transcodeProfileEnabled": "Gaitu",
"transcodeProfileEnabledDescription": "Eman kalitatezko aurrezarpen hau erreproduzitzaile-menuan ikusteko.",
"transcodeProfileMaxResolution": "Maximo bereizmena",
"transcodeProfileMaxResolutionHelp": "Pixeletan irteerako altuera maximoa. 0-k iturburuaren bereizmena mantentzen du.",
"transcodeProfileAvgBitrate": "Batez besteko bitratea (kbps)",
"transcodeProfileAvgBitrateHelp": "Helburu bideoaren batez besteko bitratea kbps-tan. 0-k iturburuaren bitratea mantentzen du.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled.",
"accelDevice": "Azelerazio-gailua",
"accelDeviceDescription": "GPU gailua hardware bidez azeleratutako multimedia prozesamendurako erabiltzen da. CPUk (softwareak) hardware azelerazioa desgaitzen du.",
"encoderBackend": "Enkodatzaile atzealdea",
"transcodeProfileEncoderBackendHelp": "Aurrezarpen honen enkoder atzeko plana; hautemandako atzeko plan lehenetsira lehenetsita dago.",
"alwaysUseFfmpeg": "Erabili beti ffmpeg",
"alwaysUseFfmpegDescription": "Erabili beti ffmpeg probak egiteko, metadaturako, azpitituluetarako eta bideo-miniaturentzako. Hau motelagoa izango da, baina fidagarriagoa izan daiteke.",
"alwaysUseOffice": "Erabili beti bulegoko zerbitzaria dokumentu-miniaturak sortzeko.",
"alwaysUseOfficeDescription": "Erabili beti bulegoko zerbitzaria dokumentu-miniaturak sortzeko, prozesuan bertan miniaturak sortzearen ordez. Horrek motelagoa izango da, baina fidagarriagoa izan daiteke."
}
}
+833 -769
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+155 -91
View File
@@ -9,6 +9,8 @@
"noCreateOptions": "Non sono disponibili opzioni di creazione"
},
"general": {
"show": "Mostra",
"hide": "Nascondi",
"import": "Importa",
"export": "Esporta",
"to": "a{suffix}",
@@ -78,6 +80,7 @@
"back": "Indietro{suffix}",
"stay": "Rimani{suffix}",
"cancel": "Annulla{suffix}",
"default": "Predefinito{suffix}",
"change": "Cambia{suffix}",
"verify": "Verifica{suffix}",
"close": "Chiudi{suffix}",
@@ -109,6 +112,11 @@
"pause": "Pausa{suffix}",
"resume": "Riprendi{suffix}",
"retry": "Riprova{suffix}",
"transcode": "Trascodifica{suffix}",
"off": "Spento{suffix}",
"quality": "Qualità{suffix}",
"balanced": "Equilibrato{suffix}",
"dataSaver": "Risparmio dati{suffix}",
"disable": "Disabilita{suffix}",
"confirm": "Conferma{suffix}",
"uploading": "Caricamento in corso{suffix}",
@@ -133,7 +141,7 @@
"created": "Creato{suffix}",
"actions": "Azioni{suffix}",
"enabled": "Abilitato{suffix}",
"disabled": "Disabilitato{suffix}",
"disabled": "Disabile{suffix}",
"limit": "Limite{suffix}",
"remove": "Rimuovi{suffix}",
"saved": "Salvato{suffix}",
@@ -146,38 +154,45 @@
"pinnedFolders": "Cartelle in evidenza",
"pinnedFiles": "File in evidenza",
"selectionSingle": "elemento selezionato",
"selectionMultiple": "elementi selezionati",
"selectionMultiple": "articoli selezionati",
"newUser": "Nuovo utente",
"newFolder": "Nuova cartella",
"profileSettings": "Impostazioni del profilo",
"shareSettings": "Impostazioni condivisione",
"shareSettings": "Condividi le impostazioni",
"globalSettings": "Impostazioni generali",
"userManagement": "Gestione degli utenti",
"shareManagement": "Gestione condivisioni",
"shareHash": "Hash condivisione",
"shareManagement": "Gestione delle azioni",
"shareHash": "Condividi hash",
"downloadFiles": "Scarica i file",
"viewFiles": "Visualizza ed elenca i file",
"editFiles": "Modifica file",
"createFiles": "Crea file",
"deleteFiles": "Elimina i file",
"shareFiles": "Condividi file",
"shareTheme": "Tema condivisione",
"shareTitle": "Titolo condivisione",
"shareTheme": "Condividi il tema",
"shareTitle": "Condividi titolo",
"allUsers": "Tutti gli utenti",
"allSources": "Tutte le fonti",
"allShares": "Tutte le condivisioni",
"allShares": "Tutte le azioni",
"playPause": "Riproduci/Pausa",
"clearSelection": "Deseleziona",
"interval": "Intervallo{suffix}",
"none": "Nessuno",
"enforce": "Applica{suffix}"
"enforce": "Applicare{suffix}",
"media": "Media",
"unknown": "Sconosciuto",
"simple": "Semplice",
"normal": "Normale",
"complex": "Complesso",
"access": "Accesso",
"groups": "Gruppi"
},
"buttons": {
"copySuccess": "Copiato negli appunti!",
"copyFailed": "Copia negli appunti fallita",
"generateNewOtp": "Resetta e genera nuovo codice a due fattori",
"copyFile": "Copia file",
"copyPath": "Copia percorso",
"copyPath": "Percorso di copia",
"copyToClipboard": "Copia negli appunti",
"copyDownloadLinkToClipboard": "Copia link di download negli appunti",
"moveFile": "Sposta file",
@@ -304,10 +319,10 @@
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Rumeno",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "Svedese (Svezia)",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
@@ -334,10 +349,10 @@
"openDescription": "Apri la finestra di dialogo relativa alla quota di spazio di archiviazione per questa cartella.",
"folderDescription": "Limita lo spazio di archiviazione per questa cartella.",
"shareLimit": "Limita lo spazio di archiviazione su questa condivisione",
"shareLimitDescription": "Conta i caricamenti effettuati tramite questo link. Si applica anche alla quota della sorgente del proprietario.",
"scopeLimit": "Limite di archiviazione per questa sorgente",
"scopeLimitDescription": "Limita lo spazio di archiviazione assegnato a questo utente su questa sorgente.",
"indexingDisabledMeterHint": "L'indicizzazione è disabilitata su questa sorgente. È disponibile solo il conteggio dell'utilizzo tracciato.",
"shareLimitDescription": "Conta i caricamenti effettuati tramite questo link. Incide anche sulla quota di origine del proprietario.",
"scopeLimit": "Limite di archiviazione per questa fonte",
"scopeLimitDescription": "Spazio di archiviazione per il compito di questo utente su questa fonte.",
"indexingDisabledMeterHint": "L'indicizzazione è disabilitata per questa fonte. È disponibile solo il monitoraggio dell'utilizzo.",
"meterIndexHint": "Utilizza la dimensione totale dei file indicizzati in questa cartella. Include le modifiche apportate al di fuori di FileBrowser al momento dell'aggiornamento dell'indice.",
"meterAccountedHint": "Conta solo i caricamenti, i salvataggi e le eliminazioni effettuati tramite FileBrowser.",
"meterIndexScope": "Dimensione indicizzata",
@@ -351,7 +366,7 @@
},
"share": {
"notice": "Nota: quando viene creata una condivisione, essa diventa pubblica e segue regole di accesso diverse. Se non configurata correttamente, chiunque potrebbe accedervi.",
"readOnlySourceNotice": "Questa sorgente è di sola lettura. I link di condivisione con caricamento e i permessi che modificano i file sono disabilitati.",
"readOnlySourceNotice": "Questa sorgente è di sola lettura. Le azioni di caricamento e le autorizzazioni che modificano i file sono disabilitate.",
"disableAnonymous": "Disabilita accesso anonimo",
"disableThumbnails": "Disabilita miniature",
"enableAllowedUsernames": "Condividi solo con determinati utenti",
@@ -396,13 +411,11 @@
"uploadShare": "Solo caricamento",
"perUserDownloadLimit": "Applica limite download a ogni utente",
"perUserDownloadLimitDescription": "Se abilitato, il limite di download verrà applicato singolarmente a ogni utente.",
"extractEmbeddedSubtitles": "Estrai sottotitoli incorporati",
"extractEmbeddedSubtitlesDescription": "Estrai i sottotitoli dai file multimediali al caricamento (può essere lento per file grandi).",
"disableLoginOption": "Nascondi opzione di login",
"disableLoginOptionDescription": "Nasconde il pulsante di accesso nella barra laterale per gli utenti anonimi.",
"customizeSidebarLinksButton": "Personalizza Link",
"shareDefaults": "Impostazioni predefinite di condivisione",
"shareDefaultsDescription": "Configura le opzioni predefinite per le nuove condivisioni e applica criteri vincolanti per gli utenti non amministratori.",
"shareDefaultsDescription": "Configurare le opzioni predefinite per le nuove condivisioni e applicare le politiche agli utenti non amministratori.",
"browseFiles": "Sfoglia file",
"selectBannerImage": "Seleziona immagine banner",
"selectFaviconImage": "Seleziona favicon",
@@ -422,6 +435,17 @@
"deleteFailed": "Eliminazione condivisione fallita"
},
"prompts": {
"mediaInfo": "Info multimediali",
"mediaTitle": "Titolo",
"subtitle": "Sottotitolo {n}",
"artist": "Artista",
"album": "Album",
"year": "Anno",
"genre": "Genere",
"track": "Traccia",
"container": "Contenitore",
"videoCodec": "Codec video",
"audioCodec": "Codec audio",
"noTemplate": "Il tuo modello è vuoto!",
"newFileTemplate": "Modello nuovo file",
"newFileTemplateMessage": "Aggiungi qui nuovi nomi di file, verranno utilizzati come modello per la creazione di nuovi file nel menu contestuale!",
@@ -446,23 +470,23 @@
"downloadFailed": "Il download in chunk non è riuscito: se il problema si ripete, provare a ridurre la dimensione del chunk: {message}",
"archive": "Crea archivio",
"archiveMessage": "Crea un archivio sul server dagli elementi selezionati.",
"archiveDestination": "Scegli la cartella di destinazione (poi inserisci il nome dell'archivio in basso):",
"archiveDestination": "Scegli la cartella di destinazione (poi inserisci il nome dell'archivio sotto):",
"archiveName": "Nome archivio (default archive.zip):",
"archiveCompression": "Livello di compressione (0-9):",
"archiveCompression": "Livello compressione (0–9):",
"archiveSuccess": "Archivio creato con successo!",
"unarchive": "Estrai archivio",
"unarchiveMessage": "Scegli dove estrarre l'archivio.",
"unarchiveDestination": "Estrai in:",
"unarchiveSuccess": "Archivio estratto con successo!",
"zipFilenameEncoding": "Codifica dei nomi dei file",
"zipEncodingLoading": "Controllo dei nomi dei file nello ZIP…",
"zipEncodingError": "Impossibile leggere l'anteprima dei nomi dei file dello ZIP.",
"zipEncodingRetry": "Riprova anteprima",
"zipEncodingChoose": "Scegli una codifica",
"zipEncodingSuggested": "consigliata",
"zipEncodingHint": "Verifica i nomi dei file sottostanti prima di estrarre. I suggerimenti potrebbero non essere corretti; i metadati Unicode dello ZIP hanno la precedenza.",
"zipFilenamePreview": "Anteprima nomi dei file",
"zipEncodingUnavailable": "Nessuna codifica supportata può decodificare tutti i nomi dei file in questo ZIP.",
"zipFilenameEncoding": "Filename encoding",
"zipEncodingLoading": "Checking ZIP filenames…",
"zipEncodingError": "Could not read the ZIP filename preview.",
"zipEncodingRetry": "Retry preview",
"zipEncodingChoose": "Choose an encoding",
"zipEncodingSuggested": "suggested",
"zipEncodingHint": "Check the filenames below before extracting. Suggestions may be incorrect; ZIP Unicode metadata takes precedence.",
"zipFilenamePreview": "Filename preview",
"zipEncodingUnavailable": "No supported encoding can decode all filenames in this ZIP.",
"dragAndDrop": "Trascina i file qui",
"error": "Qualcosa è andato storto",
"completed": "Completato",
@@ -476,7 +500,7 @@
"renameMessageConflict": "Un elemento chiamato \"{filename}\" esiste già!",
"renameMessage": "Inserisci un nuovo nome:",
"renameMessageInvalid": "Un file non può contenere \"/\" o \"\\\"",
"renameFailed": "Rinomina non riuscita",
"renameFailed": "Rinomina fallita",
"replaceMessage": "Uno dei file che stai caricando è in conflitto a causa del nome. Vuoi continuare il caricamento o sostituire quello esistente?\n",
"saveBeforeExit": "Modifiche non salvate",
"saveBeforeExitMessage": "Hai modifiche non salvate nell'editor. Cosa vorresti fare?",
@@ -504,7 +528,7 @@
"additionalInfo": "Informazioni aggiuntive",
"hidden": "Nascosto",
"hasPreview": "Ha anteprima",
"checksums": "Checksum",
"checksums": "Checksums",
"hashAlgorithm": "Algoritmo Hash",
"hashValue": "Valore Hash",
"selectHashAlgorithm": "Seleziona un algoritmo hash",
@@ -570,6 +594,9 @@
"singleClick": "Basta un clic per aprire i file",
"stickySidebar": "Barra laterale fissa",
"darkMode": "Modalità scura",
"darkModeSystem": "Segui il sistema",
"darkModeLight": "Chiaro",
"darkModeDark": "Scuro",
"showHiddenFiles": "Mostra file nascosti",
"showHiddenFilesDescription": "Mostra i file che iniziano con un punto o quelli di sistema.",
"showQuickDownload": "Mostra icona download rapido",
@@ -642,15 +669,15 @@
"userEditTools": "Accesso agli strumenti",
"userEditToolsDescription": "Configurare a quali strumenti questo utente può accedere",
"userEditSidebarLinks": "Link nella barra laterale",
"userDefaultsDescription": "Configura le impostazioni predefinite applicate ai nuovi utenti e i criteri applicati a tutti gli utenti.",
"userDefaultsDescription": "Configurare le impostazioni predefinite da applicare ai nuovi utenti e le politiche da far rispettare a tutti gli utenti.",
"editAsYaml": "Modifica come YAML",
"userDefaultFieldLockedFromConfig": "Questa impostazione predefinita è configurata nel file di configurazione e non può essere modificata in questa sede.",
"lockedFromConfig": "Questa impostazione predefinita è configurata nel file di configurazione e non può essere modificata in questa sede.",
"accountDefaults": "Impostazioni predefinite dell'account",
"disableUserSettings": "Disattiva la pagina delle impostazioni utente",
"analyticsView": "Visualizza le statistiche",
"analyticsViewDescription": "Apri una vista in sola lettura dello snapshot delle analisi di distribuzione raccolto da questo server.",
"analyticsEnabled": "Invia i dati analitici relativi alla distribuzione",
"analyticsEnabledDescription": "L'invio facoltativo delle statistiche di utilizzo invierà informazioni anonime ai server degli sviluppatori di FileBrowser Quantum per contribuire a migliorare l'applicazione.",
"analyticsEnabledDescription": "L'analisi dell'implementazione con consenso esplicito invierà informazioni anonime ai server degli sviluppatori di FileBrowser Quantum per contribuire a migliorare l'applicazione.",
"analyticsLoadFailed": "Impossibile caricare le impostazioni di analisi",
"analyticsUpdateFailed": "Impossibile aggiornare le impostazioni di analisi",
"analyticsPreviewFailed": "Impossibile caricare le informazioni diagnostiche relative all'analisi",
@@ -659,17 +686,14 @@
"passwordRequirementsMatch": "Le password corrispondono",
"passwordRequirementsMinLength": "Almeno {min} caratteri",
"loginMethod": "Metodo di accesso",
"loginMethods": {
"password": "Password"
},
"modifyOtherUser": "Modifica utente:",
"modifyOtherUserTitle": "Modifica utente: {username}",
"themeColor": "Colore del tema",
"listingOptions": "Opzioni elenco",
"searchOptions": "Opzioni ricerca",
"emptyGlobal": "Al momento non ci sono opzioni di configurazione globale. Puoi modificare il file yaml per le impostazioni di sistema.",
"scopes": "Definisci le sorgenti consentite e l'ambito di accesso (scope) dell'utente al loro interno",
"scopePath": "Percorso dell'ambito (scope)",
"scopes": "Definisci le sorgenti permesse e l'ambito dell'utente",
"scopePath": "Percorso di copertura",
"userNotAdmin": "L'utente non è un amministratore",
"avoidChanges": "seleziona anche 'Cambia Password' per applicarla",
"lockPassword": "Impedisci all'utente di cambiare la password",
@@ -679,23 +703,63 @@
"api": "Gestione Token API a lunga durata",
"realtime": "Abilita connessioni in tempo reale"
},
"permissionsHelp": "Le autorizzazioni globali per l'utente si applicano ovunque, incluse tutte le sorgenti e le condivisioni.",
"sourcePermissionsHelp": "Espandi la riga di una sorgente per impostare le autorizzazioni di visualizzazione, download, modifica, creazione ed eliminazione per quella specifica sorgente.",
"permissionsHelp": "Le autorizzazioni globali dell'utente si applicano ovunque, comprese tutte le fonti e le condivisioni.",
"sourcePermissionsHelp": "Espandi una riga di origine per impostare le autorizzazioni di visualizzazione, download, modifica, creazione ed eliminazione per quella origine.",
"sourceAccessDefaultsHelp": "Permessi predefiniti applicati ai file sorgente e ai nuovi utenti. L'opzione \"Enforce\" blocca un valore per tutti gli utenti non amministratori.",
"settingsUpdated": "Impostazioni aggiornate!",
"shareDeleted": "Condivisione eliminata!",
"userDeleted": "Utente eliminato!",
"userUpdated": "Utente aggiornato!"
},
"media": {
"accelDevice": "Dispositivo di accelerazione",
"accelDeviceDescription": "Dispositivo GPU utilizzato per l'elaborazione multimediale con accelerazione hardware. La CPU (software) disattiva l'accelerazione hardware.",
"encoderBackend": "Backend dell'encoder",
"transcodeProfileEncoderBackendHelp": "Backend dell'encoder per questa preimpostazione; per impostazione predefinita viene utilizzato il backend preferito rilevato.",
"alwaysUseFfmpeg": "Utilizza sempre ffmpeg",
"alwaysUseFfmpegDescription": "Utilizza sempre ffmpeg per l'analisi, i metadati, i sottotitoli e le miniature dei video. Questo metodo sarà più lento, ma può risultare più affidabile.",
"alwaysUseOffice": "Utilizzare sempre il server aziendale per le miniature dei documenti",
"alwaysUseOfficeDescription": "Utilizza sempre il server dell'ufficio per le miniature dei documenti, anziché la generazione delle miniature durante l'elaborazione. Questa operazione sarà più lenta, ma potrebbe risultare più affidabile.",
"debug": "Registrazione dei messaggi di debug",
"debugDescription": "Uscita stdout di ffmpeg per l'integrazione multimediale. Attenzione: genera una grande quantità di dati in uscita.",
"imagePreview": "Formati di anteprima delle immagini",
"videoPreview": "Formati di anteprima video",
"imageVideoConversionFormats": "Formati di conversione di immagini e video",
"imageVideoConversionFormatsDescription": "Scegli quali formati di immagini e video ffmpeg può convertire per le anteprime.",
"updateFailed": "Impossibile aggiornare le impostazioni.",
"maxConcurrentTranscodes": "Numero massimo di transcodifiche simultanee",
"maxConcurrentTranscodesHelp": "Il numero massimo di sessioni simultanee di riproduzione con transcodifica HLS per questo utente.",
"transcode": "Transcodifica",
"transcodeEnabled": "Abilita la transcodifica",
"transcodeEnabledDescription": "Consenti la transcodifica HLS lato server per la riproduzione con autenticazione.",
"transcodeSettings": "Impostazioni di transcodifica",
"transcodeSettingsDescription": "Limiti di concorrenza, cache su disco e limiti di risoluzione e bitrate per profilo.",
"transcodeMaxConcurrent": "Sessioni simultanee globali",
"transcodeMaxConcurrentHelp": "Numero massimo di sessioni di transcodifica simultanee per tutti gli utenti.",
"transcodeMaxConcurrentPerUser": "Limite di sessioni per utente",
"transcodeMaxConcurrentPerUserHelp": "Limite massimo rigido al numero di sessioni di transcodifica simultanee per ogni singolo utente. Le impostazioni dell'utente non possono superare tale limite.",
"transcodeCacheMaxSizeMB": "Limite della dimensione della cache (MB)",
"transcodeCacheMaxSizeMBHelp": "Spazio su disco massimo per la cache di transcodifica in MB. 0 indica spazio illimitato.",
"transcodeCacheRetentionH": "Durata della cache (ore)",
"transcodeCacheRetentionHHelp": "Per quanto tempo vengono conservate le generazioni di cache di transcodifica inattive prima di essere eliminate.",
"transcodeProfileEnabled": "Abilitato",
"transcodeProfileEnabledDescription": "Mostra questa impostazione predefinita di qualità nel menu del lettore.",
"transcodeProfileMaxResolution": "Risoluzione massima",
"transcodeProfileMaxResolutionHelp": "Altezza massima di output in pixel. Il valore 0 mantiene la risoluzione originale.",
"transcodeProfileAvgBitrate": "Bitrate medio (kbps)",
"transcodeProfileAvgBitrateHelp": "Bitrate medio desiderato del video in kbps. Il valore 0 mantiene il bitrate originale.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled."
},
"time": {
"time": "{prefix}Ora{suffix}",
"minute": "{prefix}minuto{suffix}",
"minutes": "{prefix}Minuti{suffix}",
"hour": "{prefix}ora{suffix}",
"hours": "{prefix}Ore{suffix}",
"day": "{prefix}giorno{suffix}",
"days": "{prefix}Giorni{suffix}",
"months": "{prefix}Mesi{suffix}",
"time": "Ora{suffix}",
"minute": "minuto{suffix}",
"minutes": "Verbale{suffix}",
"hour": "ora{suffix}",
"hours": "Orari{suffix}",
"day": "giorno{suffix}",
"days": "Giorni{suffix}",
"months": "Mesi{suffix}",
"timeUnit": "Unità di tempo"
},
"sidebar": {
@@ -740,7 +804,7 @@
"sidebarLinkDefaults": "Impostazioni predefinite dei link nella barra laterale",
"sidebarLinkDefaultsDescription": "Configurare i collegamenti predefiniti e obbligatori nella barra laterale per tutti gli utenti.",
"sidebarLinkDefaultsHelp": "Questi sono i link predefiniti che verranno aggiunti per tutti i nuovi utenti. Se si imposta un link come obbligatorio, questo verrà aggiunto per tutti gli utenti e non potrà essere rimosso dagli utenti che non sono amministratori.",
"sidebarLinkDefaultSourceHelp": "Si applica solo se l'utente ha accesso a questa sorgente.",
"sidebarLinkDefaultSourceHelp": "Si applica solo se l'utente ha accesso a questa fonte.",
"sidebarLinkDefaultsYamlInvalid": "YAML non valido. Controlla il formato e riprova."
},
"api": {
@@ -764,10 +828,6 @@
"minimalInfo": "Esclude personalizzazioni, i permessi coincideranno con l'utente associato."
},
"index": {
"unknown": "Sconosciuto",
"simple": "Semplice",
"normal": "Normale",
"complex": "Complesso",
"highlyComplex": "Altamente Complesso",
"assessment": "Valutazione",
"ready": "Pronto",
@@ -794,44 +854,37 @@
"passwordRequiredForGeneration": "La password è necessaria per generare un codice autenticatore."
},
"access": {
"access": "Accesso",
"groups": "Gruppi",
"newGroup": "Nuovo gruppo",
"editGroup": "Modifica gruppo",
"groupName": "Nome del gruppo",
"userGroups": "Gruppi",
"userGroupsDescription": "Gruppi di cui fa parte questo utente",
"groupMembers": "Membri",
"membersCount": "Membri: {count}",
"userGroupsCount": "Gruppi: {count}",
"groupNameRequired": "Il nome del gruppo è obbligatorio.",
"groupNameTooShort": "Il nome del gruppo deve contenere almeno {min} caratteri.",
"groupNameTooShort": "Group name must be at least {min} characters.",
"groupNameTooLong": "Il nome del gruppo deve contenere al massimo {max} caratteri.",
"groupNameInvalid": "Il nome del gruppo non deve contenere caratteri di controllo.",
"groupExists": "Esiste già un gruppo con questo nome.",
"deleteGroupConfirm": "Eliminare il gruppo \"{name}\"? Verrà rimosso anche da tutte le regole di accesso.",
"groupsOidcNote": "I membri dei gruppi sincronizzati tramite SSO (OIDC, LDAP, JWT, proxy) vengono reimpostati dal provider di identità a ogni accesso di tali utenti.",
"selectEntities": "Seleziona",
"groupsOidcNote": "I membri dei gruppi sincronizzati tramite OIDC vengono reimpostati dal provider di identità a ogni accesso di tali utenti.",
"selectUser": "Seleziona utente",
"selectUsers": "Seleziona gli utenti",
"selectGroup": "Seleziona un gruppo",
"selectGroups": "Seleziona i gruppi",
"refineSearch": "Visualizzazione dei primi {count} risultati. Affina la ricerca per vederne altri.",
"refineSearch": "Vengono visualizzati i primi risultati per \" {count} \". Affina la ricerca per visualizzarne altri.",
"all": "Nega Tutto",
"rules": "Regole di accesso",
"hasRules": "Regole di accesso configurate",
"manageDescription": "Apri le regole di accesso per questo percorso.",
"deny": "Nega",
"totalDenied": "Negati",
"totalAllowed": "Consentiti",
"allow": "Consenti",
"allowDeny": "Consenti/Nega",
"userGroup": "Utente/Gruppo",
"accessManagement": "Gestione Accessi",
"defaultBehavior": "Azione predefinita{suffix}",
"defaultBehaviorDescription": "Cosa succede quando non esistono regole specifiche. 'Consenti' permette l'accesso, 'Nega' blocca tutto tranne gli esplicitamente autorizzati.",
"cascadeDelete": "Eliminazione ricorsiva",
"cascadeDeleteDescription": "Se abilitato, l'eliminazione di una regola di accesso la rimuoverà anche da tutte le sottocartelle. Ciò consente di rimuovere completamente un utente o un gruppo dall'intero albero delle cartelle."
"cascadeDelete": "Eliminazione Ricorsiva",
"cascadeDeleteDescription": "Se abilitato, l'eliminazione di una regola rimuoverà anche quelle nelle sottodirectory."
},
"fileLoading": {
"title": "Caricamenti e Download",
@@ -881,7 +934,7 @@
},
"tabSize": {
"label": "Dimensione Tab",
"description": "Quanti spazi dovrebbe inserire il tasto 'TAB' di default"
"description": "Quanti spazi deve inserire il tasto 'TAB' di default -- È anche la dimensione del rientro extra quando imposti il rientro a capo su 'Extra'"
},
"showIndentGuides": "Mostra guide di indentazione",
"showIndentGuidesDescription": "Mostra guide di indentazione, che ti danno un migliore orientamento durante la modifica di codice annidato",
@@ -897,8 +950,13 @@
"customScrollbarDescription": "Sostituisce la barra di scorrimento nativa del browser con quella integrata di Ace",
"wrapContent": "A capo delle righe lunghe nell'editor",
"wrapContentDescription": "Va a capo nel contenuto dell'editor per mantenere sempre visibili le righe molto lunghe",
"indentedSoftWrap": "A capo automatico con rientro",
"indentedSoftWrapDescription": "Quando è abilitato, aggiunge un rientro all'inizio del testo mandato a capo",
"wrapIndent": {
"label": "Rientro delle righe mandate a capo",
"description": "Come vengono rientrate le righe mandate a capo: 'None' a capo senza rientro, 'Aligned' mantiene il rientro originale della riga, 'Extra' aggiunge un livello extra di rientro, seguendo la tua impostazione di dimensione Tab",
"none": "Nessuno",
"aligned": "Allineato",
"extra": "Extra"
},
"autocompletion": "Completamento automatico",
"autocompletionDescription": "Abilita il completamento automatico premendo manualmente 'ctrl + space'",
"liveAutocompletion": "Completamento automatico live",
@@ -924,8 +982,8 @@
"undo": "Annulla",
"redo": "Ripeti",
"moreOptions": "Altre opzioni",
"inlineMath": "Formula matematica in linea",
"displayMath": "Formula matematica a blocco",
"inlineMath": "Matematica in linea",
"displayMath": "Matematica a blocco",
"highlight": "Evidenzia",
"superscript": "Apice",
"subscript": "Pedice",
@@ -940,7 +998,7 @@
"fontColor": "Colore del carattere"
},
"json": {
"formatJSON": "Formatta JSON",
"formatJSON": "Formato JSON",
"formatJSONSuccess": "Formattazione JSON completata con successo",
"invalidJSON": "JSON non valido: {message}"
}
@@ -967,6 +1025,11 @@
"toggleLyrics": "Attiva/disattiva testo",
"closePanel": "Chiudi pannello",
"openPanel": "Apri pannello",
"transcodeFailed": "La transcodifica non è andata a buon fine",
"transcodeLoading": "Preparazione dello stream transcodificato",
"transcodeUnsupportedFormat": "Questo formato video non è supportato dal tuo browser.",
"transcodeUserLimitReached": "Limite di transcodifica raggiunto. Hai già una sessione di transcodifica attiva:",
"transcodeSystemLimitReached": "Limite di transcodifica del server raggiunto ({limit} e in contemporanea). Riprovare al termine di una sessione.",
"visualizer": {
"title": "Visualizzatore",
"settings": "Impostazioni visualizzatore",
@@ -1075,15 +1138,15 @@
"scopeShares": "Condividi l'attività",
"eventBulkDelete": "Eliminazione in blocco",
"eventFileModify": "Modifica file",
"eventShareCreate": "Creazione condivisione",
"eventShareUpdate": "Modifica condivisione",
"eventShareDelete": "Eliminazione condivisione",
"eventShareCreate": "Condividi Crea",
"eventShareUpdate": "Aggiornamento sulla condivisione",
"eventShareDelete": "Condividi Elimina",
"eventUserCreate": "Creazione utente",
"eventUserUpdate": "Aggiornamento utente",
"eventUserDelete": "Eliminazione utente",
"eventAccessCreate": "Creazione regola di accesso",
"eventAccessUpdate": "Modifica regola di accesso",
"eventAccessDelete": "Eliminazione regola di accesso",
"eventAccessCreate": "Accedi - Crea",
"eventAccessUpdate": "Aggiornamento sull'accesso",
"eventAccessDelete": "Accedi - Elimina",
"eventTokenCreate": "Creazione di un token",
"eventTokenDelete": "Eliminazione del token",
"webSessionNamed": "Sessione web ({name})",
@@ -1093,7 +1156,7 @@
"last24h": "Ultime 24 ore",
"last7d": "Ultimi 7 giorni",
"last30d": "Ultimi 30 giorni",
"customRange": "Intervallo personalizzato",
"customRange": "Gamma personalizzata",
"eventType": "Tipo di evento",
"eventSummary": "Evento",
"passkeyRegister": "Passkey aggiunto",
@@ -1115,8 +1178,8 @@
"activityOverTime": "Andamento nel tempo",
"activityOverTimeBy": "Andamento nel tempo per {subject}",
"activityBy": "Attività di {subject}",
"eventTotals": "Totale eventi",
"activityTotalsBy": "Totale attività per {subject}",
"eventTotals": "Totali dell'evento",
"activityTotalsBy": "Totali delle attività per {subject}",
"subjectEventType": "tipo di evento",
"totalEvents": "Numero totale di eventi{suffix}",
"cachedResult": "Risultato memorizzato nella cache",
@@ -1135,16 +1198,16 @@
"notifications": {
"title": "Notifiche",
"description": "Visualizza tutte le notifiche della sessione corrente",
"empty": "Nessuna notifica",
"clearAll": "Cancella tutte",
"appEnabled": "Notifiche dell'app",
"appEnabledDescription": "Mostra le notifiche del browser al termine delle operazioni sui file quando questa scheda è in background. Richiede l'autorizzazione del browser. Memorizzato solo in questo browser.",
"appUnsupported": "Le notifiche dell'app non sono supportate in questo browser.",
"permissionGranted": "consentito",
"empty": "Ancora nessuna notifica",
"clearAll": "Pulisci tutto",
"appEnabled": "Notifiche delle app",
"appEnabledDescription": "Mostra le notifiche del browser al termine delle operazioni sui file quando questa scheda è in secondo piano. Richiede l'autorizzazione del browser. Memorizzato solo in questo browser.",
"appUnsupported": "Le notifiche delle app non sono supportate in questo browser.",
"permissionGranted": "ammesso",
"permissionDeniedHelp": "Le notifiche sono bloccate. Abilitale nelle impostazioni del browser per questo sito.",
"uploadTitle": "Caricamento completato",
"downloadTitle": "Download completato",
"moveTitle": "Spostamento completato",
"moveTitle": "Operazione completata",
"copyTitle": "Copia completata",
"uploadFailedTitle": "Caricamento non riuscito",
"downloadFailedTitle": "Il download non è andato a buon fine",
@@ -1157,7 +1220,8 @@
"groupsFound": "Gruppi Duplicati Trovati{suffix}",
"totalWastedSpace": "Spazio Sprecato Totale{suffix}",
"wasted": "Sprecato{suffix}",
"emptyState": "Inserisci i criteri e clicca Trova Duplicati per identificare i file"
"emptyState": "Inserisci i criteri e clicca Trova Duplicati per identificare i file",
"noResults": "Ricerca completata — non sono stati trovati file duplicati."
},
"events": {
"serverShutdown": "Il server è stato spento.",
+687 -687
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+82 -82
View File
@@ -80,6 +80,7 @@
"back": "Terug{suffix}",
"stay": "Blijven{suffix}",
"cancel": "Annuleren{suffix}",
"default": "Standaard{suffix}",
"change": "Wijzigen{suffix}",
"verify": "Verifiëren{suffix}",
"close": "Sluiten{suffix}",
@@ -111,6 +112,11 @@
"pause": "Pauzeren{suffix}",
"resume": "Hervatten{suffix}",
"retry": "Opnieuw proberen{suffix}",
"transcode": "Transcoderen{suffix}",
"off": "Uit{suffix}",
"quality": "Kwaliteit{suffix}",
"balanced": "Evenwichtig{suffix}",
"dataSaver": "Databesparing{suffix}",
"disable": "Uitschakelen{suffix}",
"confirm": "Bevestigen{suffix}",
"uploading": "Uploaden{suffix}",
@@ -173,19 +179,13 @@
"interval": "Interval{suffix}",
"none": "Geen",
"enforce": "Handhaven{suffix}",
"media": "Media",
"unknown": "Onbekend",
"simple": "Eenvoudig",
"normal": "Normaal",
"complex": "Complex",
"access": "Toegang",
"groups": "Groepen",
"transcode": "Transcoderen{suffix}",
"off": "Uit{suffix}",
"quality": "Kwaliteit{suffix}",
"balanced": "Evenwichtig{suffix}",
"dataSaver": "Databesparing{suffix}",
"media": "Media",
"default": "Standaard{suffix}"
"groups": "Groepen"
},
"buttons": {
"copySuccess": "Gekopieerd naar klembord!",
@@ -231,8 +231,6 @@
"requestTimedOut": "De tijdlimiet voor het verzoek is verstreken. Controleer je netwerk- of reverse-proxy-instellingen."
},
"files": {
"sortByCreationTime": "Sorteren op aanmaaktijd",
"creationTime": "Aanmaaktijd",
"emptyFile": "Leeg bestand",
"lastModified": "Laatst gewijzigd{suffix}",
"duration": "Duur{suffix}",
@@ -243,6 +241,8 @@
"sortBySize": "Sorteren op grootte",
"sortByType": "Sorteren op type",
"sortByDuration": "Sorteren op duur",
"sortByCreationTime": "Sorteren op aanmaaktijd",
"creationTime": "Aanmaaktijd",
"noPreview": "Voorbeeld is niet beschikbaar voor dit bestand.",
"mobilePdfPreviewHint": "Je browser kan dit PDF-bestand niet weergeven in het app-voorbeeld.",
"noDownloadAccess": "Download is niet beschikbaar.",
@@ -568,10 +568,6 @@
"openInAdvancedSearch": "Openen in geavanceerd zoeken"
},
"profileSettings": {
"showTypeColumn": "Type-kolom tonen",
"showTypeColumnDescription": "Toon de Type-kolom in lijst- en compacte weergaven in de hoofdlijst.",
"showCreationDateColumn": "Aanmaakdatum-kolom tonen",
"showCreationDateColumnDescription": "Toon de Aanmaakdatum-kolom in lijst- en compacte weergaven in de hoofdlijst.",
"promptRightCloseButton": "Toon sluitknop van prompts rechts",
"promptRightCloseButtonDescription": "Toon de sluitknop van de prompts aan de rechterkant in plaats van aan de linkerkant",
"enforcedByAdmin": "Uw beheerder heeft ervoor gezorgd dat gebruikers deze eigenschap niet kunnen wijzigen",
@@ -630,6 +626,10 @@
"showToolsInSidebarDescription": "Altijd links naar gereedschap tonen in de zijbalk.",
"showCopyPath": "Pad kopiëren tonen in contextmenu",
"showCopyPathDescription": "Een actie Pad kopiëren weergeven in het contextmenu van bestanden en mappen.",
"showTypeColumn": "Type-kolom tonen",
"showTypeColumnDescription": "Toon de Type-kolom in lijst- en compacte weergaven in de hoofdlijst.",
"showCreationDateColumn": "Aanmaakdatum-kolom tonen",
"showCreationDateColumnDescription": "Toon de Aanmaakdatum-kolom in lijst- en compacte weergaven in de hoofdlijst.",
"deleteWithoutConfirming": "Bestanden verwijderen zonder bevestigingsvenster",
"deleteWithoutConfirmingDescription": "Bestanden verwijderen zonder bevestigingsvenster. Dit werkt alleen als het bestand een mediabestand is.",
"previewOfficeDescription": "Toon miniaturen voor Office-bestandstypen in de listingweergave",
@@ -683,6 +683,8 @@
"analyticsPreviewFailed": "Het laden van diagnostische gegevens voor Analytics is mislukt",
"enterPassword": "Wachtwoord invoeren",
"enterPasswordAgain": "Wachtwoord opnieuw invoeren",
"passwordRequirementsMatch": "Wachtwoorden komen overeen",
"passwordRequirementsMinLength": "{min} -tekens",
"loginMethod": "Aanmeldingsmethode",
"modifyOtherUser": "Gebruiker wijzigen:",
"modifyOtherUserTitle": "Gebruiker aanpassen: {username}",
@@ -695,6 +697,7 @@
"userNotAdmin": "Gebruiker is geen beheerder",
"avoidChanges": "(Leeg laten om wijzigingen te voorkomen)",
"lockPassword": "Voorkom dat de gebruiker het wachtwoord wijzigt",
"requirePasswordChange": "Vraag om het wachtwoord te wijzigen bij de volgende aanmelding",
"permissions": {
"admin": "Beheerder",
"api": "Langlevende API-sleutels aanmaken en beheren",
@@ -703,14 +706,51 @@
"permissionsHelp": "Algemene machtigingen voor de gebruiker gelden overal, inclusief alle bronnen en Shares.",
"sourcePermissionsHelp": "Vouw een bronrij uit om de rechten voor het bekijken, downloaden, wijzigen, aanmaken en verwijderen van die bron in te stellen.",
"sourceAccessDefaultsHelp": "Standaard bestandsrechten die worden toegepast op bronbestanden en nieuwe gebruikers. Met ‘Enforce’ wordt een waarde vastgelegd voor alle gebruikers die geen beheerder zijn.",
"passwordRequirementsMatch": "Wachtwoorden komen overeen",
"passwordRequirementsMinLength": "{min} -tekens",
"requirePasswordChange": "Vraag om het wachtwoord te wijzigen bij de volgende aanmelding",
"settingsUpdated": "Instellingen bijgewerkt!",
"shareDeleted": "Share verwijderd!",
"userDeleted": "Gebruiker verwijderd!",
"userUpdated": "Gebruiker bijgewerkt!"
},
"media": {
"accelDevice": "Versnellingsapparaat",
"accelDeviceDescription": "GPU-apparaat dat wordt gebruikt voor hardwareversnelde mediaverwerking. De CPU (software) schakelt de hardwareversnelling uit.",
"encoderBackend": "Encoder-backend",
"transcodeProfileEncoderBackendHelp": "Encoder-backend voor deze voorinstelling; standaard is dit de gedetecteerde voorkeursbackend.",
"alwaysUseFfmpeg": "Gebruik altijd ffmpeg",
"alwaysUseFfmpegDescription": "Gebruik altijd ffmpeg voor het analyseren van bestanden, metagegevens, ondertitels en videominiaturen. Dit gaat weliswaar langzamer, maar is vaak betrouwbaarder.",
"alwaysUseOffice": "Gebruik altijd de kantoorserver voor miniatuurafbeeldingen van documenten",
"alwaysUseOfficeDescription": "Gebruik altijd de kantoorserver voor miniatuurafbeeldingen van documenten in plaats van de miniatuurgeneratie tijdens de verwerking. Dit gaat weliswaar langzamer, maar is mogelijk betrouwbaarder.",
"debug": "Foutlogboek",
"debugDescription": "FFmpeg-stdout-uitvoer voor de media-integratie. Waarschuwing: dit levert veel uitvoer op.",
"imagePreview": "Formaten voor afbeeldingsvoorbeelden",
"videoPreview": "Formaten voor videovoorbeelden",
"imageVideoConversionFormats": "Bestandsformaten voor afbeeldingen en video’s",
"imageVideoConversionFormatsDescription": "Kies welke afbeeldings- en videoformaten ffmpeg mag converteren voor voorbeelden.",
"updateFailed": "Het bijwerken van de instellingen is mislukt.",
"maxConcurrentTranscodes": "Maximaal aantal gelijktijdige transcoderingen",
"maxConcurrentTranscodesHelp": "Het maximale aantal gelijktijdige HLS-transcodering- en afspeelsessies voor deze gebruiker.",
"transcode": "Transcodering",
"transcodeEnabled": "Transcodering inschakelen",
"transcodeEnabledDescription": "Schakel HLS-transcodering aan de serverzijde in voor afspelen na authenticatie.",
"transcodeSettings": "Instellingen voor transcodering",
"transcodeSettingsDescription": "Beperkingen op gelijktijdigheid, schijfcache en de limieten voor resolutie en bitsnelheid per profiel.",
"transcodeMaxConcurrent": "Wereldwijde gelijktijdige sessies",
"transcodeMaxConcurrentHelp": "Maximaal aantal gelijktijdige transcodersessies voor alle gebruikers samen.",
"transcodeMaxConcurrentPerUser": "Maximaal aantal sessies per gebruiker",
"transcodeMaxConcurrentPerUserHelp": "Er geldt een strikte limiet voor het aantal gelijktijdige transcodersessies per gebruiker. Gebruikersinstellingen mogen deze limiet niet overschrijden.",
"transcodeCacheMaxSizeMB": "Maximale cachegrootte (MB)",
"transcodeCacheMaxSizeMBHelp": "Maximale schijfruimte voor de transcodecache in MB. 0 betekent onbeperkt.",
"transcodeCacheRetentionH": "Cache-bewaartermijn (uren)",
"transcodeCacheRetentionHHelp": "Hoe lang worden inactieve transcode-cachegeneraties bewaard voordat ze worden verwijderd?",
"transcodeProfileEnabled": "Ingeschakeld",
"transcodeProfileEnabledDescription": "Geef deze kwaliteitsinstelling weer in het menu van de speler.",
"transcodeProfileMaxResolution": "Maximale resolutie",
"transcodeProfileMaxResolutionHelp": "Maximale uitvoerhoogte in pixels. Bij 0 blijft de bronresolutie behouden.",
"transcodeProfileAvgBitrate": "Gemiddelde bitsnelheid (kbps)",
"transcodeProfileAvgBitrateHelp": "Beoogde gemiddelde videobitsnelheid in kbps. Bij 0 blijft de bitsnelheid van de bron behouden.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled."
},
"time": {
"time": "Tijd{suffix}",
"minute": "minuut{suffix}",
@@ -743,6 +783,8 @@
"usageTextDisk": "gebruik zoals gerapporteerd door schijf/partitie",
"showIndexedUsage": "Gebruik weergeven zoals geïndexeerd",
"showDiskUsage": "Weergave van het gebruik zoals gerapporteerd per schijf/partitie",
"rootFilesystemOnly": "Het schijfgebruik beperken tot het bronbestandssysteem",
"rootFilesystemOnlyDescription": "Indien deze optie is ingeschakeld, wordt alleen het bestandssysteem met het bronpad weergegeven. Indien deze optie is uitgeschakeld (standaard), omvat het totale schijfvolume ook bestandssystemen die onder het bronpad zijn gekoppeld, waarbij gedeelde pools zoals ZFS-datasets slechts één keer worden meegeteld.",
"selectSource": "Bron selecteren",
"chooseSource": "Kies een bron",
"selectShare": "Selecteer Share",
@@ -763,9 +805,7 @@
"sidebarLinkDefaultsDescription": "Stel de standaard- en verplichte links in de zijbalk in voor alle gebruikers.",
"sidebarLinkDefaultsHelp": "Dit zijn de standaardlinks die voor alle nieuwe gebruikers worden toegevoegd. Als je een link verplicht stelt, wordt deze voor alle gebruikers toegevoegd en kan deze niet worden verwijderd door gebruikers die geen beheerder zijn.",
"sidebarLinkDefaultSourceHelp": "Dit geldt alleen als de gebruiker toegang heeft tot deze bron.",
"sidebarLinkDefaultsYamlInvalid": "Ongeldige YAML. Controleer de opmaak en probeer het opnieuw.",
"rootFilesystemOnly": "Het schijfgebruik beperken tot het bronbestandssysteem",
"rootFilesystemOnlyDescription": "Indien deze optie is ingeschakeld, wordt alleen het bestandssysteem met het bronpad weergegeven. Indien deze optie is uitgeschakeld (standaard), omvat het totale schijfvolume ook bestandssystemen die onder het bronpad zijn gekoppeld, waarbij gedeelde pools zoals ZFS-datasets slechts één keer worden meegeteld."
"sidebarLinkDefaultsYamlInvalid": "Ongeldige YAML. Controleer de opmaak en probeer het opnieuw."
},
"api": {
"title": "API-sleutels",
@@ -817,9 +857,22 @@
"newGroup": "Nieuwe groep",
"editGroup": "Groep bewerken",
"groupName": "Groepsnaam",
"userGroupsDescription": "Groepen waarvan deze gebruiker lid is",
"groupMembers": "Leden",
"membersCount": "Leden: {count}",
"userGroupsCount": "Groepen: {count}",
"groupNameRequired": "De groepsnaam is verplicht.",
"groupNameTooShort": "Group name must be at least {min} characters.",
"groupNameTooLong": "De groepsnaam mag maximaal {max} tekens lang zijn.",
"groupNameInvalid": "De groepsnaam mag geen besturingstekens bevatten.",
"groupExists": "Er bestaat al een groep met deze naam.",
"deleteGroupConfirm": "Groep \"{name}\" verwijderen? Deze wordt ook uit alle toegangsregels verwijderd.",
"groupsOidcNote": "Leden van OIDC-gesynchroniseerde groepen worden bij elke aanmelding van die gebruikers opnieuw ingesteld vanuit de identiteitsprovider.",
"selectUser": "Gebruiker selecteren",
"selectUsers": "Gebruikers selecteren",
"selectGroup": "Groep selecteren",
"selectGroups": "Groepen selecteren",
"refineSearch": "De eerste {count} -resultaten worden weergegeven. Verfijn je zoekopdracht om meer resultaten te zien.",
"all": "Alles weigeren",
"rules": "Toegangsregels",
"deny": "Weigeren",
@@ -831,20 +884,7 @@
"defaultBehavior": "Standaardactie{suffix}",
"defaultBehaviorDescription": "Dit laat zien wat er gebeurt als een gebruiker toegang probeert te krijgen tot een pad waarvoor geen specifieke toegangsregels bestaan. Toestaan' betekent dat gebruikers standaard toegang hebben, 'Weigeren' betekent dat gebruikers standaard worden geblokkeerd tenzij ze expliciet toestemming krijgen.",
"cascadeDelete": "Recursief verwijderen",
"cascadeDeleteDescription": "Indien ingeschakeld, zal het verwijderen van een toegangsregel deze ook verwijderen uit alle submappen. Hierdoor kunt u een gebruiker of groep volledig verwijderen uit de hele mappenstructuur.",
"userGroupsDescription": "Groepen waarvan deze gebruiker lid is",
"membersCount": "Leden: {count}",
"userGroupsCount": "Groepen: {count}",
"groupNameRequired": "De groepsnaam is verplicht.",
"groupNameTooShort": "Group name must be at least {min} characters.",
"groupNameTooLong": "De groepsnaam mag maximaal {max} tekens lang zijn.",
"groupNameInvalid": "De groepsnaam mag geen besturingstekens bevatten.",
"groupExists": "Er bestaat al een groep met deze naam.",
"selectUser": "Gebruiker selecteren",
"selectUsers": "Gebruikers selecteren",
"selectGroup": "Groep selecteren",
"selectGroups": "Groepen selecteren",
"refineSearch": "De eerste {count} -resultaten worden weergegeven. Verfijn je zoekopdracht om meer resultaten te zien."
"cascadeDeleteDescription": "Indien ingeschakeld, zal het verwijderen van een toegangsregel deze ook verwijderen uit alle submappen. Hierdoor kunt u een gebruiker of groep volledig verwijderen uit de hele mappenstructuur."
},
"fileLoading": {
"title": "Uploads & Downloads",
@@ -985,6 +1025,11 @@
"toggleLyrics": "Songtekst in-/uitschakelen",
"closePanel": "Paneel sluiten",
"openPanel": "Paneel openen",
"transcodeFailed": "Het transcoderen is mislukt",
"transcodeLoading": "Een getranscodeerde stream voorbereiden",
"transcodeUnsupportedFormat": "Dit videoformaat wordt niet ondersteund door je browser.",
"transcodeUserLimitReached": "De limiet voor transcoderen is bereikt. Je hebt al een actieve transcodersessie:",
"transcodeSystemLimitReached": "De limiet voor transcodering op de server is bereikt ({limit} gelijktijdig). Probeer het opnieuw zodra een sessie is beëindigd.",
"visualizer": {
"title": "Visualisator",
"settings": "Visualisator-instellingen",
@@ -1007,12 +1052,7 @@
"maxDecibelsDescription": "Luidste niveau (dBFS) dat de balk registreert",
"showScalesDescription": "Assen en rasterlijnen weergeven op de visualisator",
"showPeaksDescription": "Kleine witte piekindicatoren boven elke balk"
},
"transcodeFailed": "Het transcoderen is mislukt",
"transcodeLoading": "Een getranscodeerde stream voorbereiden",
"transcodeUnsupportedFormat": "Dit videoformaat wordt niet ondersteund door je browser.",
"transcodeUserLimitReached": "De limiet voor transcoderen is bereikt. Je hebt al een actieve transcodersessie:",
"transcodeSystemLimitReached": "De limiet voor transcodering op de server is bereikt ({limit} gelijktijdig). Probeer het opnieuw zodra een sessie is beëindigd."
}
},
"fileSizeAnalyzer": {
"title": "Bestandsgrootte analyseren",
@@ -1097,6 +1137,7 @@
"scopeAccess": "Toegangsactiviteit",
"scopeShares": "Activiteit delen",
"eventBulkDelete": "In één keer verwijderen",
"eventFileModify": "Bestand wijzigen",
"eventShareCreate": "Share Aanmaken",
"eventShareUpdate": "Share bijwerken",
"eventShareDelete": "Share Verwijderen",
@@ -1150,8 +1191,7 @@
"shareFilter": "Share-filter",
"pathGlob": "Padpatroon (glob)",
"viewActivity": "Activiteit bekijken",
"tableColumns": "Kolommen in de tabel",
"eventFileModify": "Bestand wijzigen"
"tableColumns": "Kolommen in de tabel"
},
"toolNotFound": "Gereedschap niet gevonden"
},
@@ -1236,45 +1276,5 @@
},
"pwa": {
"install": "App installeren"
},
"media": {
"debug": "Foutlogboek",
"debugDescription": "FFmpeg-stdout-uitvoer voor de media-integratie. Waarschuwing: dit levert veel uitvoer op.",
"imagePreview": "Formaten voor afbeeldingsvoorbeelden",
"videoPreview": "Formaten voor videovoorbeelden",
"imageVideoConversionFormats": "Bestandsformaten voor afbeeldingen en video’s",
"imageVideoConversionFormatsDescription": "Kies welke afbeeldings- en videoformaten ffmpeg mag converteren voor voorbeelden.",
"updateFailed": "Het bijwerken van de instellingen is mislukt.",
"maxConcurrentTranscodes": "Maximaal aantal gelijktijdige transcoderingen",
"maxConcurrentTranscodesHelp": "Het maximale aantal gelijktijdige HLS-transcodering- en afspeelsessies voor deze gebruiker.",
"transcode": "Transcodering",
"transcodeEnabled": "Transcodering inschakelen",
"transcodeEnabledDescription": "Schakel HLS-transcodering aan de serverzijde in voor afspelen na authenticatie.",
"transcodeSettings": "Instellingen voor transcodering",
"transcodeSettingsDescription": "Beperkingen op gelijktijdigheid, schijfcache en de limieten voor resolutie en bitsnelheid per profiel.",
"transcodeMaxConcurrent": "Wereldwijde gelijktijdige sessies",
"transcodeMaxConcurrentHelp": "Maximaal aantal gelijktijdige transcodersessies voor alle gebruikers samen.",
"transcodeMaxConcurrentPerUser": "Maximaal aantal sessies per gebruiker",
"transcodeMaxConcurrentPerUserHelp": "Er geldt een strikte limiet voor het aantal gelijktijdige transcodersessies per gebruiker. Gebruikersinstellingen mogen deze limiet niet overschrijden.",
"transcodeCacheMaxSizeMB": "Maximale cachegrootte (MB)",
"transcodeCacheMaxSizeMBHelp": "Maximale schijfruimte voor de transcodecache in MB. 0 betekent onbeperkt.",
"transcodeCacheRetentionH": "Cache-bewaartermijn (uren)",
"transcodeCacheRetentionHHelp": "Hoe lang worden inactieve transcode-cachegeneraties bewaard voordat ze worden verwijderd?",
"transcodeProfileEnabled": "Ingeschakeld",
"transcodeProfileEnabledDescription": "Geef deze kwaliteitsinstelling weer in het menu van de speler.",
"transcodeProfileMaxResolution": "Maximale resolutie",
"transcodeProfileMaxResolutionHelp": "Maximale uitvoerhoogte in pixels. Bij 0 blijft de bronresolutie behouden.",
"transcodeProfileAvgBitrate": "Gemiddelde bitsnelheid (kbps)",
"transcodeProfileAvgBitrateHelp": "Beoogde gemiddelde videobitsnelheid in kbps. Bij 0 blijft de bitsnelheid van de bron behouden.",
"transcodeReadRate": "Producer rate limit (× realtime)",
"transcodeReadRateHelp": "Caps the transcode producer at N× realtime input pacing (ffmpeg -readrate) to limit CPU. Minimum 1; defaults to 2. Applies to transcode jobs only; stream-copy runs unthrottled.",
"accelDevice": "Versnellingsapparaat",
"accelDeviceDescription": "GPU-apparaat dat wordt gebruikt voor hardwareversnelde mediaverwerking. De CPU (software) schakelt de hardwareversnelling uit.",
"encoderBackend": "Encoder-backend",
"transcodeProfileEncoderBackendHelp": "Encoder-backend voor deze voorinstelling; standaard is dit de gedetecteerde voorkeursbackend.",
"alwaysUseFfmpeg": "Gebruik altijd ffmpeg",
"alwaysUseFfmpegDescription": "Gebruik altijd ffmpeg voor het analyseren van bestanden, metagegevens, ondertitels en videominiaturen. Dit gaat weliswaar langzamer, maar is vaak betrouwbaarder.",
"alwaysUseOffice": "Gebruik altijd de kantoorserver voor miniatuurafbeeldingen van documenten",
"alwaysUseOfficeDescription": "Gebruik altijd de kantoorserver voor miniatuurafbeeldingen van documenten in plaats van de miniatuurgeneratie tijdens de verwerking. Dit gaat weliswaar langzamer, maar is mogelijk betrouwbaarder."
}
}
+687 -687
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+704 -704
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+687 -687
View File
File diff suppressed because it is too large. Load diff
+704 -704
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+4
View File
@@ -638,6 +638,7 @@ export const mutations = {
state.user.fileLoading = {
maxConcurrentUpload: 3,
uploadChunkSizeMb: 5,
uploadStallTimeoutSeconds: 10,
downloadChunkSizeMb: 0,
clearAll: false
};
@@ -655,6 +656,9 @@ export const mutations = {
if (state.user.fileLoading.downloadChunkSizeMb === undefined) {
state.user.fileLoading.downloadChunkSizeMb = 0;
}
if (state.user.fileLoading.uploadStallTimeoutSeconds === undefined) {
state.user.fileLoading.uploadStallTimeoutSeconds = 10;
}
}
// Load stored values or use defaults as fallback
+1
View File
@@ -286,6 +286,7 @@ export interface UserObject {
fileLoading?: {
maxConcurrentUpload?: number;
uploadChunkSizeMb?: number;
uploadStallTimeoutSeconds?: number;
clearAll?: boolean;
downloadChunkSizeMb?: number;
maxConcurrent?: number;
+3 -3
View File
@@ -329,9 +329,9 @@ class UploadManager {
try {
const testPath = `${basePath}${dirName}`;
if (getters.isShare()) {
await resourcesApi.postPublic(state.shareInfo?.hash, testPath, new Blob([]), false, undefined, {}, true);
await resourcesApi.postPublic(state.shareInfo?.hash, testPath, new Blob([]), false, undefined, {}, true, undefined);
} else {
await resourcesApi.post(state.req?.source, testPath, new Blob([]), false, undefined, {}, true);
await resourcesApi.post(state.req?.source, testPath, new Blob([]), false, undefined, {}, true, undefined);
}
// No conflict - directory was created successfully
// Mark it so we can skip it later in the queue
@@ -839,7 +839,7 @@ class UploadManager {
}
progressTimeoutMs(): number {
const seconds = state.user?.fileLoading?.uploadStallTimeoutSeconds;
const seconds = state.user?.fileLoading?.uploadStallTimeoutSeconds ?? 0;
return seconds > 0 ? seconds * 1000 : this.PROGRESS_TIMEOUT_MS;
}
@@ -1,55 +0,0 @@
import { describe, expect, it, vi } from "vitest";
const { store } = vi.hoisted(() => ({ store: { create: false } }));
vi.mock("@/store", () => ({
state: { selected: [], isSafari: false },
mutations: { setSearch: vi.fn() },
getters: { isShare: () => false, sourcePermissions: () => ({ create: store.create }) },
}));
vi.mock("@/utils/download", () => ({ default: vi.fn() }));
vi.mock("@/api", () => ({ resourcesApi: {} }));
vi.mock("@/router", () => ({ router: {} }));
vi.mock("@/utils/upload", () => ({ readAllDirectoryEntries: vi.fn(), checkConflict: vi.fn() }));
vi.mock("@/utils/throttle", () => ({ default: (fn) => fn }));
vi.mock("@/utils", () => ({ url: {} }));
vi.mock("@/components/files/ListingItem.vue", () => ({ default: { render: () => null } }));
vi.mock("@/components/prompts/Upload.vue", () => ({ default: { render: () => null } }));
vi.mock("@/components/LoadingSpinner.vue", () => ({ default: { render: () => null } }));
vi.mock("@/utils/listingTypeAhead.js", () => ({
isTypeAheadSessionActive: vi.fn(),
processTypeAheadKey: vi.fn(),
resetTypeAheadSession: vi.fn(),
}));
vi.mock("@/utils/appNotifications", () => ({ notifyMoveCopyFailure: vi.fn() }));
import ListingView from "./ListingView.vue";
const dropEvents = ["dragenter", "dragleave", "drop"];
const types = (spy) => spy.mock.calls.map(([type]) => type);
describe("ListingView drop listeners", () => {
// The listing is not remounted when navigating between sources, so a user who lands on a source
// they cannot write to must still get a drop target once they move to one they can.
it("are attached and removed even when the user cannot write at mount", () => {
const el = { addEventListener: vi.fn(), removeEventListener: vi.fn() };
const ctx = { $el: el, permissions: { modify: false, create: false } };
ListingView.mounted.call(ctx);
expect(types(el.addEventListener)).toEqual(expect.arrayContaining(dropEvents));
ListingView.beforeUnmount.call(ctx);
expect(types(el.removeEventListener)).toEqual(expect.arrayContaining(dropEvents));
});
// dragEnter shows the drop indicator; if the source is found read-only before the drop, the
// refused drop must still take the indicator down (browsers send no dragleave on drop).
it("clear the drop indicator when the drop is refused", async () => {
const el = {};
const ctx = { $el: el, dragTargets: new Set([el]) };
const event = { preventDefault: vi.fn(), dataTransfer: { types: ["Files"] } };
store.create = false;
await ListingView.methods.drop.call(ctx, event);
expect(ctx.dragTargets.size).toBe(0);
});
});
@@ -1,74 +0,0 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const { store, mutations } = vi.hoisted(() => ({
store: {
share: false,
current: "inbox",
permissions: {
data: { view: true, download: true, modify: false, create: false, delete: false },
inbox: { view: true, download: true, modify: true, create: true, delete: true },
},
},
mutations: { showPrompt: vi.fn() },
}));
vi.mock("@/store", () => ({
state: { get req() { return { path: "/", source: store.current }; } },
mutations,
getters: {
isShare: () => store.share,
sourcePermissions: (source) => store.permissions[source ?? store.current],
},
}));
vi.mock("@/utils/download", () => ({ default: vi.fn() }));
vi.mock("@/api", () => ({ resourcesApi: {} }));
vi.mock("@/router", () => ({ router: {} }));
vi.mock("@/utils/upload", () => ({ readAllDirectoryEntries: vi.fn(), checkConflict: vi.fn() }));
vi.mock("@/utils/throttle", () => ({ default: (fn) => fn }));
vi.mock("@/utils", () => ({ url: {} }));
vi.mock("@/components/files/ListingItem.vue", () => ({ default: { render: () => null } }));
vi.mock("@/components/prompts/Upload.vue", () => ({ default: { render: () => null } }));
vi.mock("@/components/LoadingSpinner.vue", () => ({ default: { render: () => null } }));
vi.mock("@/utils/listingTypeAhead.js", () => ({
isTypeAheadSessionActive: vi.fn(),
processTypeAheadKey: vi.fn(),
resetTypeAheadSession: vi.fn(),
}));
vi.mock("@/utils/appNotifications", () => ({ notifyMoveCopyFailure: vi.fn() }));
import ListingView from "./ListingView.vue";
const paste = (key, fromSource) =>
ListingView.methods.handleInternalPaste.call({
clipboard: { key, items: [{ from: "/a.txt", fromSource, name: "a.txt" }] },
});
describe("ListingView internal paste permissions", () => {
beforeEach(() => {
vi.clearAllMocks();
store.share = false;
store.current = "inbox";
});
it("pastes a copy out of a read-only source into a writable one", async () => {
await paste("c", "data");
expect(mutations.showPrompt).toHaveBeenCalledOnce();
});
it("refuses a cut out of a source that cannot modify", async () => {
await paste("x", "data");
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
it("refuses any paste into a source that cannot create", async () => {
store.current = "data";
await paste("c", "inbox");
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
it("in a share, requires modify even for a copy", async () => {
store.share = true;
store.permissions.share = { download: true, modify: false, create: true };
store.current = "share";
await paste("c", "share");
expect(mutations.showPrompt).not.toHaveBeenCalled();
});
});