Compare commits

...

13 Commits

Author SHA1 Message Date
Tonya
25c76522d6 Merge pull request #185
* feat: changeable items per table page

* Merge branch 'main' into main
2024-09-05 19:57:12 -04:00
Tonya
c0e2aa5c62 Merge pull request #197
* feat: add search to multi select and improve behaviour when multiple …
2024-09-05 19:52:26 -04:00
Weblate
d0b9f742ae Translated using Weblate (Polish)
Currently translated at 88.8% (80 of 90 strings)

Translated using Weblate (Polish)

Currently translated at 88.8% (80 of 90 strings)

Co-authored-by: Bart <bartosz.domanski97@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/pl/
Translation: Homebox/Frontend
2024-09-05 20:53:24 +00:00
Weblate
80d56829c5 Translated using Weblate (German)
Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Polish)

Currently translated at 81.1% (73 of 90 strings)

Translated using Weblate (Polish)

Currently translated at 81.1% (73 of 90 strings)

Translated using Weblate (Catalan)

Currently translated at 48.8% (44 of 90 strings)

Co-authored-by: Bart <bartosz.domanski97@gmail.com>
Co-authored-by: Mats <sysadminsmedia@mats-bueser.de>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Co-authored-by: Xavier Clotet <x.clotetfons@gmail.com>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/ca/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/de/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/pl/
Translation: Homebox/Frontend
2024-09-05 20:52:03 +00:00
Weblate
0946310f60 Added translation using Weblate (Polish)
Co-authored-by: Bart <bartosz.domanski97@gmail.com>
2024-09-05 20:32:16 +00:00
Matt Kilgore
7c855cf55d fix: regional languages not matching correctly 2024-09-05 15:48:00 -04:00
Tonya
0ab95fb670 feat: compare filter values on a unique field instead of by reference for finding unselected (#195) 2024-09-05 15:41:29 -04:00
Tonya
1e81b4bab4 feat: improve loading state for creation and fix types for adding image (#196) 2024-09-05 15:40:57 -04:00
Tonya
67c50068d9 fix: styles on home page (#193) 2024-09-05 14:29:33 -04:00
Weblate
c3628e36f7 Translated using Weblate (French)
Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (French)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (French)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Catalan)

Currently translated at 43.3% (39 of 90 strings)

Translated using Weblate (Catalan)

Currently translated at 43.3% (39 of 90 strings)

Translated using Weblate (Slovenian)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (Slovenian)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (German)

Currently translated at 100.0% (90 of 90 strings)

Translated using Weblate (German)

Currently translated at 100.0% (90 of 90 strings)

Co-authored-by: 101br03k <warmerdamm03@gmail.com>
Co-authored-by: Dest.Com <azevedo-a@hotmail.fr>
Co-authored-by: Jackxwb <xwb9606@163.com>
Co-authored-by: Maxklos <herzognikolaus@gmail.com>
Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Co-authored-by: Stair <nrjava06@gmail.com>
Co-authored-by: Xavier Clotet <x.clotetfons@gmail.com>
Co-authored-by: thehijacker <thehijacker@gmail.com>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/ca/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/de/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/fr/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/nl/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sl/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/zh_Hans/
Translation: Homebox/Frontend
2024-09-05 14:20:41 +00:00
Weblate
526799c6da Added translation using Weblate (Catalan)
Co-authored-by: Xavier Clotet <x.clotetfons@gmail.com>
2024-09-05 12:35:43 +00:00
Weblate
4ef7529533 Translated using Weblate (Slovenian)
Currently translated at 37.7% (34 of 90 strings)

Translated using Weblate (Slovenian)

Currently translated at 37.7% (34 of 90 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (90 of 90 strings)

Co-authored-by: MyMemory <noreply-mt-mymemory@weblate.org>
Co-authored-by: Slydite4 <39199098+Slydite4@users.noreply.github.com>
Co-authored-by: thehijacker <thehijacker@gmail.com>
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/es/
Translate-URL: https://translate.sysadminsmedia.com/projects/homebox/frontend/sl/
Translation: Homebox/Frontend
2024-09-05 04:36:37 +00:00
Weblate
b06d670dff Added translation using Weblate (Slovenian)
Co-authored-by: thehijacker <thehijacker@gmail.com>
2024-09-05 04:29:38 +00:00
17 changed files with 483 additions and 104 deletions

View File

@@ -9,25 +9,30 @@
{{ name != "" ? itm[name] : itm }}
</span>
</div>
<ul
<div
tabindex="0"
style="display: inline"
class="dropdown-content mb-1 menu shadow border border-gray-400 rounded bg-base-100 w-full z-[9999] max-h-60 overflow-y-scroll"
class="dropdown-content mb-1 menu w-full z-[9999] shadow border border-gray-400 rounded bg-base-100"
>
<div class="m-2">
<input v-model="search" placeholder="Search…" class="input input-sm input-bordered w-full" />
</div>
<ul class="overflow-y-scroll max-h-60">
<li
v-for="(obj, idx) in items"
v-for="(obj, idx) in filteredItems"
:key="idx"
:class="{
bordered: selected[idx],
bordered: selected.includes(obj[props.uniqueField]),
}"
>
<button type="button" @click="toggle(idx)">
<button type="button" @click="toggle(obj[props.uniqueField])">
{{ name != "" ? obj[name] : obj }}
</button>
</li>
</ul>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
@@ -49,6 +54,10 @@
type: String,
default: "name",
},
uniqueField: {
type: String,
default: "id",
},
selectFirst: {
type: Boolean,
default: false,
@@ -57,19 +66,26 @@
const value = useVModel(props, "modelValue", emit);
const selected = computed<Record<number, boolean>>(() => {
const obj: Record<number, boolean> = {};
value.value.forEach(itm => {
const idx = props.items.findIndex(item => item[props.name] === itm.name);
obj[idx] = true;
const search = ref("");
const filteredItems = computed(() => {
if (!search.value) {
return props.items;
}
return props.items.filter(item => {
return item[props.name].toLowerCase().includes(search.value.toLowerCase());
});
return obj;
});
function toggle(index: number) {
const item = props.items[index];
if (selected.value[index]) {
value.value = value.value.filter(itm => itm.name !== item.name);
const selected = computed<string[]>(() => {
return value.value.map(itm => itm[props.uniqueField]);
});
function toggle(uniqueField: string) {
const item = props.items.find(itm => itm[props.uniqueField] === uniqueField);
if (selected.value.includes(item[props.uniqueField])) {
value.value = value.value.filter(itm => itm[props.uniqueField] !== item[props.uniqueField]);
} else {
value.value = [...value.value, item];
}

View File

@@ -7,12 +7,11 @@
<FormTextArea v-model="form.description" label="Item Description" />
<FormMultiselect v-model="form.labels" label="Labels" :items="labels ?? []" />
<div class="modal-action">
<div class="flex justify-center">
<div>
<label for="photo" class="btn">{{ $t("components.item.create_modal.photo_button") }}</label>
<input type="file" accept="image/*" @change="previewImage" style="visibility:hidden;" id="photo">
<input id="photo" type="file" accept="image/*" style="visibility: hidden" @change="previewImage" />
</div>
<BaseButton class="rounded-r-none" :loading="loading" type="submit">
<template #icon>
@@ -34,16 +33,17 @@
</div>
</div>
<!-- photo preview area is AFTER the create button, to avoid pushing the button below the screen on small displays -->
<div class="border-t border-gray-300 p-4">
<template v-if="form.preview">
<p class="mb-0">file name: {{ form.photo.name }}</p>
<img :src="form.preview" class="h-[100px] w-full object-cover rounded-t shadow-sm border-gray-300" />
<p class="mb-0">File name: {{ form.photo?.name }}</p>
<img
:src="form.preview"
class="h-[100px] w-full object-cover rounded-t shadow-sm border-gray-300"
alt="Uploaded Photo"
/>
</template>
</div>
</form>
<p class="text-sm text-center mt-4">
use <kbd class="kbd kbd-xs">Shift</kbd> + <kbd class="kbd kbd-xs"> Enter </kbd> to create and add another
@@ -103,40 +103,25 @@
description: "",
color: "", // Future!
labels: [] as LabelOut[],
preview: null,
photo: null
preview: null as string | null,
photo: null as File | null,
});
const { shift } = useMagicKeys();
function previewImage(event) {
var input = event.target;
if (input.files) {
var reader = new FileReader();
reader.onload = (e) => {
form.preview = e.target.result;
}
form.photo=input.files[0];
reader.readAsDataURL(input.files[0]);
function previewImage(event: Event) {
const input = event.target as HTMLInputElement;
if (input.files && input.files.length > 0) {
const reader = new FileReader();
reader.onload = e => {
form.preview = e.target?.result as string;
};
const file = input.files[0];
form.photo = file;
reader.readAsDataURL(file);
}
}
function uploadImage(e: Event) {
const files = (e.target as HTMLInputElement).files;
if (!files || !files.item(0)) {
return;
}
const first = files.item(0);
if (!first) {
return;
}
uploadAttachment([first], null);
}
whenever(
() => modal.value,
() => {
@@ -160,6 +145,13 @@
return;
}
if (loading.value) {
toast.error("Already creating an item");
return;
}
loading.value = true;
if (shift.value) {
close = false;
}
@@ -175,6 +167,7 @@
const { error, data } = await api.items.create(out);
loading.value = false;
if (error) {
loading.value = false;
toast.error("Couldn't create item");
return;
}
@@ -182,10 +175,11 @@
toast.success("Item created");
// if the photo was provided, upload it
if(form.photo){
const { data2, error } = await api.items.attachments.add(data.id, form.photo, form.photo.name, AttachmentTypes.Photo);
if (form.photo) {
const { error } = await api.items.attachments.add(data.id, form.photo, form.photo.name, AttachmentTypes.Photo);
if (error) {
loading.value = false;
toast.error("Failed to upload Photo");
return;
}
@@ -193,7 +187,6 @@
toast.success("Photo uploaded");
}
// Reset
form.name = "";
form.description = "";

View File

@@ -1,5 +1,5 @@
<template>
<BaseCard>
<BaseCard class="overflow-clip">
<table class="table w-full">
<thead>
<tr>
@@ -63,7 +63,14 @@
</tr>
</tbody>
</table>
<div v-if="hasPrev || hasNext" class="border-t p-3 justify-end flex">
<div v-if="items.length > 10" class="border-t p-3 justify-end flex gap-3">
<div class="flex items-center">Rows per page</div>
<select v-model.number="pagination.rowsPerPage" class="select select-sm select-primary">
<option :value="10">10</option>
<option :value="25">25</option>
<option :value="50">50</option>
<option :value="100">100</option>
</select>
<div class="btn-group">
<button :disabled="!hasPrev" class="btn btn-sm" @click="prev()">«</button>
<button class="btn btn-sm">Page {{ pagination.page }}</button>
@@ -97,13 +104,22 @@
] as TableHeader[];
});
const preferences = useViewPreferences();
const pagination = reactive({
descending: false,
page: 1,
rowsPerPage: 10,
rowsPerPage: preferences.value.itemsPerTablePage,
rowsNumber: 0,
});
watch(
() => pagination.rowsPerPage,
newRowsPerPage => {
preferences.value.itemsPerTablePage = newRowsPerPage;
}
);
const next = () => pagination.page++;
const hasNext = computed<boolean>(() => {
return pagination.page * pagination.rowsPerPage < props.items.length;
@@ -189,4 +205,20 @@
}
</script>
<style scoped></style>
<style scoped>
:where(.table *:first-child) :where(*:first-child) :where(th, td):first-child {
border-top-left-radius: 0px;
}
:where(.table *:first-child) :where(*:first-child) :where(th, td):last-child {
border-top-right-radius: 0px;
}
:where(.table *:last-child) :where(*:last-child) :where(th, td):first-child {
border-bottom-left-radius: 0px;
}
:where(.table *:last-child) :where(*:last-child) :where(th, td):last-child {
border-bottom-right-radius: 0px;
}
</style>

View File

@@ -71,6 +71,12 @@
const { shift } = useMagicKeys();
async function create(close = true) {
if (loading.value) {
toast.error("Already creating a label");
return;
}
loading.value = true;
if (shift.value) {
close = false;
}

View File

@@ -73,6 +73,10 @@
const { shift } = useMagicKeys();
async function create(close = true) {
if (loading.value) {
toast.error("Already creating a location");
return;
}
loading.value = true;
if (shift.value) {

View File

@@ -45,6 +45,7 @@
options: any[];
display?: string;
modelValue: any[];
uniqueField: string;
};
const btn = ref<HTMLButtonElement>();
@@ -75,6 +76,7 @@
label: "",
display: "name",
modelValue: () => [],
uniqueField: "id",
});
const len = computed(() => {
@@ -95,9 +97,9 @@
const unselected = computed(() => {
return props.options.filter(o => {
if (searchFold.value.length > 0) {
return o[props.display].toLowerCase().includes(searchFold.value) && !selected.value.includes(o);
return o[props.display].toLowerCase().includes(searchFold.value) && selected.value.every(s => s[props.uniqueField] !== o[props.uniqueField]);
}
return !selected.value.includes(o);
return selected.value.every(s => s[props.uniqueField] !== o[props.uniqueField]);
});
});
</script>

View File

@@ -1,7 +1,7 @@
<template>
<div class="stats bg-neutral shadow rounded-md">
<div class="stat text-neutral-content text-center space-y-1 p-3">
<div class="stat-title">{{ title }}</div>
<div class="stat-title text-neutral-content">{{ title }}</div>
<div class="stat-value text-2xl">
<Currency v-if="type === 'currency'" :amount="value" />
<template v-if="type === 'number'">{{ value }}</template>
@@ -27,8 +27,4 @@
});
</script>
<style>
[data-theme="homebox"] .stat-title {
color: hsl(0 0% 90/0.6);
}
</style>
<style></style>

View File

@@ -9,6 +9,7 @@ export type LocationViewPreferences = {
editorAdvancedView: boolean;
itemDisplayView: ViewType;
theme: DaisyTheme;
itemsPerTablePage: number;
};
/**
@@ -24,6 +25,7 @@ export function useViewPreferences(): Ref<LocationViewPreferences> {
editorAdvancedView: false,
itemDisplayView: "card",
theme: "homebox",
itemsPerTablePage: 10,
},
{ mergeDefaults: true }
);

80
frontend/locales/ca.json Normal file
View File

@@ -0,0 +1,80 @@
{
"components": {
"app": {
"import_dialog": {
"title": "Importa un fitxer CSV",
"upload": "Puja",
"description": "Importa un fitxer CSV que contingui els articles, etiquetes i ubicacions. \nConsulteu la documentació per a més informació sobre el format requerit.",
"change_warning": "El comportament de les importacions amb import_refs existents ha canviat. Si hi ha un import_refs al fitxer CSV, \nl'article s'actualitzarà amb els valors del fitxer CSV."
}
},
"item": {
"create_modal": {
"title": "Crea un article",
"photo_button": "Foto 📷"
},
"view": {
"selectable": {
"card": "Targeta",
"items": "Articles",
"no_items": "No hi ha articles a mostrar",
"table": "Taula"
}
}
},
"label": {
"create_modal": {
"title": "Crea una etiqueta"
}
},
"location": {
"create_modal": {
"title": "Crea una ubicació"
}
},
"global": {
"page_qr_code": {
"page_url": "URL de la pàgina"
},
"password_score": {
"password_strength": "Força de la contrasenya"
}
}
},
"global": {
"build": "Construcció: { build }",
"confirm": "Confirma",
"create": "Crea",
"create_and_add": "Crea i afegeix-ne un altre",
"created": "Creat",
"email": "Correu electrònic",
"follow_dev": "Segueix al desenvolupador",
"github": "Projecte de GitHub",
"items": "Articles",
"join_discord": "Uniu-vos a Discord",
"locations": "Ubicacions",
"name": "Nom",
"read_docs": "Llegiu la documentació",
"search": "Cerca",
"sign_out": "Tanca la sessió",
"submit": "Envia",
"welcome": "Us donem la benvinguda, { username }",
"labels": "Etiquetes",
"password": "Contrasenya",
"version": "Versió {version}"
},
"index": {
"joining_group": "Us uniu a un grup existent!",
"dont_join_group": "Voleu unir-vos al grup?",
"login": "Inici de sessió",
"disabled_registration": "El registre és desactivat",
"register": "Registra-m'hi",
"remember_me": "Recorda'm",
"set_email": "Quin és el seu correu electrònic?",
"set_name": "Com us dieu?",
"set_password": "Definiu la contrasenya"
},
"items": {
"negate_labels": "Nega les etiquetes seleccionades"
}
}

View File

@@ -2,9 +2,9 @@
"components": {
"app": {
"import_dialog": {
"change_warning": "Das Verhalten beim Importieren vorhandener import_refs hat sich geändert. Wenn ein import_ref in der CSV-Datei vorhanden ist, wird der Gegenstand mit den Werten in der CSV-Datei aktualisiert.",
"description": "Importiere eine CSV-Datei, die deine Gegenstände, Etiketten und Standorte enthält. Siehe Dokumentation für weitere Informationen zum \nerforderlichen Format.",
"title": "Importiere CSV-Datei",
"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"
}
},
@@ -18,7 +18,8 @@
},
"item": {
"create_modal": {
"title": "Erstelle Gegenstand"
"title": "Gegenstand erstellen",
"photo_button": "Foto 📷"
},
"view": {
"selectable": {
@@ -31,12 +32,12 @@
},
"label": {
"create_modal": {
"title": "Erstelle Etikette"
"title": "Etikett erstellen"
}
},
"location": {
"create_modal": {
"title": "Erstelle Standort"
"title": "Standort erstellen"
}
}
},
@@ -52,11 +53,11 @@
"items": "Gegenstände",
"join_discord": "Discord beitreten",
"labels": "Etiketten",
"locations": "Standorte",
"locations": "Lagerorte",
"name": "Name",
"password": "Passwort",
"read_docs": "Dokumentation lesen",
"search": "Suchen",
"search": "Suche",
"sign_out": "Abmelden",
"submit": "Einreichen",
"version": "Version: { version }",
@@ -81,7 +82,7 @@
"field_selector": "Feldauswahl",
"field_value": "Feldwert",
"first": "Erste",
"include_archive": "Archivierte Elemente einbeziehen",
"include_archive": "Archivierte Elemente einschließen",
"last": "Letzte",
"negate_labels": "Ausgewählte Etiketten negieren",
"next_page": "Nächste Seite",
@@ -106,22 +107,22 @@
"currency_format": "Währungsformat",
"current_password": "Aktuelles Passwort",
"delete_account": "Konto löschen",
"delete_account_sub": "Löschen Sie Ihr Konto und alle zugehörigen Daten. Dies kann nicht rückgängig gemacht werden.",
"delete_account_sub": "Lösche dein Konto und alle zugehörigen Daten. Dies kann nicht rückgängig gemacht werden.",
"enabled": "Aktiviert",
"gen_invite": "Einladungslink generieren",
"group_settings": "Gruppeneinstellungen",
"group_settings_sub": "Geteilte Gruppeneinstellungen. Möglicherweise müssen Sie Ihren Browser aktualisieren, damit einige Einstellungen wirksam werden.",
"group_settings_sub": "Geteilte Gruppeneinstellungen. Möglicherweise musst du die Seite neu laden, damit einige Einstellungen wirksam werden.",
"inactive": "Inaktiv",
"new_password": "Neues Passwort",
"notifier_modal": "{ type, select, true {Bearbeiten} false {Erstellen} other {Andere}} Melder",
"notifier_modal": "{ type, select, true {Bearbeiten} false {Erstellen} other {Andere}} Notifier",
"notifiers": "Melder",
"notifiers_sub": "Erhalten Sie Benachrichtigungen für bevorstehende Wartungserinnerungen",
"notifiers_sub": "Erhalte Benachrichtigungen über bevorstehende Wartungserinnerungen",
"test": "Test",
"theme_settings": "Themeneinstellungen",
"theme_settings_sub": "Themeneinstellungen werden im lokalen Speicher Ihres Browsers gespeichert. Sie können das Thema jederzeit ändern. Wenn Sie Probleme haben, Ihr Thema einzustellen, versuchen Sie, Ihren Browser zu aktualisieren.",
"theme_settings": "Themes",
"theme_settings_sub": "Theme-Einstellungen werden im lokalen Speicher deines Browsers gespeichert. Du kannst das Theme jederzeit ändern. Wenn du Probleme hast, dein Theme einzustellen, versuche, die Seite neu zu laden.",
"update_group": "Gruppe aktualisieren",
"url": "URL",
"user_profile": "Benutzerprofil",
"user_profile_sub": "Benutzer einladen und Ihr Konto verwalten."
"user_profile_sub": "Lade Benutzer ein und verwalte dein Konto."
}
}

View File

@@ -18,7 +18,8 @@
},
"item": {
"create_modal": {
"title": "Crear Elemento"
"title": "Crear Elemento",
"photo_button": "Foto 📷"
},
"view": {
"selectable": {

View File

@@ -97,11 +97,11 @@
"update_group": "Mettre à jour le groupe",
"theme_settings": "Paramètres du thème",
"theme_settings_sub": "Les paramètres du thème sont stockés dans le navigateur. Vous pouvez les changer à tout moment. Si vous\nrencontrez des problèmes, il est conseillé de rafraichir la page.",
"notifier_modal": ""
"notifier_modal": "Notifications { type, select, true {Edit} false {Create} other {Other}}"
},
"items": {
"add": "Ajouter",
"created_at": "",
"created_at": "Créé à",
"custom_fields": "Champs personnalisés",
"field_selector": "Sélecteur de champ",
"field_value": "Valeur du champ",
@@ -115,14 +115,14 @@
"order_by": "Trier par",
"pages": "Page { page } sur { totalPages }",
"prev_page": "Page précédente",
"query_id": "",
"query_id": "Interrogation du numéro d'identification de l'actif : { id }",
"reset_search": "Réinitialiser la recherche",
"tip_1": "Les filtres demplacement et détiquette utilisent lopérateur « OU ».\nUn seul des filtres na besoin de correspondre pour retourner un résultat.",
"tip_2": "",
"tip_2": "Les recherches préfixées par '#'' rechercheront un ID d'actif (exemple '#000-001')",
"tip_3": "Les filtres de champ utilisent lopérateur « OU ».\nUn seul des filtres na besoin de correspondre pour retourner un résultat.",
"tips": "Conseils",
"tips_sub": "Conseils pour la recherche",
"updated_at": "",
"updated_at": "Mis à jour le",
"results": "{ total } résultats"
}
}

View File

@@ -95,14 +95,14 @@
"currency_format": "Valutanotatie",
"update_group": "Groep bijwerken",
"theme_settings": "Theme instellingen",
"theme_settings_sub": "",
"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.",
"delete_account": "Verwijder account",
"delete_account_sub": "Verwijder je account en alle geassocieerde data. Deze actie kan niet ongedaan worden."
},
"items": {
"tip_1": "Locatie- en labelfilters gebruiken de 'OF' -werking. Als er meer dan een is geselecteerd,\nis er maar een nodig voor een overeenkomst.",
"tip_2": "Zoekopdrachten voorafgegaan door '#'' zullen om een object-ID vragen (bijvoorbeeld '#000-001')",
"tip_3": "",
"tip_3": "Veldfilters gebruiken de 'OF' -bewerking. Indien meer dan 1 is geselecteerd\nzal er maar 1 nodig zijn voor een match.",
"tips_sub": "Zoektips",
"updated_at": "Bijgewerkt op",
"pages": "Pagina { page } van { totalPages }",
@@ -121,7 +121,7 @@
"field_value": "Veldwaarde",
"first": "Eerst",
"include_archive": "Inclusief gearchiveerde items",
"last": "Laatste",
"last": "Achternaam",
"negate_labels": "Negeer Geselecteerde Etiketten",
"next_page": "Volgende pagina"
}

118
frontend/locales/pl.json Normal file
View File

@@ -0,0 +1,118 @@
{
"components": {
"app": {
"import_dialog": {
"description": "Zaimportuj plik CSV zawierający Twoje przedmioty, etykiety i lokalizacje. Zobacz dokumentację, aby uzyskać \nwięcej informacji na temat wymaganego formatu.",
"title": "Zaimportuj plik CSV",
"upload": "Prześlij"
}
},
"global": {
"page_qr_code": {
"page_url": "Adres URL strony"
},
"password_score": {
"password_strength": "Siła hasła"
}
},
"item": {
"create_modal": {
"title": "Utwórz przedmiot",
"photo_button": "Zdjęcie 📷"
},
"view": {
"selectable": {
"card": "Karta",
"items": "Przedmioty",
"no_items": "Brak przedmiotów do wyświetlenia",
"table": "Tabela"
}
}
},
"label": {
"create_modal": {
"title": "Stwórz nową etykietę"
}
},
"location": {
"create_modal": {
"title": "Utwórz lokalizację"
}
}
},
"global": {
"build": "Kompilacja: {build}",
"follow_dev": "Śledź dewelopera",
"github": "Projekt na GitHubie",
"items": "Przedmioty",
"version": "Wersja:{version}",
"welcome": "Witaj, {username}",
"confirm": "Potwierdź",
"create": "Utwórz",
"create_and_add": "Utwórz i dodaj kolejny",
"created": "Utworzone",
"email": "E-mail",
"join_discord": "Dołącz do Discorda",
"labels": "Etykiety",
"locations": "Lokalizacje",
"name": "Nazwa",
"password": "Hasło",
"read_docs": "Przeczytaj dokumentację",
"search": "Wyszukaj",
"sign_out": "Wyloguj się",
"submit": "Wyślij"
},
"index": {
"set_password": "Ustaw swoje hasło",
"dont_join_group": "Nie chcesz dołączyć do grupy?",
"disabled_registration": "Rejestracja jest wyłączona",
"joining_group": "Dołączasz do istniejącej grupy!",
"login": "Zaloguj się",
"register": "Zarejestruj się",
"remember_me": "Zapamiętaj mnie",
"set_email": "Jaki jest Twój adres e-mail?",
"set_name": "Jak się nazywasz?",
"tagline": "Śledź, organizuj i zarządzaj swoimi rzeczami."
},
"items": {
"created_at": "Data utworzenia",
"field_selector": "Selektor pól",
"field_value": "Wartość pola",
"first": "Pierwszy",
"include_archive": "Uwzględnij zarchiwizowane przedmioty",
"negate_labels": "Neguj wybrane etykiety",
"no_results": "Nie znaleziono przedmiotów",
"query_id": "Zapytanie o numer identyfikacyjny zasobu: { id }",
"results": "{ total } wyniki",
"tip_3": "Filtry pól używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
"updated_at": "Zaktualizowano",
"tip_1": "Filtry lokalizacji i etykiet używają operacji 'LUB'. Jeśli wybrano więcej niż jeden, wystarczy jeden, \naby uzyskać dopasowanie.",
"pages": "Strona {page} z {totalPages}",
"add": "Dodaj",
"custom_fields": "Pola niestandardowe",
"last": "Ostatni",
"next_page": "Następna strona",
"options": "Opcje",
"prev_page": "Poprzednia strona",
"reset_search": "Zresetuj wyszukiwanie",
"tip_2": "Wyszukiwania poprzedzone prefiksem \"#\" będą wysyłać zapytanie o identyfikator zasobu (na przykład \"#000-001\")",
"tips": "Wskazówki",
"tips_sub": "Wskazówki wyszukiwania",
"order_by": "Ułóż według"
},
"profile": {
"active": "Aktywny",
"change_password": "Zmiana hasła",
"currency_format": "Format waluty",
"delete_account": "Usuń konto",
"delete_account_sub": "Usuń swoje konto oraz wszystkie powiązane z nim dane. Tego nie można cofnąć.",
"current_password": "Bieżące hasło",
"group_settings_sub": "Ustawienia grupy udostępnione. Możesz potrzebować odświeżyć przeglądarkę, aby niektóre ustawienia zostały zastosowane.",
"inactive": "Nieaktywny",
"new_password": "Nowe hasło",
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Powiadomiony",
"enabled": "Włączone",
"gen_invite": "Wygeneruj link z zaproszeniem",
"group_settings": "Ustawienia grupy"
}
}

128
frontend/locales/sl.json Normal file
View File

@@ -0,0 +1,128 @@
{
"global": {
"follow_dev": "Sledi razvijjalcu",
"build": "Gradnja: [ build ]",
"confirm": "Potrdi",
"create": "Ustvari",
"create_and_add": "Ustvari in dodaj še enega",
"created": "Ustvarjeno",
"email": "E-pošta",
"github": "GitHub projekt",
"items": "Predmeti",
"join_discord": "Pridruži se na Discord",
"labels": "Oznake",
"locations": "Lokacije",
"name": "Naziv",
"password": "Geslo",
"read_docs": "Preberite dokumentacijo",
"search": "Iskanje",
"sign_out": "Odjava",
"submit": "Pošlji",
"version": "Verzija: { version }",
"welcome": "Dobrodošel, { username }"
},
"components": {
"app": {
"import_dialog": {
"change_warning": "Vedenje pri uvozih z obstoječimi import_refs se je spremenilo. Če je import_ref prisoten v datoteki CSV, bo\nelement posodobljen z vrednostmi v datoteki CSV.",
"description": "Uvozite datoteko CSV, ki vsebuje vaše predmete, oznake in lokacije. Poglejte si dokumentacijo za več informacij o\nzahtevani obliki.",
"title": "Uvozi CSV datoteko",
"upload": "Naloži"
}
},
"global": {
"page_qr_code": {
"page_url": "URL strani"
},
"password_score": {
"password_strength": "Moč gesla"
}
},
"item": {
"create_modal": {
"title": "Ustvari predmet",
"photo_button": "Fotografija 📷"
},
"view": {
"selectable": {
"card": "Kartica",
"items": "Predmeti",
"no_items": "Ni predmetov za prikaz",
"table": "Tabela"
}
}
},
"label": {
"create_modal": {
"title": "Ustvari oznako"
}
},
"location": {
"create_modal": {
"title": "Ustvari lokacijo"
}
}
},
"index": {
"disabled_registration": "Registracija je onemogočena",
"dont_join_group": "Se ne želite pridružiti skupini?",
"joining_group": "Pridružujete se obstoječi skupini!",
"login": "Prijava",
"register": "Registriraj se",
"remember_me": "Zapomni si me",
"set_email": "Kakšen je vaš e-poštni naslov?",
"set_password": "Nastavite geslo",
"tagline": "Sledite, organizirajte in upravljajte svoje stvari.",
"set_name": "Kako vam je ime?"
},
"items": {
"created_at": "Ustvarjeno ob",
"include_archive": "Vključi arhivirane predmete",
"last": "Zadnji",
"negate_labels": "Negiraj izbrane oznake",
"no_results": "Ni najdenih predmetov",
"options": "Možnosti",
"pages": "Stran { page } od { totalPages }",
"tip_2": "Iskanja s predpono '#' bodo iskala ID sredstva (primer '#000-001')",
"tip_3": "Filtri polj uporabljajo operacijo 'ALI'. Če je izbranih več kot eno, bo za ujemanje dovolj samo\n eno.",
"tips": "Nasveti",
"updated_at": "Posodobljeno ob",
"custom_fields": "Polje po meri",
"results": "Rezultatov: { total }",
"tip_1": "Filtri lokacij in oznak uporabljajo operacijo 'ALI'. Če je izbranih več kot ena, bo izbrana samo ena\n potrebna za ujemanje.",
"add": "Dodaj",
"field_selector": "Izbirnik polj",
"field_value": "Vrednost polja",
"first": "Prvi",
"next_page": "Naslednja stran",
"prev_page": "Prejšnja stran",
"query_id": "Poizvedovanje po identifikacijski številki sredstva: { id }",
"reset_search": "Ponastavi iskanje",
"tips_sub": "Nasveti za iskanje",
"order_by": "Razvrsti po"
},
"profile": {
"gen_invite": "Ustvari povezavo povabila",
"group_settings_sub": "Nastavitve skupine v skupni rabi. Morda boste morali osvežiti brskalnik, da bodo nekatere nastavitve veljale.",
"notifiers": "Obveščevalci",
"notifier_modal": "{ type, select, true {Edit} false {Create} other {Other}} Obveščevalec",
"notifiers_sub": "Prejemajte obvestila za prihajajoče opomnike o vzdrževanju",
"theme_settings_sub": "Nastavitve teme so shranjene v lokalni shrambi vašega brskalnika. Temo lahko kadar koli spremenite. Če\n imate težave z nastavitvijo teme, poskusite osvežiti brskalnik.",
"update_group": "Posodobi skupino",
"url": "URL",
"delete_account_sub": "Izbrišite svoj račun in vse z njim povezane podatke. Tega ni mogoče razveljaviti.",
"active": "Aktivno",
"change_password": "Sprememba gesla",
"currency_format": "Oblika valute",
"current_password": "Trenutno geslo",
"delete_account": "Izbriši račun",
"enabled": "Omogočeno",
"group_settings": "Nastavitve skupine",
"inactive": "Neaktivno",
"new_password": "Novo geslo",
"test": "Preizkus",
"theme_settings": "Nastavitve teme",
"user_profile": "Profil uporabnika",
"user_profile_sub": "Povabite uporabnike in upravljajte svoj račun."
}
}

View File

@@ -16,7 +16,7 @@
"view": {
"selectable": {
"card": "卡片模式",
"items": "物品模式",
"items": "物品",
"no_items": "没有物品可用展示",
"table": "表格模式"
}
@@ -103,7 +103,7 @@
},
"profile": {
"group_settings_sub": "共享组设置。您可能需要刷新浏览器来让某些设置生效。",
"notifier_modal": "通知 { type, select, true {Edit} false {Create} other {Other}}",
"notifier_modal": "{ type, select, true {编辑} false {创建} other {Other}} 通知器",
"active": "活跃",
"delete_account_sub": "删除您的帐户及其所有相关数据。这是无法撤消的。",
"inactive": "非活跃",
@@ -117,7 +117,7 @@
"gen_invite": "生成邀请链接",
"group_settings": "组设置",
"new_password": "新密码",
"notifiers": "通知",
"notifiers": "通知",
"notifiers_sub": "获取即将到来的维护提醒通知",
"test": "测试",
"theme_settings": "主题设置",

View File

@@ -7,7 +7,7 @@ export default defineNuxtPlugin(({ vueApp }) => {
let matched = null;
const languages = Object.getOwnPropertyNames(messages())
languages.forEach(lang => {
if (lang === navigator.language) {
if (lang === navigator.language.replace('-', '_')) {
matched = lang;
}
});