diff --git a/lang/ca.json b/lang/ca.json index 2cb6cf875..9e97f95c9 100644 --- a/lang/ca.json +++ b/lang/ca.json @@ -1,25 +1,25 @@ { "Lists": "Llistes", "New E-mail": "Nou correu electrònic", - "Manage users": "Gestionar usuaris", + "Manage users": "Gestió d'usuaris", "Global": "Global", "Please upload a file in Gramps XML (.gramps) format without media files.": "Penja un fitxer en format Gramps XML (.gramps) sense fitxers multimèdia.", "Add custom type": "Afegeix un tipus personalitzat", "Switch to default type": "Canviar al tipus predeterminat", "Custom type": "Tipus personalitzat", - "A new version of the app is available.": "Hi ha disponible una nova versió de l'aplicació.", + "A new version of the app is available.": "Nova versió de l'aplicació disponible.", "Blog": "Bloc", "Change E-mail": "Canviar el correu electrònic", "Change password": "Canviar la contrasenya", "Discard": "Descartar", "History": "Historial", "Show this dialog": "Mostra aquest diàleg", - "To start using the blog, add a source with tag 'Blog'.": "Per a començar a utilitzar el bloc, afegeix una font amb l'etiqueta «Bloc».", - "Create an admin account": "Crear un compte d'administrador", - "Welcome to Gramps Web": "Benvingut a Gramps Web", + "To start using the blog, add a source with tag 'Blog'.": "Per començar a utilitzar el bloc, afegeix una font amb l'etiqueta «Bloc».", + "Create an admin account": "Crear un compte administratiu", + "Welcome to Gramps Web": "Us donem la benvinguda a Gramps Web", "SMTP user": "Usuari SMTP", "SMTP password": "Contrasenya SMTP", - "From address": "Adreça origen", + "From address": "Adreça d'origen", "Need help? Check out ": "Necessites ajuda? Consulta ", "the documentation": "la documentació", "filter": "filtre", @@ -29,8 +29,8 @@ "Old password": "Contrasenya antiga", "Recently browsed objects": "Objectes explorats recentment", "Recently changed objects": "Objectes canviats recentment", - "Select language": "Seleccionar idioma", - "Show in tree": "Mostrar a l'arbre", + "Select language": "Canviar l'idioma", + "Show in tree": "Localitzar a l'arbre", "User settings": "Configuració d'usuari", "Anniversaries": "Aniversaris", "Export": "Exportar", @@ -48,8 +48,8 @@ "Optionally, enter existing IMAP credentials to enable e-mail notifications required e.g. for user registration.": "Opcionalment, introdueix les credencials IMAP existents per a habilitar les notificacions necessàries per correu electrònic, per exemple, per al registre d'usuaris.", "SMTP host": "Amfitrió SMTP", "SMTP port": "Port SMTP", - "Upload family tree": "Pujar l'arbre genealògic", - "Optionally, upload existing family tree data.": "Opcionalment, carregueu les dades existents de l'arbre genealògic.", + "Upload family tree": "Pujar arbre genealògic", + "Optionally, upload existing family tree data.": "Opcionalment, carregueu les dades de l'arbre genealògic existent.", "Submit": "Enviar", "Unsupported format": "Format no suportat", "The Gramps package format (.gpkg) is currently not supported.": "El format de paquet Gramps (.gpkg) no està suportat actualment.", @@ -62,8 +62,8 @@ "Register new account": "Registrar un compte nou", "All": "Tots", "Select at least one object type": "Selecciona almenys un tipus d'objecte", - "unconfirmed": "sense confirmar", - "disabled": "inhabilitat", + "unconfirmed": "Sense confirmar", + "disabled": "Desactivat", "Guest": "Convidat", "Member": "Membre", "Contributor": "Col·laborador", @@ -82,7 +82,7 @@ "Importing family tree": "S'està important l'arbre genealògic", "Copy to clipboard": "Còpia al portaretalls", "Update search index": "Actualitza l'índex de cerca", - "Manually updating the search index is usually unnecessary, but it may become necessary after an upgrade.": "Normalment no és necessari actualitzar manualment l'índex de cerca, però pot ser'ho després d'una actualització.", + "Manually updating the search index is usually unnecessary, but it may become necessary after an upgrade.": "Actualitzar manualment l'índex de cerca sol ser innecessari, però pot ser necessari després d'una actualització.", "New account registered successfully.": "Nou compte d'usuari registrat amb èxit.", "A password reset link has been sent by e-mail.": "S'ha enviat un enllaç de restabliment de contrasenya per correu electrònic.", "Registration link": "Enllaç de registre", @@ -100,7 +100,7 @@ "Please confirm your e-mail address by clicking the link in the e-mail you received and then wait for the tree owner to activate your account.": "Si us plau, verifica la teva direcció de correu electrònic fent clic a l'enllaç que hauràs rebut i espera que el propietari de l'arbre activi el teu compte.", "Administration": "Administració", "Manage search index": "Gestiona l'índex de cerca", - "Add a new user": "Afegeix un nou usuari", + "Add a new user": "Afegir un nou usuari", "Edit user": "Edita usuari", "Usage quotas": "Quotes d'utilització", "Copy URL": "Copiar URL", @@ -115,38 +115,38 @@ "Bookmark this": "Desar adreça d'interès", "Remove bookmark": "Esborrar adreça d'interès", "Administrator": "Administrador", - "Text Recognition": "Reconeixement de Text", - "Save as Note": "Desar com a Nota", + "Text Recognition": "Reconeixement de text", + "Save as Note": "Desar com a nota", "Edit event type": "Modificar tipus d'esdeveniment", - "Chromosome Browser": "Visualitzador de Cromosomes", + "Chromosome Browser": "Visualitzador de cromosomes", "Matches": "Concordances", "DNA": "ADN", "Shared DNA": "ADN compartit", - "Largest Segment": "Segment Més Gran", + "Largest Segment": "Segment més gran", "%s media objects with missing file": "%s objectes multimèdia sense fitxer", "%s media objects with missing checksum": "%s objectes multimèdia sense suma de verificació", "Only places related to events": "Només llocs relacionats amb esdeveniments", "Task": "Tasca", "Tasks": "Tasques", - "New Task": "Nova Tasca", + "New Task": "Nova tasca", "Show in blog": "Mostrar al bloc", - "Set Status": "Definir l'Estat", - "Done": "Acabat", + "Set Status": "Establir estat", + "Done": "Fet", "In Progress": "En curs", "Open": "Obert", "Attachments": "Adjunts", - "Set Priority": "Establir Prioritat", + "Set Priority": "Establir prioritat", "Common ancestors": "Avantpassats comuns", "Blocked": "Bloquejat", "Edit place type": "Modificar el tipus de lloc", - "Shared Segments": "Segments Compartits", + "Shared Segments": "Segments compartits", "Media file status": "Estat de fitxers multimèdia", - "User group": "Grup d'usuaris", + "User group": "Paper", "User Information": "Informació de l'usuari", "First person": "Primera persona", "Second person": "Segona persona", "Raw match data": "Dades de concordança en brut", - "Add new DNA match": "Afegeix una nova coincidència d'ADN", + "Add new DNA match": "Afegir nova coincidència d'ADN", "Paste the raw data in the field above to see the preview.": "Enganxeu les dades en brut al camp de dalt per veure la vista prèvia.", "Number of SNPs": "Nombre de SNPs", "Side": "Costat", @@ -171,7 +171,7 @@ "Do you really want to delete user \"%s\"?": "Realment voleu suprimir l'usuari \"%s\"?", "Show more": "Mostra més", "Upgrade database": "Actualitza la base de dades", - "Clear the family tree by removing all existing objects. Optionally, select specific types of objects for deletion.": "Esborra l'arbre genealògic eliminant tots els objectes existents. Opcionalment, seleccioneu tipus específics d'objectes per suprimir-los.", + "Clear the family tree by removing all existing objects. Optionally, select specific types of objects for deletion.": "Esborra definitivament l'arbre genealògic suprimint tots els objectes existents. Opcionalment, seleccioni tipus específics d'objectes per a la supressió.", "Please re-enter your password to continue.": "Torneu a introduir la vostra contrasenya per continuar.", "Revisions": "Revisions", "Add multiple objects": "Afegeix diversos objectes", @@ -212,7 +212,7 @@ "Pending": "Pendent", "Started": "Començat", "simple": "simple", - "Confirm Password": "Confirma Contrasenya", + "Confirm Password": "Confirma contrasenya", "Register to Gramps Web": "Registra a la Web de Gramps", "full-text": "text-sencer", "semantic": "semàntic", @@ -223,10 +223,11 @@ "Given Name First": "Nom de pila primer", "Surname First": "Cognom primer", "Toggle person outlines": "Commuta els contorns de les persones", - "Log out": "Tanca la sessió", + "Log out": "Tancar sessió", "Metadata": "Metadades", - "To start building your family tree, add yourself as a person or import a family tree file.": "Per a començar a construir el vostre arbre genealògic, afegiu-vos com a persona o importeu un fitxer d'arbre genealògic.", + "To start building your family tree, add yourself as a person or import a family tree file.": "Per començar a construir el vostre arbre genealògic, afegiu-vos com a persona o importeu un fitxer d'arbre genealògic.", "Historical Map": "Mapa històric", "Base Map": "Mapa de base", - "DNA matches": "Coincidències d'ADN" + "DNA matches": "Coincidències d'ADN", + "in": "a" } diff --git a/lang/es.json b/lang/es.json index b07276a4e..986e9cc9e 100644 --- a/lang/es.json +++ b/lang/es.json @@ -46,7 +46,7 @@ "Enter the details for the admin user.": "Introduzca los datos del usuario administrador.", "SMTP host": "Anfitrión SMTP", "SMTP port": "Puerto SMTP", - "Gramps Web base URL": "URL de la base de datos de Gramps", + "Gramps Web base URL": "URL base de Gramps Web", "Upload family tree": "Cargar árbol genealógico", "Optionally, upload existing family tree data.": "Opcionalmente, cargue los datos del árbol genealógico existente.", "Need help? Check out ": "¿Necesita ayuda? Consulte ", @@ -109,13 +109,13 @@ "Upload a ZIP archive with files for existing media objects.": "Carga un archivo ZIP con los archivos de los objetos multimedia existentes.", "Import Media Files": "Importar los archivos multimedia", "Set Status": "Establecer estado", - "New Task": "Tarea nueva", + "New Task": "Nueva tarea", "Show in blog": "Mostrar en el blog", "Set Priority": "Establecer prioridad", - "Open": "Abrir", + "Open": "Abierto", "Registration link": "Enlace de registro", "Event Year": "Año del evento", - "Done": "Realizado", + "Done": "Hecho", "Tasks": "Tareas", "In Progress": "En curso", "Attachments": "Archivos adjuntos", diff --git a/lang/fr.json b/lang/fr.json index 767d47027..1627b9eb1 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -224,5 +224,10 @@ "Log out": "Déconnexion", "DNA matches": "Correspondances ADN", "Toggle time filter for places": "Filtre temporel pour les lieux", - "Regenerate semantic search index": "Régénérer l'index de recherche sémantique" + "Regenerate semantic search index": "Régénérer l'index de recherche sémantique", + "Toggle person outlines": "Activer/désactiver les contours des personnes", + "Base Map": "Carte de base", + "Historical Map": "Carte historique", + "To start building your family tree, add yourself as a person or import a family tree file.": "Pour commencer à créer votre arbre généalogique, ajoutez-vous en tant que personne ou importez un fichier d'arbre généalogique.", + "Metadata": "Metadata" } diff --git a/lang/he.json b/lang/he.json index dbf728805..50b80bfc8 100644 --- a/lang/he.json +++ b/lang/he.json @@ -191,5 +191,18 @@ "To start building your family tree, add yourself as a person or import a family tree file.": "כדי להתחיל לבנות את אילן היוחסין שלך, יש להוסיף את עצמך כאדם או לייבא קובץ אילן יוחסין.", "Regenerate semantic search index": "חילול מפתחות חיפוש סמנטי מחדש", "Settings": "הגדרות", - "Pending": "תלוי ועומד" + "Pending": "תלוי ועומד", + "Delete user": "למחוק משתמש", + "Do you really want to delete user \"%s\"?": "האם למחוק משתמש \"%s\"?", + "First person": "אדם ראשון", + "Second person": "אדם שני", + "Raw match data": "התאמת נתונים גולמית", + "Add new DNA match": "הוספת התאמת DNA חדשה", + "Paste the raw data in the field above to see the preview.": "הדבקת הנתונים הגולמיים לשדה שמעל כדי לצפות בתצוגה מקדימה.", + "Number of SNPs": "כמות SNP", + "Side": "צד", + "Chromosome": "כרומוזום", + "Start Position": "איות התחלתית", + "End Position": "איות סופית", + "DNA Match": "התאמת DNA" } diff --git a/lang/ka.json b/lang/ka.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/lang/ka.json @@ -0,0 +1 @@ +{} diff --git a/lang/lv.json b/lang/lv.json index f47e3bb5b..f6d14075b 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -1,3 +1,233 @@ { - "A new version of the app is available.": "Pieejama jauna aplikācijas versija." + "A new version of the app is available.": "Pieejama jauna aplikācijas versija.", + "Blog": "Blogs", + "Change E-mail": "Mainīt E-pastu", + "Change password": "Mainīt paroli", + "Discard": "Atmest", + "History": "Vēsture", + "Lists": "Saraksti", + "Manage users": "Pārvaldīt lietotājus", + "Menu": "Izvēlne", + "New E-mail": "Jauns E-pasts", + "New password": "Jauna parole", + "Old password": "Vecā parole", + "Recently browsed objects": "Nesen pārlūkoti objekti", + "Recently changed objects": "Nesen mainītie objekti", + "Select language": "Izvēlieties valodu", + "Show in tree": "Rādīt dzimtas kokā", + "User settings": "Lietotāja iestatījumi", + "Anniversaries": "Jubilejas", + "Export": "Eksportēt", + "Search": "Meklēt", + "Navigation": "Navigācija", + "Global": "Globāls", + "Edit coordinates": "Rediģēt koordinātas", + "Search %s": "Meklēt %s", + "Latest Blog Post": "Jaunākais Bloga Ieraksts", + "Align the image": "Izlīdzināt attēlu", + "Select a point on the map": "Atlasiet punktu kartē", + "Select an existing citation": "Atlasiet esošu citātu", + "Place Hierarchy": "Vietas Hierarhija", + "Keyboard Shortcuts": "Tastatūras Īsceļi", + "Show this dialog": "Rādīt šo dialoglodziņu", + "To start using the blog, add a source with tag 'Blog'.": "Lai sāktu lietot blogu, pievienojiet avotu ar atzīmi 'Blogs'.", + "Welcome to Gramps Web": "Laipni lūdzam Gramps Web", + "Create an admin account": "Izveidojiet administratora kontu", + "Add custom type": "Pievienot pielāgotu tipu", + "Enter the details for the admin user.": "Ievadiet administratora lietotāja informāciju.", + "Optionally, enter existing IMAP credentials to enable e-mail notifications required e.g. for user registration.": "Pēc izvēles ievadiet esošos IMAP akreditācijas datus, lai iespējotu e-pasta paziņojumus (piemēram, lietotāju reģistrācijai).", + "SMTP host": "SMTP resursdators", + "SMTP port": "SMTP ports", + "SMTP user": "SMTP lietotājs", + "SMTP password": "SMTP parole", + "From address": "Nosūtītāja adrese", + "Gramps Web base URL": "Gramps Web pamata URL", + "Upload family tree": "Augšupielādēt dzimtas koku", + "Optionally, upload existing family tree data.": "Pēc izvēles augšupielādējiet esošos dzimtas koka datus.", + "Need help? Check out ": "Nepieciešama palīdzība? Skatiet ", + "the documentation": "dokumentāciju", + "Submit": "Iesniegt", + "Unsupported format": "Neatbalstīts formāts", + "The Gramps package format (.gpkg) is currently not supported.": "Gramps pakotnes formāts (.gpkg) pašlaik netiek atbalstīts.", + "Please upload a file in Gramps XML (.gramps) format without media files.": "Lūdzu, augšupielādējiet failu Gramps XML (.gramps) formātā bez multivides failiem.", + "If you intend to synchronize an existing Gramps database with Gramps Web, use the Gramps XML (.gramps) format instead.": "Ja plānojat sinhronizēt esošu Gramps datubāzi ar Gramps Web, izmantojiet Gramps XML (.gramps) formātu.", + "Username": "Lietotājvārds", + "Password": "Parole", + "login": "pieteikties", + "Lost password?": "Aizmirsāt paroli?", + "Register new account": "Reģistrēt jaunu kontu", + "All": "Visi", + "Select at least one object type": "Izvēlieties vismaz vienu objekta tipu", + "filter": "filtrs", + "Properties": "Rekvizīti", + "unconfirmed": "neapstiprināts", + "disabled": "atspējots", + "Guest": "Viesis", + "Member": "Biedrs", + "Contributor": "Dalībnieks", + "Editor": "Redaktors", + "Owner": "Īpašnieks", + "Switch to default type": "Pārslēgties uz noklusējuma tipu", + "Custom type": "Pielāgots tips", + "Replace file": "Aizstāt failu", + "Year": "Gads", + "Month": "Mēnesis", + "Day": "Diena", + "Administration": "Administrēšana", + "Update search index": "Atjaunināt meklēšanas indeksu", + "Manually updating the search index is usually unnecessary, but it may become necessary after an upgrade.": "Manuāla meklēšanas indeksa atjaunošana parasti nav nepieciešama, taču tā var būt vajadzīga pēc atjaunināšanas.", + "Stop editing": "Pārtraukt rediģēšanu", + "Clear all filters": "Noņemt visus filtrus", + "Sort": "Kārtot", + "Add Tag": "Pievienot Birku", + "Manage search index": "Pārvaldīt meklēšanas indeksu", + "Add a new user": "Pievienot jaunu lietotāju", + "Edit user": "Rediģēt lietotāju", + "Import user accounts": "Importēt lietotāju kontus", + "Export user details": "Eksportēt lietotāju datus", + "Export your family tree": "Eksportēt savu dzimtas koku", + "Export your media files": "Eksportēt savus multivides failus", + "Generate a ZIP archive with all media files.": "Izveidot ZIP arhīvu ar visiem multivides failiem.", + "Error parsing JSON file": "Kļūda, analizējot JSON failu", + "E-mail settings": "E-pasta iestatījumi", + "Creating owner account": "Tiek izveidots īpašnieka konts", + "Storing configuration": "Konfigurācijas saglabāšana", + "Importing family tree": "Dzimtas koka importēšana", + "Copy to clipboard": "Kopēt starpliktuvē", + "Usage quotas": "Lietošanas kvotas", + "Not authorized": "Nav autorizēts", + "This e-mail address is already in use": "Šī e-pasta adrese jau tiek izmantota", + "This user name is already in use": "Šis lietotājvārds jau tiek izmantots", + "Already have an account?": "Jau ir konts?", + "reset password": "atjaunot paroli", + "New account registered successfully.": "Jauns konts veiksmīgi reģistrēts.", + "Please confirm your e-mail address by clicking the link in the e-mail you received and then wait for the tree owner to activate your account.": "Lūdzu, apstipriniet savu e-pasta adresi, noklikšķinot uz saites saņemtajā e-pastā, un pēc tam gaidiet, līdz dzimtas koka īpašnieks aktivizēs jūsu kontu.", + "A password reset link has been sent by e-mail.": "Paroles atjaunošanas saite ir nosūtīta uz e-pastu.", + "Copy URL": "Kopēt URL", + "Upload a ZIP archive with files for existing media objects.": "Augšupielādējiet ZIP arhīvu ar failiem esošajiem multivides objektiem.", + "Import Media Files": "Importēt multivides failus", + "Delete this object?": "Dzēst šo objektu?", + "Object %s deleted.": "Objekts %s ir dzēsts.", + "Registration link": "Reģistrācijas saite", + "Task": "Uzdevums", + "Tasks": "Uzdevumi", + "New Task": "Jauns Uzdevums", + "Show in blog": "Rādīt blogā", + "Show more": "Rādīt vairāk", + "Set Priority": "Iestatīt Prioritāti", + "Set Status": "Iestatīt Statusu", + "Done": "Pabeigts", + "In Progress": "Procesā", + "Open": "Atvērts", + "Attachments": "Pielikumi", + "Event Year": "Notikuma Gads", + "Common ancestors": "Kopīgie senči", + "Blocked": "Bloķēts", + "Edit event type": "Rediģēt notikuma tipu", + "Edit place type": "Rediģēt vietas tipu", + "Text Recognition": "Teksta Atpazīšana", + "Save as Note": "Saglabāt kā Piezīmi", + "DNA": "DNS", + "Matches": "Sakritības", + "Chromosome Browser": "Hromosomu pārlūks", + "Shared DNA": "Kopīgā DNS", + "Shared Segments": "Kopīgie Segmenti", + "Largest Segment": "Lielākais Segments", + "Bookmark this": "Pievienot grāmatzīmei", + "Remove bookmark": "Noņemt grāmatzīmi", + "Ancestor frequency": "Senču biežums", + "Administrator": "Administrators", + "%s media objects with missing file": "%s multivides objektiem trūkst faila", + "%s media objects with missing checksum": "%s multivides objektiem trūkst kontrolsummas", + "Only places related to events": "Tikai ar notikumiem saistītas vietas", + "Media file status": "Multivides failu statuss", + "This tool checks the database for integrity problems, fixing the problems it can.": "Šis rīks pārbauda datubāzi, vai nav integritātes problēmu, un izlabo tās, kuras iespējams.", + "Upgrade database": "Atjaunināt datubāzi", + "The Family Tree you are trying to load is in a schema version not supported by this version of Gramps Web. Therefore you cannot load this Family Tree without upgrading its schema. This action cannot be undone.": "Dzimtas koks, kuru mēģināt ielādēt, ir shēmas versijā, kuru šī Gramps Web versija neatbalsta. To nevar ielādēt, neveicot shēmas jaunināšanu. Šo darbību nevar atsaukt.", + "The Family Tree you are trying to load is in a schema version not supported by this version of Gramps Web. Therefore you cannot load this Family Tree until the tree administrator has upgraded its schema.": "Dzimtas koks, kuru mēģināt ielādēt, ir shēmas versijā, kuru šī Gramps Web versija neatbalsta. To nevar ielādēt, līdz koka administrators nebūs veicis shēmas jaunināšanu.", + "Wrong username or password": "Nepareizs lietotājvārds vai parole", + "Password successfully updated": "Parole veiksmīgi atjaunināta", + "E-mail successfully updated": "E-pasts veiksmīgi atjaunināts", + "Danger Zone": "Bīstamā Zona", + "Password is required": "Nepieciešama parole", + "Delete all objects": "Dzēst visus objektus", + "Clear the family tree by removing all existing objects. Optionally, select specific types of objects for deletion.": "Notīriet dzimtas koku, noņemot visus esošos objektus. Pēc izvēles izvēlieties konkrētus objektu tipus dzēšanai.", + "Please re-enter your password to continue.": "Lūdzu, atkārtoti ievadiet paroli, lai turpinātu.", + "Revisions": "Izmaiņas", + "Add multiple objects": "Pievienot vairākus objektus", + "Delete Person": "Dzēst Personu", + "Delete Family": "Dzēst Ģimeni", + "Delete Event": "Dzēst Notikumu", + "Delete Place": "Dzēst Vietu", + "Delete Source": "Dzēst Avotu", + "Delete Citation": "Dzēst Citātu", + "Delete Repository": "Dzēst Repozitoriju", + "Delete Note": "Dzēst Piezīmi", + "Delete Media": "Dzēst Multividi", + "Delete Tag": "Dzēst Birku", + "Edit Tag": "Rediģēt Birku", + "Revision History": "Izmaiņu Vēsture", + "simple": "vienkāršs", + "Are you sure?": "Vai esat pārliecināts?", + "This action cannot be undone.": "Šo darbību nevar atsaukt.", + "Yes": "Jā", + "Toggle time filter for places": "Pārslēgt laika filtru vietām", + "The search index needs to be rebuilt.": "Meklēšanas indekss ir jāizveido no jauna.", + "Ask something about your ancestors": "Uzdodiet jautājumu par saviem senčiem", + "Chat messages": "Tērzēšanas ziņojumi", + "Manage semantic search index": "Pārvaldīt semantisko meklēšanas indeksu", + "Update semantic search index": "Atjaunināt semantisko meklēšanas indeksu", + "Updating the semantic search index requires substantial time and computational resources. Run this operation only when necessary.": "Semantiskā meklēšanas indeksa atjaunināšanai nepieciešams daudz laika un skaitļošanas resursu. Izpildiet šo darbību tikai tad, ja tas ir nepieciešams.", + "User groups allowed to use AI chat:": "Lietotāju grupas, kurām atļauts izmantot AI tērzēšanu:", + "Owners and administrators": "Īpašnieki un administratori", + "Editor and above": "Redaktors un augstāk", + "Contributor and above": "Dalībnieks un augstāk", + "Member and above": "Biedrs un augstāk", + "Everybody": "Visi", + "Nobody": "Neviens", + "User group": "Lietotāju grupa", + "User Information": "Lietotāja Informācija", + "Tree Information": "Koka Informācija", + "Regenerate semantic search index": "Pārģenerēt semantisko meklēšanas indeksu", + "Settings": "Iestatījumi", + "Pending": "Gaida apstiprinājumu", + "Started": "Uzsākts", + "Delete user": "Dzēst lietotāju", + "Do you really want to delete user \"%s\"?": "Vai tiešām vēlaties dzēst lietotāju \"%s\"?", + "First person": "Pirmais cilvēks", + "Second person": "Otrais cilvēks", + "Raw match data": "Neapstrādāti sakritības dati", + "Add new DNA match": "Pievienot jaunu DNS atbilstību", + "Paste the raw data in the field above to see the preview.": "Ielīmējiet neapstrādātos datus laukā augstāk, lai redzētu priekšskatījumu.", + "Number of SNPs": "SNP skaits", + "Side": "Puse", + "Chromosome": "Hromosoma", + "Start Position": "Sākuma Pozīcija", + "End Position": "Beigu Pozīcija", + "DNA Match": "DNS Atbilstība", + "DNA match with %s deleted.": "DNS atbilstība ar %s ir dzēsta.", + "Paste text or drop a file here": "Ielīmējiet tekstu vai ievelciet failu šeit", + "No DNA matches found.": "DNS atbilstības nav atrastas.", + "No DNA matches detected in the data provided.": "Sniegtajos datos DNS atbilstības nav konstatētas.", + "Max Degree of Separation": "Maksimālā Attāluma Pakāpe", + "Max Number of Images displayed": "Maksimālais Attēlu Skaits, kas parādīts", + "Length": "Garums", + "Confirm Password": "Apstipriniet Paroli", + "Passwords do not match.": "Paroles nesakrīt.", + "Register to Gramps Web": "Reģistrēties Gramps Web", + "Log in to Gramps Web": "Pieteikties Gramps Web", + "Invalid E-mail address": "Nederīga e-pasta adrese", + "full-text": "pilnteksta", + "semantic": "semantiskais", + "Name Display Format": "Vārda Parādīšanas Formāts", + "Surname First": "Uzvārds Vispirms", + "Given Name First": "Vārds Vispirms", + "Toggle person outlines": "Pārslēgt personu kontūras", + "Log out": "Izrakstīties", + "in": "iekš", + "DNA matches": "DNS atbilstības", + "Base Map": "Pamatkarte", + "Historical Map": "Vēsturiskā karte", + "To start building your family tree, add yourself as a person or import a family tree file.": "Lai sāktu veidot savu dzimtas koku, pievienojiet sevi kā personu vai importējiet dzimtas koka failu.", + "Metadata": "Metadati" } diff --git a/src/components/GrampsjsEvent.js b/src/components/GrampsjsEvent.js index 45a4e533c..1a0d0843b 100644 --- a/src/components/GrampsjsEvent.js +++ b/src/components/GrampsjsEvent.js @@ -107,7 +107,10 @@ export class GrampsjsEvent extends GrampsjsObject { if (obj === undefined) { return '' } - return `${obj?.name_given || '…'} ${obj?.name_surname || '…'}` + return ( + obj.name_display || + `${obj?.name_given || '…'} ${obj?.name_surname || '…'}` + ) } // eslint-disable-next-line class-methods-use-this diff --git a/src/components/GrampsjsFamily.js b/src/components/GrampsjsFamily.js index 86f32b2d9..304d0953e 100644 --- a/src/components/GrampsjsFamily.js +++ b/src/components/GrampsjsFamily.js @@ -48,10 +48,15 @@ export class GrampsjsFamily extends GrampsjsObject { _renderTitle() { return html` - ${this.data?.profile?.father?.name_given || '…'} - ${this.data?.profile?.father?.name_surname || '…'} & - ${this.data?.profile?.mother?.name_given || '…'} - ${this.data?.profile?.mother?.name_surname || '…'} + ${this.data?.profile?.father?.name_display || + `${this.data?.profile?.father?.name_given || '…'} ${ + this.data?.profile?.father?.name_surname || '…' + }`} + & + ${this.data?.profile?.mother?.name_display || + `${this.data?.profile?.mother?.name_given || '…'} ${ + this.data?.profile?.mother?.name_surname || '…' + }`} ` } diff --git a/src/components/GrampsjsFormEditPlaceName.js b/src/components/GrampsjsFormEditPlaceName.js index 1237c8b70..e17e89c52 100644 --- a/src/components/GrampsjsFormEditPlaceName.js +++ b/src/components/GrampsjsFormEditPlaceName.js @@ -5,9 +5,22 @@ Form for adding a new event reference import {html} from 'lit' import './GrampsjsFormString.js' +import './GrampsjsFormSelectDate.js' import {GrampsjsObjectForm} from './GrampsjsObjectForm.js' +import {emptyDate} from '../util.js' class GrampsjsFormEditPlaceName extends GrampsjsObjectForm { + static get properties() { + return { + showDateInput: {type: Boolean}, + } + } + + constructor() { + super() + this.showDateInput = false + } + renderForm() { return html` + ${this.showDateInput + ? html` + + + ` + : ''} ` } + + get isValid() { + return !!this.data.value + } + + _handleFormData(e) { + const originalTarget = e.composedPath()[0] + if (originalTarget.id === 'place-name-value') { + this.data = {...this.data, value: e.detail.data} + } else if (originalTarget.id === 'place-name-date') { + this.data = {...this.data, date: e.detail.data} + } + super._handleFormData(e) + } } window.customElements.define( diff --git a/src/components/GrampsjsFormSelectType.js b/src/components/GrampsjsFormSelectType.js index f81cd95e0..5c2fbaf46 100644 --- a/src/components/GrampsjsFormSelectType.js +++ b/src/components/GrampsjsFormSelectType.js @@ -44,10 +44,6 @@ class GrampsjsFormSelectType extends GrampsjsAppStateMixin(LitElement) { constructor() { super() - this.reset() - } - - reset() { this.disabled = false this.loadingTypes = false this.nocustom = false @@ -66,6 +62,15 @@ class GrampsjsFormSelectType extends GrampsjsAppStateMixin(LitElement) { this._touched = false } + reset() { + this._hasCustomType = false + this._touched = false + const selectElement = this.renderRoot.querySelector('#select-type') + if (selectElement) { + selectElement.select(this.defaultValue) + } + } + updated(changed) { if (changed.has('types')) { const types = this.getTypes() diff --git a/src/components/GrampsjsObject.js b/src/components/GrampsjsObject.js index 1732a4f65..385b4477b 100644 --- a/src/components/GrampsjsObject.js +++ b/src/components/GrampsjsObject.js @@ -61,7 +61,7 @@ const _allTabs = { placeNames: { title: 'Alternate Names', condition: data => data?.alt_names?.length > 0, - conditionEdit: data => data?.alt_names?.length > 0, + conditionEdit: data => 'alt_names' in data, }, map: { title: 'Map', @@ -591,34 +591,33 @@ export class GrampsjsObject extends GrampsjsAppStateMixin(LitElement) { > ` case 'placeNames': - return html` ${this.data.alt_names?.length > 0 + return html` ${this.data.alt_names?.length > 0 || this.edit ? html` ` : ''}` case 'enclosed': return html` ${this.data.placeref_list?.length || this.edit ? html` -

${this._('Enclosed By')}

- - ` +

${this._('Enclosed By')}

+ + ` : ''} ${this.data?.backlinks?.place?.length - ? html`

${this._('Encloses')}

- - ` + ? html`

${this._('Encloses')}

+ ` : ''}` case 'map': return html` ${this.edit @@ -671,7 +670,7 @@ export class GrampsjsObject extends GrampsjsAppStateMixin(LitElement) { > @@ -751,32 +750,35 @@ export class GrampsjsObject extends GrampsjsAppStateMixin(LitElement) { ?editRect="${this.appState.permissions.canEdit}" >` case 'metadata': - return html` ${this.data.attribute_list?.length > 0 || this.edit - ? html`

${this._('Attributes')}

` + return html` + ${this.data.attribute_list?.length > 0 || + (this.edit && 'attribute_list' in this.data) + ? html`

${this._('Attributes')}

+ ` : ''} - ${this.data.address_list?.length > 0 - ? html`

${this._('Addresses')}

` + ? html`

${this._('Addresses')}

+ ` : ''} - - ${this.data.urls?.length || this.edit > 0 - ? html`

${this._('Internet')}

` + ${this.data.urls?.length > 0 || (this.edit && 'urls' in this.data) + ? html`

${this._('Internet')}

+ ` : ''} - ` + ` case 'associations': return html` - ${obj.value} - - ${dateIsEmpty(obj.date) - ? '' - : objProfile?.date_str ?? toDate(obj.date?.dateval)} + + ${obj.value} - - ${false // ${this.edit TODO: implement place name edit - ? this._renderActionBtns(obj.ref, i === 0, i === arr.length - 1) - : ''} + + ${this.profile[i].date_str ?? ''} + ${this.edit ? this._renderActionBtns(i, true) : ''} ` } + + renderAfterTable() { + return html` + ${this.edit + ? html` + + ` + : ''} + ${this.dialogContent} + ` + } + + _handleAdd() { + this.dialogContent = html` + + + ` + } + + _handleEditClick(obj) { + this.dialogContent = html` + + + ` + } + + _handlePlaceNameAdd(e) { + fireEvent(this, 'edit:action', { + action: 'addPlaceName', + data: e.detail.data, + }) + e.preventDefault() + e.stopPropagation() + this.dialogContent = '' + } + + _handlePlaceNameUpdate(e, originalObj) { + const updatedData = {...originalObj, ...e.detail.data} + fireEvent(this, 'edit:action', { + action: 'updatePlaceName', + data: updatedData, + index: this.data.indexOf(originalObj), + }) + e.preventDefault() + e.stopPropagation() + this.dialogContent = '' + } + + _handleCancelDialog() { + this.dialogContent = '' + } + + _renderActionBtns(index) { + return html` + + ` + } + + _handleActionClick(e, action, index) { + fireEvent(this, 'edit:action', {action, index}) + e.preventDefault() + e.stopPropagation() + } } window.customElements.define('grampsjs-place-names', GrampsjsPlaceNames) diff --git a/src/mixins/GrampsjsNewPersonMixin.js b/src/mixins/GrampsjsNewPersonMixin.js new file mode 100644 index 000000000..47071e1b2 --- /dev/null +++ b/src/mixins/GrampsjsNewPersonMixin.js @@ -0,0 +1,239 @@ +import {html} from 'lit' + +import {makeHandle, dateIsEmpty, emptyDate} from '../util.js' + +import '../components/GrampsjsFormSelectObjectList.js' +import '../components/GrampsjsFormSelectDate.js' +import '../components/GrampsjsFormName.js' +import '../components/GrampsjsFormPrivate.js' + +const dataDefault = {_class: 'Person', gender: 2, citation_list: []} + +export const GrampsjsNewPersonMixin = superClass => + class extends superClass { + constructor() { + super() + this.data = dataDefault + } + + gender = { + 2: 'Unknown', + 1: 'Male', + 0: 'Female', + } + + renderForm() { + return html` +

${this._('Name')}

+ + +

${this._('Gender')}

+ + ${Object.keys(this.gender).map( + genderConst => html` + ${this._(this.gender[genderConst])} + ` + )} + + +

${this._('Birth Date')}

+ +

+ + +

+ +

${this._('Birth Place')}

+ + + +

${this._('Death Date')}

+ +

+ + +

+ +

${this._('Death Place')}

+ + + + ${this._renderCitationForm()} + +
+ + ` + } + + _renderCitationForm() { + return html` +

${this._('Citation')}

+ + + ` + } + + handleGender(e) { + this.data = {...this.data, gender: parseInt(e.target.value, 10)} + } + + _handleFormData(e) { + super._handleFormData(e) + const originalTarget = e.composedPath()[0] + if (originalTarget.id === 'primary-name') { + this.data = {...this.data, primary_name: e.detail.data} + } + if (originalTarget.id === 'birth-date') { + this.data = { + ...this.data, + birth: {...this.data.birth, date: e.detail.data ?? emptyDate}, + } + } + if (originalTarget.id === 'birth-place-list') { + this.data = { + ...this.data, + birth: {...this.data.birth, place: e.detail.data[0]}, + } + } + if (originalTarget.id === 'death-date') { + this.data = { + ...this.data, + death: {...this.data.death, date: e.detail.data ?? emptyDate}, + } + } + if (originalTarget.id === 'death-place-list') { + this.data = { + ...this.data, + death: {...this.data.death, place: e.detail.data[0]}, + } + } + this.checkFormValidity() + } + + checkFormValidity() { + let valid = true + this.shadowRoot + .querySelectorAll('grampsjs-form-select-date') + .forEach(element => { + if (!element.isValid()) { + valid = false + } + }) + this.isFormValid = valid + } + + _reset() { + super._reset() + this.data = dataDefault + } + + _processedData() { + const handlePerson = makeHandle() + const handleBirth = makeHandle() + const handleDeath = makeHandle() + const birthString = this.translateTypeName(false, 'event_types', 'Birth') + const deathString = this.translateTypeName(false, 'event_types', 'Death') + const {birth, death, ...person} = this.data + const hasBirth = birth.place || (birth?.date && !dateIsEmpty(birth.date)) + const hasDeath = death.place || (death?.date && !dateIsEmpty(death.date)) + if (!hasBirth && !hasDeath) { + return [person] + } + if (!hasDeath) { + return [ + { + ...person, + handle: handlePerson, + event_ref_list: [{_class: 'EventRef', ref: handleBirth}], + birth_ref_index: 0, + }, + { + ...birth, + _class: 'Event', + handle: handleBirth, + type: birthString, + citation_list: person.citation_list ?? [], + private: person.private ?? false, + }, + ] + } + if (!hasBirth) { + return [ + { + ...person, + handle: handlePerson, + event_ref_list: [{_class: 'EventRef', ref: handleDeath}], + death_ref_index: 0, + }, + { + ...death, + _class: 'Event', + handle: handleDeath, + type: deathString, + citation_list: person.citation_list ?? [], + private: person.private ?? false, + }, + ] + } + return [ + { + ...person, + handle: handlePerson, + event_ref_list: [ + {_class: 'EventRef', ref: handleBirth}, + {_class: 'EventRef', ref: handleDeath}, + ], + birth_ref_index: 0, + death_ref_index: 1, + }, + { + ...birth, + _class: 'Event', + handle: handleBirth, + type: birthString, + citation_list: person.citation_list ?? [], + private: person.private ?? false, + }, + { + ...death, + _class: 'Event', + handle: handleDeath, + type: deathString, + citation_list: person.citation_list ?? [], + private: person.private ?? false, + }, + ] + } + } diff --git a/src/util.js b/src/util.js index 64feef093..1e7645903 100644 --- a/src/util.js +++ b/src/util.js @@ -33,9 +33,10 @@ export function translate(strings, s) { } export function personTitleFromProfile(personProfile) { - return `${personProfile.name_given || '…'} ${ - personProfile.name_surname || '…' - } ${personProfile.name_suffix || ''}`.trim() + return ( + personProfile.name_display || + `${personProfile?.name_given || '…'} ${personProfile?.name_surname || '…'}` + ).trim() } function displaySurname(surname) { @@ -85,8 +86,10 @@ export function renderPerson(personProfile) { >person ${personProfile.name_given || '…'} - ${personProfile.name_surname || '…'}${personProfile.name_display ?? + `${personProfile.name_given || '…'} ${ + personProfile.name_surname || '…' + }`} ${personProfile?.birth?.date diff --git a/src/views/GrampsjsViewFamilies.js b/src/views/GrampsjsViewFamilies.js index 1e2759786..b87c55a2a 100644 --- a/src/views/GrampsjsViewFamilies.js +++ b/src/views/GrampsjsViewFamilies.js @@ -65,12 +65,16 @@ export class GrampsjsViewFamilies extends GrampsjsViewObjectsBase { _formatRow(row) { const formattedRow = { grampsId: row.gramps_id, - father: `${row?.profile?.father?.name_surname || '…'}, ${ - row?.profile?.father?.name_given || '…' - }`, - mother: `${row?.profile?.mother?.name_surname || '…'}, ${ - row?.profile?.mother?.name_given || '…' - }`, + father: + row?.profile?.father?.name_display ?? + `${row?.profile?.father?.name_surname || '…'}, ${ + row?.profile?.father?.name_given || '…' + }`, + mother: + row?.profile?.mother?.name_display ?? + `${row?.profile?.mother?.name_surname || '…'}, ${ + row?.profile?.mother?.name_given || '…' + }`, change: prettyTimeDiffTimestamp(row.change, this.appState.i18n.lang), } return formattedRow diff --git a/src/views/GrampsjsViewNewPerson.js b/src/views/GrampsjsViewNewPerson.js index 1f6541649..f7ec684fc 100644 --- a/src/views/GrampsjsViewNewPerson.js +++ b/src/views/GrampsjsViewNewPerson.js @@ -1,23 +1,13 @@ import {html} from 'lit' import {GrampsjsViewNewObject} from './GrampsjsViewNewObject.js' -import '../components/GrampsjsFormName.js' -import '../components/GrampsjsFormPrivate.js' -import '../components/GrampsjsFormSelectObjectList.js' -import {makeHandle, dateIsEmpty, emptyDate} from '../util.js' +import {GrampsjsNewPersonMixin} from '../mixins/GrampsjsNewPersonMixin.js' -const gender = { - 2: 'Unknown', - 1: 'Male', - 0: 'Female', -} - -const dataDefault = {_class: 'Person', gender: 2, citation_list: []} - -export class GrampsjsViewNewPerson extends GrampsjsViewNewObject { +export class GrampsjsViewNewPerson extends GrampsjsNewPersonMixin( + GrampsjsViewNewObject +) { constructor() { super() - this.data = dataDefault this.postUrl = '/api/objects/' this.itemPath = 'person' this.objClass = 'Person' @@ -26,181 +16,8 @@ export class GrampsjsViewNewPerson extends GrampsjsViewNewObject { renderContent() { return html`

${this._('New Person')}

- -

${this._('Name')}

- - -

${this._('Gender')}

- - ${Object.keys(gender).map( - genderConst => html` - ${this._(gender[genderConst])} - ` - )} - - -

${this._('Birth Date')}

- -

- - -

- -

${this._('Birth Place')}

- - - -

${this._('Death Date')}

- -

- - -

- -

${this._('Death Place')}

- - - - ${this._renderCitationForm()} - -
- - - ${this.renderButtons()} + ${this.renderForm()} ${this.renderButtons()} ` - //
${JSON.stringify(this.data, null, 2)}
- } - - handleGender(e) { - this.data = {...this.data, gender: parseInt(e.target.value, 10)} - } - - _handleFormData(e) { - super._handleFormData(e) - const originalTarget = e.composedPath()[0] - if (originalTarget.id === 'primary-name') { - this.data = {...this.data, primary_name: e.detail.data} - } - if (originalTarget.id === 'birth-date') { - this.data = { - ...this.data, - birth: {...this.data.birth, date: e.detail.data ?? emptyDate}, - } - } - if (originalTarget.id === 'birth-place-list') { - this.data = { - ...this.data, - birth: {...this.data.birth, place: e.detail.data[0]}, - } - } - if (originalTarget.id === 'death-date') { - this.data = { - ...this.data, - death: {...this.data.death, date: e.detail.data ?? emptyDate}, - } - } - if (originalTarget.id === 'death-place-list') { - this.data = { - ...this.data, - death: {...this.data.death, place: e.detail.data[0]}, - } - } - this.checkFormValidity() - } - - _processedData() { - const handlePerson = makeHandle() - const handleBirth = makeHandle() - const handleDeath = makeHandle() - const birthString = this.translateTypeName(false, 'event_types', 'Birth') - const deathString = this.translateTypeName(false, 'event_types', 'Death') - const {birth, death, ...person} = this.data - const hasBirth = birth.place || (birth?.date && !dateIsEmpty(birth.date)) - const hasDeath = death.place || (death?.date && !dateIsEmpty(birth.date)) - if (!hasBirth && !hasDeath) { - return [person] - } - if (!hasDeath) { - return [ - { - ...person, - handle: handlePerson, - event_ref_list: [{_class: 'EventRef', ref: handleBirth}], - birth_ref_index: 0, - }, - { - ...birth, - _class: 'Event', - handle: handleBirth, - type: birthString, - citation_list: person.citation_list ?? [], - }, - ] - } - if (!hasBirth) { - return [ - { - ...person, - handle: handlePerson, - event_ref_list: [{_class: 'EventRef', ref: handleDeath}], - death_ref_index: 0, - }, - { - ...death, - _class: 'Event', - handle: handleDeath, - type: deathString, - citation_list: person.citation_list ?? [], - }, - ] - } - return [ - { - ...person, - handle: handlePerson, - event_ref_list: [ - {_class: 'EventRef', ref: handleBirth}, - {_class: 'EventRef', ref: handleDeath}, - ], - birth_ref_index: 0, - death_ref_index: 1, - }, - { - ...birth, - _class: 'Event', - handle: handleBirth, - type: birthString, - citation_list: person.citation_list ?? [], - }, - { - ...death, - _class: 'Event', - handle: handleDeath, - type: deathString, - citation_list: person.citation_list ?? [], - }, - ] } _submit() { @@ -224,23 +41,6 @@ export class GrampsjsViewNewPerson extends GrampsjsViewNewObject { } }) } - - checkFormValidity() { - let valid = true - this.shadowRoot - .querySelectorAll('grampsjs-form-select-date') - .forEach(element => { - if (!element.isValid()) { - valid = false - } - }) - this.isFormValid = valid - } - - _reset() { - super._reset() - this.data = dataDefault - } } window.customElements.define('grampsjs-view-new-person', GrampsjsViewNewPerson) diff --git a/src/views/GrampsjsViewNewPlace.js b/src/views/GrampsjsViewNewPlace.js index de7455656..8a18f4e9a 100644 --- a/src/views/GrampsjsViewNewPlace.js +++ b/src/views/GrampsjsViewNewPlace.js @@ -41,6 +41,7 @@ export class GrampsjsViewNewPlace extends GrampsjsViewNewObject { id="select-place-type" .appState="${this.appState}" ?loadingTypes="${this.loadingTypes}" + defaultValue="Unknown" typeName="place_types" .types="${this.types}" .typesLocale="${this.typesLocale}" @@ -65,7 +66,6 @@ export class GrampsjsViewNewPlace extends GrampsjsViewNewObject { ${this.renderButtons()} ` - //
${JSON.stringify(this.data, null, 2)}
} handleName(e) { diff --git a/src/views/GrampsjsViewObject.js b/src/views/GrampsjsViewObject.js index 3f2e72711..a02ef118a 100644 --- a/src/views/GrampsjsViewObject.js +++ b/src/views/GrampsjsViewObject.js @@ -452,6 +452,23 @@ export class GrampsjsViewObject extends GrampsjsView { ) } else if (e.detail.action === 'updateName') { this.updateName(e.detail.data, this._data) + } else if (e.detail.action === 'addPlaceName') { + this.addObject(e.detail.data, this._data, this._className, 'alt_names') + } else if (e.detail.action === 'updatePlaceName') { + this.updateObjectByIndex( + e.detail.index, + e.detail.data, + this._data, + this._className, + 'alt_names' + ) + } else if (e.detail.action === 'delPlaceName') { + this.delObjectByIndex( + e.detail.index, + this._data, + this._className, + 'alt_names' + ) } else if (e.detail.action === 'delChildRef') { this.delObject( e.detail.handle, @@ -633,7 +650,7 @@ export class GrampsjsViewObject extends GrampsjsView { } // add an object to a list of objects - // e.g. an event references to the event_ref_list + // e.g. an event reference to the event_ref_list addObject(data, obj, objType, prop) { return this._updateObject(obj, objType, _obj => { _obj[prop] = [..._obj[prop], data]