(() => {
+ 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];
}
diff --git a/frontend/components/Item/CreateModal.vue b/frontend/components/Item/CreateModal.vue
index f08843112..dae8cf6f6 100644
--- a/frontend/components/Item/CreateModal.vue
+++ b/frontend/components/Item/CreateModal.vue
@@ -7,12 +7,11 @@
-
-
-
- file name: {{ form.photo.name }}
-
-
+
+ File name: {{ form.photo?.name }}
+
+
-
-
use Shift + Enter 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 = "";
diff --git a/frontend/components/Item/View/Table.vue b/frontend/components/Item/View/Table.vue
index ceed5d38a..069456105 100644
--- a/frontend/components/Item/View/Table.vue
+++ b/frontend/components/Item/View/Table.vue
@@ -1,5 +1,5 @@
-
+
-
+
+
Rows per page
+
@@ -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
(() => {
return pagination.page * pagination.rowsPerPage < props.items.length;
@@ -189,4 +205,20 @@
}
-
+
diff --git a/frontend/components/Label/CreateModal.vue b/frontend/components/Label/CreateModal.vue
index efd2ece01..862bf5b4a 100644
--- a/frontend/components/Label/CreateModal.vue
+++ b/frontend/components/Label/CreateModal.vue
@@ -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;
}
diff --git a/frontend/components/Location/CreateModal.vue b/frontend/components/Location/CreateModal.vue
index 355724c36..5bbaa28af 100644
--- a/frontend/components/Location/CreateModal.vue
+++ b/frontend/components/Location/CreateModal.vue
@@ -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) {
diff --git a/frontend/components/Search/Filter.vue b/frontend/components/Search/Filter.vue
index 328934a0c..2cbbf6d31 100644
--- a/frontend/components/Search/Filter.vue
+++ b/frontend/components/Search/Filter.vue
@@ -45,6 +45,7 @@
options: any[];
display?: string;
modelValue: any[];
+ uniqueField: string;
};
const btn = ref();
@@ -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]);
});
});
diff --git a/frontend/components/global/StatCard/StatCard.vue b/frontend/components/global/StatCard/StatCard.vue
index ec76e6624..9311bcda5 100644
--- a/frontend/components/global/StatCard/StatCard.vue
+++ b/frontend/components/global/StatCard/StatCard.vue
@@ -1,7 +1,7 @@
-
{{ title }}
+
{{ title }}
{{ value }}
@@ -27,8 +27,4 @@
});
-
+
diff --git a/frontend/composables/use-preferences.ts b/frontend/composables/use-preferences.ts
index 848617510..93f81ccb0 100644
--- a/frontend/composables/use-preferences.ts
+++ b/frontend/composables/use-preferences.ts
@@ -9,6 +9,7 @@ export type LocationViewPreferences = {
editorAdvancedView: boolean;
itemDisplayView: ViewType;
theme: DaisyTheme;
+ itemsPerTablePage: number;
};
/**
@@ -24,6 +25,7 @@ export function useViewPreferences(): Ref {
editorAdvancedView: false,
itemDisplayView: "card",
theme: "homebox",
+ itemsPerTablePage: 10,
},
{ mergeDefaults: true }
);
diff --git a/frontend/locales/ca.json b/frontend/locales/ca.json
new file mode 100644
index 000000000..820307a40
--- /dev/null
+++ b/frontend/locales/ca.json
@@ -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"
+ }
+}
diff --git a/frontend/locales/de.json b/frontend/locales/de.json
index e573b8308..6874ab8a2 100644
--- a/frontend/locales/de.json
+++ b/frontend/locales/de.json
@@ -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."
}
}
diff --git a/frontend/locales/es.json b/frontend/locales/es.json
index 15e08795e..d30d2d3e9 100644
--- a/frontend/locales/es.json
+++ b/frontend/locales/es.json
@@ -18,7 +18,8 @@
},
"item": {
"create_modal": {
- "title": "Crear Elemento"
+ "title": "Crear Elemento",
+ "photo_button": "Foto 📷"
},
"view": {
"selectable": {
diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json
index 66883a7ab..a342fdc24 100644
--- a/frontend/locales/fr.json
+++ b/frontend/locales/fr.json
@@ -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 d’emplacement et d’étiquette utilisent l’opérateur « OU ».\nUn seul des filtres n’a 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 l’opérateur « OU ».\nUn seul des filtres n’a 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"
}
}
diff --git a/frontend/locales/nl.json b/frontend/locales/nl.json
index 6352e017c..ac57c7006 100644
--- a/frontend/locales/nl.json
+++ b/frontend/locales/nl.json
@@ -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"
}
diff --git a/frontend/locales/pl.json b/frontend/locales/pl.json
new file mode 100644
index 000000000..b134cdb03
--- /dev/null
+++ b/frontend/locales/pl.json
@@ -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"
+ }
+}
diff --git a/frontend/locales/sl.json b/frontend/locales/sl.json
new file mode 100644
index 000000000..704023881
--- /dev/null
+++ b/frontend/locales/sl.json
@@ -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."
+ }
+}
diff --git a/frontend/locales/zh_Hans.json b/frontend/locales/zh_Hans.json
index e78fbc185..18c156146 100644
--- a/frontend/locales/zh_Hans.json
+++ b/frontend/locales/zh_Hans.json
@@ -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": "主题设置",
diff --git a/frontend/plugins/i18n.ts b/frontend/plugins/i18n.ts
index 8043bfda4..fb23642d0 100644
--- a/frontend/plugins/i18n.ts
+++ b/frontend/plugins/i18n.ts
@@ -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;
}
});