Compare commits

..

1 Commits

Author SHA1 Message Date
tonya
646a80f494 feat: begin work on language updates 2025-01-04 13:11:23 +00:00
51 changed files with 3333 additions and 4880 deletions

3
.gitignore vendored
View File

@@ -56,5 +56,4 @@ backend/app/api/static/public/*
!backend/app/api/static/public/.gitkeep
backend/api
docs/.vitepress/cache/
/.data/
docs/.vitepress/cache/

View File

@@ -44,7 +44,7 @@ start command `task go:run`
### Frontend Development Notes
start command `task ui:dev`
start command `task: ui:dev`
1. The frontend is a Vue 3 app with Nuxt.js that uses Tailwind and DaisyUI for styling.
2. We're using Vitest for our automated testing. You can run these with `task ui:watch`.
@@ -54,4 +54,4 @@ start command `task ui:dev`
Create a new tag in GitHub with the version number vX.X.X. This will trigger a new release to be created.
Test -> Goreleaser -> Publish Release -> Trigger Docker Builds -> Deploy Docs + Fly.io Demo
Test -> Goreleaser -> Publish Release -> Trigger Docker Builds -> Deploy Docs + Fly.io Demo

View File

@@ -52,8 +52,6 @@ tasks:
- cp ./backend/app/api/static/docs/swagger.json docs/docs/api/openapi-2.0.json
go:run:
env:
HBOX_DEMO: true
desc: Starts the backend api server (depends on generate task)
dir: backend
deps:

View File

@@ -0,0 +1,51 @@
package v1
import (
"encoding/json"
"net/http"
"github.com/google/uuid"
"github.com/hay-kot/httpkit/errchain"
"github.com/sysadminsmedia/homebox/backend/internal/core/services"
"github.com/sysadminsmedia/homebox/backend/internal/data/repo"
"github.com/sysadminsmedia/homebox/backend/internal/web/adapters"
)
type Locales struct {
Locales []string `json:"locales"`
}
// HandleLocalesGetAll godoc
//
// @Summary Get All Locales
// @Tags Locales
// @Produce json
// @Success 200 {object} []Locales
// @Router /v1/locales [GET]
// @Security Bearer
func (ctrl *V1Controller) HandleLocalesGetAll() errchain.HandlerFunc {
fn := func(r *http.Request) ([]Locales, error) {
// TODO: get a list of locales from files
return []Locales{}, nil
}
return adapters.Command(fn, http.StatusOK)
}
// HandleLocalesGet godoc
//
// @Summary Get Locale
// @Tags Locales
// @Produce json
// @Param id path string true "Locale ID"
// @Success 200 {object} interface{}
// @Router /v1/locales/{id} [GET]
// @Security Bearer
func (ctrl *V1Controller) HandleLocalesGet() errchain.HandlerFunc {
fn := func(r *http.Request, ID uuid.UUID) (interface{}, error) {
// TODO: get the current locale
return interface{}, nil
}
return adapters.CommandID("id", fn, http.StatusOK)
}

View File

@@ -254,6 +254,19 @@ func run(cfg *config.Config) error {
}
}))
// TODO: read from env var0 GOOS=linux go build
if true {
runner.AddPlugin(NewTask("locale-update", time.Duration(24)*time.Hour, func(ctx context.Context) {
log.Debug().Msg("running locale update")
err := app.services.BackgroundService.UpdateLocales(ctx)
if err != nil {
log.Error().
Err(err).
Msg("failed to update locales")
}
}))
}
if cfg.Debug.Enabled {
runner.AddFunc("debug", func(ctx context.Context) error {
debugserver := http.Server{

View File

@@ -2286,10 +2286,6 @@ const docTemplate = `{
"archived": {
"type": "boolean"
},
"assetId": {
"type": "string",
"example": "0"
},
"createdAt": {
"type": "string"
},

View File

@@ -2279,10 +2279,6 @@
"archived": {
"type": "boolean"
},
"assetId": {
"type": "string",
"example": "0"
},
"createdAt": {
"type": "string"
},

View File

@@ -217,9 +217,6 @@ definitions:
properties:
archived:
type: boolean
assetId:
example: "0"
type: string
createdAt:
type: string
description:

View File

@@ -79,3 +79,20 @@ func (svc *BackgroundService) SendNotifiersToday(ctx context.Context) error {
return nil
}
func (svc *BackgroundService) UpdateLocales(ctx context.Context) error {
log.Debug().Msg("updating locales")
// fetch list of locales from github
// is it worth checking if any changes have been made?
// download locales overwriting files in static/public/locales
// curl -H "Accept: application/vnd.github.v3+json" \
// -H "If-Modified-Since: Thu, 31 Oct 2024 09:59:02 GMT" \
// -o /dev/null -s -w "%{http_code}\n" \
// https://api.github.com/repos/sysadminsmedia/homebox/contents/frontend/locales
// keep track of last modified date
return nil
}

View File

@@ -115,7 +115,6 @@ type (
ItemSummary struct {
ImportRef string `json:"-"`
ID uuid.UUID `json:"id"`
AssetID AssetID `json:"assetId,string"`
Name string `json:"name"`
Description string `json:"description"`
Quantity int `json:"quantity"`
@@ -191,7 +190,6 @@ func mapItemSummary(item *ent.Item) ItemSummary {
return ItemSummary{
ID: item.ID,
AssetID: AssetID(item.AssetID),
Name: item.Name,
Description: item.Description,
ImportRef: item.ImportRef,
@@ -424,8 +422,6 @@ func (e *ItemsRepository) QueryByGroup(ctx context.Context, gid uuid.UUID, q Ite
qb = qb.Order(ent.Desc(item.FieldCreatedAt))
case "updatedAt":
qb = qb.Order(ent.Desc(item.FieldUpdatedAt))
case "assetId":
qb = qb.Order(ent.Asc(item.FieldAssetID))
default: // "name"
qb = qb.Order(ent.Asc(item.FieldName))
}

View File

@@ -41,7 +41,7 @@ export default defineConfig({
},
// https://vitepress.dev/reference/default-theme-config
nav: [
{ text: 'API Docs', link: '/en/api' },
{ text: 'API', link: 'https://redocly.github.io/redoc/?url=https://raw.githubusercontent.com/sysadminsmedia/homebox/main/docs/docs/api/openapi-2.0.json' },
{ text: 'Demo', link: 'https://demo.homebox.software' },
],

View File

@@ -2279,10 +2279,6 @@
"archived": {
"type": "boolean"
},
"assetId": {
"type": "string",
"example": "0"
},
"createdAt": {
"type": "string"
},

View File

@@ -1,37 +0,0 @@
---
layout: page
sidebar: false
---
<script setup lang="ts">
import { useData } from 'vitepress';
const elementScript = document.createElement('script');
elementScript.src = 'https://unpkg.com/@stoplight/elements/web-components.min.js';
document.head.appendChild(elementScript);
const elementStyle = document.createElement('link');
elementStyle.rel = 'stylesheet';
elementStyle.href = 'https://unpkg.com/@stoplight/elements/styles.min.css';
document.head.appendChild(elementStyle);
const { isDark } = useData();
let theme = 'light';
if (isDark.value) {
theme = 'dark';
}
</script>
<style>
.TryItPanel {
display: none;
}
</style>
<elements-api
apiDescriptionUrl="https://cdn.jsdelivr.net/gh/sysadminsmedia/homebox@main/docs/docs/api/openapi-2.0.json"
router="hash"
layout="responsive"
hideSchemas="true"
:data-theme="theme"
/>

View File

@@ -3,27 +3,13 @@
<label class="label">
<span class="label-text"> {{ label }} </span>
</label>
<VueDatePicker
v-model="selected"
:enable-time-picker="false"
clearable
:dark="isDark"
:teleport="true"
:format="formatDate"
/>
<VueDatePicker v-model="selected" :enable-time-picker="false" clearable :dark="isDark" :teleport="true" />
</div>
<div v-else class="sm:grid sm:grid-cols-4 sm:items-start sm:gap-4">
<label class="label">
<span class="label-text"> {{ label }} </span>
</label>
<VueDatePicker
v-model="selected"
:enable-time-picker="false"
clearable
:dark="isDark"
:teleport="true"
:format="formatDate"
/>
<VueDatePicker v-model="selected" :enable-time-picker="false" clearable :dark="isDark" :teleport="true" />
</div>
</template>
@@ -52,8 +38,6 @@
const isDark = useIsDark();
const formatDate = (date: Date | string | number) => fmtDate(date, "human", "date");
const selected = computed<Date | null>({
get() {
// String

View File

@@ -14,7 +14,7 @@
:to="`/location/${item.location.id}`"
loading="lazy"
>
{{ locationString }}
{{ item.location.name }}
</NuxtLink>
</div>
</div>
@@ -67,16 +67,7 @@
type: Object as () => ItemOut | ItemSummary,
required: true,
},
locationFlatTree: {
type: Array as () => FlatTreeItem[],
required: false,
default: () => [],
},
});
const locationString = computed(
() => props.locationFlatTree.find(l => l.id === props.item.location?.id)?.treeString || props.item.location?.name
);
</script>
<style lang="css"></style>

View File

@@ -131,7 +131,7 @@
<BaseSectionHeader class="border-b border-b-gray-300 p-6">
<span class="text-base-content">
<span v-if="!props.currentItemId">
<NuxtLink class="hover:underline" :to="`/item/${(e as MaintenanceEntryWithDetails).itemID}/maintenance`">
<NuxtLink class="hover:underline" :to="`/item/${(e as MaintenanceEntryWithDetails).itemID}`">
{{ (e as MaintenanceEntryWithDetails).itemName }}
</NuxtLink>
-

View File

@@ -22,6 +22,6 @@
return "";
}
return fmtDate(props.date, props.format, props.datetimeType);
return fmtDate(props.date, props.format);
});
</script>

View File

@@ -1,6 +1,5 @@
import { format, formatDistance } from "date-fns";
/* eslint import/namespace: ['error', { allowComputed: true }] */
import * as Locales from "date-fns/locale";
import { useI18n } from "vue-i18n";
import { type UseTimeAgoMessages, type UseTimeAgoUnitNamesDefault } from "@vueuse/core";
const cache = {
currency: "",
@@ -21,63 +20,105 @@ export async function useFormatCurrency() {
}
}
return (value: number | string) => fmtCurrency(value, cache.currency, getLocaleCode());
return (value: number | string) => fmtCurrency(value, cache.currency);
}
export type DateTimeFormat = "relative" | "long" | "short" | "human";
export type DateTimeType = "date" | "time" | "datetime";
export function getLocaleCode() {
const { $i18nGlobal } = useNuxtApp();
return ($i18nGlobal?.locale?.value as string) ?? "en-US";
function ordinalIndicator(num: number) {
if (num > 3 && num < 21) return "th";
switch (num % 10) {
case 1:
return "st";
case 2:
return "nd";
case 3:
return "rd";
default:
return "th";
}
}
function getLocaleForDate() {
const localeCode = getLocaleCode();
const lang = localeCode.length > 1 ? localeCode.substring(0, 2) : localeCode;
const region = localeCode.length > 2 ? localeCode.substring(3) : "";
return Locales[(lang + region) as keyof typeof Locales] ?? Locales[lang as keyof typeof Locales] ?? Locales.enUS;
export function useLocaleTimeAgo(date: Date) {
const { t } = useI18n();
const I18N_MESSAGES: UseTimeAgoMessages<UseTimeAgoUnitNamesDefault> = {
justNow: t("components.global.date_time.just-now"),
past: n => (n.match(/\d/) ? t("components.global.date_time.ago", [n]) : n),
future: n => (n.match(/\d/) ? t("components.global.date_time.in", [n]) : n),
month: (n, past) =>
n === 1
? past
? t("components.global.date_time.last-month")
: t("components.global.date_time.next-month")
: `${n} ${t(`components.global.date_time.months`)}`,
year: (n, past) =>
n === 1
? past
? t("components.global.date_time.last-year")
: t("components.global.date_time.next-year")
: `${n} ${t(`components.global.date_time.years`)}`,
day: (n, past) =>
n === 1
? past
? t("components.global.date_time.yesterday")
: t("components.global.date_time.tomorrow")
: `${n} ${t(`components.global.date_time.days`)}`,
week: (n, past) =>
n === 1
? past
? t("components.global.date_time.last-week")
: t("components.global.date_time.next-week")
: `${n} ${t(`components.global.date_time.weeks`)}`,
hour: n => `${n} ${n === 1 ? t("components.global.date_time.hour") : t("components.global.date_time.hours")}`,
minute: n => `${n} ${n === 1 ? t("components.global.date_time.minute") : t("components.global.date_time.minutes")}`,
second: n => `${n} ${n === 1 ? t("components.global.date_time.second") : t("components.global.date_time.seconds")}`,
invalid: "",
};
return useTimeAgo(date, {
fullDateFormatter: (date: Date) => date.toLocaleDateString(),
messages: I18N_MESSAGES,
});
}
export function fmtDate(
value: string | Date | number,
fmt: DateTimeFormat = "human",
type: DateTimeType = "date"
): string {
const dt = typeof value === "string" || typeof value === "number" ? new Date(value) : value;
export function fmtDate(value: string | Date, fmt: DateTimeFormat = "human"): string {
const months = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
if (!dt || !validDate(dt)) {
const dt = typeof value === "string" ? new Date(value) : value;
if (!dt) {
return "";
}
const localeOptions = { locale: getLocaleForDate() };
if (fmt === "relative") {
return `${formatDistance(dt, new Date(), { ...localeOptions, addSuffix: true })} (${fmtDate(dt, "short", "date")})`;
if (!validDate(dt)) {
return "";
}
if (type === "time") {
return format(dt, "p", localeOptions);
}
let formatStr = "";
switch (fmt) {
case "human":
formatStr = "PPP";
break;
case "relative":
return useLocaleTimeAgo(dt).value + useDateFormat(dt, " (YYYY-MM-DD)").value;
case "long":
formatStr = "PP";
break;
return useDateFormat(dt, "YYYY-MM-DD (dddd)").value;
case "short":
formatStr = "P";
break;
return useDateFormat(dt, "YYYY-MM-DD").value;
case "human":
// January 1st, 2021
return `${months[dt.getMonth()]} ${dt.getDate()}${ordinalIndicator(dt.getDate())}, ${dt.getFullYear()}`;
default:
return "";
}
if (type === "datetime") {
formatStr += "p";
}
return format(dt, formatStr, localeOptions);
}

View File

@@ -1,5 +1,5 @@
<template>
<main class="grid min-h-screen w-full place-items-center">
<main class="grid min-h-screen w-full place-items-center bg-blue-100">
<slot></slot>
</main>
</template>

View File

@@ -134,8 +134,6 @@ export interface ItemPath {
export interface ItemSummary {
archived: boolean;
/** @example "0" */
assetId: string;
createdAt: Date | string;
description: string;
id: string;

View File

@@ -11,9 +11,7 @@ export function format(date: Date | string): string {
}
export function zeroTime(date: Date): Date {
return new Date(
new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - date.getTimezoneOffset() * 60000
);
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
}
export function factorRange(offset: number = 7): [Date, Date] {

View File

@@ -9,30 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "fa {0}",
"days": "dies",
"hour": "hora",
"hours": "hores",
"in": "a {0}",
"just-now": "ara mateix",
"last-month": "el mes passat",
"last-week": "la setmana passada",
"last-year": "darrer any",
"minute": "minut",
"minutes": "minuts",
"months": "mesos",
"next-month": "Mes següent",
"next-week": "la setmana vinent",
"next-year": "Any següent",
"second": "segon",
"seconds": "segons",
"tomorrow": "demà",
"week": "setmana",
"weeks": "setmanes",
"years": "anys",
"yesterday": "ahir"
},
"page_qr_code": {
"page_url": "URL de la pàgina"
},
@@ -42,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "Descripció de l'article",
"item_name": "Nom de l'article",
"photo_button": "Foto 📷",
"title": "Crea un article"
},
@@ -53,45 +27,26 @@
"items": "Articles",
"no_items": "No hi ha articles a mostrar",
"table": "Taula"
},
"table": {
"page": "Pàgina",
"rows_per_page": "Files per pàgina"
}
}
},
"label": {
"create_modal": {
"label_description": "Descripció de l'etiqueta",
"label_name": "Nom de l'etiqueta",
"title": "Crea una etiqueta"
}
},
"location": {
"create_modal": {
"location_description": "Descripció de la ubicació",
"location_name": "Nom de la ubicació",
"title": "Crea una ubicació"
},
"selector": {
"parent_location": "Ubicació pare"
},
"tree": {
"no_locations": "No hi ha ubicacions disponibles. Afegiu ubicacions amb el botó\n `<`span class=\"link-primary\"`>`Crea`<`/span`>` a la barra de navegació."
}
}
},
"global": {
"add": "Afegeix",
"build": "Construcció: { build }",
"confirm": "Confirma",
"create": "Crea",
"create_and_add": "Crea i afegeix-ne un altre",
"created": "Creat",
"delete": "Esborra",
"details": "Detalls",
"duplicate": "Duplica",
"edit": "Edita",
"email": "Correu electrònic",
"follow_dev": "Segueix al desenvolupador",
"github": "Projecte de GitHub",
@@ -99,29 +54,15 @@
"join_discord": "Uniu-vos a Discord",
"labels": "Etiquetes",
"locations": "Ubicacions",
"maintenance": "Manteniment",
"name": "Nom",
"password": "Contrasenya",
"read_docs": "Llegiu la documentació",
"save": "Desa",
"search": "Cerca",
"sign_out": "Tanca la sessió",
"submit": "Envia",
"update": "Actualitza",
"value": "Valor",
"version": "Versió {version}",
"welcome": "Us donem la benvinguda, { username }"
},
"home": {
"labels": "Etiquetes",
"quick_statistics": "Estadístiques ràpides",
"recently_added": "Afegit recentment",
"storage_locations": "Ubicacions d'emmagatzematge",
"total_items": "Articles totals",
"total_labels": "Total d'etiquetes",
"total_locations": "Ubicacions totals",
"total_value": "Valor total"
},
"index": {
"disabled_registration": "El registre és desactivat",
"dont_join_group": "Voleu unir-vos al grup?",
@@ -136,71 +77,32 @@
},
"items": {
"add": "Afegeix",
"advanced": "Mode avançat",
"archived": "Arxivat",
"asset_id": "ID de l'actiu",
"attachment": "Adjunt",
"attachments": "Documents adjunts",
"changes_persisted_immediately": "Els canvis als fitxers adjunts es desaran immediatament",
"created_at": "Creat a",
"custom_fields": "Camps personalitzats",
"description": "Descripció",
"details": "Detalls",
"drag_and_drop": "Arrossegueu i deixeu anar fitxers aquí o feu clic per seleccionar fitxers",
"edit_details": "Edita els detalls",
"field_selector": "Selector del camp",
"field_value": "Valor del camp",
"first": "Primer",
"include_archive": "Inclou els articles arxivats",
"insured": "Assegurat",
"last": "Últim",
"lifetime_warranty": "Garantia de per vida",
"location": "Ubicació",
"manual": "Manual",
"manuals": "Manuals",
"manufacturer": "Fabricant",
"model_number": "Número de model",
"name": "Nom",
"negate_labels": "Nega les etiquetes seleccionades",
"next_page": "Pàgina següent",
"no_results": "No s'ha trobat cap element",
"notes": "Notes",
"options": "Opcions",
"order_by": "Ordena per",
"pages": "Pàgina { page } de { totalPages }",
"parent_item": "Article pare",
"photo": "Foto",
"photos": "Fotos",
"prev_page": "Pàgina anterior",
"purchase_date": "Data de compra",
"purchase_details": "Detalls de la compra",
"purchase_price": "Preu de compra",
"purchased_from": "Comprat a",
"quantity": "Quantitat",
"query_id": "S'està consultant el número d'identificació de l'actiu: { id }",
"receipt": "Tiquet",
"receipts": "Factures",
"reset_search": "Reinicia la cerca",
"results": "{ total } resultats",
"serial_number": "Número de sèrie",
"show_advanced_view_options": "Mostra les opcions avançades de visualització",
"sold_at": "Venut a (lloc)",
"sold_details": "Detalls de la venda",
"sold_price": "Preu de venda",
"sold_to": "Venut a",
"tip_1": "Els filtres d'ubicació i etiquetes utilitzen l'operació «O». Si se'n selecciona més d'un, \nnomés se'n requerirà un per a coincidència.",
"tip_2": "Les cerques amb el prefix «#» sol·licitaran un ID d'un actiu (per exemple, «#000-001»)",
"tip_3": "Els filtres de camp utilitzen l'operació «O». Si se'n selecciona més d'un, \nnomés se'n requerirà un per a coincidència.",
"tips": "Consells",
"tips_sub": "Consells de cerca",
"updated_at": "Actualitzat a",
"warranty": "Garantia",
"warranty_details": "Detalls de la garantia",
"warranty_expires": "La garantia caduca"
"updated_at": "Actualitzat a"
},
"labels": {
"no_results": "No s'han trobat etiquetes",
"update_label": "Actualitza l'etiqueta"
"no_results": "No s'han trobat etiquetes"
},
"languages": {
"ca": "Català",
@@ -210,70 +112,29 @@
"fr": "Francès",
"hu": "Hongarès",
"it": "Italià",
"ja-JP": "Japonès",
"nl": "Neerlandès",
"pl": "Polonès",
"pt-BR": "Portuguès (Brasil)",
"pt-PT": "Portuguès (Portugal)",
"ru": "Rus",
"sl": "Eslovè",
"sv": "Suec",
"tr": "Turc",
"uk-UA": "Ucraïnès",
"zh-CN": "Xinès (simplificat)",
"zh-HK": "Xinès (Hong Kong)",
"zh-MO": "Xinès (Macau)",
"zh-TW": "Xinès (tradicional)"
},
"languages.da-DK": "Danès",
"languages.fi.FI": "Finès",
"languages.ro-RO": "Romanès",
"languages.sk-SK": "Eslovac",
"locations": {
"child_locations": "Ubicacions infantils",
"collapse_tree": "Col·lapsa l'arbre",
"no_results": "No s'han trobat ubicacions",
"update_location": "Actualitza ubicació"
"no_results": "No s'han trobat ubicacions"
},
"maintenance": {
"filter": {
"both": "Ambdós",
"completed": "Acabat",
"scheduled": "Programat"
},
"list": {
"complete": "Acabar",
"create_first": "Creeu la vostra primera entrada",
"delete": "Esborra",
"duplicate": "Duplica",
"edit": "Edita",
"new": "Nou"
},
"modal": {
"completed_date": "Data de finalització",
"cost": "Preu",
"delete_confirmation": "Esteu segur que voleu suprimir aquest registre?",
"edit_action": "Actualitza",
"edit_title": "Edita l'entrada",
"entry_name": "Nom de l'entrada",
"new_action": "Crea",
"new_title": "Nova entrada",
"notes": "Notes",
"scheduled_date": "Data programada"
},
"monthly_average": "Mitjana mensual",
"toast": {
"failed_to_create": "No s'ha pogut crear l'entrada",
"failed_to_delete": "No s'ha pogut suprimir l'entrada",
"failed_to_update": "No s'ha pogut actualitzar l'entrada"
"both": "Ambdós"
},
"total_cost": "Cost total",
"total_entries": "Nombre d'entrades"
"total_entries": "Nombre d&apos; entrades"
},
"menu": {
"create_item": "Article / Actiu",
"create_label": "Etiqueta",
"create_location": "Ubicació",
"home": "Inici",
"locations": "Ubicacions",
"maintenance": "Manteniment",
@@ -290,7 +151,6 @@
"delete_account_sub": "Elimina el compte i totes les dades associades. Aquesta acció no es pot desfer.",
"display_header": "{ currentValue, select, true {Amaga la capçalera} false {Mostra la capçalera} other {Desconegut}}",
"enabled": "Habilitat",
"example": "Exemple",
"gen_invite": "Genera un enllaç d'invitació",
"group_settings": "Configuració del grup",
"group_settings_sub": "Configuració del grup compartit. És possible que hàgiu d'actualitzar la pàgina per aplicar la configuració.",
@@ -315,27 +175,8 @@
"actions_set": {
"ensure_ids": "Assegura els identificadors de recursos",
"ensure_ids_button": "Assegura els identificadors de recursos",
"ensure_import_refs": "Assegureu-vos d'importar les referències",
"ensure_import_refs_button": "Assegureu-vos d'importar les referències",
"set_primary_photo": "Defineix la foto principal",
"set_primary_photo_button": "Defineix la foto principal"
},
"import_export": "Importa / Exporta",
"import_export_set": {
"export": "Exporta inventari",
"export_button": "Exporta inventari",
"export_sub": "Exporta el format CSV estàndard per a Homebox. S'exportaran tots els articles de l'inventari.",
"import": "Importa inventari",
"import_button": "Importa inventari"
},
"import_export_sub": "Importa i exporta l'inventari amb un fitxer CSV. És útil per a migracions d'inventari a una nova instància de Homebox.",
"reports": "Informes",
"reports_set": {
"asset_labels": "Etiquetes d'identificador de recurs",
"asset_labels_button": "Generador d'etiquetes",
"bill_of_materials": "Llista de materials",
"bill_of_materials_button": "Genera llista de materials"
},
"reports_sub": "Genera informes per a l'inventari"
}
}
}

View File

@@ -1,49 +1,12 @@
{
"components": {
"app": {
"import_dialog": {
"change_warning": "Adfærd for imports med eksisterende import_refs har ændret sig. Hvis en import_ref er tilstede i CSV filen,\nvil genstanden blive opdateret med værdierne fra CSV filen.",
"description": "Importer en CSV fil som indeholder dine genstande, etiketter, og lokationer. Se dokumentation for mere information vedrørende\nden korrekte format.",
"title": "Importer CSV Fil",
"upload": "Upload"
}
},
"global": {
"date_time": {
"ago": "{0} siden",
"days": "dage",
"hour": "time",
"hours": "timer",
"in": "om {0}",
"just-now": "lige nu",
"last-month": "sidste måned",
"last-week": "sidste uge",
"last-year": "sidste år",
"minute": "minut",
"minutes": "minutter",
"months": "måneder",
"next-month": "næste måned",
"next-week": "næste uge",
"next-year": "næste år",
"second": "sekund",
"seconds": "sekunder",
"tomorrow": "i morgen",
"week": "uge",
"weeks": "uger",
"years": "år",
"yesterday": "i går"
},
"page_qr_code": {
"page_url": "Side URL"
},
"password_score": {
"password_strength": "Adgangskodestyrke"
}
},
"item": {
"create_modal": {
"item_description": "Genstandsbeskrivelse",
"item_name": "Genstandsnavn",
"photo_button": "Foto 📷",
"title": "Opret genstand"
},
@@ -53,89 +16,31 @@
"items": "Genstande",
"no_items": "Ingen genstande at vise",
"table": "Tabel"
},
"table": {
"page": "Side",
"rows_per_page": "Rækker per side"
}
}
},
"label": {
"create_modal": {
"label_description": "Etiketbeskrivelse",
"label_name": "Etiketnavn",
"title": "Opret label"
}
},
"location": {
"create_modal": {
"location_description": "Lokationsbeskrivelse",
"location_name": "Lokationsnavn",
"title": "Opret lokation"
},
"selector": {
"parent_location": "Forældrelokation"
},
"tree": {
"no_locations": "Ingen tilgængelige lokationer. Opret nye lokationer gennem\n`<`span class=\"link-primary\">`Opret`<`/span`>` knappen i navigationslinjen."
}
}
},
"global": {
"add": "Tilføj",
"build": "Build: { build }",
"confirm": "Bekræft",
"create": "Opret",
"create_and_add": "Opret og tilføj ny",
"created": "Oprettet",
"delete": "Slet",
"details": "Detaljer",
"duplicate": "Dupliker",
"edit": "Rediger",
"email": "Email",
"follow_dev": "Følg udvikleren",
"github": "GitHub projekt",
"items": "Genstande",
"join_discord": "Deltag i vores Discord",
"labels": "Etiketter",
"locations": "Lokationer",
"maintenance": "Opretholdelse",
"name": "Navn",
"password": "Adgangskode",
"read_docs": "Læs Docs",
"save": "Gem",
"search": "Søg",
"sign_out": "Log ud",
"submit": "Indsend",
"update": "Opdater",
"value": "Værdi",
"version": "Version: { version }",
"welcome": "Velkommen, { username }"
},
"home": {
"labels": "Etiketter",
"quick_statistics": "Hurtige Statistikker",
"recently_added": "Nyligt Tilføjet",
"storage_locations": "Opbevaringslokationer",
"total_items": "Totale Genstande",
"total_labels": "Totale Etiketter",
"total_locations": "Totale Lokationer",
"total_value": "Total Værdi"
},
"index": {
"disabled_registration": "Registrering slået fra",
"dont_join_group": "Ikke lyst til at deltage i en gruppe?",
"joining_group": "Du deltager i en eksisterende gruppe!",
"login": "Log ind",
"register": "Registrer",
"remember_me": "Husk mig",
"set_email": "Hvad er din E-Mail?",
"set_name": "Hvad hedder du?",
"set_password": "Opret din adgangskode",
"tagline": "Følg, Organiser, og Håndter dine Ting."
},
"items": {
"add": "Tilføj"
"github": "GitHub projekt"
},
"tools": {
"import_export": "Importer/Eksporter",

View File

@@ -2,7 +2,7 @@
"components": {
"app": {
"import_dialog": {
"change_warning": "Das Verhalten beim Importieren mit bestehenden import_refs hat sich geändert. Wenn ein import_ref in der CSV-Datei vorhanden ist, \nwird der Gegenstand mit den Werten in der CSV-Datei aktualisiert.",
"change_warning": "Das Verhalten beim Importieren vorhandener import_refs hat sich geändert. Wenn ein import_ref in der CSV-Datei vorhanden ist, \nwird der Gegenstand mit den Werten in der CSV-Datei aktualisiert.",
"description": "Importiere eine CSV-Datei, die deine Gegenstände, Etiketten und Standorte enthält. Schau in die Dokumentation für weitere Informationen\nzum erforderlichen Format.",
"title": "CSV-Datei importieren",
"upload": "Hochladen"
@@ -11,7 +11,7 @@
"global": {
"date_time": {
"ago": "vor {0}",
"days": "Tagen",
"days": "Tage",
"hour": "Stunde",
"hours": "Stunden",
"in": "in {0}",
@@ -21,13 +21,13 @@
"last-year": "letztes Jahr",
"minute": "Minute",
"minutes": "Minuten",
"months": "Monaten",
"months": "Monate",
"next-month": "nächster Monat",
"next-week": "nächste Woche",
"next-week": "Nächste Woche",
"next-year": "nächstes Jahr",
"second": "Sekunde",
"seconds": "Sekunden",
"tomorrow": "morgen",
"tomorrow": "Morgen",
"week": "Woche",
"weeks": "Wochen",
"years": "Jahre",
@@ -42,8 +42,8 @@
},
"item": {
"create_modal": {
"item_description": "Gegenstandsbezeichnung",
"item_name": "Gegenstandsname",
"item_description": "Artikelbezeichnung",
"item_name": "Artikelname",
"photo_button": "Foto 📷",
"title": "Gegenstand erstellen"
},
@@ -62,15 +62,15 @@
},
"label": {
"create_modal": {
"label_description": "Label-Beschreibung",
"label_name": "Label-Name",
"label_description": "Label Beschreibung",
"label_name": "Name Etikett",
"title": "Label erstellen"
}
},
"location": {
"create_modal": {
"location_description": "Standortbeschreibung",
"location_name": "Standortname",
"location_name": "Standortnamen",
"title": "Standort erstellen"
},
"selector": {
@@ -177,7 +177,7 @@
"purchase_price": "Einkaufspreis",
"purchased_from": "Eingekauft von",
"quantity": "Menge",
"query_id": "Abfrage der Asset-ID-Nummer: { id }",
"query_id": "Abfrage der Anlagen-ID-Nummer: { id }",
"receipt": "Beleg",
"receipts": "Quittungen",
"reset_search": "Suche zurücksetzen",
@@ -225,10 +225,6 @@
"zh-MO": "Chinesisch (Macao)",
"zh-TW": "Chinesisch (Traditionell)"
},
"languages.da-DK": "Dänisch",
"languages.fi.FI": "Finnisch",
"languages.ro-RO": "Rumänisch",
"languages.sk-SK": "Slowakisch",
"locations": {
"child_locations": "Unter-Standorte",
"collapse_tree": "Baum einklappen",
@@ -299,7 +295,7 @@
"new_password": "Neues Passwort",
"no_notifiers": "Keine Benachrichtigungen konfiguriert",
"notifier_modal": "{ type, select, true {Bearbeiten} false {Erstellen} other {Andere}} Notifier",
"notifiers": "Benachrichtigungen",
"notifiers": "Melder",
"notifiers_sub": "Erhalte Benachrichtigungen über bevorstehende Wartungserinnerungen",
"test": "Test",
"theme_settings": "Themes",
@@ -311,7 +307,7 @@
"user_profile_sub": "Lade Benutzer ein und verwalte dein Konto."
},
"tools": {
"actions": "Inventar-Aktionen",
"actions": "Inventar Aktionen",
"actions_set": {
"ensure_ids": "Sicherstellen von Asset-IDs",
"ensure_ids_button": "Sicherstellen von Asset-IDs",
@@ -323,7 +319,7 @@
"set_primary_photo_button": "Primäres Foto festlegen",
"set_primary_photo_sub": "In Homebox Version v0.10.0 wurde die Auswahl des Primärbilds von angehängten Bildern hinzugefügt. Mit dieser Funktion wird für jeden Artikel ohne Primärbild das erste angehängt Bild als solches definiert. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'See GitHub PR #576'</a>'",
"zero_datetimes": "Leeren der Datum & Zeiten der Elemente",
"zero_datetimes_button": "Gegenstands-Datum/Zeit zurücksetzen",
"zero_datetimes_button": "Null-Punkt-Datum-Zeiten",
"zero_datetimes_sub": "Setzt den Zeitwert für alle Datums-Zeit-Felder in Ihrem Inventar auf den Anfang des Datums zurück. Damit wird ein Fehler behoben, der zu Beginn der Entwicklung der Website eingeführt wurde und dazu führte, dass das Datum zusammen mit der Uhrzeit gespeichert wurde, was zu Problemen bei der Anzeige von genauen Werten in Datumsfeldern führte. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'See Github Issue #236 for more details.'</a>'"
},
"actions_sub": "Aktionen in großen Mengen auf das Inventar anwenden. Diese Aktionen sind unumkehrbar. '<b>'Sei vorsichtig.'</b>'",

View File

@@ -225,10 +225,6 @@
"zh-MO": "Chinese (Macau)",
"zh-TW": "Chinese (Traditional)"
},
"languages.da-DK": "Danish",
"languages.fi.FI": "Finnish",
"languages.ro-RO": "Romanian",
"languages.sk-SK": "Slovak",
"locations": {
"child_locations": "Child Locations",
"collapse_tree": "Collapse Tree",

View File

@@ -10,7 +10,7 @@
},
"global": {
"date_time": {
"ago": "Hace {0}",
"ago": "hace {0}",
"days": "días",
"hour": "hora",
"hours": "horas",
@@ -56,25 +56,25 @@
},
"table": {
"page": "Página",
"rows_per_page": "Filas por página"
"rows_per_page": "Renglones por página"
}
}
},
"label": {
"create_modal": {
"label_description": "Descripción de la etiqueta",
"label_name": "Nombre de la Etiqueta",
"label_name": "Nombre de la etiqueta",
"title": "Crear Etiqueta"
}
},
"location": {
"create_modal": {
"location_description": "Descripción de la Ubicación",
"location_name": "Nombre de la Ubicación",
"location_description": "Descripción de la ubicación",
"location_name": "Nombre de la ubicación",
"title": "Crear Ubicación"
},
"selector": {
"parent_location": "Ubicación Padre"
"parent_location": "Ubicación padre"
},
"tree": {
"no_locations": "No hay ubicaciones disponibles. Añade nuevas ubicaciones mediante el botón de\n`<`span class=\"link-primary\"`>`Crear`<`/span`>` en la barra de navegación."
@@ -82,7 +82,7 @@
}
},
"global": {
"add": "Añadir",
"add": "Agregar",
"build": "Compilación: { build }",
"confirm": "Confirmar",
"create": "Crear",
@@ -115,12 +115,12 @@
"home": {
"labels": "Etiquetas",
"quick_statistics": "Estadísticas rápidas",
"recently_added": "Añadidos Recientemente",
"recently_added": "Añadidos recientemente",
"storage_locations": "Ubicaciones de almacenamiento",
"total_items": "Artículos Totales",
"total_labels": "Etiquetas Totales",
"total_locations": "Ubicaciones Totales",
"total_value": "Valor Total"
"total_items": "Total artículos",
"total_labels": "Total étiquetas",
"total_locations": "Total ubicaciónes",
"total_value": "Valor total"
},
"index": {
"disabled_registration": "Registro Desactivado",
@@ -141,7 +141,7 @@
"asset_id": "Activo ID",
"attachment": "Adjunto",
"attachments": "Adjuntos",
"changes_persisted_immediately": "Los cambios en los archivos adjuntos se guardarán inmediatamente",
"changes_persisted_immediately": "Los cambios a los archivos adjuntos se guardaran inmediatamente",
"created_at": "Creado El",
"custom_fields": "Campos Personalizados",
"description": "Descripción",
@@ -154,12 +154,12 @@
"include_archive": "Incluir Elementos Archivados",
"insured": "Asegurado",
"last": "Último",
"lifetime_warranty": "Garantía Permanente",
"lifetime_warranty": "Garantia de por vida",
"location": "Ubicación",
"manual": "Manual",
"manuals": "Manuales",
"manufacturer": "Fabricante",
"model_number": "Número de Modelo",
"model_number": "Número de modelo",
"name": "Nombre",
"negate_labels": "Negar Etiquetas Seleccionadas",
"next_page": "Siguiente Página",
@@ -168,13 +168,13 @@
"options": "Opciones",
"order_by": "Ordenar Por",
"pages": "Página { page } de { totalPages }",
"parent_item": "Artículo Padre",
"parent_item": "Articulo Padre",
"photo": "Foto",
"photos": "Fotos",
"prev_page": "Anterior Página",
"purchase_date": "Fecha de Compra",
"purchase_details": "Detalles de Compra",
"purchase_price": "Precio de Compra",
"purchase_date": "Fecha de compra",
"purchase_details": "Detalles de compra",
"purchase_price": "Precio de compra",
"purchased_from": "Comprado de",
"quantity": "Cantidad",
"query_id": "Consultar Número ID del Activo: { id }",
@@ -183,9 +183,9 @@
"reset_search": "Restablecer Búsqueda",
"results": "{ total } Resultados",
"serial_number": "Número de serie",
"show_advanced_view_options": "Mostrar Opciones Avanzadas de Vista",
"show_advanced_view_options": "Mostrar opciones avanzadas de vista",
"sold_at": "Vendido el",
"sold_details": "Detalles de Venta",
"sold_details": "Detalles de venta",
"sold_price": "Precio de venta",
"sold_to": "Vendido a",
"tip_1": "Los filtros de ubicación y etiquetas utilizan el operador \"OR\". Si se selecciona más de uno, sólo uno será\n necesario para obtener una coincidencia.",
@@ -194,13 +194,13 @@
"tips": "Sugerencias",
"tips_sub": "Sugerencias de Búsqueda",
"updated_at": "Actualizado El",
"warranty": "Garantía",
"warranty_details": "Detalles de Garantía",
"warranty_expires": "Expiración Garantía"
"warranty": "Garantia",
"warranty_details": "Detalles de garantía",
"warranty_expires": "La garantia expira"
},
"labels": {
"no_results": "Etiquetas No Encontradas",
"update_label": "Actualizar Etiqueta"
"update_label": "Actualizar etiqueta"
},
"languages": {
"ca": "Catalán",
@@ -210,11 +210,11 @@
"fr": "Francés",
"hu": "Húngaro",
"it": "Italiano",
"ja-JP": "Japonés",
"ja-JP": "Japones",
"nl": "Holandés",
"pl": "Polaco",
"pt-BR": "Portugués (Brasil)",
"pt-PT": "Portugués (Portugal)",
"pt-PT": "Portugués",
"ru": "Ruso",
"sl": "Esloveno",
"sv": "Sueco",
@@ -225,15 +225,11 @@
"zh-MO": "Chino (Macao)",
"zh-TW": "Chino (Tradicional)"
},
"languages.da-DK": "Danés",
"languages.fi.FI": "Finlandés",
"languages.ro-RO": "Rumano",
"languages.sk-SK": "Eslovaco",
"locations": {
"child_locations": "Ubicaciones Hijas",
"collapse_tree": "Colapsar Árbol",
"child_locations": "Ubicaciones hijas",
"collapse_tree": "Colapsar árbol",
"no_results": "Ubicaciones No Encontradas",
"update_location": "Actualizar Ubicación"
"update_location": "Actualizar ubicación"
},
"maintenance": {
"filter": {
@@ -271,7 +267,7 @@
"total_entries": "Total de Entradas"
},
"menu": {
"create_item": "Artículo / Activo",
"create_item": "Articulo / Activo",
"create_label": "Etiqueta",
"create_location": "Ubicación",
"home": "Inicio",

View File

@@ -9,30 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "Il y a {0}",
"days": "jours",
"hour": "heure",
"hours": "heures",
"in": "autour de {0}",
"just-now": "juste maintenant",
"last-month": "Le mois précédent",
"last-week": "la semaine dernière",
"last-year": "l'année dernière",
"minute": "minute",
"minutes": "minutes",
"months": "mois",
"next-month": "Le mois prochain",
"next-week": "la semaine prochaine",
"next-year": "l'année prochaine",
"second": "seconde",
"seconds": "secondes",
"tomorrow": "demain",
"week": "semaine",
"weeks": "semaines",
"years": "années",
"yesterday": "hier"
},
"page_qr_code": {
"page_url": "URL de la page"
},
@@ -42,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "Description de l'article",
"item_name": "Nom de l'article",
"photo_button": "Photo 📷",
"title": "Créer un article"
},
@@ -53,45 +27,29 @@
"items": "Articles",
"no_items": "Pas d'articles à afficher",
"table": "Tableau"
},
"table": {
"page": "Page",
"rows_per_page": "Lignes par page"
}
}
},
"label": {
"create_modal": {
"label_description": "Description de l'étiquette",
"label_name": "Nom de l'étiquette",
"title": "Créer une étiquette"
}
},
"location": {
"create_modal": {
"location_description": "Description de l'emplacement",
"location_name": "Nom de l'emplacement",
"title": "Créer un emplacement"
},
"selector": {
"parent_location": "Emplacement parent"
},
"tree": {
"no_locations": "Aucun emplacement disponible. Ajoutez votre premier emplacement avec\nle bouton `<`span class=\"link-primary\"`>`Créer`<`/span`>` dans la barre de navigation."
"no_locations": "Aucun emplacement disponible. Ajoutez votre premiers emplacements avec\nle bouton `<`span class=\"link-primary\"`>`Créer`<`/span`>` dans la barre de navigation."
}
}
},
"global": {
"add": "Ajouter",
"build": "Version: { build }",
"build": "Assemblage : { build }",
"confirm": "Confirmer",
"create": "Créer",
"create_and_add": "Créer et en ajouter un autre",
"created": "Créé",
"delete": "Supprimer",
"details": "Détails",
"duplicate": "Dupliquer",
"edit": "Modifier",
"email": "Courriel",
"follow_dev": "Suivre le développeur",
"github": "Projet GitHub",
@@ -99,11 +57,9 @@
"join_discord": "Rejoindre le Discord",
"labels": "Étiquettes",
"locations": "Emplacements",
"maintenance": "Maintenance",
"name": "Nom",
"password": "Mot de passe",
"read_docs": "Lire la documentation",
"save": "Lire plus tard",
"search": "Rechercher",
"sign_out": "Se déconnecter",
"submit": "Soumettre",
@@ -171,10 +127,6 @@
"zh-MO": "Chinois (Macao)",
"zh-TW": "Chinois (traditionnel)"
},
"languages.da-DK": "Danois",
"languages.fi.FI": "Finnois",
"languages.ro-RO": "Roumain",
"languages.sk-SK": "Slovaque",
"locations": {
"no_results": "Aucun emplacement trouvé"
},
@@ -206,8 +158,8 @@
},
"monthly_average": "Moyenne mensuelle",
"toast": {
"failed_to_create": "Échec de création de l'entrée",
"failed_to_delete": "Échec de suppression de l'entrée",
"failed_to_create": "Échec de suppression de l'entrée",
"failed_to_delete": "Échec de création de l'entrée",
"failed_to_update": "Échec de mise à jour de l'entrée"
},
"total_cost": "Coût total",

View File

@@ -9,19 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "{0} ezelőtt",
"in": "{0} múlva",
"just-now": "épp most",
"last-month": "múlt hónapban",
"last-week": "múlt héten",
"last-year": "tavaly",
"next-month": "jövő hónapban",
"next-week": "jövő héten",
"next-year": "jövőre",
"tomorrow": "holnap",
"yesterday": "tegnap"
},
"page_qr_code": {
"page_url": "Oldal URL-je"
},
@@ -31,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "Tétel leírása",
"item_name": "Tétel neve",
"photo_button": "Fénykép 📷",
"title": "Új elem létrehozása"
},
@@ -42,45 +27,29 @@
"items": "Tételek",
"no_items": "Nincs megjeleníthető elem",
"table": "Táblázat"
},
"table": {
"page": "Oldal",
"rows_per_page": "Sorok oldalanként"
}
}
},
"label": {
"create_modal": {
"label_description": "Címke leírása",
"label_name": "Címke neve",
"title": "Címke létrehozása"
}
},
"location": {
"create_modal": {
"location_description": "Hely leírása",
"location_name": "Hely neve",
"title": "Új hely létrehozása"
},
"selector": {
"parent_location": "Ezt tartalmazó hely"
},
"tree": {
"no_locations": "Nincs elérhető hely. Adj hozzá új helyet a\n `<`span class=\"link-primary\"`>`Létrehozás`<`/span`>` gombbal a navigációs sávon."
}
}
},
"global": {
"add": "Hozzáadás",
"build": "Build: { build }",
"confirm": "Megerősítés",
"create": "Létrehozás",
"create_and_add": "Létrehozás és újabb hozzáadása",
"created": "Létrehozva",
"delete": "Törlés",
"details": "Részletek",
"duplicate": "Másolás",
"edit": "Szerkesztés",
"email": "Email",
"follow_dev": "Kövesd a fejlesztőt",
"github": "Github projekt",
@@ -88,29 +57,15 @@
"join_discord": "Csatlakozz a Discordhoz",
"labels": "Címkék",
"locations": "Helyek",
"maintenance": "Karbantartás",
"name": "Név",
"password": "Jelszó",
"read_docs": "Olvasd el a dokumentációt",
"save": "Mentés",
"search": "Keresés",
"sign_out": "Kijelentkezés",
"submit": "Elküldés",
"update": "Módosítás",
"value": "Érték",
"version": "Verzió: { version }",
"welcome": "Üdv, { username }"
},
"home": {
"labels": "Címkék",
"quick_statistics": "Gyors statisztika",
"recently_added": "Nemrég hozzáadott",
"storage_locations": "Tárolási helyek",
"total_items": "Összes tétel",
"total_labels": "Összes címke",
"total_locations": "Összes hely",
"total_value": "Teljes érték"
},
"index": {
"disabled_registration": "Regisztráció kikapcsolva",
"dont_join_group": "Nem szeretnél csatlakozni egy csoporthoz?",
@@ -125,71 +80,32 @@
},
"items": {
"add": "Hozzáadás",
"advanced": "Haladó",
"archived": "Archivált",
"asset_id": "Eszközazonosító",
"attachment": "Melléklet",
"attachments": "Mellékletek",
"changes_persisted_immediately": "A mellékletek módosításai azonnal mentésre kerülnek",
"created_at": "Létrehozás dátuma",
"custom_fields": "Egyedi mezők",
"description": "Leírás",
"details": "Részletek",
"drag_and_drop": "Húzd ide a fájlokat, vagy kattints a fájlok kiválasztásához",
"edit_details": "Részletek szerkesztése",
"field_selector": "Mezőválasztó",
"field_value": "Mező értéke",
"first": "Első",
"include_archive": "Archivált elemek belefoglalása",
"insured": "Biztosítva",
"last": "Utolsó",
"lifetime_warranty": "Élettartam garancia",
"location": "Hely",
"manual": "Kézikönyv",
"manuals": "Kézikönyvek",
"manufacturer": "Gyártó",
"model_number": "Modellszám",
"name": "Név",
"negate_labels": "Címkeválasztás negálása",
"next_page": "Következő oldal",
"no_results": "Egy elem sem található",
"notes": "Megjegyzések",
"options": "Opciók",
"order_by": "Rendezés",
"pages": "{page}/{totalPages} oldal",
"parent_item": "Szülő tétel",
"photo": "Fénykép",
"photos": "Fényképek",
"prev_page": "Előző oldal",
"purchase_date": "Vásárlás dátuma",
"purchase_details": "Vásárlás részletei",
"purchase_price": "Beszerzési ár",
"purchased_from": "Beszerzési hely",
"quantity": "Mennyiség",
"query_id": "Eszközazonosító szám lekérdezése: { id }",
"receipt": "Számla",
"receipts": "Számlák",
"reset_search": "Alaphelyzet",
"results": "{total} találat",
"serial_number": "Sorozatszám",
"show_advanced_view_options": "További beállítások megjelenítése",
"sold_at": "Eladás dátuma",
"sold_details": "Eladás részletei",
"sold_price": "Eladási ár",
"sold_to": "Vevő",
"tip_1": "A hely- és címkeszűrők a „vagy” műveletet használják. Ha egynél többet választasz ki,\n bármelyik egyezése esetén megjelenik a tétel.",
"tip_2": "A '#' előtaggal ellátott keresések egy eszközazonosítót fognak lekérdezni (például '#000-001')",
"tip_3": "A mezőszűrők a „vagy” műveletet használják. Ha egynél többet választasz ki,\n bármelyik egyezése esetén megjelenik a tétel.",
"tips": "Tippek",
"tips_sub": "Tippek a kereséshez",
"updated_at": "Változtatás dátuma",
"warranty": "Garancia",
"warranty_details": "Garancia részletei",
"warranty_expires": "Garancia vége"
"updated_at": "Változtatás dátuma"
},
"labels": {
"no_results": "Nem található címke",
"update_label": "Címke módosítása"
"no_results": "Nem található címke"
},
"languages": {
"ca": "Katalán",
@@ -199,30 +115,20 @@
"fr": "Francia",
"hu": "Magyar",
"it": "Olasz",
"ja-JP": "Japán",
"nl": "Holland",
"pl": "Lengyel",
"pt-BR": "Portugál (brazíliai)",
"pt-PT": "Portugál (Portugália)",
"ru": "Orosz",
"sl": "Szlovén",
"sv": "Svéd",
"tr": "Török",
"uk-UA": "Ukrán",
"zh-CN": "Kínai (egyszerűsített)",
"zh-HK": "Kínai (hongkongi)",
"zh-MO": "Kínai (makaói)",
"zh-TW": "Kínai (hagyományos)"
},
"languages.da-DK": "Dán",
"languages.fi.FI": "Finn",
"languages.ro-RO": "Román",
"languages.sk-SK": "Szlovák",
"locations": {
"child_locations": "Tartalmazott helyek",
"collapse_tree": "Fanézet becsukása",
"no_results": "Nem található hely",
"update_location": "Hely módosítása"
"no_results": "Nem található hely"
},
"maintenance": {
"filter": {
@@ -260,9 +166,6 @@
"total_entries": "Összes bejegyzés"
},
"menu": {
"create_item": "Tétel / Eszköz",
"create_label": "Címke",
"create_location": "Hely",
"home": "Kezdőlap",
"locations": "Helyek",
"maintenance": "Karbantartás",
@@ -279,7 +182,6 @@
"delete_account_sub": "Törlöd a fiókodat és az összes kapcsolódó adatot. Ezt a műveletet nem lehet visszavonni.",
"display_header": "{ currentValue, select, true {Fejléc elrejtése} false {Fejléc megjelenítése} other{Nincs találat}}",
"enabled": "Engedélyezve",
"example": "Példa",
"gen_invite": "Meghívó link létrehozása",
"group_settings": "Csoport beállításai",
"group_settings_sub": "Ezek a csoport közös beállításai. Lehet hogy frissítened kell az oldalt a böngésződben a beállítások megváltoztatása után.",

View File

@@ -225,10 +225,6 @@
"zh-MO": "Cinese (Macao)",
"zh-TW": "Cinese (tradizionale)"
},
"languages.da-DK": "Danese",
"languages.fi.FI": "Finlandese",
"languages.ro-RO": "Rumeno",
"languages.sk-SK": "Slovacco",
"locations": {
"child_locations": "Ubicazione figlia",
"collapse_tree": "Contrai albero",

View File

@@ -1,351 +0,0 @@
{
"components": {
"app": {
"import_dialog": {
"change_warning": "Oppførsel for importjobber med eksisterende import_refs har blitt endret. Hvis en import_ref eksisterer i CSV-filen,\nvil objektet oppdateres med verdiene fra CSV-filen.",
"description": "Importer en CSV-fil som inneholder alle objekter, merkelapper og lokasjoner. Konsulter dokumentasjonen for mer\ninformasjon om påkrevd format.",
"title": "Importer CSV-fil",
"upload": "Last opp"
}
},
"global": {
"date_time": {
"ago": "{0} siden",
"days": "dager",
"hour": "time",
"hours": "timer",
"in": "om {0}",
"just-now": "akkurat nå",
"last-month": "forrige måned",
"last-week": "forrige uke",
"last-year": "i fjor",
"minute": "minutt",
"minutes": "minutter",
"months": "måneder",
"next-month": "neste måned",
"next-week": "neste uke",
"next-year": "neste år",
"second": "sekund",
"seconds": "sekunder",
"tomorrow": "i morgen",
"week": "uke",
"weeks": "uker",
"years": "år",
"yesterday": "i går"
},
"page_qr_code": {
"page_url": "Side-URL"
},
"password_score": {
"password_strength": "Passordstyrke"
}
},
"item": {
"create_modal": {
"item_description": "Objektbeskrivelse",
"item_name": "Objektnavn",
"photo_button": "Foto 📷",
"title": "Opprett objekt"
},
"view": {
"selectable": {
"card": "Kort",
"items": "Objekter",
"no_items": "Ingenting å vise",
"table": "Tabell"
},
"table": {
"page": "Side",
"rows_per_page": "Rader pr. Side"
}
}
},
"label": {
"create_modal": {
"label_description": "Merkelappbeskrivelse",
"label_name": "Merkelappnavn",
"title": "Opprett merkelapp"
}
},
"location": {
"create_modal": {
"location_description": "Lokasjonsbeskrivelse",
"location_name": "Lokasjonsnavn",
"title": "Opprett lokasjon"
},
"selector": {
"parent_location": "Overordnet lokasjon"
},
"tree": {
"no_locations": "Ingen tilgjengelige lokasjoner. Legg til en ny lokasjon via\n `<`span class=\"link-primary\"`>`Opprett`<`/span`>`-knappen på navigasjonslinjen."
}
}
},
"global": {
"add": "Legg til",
"build": "Byggnummer: { build }",
"confirm": "Bekreft",
"create": "Opprett",
"create_and_add": "Opprett og legg til ny",
"created": "Opprettet",
"delete": "Slett",
"details": "Detaljer",
"duplicate": "Dupliser",
"edit": "Rediger",
"email": "E-post",
"follow_dev": "Følg utvikleren",
"github": "GitHub-prosjekt",
"items": "Objekter",
"join_discord": "Bli med på Discord",
"labels": "Merkelapper",
"locations": "Lokasjoner",
"maintenance": "Vedlikehold",
"name": "Navn",
"password": "Passord",
"read_docs": "Les dokumentasjonen",
"save": "Lagre",
"search": "Søk",
"sign_out": "Logg ut",
"submit": "Send",
"update": "Oppdater",
"value": "Verdi",
"version": "Versjon: { version }",
"welcome": "Velkommen, { username }"
},
"home": {
"labels": "Merkelapper",
"quick_statistics": "Rask statistikk",
"recently_added": "Nylig lagt til",
"storage_locations": "Oppbevaringslokasjoner",
"total_items": "Antall objekter",
"total_labels": "Antall merkelapper",
"total_locations": "Antall lokasjoner",
"total_value": "Total verdi"
},
"index": {
"disabled_registration": "Registrering deaktivert",
"dont_join_group": "Vil du ikke bli med i en gruppe?",
"joining_group": "Du holder på å bli med i en eksisterende gruppe!",
"login": "Logg inn",
"register": "Registrer",
"remember_me": "Husk meg",
"set_email": "Hva er e-postadressen din?",
"set_name": "Hva er navnet ditt?",
"set_password": "Angi passord",
"tagline": "Spor, organiser og hold styr på tingene dine."
},
"items": {
"add": "Legg til",
"advanced": "Avansert",
"archived": "Arkivert",
"asset_id": "Asset-ID",
"attachment": "Vedlegg",
"attachments": "Vedlegg",
"changes_persisted_immediately": "Endringer til vedlegg blir lagret umiddelbart",
"created_at": "Lagt til den",
"custom_fields": "Egendefinerte felt",
"description": "Beskrivelse",
"details": "Detaljer",
"drag_and_drop": "Dra og slipp filer her, eller klikk for å bla gjennom",
"edit_details": "Rediger detaljer",
"field_selector": "Feltvelger",
"field_value": "Feltverdi",
"first": "Først",
"include_archive": "Inkluder arkiverte objekter",
"insured": "Forsikret",
"last": "Sist",
"lifetime_warranty": "Livetidsgaranti",
"location": "Lokasjon",
"manual": "Bruksanvisning",
"manuals": "Bruksanvisninger",
"manufacturer": "Produsent",
"model_number": "Modellnummer",
"name": "Navn",
"negate_labels": "Se bort fra valgte merkelapper",
"next_page": "Neste side",
"no_results": "Ingenting funnet",
"notes": "Notater",
"options": "Alternativer",
"order_by": "Sorter etter",
"pages": "Side { page } av { totalPages }",
"parent_item": "Overordnet objekt",
"photo": "Bilde",
"photos": "Bilder",
"prev_page": "Forrige side",
"purchase_date": "Innkjøpsdato",
"purchase_details": "Kjkøpsdetaljer",
"purchase_price": "Innkjøpspris",
"purchased_from": "Kjøpt fra",
"quantity": "Antall",
"query_id": "Spørring for Asset ID-nummer: { id }",
"receipt": "Kvittering",
"receipts": "Kvitteringer",
"reset_search": "Nullstill søk",
"results": "{ total } resultater",
"serial_number": "Serienummer",
"show_advanced_view_options": "Vis avansert Vis alternativer",
"sold_at": "Salgskanal",
"sold_details": "Salgsdetaljer",
"sold_price": "Salgspris",
"sold_to": "Solgt til",
"tip_1": "Lokasjon og merkelappfiltere bruker OR-operand. Hvis mer enn én er valgt, er bare en\n påkrevd for å få et søketreff.",
"tip_2": "Søk med #-prefix vil søke etter en asset-ID (f.eks. #000-001)",
"tip_3": "Feltet filtrer med OR-operand. Hvis mer enn én er valgt vil bare en være påkrevd for å få et\nsøketreff.",
"tips": "Tips",
"tips_sub": "Søketips",
"updated_at": "Oppdatert den",
"warranty": "Garanti",
"warranty_details": "Garantidetaljer",
"warranty_expires": "Garanti upløper"
},
"labels": {
"no_results": "Ingen merkelapper funnet",
"update_label": "Oppdater merkelapp"
},
"languages": {
"ca": "Katalansk",
"de": "Tysk",
"en": "Engelsk",
"es": "Spansk",
"fr": "Fransk",
"hu": "Ungarsk",
"it": "Italiensk",
"ja-JP": "Japansk",
"nl": "Nederlandsk",
"pl": "Polsk",
"pt-BR": "Portugisisk (Brasil)",
"pt-PT": "Portugisisk (Portugal)",
"ru": "Russisk",
"sl": "Slovensk",
"sv": "Svensk",
"tr": "Tyrkisk",
"uk-UA": "Ukrainsk",
"zh-CN": "Kinesisk (forenklet)",
"zh-HK": "Kinesisk (Hong Kong)",
"zh-MO": "Kinesisk (Macau)",
"zh-TW": "Kinesisk (tradisjonell)"
},
"languages.da-DK": "Dansk",
"languages.fi.FI": "Finsk",
"languages.ro-RO": "Rumensk",
"languages.sk-SK": "Slovakisk",
"locations": {
"child_locations": "Underlokasjoner",
"collapse_tree": "Slå sammen mappetre",
"no_results": "Ingen lokasjoner funnet",
"update_location": "Oppdater lokasjon"
},
"maintenance": {
"filter": {
"both": "Begge",
"completed": "Fullført",
"scheduled": "Planlagt"
},
"list": {
"complete": "Ferdig",
"create_first": "Opprett ditt første innlegg",
"delete": "Slett",
"duplicate": "Dupliser",
"edit": "Rediger",
"new": "Ny"
},
"modal": {
"completed_date": "Fullført dato",
"cost": "Kostnad",
"delete_confirmation": "Er du sikker på at du vil slette denne oppføringen?",
"edit_action": "Oppdater",
"edit_title": "Rediger oppføring",
"entry_name": "Oppføringsnavn",
"new_action": "Opprett",
"new_title": "Ny oppføring",
"notes": "Notater",
"scheduled_date": "Planlagt dato"
},
"monthly_average": "Månedlig gjennomsnitt",
"toast": {
"failed_to_create": "Kunne ikke opprette oppføring",
"failed_to_delete": "Kunne ikke slette oppføring",
"failed_to_update": "Kunne ikke oppdatere oppføring"
},
"total_cost": "Totalkostnad",
"total_entries": "Antall oppføringer"
},
"menu": {
"create_item": "Objekt",
"create_label": "Merkelapp",
"create_location": "Lokasjon",
"home": "Hjem",
"locations": "Lokasjoner",
"maintenance": "Vedlikehold",
"profile": "Profil",
"search": "Søk",
"tools": "Verktøy"
},
"profile": {
"active": "Aktiv",
"change_password": "Endre passord",
"currency_format": "Valutaformat",
"current_password": "Nåværende passord",
"delete_account": "Slett konto",
"delete_account_sub": "Slett kontoen din og alle data knyttet til den. Denne handlingen kan ikke angres.",
"display_header": "{ currentValue, select, true {Skjul overskrift} false {Vis overskrift} other {Ingen treff}}",
"enabled": "Aktivert",
"example": "Eksempel",
"gen_invite": "Opprett invitasjonslenke",
"group_settings": "Gruppeinnstillinger",
"group_settings_sub": "Delte gruppeinnstillinger. Du må muligens laste inn siden på nytt for at noen endringer skal aktiveres.",
"inactive": "Inaktiv",
"language": "Språk",
"new_password": "Nytt passord",
"no_notifiers": "Ingen varslingsmekanismer satt opp",
"notifier_modal": "{ type, select, true {Rediger} false {Opprett} other {Annen}} varsling",
"notifiers": "Varslingsmekanismer",
"notifiers_sub": "Få varslinger for kommende vedlikeholdspåminnelser",
"test": "Test",
"theme_settings": "Temainnstillinger",
"theme_settings_sub": "Temainnstillinger lagres i nettleseren din sin midlertidige lagring. Du kan endre temaet når som helst. Hvis du\n har problemer, last inn siden på nytt.",
"update_group": "Oppdater gruppe",
"update_language": "Oppdater språk",
"url": "URL",
"user_profile": "Brukerprofil",
"user_profile_sub": "Inviter brukere og behandle kontoen din."
},
"tools": {
"actions": "Inventarhandlinger",
"actions_set": {
"ensure_ids": "Sikre Asset IDer",
"ensure_ids_button": "Sikre Asset IDer",
"ensure_ids_sub": "Sikrer at alle objekter i inventarlisten har et gyldig asset_id-felt. Dette gjøres ved å finne den høyeste asset_iden i databasen og legge til neste tilgjengelige verdi til hvert objekt som ikke har en asset_id. Dette gjøres i rekkefølgen til verdien fra created_at-feltet.",
"ensure_import_refs": "Sikre import-referanser",
"ensure_import_refs_button": "Sikre import-referanser",
"ensure_import_refs_sub": "Sikrer at alle objektene i inventaret har et gyldig import_ref-felt. Dette gjøres ved å opprette en tilfeldig 8-tegns tekststreng for hvert objekt som har et tomt import_ref-felt.",
"set_primary_photo": "Angi primærbilde",
"set_primary_photo_button": "Angi primærbilde",
"set_primary_photo_sub": "I versjon v0.10.0 av Homebox ble det primære bildefeltet lagt til vedlegg som type foto. Denne handlingen vil sette verdien for det primære bildefeltet til det første bildet lagret i databasen, hvis det ikke allerede er angitt. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Jfr. GitHub PR #576'</a>'",
"zero_datetimes": "Null ut objektdatotider",
"zero_datetimes_button": "Null ut objektdatotider",
"zero_datetimes_sub": "Nullstiller tidsverdien for alle datotid-felter i inventaret til starten av datoen. Dette er for å fikse en bug som ble tidlig introdusert i utviklingen av siden, og forårsaket at tidsverdien ble lagret sammen med tidspunktet, noe som skapte problemer for datofelt som skulle vise korrekte verdier. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Jfr. Github Issue #236 for flere detaljer.'</a>'"
},
"actions_sub": "Utfør massehandlinger for inventaret ditt. Disse handlingene er irreversible. '<b>'Vær forsiktig.'</b>'",
"import_export": "Importer/Eksporter",
"import_export_set": {
"export": "Eksporter inventar",
"export_button": "Eksporter inventar",
"export_sub": "Eksporterer standard CSV-format for Homebox. Dette vil eksportere alle objektene i inventaret ditt.",
"import": "Importer inventar",
"import_button": "Importer inventar",
"import_sub": "Importerer standard CSV-format for Homebox. Uten en '<code>'HB.import_ref'</code>'-kolonne vil dette '<b>'ikke'</b>' overskrive noen eksisterende objekter i inventaret ditt, bare legge til nye. Rader med en '<code>'HB.import_ref'</code>'-kolonne slås sammen med eksisterende objekter med samme import_ref, hvis en eksisterer."
},
"import_export_sub": "Importer og eksporter inventaret ditt til og fra CSV-format. Dette er nyttig for å flytte inventaret ditt til en ny instans av Homebox.",
"reports": "Rapporter",
"reports_set": {
"asset_labels": "Asset-ID-merkelapper",
"asset_labels_button": "Merkelappgenerator",
"asset_labels_sub": "Genererer en utskrivbar PDF-fil for merkelapper for en serie Asset-Ider. Disse er ikke spesifikke for ditt inventar, så du kan lage og skrive ut merkelapper før de trengs og feste dem til inventaret ditt når det kommer.",
"bill_of_materials": "Liste over materialer",
"bill_of_materials_button": "Opprett liste over materialer",
"bill_of_materials_sub": "Genererer en CSV (kommaseparerte verdier)-fil som kan importeres til et regnearkprogram. Dette er et sammendrag av inventaret ditt med grunnleggende objekt- og prisinformasjon."
},
"reports_sub": "Genererer forskjellige rapporter for inventaret ditt."
}
}

View File

@@ -70,7 +70,7 @@
"location": {
"create_modal": {
"location_description": "Locatie omschrijving",
"location_name": "Locatie Naam",
"location_name": "Locatie",
"title": "Maak locatie"
},
"selector": {
@@ -225,10 +225,6 @@
"zh-MO": "Chinees (Macau)",
"zh-TW": "Chinees (traditioneel)"
},
"languages.da-DK": "Deens",
"languages.fi.FI": "Fins",
"languages.ro-RO": "Roemeens",
"languages.sk-SK": "Slowaaks",
"locations": {
"child_locations": "Kind Locaties",
"collapse_tree": "Structuur invouwen",
@@ -293,7 +289,7 @@
"example": "Voorbeeld",
"gen_invite": "Genereer Uitnodigingslink",
"group_settings": "Groeps Instellingen",
"group_settings_sub": "Gedeelde groepsinstellingen. Het kan zijn dat je de browser moet verversen om alle instellingen te zien werken.",
"group_settings_sub": "Gedeelde groepsinstellingen. Het kan zijn dat je je browser moet verversen om alle instellingen te zien werken.",
"inactive": "Inactief",
"language": "Taal",
"new_password": "Nieuw Wachtwoord",
@@ -303,7 +299,7 @@
"notifiers_sub": "Krijg notificaties voor opkomende onderhouds herinneringen",
"test": "Test",
"theme_settings": "Theme instellingen",
"theme_settings_sub": "Thema-instellingen worden opgeslagen in de lokale opslag van uw browser. Je kan deze wijzigen op elk moment. \nAls je problemen hebt met de instellingen kun je de browser verversen.",
"theme_settings_sub": "Thema-instellingen worden opgeslagen in de lokale opslag van uw browser. Je kan deze wijzigen op elk moment. \nAls je problemen hebt met de instellingen kun je je browser verversen.",
"update_group": "Groep bijwerken",
"update_language": "Taal bijwerken",
"url": "URL",

View File

@@ -9,30 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "{0} atrás",
"days": "dias",
"hour": "hora",
"hours": "horas",
"in": "em {0}",
"just-now": "neste momento",
"last-month": "último mês",
"last-week": "última semana",
"last-year": "último ano",
"minute": "minuto",
"minutes": "minutos",
"months": "meses",
"next-month": "próximo mês",
"next-week": "próxima semana",
"next-year": "próximo ano",
"second": "segundo",
"seconds": "segundos",
"tomorrow": "amanhã",
"week": "semana",
"weeks": "semanas",
"years": "anos",
"yesterday": "ontem"
},
"page_qr_code": {
"page_url": "URL da página"
},
@@ -42,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "Descrição do Item",
"item_name": "Nome do Item",
"photo_button": "Foto📷",
"title": "Criar Item"
},
@@ -53,45 +27,29 @@
"items": "Items",
"no_items": "Nenhum item para exibir",
"table": "Tabela"
},
"table": {
"page": "Página",
"rows_per_page": "Linhas por página"
}
}
},
"label": {
"create_modal": {
"label_description": "Descrição da Etiqueta",
"label_name": "Nome da Etiqueta",
"title": "Criar etiqueta"
}
},
"location": {
"create_modal": {
"location_description": "Descrição do Local",
"location_name": "Nome do Local",
"title": "Criar Local"
},
"selector": {
"parent_location": "Local Pai"
},
"tree": {
"no_locations": "Não há locais disponíveis. Adicione novos locais\n através do botão \"Criar\" na barra de navegação."
}
}
},
"global": {
"add": "Adicionar",
"build": "Compilação: { build }",
"confirm": "Confirmar",
"create": "Criar",
"create_and_add": "Criar e Adicionar Outro",
"created": "Criado",
"delete": "Excluir",
"details": "Detalhes",
"duplicate": "Duplicar",
"edit": "Editar",
"email": "Email",
"follow_dev": "Seguir o desenvolvedor",
"github": "Projeto GitHub",
@@ -99,29 +57,15 @@
"join_discord": "Junte-se ao Discord",
"labels": "Etiquetas",
"locations": "Locais",
"maintenance": "Manutenção",
"name": "Nome",
"password": "Senha",
"read_docs": "Leia a Documentação",
"save": "Salvar",
"search": "Buscar",
"sign_out": "Sair",
"submit": "Enviar",
"update": "Atualizar",
"value": "Valor",
"version": "Versão: { version }",
"welcome": "Bem-vindo, {username}"
},
"home": {
"labels": "Etiquetas",
"quick_statistics": "Estatísticas Rápidas",
"recently_added": "Adicionados Recentemente",
"storage_locations": "Locais de Armazenamento",
"total_items": "Itens Totais",
"total_labels": "Etiquetas Totais",
"total_locations": "Locais Totais",
"total_value": "Valor Total"
},
"index": {
"disabled_registration": "Registro Desativado",
"dont_join_group": "Não quer participar de um grupo?",
@@ -136,71 +80,32 @@
},
"items": {
"add": "Adicionar",
"advanced": "Avançada",
"archived": "Arquivado",
"asset_id": "ID Do Ativo",
"attachment": "Anexo",
"attachments": "Anexos",
"changes_persisted_immediately": "Alterações nos anexos serão salvas imediatamente",
"created_at": "Criado em",
"custom_fields": "Campos Personalizados",
"description": "Descrição",
"details": "Detalhes",
"drag_and_drop": "Arraste e solte os arquivos aqui ou clique para selecionar os arquivos",
"edit_details": "Detalhes da Edição",
"field_selector": "Seletor de Campo",
"field_value": "Valor do Campo",
"first": "Primeiro",
"include_archive": "Incluir itens arquivados",
"insured": "Segurado",
"last": "Último",
"lifetime_warranty": "Garantia Vitalícia",
"location": "Local",
"manual": "Manual",
"manuals": "Manuais",
"manufacturer": "Fabricante",
"model_number": "Modelo",
"name": "Nome",
"negate_labels": "Negar os rótulos selecionados",
"next_page": "Próxima página",
"no_results": "Nenhum Item Encontrado",
"notes": "Anotações",
"options": "Opções",
"order_by": "Ordenar Por",
"pages": "Página { page } de { totalPages }",
"parent_item": "Item Pai",
"photo": "Foto",
"photos": "Fotos",
"prev_page": "Página anterior",
"purchase_date": "Data de Compra",
"purchase_details": "Detalhes da Compra",
"purchase_price": "Preço de Compra",
"purchased_from": "Comprado De",
"quantity": "Quantidade",
"query_id": "Consultando o número de ID do ativo: { id }",
"receipt": "Recibo",
"receipts": "Recibos",
"reset_search": "Reiniciar Pesquisa",
"results": "{ total } Resultados",
"serial_number": "Número Serial",
"show_advanced_view_options": "Exibir Opções de Visualização Avançada",
"sold_at": "Vendido Em",
"sold_details": "Detalhes da Venda",
"sold_price": "Preço de Venda",
"sold_to": "Vendido Para",
"tip_1": "Os filtros de local e etiqueta usam o operador \"OR\". Se você selecionar mais de um, somente um será\nnecessário para obter um resultado.",
"tip_2": "As pesquisas comprefixo '#'' buscam um ID de ativo (exemplo '#000-001')",
"tip_3": "Os filtros de local e etiqueta usam o operador \"OR\". Se você selecionar mais de um, somente um será\nnecessário para obter um resultado.",
"tips": "Dicas",
"tips_sub": "Dicas de pesquisa",
"updated_at": "Atualizado em",
"warranty": "Garantia",
"warranty_details": "Detalhes da Garantia",
"warranty_expires": "Garantia Expira Em"
"updated_at": "Atualizado em"
},
"labels": {
"no_results": "Nenhuma etiqueta encontrada",
"update_label": "Atualizar Etiqueta"
"no_results": "Nenhuma etiqueta encontrada"
},
"languages": {
"ca": "Catalão",
@@ -210,30 +115,20 @@
"fr": "Francês",
"hu": "Húngaro",
"it": "Italiano",
"ja-JP": "Japonês",
"nl": "Holandês",
"pl": "Polonês",
"pt-BR": "Português (Brasil)",
"pt-PT": "Português (Portugal)",
"ru": "Russo",
"sl": "Esloveno",
"sv": "Sueco",
"tr": "Turco",
"uk-UA": "Ucraniano",
"zh-CN": "Chinês (Simplificado)",
"zh-HK": "Chinês (Hong Kong)",
"zh-MO": "Chinês (Macau)",
"zh-TW": "Chinês (Tradicional)"
},
"languages.da-DK": "Dinamarquês",
"languages.fi.FI": "Finlandês",
"languages.ro-RO": "Romeno",
"languages.sk-SK": "Eslovaco",
"locations": {
"child_locations": "Locais Filhos",
"collapse_tree": "Ocultar Árvore",
"no_results": "Nenhum local encontrado",
"update_location": "Atualizar Local"
"no_results": "Nenhum local encontrado"
},
"maintenance": {
"filter": {
@@ -271,9 +166,6 @@
"total_entries": "Total de Entradas"
},
"menu": {
"create_item": "Item / Ativo",
"create_label": "Etiqueta",
"create_location": "Local",
"home": "Início",
"locations": "Locais",
"maintenance": "Manutenção",
@@ -290,7 +182,6 @@
"delete_account_sub": "Excluir sua conta e todos os dados associados. Essa ação não pode ser desfeita.",
"display_header": "{ currentValue, select, true {Ocultar cabeçalho} false {Mostrar cabeçalho} other {Não encontrado}}",
"enabled": "Ativado",
"example": "Exemplo",
"gen_invite": "Gerar link de convite",
"group_settings": "Definições do grupo",
"group_settings_sub": "Configurações de Grupo Compartilhado. É possível que tenha que recarregar a página para que alguns ajustes sejam aplicados.",

View File

@@ -2,37 +2,11 @@
"components": {
"app": {
"import_dialog": {
"change_warning": "Comportamentul pentru importuri cu import_refs existente s-a schimbat. Dacă un import_ref este prezent în fișierul CSV,\nobiectul v-a fi actualizat cu valorile din fișierul CSV.",
"description": "Importă un fișier CSV care conține toate obiectele, etichetele și locațiile tale. \nCitește documentația pentru mai multe informații privind format-ul necesar.",
"title": "Importă fișier CSV",
"upload": "Încarcă"
}
},
"global": {
"date_time": {
"ago": "{0} în urmă",
"days": "zile",
"hour": "oră",
"hours": "ore",
"in": "în {0}",
"just-now": "chiar acum",
"last-month": "luna trecută",
"last-week": "săptămâna trecută",
"last-year": "anul trecut",
"minute": "minut",
"minutes": "minute",
"months": "luni",
"next-month": "luna următoare",
"next-week": "săptămâna viitoare",
"next-year": "anul acesta",
"second": "secundă",
"seconds": "secunde",
"tomorrow": "Mâine",
"week": "săptămâna",
"weeks": "săptămâni",
"years": "ani",
"yesterday": "ieri"
},
"page_qr_code": {
"page_url": "URL Pagină"
},
@@ -42,8 +16,6 @@
},
"item": {
"create_modal": {
"item_description": "Descriere articol",
"item_name": "Denumire articol",
"photo_button": "Imagine 📷",
"title": "Crează articol"
},
@@ -53,45 +25,29 @@
"items": "Articole",
"no_items": "Nu există articole pentru afișare",
"table": "Tabel"
},
"table": {
"page": "Pagină",
"rows_per_page": "Rânduri pe pagină"
}
}
},
"label": {
"create_modal": {
"label_description": "Descrierea etichetei",
"label_name": "Nume eticheta",
"title": "Crează Etichetă"
}
},
"location": {
"create_modal": {
"location_description": "Descriere locatie",
"location_name": "Nume locație",
"title": "Crează Locație"
},
"selector": {
"parent_location": "Locație Părinte"
},
"tree": {
"no_locations": "Nu există locații disponibile. Adaugă o locație nouă folosind butonul\n`<`span class=\"link-primary\"`>`Crează`<`/span`>` din bara de navigație."
}
}
},
"global": {
"add": "Adaugă",
"build": "Build: { build }",
"confirm": "Confirmă",
"create": "Crează",
"create_and_add": "Crează și Adaugă încă un articol",
"created": "Creat",
"delete": "Șterge",
"details": "Detalii",
"duplicate": "Duplicat",
"edit": "Redactare",
"email": "Adresă de email",
"follow_dev": "Urmărește developer-ul",
"github": "Proiect GitHub",
@@ -99,29 +55,15 @@
"join_discord": "Vino pe Discord",
"labels": "Etichete",
"locations": "Locații",
"maintenance": "Mentenanță",
"name": "Nume",
"password": "Parolă",
"read_docs": "Citește documentația",
"save": "Salvare",
"search": "Caută",
"sign_out": "Ieșire",
"submit": "Trimite",
"update": "Actualizare",
"value": "Valoare",
"version": "Versiune: { version }",
"welcome": "Bun venit, { username }"
},
"home": {
"labels": "Etichete",
"quick_statistics": "Statistici rapide",
"recently_added": "Adăugat recent",
"storage_locations": "Locații de depozitare",
"total_items": "Total articole",
"total_labels": "Număr total etichete",
"total_locations": "Total locații",
"total_value": "Valoare totală"
},
"index": {
"disabled_registration": "Înregistrare Dezactivată",
"dont_join_group": "Nu vrei sa te alături unui grup?",
@@ -136,71 +78,29 @@
},
"items": {
"add": "Adaugă",
"advanced": "Avansat",
"archived": "Arhivate",
"asset_id": "ID activ",
"attachment": "Atașament",
"attachments": "Fișiere atașate",
"changes_persisted_immediately": "Modificările atașamentelor vor fi salvate imediat",
"created_at": "Creat la",
"custom_fields": "Câmpuri personalizate",
"description": "Descriere",
"details": "Detalii",
"drag_and_drop": "Trageți și plasați fișierele aici sau faceți clic pentru a selecta fișierele",
"edit_details": "Editare detalii",
"field_selector": "Selector Câmp",
"field_value": "Valoare Câmp",
"first": "Primul",
"include_archive": "Include Articole Arhivate",
"insured": "Asigurat",
"last": "Ultimul",
"lifetime_warranty": "Garanție pe viață",
"location": "Locație",
"manual": "Manual",
"manuals": "Manuale",
"manufacturer": "Producător",
"model_number": "Număr model",
"name": "Nume",
"negate_labels": "Neagă Etichetele Selectate",
"next_page": "Următoarea Pagină",
"no_results": "Nu s-au găsit articole",
"notes": "Notițe",
"options": "Opțiuni",
"order_by": "Ordonează După",
"pages": "Pagina { page } din { totalPages }",
"parent_item": "Articol Părinte",
"photo": "Fotografie",
"photos": "Fotografii",
"prev_page": "Pagina Anterioară",
"purchase_date": "Data achiziției",
"purchase_details": "Detalii achiziție",
"purchase_price": "Prețul de Achiziție",
"purchased_from": "Achiziționat de la",
"quantity": "Cantitate",
"query_id": "Interogarea numărului de identificare a activului: { id }",
"receipt": "Chitanță",
"receipts": "Chitanțe",
"reset_search": "Resetează Căutare",
"results": "{ total } Rezultate",
"serial_number": "Număr de serie",
"show_advanced_view_options": "Afișează opțiuni avansate",
"sold_at": "Vândut la",
"sold_details": "Detalii vânzare",
"sold_price": "Preț vânzare",
"sold_to": "Vândut către",
"tip_1": "Filtrele de locație și de etichete folosesc operațiunea \"SAU\". Dacă sunt selectate mai multe,\ndoar unul va fi necesar pentru potrivire.",
"tip_2": "Căutările prefixate cu '#' vor efectua o căutare după ID de activ (exemplu '#000-001')",
"tip_3": "Filtrele de câmp folosesc operația \"OR\". Dacă sunt selectate mai multe, doar unul va fi necesar\npentru potrivire.",
"tips": "Sfaturi",
"tips_sub": "Sfaturi Căutare",
"updated_at": "Actualizat La",
"warranty": "Garanție",
"warranty_details": "Detalii Garanție",
"warranty_expires": "Garanția expiră"
"updated_at": "Actualizat La"
},
"labels": {
"no_results": "Nu s-au găsit Etichete",
"update_label": "Actualizare etichetă"
"no_results": "Nu s-au găsit Etichete"
},
"languages": {
"ca": "Catalană",
@@ -210,30 +110,20 @@
"fr": "Franceză",
"hu": "Maghiară",
"it": "Italiană",
"ja-JP": "Japoneză",
"nl": "Olandeză",
"pl": "Poloneză",
"pt-BR": "Portugheză (Brazilia)",
"pt-PT": "Portugheză (Portugalia)",
"ru": "Rusă",
"sl": "Slovenă",
"sv": "Suedeză",
"tr": "Turcă",
"uk-UA": "Ucraininană",
"zh-CN": "Chineză (Simplificată)",
"zh-HK": "Chineză (Hong Kong)",
"zh-MO": "Chineză (Macau)",
"zh-TW": "Chineză (Tradițională)"
},
"languages.da-DK": "Daneză",
"languages.fi.FI": "Finlandeză",
"languages.ro-RO": "Română",
"languages.sk-SK": "Slovacă",
"locations": {
"child_locations": "Locații copii",
"collapse_tree": "Contrage arbore",
"no_results": "Nu s-au găsit Locații",
"update_location": "Actualizare locație"
"no_results": "Nu s-au găsit Locații"
},
"maintenance": {
"filter": {
@@ -271,9 +161,6 @@
"total_entries": "Înregistrări Totale"
},
"menu": {
"create_item": "Articol / Activ",
"create_label": "Etichetă",
"create_location": "Locație",
"home": "Acasă",
"locations": "Locații",
"maintenance": "Mentenanță",
@@ -287,65 +174,38 @@
"currency_format": "Format monedă",
"current_password": "Parola Actuală",
"delete_account": "Șterge Cont",
"delete_account_sub": "Ștergeți contul și toate datele asociate acestuia. Această acțiune nu poate fi revocată.",
"display_header": "{ currentValue, select, true {Hide Header} false {Show Header} other {Not Hit}}",
"enabled": "Activat",
"example": "Exemplu",
"gen_invite": "Generează Link Invitație",
"group_settings": "Setări Grup",
"group_settings_sub": "Setări Grup Partajare. Este posibil să fie nevoie să reîncărcați browser-ul pentru aplicarea unor setări.",
"inactive": "Inactiv",
"language": "Limbă",
"new_password": "Parolă Nouă",
"no_notifiers": "Niciun notificator configurat",
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Notifier",
"notifiers": "Notificatori",
"notifiers_sub": "Primiți notificări pentru mementourile de întreținere viitoare",
"test": "Test",
"theme_settings": "Setări Temă",
"theme_settings_sub": "Setările temei sunt stocate în spațiul de stocare local al browserului. Poți schimba tema oricând. Dacă ai \ndificultăți la setarea temei, poți încerca să reîmprospătezi browser-ul.",
"update_group": "Actualizare Grup",
"update_language": "Actualizare Limbă",
"url": "URL",
"user_profile": "Profil Utilizator",
"user_profile_sub": "Invitați utilizatori și gestionați-vă contul."
"user_profile": "Profil Utilizator"
},
"tools": {
"actions": "Acțiuni Inventar",
"actions_set": {
"ensure_ids": "Garantează ID-urile activelor",
"ensure_ids_button": "Garantează ID-urile activelor",
"ensure_ids_sub": "Garantează că toate articolele din inventar au un câmp asset_id valid. Acest lucru se face găsind câmpul cu cel mai mare asset_id curent și aplicând următoarea valoare fiecărui articol care nu are câmpul assed_id completat. Acest lucru se face în ordinea dată de câmpul created_at.",
"ensure_import_refs": "Garantează Import Refs",
"ensure_import_refs_button": "Garantează Import Refs",
"ensure_import_refs_sub": "Garantează că toate articolele din inventar au un câmp import_ref valid. Acest lucru se face prin generarea unui șir de 8 caractere aleatoare pentru fiecare articol ce nu are câmp import_ref.",
"set_primary_photo": "Setează ca Imagine Principală",
"set_primary_photo_button": "Setează ca Imagine Principală",
"set_primary_photo_sub": "În versiunea v0.10.0 a Homebox, câmpul de imagine primară a fost adăugat la atașamentele de tip fotografie. Această acțiune va seta câmpul de imagine primară la prima imagine din matricea de atașamente din baza de date, dacă acest lucru nu este facut deja. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/pull/576\">'Vezi GitHub PR #576'</a>'",
"zero_datetimes": "Zero articol Data Ore",
"zero_datetimes_button": "Zero articol Data Ore",
"zero_datetimes_sub": "Resetează valoarea de timp pentru toate câmpurile de dată și oră din inventar la începutul datei. Acesta este un fix pentru un bug care a fost introdus la începutul dezvoltării și care a cauzat valoarea timpului să fie stocată cu timpul ceea ce a provocat probleme cu afișarea corectă a câmpurilor de dată. '<a class=\"link\" href=\"https://github.com/hay-kot/homebox/issues/236\" target=\"_blank\">'Vezi Github Issue #236 pentru mai multe detalii.'</a>'"
"set_primary_photo_button": "Setează ca Imagine Principală"
},
"actions_sub": "Aplicați acțiuni în inventar în bloc. Aceste acțiuni sunt ireversibile. '<b>'Procedați cu atenție.'</b>'",
"import_export": "Import/Export",
"import_export_set": {
"export": "Exportă Inventar",
"export_button": "Exportă Inventar",
"export_sub": "Exportă formatul CSV standard pentru Homebox. Această acțiune ca exporta toate articolele din inventar.",
"import": "Importă Inventar",
"import_button": "Importă Inventar",
"import_sub": "Importă formatul CSV standard pentru Homebox. Fără o coloana '<code>'HB.import_ref'</code>', '<b>'nu'</b>' se vor suprascrie articole existente în inventar, doar se vor adăuga articole noi. Câmpurile ce au o coloană '<code>'HB.import_ref'</code>' vor fi contopite cu articole existente care au același import_ref, în cazul în care acesta există."
"import_button": "Importă Inventar"
},
"import_export_sub": "Importați și exportați inventarul într-un fișier CSV. Acest lucru este util atunci când se migrează inventarul către o instanță nouă de Homebox.",
"reports": "Rapoarte",
"reports_set": {
"asset_labels": "Etichete de identificare a activului",
"asset_labels_button": "Generator de etichete",
"asset_labels_sub": "Generează un PDF imprimabil conținând etichete pentru o serie de ID-uri de activ. Acestea nu sunt specifice inventarului tău așadar etichetele se pot imprima din timp și se pot aplica ulterior.",
"bill_of_materials": "Lista Materialelor",
"bill_of_materials_button": "Generează BOM",
"bill_of_materials_sub": "Generează un fișier CSV (Valori separate prin virgulă) care poate fi importat într-un program de foi de calcul. Acesta este un sumar ar inventarului cu informații minimale legate de articole și prețuri."
},
"reports_sub": "Generați rapoarte diferite pentru inventarul tău."
"bill_of_materials_button": "Generează BOM"
}
}
}

View File

@@ -15,7 +15,6 @@
"hour": "час",
"hours": "часов",
"in": "через {0}",
"just-now": "только что",
"last-month": "предыдущий месяц",
"last-week": "предыдущая неделя",
"last-year": "предыдущий год",
@@ -62,36 +61,24 @@
},
"label": {
"create_modal": {
"label_description": "Описание метки",
"label_name": "Название метки",
"title": "Создать метку"
}
},
"location": {
"create_modal": {
"location_description": "Описание локации",
"location_name": "Название локации",
"title": "Создать локацию"
},
"selector": {
"parent_location": "Родительская локация"
},
"tree": {
"no_locations": "Нет доступных локаций. Добавьте новую локацию, \nнажав на кнопку `<`span class=\"link-primary\"`>`Создать`<`/span`>` в навигационном меню."
}
}
},
"global": {
"add": "Добавить",
"build": "Сборка: { build }",
"confirm": "Подтвердить",
"create": "Создать",
"create_and_add": "Создать и добавить еще",
"created": "Создано",
"delete": "Удалить",
"details": "Подробнее",
"duplicate": "Дублировать",
"edit": "Редактировать",
"email": "Email",
"follow_dev": "Следить за разработчиком",
"github": "Github проект",
@@ -99,29 +86,15 @@
"join_discord": "Присоединяйтесь к Discord",
"labels": "Метки",
"locations": "Локации",
"maintenance": "Техническое обслуживание и ремонт",
"name": "Имя",
"password": "Пароль",
"read_docs": "Прочитать документацию",
"save": "Сохранить",
"search": "Поиск",
"sign_out": "Выйти",
"submit": "Отправить",
"update": "Обновить",
"value": "Значение",
"version": "Версия: { version }",
"welcome": "Добро пожаловать, { username }"
},
"home": {
"labels": "Метки",
"quick_statistics": "Быстрая статистика",
"recently_added": "Недавно добавлено",
"storage_locations": "Места хранения",
"total_items": "Всего элементов",
"total_labels": "Всего меток",
"total_locations": "Общее количество местоположений",
"total_value": "Общая стоимость"
},
"index": {
"disabled_registration": "Регистрация отключена",
"dont_join_group": "Не хотите ли вступить в группу?",
@@ -136,71 +109,32 @@
},
"items": {
"add": "Добавить",
"advanced": "Дополнительно",
"archived": "В архиве",
"asset_id": "Инвентарный ID",
"attachment": "Вложение",
"attachments": "Вложения",
"changes_persisted_immediately": "Изменения во вложениях будут сохранены сразу же",
"created_at": "Создано в",
"custom_fields": "Настраиваемые поля",
"description": "Описание",
"details": "Подробнее",
"drag_and_drop": "Перетащите файлы сюда или нажмите, чтобы выбрать файлы",
"edit_details": "Редактирование деталей",
"field_selector": "Поле выбора",
"field_value": "Значение поля",
"first": "Первый",
"include_archive": "Включая архивированные элементы",
"insured": "Застраховано",
"last": "Последний",
"lifetime_warranty": "Гарантия на весь срок эксплуатации",
"location": "Местоположение",
"manual": "Руководство по эксплуатации",
"manuals": "Документация",
"manufacturer": "Производитель",
"model_number": "Номер модели",
"name": "Название",
"negate_labels": "Снять выбранные ярлыки",
"next_page": "Следующая страница",
"no_results": "Элементы не найдены",
"notes": "Заметки",
"options": "Параметры",
"order_by": "Сортировка по",
"pages": "Страница {page} из {totalPages}",
"parent_item": "Родительский элемент",
"photo": "Фото",
"photos": "Фотографии",
"prev_page": "Предыдущая страница",
"purchase_date": "Дата покупки",
"purchase_details": "Детали покупки",
"purchase_price": "Стоимость покупки",
"purchased_from": "Продавец",
"quantity": "Количество",
"query_id": "Запрос идентификационного номера актива: { id }",
"receipt": "Квитанция",
"receipts": "Квитанции",
"reset_search": "Сбросить поиск",
"results": "{ total } Результатов",
"serial_number": "Серийный номер",
"show_advanced_view_options": "Показать дополнительные параметры",
"sold_at": "Место продажи",
"sold_details": "Детали продажи",
"sold_price": "Цена продажи",
"sold_to": "Покупатель",
"tip_1": "При фильтрации по локации и по ярлыкам используется логический оператор «ИЛИ». Если выбрано несколько фильтров, то для срабатывания\n требуется лишь одно совпадение.",
"tip_2": "Поисковые запросы с префиксом \"#\" должны включать в себя ID актива (прим. '#000-001')",
"tip_3": "Фильтры по полю используют операцию «ИЛИ». Если выбрано несколько фильтров, для совпадения\n требуется только один.",
"tips": "Подсказки",
"tips_sub": "Поисковые подсказки",
"updated_at": "Обновлено в",
"warranty": "Гарантия",
"warranty_details": "Гарантийная информация",
"warranty_expires": "Срок гарантии истекает"
"updated_at": "Обновлено в"
},
"labels": {
"no_results": "Метки не найдены",
"update_label": "Обновить метку"
"no_results": "Метки не найдены"
},
"languages": {
"ca": "Каталанский",
@@ -210,30 +144,20 @@
"fr": "французский",
"hu": "Венгерский",
"it": "Итальянский",
"ja-JP": "Японский",
"nl": "Голландский",
"pl": "Польский",
"pt-BR": "Португальский (Бразилия)",
"pt-PT": "Португальский (Португалия)",
"ru": "Русский",
"sl": "Словенский",
"sv": "Шведский",
"tr": "Турецкий",
"uk-UA": "Украинский",
"zh-CN": "Китайский (упрощенный)",
"zh-HK": "Китайский (Гонконг)",
"zh-MO": "Китайский (Макао)",
"zh-TW": "китайский (традиционный)"
},
"languages.da-DK": "Датский (Дания)",
"languages.fi.FI": "Финский",
"languages.ro-RO": "Румынский",
"languages.sk-SK": "Словацкий",
"locations": {
"child_locations": "Вложенные локации",
"collapse_tree": "Свернуть всё дерево",
"no_results": "Локаций не найдено",
"update_location": "Обновить локацию"
"no_results": "Локаций не найдено"
},
"maintenance": {
"filter": {
@@ -271,9 +195,6 @@
"total_entries": "Всего записей"
},
"menu": {
"create_item": "Элемент",
"create_label": "Метка",
"create_location": "Местоположение",
"home": "Главная",
"locations": "Локации",
"maintenance": "Техническое обслуживание и ремонт",
@@ -290,7 +211,6 @@
"delete_account_sub": "Удалить свой аккаунт и все связанные с ним данные. Это действие невозможно отменить.",
"display_header": "{ currentValue, select, true {Скрыть заголовок} false {Показать заголовок} other {Нет результатов}}",
"enabled": "Активен",
"example": "Пример",
"gen_invite": "Сгенерировать ссылку-приглашение",
"group_settings": "Настройки группы",
"group_settings_sub": "Настройки общей группы. Для применения изменений возможно потребуется перезагрузить страницу.",

View File

@@ -225,10 +225,6 @@
"zh-MO": "Čínština (Macao)",
"zh-TW": "Číština (tradičná)"
},
"languages.da-DK": "Dánsko",
"languages.fi.FI": "Finsko",
"languages.ro-RO": "Rumunsko",
"languages.sk-SK": "Slovenčina",
"locations": {
"child_locations": "Umiestnenie dieťaťa",
"collapse_tree": "Zbaliť strom",

View File

@@ -225,10 +225,6 @@
"zh-MO": "Kitajščina (Macau)",
"zh-TW": "Kitajsščina (tradicionalna)"
},
"languages.da-DK": "Danščina",
"languages.fi.FI": "Finščina",
"languages.ro-RO": "Romunščina",
"languages.sk-SK": "Slovaščina",
"locations": {
"child_locations": "Podrejene lokacije",
"collapse_tree": "Strni drevo",

View File

@@ -138,7 +138,6 @@
"add": "Lägg till",
"advanced": "Avancerat",
"archived": "Arkiverad",
"asset_id": "Tillgångs-ID",
"attachment": "Bilaga",
"attachments": "Bilagor",
"changes_persisted_immediately": "Ändringar av bilagor sparas omedelbart",
@@ -184,7 +183,6 @@
"results": "{ total } Resultat",
"serial_number": "Serienummer",
"show_advanced_view_options": "Visa avancerade vyalternativ",
"sold_at": "Såld den",
"sold_details": "Försäljningsdetaljer",
"sold_price": "Försäljningspris",
"sold_to": "Såld till",
@@ -226,8 +224,6 @@
"zh-TW": "Kinesiska (traditionell)"
},
"locations": {
"child_locations": "Underordnade platser",
"collapse_tree": "Dra ihop träd",
"no_results": "Inga platser hittades",
"update_location": "Uppdatera plats"
},
@@ -251,23 +247,14 @@
"delete_confirmation": "Är du säker på att du vill radera denna post?",
"edit_action": "Uppdatera",
"edit_title": "Redigera",
"entry_name": "Startnamn",
"new_action": "Skapa",
"new_title": "Skapa nytt ärende",
"notes": "Anteckningar",
"scheduled_date": "Schemalagt datum"
},
"monthly_average": "Månatligt medelvärde",
"toast": {
"failed_to_create": "Det gick inte att skapa posten",
"failed_to_delete": "Det gick inte att ta bort posten",
"failed_to_update": "Det gick inte att uppdatera posten"
},
"total_cost": "Total kostnad",
"total_entries": "Totalt antal inlämningar"
"total_cost": "Total kostnad"
},
"menu": {
"create_item": "Artikel / Tillgång",
"create_label": "Etikett",
"create_location": "Plats",
"home": "Hem",
@@ -284,7 +271,6 @@
"current_password": "Nuvarande lösenord",
"delete_account": "Radera konto",
"delete_account_sub": "Ta bort ditt konto och alla tillhörande data. Detta kan inte ångras.",
"display_header": "{ currentValue, select, true {Dölj sidhuvud} false {Visa sidhuvud} other {Inte träff}}",
"enabled": "Aktiverad",
"example": "Exempel",
"gen_invite": "Skapa inbjudningslänk",
@@ -307,17 +293,6 @@
"user_profile_sub": "Bjud in användare och hantera ditt konto."
},
"tools": {
"actions": "Lageråtgärder",
"actions_set": {
"ensure_ids": "Säkerställ tillgångs-ID",
"ensure_ids_button": "Säkerställ tillgångs-ID",
"ensure_ids_sub": "Säkerställer att alla saker i din inventering har giltiga asset_id fält. Detta är gjort genom att hitta högsta nuvarande asset_id fält i databasen och tilldela nästa värde till varje sak som inte har ett asset_id värde. Detta görs i ordning av created_at fältet.",
"ensure_import_refs": "Se till att importera referenser",
"ensure_import_refs_button": "Se till att importera referenser",
"ensure_import_refs_sub": "Säkerställer att alla saker i din inventering har ett korrekt import_ref fält. Detta görs genom att slumpmässigt skapa en 8 tecken sträng för varje sak som ej har import_ref fältet tilldelat.",
"set_primary_photo": "Ställ in primärt foto",
"set_primary_photo_button": "Ställ in primärt foto"
},
"actions_sub": "Utför åtgärder på dina objekt i bulk. Dessa är oåterkalleliga. '<b>'Var försiktig.'</b>'",
"import_export": "Import/Export",
"reports": "Rapporter",

View File

@@ -9,30 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "{0} тому",
"days": "днів",
"hour": "година",
"hours": "годин",
"in": "через {0}",
"just-now": "щойно",
"last-month": "минулого місяця",
"last-week": "минулого тижня",
"last-year": "минулого року",
"minute": "хвилина",
"minutes": "хвилин",
"months": "місяців",
"next-month": "наступного місяця",
"next-week": "наступного тижня",
"next-year": "наступного року",
"second": "секунда",
"seconds": "секунд",
"tomorrow": "завтра",
"week": "тиждень",
"weeks": "тижні",
"years": "роки",
"yesterday": "вчора"
},
"page_qr_code": {
"page_url": "URL сторінки"
},
@@ -42,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "Опис елемента",
"item_name": "Назва елемента",
"photo_button": "Фото📷",
"title": "Додати предмет"
},
@@ -53,45 +27,29 @@
"items": "Предмети",
"no_items": "Предмети відсутні",
"table": "Таблиця"
},
"table": {
"page": "Сторінка",
"rows_per_page": "Рядків на сторінці"
}
}
},
"label": {
"create_modal": {
"label_description": "Опис мітки",
"label_name": "Назва мітки",
"title": "Створити наліпку"
}
},
"location": {
"create_modal": {
"location_description": "Опис місця",
"location_name": "Назва місця",
"title": "Створити локацію"
},
"selector": {
"parent_location": "Батьківське місце"
},
"tree": {
"no_locations": "Локації відсутні. Додайте нову за допомогою \n<`span class=\"link-primary\"`>`Створити`<`/span`>` клавіші ліворуч."
}
}
},
"global": {
"add": "Додати",
"build": "Зібрати: { build }",
"confirm": "Зберегти",
"create": "Створити",
"create_and_add": "Створити і додати ще один",
"created": "Створено",
"delete": "Видалити",
"details": "Подробиці",
"duplicate": "Дублювати",
"edit": "Редагувати",
"email": "Email",
"follow_dev": "Підписатись на розробника",
"github": "GitHub проекту",
@@ -99,29 +57,15 @@
"join_discord": "Доєднатися до Discord",
"labels": "Наліпки",
"locations": "Локації",
"maintenance": "Технічне обслуговування",
"name": "Ім'я",
"password": "Пароль",
"read_docs": "Переглянути документацію",
"save": "Зберегти",
"search": "Пошук",
"sign_out": "Вийти",
"submit": "Підтвердити",
"update": "Оновити",
"value": "Значення",
"version": "Версія: { version }",
"welcome": "Вітаю, { username }"
},
"home": {
"labels": "Мітки",
"quick_statistics": "Швидка статистика",
"recently_added": "Нещодавно додано",
"storage_locations": "Місця зберігання",
"total_items": "Всього елементів",
"total_labels": "Всього міток",
"total_locations": "Загальна кількість місць",
"total_value": "Загальна вартість"
},
"index": {
"disabled_registration": "Реєстрація недоступна",
"dont_join_group": "Не хочете доєднуватись до групи?",
@@ -136,71 +80,32 @@
},
"items": {
"add": "Додати",
"advanced": "Розширено",
"archived": "Архівовано",
"asset_id": "ID активу",
"attachment": "Вкладення",
"attachments": "Вкладення",
"changes_persisted_immediately": "Зміни до вкладень будуть збережені одразу",
"created_at": "Створено о",
"custom_fields": "Власні поля",
"description": "Опис",
"details": "Подробиці",
"drag_and_drop": "Перетягніть файли сюди або клацніть, щоб вибрати файли",
"edit_details": "Редагувати деталі",
"field_selector": "Обрати поле",
"field_value": "Значення поля",
"first": "Перший",
"include_archive": "Включити заархівовані предмети",
"insured": "Застраховано",
"last": "Останній",
"lifetime_warranty": "Довічна гарантія",
"location": "Місце",
"manual": "Посібник",
"manuals": "Посібники",
"manufacturer": "Виробник",
"model_number": "Номер моделі",
"name": "Назва",
"negate_labels": "Відмінити обрані мітки",
"next_page": "Наступна сторінка",
"no_results": "Предметів нема",
"notes": "Примітки",
"options": "Налаштування",
"order_by": "Відсортувати за",
"pages": "Сторінка { page } з { totalPages }",
"parent_item": "Батьківський елемент",
"photo": "Фото",
"photos": "Фото",
"prev_page": "Попередня сторінка",
"purchase_date": "Дата покупки",
"purchase_details": "Деталі купівлі",
"purchase_price": "Ціна покупки",
"purchased_from": "Куплено у",
"quantity": "Кількість",
"query_id": "Шукаю за ID предмета: { id }",
"receipt": "Чек",
"receipts": "Чеки",
"reset_search": "Скинути пошук",
"results": "{ total } Результатів",
"serial_number": "Серійний номер",
"show_advanced_view_options": "Показати розширені параметри",
"sold_at": "Продано за",
"sold_details": "Деталі продажу",
"sold_price": "Ціна продажу",
"sold_to": "Покупець",
"tip_1": "Фільтри по локації і міткам використовують операцію \"АБО\". Якщо більше одного обрано, тільки один\nз них має співпасти для виводу результату.",
"tip_2": "Пошуки, що починаються з \"#\" будуть шукати за ID предмета (наприклад, \"#000-001\")",
"tip_3": "Пошук в полях використовує операцію \"АБО\". Якщо більше одного задіяно, достатньо буде \nспівпасти лише одному для виводу результату.",
"tips": "Підказки",
"tips_sub": "Підказки щодо пошуку",
"updated_at": "Оновлено",
"warranty": "Гарантія",
"warranty_details": "Деталі гарантії",
"warranty_expires": "Гарантія закінчується"
"updated_at": "Оновлено"
},
"labels": {
"no_results": "Мітки не знайдено",
"update_label": "Оновити мітку"
"no_results": "Мітки не знайдено"
},
"languages": {
"ca": "Каталонська",
@@ -210,30 +115,20 @@
"fr": "Французька",
"hu": "Угорська",
"it": "Італійська",
"ja-JP": "Японська",
"nl": "Голландський",
"pl": "Польська мова",
"pt-BR": "Португальська (Бразилія)",
"pt-PT": "Португальська (Португалія)",
"ru": "Російська",
"sl": "Словенська",
"sv": "Swedish",
"tr": "турецька",
"uk-UA": "Українська",
"zh-CN": "Китайська (спрощена)",
"zh-HK": "Китайська (Гонконг)",
"zh-MO": "Китайська (Макао)",
"zh-TW": "Китайська (традиційне письмо)"
},
"languages.da-DK": "Данська",
"languages.fi.FI": "Фінська",
"languages.ro-RO": "Румунська",
"languages.sk-SK": "Словацька",
"locations": {
"child_locations": "Вкладені місця",
"collapse_tree": "Згорнути дерево",
"no_results": "Локації відсутні",
"update_location": "Оновити місце"
"no_results": "Локації відсутні"
},
"maintenance": {
"filter": {
@@ -268,12 +163,9 @@
"failed_to_update": "Не вдалося оновити запис"
},
"total_cost": "Загальна сума",
"total_entries": "Всього записів"
"total_entries": "Всього елементів"
},
"menu": {
"create_item": "Елемент / Актив",
"create_label": "Мітка",
"create_location": "Місце",
"home": "Головна",
"locations": "Локації",
"maintenance": "Обслуговування",
@@ -290,7 +182,6 @@
"delete_account_sub": "Видалити акаунт і всі пов'язані дані. Це невідворотна дія.",
"display_header": "{ currentValue, select, true {Приховати заголовок} false {Показати заголовок} other {Відсутнє}}",
"enabled": "Включено",
"example": "Приклад",
"gen_invite": "Створити посилання для запрошення",
"group_settings": "Налаштування групи",
"group_settings_sub": "Налаштування спільної групи. Можливо, вам доведеться оновити сторінку для збереження параметрів.",

View File

@@ -9,29 +9,6 @@
}
},
"global": {
"date_time": {
"ago": "{0} 之前",
"days": "天",
"hour": "小时",
"hours": "小时",
"just-now": "现在",
"last-month": "上个月",
"last-week": "上周",
"last-year": "去年",
"minute": "分钟",
"minutes": "分钟",
"months": "个月",
"next-month": "下个月",
"next-week": "下周",
"next-year": "明年",
"second": "秒",
"seconds": "秒",
"tomorrow": "明天",
"week": "周",
"weeks": "周",
"years": "年",
"yesterday": "昨天"
},
"page_qr_code": {
"page_url": "页面URL"
},
@@ -41,8 +18,6 @@
},
"item": {
"create_modal": {
"item_description": "物品描述",
"item_name": "物品名称",
"photo_button": "照片 📷",
"title": "创建物品"
},
@@ -52,45 +27,29 @@
"items": "物品",
"no_items": "没有可展示的物品",
"table": "表格模式"
},
"table": {
"page": "页",
"rows_per_page": "每页行数"
}
}
},
"label": {
"create_modal": {
"label_description": "标签说明",
"label_name": "标签名称",
"title": "创建标签"
}
},
"location": {
"create_modal": {
"location_description": "位置描述",
"location_name": "位置名称",
"title": "创建位置"
},
"selector": {
"parent_location": "父位置"
},
"tree": {
"no_locations": "没有可用的位置。请添加新的位置\n `<`span class=\"link-primary\"`>`创建`<`/span`>` 按钮在导航栏上"
}
}
},
"global": {
"add": "添加",
"build": "编译:{build}",
"confirm": "确认",
"create": "创建",
"create_and_add": "保存并继续创建",
"created": "已创建",
"delete": "刪除",
"details": "详情",
"duplicate": "复制",
"edit": "修改",
"email": "邮箱",
"follow_dev": "关注开发者",
"github": "Github项目",
@@ -98,29 +57,15 @@
"join_discord": "加入Discord讨论",
"labels": "标签",
"locations": "位置",
"maintenance": "维护",
"name": "名称",
"password": "密码",
"read_docs": "查阅文档",
"save": "保存",
"search": "搜索",
"sign_out": "登出",
"submit": "提交",
"update": "更新",
"value": "值",
"version": "版本:{version}",
"welcome": "欢迎,{username}"
},
"home": {
"labels": "标签",
"quick_statistics": "快速统计",
"recently_added": "最近加入",
"storage_locations": "存放位置",
"total_items": "项目总量",
"total_labels": "标签总量",
"total_locations": "位置数量",
"total_value": "价值总和"
},
"index": {
"disabled_registration": "已禁用注册",
"dont_join_group": "不想加入群组?",
@@ -135,67 +80,32 @@
},
"items": {
"add": "添加",
"advanced": "进阶",
"archived": "已归档",
"asset_id": "资产ID",
"attachment": "附件",
"attachments": "附件",
"changes_persisted_immediately": "对附件的更改将会立即保存",
"created_at": "创建于",
"custom_fields": "自定义字段",
"description": "说明",
"details": "详情",
"drag_and_drop": "将文件拖拽到此或点击添加文件",
"edit_details": "编辑详情",
"field_selector": "字段选择",
"field_value": "字段值",
"first": "第一页",
"include_archive": "包括已存档的项目",
"insured": "保险",
"last": "最后一页",
"lifetime_warranty": "包含终身保修",
"location": "位置",
"manufacturer": "制造商",
"model_number": "型号",
"name": "名称",
"negate_labels": "取消选中的标签",
"next_page": "下一页",
"no_results": "没有可显示的物品",
"notes": "笔记",
"options": "选项",
"order_by": "排序方式",
"pages": "第{page}页,共{totalPages}页",
"parent_item": "父项目",
"photo": "照片",
"photos": "照片",
"prev_page": "上一页",
"purchase_date": "购买日期",
"purchase_details": "购买详情",
"purchase_price": "购买价格",
"purchased_from": "购买地址",
"quantity": "数量",
"query_id": "查询资产ID {id}",
"reset_search": "重置搜索",
"results": "{ total } 条结果",
"serial_number": "序列号",
"show_advanced_view_options": "显示高级选项",
"sold_at": "出售日期",
"sold_details": "售出详情",
"sold_price": "出售价格",
"sold_to": "出售对象",
"tip_1": "位置和标签过滤器使用“或”操作。如果选择了多个位置或标签,\n则只需要任意一个匹配上即可。",
"tip_2": "以“#”为前缀的搜索将变成查询资产ID例如“#000-001” ",
"tip_3": "字段过滤器使用“或”操作。如果选择了多个位置或标签,\n则只需要任意一个匹配上即可。",
"tips": "建议",
"tips_sub": "搜索提示",
"updated_at": "更新于",
"warranty": "保修",
"warranty_details": "保修详情",
"warranty_expires": "保修持续到"
"updated_at": "更新于"
},
"labels": {
"no_results": "未找到标签",
"update_label": "更新标签"
"no_results": "未找到标签"
},
"languages": {
"ca": "加泰罗尼亚语",
@@ -205,30 +115,20 @@
"fr": "法国",
"hu": "匈牙利语",
"it": "意大利语",
"ja-JP": "日本語",
"nl": "荷兰语",
"pl": "波兰语",
"pt-BR": "葡萄牙语(巴西)",
"pt-PT": "葡萄牙语(葡萄牙)",
"ru": "俄语",
"sl": "斯洛文尼亚语",
"sv": "瑞典语",
"tr": "土耳其语",
"uk-UA": "乌克兰语",
"zh-CN": "中文(简体)",
"zh-HK": "中文(香港)",
"zh-MO": "中文(澳门)",
"zh-TW": "中文(繁体)"
},
"languages.da-DK": "丹麦语",
"languages.fi.FI": "芬兰语",
"languages.ro-RO": "罗马尼亚语",
"languages.sk-SK": "斯洛伐克语",
"locations": {
"child_locations": "位置",
"collapse_tree": "折叠树",
"no_results": "找不到位置",
"update_location": "更新位置"
"no_results": "找不到位置"
},
"maintenance": {
"filter": {
@@ -266,9 +166,6 @@
"total_entries": "总项目"
},
"menu": {
"create_item": "物品/资产",
"create_label": "标签",
"create_location": "位置",
"home": "主页",
"locations": "位置",
"maintenance": "维护",
@@ -285,7 +182,6 @@
"delete_account_sub": "删除您的帐户及其所有相关数据。这是无法撤消的。",
"display_header": "{currentValue, select, true {隐藏页眉} false {显示页眉} other {未选中}}",
"enabled": "已启用",
"example": "例子",
"gen_invite": "生成邀请链接",
"group_settings": "组设置",
"group_settings_sub": "共享组设置。您可能需要刷新浏览器来让某些设置生效。",

View File

@@ -3,19 +3,17 @@ import { defineNuxtConfig } from "nuxt/config";
// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
ssr: false,
build: {
transpile: ["vue-i18n"],
},
modules: [
"@nuxtjs/tailwindcss",
"@pinia/nuxt",
"@vueuse/nuxt",
"@vite-pwa/nuxt",
"./nuxt.proxyoverride.ts",
"unplugin-icons/nuxt",
],
nitro: {
devProxy: {
"/api": {
@@ -25,9 +23,7 @@ export default defineNuxtConfig({
},
},
},
css: ["@/assets/css/main.css"],
pwa: {
workbox: {
navigateFallbackDenylist: [/^\/api/],
@@ -66,12 +62,4 @@ export default defineNuxtConfig({
],
},
},
postcss: {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
},
compatibilityDate: "2024-11-29",
});

View File

@@ -0,0 +1,52 @@
// https://gist.github.com/ucw/67f7291c64777fb24341e8eae72bcd24
import type { IncomingMessage } from "http";
import type internal from "stream";
import { defineNuxtModule, logger } from "@nuxt/kit";
// Related To
// - https://github.com/nuxt/nuxt/issues/15417
// - https://github.com/nuxt/cli/issues/107
//
// fix from
// - https://gist.github.com/ucw/67f7291c64777fb24341e8eae72bcd24
// eslint-disable-next-line
import { createProxyServer } from "http-proxy";
export default defineNuxtModule({
defaults: {
target: "ws://localhost:7745",
path: "/api/v1/ws",
},
meta: {
configKey: "websocketProxy",
name: "Websocket proxy",
},
setup(resolvedOptions, nuxt) {
if (!nuxt.options.dev || !resolvedOptions.target) {
return;
}
nuxt.hook("listen", server => {
const proxy = createProxyServer({
ws: true,
secure: false,
changeOrigin: true,
target: resolvedOptions.target,
});
const proxyFn = (req: IncomingMessage, socket: internal.Duplex, head: Buffer) => {
if (req.url && req.url.startsWith(resolvedOptions.path)) {
proxy.ws(req, socket, head);
}
};
server.on("upgrade", proxyFn);
nuxt.hook("close", () => {
server.off("upgrade", proxyFn);
proxy.close();
});
logger.info(`Websocket dev proxy started on ${resolvedOptions.path}`);
});
},
});

View File

@@ -8,41 +8,41 @@
"lint": "eslint --ext \".ts,.js,.vue\" --ignore-path ../.gitignore .",
"lint:fix": "eslint --ext \".ts,.js,.vue\" --ignore-path ../.gitignore . --fix",
"lint:ci": "eslint --ext \".ts,.js,.vue\" --ignore-path ../.gitignore . --max-warnings 1",
"typecheck": "pnpm vue-tsc --noEmit",
"typecheck": "pnpm dlx vue-tsc@2.1.6 --noEmit",
"test:ci": "TEST_SHUTDOWN_API_SERVER=true vitest --run --config ./test/vitest.config.ts",
"test:local": "TEST_SHUTDOWN_API_SERVER=false && vitest --run --config ./test/vitest.config.ts",
"test:watch": " TEST_SHUTDOWN_API_SERVER=false vitest --config ./test/vitest.config.ts"
},
"devDependencies": {
"@faker-js/faker": "^8.4.1",
"@iconify-json/mdi": "^1.2.1",
"@iconify-json/mdi": "^1.2.0",
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@nuxtjs/eslint-config-typescript": "^12.1.0",
"@types/dompurify": "^3.0.5",
"@types/markdown-it": "^13.0.9",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
"@vite-pwa/nuxt": "^0.5.0",
"@vue/runtime-core": "^3.5.13",
"@vue/runtime-core": "^3.5.12",
"eslint": "^8.57.1",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-tailwindcss": "^3.17.5",
"eslint-plugin-vue": "^9.31.0",
"eslint-plugin-tailwindcss": "^3.17.4",
"eslint-plugin-vue": "^9.28.0",
"h3": "^1.7.1",
"intl-messageformat": "^10.7.7",
"intl-messageformat": "^10.5.14",
"isomorphic-fetch": "^3.0.0",
"nuxt": "3.12.4",
"prettier": "^3.4.1",
"typescript": "5.6.2",
"nuxt": "3.7.4",
"prettier": "^3.3.3",
"typescript": "^5.6.2",
"unplugin-icons": "^0.18.5",
"vite-plugin-eslint": "^1.8.1",
"vitest": "^1.6.0",
"vue-i18n": "^9.14.2",
"vue-tsc": "2.1.6"
"vue-i18n": "^9.14.1"
},
"dependencies": {
"@headlessui/vue": "^1.7.23",
"@nuxtjs/tailwindcss": "^6.12.2",
"@nuxtjs/tailwindcss": "^6.12.1",
"@pinia/nuxt": "^0.5.5",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.9",
@@ -54,15 +54,15 @@
"autoprefixer": "^10.4.20",
"daisyui": "^2.52.0",
"date-fns": "^3.6.0",
"dompurify": "^3.2.2",
"dompurify": "^3.1.7",
"h3": "^1.13.0",
"http-proxy": "^1.18.1",
"lunr": "^2.3.9",
"markdown-it": "^14.1.0",
"pinia": "^2.2.8",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"pinia": "^2.2.4",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.13",
"vue": "3.4.8",
"vue-router": "^4.5.0"
"vue-router": "^4.4.5"
}
}

View File

@@ -8,9 +8,8 @@
</script>
<template>
<h1 class="flex flex-col text-center font-extrabold">
<h1 class="flex flex-col text-center font-extrabold text-blue-500">
<span class="text-7xl">404.</span>
<span class="mt-5 text-5xl"> Page Not Found </span>
<NuxtLink to="/" class="btn mt-5 text-xl"> Return Home </NuxtLink>
</h1>
</template>

View File

@@ -99,12 +99,16 @@
let purchasePrice = 0;
let soldPrice = 0;
let purchaseTime = null;
if (item.value.purchasePrice) {
purchasePrice = item.value.purchasePrice;
}
if (item.value.soldPrice) {
soldPrice = item.value.soldPrice;
}
if (item.value.purchaseTime && typeof item.value.purchaseTime !== "string") {
purchaseTime = new Date(item.value.purchaseTime.getTime() - item.value.purchaseTime.getTimezoneOffset() * 60000);
}
console.log((item.value.purchasePrice ??= 0));
console.log((item.value.soldPrice ??= 0));
@@ -117,7 +121,7 @@
assetId: item.value.assetId,
purchasePrice,
soldPrice,
purchaseTime: item.value.purchaseTime as Date,
purchaseTime: purchaseTime as Date,
};
const { error } = await api.items.update(itemId.value, payload);

View File

@@ -474,7 +474,7 @@
<p>{{ $t("items.no_results") }}</p>
</div>
<div v-else ref="cardgrid" class="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3">
<ItemCard v-for="item in items" :key="item.id" :item="item" :location-flat-tree="locationFlatTree" />
<ItemCard v-for="item in items" :key="item.id" :item="item" />
</div>
<div v-if="items.length > 0 && (hasNext || hasPrev)" class="mt-10 flex flex-col items-center gap-2">
<div class="flex">

View File

@@ -8,7 +8,6 @@
import MdiFill from "~icons/mdi/fill";
import MdiPencil from "~icons/mdi/pencil";
import MdiAccountMultiple from "~icons/mdi/account-multiple";
import { getLocaleCode } from "~/composables/use-formatters";
definePageMeta({
middleware: ["auth"],
@@ -53,11 +52,12 @@
});
const currencyExample = computed(() => {
return fmtCurrency(1000, currency.value?.code ?? "USD", getLocaleCode());
});
const formatter = new Intl.NumberFormat("en-US", {
style: "currency",
currency: currency.value ? currency.value.code : "USD",
});
const dateExample = computed(() => {
return fmtDate(new Date(Date.now() - 15 * 60000), "relative");
return formatter.format(1000);
});
const { data: group } = useAsyncData(async () => {
@@ -389,7 +389,6 @@
{{ $t(`languages.${lang}`) }} ({{ $t(`languages.${lang}`, 1, { locale: lang }) }})
</option>
</select>
<p class="m-2 text-sm">{{ $t("profile.example") }}: {{ $t("global.created") }} {{ dateExample }}</p>
</div>
</BaseCard>

View File

@@ -183,20 +183,21 @@
return route(`/qrcode`, { data: encodeURIComponent(data) });
}
function getItem(n: number, item: { assetId: string; name: string; location: { name: string } } | null): LabelData {
function getItem(n: number, item: { name: string; location: { name: string } } | null): LabelData {
// format n into - seperated string with leading zeros
const assetID = fmtAssetID(n + 1);
const assetID = fmtAssetID(n);
return {
url: getQRCodeUrl(assetID),
assetID: item?.assetId ?? assetID,
assetID,
name: item?.name ?? "_______________",
location: item?.location?.name ?? "_______________",
};
}
const { data: allFields } = await useAsyncData(async () => {
const { data, error } = await api.items.getAll({ orderBy: "assetId" });
const { data, error } = await api.items.getAll();
if (error) {
return {
@@ -219,10 +220,10 @@
}
const items: LabelData[] = [];
for (let i = displayProperties.assetRange - 1; i < displayProperties.assetRangeMax - 1; i++) {
for (let i = displayProperties.assetRange; i < displayProperties.assetRangeMax; i++) {
const item = allFields?.value?.items?.[i];
if (item?.location) {
items.push(getItem(i, item as { assetId: string; location: { name: string }; name: string }));
items.push(getItem(i, item as { location: { name: string }; name: string }));
} else {
items.push(getItem(i, null));
}

View File

@@ -40,7 +40,7 @@
<DetailAction @action="modals.import = true">
<template #title> {{ $t("tools.import_export_set.import") }} </template>
<!-- eslint-disable-next-line vue/no-v-html -->
<div v-html="DOMPurify.sanitize($t('tools.import_export_set.import_sub'))"></div>
<div v-html="$t('tools.import_export_set.import_sub')"></div>
<template #button> {{ $t("tools.import_export_set.import_button") }} </template>
</DetailAction>
<DetailAction @action="getExportCSV()">
@@ -57,7 +57,7 @@
<span> {{ $t("tools.actions") }} </span>
<template #description>
<!-- eslint-disable-next-line vue/no-v-html -->
<div v-html="DOMPurify.sanitize($t('tools.actions_sub'))"></div>
<div v-html="$t('tools.actions_sub')"></div>
</template>
</BaseSectionHeader>
</template>
@@ -75,13 +75,13 @@
<DetailAction @action="resetItemDateTimes">
<template #title> {{ $t("tools.actions_set.zero_datetimes") }} </template>
<!-- eslint-disable-next-line vue/no-v-html -->
<div v-html="DOMPurify.sanitize($t('tools.actions_set.zero_datetimes_sub'))"></div>
<div v-html="$t('tools.actions_set.zero_datetimes_sub')"></div>
<template #button> {{ $t("tools.actions_set.zero_datetimes_button") }} </template>
</DetailAction>
<DetailAction @action="setPrimaryPhotos">
<template #title> {{ $t("tools.actions_set.set_primary_photo") }} </template>
<!-- eslint-disable-next-line vue/no-v-html -->
<div v-html="DOMPurify.sanitize($t('tools.actions_set.set_primary_photo_sub'))"></div>
<div v-html="$t('tools.actions_set.set_primary_photo_sub')"></div>
<template #button> {{ $t("tools.actions_set.set_primary_photo_button") }} </template>
</DetailAction>
</div>
@@ -91,7 +91,6 @@
</template>
<script setup lang="ts">
import DOMPurify from "dompurify";
import MdiFileChart from "~icons/mdi/file-chart";
import MdiArrowRight from "~icons/mdi/arrow-right";
import MdiDatabase from "~icons/mdi/database";

View File

@@ -2,10 +2,10 @@ import type { CompileError, MessageContext } from "vue-i18n";
import { createI18n } from "vue-i18n";
import { IntlMessageFormat } from "intl-messageformat";
export default defineNuxtPlugin(({ vueApp }) => {
function checkDefaultLanguage() {
export default defineNuxtPlugin(async ({ vueApp }) => {
async function checkDefaultLanguage() {
let matched = null;
const languages = Object.getOwnPropertyNames(messages());
const languages = Object.getOwnPropertyNames(await messages());
const matching = navigator.languages.filter(lang => languages.some(l => l.toLowerCase() === lang.toLowerCase()));
if (matching.length > 0) {
matched = matching[0];
@@ -25,26 +25,24 @@ export default defineNuxtPlugin(({ vueApp }) => {
fallbackLocale: "en",
globalInjection: true,
legacy: false,
locale: preferences.value.language || checkDefaultLanguage() || "en",
locale: preferences.value.language || await checkDefaultLanguage() || "en",
messageCompiler,
messages: messages(),
messages: await messages(),
});
vueApp.use(i18n);
return {
provide: {
i18nGlobal: i18n.global,
},
};
});
export const messages = () => {
export const messages = async () => {
const messages: Record<string, any> = {};
const modules = import.meta.glob("~//locales/**.json", { eager: true });
for (const path in modules) {
const key = path.slice(9, -5);
messages[key] = modules[path];
}
// const modules = import.meta.glob("~//locales/**.json", { eager: true });
// for (const path in modules) {
// const key = path.slice(9, -5);
// messages[key] = modules[path];
// }
console.log('Fetching translations...');
const en = await (await fetch('https://raw.githubusercontent.com/sysadminsmedia/homebox/refs/heads/main/frontend/locales/en.json')).json();
console.log('Fetched translations.');
messages['en'] = en;
return messages;
};

6203
frontend/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};