mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2025-12-21 21:33:02 +01:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d2a6d6ac8 | ||
|
|
e159dd8a0b | ||
|
|
b311a5c9ed | ||
|
|
04c8e38ecf | ||
|
|
1fd2f42282 | ||
|
|
d3cff18cc6 | ||
|
|
3e27c24fbd | ||
|
|
acd5acd4cf | ||
|
|
71dc5fcb23 | ||
|
|
2ff5f4ca0b | ||
|
|
12831a40d0 | ||
|
|
c966090889 | ||
|
|
f03eb637a7 | ||
|
|
49ea34f352 | ||
|
|
85d91667eb | ||
|
|
458554b6e1 | ||
|
|
79ff5cedc6 | ||
|
|
f0008abd04 | ||
|
|
8a377b3e4d | ||
|
|
e7d31722f7 | ||
|
|
52b4506e12 | ||
|
|
cb9631c999 | ||
|
|
6e3186a9de | ||
|
|
a67070f965 |
@@ -51,7 +51,6 @@ jobs:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
- linux/arm/v7
|
||||
- linux/riscv64
|
||||
|
||||
steps:
|
||||
- name: Enable Debug Logs
|
||||
|
||||
2
.github/workflows/docker-publish.yaml
vendored
2
.github/workflows/docker-publish.yaml
vendored
@@ -51,7 +51,6 @@ jobs:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
- linux/arm/v7
|
||||
- linux/riscv64
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
@@ -199,4 +198,3 @@ jobs:
|
||||
run: |
|
||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
$(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *)
|
||||
|
||||
|
||||
19
Dockerfile
19
Dockerfile
@@ -1,5 +1,5 @@
|
||||
# Node dependencies stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/node:lts-alpine AS frontend-dependencies
|
||||
FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-dependencies
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally (caching layer)
|
||||
@@ -10,7 +10,7 @@ COPY frontend/package.json frontend/pnpm-lock.yaml ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# Build Nuxt (frontend) stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/node:lts-alpine AS frontend-builder
|
||||
FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-builder
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally again (it can reuse the cache if not changed)
|
||||
@@ -22,7 +22,7 @@ COPY --from=frontend-dependencies /app/node_modules ./node_modules
|
||||
RUN pnpm build
|
||||
|
||||
# Go dependencies stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/golang:alpine AS builder-dependencies
|
||||
FROM public.ecr.aws/docker/library/golang:alpine AS builder-dependencies
|
||||
WORKDIR /go/src/app
|
||||
|
||||
# Copy go.mod and go.sum for better caching
|
||||
@@ -30,7 +30,7 @@ COPY ./backend/go.mod ./backend/go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
# Build API stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/golang:alpine AS builder
|
||||
FROM public.ecr.aws/docker/library/golang:alpine AS builder
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
ARG BUILD_TIME
|
||||
@@ -40,7 +40,8 @@ ARG VERSION
|
||||
# Install necessary build tools
|
||||
RUN apk update && \
|
||||
apk upgrade && \
|
||||
apk add --no-cache git build-base gcc g++
|
||||
apk add --no-cache git build-base gcc g++ && \
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif libheif libjxl; fi
|
||||
|
||||
WORKDIR /go/src/app
|
||||
|
||||
@@ -55,17 +56,17 @@ COPY --from=frontend-builder /app/.output/public ./app/api/static/public
|
||||
# Use cache for Go build artifacts
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
if [ "$TARGETARCH" = "arm" ] || [ "$TARGETARCH" = "riscv64" ]; \
|
||||
then CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build \
|
||||
then echo "nodynamic" $TARGETOS $TARGETARCH; CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-tags nodynamic -o /go/bin/api -v ./app/api/*.go; \
|
||||
else \
|
||||
CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build \
|
||||
echo $TARGETOS $TARGETARCH; CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-o /go/bin/api -v ./app/api/*.go; \
|
||||
fi
|
||||
|
||||
# Production stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/alpine:latest
|
||||
FROM public.ecr.aws/docker/library/alpine:latest
|
||||
ENV HBOX_MODE=production
|
||||
ENV HBOX_STORAGE_CONN_STRING=file:///?no_tmp_dir=true
|
||||
ENV HBOX_STORAGE_PREFIX_PATH=data
|
||||
@@ -73,7 +74,7 @@ ENV HBOX_DATABASE_SQLITE_PATH=/data/homebox.db?_pragma=busy_timeout=2000&_pragma
|
||||
|
||||
# Install necessary runtime dependencies
|
||||
RUN apk --no-cache add ca-certificates wget && \
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif; fi
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif libheif libjxl; fi
|
||||
|
||||
# Create application directory and copy over built Go binary
|
||||
RUN mkdir /app
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Node dependencies stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/node:lts-alpine AS frontend-dependencies
|
||||
FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-dependencies
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally (caching layer)
|
||||
@@ -10,7 +10,7 @@ COPY frontend/package.json frontend/pnpm-lock.yaml ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# Build Nuxt (frontend) stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/node:lts-alpine AS frontend-builder
|
||||
FROM public.ecr.aws/docker/library/node:lts-alpine AS frontend-builder
|
||||
WORKDIR /app
|
||||
|
||||
# Install pnpm globally again (it can reuse the cache if not changed)
|
||||
@@ -22,7 +22,7 @@ COPY --from=frontend-dependencies /app/node_modules ./node_modules
|
||||
RUN pnpm build
|
||||
|
||||
# Go dependencies stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/golang:alpine AS builder-dependencies
|
||||
FROM public.ecr.aws/docker/library/golang:alpine AS builder-dependencies
|
||||
WORKDIR /go/src/app
|
||||
|
||||
# Copy go.mod and go.sum for better caching
|
||||
@@ -30,7 +30,9 @@ COPY ./backend/go.mod ./backend/go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
# Build API stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/golang:alpine AS builder
|
||||
FROM public.ecr.aws/docker/library/golang:alpine AS builder
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
ARG BUILD_TIME
|
||||
ARG COMMIT
|
||||
ARG VERSION
|
||||
@@ -38,7 +40,8 @@ ARG VERSION
|
||||
# Install necessary build tools
|
||||
RUN apk update && \
|
||||
apk upgrade && \
|
||||
apk add --no-cache git build-base gcc g++
|
||||
apk add --no-cache git build-base gcc g++ && \
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif libheif libjxl; fi
|
||||
|
||||
WORKDIR /go/src/app
|
||||
|
||||
@@ -53,11 +56,11 @@ COPY --from=frontend-builder /app/.output/public ./app/api/static/public
|
||||
# Use cache for Go build artifacts
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
if [ "$TARGETARCH" = "arm" ] || [ "$TARGETARCH" = "riscv64" ]; \
|
||||
then CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build \
|
||||
then echo "nodynamic" $TARGETOS $TARGETARCH; CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-tags nodynamic -o /go/bin/api -v ./app/api/*.go; \
|
||||
else \
|
||||
CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build \
|
||||
echo $TARGETOS $TARGETARCH; CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \
|
||||
-ldflags "-s -w -X main.commit=$COMMIT -X main.buildTime=$BUILD_TIME -X main.version=$VERSION" \
|
||||
-o /go/bin/api -v ./app/api/*.go; \
|
||||
fi
|
||||
@@ -65,7 +68,7 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||
RUN mkdir /data
|
||||
|
||||
# Production stage
|
||||
FROM --platform=$BUILDPLATFORM public.ecr.aws/docker/library/alpine:latest
|
||||
FROM public.ecr.aws/docker/library/alpine:latest
|
||||
ENV HBOX_MODE=production
|
||||
ENV HBOX_STORAGE_CONN_STRING=file:///?no_tmp_dir=true
|
||||
ENV HBOX_STORAGE_PREFIX_PATH=data
|
||||
@@ -73,7 +76,7 @@ ENV HBOX_DATABASE_SQLITE_PATH=/data/homebox.db?_pragma=busy_timeout=2000&_pragma
|
||||
|
||||
# Install necessary runtime dependencies
|
||||
RUN apk --no-cache add ca-certificates wget && \
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif; fi
|
||||
if [ "$TARGETARCH" != "arm" ] || [ "$TARGETARCH" != "riscv64" ]; then apk --no-cache add libwebp libavif libheif libjxl; fi
|
||||
|
||||
# Create a nonroot user with UID/GID 65532
|
||||
RUN addgroup -g 65532 nonroot && adduser -u 65532 -G nonroot -S nonroot
|
||||
|
||||
@@ -3,6 +3,7 @@ package v1
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -174,7 +175,7 @@ func (ctrl *V1Controller) handleItemAttachmentsHandler(w http.ResponseWriter, r
|
||||
ctx := services.NewContext(r.Context())
|
||||
switch r.Method {
|
||||
case http.MethodGet:
|
||||
doc, err := ctrl.svc.Items.AttachmentPath(r.Context(), attachmentID)
|
||||
doc, err := ctrl.svc.Items.AttachmentPath(r.Context(), ctx.GID, attachmentID)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("failed to get attachment path")
|
||||
return validate.NewRequestError(err, http.StatusInternalServerError)
|
||||
@@ -203,7 +204,9 @@ func (ctrl *V1Controller) handleItemAttachmentsHandler(w http.ResponseWriter, r
|
||||
}
|
||||
}(bucket)
|
||||
|
||||
w.Header().Set("Content-Disposition", "attachment; filename="+doc.Title)
|
||||
// Set the Content-Disposition header for RFC6266 compliance
|
||||
disposition := "attachment; filename*=UTF-8''" + url.QueryEscape(doc.Title)
|
||||
w.Header().Set("Content-Disposition", disposition)
|
||||
http.ServeContent(w, r, doc.Title, doc.CreatedAt, file)
|
||||
return nil
|
||||
|
||||
@@ -227,9 +230,9 @@ func (ctrl *V1Controller) handleItemAttachmentsHandler(w http.ResponseWriter, r
|
||||
}
|
||||
|
||||
attachment.ID = attachmentID
|
||||
val, err := ctrl.svc.Items.AttachmentUpdate(ctx, ID, &attachment)
|
||||
val, err := ctrl.svc.Items.AttachmentUpdate(ctx, ctx.GID, ID, &attachment)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("failed to delete attachment")
|
||||
log.Err(err).Msg("failed to update attachment")
|
||||
return validate.NewRequestError(err, http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"io"
|
||||
)
|
||||
|
||||
func (svc *ItemService) AttachmentPath(ctx context.Context, attachmentID uuid.UUID) (*ent.Attachment, error) {
|
||||
attachment, err := svc.repo.Attachments.Get(ctx, attachmentID)
|
||||
func (svc *ItemService) AttachmentPath(ctx context.Context, gid uuid.UUID, attachmentID uuid.UUID) (*ent.Attachment, error) {
|
||||
attachment, err := svc.repo.Attachments.Get(ctx, gid, attachmentID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -19,16 +19,16 @@ func (svc *ItemService) AttachmentPath(ctx context.Context, attachmentID uuid.UU
|
||||
return attachment, nil
|
||||
}
|
||||
|
||||
func (svc *ItemService) AttachmentUpdate(ctx Context, itemID uuid.UUID, data *repo.ItemAttachmentUpdate) (repo.ItemOut, error) {
|
||||
func (svc *ItemService) AttachmentUpdate(ctx Context, gid uuid.UUID, itemID uuid.UUID, data *repo.ItemAttachmentUpdate) (repo.ItemOut, error) {
|
||||
// Update Attachment
|
||||
attachment, err := svc.repo.Attachments.Update(ctx, data.ID, data)
|
||||
attachment, err := svc.repo.Attachments.Update(ctx, gid, data.ID, data)
|
||||
if err != nil {
|
||||
return repo.ItemOut{}, err
|
||||
}
|
||||
|
||||
// Update Document
|
||||
attDoc := attachment
|
||||
_, err = svc.repo.Attachments.Rename(ctx, attDoc.ID, data.Title)
|
||||
_, err = svc.repo.Attachments.Rename(ctx, gid, attDoc.ID, data.Title)
|
||||
if err != nil {
|
||||
return repo.ItemOut{}, err
|
||||
}
|
||||
@@ -57,7 +57,7 @@ func (svc *ItemService) AttachmentAdd(ctx Context, itemID uuid.UUID, filename st
|
||||
|
||||
func (svc *ItemService) AttachmentDelete(ctx context.Context, gid uuid.UUID, id uuid.UUID, attachmentID uuid.UUID) error {
|
||||
// Delete the attachment
|
||||
err := svc.repo.Attachments.Delete(ctx, attachmentID)
|
||||
err := svc.repo.Attachments.Delete(ctx, gid, id, attachmentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -256,16 +256,30 @@ func (r *AttachmentRepo) Create(ctx context.Context, itemID uuid.UUID, doc ItemC
|
||||
return attachmentDb, nil
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Get(ctx context.Context, id uuid.UUID) (*ent.Attachment, error) {
|
||||
func (r *AttachmentRepo) Get(ctx context.Context, gid uuid.UUID, id uuid.UUID) (*ent.Attachment, error) {
|
||||
return r.db.Attachment.
|
||||
Query().
|
||||
Where(attachment.ID(id)).
|
||||
Where(
|
||||
attachment.ID(id),
|
||||
attachment.HasItemWith(item.HasGroupWith(group.ID(gid))),
|
||||
).
|
||||
WithItem().
|
||||
WithThumbnail().
|
||||
Only(ctx)
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Update(ctx context.Context, id uuid.UUID, data *ItemAttachmentUpdate) (*ent.Attachment, error) {
|
||||
func (r *AttachmentRepo) Update(ctx context.Context, gid uuid.UUID, id uuid.UUID, data *ItemAttachmentUpdate) (*ent.Attachment, error) {
|
||||
// Validate that the attachment belongs to the specified group
|
||||
_, err := r.db.Attachment.Query().
|
||||
Where(
|
||||
attachment.ID(id),
|
||||
attachment.HasItemWith(item.HasGroupWith(group.ID(gid))),
|
||||
).
|
||||
Only(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// TODO: execute within Tx
|
||||
typ := attachment.Type(data.Type)
|
||||
|
||||
@@ -301,13 +315,19 @@ func (r *AttachmentRepo) Update(ctx context.Context, id uuid.UUID, data *ItemAtt
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.Get(ctx, updatedAttachment.ID)
|
||||
return r.Get(ctx, gid, updatedAttachment.ID)
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Delete(ctx context.Context, id uuid.UUID) error {
|
||||
doc, error := r.db.Attachment.Get(ctx, id)
|
||||
if error != nil {
|
||||
return error
|
||||
func (r *AttachmentRepo) Delete(ctx context.Context, gid uuid.UUID, itemId uuid.UUID, id uuid.UUID) error {
|
||||
// Validate that the attachment belongs to the specified group
|
||||
doc, err := r.db.Attachment.Query().
|
||||
Where(
|
||||
attachment.ID(id),
|
||||
attachment.HasItemWith(item.HasGroupWith(group.ID(gid))),
|
||||
).
|
||||
Only(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
all, err := r.db.Attachment.Query().Where(attachment.Path(doc.Path)).All(ctx)
|
||||
@@ -358,7 +378,18 @@ func (r *AttachmentRepo) Delete(ctx context.Context, id uuid.UUID) error {
|
||||
return r.db.Attachment.DeleteOneID(id).Exec(ctx)
|
||||
}
|
||||
|
||||
func (r *AttachmentRepo) Rename(ctx context.Context, id uuid.UUID, title string) (*ent.Attachment, error) {
|
||||
func (r *AttachmentRepo) Rename(ctx context.Context, gid uuid.UUID, id uuid.UUID, title string) (*ent.Attachment, error) {
|
||||
// Validate that the attachment belongs to the specified group
|
||||
_, err := r.db.Attachment.Query().
|
||||
Where(
|
||||
attachment.ID(id),
|
||||
attachment.HasItemWith(item.HasGroupWith(group.ID(gid))),
|
||||
).
|
||||
Only(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.db.Attachment.UpdateOneID(id).SetTitle(title).Save(ctx)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ services:
|
||||
image: homebox
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile
|
||||
dockerfile: ./Dockerfile.rootless
|
||||
args:
|
||||
- COMMIT=head
|
||||
- BUILD_TIME=0001-01-01T00:00:00Z
|
||||
@@ -12,7 +12,6 @@ services:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
- linux/arm/v7
|
||||
- linux/riscv64
|
||||
environment:
|
||||
- HBOX_DEBUG=true
|
||||
- HBOX_LOGGER_LEVEL=-1
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
class="absolute left-0 top-0 size-full cursor-pointer opacity-0"
|
||||
type="file"
|
||||
accept="image/png,image/jpeg,image/gif,image/avif,image/webp;capture=camera"
|
||||
capture="environment"
|
||||
multiple
|
||||
@change="previewImage"
|
||||
/>
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
"new_version_available_link": "Klicken Sie hier, um die Release Notes anzuzeigen"
|
||||
}
|
||||
},
|
||||
"color_selector": {
|
||||
"clear": "Farbe löschen",
|
||||
"color": "Farbe",
|
||||
"no_color": "Keine Farbe",
|
||||
"no_color_selected": "Keine Farbe ausgewählt"
|
||||
},
|
||||
"form": {
|
||||
"password": {
|
||||
"toggle_show": "Passwort anzeigen"
|
||||
@@ -107,8 +113,8 @@
|
||||
"rotate_process_failed": "Das gedrehte Bild konnte nicht verarbeitet werden",
|
||||
"some_photos_failed": "{Anzahl, Plural, =0 {Keine Fotos zum Hochladen.} =1 {1 Foto konnte nicht hochgeladen werden.} andere {Einige Fotos konnten nicht hochgeladen werden.}}",
|
||||
"upload_failed": "Hochladen des Bildes Fehlgeschlagen: { photoName }",
|
||||
"upload_success": "{Anzahl, Plural, =0 {Keine Fotos hochgeladen.} =1 {Foto erfolgreich hochgeladen.} andere {Alle Fotos erfolgreich hochgeladen.}}",
|
||||
"uploading_photos": "{Anzahl, Plural, =0 {Keine Fotos zum Hochladen} =1 {1 Foto wird hochgeladen...} andere {{Anzahl} Fotos werden hochgeladen...}}"
|
||||
"upload_success": "{Anzahl, plural, =0 {Keine Fotos hochgeladen.} =1 {Foto erfolgreich hochgeladen.} other {Alle Fotos erfolgreich hochgeladen.}}",
|
||||
"uploading_photos": "{Anzahl, plural, =0 {Keine Fotos zum Hochladen} =1 {1 Foto wird hochgeladen...} other {{Anzahl} Fotos werden hochgeladen...}}"
|
||||
},
|
||||
"upload_photos": "Upload Bilder",
|
||||
"uploaded": "Bild hochgeladen"
|
||||
|
||||
@@ -115,15 +115,15 @@
|
||||
"some_photos_failed": "{count, plural, =0 {No photos to upload.} =1 {1 photo failed to upload.} other {Some photos failed to upload.}}",
|
||||
"upload_failed": "Failed to upload photo: { photoName }",
|
||||
"upload_success": "{count, plural, =0 {No photos uploaded.} =1 {Photo uploaded successfully.} other {All photos uploaded successfully.}}",
|
||||
"uploading_photos": "{count, plural, =0 {No photos to upload} =1 {Uploading 1 photo...} other {Uploading {count} photos...}}"
|
||||
"uploading_photos": "{count, plural, =0 {No photos to upload} =1 {Uploading 1 photo…} other {Uploading {count} photos…}}"
|
||||
},
|
||||
"upload_photos": "Upload Photos",
|
||||
"uploaded": "Uploaded Photo"
|
||||
},
|
||||
"selector": {
|
||||
"no_results": "No Results Found",
|
||||
"placeholder": "Select...",
|
||||
"search_placeholder": "Type to search..."
|
||||
"placeholder": "Select…",
|
||||
"search_placeholder": "Type to search…"
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
@@ -176,7 +176,7 @@
|
||||
"select_location": "Select a Location"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "No locations available. Add new locations through the\n `<`span class=\"link-primary\"`>`Create`<`/span`>` button on the navigation bar."
|
||||
"no_locations": "No locations available. Add new locations through the\n '<span class=\"link-primary\">'Create'</span>' button on the navigation bar."
|
||||
}
|
||||
},
|
||||
"quick_menu": {
|
||||
@@ -204,14 +204,14 @@
|
||||
"follow_dev": "Follow the Developer",
|
||||
"footer": {
|
||||
"api_link": "'<a href=\"https://homebox.software/en/api/\" target=\"_blank\">'API'</a>'",
|
||||
"version_link": "'<a href=\"https://github.com/sysadminsmedia/homebox/releases/tag/v'{ version }\" target=\"_blank\"> Version: { version } Build: { build } '</a>'"
|
||||
"version_link": "'<a href=\"https://github.com/sysadminsmedia/homebox/releases/tag/{ version }\" target=\"_blank\">' Version: { version } Build: { build } '</a>'"
|
||||
},
|
||||
"github": "GitHub Project",
|
||||
"insured": "Insured",
|
||||
"items": "Items",
|
||||
"join_discord": "Join the Discord",
|
||||
"labels": "Labels",
|
||||
"loading": "Loading...",
|
||||
"loading": "Loading…",
|
||||
"locations": "Locations",
|
||||
"maintenance": "Maintenance",
|
||||
"name": "Name",
|
||||
|
||||
@@ -587,7 +587,7 @@
|
||||
"import": "インポート (CSVの取り込み)",
|
||||
"import_button": "CSVファイルを選択",
|
||||
"import_ref_confirm": "",
|
||||
"import_sub": "Homeboxで利用可能なCSVファイルをインポートします。'<br>''<code>'HB.import_ref'</code>'が存在しないアイテムに重複がある場合は上書きされません。'<br>''<code>'HB.import_ref'</code>'が存在するアイテムに重複がある場合は、同じ'<code>'HB.import_ref'</code>'を持つアイテムのデータが上書きされます。'<br>'どちらも、重複していない場合は関係なく追加されます。"
|
||||
"import_sub": "Homeboxで利用可能なCSVファイルをインポートします。\n'<code>'HB.import_ref'</code>'が存在しないアイテムに重複がある場合は上書きされません。\n'<code>'HB.import_ref'</code>'が存在するアイテムに重複がある場合は、同じ'<code>'HB.import_ref'</code>'を持つアイテムのデータが上書きされます。\nどちらも、重複していない場合は関係なく追加されます。"
|
||||
},
|
||||
"import_export_sub": "登録されたアイテムをCSVファイルにインポートおよびエクスポートします。Homeboxのソフトウェアを切り替える場合などに便利です。",
|
||||
"reports": "レポート",
|
||||
|
||||
@@ -571,7 +571,7 @@
|
||||
"actions": "Acties inventariseren",
|
||||
"actions_set": {
|
||||
"create_missing_thumbnails": "Ontbrekende miniaturen maken",
|
||||
"create_missing_thumbnails_button": "Nieuwe thumbnails aanmaken",
|
||||
"create_missing_thumbnails_button": "Nieuwe miniaturen aanmaken",
|
||||
"create_missing_thumbnails_confirm": "Weet u zeker dat u ontbrekende miniaturen wilt maken? Dit kan even duren en kan niet worden gepauzeerd.",
|
||||
"create_missing_thumbnails_sub": "Maakt miniaturen voor alle bijlagen die worden ondersteund door de huidige configuratie. Dit is handig voor bijlagen die werden geüpload voor de v0.20.0 release van Homebox. Bestaande miniaturen worden niet overschreven, er worden alleen nieuwe miniaturen gemaakt voor bijlagen die geen miniatuurafbeelding hebben. Houd er rekening mee dat de miniaturen in de achtergrond worden gemaakt en dat dit een tijdje kan duren.",
|
||||
"ensure_ids": "Zorg voor item-ID's",
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
"select_location": "Selecionar um Local"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Não há locais disponíveis. Adicione novos locais\n através do botão \"Criar\" na barra de navegação."
|
||||
"no_locations": "Não há locais disponíveis. Adicione novos locais\n através do botão '<span class=\"link-primary\">'Criar'</span>' na barra de navegação."
|
||||
}
|
||||
},
|
||||
"quick_menu": {
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
"follow_dev": "Siga o Desenvolvedor",
|
||||
"footer": {
|
||||
"api_link": "'<a href=\"https://homebox.software/en/api/\" target=\"_blank\">'API'</a>'",
|
||||
"version_link": "<a href=\"https://github.com/sysadminsmedia/homebox/releases/tag/'{ version }\" target=\"_blank\"> Versão: { version } Compilação: { build } '</a>'"
|
||||
"version_link": "'<a href=\"https://github.com/sysadminsmedia/homebox/releases/tag/{ version }\" target=\"_blank\">' Versão: { version } Compilação: { build } '</a>'"
|
||||
},
|
||||
"github": "Projeto GitHub",
|
||||
"insured": "Com seguro",
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
"shift": "Shift"
|
||||
},
|
||||
"import_dialog": {
|
||||
"change_warning": "Správanie pre importy s existujúcimi import_refs sa zmenilo. Ak sa v súbore CSV nachádza import_ref,\npoložka bude aktualizovaná hodnotami v súbore CSV.",
|
||||
"description": "Importujte súbor CSV obsahujúci vaše položky, štítky a miesta. Ďalšie informácie nájdete v dokumentácii\npožadovaný formát.",
|
||||
"change_warning": "Správanie importov s existujúcimi import_refs sa zmenilo. Ak sa v súbore CSV nachádza import_ref,\npoložka bude aktualizovaná hodnotami v súbore CSV.",
|
||||
"description": "Importujte súbor CSV obsahujúci vaše položky, štítky a miesta. Ďalšie informácie o vyžadovanom formáte importu\nnájdete v dokumentácii.",
|
||||
"title": "Importovať súbor CSV",
|
||||
"toast": {
|
||||
"import_failed": "Import skončil s chybou. Skúste to, prosím, neskôr.",
|
||||
"import_success": "Import bol úspešný!",
|
||||
"import_success": "Import prebehol úspešne!",
|
||||
"please_select_file": "Prosím, vyberte súbor, ktorý sa má naimportovať."
|
||||
}
|
||||
},
|
||||
@@ -81,8 +81,8 @@
|
||||
}
|
||||
},
|
||||
"page_qr_code": {
|
||||
"page_url": "URL stránka",
|
||||
"qr_tooltip": "Zobraz QR kód"
|
||||
"page_url": "URL adresa stránky",
|
||||
"qr_tooltip": "Zobraziť QR kód"
|
||||
},
|
||||
"password_score": {
|
||||
"password_strength": "Sila hesla"
|
||||
@@ -94,36 +94,36 @@
|
||||
"open_new_tab": "Otvoriť na novej karte"
|
||||
},
|
||||
"create_modal": {
|
||||
"delete_photo": "Vymazať fotku",
|
||||
"delete_photo": "Vymazať fotografiu",
|
||||
"item_description": "Popis položky",
|
||||
"item_name": "Názov položky",
|
||||
"item_photo": "Obrázok predmetu 📷",
|
||||
"item_photo": "Fotografia predmetu 📷",
|
||||
"item_quantity": "Počet predmetov",
|
||||
"parent_item": "Nadradená položka",
|
||||
"rotate_photo": "Otočiť fotku",
|
||||
"set_as_primary_photo": "",
|
||||
"rotate_photo": "Otočiť fotografiu",
|
||||
"set_as_primary_photo": "Nastaviť ako { isPrimary, select, true {non-} false {} other {}}primárnu fotografiu",
|
||||
"title": "Vytvoriť položku",
|
||||
"toast": {
|
||||
"already_creating": "",
|
||||
"create_failed": "",
|
||||
"create_success": "",
|
||||
"failed_load_parent": "",
|
||||
"no_canvas_support": "",
|
||||
"please_select_location": "",
|
||||
"rotate_failed": "",
|
||||
"rotate_process_failed": "",
|
||||
"some_photos_failed": "",
|
||||
"upload_failed": "",
|
||||
"upload_success": "",
|
||||
"uploading_photos": ""
|
||||
"already_creating": "Už vytváram položku",
|
||||
"create_failed": "Nepodarilo sa vytvoriť položku",
|
||||
"create_success": "Položka bola vytvorená",
|
||||
"failed_load_parent": "Nadradenú položku sa nepodarilo načítať - vyberte ju, prosím, ručne",
|
||||
"no_canvas_support": "Váš prehliadač nepodporuje operácie canvas",
|
||||
"please_select_location": "Prosím, vyberte miesto.",
|
||||
"rotate_failed": "Obrázok sa nepodarilo otočiť: { error }",
|
||||
"rotate_process_failed": "Nepodarilo sa spracovať otočený obrázok",
|
||||
"some_photos_failed": "{count, plural, =0 {Žiadne fotografie na nahranie.} =1 {1 fotografiu sa nepodarilo nahrať.} other {Niektoré fotografie sa nepodarilo nahrať.}}",
|
||||
"upload_failed": "Nepodarilo sa nahrať fotografiu: { photoName }",
|
||||
"upload_success": "{count, plural, =0 {Žiadne fotografie neboli nahrané.} =1 {Fotografia bola úspešne nahraná.} other {Všetky fotografie boli úspešne nahrané.}}",
|
||||
"uploading_photos": "{count, plural, =0 {Žiadne fotografie na nahranie} =1 {Nahrávam 1 fotografiu...} other {Nahrávam {count} fotografií...}}"
|
||||
},
|
||||
"upload_photos": "Nahraj fotky",
|
||||
"uploaded": ""
|
||||
"upload_photos": "Nahrať fotografie",
|
||||
"uploaded": "Nahraná fotografia"
|
||||
},
|
||||
"selector": {
|
||||
"no_results": "",
|
||||
"placeholder": "",
|
||||
"search_placeholder": ""
|
||||
"no_results": "Nenašli sa žiadne výsledky",
|
||||
"placeholder": "Vybrať...",
|
||||
"search_placeholder": "Zadajte, čo chcete vyhľadať..."
|
||||
},
|
||||
"view": {
|
||||
"selectable": {
|
||||
@@ -134,10 +134,10 @@
|
||||
},
|
||||
"table": {
|
||||
"headers": "Hlavička",
|
||||
"page": "Stránka",
|
||||
"rows_per_page": "Počet riadkov na stránku",
|
||||
"page": "Strana",
|
||||
"rows_per_page": "Počet riadkov na stranu",
|
||||
"table_settings": "Nastavenie tabuľky",
|
||||
"view_item": ""
|
||||
"view_item": "Zobraziť položku"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -148,10 +148,10 @@
|
||||
"label_name": "Názov štítku",
|
||||
"title": "Vytvoriť štítok",
|
||||
"toast": {
|
||||
"already_creating": "",
|
||||
"create_failed": "",
|
||||
"already_creating": "Štítok sa už vytvára",
|
||||
"create_failed": "Nepodarilo sa vytvoriť štítok",
|
||||
"create_success": "Štítok bol vytvorený",
|
||||
"label_name_too_long": "Meno štítku nesmie byť dlhšie ako 50 znakov"
|
||||
"label_name_too_long": "Názov štítku nesmie byť dlhší ako 50 znakov"
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
@@ -162,71 +162,71 @@
|
||||
"create_modal": {
|
||||
"location_description": "Popis miesta",
|
||||
"location_name": "Názov miesta",
|
||||
"title": "Vytvoriť polohu",
|
||||
"title": "Vytvoriť miesto",
|
||||
"toast": {
|
||||
"already_creating": "Lokalita sa už vytvára",
|
||||
"create_failed": "",
|
||||
"create_success": ""
|
||||
"already_creating": "Miesto sa už vytvára",
|
||||
"create_failed": "Nepodarilo sa vytvoriť miesto",
|
||||
"create_success": "Miesto bolo vytvorené"
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
"no_location_found": "Poloha nenájdená",
|
||||
"parent_location": "Poloha rodiča",
|
||||
"search_location": "",
|
||||
"select_location": ""
|
||||
"no_location_found": "Miesto nebolo nájdené",
|
||||
"parent_location": "Miesto nadradenej položky",
|
||||
"search_location": "Prehľadávať miesta",
|
||||
"select_location": "Vyberte miesto"
|
||||
},
|
||||
"tree": {
|
||||
"no_locations": "Nie sú k dispozícii žiadne miesta. Pridajte nové miesta cez\n `<`span class=\"link-primary\"`>`Vytvoriť`<`/span`>` na navigačnom paneli."
|
||||
}
|
||||
},
|
||||
"quick_menu": {
|
||||
"no_results": "",
|
||||
"no_results": "Nenašli sa žiadne výsledky.",
|
||||
"shortcut_hint": "Pomocou číselných tlačidiel rýchlo vyberte akciu."
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"add": "Pridať",
|
||||
"archived": "",
|
||||
"archived": "Archivované",
|
||||
"build": "Zostava: { build }",
|
||||
"cancel": "",
|
||||
"cancel": "Zrušiť",
|
||||
"confirm": "Potvrďte",
|
||||
"create": "Vytvorte",
|
||||
"create": "Vytvoriť",
|
||||
"create_and_add": "Vytvoriť a pridať ďalšie",
|
||||
"create_subitem": "",
|
||||
"create_subitem": "Vytvoriť podpoložku",
|
||||
"created": "Vytvorené",
|
||||
"delete": "Odstrániť",
|
||||
"delete_confirm": "",
|
||||
"demo_instance": "",
|
||||
"delete_confirm": "Naozaj chcete odstrániť túto položku? ",
|
||||
"demo_instance": "Toto je ukážková inštancia",
|
||||
"details": "Podrobnosti",
|
||||
"duplicate": "Duplicitné",
|
||||
"duplicate": "Duplikovať",
|
||||
"edit": "Upraviť",
|
||||
"email": "Email",
|
||||
"follow_dev": "Sledujte vývojára",
|
||||
"footer": {
|
||||
"api_link": "",
|
||||
"version_link": ""
|
||||
"api_link": "'<a href=\"https://homebox.software/en/api/\" target=\"_blank\">'API'</a>'",
|
||||
"version_link": "'<a href=\"https://github.com/sysadminsmedia/homebox/releases/tag/v'{ version }\" target=\"_blank\"> Verzia: { version } Zostavenie: { build } '</a>'"
|
||||
},
|
||||
"github": "Projekt GitHub",
|
||||
"insured": "",
|
||||
"insured": "Poistené",
|
||||
"items": "Položky",
|
||||
"join_discord": "Pripojte sa k Discordu",
|
||||
"labels": "Štítky",
|
||||
"loading": "",
|
||||
"loading": "Načítam...",
|
||||
"locations": "Miesta",
|
||||
"maintenance": "Údržba",
|
||||
"name": "Meno",
|
||||
"name": "Názov",
|
||||
"navigate": "Navigovať",
|
||||
"password": "heslo",
|
||||
"quantity": "",
|
||||
"quantity": "Množstvo",
|
||||
"read_docs": "Prečítajte si Dokumenty",
|
||||
"return_home": "",
|
||||
"return_home": "Vrátiť sa na začiatok",
|
||||
"save": "Uložiť",
|
||||
"search": "Hľadať",
|
||||
"sign_out": "Odhlásiť sa",
|
||||
"submit": "Odoslať",
|
||||
"unknown": "",
|
||||
"unknown": "Neznáme",
|
||||
"update": "Aktualizovať",
|
||||
"updating": "",
|
||||
"updating": "Aktualizujem",
|
||||
"value": "Hodnota",
|
||||
"version": "Verzia: { version }",
|
||||
"welcome": "Vitajte, { username }"
|
||||
@@ -252,13 +252,13 @@
|
||||
"set_name": "Ako sa voláte?",
|
||||
"set_password": "Nastavte si heslo",
|
||||
"tagline": "Sledujte, organizujte a spravujte svoje veci.",
|
||||
"title": "",
|
||||
"title": "Usporiadajte a označte svoje veci",
|
||||
"toast": {
|
||||
"invalid_email": "",
|
||||
"invalid_email_password": "",
|
||||
"login_success": "",
|
||||
"problem_registering": "",
|
||||
"user_registered": ""
|
||||
"invalid_email": "Neplatná e-mailová adresa",
|
||||
"invalid_email_password": "Neplatná e-mailová adresa alebo heslo",
|
||||
"login_success": "Úspešne prihlásený",
|
||||
"problem_registering": "Problém s registráciou používateľa",
|
||||
"user_registered": "Používateľ bol zaregistrovaný"
|
||||
}
|
||||
},
|
||||
"items": {
|
||||
@@ -266,25 +266,25 @@
|
||||
"advanced": "Pokročilé",
|
||||
"archived": "Archivované",
|
||||
"asset_id": "ID majetku",
|
||||
"associated_with_multiple": "",
|
||||
"associated_with_multiple": "Toto ID aktíva je priradené k viacerým položkám",
|
||||
"attachment": "Príloha",
|
||||
"attachments": "Prílohy",
|
||||
"changes_persisted_immediately": "Zmeny príloh sa okamžite uložia",
|
||||
"changes_persisted_immediately": "Zmeny v prílohách budú uložené okamžite",
|
||||
"created_at": "Čas vytvorenia",
|
||||
"custom_fields": "Vlastné polia",
|
||||
"delete_attachment_confirm": "",
|
||||
"delete_item_confirm": "",
|
||||
"delete_attachment_confirm": "Naozaj chcete odstrániť túto prílohu?",
|
||||
"delete_item_confirm": "Naozaj chcete odstrániť túto položku?",
|
||||
"description": "Popis",
|
||||
"details": "Podrobnosti",
|
||||
"drag_and_drop": "Presuňte súbory sem alebo kliknutím vyberte súbory",
|
||||
"edit": {
|
||||
"edit_attachment_dialog": {
|
||||
"attachment_title": "",
|
||||
"attachment_type": "",
|
||||
"primary_photo": "",
|
||||
"primary_photo_sub": "",
|
||||
"select_type": "",
|
||||
"title": ""
|
||||
"attachment_title": "Názov prílohy",
|
||||
"attachment_type": "Typ prílohy",
|
||||
"primary_photo": "Primárna fotografia",
|
||||
"primary_photo_sub": "Táto možnosť je dostupná len pre fotografie. Primárna môže byť iba jedna fotografia. Ak vyberiete túto voľbu, aktuálna primárna fotografia (ak taká existuje) bude zrušená.",
|
||||
"select_type": "Vyberte typ",
|
||||
"title": "Upraviť prílohu"
|
||||
}
|
||||
},
|
||||
"edit_details": "Upraviť podrobnosti",
|
||||
@@ -293,18 +293,18 @@
|
||||
"first": "Prvý",
|
||||
"include_archive": "Zahrnúť archivované položky",
|
||||
"insured": "Poistený",
|
||||
"invalid_asset_id": "",
|
||||
"invalid_asset_id": "Neplatné ID aktíva",
|
||||
"last": "Posledný",
|
||||
"lifetime_warranty": "Doživotná záruka",
|
||||
"location": "Poloha",
|
||||
"location": "Miesto",
|
||||
"manual": "Príručka",
|
||||
"manuals": "Príručky",
|
||||
"manufacturer": "Výrobca",
|
||||
"model_number": "Číslo modelu",
|
||||
"name": "Meno",
|
||||
"name": "Názov",
|
||||
"negate_labels": "Negovať vybrané označenia",
|
||||
"next_page": "Ďalšia strana",
|
||||
"no_attachments": "",
|
||||
"no_attachments": "Neboli nájdené žiadne prílohy.",
|
||||
"no_results": "Nenašli sa žiadne položky",
|
||||
"notes": "Poznámky",
|
||||
"only_with_photo": "Iba položky s fotografiou",
|
||||
@@ -315,7 +315,7 @@
|
||||
"parent_item": "Nadradená položka",
|
||||
"photo": "Fotografia",
|
||||
"photos": "Fotografie",
|
||||
"prev_page": "Predchádzajúca stránka",
|
||||
"prev_page": "Predchádzajúca strana",
|
||||
"purchase_date": "Dátum nákupu",
|
||||
"purchase_details": "Podrobnosti o nákupe",
|
||||
"purchase_price": "Kúpna cena",
|
||||
@@ -326,44 +326,44 @@
|
||||
"receipts": "Účtenky",
|
||||
"reset_search": "Obnoviť vyhľadávanie",
|
||||
"results": "{ total } Výsledky",
|
||||
"select_field": "",
|
||||
"select_field": "Vyberte pole",
|
||||
"serial_number": "Sériové číslo",
|
||||
"show_advanced_view_options": "Zobraziť rozšírené možnosti zobrazenia",
|
||||
"sold_at": "Predané v",
|
||||
"sold_at": "Predané dňa",
|
||||
"sold_details": "Podrobnosti o predaji",
|
||||
"sold_price": "Predajná cena",
|
||||
"sold_to": "Predané Komu",
|
||||
"sync_child_locations": "",
|
||||
"sold_to": "Predané komu",
|
||||
"sync_child_locations": "Synchronizovať miesta podriadených položiek",
|
||||
"tip_1": "Filtre umiestnení a štítkov používajú operáciu 'OR'. Ak je vybratých viac ako jeden,\n bude vybraný iba jeden potrebné na zápas.",
|
||||
"tip_2": "Vyhľadávania s predponou # budú dotazovať na identifikátor diela (napríklad #000-001)",
|
||||
"tip_3": "Filtre poľa používajú operáciu 'OR' . Ak je vybratých viac ako jeden, bude potrebný iba jeden pre a\n zápas.",
|
||||
"tips": "Tipy",
|
||||
"tips_sub": "Tipy na vyhľadávanie",
|
||||
"toast": {
|
||||
"asset_not_found": "",
|
||||
"attachment_deleted": "",
|
||||
"attachment_updated": "",
|
||||
"attachment_uploaded": "",
|
||||
"child_items_location_no_longer_synced": "",
|
||||
"child_items_location_synced": "",
|
||||
"child_location_desync": "",
|
||||
"error_loading_parent_data": "",
|
||||
"failed_adjust_quantity": "",
|
||||
"failed_delete_attachment": "",
|
||||
"failed_delete_item": "",
|
||||
"failed_duplicate_item": "",
|
||||
"failed_load_asset": "",
|
||||
"failed_load_item": "",
|
||||
"failed_load_items": "",
|
||||
"failed_save": "",
|
||||
"failed_save_no_location": "",
|
||||
"failed_search_items": "",
|
||||
"failed_update_attachment": "",
|
||||
"failed_upload_attachment": "",
|
||||
"item_deleted": "",
|
||||
"item_saved": "",
|
||||
"quantity_cannot_negative": "",
|
||||
"sync_child_location": ""
|
||||
"asset_not_found": "Aktívum sa nenašlo",
|
||||
"attachment_deleted": "Príloha bola odstránená",
|
||||
"attachment_updated": "Príloha bola aktualizovaná",
|
||||
"attachment_uploaded": "Príloha bola nahraná",
|
||||
"child_items_location_no_longer_synced": "Miesta podriadených položiek sa už nebudú synchronizovať s touto položkou.",
|
||||
"child_items_location_synced": "Miesta podriadených položiek bolo synchronizovaných s touto položkou",
|
||||
"child_location_desync": "Zmena miesta zruší synchronizáciou s miestom nadradenej položky",
|
||||
"error_loading_parent_data": "Pri pokus o načítanie údajov nadriadených položiek sa niečo pokazilo",
|
||||
"failed_adjust_quantity": "Množstvo sa nepodarilo upraviť",
|
||||
"failed_delete_attachment": "Nepodarilo sa odstrániť prílohu",
|
||||
"failed_delete_item": "Položku sa nepodarilo odstrániť",
|
||||
"failed_duplicate_item": "Nepodarilo sa duplikovať položku",
|
||||
"failed_load_asset": "Aktívum sa nepodarilo načítať",
|
||||
"failed_load_item": "Položku sa nepodarilo načítať",
|
||||
"failed_load_items": "Nepodarilo sa načítať položky",
|
||||
"failed_save": "Nepodarilo sa uložiť položku",
|
||||
"failed_save_no_location": "Položku sa nepodarilo uložiť: nevybrali ste žiadne miesto",
|
||||
"failed_search_items": "Nepodarilo sa vyhľadať položky",
|
||||
"failed_update_attachment": "Nepodarilo sa aktualizovať prílohy",
|
||||
"failed_upload_attachment": "Nepodarilo sa nahrať prílohu",
|
||||
"item_deleted": "Položka bola odstránená",
|
||||
"item_saved": "Položka bola uložená",
|
||||
"quantity_cannot_negative": "Množstvo nemôže byť záporné",
|
||||
"sync_child_location": "Vybraná položka nastavuje pre podriadené položky miesto podľa svojho. Miesto bolo aktualizované."
|
||||
},
|
||||
"updated_at": "Čas aktualizácie",
|
||||
"warranty": "Záruka",
|
||||
@@ -371,14 +371,14 @@
|
||||
"warranty_expires": "Záruka vyprší"
|
||||
},
|
||||
"labels": {
|
||||
"label_delete_confirm": "",
|
||||
"label_delete_confirm": "Naozaj chcete odstrániť tento štítok? Túto akciu nie je možné odvolať.",
|
||||
"no_results": "Nenašli sa žiadne štítky",
|
||||
"toast": {
|
||||
"failed_delete_label": "",
|
||||
"failed_load_label": "",
|
||||
"failed_update_label": "",
|
||||
"label_deleted": "",
|
||||
"label_updated": ""
|
||||
"failed_delete_label": "Nepodarilo sa odstrániť štítok",
|
||||
"failed_load_label": "Štítok sa nepodarilo načítať",
|
||||
"failed_update_label": "Štítok sa nepodarilo aktualizovať",
|
||||
"label_deleted": "Štítok bol odstránený",
|
||||
"label_updated": "Štítok bol aktualizovaný"
|
||||
},
|
||||
"update_label": "Aktualizovať štítok"
|
||||
},
|
||||
@@ -395,8 +395,8 @@
|
||||
"it": "Taliančina",
|
||||
"ja-JP": "Japonsky",
|
||||
"ko-KR": "Korejsky",
|
||||
"lb-LU": "",
|
||||
"lt-LT": "",
|
||||
"lb-LU": "Luxemburčina (Luxembursko)",
|
||||
"lt-LT": "Litovčina (Litva)",
|
||||
"nb-NO": "Nórsky",
|
||||
"nl": "Holandsky",
|
||||
"pl": "Poľsky",
|
||||
@@ -404,7 +404,7 @@
|
||||
"pt-PT": "Portugalsky (Portugalsko)",
|
||||
"ru": "Ruština",
|
||||
"sl": "Slovinsky",
|
||||
"sq-AL": "",
|
||||
"sq-AL": "Albánčina",
|
||||
"sv": "Švédčina",
|
||||
"ta-IN": "Tamilčina",
|
||||
"th-TH": "Thaičina",
|
||||
@@ -419,17 +419,17 @@
|
||||
"languages.ro-RO": "Rumunsko",
|
||||
"languages.sk-SK": "Slovenčina",
|
||||
"locations": {
|
||||
"child_locations": "Umiestnenie dieťaťa",
|
||||
"child_locations": "Umiestnenie podriadených",
|
||||
"collapse_tree": "Zbaliť strom",
|
||||
"expand_tree": "",
|
||||
"location_items_delete_confirm": "",
|
||||
"expand_tree": "Rozbaliť strom",
|
||||
"location_items_delete_confirm": "Naozaj chcete odstrániť toto miesto a všetky jeho položky? Túto akciu nie je možné odvolať.",
|
||||
"no_results": "Žiadne lokality neboli nájdené",
|
||||
"toast": {
|
||||
"failed_delete_location": "",
|
||||
"failed_load_location": "",
|
||||
"failed_update_location": "",
|
||||
"location_deleted": "",
|
||||
"location_updated": ""
|
||||
"failed_delete_location": "Miesto sa nepodarilo odstrániť",
|
||||
"failed_load_location": "Miesto sa nepodarilo načítať",
|
||||
"failed_update_location": "Miesto sa nepodarilo aktualizovať",
|
||||
"location_deleted": "Miesto bolo odstránené",
|
||||
"location_updated": "Miesto bolo aktualizované"
|
||||
},
|
||||
"update_location": "Aktualizovať lokalitu"
|
||||
},
|
||||
@@ -471,8 +471,8 @@
|
||||
"menu": {
|
||||
"create_item": "Položka / Aktívum",
|
||||
"create_label": "Štítok",
|
||||
"create_location": "Poloha",
|
||||
"home": "Domovská stránka",
|
||||
"create_location": "Miesto",
|
||||
"home": "Domov",
|
||||
"locations": "Miesta",
|
||||
"maintenance": "Údržba",
|
||||
"profile": "Profil",
|
||||
@@ -486,10 +486,10 @@
|
||||
"currency_format": "Formát meny",
|
||||
"current_password": "Aktuálne heslo",
|
||||
"delete_account": "Odstrániť účet",
|
||||
"delete_account_confirm": "",
|
||||
"delete_account_confirm": "Naozaj chcete odstrániť svoj účet? Ak ste posledným členom vo svojej skupine, všetky vaše údaje budú odstránené. Túto akciu nie je možné odvolať.",
|
||||
"delete_account_sub": "Odstráňte svoj účet a všetky súvisiace údaje. Toto nie je možné vrátiť späť.",
|
||||
"delete_notifier_confirm": "",
|
||||
"display_legacy_header": "",
|
||||
"delete_notifier_confirm": "Naozaj chcete odstrániť tento oznamovač?",
|
||||
"display_legacy_header": "{ currentValue, select, true {Zakázať staré záhlavie} false {Povoliť staré záhlavie} other {Nevybrané}}",
|
||||
"enabled": "Povolené",
|
||||
"example": "Príklad",
|
||||
"gen_invite": "Vygenerovať odkaz na pozvánku",
|
||||
@@ -498,28 +498,28 @@
|
||||
"inactive": "Neaktívne",
|
||||
"language": "Jazyk",
|
||||
"new_password": "Nové heslo",
|
||||
"no_notifiers": "Nie sú nakonfigurovaní žiadni upozorňovatelia",
|
||||
"no_override": "",
|
||||
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Oznamovateľ",
|
||||
"notifiers": "Oznamovatelia",
|
||||
"no_notifiers": "Nie sú nastavené žiadne oznamovače",
|
||||
"no_override": "Bez prepísania",
|
||||
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Oznamovač",
|
||||
"notifiers": "Oznamovače",
|
||||
"notifiers_sub": "Dostávajte upozornenia na nadchádzajúce pripomenutia údržby",
|
||||
"override_locale": "",
|
||||
"override_locale": "Prepísať dátum a jazyk meny",
|
||||
"test": "Test",
|
||||
"theme_settings": "Nastavenie motívu",
|
||||
"theme_settings_sub": "Nastavenia motívu sú uložené v lokálnom úložisku vášho prehliadača. Tému môžete kedykoľvek zmeniť. Ak mate\n problémy s nastavením motívu, skúste obnoviť prehliadač.",
|
||||
"toast": {
|
||||
"account_deleted": "",
|
||||
"failed_change_password": "",
|
||||
"failed_create_notifier": "",
|
||||
"failed_delete_account": "",
|
||||
"failed_delete_notifier": "",
|
||||
"failed_get_currencies": "",
|
||||
"failed_test_notifier": "",
|
||||
"failed_update_group": "",
|
||||
"failed_update_notifier": "",
|
||||
"group_updated": "",
|
||||
"notifier_test_success": "",
|
||||
"password_changed": ""
|
||||
"account_deleted": "Váš účet bol odstránený.",
|
||||
"failed_change_password": "Heslo sa nepodarilo zmeniť.",
|
||||
"failed_create_notifier": "Oznamovač sa nepodarilo vytvoriť.",
|
||||
"failed_delete_account": "Nepodarilo sa odstrániť váš účet.",
|
||||
"failed_delete_notifier": "Nepodarilo sa odstrániť oznamovač.",
|
||||
"failed_get_currencies": "Meny sa nepodarilo získať",
|
||||
"failed_test_notifier": "Nepodarilo sa vyskúšať oznamovač.",
|
||||
"failed_update_group": "Skupinu sa nepodarilo aktualizovať",
|
||||
"failed_update_notifier": "Nepodarilo sa aktualizovať oznamovač.",
|
||||
"group_updated": "Skupina bola aktualizovaná",
|
||||
"notifier_test_success": "Test oznamovača bol úspešný.",
|
||||
"password_changed": "Heslo bolo úspešne zmenené."
|
||||
},
|
||||
"update_group": "aktualizačná skupina",
|
||||
"update_language": "Aktualizovať súbor jazyka",
|
||||
@@ -529,32 +529,32 @@
|
||||
},
|
||||
"reports": {
|
||||
"label_generator": {
|
||||
"asset_end": "",
|
||||
"asset_start": "",
|
||||
"base_url": "",
|
||||
"bordered_labels": "",
|
||||
"generate_page": "",
|
||||
"input_placeholder": "",
|
||||
"instruction_1": "",
|
||||
"instruction_2": "",
|
||||
"instruction_3": "",
|
||||
"label_height": "",
|
||||
"label_width": "",
|
||||
"measure_type": "",
|
||||
"page_bottom_padding": "",
|
||||
"page_height": "",
|
||||
"page_left_padding": "",
|
||||
"page_right_padding": "",
|
||||
"page_top_padding": "",
|
||||
"page_width": "",
|
||||
"qr_code_example": "",
|
||||
"asset_end": "Koniec aktíva",
|
||||
"asset_start": "Začiatok aktíva",
|
||||
"base_url": "Základná časť URL adresy",
|
||||
"bordered_labels": "Ohraničené štítky",
|
||||
"generate_page": "Generovať stranu",
|
||||
"input_placeholder": "Píšte sem",
|
||||
"instruction_1": "Generátor štítkov Homebox je nástroj, ktorý vám pomôže vytlačiť štítky pre inventár Homeboxu. Tie sú určené na\n to, aby ste mohli vytlačiť viacero štítkov naraz a mať ich pripravených vopred",
|
||||
"instruction_2": "Tieto štítky fungujú tak, že sa na štítok vytlačí QR kód URL adresy a informácia AssetID. Ak ste v nastaveniach Homeboxu\n AssetID zakázali, môžete tento nástroj i naďalej používať, ale AssetIT nebude odkazovať na žiadnu položku",
|
||||
"instruction_3": "Táto funkcia je v ranej fáze vývoja a v budúcich verziách sa môže zmeniť, ak máte spätnú väzbu, podeľte sa s ňou, prosím,\n v <a href=\"https://github.com/sysadminsmedia/homebox/discussions/53\">'Diskusii na GitHube</a>",
|
||||
"label_height": "Výška štítka",
|
||||
"label_width": "Šírka štítku",
|
||||
"measure_type": "Typ merania",
|
||||
"page_bottom_padding": "Odsadenie strany zospodu",
|
||||
"page_height": "Výška strany",
|
||||
"page_left_padding": "Odsadenie strany vľavo",
|
||||
"page_right_padding": "Odsadenie strany vpravo",
|
||||
"page_top_padding": "Odsadenie strany zvrchu",
|
||||
"page_width": "Šírka strany",
|
||||
"qr_code_example": "Príklad QR kódu",
|
||||
"tip_1": "",
|
||||
"tip_2": "",
|
||||
"tip_3": "",
|
||||
"tips": "",
|
||||
"title": "",
|
||||
"tips": "Tipy",
|
||||
"title": "Generátor štítkov",
|
||||
"toast": {
|
||||
"page_too_small_card": ""
|
||||
"page_too_small_card": "Veľkosť strany je príliš malá vzhľadom na veľkosť karty"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -564,40 +564,43 @@
|
||||
"no_sources": "Nie sú k dispozícii žiadne zdroje videa",
|
||||
"permission_denied": "",
|
||||
"select_video_source": "Vyberte zdroj videa",
|
||||
"title": "",
|
||||
"unsupported": "Media Stream API nie je podporované"
|
||||
"title": "Skener",
|
||||
"unsupported": "Media Stream API nie je podporované bez protokolu HTTPS"
|
||||
},
|
||||
"tools": {
|
||||
"actions": "Akcie inventára",
|
||||
"actions_set": {
|
||||
"create_missing_thumbnails": "Vytvoriť chýbajúce náhľady",
|
||||
"create_missing_thumbnails_button": "Vytvoriť náhľady",
|
||||
"create_missing_thumbnails_confirm": "Naozaj chcete vytvoriť chýbajúce náhľady? Môže to chvíľku trvať a akciu nie je možné pozastaviť.",
|
||||
"ensure_ids": "Zabezpečenie identifikátorov aktív",
|
||||
"ensure_ids_button": "Zabezpečenie identifikátorov aktív",
|
||||
"ensure_ids_confirm": "",
|
||||
"ensure_ids_sub": "Zabezpečuje, že všetky položky vo vašom inventári majú platné pole asset_id. To sa dosiahne nájdením najvyššieho aktuálneho poľa asset_id v databáze a aplikáciou ďalšej hodnoty na každú položku, ktorá má pole asset_id nenastavené. Toto sa vykonáva v poradí podľa poľa created_at.",
|
||||
"ensure_import_refs": "Zabezpečte import referencií",
|
||||
"ensure_import_refs_button": "Zabezpečte import referencií",
|
||||
"ensure_ids_sub": "Zabezpečí, aby všetky položky vo vašom inventári mali platné pole asset_id. To sa dosiahne tak, že sa v databáze zistí najvyššie aktuálne pole asset_id a na každú položku, ktorá nemá nastavené pole asset_id sa použije ďalšia hodnota. Toto sa vykonáva v poradí podľa poľa created_at.",
|
||||
"ensure_import_refs": "Zabezpečiť import referencií",
|
||||
"ensure_import_refs_button": "Zabezpečiť import referencií",
|
||||
"ensure_import_refs_sub": "Zabezpečuje, že všetky položky vo vašom inventári majú platné pole import_ref. To sa dosiahne náhodným vygenerovaním 8-znakového reťazca pre každú položku, ktorá má nenastavené pole import_ref.",
|
||||
"set_primary_photo": "Nastaviť primárnu fotografiu",
|
||||
"set_primary_photo_button": "Nastaviť primárnu fotografiu",
|
||||
"set_primary_photo_confirm": "",
|
||||
"set_primary_photo_confirm": "Naozaj chcete nastaviť primárne fotografie? Môže to chvíľu trvať a nedá sa to vrátiť späť.",
|
||||
"set_primary_photo_sub": "Vo verzii v0.10.0 Homeboxu bolo k prílohám typu fotografia pridané pole primárneho obrázka. Táto akcia nastaví pole primárneho obrázka na prvý obrázok v poli príloh v databáze, ak ešte nie je nastavený. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'See GitHub PR #576'</a>'",
|
||||
"zero_datetimes": "Dátum nulovej položky Časy",
|
||||
"zero_datetimes_button": "Dátum nulovej položky Časy",
|
||||
"zero_datetimes_confirm": "",
|
||||
"zero_datetimes": "Vynulovať dátum a čas položiek",
|
||||
"zero_datetimes_button": "Vynulovať dátum a čas položiek",
|
||||
"zero_datetimes_confirm": "Naozaj chcete resetovať všetky hodnoty dátumu a času? Toto môže chvíľu trvať a akcia sa nedá odvolať.",
|
||||
"zero_datetimes_sub": "Obnoví hodnotu času pre všetky polia dátumu a času vo vašom inventári na začiatok dátumu. Ide o opravu chyby, ktorá bola zavedená na začiatku vývoja stránky a ktorá spôsobila, že sa hodnota času uložila s časom, čo spôsobilo problémy s poliami dátumu zobrazujúcimi presné hodnoty. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'See Github Issue #236 for more details.'</a>'"
|
||||
},
|
||||
"actions_sub": "Hromadne použite akcie na svoj inventár. Toto sú nezvratné akcie. '<b>'Buďte opatrní.'</b>'",
|
||||
"actions_sub": "Hromadne použite akcie na svoj inventár. Tieto akcie nie je možné odvolať. '<b>'Buďte opatrní.'</b>'",
|
||||
"import_export": "Import/export",
|
||||
"import_export_set": {
|
||||
"export": "Export zásob",
|
||||
"export_button": "Export zásob",
|
||||
"export": "Exportovať inventár",
|
||||
"export_button": "Exportovať inventár",
|
||||
"export_sub": "Exportuje štandardný formát CSV pre Homebox. Týmto sa exportujú všetky položky vo vašom inventári.",
|
||||
"import": "Importovať inventár",
|
||||
"import_button": "Importovať inventár",
|
||||
"import_ref_confirm": "",
|
||||
"import_ref_confirm": "Naozaj chcete, aby všetky aktíva mali import_ref? To môže chvíľu trvať a akciu nie je možné odvolať.",
|
||||
"import_sub": "Importuje štandardný formát CSV pre Homebox. Bez '<code>'HB.import_ref'</code>' stĺpca to bude '<b>'nie'</b>' prepísať všetky existujúce položky vo vašom inventári, iba pridať nové položky. Riadky so '<code>'HB.import_ref'</code>' stĺpcom sa zlúčia do existujúcich položiek s rovnakým import_ref, ak taký existuje."
|
||||
},
|
||||
"import_export_sub": "Importujte a exportujte svoj inventár do a zo súboru CSV. Je to užitočné pri migrácii inventára do novej inštancie Homeboxu.",
|
||||
"import_export_sub": "Importujte a exportujte svoj inventár do a zo súboru CSV. To je užitočné pri migrácii inventára do novej inštancie Homeboxu.",
|
||||
"reports": "Správy",
|
||||
"reports_set": {
|
||||
"asset_labels": "Štítky ID diela",
|
||||
@@ -609,11 +612,12 @@
|
||||
},
|
||||
"reports_sub": "Generujte rôzne prehľady pre svoj inventár.",
|
||||
"toast": {
|
||||
"asset_success": "",
|
||||
"failed_ensure_ids": "",
|
||||
"failed_ensure_import_refs": "",
|
||||
"failed_set_primary_photos": "",
|
||||
"failed_zero_datetimes": ""
|
||||
"asset_success": "{ results } aktiv bolo aktualizovaných.",
|
||||
"failed_create_missing_thumbnails": "Nepodarilo sa vytvoriť chýbajúce náhľady.",
|
||||
"failed_ensure_ids": "Nepodarilo sa zaistiť ID aktív.",
|
||||
"failed_ensure_import_refs": "Nepodarilo sa zaistiť import referencií.",
|
||||
"failed_set_primary_photos": "Nepodarilo sa nastaviť primárne fotografie.",
|
||||
"failed_zero_datetimes": "Nepodarilo sa obnoviť hodnoty dátumu a času."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
"rotate_process_failed": "处理已旋转图片失败",
|
||||
"some_photos_failed": "{count, plural, =0 {无照片上传.} =1 {一张照片上传失败.} other {多张照片上传失败.}}",
|
||||
"upload_failed": "上传照片失败:{ photoName }",
|
||||
"upload_success": "{count, plural, = 0 {未上传照片} = 1 {照片上传成功} other {所有照片上传成功}}",
|
||||
"upload_success": "{count, plural, =0 {未上传照片} =1 {照片上传成功} other {所有照片上传成功}}",
|
||||
"uploading_photos": ""
|
||||
},
|
||||
"upload_photos": "上传照片",
|
||||
|
||||
Reference in New Issue
Block a user