Compare commits

..

24 Commits

Author SHA1 Message Date
Matt
0d2a6d6ac8 Revert weblate skipping 2025-07-01 10:09:40 -04:00
Matt
e159dd8a0b Merge commit from fork 2025-07-01 09:56:34 -04:00
Matt
b311a5c9ed Update CreateModal.vue 2025-07-01 08:53:12 -04:00
Matthew Kilgore
04c8e38ecf Escape file name for content-disposition. 2025-06-30 20:55:11 -04:00
Matthew Kilgore
1fd2f42282 Hopefully fixed ARMv7 Rootless build 2025-06-30 20:44:20 -04:00
Matthew Kilgore
d3cff18cc6 Ignore weblate for builds 2025-06-30 20:21:53 -04:00
Weblate
3e27c24fbd Translated using Weblate (Japanese)
Currently translated at 59.9% (295 of 492 strings)

Translated using Weblate (Portuguese (Portugal))

Currently translated at 96.5% (475 of 492 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 66.2% (326 of 492 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 74.5% (367 of 492 strings)

Translated using Weblate (German)

Currently translated at 97.7% (481 of 492 strings)

Translated using Weblate (English)

Currently translated at 100.0% (492 of 492 strings)

Co-authored-by: Matthew Kilgore <matthew@kilgore.dev>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/de/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/en/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/ja/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/pt_BR/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/pt_PT/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/zh_Hans/
Translation: Homebox/Frontend
2025-07-01 00:17:05 +00:00
Weblate
acd5acd4cf Translated using Weblate (Slovak)
Currently translated at 98.7% (486 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 23:57:40 +00:00
Weblate
71dc5fcb23 Translated using Weblate (Slovak)
Currently translated at 98.5% (485 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:45:18 +00:00
Weblate
2ff5f4ca0b Translated using Weblate (Slovak)
Currently translated at 91.0% (448 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 91.0% (448 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:27:53 +00:00
Weblate
12831a40d0 Translated using Weblate (Slovak)
Currently translated at 88.6% (436 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 88.6% (436 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:25:38 +00:00
Weblate
c966090889 Translated using Weblate (Slovak)
Currently translated at 87.3% (430 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 87.3% (430 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:24:27 +00:00
Weblate
f03eb637a7 Translated using Weblate (Slovak)
Currently translated at 85.1% (419 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 85.1% (419 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:22:40 +00:00
Weblate
49ea34f352 Translated using Weblate (Slovak)
Currently translated at 83.7% (412 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 83.7% (412 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:21:36 +00:00
Weblate
85d91667eb Translated using Weblate (Slovak)
Currently translated at 81.3% (400 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 81.3% (400 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:14:34 +00:00
Weblate
458554b6e1 Translated using Weblate (Slovak)
Currently translated at 78.2% (385 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 78.2% (385 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:05:37 +00:00
Weblate
79ff5cedc6 Translated using Weblate (Slovak)
Currently translated at 77.6% (382 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 77.6% (382 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:05:00 +00:00
Weblate
f0008abd04 Translated using Weblate (Slovak)
Currently translated at 77.4% (381 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 77.4% (381 of 492 strings)

Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:04:12 +00:00
Weblate
8a377b3e4d Translated using Weblate (Slovak)
Currently translated at 77.2% (380 of 492 strings)

Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 20:03:44 +00:00
Weblate
e7d31722f7 Translated using Weblate (Slovak)
Currently translated at 77.0% (379 of 492 strings)

Translated using Weblate (Slovak)

Currently translated at 77.0% (379 of 492 strings)

Translated using Weblate (German)

Currently translated at 99.3% (489 of 492 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (492 of 492 strings)

Co-authored-by: Daniel Galle <smarthome@galle-fw.com>
Co-authored-by: Hannes Salen <hannes.salen@gmail.com>
Co-authored-by: Jose Riha <jose1711@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/de/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/nl/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sk/
Translation: Homebox/Frontend
2025-06-30 17:00:40 +00:00
Matthew Kilgore
52b4506e12 Fix docker builds 2025-06-29 20:44:20 -04:00
Matthew Kilgore
cb9631c999 Try this to fix the build? (More like the original) 2025-06-29 20:28:35 -04:00
Matthew Kilgore
6e3186a9de Merge remote-tracking branch 'origin/main' 2025-06-29 20:08:54 -04:00
Matthew Kilgore
a67070f965 Hopefully fix build 2025-06-29 20:08:43 -04:00
17 changed files with 285 additions and 242 deletions

View File

@@ -51,7 +51,6 @@ jobs:
- linux/amd64
- linux/arm64
- linux/arm/v7
- linux/riscv64
steps:
- name: Enable Debug Logs

View File

@@ -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 ' *)

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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"
/>

View File

@@ -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"

View File

@@ -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",

View File

@@ -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": "レポート",

View File

@@ -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",

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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": "Zobraz 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": "Vytvor",
"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 ma 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á ne 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č import referencií",
"ensure_import_refs_button": "Zabezpeč 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."
}
}
}

View File

@@ -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": "上传照片",