From 5dea652860083af7b50884fdacdb86224c90ac8e Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:56:56 -0500 Subject: [PATCH 001/115] Add renderer for taxon tree def items --- .../lib/components/Preferences/Renderers.tsx | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 0af5d46b5a2..af6b5982744 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -3,7 +3,7 @@ * Most use the default renderes, but there are some exceptions */ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { usePromise } from '../../hooks/useAsyncState'; import { useTriggerState } from '../../hooks/useTriggerState'; @@ -27,7 +27,7 @@ import { ReadOnlyContext } from '../Core/Contexts'; import type { AnySchema } from '../DataModel/helperTypes'; import type { SpecifyTable } from '../DataModel/specifyTable'; import { tables } from '../DataModel/tables'; -import type { Collection } from '../DataModel/types'; +import type { Collection, TaxonTreeDefItem } from '../DataModel/types'; import { rawMenuItemsPromise } from '../Header/menuItemDefinitions'; import { useMenuItems, useUserTools } from '../Header/menuItemProcessing'; import { AttachmentPicker } from '../Molecules/AttachmentPicker'; @@ -378,3 +378,43 @@ export function DefaultPreferenceItemRender({ /> ); } + +export async function fetchTaxonTreeDefItems(): Promise<{ rankId: number; name: string }[]> { + const response = await fetch('/api/specify/taxontreedefitem/'); + if (!response.ok) throw new Error('Failed to fetch TaxonTreeDefItems'); + const data = await response.json(); + return (data.objects ?? []).map((item: any) => ({ + rankId: item.rankid, + name: item.name, + })); +} + +export function ThresholdRank({ + value, + onChange, +}: PreferenceRendererProps): JSX.Element { + const [items, setItems] = useState<{ rankId: number; name: string }[]>([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + fetchTaxonTreeDefItems() + .then(setItems) + .finally(() => setLoading(false)); + }, []); + + if (loading) return <>{commonText.loading()}; + + return ( + + ); +} From 444b04f76ee052cb8a16ae0263bd2c94d542b500 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:57:15 -0500 Subject: [PATCH 002/115] Add threshold rank preference --- .../lib/components/Preferences/UserDefinitions.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index 629d1d4d0a6..a296d742f2b 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -51,6 +51,7 @@ import { FontFamilyPreferenceItem, HeaderItemsPreferenceItem, WelcomePageModePreferenceItem, + ThresholdRank, } from './Renderers'; import type { GenericPreferences, PreferencesVisibilityContext } from './types'; import { definePref } from './types'; @@ -1463,6 +1464,15 @@ export const userPreferenceDefinitions = { defaultValue: true, type: 'java.lang.Boolean', }), + taxonRankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: ThresholdRank, + container: 'label', + }), }, }, storage: { From 3c25958b799894321e6f15f16b6eaac5a0241ef3 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 20:57:19 -0500 Subject: [PATCH 003/115] Update preferences.ts --- .../js_src/lib/localization/preferences.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index cecc515b83c..9e980dd2746 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -128,6 +128,21 @@ export const preferencesText = createDictionary({ 'de-ch': 'Nicht erforderliche Animationen und Übergänge deaktivieren.', 'pt-br': 'Desabilite animações e transições não essenciais.', }, + rankThreshold: { + 'en-us': 'Show object count', + }, + rankThresholdDescription: { + 'en-us': 'Show the count of Collection Objects for all ranks including and below this one.', + 'ru-ru': + 'Показывать количество объектов коллекции для всех рангов, включая и ниже этого.', + 'es-es': 'Mostrar la cantidad de objetos de colección para todos los rangos, incluidos y por debajo de este.', + 'fr-fr': + 'Afficher le nombre d\'objets de collection pour tous les rangs, y compris et en dessous de celui-ci.', + 'uk-ua': 'Показати кількість об\'єктів колекції для всіх рангів, включаючи та нижче цього.', + 'de-ch': + 'Anzahl der Sammlungsobjekte für alle Ränge einschließlich und unterhalb dieses Rangs anzeigen.', + 'pt-br': 'Mostrar a contagem de Objetos de Coleção para todos os ranks, incluindo e abaixo deste.', + }, reduceTransparency: { 'en-us': 'Reduce transparency', 'ru-ru': 'Уменьшить прозрачность', From cc2fbe62b76186538597d34977d0b3bca6cd545b Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:02:12 -0500 Subject: [PATCH 004/115] Update Renderers.tsx --- .../frontend/js_src/lib/components/Preferences/Renderers.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index af6b5982744..a7780968041 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -27,7 +27,7 @@ import { ReadOnlyContext } from '../Core/Contexts'; import type { AnySchema } from '../DataModel/helperTypes'; import type { SpecifyTable } from '../DataModel/specifyTable'; import { tables } from '../DataModel/tables'; -import type { Collection, TaxonTreeDefItem } from '../DataModel/types'; +import type { Collection } from '../DataModel/types'; import { rawMenuItemsPromise } from '../Header/menuItemDefinitions'; import { useMenuItems, useUserTools } from '../Header/menuItemProcessing'; import { AttachmentPicker } from '../Molecules/AttachmentPicker'; From 2ae849728f9d2d34626b6a9170e825c1c06994a2 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:12:09 -0500 Subject: [PATCH 005/115] Update remotePrefs.test.ts.snap --- .../__tests__/__snapshots__/remotePrefs.test.ts.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap index c03e1bb1729..81c8500b492 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap @@ -50,6 +50,7 @@ exports[`fetches and parses remotePrefs correctly 1`] = ` "SubPaneMgr.MaxPanes": "12", "SymbiotaTask.BaseUrlPref": "http\\\\://pinkava.asu.edu/symbiota/sandbox/webservices/dwc/dwcaingesthandler.php", "SymbiotaTask.SHOW_TASK_PREF.fish": "false", + "TaxonTreeEditor.DisplayAuthor": "true", "Testing2": "", "TreeEditor.Rank.Threshold.Geography": "100", "TreeEditor.Rank.Threshold.GeologicTimePeriod": "0", From 8806806c5c3768d34e9857ae3a4a55c54fcfdc91 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 21:51:36 -0500 Subject: [PATCH 006/115] Update renderer to be generic across tree tables --- .../lib/components/Preferences/Renderers.tsx | 35 +++++------ .../Preferences/UserDefinitions.tsx | 61 ++++++++++++++++++- 2 files changed, 74 insertions(+), 22 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index a7780968041..8fa3c23f978 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -392,29 +392,24 @@ export async function fetchTaxonTreeDefItems(): Promise<{ rankId: number; name: export function ThresholdRank({ value, onChange, -}: PreferenceRendererProps): JSX.Element { - const [items, setItems] = useState<{ rankId: number; name: string }[]>([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - fetchTaxonTreeDefItems() - .then(setItems) - .finally(() => setLoading(false)); - }, []); - - if (loading) return <>{commonText.loading()}; + tableName, +}: PreferenceRendererProps & { tableName: string }): JSX.Element { + const [items, setItems] = React.useState<{ rankId: number; name: string }[]>([]); + React.useEffect(() => { + fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) + .then(res => res.json()) + .then(data => setItems((data.objects ?? []).map((item: any) => ({ + rankId: item.rankid, + name: item.name, + })))); + }, [tableName]); return ( - onChange(Number(e.target.value))}> + {items.map(({ rankId, name }) => ( - + ))} - + ); } diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index a296d742f2b..cf6d64b1d30 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1436,6 +1436,17 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + rankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: (props) => ( + + ), + container: 'label', + }), }, }, taxon: { @@ -1464,13 +1475,15 @@ export const userPreferenceDefinitions = { defaultValue: true, type: 'java.lang.Boolean', }), - taxonRankThreshold: definePref({ + rankThreshold: definePref({ title: preferencesText.rankThreshold(), description: preferencesText.rankThresholdDescription(), requiresReload: true, visible: true, defaultValue: 0, - renderer: ThresholdRank, + renderer: (props) => ( + + ), container: 'label', }), }, @@ -1494,6 +1507,17 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + rankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: (props) => ( + + ), + container: 'label', + }), }, }, geologicTimePeriod: { @@ -1515,6 +1539,17 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + rankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: (props) => ( + + ), + container: 'label', + }), }, }, lithoStrat: { @@ -1536,6 +1571,17 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + rankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: (props) => ( + + ), + container: 'label', + }), }, }, tectonicUnit: { @@ -1557,6 +1603,17 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + rankThreshold: definePref({ + title: preferencesText.rankThreshold(), + description: preferencesText.rankThresholdDescription(), + requiresReload: true, + visible: true, + defaultValue: 0, + renderer: (props) => ( + + ), + container: 'label', + }), }, }, }, From c760d44465a70e5c5fd746431aa6d33f6bf8d2f6 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:07:26 -0500 Subject: [PATCH 007/115] Use user preference instead of remotePref --- specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx index 19c3fe432ee..4d834453533 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx @@ -98,8 +98,10 @@ export function Tree< 'synonymColor' ); - const statsThreshold = getPref( - `TreeEditor.Rank.Threshold.${tableName as 'Geography'}` + const [statsThreshold] = userPreferences.use( + 'treeEditor', + treeToPref[tableName], + 'rankThreshold' ); const getStats = React.useCallback( async (nodeId: number | 'null', rankId: number): Promise => From 25217bfd9e3fcf4c55d493469387a9416096c3b9 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:11:52 -0500 Subject: [PATCH 008/115] Remove unused imports --- .../frontend/js_src/lib/components/Preferences/Renderers.tsx | 2 -- specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx | 1 - 2 files changed, 3 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 8fa3c23f978..5dbfc5e5706 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -3,8 +3,6 @@ * Most use the default renderes, but there are some exceptions */ -import React, { useEffect, useState } from 'react'; - import { usePromise } from '../../hooks/useAsyncState'; import { useTriggerState } from '../../hooks/useTriggerState'; import { useValidation } from '../../hooks/useValidation'; diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx index 4d834453533..547dd500661 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx @@ -19,7 +19,6 @@ import { idFromUrl } from '../DataModel/resource'; import { deserializeResource } from '../DataModel/serializers'; import { softError } from '../Errors/assert'; import { ResourceView } from '../Forms/ResourceView'; -import { getPref } from '../InitialContext/remotePrefs'; import { hasTablePermission } from '../Permissions/helpers'; import { useHighContrast } from '../Preferences/Hooks'; import { userPreferences } from '../Preferences/userPreferences'; From 30c35c6ebeeff89bb24cbbb53f59fb6082ee4a2a Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:18:30 -0500 Subject: [PATCH 009/115] Update Renderers.tsx --- .../frontend/js_src/lib/components/Preferences/Renderers.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 5dbfc5e5706..679a17ed415 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -3,6 +3,8 @@ * Most use the default renderes, but there are some exceptions */ +import React from 'react'; + import { usePromise } from '../../hooks/useAsyncState'; import { useTriggerState } from '../../hooks/useTriggerState'; import { useValidation } from '../../hooks/useValidation'; From e80d3b7c1a6c765031b5048be40033fbd224a4c8 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 1 Jul 2025 03:22:36 +0000 Subject: [PATCH 010/115] Lint code with ESLint and Prettier Triggered by 30c35c6ebeeff89bb24cbbb53f59fb6082ee4a2a on branch refs/heads/issue-6843 --- .../js_src/lib/components/Preferences/Renderers.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 679a17ed415..663d11a4975 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -379,7 +379,7 @@ export function DefaultPreferenceItemRender({ ); } -export async function fetchTaxonTreeDefItems(): Promise<{ rankId: number; name: string }[]> { +export async function fetchTaxonTreeDefItems(): Promise { const response = await fetch('/api/specify/taxontreedefitem/'); if (!response.ok) throw new Error('Failed to fetch TaxonTreeDefItems'); const data = await response.json(); @@ -393,11 +393,11 @@ export function ThresholdRank({ value, onChange, tableName, -}: PreferenceRendererProps & { tableName: string }): JSX.Element { - const [items, setItems] = React.useState<{ rankId: number; name: string }[]>([]); +}: PreferenceRendererProps & { readonly tableName: string }): JSX.Element { + const [items, setItems] = React.useState([]); React.useEffect(() => { fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) - .then(res => res.json()) + .then(async res => res.json()) .then(data => setItems((data.objects ?? []).map((item: any) => ({ rankId: item.rankid, name: item.name, From 68a187d4da5b74f474f151acde83d212991ca40c Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 22:30:19 -0500 Subject: [PATCH 011/115] Correct description --- specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx | 1 + specifyweb/frontend/js_src/lib/localization/preferences.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx index 547dd500661..4134fcf320e 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx @@ -102,6 +102,7 @@ export function Tree< treeToPref[tableName], 'rankThreshold' ); + const getStats = React.useCallback( async (nodeId: number | 'null', rankId: number): Promise => rankId >= statsThreshold diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 9e980dd2746..8da53179f45 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -132,7 +132,7 @@ export const preferencesText = createDictionary({ 'en-us': 'Show object count', }, rankThresholdDescription: { - 'en-us': 'Show the count of Collection Objects for all ranks including and below this one.', + 'en-us': 'Show the count of Collection Objects for all ranks below this one.', 'ru-ru': 'Показывать количество объектов коллекции для всех рангов, включая и ниже этого.', 'es-es': 'Mostrar la cantidad de objetos de colección para todos los rangos, incluidos y por debajo de este.', From d18394c75bf98658c138300b18d8cf04922d7750 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 1 Jul 2025 03:34:29 +0000 Subject: [PATCH 012/115] Lint code with ESLint and Prettier Triggered by 95c7c50dca8187814ae71455c37e3162e4ce2de1 on branch refs/heads/issue-6843 --- .../js_src/lib/localization/preferences.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 8da53179f45..5bd31d90854 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -132,16 +132,20 @@ export const preferencesText = createDictionary({ 'en-us': 'Show object count', }, rankThresholdDescription: { - 'en-us': 'Show the count of Collection Objects for all ranks below this one.', + 'en-us': + 'Show the count of Collection Objects for all ranks below this one.', 'ru-ru': 'Показывать количество объектов коллекции для всех рангов, включая и ниже этого.', - 'es-es': 'Mostrar la cantidad de objetos de colección para todos los rangos, incluidos y por debajo de este.', + 'es-es': + 'Mostrar la cantidad de objetos de colección para todos los rangos, incluidos y por debajo de este.', 'fr-fr': - 'Afficher le nombre d\'objets de collection pour tous les rangs, y compris et en dessous de celui-ci.', - 'uk-ua': 'Показати кількість об\'єктів колекції для всіх рангів, включаючи та нижче цього.', + "Afficher le nombre d'objets de collection pour tous les rangs, y compris et en dessous de celui-ci.", + 'uk-ua': + "Показати кількість об'єктів колекції для всіх рангів, включаючи та нижче цього.", 'de-ch': 'Anzahl der Sammlungsobjekte für alle Ränge einschließlich und unterhalb dieses Rangs anzeigen.', - 'pt-br': 'Mostrar a contagem de Objetos de Coleção para todos os ranks, incluindo e abaixo deste.', + 'pt-br': + 'Mostrar a contagem de Objetos de Coleção para todos os ranks, incluindo e abaixo deste.', }, reduceTransparency: { 'en-us': 'Reduce transparency', @@ -708,7 +712,7 @@ export const preferencesText = createDictionary({ 'en-us': 'Show author in the tree', 'ru-ru': 'Показать автора в дереве', 'es-es': 'Mostrar autor en el árbol', - 'fr-fr': 'Afficher l\'auteur dans l\'arbre', + 'fr-fr': "Afficher l'auteur dans l'arbre", 'uk-ua': 'Показати автора в дереві', 'de-ch': 'Autor im Baum anzeigen', 'pt-br': 'Mostrar autoria', From 539027d7b2fd37f7c630dd027b4ec23f002dc42c Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:03:58 -0500 Subject: [PATCH 013/115] Remove unused function --- .../js_src/lib/components/Preferences/Renderers.tsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 663d11a4975..973044d958e 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -379,16 +379,6 @@ export function DefaultPreferenceItemRender({ ); } -export async function fetchTaxonTreeDefItems(): Promise { - const response = await fetch('/api/specify/taxontreedefitem/'); - if (!response.ok) throw new Error('Failed to fetch TaxonTreeDefItems'); - const data = await response.json(); - return (data.objects ?? []).map((item: any) => ({ - rankId: item.rankid, - name: item.name, - })); -} - export function ThresholdRank({ value, onChange, From 430e743918f3d422699cf350b94a617c340c6cae Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:04:32 -0500 Subject: [PATCH 014/115] Update specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../js_src/lib/components/Preferences/Renderers.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 973044d958e..ee39eb9160c 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -387,11 +387,18 @@ export function ThresholdRank({ const [items, setItems] = React.useState([]); React.useEffect(() => { fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) - .then(async res => res.json()) + .then(async res => { + if (!res.ok) throw new Error('Failed to fetch ThresholdRank items'); + return res.json(); + }) .then(data => setItems((data.objects ?? []).map((item: any) => ({ rankId: item.rankid, name: item.name, - })))); + })))) + .catch(error => { + console.error('Error fetching ThresholdRank items:', error); + setItems([]); + }); }, [tableName]); return ( From e7c7afe032c7f1e0d4195ca37f9482a0107ff90d Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:06:26 -0500 Subject: [PATCH 015/115] Remove 'none' option --- .../frontend/js_src/lib/components/Preferences/Renderers.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 973044d958e..505b6441eda 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -396,7 +396,6 @@ export function ThresholdRank({ return ( onChange(Number(e.target.value))}> + {items.map(({ rankId, name }) => ( ))} From 098d3618f27fd06aeb4d76827537ba332ce6dc7e Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:12:01 -0500 Subject: [PATCH 018/115] Update preferences.ts --- specifyweb/frontend/js_src/lib/localization/preferences.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 7b30375f677..3a9e293ab5d 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -129,7 +129,7 @@ export const preferencesText = createDictionary({ 'pt-br': 'Desabilite animações e transições não essenciais.', }, rankThreshold: { - 'en-us': 'Show object count', + 'en-us': 'Show object count below', }, rankThresholdDescription: { 'en-us': From 48314b3545ed0beed8dadc650a6a51e6fbd44b83 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 1 Jul 2025 09:13:52 -0500 Subject: [PATCH 019/115] Use RA<> Suggested by @CarolineDenis --- .../frontend/js_src/lib/components/Preferences/Renderers.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index ee39eb9160c..87276093e94 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -384,7 +384,7 @@ export function ThresholdRank({ onChange, tableName, }: PreferenceRendererProps & { readonly tableName: string }): JSX.Element { - const [items, setItems] = React.useState([]); + const [items, setItems] = React.useState>([]); React.useEffect(() => { fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) .then(async res => { From 86a8e33360df20f76632b34390c9e88a9dc6545f Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 1 Jul 2025 11:39:32 -0500 Subject: [PATCH 020/115] Order ranks --- .../lib/components/Preferences/Renderers.tsx | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 87276093e94..fadf081adbf 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -379,23 +379,36 @@ export function DefaultPreferenceItemRender({ ); } +type Rank = { rankId: number; name: string }; + +// This grabs the ranks from the API and displays them in a dropdown +// The ranks are sorted in ascending order by `rankId` so they appear in the correct order for the user export function ThresholdRank({ value, onChange, tableName, }: PreferenceRendererProps & { readonly tableName: string }): JSX.Element { - const [items, setItems] = React.useState>([]); + const [items, setItems] = React.useState([]); React.useEffect(() => { fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) .then(async res => { if (!res.ok) throw new Error('Failed to fetch ThresholdRank items'); return res.json(); }) - .then(data => setItems((data.objects ?? []).map((item: any) => ({ - rankId: item.rankid, - name: item.name, - })))) - .catch(error => { + .then((data: { objects?: Array<{ rankid: number; name: string }> }) => + setItems( + (data.objects ?? []) + .map( + // Map the results to the Rank type + (item: { rankid: number; name: string }): Rank => ({ + rankId: item.rankid, + name: item.name, + }) + ) // This sorts the ranks so they appear in ascending order in the dropdown + .sort((rankA, rankB) => rankA.rankId - rankB.rankId) + ) + ) + .catch((error: unknown) => { console.error('Error fetching ThresholdRank items:', error); setItems([]); }); From 4f08ce20a50762d0273e6ea1868728dc78baadb5 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 1 Jul 2025 16:43:31 +0000 Subject: [PATCH 021/115] Lint code with ESLint and Prettier Triggered by 86a8e33360df20f76632b34390c9e88a9dc6545f on branch refs/heads/issue-6843 --- .../lib/components/Preferences/Renderers.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index fadf081adbf..48fe82b7838 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -379,28 +379,30 @@ export function DefaultPreferenceItemRender({ ); } -type Rank = { rankId: number; name: string }; +type Rank = { readonly rankId: number; readonly name: string }; -// This grabs the ranks from the API and displays them in a dropdown -// The ranks are sorted in ascending order by `rankId` so they appear in the correct order for the user +/* + * This grabs the ranks from the API and displays them in a dropdown + * The ranks are sorted in ascending order by `rankId` so they appear in the correct order for the user + */ export function ThresholdRank({ value, onChange, tableName, }: PreferenceRendererProps & { readonly tableName: string }): JSX.Element { - const [items, setItems] = React.useState([]); + const [items, setItems] = React.useState([]); React.useEffect(() => { fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) .then(async res => { if (!res.ok) throw new Error('Failed to fetch ThresholdRank items'); return res.json(); }) - .then((data: { objects?: Array<{ rankid: number; name: string }> }) => + .then((data: { readonly objects?: readonly { readonly rankid: number; readonly name: string }[] }) => setItems( (data.objects ?? []) .map( // Map the results to the Rank type - (item: { rankid: number; name: string }): Rank => ({ + (item: { readonly rankid: number; readonly name: string }): Rank => ({ rankId: item.rankid, name: item.name, }) From 7a2eff4d4bc9b3e8413351d60bc8f07a1a99ba97 Mon Sep 17 00:00:00 2001 From: Jason Melton <64045831+melton-jason@users.noreply.github.com> Date: Mon, 7 Jul 2025 20:51:08 +0000 Subject: [PATCH 022/115] Lint code with ESLint and Prettier Triggered by 5d91e2077eff38cabd1e4b601f83a7ce2a4683fd on branch refs/heads/issue-6843 --- .../AppResources/__tests__/useAppResources.test.ts | 12 ++++++------ .../lib/components/Preferences/UserDefinitions.tsx | 6 ++---- .../frontend/js_src/lib/hooks/useAsyncStateMock.ts | 6 ++++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/useAppResources.test.ts b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/useAppResources.test.ts index b60ee212e16..43f7dd3891c 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/useAppResources.test.ts +++ b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/useAppResources.test.ts @@ -1,16 +1,16 @@ import { renderHook, waitFor } from '@testing-library/react'; +import { useAsyncStateMock } from '../../../hooks/useAsyncStateMock'; import { overrideAjax } from '../../../tests/ajax'; import { requireContext } from '../../../tests/helpers'; import type { RA } from '../../../utils/types'; import { useAppResources } from '../hooks'; import { staticAppResources } from './staticAppResources'; -import { useAsyncStateMock } from '../../../hooks/useAsyncStateMock'; -const mockFn = jest.fn(); +const mockFunction = jest.fn(); function mockState(callback: () => Promise | undefined) { - useAsyncStateMock(callback, mockFn); + useAsyncStateMock(callback, mockFunction); return [undefined, undefined]; } @@ -25,7 +25,7 @@ jest.mock('../../../hooks/useAsyncState', () => { requireContext(); beforeAll(() => { - mockFn.mockClear(); + mockFunction.mockClear(); }); describe('useAppResources', () => { @@ -69,8 +69,8 @@ describe('useAppResources', () => { renderHook(() => useAppResources(false)); await waitFor(() => { - expect(mockFn).toBeCalledTimes(1); - expect(mockFn.mock.lastCall).toEqual([staticAppResources]); + expect(mockFunction).toHaveBeenCalledTimes(1); + expect(mockFunction.mock.lastCall).toEqual([staticAppResources]); }); }); }); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index 49c10b430ed..f110cd76e42 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -50,8 +50,8 @@ import { defaultFont, FontFamilyPreferenceItem, HeaderItemsPreferenceItem, - WelcomePageModePreferenceItem, ThresholdRank, + WelcomePageModePreferenceItem, } from './Renderers'; import type { GenericPreferences, PreferencesVisibilityContext } from './types'; import { definePref } from './types'; @@ -1497,9 +1497,7 @@ export const userPreferenceDefinitions = { requiresReload: true, visible: true, defaultValue: 0, - renderer: (props) => ( - - ), + renderer: (props) => , container: 'label', }), }, diff --git a/specifyweb/frontend/js_src/lib/hooks/useAsyncStateMock.ts b/specifyweb/frontend/js_src/lib/hooks/useAsyncStateMock.ts index 9644205b634..ea1d32dd688 100644 --- a/specifyweb/frontend/js_src/lib/hooks/useAsyncStateMock.ts +++ b/specifyweb/frontend/js_src/lib/hooks/useAsyncStateMock.ts @@ -1,5 +1,7 @@ -// Like useAsyncState, but calls the callback function rather than updating the state. -// Actually, useAsyncState can be refactored to use this +/* + * Like useAsyncState, but calls the callback function rather than updating the state. + * Actually, useAsyncState can be refactored to use this + */ import React from 'react'; From c81eafca9c22840c7bc8bf6fcd0739df394a8650 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Thu, 24 Jul 2025 03:19:08 +0000 Subject: [PATCH 023/115] Lint code with ESLint and Prettier Triggered by d7632f6d0133e1fea80abfc86df7cb637fb9bc34 on branch refs/heads/issue-6843 --- .../js_src/lib/localization/locality.ts | 908 ++++----- .../frontend/js_src/lib/localization/main.ts | 424 ++-- .../frontend/js_src/lib/localization/query.ts | 1500 +++++++-------- .../js_src/lib/localization/schema.ts | 842 ++++---- .../js_src/lib/localization/specifyNetwork.ts | 300 +-- .../frontend/js_src/lib/localization/user.ts | 1710 ++++++++--------- .../js_src/lib/localization/wbPlan.ts | 1038 +++++----- .../js_src/lib/localization/welcome.ts | 310 +-- 8 files changed, 3516 insertions(+), 3516 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/locality.ts b/specifyweb/frontend/js_src/lib/localization/locality.ts index 6d8ca9f6a51..53086da596f 100644 --- a/specifyweb/frontend/js_src/lib/localization/locality.ts +++ b/specifyweb/frontend/js_src/lib/localization/locality.ts @@ -4,590 +4,590 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const localityText = createDictionary({ openMap: { - "en-us": "Open Map", - "ru-ru": "Открыть карту", - "es-es": "Abrir mapa", - "fr-fr": "Ouvrir la carte", - "uk-ua": "Відкрийте карту", - "de-ch": "Karte öffnen", - "pt-br": "Mapa aberto", + 'en-us': 'Open Map', + 'ru-ru': 'Открыть карту', + 'es-es': 'Abrir mapa', + 'fr-fr': 'Ouvrir la carte', + 'uk-ua': 'Відкрийте карту', + 'de-ch': 'Karte öffnen', + 'pt-br': 'Mapa aberto', }, geoMap: { - "en-us": "GeoMap", - "ru-ru": "Карта", - "es-es": "GeoMap", - "fr-fr": "GeoMap", - "uk-ua": "Геокарта", - "de-ch": "Karte", - "pt-br": "GeoMap", + 'en-us': 'GeoMap', + 'ru-ru': 'Карта', + 'es-es': 'GeoMap', + 'fr-fr': 'GeoMap', + 'uk-ua': 'Геокарта', + 'de-ch': 'Karte', + 'pt-br': 'GeoMap', }, queryMapSubset: { - comment: "Used in GeoMap header while records are still being fetched", - "en-us": - "GeoMap - Plotted {plotted:number|formatted} of {total:number|formatted} records", - "ru-ru": - "Карта - Отображено {plotted:number|formatted} из {total:number|formatted} записей", - "es-es": - "GeoMap - Trazado {plotted:number|formatted} de {total:number|formatted} registros", - "fr-fr": - "GeoMap - {plotted:number|formatted} sur {total:number|formatted} enregistrements placés", - "uk-ua": - "GeoMap - нанесено {plotted:number|formatted} із {total:number|formatted} записів", - "de-ch": - "GeoMap hat {plotted:number|formatted} von {total:number|formatted} Datensätzen gezeichnet", - "pt-br": - "GeoMap - Plotado {plotted:number|formatted} de {total:number|formatted} registros", + comment: 'Used in GeoMap header while records are still being fetched', + 'en-us': + 'GeoMap - Plotted {plotted:number|formatted} of {total:number|formatted} records', + 'ru-ru': + 'Карта - Отображено {plotted:number|formatted} из {total:number|formatted} записей', + 'es-es': + 'GeoMap - Trazado {plotted:number|formatted} de {total:number|formatted} registros', + 'fr-fr': + 'GeoMap - {plotted:number|formatted} sur {total:number|formatted} enregistrements placés', + 'uk-ua': + 'GeoMap - нанесено {plotted:number|formatted} із {total:number|formatted} записів', + 'de-ch': + 'GeoMap hat {plotted:number|formatted} von {total:number|formatted} Datensätzen gezeichnet', + 'pt-br': + 'GeoMap - Plotado {plotted:number|formatted} de {total:number|formatted} registros', }, queryMapAll: { - "en-us": "GeoMap - Plotted {plotted:number|formatted} records", - "ru-ru": "Карта - Отображено {plotted:number|formatted} записей", - "es-es": "GeoMap - {plotted:number|formatted} registros trazados", - "fr-fr": "GéoCarte - {plotted:number|formatted} enregistrements placés", - "uk-ua": "GeoMap - Нанесені записи {plotted:number|formatted}.", - "de-ch": "GeoMap hat {plotted:number|formatted} Datensätze gezeichnet", - "pt-br": "GeoMap - Registros plotados {plotted:number|formatted}", + 'en-us': 'GeoMap - Plotted {plotted:number|formatted} records', + 'ru-ru': 'Карта - Отображено {plotted:number|formatted} записей', + 'es-es': 'GeoMap - {plotted:number|formatted} registros trazados', + 'fr-fr': 'GéoCarte - {plotted:number|formatted} enregistrements placés', + 'uk-ua': 'GeoMap - Нанесені записи {plotted:number|formatted}.', + 'de-ch': 'GeoMap hat {plotted:number|formatted} Datensätze gezeichnet', + 'pt-br': 'GeoMap - Registros plotados {plotted:number|formatted}', }, polygonBoundaries: { - "en-us": "Polygon Boundaries", - "ru-ru": "Границы многоугольника", - "es-es": "Límites de polígono", - "fr-fr": "Limites du polygone", - "uk-ua": "Межі багатокутників", - "de-ch": "Polygon-Grenzen", - "pt-br": "Limites de polígonos", + 'en-us': 'Polygon Boundaries', + 'ru-ru': 'Границы многоугольника', + 'es-es': 'Límites de polígono', + 'fr-fr': 'Limites du polygone', + 'uk-ua': 'Межі багатокутників', + 'de-ch': 'Polygon-Grenzen', + 'pt-br': 'Limites de polígonos', }, errorRadius: { - "en-us": "Error Radius", - "ru-ru": "Радиус ошибки", - "es-es": "Radio de error", - "fr-fr": "Rayon d'erreur", - "uk-ua": "Радіус помилки", - "de-ch": "Fehlerradius", - "pt-br": "Raio de erro", + 'en-us': 'Error Radius', + 'ru-ru': 'Радиус ошибки', + 'es-es': 'Radio de error', + 'fr-fr': "Rayon d'erreur", + 'uk-ua': 'Радіус помилки', + 'de-ch': 'Fehlerradius', + 'pt-br': 'Raio de erro', }, showMap: { - "en-us": "Show Map", - "ru-ru": "Показать карту", - "es-es": "Mostrar mapa", - "fr-fr": "Afficher la carte", - "uk-ua": "Показати карту", - "de-ch": "Karte anzeigen", - "pt-br": "Mostrar mapa", + 'en-us': 'Show Map', + 'ru-ru': 'Показать карту', + 'es-es': 'Mostrar mapa', + 'fr-fr': 'Afficher la carte', + 'uk-ua': 'Показати карту', + 'de-ch': 'Karte anzeigen', + 'pt-br': 'Mostrar mapa', }, noCoordinates: { - "en-us": "No coordinates", - "ru-ru": "Нет координат", - "es-es": "Sin coordenadas", - "fr-fr": "Pas de coordonnées", - "uk-ua": "Без координат", - "de-ch": "Keine Koordinaten", - "pt-br": "Sem coordenadas", + 'en-us': 'No coordinates', + 'ru-ru': 'Нет координат', + 'es-es': 'Sin coordenadas', + 'fr-fr': 'Pas de coordonnées', + 'uk-ua': 'Без координат', + 'de-ch': 'Keine Koordinaten', + 'pt-br': 'Sem coordenadas', }, notEnoughInformationToMap: { - "en-us": "{localityTable:string} must have coordinates to be mapped.", - "ru-ru": - "Чтобы нанести {localityTable:string} на карту, необходимо указать координаты.", - "es-es": "{localityTable:string} debe tener coordenadas para ser mapeadas.", - "fr-fr": - "{localityTable:string} doit avoir des coordonnées pour être cartographié.", - "uk-ua": "{localityTable:string} має мати координати для відображення.", - "de-ch": - "{localityTable:string} muss Koordinaten haben, um kartiert werden zu können.", - "pt-br": "{localityTable:string} deve ter coordenadas para ser mapeado.", + 'en-us': '{localityTable:string} must have coordinates to be mapped.', + 'ru-ru': + 'Чтобы нанести {localityTable:string} на карту, необходимо указать координаты.', + 'es-es': '{localityTable:string} debe tener coordenadas para ser mapeadas.', + 'fr-fr': + '{localityTable:string} doit avoir des coordonnées pour être cartographié.', + 'uk-ua': '{localityTable:string} має мати координати для відображення.', + 'de-ch': + '{localityTable:string} muss Koordinaten haben, um kartiert werden zu können.', + 'pt-br': '{localityTable:string} deve ter coordenadas para ser mapeado.', }, occurrencePoints: { - "en-us": "Pins", - "ru-ru": "Точки", - "es-es": "Patas", - "fr-fr": "Épingles", - "uk-ua": "Шпильки", - "de-ch": "Stecknadeln", - "pt-br": "Alfinetes", + 'en-us': 'Pins', + 'ru-ru': 'Точки', + 'es-es': 'Patas', + 'fr-fr': 'Épingles', + 'uk-ua': 'Шпильки', + 'de-ch': 'Stecknadeln', + 'pt-br': 'Alfinetes', }, occurrencePolygons: { - "en-us": "Polygons", - "ru-ru": "Полигоны", - "es-es": "Polígonos", - "fr-fr": "Polygones", - "uk-ua": "Багатокутники", - "de-ch": "Polygone", - "pt-br": "Polígonos", + 'en-us': 'Polygons', + 'ru-ru': 'Полигоны', + 'es-es': 'Polígonos', + 'fr-fr': 'Polygones', + 'uk-ua': 'Багатокутники', + 'de-ch': 'Polygone', + 'pt-br': 'Polígonos', }, geoLocate: { - "en-us": "GEOLocate", - "ru-ru": "GEOLocate", - "es-es": "GEOlocalizar", - "fr-fr": "GEOLocate", - "uk-ua": "GEOLocate", - "de-ch": "GEO Lokalisierung", - "pt-br": "GEOLocate", + 'en-us': 'GEOLocate', + 'ru-ru': 'GEOLocate', + 'es-es': 'GEOlocalizar', + 'fr-fr': 'GEOLocate', + 'uk-ua': 'GEOLocate', + 'de-ch': 'GEO Lokalisierung', + 'pt-br': 'GEOLocate', }, geographyRequired: { - "en-us": "{geographyTable:string} must be mapped", - "ru-ru": "{geographyTable:string} должна быть связана", - "es-es": "{geographyTable:string} debe ser mapeado", - "fr-fr": "{geographyTable:string} doit être cartographié", - "uk-ua": "{geographyTable:string} має бути зіставлено", - "de-ch": "{geographyTable:string} muss kartiert werden", - "pt-br": "{geographyTable:string} deve ser mapeado", + 'en-us': '{geographyTable:string} must be mapped', + 'ru-ru': '{geographyTable:string} должна быть связана', + 'es-es': '{geographyTable:string} debe ser mapeado', + 'fr-fr': '{geographyTable:string} doit être cartographié', + 'uk-ua': '{geographyTable:string} має бути зіставлено', + 'de-ch': '{geographyTable:string} muss kartiert werden', + 'pt-br': '{geographyTable:string} deve ser mapeado', }, geographyRequiredDescription: { - "en-us": - "The GeoLocate plugin requires the geography field to be populated.", - "ru-ru": "Плагин GeoLocate требует, чтобы поле географии было заполнено.", - "es-es": - "El complemento GeoLocate requiere que se complete el campo de geografía.", - "fr-fr": - "Le plug-in GeoLocate nécessite que le champ géographie soit rempli.", - "uk-ua": "Плагін GeoLocate вимагає заповнення поля географії.", - "de-ch": - "Das GeoLocate-Plugin erfordert, dass das Koordinaten-Feld eingegeben wird.", - "pt-br": - "O plugin GeoLocate requer que o campo geográfico seja preenchido.", + 'en-us': + 'The GeoLocate plugin requires the geography field to be populated.', + 'ru-ru': 'Плагин GeoLocate требует, чтобы поле географии было заполнено.', + 'es-es': + 'El complemento GeoLocate requiere que se complete el campo de geografía.', + 'fr-fr': + 'Le plug-in GeoLocate nécessite que le champ géographie soit rempli.', + 'uk-ua': 'Плагін GeoLocate вимагає заповнення поля географії.', + 'de-ch': + 'Das GeoLocate-Plugin erfordert, dass das Koordinaten-Feld eingegeben wird.', + 'pt-br': + 'O plugin GeoLocate requer que o campo geográfico seja preenchido.', }, coordinates: { - "en-us": "Coordinates", - "ru-ru": "Координаты", - "es-es": "Coordenadas", - "fr-fr": "Coordonnées", - "uk-ua": "Координати", - "de-ch": "Koordinaten", - "pt-br": "Coordenadas", + 'en-us': 'Coordinates', + 'ru-ru': 'Координаты', + 'es-es': 'Coordenadas', + 'fr-fr': 'Coordonnées', + 'uk-ua': 'Координати', + 'de-ch': 'Koordinaten', + 'pt-br': 'Coordenadas', }, northWestCorner: { - comment: "Represents coordinates. Careful with translation", - "en-us": "NW Corner", - "ru-ru": "СЗ Угол", - "es-es": "Esquina noroeste", - "fr-fr": "Coin NO", - "uk-ua": "NW Кут", - "de-ch": "NW-Ecke", - "pt-br": "Canto NW", + comment: 'Represents coordinates. Careful with translation', + 'en-us': 'NW Corner', + 'ru-ru': 'СЗ Угол', + 'es-es': 'Esquina noroeste', + 'fr-fr': 'Coin NO', + 'uk-ua': 'NW Кут', + 'de-ch': 'NW-Ecke', + 'pt-br': 'Canto NW', }, southEastCorner: { - comment: "Represents coordinates. Careful with translation", - "en-us": "SE Corner", - "ru-ru": "ЮВ Угол", - "es-es": "Esquina SE", - "fr-fr": "Coin SE", - "uk-ua": "SE Кут", - "de-ch": "SO-Ecke", - "pt-br": "Canto SE", + comment: 'Represents coordinates. Careful with translation', + 'en-us': 'SE Corner', + 'ru-ru': 'ЮВ Угол', + 'es-es': 'Esquina SE', + 'fr-fr': 'Coin SE', + 'uk-ua': 'SE Кут', + 'de-ch': 'SO-Ecke', + 'pt-br': 'Canto SE', }, coordinateType: { - "en-us": "Coordinate Type", - "ru-ru": "Тип координат", - "es-es": "Tipo de coordenada", - "fr-fr": "Type de coordonnées", - "uk-ua": "Тип координат", - "de-ch": "Koordinatentyp", - "pt-br": "Tipo de coordenada", + 'en-us': 'Coordinate Type', + 'ru-ru': 'Тип координат', + 'es-es': 'Tipo de coordenada', + 'fr-fr': 'Type de coordonnées', + 'uk-ua': 'Тип координат', + 'de-ch': 'Koordinatentyp', + 'pt-br': 'Tipo de coordenada', }, point: { - "en-us": "Point", - "ru-ru": "Точка", - "es-es": "Punto", - "fr-fr": "Point", - "uk-ua": "точка", - "de-ch": "Punkt", - "pt-br": "Apontar", + 'en-us': 'Point', + 'ru-ru': 'Точка', + 'es-es': 'Punto', + 'fr-fr': 'Point', + 'uk-ua': 'точка', + 'de-ch': 'Punkt', + 'pt-br': 'Apontar', }, line: { - "en-us": "Line", - "ru-ru": "Линия", - "es-es": "Línea", - "fr-fr": "Ligne", - "uk-ua": "лінія", - "de-ch": "Linie", - "pt-br": "Linha", + 'en-us': 'Line', + 'ru-ru': 'Линия', + 'es-es': 'Línea', + 'fr-fr': 'Ligne', + 'uk-ua': 'лінія', + 'de-ch': 'Linie', + 'pt-br': 'Linha', }, rectangle: { - "en-us": "Rectangle", - "ru-ru": "Прямоугольник", - "es-es": "Rectángulo", - "fr-fr": "Rectangle", - "uk-ua": "Прямокутник", - "de-ch": "Rechteck", - "pt-br": "Retângulo", + 'en-us': 'Rectangle', + 'ru-ru': 'Прямоугольник', + 'es-es': 'Rectángulo', + 'fr-fr': 'Rectangle', + 'uk-ua': 'Прямокутник', + 'de-ch': 'Rechteck', + 'pt-br': 'Retângulo', }, parsed: { - "en-us": "Parsed", - "ru-ru": "Проверено", - "es-es": "Analizado", - "fr-fr": "analysé", - "uk-ua": "Проаналізовано", - "de-ch": "Geparst", - "pt-br": "Analisado", + 'en-us': 'Parsed', + 'ru-ru': 'Проверено', + 'es-es': 'Analizado', + 'fr-fr': 'analysé', + 'uk-ua': 'Проаналізовано', + 'de-ch': 'Geparst', + 'pt-br': 'Analisado', }, latitude: { - "en-us": "Latitude", - "ru-ru": "Широта", - "es-es": "Latitud", - "fr-fr": "Latitude", - "uk-ua": "Широта", - "de-ch": "Breitengrad", - "pt-br": "Latitude", + 'en-us': 'Latitude', + 'ru-ru': 'Широта', + 'es-es': 'Latitud', + 'fr-fr': 'Latitude', + 'uk-ua': 'Широта', + 'de-ch': 'Breitengrad', + 'pt-br': 'Latitude', }, longitude: { - "en-us": "Longitude", - "ru-ru": "Долгота", - "es-es": "Longitud", - "fr-fr": "Longitude", - "uk-ua": "Довгота", - "de-ch": "Längengrad", - "pt-br": "Longitude", + 'en-us': 'Longitude', + 'ru-ru': 'Долгота', + 'es-es': 'Longitud', + 'fr-fr': 'Longitude', + 'uk-ua': 'Довгота', + 'de-ch': 'Längengrad', + 'pt-br': 'Longitude', }, toggleFullScreen: { - "en-us": "Toggle Full Screen", - "ru-ru": "Включить полноэкранный режим", - "es-es": "Cambiar a pantalla completa", - "fr-fr": "Basculer en plein écran", - "uk-ua": "Перемкнути повний екран", - "de-ch": "Vollbildmodus", - "pt-br": "Alternar tela cheia", + 'en-us': 'Toggle Full Screen', + 'ru-ru': 'Включить полноэкранный режим', + 'es-es': 'Cambiar a pantalla completa', + 'fr-fr': 'Basculer en plein écran', + 'uk-ua': 'Перемкнути повний екран', + 'de-ch': 'Vollbildmodus', + 'pt-br': 'Alternar tela cheia', }, degrees: { - "en-us": "DD.DDDD (32.7619)", - "ru-ru": "DD.DDDD (32.7619)", - "es-es": "DD.DDDD (32.7619)", - "fr-fr": "DD.dddd (32.7619)", - "uk-ua": "DD.DDDD (32,7619)", - "de-ch": "DD.DDDD (32.7619)", - "pt-br": "DD.DDDD (32.7619)", + 'en-us': 'DD.DDDD (32.7619)', + 'ru-ru': 'DD.DDDD (32.7619)', + 'es-es': 'DD.DDDD (32.7619)', + 'fr-fr': 'DD.dddd (32.7619)', + 'uk-ua': 'DD.DDDD (32,7619)', + 'de-ch': 'DD.DDDD (32.7619)', + 'pt-br': 'DD.DDDD (32.7619)', }, degreesMinutes: { - "en-us": "DD MMMM (32. 45.714)", - "ru-ru": "DD MMMM (32. 45.714)", - "es-es": "DD MMMM (32. 45.714)", - "fr-fr": "DD MMMM (32. 45.714)", - "uk-ua": "ДД ММММ (32. 45.714)", - "de-ch": "DD MMMM (32. 45.714)", - "pt-br": "DD MMMM (32.45.714)", + 'en-us': 'DD MMMM (32. 45.714)', + 'ru-ru': 'DD MMMM (32. 45.714)', + 'es-es': 'DD MMMM (32. 45.714)', + 'fr-fr': 'DD MMMM (32. 45.714)', + 'uk-ua': 'ДД ММММ (32. 45.714)', + 'de-ch': 'DD MMMM (32. 45.714)', + 'pt-br': 'DD MMMM (32.45.714)', }, degreesMinutesSeconds: { - "en-us": "DD MM SS.SS (32 45 42.84)", - "ru-ru": "DD MM SS.SS (32 45 42.84)", - "es-es": "DD MM SS.SS (32 45 42.84)", - "fr-fr": "DD MM SS.ss (32 45 42.84)", - "uk-ua": "ДД ММ СС.СС (32 45 42,84)", - "de-ch": "DD MM SS.SS (32 45 42.84)", - "pt-br": "DD MM SS.SS (32 45 42,84)", + 'en-us': 'DD MM SS.SS (32 45 42.84)', + 'ru-ru': 'DD MM SS.SS (32 45 42.84)', + 'es-es': 'DD MM SS.SS (32 45 42.84)', + 'fr-fr': 'DD MM SS.ss (32 45 42.84)', + 'uk-ua': 'ДД ММ СС.СС (32 45 42,84)', + 'de-ch': 'DD MM SS.SS (32 45 42.84)', + 'pt-br': 'DD MM SS.SS (32 45 42,84)', }, degreesWithDirection: { - "en-us": "DD.DDDD N/S/E/W (32.7619 N)", - "ru-ru": "DD.DDDD N/S/E/W (32.7619 N)", - "es-es": "DD.DDDD N/S/E/O (32.7619 N)", - "fr-fr": "DD.dddd N/S/E/O (32,7619 N)", - "uk-ua": "DD.DDDD Пн/Пд/З/З (32,7619 Пн)", - "de-ch": "DD.DDDD N/S/O/W (32.7619 N)", - "pt-br": "DD.DDDD N/S/E/O (32.7619 N)", + 'en-us': 'DD.DDDD N/S/E/W (32.7619 N)', + 'ru-ru': 'DD.DDDD N/S/E/W (32.7619 N)', + 'es-es': 'DD.DDDD N/S/E/O (32.7619 N)', + 'fr-fr': 'DD.dddd N/S/E/O (32,7619 N)', + 'uk-ua': 'DD.DDDD Пн/Пд/З/З (32,7619 Пн)', + 'de-ch': 'DD.DDDD N/S/O/W (32.7619 N)', + 'pt-br': 'DD.DDDD N/S/E/O (32.7619 N)', }, degreesMinutesWithDirection: { - "en-us": "DD MM.MM N/S/E/W (32 45.714 N)", - "ru-ru": "DD MM.MM N/S/E/W (32 45.714 N)", - "es-es": "DD MM.MM N/S/E/O (32 45.714 N)", - "fr-fr": "DD MM.mm N/S/E/O (32 45.714 N)", - "uk-ua": "ДД ММ.ХМ Пн/Пд/В/З (32 45,714 Пн)", - "de-ch": "DD MM.MM N/S/O/W (32 45.714 N)", - "pt-br": "DD MM.MM N/S/E/O (32 45.714 N)", + 'en-us': 'DD MM.MM N/S/E/W (32 45.714 N)', + 'ru-ru': 'DD MM.MM N/S/E/W (32 45.714 N)', + 'es-es': 'DD MM.MM N/S/E/O (32 45.714 N)', + 'fr-fr': 'DD MM.mm N/S/E/O (32 45.714 N)', + 'uk-ua': 'ДД ММ.ХМ Пн/Пд/В/З (32 45,714 Пн)', + 'de-ch': 'DD MM.MM N/S/O/W (32 45.714 N)', + 'pt-br': 'DD MM.MM N/S/E/O (32 45.714 N)', }, degreesMinutesSecondsWithDirection: { - "en-us": "DD MM SS.SS N/S/E/W (32 45 42.84 N)", - "ru-ru": "DD MM SS.SS N/S/E/W (32 45 42.84 N)", - "es-es": "DD MM SS.SS N/S/E/O (32 45 42.84 N)", - "fr-fr": "DD MM SS.ss N/S/E/O (32 45 42.84 N)", - "uk-ua": "DD MM SS.SS N/S/E/W (32 45 42.84 N)", - "de-ch": "DD MM SS.SS N/S/O/W (32 45 42.84 N)", - "pt-br": "DD MM SS.SS N/S/E/O (32 45 42,84 N)", + 'en-us': 'DD MM SS.SS N/S/E/W (32 45 42.84 N)', + 'ru-ru': 'DD MM SS.SS N/S/E/W (32 45 42.84 N)', + 'es-es': 'DD MM SS.SS N/S/E/O (32 45 42.84 N)', + 'fr-fr': 'DD MM SS.ss N/S/E/O (32 45 42.84 N)', + 'uk-ua': 'DD MM SS.SS N/S/E/W (32 45 42.84 N)', + 'de-ch': 'DD MM SS.SS N/S/O/W (32 45 42.84 N)', + 'pt-br': 'DD MM SS.SS N/S/E/O (32 45 42,84 N)', }, localityUpdateHeaderError: { - "en-us": "Errors Found in Column Headers", - "de-ch": "In Spaltenüberschriften gefundene Fehler", - "es-es": "Errores encontrados en los encabezados de columna", - "fr-fr": "Erreurs trouvées dans les en-têtes de colonnes", - "ru-ru": "Обнаружены ошибки в заголовках столбцов", - "uk-ua": "Знайдено помилки в заголовках стовпців", - "pt-br": "Erros encontrados em cabeçalhos de colunas", + 'en-us': 'Errors Found in Column Headers', + 'de-ch': 'In Spaltenüberschriften gefundene Fehler', + 'es-es': 'Errores encontrados en los encabezados de columna', + 'fr-fr': 'Erreurs trouvées dans les en-têtes de colonnes', + 'ru-ru': 'Обнаружены ошибки в заголовках столбцов', + 'uk-ua': 'Знайдено помилки в заголовках стовпців', + 'pt-br': 'Erros encontrados em cabeçalhos de colunas', }, localityUpdateMissingHeader: { - "en-us": "The following columns are required but missing in the data set", - "de-ch": - "Die folgenden Spalten sind erforderlich, fehlen aber im Datensatz", - "es-es": - "Las siguientes columnas son obligatorias pero faltan en el conjunto de datos", - "fr-fr": + 'en-us': 'The following columns are required but missing in the data set', + 'de-ch': + 'Die folgenden Spalten sind erforderlich, fehlen aber im Datensatz', + 'es-es': + 'Las siguientes columnas son obligatorias pero faltan en el conjunto de datos', + 'fr-fr': "Les colonnes suivantes sont obligatoires mais manquantes dans l'ensemble de données", - "ru-ru": - "Следующие столбцы являются обязательными, но отсутствуют в наборе данных", - "uk-ua": "Наступні стовпці є обов’язковими, але відсутні в наборі даних", - "pt-br": - "As seguintes colunas são necessárias, mas estão ausentes no conjunto de dados", + 'ru-ru': + 'Следующие столбцы являются обязательными, но отсутствуют в наборе данных', + 'uk-ua': 'Наступні стовпці є обов’язковими, але відсутні в наборі даних', + 'pt-br': + 'As seguintes colunas são necessárias, mas estão ausentes no conjunto de dados', }, localityUpdateUnrecognizedHeaders: { - "en-us": - "The following columns in the dataset are not recognized and will be ignored on import", - "de-ch": - "Die folgenden Spalten im Datensatz werden nicht erkannt und beim Import ignoriert", - "es-es": - "Las siguientes columnas del conjunto de datos no se reconocen y se ignorarán durante la importación", - "fr-fr": + 'en-us': + 'The following columns in the dataset are not recognized and will be ignored on import', + 'de-ch': + 'Die folgenden Spalten im Datensatz werden nicht erkannt und beim Import ignoriert', + 'es-es': + 'Las siguientes columnas del conjunto de datos no se reconocen y se ignorarán durante la importación', + 'fr-fr': "Les colonnes suivantes dans l'ensemble de données ne sont pas reconnues et seront ignorées lors de l'importation", - "ru-ru": - "Следующие столбцы в наборе данных не распознаются и будут проигнорированы при импорте", - "uk-ua": - "Наступні стовпці в наборі даних не розпізнаються та ігноруватимуться під час імпорту", - "pt-br": - "As seguintes colunas no conjunto de dados não são reconhecidas e serão ignoradas na importação", + 'ru-ru': + 'Следующие столбцы в наборе данных не распознаются и будут проигнорированы при импорте', + 'uk-ua': + 'Наступні стовпці в наборі даних не розпізнаються та ігноруватимуться під час імпорту', + 'pt-br': + 'As seguintes colunas no conjunto de dados não são reconhecidas e serão ignoradas na importação', }, localityUpdateAcceptedHeaders: { - "en-us": "Only the following headers are accepted", - "de-ch": "Es werden nur die folgenden Header akzeptiert", - "es-es": "Sólo se aceptan los siguientes encabezados", - "fr-fr": "Seuls les en-têtes suivants sont acceptés", - "ru-ru": "Принимаются только следующие заголовки", - "uk-ua": "Приймаються лише такі заголовки", - "pt-br": "Somente os seguintes cabeçalhos são aceitos", + 'en-us': 'Only the following headers are accepted', + 'de-ch': 'Es werden nur die folgenden Header akzeptiert', + 'es-es': 'Sólo se aceptan los siguientes encabezados', + 'fr-fr': 'Seuls les en-têtes suivants sont acceptés', + 'ru-ru': 'Принимаются только следующие заголовки', + 'uk-ua': 'Приймаються лише такі заголовки', + 'pt-br': 'Somente os seguintes cabeçalhos são aceitos', }, localityUpdateStarting: { - "en-us": "Starting Locality Update", - "de-ch": "Lokalitätsaktualisierung wird gestartet", - "es-es": "Actualización de localidad inicial", - "fr-fr": "Mise à jour de la localité de départ", - "ru-ru": "Начало обновления населенного пункта", - "uk-ua": "Початок оновлення місцевості", - "pt-br": "Iniciando atualização de localidade", + 'en-us': 'Starting Locality Update', + 'de-ch': 'Lokalitätsaktualisierung wird gestartet', + 'es-es': 'Actualización de localidad inicial', + 'fr-fr': 'Mise à jour de la localité de départ', + 'ru-ru': 'Начало обновления населенного пункта', + 'uk-ua': 'Початок оновлення місцевості', + 'pt-br': 'Iniciando atualização de localidade', }, localityUpdateParsing: { - "en-us": "Parsing Locality Data Set", - "de-ch": "Analysieren des Ortsdatensatzes", - "es-es": "Análisis del conjunto de datos de localidad", - "fr-fr": "Analyse de l'ensemble de données de localité", - "ru-ru": "Анализ набора данных о местоположении", - "uk-ua": "Розбір набору даних місцевості", - "pt-br": "Analisando o conjunto de dados de localidade", + 'en-us': 'Parsing Locality Data Set', + 'de-ch': 'Analysieren des Ortsdatensatzes', + 'es-es': 'Análisis del conjunto de datos de localidad', + 'fr-fr': "Analyse de l'ensemble de données de localité", + 'ru-ru': 'Анализ набора данных о местоположении', + 'uk-ua': 'Розбір набору даних місцевості', + 'pt-br': 'Analisando o conjunto de dados de localidade', }, localityUpdateProgressing: { - "en-us": "Importing Locality Data Set", - "de-ch": "Importieren des Ortsdatensatzes", - "es-es": "Importación del conjunto de datos de localidad", - "fr-fr": "Importation d'un ensemble de données de localité", - "ru-ru": "Импорт набора данных о местоположении", - "uk-ua": "Імпорт набору даних місцевості", - "pt-br": "Importando conjunto de dados de localidade", + 'en-us': 'Importing Locality Data Set', + 'de-ch': 'Importieren des Ortsdatensatzes', + 'es-es': 'Importación del conjunto de datos de localidad', + 'fr-fr': "Importation d'un ensemble de données de localité", + 'ru-ru': 'Импорт набора данных о местоположении', + 'uk-ua': 'Імпорт набору даних місцевості', + 'pt-br': 'Importando conjunto de dados de localidade', }, localityUpdateParsed: { - "en-us": "Locality Update Data Set Parsed", - "de-ch": "Lokalitätsaktualisierungsdatensatz analysiert", - "es-es": "Conjunto de datos de actualización de localidad analizados", - "fr-fr": "Ensemble de données de mise à jour de localité analysé", - "ru-ru": "Набор данных обновления местоположения проанализирован", - "uk-ua": "Проаналізовано набір даних оновлення місцевості", - "pt-br": "Conjunto de dados de atualização de localidade analisado", + 'en-us': 'Locality Update Data Set Parsed', + 'de-ch': 'Lokalitätsaktualisierungsdatensatz analysiert', + 'es-es': 'Conjunto de datos de actualización de localidad analizados', + 'fr-fr': 'Ensemble de données de mise à jour de localité analysé', + 'ru-ru': 'Набор данных обновления местоположения проанализирован', + 'uk-ua': 'Проаналізовано набір даних оновлення місцевості', + 'pt-br': 'Conjunto de dados de atualização de localidade analisado', }, localityUpdateFailed: { - "en-us": "Locality Update Failed", - "de-ch": "Lokalitätsaktualisierung fehlgeschlagen", - "es-es": "Error en la actualización de localidad", - "fr-fr": "Échec de la mise à jour de la localité", - "ru-ru": "Ошибка обновления местоположения", - "uk-ua": "Помилка оновлення місцевості", - "pt-br": "Falha na atualização de localidade", + 'en-us': 'Locality Update Failed', + 'de-ch': 'Lokalitätsaktualisierung fehlgeschlagen', + 'es-es': 'Error en la actualización de localidad', + 'fr-fr': 'Échec de la mise à jour de la localité', + 'ru-ru': 'Ошибка обновления местоположения', + 'uk-ua': 'Помилка оновлення місцевості', + 'pt-br': 'Falha na atualização de localidade', }, localityUpdateParseFailure: { - "en-us": "Locality Update Parsing Failed", - "de-ch": "Lokale Aktualisierungsanalyse fehlgeschlagen", - "es-es": "Error en el análisis de actualización de localidad", - "fr-fr": "Échec de l'analyse de la mise à jour de la localité", - "ru-ru": "Ошибка анализа обновления местоположения", - "uk-ua": "Помилка аналізу оновлення місцевості", - "pt-br": "Falha na análise da atualização de localidade", + 'en-us': 'Locality Update Parsing Failed', + 'de-ch': 'Lokale Aktualisierungsanalyse fehlgeschlagen', + 'es-es': 'Error en el análisis de actualización de localidad', + 'fr-fr': "Échec de l'analyse de la mise à jour de la localité", + 'ru-ru': 'Ошибка анализа обновления местоположения', + 'uk-ua': 'Помилка аналізу оновлення місцевості', + 'pt-br': 'Falha na análise da atualização de localidade', }, localityUpdateCancelled: { - "en-us": "Locality Update Cancelled", - "de-ch": "Ortsaktualisierung abgebrochen", - "es-es": "Actualización de localidad cancelada", - "fr-fr": "Mise à jour de la localité annulée", - "ru-ru": "Обновление местоположения отменено", - "uk-ua": "Оновлення місцевості скасовано", - "pt-br": "Atualização de localidade cancelada", + 'en-us': 'Locality Update Cancelled', + 'de-ch': 'Ortsaktualisierung abgebrochen', + 'es-es': 'Actualización de localidad cancelada', + 'fr-fr': 'Mise à jour de la localité annulée', + 'ru-ru': 'Обновление местоположения отменено', + 'uk-ua': 'Оновлення місцевості скасовано', + 'pt-br': 'Atualização de localidade cancelada', }, localityUpdateSucceeded: { - "en-us": "Locality Update Succeeded", - "de-ch": "Lokalitätsaktualisierung erfolgreich", - "es-es": "Actualización de localidad exitosa", - "fr-fr": "Mise à jour de la localité réussie", - "ru-ru": "Обновление местоположения прошло успешно", - "uk-ua": "Місцезнаходження оновлено", - "pt-br": "Atualização de localidade bem-sucedida", + 'en-us': 'Locality Update Succeeded', + 'de-ch': 'Lokalitätsaktualisierung erfolgreich', + 'es-es': 'Actualización de localidad exitosa', + 'fr-fr': 'Mise à jour de la localité réussie', + 'ru-ru': 'Обновление местоположения прошло успешно', + 'uk-ua': 'Місцезнаходження оновлено', + 'pt-br': 'Atualização de localidade bem-sucedida', }, localityUpdateWentWrong: { - "en-us": "Something went wrong during the Locality Update process", - "de-ch": "Beim Lokalitäts-Update ist ein Fehler aufgetreten", - "es-es": "Algo salió mal durante el proceso de actualización de localidad", - "fr-fr": + 'en-us': 'Something went wrong during the Locality Update process', + 'de-ch': 'Beim Lokalitäts-Update ist ein Fehler aufgetreten', + 'es-es': 'Algo salió mal durante el proceso de actualización de localidad', + 'fr-fr': "Une erreur s'est produite lors du processus de mise à jour de la localité", - "ru-ru": "Что-то пошло не так в процессе обновления населенного пункта", - "uk-ua": "Щось пішло не так під час процесу оновлення місцевості", - "pt-br": "Algo deu errado durante o processo de atualização de localidade", + 'ru-ru': 'Что-то пошло не так в процессе обновления населенного пункта', + 'uk-ua': 'Щось пішло не так під час процесу оновлення місцевості', + 'pt-br': 'Algo deu errado durante o processo de atualização de localidade', }, localityUpdateParseErrorFileName: { comment: ` The file name which is used when Parse Errors are exported. The .csv file extension is appended to the end of this string `, - "en-us": "Locality Update Errors - {date:string}", - "de-ch": "Fehler beim Lokalitätsupdate - {date:string}", - "es-es": "Errores de actualización de localidad - {date:string}", - "fr-fr": "Erreurs de mise à jour de la localité - {date:string}", - "ru-ru": "Ошибки обновления местоположения - {date:string}", - "uk-ua": "Помилки оновлення місцевості - {date:string}", - "pt-br": "Erros de atualização de localidade - {date:string}", + 'en-us': 'Locality Update Errors - {date:string}', + 'de-ch': 'Fehler beim Lokalitätsupdate - {date:string}', + 'es-es': 'Errores de actualización de localidad - {date:string}', + 'fr-fr': 'Erreurs de mise à jour de la localité - {date:string}', + 'ru-ru': 'Ошибки обновления местоположения - {date:string}', + 'uk-ua': 'Помилки оновлення місцевості - {date:string}', + 'pt-br': 'Erros de atualização de localidade - {date:string}', }, localityUpdateCrashFileName: { comment: ` The file name which is used when any Generic non-parsing errors are exported. The .txt file extension is appended to the end of this string `, - "en-us": "Locality Update {taskId: string} Crash Report - {date: string}", - "de-ch": - "Ortsaktualisierung {taskId: string} Absturzbericht – {date: string}", - "es-es": - "Informe de fallos de actualización de localidad {taskId: string} - {date: string}", - "fr-fr": + 'en-us': 'Locality Update {taskId: string} Crash Report - {date: string}', + 'de-ch': + 'Ortsaktualisierung {taskId: string} Absturzbericht – {date: string}', + 'es-es': + 'Informe de fallos de actualización de localidad {taskId: string} - {date: string}', + 'fr-fr': "Mise à jour de la localité {taskId: string} Rapport d'incident - {date: string}", - "ru-ru": - "Обновление местоположения {taskId: string} Отчет о сбое - {date: string}", - "uk-ua": - "Оновлення місцевості {taskId: string} Звіт про збій - {date: string}", - "pt-br": - "Relatório de falha de atualização de localidade {taskId: string} - {date: string}", + 'ru-ru': + 'Обновление местоположения {taskId: string} Отчет о сбое - {date: string}', + 'uk-ua': + 'Оновлення місцевості {taskId: string} Звіт про збій - {date: string}', + 'pt-br': + 'Relatório de falha de atualização de localidade {taskId: string} - {date: string}', }, guidHeaderNotProvided: { - "en-us": "The Dataset must contain a 'guid' header", - "de-ch": "Der Datensatz muss einen GUID-Header enthalten", - "es-es": "El conjunto de datos debe contener un encabezado 'guid'", - "fr-fr": "L'ensemble de données doit contenir un en-tête « guid »", - "ru-ru": "Набор данных должен содержать заголовок «guid».", - "uk-ua": "Набір даних має містити заголовок «guid».", - "pt-br": "O conjunto de dados deve conter um cabeçalho 'guid'", + 'en-us': "The Dataset must contain a 'guid' header", + 'de-ch': 'Der Datensatz muss einen GUID-Header enthalten', + 'es-es': "El conjunto de datos debe contener un encabezado 'guid'", + 'fr-fr': "L'ensemble de données doit contenir un en-tête « guid »", + 'ru-ru': 'Набор данных должен содержать заголовок «guid».', + 'uk-ua': 'Набір даних має містити заголовок «guid».', + 'pt-br': "O conjunto de dados deve conter um cabeçalho 'guid'", }, noLocalityMatchingGuid: { - "en-us": "No Locality with guid: '{guid:string}'", - "de-ch": "Kein Ort mit GUID: „{guid:string}“", - "es-es": "Sin localidad con guid: '{guid:string}'", - "fr-fr": "Aucune localité avec guid : '{guid:string}'", - "ru-ru": "Нет населенного пункта с guid: '{guid:string}'", - "uk-ua": "Немає місцевості з guid: '{guid:string}'", - "pt-br": "Nenhuma localidade com guid: '{guid:string}'", + 'en-us': "No Locality with guid: '{guid:string}'", + 'de-ch': 'Kein Ort mit GUID: „{guid:string}“', + 'es-es': "Sin localidad con guid: '{guid:string}'", + 'fr-fr': "Aucune localité avec guid : '{guid:string}'", + 'ru-ru': "Нет населенного пункта с guid: '{guid:string}'", + 'uk-ua': "Немає місцевості з guid: '{guid:string}'", + 'pt-br': "Nenhuma localidade com guid: '{guid:string}'", }, multipleLocalitiesWithGuid: { - "en-us": - "More than one Locality found with guid: {guid:string}. Locality IDs: {localityIds: string}", - "de-ch": - "Mehrere Orte mit GUID gefunden: {guid:string}. Orts-IDs: {localityIds: string}", - "es-es": - "Se encontró más de una localidad con guid: {guid:string}. ID de localidad: {localityIds: string}", - "fr-fr": - "Plusieurs localités trouvées avec le GUID : {guid:string}. ID de localité : {localityIds: string}", - "ru-ru": - "Найдено более одного населенного пункта с guid: {guid:string}. Идентификаторы населенных пунктов: {localityIds: string}", - "uk-ua": - "За допомогою guid: {guid:string} знайдено більше одного населеного пункту. Ідентифікатори населених пунктів: {localityIds: рядок}", - "pt-br": - "Mais de uma localidade encontrada com guid: {guid:string}. IDs de localidade: {localityIds: string}", + 'en-us': + 'More than one Locality found with guid: {guid:string}. Locality IDs: {localityIds: string}', + 'de-ch': + 'Mehrere Orte mit GUID gefunden: {guid:string}. Orts-IDs: {localityIds: string}', + 'es-es': + 'Se encontró más de una localidad con guid: {guid:string}. ID de localidad: {localityIds: string}', + 'fr-fr': + 'Plusieurs localités trouvées avec le GUID : {guid:string}. ID de localité : {localityIds: string}', + 'ru-ru': + 'Найдено более одного населенного пункта с guid: {guid:string}. Идентификаторы населенных пунктов: {localityIds: string}', + 'uk-ua': + 'За допомогою guid: {guid:string} знайдено більше одного населеного пункту. Ідентифікатори населених пунктів: {localityIds: рядок}', + 'pt-br': + 'Mais de uma localidade encontrada com guid: {guid:string}. IDs de localidade: {localityIds: string}', }, localityUpdateEffectCounts: { - "en-us": - "The following number of {localityTabelLabel: string} records will be affected by the update and {geoCoordDetailTableLabel: string} records will be created:", - "de-ch": - "Die folgende Anzahl von {localityTabelLabel: string}-Datensätzen wird von der Aktualisierung betroffen sein und {geoCoordDetailTableLabel: string}-Datensätze werden erstellt:", - "es-es": - "La siguiente cantidad de registros {localityTabelLabel: string} se verá afectada por la actualización y se crearán registros {geoCoordDetailTableLabel: string}:", - "fr-fr": + 'en-us': + 'The following number of {localityTabelLabel: string} records will be affected by the update and {geoCoordDetailTableLabel: string} records will be created:', + 'de-ch': + 'Die folgende Anzahl von {localityTabelLabel: string}-Datensätzen wird von der Aktualisierung betroffen sein und {geoCoordDetailTableLabel: string}-Datensätze werden erstellt:', + 'es-es': + 'La siguiente cantidad de registros {localityTabelLabel: string} se verá afectada por la actualización y se crearán registros {geoCoordDetailTableLabel: string}:', + 'fr-fr': "Le nombre suivant d'enregistrements {localityTabelLabel: string} sera affecté par la mise à jour et les enregistrements {geoCoordDetailTableLabel: string} seront créés :", - "ru-ru": - "Обновление повлияет на следующее количество записей {localityTabelLabel: string} и будет создано записей {geoCoordDetailTableLabel: string}:", - "uk-ua": - "Оновлення вплине на таку кількість записів {localityTabelLabel: string} і буде створено записи {geoCoordDetailTableLabel: string}:", - "pt-br": - "O seguinte número de registros {localityTabelLabel: string} será afetado pela atualização e os registros {geoCoordDetailTableLabel: string} serão criados:", + 'ru-ru': + 'Обновление повлияет на следующее количество записей {localityTabelLabel: string} и будет создано записей {geoCoordDetailTableLabel: string}:', + 'uk-ua': + 'Оновлення вплине на таку кількість записів {localityTabelLabel: string} і буде створено записи {geoCoordDetailTableLabel: string}:', + 'pt-br': + 'O seguinte número de registros {localityTabelLabel: string} será afetado pela atualização e os registros {geoCoordDetailTableLabel: string} serão criados:', }, localityUploadedDescription: { - "en-us": - "The following number of {localityTabelLabel: string} records were updated and {geoCoordDetailTableLabel: string} records were created:", - "de-ch": - "Die folgende Anzahl von {localityTabelLabel: string}-Datensätzen wurde aktualisiert und {geoCoordDetailTableLabel: string}-Datensätzen erstellt:", - "es-es": - "Se actualizó la siguiente cantidad de registros {localityTabelLabel: string} y se crearon registros {geoCoordDetailTableLabel: string}:", - "fr-fr": + 'en-us': + 'The following number of {localityTabelLabel: string} records were updated and {geoCoordDetailTableLabel: string} records were created:', + 'de-ch': + 'Die folgende Anzahl von {localityTabelLabel: string}-Datensätzen wurde aktualisiert und {geoCoordDetailTableLabel: string}-Datensätzen erstellt:', + 'es-es': + 'Se actualizó la siguiente cantidad de registros {localityTabelLabel: string} y se crearon registros {geoCoordDetailTableLabel: string}:', + 'fr-fr': "Le nombre suivant d'enregistrements {localityTabelLabel: string} ont été mis à jour et d'enregistrements {geoCoordDetailTableLabel: string} ont été créés :", - "ru-ru": - "Следующее количество записей {localityTabelLabel: string} было обновлено и создано {geoCoordDetailTableLabel: string} записей:", - "uk-ua": - "Оновлено таку кількість записів {localityTabelLabel: string} і створено записи {geoCoordDetailTableLabel: string}:", - "pt-br": - "O seguinte número de registros {localityTabelLabel: string} foi atualizado e os registros {geoCoordDetailTableLabel: string} foram criados:", + 'ru-ru': + 'Следующее количество записей {localityTabelLabel: string} было обновлено и создано {geoCoordDetailTableLabel: string} записей:', + 'uk-ua': + 'Оновлено таку кількість записів {localityTabelLabel: string} і створено записи {geoCoordDetailTableLabel: string}:', + 'pt-br': + 'O seguinte número de registros {localityTabelLabel: string} foi atualizado e os registros {geoCoordDetailTableLabel: string} foram criados:', }, localityUpdateStarted: { - "en-us": "The Locality Update process has started", - "de-ch": "Der Locality-Update-Prozess wurde gestartet", - "es-es": "El proceso de actualización de localidad ha comenzado", - "fr-fr": "Le processus de mise à jour de la localité a commencé", - "ru-ru": "Процесс обновления населенного пункта начался", - "uk-ua": "Розпочато процес оновлення місцевості", - "pt-br": "O processo de atualização da localidade foi iniciado", + 'en-us': 'The Locality Update process has started', + 'de-ch': 'Der Locality-Update-Prozess wurde gestartet', + 'es-es': 'El proceso de actualización de localidad ha comenzado', + 'fr-fr': 'Le processus de mise à jour de la localité a commencé', + 'ru-ru': 'Процесс обновления населенного пункта начался', + 'uk-ua': 'Розпочато процес оновлення місцевості', + 'pt-br': 'O processo de atualização da localidade foi iniciado', }, localityUpdateResults: { - "en-us": "Locality Update Results", - "de-ch": "Ergebnisse der Ortsaktualisierung", - "es-es": "Resultados de la actualización de localidad", - "fr-fr": "Résultats de la mise à jour de la localité", - "ru-ru": "Результаты обновления местоположения", - "uk-ua": "Результати оновлення місцевості", - "pt-br": "Resultados da atualização de localidade", + 'en-us': 'Locality Update Results', + 'de-ch': 'Ergebnisse der Ortsaktualisierung', + 'es-es': 'Resultados de la actualización de localidad', + 'fr-fr': 'Résultats de la mise à jour de la localité', + 'ru-ru': 'Результаты обновления местоположения', + 'uk-ua': 'Результати оновлення місцевості', + 'pt-br': 'Resultados da atualização de localidade', }, localityUpdateFailureResults: { - "en-us": "Locality Update Failure Results", - "de-ch": "Ergebnisse der fehlgeschlagenen Lokalitätsaktualisierung", - "es-es": "Resultados de errores de actualización de localidad", - "fr-fr": "Résultats de l'échec de la mise à jour de la localité", - "ru-ru": "Результаты сбоя обновления местоположения", - "uk-ua": "Результати помилки оновлення місцевості", - "pt-br": "Resultados de falha na atualização de localidade", + 'en-us': 'Locality Update Failure Results', + 'de-ch': 'Ergebnisse der fehlgeschlagenen Lokalitätsaktualisierung', + 'es-es': 'Resultados de errores de actualización de localidad', + 'fr-fr': "Résultats de l'échec de la mise à jour de la localité", + 'ru-ru': 'Результаты сбоя обновления местоположения', + 'uk-ua': 'Результати помилки оновлення місцевості', + 'pt-br': 'Resultados de falha na atualização de localidade', }, taskId: { - "en-us": "Task ID", - "de-ch": "Aufgaben-ID", - "es-es": "ID de tarea", - "fr-fr": "ID de tâche", - "ru-ru": "Идентификатор задачи", - "uk-ua": "ID завдання", - "pt-br": "ID da tarefa", + 'en-us': 'Task ID', + 'de-ch': 'Aufgaben-ID', + 'es-es': 'ID de tarea', + 'fr-fr': 'ID de tâche', + 'ru-ru': 'Идентификатор задачи', + 'uk-ua': 'ID завдання', + 'pt-br': 'ID da tarefa', }, validLatitude: { - "en-us": "Latitude needs to have a value between -90° and 90°", - "de-ch": "Der Breitengrad muss einen Wert zwischen -90° und 90° haben", - "es-es": "La latitud debe tener un valor entre -90° y 90°", - "fr-fr": "La latitude doit avoir une valeur comprise entre -90° et 90°", - "ru-ru": "Широта должна иметь значение от -90° до 90°.", - "uk-ua": "Значення широти має бути від -90° до 90°", - "pt-br": "A latitude precisa ter um valor entre -90° e 90°", + 'en-us': 'Latitude needs to have a value between -90° and 90°', + 'de-ch': 'Der Breitengrad muss einen Wert zwischen -90° und 90° haben', + 'es-es': 'La latitud debe tener un valor entre -90° y 90°', + 'fr-fr': 'La latitude doit avoir une valeur comprise entre -90° et 90°', + 'ru-ru': 'Широта должна иметь значение от -90° до 90°.', + 'uk-ua': 'Значення широти має бути від -90° до 90°', + 'pt-br': 'A latitude precisa ter um valor entre -90° e 90°', }, validLongitude: { - "en-us": "Longitude needs to have a value between -180° and 180°", - "de-ch": "Der Längengrad muss einen Wert zwischen -180° und 180° haben", - "es-es": - "La siguiente cantidad de registros {localityTabelLabel: string} se verán afectados por la actualización y se crearán registros {geoCoordDetailTableLabel: string}:", - "fr-fr": "La longitude doit avoir une valeur comprise entre -180° et 180°", - "ru-ru": "Долгота должна иметь значение от -180° до 180°.", - "uk-ua": - "Оновлення вплине на таку кількість записів {localityTabelLabel: string} і буде створено записи {geoCoordDetailTableLabel: string}:", - "pt-br": "A longitude precisa ter um valor entre -180° e 180°", + 'en-us': 'Longitude needs to have a value between -180° and 180°', + 'de-ch': 'Der Längengrad muss einen Wert zwischen -180° und 180° haben', + 'es-es': + 'La siguiente cantidad de registros {localityTabelLabel: string} se verán afectados por la actualización y se crearán registros {geoCoordDetailTableLabel: string}:', + 'fr-fr': 'La longitude doit avoir une valeur comprise entre -180° et 180°', + 'ru-ru': 'Долгота должна иметь значение от -180° до 180°.', + 'uk-ua': + 'Оновлення вплине на таку кількість записів {localityTabelLabel: string} і буде створено записи {geoCoordDetailTableLabel: string}:', + 'pt-br': 'A longitude precisa ter um valor entre -180° e 180°', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/main.ts b/specifyweb/frontend/js_src/lib/localization/main.ts index a11444428c2..a7ee0e8dfbd 100644 --- a/specifyweb/frontend/js_src/lib/localization/main.ts +++ b/specifyweb/frontend/js_src/lib/localization/main.ts @@ -5,270 +5,270 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const mainText = createDictionary({ appTitle: { - comment: "Formatting for the title in the web page title bar", - "en-us": "{baseTitle:string} | Specify 7", - "ru-ru": "{baseTitle:string} | Specify 7", - "es-es": "{baseTitle:string} | Specify 7", - "fr-fr": "{baseTitle:string} | Specify 7", - "uk-ua": "{baseTitle:string} | Specify 7", - "de-ch": "{baseTitle:string} | Specify 7", - "pt-br": "{baseTitle:string} | Especifique 7", + comment: 'Formatting for the title in the web page title bar', + 'en-us': '{baseTitle:string} | Specify 7', + 'ru-ru': '{baseTitle:string} | Specify 7', + 'es-es': '{baseTitle:string} | Specify 7', + 'fr-fr': '{baseTitle:string} | Specify 7', + 'uk-ua': '{baseTitle:string} | Specify 7', + 'de-ch': '{baseTitle:string} | Specify 7', + 'pt-br': '{baseTitle:string} | Especifique 7', }, baseAppTitle: { - comment: "Default page title", - "en-us": "Specify 7", - "ru-ru": "Specify 7", - "es-es": "Specify 7", - "fr-fr": "Specify 7", - "uk-ua": "Specify 7", - "de-ch": "Specify 7", - "pt-br": "Especifique 7", + comment: 'Default page title', + 'en-us': 'Specify 7', + 'ru-ru': 'Specify 7', + 'es-es': 'Specify 7', + 'fr-fr': 'Specify 7', + 'uk-ua': 'Specify 7', + 'de-ch': 'Specify 7', + 'pt-br': 'Especifique 7', }, pageNotFound: { - comment: "Used in title", - "en-us": "Page Not Found", - "ru-ru": "Страница не найдена", - "es-es": "Página no encontrada", - "fr-fr": "Page non trouvée", - "uk-ua": "Сторінку не знайдено", - "de-ch": "Seite wurde nicht gefunden", - "pt-br": "Página não encontrada", + comment: 'Used in title', + 'en-us': 'Page Not Found', + 'ru-ru': 'Страница не найдена', + 'es-es': 'Página no encontrada', + 'fr-fr': 'Page non trouvée', + 'uk-ua': 'Сторінку не знайдено', + 'de-ch': 'Seite wurde nicht gefunden', + 'pt-br': 'Página não encontrada', }, nothingWasFound: { - comment: "Used in the heading on 404 page", - "en-us": "Oops! Nothing was found", - "ru-ru": "Ой! Ничего не найдено", - "es-es": "¡Uy! No se encontró nada", - "fr-fr": "Oups ! Rien n'a été trouvé", - "uk-ua": "Ой! Нічого не знайдено", - "de-ch": "Hoppla! Es wurde nichts gefunden :-(", - "pt-br": "Ops! Nada foi encontrado", + comment: 'Used in the heading on 404 page', + 'en-us': 'Oops! Nothing was found', + 'ru-ru': 'Ой! Ничего не найдено', + 'es-es': '¡Uy! No se encontró nada', + 'fr-fr': "Oups ! Rien n'a été trouvé", + 'uk-ua': 'Ой! Нічого не знайдено', + 'de-ch': 'Hoppla! Es wurde nichts gefunden :-(', + 'pt-br': 'Ops! Nada foi encontrado', }, pageNotFoundDescription: { - comment: "Used in the paragraph on 404 page", - "en-us": - "The page you are looking for might have been removed, had its name changed or is temporarily unavailable.", - "ru-ru": - "Возможно, страница, которую вы ищете, была удалена, ее название изменилось или она временно недоступна.", - "es-es": - "Es posible que la página que busca haya sido eliminada, haya cambiado de nombre o no esté disponible temporalmente.", - "fr-fr": - "La page que vous recherchez a peut-être été supprimée, a changé de nom ou est temporairement indisponible.", - "uk-ua": - "Можливо, сторінку, яку ви шукаєте, видалили, її назву змінили або вона тимчасово недоступна.", - "de-ch": - "Die Seite, die Sie suchen, wurde möglicherweise entfernt, ihr Name wurde geändert oder sie ist vorübergehend nicht verfügbar.", - "pt-br": - "A página que você está procurando pode ter sido removida, teve seu nome alterado ou está temporariamente indisponível.", + comment: 'Used in the paragraph on 404 page', + 'en-us': + 'The page you are looking for might have been removed, had its name changed or is temporarily unavailable.', + 'ru-ru': + 'Возможно, страница, которую вы ищете, была удалена, ее название изменилось или она временно недоступна.', + 'es-es': + 'Es posible que la página que busca haya sido eliminada, haya cambiado de nombre o no esté disponible temporalmente.', + 'fr-fr': + 'La page que vous recherchez a peut-être été supprimée, a changé de nom ou est temporairement indisponible.', + 'uk-ua': + 'Можливо, сторінку, яку ви шукаєте, видалили, її назву змінили або вона тимчасово недоступна.', + 'de-ch': + 'Die Seite, die Sie suchen, wurde möglicherweise entfernt, ihr Name wurde geändert oder sie ist vorübergehend nicht verfügbar.', + 'pt-br': + 'A página que você está procurando pode ter sido removida, teve seu nome alterado ou está temporariamente indisponível.', }, returnToHomepage: { - "en-us": "Return to homepage", - "ru-ru": "Вернуться на главную страницу", - "es-es": "Regresar a la página de inicio", - "fr-fr": "Retour à la page d'accueil", - "uk-ua": "Повернутися на домашню сторінку", - "de-ch": "Zurück zur Startseite", - "pt-br": "Voltar para a página inicial", + 'en-us': 'Return to homepage', + 'ru-ru': 'Вернуться на главную страницу', + 'es-es': 'Regresar a la página de inicio', + 'fr-fr': "Retour à la page d'accueil", + 'uk-ua': 'Повернутися на домашню сторінку', + 'de-ch': 'Zurück zur Startseite', + 'pt-br': 'Voltar para a página inicial', }, errorOccurred: { - "en-us": "We are sorry, something has gone wrong", - "ru-ru": "Извините, что-то пошло не так.", - "es-es": "Lo sentimos, algo ha ido mal", - "fr-fr": "Nous sommes désolés, quelque chose s'est mal passé", - "uk-ua": "Вибачте, щось пішло не так", - "de-ch": "Es tut uns leid, etwas ist schiefgelaufen", - "pt-br": "Lamentamos, algo deu errado", + 'en-us': 'We are sorry, something has gone wrong', + 'ru-ru': 'Извините, что-то пошло не так.', + 'es-es': 'Lo sentimos, algo ha ido mal', + 'fr-fr': "Nous sommes désolés, quelque chose s'est mal passé", + 'uk-ua': 'Вибачте, щось пішло не так', + 'de-ch': 'Es tut uns leid, etwas ist schiefgelaufen', + 'pt-br': 'Lamentamos, algo deu errado', }, clickToSeeDetails: { - "en-us": "Click to see details", - "es-es": "Haz clic para ver los detalles", - "uk-ua": "Натисніть, щоб переглянути деталі", - "de-ch": "Klicken Sie hier, um Details anzuzeigen", - "fr-fr": "Cliquez pour voir les détails", - "ru-ru": "Нажмите, чтобы увидеть подробности", - "pt-br": "Clique para ver detalhes", + 'en-us': 'Click to see details', + 'es-es': 'Haz clic para ver los detalles', + 'uk-ua': 'Натисніть, щоб переглянути деталі', + 'de-ch': 'Klicken Sie hier, um Details anzuzeigen', + 'fr-fr': 'Cliquez pour voir les détails', + 'ru-ru': 'Нажмите, чтобы увидеть подробности', + 'pt-br': 'Clique para ver detalhes', }, errorOccurredDescription: { - "en-us": + 'en-us': "We're sorry, it seems you have encountered an error in Specify 7 that we may not be aware of.", - "ru-ru": - "Произошла неисправимая ошибка, которая не позволит нам безопасно вернуться к вашему текущему окну.", - "es-es": - "Lo sentimos, parece que ha encontrado un error en Specify 7 del que no somos conscientes.", - "fr-fr": + 'ru-ru': + 'Произошла неисправимая ошибка, которая не позволит нам безопасно вернуться к вашему текущему окну.', + 'es-es': + 'Lo sentimos, parece que ha encontrado un error en Specify 7 del que no somos conscientes.', + 'fr-fr': "Nous sommes désolés, il semble que vous ayez rencontré une erreur dans Specify 7 dont nous n'avons peut-être pas connaissance.", - "uk-ua": - "Вибачте, здається, ви зіткнулися з помилкою в Specify 7, про яку ми могливо не знаємо.", - "de-ch": - "Es tut uns leid, aber es scheint, dass Sie auf einen Fehler in Specify 7 gestossen sind, der uns möglicherweise nicht bekannt ist.", - "pt-br": - "Lamentamos, parece que você encontrou um erro no Specify 7 do qual talvez não estejamos cientes.", + 'uk-ua': + 'Вибачте, здається, ви зіткнулися з помилкою в Specify 7, про яку ми могливо не знаємо.', + 'de-ch': + 'Es tut uns leid, aber es scheint, dass Sie auf einen Fehler in Specify 7 gestossen sind, der uns möglicherweise nicht bekannt ist.', + 'pt-br': + 'Lamentamos, parece que você encontrou um erro no Specify 7 do qual talvez não estejamos cientes.', }, criticalErrorOccurredDescription: { - "en-us": - "To avoid corrupting data records, you need to start again from a safe spot--the Home page.", - "ru-ru": - "Чтобы избежать повреждения записей данных, вам необходимо начать заново с безопасного места — с домашней страницы.", - "es-es": - "Para evitar corromper los registros de datos, debe comenzar de nuevo desde un lugar seguro: la página de inicio.", - "fr-fr": + 'en-us': + 'To avoid corrupting data records, you need to start again from a safe spot--the Home page.', + 'ru-ru': + 'Чтобы избежать повреждения записей данных, вам необходимо начать заново с безопасного места — с домашней страницы.', + 'es-es': + 'Para evitar corromper los registros de datos, debe comenzar de nuevo desde un lugar seguro: la página de inicio.', + 'fr-fr': "Pour éviter de corrompre les enregistrements de données, vous devez recommencer à partir d'un endroit sûr : la page d'accueil.", - "uk-ua": - "Щоб уникнути пошкодження записів даних, вам потрібно почати знову з безпечного місця – головної сторінки.", - "de-ch": - "Um eine Beschädigung der Datensätze zu vermeiden, müssen Sie an einer sicheren Stelle neu beginnen – der Startseite.", - "pt-br": - "Para evitar corromper registros de dados, você precisa começar novamente em um local seguro: a página inicial.", + 'uk-ua': + 'Щоб уникнути пошкодження записів даних, вам потрібно почати знову з безпечного місця – головної сторінки.', + 'de-ch': + 'Um eine Beschädigung der Datensätze zu vermeiden, müssen Sie an einer sicheren Stelle neu beginnen – der Startseite.', + 'pt-br': + 'Para evitar corromper registros de dados, você precisa começar novamente em um local seguro: a página inicial.', }, errorResolutionDescription: { - "en-us": - "If this issue persists, please contact your IT support. If this is a Specify Cloud database, please download the error message and send it to .", - "ru-ru": - "Если эта проблема не устраняется, обратитесь к вашей службе поддержки. Если это база данных Specify Cloud, загрузите сообщение об ошибке и отправьте его на .", - "es-es": - "Si el problema persiste, póngase en contacto con el servicio de asistencia informática. Si se trata de una base de datos de Specify Cloud, descargue el mensaje de error y envíelo a .", - "fr-fr": + 'en-us': + 'If this issue persists, please contact your IT support. If this is a Specify Cloud database, please download the error message and send it to .', + 'ru-ru': + 'Если эта проблема не устраняется, обратитесь к вашей службе поддержки. Если это база данных Specify Cloud, загрузите сообщение об ошибке и отправьте его на .', + 'es-es': + 'Si el problema persiste, póngase en contacto con el servicio de asistencia informática. Si se trata de una base de datos de Specify Cloud, descargue el mensaje de error y envíelo a .', + 'fr-fr': "Si ce problème persiste, veuillez contacter votre support informatique. S'il s'agit d'une base de données Specify Cloud, veuillez télécharger le message d'erreur et l'envoyer à .", - "uk-ua": - "Якщо проблема не зникне, зверніться до служби підтримки ІТ. Якщо це база даних Specify Cloud, завантажте повідомлення про помилку та надішліть його на .", - "de-ch": - "Wenn dieses Problem weiterhin besteht, wenden Sie sich bitte an Ihren IT-Support. Wenn es sich um eine Specify Cloud-Datenbank handelt, laden Sie bitte die Fehlermeldung herunter und senden Sie sie an .", - "pt-br": - "Se o problema persistir, entre em contato com o suporte de TI. Se for um banco de dados do Specify Cloud, baixe a mensagem de erro e envie para .", + 'uk-ua': + 'Якщо проблема не зникне, зверніться до служби підтримки ІТ. Якщо це база даних Specify Cloud, завантажте повідомлення про помилку та надішліть його на .', + 'de-ch': + 'Wenn dieses Problem weiterhin besteht, wenden Sie sich bitte an Ihren IT-Support. Wenn es sich um eine Specify Cloud-Datenbank handelt, laden Sie bitte die Fehlermeldung herunter und senden Sie sie an .', + 'pt-br': + 'Se o problema persistir, entre em contato com o suporte de TI. Se for um banco de dados do Specify Cloud, baixe a mensagem de erro e envie para .', }, errorResolutionSecondDescription: { - comment: "Careful with the tags when localizing", - "en-us": - "Users from member institutions can search for answered questions and ask for help on our Community Forum.", - "ru-ru": - "Пользователи из учреждений Консорциума могут искать ответы на вопросы и обращаться за помощью на нашем форуме.", - "es-es": - "Los usuarios de miembros de las instituciones pueden buscar preguntas respondidas y pedir ayuda en nuestro Foro.", - "fr-fr": + comment: 'Careful with the tags when localizing', + 'en-us': + 'Users from member institutions can search for answered questions and ask for help on our Community Forum.', + 'ru-ru': + 'Пользователи из учреждений Консорциума могут искать ответы на вопросы и обращаться за помощью на нашем форуме.', + 'es-es': + 'Los usuarios de miembros de las instituciones pueden buscar preguntas respondidas y pedir ayuda en nuestro Foro.', + 'fr-fr': "Les utilisateurs des institutions membres peuvent rechercher des réponses aux questions et demander de l'aide sur notre Forum communautaire.", - "uk-ua": - "Користувачі установ-членів можуть шукати відповіді на запитання та звертатися за допомогою на нашому форумі.", - "de-ch": - "Benutzer von Mitgliedsinstitutionen können in unserem Community Forum nach Antworten suchen und um Hilfe bitten.", - "pt-br": - "Usuários de instituições membros podem pesquisar perguntas respondidas e pedir ajuda em nosso Fórum da Comunidade.", + 'uk-ua': + 'Користувачі установ-членів можуть шукати відповіді на запитання та звертатися за допомогою на нашому форумі.', + 'de-ch': + 'Benutzer von Mitgliedsinstitutionen können in unserem Community Forum nach Antworten suchen und um Hilfe bitten.', + 'pt-br': + 'Usuários de instituições membros podem pesquisar perguntas respondidas e pedir ajuda em nosso Fórum da Comunidade.', }, errorMessage: { - "en-us": "Error Message", - "ru-ru": "Описание ошибки", - "es-es": "Mensaje de error", - "fr-fr": "Message d'erreur", - "uk-ua": "Повідомлення про помилку", - "de-ch": "Fehlermeldung", - "pt-br": "Mensagem de erro", + 'en-us': 'Error Message', + 'ru-ru': 'Описание ошибки', + 'es-es': 'Mensaje de error', + 'fr-fr': "Message d'erreur", + 'uk-ua': 'Повідомлення про помилку', + 'de-ch': 'Fehlermeldung', + 'pt-br': 'Mensagem de erro', }, leavePageConfirmation: { - "en-us": "Are you sure you want to leave this page?", - "ru-ru": "Вы уверены, что хотите покинуть эту страницу?", - "es-es": "¿Está seguro de que quiere abandonar esta página?", - "fr-fr": "Voulez-vous vraiment quitter cette page ?", - "uk-ua": "Ви впевнені, що бажаєте покинути цю сторінку?", - "de-ch": "Sind Sie sicher, dass Sie diese Seite verlassen wollen?", - "pt-br": "Tem certeza de que deseja sair desta página?", + 'en-us': 'Are you sure you want to leave this page?', + 'ru-ru': 'Вы уверены, что хотите покинуть эту страницу?', + 'es-es': '¿Está seguro de que quiere abandonar esta página?', + 'fr-fr': 'Voulez-vous vraiment quitter cette page ?', + 'uk-ua': 'Ви впевнені, що бажаєте покинути цю сторінку?', + 'de-ch': 'Sind Sie sicher, dass Sie diese Seite verlassen wollen?', + 'pt-br': 'Tem certeza de que deseja sair desta página?', }, leavePageConfirmationDescription: { - "en-us": "Unsaved changes will be lost if you leave this page.", - "ru-ru": - "Несохраненные изменения будут потеряны, если вы покинете эту страницу.", - "es-es": "Los cambios no guardados se perderán si abandona esta página.", - "fr-fr": - "Les modifications non enregistrées seront perdues si vous quittez cette page.", - "uk-ua": "Незбережені зміни будуть втрачені, якщо ви залишите цю сторінку.", - "de-ch": - "Nicht gespeicherte Änderungen gehen verloren, wenn Sie diese Seite verlassen.", - "pt-br": - "As alterações não salvas serão perdidas se você sair desta página.", + 'en-us': 'Unsaved changes will be lost if you leave this page.', + 'ru-ru': + 'Несохраненные изменения будут потеряны, если вы покинете эту страницу.', + 'es-es': 'Los cambios no guardados se perderán si abandona esta página.', + 'fr-fr': + 'Les modifications non enregistrées seront perdues si vous quittez cette page.', + 'uk-ua': 'Незбережені зміни будуть втрачені, якщо ви залишите цю сторінку.', + 'de-ch': + 'Nicht gespeicherte Änderungen gehen verloren, wenn Sie diese Seite verlassen.', + 'pt-br': + 'As alterações não salvas serão perdidas se você sair desta página.', }, leave: { - "en-us": "Leave", - "ru-ru": "Покинуть", - "es-es": "Abandonar", - "fr-fr": "Quitter", - "uk-ua": "Покинути", - "de-ch": "Verlassen", - "pt-br": "Deixar", + 'en-us': 'Leave', + 'ru-ru': 'Покинуть', + 'es-es': 'Abandonar', + 'fr-fr': 'Quitter', + 'uk-ua': 'Покинути', + 'de-ch': 'Verlassen', + 'pt-br': 'Deixar', }, versionMismatch: { - "en-us": "Specify version does not match database version", - "ru-ru": "Specify версия не соответствует версии базы данных", - "es-es": - "La versión de Specify no coincide con la versión de la base de datos", - "fr-fr": - "La version de Specify ne correspond pas à la version de la base de données", - "uk-ua": "Версія Specify не відповідає версії бази даних", - "de-ch": - "Die Specify Version stimmt nicht mit der Datenbankversion überein", - "pt-br": "A versão especificada não corresponde à versão do banco de dados", + 'en-us': 'Specify version does not match database version', + 'ru-ru': 'Specify версия не соответствует версии базы данных', + 'es-es': + 'La versión de Specify no coincide con la versión de la base de datos', + 'fr-fr': + 'La version de Specify ne correspond pas à la version de la base de données', + 'uk-ua': 'Версія Specify не відповідає версії бази даних', + 'de-ch': + 'Die Specify Version stimmt nicht mit der Datenbankversion überein', + 'pt-br': 'A versão especificada não corresponde à versão do banco de dados', }, versionMismatchDescription: { - "en-us": - "The Specify version {specifySixVersion:string} does not match the database version {databaseVersion:string}.", - "ru-ru": - "Specify версия {specifySixVersion:string} не соответствует версии базы данных {databaseVersion:string}.", - "es-es": - "La versión de Specify {specifySixVersion:string} no coincide con la versión {databaseVersion:string} de la base de datos.", - "fr-fr": - "La version {specifySixVersion:string} de Specify ne correspond pas à la version {databaseVersion:string} de la base de données.", - "uk-ua": - "Версія Specify {specifySixVersion:string} не відповідає версії бази даних {databaseVersion:string}.", - "de-ch": - "Die Specify Version {specifySixVersion:string} stimmt nicht mit der Datenbankversion {databaseVersion:string} überein.", - "pt-br": - "A versão Especificar {specifySixVersion:string} não corresponde à versão do banco de dados {databaseVersion:string}.", + 'en-us': + 'The Specify version {specifySixVersion:string} does not match the database version {databaseVersion:string}.', + 'ru-ru': + 'Specify версия {specifySixVersion:string} не соответствует версии базы данных {databaseVersion:string}.', + 'es-es': + 'La versión de Specify {specifySixVersion:string} no coincide con la versión {databaseVersion:string} de la base de datos.', + 'fr-fr': + 'La version {specifySixVersion:string} de Specify ne correspond pas à la version {databaseVersion:string} de la base de données.', + 'uk-ua': + 'Версія Specify {specifySixVersion:string} не відповідає версії бази даних {databaseVersion:string}.', + 'de-ch': + 'Die Specify Version {specifySixVersion:string} stimmt nicht mit der Datenbankversion {databaseVersion:string} überein.', + 'pt-br': + 'A versão Especificar {specifySixVersion:string} não corresponde à versão do banco de dados {databaseVersion:string}.', }, versionMismatchSecondDescription: { - "en-us": - "Some features of Specify 7 may therefore fail to operate correctly.", - "ru-ru": "Поэтому некоторые функции Specify 7 могут неработать.", - "es-es": - "Por lo tanto, es posible que algunas funciones de Specific 7 no funcionen correctamente.", - "fr-fr": - "Certaines fonctionnalités de Specify 7 peuvent donc ne pas fonctionner correctement.", - "uk-ua": "Тому деякі функції Specify 7 можуть не працювати належним чином.", - "de-ch": - "Einige Funktionen von Specify 7 funktionieren daher möglicherweise nicht richtig.", - "pt-br": - "Alguns recursos do Specify 7 podem, portanto, não funcionar corretamente.", + 'en-us': + 'Some features of Specify 7 may therefore fail to operate correctly.', + 'ru-ru': 'Поэтому некоторые функции Specify 7 могут неработать.', + 'es-es': + 'Por lo tanto, es posible que algunas funciones de Specific 7 no funcionen correctamente.', + 'fr-fr': + 'Certaines fonctionnalités de Specify 7 peuvent donc ne pas fonctionner correctement.', + 'uk-ua': 'Тому деякі функції Specify 7 можуть не працювати належним чином.', + 'de-ch': + 'Einige Funktionen von Specify 7 funktionieren daher möglicherweise nicht richtig.', + 'pt-br': + 'Alguns recursos do Specify 7 podem, portanto, não funcionar corretamente.', }, versionMismatchInstructions: { - "en-us": "Instructions for resolving Specify schema mismatch", - "ru-ru": "Инструкции по устранению несоответствия схемы Specify", - "es-es": - "Instrucciones para resolver la discrepancia de los esquema de Specify", - "fr-fr": + 'en-us': 'Instructions for resolving Specify schema mismatch', + 'ru-ru': 'Инструкции по устранению несоответствия схемы Specify', + 'es-es': + 'Instrucciones para resolver la discrepancia de los esquema de Specify', + 'fr-fr': "Instructions pour résoudre l'incompatibilité de schéma de Specify", - "uk-ua": "Інструкції щодо вирішення невідповідності версій", - "de-ch": "Anweisungen zur Behebung der Abweichung des Specify Schemas", - "pt-br": - "Instruções para resolver a incompatibilidade do esquema de especificação", + 'uk-ua': 'Інструкції щодо вирішення невідповідності версій', + 'de-ch': 'Anweisungen zur Behebung der Abweichung des Specify Schemas', + 'pt-br': + 'Instruções para resolver a incompatibilidade do esquema de especificação', }, online: { - "en-us": "online", - "es-es": "conectado", - "fr-fr": "en ligne", - "ru-ru": "онлайн", - "uk-ua": "онлайн", - "de-ch": "online", - "pt-br": "on-line", + 'en-us': 'online', + 'es-es': 'conectado', + 'fr-fr': 'en ligne', + 'ru-ru': 'онлайн', + 'uk-ua': 'онлайн', + 'de-ch': 'online', + 'pt-br': 'on-line', }, offline: { - "en-us": "offline", - "es-es": "desconectado", - "fr-fr": "hors ligne", - "ru-ru": "не в сети", - "uk-ua": "офлайн", - "de-ch": "offline", - "pt-br": "desconectado", + 'en-us': 'offline', + 'es-es': 'desconectado', + 'fr-fr': 'hors ligne', + 'ru-ru': 'не в сети', + 'uk-ua': 'офлайн', + 'de-ch': 'offline', + 'pt-br': 'desconectado', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index 1186d06a67f..e093dba8102 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -4,948 +4,948 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const queryText = createDictionary({ query: { - "en-us": "Query", - "ru-ru": "Запрос", - "es-es": "Consulta", - "fr-fr": "Requête", - "uk-ua": "Запит", - "de-ch": "Abfrage", - "pt-br": "Consulta", + 'en-us': 'Query', + 'ru-ru': 'Запрос', + 'es-es': 'Consulta', + 'fr-fr': 'Requête', + 'uk-ua': 'Запит', + 'de-ch': 'Abfrage', + 'pt-br': 'Consulta', }, queries: { - "en-us": "Queries", - "ru-ru": "Запросы", - "es-es": "Consultas", - "fr-fr": "Requêtes", - "uk-ua": "Запити", - "de-ch": "Abfragen", - "pt-br": "Consultas", + 'en-us': 'Queries', + 'ru-ru': 'Запросы', + 'es-es': 'Consultas', + 'fr-fr': 'Requêtes', + 'uk-ua': 'Запити', + 'de-ch': 'Abfragen', + 'pt-br': 'Consultas', }, queryBuilder: { - "en-us": "Query Builder", - "ru-ru": "Конструктор запросов", - "es-es": "Generador de consultas", - "fr-fr": "Générateur de requêtes", - "uk-ua": "Конструктор запитів", - "de-ch": "Query Builder", - "pt-br": "Construtor de consultas", + 'en-us': 'Query Builder', + 'ru-ru': 'Конструктор запросов', + 'es-es': 'Generador de consultas', + 'fr-fr': 'Générateur de requêtes', + 'uk-ua': 'Конструктор запитів', + 'de-ch': 'Query Builder', + 'pt-br': 'Construtor de consultas', }, newQueryName: { - "en-us": "New Query", - "es-es": "Nueva consulta", - "uk-ua": "Новий запит", - "de-ch": "Neue Abfrage", - "fr-fr": "Nouvelle requête", - "ru-ru": "Новый запрос", - "pt-br": "Nova consulta", + 'en-us': 'New Query', + 'es-es': 'Nueva consulta', + 'uk-ua': 'Новий запит', + 'de-ch': 'Neue Abfrage', + 'fr-fr': 'Nouvelle requête', + 'ru-ru': 'Новый запрос', + 'pt-br': 'Nova consulta', }, searchFields: { comment: ` Used in a Query Combo Box's hover-over message to show which fields are being searched on `, - "en-us": "Searched fields", - "ru-ru": "Поля поиска", - "es-es": "Campos buscados", - "fr-fr": "Champs recherchés", - "uk-ua": "Пошукові поля", - "de-ch": "Durchsuchte Felder", - "pt-br": "Campos pesquisados", + 'en-us': 'Searched fields', + 'ru-ru': 'Поля поиска', + 'es-es': 'Campos buscados', + 'fr-fr': 'Champs recherchés', + 'uk-ua': 'Пошукові поля', + 'de-ch': 'Durchsuchte Felder', + 'pt-br': 'Campos pesquisados', }, any: { - "en-us": "Any", - "ru-ru": "Любой", - "es-es": "Cualquier", - "fr-fr": "N'importe lequel", - "uk-ua": "Будь-який", - "de-ch": "Beliebig", - "pt-br": "Qualquer", + 'en-us': 'Any', + 'ru-ru': 'Любой', + 'es-es': 'Cualquier', + 'fr-fr': "N'importe lequel", + 'uk-ua': 'Будь-який', + 'de-ch': 'Beliebig', + 'pt-br': 'Qualquer', }, startValue: { - "en-us": "Start Value", - "ru-ru": "Начальное значение", - "es-es": "Valor inicial", - "fr-fr": "Valeur de départ", - "uk-ua": "Початкове значення", - "de-ch": "Startwert", - "pt-br": "Valor inicial", + 'en-us': 'Start Value', + 'ru-ru': 'Начальное значение', + 'es-es': 'Valor inicial', + 'fr-fr': 'Valeur de départ', + 'uk-ua': 'Початкове значення', + 'de-ch': 'Startwert', + 'pt-br': 'Valor inicial', }, endValue: { - "en-us": "End Value", - "ru-ru": "Конечное значение", - "es-es": "Valor final", - "fr-fr": "Valeur finale", - "uk-ua": "Кінцеве значення", - "de-ch": "Endwert", - "pt-br": "Valor final", + 'en-us': 'End Value', + 'ru-ru': 'Конечное значение', + 'es-es': 'Valor final', + 'fr-fr': 'Valeur finale', + 'uk-ua': 'Кінцеве значення', + 'de-ch': 'Endwert', + 'pt-br': 'Valor final', }, saveQuery: { - "en-us": "Save Query", - "ru-ru": "Сохранить запрос", - "es-es": "Guardar consulta", - "fr-fr": "Enregistrer la requête", - "uk-ua": "Зберегти запит", - "de-ch": "Abfrage speichern", - "pt-br": "Salvar consulta", + 'en-us': 'Save Query', + 'ru-ru': 'Сохранить запрос', + 'es-es': 'Guardar consulta', + 'fr-fr': 'Enregistrer la requête', + 'uk-ua': 'Зберегти запит', + 'de-ch': 'Abfrage speichern', + 'pt-br': 'Salvar consulta', }, saveClonedQuery: { - "en-us": "Save query as...", - "ru-ru": "Сохранить запрос как...", - "es-es": "Guardar consulta como...", - "fr-fr": "Enregistrer la requête sous...", - "uk-ua": "Зберегти запит як...", - "de-ch": "Abfrage speichern unter...", - "pt-br": "Salvar consulta como...", + 'en-us': 'Save query as...', + 'ru-ru': 'Сохранить запрос как...', + 'es-es': 'Guardar consulta como...', + 'fr-fr': 'Enregistrer la requête sous...', + 'uk-ua': 'Зберегти запит як...', + 'de-ch': 'Abfrage speichern unter...', + 'pt-br': 'Salvar consulta como...', }, saveClonedQueryDescription: { - "en-us": - "The query will be saved with a new name leaving the current query unchanged.", - "ru-ru": - "Запрос будет сохранен под новым именем, текущий запрос останется неизменным.", - "es-es": - "La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.", - "fr-fr": - "La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.", - "uk-ua": - "Запит буде збережено з новою назвою, а поточний запит залишиться без змін.", - "de-ch": - "Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.", - "pt-br": - "A consulta será salva com um novo nome, deixando a consulta atual inalterada.", + 'en-us': + 'The query will be saved with a new name leaving the current query unchanged.', + 'ru-ru': + 'Запрос будет сохранен под новым именем, текущий запрос останется неизменным.', + 'es-es': + 'La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.', + 'fr-fr': + 'La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.', + 'uk-ua': + 'Запит буде збережено з новою назвою, а поточний запит залишиться без змін.', + 'de-ch': + 'Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.', + 'pt-br': + 'A consulta será salva com um novo nome, deixando a consulta atual inalterada.', }, queryDeleteIncomplete: { - "en-us": "Query definition contains incomplete fields", - "ru-ru": "Определение запроса содержит неполные поля", - "es-es": "La definición de consulta contiene campos incompletos", - "fr-fr": "La définition de la requête contient des champs incomplets", - "uk-ua": "Визначення запиту містить незаповнені поля", - "de-ch": "Abfragedefinition enthält unvollständige Felder", - "pt-br": "A definição da consulta contém campos incompletos", + 'en-us': 'Query definition contains incomplete fields', + 'ru-ru': 'Определение запроса содержит неполные поля', + 'es-es': 'La definición de consulta contiene campos incompletos', + 'fr-fr': 'La définition de la requête contient des champs incomplets', + 'uk-ua': 'Визначення запиту містить незаповнені поля', + 'de-ch': 'Abfragedefinition enthält unvollständige Felder', + 'pt-br': 'A definição da consulta contém campos incompletos', }, queryDeleteIncompleteDescription: { - "en-us": - "There are uncompleted fields in the query definition. Do you want to remove them?", - "ru-ru": - "В определении запроса есть незаполненные поля. Хотите их удалить?", - "es-es": - "Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?", - "fr-fr": - "La définition de la requête contient des champs non renseignés. Voulez-vous les supprimer ?", - "uk-ua": "У визначенні запиту є незаповнені поля. Ви хочете видалити їх?", - "de-ch": - "Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?", - "pt-br": - "Há campos incompletos na definição da consulta. Deseja removê-los?", + 'en-us': + 'There are uncompleted fields in the query definition. Do you want to remove them?', + 'ru-ru': + 'В определении запроса есть незаполненные поля. Хотите их удалить?', + 'es-es': + 'Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?', + 'fr-fr': + 'La définition de la requête contient des champs non renseignés. Voulez-vous les supprimer ?', + 'uk-ua': 'У визначенні запиту є незаповнені поля. Ви хочете видалити їх?', + 'de-ch': + 'Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?', + 'pt-br': + 'Há campos incompletos na definição da consulta. Deseja removê-los?', }, queryUnloadProtect: { - "en-us": "The new or modified query definition has not been saved", - "ru-ru": "Новое или измененное определение запроса не было сохранено.", - "es-es": "La definición de consulta nueva o modificada no se ha guardado", - "fr-fr": + 'en-us': 'The new or modified query definition has not been saved', + 'ru-ru': 'Новое или измененное определение запроса не было сохранено.', + 'es-es': 'La definición de consulta nueva o modificada no se ha guardado', + 'fr-fr': "La définition de requête nouvelle ou modifiée n'a pas été enregistrée", - "uk-ua": "Нове або змінене визначення запиту не було збережено", - "de-ch": - "Die neue oder geänderte Abfragedefinition wurde nicht gespeichert", - "pt-br": "A definição de consulta nova ou modificada não foi salva", + 'uk-ua': 'Нове або змінене визначення запиту не було збережено', + 'de-ch': + 'Die neue oder geänderte Abfragedefinition wurde nicht gespeichert', + 'pt-br': 'A definição de consulta nova ou modificada não foi salva', }, recordSetToQuery: { - comment: "Example: Creating a Record Set from Query", - "en-us": "Creating a {recordSetTable:string} from Query", - "ru-ru": "Создание {recordSetTable:string} из запроса", - "es-es": "Creando un {recordSetTable:string} a partir de una consulta", - "fr-fr": "Création d'un {recordSetTable:string} à partir d'une requête", - "uk-ua": "Створення {recordSetTable:string} із запиту", - "de-ch": "Erstellen eines {recordSetTable:string} aus einer Abfrage", - "pt-br": "Criando um {recordSetTable:string} a partir da consulta", + comment: 'Example: Creating a Record Set from Query', + 'en-us': 'Creating a {recordSetTable:string} from Query', + 'ru-ru': 'Создание {recordSetTable:string} из запроса', + 'es-es': 'Creando un {recordSetTable:string} a partir de una consulta', + 'fr-fr': "Création d'un {recordSetTable:string} à partir d'une requête", + 'uk-ua': 'Створення {recordSetTable:string} із запиту', + 'de-ch': 'Erstellen eines {recordSetTable:string} aus einer Abfrage', + 'pt-br': 'Criando um {recordSetTable:string} a partir da consulta', }, recordSetToQueryDescription: { - "en-us": "Generating {recordSetTable:string}...", - "ru-ru": "Генерация {recordSetTable:string}...", - "es-es": "Generando {recordSetTable:string}...", - "fr-fr": "Génération de {recordSetTable:string}...", - "uk-ua": "Створення {recordSetTable:string}...", - "de-ch": "{recordSetTable:string} wird generiert...", - "pt-br": "Gerando {recordSetTable:string}...", + 'en-us': 'Generating {recordSetTable:string}...', + 'ru-ru': 'Генерация {recordSetTable:string}...', + 'es-es': 'Generando {recordSetTable:string}...', + 'fr-fr': 'Génération de {recordSetTable:string}...', + 'uk-ua': 'Створення {recordSetTable:string}...', + 'de-ch': '{recordSetTable:string} wird generiert...', + 'pt-br': 'Gerando {recordSetTable:string}...', }, recordSetCreated: { - "en-us": "{recordSetTable:string} Created", - "ru-ru": "{recordSetTable:string} Создано", - "es-es": "{recordSetTable:string} Creado", - "fr-fr": "{recordSetTable:string} Créé", - "uk-ua": "{recordSetTable:string} Створено", - "de-ch": "{recordSetTable:string} Erstellt", - "pt-br": "{recordSetTable:string} Criado", + 'en-us': '{recordSetTable:string} Created', + 'ru-ru': '{recordSetTable:string} Создано', + 'es-es': '{recordSetTable:string} Creado', + 'fr-fr': '{recordSetTable:string} Créé', + 'uk-ua': '{recordSetTable:string} Створено', + 'de-ch': '{recordSetTable:string} Erstellt', + 'pt-br': '{recordSetTable:string} Criado', }, missingCoordinatesForKml: { - "en-us": "Unable to export to KML", - "ru-ru": "Невозможно экспортировать в KML", - "es-es": "No se puede exportar a KML", - "fr-fr": "Impossible d'exporter vers KML", - "uk-ua": "Не вдалося експортувати в KML", - "de-ch": "Export in KML nicht möglich", - "pt-br": "Não é possível exportar para KML", + 'en-us': 'Unable to export to KML', + 'ru-ru': 'Невозможно экспортировать в KML', + 'es-es': 'No se puede exportar a KML', + 'fr-fr': "Impossible d'exporter vers KML", + 'uk-ua': 'Не вдалося експортувати в KML', + 'de-ch': 'Export in KML nicht möglich', + 'pt-br': 'Não é possível exportar para KML', }, missingCoordinatesForKmlDescription: { - "en-us": "Please add latitude and longitude fields to the query.", - "ru-ru": "Добавьте в запрос поля широты и долготы.", - "es-es": "Agregue campos de latitud y longitud a la consulta.", - "fr-fr": - "Veuillez ajouter les champs de latitude et de longitude à la requête.", - "uk-ua": "Будь ласка, додайте поля широти та довготи до запиту.", - "de-ch": "Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.", - "pt-br": "Adicione campos de latitude e longitude à consulta.", + 'en-us': 'Please add latitude and longitude fields to the query.', + 'ru-ru': 'Добавьте в запрос поля широты и долготы.', + 'es-es': 'Agregue campos de latitud y longitud a la consulta.', + 'fr-fr': + 'Veuillez ajouter les champs de latitude et de longitude à la requête.', + 'uk-ua': 'Будь ласка, додайте поля широти та довготи до запиту.', + 'de-ch': 'Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.', + 'pt-br': 'Adicione campos de latitude e longitude à consulta.', }, queryExportStarted: { - "en-us": "Export File Being Created", - "ru-ru": "Создается файл экспорта", - "es-es": "Archivo de exportación en creación", - "fr-fr": "Fichier d'exportation en cours de création", - "uk-ua": "Експортний файл створюється", - "de-ch": "Exportdatei wird erstellt", - "pt-br": "Arquivo de exportação sendo criado", + 'en-us': 'Export File Being Created', + 'ru-ru': 'Создается файл экспорта', + 'es-es': 'Archivo de exportación en creación', + 'fr-fr': "Fichier d'exportation en cours de création", + 'uk-ua': 'Експортний файл створюється', + 'de-ch': 'Exportdatei wird erstellt', + 'pt-br': 'Arquivo de exportação sendo criado', }, queryExportStartedDescription: { - "en-us": - "A notification will appear when the export file is complete and ready for download.", - "es-es": - "Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.", - "uk-ua": - "Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.", - "de-ch": - "Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.", - "fr-fr": + 'en-us': + 'A notification will appear when the export file is complete and ready for download.', + 'es-es': + 'Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.', + 'uk-ua': + 'Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.', + 'de-ch': + 'Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.', + 'fr-fr': "Une notification apparaîtra lorsque le fichier d'exportation sera terminé et prêt à être téléchargé.", - "ru-ru": - "Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.", - "pt-br": - "Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.", + 'ru-ru': + 'Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.', + 'pt-br': + 'Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.', }, invalidPicklistValue: { - comment: "Used when selected pick list value is not one of allowed values", - "en-us": "{value:string} (current, invalid value)", - "ru-ru": "{value:string} (текущее, недопустимое значение)", - "es-es": "{value:string} (valor actual, no válido)", - "fr-fr": "{value:string} (valeur actuelle, non valide)", - "uk-ua": "{value:string} (поточне, недійсне значення)", - "de-ch": "{value:string} (aktueller, ungültiger Wert)", - "pt-br": "{value:string} (valor atual, inválido)", + comment: 'Used when selected pick list value is not one of allowed values', + 'en-us': '{value:string} (current, invalid value)', + 'ru-ru': '{value:string} (текущее, недопустимое значение)', + 'es-es': '{value:string} (valor actual, no válido)', + 'fr-fr': '{value:string} (valeur actuelle, non valide)', + 'uk-ua': '{value:string} (поточне, недійсне значення)', + 'de-ch': '{value:string} (aktueller, ungültiger Wert)', + 'pt-br': '{value:string} (valor atual, inválido)', }, queryRecordSetTitle: { - comment: "Used in query builder header when querying on record set", - "en-us": + comment: 'Used in query builder header when querying on record set', + 'en-us': 'Query: "{queryName:string}" on {recordSetTable:string}: "{recordSetName:string}"', - "ru-ru": + 'ru-ru': 'Запрос: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - "es-es": + 'es-es': 'Consulta: "{queryName:string}" en {recordSetTable:string}: "{recordSetName:string}"', - "fr-fr": - "Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »", - "uk-ua": + 'fr-fr': + 'Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »', + 'uk-ua': 'Запит: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - "de-ch": + 'de-ch': 'Abfrage: "{queryName:string}" auf {recordSetTable:string}: "{recordSetName:string}"', - "pt-br": + 'pt-br': 'Consulta: "{queryName:string}" em {recordSetTable:string}: "{recordSetName:string}"', }, treeQueryName: { - comment: "Used in query builder header when querying on tree node usages", - "en-us": '{tableName:string} using "{nodeFullName:string}"', - "ru-ru": '{tableName:string} с использованием "{nodeFullName:string}"', - "es-es": '{tableName:string} usando "{nodeFullName:string}"', - "fr-fr": "{tableName:string} en utilisant « {nodeFullName:string} »", - "uk-ua": '{tableName:string} за допомогою "{nodeFullName:string}"', - "de-ch": '{tableName:string} mit "{nodeFullName:string}"', - "pt-br": '{tableName:string} usando "{nodeFullName:string}"', + comment: 'Used in query builder header when querying on tree node usages', + 'en-us': '{tableName:string} using "{nodeFullName:string}"', + 'ru-ru': '{tableName:string} с использованием "{nodeFullName:string}"', + 'es-es': '{tableName:string} usando "{nodeFullName:string}"', + 'fr-fr': '{tableName:string} en utilisant « {nodeFullName:string} »', + 'uk-ua': '{tableName:string} за допомогою "{nodeFullName:string}"', + 'de-ch': '{tableName:string} mit "{nodeFullName:string}"', + 'pt-br': '{tableName:string} usando "{nodeFullName:string}"', }, newButtonDescription: { - "en-us": "Add New Field", - "ru-ru": "Добавить новое поле", - "es-es": "Agregar nuevo campo", - "fr-fr": "Ajouter un nouveau champ", - "uk-ua": "Додати нове поле", - "de-ch": "Neues Feld hinzufügen", - "pt-br": "Adicionar novo campo", + 'en-us': 'Add New Field', + 'ru-ru': 'Добавить новое поле', + 'es-es': 'Agregar nuevo campo', + 'fr-fr': 'Ajouter un nouveau champ', + 'uk-ua': 'Додати нове поле', + 'de-ch': 'Neues Feld hinzufügen', + 'pt-br': 'Adicionar novo campo', }, countOnly: { - comment: "Verb", - "en-us": "Count", - "ru-ru": "Считать", - "es-es": "Contar", - "fr-fr": "Compter", - "uk-ua": "Рахувати", - "de-ch": "Zählen", - "pt-br": "Contar", + comment: 'Verb', + 'en-us': 'Count', + 'ru-ru': 'Считать', + 'es-es': 'Contar', + 'fr-fr': 'Compter', + 'uk-ua': 'Рахувати', + 'de-ch': 'Zählen', + 'pt-br': 'Contar', }, distinct: { - "en-us": "Distinct", - "ru-ru": "Отчетливый", - "es-es": "Distinto", - "fr-fr": "Distinct", - "uk-ua": "Виразний", - "de-ch": "Unterscheidbar", - "pt-br": "Distinto", + 'en-us': 'Distinct', + 'ru-ru': 'Отчетливый', + 'es-es': 'Distinto', + 'fr-fr': 'Distinct', + 'uk-ua': 'Виразний', + 'de-ch': 'Unterscheidbar', + 'pt-br': 'Distinto', }, series: { - "en-us": "Series", - "de-ch": "Serie", - "es-es": "Serie", - "fr-fr": "Série", - "pt-br": "Série", - "ru-ru": "Ряд", - "uk-ua": "Серія", + 'en-us': 'Series', + 'de-ch': 'Serie', + 'es-es': 'Serie', + 'fr-fr': 'Série', + 'pt-br': 'Série', + 'ru-ru': 'Ряд', + 'uk-ua': 'Серія', }, createCsv: { - "en-us": "Create CSV", - "ru-ru": "Создать CSV-файл", - "es-es": "Crear CSV", - "fr-fr": "Créer un fichier CSV", - "uk-ua": "Створити CSV", - "de-ch": "CSV erstellen", - "pt-br": "Criar CSV", + 'en-us': 'Create CSV', + 'ru-ru': 'Создать CSV-файл', + 'es-es': 'Crear CSV', + 'fr-fr': 'Créer un fichier CSV', + 'uk-ua': 'Створити CSV', + 'de-ch': 'CSV erstellen', + 'pt-br': 'Criar CSV', }, createKml: { - "en-us": "Create KML", - "ru-ru": "Создать KML-файл", - "es-es": "Crear KML", - "fr-fr": "Créer un fichier KML", - "uk-ua": "Створіть KML", - "de-ch": "KML erstellen", - "pt-br": "Criar KML", + 'en-us': 'Create KML', + 'ru-ru': 'Создать KML-файл', + 'es-es': 'Crear KML', + 'fr-fr': 'Créer un fichier KML', + 'uk-ua': 'Створіть KML', + 'de-ch': 'KML erstellen', + 'pt-br': 'Criar KML', }, createRecordSet: { - "en-us": "Create {recordSetTable:string}", - "ru-ru": "Создать {recordSetTable:string}", - "es-es": "Crear {recordSetTable:string}", - "fr-fr": "Créer {recordSetTable:string}", - "uk-ua": "Створити {recordSetTable:string}", - "de-ch": "Erstellen {recordSetTable:string}", - "pt-br": "Criar {recordSetTable:string}", + 'en-us': 'Create {recordSetTable:string}', + 'ru-ru': 'Создать {recordSetTable:string}', + 'es-es': 'Crear {recordSetTable:string}', + 'fr-fr': 'Créer {recordSetTable:string}', + 'uk-ua': 'Створити {recordSetTable:string}', + 'de-ch': 'Erstellen {recordSetTable:string}', + 'pt-br': 'Criar {recordSetTable:string}', }, saveAs: { - "en-us": "Save As", - "es-es": "Guardar como", - "uk-ua": "Зберегти як", - "de-ch": "Speichern unter", - "fr-fr": "Enregistrer sous", - "ru-ru": "Сохранить как", - "pt-br": "Salvar como", + 'en-us': 'Save As', + 'es-es': 'Guardar como', + 'uk-ua': 'Зберегти як', + 'de-ch': 'Speichern unter', + 'fr-fr': 'Enregistrer sous', + 'ru-ru': 'Сохранить как', + 'pt-br': 'Salvar como', }, anyRank: { - "en-us": "(any rank)", - "ru-ru": "(любой ранг)", - "es-es": "(cualquier rango)", - "fr-fr": "(n'importe quel rang)", - "uk-ua": "(будь-який ранг)", - "de-ch": "(jeder Rang)", - "pt-br": "(qualquer classificação)", + 'en-us': '(any rank)', + 'ru-ru': '(любой ранг)', + 'es-es': '(cualquier rango)', + 'fr-fr': "(n'importe quel rang)", + 'uk-ua': '(будь-який ранг)', + 'de-ch': '(jeder Rang)', + 'pt-br': '(qualquer classificação)', }, anyTree: { - "en-us": "(any tree)", - "de-ch": "(jeder Baum)", - "es-es": "(cualquier árbol)", - "fr-fr": "(n'importe quel arbre)", - "pt-br": "(qualquer árvore)", - "ru-ru": "(любое дерево)", - "uk-ua": "(будь-яке дерево)", + 'en-us': '(any tree)', + 'de-ch': '(jeder Baum)', + 'es-es': '(cualquier árbol)', + 'fr-fr': "(n'importe quel arbre)", + 'pt-br': '(qualquer árvore)', + 'ru-ru': '(любое дерево)', + 'uk-ua': '(будь-яке дерево)', }, moveUp: { - comment: "As in move it up", - "en-us": "Move Up", - "ru-ru": "Двигаться вверх", - "es-es": "Mover hacia arriba", - "fr-fr": "Monter", - "uk-ua": "Рухатися вгору", - "de-ch": "Nach oben", - "pt-br": "Mover para cima", + comment: 'As in move it up', + 'en-us': 'Move Up', + 'ru-ru': 'Двигаться вверх', + 'es-es': 'Mover hacia arriba', + 'fr-fr': 'Monter', + 'uk-ua': 'Рухатися вгору', + 'de-ch': 'Nach oben', + 'pt-br': 'Mover para cima', }, moveDown: { - comment: "As in move it down", - "en-us": "Move Down", - "ru-ru": "Переместить вниз", - "es-es": "Mover hacia abajo", - "fr-fr": "Descendre", - "uk-ua": "Рухатися вниз", - "de-ch": "Nach unten", - "pt-br": "Mover para baixo", + comment: 'As in move it down', + 'en-us': 'Move Down', + 'ru-ru': 'Переместить вниз', + 'es-es': 'Mover hacia abajo', + 'fr-fr': 'Descendre', + 'uk-ua': 'Рухатися вниз', + 'de-ch': 'Nach unten', + 'pt-br': 'Mover para baixo', }, sort: { - "en-us": "Sort", - "ru-ru": "Сортировать", - "es-es": "Ordenar", - "fr-fr": "Trier", - "uk-ua": "Сортувати", - "de-ch": "Sortieren", - "pt-br": "Organizar", + 'en-us': 'Sort', + 'ru-ru': 'Сортировать', + 'es-es': 'Ordenar', + 'fr-fr': 'Trier', + 'uk-ua': 'Сортувати', + 'de-ch': 'Sortieren', + 'pt-br': 'Organizar', }, ascendingSort: { - "en-us": "Ascending Sort", - "ru-ru": "Сортировка по возрастанию", - "es-es": "Orden ascendente", - "fr-fr": "Tri croissant", - "uk-ua": "Сортування за зростанням", - "de-ch": "Aufsteigende Sortierung", - "pt-br": "Classificação crescente", + 'en-us': 'Ascending Sort', + 'ru-ru': 'Сортировка по возрастанию', + 'es-es': 'Orden ascendente', + 'fr-fr': 'Tri croissant', + 'uk-ua': 'Сортування за зростанням', + 'de-ch': 'Aufsteigende Sortierung', + 'pt-br': 'Classificação crescente', }, descendingSort: { - "en-us": "Descending Sort", - "ru-ru": "Сортировка по убыванию", - "es-es": "Orden descendente", - "fr-fr": "Tri décroissant", - "uk-ua": "Сортування за спаданням", - "de-ch": "Absteigende Sortierung", - "pt-br": "Classificação decrescente", + 'en-us': 'Descending Sort', + 'ru-ru': 'Сортировка по убыванию', + 'es-es': 'Orden descendente', + 'fr-fr': 'Tri décroissant', + 'uk-ua': 'Сортування за спаданням', + 'de-ch': 'Absteigende Sortierung', + 'pt-br': 'Classificação decrescente', }, negate: { - comment: "as in negate query condition", - "en-us": "Negate", - "ru-ru": "Отрицать", - "es-es": "Negar", - "fr-fr": "Nier", - "uk-ua": "Заперечувати", - "de-ch": "Negieren", - "pt-br": "Negar", + comment: 'as in negate query condition', + 'en-us': 'Negate', + 'ru-ru': 'Отрицать', + 'es-es': 'Negar', + 'fr-fr': 'Nier', + 'uk-ua': 'Заперечувати', + 'de-ch': 'Negieren', + 'pt-br': 'Negar', }, showButtonDescription: { - "en-us": "Show in results", - "es-es": "Mostrar en resultados", - "uk-ua": "Показати в результатах", - "de-ch": "In Ergebnissen anzeigen", - "fr-fr": "Afficher dans les résultats", - "ru-ru": "Показать в результатах", - "pt-br": "Mostrar nos resultados", + 'en-us': 'Show in results', + 'es-es': 'Mostrar en resultados', + 'uk-ua': 'Показати в результатах', + 'de-ch': 'In Ergebnissen anzeigen', + 'fr-fr': 'Afficher dans les résultats', + 'ru-ru': 'Показать в результатах', + 'pt-br': 'Mostrar nos resultados', }, aggregatedInline: { - "en-us": "(aggregated)", - "ru-ru": "(агрегированные)", - "es-es": "(agregado)", - "fr-fr": "(agrégés)", - "uk-ua": "(узагальнено)", - "de-ch": "(aggregiert)", - "pt-br": "(agregado)", + 'en-us': '(aggregated)', + 'ru-ru': '(агрегированные)', + 'es-es': '(agregado)', + 'fr-fr': '(agrégés)', + 'uk-ua': '(узагальнено)', + 'de-ch': '(aggregiert)', + 'pt-br': '(agregado)', }, formattedInline: { - "en-us": "(formatted)", - "ru-ru": "(отформатировано)", - "es-es": "(formateado)", - "fr-fr": "(formaté)", - "uk-ua": "(відформатований)", - "de-ch": "(formatiert)", - "pt-br": "(formatado)", + 'en-us': '(formatted)', + 'ru-ru': '(отформатировано)', + 'es-es': '(formateado)', + 'fr-fr': '(formaté)', + 'uk-ua': '(відформатований)', + 'de-ch': '(formatiert)', + 'pt-br': '(formatado)', }, like: { - "en-us": "Like", - "ru-ru": "Нравиться", - "es-es": "Como", - "fr-fr": "Comme", - "uk-ua": "Люблю", - "de-ch": "Wie", - "pt-br": "Como", + 'en-us': 'Like', + 'ru-ru': 'Нравиться', + 'es-es': 'Como', + 'fr-fr': 'Comme', + 'uk-ua': 'Люблю', + 'de-ch': 'Wie', + 'pt-br': 'Como', }, likeDescription: { comment: 'Explains the use of special symbols for the "like" query filter', - "en-us": + 'en-us': 'Use "%" to match any number of characters.\n\nUse "_" to match a single character', - "ru-ru": - "Используйте «%» для сопоставления любого количества символов.\n\nИспользуйте «_» для сопоставления одного символа", - "es-es": + 'ru-ru': + 'Используйте «%» для сопоставления любого количества символов.\n\nИспользуйте «_» для сопоставления одного символа', + 'es-es': 'Usar "%" para hacer coincidir cualquier número de caracteres.\n\nUsar "_" para hacer coincidir un solo carácter', - "fr-fr": + 'fr-fr': "Utilisez « % » pour correspondre à n'importe quel nombre de caractères.\n\nUtilisez « _ » pour correspondre à un seul caractère.", - "uk-ua": + 'uk-ua': 'Використовуйте "%", щоб відповідати будь-якій кількості символів.\n\nВикористовуйте "_", щоб відповідати одному символу', - "de-ch": - "Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen.", - "pt-br": + 'de-ch': + 'Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen.', + 'pt-br': 'Use "%" para corresponder a qualquer número de caracteres.\n\nUse "_" para corresponder a um único caractere.', }, equal: { - "en-us": "Equal", - "ru-ru": "Равный", - "es-es": "Igual", - "fr-fr": "Égal", - "uk-ua": "Рівні", - "de-ch": "Gleich", - "pt-br": "Igual", + 'en-us': 'Equal', + 'ru-ru': 'Равный', + 'es-es': 'Igual', + 'fr-fr': 'Égal', + 'uk-ua': 'Рівні', + 'de-ch': 'Gleich', + 'pt-br': 'Igual', }, greaterThan: { - "en-us": "Greater than", - "ru-ru": "Больше чем", - "es-es": "Mayor que", - "fr-fr": "Plus grand que", - "uk-ua": "Більш чим", - "de-ch": "Größer als", - "pt-br": "Maior que", + 'en-us': 'Greater than', + 'ru-ru': 'Больше чем', + 'es-es': 'Mayor que', + 'fr-fr': 'Plus grand que', + 'uk-ua': 'Більш чим', + 'de-ch': 'Größer als', + 'pt-br': 'Maior que', }, lessThan: { - "en-us": "Less than", - "ru-ru": "Меньше, чем", - "es-es": "Menor que", - "fr-fr": "Moins que", - "uk-ua": "Менше ніж", - "de-ch": "Weniger als", - "pt-br": "Menor que", + 'en-us': 'Less than', + 'ru-ru': 'Меньше, чем', + 'es-es': 'Menor que', + 'fr-fr': 'Moins que', + 'uk-ua': 'Менше ніж', + 'de-ch': 'Weniger als', + 'pt-br': 'Menor que', }, greaterOrEqualTo: { - "en-us": "Greater or Equal to", - "ru-ru": "Больше или равно", - "es-es": "Mayor o igual a", - "fr-fr": "Supérieur ou égal à", - "uk-ua": "Більше або дорівнює", - "de-ch": "Größer oder gleich", - "pt-br": "Maior ou igual a", + 'en-us': 'Greater or Equal to', + 'ru-ru': 'Больше или равно', + 'es-es': 'Mayor o igual a', + 'fr-fr': 'Supérieur ou égal à', + 'uk-ua': 'Більше або дорівнює', + 'de-ch': 'Größer oder gleich', + 'pt-br': 'Maior ou igual a', }, lessOrEqualTo: { - "en-us": "Less or Equal to", - "ru-ru": "Меньше или равно", - "es-es": "Menor o igual a", - "fr-fr": "Inférieur ou égal à", - "uk-ua": "Менше або дорівнює", - "de-ch": "Kleiner oder gleich", - "pt-br": "Menor ou igual a", + 'en-us': 'Less or Equal to', + 'ru-ru': 'Меньше или равно', + 'es-es': 'Menor o igual a', + 'fr-fr': 'Inférieur ou égal à', + 'uk-ua': 'Менше або дорівнює', + 'de-ch': 'Kleiner oder gleich', + 'pt-br': 'Menor ou igual a', }, true: { - "en-us": "True", - "ru-ru": "Истинный", - "es-es": "Verdadero", - "fr-fr": "Vrai", - "uk-ua": "правда", - "de-ch": "WAHR", - "pt-br": "Verdadeiro", + 'en-us': 'True', + 'ru-ru': 'Истинный', + 'es-es': 'Verdadero', + 'fr-fr': 'Vrai', + 'uk-ua': 'правда', + 'de-ch': 'WAHR', + 'pt-br': 'Verdadeiro', }, false: { - "en-us": "False", - "ru-ru": "ЛОЖЬ", - "es-es": "Falso", - "fr-fr": "FAUX", - "uk-ua": "помилковий", - "de-ch": "FALSCH", - "pt-br": "Falso", + 'en-us': 'False', + 'ru-ru': 'ЛОЖЬ', + 'es-es': 'Falso', + 'fr-fr': 'FAUX', + 'uk-ua': 'помилковий', + 'de-ch': 'FALSCH', + 'pt-br': 'Falso', }, trueOrNull: { - "en-us": "True or Empty", - "ru-ru": "Правда или Пусто", - "es-es": "Verdadero o vacío", - "fr-fr": "Vrai ou vide", - "uk-ua": "True або Empty", - "de-ch": "Wahr oder leer", - "pt-br": "Verdadeiro ou Vazio", + 'en-us': 'True or Empty', + 'ru-ru': 'Правда или Пусто', + 'es-es': 'Verdadero o vacío', + 'fr-fr': 'Vrai ou vide', + 'uk-ua': 'True або Empty', + 'de-ch': 'Wahr oder leer', + 'pt-br': 'Verdadeiro ou Vazio', }, falseOrNull: { - "en-us": "False or Empty", - "ru-ru": "Ложь или Пусто", - "es-es": "Falso o vacío", - "fr-fr": "Faux ou vide", - "uk-ua": "False або Empty", - "de-ch": "Falsch oder leer", - "pt-br": "Falso ou Vazio", + 'en-us': 'False or Empty', + 'ru-ru': 'Ложь или Пусто', + 'es-es': 'Falso o vacío', + 'fr-fr': 'Faux ou vide', + 'uk-ua': 'False або Empty', + 'de-ch': 'Falsch oder leer', + 'pt-br': 'Falso ou Vazio', }, between: { - "en-us": "Between", - "ru-ru": "Между", - "es-es": "Entre", - "fr-fr": "Entre", - "uk-ua": "Між", - "de-ch": "Zwischen", - "pt-br": "Entre", + 'en-us': 'Between', + 'ru-ru': 'Между', + 'es-es': 'Entre', + 'fr-fr': 'Entre', + 'uk-ua': 'Між', + 'de-ch': 'Zwischen', + 'pt-br': 'Entre', }, in: { - "en-us": "In", - "ru-ru": "В", - "es-es": "En", - "fr-fr": "Dans", - "uk-ua": "в", - "de-ch": "In", - "pt-br": "Em", + 'en-us': 'In', + 'ru-ru': 'В', + 'es-es': 'En', + 'fr-fr': 'Dans', + 'uk-ua': 'в', + 'de-ch': 'In', + 'pt-br': 'Em', }, inDescription: { - "en-us": "A comma-separated list of values", - "ru-ru": "Список значений, разделенных запятыми", - "es-es": "Una lista de valores separados por comas", - "fr-fr": "Une liste de valeurs séparées par des virgules", - "uk-ua": "Список значень, розділених комами", - "de-ch": "Eine durch Kommas getrennte Liste von Werten", - "pt-br": "Uma lista de valores separados por vírgulas", + 'en-us': 'A comma-separated list of values', + 'ru-ru': 'Список значений, разделенных запятыми', + 'es-es': 'Una lista de valores separados por comas', + 'fr-fr': 'Une liste de valeurs séparées par des virgules', + 'uk-ua': 'Список значень, розділених комами', + 'de-ch': 'Eine durch Kommas getrennte Liste von Werten', + 'pt-br': 'Uma lista de valores separados por vírgulas', }, contains: { - "en-us": "Contains", - "ru-ru": "Содержит", - "es-es": "Contiene", - "fr-fr": "Contient", - "uk-ua": "Містить", - "de-ch": "Enthält", - "pt-br": "Contém", + 'en-us': 'Contains', + 'ru-ru': 'Содержит', + 'es-es': 'Contiene', + 'fr-fr': 'Contient', + 'uk-ua': 'Містить', + 'de-ch': 'Enthält', + 'pt-br': 'Contém', }, empty: { - "en-us": "Empty", - "ru-ru": "Пустой", - "es-es": "Vacío", - "fr-fr": "Vide", - "uk-ua": "Порожній", - "de-ch": "Leer", - "pt-br": "Vazio", + 'en-us': 'Empty', + 'ru-ru': 'Пустой', + 'es-es': 'Vacío', + 'fr-fr': 'Vide', + 'uk-ua': 'Порожній', + 'de-ch': 'Leer', + 'pt-br': 'Vazio', }, and: { - "en-us": "and", - "ru-ru": "и", - "es-es": "y", - "fr-fr": "et", - "uk-ua": "і", - "de-ch": "Und", - "pt-br": "e", + 'en-us': 'and', + 'ru-ru': 'и', + 'es-es': 'y', + 'fr-fr': 'et', + 'uk-ua': 'і', + 'de-ch': 'Und', + 'pt-br': 'e', }, startsWith: { - "en-us": "Starts With", - "ru-ru": "Начинается с", - "es-es": "Comienza con", - "fr-fr": "Commence par", - "uk-ua": "Починається з", - "de-ch": "Beginnt mit", - "pt-br": "Começa com", + 'en-us': 'Starts With', + 'ru-ru': 'Начинается с', + 'es-es': 'Comienza con', + 'fr-fr': 'Commence par', + 'uk-ua': 'Починається з', + 'de-ch': 'Beginnt mit', + 'pt-br': 'Começa com', }, or: { - "en-us": "or", - "ru-ru": "или", - "es-es": "o", - "fr-fr": "ou", - "uk-ua": "або", - "de-ch": "oder", - "pt-br": "ou", + 'en-us': 'or', + 'ru-ru': 'или', + 'es-es': 'o', + 'fr-fr': 'ou', + 'uk-ua': 'або', + 'de-ch': 'oder', + 'pt-br': 'ou', }, yes: { - "en-us": "Yes", - "ru-ru": "Да", - "es-es": "Sí", - "fr-fr": "Oui", - "uk-ua": "Так", - "de-ch": "Ja", - "pt-br": "Sim", + 'en-us': 'Yes', + 'ru-ru': 'Да', + 'es-es': 'Sí', + 'fr-fr': 'Oui', + 'uk-ua': 'Так', + 'de-ch': 'Ja', + 'pt-br': 'Sim', }, queryResults: { - "en-us": "Query Results", - "ru-ru": "Результаты запроса", - "es-es": "Resultados de la consulta", - "fr-fr": "Résultats de la requête", - "uk-ua": "Результати запиту", - "de-ch": "Abfrageergebnisse", - "pt-br": "Resultados da consulta", + 'en-us': 'Query Results', + 'ru-ru': 'Результаты запроса', + 'es-es': 'Resultados de la consulta', + 'fr-fr': 'Résultats de la requête', + 'uk-ua': 'Результати запиту', + 'de-ch': 'Abfrageergebnisse', + 'pt-br': 'Resultados da consulta', }, browseInForms: { - "en-us": "Browse in Forms", - "ru-ru": "Просмотр в формах", - "es-es": "Navegar en formularios", - "fr-fr": "Parcourir les formulaires", - "uk-ua": "Перегляд у Формах", - "de-ch": "In Formularen stöbern", - "pt-br": "Navegar em Formulários", + 'en-us': 'Browse in Forms', + 'ru-ru': 'Просмотр в формах', + 'es-es': 'Navegar en formularios', + 'fr-fr': 'Parcourir les formulaires', + 'uk-ua': 'Перегляд у Формах', + 'de-ch': 'In Formularen stöbern', + 'pt-br': 'Navegar em Formulários', }, configureQueryTables: { - "en-us": "Configure visible query tables", - "ru-ru": "Настройте видимые таблицы запросов", - "es-es": "Configurar tablas de consulta visibles", - "fr-fr": "Configurer les tables de requête visibles", - "uk-ua": "Налаштувати видимі таблиці запитів", - "de-ch": "Konfigurieren sichtbarer Abfragetabellen", - "pt-br": "Configurar tabelas de consulta visíveis", + 'en-us': 'Configure visible query tables', + 'ru-ru': 'Настройте видимые таблицы запросов', + 'es-es': 'Configurar tablas de consulta visibles', + 'fr-fr': 'Configurer les tables de requête visibles', + 'uk-ua': 'Налаштувати видимі таблиці запитів', + 'de-ch': 'Konfigurieren sichtbarer Abfragetabellen', + 'pt-br': 'Configurar tabelas de consulta visíveis', }, exportQueryForDwca: { - "en-us": "Export query for DwCA definition", - "ru-ru": "Экспорт запроса на определение DwCA", - "es-es": "Consulta de exportación para la definición de DwCA", - "fr-fr": "Requête d'exportation pour la définition DwCA", - "uk-ua": "Експорт запиту для визначення DwCA", - "de-ch": "Exportabfrage für DwCA-Definition", - "pt-br": "Consulta de exportação para definição DwCA", + 'en-us': 'Export query for DwCA definition', + 'ru-ru': 'Экспорт запроса на определение DwCA', + 'es-es': 'Consulta de exportación para la definición de DwCA', + 'fr-fr': "Requête d'exportation pour la définition DwCA", + 'uk-ua': 'Експорт запиту для визначення DwCA', + 'de-ch': 'Exportabfrage für DwCA-Definition', + 'pt-br': 'Consulta de exportação para definição DwCA', }, exportQueryAsReport: { - "en-us": "Define report based on query", - "ru-ru": "Определить отчет на основе запроса", - "es-es": "Definir informe basado en consulta", - "fr-fr": "Définir un rapport basé sur une requête", - "uk-ua": "Визначити звіт на основі запиту", - "de-ch": "Definieren Sie den Bericht basierend auf der Abfrage", - "pt-br": "Definir relatório com base na consulta", + 'en-us': 'Define report based on query', + 'ru-ru': 'Определить отчет на основе запроса', + 'es-es': 'Definir informe basado en consulta', + 'fr-fr': 'Définir un rapport basé sur une requête', + 'uk-ua': 'Визначити звіт на основі запиту', + 'de-ch': 'Definieren Sie den Bericht basierend auf der Abfrage', + 'pt-br': 'Definir relatório com base na consulta', }, exportQueryAsLabel: { - "en-us": "Define label based on query", - "ru-ru": "Определить метку на основе запроса", - "es-es": "Definir etiqueta según consulta", - "fr-fr": "Définir l'étiquette en fonction de la requête", - "uk-ua": "Визначте мітку на основі запиту", - "de-ch": "Definieren Sie das Label basierend auf der Abfrage", - "pt-br": "Definir rótulo com base na consulta", + 'en-us': 'Define label based on query', + 'ru-ru': 'Определить метку на основе запроса', + 'es-es': 'Definir etiqueta según consulta', + 'fr-fr': "Définir l'étiquette en fonction de la requête", + 'uk-ua': 'Визначте мітку на основі запиту', + 'de-ch': 'Definieren Sie das Label basierend auf der Abfrage', + 'pt-br': 'Definir rótulo com base na consulta', }, treeMerge: { - comment: "Audit Log Action Type", - "en-us": "Tree Merge", - "ru-ru": "Слияние деревьев", - "es-es": "Fusión de árboles", - "fr-fr": "Fusion d'arbres", - "uk-ua": "Об'єднання дерев", - "de-ch": "Baumzusammenführung", - "pt-br": "Mesclagem de Árvores", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Merge', + 'ru-ru': 'Слияние деревьев', + 'es-es': 'Fusión de árboles', + 'fr-fr': "Fusion d'arbres", + 'uk-ua': "Об'єднання дерев", + 'de-ch': 'Baumzusammenführung', + 'pt-br': 'Mesclagem de Árvores', }, treeMove: { - comment: "Audit Log Action Type", - "en-us": "Tree Move", - "ru-ru": "Перемещение дерева", - "es-es": "Movimiento de árbol", - "fr-fr": "Déplacement d'arbre", - "uk-ua": "Переміщення дерева", - "de-ch": "Baum verschieben", - "pt-br": "Movimentação de árvores", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Move', + 'ru-ru': 'Перемещение дерева', + 'es-es': 'Movimiento de árbol', + 'fr-fr': "Déplacement d'arbre", + 'uk-ua': 'Переміщення дерева', + 'de-ch': 'Baum verschieben', + 'pt-br': 'Movimentação de árvores', }, treeSynonymize: { - comment: "Audit Log Action Type", - "en-us": "Tree Synonymize", - "ru-ru": "Дерево Синонимизировать", - "es-es": "Árbol Sinónimos", - "fr-fr": "Synonyme d'arbre", - "uk-ua": "Синонімізувати дерево", - "de-ch": "Baum synonymisieren", - "pt-br": "Árvore Sinonímia", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Synonymize', + 'ru-ru': 'Дерево Синонимизировать', + 'es-es': 'Árbol Sinónimos', + 'fr-fr': "Synonyme d'arbre", + 'uk-ua': 'Синонімізувати дерево', + 'de-ch': 'Baum synonymisieren', + 'pt-br': 'Árvore Sinonímia', }, treeDesynonymize: { - comment: "Audit Log Action Type", - "en-us": "Tree Desynonymize", - "ru-ru": "Дерево Десиномизирует", - "es-es": "Desinonimizar árboles", - "fr-fr": "Arbre désynonymisé", - "uk-ua": "Десинонімізація дерева", - "de-ch": "Baum-Desynonymisierung", - "pt-br": "Árvore Dessinonimizar", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Desynonymize', + 'ru-ru': 'Дерево Десиномизирует', + 'es-es': 'Desinonimizar árboles', + 'fr-fr': 'Arbre désynonymisé', + 'uk-ua': 'Десинонімізація дерева', + 'de-ch': 'Baum-Desynonymisierung', + 'pt-br': 'Árvore Dessinonimizar', }, treeBulkMove: { - comment: "Audit Log Action Type", - "en-us": "Tree Bulk Move", - "de-ch": "Massenverschiebung von Bäumen", - "es-es": "Movimiento masivo de árboles", - "fr-fr": "Déplacement d'arbres en vrac", - "ru-ru": "Массовая перевозка деревьев", - "uk-ua": "Масове переміщення дерева", - "pt-br": "Mudança de árvores em massa", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Bulk Move', + 'de-ch': 'Massenverschiebung von Bäumen', + 'es-es': 'Movimiento masivo de árboles', + 'fr-fr': "Déplacement d'arbres en vrac", + 'ru-ru': 'Массовая перевозка деревьев', + 'uk-ua': 'Масове переміщення дерева', + 'pt-br': 'Mudança de árvores em massa', }, tooLongErrorMessage: { - "en-us": - "Field value is too long. Max allowed length is {maxLength:number|formatted}", - "ru-ru": - "Значение поля слишком длинное. Максимально допустимая длина {maxLength:number|formatted}", - "es-es": - "El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.", - "fr-fr": - "La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.", - "uk-ua": - "Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}", - "de-ch": - "Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}.", - "pt-br": - "O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}", + 'en-us': + 'Field value is too long. Max allowed length is {maxLength:number|formatted}', + 'ru-ru': + 'Значение поля слишком длинное. Максимально допустимая длина {maxLength:number|formatted}', + 'es-es': + 'El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.', + 'fr-fr': + 'La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.', + 'uk-ua': + 'Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}', + 'de-ch': + 'Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}.', + 'pt-br': + 'O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}', }, future: { - "en-us": "in the future", - "de-ch": "in der Zukunft", - "es-es": "en el futuro", - "fr-fr": "à l'avenir", - "ru-ru": "в будущем", - "uk-ua": "в майбутньому", - "pt-br": "no futuro", + 'en-us': 'in the future', + 'de-ch': 'in der Zukunft', + 'es-es': 'en el futuro', + 'fr-fr': "à l'avenir", + 'ru-ru': 'в будущем', + 'uk-ua': 'в майбутньому', + 'pt-br': 'no futuro', }, past: { - "en-us": "in the past", - "de-ch": "in der Vergangenheit", - "es-es": "en el pasado", - "fr-fr": "dans le passé", - "ru-ru": "в прошлом", - "uk-ua": "в минулому", - "pt-br": "no passado", + 'en-us': 'in the past', + 'de-ch': 'in der Vergangenheit', + 'es-es': 'en el pasado', + 'fr-fr': 'dans le passé', + 'ru-ru': 'в прошлом', + 'uk-ua': 'в минулому', + 'pt-br': 'no passado', }, day: { - "en-us": "Days", - "es-es": "Días", - "fr-fr": "Jours", - "ru-ru": "Дни", - "uk-ua": "днів", - "de-ch": "Tage", - "pt-br": "Dias", + 'en-us': 'Days', + 'es-es': 'Días', + 'fr-fr': 'Jours', + 'ru-ru': 'Дни', + 'uk-ua': 'днів', + 'de-ch': 'Tage', + 'pt-br': 'Dias', }, week: { - "en-us": "Weeks", - "de-ch": "Wochen", - "es-es": "Semanas", - "fr-fr": "Semaines", - "ru-ru": "Недели", - "uk-ua": "тижнів", - "pt-br": "Semanas", + 'en-us': 'Weeks', + 'de-ch': 'Wochen', + 'es-es': 'Semanas', + 'fr-fr': 'Semaines', + 'ru-ru': 'Недели', + 'uk-ua': 'тижнів', + 'pt-br': 'Semanas', }, month: { - "en-us": "Months", - "de-ch": "Monate", - "es-es": "Meses", - "fr-fr": "Mois", - "ru-ru": "Месяцы", - "uk-ua": "Місяці", - "pt-br": "Meses", + 'en-us': 'Months', + 'de-ch': 'Monate', + 'es-es': 'Meses', + 'fr-fr': 'Mois', + 'ru-ru': 'Месяцы', + 'uk-ua': 'Місяці', + 'pt-br': 'Meses', }, year: { - "en-us": "Years", - "de-ch": "Jahre", - "es-es": "Años", - "fr-fr": "Années", - "ru-ru": "Годы", - "uk-ua": "років", - "pt-br": "Anos", + 'en-us': 'Years', + 'de-ch': 'Jahre', + 'es-es': 'Años', + 'fr-fr': 'Années', + 'ru-ru': 'Годы', + 'uk-ua': 'років', + 'pt-br': 'Anos', }, relativeDate: { comment: ` Used in query builder lines, will be shown as a number followed by a period of time (ie: day, month or week) then a direction (past or future) `, - "en-us": - "{size:number} {type:string} {direction:string}", - "de-ch": - "{size:number} {type:string} {direction:string}", - "es-es": - "{size:number} {type:string} {direction:string}", - "fr-fr": - "{size:number} {type:string} {direction:string}", - "ru-ru": - "{size:number} {type:string} {direction:string}", - "uk-ua": - "{size:number} {type:string} {direction:string}", - "pt-br": - "{size:number} {type:string} {direction:string}", + 'en-us': + '{size:number} {type:string} {direction:string}', + 'de-ch': + '{size:number} {type:string} {direction:string}', + 'es-es': + '{size:number} {type:string} {direction:string}', + 'fr-fr': + '{size:number} {type:string} {direction:string}', + 'ru-ru': + '{size:number} {type:string} {direction:string}', + 'uk-ua': + '{size:number} {type:string} {direction:string}', + 'pt-br': + '{size:number} {type:string} {direction:string}', }, importHiddenFields: { - "en-us": "The following fields are hidden in the query you imported:", - "es-es": "Los siguientes campos están ocultos en la consulta que importó:", - "fr-fr": - "Les champs suivants sont masqués dans la requête que vous avez importée :", - "ru-ru": "В импортированном вами запросе скрыты следующие поля:", - "uk-ua": "В імпортованому вами запиті приховано такі поля:", - "de-ch": - "Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:", - "pt-br": "Os seguintes campos estão ocultos na consulta que você importou:", + 'en-us': 'The following fields are hidden in the query you imported:', + 'es-es': 'Los siguientes campos están ocultos en la consulta que importó:', + 'fr-fr': + 'Les champs suivants sont masqués dans la requête que vous avez importée :', + 'ru-ru': 'В импортированном вами запросе скрыты следующие поля:', + 'uk-ua': 'В імпортованому вами запиті приховано такі поля:', + 'de-ch': + 'Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:', + 'pt-br': 'Os seguintes campos estão ocultos na consulta que você importou:', }, importNoReadPermission: { - "en-us": - "The query you imported contains tables you do not have read access to:", - "es-es": - "La consulta que importó contiene tablas a las que no tiene acceso de lectura:", - "fr-fr": - "La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :", - "ru-ru": - "Импортированный вами запрос содержит таблицы, к которым у вас нет прав на чтение:", - "uk-ua": - "Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:", - "de-ch": - "Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:", - "pt-br": - "A consulta que você importou contém tabelas às quais você não tem acesso de leitura:", + 'en-us': + 'The query you imported contains tables you do not have read access to:', + 'es-es': + 'La consulta que importó contiene tablas a las que no tiene acceso de lectura:', + 'fr-fr': + 'La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :', + 'ru-ru': + 'Импортированный вами запрос содержит таблицы, к которым у вас нет прав на чтение:', + 'uk-ua': + 'Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:', + 'de-ch': + 'Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:', + 'pt-br': + 'A consulta que você importou contém tabelas às quais você não tem acesso de leitura:', }, noReadPermission: { - "en-us": "No read permission", - "es-es": "Sin permiso de lectura", - "fr-fr": "Aucune autorisation de lecture", - "ru-ru": "Нет разрешения на чтение", - "uk-ua": "Немає дозволу на читання", - "de-ch": "Keine Leseberechtigung", - "pt-br": "Sem permissão de leitura", + 'en-us': 'No read permission', + 'es-es': 'Sin permiso de lectura', + 'fr-fr': 'Aucune autorisation de lecture', + 'ru-ru': 'Нет разрешения на чтение', + 'uk-ua': 'Немає дозволу на читання', + 'de-ch': 'Keine Leseberechtigung', + 'pt-br': 'Sem permissão de leitura', }, switchToRelative: { - "en-us": "Switch to relative", - "de-ch": "Wechseln zu relativ", - "es-es": "Cambiar a relativo", - "fr-fr": "Passer au relatif", - "ru-ru": "Переключиться на относительный", - "uk-ua": "Перейти до відносного", - "pt-br": "Mudar para relativo", + 'en-us': 'Switch to relative', + 'de-ch': 'Wechseln zu relativ', + 'es-es': 'Cambiar a relativo', + 'fr-fr': 'Passer au relatif', + 'ru-ru': 'Переключиться на относительный', + 'uk-ua': 'Перейти до відносного', + 'pt-br': 'Mudar para relativo', }, switchToAbsolute: { - "en-us": "Switch to absolute", - "de-ch": "Wechseln Sie zu absolut", - "es-es": "Cambiar a absoluto", - "fr-fr": "Passer à l'absolu", - "ru-ru": "Переключиться на абсолютный", - "uk-ua": "Перейти до відносного", - "pt-br": "Mudar para absoluto", + 'en-us': 'Switch to absolute', + 'de-ch': 'Wechseln Sie zu absolut', + 'es-es': 'Cambiar a absoluto', + 'fr-fr': "Passer à l'absolu", + 'ru-ru': 'Переключиться на абсолютный', + 'uk-ua': 'Перейти до відносного', + 'pt-br': 'Mudar para absoluto', }, scrollToEditor: { - "en-us": "Scroll to editor", - "de-ch": "Zum Editor scrollen", - "es-es": "Desplazarse al editor", - "uk-ua": "Перейдіть до редактора", - "fr-fr": "Faites défiler jusqu'à l'éditeur", - "ru-ru": "Прокрутите до редактора", - "pt-br": "Vá até o editor", + 'en-us': 'Scroll to editor', + 'de-ch': 'Zum Editor scrollen', + 'es-es': 'Desplazarse al editor', + 'uk-ua': 'Перейдіть до редактора', + 'fr-fr': "Faites défiler jusqu'à l'éditeur", + 'ru-ru': 'Прокрутите до редактора', + 'pt-br': 'Vá até o editor', }, viewRecords: { - "en-us": "View records", - "de-ch": "Datensätze anzeigen", - "es-es": "Ver registros", - "fr-fr": "Afficher les enregistrements", - "ru-ru": "Посмотреть записи", - "uk-ua": "Переглянути записи", - "pt-br": "Ver registros", + 'en-us': 'View records', + 'de-ch': 'Datensätze anzeigen', + 'es-es': 'Ver registros', + 'fr-fr': 'Afficher les enregistrements', + 'ru-ru': 'Посмотреть записи', + 'uk-ua': 'Переглянути записи', + 'pt-br': 'Ver registros', }, chooseFormatter: { - "en-us": "Choose formatter", - "de-ch": "Formatierer auswählen", - "es-es": "Elija el formateador", - "fr-fr": "Choisir le formateur", - "ru-ru": "Выбрать форматировщик", - "uk-ua": "Виберіть форматер", - "pt-br": "Escolha o formatador", + 'en-us': 'Choose formatter', + 'de-ch': 'Formatierer auswählen', + 'es-es': 'Elija el formateador', + 'fr-fr': 'Choisir le formateur', + 'ru-ru': 'Выбрать форматировщик', + 'uk-ua': 'Виберіть форматер', + 'pt-br': 'Escolha o formatador', }, range: { - "en-us": "Range", - "de-ch": "Reichweite", - "es-es": "Rango", - "fr-fr": "Gamme", - "pt-br": "Faixa", - "ru-ru": "Диапазон", - "uk-ua": "Діапазон", + 'en-us': 'Range', + 'de-ch': 'Reichweite', + 'es-es': 'Rango', + 'fr-fr': 'Gamme', + 'pt-br': 'Faixa', + 'ru-ru': 'Диапазон', + 'uk-ua': 'Діапазон', }, strict: { - "en-us": "Strict", - "de-ch": "Strikt", - "es-es": "Estricto", - "fr-fr": "Strict", - "pt-br": "Estrito", - "ru-ru": "Строгий", - "uk-ua": "Суворий", + 'en-us': 'Strict', + 'de-ch': 'Strikt', + 'es-es': 'Estricto', + 'fr-fr': 'Strict', + 'pt-br': 'Estrito', + 'ru-ru': 'Строгий', + 'uk-ua': 'Суворий', }, nonStrict: { - "en-us": "Non strict", - "de-ch": "Nicht streng", - "es-es": "No estricto", - "fr-fr": "Non strict", - "pt-br": "Não rigoroso", - "ru-ru": "Не строгий", - "uk-ua": "Не суворий", + 'en-us': 'Non strict', + 'de-ch': 'Nicht streng', + 'es-es': 'No estricto', + 'fr-fr': 'Non strict', + 'pt-br': 'Não rigoroso', + 'ru-ru': 'Не строгий', + 'uk-ua': 'Не суворий', }, catalogNumberInheritance: { - "en-us": "Catalog Number Inheritance", - "de-ch": "Katalognummernvererbung", - "es-es": "Herencia del número de catálogo", - "fr-fr": "Héritage du numéro de catalogue", - "pt-br": "Herança de Número de Catálogo", - "ru-ru": "Наследование каталожного номера", - "uk-ua": "Успадкування каталожних номерів", + 'en-us': 'Catalog Number Inheritance', + 'de-ch': 'Katalognummernvererbung', + 'es-es': 'Herencia del número de catálogo', + 'fr-fr': 'Héritage du numéro de catalogue', + 'pt-br': 'Herança de Número de Catálogo', + 'ru-ru': 'Наследование каталожного номера', + 'uk-ua': 'Успадкування каталожних номерів', }, catalogNumberParentCOInheritance: { - "en-us": "Catalog Number Parent Collection Object Inheritance", - "de-ch": "Katalognummer Übergeordnete Sammlung Objektvererbung", - "es-es": - "Herencia de objetos de la colección principal del número de catálogo", - "fr-fr": "Numéro de catalogue Collection parente Héritage d'objet", - "pt-br": "Herança de objeto de coleção pai de número de catálogo", - "ru-ru": "Номер каталога Родительская коллекция Объект Наследование", - "uk-ua": "Успадкування батьківського об'єкта колекції за номером каталогу", + 'en-us': 'Catalog Number Parent Collection Object Inheritance', + 'de-ch': 'Katalognummer Übergeordnete Sammlung Objektvererbung', + 'es-es': + 'Herencia de objetos de la colección principal del número de catálogo', + 'fr-fr': "Numéro de catalogue Collection parente Héritage d'objet", + 'pt-br': 'Herança de objeto de coleção pai de número de catálogo', + 'ru-ru': 'Номер каталога Родительская коллекция Объект Наследование', + 'uk-ua': "Успадкування батьківського об'єкта колекції за номером каталогу", }, formatInputAs: { comment: ` @@ -955,33 +955,33 @@ export const queryText = createDictionary({ Example: Format As: Ichthyology Example: Format As: Rock, Mineral `, - "en-us": "Format As: {commaSeparatedFormats:string}", - "de-ch": "Formatieren als: {commaSeparatedFormats:string}", - "es-es": "Formato como: {commaSeparatedFormats:string}", - "fr-fr": "Formater comme : {commaSeparatedFormats:string}", - "pt-br": "Formato como: {commaSeparatedFormats:string}", - "ru-ru": "Форматировать как: {commaSeparatedFormats:string}", - "uk-ua": "Форматувати як: {commaSeparatedFormats:string}", + 'en-us': 'Format As: {commaSeparatedFormats:string}', + 'de-ch': 'Formatieren als: {commaSeparatedFormats:string}', + 'es-es': 'Formato como: {commaSeparatedFormats:string}', + 'fr-fr': 'Formater comme : {commaSeparatedFormats:string}', + 'pt-br': 'Formato como: {commaSeparatedFormats:string}', + 'ru-ru': 'Форматировать как: {commaSeparatedFormats:string}', + 'uk-ua': 'Форматувати як: {commaSeparatedFormats:string}', }, unsavedChangesInQuery: { - "en-us": "Query has unsaved changes", - "de-ch": "Die Abfrage enthält nicht gespeicherte Änderungen", - "es-es": "La consulta tiene cambios sin guardar", - "fr-fr": "La requête comporte des modifications non enregistrées", - "pt-br": "A consulta possui alterações não salvas", - "ru-ru": "Запрос имеет несохраненные изменения", - "uk-ua": "Запит містить незбережені зміни", + 'en-us': 'Query has unsaved changes', + 'de-ch': 'Die Abfrage enthält nicht gespeicherte Änderungen', + 'es-es': 'La consulta tiene cambios sin guardar', + 'fr-fr': 'La requête comporte des modifications non enregistrées', + 'pt-br': 'A consulta possui alterações não salvas', + 'ru-ru': 'Запрос имеет несохраненные изменения', + 'uk-ua': 'Запит містить незбережені зміни', }, unsavedChangesInQueryDescription: { - "en-us": "Please save the query before running Batch Edit", - "de-ch": - "Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen", - "es-es": "Guarde la consulta antes de ejecutar la edición por lotes", - "fr-fr": + 'en-us': 'Please save the query before running Batch Edit', + 'de-ch': + 'Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen', + 'es-es': 'Guarde la consulta antes de ejecutar la edición por lotes', + 'fr-fr': "Veuillez enregistrer la requête avant d'exécuter l'édition par lots", - "pt-br": "Salve a consulta antes de executar a edição em lote", - "ru-ru": - "Пожалуйста, сохраните запрос перед запуском пакетного редактирования.", - "uk-ua": "Будь ласка, збережіть запит перед запуском пакетного редагування", + 'pt-br': 'Salve a consulta antes de executar a edição em lote', + 'ru-ru': + 'Пожалуйста, сохраните запрос перед запуском пакетного редактирования.', + 'uk-ua': 'Будь ласка, збережіть запит перед запуском пакетного редагування', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/schema.ts b/specifyweb/frontend/js_src/lib/localization/schema.ts index 6dccacc9925..f07c5e6de3f 100644 --- a/specifyweb/frontend/js_src/lib/localization/schema.ts +++ b/specifyweb/frontend/js_src/lib/localization/schema.ts @@ -4,549 +4,549 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const schemaText = createDictionary({ table: { - "en-us": "Table", - "ru-ru": "Стол", - "es-es": "Mesa", - "fr-fr": "Tableau", - "uk-ua": "Таблиця", - "de-ch": "Tabelle", - "pt-br": "Mesa", + 'en-us': 'Table', + 'ru-ru': 'Стол', + 'es-es': 'Mesa', + 'fr-fr': 'Tableau', + 'uk-ua': 'Таблиця', + 'de-ch': 'Tabelle', + 'pt-br': 'Mesa', }, tables: { - "en-us": "Tables", - "ru-ru": "Таблицы", - "es-es": "Tablas", - "fr-fr": "Tableaux", - "uk-ua": "Столи", - "de-ch": "Tabellen", - "pt-br": "Tabelas", + 'en-us': 'Tables', + 'ru-ru': 'Таблицы', + 'es-es': 'Tablas', + 'fr-fr': 'Tableaux', + 'uk-ua': 'Столи', + 'de-ch': 'Tabellen', + 'pt-br': 'Tabelas', }, tableName: { - "en-us": "Table Name", - "ru-ru": "Название таблицы", - "fr-fr": "Nom de la table", - "uk-ua": "Назва таблиці", - "de-ch": "Tabellennamen", - "es-es": "Nombre de la tabla", - "pt-br": "Nome da tabela", + 'en-us': 'Table Name', + 'ru-ru': 'Название таблицы', + 'fr-fr': 'Nom de la table', + 'uk-ua': 'Назва таблиці', + 'de-ch': 'Tabellennamen', + 'es-es': 'Nombre de la tabla', + 'pt-br': 'Nome da tabela', }, withoutTable: { - "en-us": "Without Table", - "de-ch": "Ohne Tisch", - "es-es": "Sin mesa", - "fr-fr": "Sans table", - "ru-ru": "Без таблицы", - "uk-ua": "Без столу", - "pt-br": "Sem mesa", + 'en-us': 'Without Table', + 'de-ch': 'Ohne Tisch', + 'es-es': 'Sin mesa', + 'fr-fr': 'Sans table', + 'ru-ru': 'Без таблицы', + 'uk-ua': 'Без столу', + 'pt-br': 'Sem mesa', }, schemaConfig: { - "en-us": "Schema Config", - "ru-ru": "Конфигурация схемы", - "es-es": "Configuración del esquema", - "fr-fr": "Configuration du schéma", - "uk-ua": "Конфігурація схеми", - "de-ch": "Schema konfigurieren", - "pt-br": "Configuração do esquema", + 'en-us': 'Schema Config', + 'ru-ru': 'Конфигурация схемы', + 'es-es': 'Configuración del esquema', + 'fr-fr': 'Configuration du schéma', + 'uk-ua': 'Конфігурація схеми', + 'de-ch': 'Schema konfigurieren', + 'pt-br': 'Configuração do esquema', }, unsavedSchemaUnloadProtect: { - "en-us": "Schema changes have not been saved", - "ru-ru": "Изменения схемы не были сохранены", - "es-es": "Los cambios de esquema no se han guardado", - "fr-fr": "Les modifications du schéma n'ont pas été enregistrées", - "uk-ua": "Зміни схеми не збережено", - "de-ch": "Schema Änderungen wurden nicht gespeichert", - "pt-br": "As alterações de esquema não foram salvas", + 'en-us': 'Schema changes have not been saved', + 'ru-ru': 'Изменения схемы не были сохранены', + 'es-es': 'Los cambios de esquema no se han guardado', + 'fr-fr': "Les modifications du schéma n'ont pas été enregistrées", + 'uk-ua': 'Зміни схеми не збережено', + 'de-ch': 'Schema Änderungen wurden nicht gespeichert', + 'pt-br': 'As alterações de esquema não foram salvas', }, changeBaseTable: { - "en-us": "Change Base Table", - "ru-ru": "Изменить базовую таблицу", - "es-es": "Cambiar la tabla base", - "fr-fr": "Changer la table de base", - "uk-ua": "Змінити базову таблицю", - "de-ch": "Basis-Tabelle ändern", - "pt-br": "Alterar tabela base", + 'en-us': 'Change Base Table', + 'ru-ru': 'Изменить базовую таблицу', + 'es-es': 'Cambiar la tabla base', + 'fr-fr': 'Changer la table de base', + 'uk-ua': 'Змінити базову таблицю', + 'de-ch': 'Basis-Tabelle ändern', + 'pt-br': 'Alterar tabela base', }, field: { - "en-us": "Field", - "ru-ru": "Поле", - "es-es": "Campo", - "fr-fr": "Champ", - "uk-ua": "Поле", - "de-ch": "Feld", - "pt-br": "Campo", + 'en-us': 'Field', + 'ru-ru': 'Поле', + 'es-es': 'Campo', + 'fr-fr': 'Champ', + 'uk-ua': 'Поле', + 'de-ch': 'Feld', + 'pt-br': 'Campo', }, fields: { - "en-us": "Fields", - "ru-ru": "Поля", - "es-es": "Campos", - "fr-fr": "Champs", - "uk-ua": "Поля", - "de-ch": "Felder", - "pt-br": "Campos", + 'en-us': 'Fields', + 'ru-ru': 'Поля', + 'es-es': 'Campos', + 'fr-fr': 'Champs', + 'uk-ua': 'Поля', + 'de-ch': 'Felder', + 'pt-br': 'Campos', }, relationships: { - "en-us": "Relationships", - "ru-ru": "Отношения", - "es-es": "Relaciones", - "fr-fr": "Relations", - "uk-ua": "Стосунки", - "de-ch": "Beziehungen", - "pt-br": "Relacionamentos", + 'en-us': 'Relationships', + 'ru-ru': 'Отношения', + 'es-es': 'Relaciones', + 'fr-fr': 'Relations', + 'uk-ua': 'Стосунки', + 'de-ch': 'Beziehungen', + 'pt-br': 'Relacionamentos', }, database: { - "en-us": "Database", - "de-ch": "Datenbank", - "fr-fr": "Base de données", - "ru-ru": "База данных", - "uk-ua": "База даних", - "es-es": "Base de datos", - "pt-br": "Banco de dados", + 'en-us': 'Database', + 'de-ch': 'Datenbank', + 'fr-fr': 'Base de données', + 'ru-ru': 'База данных', + 'uk-ua': 'База даних', + 'es-es': 'Base de datos', + 'pt-br': 'Banco de dados', }, setScope: { - "en-us": "Set Scope", - "de-ch": "Umfang festlegen", - "es-es": "Establecer alcance", - "fr-fr": "Définir la portée", - "ru-ru": "Установить область действия", - "uk-ua": "Встановити область дії", - "pt-br": "Definir escopo", + 'en-us': 'Set Scope', + 'de-ch': 'Umfang festlegen', + 'es-es': 'Establecer alcance', + 'fr-fr': 'Définir la portée', + 'ru-ru': 'Установить область действия', + 'uk-ua': 'Встановити область дії', + 'pt-br': 'Definir escopo', }, caption: { - "en-us": "Caption", - "ru-ru": "Подпись", - "es-es": "Subtítulo", - "fr-fr": "Légende", - "uk-ua": "Підпис", - "de-ch": "Beschriftung", - "pt-br": "Rubrica", + 'en-us': 'Caption', + 'ru-ru': 'Подпись', + 'es-es': 'Subtítulo', + 'fr-fr': 'Légende', + 'uk-ua': 'Підпис', + 'de-ch': 'Beschriftung', + 'pt-br': 'Rubrica', }, description: { - "en-us": "Description", - "ru-ru": "Описание", - "es-es": "Descripción", - "fr-fr": "Description", - "uk-ua": "Опис", - "de-ch": "Beschreibung", - "pt-br": "Descrição", + 'en-us': 'Description', + 'ru-ru': 'Описание', + 'es-es': 'Descripción', + 'fr-fr': 'Description', + 'uk-ua': 'Опис', + 'de-ch': 'Beschreibung', + 'pt-br': 'Descrição', }, hideTable: { - "en-us": "Hide Table", - "ru-ru": "Скрыть таблицу", - "es-es": "Ocultar tabla", - "fr-fr": "Masquer le tableau", - "uk-ua": "Приховати таблицю", - "de-ch": "Tabelle verbergen", - "pt-br": "Ocultar tabela", + 'en-us': 'Hide Table', + 'ru-ru': 'Скрыть таблицу', + 'es-es': 'Ocultar tabla', + 'fr-fr': 'Masquer le tableau', + 'uk-ua': 'Приховати таблицю', + 'de-ch': 'Tabelle verbergen', + 'pt-br': 'Ocultar tabela', }, hideField: { - "en-us": "Hide Field", - "ru-ru": "Скрыть поле", - "es-es": "Ocultar campo", - "fr-fr": "Masquer le champ", - "uk-ua": "Приховати поле", - "de-ch": "Feld verbergen", - "pt-br": "Ocultar campo", + 'en-us': 'Hide Field', + 'ru-ru': 'Скрыть поле', + 'es-es': 'Ocultar campo', + 'fr-fr': 'Masquer le champ', + 'uk-ua': 'Приховати поле', + 'de-ch': 'Feld verbergen', + 'pt-br': 'Ocultar campo', }, tableFormat: { - "en-us": "Table Format", - "ru-ru": "Формат таблицы", - "es-es": "Formato de tabla", - "fr-fr": "Format de tableau", - "uk-ua": "Формат таблиці", - "de-ch": "Tabellenformat", - "pt-br": "Formato de tabela", + 'en-us': 'Table Format', + 'ru-ru': 'Формат таблицы', + 'es-es': 'Formato de tabla', + 'fr-fr': 'Format de tableau', + 'uk-ua': 'Формат таблиці', + 'de-ch': 'Tabellenformat', + 'pt-br': 'Formato de tabela', }, tableAggregation: { - "en-us": "Table Aggregation", - "ru-ru": "Агрегация таблиц", - "es-es": "Agregación de tablas", - "fr-fr": "Agrégation de tables", - "uk-ua": "Агрегація таблиць", - "de-ch": "Tabellenaggregation", - "pt-br": "Agregação de tabelas", + 'en-us': 'Table Aggregation', + 'ru-ru': 'Агрегация таблиц', + 'es-es': 'Agregación de tablas', + 'fr-fr': 'Agrégation de tables', + 'uk-ua': 'Агрегація таблиць', + 'de-ch': 'Tabellenaggregation', + 'pt-br': 'Agregação de tabelas', }, oneToOne: { - "en-us": "One-to-one", - "ru-ru": "Один на один", - "es-es": "Cara a cara", - "fr-fr": "Un à un", - "uk-ua": "Один на один", - "de-ch": "Eins zu eins", - "pt-br": "Um para um", + 'en-us': 'One-to-one', + 'ru-ru': 'Один на один', + 'es-es': 'Cara a cara', + 'fr-fr': 'Un à un', + 'uk-ua': 'Один на один', + 'de-ch': 'Eins zu eins', + 'pt-br': 'Um para um', }, oneToMany: { - "en-us": "One-to-many", - "ru-ru": "Один-ко-многим", - "es-es": "Uno a muchos", - "fr-fr": "Un-à-plusieurs", - "uk-ua": "Один до багатьох", - "de-ch": "Eins zu vielen", - "pt-br": "Um para muitos", + 'en-us': 'One-to-many', + 'ru-ru': 'Один-ко-многим', + 'es-es': 'Uno a muchos', + 'fr-fr': 'Un-à-plusieurs', + 'uk-ua': 'Один до багатьох', + 'de-ch': 'Eins zu vielen', + 'pt-br': 'Um para muitos', }, manyToOne: { - "en-us": "Many-to-one", - "ru-ru": "Многие-к-одному", - "es-es": "Muchos a uno", - "fr-fr": "Plusieurs à un", - "uk-ua": "Багато до одного", - "de-ch": "Viele zu eins", - "pt-br": "Muitos para um", + 'en-us': 'Many-to-one', + 'ru-ru': 'Многие-к-одному', + 'es-es': 'Muchos a uno', + 'fr-fr': 'Plusieurs à un', + 'uk-ua': 'Багато до одного', + 'de-ch': 'Viele zu eins', + 'pt-br': 'Muitos para um', }, manyToMany: { - "en-us": "many-to-many", - "ru-ru": "многие-ко-многим", - "es-es": "de muchos a muchos", - "fr-fr": "plusieurs à plusieurs", - "uk-ua": "багато-до-багатьох", - "de-ch": "Viele zu viele", - "pt-br": "muitos para muitos", + 'en-us': 'many-to-many', + 'ru-ru': 'многие-ко-многим', + 'es-es': 'de muchos a muchos', + 'fr-fr': 'plusieurs à plusieurs', + 'uk-ua': 'багато-до-багатьох', + 'de-ch': 'Viele zu viele', + 'pt-br': 'muitos para muitos', }, fieldLength: { - "en-us": "Length", - "es-es": "Longitud", - "fr-fr": "Longueur", - "uk-ua": "Довжина", - "de-ch": "Länge", - "ru-ru": "Длина", - "pt-br": "Comprimento", + 'en-us': 'Length', + 'es-es': 'Longitud', + 'fr-fr': 'Longueur', + 'uk-ua': 'Довжина', + 'de-ch': 'Länge', + 'ru-ru': 'Длина', + 'pt-br': 'Comprimento', }, readOnly: { - "en-us": "Read-only", - "ru-ru": "Только для чтения", - "es-es": "Sólo lectura", - "fr-fr": "Lecture seule", - "uk-ua": "Тільки для читання", - "de-ch": "Nur-Lesen", - "pt-br": "Somente leitura", + 'en-us': 'Read-only', + 'ru-ru': 'Только для чтения', + 'es-es': 'Sólo lectura', + 'fr-fr': 'Lecture seule', + 'uk-ua': 'Тільки для читання', + 'de-ch': 'Nur-Lesen', + 'pt-br': 'Somente leitura', }, fieldFormat: { - "en-us": "Field Format", - "ru-ru": "Формат поля", - "es-es": "Formato de campo", - "fr-fr": "Format de champ", - "uk-ua": "Формат поля", - "de-ch": "Feldformat", - "pt-br": "Formato de campo", + 'en-us': 'Field Format', + 'ru-ru': 'Формат поля', + 'es-es': 'Formato de campo', + 'fr-fr': 'Format de champ', + 'uk-ua': 'Формат поля', + 'de-ch': 'Feldformat', + 'pt-br': 'Formato de campo', }, uiFormattersForField: { - "en-us": "Field Formatters for {fieldLabel:string}", - "de-ch": "Feldformatierer für {fieldLabel:string}", - "es-es": "Formateadores de campos para {fieldLabel:string}", - "fr-fr": "Formateurs de champs pour {fieldLabel:string}", - "pt-br": "Formatadores de campo para {fieldLabel:string}", - "ru-ru": "Форматировщики полей для {fieldLabel:string}", - "uk-ua": "Форматування полів для {fieldLabel:string}", + 'en-us': 'Field Formatters for {fieldLabel:string}', + 'de-ch': 'Feldformatierer für {fieldLabel:string}', + 'es-es': 'Formateadores de campos para {fieldLabel:string}', + 'fr-fr': 'Formateurs de champs pour {fieldLabel:string}', + 'pt-br': 'Formatadores de campo para {fieldLabel:string}', + 'ru-ru': 'Форматировщики полей для {fieldLabel:string}', + 'uk-ua': 'Форматування полів для {fieldLabel:string}', }, formatted: { - "en-us": "Formatted", - "ru-ru": "Отформатированный", - "es-es": "Formateado", - "fr-fr": "Formaté", - "uk-ua": "Відформатовано", - "de-ch": "Formatiert", - "pt-br": "Formatado", + 'en-us': 'Formatted', + 'ru-ru': 'Отформатированный', + 'es-es': 'Formateado', + 'fr-fr': 'Formaté', + 'uk-ua': 'Відформатовано', + 'de-ch': 'Formatiert', + 'pt-br': 'Formatado', }, webLink: { - "en-us": "Web Link", - "ru-ru": "Веб-ссылка", - "es-es": "Enlace web", - "fr-fr": "Lien Web", - "uk-ua": "Веб-посиланні", - "de-ch": "Web-Link", - "pt-br": "Link da Web", + 'en-us': 'Web Link', + 'ru-ru': 'Веб-ссылка', + 'es-es': 'Enlace web', + 'fr-fr': 'Lien Web', + 'uk-ua': 'Веб-посиланні', + 'de-ch': 'Web-Link', + 'pt-br': 'Link da Web', }, userDefined: { - "en-us": "User Defined", - "es-es": "Definido por el usuario", - "fr-fr": "Défini par l'utilisateur", - "uk-ua": "Визначено користувачем", - "de-ch": "Benutzerdefiniert", - "ru-ru": "Определяется пользователем", - "pt-br": "Definido pelo usuário", + 'en-us': 'User Defined', + 'es-es': 'Definido por el usuario', + 'fr-fr': "Défini par l'utilisateur", + 'uk-ua': 'Визначено користувачем', + 'de-ch': 'Benutzerdefiniert', + 'ru-ru': 'Определяется пользователем', + 'pt-br': 'Definido pelo usuário', }, addLanguage: { - "en-us": "Add Language", - "fr-fr": "Ajouter une langue", - "uk-ua": "Додати мову", - "de-ch": "Sprache hinzuzufügen", - "es-es": "Agregar idioma", - "ru-ru": "Добавить язык", - "pt-br": "Adicionar idioma", + 'en-us': 'Add Language', + 'fr-fr': 'Ajouter une langue', + 'uk-ua': 'Додати мову', + 'de-ch': 'Sprache hinzuzufügen', + 'es-es': 'Agregar idioma', + 'ru-ru': 'Добавить язык', + 'pt-br': 'Adicionar idioma', }, databaseColumn: { - "en-us": "Database Column", - "ru-ru": "Колонка базы данных", - "es-es": "Columna de base de datos", - "fr-fr": "Colonne de base de données", - "uk-ua": "Стовпець бази даних", - "de-ch": "Datenbank-Spalte", - "pt-br": "Coluna do Banco de Dados", + 'en-us': 'Database Column', + 'ru-ru': 'Колонка базы данных', + 'es-es': 'Columna de base de datos', + 'fr-fr': 'Colonne de base de données', + 'uk-ua': 'Стовпець бази даних', + 'de-ch': 'Datenbank-Spalte', + 'pt-br': 'Coluna do Banco de Dados', }, relatedTable: { - "en-us": "Related Model", - "ru-ru": "Связанная модель", - "es-es": "Modelo relacionado", - "fr-fr": "Modèle associé", - "uk-ua": "Пов'язана модель", - "de-ch": "Zugehöriges Modell", - "pt-br": "Modelo relacionado", + 'en-us': 'Related Model', + 'ru-ru': 'Связанная модель', + 'es-es': 'Modelo relacionado', + 'fr-fr': 'Modèle associé', + 'uk-ua': "Пов'язана модель", + 'de-ch': 'Zugehöriges Modell', + 'pt-br': 'Modelo relacionado', }, otherSideName: { - "en-us": "Other side name", - "ru-ru": "Имя другой стороны", - "fr-fr": "Nom de l'autre côté", - "uk-ua": "Інша назва сторони", - "de-ch": "Name der anderen Seite", - "es-es": "Nombre del otro lado", - "pt-br": "Nome do outro lado", + 'en-us': 'Other side name', + 'ru-ru': 'Имя другой стороны', + 'fr-fr': "Nom de l'autre côté", + 'uk-ua': 'Інша назва сторони', + 'de-ch': 'Name der anderen Seite', + 'es-es': 'Nombre del otro lado', + 'pt-br': 'Nome do outro lado', }, dependent: { - "en-us": "Dependent", - "ru-ru": "Зависимый", - "es-es": "Dependiente", - "fr-fr": "Dépendant", - "uk-ua": "Утриманець", - "de-ch": "Abhängig", - "pt-br": "Dependente", + 'en-us': 'Dependent', + 'ru-ru': 'Зависимый', + 'es-es': 'Dependiente', + 'fr-fr': 'Dépendant', + 'uk-ua': 'Утриманець', + 'de-ch': 'Abhängig', + 'pt-br': 'Dependente', }, independent: { - "en-us": "Independent", - "es-es": "Independiente", - "fr-fr": "Indépendant", - "ru-ru": "Независимый", - "uk-ua": "Незалежний", - "de-ch": "Unabhängig", - "pt-br": "Independente", + 'en-us': 'Independent', + 'es-es': 'Independiente', + 'fr-fr': 'Indépendant', + 'ru-ru': 'Независимый', + 'uk-ua': 'Незалежний', + 'de-ch': 'Unabhängig', + 'pt-br': 'Independente', }, downloadAsJson: { - "en-us": "Download as JSON", - "ru-ru": "Скачать как JSON", - "es-es": "Descargar como JSON", - "fr-fr": "Télécharger au format JSON", - "uk-ua": "Завантажити як JSON", - "de-ch": "Als JSON herunterladen", - "pt-br": "Baixar como JSON", + 'en-us': 'Download as JSON', + 'ru-ru': 'Скачать как JSON', + 'es-es': 'Descargar como JSON', + 'fr-fr': 'Télécharger au format JSON', + 'uk-ua': 'Завантажити як JSON', + 'de-ch': 'Als JSON herunterladen', + 'pt-br': 'Baixar como JSON', }, downloadAsXml: { - "en-us": "Download as XML", - "ru-ru": "Загрузить как XML", - "es-es": "Descargar como XML", - "fr-fr": "Télécharger au format XML", - "uk-ua": "Завантажити як XML", - "de-ch": "Als XML herunterladen", - "pt-br": "Baixar como XML", + 'en-us': 'Download as XML', + 'ru-ru': 'Загрузить как XML', + 'es-es': 'Descargar como XML', + 'fr-fr': 'Télécharger au format XML', + 'uk-ua': 'Завантажити як XML', + 'de-ch': 'Als XML herunterladen', + 'pt-br': 'Baixar como XML', }, downloadAsTsv: { - "en-us": "Download as TSV", - "ru-ru": "Загрузить как TSV", - "es-es": "Descargar como TSV", - "fr-fr": "Télécharger au format TSV", - "uk-ua": "Завантажити як TSV", - "de-ch": "Als TSV herunterladen", - "pt-br": "Baixar como TSV", + 'en-us': 'Download as TSV', + 'ru-ru': 'Загрузить как TSV', + 'es-es': 'Descargar como TSV', + 'fr-fr': 'Télécharger au format TSV', + 'uk-ua': 'Завантажити як TSV', + 'de-ch': 'Als TSV herunterladen', + 'pt-br': 'Baixar como TSV', }, tableId: { - "en-us": "Table ID", - "ru-ru": "Идентификатор таблицы", - "es-es": "ID de tabla", - "fr-fr": "ID de la table", - "uk-ua": "Ідентифікатор таблиці", - "de-ch": "Tabellen-ID", - "pt-br": "ID da tabela", + 'en-us': 'Table ID', + 'ru-ru': 'Идентификатор таблицы', + 'es-es': 'ID de tabla', + 'fr-fr': 'ID de la table', + 'uk-ua': 'Ідентифікатор таблиці', + 'de-ch': 'Tabellen-ID', + 'pt-br': 'ID da tabela', }, fieldCount: { - "en-us": "Field count", - "ru-ru": "Количество полей", - "es-es": "Recuento de campos", - "fr-fr": "Nombre de champs", - "uk-ua": "Кількість полів", - "de-ch": "Anzahl Felder", - "pt-br": "Contagem de campos", + 'en-us': 'Field count', + 'ru-ru': 'Количество полей', + 'es-es': 'Recuento de campos', + 'fr-fr': 'Nombre de champs', + 'uk-ua': 'Кількість полів', + 'de-ch': 'Anzahl Felder', + 'pt-br': 'Contagem de campos', }, relationshipCount: { - "en-us": "Relationship count", - "ru-ru": "Количество отношений", - "es-es": "Recuento de relaciones", - "fr-fr": "Nombre de relations", - "uk-ua": "Кількість зв'язків", - "de-ch": "Anzahl Beziehungen", - "pt-br": "Contagem de relacionamento", + 'en-us': 'Relationship count', + 'ru-ru': 'Количество отношений', + 'es-es': 'Recuento de relaciones', + 'fr-fr': 'Nombre de relations', + 'uk-ua': "Кількість зв'язків", + 'de-ch': 'Anzahl Beziehungen', + 'pt-br': 'Contagem de relacionamento', }, databaseSchema: { - "en-us": "Database Schema", - "ru-ru": "Схема базы данных", - "es-es": "Esquema de base de datos", - "fr-fr": "Schéma de base de données", - "uk-ua": "Схема бази даних", - "de-ch": "Datenbankschema", - "pt-br": "Esquema de banco de dados", + 'en-us': 'Database Schema', + 'ru-ru': 'Схема базы данных', + 'es-es': 'Esquema de base de datos', + 'fr-fr': 'Schéma de base de données', + 'uk-ua': 'Схема бази даних', + 'de-ch': 'Datenbankschema', + 'pt-br': 'Esquema de banco de dados', }, selectedTables: { - "en-us": "Selected Tables", - "ru-ru": "Избранные таблицы", - "es-es": "Tablas seleccionadas", - "fr-fr": "Tableaux sélectionnés", - "uk-ua": "Вибрані таблиці", - "de-ch": "Ausgewählte Tabellen", - "pt-br": "Tabelas Selecionadas", + 'en-us': 'Selected Tables', + 'ru-ru': 'Избранные таблицы', + 'es-es': 'Tablas seleccionadas', + 'fr-fr': 'Tableaux sélectionnés', + 'uk-ua': 'Вибрані таблиці', + 'de-ch': 'Ausgewählte Tabellen', + 'pt-br': 'Tabelas Selecionadas', }, possibleTables: { - "en-us": "Possible Tables", - "ru-ru": "Возможные таблицы", - "es-es": "Tablas posibles", - "fr-fr": "Tableaux possibles", - "uk-ua": "Можливі таблиці", - "de-ch": "Mögliche Tabellen", - "pt-br": "Tabelas Possíveis", + 'en-us': 'Possible Tables', + 'ru-ru': 'Возможные таблицы', + 'es-es': 'Tablas posibles', + 'fr-fr': 'Tableaux possibles', + 'uk-ua': 'Можливі таблиці', + 'de-ch': 'Mögliche Tabellen', + 'pt-br': 'Tabelas Possíveis', }, goToTop: { - "en-us": "Go to top", - "es-es": "Ir arriba", - "fr-fr": "Aller en haut", - "uk-ua": "Перейти на початок", - "de-ch": "Nach oben", - "ru-ru": "Перейти наверх", - "pt-br": "Ir para o topo", + 'en-us': 'Go to top', + 'es-es': 'Ir arriba', + 'fr-fr': 'Aller en haut', + 'uk-ua': 'Перейти на початок', + 'de-ch': 'Nach oben', + 'ru-ru': 'Перейти наверх', + 'pt-br': 'Ir para o topo', }, idField: { - "en-us": "ID Field", - "es-es": "Campo de identificación", - "fr-fr": "Champ d'identification", - "ru-ru": "Поле идентификатора", - "uk-ua": "Поле ідентифікатора", - "de-ch": "Feld-ID", - "pt-br": "Campo ID", + 'en-us': 'ID Field', + 'es-es': 'Campo de identificación', + 'fr-fr': "Champ d'identification", + 'ru-ru': 'Поле идентификатора', + 'uk-ua': 'Поле ідентифікатора', + 'de-ch': 'Feld-ID', + 'pt-br': 'Campo ID', }, tableUniquenessRules: { - "en-us": "{tableName:string} Uniqueness Rules", - "de-ch": "{tableName:string} Eindeutigkeitsregeln", - "es-es": "{tableName:string} Reglas de unicidad", - "fr-fr": "{tableName:string} Règles d'unicité", - "ru-ru": "{tableName:string} Правила уникальности", - "uk-ua": "{tableName:string} Правила унікальності", - "pt-br": "{tableName:string} Regras de Unicidade", + 'en-us': '{tableName:string} Uniqueness Rules', + 'de-ch': '{tableName:string} Eindeutigkeitsregeln', + 'es-es': '{tableName:string} Reglas de unicidad', + 'fr-fr': "{tableName:string} Règles d'unicité", + 'ru-ru': '{tableName:string} Правила уникальности', + 'uk-ua': '{tableName:string} Правила унікальності', + 'pt-br': '{tableName:string} Regras de Unicidade', }, uniquenessRules: { - "en-us": "Uniqueness Rules", - "de-ch": "Eindeutigkeitsregeln", - "es-es": "Reglas de unicidad", - "fr-fr": "Règles d'unicité", - "ru-ru": "Правила уникальности", - "uk-ua": "Правила унікальності", - "pt-br": "Regras de Unicidade", + 'en-us': 'Uniqueness Rules', + 'de-ch': 'Eindeutigkeitsregeln', + 'es-es': 'Reglas de unicidad', + 'fr-fr': "Règles d'unicité", + 'ru-ru': 'Правила уникальности', + 'uk-ua': 'Правила унікальності', + 'pt-br': 'Regras de Unicidade', }, uniqueFields: { - "en-us": "Unique Fields", - "de-ch": "Eindeutige Felder", - "es-es": "Campos únicos", - "fr-fr": "Champs uniques", - "ru-ru": "Уникальные поля", - "uk-ua": "Унікальні поля", - "pt-br": "Campos Únicos", + 'en-us': 'Unique Fields', + 'de-ch': 'Eindeutige Felder', + 'es-es': 'Campos únicos', + 'fr-fr': 'Champs uniques', + 'ru-ru': 'Уникальные поля', + 'uk-ua': 'Унікальні поля', + 'pt-br': 'Campos Únicos', }, addUniquenessRule: { - "en-us": "Add Uniqueness Rule", - "de-ch": "Eindeutigkeitsregel hinzufügen", - "es-es": "Agregar regla de unicidad", - "fr-fr": "Ajouter une règle d'unicité", - "ru-ru": "Добавить правило уникальности", - "uk-ua": "Додати правило унікальності", - "pt-br": "Adicionar regra de exclusividade", + 'en-us': 'Add Uniqueness Rule', + 'de-ch': 'Eindeutigkeitsregel hinzufügen', + 'es-es': 'Agregar regla de unicidad', + 'fr-fr': "Ajouter une règle d'unicité", + 'ru-ru': 'Добавить правило уникальности', + 'uk-ua': 'Додати правило унікальності', + 'pt-br': 'Adicionar regra de exclusividade', }, configureUniquenessRule: { - "en-us": "Configure Uniqueness Rule", - "de-ch": "Eindeutigkeitsregel konfigurieren", - "es-es": "Configurar regla de unicidad", - "fr-fr": "Configurer la règle d'unicité", - "ru-ru": "Настроить правило уникальности", - "uk-ua": "Налаштувати правило унікальності", - "pt-br": "Configurar regra de exclusividade", + 'en-us': 'Configure Uniqueness Rule', + 'de-ch': 'Eindeutigkeitsregel konfigurieren', + 'es-es': 'Configurar regla de unicidad', + 'fr-fr': "Configurer la règle d'unicité", + 'ru-ru': 'Настроить правило уникальности', + 'uk-ua': 'Налаштувати правило унікальності', + 'pt-br': 'Configurar regra de exclusividade', }, scope: { - "en-us": "Scope", - "es-es": "Alcance", - "fr-fr": "Portée", - "ru-ru": "Объем", - "uk-ua": "Сфера застосування", - "de-ch": "Anwendungsbereich", - "pt-br": "Escopo", + 'en-us': 'Scope', + 'es-es': 'Alcance', + 'fr-fr': 'Portée', + 'ru-ru': 'Объем', + 'uk-ua': 'Сфера застосування', + 'de-ch': 'Anwendungsbereich', + 'pt-br': 'Escopo', }, uniquenessDuplicatesFound: { - "en-us": "Duplicates found in database", - "de-ch": "In der Datenbank gefundene Duplikate", - "es-es": "muchos a uno", - "fr-fr": "Doublons trouvés dans la base de données", - "ru-ru": "В базе данных найдены дубликаты", - "uk-ua": "У базі даних знайдено дублікати", - "pt-br": "Duplicatas encontradas no banco de dados", + 'en-us': 'Duplicates found in database', + 'de-ch': 'In der Datenbank gefundene Duplikate', + 'es-es': 'muchos a uno', + 'fr-fr': 'Doublons trouvés dans la base de données', + 'ru-ru': 'В базе данных найдены дубликаты', + 'uk-ua': 'У базі даних знайдено дублікати', + 'pt-br': 'Duplicatas encontradas no banco de dados', }, exportDuplicates: { - "en-us": "Export Duplicates", - "de-ch": "Duplikate exportieren", - "es-es": "Exportar duplicados", - "fr-fr": "Exporter les doublons", - "ru-ru": "Экспортировать дубликаты", - "uk-ua": "Експорт дублікатів", - "pt-br": "Exportar Duplicatas", + 'en-us': 'Export Duplicates', + 'de-ch': 'Duplikate exportieren', + 'es-es': 'Exportar duplicados', + 'fr-fr': 'Exporter les doublons', + 'ru-ru': 'Экспортировать дубликаты', + 'uk-ua': 'Експорт дублікатів', + 'pt-br': 'Exportar Duplicatas', }, numberOfDuplicates: { - "en-us": "Number of Duplicates", - "de-ch": "Anzahl Duplikate", - "es-es": "Número de duplicados", - "fr-fr": "Nombre de doublons", - "ru-ru": "Количество дубликатов", - "uk-ua": "Кількість дублікатів", - "pt-br": "Número de duplicatas", + 'en-us': 'Number of Duplicates', + 'de-ch': 'Anzahl Duplikate', + 'es-es': 'Número de duplicados', + 'fr-fr': 'Nombre de doublons', + 'ru-ru': 'Количество дубликатов', + 'uk-ua': 'Кількість дублікатів', + 'pt-br': 'Número de duplicatas', }, schemaViewTitle: { - "en-us": "Schema Config: {tableName:string}", - "es-es": "Configuración del esquema: {tableName:string}", - "fr-fr": "Configuration du schéma : {tableName:string}", - "ru-ru": "Конфигурация схемы: {tableName:string}", - "uk-ua": "Конфігурація схеми: {tableName:string}", - "de-ch": "Schema-Konfiguration: {tableName:string}", - "pt-br": "Configuração do esquema: {tableName:string}", + 'en-us': 'Schema Config: {tableName:string}', + 'es-es': 'Configuración del esquema: {tableName:string}', + 'fr-fr': 'Configuration du schéma : {tableName:string}', + 'ru-ru': 'Конфигурация схемы: {tableName:string}', + 'uk-ua': 'Конфігурація схеми: {tableName:string}', + 'de-ch': 'Schema-Konfiguration: {tableName:string}', + 'pt-br': 'Configuração do esquema: {tableName:string}', }, schemaExportFileName: { - "en-us": "Specify 7 Data Model", - "ru-ru": "Укажите 7 моделей данных", - "es-es": "Especificar 7 modelos de datos", - "fr-fr": "Spécifier 7 modèles de données", - "uk-ua": "Specify 7 моделей даних", - "de-ch": "Specify 7 Datenmodell", - "pt-br": "Especifique 7 modelos de dados", + 'en-us': 'Specify 7 Data Model', + 'ru-ru': 'Укажите 7 моделей данных', + 'es-es': 'Especificar 7 modelos de datos', + 'fr-fr': 'Spécifier 7 modèles de données', + 'uk-ua': 'Specify 7 моделей даних', + 'de-ch': 'Specify 7 Datenmodell', + 'pt-br': 'Especifique 7 modelos de dados', }, sortByHiddenFields: { - "en-us": "Sort by hidden fields", - "de-ch": "Nach ausgeblendeten Feldern sortieren", - "es-es": "Ordenar por campos ocultos", - "fr-fr": "Trier par champs cachés", - "ru-ru": "Сортировать по скрытым полям", - "uk-ua": "Сортувати за прихованими полями", - "pt-br": "Classificar por campos ocultos", + 'en-us': 'Sort by hidden fields', + 'de-ch': 'Nach ausgeblendeten Feldern sortieren', + 'es-es': 'Ordenar por campos ocultos', + 'fr-fr': 'Trier par champs cachés', + 'ru-ru': 'Сортировать по скрытым полям', + 'uk-ua': 'Сортувати за прихованими полями', + 'pt-br': 'Classificar por campos ocultos', }, hidden: { - "en-us": "hidden", - "de-ch": "versteckt", - "es-es": "oculto", - "fr-fr": "caché", - "ru-ru": "скрытый", - "uk-ua": "прихований", - "pt-br": "escondido", + 'en-us': 'hidden', + 'de-ch': 'versteckt', + 'es-es': 'oculto', + 'fr-fr': 'caché', + 'ru-ru': 'скрытый', + 'uk-ua': 'прихований', + 'pt-br': 'escondido', }, customFieldFormat: { - "en-us": "Custom Field Format", - "de-ch": "Benutzerdefiniertes Feldformat", - "es-es": "Formato de campo personalizado", - "fr-fr": "Format de champ personnalisé", - "ru-ru": "Пользовательский формат поля", - "uk-ua": "Формат користувацького поля", - "pt-br": "Formato de campo personalizado", + 'en-us': 'Custom Field Format', + 'de-ch': 'Benutzerdefiniertes Feldformat', + 'es-es': 'Formato de campo personalizado', + 'fr-fr': 'Format de champ personnalisé', + 'ru-ru': 'Пользовательский формат поля', + 'uk-ua': 'Формат користувацького поля', + 'pt-br': 'Formato de campo personalizado', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts index b66847771f3..8f66e8237bc 100644 --- a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts +++ b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts @@ -2,193 +2,193 @@ * Localization strings for the Specify Network integration */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const specifyNetworkText = createDictionary({ specifyNetwork: { - "en-us": "Specify Network", - "ru-ru": "Укажите сеть", - "es-es": "Specify red", - "fr-fr": "Réseau Specify", - "uk-ua": "Specify Network", - "de-ch": "Specify Network", - "pt-br": "Especificar rede", + 'en-us': 'Specify Network', + 'ru-ru': 'Укажите сеть', + 'es-es': 'Specify red', + 'fr-fr': 'Réseau Specify', + 'uk-ua': 'Specify Network', + 'de-ch': 'Specify Network', + 'pt-br': 'Especificar rede', }, occurrenceOrGuidRequired: { - "en-us": "Species Name or GUID must be provided to display this page", - "de-ch": - "Zur Anzeige dieser Seite muss der Artname oder die GUID angegeben werden", - "es-es": - "Se debe proporcionar el nombre de especie o el GUID para mostrar esta página", - "fr-fr": + 'en-us': 'Species Name or GUID must be provided to display this page', + 'de-ch': + 'Zur Anzeige dieser Seite muss der Artname oder die GUID angegeben werden', + 'es-es': + 'Se debe proporcionar el nombre de especie o el GUID para mostrar esta página', + 'fr-fr': "Le nom de l'espèce ou le GUID doit être fourni pour afficher cette page", - "ru-ru": - "Для отображения этой страницы необходимо указать название вида или GUID", - "uk-ua": - "Щоб відобразити цю сторінку, потрібно вказати назву виду або GUID", - "pt-br": - "O nome da espécie ou GUID deve ser fornecido para exibir esta página", + 'ru-ru': + 'Для отображения этой страницы необходимо указать название вида или GUID', + 'uk-ua': + 'Щоб відобразити цю сторінку, потрібно вказати назву виду або GUID', + 'pt-br': + 'O nome da espécie ou GUID deve ser fornecido para exibir esta página', }, noDataError: { - "en-us": "Unable to find any data for this request", - "de-ch": "Zu dieser Anfrage konnten keine Daten gefunden werden", - "es-es": "No se encuentran datos para esta solicitud", - "fr-fr": "Impossible de trouver des données pour cette demande", - "ru-ru": "Не удалось найти данные по этому запросу.", - "uk-ua": "Неможливо знайти дані для цього запиту", - "pt-br": "Não foi possível encontrar nenhum dado para esta solicitação", + 'en-us': 'Unable to find any data for this request', + 'de-ch': 'Zu dieser Anfrage konnten keine Daten gefunden werden', + 'es-es': 'No se encuentran datos para esta solicitud', + 'fr-fr': 'Impossible de trouver des données pour cette demande', + 'ru-ru': 'Не удалось найти данные по этому запросу.', + 'uk-ua': 'Неможливо знайти дані для цього запиту', + 'pt-br': 'Não foi possível encontrar nenhum dado para esta solicitação', }, noDataErrorDescription: { - "en-us": "Please try searching for a different record", - "de-ch": "Versuchen Sie bitte, nach einem anderen Datensatz zu suchen", - "es-es": "Intente buscar un registro diferente", - "fr-fr": "Veuillez essayer de rechercher un autre enregistrement", - "ru-ru": "Попробуйте поискать другую запись.", - "uk-ua": "Будь ласка, спробуйте знайти інший запис", - "pt-br": "Por favor, tente procurar um registro diferente", + 'en-us': 'Please try searching for a different record', + 'de-ch': 'Versuchen Sie bitte, nach einem anderen Datensatz zu suchen', + 'es-es': 'Intente buscar un registro diferente', + 'fr-fr': 'Veuillez essayer de rechercher un autre enregistrement', + 'ru-ru': 'Попробуйте поискать другую запись.', + 'uk-ua': 'Будь ласка, спробуйте знайти інший запис', + 'pt-br': 'Por favor, tente procurar um registro diferente', }, dataQuality: { - "en-us": "Data Quality", - "de-ch": "Datenqualität", - "es-es": "Calidad de datos", - "fr-fr": "Qualité des données", - "ru-ru": "Качество данных", - "uk-ua": "Якість даних", - "pt-br": "Qualidade de dados", + 'en-us': 'Data Quality', + 'de-ch': 'Datenqualität', + 'es-es': 'Calidad de datos', + 'fr-fr': 'Qualité des données', + 'ru-ru': 'Качество данных', + 'uk-ua': 'Якість даних', + 'pt-br': 'Qualidade de dados', }, reportedBy: { - "en-us": "Reported by {provider:string}", - "de-ch": "Gemeldet von {provider:string}", - "es-es": "Reportado por {provider:string}", - "fr-fr": "Rapporté par {provider:string}", - "ru-ru": "Сообщил {provider:string}", - "uk-ua": "Повідомив {provider:string}", - "pt-br": "Reportado por {provider:string}", + 'en-us': 'Reported by {provider:string}', + 'de-ch': 'Gemeldet von {provider:string}', + 'es-es': 'Reportado por {provider:string}', + 'fr-fr': 'Rapporté par {provider:string}', + 'ru-ru': 'Сообщил {provider:string}', + 'uk-ua': 'Повідомив {provider:string}', + 'pt-br': 'Reportado por {provider:string}', }, collectionDate: { - "en-us": "Collection Date", - "de-ch": "Abholdatum", - "es-es": "Fecha de colecta", - "fr-fr": "Date de collecte", - "ru-ru": "Дата сбора", - "uk-ua": "Дата збору", - "pt-br": "Data de coleta", + 'en-us': 'Collection Date', + 'de-ch': 'Abholdatum', + 'es-es': 'Fecha de colecta', + 'fr-fr': 'Date de collecte', + 'ru-ru': 'Дата сбора', + 'uk-ua': 'Дата збору', + 'pt-br': 'Data de coleta', }, mapDescription: { - "en-us": - "This map shows occurrences of this taxon from the iDigBio and GBIF aggregators.", - "de-ch": - "Diese Karte zeigt Vorkommen dieses Taxons aus den Aggregatoren iDigBio und GBIF.", - "es-es": - "Este mapa muestra los registros de este taxón en los agregadores iDigBio y GBIF.", - "fr-fr": - "Cette carte montre les occurrences de ce taxon à partir des agrégateurs iDigBio et GBIF.", - "ru-ru": - "На этой карте показаны случаи встречаемости этого таксона по данным агрегаторов iDigBio и GBIF.", - "uk-ua": - "Ця карта показує випадки появи цього таксону з агрегаторів iDigBio та GBIF.", - "pt-br": - "Este mapa mostra ocorrências deste táxon dos agregadores iDigBio e GBIF.", + 'en-us': + 'This map shows occurrences of this taxon from the iDigBio and GBIF aggregators.', + 'de-ch': + 'Diese Karte zeigt Vorkommen dieses Taxons aus den Aggregatoren iDigBio und GBIF.', + 'es-es': + 'Este mapa muestra los registros de este taxón en los agregadores iDigBio y GBIF.', + 'fr-fr': + 'Cette carte montre les occurrences de ce taxon à partir des agrégateurs iDigBio et GBIF.', + 'ru-ru': + 'На этой карте показаны случаи встречаемости этого таксона по данным агрегаторов iDigBio и GBIF.', + 'uk-ua': + 'Ця карта показує випадки появи цього таксону з агрегаторів iDigBio та GBIF.', + 'pt-br': + 'Este mapa mostra ocorrências deste táxon dos agregadores iDigBio e GBIF.', }, iDigBioDescription: { - "en-us": - "Occurrences recorded in iDigBio are shown as round green points, except for those from the current collection recorded in iDigBio that are round red points. Zooming in on the red points brings up a blue teardrop pin, clicking on the pin executes a locality query in Specify that shows all of the species in the current Specify database collected from that location.", - "de-ch": - "In iDigBio erfasste Vorkommen werden als runde grüne Punkte dargestellt, mit Ausnahme der in iDigBio erfassten Vorkommen, die als runde rote Punkte dargestellt werden. Beim Vergrößern der roten Punkte wird eine blaue Stecknadel angezeigt. Ein Klick darauf führt eine Ortsabfrage in Specify aus, die alle an diesem Ort erfassten Arten der aktuellen Specify-Datenbank anzeigt.", - "es-es": - "Los registros recogidos en iDigBio se muestran como puntos verdes redondos, excepto los de esta colección, registrados en iDigBio, que son puntos rojos redondos. Al acercarse a los puntos rojos, aparece una chincheta en forma de lágrima azul; al hacer clic en la chincheta, se ejecuta una consulta de localidad en Specify que muestra todas las especies en la base de datos actual de Specify colectadas en esa localización.", - "fr-fr": + 'en-us': + 'Occurrences recorded in iDigBio are shown as round green points, except for those from the current collection recorded in iDigBio that are round red points. Zooming in on the red points brings up a blue teardrop pin, clicking on the pin executes a locality query in Specify that shows all of the species in the current Specify database collected from that location.', + 'de-ch': + 'In iDigBio erfasste Vorkommen werden als runde grüne Punkte dargestellt, mit Ausnahme der in iDigBio erfassten Vorkommen, die als runde rote Punkte dargestellt werden. Beim Vergrößern der roten Punkte wird eine blaue Stecknadel angezeigt. Ein Klick darauf führt eine Ortsabfrage in Specify aus, die alle an diesem Ort erfassten Arten der aktuellen Specify-Datenbank anzeigt.', + 'es-es': + 'Los registros recogidos en iDigBio se muestran como puntos verdes redondos, excepto los de esta colección, registrados en iDigBio, que son puntos rojos redondos. Al acercarse a los puntos rojos, aparece una chincheta en forma de lágrima azul; al hacer clic en la chincheta, se ejecuta una consulta de localidad en Specify que muestra todas las especies en la base de datos actual de Specify colectadas en esa localización.', + 'fr-fr': "Les occurrences enregistrées dans iDigBio sont représentées par des points verts ronds, à l'exception de celles de la collection actuelle, qui sont représentées par des points rouges ronds. Un zoom sur les points rouges fait apparaître une épingle bleue en forme de larme. Cliquer dessus exécute une requête de localité dans Specify, qui affiche toutes les espèces de la base de données Specify actuelles collectées à cet endroit.", - "ru-ru": - "Встречи, зарегистрированные в iDigBio, показаны круглыми зелеными точками, за исключением тех, которые есть в текущей коллекции, зарегистрированной в iDigBio, которые показаны круглыми красными точками. При увеличении красных точек появляется синяя каплевидная булавка, нажатие на булавку выполняет запрос на местоположение в Specify, который показывает все виды в текущей базе данных Specify, собранные из этого местоположения.", - "uk-ua": - "Випадки, записані в iDigBio, відображаються круглими зеленими точками, за винятком випадків із поточної колекції, записаної в iDigBio, які мають круглі червоні точки. Збільшення масштабу червоних крапок відкриває блакитну шпильку-сльозинку, клацання шпильки виконує запит місцевості в Specify, який показує всі види в поточній базі даних Specify, зібрані з цього місця.", - "pt-br": - "As ocorrências registradas no iDigBio são mostradas como pontos verdes redondos, exceto aquelas da coleção atual registrada no iDigBio, que são pontos vermelhos redondos. Ao ampliar os pontos vermelhos, um alfinete azul em forma de lágrima é exibido. Clicar no alfinete executa uma consulta de localidade no Specify, que mostra todas as espécies coletadas naquele local no banco de dados do Specify atual.", + 'ru-ru': + 'Встречи, зарегистрированные в iDigBio, показаны круглыми зелеными точками, за исключением тех, которые есть в текущей коллекции, зарегистрированной в iDigBio, которые показаны круглыми красными точками. При увеличении красных точек появляется синяя каплевидная булавка, нажатие на булавку выполняет запрос на местоположение в Specify, который показывает все виды в текущей базе данных Specify, собранные из этого местоположения.', + 'uk-ua': + 'Випадки, записані в iDigBio, відображаються круглими зеленими точками, за винятком випадків із поточної колекції, записаної в iDigBio, які мають круглі червоні точки. Збільшення масштабу червоних крапок відкриває блакитну шпильку-сльозинку, клацання шпильки виконує запит місцевості в Specify, який показує всі види в поточній базі даних Specify, зібрані з цього місця.', + 'pt-br': + 'As ocorrências registradas no iDigBio são mostradas como pontos verdes redondos, exceto aquelas da coleção atual registrada no iDigBio, que são pontos vermelhos redondos. Ao ampliar os pontos vermelhos, um alfinete azul em forma de lágrima é exibido. Clicar no alfinete executa uma consulta de localidade no Specify, que mostra todas as espécies coletadas naquele local no banco de dados do Specify atual.', }, gbifDescription: { - "en-us": - "For GBIF data, individual points and clusters of points are shown as hexagons of different colors ranging from yellow to orange to red. Dark red hexagons corresponding to densest distributions of collected specimens of that species.", - "de-ch": - "Bei GBIF-Daten werden einzelne Punkte und Punktcluster als Sechsecke in verschiedenen Farben von Gelb über Orange bis Rot dargestellt. Dunkelrote Sechsecke entsprechen der dichtesten Verteilung gesammelter Exemplare dieser Art.", - "es-es": - "Para los datos de GBIF, los puntos individuales y los grupos de puntos se muestran como hexágonos de diferentes colores que van del amarillo al naranja y al rojo. Hexágonos de color rojo oscuro que corresponden a las distribuciones más densas de especímenes colectados de esa especie.", - "fr-fr": + 'en-us': + 'For GBIF data, individual points and clusters of points are shown as hexagons of different colors ranging from yellow to orange to red. Dark red hexagons corresponding to densest distributions of collected specimens of that species.', + 'de-ch': + 'Bei GBIF-Daten werden einzelne Punkte und Punktcluster als Sechsecke in verschiedenen Farben von Gelb über Orange bis Rot dargestellt. Dunkelrote Sechsecke entsprechen der dichtesten Verteilung gesammelter Exemplare dieser Art.', + 'es-es': + 'Para los datos de GBIF, los puntos individuales y los grupos de puntos se muestran como hexágonos de diferentes colores que van del amarillo al naranja y al rojo. Hexágonos de color rojo oscuro que corresponden a las distribuciones más densas de especímenes colectados de esa especie.', + 'fr-fr': "Pour les données GBIF, les points individuels et les groupes de points sont représentés par des hexagones de différentes couleurs, allant du jaune à l'orange et au rouge. Les hexagones rouge foncé correspondent aux distributions les plus denses de spécimens collectés de l'espèce.", - "ru-ru": - "Для данных GBIF отдельные точки и кластеры точек показаны в виде шестиугольников разных цветов от желтого до оранжевого и красного. Темно-красные шестиугольники соответствуют наиболее плотным распределениям собранных образцов этого вида.", - "uk-ua": - "Для даних GBIF окремі точки та кластери точок відображаються у вигляді шестикутників різних кольорів від жовтого до оранжевого та червоного. Темно-червоні шестикутники відповідають найщільнішому розподілу зібраних зразків цього виду.", - "pt-br": - "Para dados do GBIF, pontos individuais e grupos de pontos são mostrados como hexágonos de cores diferentes, que variam do amarelo ao laranja e ao vermelho. Hexágonos vermelho-escuros correspondem às distribuições mais densas de espécimes coletados daquela espécie.", + 'ru-ru': + 'Для данных GBIF отдельные точки и кластеры точек показаны в виде шестиугольников разных цветов от желтого до оранжевого и красного. Темно-красные шестиугольники соответствуют наиболее плотным распределениям собранных образцов этого вида.', + 'uk-ua': + 'Для даних GBIF окремі точки та кластери точок відображаються у вигляді шестикутників різних кольорів від жовтого до оранжевого та червоного. Темно-червоні шестикутники відповідають найщільнішому розподілу зібраних зразків цього виду.', + 'pt-br': + 'Para dados do GBIF, pontos individuais e grupos de pontos são mostrados como hexágonos de cores diferentes, que variam do amarelo ao laranja e ao vermelho. Hexágonos vermelho-escuros correspondem às distribuições mais densas de espécimes coletados daquela espécie.', }, connectToGbif: { - "en-us": "Connect to GBIF", - "de-ch": "Mit GBIF verbinden", - "es-es": "Conectarse a GBIF", - "fr-fr": "Connectez-vous au GBIF", - "ru-ru": "Подключиться к ГБИФ", - "uk-ua": "Підключіться до GBIF", - "pt-br": "Conecte-se ao GBIF", + 'en-us': 'Connect to GBIF', + 'de-ch': 'Mit GBIF verbinden', + 'es-es': 'Conectarse a GBIF', + 'fr-fr': 'Connectez-vous au GBIF', + 'ru-ru': 'Подключиться к ГБИФ', + 'uk-ua': 'Підключіться до GBIF', + 'pt-br': 'Conecte-se ao GBIF', }, searchForInstitution: { - "en-us": "Search for your institution:", - "de-ch": "Suchen Sie nach Ihrer Institution:", - "es-es": "Busque su institución:", - "fr-fr": "Recherchez votre établissement :", - "ru-ru": "Поиск вашего учреждения:", - "uk-ua": "Підключіться до GBIF", - "pt-br": "Pesquise sua instituição:", + 'en-us': 'Search for your institution:', + 'de-ch': 'Suchen Sie nach Ihrer Institution:', + 'es-es': 'Busque su institución:', + 'fr-fr': 'Recherchez votre établissement :', + 'ru-ru': 'Поиск вашего учреждения:', + 'uk-ua': 'Підключіться до GBIF', + 'pt-br': 'Pesquise sua instituição:', }, institutionDistributionMap: { - "en-us": - "Distribution map of all of the digitized specimens curated in your Institution", - "de-ch": - "Verbreitungskarte aller digitalisierten Exemplare, die in Ihrer Institution kuratiert werden", - "es-es": - "Mapa de distribución de todos los ejemplares digitalizados conservados en su Institución", - "fr-fr": - "Carte de répartition de tous les spécimens numérisés conservés dans votre institution", - "ru-ru": - "Карта распределения всех оцифрованных образцов, хранящихся в вашем учреждении", - "uk-ua": - "Карта розповсюдження всіх оцифрованих зразків, збережених у вашій установі", - "pt-br": - "Mapa de distribuição de todos os espécimes digitalizados e curados em sua Instituição", + 'en-us': + 'Distribution map of all of the digitized specimens curated in your Institution', + 'de-ch': + 'Verbreitungskarte aller digitalisierten Exemplare, die in Ihrer Institution kuratiert werden', + 'es-es': + 'Mapa de distribución de todos los ejemplares digitalizados conservados en su Institución', + 'fr-fr': + 'Carte de répartition de tous les spécimens numérisés conservés dans votre institution', + 'ru-ru': + 'Карта распределения всех оцифрованных образцов, хранящихся в вашем учреждении', + 'uk-ua': + 'Карта розповсюдження всіх оцифрованих зразків, збережених у вашій установі', + 'pt-br': + 'Mapa de distribuição de todos os espécimes digitalizados e curados em sua Instituição', }, collectionDistributionMap: { - "en-us": - "Distribution map of all of the digitized specimens curated in your Collection", - "de-ch": "Verbreitungskarte aller digitalisierten Exemplare Ihrer Sammlung", - "es-es": - "Mapa de distribución de todos los ejemplares digitalizados conservados en su Colección", - "fr-fr": - "Carte de répartition de tous les spécimens numérisés conservés dans votre collection", - "ru-ru": - "Карта распределения всех оцифрованных образцов, хранящихся в вашей коллекции", - "uk-ua": - "Карта розповсюдження всіх оцифрованих зразків, збережених у вашій колекції", - "pt-br": - "Mapa de distribuição de todos os espécimes digitalizados selecionados em sua coleção", + 'en-us': + 'Distribution map of all of the digitized specimens curated in your Collection', + 'de-ch': 'Verbreitungskarte aller digitalisierten Exemplare Ihrer Sammlung', + 'es-es': + 'Mapa de distribución de todos los ejemplares digitalizados conservados en su Colección', + 'fr-fr': + 'Carte de répartition de tous les spécimens numérisés conservés dans votre collection', + 'ru-ru': + 'Карта распределения всех оцифрованных образцов, хранящихся в вашей коллекции', + 'uk-ua': + 'Карта розповсюдження всіх оцифрованих зразків, збережених у вашій колекції', + 'pt-br': + 'Mapa de distribuição de todos os espécimes digitalizados selecionados em sua coleção', }, startYear: { - "en-us": "Start Year", - "de-ch": "Startjahr", - "es-es": "Año de inicio", - "fr-fr": "Année de début", - "ru-ru": "Год начала", - "uk-ua": "Рік початку", - "pt-br": "Ano de início", + 'en-us': 'Start Year', + 'de-ch': 'Startjahr', + 'es-es': 'Año de inicio', + 'fr-fr': 'Année de début', + 'ru-ru': 'Год начала', + 'uk-ua': 'Рік початку', + 'pt-br': 'Ano de início', }, endYear: { - "en-us": "End Year", - "de-ch": "Jahresende", - "es-es": "Año final", - "fr-fr": "Fin d'année", - "ru-ru": "Конец года", - "uk-ua": "Кінцевий рік", - "pt-br": "Fim de ano", + 'en-us': 'End Year', + 'de-ch': 'Jahresende', + 'es-es': 'Año final', + 'fr-fr': "Fin d'année", + 'ru-ru': 'Конец года', + 'uk-ua': 'Кінцевий рік', + 'pt-br': 'Fim de ano', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/user.ts b/specifyweb/frontend/js_src/lib/localization/user.ts index baf3b902c0e..f4b22da8ebe 100644 --- a/specifyweb/frontend/js_src/lib/localization/user.ts +++ b/specifyweb/frontend/js_src/lib/localization/user.ts @@ -4,1096 +4,1096 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const userText = createDictionary({ logIn: { - "en-us": "Log In", - "ru-ru": "Авторизоваться", - "es-es": "Iniciar sesión", - "fr-fr": "Connexion", - "uk-ua": "Увійти", - "de-ch": "Anmelden", - "pt-br": "Conecte-se", + 'en-us': 'Log In', + 'ru-ru': 'Авторизоваться', + 'es-es': 'Iniciar sesión', + 'fr-fr': 'Connexion', + 'uk-ua': 'Увійти', + 'de-ch': 'Anmelden', + 'pt-br': 'Conecte-se', }, username: { - "en-us": "Username", - "ru-ru": "Имя пользователя", - "es-es": "Nombre de usuario", - "fr-fr": "Nom d'utilisateur", - "uk-ua": "Ім'я користувача", - "de-ch": "Benutzername", - "pt-br": "Nome de usuário", + 'en-us': 'Username', + 'ru-ru': 'Имя пользователя', + 'es-es': 'Nombre de usuario', + 'fr-fr': "Nom d'utilisateur", + 'uk-ua': "Ім'я користувача", + 'de-ch': 'Benutzername', + 'pt-br': 'Nome de usuário', }, password: { - "en-us": "Password", - "ru-ru": "Пароль", - "es-es": "Contraseña", - "fr-fr": "Mot de passe", - "uk-ua": "Пароль", - "de-ch": "Kennwort", - "pt-br": "Senha", + 'en-us': 'Password', + 'ru-ru': 'Пароль', + 'es-es': 'Contraseña', + 'fr-fr': 'Mot de passe', + 'uk-ua': 'Пароль', + 'de-ch': 'Kennwort', + 'pt-br': 'Senha', }, collectionAccessDenied: { - "en-us": "You do not have access to this collection", - "ru-ru": "У вас нет доступа к этой коллекции", - "es-es": "No tiene acceso a esta colección", - "fr-fr": "Vous n'avez pas accès à cette collection", - "uk-ua": "У вас немає доступу до цієї колекції", - "de-ch": "Sie haben keinen Zugang zu dieser Sammlung", - "pt-br": "Você não tem acesso a esta coleção", + 'en-us': 'You do not have access to this collection', + 'ru-ru': 'У вас нет доступа к этой коллекции', + 'es-es': 'No tiene acceso a esta colección', + 'fr-fr': "Vous n'avez pas accès à cette collection", + 'uk-ua': 'У вас немає доступу до цієї колекції', + 'de-ch': 'Sie haben keinen Zugang zu dieser Sammlung', + 'pt-br': 'Você não tem acesso a esta coleção', }, collectionAccessDeniedDescription: { - "en-us": - "The currently logged in account does not have access to the {collectionName:string} collection.", - "ru-ru": - "Текущая учетная запись не имеет доступа к коллекции {collectionName:string}.", - "es-es": - "La cuenta actualmente iniciada no tiene acceso a la colección {collectionName:string}.", - "fr-fr": + 'en-us': + 'The currently logged in account does not have access to the {collectionName:string} collection.', + 'ru-ru': + 'Текущая учетная запись не имеет доступа к коллекции {collectionName:string}.', + 'es-es': + 'La cuenta actualmente iniciada no tiene acceso a la colección {collectionName:string}.', + 'fr-fr': "Le compte actuellement connecté n'a pas accès à la collection {collectionName:string}.", - "uk-ua": - "Поточний обліковий запис, у який ви ввійшли, не має доступу до колекції {collectionName:string}.", - "de-ch": - "Das aktuell angemeldete Konto hat keinen Zugriff auf die {collectionName:string}-Sammlung.", - "pt-br": - "A conta atualmente conectada não tem acesso à coleção {collectionName:string}.", + 'uk-ua': + 'Поточний обліковий запис, у який ви ввійшли, не має доступу до колекції {collectionName:string}.', + 'de-ch': + 'Das aktuell angemeldete Konto hat keinen Zugriff auf die {collectionName:string}-Sammlung.', + 'pt-br': + 'A conta atualmente conectada não tem acesso à coleção {collectionName:string}.', }, changePassword: { - "en-us": "Change Password", - "ru-ru": "Изменить пароль", - "es-es": "Cambiar la contraseña", - "fr-fr": "Modifier le mot de passe", - "uk-ua": "Змінити пароль", - "de-ch": "Kennwort ändern", - "pt-br": "Alterar a senha", + 'en-us': 'Change Password', + 'ru-ru': 'Изменить пароль', + 'es-es': 'Cambiar la contraseña', + 'fr-fr': 'Modifier le mot de passe', + 'uk-ua': 'Змінити пароль', + 'de-ch': 'Kennwort ändern', + 'pt-br': 'Alterar a senha', }, oldPassword: { - "en-us": "Old password", - "ru-ru": "Старый пароль", - "es-es": "Contraseña anterior", - "fr-fr": "Mot de passe actuel", - "uk-ua": "Старий пароль", - "de-ch": "Altes Kennwort", - "pt-br": "Senha Antiga", + 'en-us': 'Old password', + 'ru-ru': 'Старый пароль', + 'es-es': 'Contraseña anterior', + 'fr-fr': 'Mot de passe actuel', + 'uk-ua': 'Старий пароль', + 'de-ch': 'Altes Kennwort', + 'pt-br': 'Senha Antiga', }, newPassword: { - "en-us": "New password", - "ru-ru": "Новый пароль", - "es-es": "Nueva contraseña", - "fr-fr": "Nouveau mot de passe", - "uk-ua": "Новий пароль", - "de-ch": "Neues Kennwort", - "pt-br": "Nova Senha", + 'en-us': 'New password', + 'ru-ru': 'Новый пароль', + 'es-es': 'Nueva contraseña', + 'fr-fr': 'Nouveau mot de passe', + 'uk-ua': 'Новий пароль', + 'de-ch': 'Neues Kennwort', + 'pt-br': 'Nova Senha', }, repeatPassword: { - "en-us": "Repeat new password", - "ru-ru": "Повторите новый пароль", - "es-es": "repita la nueva contraseña", - "fr-fr": "Répéter le nouveau mot de passe", - "uk-ua": "Повторіть новий пароль", - "de-ch": "Wiederhole das neue Kennwort", - "pt-br": "Repita a nova senha", + 'en-us': 'Repeat new password', + 'ru-ru': 'Повторите новый пароль', + 'es-es': 'repita la nueva contraseña', + 'fr-fr': 'Répéter le nouveau mot de passe', + 'uk-ua': 'Повторіть новий пароль', + 'de-ch': 'Wiederhole das neue Kennwort', + 'pt-br': 'Repita a nova senha', }, logOut: { - "en-us": "Log Out", - "ru-ru": "Выйти", - "es-es": "Cerrar sesión", - "fr-fr": "Se déconnecter", - "uk-ua": "Вийти", - "de-ch": "Ausloggen", - "pt-br": "Sair", + 'en-us': 'Log Out', + 'ru-ru': 'Выйти', + 'es-es': 'Cerrar sesión', + 'fr-fr': 'Se déconnecter', + 'uk-ua': 'Вийти', + 'de-ch': 'Ausloggen', + 'pt-br': 'Sair', }, setUserAgents: { - "en-us": "Set User Agents", - "ru-ru": "Установить пользовательских агентов", - "es-es": "Establecer agentes usuarios", - "fr-fr": "Définir les agents utilisateurs", - "uk-ua": "Налаштування агентів користувачів", - "de-ch": "Benutzeragenten festlegen", - "pt-br": "Definir agentes de usuário", + 'en-us': 'Set User Agents', + 'ru-ru': 'Установить пользовательских агентов', + 'es-es': 'Establecer agentes usuarios', + 'fr-fr': 'Définir les agents utilisateurs', + 'uk-ua': 'Налаштування агентів користувачів', + 'de-ch': 'Benutzeragenten festlegen', + 'pt-br': 'Definir agentes de usuário', }, noAgent: { - "en-us": "Current user does not have an agent assigned", - "ru-ru": "Текущий пользователь не имеет назначенного агента", - "es-es": "El usuario actual no tiene un agente asignado", - "fr-fr": "L'utilisateur actuel n'a pas d'agent attribué", - "uk-ua": "Поточному користувачеві не призначено агента", - "de-ch": "Dem aktuellen Benutzer ist kein Agent zugewiesen", - "pt-br": "O usuário atual não tem um agente atribuído", + 'en-us': 'Current user does not have an agent assigned', + 'ru-ru': 'Текущий пользователь не имеет назначенного агента', + 'es-es': 'El usuario actual no tiene un agente asignado', + 'fr-fr': "L'utilisateur actuel n'a pas d'agent attribué", + 'uk-ua': 'Поточному користувачеві не призначено агента', + 'de-ch': 'Dem aktuellen Benutzer ist kein Agent zugewiesen', + 'pt-br': 'O usuário atual não tem um agente atribuído', }, noAgentDescription: { - "en-us": "Please log in as admin and assign an agent to this user", - "ru-ru": - "Пожалуйста, войдите в систему как администратор и назначьте агента этому пользователю.", - "es-es": - "Iniciar sesión como administrador y asignar un agente a este usuario", - "fr-fr": + 'en-us': 'Please log in as admin and assign an agent to this user', + 'ru-ru': + 'Пожалуйста, войдите в систему как администратор и назначьте агента этому пользователю.', + 'es-es': + 'Iniciar sesión como administrador y asignar un agente a este usuario', + 'fr-fr': "Veuillez vous connecter en tant qu'administrateur et attribuer un agent à cet utilisateur", - "uk-ua": - "Будь ласка, увійдіть як адміністратор і призначте агента цьому користувачеві", - "de-ch": - "Bitte melden Sie sich als Administrator an und weisen Sie diesem Benutzer einen Agenten zu", - "pt-br": - "Por favor, faça login como administrador e atribua um agente a este usuário", + 'uk-ua': + 'Будь ласка, увійдіть як адміністратор і призначте агента цьому користувачеві', + 'de-ch': + 'Bitte melden Sie sich als Administrator an und weisen Sie diesem Benutzer einen Agenten zu', + 'pt-br': + 'Por favor, faça login como administrador e atribua um agente a este usuário', }, helloMessage: { - "en-us": "Hello, {userName:string}!", - "ru-ru": "Привет, {userName:string}!", - "es-es": "¡Hola, {userName:string}!", - "fr-fr": "Bonjour, {userName:string} !", - "de-ch": "Hallo, {userName:string}!", - "uk-ua": "Привіт, {userName:string}!", - "pt-br": "Olá, {userName:string}!", + 'en-us': 'Hello, {userName:string}!', + 'ru-ru': 'Привет, {userName:string}!', + 'es-es': '¡Hola, {userName:string}!', + 'fr-fr': 'Bonjour, {userName:string} !', + 'de-ch': 'Hallo, {userName:string}!', + 'uk-ua': 'Привіт, {userName:string}!', + 'pt-br': 'Olá, {userName:string}!', }, oicWelcomeMessage: { - "en-us": + 'en-us': "You've been invited to associate an external login to your Specify user account. This will enable you to log in to Specify with your chosen provider going forward.", - "ru-ru": - "Вас пригласили связать внешний вход с вашей учетной записью пользователя Specify. Это позволит вам в дальнейшем входить в Specify с выбранным вами провайдером.", - "es-es": - "Se le ha invitado a asociar un inicio de sesión externo a su cuenta de usuario de Specify. Esto le permitirá en el futuro iniciar sesión en Specify con el proveedor elegido.", - "fr-fr": - "Vous avez été invité à associer un identifiant externe à votre compte utilisateur Specify. Cela vous permettra de vous connecter à Specify avec le fournisseur de votre choix.", - "uk-ua": - "Вам запропоновано пов’язати зовнішній логін із вашим обліковим записом користувача Specify. Це дозволить вам надалі входити в Specify за допомогою обраного вами постачальника.", - "de-ch": - "Sie wurden aufgefordert, Ihrem Specify-Benutzerkonto einen externen Login zuzuordnen. Dadurch können Sie sich künftig mit Ihrem gewählten Anbieter bei Specify anmelden.", - "pt-br": - "Você foi convidado a associar um login externo à sua conta de usuário do Specify. Isso permitirá que você faça login no Specify com o provedor escolhido a partir de agora.", + 'ru-ru': + 'Вас пригласили связать внешний вход с вашей учетной записью пользователя Specify. Это позволит вам в дальнейшем входить в Specify с выбранным вами провайдером.', + 'es-es': + 'Se le ha invitado a asociar un inicio de sesión externo a su cuenta de usuario de Specify. Esto le permitirá en el futuro iniciar sesión en Specify con el proveedor elegido.', + 'fr-fr': + 'Vous avez été invité à associer un identifiant externe à votre compte utilisateur Specify. Cela vous permettra de vous connecter à Specify avec le fournisseur de votre choix.', + 'uk-ua': + 'Вам запропоновано пов’язати зовнішній логін із вашим обліковим записом користувача Specify. Це дозволить вам надалі входити в Specify за допомогою обраного вами постачальника.', + 'de-ch': + 'Sie wurden aufgefordert, Ihrem Specify-Benutzerkonto einen externen Login zuzuordnen. Dadurch können Sie sich künftig mit Ihrem gewählten Anbieter bei Specify anmelden.', + 'pt-br': + 'Você foi convidado a associar um login externo à sua conta de usuário do Specify. Isso permitirá que você faça login no Specify com o provedor escolhido a partir de agora.', }, legacyLogin: { - "en-us": "Sign in with Specify Account", - "ru-ru": "Войти с помощью Указать учетную запись", - "es-es": "Iniciar sesión con una cuenta de Specify", - "fr-fr": "Connectez-vous avec un compte spécifié", - "uk-ua": "Увійти за допомогою Вказати обліковий запис", - "de-ch": "Mit „Konto angeben“ anmelden", - "pt-br": "Entrar com Especificar Conta", + 'en-us': 'Sign in with Specify Account', + 'ru-ru': 'Войти с помощью Указать учетную запись', + 'es-es': 'Iniciar sesión con una cuenta de Specify', + 'fr-fr': 'Connectez-vous avec un compte spécifié', + 'uk-ua': 'Увійти за допомогою Вказати обліковий запис', + 'de-ch': 'Mit „Konto angeben“ anmelden', + 'pt-br': 'Entrar com Especificar Conta', }, unknownOicUser: { - "en-us": - "There is currently no Specify user associated with your {providerName:string} account. If you have a Specify user name and password, you can enter them below to associate that user with your {providerName:string} account for future logins.", - "ru-ru": - "В настоящее время нет Указанного пользователя, связанного с вашей учетной записью {providerName:string}. Если у вас есть Указанное имя пользователя и пароль, вы можете ввести их ниже, чтобы связать этого пользователя с вашей учетной записью {providerName:string} для будущих входов.", - "es-es": - "Actualmente no hay ningún usuario de Specify asociado con su cuenta {providerName:string}. Si tiene un nombre de usuario y contraseña de Specify, puede ingresarlos a continuación para asociar ese usuario con su cuenta {providerName:string} para futuros inicios de sesión.", - "fr-fr": + 'en-us': + 'There is currently no Specify user associated with your {providerName:string} account. If you have a Specify user name and password, you can enter them below to associate that user with your {providerName:string} account for future logins.', + 'ru-ru': + 'В настоящее время нет Указанного пользователя, связанного с вашей учетной записью {providerName:string}. Если у вас есть Указанное имя пользователя и пароль, вы можете ввести их ниже, чтобы связать этого пользователя с вашей учетной записью {providerName:string} для будущих входов.', + 'es-es': + 'Actualmente no hay ningún usuario de Specify asociado con su cuenta {providerName:string}. Si tiene un nombre de usuario y contraseña de Specify, puede ingresarlos a continuación para asociar ese usuario con su cuenta {providerName:string} para futuros inicios de sesión.', + 'fr-fr': "Aucun utilisateur spécifié n'est actuellement associé à votre compte {providerName:string}. Si vous possédez un nom d'utilisateur et un mot de passe spécifiés, saisissez-les ci-dessous pour associer cet utilisateur à votre compte {providerName:string} lors de vos prochaines connexions.", - "uk-ua": - "Наразі з вашим обліковим записом {providerName:string} не пов’язано жодного користувача типу «Вказати». Якщо у вас є ім’я користувача та пароль типу «Вказати», ви можете ввести їх нижче, щоб пов’язати цього користувача з вашим обліковим записом {providerName:string} для майбутніх входів.", - "de-ch": - "Ihrem {providerName:string}-Konto ist derzeit kein Benutzername zugeordnet. Wenn Sie über einen Benutzernamen und ein Passwort verfügen, können Sie diese unten eingeben, um diesen Benutzer bei zukünftigen Anmeldungen Ihrem {providerName:string}-Konto zuzuordnen.", - "pt-br": - "Atualmente, não há nenhum usuário específico associado à sua conta {providerName:string}. Se você tiver um nome de usuário e uma senha específicos, poderá inseri-los abaixo para associar esse usuário à sua conta {providerName:string} para logins futuros.", + 'uk-ua': + 'Наразі з вашим обліковим записом {providerName:string} не пов’язано жодного користувача типу «Вказати». Якщо у вас є ім’я користувача та пароль типу «Вказати», ви можете ввести їх нижче, щоб пов’язати цього користувача з вашим обліковим записом {providerName:string} для майбутніх входів.', + 'de-ch': + 'Ihrem {providerName:string}-Konto ist derzeit kein Benutzername zugeordnet. Wenn Sie über einen Benutzernamen und ein Passwort verfügen, können Sie diese unten eingeben, um diesen Benutzer bei zukünftigen Anmeldungen Ihrem {providerName:string}-Konto zuzuordnen.', + 'pt-br': + 'Atualmente, não há nenhum usuário específico associado à sua conta {providerName:string}. Se você tiver um nome de usuário e uma senha específicos, poderá inseri-los abaixo para associar esse usuário à sua conta {providerName:string} para logins futuros.', }, generateMasterKey: { - "en-us": "Generate Master Key", - "es-es": "Generar clave maestra", - "fr-fr": "Générer la clé principale", - "de-ch": "Masterschlüssel generieren", - "ru-ru": "Сгенерировать главный ключ", - "uk-ua": "Згенерувати головний ключ", - "pt-br": "Gerar Chave Mestra", + 'en-us': 'Generate Master Key', + 'es-es': 'Generar clave maestra', + 'fr-fr': 'Générer la clé principale', + 'de-ch': 'Masterschlüssel generieren', + 'ru-ru': 'Сгенерировать главный ключ', + 'uk-ua': 'Згенерувати головний ключ', + 'pt-br': 'Gerar Chave Mestra', }, userPassword: { - "en-us": "User Password", - "ru-ru": "Пароль пользователя", - "es-es": "Contraseña de usuario", - "fr-fr": "Mot de passe utilisateur", - "uk-ua": "Пароль користувача", - "de-ch": "Benutzer-Kennwort", - "pt-br": "Senha do usuário", + 'en-us': 'User Password', + 'ru-ru': 'Пароль пользователя', + 'es-es': 'Contraseña de usuario', + 'fr-fr': 'Mot de passe utilisateur', + 'uk-ua': 'Пароль користувача', + 'de-ch': 'Benutzer-Kennwort', + 'pt-br': 'Senha do usuário', }, generate: { - "en-us": "Generate", - "ru-ru": "Генерировать", - "es-es": "Generar", - "fr-fr": "Générer", - "uk-ua": "Згенерувати", - "de-ch": "Generieren", - "pt-br": "Gerar", + 'en-us': 'Generate', + 'ru-ru': 'Генерировать', + 'es-es': 'Generar', + 'fr-fr': 'Générer', + 'uk-ua': 'Згенерувати', + 'de-ch': 'Generieren', + 'pt-br': 'Gerar', }, masterKeyGenerated: { - "en-us": "Master key generated", - "ru-ru": "Сгенерирован главный ключ", - "es-es": "Clave maestra generada", - "fr-fr": "Clé principale générée", - "uk-ua": "Згенеровано головний ключ", - "de-ch": "Hauptschlüssel wurde generiert", - "pt-br": "Chave mestra gerada", + 'en-us': 'Master key generated', + 'ru-ru': 'Сгенерирован главный ключ', + 'es-es': 'Clave maestra generada', + 'fr-fr': 'Clé principale générée', + 'uk-ua': 'Згенеровано головний ключ', + 'de-ch': 'Hauptschlüssel wurde generiert', + 'pt-br': 'Chave mestra gerada', }, masterKeyFieldLabel: { - "en-us": "Master Key", - "ru-ru": "Мастер-ключ", - "es-es": "Clave maestra", - "fr-fr": "Clé principale", - "uk-ua": "Головний ключ", - "de-ch": "Hauptschlüssel", - "pt-br": "Chave Mestra", + 'en-us': 'Master Key', + 'ru-ru': 'Мастер-ключ', + 'es-es': 'Clave maestra', + 'fr-fr': 'Clé principale', + 'uk-ua': 'Головний ключ', + 'de-ch': 'Hauptschlüssel', + 'pt-br': 'Chave Mestra', }, incorrectPassword: { - "en-us": "Password was incorrect.", - "ru-ru": "Пароль неверный.", - "es-es": "La contraseña era incorrecta.", - "fr-fr": "Le mot de passe était incorrect.", - "uk-ua": "Пароль був неправильним.", - "de-ch": "Das Passwort war falsch.", - "pt-br": "A senha estava incorreta.", + 'en-us': 'Password was incorrect.', + 'ru-ru': 'Пароль неверный.', + 'es-es': 'La contraseña era incorrecta.', + 'fr-fr': 'Le mot de passe était incorrect.', + 'uk-ua': 'Пароль був неправильним.', + 'de-ch': 'Das Passwort war falsch.', + 'pt-br': 'A senha estava incorreta.', }, noAccessToResource: { - "en-us": - "You do not have access to any {collectionTable:string} containing this resource through the currently logged in account", - "ru-ru": - "У вас нет доступа ни к одному {collectionTable:string}, содержащему этот ресурс, через текущую учетную запись.", - "es-es": - "No tiene acceso a ningún {collectionTable:string} que contenga este recurso a través de la cuenta actualmente iniciada", - "fr-fr": + 'en-us': + 'You do not have access to any {collectionTable:string} containing this resource through the currently logged in account', + 'ru-ru': + 'У вас нет доступа ни к одному {collectionTable:string}, содержащему этот ресурс, через текущую учетную запись.', + 'es-es': + 'No tiene acceso a ningún {collectionTable:string} que contenga este recurso a través de la cuenta actualmente iniciada', + 'fr-fr': "Vous n'avez accès à aucun {collectionTable:string} contenant cette ressource via le compte actuellement connecté", - "uk-ua": - "Ви не маєте доступу до жодного {collectionTable:string}, що містить цей ресурс, через обліковий запис, у який ви зараз увійшли", - "de-ch": - "Sie haben über das aktuell angemeldete Konto keinen Zugriff auf {collectionTable:string}, das diese Ressource enthält", - "pt-br": - "Você não tem acesso a nenhum {collectionTable:string} contendo este recurso por meio da conta atualmente conectada", + 'uk-ua': + 'Ви не маєте доступу до жодного {collectionTable:string}, що містить цей ресурс, через обліковий запис, у який ви зараз увійшли', + 'de-ch': + 'Sie haben über das aktuell angemeldete Konto keinen Zugriff auf {collectionTable:string}, das diese Ressource enthält', + 'pt-br': + 'Você não tem acesso a nenhum {collectionTable:string} contendo este recurso por meio da conta atualmente conectada', }, resourceInaccessible: { - "en-us": - "The requested resource cannot be accessed while logged into the current collection.", - "ru-ru": - "Запрошенный ресурс не может быть доступен, пока вы вошли в текущую коллекцию.", - "es-es": - "No se puede acceder al recurso solicitado mientras se está conectado a la colección actual.", - "fr-fr": + 'en-us': + 'The requested resource cannot be accessed while logged into the current collection.', + 'ru-ru': + 'Запрошенный ресурс не может быть доступен, пока вы вошли в текущую коллекцию.', + 'es-es': + 'No se puede acceder al recurso solicitado mientras se está conectado a la colección actual.', + 'fr-fr': "La ressource demandée n'est pas accessible lorsque vous êtes connecté à la collection actuelle.", - "uk-ua": "Запитаний ресурс недоступний під час входу в поточну колекцію.", - "de-ch": - "Auf die angeforderte Ressource kann nicht zugegriffen werden, während Sie bei der aktuellen Sammlung angemeldet sind.", - "pt-br": - "O recurso solicitado não pode ser acessado enquanto estiver conectado à coleção atual.", + 'uk-ua': 'Запитаний ресурс недоступний під час входу в поточну колекцію.', + 'de-ch': + 'Auf die angeforderte Ressource kann nicht zugegriffen werden, während Sie bei der aktuellen Sammlung angemeldet sind.', + 'pt-br': + 'O recurso solicitado não pode ser acessado enquanto estiver conectado à coleção atual.', }, selectCollection: { - "en-us": "Select one of the following collections:", - "ru-ru": "Выберите одну из следующих коллекций:", - "es-es": "Seleccione una de las siguientes colecciones:", - "uk-ua": "Виберіть одну з наступних колекцій:", - "de-ch": "Wählen Sie eine der folgenden Sammlungen aus:", - "fr-fr": "Sélectionnez l'une des collections suivantes :", - "pt-br": "Selecione uma das seguintes coleções:", + 'en-us': 'Select one of the following collections:', + 'ru-ru': 'Выберите одну из следующих коллекций:', + 'es-es': 'Seleccione una de las siguientes colecciones:', + 'uk-ua': 'Виберіть одну з наступних колекцій:', + 'de-ch': 'Wählen Sie eine der folgenden Sammlungen aus:', + 'fr-fr': "Sélectionnez l'une des collections suivantes :", + 'pt-br': 'Selecione uma das seguintes coleções:', }, loginToProceed: { - comment: "Example: You can login to the Collection, to proceed:", - "en-us": "You can login to the {collectionTable:string}, to proceed:", - "ru-ru": "Вы можете войти в {collectionTable:string}, чтобы продолжить:", - "es-es": "Puede iniciar sesión en {collectionTable:string} para continuar:", - "fr-fr": - "Vous pouvez vous connecter au {collectionTable:string} pour continuer :", - "uk-ua": "Ви можете увійти до {collectionTable:string}, щоб продовжити:", - "de-ch": - "Sie können sich bei {collectionTable:string} anmelden, um fortzufahren:", - "pt-br": - "Você pode fazer login no {collectionTable:string}, para prosseguir:", + comment: 'Example: You can login to the Collection, to proceed:', + 'en-us': 'You can login to the {collectionTable:string}, to proceed:', + 'ru-ru': 'Вы можете войти в {collectionTable:string}, чтобы продолжить:', + 'es-es': 'Puede iniciar sesión en {collectionTable:string} para continuar:', + 'fr-fr': + 'Vous pouvez vous connecter au {collectionTable:string} pour continuer :', + 'uk-ua': 'Ви можете увійти до {collectionTable:string}, щоб продовжити:', + 'de-ch': + 'Sie können sich bei {collectionTable:string} anmelden, um fortzufahren:', + 'pt-br': + 'Você pode fazer login no {collectionTable:string}, para prosseguir:', }, sessionTimeOut: { - "en-us": "Insufficient Privileges", - "ru-ru": "Недостаточно привилегий", - "es-es": "Privilegios insuficientes", - "fr-fr": "Privilèges insuffisants", - "uk-ua": "Недостатньо привілеїв", - "de-ch": "Unzureichende Berechtigungen", - "pt-br": "Privilégios Insuficientes", + 'en-us': 'Insufficient Privileges', + 'ru-ru': 'Недостаточно привилегий', + 'es-es': 'Privilegios insuficientes', + 'fr-fr': 'Privilèges insuffisants', + 'uk-ua': 'Недостатньо привілеїв', + 'de-ch': 'Unzureichende Berechtigungen', + 'pt-br': 'Privilégios Insuficientes', }, sessionTimeOutDescription: { - "en-us": - "You lack sufficient privileges for that action, or your current session has been logged out.", - "ru-ru": - "У вас недостаточно прав для этого действия, или ваш текущий сеанс был завершен.", - "es-es": - "No tiene privilegios suficientes para esa acción o se ha cerrado la sesión actual.", - "fr-fr": - "Vous ne disposez pas des privilèges suffisants pour cette action ou votre session actuelle a été déconnectée.", - "uk-ua": - "У вас недостатньо прав для цієї дії, або ваш поточний сеанс завершено.", - "de-ch": - "Ihnen fehlen die erforderlichen Berechtigungen für diese Aktion oder Ihre aktuelle Sitzung wurde abgemeldet.", - "pt-br": - "Você não tem privilégios suficientes para essa ação ou sua sessão atual foi desconectada.", + 'en-us': + 'You lack sufficient privileges for that action, or your current session has been logged out.', + 'ru-ru': + 'У вас недостаточно прав для этого действия, или ваш текущий сеанс был завершен.', + 'es-es': + 'No tiene privilegios suficientes para esa acción o se ha cerrado la sesión actual.', + 'fr-fr': + 'Vous ne disposez pas des privilèges suffisants pour cette action ou votre session actuelle a été déconnectée.', + 'uk-ua': + 'У вас недостатньо прав для цієї дії, або ваш поточний сеанс завершено.', + 'de-ch': + 'Ihnen fehlen die erforderlichen Berechtigungen für diese Aktion oder Ihre aktuelle Sitzung wurde abgemeldet.', + 'pt-br': + 'Você não tem privilégios suficientes para essa ação ou sua sessão atual foi desconectada.', }, noPermission: { comment: ` Used in field formatter if user doesn't have read access to the related table `, - "en-us": "NO PERMISSION", - "ru-ru": "НЕТ РАЗРЕШЕНИЯ", - "es-es": "SIN AUTORIZACIÓN", - "fr-fr": "AUCUNE AUTORISATION", - "uk-ua": "ДОЗВІЛУ НЕ ПОТРІБНО", - "de-ch": "KEINE ERLAUBNIS", - "pt-br": "SEM PERMISSÃO", + 'en-us': 'NO PERMISSION', + 'ru-ru': 'НЕТ РАЗРЕШЕНИЯ', + 'es-es': 'SIN AUTORIZACIÓN', + 'fr-fr': 'AUCUNE AUTORISATION', + 'uk-ua': 'ДОЗВІЛУ НЕ ПОТРІБНО', + 'de-ch': 'KEINE ERLAUBNIS', + 'pt-br': 'SEM PERMISSÃO', }, permissionDeniedError: { - "en-us": "Permission denied error", - "ru-ru": "Ошибка «Отказано в доступе»", - "es-es": "Error de permiso denegado", - "fr-fr": "Erreur d'autorisation refusée", - "uk-ua": "Помилка відмови у доступі", - "de-ch": "Fehler „Berechtigung verweigert“", - "pt-br": "Erro de permissão negada", + 'en-us': 'Permission denied error', + 'ru-ru': 'Ошибка «Отказано в доступе»', + 'es-es': 'Error de permiso denegado', + 'fr-fr': "Erreur d'autorisation refusée", + 'uk-ua': 'Помилка відмови у доступі', + 'de-ch': 'Fehler „Berechtigung verweigert“', + 'pt-br': 'Erro de permissão negada', }, permissionDeniedDescription: { - "en-us": + 'en-us': "You don't have any policy or role that gives you permission to do the following action:", - "ru-ru": - "У вас нет политики или роли, которая дает вам разрешение на выполнение следующих действий:", - "es-es": - "No tiene ninguna política o función que le otorgue permiso para realizar la siguiente acción:", - "fr-fr": + 'ru-ru': + 'У вас нет политики или роли, которая дает вам разрешение на выполнение следующих действий:', + 'es-es': + 'No tiene ninguna política o función que le otorgue permiso para realizar la siguiente acción:', + 'fr-fr': "Vous ne disposez d'aucune politique ni d'aucun rôle vous autorisant à effectuer l'action suivante :", - "uk-ua": - "У вас немає жодної політики чи ролі, яка б давала вам дозвіл на виконання наступної дії:", - "de-ch": - "Sie verfügen über keine Richtlinie oder Rolle, die Ihnen die Berechtigung zur Ausführung der folgenden Aktion erteilt:", - "pt-br": - "Você não tem nenhuma política ou função que lhe dê permissão para executar a seguinte ação:", + 'uk-ua': + 'У вас немає жодної політики чи ролі, яка б давала вам дозвіл на виконання наступної дії:', + 'de-ch': + 'Sie verfügen über keine Richtlinie oder Rolle, die Ihnen die Berechtigung zur Ausführung der folgenden Aktion erteilt:', + 'pt-br': + 'Você não tem nenhuma política ou função que lhe dê permissão para executar a seguinte ação:', }, emptyRecordSetsReadOnly: { - "en-us": "Cannot open empty {recordSetTable:string} when in Read-Only mode", - "es-es": - "No se puede abrir {recordSetTable:string} vacío cuando está en modo de solo lectura", - "fr-fr": + 'en-us': 'Cannot open empty {recordSetTable:string} when in Read-Only mode', + 'es-es': + 'No se puede abrir {recordSetTable:string} vacío cuando está en modo de solo lectura', + 'fr-fr': "Impossible d'ouvrir un {recordSetTable:string} vide en mode lecture seule", - "ru-ru": - "Невозможно открыть пустой {recordSetTable:string} в режиме «Только чтение»", - "uk-ua": - "Не вдається відкрити порожній {recordSetTable:string} у режимі лише для читання", - "de-ch": - "Leeres {recordSetTable:string} kann im schreibgeschützten Modus nicht geöffnet werden", - "pt-br": - "Não é possível abrir {recordSetTable:string} vazio no modo somente leitura", + 'ru-ru': + 'Невозможно открыть пустой {recordSetTable:string} в режиме «Только чтение»', + 'uk-ua': + 'Не вдається відкрити порожній {recordSetTable:string} у режимі лише для читання', + 'de-ch': + 'Leeres {recordSetTable:string} kann im schreibgeschützten Modus nicht geöffnet werden', + 'pt-br': + 'Não é possível abrir {recordSetTable:string} vazio no modo somente leitura', }, permissionDeniedForUrl: { - "en-us": "Permission denied when accessing ", - "ru-ru": "Отказано в доступе при доступе ", - "es-es": "Permiso denegado al acceder a ", - "fr-fr": "Autorisation refusée lors de l'accès à ", - "uk-ua": "Відмовлено в доступі під час доступу до ", - "de-ch": "Zugriff verweigert beim Zugriff auf ", - "pt-br": "Permissão negada ao acessar ", + 'en-us': 'Permission denied when accessing ', + 'ru-ru': 'Отказано в доступе при доступе ', + 'es-es': 'Permiso denegado al acceder a ', + 'fr-fr': "Autorisation refusée lors de l'accès à ", + 'uk-ua': 'Відмовлено в доступі під час доступу до ', + 'de-ch': 'Zugriff verweigert beim Zugriff auf ', + 'pt-br': 'Permissão negada ao acessar ', }, noAccessToCollections: { - "en-us": - "The logged in user has not been given access to any collections in this database. You must login as another user.", - "ru-ru": - "Вошедшему в систему пользователю не предоставлен доступ ни к одной коллекции в этой базе данных. Вы должны войти в систему как другой пользователь.", - "es-es": - "Al usuario que inició sesión no se le ha dado acceso a ninguna colección de esta base de datos. Debe iniciar sesión como otro usuario.", - "fr-fr": + 'en-us': + 'The logged in user has not been given access to any collections in this database. You must login as another user.', + 'ru-ru': + 'Вошедшему в систему пользователю не предоставлен доступ ни к одной коллекции в этой базе данных. Вы должны войти в систему как другой пользователь.', + 'es-es': + 'Al usuario que inició sesión no se le ha dado acceso a ninguna colección de esta base de datos. Debe iniciar sesión como otro usuario.', + 'fr-fr': "L'utilisateur connecté n'a accès à aucune collection de cette base de données. Vous devez vous connecter sous un autre nom d'utilisateur.", - "uk-ua": - "Користувач, який зареєстрований, не має доступу до жодної колекції в цій базі даних. Ви повинні увійти як інший користувач.", - "de-ch": - "Dem angemeldeten Benutzer wurde kein Zugriff auf Sammlungen in dieser Datenbank gewährt. Sie müssen sich als anderer Benutzer anmelden.", - "pt-br": - "O usuário logado não recebeu acesso a nenhuma coleção neste banco de dados. Você deve efetuar login como outro usuário.", + 'uk-ua': + 'Користувач, який зареєстрований, не має доступу до жодної колекції в цій базі даних. Ви повинні увійти як інший користувач.', + 'de-ch': + 'Dem angemeldeten Benutzer wurde kein Zugriff auf Sammlungen in dieser Datenbank gewährt. Sie müssen sich als anderer Benutzer anmelden.', + 'pt-br': + 'O usuário logado não recebeu acesso a nenhuma coleção neste banco de dados. Você deve efetuar login como outro usuário.', }, userAccount: { - "en-us": "User Account", - "ru-ru": "Учетная запись пользователя", - "es-es": "Cuenta de usuario", - "fr-fr": "Compte utilisateur", - "uk-ua": "Обліковий запис користувача", - "de-ch": "Benutzerkonto", - "pt-br": "Conta de usuário", + 'en-us': 'User Account', + 'ru-ru': 'Учетная запись пользователя', + 'es-es': 'Cuenta de usuario', + 'fr-fr': 'Compte utilisateur', + 'uk-ua': 'Обліковий запис користувача', + 'de-ch': 'Benutzerkonto', + 'pt-br': 'Conta de usuário', }, removeAdmin: { - "en-us": "Remove Admin", - "ru-ru": "Удалить администратора", - "es-es": "Eliminar administrador", - "fr-fr": "Supprimer l'administrateur", - "uk-ua": "Видалити адміністратора", - "de-ch": "Administrator entfernen", - "pt-br": "Remover administrador", + 'en-us': 'Remove Admin', + 'ru-ru': 'Удалить администратора', + 'es-es': 'Eliminar administrador', + 'fr-fr': "Supprimer l'administrateur", + 'uk-ua': 'Видалити адміністратора', + 'de-ch': 'Administrator entfernen', + 'pt-br': 'Remover administrador', }, canNotRemoveYourself: { - "en-us": "You cannot revoke your own admin status", - "ru-ru": "Вы не можете отозвать свой собственный статус администратора.", - "es-es": "No puede revocar su propio estatus de administrador", - "fr-fr": "Vous ne pouvez pas révoquer votre propre statut d'administrateur", - "uk-ua": "Ви не можете скасувати свій власний статус адміністратора", - "de-ch": "Sie können Ihren eigenen Administratorstatus nicht widerrufen", - "pt-br": "Você não pode revogar seu próprio status de administrador", + 'en-us': 'You cannot revoke your own admin status', + 'ru-ru': 'Вы не можете отозвать свой собственный статус администратора.', + 'es-es': 'No puede revocar su propio estatus de administrador', + 'fr-fr': "Vous ne pouvez pas révoquer votre propre statut d'administrateur", + 'uk-ua': 'Ви не можете скасувати свій власний статус адміністратора', + 'de-ch': 'Sie können Ihren eigenen Administratorstatus nicht widerrufen', + 'pt-br': 'Você não pode revogar seu próprio status de administrador', }, makeAdmin: { - "en-us": "Make Admin", - "ru-ru": "Сделать администратором", - "es-es": "Hacer administrador", - "fr-fr": "Créer un administrateur", - "uk-ua": "Зробити адміністратором", - "de-ch": "Zum Administrator machen", - "pt-br": "Tornar administrador", + 'en-us': 'Make Admin', + 'ru-ru': 'Сделать администратором', + 'es-es': 'Hacer administrador', + 'fr-fr': 'Créer un administrateur', + 'uk-ua': 'Зробити адміністратором', + 'de-ch': 'Zum Administrator machen', + 'pt-br': 'Tornar administrador', }, saveUserFirst: { - "en-us": "Save user first", - "ru-ru": "Сначала сохраните пользователя", - "es-es": "Guardar usuario primero", - "fr-fr": "Enregistrer l'utilisateur en premier", - "uk-ua": "Спочатку збережіть користувача", - "de-ch": "Benutzer zuerst speichern", - "pt-br": "Salvar usuário primeiro", + 'en-us': 'Save user first', + 'ru-ru': 'Сначала сохраните пользователя', + 'es-es': 'Guardar usuario primero', + 'fr-fr': "Enregistrer l'utilisateur en premier", + 'uk-ua': 'Спочатку збережіть користувача', + 'de-ch': 'Benutzer zuerst speichern', + 'pt-br': 'Salvar usuário primeiro', }, mustBeManager: { - "en-us": "User must be saved as Manager first", - "ru-ru": "Сначала пользователь должен быть сохранен как менеджер.", - "es-es": "El usuario debe guardarse primero como administrador", - "de-ch": "Der Benutzer muss zuerst als Manager gespeichert werden", - "fr-fr": + 'en-us': 'User must be saved as Manager first', + 'ru-ru': 'Сначала пользователь должен быть сохранен как менеджер.', + 'es-es': 'El usuario debe guardarse primero como administrador', + 'de-ch': 'Der Benutzer muss zuerst als Manager gespeichert werden', + 'fr-fr': "L'utilisateur doit d'abord être enregistré en tant que gestionnaire", - "uk-ua": "Спочатку користувача потрібно зберегти як менеджера", - "pt-br": "O usuário deve ser salvo como gerente primeiro", + 'uk-ua': 'Спочатку користувача потрібно зберегти як менеджера', + 'pt-br': 'O usuário deve ser salvo como gerente primeiro', }, users: { - "en-us": "User Accounts", - "ru-ru": "Учетные записи пользователей", - "es-es": "Cuentas de usuario", - "fr-fr": "Comptes d'utilisateurs", - "uk-ua": "Облікові записи користувачів", - "de-ch": "Benutzerkonten", - "pt-br": "Contas de usuário", + 'en-us': 'User Accounts', + 'ru-ru': 'Учетные записи пользователей', + 'es-es': 'Cuentas de usuario', + 'fr-fr': "Comptes d'utilisateurs", + 'uk-ua': 'Облікові записи користувачів', + 'de-ch': 'Benutzerkonten', + 'pt-br': 'Contas de usuário', }, institutionUsers: { - "en-us": "User Accounts Defined in this {institutionTable:string}", - "ru-ru": - "Учетные записи пользователей, определенные в этом {institutionTable:string}", - "es-es": "Cuentas de usuario definidas en este {institutionTable:string}", - "fr-fr": "Comptes d'utilisateurs définis dans ce {institutionTable:string}", - "uk-ua": - "Облікові записи користувачів, визначені в цьому {institutionTable:string}", - "de-ch": "In diesem {institutionTable:string} definierte Benutzerkonten", - "pt-br": "Contas de usuário definidas neste {institutionTable:string}", + 'en-us': 'User Accounts Defined in this {institutionTable:string}', + 'ru-ru': + 'Учетные записи пользователей, определенные в этом {institutionTable:string}', + 'es-es': 'Cuentas de usuario definidas en este {institutionTable:string}', + 'fr-fr': "Comptes d'utilisateurs définis dans ce {institutionTable:string}", + 'uk-ua': + 'Облікові записи користувачів, визначені в цьому {institutionTable:string}', + 'de-ch': 'In diesem {institutionTable:string} definierte Benutzerkonten', + 'pt-br': 'Contas de usuário definidas neste {institutionTable:string}', }, collectionUsers: { - "en-us": "User Accounts Assigned to this {collectionTable:string}", - "ru-ru": - "Учетные записи пользователей, назначенные этому {collectionTable:string}", - "es-es": "Cuentas de usuario asignadas a este {collectionTable:string}", - "fr-fr": "Comptes d'utilisateurs attribués à ce {collectionTable:string}", - "uk-ua": - "Облікові записи користувачів, призначені цьому {collectionTable:string}", - "de-ch": "Zugewiesene Benutzerkonten {collectionTable:string}", - "pt-br": "Contas de usuário atribuídas a este {collectionTable:string}", + 'en-us': 'User Accounts Assigned to this {collectionTable:string}', + 'ru-ru': + 'Учетные записи пользователей, назначенные этому {collectionTable:string}', + 'es-es': 'Cuentas de usuario asignadas a este {collectionTable:string}', + 'fr-fr': "Comptes d'utilisateurs attribués à ce {collectionTable:string}", + 'uk-ua': + 'Облікові записи користувачів, призначені цьому {collectionTable:string}', + 'de-ch': 'Zugewiesene Benutzerkonten {collectionTable:string}', + 'pt-br': 'Contas de usuário atribuídas a este {collectionTable:string}', }, setPassword: { - "en-us": "Set Password", - "ru-ru": "Установить пароль", - "es-es": "Establecer contraseña", - "fr-fr": "Définir le mot de passe", - "uk-ua": "Встановити пароль", - "de-ch": "Passwort festlegen", - "pt-br": "Definir senha", + 'en-us': 'Set Password', + 'ru-ru': 'Установить пароль', + 'es-es': 'Establecer contraseña', + 'fr-fr': 'Définir le mot de passe', + 'uk-ua': 'Встановити пароль', + 'de-ch': 'Passwort festlegen', + 'pt-br': 'Definir senha', }, passwordsDoNotMatchError: { - "en-us": "Passwords do not match.", - "ru-ru": "Пароли не совпадают.", - "es-es": "Las contraseñas no coinciden.", - "fr-fr": "Les mots de passe ne correspondent pas.", - "uk-ua": "Паролі не збігаються.", - "de-ch": "Die Passwörter stimmen nicht überein.", - "pt-br": "As senhas não coincidem.", + 'en-us': 'Passwords do not match.', + 'ru-ru': 'Пароли не совпадают.', + 'es-es': 'Las contraseñas no coinciden.', + 'fr-fr': 'Les mots de passe ne correspondent pas.', + 'uk-ua': 'Паролі не збігаються.', + 'de-ch': 'Die Passwörter stimmen nicht überein.', + 'pt-br': 'As senhas não coincidem.', }, confirmPassword: { - "en-us": "Confirm", - "ru-ru": "Подтверждать", - "es-es": "Confirmar", - "fr-fr": "Confirmer", - "uk-ua": "Підтвердити", - "de-ch": "Bestätigen", - "pt-br": "Confirmar", + 'en-us': 'Confirm', + 'ru-ru': 'Подтверждать', + 'es-es': 'Confirmar', + 'fr-fr': 'Confirmer', + 'uk-ua': 'Підтвердити', + 'de-ch': 'Bestätigen', + 'pt-br': 'Confirmar', }, collections: { - "en-us": "Collections", - "ru-ru": "Коллекции", - "es-es": "Colecciones", - "fr-fr": "Collections", - "uk-ua": "Колекції", - "de-ch": "Sammlungen", - "pt-br": "Coleções", + 'en-us': 'Collections', + 'ru-ru': 'Коллекции', + 'es-es': 'Colecciones', + 'fr-fr': 'Collections', + 'uk-ua': 'Колекції', + 'de-ch': 'Sammlungen', + 'pt-br': 'Coleções', }, configureCollectionAccess: { - "en-us": "Select user collection access", - "ru-ru": "Выберите доступ к коллекции пользователей", - "es-es": "Seleccionar acceso a la colección del usuario", - "fr-fr": "Sélectionner l'accès à la collection d'utilisateurs", - "uk-ua": "Виберіть доступ до колекції користувачів", - "de-ch": "Auswählen des Benutzerzugriffs auf die Sammlung", - "pt-br": "Selecione o acesso à coleção de usuários", + 'en-us': 'Select user collection access', + 'ru-ru': 'Выберите доступ к коллекции пользователей', + 'es-es': 'Seleccionar acceso a la colección del usuario', + 'fr-fr': "Sélectionner l'accès à la collection d'utilisateurs", + 'uk-ua': 'Виберіть доступ до колекції користувачів', + 'de-ch': 'Auswählen des Benutzerzugriffs auf die Sammlung', + 'pt-br': 'Selecione o acesso à coleção de usuários', }, securityPanel: { - "en-us": "Security and Accounts", - "es-es": "Seguridad y cuentas", - "fr-fr": "Sécurité et comptes", - "uk-ua": "Безпека та облікові записи", - "de-ch": "Sicherheit und Konten", - "ru-ru": "Безопасность и учетные записи", - "pt-br": "Segurança e Contas", + 'en-us': 'Security and Accounts', + 'es-es': 'Seguridad y cuentas', + 'fr-fr': 'Sécurité et comptes', + 'uk-ua': 'Безпека та облікові записи', + 'de-ch': 'Sicherheit und Konten', + 'ru-ru': 'Безопасность и учетные записи', + 'pt-br': 'Segurança e Contas', }, userRoleLibrary: { - "en-us": "Institution Library of Role Templates", - "ru-ru": "Библиотека шаблонов ролей учреждений", - "es-es": "Biblioteca institucional de plantillas de roles", - "fr-fr": "Bibliothèque institutionnelle de modèles de rôles", - "uk-ua": "Бібліотека шаблонів ролей установи", - "de-ch": "Institutionsbibliothek mit Rollenvorlagen", - "pt-br": "Biblioteca de Modelos de Funções da Instituição", + 'en-us': 'Institution Library of Role Templates', + 'ru-ru': 'Библиотека шаблонов ролей учреждений', + 'es-es': 'Biblioteca institucional de plantillas de roles', + 'fr-fr': 'Bibliothèque institutionnelle de modèles de rôles', + 'uk-ua': 'Бібліотека шаблонів ролей установи', + 'de-ch': 'Institutionsbibliothek mit Rollenvorlagen', + 'pt-br': 'Biblioteca de Modelos de Funções da Instituição', }, userRoles: { - "en-us": "User Roles", - "ru-ru": "Роли пользователей", - "es-es": "Roles del usuario", - "fr-fr": "Rôles utilisateur", - "uk-ua": "Ролі користувачів", - "de-ch": "Benutzerrollen", - "pt-br": "Funções do usuário", + 'en-us': 'User Roles', + 'ru-ru': 'Роли пользователей', + 'es-es': 'Roles del usuario', + 'fr-fr': 'Rôles utilisateur', + 'uk-ua': 'Ролі користувачів', + 'de-ch': 'Benutzerrollen', + 'pt-br': 'Funções do usuário', }, collectionUserRoles: { - "en-us": "{collectionTable:string} User Roles", - "ru-ru": "{collectionTable:string} Роли пользователей", - "es-es": "Roles de usuario de {collectionTable:string}", - "fr-fr": "{collectionTable:string} Rôles utilisateur", - "uk-ua": "Ролі користувачів {collectionTable:string}", - "de-ch": "{collectionTable:string} Benutzerrollen", - "pt-br": "{collectionTable:string} Funções do usuário", + 'en-us': '{collectionTable:string} User Roles', + 'ru-ru': '{collectionTable:string} Роли пользователей', + 'es-es': 'Roles de usuario de {collectionTable:string}', + 'fr-fr': '{collectionTable:string} Rôles utilisateur', + 'uk-ua': 'Ролі користувачів {collectionTable:string}', + 'de-ch': '{collectionTable:string} Benutzerrollen', + 'pt-br': '{collectionTable:string} Funções do usuário', }, assignedUserRoles: { - "en-us": "Assigned User Roles", - "es-es": "Roles de usuario asignados", - "fr-fr": "Rôles utilisateur attribués", - "uk-ua": "Призначені ролі користувачів", - "de-ch": "Zugewiesene Benutzerrollen", - "ru-ru": "Назначенные роли пользователей", - "pt-br": "Funções de usuário atribuídas", + 'en-us': 'Assigned User Roles', + 'es-es': 'Roles de usuario asignados', + 'fr-fr': 'Rôles utilisateur attribués', + 'uk-ua': 'Призначені ролі користувачів', + 'de-ch': 'Zugewiesene Benutzerrollen', + 'ru-ru': 'Назначенные роли пользователей', + 'pt-br': 'Funções de usuário atribuídas', }, rolePolicies: { - "en-us": "Role Permission Policies", - "ru-ru": "Политики разрешений ролей", - "es-es": "Políticas de permisos", - "fr-fr": "Politiques d'autorisation des rôles", - "uk-ua": "Політики дозволів для ролей", - "de-ch": "Rollenberechtigungsrichtlinien", - "pt-br": "Políticas de permissão de função", + 'en-us': 'Role Permission Policies', + 'ru-ru': 'Политики разрешений ролей', + 'es-es': 'Políticas de permisos', + 'fr-fr': "Politiques d'autorisation des rôles", + 'uk-ua': 'Політики дозволів для ролей', + 'de-ch': 'Rollenberechtigungsrichtlinien', + 'pt-br': 'Políticas de permissão de função', }, userPolicies: { - "en-us": "User Permission Policies", - "ru-ru": "Политики разрешений пользователей", - "es-es": "Políticas de permisos de usuario", - "fr-fr": "Politiques d'autorisation des utilisateurs", - "uk-ua": "Політики дозволів користувачів", - "de-ch": "Richtlinien für Benutzerberechtigungen", - "pt-br": "Políticas de permissão do usuário", + 'en-us': 'User Permission Policies', + 'ru-ru': 'Политики разрешений пользователей', + 'es-es': 'Políticas de permisos de usuario', + 'fr-fr': "Politiques d'autorisation des utilisateurs", + 'uk-ua': 'Політики дозволів користувачів', + 'de-ch': 'Richtlinien für Benutzerberechtigungen', + 'pt-br': 'Políticas de permissão do usuário', }, customUserPolices: { - "en-us": - "Custom Collection-level Policies (applies to this collection only)", - "ru-ru": - "Пользовательские политики на уровне коллекции (применяются только к этой коллекции)", - "es-es": - "Políticas personalizadas a nivel de colección (sólo se aplican a esta colección)", - "fr-fr": + 'en-us': + 'Custom Collection-level Policies (applies to this collection only)', + 'ru-ru': + 'Пользовательские политики на уровне коллекции (применяются только к этой коллекции)', + 'es-es': + 'Políticas personalizadas a nivel de colección (sólo se aplican a esta colección)', + 'fr-fr': "Politiques personnalisées au niveau de la collection (s'applique uniquement à cette collection)", - "uk-ua": - "Політики на рівні користувацьких колекцій (стосуються лише цієї колекції)", - "de-ch": - "Benutzerdefinierte Richtlinien auf Sammlungsebene (gilt nur für diese Sammlung)", - "pt-br": - "Políticas personalizadas em nível de coleção (aplica-se somente a esta coleção)", + 'uk-ua': + 'Політики на рівні користувацьких колекцій (стосуються лише цієї колекції)', + 'de-ch': + 'Benutzerdefinierte Richtlinien auf Sammlungsebene (gilt nur für diese Sammlung)', + 'pt-br': + 'Políticas personalizadas em nível de coleção (aplica-se somente a esta coleção)', }, role: { - "en-us": "Role", - "ru-ru": "Роль", - "es-es": "Rol", - "fr-fr": "Rôle", - "uk-ua": "Роль", - "de-ch": "Rolle", - "pt-br": "Papel", + 'en-us': 'Role', + 'ru-ru': 'Роль', + 'es-es': 'Rol', + 'fr-fr': 'Rôle', + 'uk-ua': 'Роль', + 'de-ch': 'Rolle', + 'pt-br': 'Papel', }, read: { - "en-us": "Read", - "ru-ru": "Читать", - "es-es": "Leer", - "fr-fr": "Lire", - "uk-ua": "Читати", - "de-ch": "Lesen", - "pt-br": "Ler", + 'en-us': 'Read', + 'ru-ru': 'Читать', + 'es-es': 'Leer', + 'fr-fr': 'Lire', + 'uk-ua': 'Читати', + 'de-ch': 'Lesen', + 'pt-br': 'Ler', }, userPermissionPreview: { - "en-us": "User's Permission Profile (read-only)", - "ru-ru": "Профиль разрешений пользователя (только для чтения)", - "es-es": "Perfil de permisos del usuario (solo lectura)", - "fr-fr": "Profil d'autorisation de l'utilisateur (lecture seule)", - "uk-ua": "Профіль дозволів користувача (лише для читання)", - "de-ch": "Berechtigungsprofil des Benutzers (schreibgeschützt)", - "pt-br": "Perfil de permissão do usuário (somente leitura)", + 'en-us': "User's Permission Profile (read-only)", + 'ru-ru': 'Профиль разрешений пользователя (только для чтения)', + 'es-es': 'Perfil de permisos del usuario (solo lectura)', + 'fr-fr': "Profil d'autorisation de l'utilisateur (lecture seule)", + 'uk-ua': 'Профіль дозволів користувача (лише для читання)', + 'de-ch': 'Berechtigungsprofil des Benutzers (schreibgeschützt)', + 'pt-br': 'Perfil de permissão do usuário (somente leitura)', }, outOfDateWarning: { - "en-us": - "Note: preview may be out of date. Save changes to update the preview", - "ru-ru": - "Примечание: предварительный просмотр может быть устаревшим. Сохраните изменения, чтобы обновить предварительный просмотр", - "es-es": - "Nota: la vista previa puede estar desactualizada. Guarde los cambios para actualizar la vista previa", - "fr-fr": + 'en-us': + 'Note: preview may be out of date. Save changes to update the preview', + 'ru-ru': + 'Примечание: предварительный просмотр может быть устаревшим. Сохраните изменения, чтобы обновить предварительный просмотр', + 'es-es': + 'Nota: la vista previa puede estar desactualizada. Guarde los cambios para actualizar la vista previa', + 'fr-fr': "Remarque : l'aperçu peut être obsolète. Enregistrez les modifications pour le mettre à jour.", - "uk-ua": - "Примітка: попередній перегляд може бути застарілим. Збережіть зміни, щоб оновити попередній перегляд", - "de-ch": - "Hinweis: Die Vorschau ist möglicherweise veraltet. Speichern Sie die Änderungen, um die Vorschau zu aktualisieren.", - "pt-br": - "Observação: a pré-visualização pode estar desatualizada. Salve as alterações para atualizar a pré-visualização.", + 'uk-ua': + 'Примітка: попередній перегляд може бути застарілим. Збережіть зміни, щоб оновити попередній перегляд', + 'de-ch': + 'Hinweis: Die Vorschau ist möglicherweise veraltet. Speichern Sie die Änderungen, um die Vorschau zu aktualisieren.', + 'pt-br': + 'Observação: a pré-visualização pode estar desatualizada. Salve as alterações para atualizar a pré-visualização.', }, allUsers: { - "en-us": "All Users", - "ru-ru": "Все пользователи", - "es-es": "Todos los usuarios", - "fr-fr": "Tous les utilisateurs", - "uk-ua": "Усі користувачі", - "de-ch": "Alle Benutzer", - "pt-br": "Todos os usuários", + 'en-us': 'All Users', + 'ru-ru': 'Все пользователи', + 'es-es': 'Todos los usuarios', + 'fr-fr': 'Tous les utilisateurs', + 'uk-ua': 'Усі користувачі', + 'de-ch': 'Alle Benutzer', + 'pt-br': 'Todos os usuários', }, thisUser: { - "en-us": "This user", - "ru-ru": "Этот пользователь", - "es-es": "Este usuario", - "fr-fr": "Cet utilisateur", - "uk-ua": "Цей користувач", - "de-ch": "Dieser Benutzer", - "pt-br": "Este usuário", + 'en-us': 'This user', + 'ru-ru': 'Этот пользователь', + 'es-es': 'Este usuario', + 'fr-fr': 'Cet utilisateur', + 'uk-ua': 'Цей користувач', + 'de-ch': 'Dieser Benutzer', + 'pt-br': 'Este usuário', }, action: { - "en-us": "Action", - "ru-ru": "Действие", - "es-es": "Acción", - "fr-fr": "Action", - "uk-ua": "Дія", - "de-ch": "Aktion", - "pt-br": "Ação", + 'en-us': 'Action', + 'ru-ru': 'Действие', + 'es-es': 'Acción', + 'fr-fr': 'Action', + 'uk-ua': 'Дія', + 'de-ch': 'Aktion', + 'pt-br': 'Ação', }, resource: { - "en-us": "Resource", - "ru-ru": "Ресурс", - "es-es": "Recurso", - "fr-fr": "Ressource", - "uk-ua": "Ресурс", - "de-ch": "Ressource", - "pt-br": "Recurso", + 'en-us': 'Resource', + 'ru-ru': 'Ресурс', + 'es-es': 'Recurso', + 'fr-fr': 'Ressource', + 'uk-ua': 'Ресурс', + 'de-ch': 'Ressource', + 'pt-br': 'Recurso', }, allCollections: { - "en-us": "All Collections", - "ru-ru": "Все коллекции", - "es-es": "Todas las colecciones", - "fr-fr": "Toutes les collections", - "uk-ua": "Усі колекції", - "de-ch": "Alle Kollektionen", - "pt-br": "Todas as coleções", + 'en-us': 'All Collections', + 'ru-ru': 'Все коллекции', + 'es-es': 'Todas las colecciones', + 'fr-fr': 'Toutes les collections', + 'uk-ua': 'Усі колекції', + 'de-ch': 'Alle Kollektionen', + 'pt-br': 'Todas as coleções', }, thisCollection: { - "en-us": "This collection", - "ru-ru": "Эта коллекция", - "es-es": "Esta colección", - "fr-fr": "Cette collection", - "uk-ua": "Ця колекція", - "de-ch": "Diese Sammlung", - "pt-br": "Esta coleção", + 'en-us': 'This collection', + 'ru-ru': 'Эта коллекция', + 'es-es': 'Esta colección', + 'fr-fr': 'Cette collection', + 'uk-ua': 'Ця колекція', + 'de-ch': 'Diese Sammlung', + 'pt-br': 'Esta coleção', }, allActions: { - "en-us": "All Actions", - "ru-ru": "Все действия", - "es-es": "Todas las acciones", - "fr-fr": "Toutes les actions", - "uk-ua": "Усі дії", - "de-ch": "Alle Aktionen", - "pt-br": "Todas as ações", + 'en-us': 'All Actions', + 'ru-ru': 'Все действия', + 'es-es': 'Todas las acciones', + 'fr-fr': 'Toutes les actions', + 'uk-ua': 'Усі дії', + 'de-ch': 'Alle Aktionen', + 'pt-br': 'Todas as ações', }, collectionAccess: { - "en-us": "Enable Collection Access", - "ru-ru": "Включить доступ к коллекции", - "es-es": "Habilitar acceso a la colección", - "fr-fr": "Autoriser l'accès à la collection", - "uk-ua": "Увімкнути доступ до колекції", - "de-ch": "Sammlungszugriff aktivieren", - "pt-br": "Habilitar acesso à coleção", + 'en-us': 'Enable Collection Access', + 'ru-ru': 'Включить доступ к коллекции', + 'es-es': 'Habilitar acceso a la colección', + 'fr-fr': "Autoriser l'accès à la collection", + 'uk-ua': 'Увімкнути доступ до колекції', + 'de-ch': 'Sammlungszugriff aktivieren', + 'pt-br': 'Habilitar acesso à coleção', }, createRole: { - "en-us": "Create Role", - "ru-ru": "Создать роль", - "es-es": "Crear rol", - "fr-fr": "Créer un rôle", - "uk-ua": "Створити роль", - "de-ch": "Rolle erstellen", - "pt-br": "Criar função", + 'en-us': 'Create Role', + 'ru-ru': 'Создать роль', + 'es-es': 'Crear rol', + 'fr-fr': 'Créer un rôle', + 'uk-ua': 'Створити роль', + 'de-ch': 'Rolle erstellen', + 'pt-br': 'Criar função', }, newRole: { - "en-us": "New Role", - "ru-ru": "Новая роль", - "es-es": "Nuevo rol", - "fr-fr": "Nouveau rôle", - "uk-ua": "Нова роль", - "de-ch": "Neue Rolle", - "pt-br": "Nova função", + 'en-us': 'New Role', + 'ru-ru': 'Новая роль', + 'es-es': 'Nuevo rol', + 'fr-fr': 'Nouveau rôle', + 'uk-ua': 'Нова роль', + 'de-ch': 'Neue Rolle', + 'pt-br': 'Nova função', }, fromLibrary: { - "en-us": "From library:", - "ru-ru": "Из библиотеки:", - "es-es": "De la biblioteca:", - "fr-fr": "Depuis la bibliothèque :", - "uk-ua": "З бібліотеки:", - "de-ch": "Aus der Bibliothek:", - "pt-br": "Da biblioteca:", + 'en-us': 'From library:', + 'ru-ru': 'Из библиотеки:', + 'es-es': 'De la biblioteca:', + 'fr-fr': 'Depuis la bibliothèque :', + 'uk-ua': 'З бібліотеки:', + 'de-ch': 'Aus der Bibliothek:', + 'pt-br': 'Da biblioteca:', }, fromExistingRole: { - "en-us": "From an existing role:", - "ru-ru": "Из существующей роли:", - "es-es": "Desde un rol existente:", - "fr-fr": "À partir d'un rôle existant :", - "uk-ua": "З існуючої ролі:", - "de-ch": "Aus einer vorhandenen Rolle:", - "pt-br": "De uma função existente:", + 'en-us': 'From an existing role:', + 'ru-ru': 'Из существующей роли:', + 'es-es': 'Desde un rol existente:', + 'fr-fr': "À partir d'un rôle existant :", + 'uk-ua': 'З існуючої ролі:', + 'de-ch': 'Aus einer vorhandenen Rolle:', + 'pt-br': 'De uma função existente:', }, createNewRoles: { - "en-us": "Create new roles:", - "ru-ru": "Создать новые роли:", - "es-es": "Crear nuevos roles:", - "fr-fr": "Créer de nouveaux rôles :", - "uk-ua": "Створити нові ролі:", - "de-ch": "Neue Rollen erstellen:", - "pt-br": "Criar novas funções:", + 'en-us': 'Create new roles:', + 'ru-ru': 'Создать новые роли:', + 'es-es': 'Crear nuevos roles:', + 'fr-fr': 'Créer de nouveaux rôles :', + 'uk-ua': 'Створити нові ролі:', + 'de-ch': 'Neue Rollen erstellen:', + 'pt-br': 'Criar novas funções:', }, updateExistingRoles: { - "en-us": "Update existing roles:", - "ru-ru": "Обновить существующие роли:", - "es-es": "Actualizar roles existentes:", - "fr-fr": "Mettre à jour les rôles existants :", - "uk-ua": "Оновити існуючі ролі:", - "de-ch": "Vorhandene Rollen aktualisieren:", - "pt-br": "Atualizar funções existentes:", + 'en-us': 'Update existing roles:', + 'ru-ru': 'Обновить существующие роли:', + 'es-es': 'Actualizar roles existentes:', + 'fr-fr': 'Mettre à jour les rôles existants :', + 'uk-ua': 'Оновити існуючі ролі:', + 'de-ch': 'Vorhandene Rollen aktualisieren:', + 'pt-br': 'Atualizar funções existentes:', }, unchangedRoles: { - "en-us": "Unchanged roles:", - "ru-ru": "Неизменные роли:", - "es-es": "Roles sin cambios:", - "fr-fr": "Rôles inchangés :", - "uk-ua": "Незмінні ролі:", - "de-ch": "Unveränderte Rollen:", - "pt-br": "Funções inalteradas:", + 'en-us': 'Unchanged roles:', + 'ru-ru': 'Неизменные роли:', + 'es-es': 'Roles sin cambios:', + 'fr-fr': 'Rôles inchangés :', + 'uk-ua': 'Незмінні ролі:', + 'de-ch': 'Unveränderte Rollen:', + 'pt-br': 'Funções inalteradas:', }, institutionAdmin: { - "en-us": "Institution Admin", - "ru-ru": "Администратор учреждения", - "es-es": "Administrador de la institución", - "fr-fr": "Administrateur de l'établissement", - "uk-ua": "Адміністратор установи", - "de-ch": "Institutionsadministrator", - "pt-br": "Administrador da Instituição", + 'en-us': 'Institution Admin', + 'ru-ru': 'Администратор учреждения', + 'es-es': 'Administrador de la institución', + 'fr-fr': "Administrateur de l'établissement", + 'uk-ua': 'Адміністратор установи', + 'de-ch': 'Institutionsadministrator', + 'pt-br': 'Administrador da Instituição', }, createInviteLink: { - "en-us": "Create Invite Link", - "ru-ru": "Создать ссылку для приглашения", - "es-es": "Crear enlace de invitación", - "fr-fr": "Créer un lien d'invitation", - "uk-ua": "Створити посилання для запрошення", - "de-ch": "Einladungslink erstellen", - "pt-br": "Criar link de convite", + 'en-us': 'Create Invite Link', + 'ru-ru': 'Создать ссылку для приглашения', + 'es-es': 'Crear enlace de invitación', + 'fr-fr': "Créer un lien d'invitation", + 'uk-ua': 'Створити посилання для запрошення', + 'de-ch': 'Einladungslink erstellen', + 'pt-br': 'Criar link de convite', }, userInviteLink: { - "en-us": "User Invite Link", - "ru-ru": "Ссылка для приглашения пользователя", - "es-es": "Enlace de invitación de usuario", - "fr-fr": "Lien d'invitation utilisateur", - "uk-ua": "Посилання для запрошення користувача", - "de-ch": "Benutzereinladungslink", - "pt-br": "Link de convite do usuário", + 'en-us': 'User Invite Link', + 'ru-ru': 'Ссылка для приглашения пользователя', + 'es-es': 'Enlace de invitación de usuario', + 'fr-fr': "Lien d'invitation utilisateur", + 'uk-ua': 'Посилання для запрошення користувача', + 'de-ch': 'Benutzereinladungslink', + 'pt-br': 'Link de convite do usuário', }, userInviteLinkDescription: { - "en-us": - "Send the following link to {userName:string} to allow them to log in for the first time.", - "ru-ru": - "Отправьте следующую ссылку {userName:string}, чтобы разрешить ему войти в систему в первый раз.", - "es-es": - "Envíe el siguiente enlace a {userName:string} para permitirles iniciar sesión por primera vez.", - "fr-fr": - "Envoyez le lien suivant à {userName:string} pour leur permettre de se connecter pour la première fois.", - "uk-ua": - "Надішліть наступне посилання користувачу {userName:string}, щоб дозволити йому вперше увійти в систему.", - "de-ch": - "Senden Sie den folgenden Link an {userName:string}, um ihnen die erstmalige Anmeldung zu ermöglichen.", - "pt-br": - "Envie o seguinte link para {userName:string} para permitir que eles façam login pela primeira vez.", + 'en-us': + 'Send the following link to {userName:string} to allow them to log in for the first time.', + 'ru-ru': + 'Отправьте следующую ссылку {userName:string}, чтобы разрешить ему войти в систему в первый раз.', + 'es-es': + 'Envíe el siguiente enlace a {userName:string} para permitirles iniciar sesión por primera vez.', + 'fr-fr': + 'Envoyez le lien suivant à {userName:string} pour leur permettre de se connecter pour la première fois.', + 'uk-ua': + 'Надішліть наступне посилання користувачу {userName:string}, щоб дозволити йому вперше увійти в систему.', + 'de-ch': + 'Senden Sie den folgenden Link an {userName:string}, um ihnen die erstmalige Anmeldung zu ermöglichen.', + 'pt-br': + 'Envie o seguinte link para {userName:string} para permitir que eles façam login pela primeira vez.', }, noProvidersForUserInviteLink: { - "en-us": - "No external identity provider is configured. You can configure some in Specify 7 server settings", - "ru-ru": - "Внешний поставщик удостоверений не настроен. Вы можете настроить некоторые параметры в разделе «Укажите 7 параметров сервера»", - "es-es": - "No hay configurado ningún proveedor de identidad externo. Puede configurar algunos en configuraciones de servidor de Specify 7", - "fr-fr": + 'en-us': + 'No external identity provider is configured. You can configure some in Specify 7 server settings', + 'ru-ru': + 'Внешний поставщик удостоверений не настроен. Вы можете настроить некоторые параметры в разделе «Укажите 7 параметров сервера»', + 'es-es': + 'No hay configurado ningún proveedor de identidad externo. Puede configurar algunos en configuraciones de servidor de Specify 7', + 'fr-fr': "Aucun fournisseur d'identité externe n'est configuré. Vous pouvez en configurer certains dans les paramètres du serveur de Specify 7", - "uk-ua": - "Зовнішнього постачальника ідентифікаційних даних не налаштовано. Ви можете налаштувати деякі з них у розділі «Specify 7 параметрів сервера»", - "de-ch": - "Es ist kein externer Identitätsanbieter konfiguriert. Sie können einige in den Servereinstellungen festlegen.", - "pt-br": + 'uk-ua': + 'Зовнішнього постачальника ідентифікаційних даних не налаштовано. Ви можете налаштувати деякі з них у розділі «Specify 7 параметрів сервера»', + 'de-ch': + 'Es ist kein externer Identitätsanbieter konfiguriert. Sie können einige in den Servereinstellungen festlegen.', + 'pt-br': 'Nenhum provedor de identidade externo está configurado. Você pode configurar alguns em "Especificar 7 configurações do servidor".', }, legacyPermissions: { - "en-us": "Specify 6 Permissions", - "ru-ru": "Укажите 6 разрешений", - "es-es": "Permisos de Specify 6", - "fr-fr": "Autorisations de Specify 6", - "uk-ua": "Specify 6 дозволів", - "de-ch": "Geben Sie 6 Berechtigungen an", - "pt-br": "Especifique 6 permissões", + 'en-us': 'Specify 6 Permissions', + 'ru-ru': 'Укажите 6 разрешений', + 'es-es': 'Permisos de Specify 6', + 'fr-fr': 'Autorisations de Specify 6', + 'uk-ua': 'Specify 6 дозволів', + 'de-ch': 'Geben Sie 6 Berechtigungen an', + 'pt-br': 'Especifique 6 permissões', }, setPasswordBeforeSavePrompt: { - "en-us": + 'en-us': "Consider setting a password for this user. Users without a password won't be able to sign in", - "ru-ru": - "Рассмотрите возможность установки пароля для этого пользователя. Пользователи без пароля не смогут войти в систему", - "es-es": - "Considere establecer una contraseña para este usuario. Los usuarios sin contraseña no podrán iniciar sesión", - "fr-fr": - "Pensez à définir un mot de passe pour cet utilisateur. Les utilisateurs sans mot de passe ne pourront pas se connecter", - "uk-ua": - "Спробуйте встановити пароль для цього користувача. Користувачі без пароля не зможуть увійти", - "de-ch": - "Erwägen Sie, für diesen Benutzer ein Passwort festzulegen. Benutzer ohne Passwort können sich nicht anmelden.", - "pt-br": - "Considere definir uma senha para este usuário. Usuários sem senha não conseguirão fazer login.", + 'ru-ru': + 'Рассмотрите возможность установки пароля для этого пользователя. Пользователи без пароля не смогут войти в систему', + 'es-es': + 'Considere establecer una contraseña para este usuario. Los usuarios sin contraseña no podrán iniciar sesión', + 'fr-fr': + 'Pensez à définir un mot de passe pour cet utilisateur. Les utilisateurs sans mot de passe ne pourront pas se connecter', + 'uk-ua': + 'Спробуйте встановити пароль для цього користувача. Користувачі без пароля не зможуть увійти', + 'de-ch': + 'Erwägen Sie, für diesen Benutzer ein Passwort festzulegen. Benutzer ohne Passwort können sich nicht anmelden.', + 'pt-br': + 'Considere definir uma senha para este usuário. Usuários sem senha não conseguirão fazer login.', }, setCollections: { - "en-us": "Set Collections", - "ru-ru": "Набор Коллекций", - "es-es": "Establecer colecciones", - "fr-fr": "Collections d'ensembles", - "uk-ua": "Колекції наборів", - "de-ch": "Sammlungen festlegen", - "pt-br": "Conjuntos de coleções", + 'en-us': 'Set Collections', + 'ru-ru': 'Набор Коллекций', + 'es-es': 'Establecer colecciones', + 'fr-fr': "Collections d'ensembles", + 'uk-ua': 'Колекції наборів', + 'de-ch': 'Sammlungen festlegen', + 'pt-br': 'Conjuntos de coleções', }, agentInUse: { - "en-us": "This agent is already associated with a different user.", - "ru-ru": "Этот агент уже связан с другим пользователем.", - "es-es": "Este agente ya está asociado con un usuario diferente.", - "fr-fr": "Cet agent est déjà associé à un autre utilisateur.", - "uk-ua": "Цей агент вже пов'язаний з іншим користувачем.", - "de-ch": "Dieser Agent ist bereits einem anderen Benutzer zugeordnet.", - "pt-br": "Este agente já está associado a um usuário diferente.", + 'en-us': 'This agent is already associated with a different user.', + 'ru-ru': 'Этот агент уже связан с другим пользователем.', + 'es-es': 'Este agente ya está asociado con un usuario diferente.', + 'fr-fr': 'Cet agent est déjà associé à un autre utilisateur.', + 'uk-ua': "Цей агент вже пов'язаний з іншим користувачем.", + 'de-ch': 'Dieser Agent ist bereits einem anderen Benutzer zugeordnet.', + 'pt-br': 'Este agente já está associado a um usuário diferente.', }, setAgentsBeforeProceeding: { - "en-us": "Please set the following agents before proceeding:", - "ru-ru": "Прежде чем продолжить, установите следующие агенты:", - "es-es": "Configure los siguientes agentes antes de continuar:", - "uk-ua": "Будь ласка, налаштуйте наступних агентів, перш ніж продовжити:", - "de-ch": - "Bitte legen Sie die folgenden Agenten fest, bevor Sie fortfahren:", - "fr-fr": "Veuillez définir les agents suivants avant de continuer :", - "pt-br": "Defina os seguintes agentes antes de prosseguir:", + 'en-us': 'Please set the following agents before proceeding:', + 'ru-ru': 'Прежде чем продолжить, установите следующие агенты:', + 'es-es': 'Configure los siguientes agentes antes de continuar:', + 'uk-ua': 'Будь ласка, налаштуйте наступних агентів, перш ніж продовжити:', + 'de-ch': + 'Bitte legen Sie die folgenden Agenten fest, bevor Sie fortfahren:', + 'fr-fr': 'Veuillez définir les agents suivants avant de continuer :', + 'pt-br': 'Defina os seguintes agentes antes de prosseguir:', }, externalIdentityProviders: { - "en-us": "External identity providers:", - "es-es": "Proveedores de identidad externos:", - "fr-fr": "Fournisseurs d'identité externes :", - "de-ch": "Externe Identitätsanbieter:", - "ru-ru": "Внешние поставщики удостоверений:", - "uk-ua": "Зовнішні постачальники ідентифікаційних даних:", - "pt-br": "Provedores de identidade externos:", + 'en-us': 'External identity providers:', + 'es-es': 'Proveedores de identidad externos:', + 'fr-fr': "Fournisseurs d'identité externes :", + 'de-ch': 'Externe Identitätsanbieter:', + 'ru-ru': 'Внешние поставщики удостоверений:', + 'uk-ua': 'Зовнішні постачальники ідентифікаційних даних:', + 'pt-br': 'Provedores de identidade externos:', }, allTables: { - "en-us": "All tables", - "ru-ru": "Все таблицы", - "es-es": "Todas las tablas", - "fr-fr": "Tous les tableaux", - "uk-ua": "Усі столи", - "de-ch": "Alle Tabellen", - "pt-br": "Todas as tabelas", + 'en-us': 'All tables', + 'ru-ru': 'Все таблицы', + 'es-es': 'Todas las tablas', + 'fr-fr': 'Tous les tableaux', + 'uk-ua': 'Усі столи', + 'de-ch': 'Alle Tabellen', + 'pt-br': 'Todas as tabelas', }, loadingAdmins: { - "en-us": "Loading admins...", - "ru-ru": "Загрузка администраторов...", - "es-es": "Cargando administradores...", - "fr-fr": "Chargement des administrateurs…", - "uk-ua": "Завантаження адміністраторів...", - "de-ch": "Administratoren werden geladen …", - "pt-br": "Carregando administradores...", + 'en-us': 'Loading admins...', + 'ru-ru': 'Загрузка администраторов...', + 'es-es': 'Cargando administradores...', + 'fr-fr': 'Chargement des administrateurs…', + 'uk-ua': 'Завантаження адміністраторів...', + 'de-ch': 'Administratoren werden geladen …', + 'pt-br': 'Carregando administradores...', }, specifyAdmin: { - comment: "Shown next to user name for admin users", - "en-us": "(Specify 7 Admin)", - "ru-ru": "(Укажите 7 Администратор)", - "es-es": "(Administradores de Specify 7)", - "fr-fr": "(Spécifiez 7 Admin)", - "uk-ua": "(Specify 7 Адміністратор)", - "de-ch": "(Geben Sie 7 Admin an)", - "pt-br": "(Especifique 7 Admin)", + comment: 'Shown next to user name for admin users', + 'en-us': '(Specify 7 Admin)', + 'ru-ru': '(Укажите 7 Администратор)', + 'es-es': '(Administradores de Specify 7)', + 'fr-fr': '(Spécifiez 7 Admin)', + 'uk-ua': '(Specify 7 Адміністратор)', + 'de-ch': '(Geben Sie 7 Admin an)', + 'pt-br': '(Especifique 7 Admin)', }, legacyAdmin: { - comment: "Shown next to user name for admin users", - "en-us": "(Specify 6 Admin)", - "ru-ru": "(Укажите 6 Администратор)", - "es-es": "(Administradores de Specify 6)", - "fr-fr": "(Spécifiez 6 Admin)", - "uk-ua": "(Specify 6 Адміністратор)", - "de-ch": "(Geben Sie 6 Admin an)", - "pt-br": "(Especifique 6 Admin)", + comment: 'Shown next to user name for admin users', + 'en-us': '(Specify 6 Admin)', + 'ru-ru': '(Укажите 6 Администратор)', + 'es-es': '(Administradores de Specify 6)', + 'fr-fr': '(Spécifiez 6 Admin)', + 'uk-ua': '(Specify 6 Адміністратор)', + 'de-ch': '(Geben Sie 6 Admin an)', + 'pt-br': '(Especifique 6 Admin)', }, deleteRoleWithUsers: { - "en-us": "Delete role that has users?", - "ru-ru": "Удалить роль, в которой есть пользователи?", - "es-es": "¿Eliminar rol que tiene usuarios?", - "fr-fr": "Supprimer le rôle qui a des utilisateurs ?", - "uk-ua": "Видалити роль, яка має користувачів?", - "de-ch": "Rolle löschen, die Benutzer hat?", - "pt-br": "Excluir função que possui usuários?", + 'en-us': 'Delete role that has users?', + 'ru-ru': 'Удалить роль, в которой есть пользователи?', + 'es-es': '¿Eliminar rol que tiene usuarios?', + 'fr-fr': 'Supprimer le rôle qui a des utilisateurs ?', + 'uk-ua': 'Видалити роль, яка має користувачів?', + 'de-ch': 'Rolle löschen, die Benutzer hat?', + 'pt-br': 'Excluir função que possui usuários?', }, deleteRoleWithUsersDescription: { - "en-us": "Users will not be deleted, but they would lose this role.", - "ru-ru": "Пользователи не будут удалены, но они потеряют эту роль.", - "es-es": "Los usuarios no serán eliminados, pero perderán este rol.", - "fr-fr": - "Les utilisateurs ne seront pas supprimés, mais ils perdront ce rôle.", - "uk-ua": "Користувачів не буде видалено, але вони втратять цю роль.", - "de-ch": - "Benutzer werden nicht gelöscht, sie würden jedoch diese Rolle verlieren.", - "pt-br": "Os usuários não serão excluídos, mas perderão essa função.", + 'en-us': 'Users will not be deleted, but they would lose this role.', + 'ru-ru': 'Пользователи не будут удалены, но они потеряют эту роль.', + 'es-es': 'Los usuarios no serán eliminados, pero perderán este rol.', + 'fr-fr': + 'Les utilisateurs ne seront pas supprimés, mais ils perdront ce rôle.', + 'uk-ua': 'Користувачів не буде видалено, але вони втратять цю роль.', + 'de-ch': + 'Benutzer werden nicht gelöscht, sie würden jedoch diese Rolle verlieren.', + 'pt-br': 'Os usuários não serão excluídos, mas perderão essa função.', }, institutionPolicies: { - "en-us": - "Custom Institution-level Policies (applies to all assigned collections)", - "ru-ru": - "Пользовательские политики на уровне учреждения (применяются ко всем назначенным коллекциям)", - "es-es": - "Políticas personalizadas a nivel de Institución (se aplican a todas las colecciones asignadas)", - "fr-fr": + 'en-us': + 'Custom Institution-level Policies (applies to all assigned collections)', + 'ru-ru': + 'Пользовательские политики на уровне учреждения (применяются ко всем назначенным коллекциям)', + 'es-es': + 'Políticas personalizadas a nivel de Institución (se aplican a todas las colecciones asignadas)', + 'fr-fr': "Politiques personnalisées au niveau de l'institution (s'appliquent à toutes les collections attribuées)", - "uk-ua": - "Спеціальні правила на рівні установи (стосуються всіх призначених колекцій)", - "de-ch": - "Benutzerdefinierte Richtlinien auf Institutionsebene (gilt für alle zugewiesenen Sammlungen)", - "pt-br": - "Políticas personalizadas em nível de instituição (aplica-se a todas as coleções atribuídas)", + 'uk-ua': + 'Спеціальні правила на рівні установи (стосуються всіх призначених колекцій)', + 'de-ch': + 'Benutzerdefinierte Richtlinien auf Institutionsebene (gilt für alle zugewiesenen Sammlungen)', + 'pt-br': + 'Políticas personalizadas em nível de instituição (aplica-se a todas as coleções atribuídas)', }, cantRemoveLastAdmin: { - "en-us": "Can't remove Institution Admin status", - "ru-ru": "Невозможно удалить статус администратора учреждения", - "es-es": - "No se puede eliminar el estatus de Administrador de la Institución", - "fr-fr": + 'en-us': "Can't remove Institution Admin status", + 'ru-ru': 'Невозможно удалить статус администратора учреждения', + 'es-es': + 'No se puede eliminar el estatus de Administrador de la Institución', + 'fr-fr': "Impossible de supprimer le statut d'administrateur de l'établissement", - "uk-ua": "Не вдається видалити статус адміністратора установи", - "de-ch": - "Der Status „Institutionsadministrator“ kann nicht entfernt werden", - "pt-br": "Não é possível remover o status de administrador da instituição", + 'uk-ua': 'Не вдається видалити статус адміністратора установи', + 'de-ch': + 'Der Status „Institutionsadministrator“ kann nicht entfernt werden', + 'pt-br': 'Não é possível remover o status de administrador da instituição', }, cantRemoveLastAdminDescription: { - "en-us": "There must be at least one Institution Admin in institution", - "ru-ru": - "В учреждении должен быть как минимум один администратор учреждения.", - "es-es": - "En la Institución debe haber al menos un Administrador de la Institución", - "fr-fr": + 'en-us': 'There must be at least one Institution Admin in institution', + 'ru-ru': + 'В учреждении должен быть как минимум один администратор учреждения.', + 'es-es': + 'En la Institución debe haber al menos un Administrador de la Institución', + 'fr-fr': "Il doit y avoir au moins un administrateur d'établissement dans l'établissement", - "uk-ua": "У закладі має бути принаймні один адміністратор закладу", - "de-ch": - "Es muss mindestens einen Institutionsadministrator in der Institution geben", - "pt-br": - "Deve haver pelo menos um administrador da instituição na instituição", + 'uk-ua': 'У закладі має бути принаймні один адміністратор закладу', + 'de-ch': + 'Es muss mindestens einen Institutionsadministrator in der Institution geben', + 'pt-br': + 'Deve haver pelo menos um administrador da instituição na instituição', }, switchToHorizontalLayout: { - "en-us": "Switch to horizontal layout", - "ru-ru": "Переключиться на горизонтальную компоновку", - "es-es": "Cambiar a diseño horizontal", - "fr-fr": "Passer à l'affichage horizontal", - "uk-ua": "Перейти до горизонтального розташування", - "de-ch": "Zum horizontalen Layout wechseln", - "pt-br": "Mudar para layout horizontal", + 'en-us': 'Switch to horizontal layout', + 'ru-ru': 'Переключиться на горизонтальную компоновку', + 'es-es': 'Cambiar a diseño horizontal', + 'fr-fr': "Passer à l'affichage horizontal", + 'uk-ua': 'Перейти до горизонтального розташування', + 'de-ch': 'Zum horizontalen Layout wechseln', + 'pt-br': 'Mudar para layout horizontal', }, switchToVerticalLayout: { - "en-us": "Switch to vertical layout", - "ru-ru": "Переключиться на вертикальную компоновку", - "es-es": "Cambiar al diseño vertical", - "fr-fr": "Passer à l'affichage vertical", - "de-ch": "Zum vertikalen Layout wechseln", - "uk-ua": "Перейти до вертикального розташування", - "pt-br": "Mudar para layout vertical", + 'en-us': 'Switch to vertical layout', + 'ru-ru': 'Переключиться на вертикальную компоновку', + 'es-es': 'Cambiar al diseño vertical', + 'fr-fr': "Passer à l'affichage vertical", + 'de-ch': 'Zum vertikalen Layout wechseln', + 'uk-ua': 'Перейти до вертикального розташування', + 'pt-br': 'Mudar para layout vertical', }, advancedTables: { - "en-us": "Advanced tables", - "ru-ru": "Расширенные таблицы", - "es-es": "Tablas avanzadas", - "fr-fr": "Tableaux avancés", - "uk-ua": "Розширені таблиці", - "de-ch": "Erweiterte Tabellen", - "pt-br": "Tabelas avançadas", + 'en-us': 'Advanced tables', + 'ru-ru': 'Расширенные таблицы', + 'es-es': 'Tablas avanzadas', + 'fr-fr': 'Tableaux avancés', + 'uk-ua': 'Розширені таблиці', + 'de-ch': 'Erweiterte Tabellen', + 'pt-br': 'Tabelas avançadas', }, excludedInstitutionalPolicies: { - "en-us": "Excluded institutional policies:", - "ru-ru": "Исключенные институциональные политики:", - "es-es": "Políticas institucionales excluidas:", - "fr-fr": "Politiques institutionnelles exclues :", - "uk-ua": "Виключені інституційні політики:", - "de-ch": "Ausgeschlossene institutionelle Richtlinien:", - "pt-br": "Políticas institucionais excluídas:", + 'en-us': 'Excluded institutional policies:', + 'ru-ru': 'Исключенные институциональные политики:', + 'es-es': 'Políticas institucionales excluidas:', + 'fr-fr': 'Politiques institutionnelles exclues :', + 'uk-ua': 'Виключені інституційні політики:', + 'de-ch': 'Ausgeschlossene institutionelle Richtlinien:', + 'pt-br': 'Políticas institucionais excluídas:', }, excludedInstitutionalPoliciesDescription: { - "en-us": - "(Some policies that apply only at the institution-level are not present here at the collection-level.)", - "ru-ru": - "(Некоторые политики, которые применяются только на уровне учреждения, не представлены здесь на уровне сбора.)", - "es-es": - "(Algunas políticas que se aplican solo a nivel de institución no están presentes aquí, a nivel de colección)", - "fr-fr": - "(Certaines politiques qui s’appliquent uniquement au niveau de l’institution ne sont pas présentes ici au niveau de la collection.)", - "uk-ua": - "(Деякі політики, що застосовуються лише на рівні установи, відсутні тут на рівні колекції.)", - "de-ch": - "(Einige Richtlinien, die nur auf Institutionsebene gelten, sind hier auf Sammlungsebene nicht vorhanden.)", - "pt-br": - "(Algumas políticas que se aplicam apenas ao nível da instituição não estão presentes aqui no nível da coleção.)", + 'en-us': + '(Some policies that apply only at the institution-level are not present here at the collection-level.)', + 'ru-ru': + '(Некоторые политики, которые применяются только на уровне учреждения, не представлены здесь на уровне сбора.)', + 'es-es': + '(Algunas políticas que se aplican solo a nivel de institución no están presentes aquí, a nivel de colección)', + 'fr-fr': + '(Certaines politiques qui s’appliquent uniquement au niveau de l’institution ne sont pas présentes ici au niveau de la collection.)', + 'uk-ua': + '(Деякі політики, що застосовуються лише на рівні установи, відсутні тут на рівні колекції.)', + 'de-ch': + '(Einige Richtlinien, die nur auf Institutionsebene gelten, sind hier auf Sammlungsebene nicht vorhanden.)', + 'pt-br': + '(Algumas políticas que se aplicam apenas ao nível da instituição não estão presentes aqui no nível da coleção.)', }, accountSetupOptions: { - "en-us": "Account Setup Options", - "ru-ru": "Параметры настройки учетной записи", - "es-es": "Opciones de configuración de cuenta", - "fr-fr": "Options de configuration du compte", - "uk-ua": "Параметри налаштування облікового запису", - "de-ch": "Optionen zur Kontoeinrichtung", - "pt-br": "Opções de configuração de conta", + 'en-us': 'Account Setup Options', + 'ru-ru': 'Параметры настройки учетной записи', + 'es-es': 'Opciones de configuración de cuenta', + 'fr-fr': 'Options de configuration du compte', + 'uk-ua': 'Параметри налаштування облікового запису', + 'de-ch': 'Optionen zur Kontoeinrichtung', + 'pt-br': 'Opções de configuração de conta', }, currentUser: { - "en-us": "Current User", - "ru-ru": "Текущий пользователь", - "de-ch": "Aktueller Benutzer", - "es-es": "Usuario actual", - "fr-fr": "Utilisateur actuel", - "uk-ua": "Поточний користувач", - "pt-br": "Usuário atual", + 'en-us': 'Current User', + 'ru-ru': 'Текущий пользователь', + 'de-ch': 'Aktueller Benutzer', + 'es-es': 'Usuario actual', + 'fr-fr': 'Utilisateur actuel', + 'uk-ua': 'Поточний користувач', + 'pt-br': 'Usuário atual', }, addRole: { - "en-us": "Add Role", - "de-ch": "Rolle hinzufügen", - "es-es": "Agregar rol", - "fr-fr": "Ajouter un rôle", - "ru-ru": "Добавить роль", - "uk-ua": "Додати роль", - "pt-br": "Adicionar função", + 'en-us': 'Add Role', + 'de-ch': 'Rolle hinzufügen', + 'es-es': 'Agregar rol', + 'fr-fr': 'Ajouter un rôle', + 'ru-ru': 'Добавить роль', + 'uk-ua': 'Додати роль', + 'pt-br': 'Adicionar função', }, addUser: { - "en-us": "Add User", - "de-ch": "Benutzer hinzufügen", - "es-es": "Agregar usuario", - "fr-fr": "Ajouter un utilisateur", - "ru-ru": "Добавить пользователя", - "uk-ua": "Додати користувача", - "pt-br": "Adicionar usuário", + 'en-us': 'Add User', + 'de-ch': 'Benutzer hinzufügen', + 'es-es': 'Agregar usuario', + 'fr-fr': 'Ajouter un utilisateur', + 'ru-ru': 'Добавить пользователя', + 'uk-ua': 'Додати користувача', + 'pt-br': 'Adicionar usuário', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/wbPlan.ts b/specifyweb/frontend/js_src/lib/localization/wbPlan.ts index 23e71f403cc..77c62f9d195 100644 --- a/specifyweb/frontend/js_src/lib/localization/wbPlan.ts +++ b/specifyweb/frontend/js_src/lib/localization/wbPlan.ts @@ -4,682 +4,682 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const wbPlanText = createDictionary({ dataMapper: { - "en-us": "Data Mapper", - "ru-ru": "Сопоставления", - "es-es": "Mapeador de Datos", - "fr-fr": "Cartographe de données", - "uk-ua": "Папки даних", - "de-ch": "Datenzuordnung", - "pt-br": "Mapeador de Dados", + 'en-us': 'Data Mapper', + 'ru-ru': 'Сопоставления', + 'es-es': 'Mapeador de Datos', + 'fr-fr': 'Cartographe de données', + 'uk-ua': 'Папки даних', + 'de-ch': 'Datenzuordnung', + 'pt-br': 'Mapeador de Dados', }, noUploadPlan: { - "en-us": "No Upload Plan is Defined", - "ru-ru": "План загрузки не определен", - "es-es": "No hay definido ningún plan de carga", - "fr-fr": "Aucun plan de téléchargement n'est défini", - "uk-ua": "План завантаження не визначено", - "de-ch": "Es wurde kein Uploadplan definiert", - "pt-br": "Nenhum plano de upload está definido", + 'en-us': 'No Upload Plan is Defined', + 'ru-ru': 'План загрузки не определен', + 'es-es': 'No hay definido ningún plan de carga', + 'fr-fr': "Aucun plan de téléchargement n'est défini", + 'uk-ua': 'План завантаження не визначено', + 'de-ch': 'Es wurde kein Uploadplan definiert', + 'pt-br': 'Nenhum plano de upload está definido', }, noUploadPlanDescription: { - "en-us": - "No Upload Plan has been defined for this Data Set. Create one now?", - "ru-ru": - "Для этого набора данных не определен план загрузки. Создать эго сейчас?", - "es-es": - "No se ha definido ningún plan de carga para este conjunto de datos. ¿Crear uno ahora?", - "fr-fr": + 'en-us': + 'No Upload Plan has been defined for this Data Set. Create one now?', + 'ru-ru': + 'Для этого набора данных не определен план загрузки. Создать эго сейчас?', + 'es-es': + 'No se ha definido ningún plan de carga para este conjunto de datos. ¿Crear uno ahora?', + 'fr-fr': "Aucun plan de téléchargement n'a été défini pour cet ensemble de données. Voulez-vous en créer un maintenant ?", - "uk-ua": - "Для цього набору даних не визначено план завантаження. Створити зараз?", - "de-ch": - "Für diesen Datensatz wurde noch kein Upload-Plan definiert. Jetzt einen erstellen?", - "pt-br": - "Nenhum Plano de Upload foi definido para este Conjunto de Dados. Criar um agora?", + 'uk-ua': + 'Для цього набору даних не визначено план завантаження. Створити зараз?', + 'de-ch': + 'Für diesen Datensatz wurde noch kein Upload-Plan definiert. Jetzt einen erstellen?', + 'pt-br': + 'Nenhum Plano de Upload foi definido para este Conjunto de Dados. Criar um agora?', }, unmappedColumn: { - "en-us": "Unmapped Column", - "ru-ru": "Несопоставленный столбец", - "es-es": "Columna no asignada", - "fr-fr": "Colonne non mappée", - "uk-ua": "Невідповідний стовпець", - "de-ch": "Nicht gemappte Spalte", - "pt-br": "Coluna não mapeada", + 'en-us': 'Unmapped Column', + 'ru-ru': 'Несопоставленный столбец', + 'es-es': 'Columna no asignada', + 'fr-fr': 'Colonne non mappée', + 'uk-ua': 'Невідповідний стовпець', + 'de-ch': 'Nicht gemappte Spalte', + 'pt-br': 'Coluna não mapeada', }, notSelected: { - comment: "Show in pick list in Data Mapper when column is not mapped", - "en-us": "NONE SELECTED", - "ru-ru": "НЕ ВЫБРАНО", - "es-es": "NO ASIGNADO/MAPEADO", - "fr-fr": "AUCUN SÉLECTIONNÉ", - "uk-ua": "НЕ ВИБРАНО", - "de-ch": "Nicht kartiert", - "pt-br": "NENHUM SELECIONADO", + comment: 'Show in pick list in Data Mapper when column is not mapped', + 'en-us': 'NONE SELECTED', + 'ru-ru': 'НЕ ВЫБРАНО', + 'es-es': 'NO ASIGNADO/MAPEADO', + 'fr-fr': 'AUCUN SÉLECTIONNÉ', + 'uk-ua': 'НЕ ВИБРАНО', + 'de-ch': 'Nicht kartiert', + 'pt-br': 'NENHUM SELECIONADO', }, unmapped: { - "en-us": "Unmapped", - "ru-ru": "Не сопоставлений", - "es-es": "sin mapear", - "fr-fr": "Non cartographié", - "uk-ua": "Не зіставлений", - "de-ch": "Zuordnung ist erforderlich", - "pt-br": "Não mapeado", + 'en-us': 'Unmapped', + 'ru-ru': 'Не сопоставлений', + 'es-es': 'sin mapear', + 'fr-fr': 'Non cartographié', + 'uk-ua': 'Не зіставлений', + 'de-ch': 'Zuordnung ist erforderlich', + 'pt-br': 'Não mapeado', }, mapped: { - "en-us": "Mapped", - "ru-ru": "Сопоставлений", - "es-es": "Mapeado", - "fr-fr": "Cartographié", - "uk-ua": "Нанесено на карту", - "de-ch": "Kartiert", - "pt-br": "Mapeado", + 'en-us': 'Mapped', + 'ru-ru': 'Сопоставлений', + 'es-es': 'Mapeado', + 'fr-fr': 'Cartographié', + 'uk-ua': 'Нанесено на карту', + 'de-ch': 'Kartiert', + 'pt-br': 'Mapeado', }, matchBehavior: { - "en-us": "Match Behavior:", - "ru-ru": "Поведение при совпадении:", - "es-es": "Coincidir en comportamiento:", - "fr-fr": "Comportement du match :", - "uk-ua": "Поведінка відповідності:", - "de-ch": "Übereinstimmungsverhalten:", - "pt-br": "Comportamento da partida:", + 'en-us': 'Match Behavior:', + 'ru-ru': 'Поведение при совпадении:', + 'es-es': 'Coincidir en comportamiento:', + 'fr-fr': 'Comportement du match :', + 'uk-ua': 'Поведінка відповідності:', + 'de-ch': 'Übereinstimmungsverhalten:', + 'pt-br': 'Comportamento da partida:', }, columnMapping: { - "en-us": "Column Mapping", - "ru-ru": "Сопоставление столбцов", - "es-es": "Asignación/Mapeo de columnas", - "fr-fr": "Mappage des colonnes", - "uk-ua": "Відображення стовпців", - "de-ch": "Spaltenzuordnung", - "pt-br": "Mapeamento de colunas", + 'en-us': 'Column Mapping', + 'ru-ru': 'Сопоставление столбцов', + 'es-es': 'Asignación/Mapeo de columnas', + 'fr-fr': 'Mappage des colonnes', + 'uk-ua': 'Відображення стовпців', + 'de-ch': 'Spaltenzuordnung', + 'pt-br': 'Mapeamento de colunas', }, suggestedMappings: { - "en-us": "Suggested Mappings:", - "ru-ru": "Предлагаемые сопоставления:", - "es-es": "Sugerencia de asignaciones/mapeos:", - "fr-fr": "Mappages suggérés :", - "uk-ua": "Пропоновані зіставлення:", - "de-ch": "Vorgeschlagene Zuordnungen:", - "pt-br": "Mapeamentos sugeridos:", + 'en-us': 'Suggested Mappings:', + 'ru-ru': 'Предлагаемые сопоставления:', + 'es-es': 'Sugerencia de asignaciones/mapeos:', + 'fr-fr': 'Mappages suggérés :', + 'uk-ua': 'Пропоновані зіставлення:', + 'de-ch': 'Vorgeschlagene Zuordnungen:', + 'pt-br': 'Mapeamentos sugeridos:', }, requiredFields: { - "en-us": "Required Fields", - "ru-ru": "Обязательные поля", - "es-es": "Campos requeridos", - "fr-fr": "Champs obligatoires", - "uk-ua": "Обов'язкові поля", - "de-ch": "Erforderliche Felder", - "pt-br": "Campos obrigatórios", + 'en-us': 'Required Fields', + 'ru-ru': 'Обязательные поля', + 'es-es': 'Campos requeridos', + 'fr-fr': 'Champs obligatoires', + 'uk-ua': "Обов'язкові поля", + 'de-ch': 'Erforderliche Felder', + 'pt-br': 'Campos obrigatórios', }, optionalFields: { - "en-us": "Optional Fields", - "ru-ru": "Необязательные поля", - "es-es": "Campos Opcionales", - "fr-fr": "Champs facultatifs", - "uk-ua": "Необов'язкові поля", - "de-ch": "Optionale Felder", - "pt-br": "Campos opcionais", + 'en-us': 'Optional Fields', + 'ru-ru': 'Необязательные поля', + 'es-es': 'Campos Opcionales', + 'fr-fr': 'Champs facultatifs', + 'uk-ua': "Необов'язкові поля", + 'de-ch': 'Optionale Felder', + 'pt-br': 'Campos opcionais', }, hiddenFields: { - "en-us": "Hidden Fields", - "ru-ru": "Скрытые поля", - "es-es": "Campos Ocultos", - "fr-fr": "Champs cachés", - "uk-ua": "Приховані поля", - "de-ch": "Versteckte Felder", - "pt-br": "Campos Ocultos", + 'en-us': 'Hidden Fields', + 'ru-ru': 'Скрытые поля', + 'es-es': 'Campos Ocultos', + 'fr-fr': 'Champs cachés', + 'uk-ua': 'Приховані поля', + 'de-ch': 'Versteckte Felder', + 'pt-br': 'Campos Ocultos', }, revealHiddenFormFields: { - "en-us": "Reveal Hidden Form Fields", - "ru-ru": "Показать скрытые поля формы", - "es-es": "Revelar Campos Ocultos del Formulario", - "de-ch": "Versteckte Formularfelder anzeigen", - "fr-fr": "Révéler les champs de formulaire cachés", - "uk-ua": "Відкрийте приховані поля форми", - "pt-br": "Revelar campos ocultos do formulário", + 'en-us': 'Reveal Hidden Form Fields', + 'ru-ru': 'Показать скрытые поля формы', + 'es-es': 'Revelar Campos Ocultos del Formulario', + 'de-ch': 'Versteckte Formularfelder anzeigen', + 'fr-fr': 'Révéler les champs de formulaire cachés', + 'uk-ua': 'Відкрийте приховані поля форми', + 'pt-br': 'Revelar campos ocultos do formulário', }, mappingOptions: { - "en-us": "Mapping Options", - "ru-ru": "Параметры сопоставления", - "es-es": "Opciones de asignaciones/mapeo", - "fr-fr": "Options de cartographie", - "uk-ua": "Параметри відображення", - "de-ch": "Zuordnungsoptionen", - "pt-br": "Opções de mapeamento", + 'en-us': 'Mapping Options', + 'ru-ru': 'Параметры сопоставления', + 'es-es': 'Opciones de asignaciones/mapeo', + 'fr-fr': 'Options de cartographie', + 'uk-ua': 'Параметри відображення', + 'de-ch': 'Zuordnungsoptionen', + 'pt-br': 'Opções de mapeamento', }, ignoreWhenBlank: { - "en-us": "Ignore when Blank", - "ru-ru": "Игнорировать, когда пусто", - "es-es": "Ignorar cuando en blanco", - "fr-fr": "Ignorer lorsque vide", - "uk-ua": "Ігнорувати, коли пусто", - "de-ch": "Bei leer ignorieren", - "pt-br": "Ignorar quando estiver em branco", + 'en-us': 'Ignore when Blank', + 'ru-ru': 'Игнорировать, когда пусто', + 'es-es': 'Ignorar cuando en blanco', + 'fr-fr': 'Ignorer lorsque vide', + 'uk-ua': 'Ігнорувати, коли пусто', + 'de-ch': 'Bei leer ignorieren', + 'pt-br': 'Ignorar quando estiver em branco', }, ignoreWhenBlankDescription: { - "en-us": + 'en-us': 'When set to "Ignore when Blank" blank values in this column will not be considered for matching purposes. Blank values are ignored when matching even if a default value is provided', - "ru-ru": - "Если задано значение «Игнорировать, когда пусто», пустые значения в этом столбце не будет рассматривается для целей сопоставления. Пустые значения игнорируются при сопоставлении даже если указано значение по умолчанию", - "es-es": + 'ru-ru': + 'Если задано значение «Игнорировать, когда пусто», пустые значения в этом столбце не будет рассматривается для целей сопоставления. Пустые значения игнорируются при сопоставлении даже если указано значение по умолчанию', + 'es-es': 'Cuando se establece en "Ignorar si está en blanco", los valores en blanco de esta columna no se tendrán en cuenta a efectos de comparación. Los valores en blanco se ignoran a la hora de establecer correspondencias, incluso si se proporciona un valor por defecto', - "fr-fr": + 'fr-fr': "Si l'option « Ignorer si vide » est sélectionnée, les valeurs vides de cette colonne ne seront pas prises en compte pour la correspondance. Elles sont ignorées lors de la correspondance, même si une valeur par défaut est fournie.", - "uk-ua": - "Якщо встановлено значення «Ignore when Blank», порожні значення в цьому стовпці не розглядатимуться для цілей зіставлення. Порожні значення ігноруються під час збігу, навіть якщо вказано значення за умовчанням", - "de-ch": + 'uk-ua': + 'Якщо встановлено значення «Ignore when Blank», порожні значення в цьому стовпці не розглядатимуться для цілей зіставлення. Порожні значення ігноруються під час збігу, навіть якщо вказано значення за умовчанням', + 'de-ch': 'Bei der Einstellung "Bei leer ignorieren" werden leere Werte in dieser Spalte beim Abgleich nicht berücksichtigt. Leere Werte werden beim Abgleich ignoriert, auch wenn ein Standardwert angegeben ist', - "pt-br": + 'pt-br': 'Quando definido como "Ignorar quando em branco", valores em branco nesta coluna não serão considerados para fins de correspondência. Valores em branco são ignorados durante a correspondência, mesmo que um valor padrão seja fornecido.', }, ignoreAlways: { - "en-us": "Always Ignore", - "ru-ru": "Всегда игнорировать", - "es-es": "Ignorar siempre", - "fr-fr": "Toujours ignorer", - "uk-ua": "Завжди ігнорувати", - "de-ch": "Immer ignorieren", - "pt-br": "Sempre ignorar", + 'en-us': 'Always Ignore', + 'ru-ru': 'Всегда игнорировать', + 'es-es': 'Ignorar siempre', + 'fr-fr': 'Toujours ignorer', + 'uk-ua': 'Завжди ігнорувати', + 'de-ch': 'Immer ignorieren', + 'pt-br': 'Sempre ignorar', }, ignoreAlwaysDescription: { - "en-us": + 'en-us': 'When set to "Ignore Always" the value in this column will never be considered for matching purposes, only for uploading.', - "ru-ru": - "Если задано значение «Всегда игнорировать», значение в этом столбце никогда не будет рассматривается для целей сопоставления, только для загрузки", - "es-es": + 'ru-ru': + 'Если задано значение «Всегда игнорировать», значение в этом столбце никогда не будет рассматривается для целей сопоставления, только для загрузки', + 'es-es': 'Cuando se establece "Ignorar siempre", el valor de esta columna nunca se tomará en cuenta a efectos de comparación; solo al cargar datos.', - "fr-fr": - "Lorsque cette option est définie sur « Toujours ignorer », la valeur de cette colonne ne sera jamais prise en compte à des fins de correspondance, mais uniquement pour le téléchargement.", - "uk-ua": - "Якщо встановлено значення «Ігнорувати завжди», значення в цьому стовпці ніколи не розглядатиметься для цілей зіставлення, лише для завантаження.", - "de-ch": + 'fr-fr': + 'Lorsque cette option est définie sur « Toujours ignorer », la valeur de cette colonne ne sera jamais prise en compte à des fins de correspondance, mais uniquement pour le téléchargement.', + 'uk-ua': + 'Якщо встановлено значення «Ігнорувати завжди», значення в цьому стовпці ніколи не розглядатиметься для цілей зіставлення, лише для завантаження.', + 'de-ch': 'Bei der Einstellung "Immer ignorieren" wird der Wert in dieser Spalte niemals für den Abgleich, sondern nur für das Hochladen berücksichtigt.', - "pt-br": + 'pt-br': 'Quando definido como "Ignorar sempre", o valor nesta coluna nunca será considerado para fins de correspondência, apenas para upload.', }, ignoreNever: { - "en-us": "Never Ignore", - "ru-ru": "Никогда не игнорировать", - "es-es": "Nunca Ignorar", - "de-ch": "Nie ignorieren", - "fr-fr": "Ne jamais ignorer", - "uk-ua": "Ніколи не ігноруйте", - "pt-br": "Nunca ignore", + 'en-us': 'Never Ignore', + 'ru-ru': 'Никогда не игнорировать', + 'es-es': 'Nunca Ignorar', + 'de-ch': 'Nie ignorieren', + 'fr-fr': 'Ne jamais ignorer', + 'uk-ua': 'Ніколи не ігноруйте', + 'pt-br': 'Nunca ignore', }, ignoreNeverDescription: { - "en-us": + 'en-us': "This column would always be considered for matching purposes, regardless of it's value", - "ru-ru": - "Этот столбец всегда будет учитываться для целей сопоставления, независимо от содержимое столбца", - "es-es": - "Siempre se considerará esta columna a efectos de comparación, independientemente de sus valores", - "fr-fr": - "Cette colonne sera toujours prise en compte à des fins de correspondance, quelle que soit sa valeur", - "uk-ua": - "Цей стовпець завжди розглядатиметься для цілей зіставлення, незалежно від його значення", - "de-ch": - "Diese Spalte wird immer für den Abgleich berücksichtigt, unabhängig von ihrem Wert", - "pt-br": - "Esta coluna sempre será considerada para fins de correspondência, independentemente do seu valor", + 'ru-ru': + 'Этот столбец всегда будет учитываться для целей сопоставления, независимо от содержимое столбца', + 'es-es': + 'Siempre se considerará esta columna a efectos de comparación, independientemente de sus valores', + 'fr-fr': + 'Cette colonne sera toujours prise en compte à des fins de correspondance, quelle que soit sa valeur', + 'uk-ua': + 'Цей стовпець завжди розглядатиметься для цілей зіставлення, незалежно від його значення', + 'de-ch': + 'Diese Spalte wird immer für den Abgleich berücksichtigt, unabhängig von ihrem Wert', + 'pt-br': + 'Esta coluna sempre será considerada para fins de correspondência, independentemente do seu valor', }, allowNullValues: { - "en-us": "Allow Null Values", - "ru-ru": "Разрешить нулевые значения", - "es-es": "Permitir valores nulos", - "fr-fr": "Autoriser les valeurs nulles", - "uk-ua": "Дозволити нульові значення", - "de-ch": "Nullwerte erlauben", - "pt-br": "Permitir valores nulos", + 'en-us': 'Allow Null Values', + 'ru-ru': 'Разрешить нулевые значения', + 'es-es': 'Permitir valores nulos', + 'fr-fr': 'Autoriser les valeurs nulles', + 'uk-ua': 'Дозволити нульові значення', + 'de-ch': 'Nullwerte erlauben', + 'pt-br': 'Permitir valores nulos', }, useDefaultValue: { - "en-us": "Use Default Value", - "ru-ru": "Использовать значение по умолчанию", - "es-es": "Usar valor predeterminado", - "fr-fr": "Utiliser la valeur par défaut", - "uk-ua": "Використовувати значення за умовчанням", - "de-ch": "Verwende den Standardwert", - "pt-br": "Usar valor padrão", + 'en-us': 'Use Default Value', + 'ru-ru': 'Использовать значение по умолчанию', + 'es-es': 'Usar valor predeterminado', + 'fr-fr': 'Utiliser la valeur par défaut', + 'uk-ua': 'Використовувати значення за умовчанням', + 'de-ch': 'Verwende den Standardwert', + 'pt-br': 'Usar valor padrão', }, defaultValue: { - "en-us": "Default Value", - "ru-ru": "Значение по умолчанию", - "es-es": "Valor predeterminado", - "fr-fr": "Valeur par défaut", - "uk-ua": "Значення за замовчуванням", - "de-ch": "Standardwert", - "pt-br": "Valor padrão", + 'en-us': 'Default Value', + 'ru-ru': 'Значение по умолчанию', + 'es-es': 'Valor predeterminado', + 'fr-fr': 'Valeur par défaut', + 'uk-ua': 'Значення за замовчуванням', + 'de-ch': 'Standardwert', + 'pt-br': 'Valor padrão', }, defaultValueDescription: { - "en-us": "This value would be used in place of empty cells", - "ru-ru": "Это значение будет использоваться вместо пустых ячеек", - "es-es": "Este valor se usaría en lugar de celdas vacías", - "fr-fr": "Cette valeur serait utilisée à la place des cellules vides", - "uk-ua": "Це значення використовуватиметься замість порожніх клітинок", - "de-ch": "Dieser Wert wird anstelle von leeren Zellen verwendet", - "pt-br": "Este valor seria usado no lugar de células vazias", + 'en-us': 'This value would be used in place of empty cells', + 'ru-ru': 'Это значение будет использоваться вместо пустых ячеек', + 'es-es': 'Este valor se usaría en lugar de celdas vacías', + 'fr-fr': 'Cette valeur serait utilisée à la place des cellules vides', + 'uk-ua': 'Це значення використовуватиметься замість порожніх клітинок', + 'de-ch': 'Dieser Wert wird anstelle von leeren Zellen verwendet', + 'pt-br': 'Este valor seria usado no lugar de células vazias', }, addNewColumn: { - "en-us": "Add New Column", - "ru-ru": "Добавить новую колонку", - "es-es": "Agregar una columna nueva", - "fr-fr": "Ajouter une nouvelle colonne", - "uk-ua": "Додати новий стовпець", - "de-ch": "Neue Spalte hinzufügen", - "pt-br": "Adicionar nova coluna", + 'en-us': 'Add New Column', + 'ru-ru': 'Добавить новую колонку', + 'es-es': 'Agregar una columna nueva', + 'fr-fr': 'Ajouter une nouvelle colonne', + 'uk-ua': 'Додати новий стовпець', + 'de-ch': 'Neue Spalte hinzufügen', + 'pt-br': 'Adicionar nova coluna', }, validationFailed: { - "en-us": "Validation found missing mappings:", - "ru-ru": "Проверка обнаружила недостающие сопоставления:", - "es-es": "La validación encontró asignaciones faltantes:", - "fr-fr": "La validation a trouvé des mappages manquants :", - "uk-ua": "Перевірка виявила відсутні зіставлення:", - "de-ch": "Die Validierung hat fehlende Zuordnungen gefunden:", - "pt-br": "A validação encontrou mapeamentos ausentes:", + 'en-us': 'Validation found missing mappings:', + 'ru-ru': 'Проверка обнаружила недостающие сопоставления:', + 'es-es': 'La validación encontró asignaciones faltantes:', + 'fr-fr': 'La validation a trouvé des mappages manquants :', + 'uk-ua': 'Перевірка виявила відсутні зіставлення:', + 'de-ch': 'Die Validierung hat fehlende Zuordnungen gefunden:', + 'pt-br': 'A validação encontrou mapeamentos ausentes:', }, validationFailedDescription: { - "en-us": - "This data mapping is missing one or more data fields required for uploading by your Specify configuration. Add the missing mappings shown or save this Upload Plan as unfinished.", - "ru-ru": - "В этом сопоставлении данные отсутствует в одном или нескольких полей данных, необходимых для загрузки по вашей Specify конфигурацию. Добавьте недостающие сопоставления или сохраните этот план загрузки как незавершенный.", - "es-es": - "A este mapeo de datos le faltan uno o más campos de datos requeridos para cargar por su configuración de Especificar. Agregue las asignaciones faltantes que se muestran o guarde este plan de carga como inacabado.", - "fr-fr": - "Il manque un ou plusieurs champs de données requis pour le téléchargement selon votre configuration de spécification. Ajoutez les mappages manquants ou enregistrez ce plan de téléchargement comme inachevé.", - "uk-ua": - "У цьому відображенні даних відсутнє одне або кілька полів даних, необхідні для завантаження вашою конфігурацією Specify. Додайте відсутні відображення або збережіть цей план завантаження як незавершений.", - "de-ch": - "In dieser Datenzuordnung fehlen ein oder mehrere Datenfelder, die für das Hochladen gemäss Ihrer Specify-Konfiguration erforderlich sind. Fügen Sie die fehlenden Mappings hinzu oder speichern Sie diesen Upload-Plan als unvollendet.", - "pt-br": + 'en-us': + 'This data mapping is missing one or more data fields required for uploading by your Specify configuration. Add the missing mappings shown or save this Upload Plan as unfinished.', + 'ru-ru': + 'В этом сопоставлении данные отсутствует в одном или нескольких полей данных, необходимых для загрузки по вашей Specify конфигурацию. Добавьте недостающие сопоставления или сохраните этот план загрузки как незавершенный.', + 'es-es': + 'A este mapeo de datos le faltan uno o más campos de datos requeridos para cargar por su configuración de Especificar. Agregue las asignaciones faltantes que se muestran o guarde este plan de carga como inacabado.', + 'fr-fr': + 'Il manque un ou plusieurs champs de données requis pour le téléchargement selon votre configuration de spécification. Ajoutez les mappages manquants ou enregistrez ce plan de téléchargement comme inachevé.', + 'uk-ua': + 'У цьому відображенні даних відсутнє одне або кілька полів даних, необхідні для завантаження вашою конфігурацією Specify. Додайте відсутні відображення або збережіть цей план завантаження як незавершений.', + 'de-ch': + 'In dieser Datenzuordnung fehlen ein oder mehrere Datenfelder, die für das Hochladen gemäss Ihrer Specify-Konfiguration erforderlich sind. Fügen Sie die fehlenden Mappings hinzu oder speichern Sie diesen Upload-Plan als unvollendet.', + 'pt-br': 'Este mapeamento de dados não possui um ou mais campos de dados necessários para o upload pela sua configuração "Especificar". Adicione os mapeamentos ausentes ou salve este Plano de Upload como inacabado.', }, mappingIsRequired: { - comment: "I.e, this field must be mapped before you can continue", - "en-us": "Mapping is required", - "ru-ru": "Необходимо сопоставление", - "es-es": "Se requiere asignación", - "fr-fr": "La cartographie est requise", - "uk-ua": "Потрібне відображення", - "de-ch": "Mapping ist erforderlich", - "pt-br": "O mapeamento é necessário", + comment: 'I.e, this field must be mapped before you can continue', + 'en-us': 'Mapping is required', + 'ru-ru': 'Необходимо сопоставление', + 'es-es': 'Se requiere asignación', + 'fr-fr': 'La cartographie est requise', + 'uk-ua': 'Потрібне відображення', + 'de-ch': 'Mapping ist erforderlich', + 'pt-br': 'O mapeamento é necessário', }, continueEditing: { - "en-us": "Continue Editing", - "ru-ru": "Продолжить редактирование", - "es-es": "Continuar con Edición", - "fr-fr": "Continuer l'édition", - "uk-ua": "Продовжити редагування", - "de-ch": "Bearbeitung fortsetzen", - "pt-br": "Continuar editando", + 'en-us': 'Continue Editing', + 'ru-ru': 'Продолжить редактирование', + 'es-es': 'Continuar con Edición', + 'fr-fr': "Continuer l'édition", + 'uk-ua': 'Продовжити редагування', + 'de-ch': 'Bearbeitung fortsetzen', + 'pt-br': 'Continuar editando', }, saveUnfinished: { - "en-us": "Save Unfinished", - "ru-ru": "Сохранить незаконченное", - "es-es": "Guardar sin terminar", - "fr-fr": "Enregistrer inachevé", - "uk-ua": "Зберегти незавершене", - "de-ch": "Unvollendet speichern", - "pt-br": "Salvar inacabado", + 'en-us': 'Save Unfinished', + 'ru-ru': 'Сохранить незаконченное', + 'es-es': 'Guardar sin terminar', + 'fr-fr': 'Enregistrer inachevé', + 'uk-ua': 'Зберегти незавершене', + 'de-ch': 'Unvollendet speichern', + 'pt-br': 'Salvar inacabado', }, map: { - "en-us": "Map", - "ru-ru": "Сопоставить", - "es-es": "Mapear", - "de-ch": "Datenzuordnung erstellen", - "fr-fr": "Carte", - "uk-ua": "Карта", - "pt-br": "Mapa", + 'en-us': 'Map', + 'ru-ru': 'Сопоставить', + 'es-es': 'Mapear', + 'de-ch': 'Datenzuordnung erstellen', + 'fr-fr': 'Carte', + 'uk-ua': 'Карта', + 'pt-br': 'Mapa', }, unmap: { - "en-us": "Unmap", - "ru-ru": "Отменить сопоставления", - "es-es": "Deshacer mapeo", - "fr-fr": "Démapper", - "uk-ua": "Відмінити карту", - "de-ch": "Datenzuordnung auflösen", - "pt-br": "Desmapear", + 'en-us': 'Unmap', + 'ru-ru': 'Отменить сопоставления', + 'es-es': 'Deshacer mapeo', + 'fr-fr': 'Démapper', + 'uk-ua': 'Відмінити карту', + 'de-ch': 'Datenzuordnung auflösen', + 'pt-br': 'Desmapear', }, mapButtonDescription: { - "en-us": "Map selected field to selected header", - "ru-ru": "Сопоставить выбранное поле с выбранным столбцом", - "es-es": "Asignar campo seleccionado al encabezamiento seleccionado", - "de-ch": "Ausgewähltes Feld der ausgewählten Feldüberschrift zuordnen", - "fr-fr": "Mapper le champ sélectionné à l'en-tête sélectionné", - "uk-ua": "Зіставити вибране поле з вибраним заголовком", - "pt-br": "Mapear campo selecionado para cabeçalho selecionado", + 'en-us': 'Map selected field to selected header', + 'ru-ru': 'Сопоставить выбранное поле с выбранным столбцом', + 'es-es': 'Asignar campo seleccionado al encabezamiento seleccionado', + 'de-ch': 'Ausgewähltes Feld der ausgewählten Feldüberschrift zuordnen', + 'fr-fr': "Mapper le champ sélectionné à l'en-tête sélectionné", + 'uk-ua': 'Зіставити вибране поле з вибраним заголовком', + 'pt-br': 'Mapear campo selecionado para cabeçalho selecionado', }, relationshipWithTable: { - "en-us": "Relationship to the {tableName:string} table", - "ru-ru": "Связь с таблицей {tableName:string}", - "es-es": "Relación con la tabla {tableName:string}", - "fr-fr": "Relation avec la table {tableName:string}", - "uk-ua": "Відношення до таблиці {tableName:string}", - "de-ch": "Beziehung zur Tabelle {tableName:string}", - "pt-br": "Relação com a tabela {tableName:string}", + 'en-us': 'Relationship to the {tableName:string} table', + 'ru-ru': 'Связь с таблицей {tableName:string}', + 'es-es': 'Relación con la tabla {tableName:string}', + 'fr-fr': 'Relation avec la table {tableName:string}', + 'uk-ua': 'Відношення до таблиці {tableName:string}', + 'de-ch': 'Beziehung zur Tabelle {tableName:string}', + 'pt-br': 'Relação com a tabela {tableName:string}', }, selectBaseTable: { - "en-us": "Select a Base Table", - "ru-ru": "Выберите базовую таблицу", - "es-es": "Seleccione una tabla base", - "fr-fr": "Sélectionnez une table de base", - "uk-ua": "Виберіть базову таблицю", - "de-ch": "Basistabelle auswählen", - "pt-br": "Selecione uma tabela base", + 'en-us': 'Select a Base Table', + 'ru-ru': 'Выберите базовую таблицу', + 'es-es': 'Seleccione una tabla base', + 'fr-fr': 'Sélectionnez une table de base', + 'uk-ua': 'Виберіть базову таблицю', + 'de-ch': 'Basistabelle auswählen', + 'pt-br': 'Selecione uma tabela base', }, chooseExistingPlan: { - "en-us": "Choose Existing Plan", - "ru-ru": "Выберите существующий план", - "es-es": "Elegir un Plan ya Existente", - "fr-fr": "Choisir un plan existant", - "uk-ua": "Виберіть існуючий план", - "de-ch": "Bestehenden Plan auswählen", - "pt-br": "Escolha o plano existente", + 'en-us': 'Choose Existing Plan', + 'ru-ru': 'Выберите существующий план', + 'es-es': 'Elegir un Plan ya Existente', + 'fr-fr': 'Choisir un plan existant', + 'uk-ua': 'Виберіть існуючий план', + 'de-ch': 'Bestehenden Plan auswählen', + 'pt-br': 'Escolha o plano existente', }, showAllTables: { - "en-us": "Show All Tables", - "ru-ru": "Показать дополнительные таблицы", - "es-es": "Mostrar Tablas Avanzadas", - "fr-fr": "Afficher tous les tableaux", - "uk-ua": "Показати всі таблиці", - "de-ch": "Erweiterte Tabellen anzeigen", - "pt-br": "Mostrar todas as tabelas", + 'en-us': 'Show All Tables', + 'ru-ru': 'Показать дополнительные таблицы', + 'es-es': 'Mostrar Tablas Avanzadas', + 'fr-fr': 'Afficher tous les tableaux', + 'uk-ua': 'Показати всі таблиці', + 'de-ch': 'Erweiterte Tabellen anzeigen', + 'pt-br': 'Mostrar todas as tabelas', }, dataSetUploaded: { - "en-us": "Data Set uploaded. This Upload Plan cannot be changed", - "ru-ru": "Набор данных загружен. Этот план загрузки нельзя изменить", - "es-es": - "Conjunto de Datos cargado. El Plan de Carga ya no puede modificarse", - "fr-fr": - "Ensemble de données téléchargé. Ce plan de téléchargement ne peut pas être modifié.", - "uk-ua": "Набір даних завантажено. Цей план завантаження не можна змінити", - "de-ch": - "Datensatz hochgeladen. Dieser Upload-Plan kann nicht geändert werden", - "pt-br": - "Conjunto de dados carregado. Este plano de upload não pode ser alterado.", + 'en-us': 'Data Set uploaded. This Upload Plan cannot be changed', + 'ru-ru': 'Набор данных загружен. Этот план загрузки нельзя изменить', + 'es-es': + 'Conjunto de Datos cargado. El Plan de Carga ya no puede modificarse', + 'fr-fr': + 'Ensemble de données téléchargé. Ce plan de téléchargement ne peut pas être modifié.', + 'uk-ua': 'Набір даних завантажено. Цей план завантаження не можна змінити', + 'de-ch': + 'Datensatz hochgeladen. Dieser Upload-Plan kann nicht geändert werden', + 'pt-br': + 'Conjunto de dados carregado. Este plano de upload não pode ser alterado.', }, dataSetUploadedDescription: { - "en-us": - "You are viewing the mappings for an uploaded dataset.\n\nTo edit the mappings, rollback the uploaded data or create a new dataset", - "ru-ru": - "Вы просматриваете сопоставления для загруженного набора данных.\n\nЧтобы изменить сопоставления, откатите загруженные данные или создайте новый набор данных", - "es-es": - "Está viendo las asignaciones de campos/mapeo para un conjunto de datos ya cargado.\n\nPara editar los mapeos, d´s marcha-atrás para los datos cargados o cree un nuevo conjunto de datos", - "fr-fr": + 'en-us': + 'You are viewing the mappings for an uploaded dataset.\n\nTo edit the mappings, rollback the uploaded data or create a new dataset', + 'ru-ru': + 'Вы просматриваете сопоставления для загруженного набора данных.\n\nЧтобы изменить сопоставления, откатите загруженные данные или создайте новый набор данных', + 'es-es': + 'Está viendo las asignaciones de campos/mapeo para un conjunto de datos ya cargado.\n\nPara editar los mapeos, d´s marcha-atrás para los datos cargados o cree un nuevo conjunto de datos', + 'fr-fr': "Vous consultez les mappages d'un jeu de données téléchargé.\n\nPour modifier les mappages, restaurez les données téléchargées ou créez un nouveau jeu de données.", - "uk-ua": - "Ви переглядаєте зіставлення для завантаженого набору даних.\n\nЩоб редагувати зіставлення, відкотіть завантажені дані або створіть новий набір даних", - "de-ch": - "Sie betrachten gerade die Datenzuordnungen für einen hochgeladenen Datensatz.\n\nUm die Zuordnungen zu bearbeiten, die hochgeladenen Daten zurückzusetzen oder einen neuen Datensatz erstellen", - "pt-br": - "Você está visualizando os mapeamentos de um conjunto de dados carregado.\n\nPara editar os mapeamentos, reverta os dados carregados ou crie um novo conjunto de dados.", + 'uk-ua': + 'Ви переглядаєте зіставлення для завантаженого набору даних.\n\nЩоб редагувати зіставлення, відкотіть завантажені дані або створіть новий набір даних', + 'de-ch': + 'Sie betrachten gerade die Datenzuordnungen für einen hochgeladenen Datensatz.\n\nUm die Zuordnungen zu bearbeiten, die hochgeladenen Daten zurückzusetzen oder einen neuen Datensatz erstellen', + 'pt-br': + 'Você está visualizando os mapeamentos de um conjunto de dados carregado.\n\nPara editar os mapeamentos, reverta os dados carregados ou crie um novo conjunto de dados.', }, baseTable: { - "en-us": "Base Table", - "ru-ru": "Базовая таблица", - "es-es": "Tabla Base", - "fr-fr": "Table de base", - "uk-ua": "Базовий стіл", - "de-ch": "Basistabelle", - "pt-br": "Mesa Base", + 'en-us': 'Base Table', + 'ru-ru': 'Базовая таблица', + 'es-es': 'Tabla Base', + 'fr-fr': 'Table de base', + 'uk-ua': 'Базовий стіл', + 'de-ch': 'Basistabelle', + 'pt-br': 'Mesa Base', }, goToBaseTable: { - "en-us": "Change the Base Table for Mapping Data Set Columns?", - "ru-ru": - "Изменить базовую таблицу для сопоставления столбцов набора данных?", - "es-es": - "¿Cambiar la tabla base para mapear columnas de conjuntos de datos?", - "fr-fr": + 'en-us': 'Change the Base Table for Mapping Data Set Columns?', + 'ru-ru': + 'Изменить базовую таблицу для сопоставления столбцов набора данных?', + 'es-es': + '¿Cambiar la tabla base para mapear columnas de conjuntos de datos?', + 'fr-fr': "Modifier la table de base pour mapper les colonnes de l'ensemble de données ?", - "uk-ua": "Змінити базову таблицю для зіставлення стовпців набору даних?", - "de-ch": "Die Basistabelle für die Zuordnung von Datensatzspalten ändern?", - "pt-br": "Alterar a tabela base para mapear colunas do conjunto de dados?", + 'uk-ua': 'Змінити базову таблицю для зіставлення стовпців набору даних?', + 'de-ch': 'Die Basistabelle für die Zuordnung von Datensatzspalten ändern?', + 'pt-br': 'Alterar a tabela base para mapear colunas do conjunto de dados?', }, goToBaseTableDescription: { - "en-us": - "Choosing a different Base Table for a Data Set Upload will make that table the new starting point for column-to-data field mappings and will erase existing mappings. The AutoMapper will attempt to map columns to the new Base Table fields.", - "ru-ru": - "Выбор другой базовой таблице для загрузки набора данных сделает ту таблицу новой отправной точкой для сопоставлений полей столбцов и данных и сотрет существующие сопоставления. AutoMapper попытается сопоставить столбцы в новые поля базовой таблицы.", - "es-es": - "Si elige una tabla base diferente para la carga de un conjunto de datos, esa tabla se convertirá en el nuevo punto de partida para las asignaciones de campo de columna a datos y borrará las asignaciones existentes. El AutoMapper intentará asignar columnas a los nuevos campos de la tabla base.", - "fr-fr": + 'en-us': + 'Choosing a different Base Table for a Data Set Upload will make that table the new starting point for column-to-data field mappings and will erase existing mappings. The AutoMapper will attempt to map columns to the new Base Table fields.', + 'ru-ru': + 'Выбор другой базовой таблице для загрузки набора данных сделает ту таблицу новой отправной точкой для сопоставлений полей столбцов и данных и сотрет существующие сопоставления. AutoMapper попытается сопоставить столбцы в новые поля базовой таблицы.', + 'es-es': + 'Si elige una tabla base diferente para la carga de un conjunto de datos, esa tabla se convertirá en el nuevo punto de partida para las asignaciones de campo de columna a datos y borrará las asignaciones existentes. El AutoMapper intentará asignar columnas a los nuevos campos de la tabla base.', + 'fr-fr': "Choisir une autre table de base pour le téléchargement d'un ensemble de données fera de cette table le nouveau point de départ des mappages colonnes-champs de données et effacera les mappages existants. L'AutoMapper tentera de mapper les colonnes aux nouveaux champs de la table de base.", - "uk-ua": - "Вибір іншої базової таблиці для завантаження набору даних зробить цю таблицю новою відправною точкою для зіставлення стовпців і полів даних і видалить існуючі зіставлення. AutoMapper спробує зіставити стовпці з новими полями базової таблиці.", - "de-ch": - "Durch Auswahl einer anderen Basistabelle für einen Datensatz-Upload wird diese Tabelle zum neuen Ausgangspunkt für die Zuordnung von Spalten zu Datenfeldern und die bestehenden Zuordnungen werden gelöscht. Der AutoMapper wird versuchen, die Spalten den neuen Basistabellenfeldern zuzuordnen.", - "pt-br": - "Escolher uma Tabela Base diferente para o upload de um Conjunto de Dados tornará essa tabela o novo ponto de partida para mapeamentos de campos de coluna para dados e apagará os mapeamentos existentes. O Mapeador Automático tentará mapear colunas para os novos campos da Tabela Base.", + 'uk-ua': + 'Вибір іншої базової таблиці для завантаження набору даних зробить цю таблицю новою відправною точкою для зіставлення стовпців і полів даних і видалить існуючі зіставлення. AutoMapper спробує зіставити стовпці з новими полями базової таблиці.', + 'de-ch': + 'Durch Auswahl einer anderen Basistabelle für einen Datensatz-Upload wird diese Tabelle zum neuen Ausgangspunkt für die Zuordnung von Spalten zu Datenfeldern und die bestehenden Zuordnungen werden gelöscht. Der AutoMapper wird versuchen, die Spalten den neuen Basistabellenfeldern zuzuordnen.', + 'pt-br': + 'Escolher uma Tabela Base diferente para o upload de um Conjunto de Dados tornará essa tabela o novo ponto de partida para mapeamentos de campos de coluna para dados e apagará os mapeamentos existentes. O Mapeador Automático tentará mapear colunas para os novos campos da Tabela Base.', }, clearMapping: { - "en-us": "Clear Mapping", - "ru-ru": "Очистить сопоставление", - "es-es": "Borrar Asignacione", - "fr-fr": "Cartographie claire", - "uk-ua": "Очистити відображення", - "de-ch": "Datenzuordnung zurücksetzen", - "pt-br": "Mapeamento claro", + 'en-us': 'Clear Mapping', + 'ru-ru': 'Очистить сопоставление', + 'es-es': 'Borrar Asignacione', + 'fr-fr': 'Cartographie claire', + 'uk-ua': 'Очистити відображення', + 'de-ch': 'Datenzuordnung zurücksetzen', + 'pt-br': 'Mapeamento claro', }, reRunAutoMapper: { - "en-us": "Rerun AutoMapper", - "ru-ru": "Перезапустить AutoMapper", - "es-es": "Volver a ejecutar AutoMapper", - "fr-fr": "Réexécuter AutoMapper", - "uk-ua": "Перезапустіть AutoMapper", - "de-ch": "AutoMapper erneut ausführen", - "pt-br": "Reexecutar AutoMapper", + 'en-us': 'Rerun AutoMapper', + 'ru-ru': 'Перезапустить AutoMapper', + 'es-es': 'Volver a ejecutar AutoMapper', + 'fr-fr': 'Réexécuter AutoMapper', + 'uk-ua': 'Перезапустіть AutoMapper', + 'de-ch': 'AutoMapper erneut ausführen', + 'pt-br': 'Reexecutar AutoMapper', }, autoMapper: { - "en-us": "AutoMapper", - "ru-ru": "AutoMapper", - "es-es": "Mapeador automático", - "fr-fr": "AutoMapper", - "uk-ua": "Auto Mapper", - "de-ch": "AutoMapper", - "pt-br": "Mapeador automático", + 'en-us': 'AutoMapper', + 'ru-ru': 'AutoMapper', + 'es-es': 'Mapeador automático', + 'fr-fr': 'AutoMapper', + 'uk-ua': 'Auto Mapper', + 'de-ch': 'AutoMapper', + 'pt-br': 'Mapeador automático', }, mappingEditor: { - "en-us": "Map Explorer", - "ru-ru": "Обзор сопоставлений", - "es-es": "Explorador de Asignaciones/Mapeos", - "fr-fr": "Explorateur de cartes", - "uk-ua": "Оглядач карти", - "de-ch": "Karten-Explorer", - "pt-br": "Explorador de mapas", + 'en-us': 'Map Explorer', + 'ru-ru': 'Обзор сопоставлений', + 'es-es': 'Explorador de Asignaciones/Mapeos', + 'fr-fr': 'Explorateur de cartes', + 'uk-ua': 'Оглядач карти', + 'de-ch': 'Karten-Explorer', + 'pt-br': 'Explorador de mapas', }, hideFieldMapper: { - "en-us": "Hide Field Mapper", - "ru-ru": "Спрятать обзор сопоставлений", - "es-es": "Ocultar asignador de campos", - "fr-fr": "Masquer le mappeur de champs", - "uk-ua": "Приховати Field Mapper", - "de-ch": "Field Mapper ausblenden", - "pt-br": "Ocultar Mapeador de Campo", + 'en-us': 'Hide Field Mapper', + 'ru-ru': 'Спрятать обзор сопоставлений', + 'es-es': 'Ocultar asignador de campos', + 'fr-fr': 'Masquer le mappeur de champs', + 'uk-ua': 'Приховати Field Mapper', + 'de-ch': 'Field Mapper ausblenden', + 'pt-br': 'Ocultar Mapeador de Campo', }, showFieldMapper: { - "en-us": "Show Field Mapper", - "ru-ru": "Показать обзор сопоставлений", - "es-es": "Mostrar asignador de campos", - "fr-fr": "Afficher le mappeur de champs", - "uk-ua": "Показати Field Mapper", - "de-ch": "Field Mapper einblenden", - "pt-br": "Mostrar Mapeador de Campo", + 'en-us': 'Show Field Mapper', + 'ru-ru': 'Показать обзор сопоставлений', + 'es-es': 'Mostrar asignador de campos', + 'fr-fr': 'Afficher le mappeur de champs', + 'uk-ua': 'Показати Field Mapper', + 'de-ch': 'Field Mapper einblenden', + 'pt-br': 'Mostrar Mapeador de Campo', }, mappings: { - "en-us": "Mappings", - "ru-ru": "Сопоставления", - "es-es": "Asignaciones/Mapeos", - "fr-fr": "Cartographies", - "uk-ua": "Відображення", - "de-ch": "Zuordnungen", - "pt-br": "Mapeamentos", + 'en-us': 'Mappings', + 'ru-ru': 'Сопоставления', + 'es-es': 'Asignaciones/Mapeos', + 'fr-fr': 'Cartographies', + 'uk-ua': 'Відображення', + 'de-ch': 'Zuordnungen', + 'pt-br': 'Mapeamentos', }, clearMappings: { - "en-us": "Clear Mappings", - "ru-ru": "Очистить сопоставления", - "es-es": "Borrar asignaciones", - "fr-fr": "Mappages clairs", - "uk-ua": "Очистити зіставлення", - "de-ch": "Zuordnungen zurückstellen", - "pt-br": "Mapeamentos claros", + 'en-us': 'Clear Mappings', + 'ru-ru': 'Очистить сопоставления', + 'es-es': 'Borrar asignaciones', + 'fr-fr': 'Mappages clairs', + 'uk-ua': 'Очистити зіставлення', + 'de-ch': 'Zuordnungen zurückstellen', + 'pt-br': 'Mapeamentos claros', }, emptyDataSet: { - "en-us": "Empty Data Set", - "ru-ru": "Пустой набор данных", - "es-es": "Conjunto de datos vacío", - "fr-fr": "Ensemble de données vide", - "uk-ua": "Порожній набір даних", - "de-ch": "Datenset leeren", - "pt-br": "Conjunto de dados vazio", + 'en-us': 'Empty Data Set', + 'ru-ru': 'Пустой набор данных', + 'es-es': 'Conjunto de datos vacío', + 'fr-fr': 'Ensemble de données vide', + 'uk-ua': 'Порожній набір даних', + 'de-ch': 'Datenset leeren', + 'pt-br': 'Conjunto de dados vazio', }, emptyDataSetDescription: { - "en-us": "This Data Set doesn't have any columns.", - "ru-ru": "В этом наборе данных нет столбцов.", - "es-es": "Este Conjunto de Datos carece de columnas.", - "fr-fr": "Cet ensemble de données ne comporte aucune colonne.", - "uk-ua": "Цей набір даних не має стовпців.", - "de-ch": "Dieser Datensatz hat keine Spalten.", - "pt-br": "Este conjunto de dados não possui nenhuma coluna.", + 'en-us': "This Data Set doesn't have any columns.", + 'ru-ru': 'В этом наборе данных нет столбцов.', + 'es-es': 'Este Conjunto de Datos carece de columnas.', + 'fr-fr': 'Cet ensemble de données ne comporte aucune colonne.', + 'uk-ua': 'Цей набір даних не має стовпців.', + 'de-ch': 'Dieser Datensatz hat keine Spalten.', + 'pt-br': 'Este conjunto de dados não possui nenhuma coluna.', }, emptyDataSetSecondDescription: { - "en-us": + 'en-us': 'Press the "Add New Column" button below the mapping lines to add new columns.', - "ru-ru": + 'ru-ru': 'Нажмите кнопку "Добавить новый столбец" под строками сопоставления, чтобы добавить новые столбцы.', - "es-es": + 'es-es': 'Presione el botón "Agregar nueva columna" debajo de las líneas de mapeo para agregar nuevas columnas.', - "fr-fr": - "Appuyez sur le bouton « Ajouter une nouvelle colonne » sous les lignes de mappage pour ajouter de nouvelles colonnes.", - "uk-ua": - "Натисніть кнопку «Додати новий стовпець» під лініями відображення, щоб додати нові стовпці.", - "de-ch": + 'fr-fr': + 'Appuyez sur le bouton « Ajouter une nouvelle colonne » sous les lignes de mappage pour ajouter de nouvelles colonnes.', + 'uk-ua': + 'Натисніть кнопку «Додати новий стовпець» під лініями відображення, щоб додати нові стовпці.', + 'de-ch': 'Klicken Sie auf die Schaltfläche "Neue Spalte hinzufügen" unterhalb der Zuordnungszeilen, um neue Spalten hinzuzufügen.', - "pt-br": + 'pt-br': 'Pressione o botão "Adicionar nova coluna" abaixo das linhas de mapeamento para adicionar novas colunas.', }, reRunAutoMapperConfirmation: { - "en-us": "Automap to start a new Upload Plan?", - "ru-ru": "Автоматически сопоставить?", - "es-es": "¿Automap para iniciar un nuevo plan de carga?", - "de-ch": "Automap, um einen neuen Upload-Plan zu starten?", - "fr-fr": "Automap pour démarrer un nouveau plan de téléchargement ?", - "uk-ua": "Автоматична карта, щоб почати новий план завантаження?", - "pt-br": "Mapear automaticamente para iniciar um novo Plano de Upload?", + 'en-us': 'Automap to start a new Upload Plan?', + 'ru-ru': 'Автоматически сопоставить?', + 'es-es': '¿Automap para iniciar un nuevo plan de carga?', + 'de-ch': 'Automap, um einen neuen Upload-Plan zu starten?', + 'fr-fr': 'Automap pour démarrer un nouveau plan de téléchargement ?', + 'uk-ua': 'Автоматична карта, щоб почати новий план завантаження?', + 'pt-br': 'Mapear automaticamente para iniciar um novo Plano de Upload?', }, reRunAutoMapperConfirmationDescription: { - "en-us": "This will erase existing data field mappings.", - "ru-ru": "Это сотрет существующие сопоставления.", - "es-es": "Esto borrará las asignaciones de campos de datos existentes.", - "fr-fr": "Cela effacera les mappages de champs de données existants.", - "uk-ua": "Це призведе до видалення наявних зіставлень полів даних.", - "de-ch": "Damit werden bestehende Zuordnungen von Datenfeldern gelöscht.", - "pt-br": "Isso apagará os mapeamentos de campos de dados existentes.", + 'en-us': 'This will erase existing data field mappings.', + 'ru-ru': 'Это сотрет существующие сопоставления.', + 'es-es': 'Esto borrará las asignaciones de campos de datos existentes.', + 'fr-fr': 'Cela effacera les mappages de champs de données existants.', + 'uk-ua': 'Це призведе до видалення наявних зіставлень полів даних.', + 'de-ch': 'Damit werden bestehende Zuordnungen von Datenfeldern gelöscht.', + 'pt-br': 'Isso apagará os mapeamentos de campos de dados existentes.', }, changeMatchingLogic: { - "en-us": "Change Matching Logic", - "ru-ru": "Изменить логику соответствия", - "es-es": "Cambiar la lógica de coincidencia", - "fr-fr": "Changer la logique de correspondance", - "uk-ua": "Змінити логіку відповідності", - "de-ch": "Abgleichslogik ändern", - "pt-br": "Alterar lógica de correspondência", + 'en-us': 'Change Matching Logic', + 'ru-ru': 'Изменить логику соответствия', + 'es-es': 'Cambiar la lógica de coincidencia', + 'fr-fr': 'Changer la logique de correspondance', + 'uk-ua': 'Змінити логіку відповідності', + 'de-ch': 'Abgleichslogik ändern', + 'pt-br': 'Alterar lógica de correspondência', }, matchingLogicDescription: { - "en-us": "Require Data to Match Existing Records", - "ru-ru": "Требовать сопоставления данных с существующими записями", - "es-es": "Requerir datos para que coincidan con los registros existentes", - "fr-fr": - "Exiger que les données correspondent aux enregistrements existants", - "uk-ua": "Вимагати відповідності даних існуючим записам", - "de-ch": "Benötigt Daten um vorhandene Datensätze vergleichen zu können", - "pt-br": "Exigir que os dados correspondam aos registros existentes", + 'en-us': 'Require Data to Match Existing Records', + 'ru-ru': 'Требовать сопоставления данных с существующими записями', + 'es-es': 'Requerir datos para que coincidan con los registros existentes', + 'fr-fr': + 'Exiger que les données correspondent aux enregistrements existants', + 'uk-ua': 'Вимагати відповідності даних існуючим записам', + 'de-ch': 'Benötigt Daten um vorhandene Datensätze vergleichen zu können', + 'pt-br': 'Exigir que os dados correspondam aos registros existentes', }, matchingLogicUnavailable: { - "en-us": "Matching logic is unavailable for current mappings", - "ru-ru": "Логика соответствия недоступна для текущих сопоставлений", - "es-es": - "La lógica de coincidencia no está disponible para las asignaciones actuales", - "fr-fr": + 'en-us': 'Matching logic is unavailable for current mappings', + 'ru-ru': 'Логика соответствия недоступна для текущих сопоставлений', + 'es-es': + 'La lógica de coincidencia no está disponible para las asignaciones actuales', + 'fr-fr': "La logique de correspondance n'est pas disponible pour les mappages actuels", - "uk-ua": "Логіка зіставлення недоступна для поточних зіставлень", - "de-ch": "Die Vergleichslogik ist für aktuelle Mappings nicht verfügbar", - "pt-br": - "A lógica de correspondência não está disponível para os mapeamentos atuais", + 'uk-ua': 'Логіка зіставлення недоступна для поточних зіставлень', + 'de-ch': 'Die Vergleichslogik ist für aktuelle Mappings nicht verfügbar', + 'pt-br': + 'A lógica de correspondência não está disponível para os mapeamentos atuais', }, mustMatch: { - "en-us": "Must Match", - "ru-ru": "Логика соответствия", - "es-es": "Debe coincidir", - "fr-fr": "Doit correspondre", - "uk-ua": "Має відповідати", - "de-ch": "Muss übereinstimmen", - "pt-br": "Deve corresponder", + 'en-us': 'Must Match', + 'ru-ru': 'Логика соответствия', + 'es-es': 'Debe coincidir', + 'fr-fr': 'Doit correspondre', + 'uk-ua': 'Має відповідати', + 'de-ch': 'Muss übereinstimmen', + 'pt-br': 'Deve corresponder', }, unloadProtectMessage: { - "en-us": "This mapping has not been saved.", - "ru-ru": "Это сопоставление не было сохранено.", - "es-es": "No se hna guardado estas asignaciones/mapeo.", - "fr-fr": "Ce mappage n'a pas été enregistré.", - "uk-ua": "Це відображення не збережено.", - "de-ch": "Dieses Mapping wurde nicht gespeichert.", - "pt-br": "Este mapeamento não foi salvo.", + 'en-us': 'This mapping has not been saved.', + 'ru-ru': 'Это сопоставление не было сохранено.', + 'es-es': 'No se hna guardado estas asignaciones/mapeo.', + 'fr-fr': "Ce mappage n'a pas été enregistré.", + 'uk-ua': 'Це відображення не збережено.', + 'de-ch': 'Dieses Mapping wurde nicht gespeichert.', + 'pt-br': 'Este mapeamento não foi salvo.', }, newHeaderName: { - "en-us": "New Column {index:number}", - "ru-ru": "Новый столбец {index:number}", - "es-es": "Nueva Columna {index:number}", - "fr-fr": "Nouvelle colonne {index:number}", - "uk-ua": "Нова колонка {index:number}", - "de-ch": "Neue Spalte {index:number}", - "pt-br": "Nova Coluna {index:number}", + 'en-us': 'New Column {index:number}', + 'ru-ru': 'Новый столбец {index:number}', + 'es-es': 'Nueva Columna {index:number}', + 'fr-fr': 'Nouvelle colonne {index:number}', + 'uk-ua': 'Нова колонка {index:number}', + 'de-ch': 'Neue Spalte {index:number}', + 'pt-br': 'Nova Coluna {index:number}', }, noHeader: { - "en-us": "(no header)", - "ru-ru": "(нет заголовка)", - "es-es": "(sin encabezado)", - "fr-fr": "(pas d'en-tête)", - "uk-ua": "(без заголовка)", - "de-ch": "(keine Kopfzeile)", - "pt-br": "(sem cabeçalho)", + 'en-us': '(no header)', + 'ru-ru': '(нет заголовка)', + 'es-es': '(sin encabezado)', + 'fr-fr': "(pas d'en-tête)", + 'uk-ua': '(без заголовка)', + 'de-ch': '(keine Kopfzeile)', + 'pt-br': '(sem cabeçalho)', }, copyPlan: { - "en-us": "Copy plan from existing Data Set", - "ru-ru": "Копировать план из существующего набора данных", - "es-es": "Copie el plan del conjunto de datos existente", - "fr-fr": "Copier le plan à partir d'un ensemble de données existant", - "uk-ua": "Скопіюйте план із наявного набору даних", - "de-ch": "Plan aus vorhandenem Datenset kopieren", - "pt-br": "Copiar plano do conjunto de dados existente", + 'en-us': 'Copy plan from existing Data Set', + 'ru-ru': 'Копировать план из существующего набора данных', + 'es-es': 'Copie el plan del conjunto de datos existente', + 'fr-fr': "Copier le plan à partir d'un ensemble de données existant", + 'uk-ua': 'Скопіюйте план із наявного набору даних', + 'de-ch': 'Plan aus vorhandenem Datenset kopieren', + 'pt-br': 'Copiar plano do conjunto de dados existente', }, noPlansToCopyFrom: { - "en-us": - "There are no plans available, please continue to create an upload plan.", - "ru-ru": "Нет доступных планов, продолжайте создавать план загрузки.", - "es-es": "No hay planes disponibles, continúe creando un plan de carga.", - "fr-fr": + 'en-us': + 'There are no plans available, please continue to create an upload plan.', + 'ru-ru': 'Нет доступных планов, продолжайте создавать план загрузки.', + 'es-es': 'No hay planes disponibles, continúe creando un plan de carga.', + 'fr-fr': "Il n'y a aucun plan disponible, veuillez continuer à créer un plan de téléchargement.", - "uk-ua": - "Немає доступних планів, продовжуйте створювати план завантаження.", - "de-ch": - "Es sind keine Pläne verfügbar, bitte erstellen Sie einen Upload-Plan.", - "pt-br": "Não há planos disponíveis, continue criando um plano de upload.", + 'uk-ua': + 'Немає доступних планів, продовжуйте створювати план завантаження.', + 'de-ch': + 'Es sind keine Pläne verfügbar, bitte erstellen Sie einen Upload-Plan.', + 'pt-br': 'Não há planos disponíveis, continue criando um plano de upload.', }, invalidTemplatePlan: { - "en-us": - "Selected Data Set has no upload plan. Please select a different one.", - "ru-ru": - "Выбранный набор данных не имеет плана загрузки. Выберите другой набор данных.", - "es-es": - "El conjunto de datos seleccionado no tiene un plan de carga. Seleccione uno diferente.", - "fr-fr": + 'en-us': + 'Selected Data Set has no upload plan. Please select a different one.', + 'ru-ru': + 'Выбранный набор данных не имеет плана загрузки. Выберите другой набор данных.', + 'es-es': + 'El conjunto de datos seleccionado no tiene un plan de carga. Seleccione uno diferente.', + 'fr-fr': "L'ensemble de données sélectionné n'a pas de plan de téléchargement. Veuillez en sélectionner un autre.", - "uk-ua": "Вибраний набір даних не має плану завантаження. Виберіть інший.", - "de-ch": - "Das ausgewählte Datenset hat keinen Upload-Plan. Bitte wählen Sie einen anderen Plan.", - "pt-br": - "O conjunto de dados selecionado não possui um plano de upload. Selecione um diferente.", + 'uk-ua': 'Вибраний набір даних не має плану завантаження. Виберіть інший.', + 'de-ch': + 'Das ausgewählte Datenset hat keinen Upload-Plan. Bitte wählen Sie einen anderen Plan.', + 'pt-br': + 'O conjunto de dados selecionado não possui um plano de upload. Selecione um diferente.', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/welcome.ts b/specifyweb/frontend/js_src/lib/localization/welcome.ts index 77e9a4fd84e..d0d0ba78261 100644 --- a/specifyweb/frontend/js_src/lib/localization/welcome.ts +++ b/specifyweb/frontend/js_src/lib/localization/welcome.ts @@ -4,209 +4,209 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const welcomeText = createDictionary({ pageTitle: { - "en-us": "Welcome", - "ru-ru": "Добро пожаловать", - "es-es": "Bienvenida", - "fr-fr": "Accueillir", - "uk-ua": "Ласкаво просимо", - "de-ch": "Willkommen", - "pt-br": "Bem-vindo", + 'en-us': 'Welcome', + 'ru-ru': 'Добро пожаловать', + 'es-es': 'Bienvenida', + 'fr-fr': 'Accueillir', + 'uk-ua': 'Ласкаво просимо', + 'de-ch': 'Willkommen', + 'pt-br': 'Bem-vindo', }, aboutSpecify: { - "en-us": "About Specify 7", - "ru-ru": "О Specify 7", - "es-es": "Sobre Specify", - "fr-fr": "À propos de Spécifier 7", - "uk-ua": "Про Specify 7", - "de-ch": "Über Specify 7", - "pt-br": "Sobre o Specify 7", + 'en-us': 'About Specify 7', + 'ru-ru': 'О Specify 7', + 'es-es': 'Sobre Specify', + 'fr-fr': 'À propos de Spécifier 7', + 'uk-ua': 'Про Specify 7', + 'de-ch': 'Über Specify 7', + 'pt-br': 'Sobre o Specify 7', }, downloadInformation: { - "en-us": "Download Information", - "ru-ru": "Скачать информацию", - "es-es": "Descargar información", - "de-ch": "Download Information", - "fr-fr": "À propos de Spécifier 7", - "uk-ua": "Про Specify 7", - "pt-br": "Informações para download", + 'en-us': 'Download Information', + 'ru-ru': 'Скачать информацию', + 'es-es': 'Descargar información', + 'de-ch': 'Download Information', + 'fr-fr': 'À propos de Spécifier 7', + 'uk-ua': 'Про Specify 7', + 'pt-br': 'Informações para download', }, taxonTiles: { - "en-us": "Taxon Tiles", - "ru-ru": "Плитки таксонов", - "es-es": "Título Táxones", - "fr-fr": "Tuiles Taxons", - "uk-ua": "Taxon Tiles", - "de-ch": "Taxon-Kacheln", - "pt-br": "Telhas de táxons", + 'en-us': 'Taxon Tiles', + 'ru-ru': 'Плитки таксонов', + 'es-es': 'Título Táxones', + 'fr-fr': 'Tuiles Taxons', + 'uk-ua': 'Taxon Tiles', + 'de-ch': 'Taxon-Kacheln', + 'pt-br': 'Telhas de táxons', }, taxonTilesDescription: { - "en-us": - "Showing Taxa with {count:number|formatted} or more {collectionObjectTable:string} records", - "ru-ru": - "Показаны таксоны с {count:number|formatted} или более {collectionObjectTable:string} записями", - "es-es": - "Mostrando taxones con {count:number|formatted} o más {collectionObjectTable:string} registros", - "fr-fr": - "Affichage des taxons avec des enregistrements {count:number|formatted} ou plus {collectionObjectTable:string}", - "uk-ua": - "Показано таксони з {count:number|formatted} або більше {collectionObjectTable:string} записів", - "de-ch": - "Zeigt Taxa mit {count:number|formatted} oder mehr {collectionObjectTable:string} Datensätzen", - "pt-br": - "Exibindo Taxa com {count:number|formatted} ou mais {collectionObjectTable:string} registros", + 'en-us': + 'Showing Taxa with {count:number|formatted} or more {collectionObjectTable:string} records', + 'ru-ru': + 'Показаны таксоны с {count:number|formatted} или более {collectionObjectTable:string} записями', + 'es-es': + 'Mostrando taxones con {count:number|formatted} o más {collectionObjectTable:string} registros', + 'fr-fr': + 'Affichage des taxons avec des enregistrements {count:number|formatted} ou plus {collectionObjectTable:string}', + 'uk-ua': + 'Показано таксони з {count:number|formatted} або більше {collectionObjectTable:string} записів', + 'de-ch': + 'Zeigt Taxa mit {count:number|formatted} oder mehr {collectionObjectTable:string} Datensätzen', + 'pt-br': + 'Exibindo Taxa com {count:number|formatted} ou mais {collectionObjectTable:string} registros', }, fullAddress: { - "en-us": - "Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA", - "ru-ru": - "Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA", - "es-es": - "Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA", - "fr-fr": - "Préciser le consortium de collections
\n\nInstitut de la Biodiversité
\n\nUniversité du Kansas
\n\n1345, boulevard Jayhawk.
\n\nLawrence, KS 66045 États-Unis", - "uk-ua": - "Укажіть консорціум колекцій
\n\nІнститут біорізноманіття
\n\nУніверситет Канзасу
\n\n1345 Jayhawk Blvd.
\n\nЛоуренс, KS 66045 США", - "de-ch": - "Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA", - "pt-br": - "Consórcio de Coleções Específicas
\n\nInstituto de Biodiversidade
\n\nUniversidade do Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 EUA", + 'en-us': + 'Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA', + 'ru-ru': + 'Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA', + 'es-es': + 'Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA', + 'fr-fr': + 'Préciser le consortium de collections
\n\nInstitut de la Biodiversité
\n\nUniversité du Kansas
\n\n1345, boulevard Jayhawk.
\n\nLawrence, KS 66045 États-Unis', + 'uk-ua': + 'Укажіть консорціум колекцій
\n\nІнститут біорізноманіття
\n\nУніверситет Канзасу
\n\n1345 Jayhawk Blvd.
\n\nЛоуренс, KS 66045 США', + 'de-ch': + 'Specify Collections Consortium
\n\nBiodiversity Institute
\n\nUniversity of Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 USA', + 'pt-br': + 'Consórcio de Coleções Específicas
\n\nInstituto de Biodiversidade
\n\nUniversidade do Kansas
\n\n1345 Jayhawk Blvd.
\n\nLawrence, KS 66045 EUA', }, disclosure: { - "en-us": + 'en-us': "Specify software is a product of the Specify Collections Consortium that is governed and funded by its member institutions. Consortium Founding Members include: Commonwealth Scientific and Industrial Research Organisation (CSIRO), Consejo Superior de Investigaciones Científicas, Denmark Consortium of Museums, Muséum d'Histoire Naturelle Geneva, University of Florida, University of Kansas, and University of Michigan. The Consortium operates under the non-profit, 501(c)3, U.S. tax status of the University of Kansas Center for Research. Specify was supported from 1996 to 2018 by grants from the U.S. National Science Foundation.", - "ru-ru": + 'ru-ru': "Specify software является продуктом консорциума Specify Collections. который управляется и финансируется организациями-членами. Члены-учредители консорциума включают: Commonwealth Scientific and Industrial Research Organisation (CSIRO), Consejo Superior de Investigaciones Científicas, Denmark Consortium of Museums, Muséum d'Histoire Naturelle Geneva, University of Florida, University of Kansas, и University of Michigan. Консорциум действует под некоммерческой организацией, 501(c)3, налоговым статусом США университета University of Kansas. Specify поддерживался с 1996 по 2018 год грантами фонда U.S. National Science Foundation.", - "es-es": + 'es-es': "Specify Software es un producto de Specify Collections Consortium, financiado por sus instituciones miembro. Los Miembros Fundadores del Consorcio incluyen: Commonwealth Scientific and Industrial Research Organisation (CSIRO), Consejo Superior de Investigaciones Científicas (CSIC), Denmark Consortium of Museums, Muséum d'Histoire Naturelle Geneva, University of Florida, University of Kansas y University of Michigan. El Consorcio opera bajo las condiciones fiscales de 501(c)3 de EE.UU. como organización sin ánimo de lucro, University of Kansas Center for Research. Specify ha sido financiado entre 1996 y 2018 por múltiples ayudas de U.S. National Science Foundation.", - "fr-fr": + 'fr-fr': "Le logiciel Specify est un produit du Specify Collections Consortium qui est régi et financé par ses institutions membres. Les membres fondateurs du consortium comprennent : l'Organisation de recherche scientifique et industrielle du Commonwealth (CSIRO), le Consejo Superior de Investigaciones Científicas, le Consortium danois des musées, le Muséum d'Histoire Naturelle de Genève, l'Université de Floride, l'Université du Kansas et l'Université du Michigan. Le Consortium opère sous le statut fiscal américain à but non lucratif 501(c)3 du Centre de recherche de l'Université du Kansas. Specify a été soutenu de 1996 à 2018 par des subventions de la National Science Foundation des États-Unis.", - "uk-ua": + 'uk-ua': "Програмне забезпечення Specify є продуктом консорціуму Specify Collections Consortium, яким керують і фінансують установи-члени. Члени-засновники консорціуму включають: Науково-промислову дослідницьку організацію Співдружності (CSIRO), Consejo Superior de Investigaciones Sientíficas, Датський консорціум музеїв, Muséum d'Histoire Naturelle Geneva, Університет Флориди, Університет Канзасу та Університет Мічигану. Консорціум працює відповідно до некомерційного, 501(c)3, податкового статусу США дослідницького центру Канзаського університету. З 1996 по 2018 рік Specify підтримувався грантами Національного наукового фонду США.", - "de-ch": + 'de-ch': "Die Specify-Software ist ein Produkt des Specify Collections Consortiums, das von seinen Mitgliedsinstitutionen verwaltet und finanziert wird. Zu den Gründungsmitgliedern des Konsortiums gehören: Commonwealth Scientific and Industrial Research Organisation (CSIRO), Consejo Superior de Investigaciones Científicas, Denmark Consortium of Museums, Muséum d'Histoire Naturelle Geneva, University of Florida, University of Kansas, University of Michigan. Das Konsortium arbeitet unter dem gemeinnützigen, 501(c)3, U.S. Steuerstatus des University of Kansas Center for Research. Specify wurde von 1996 bis 2018 durch Zuschüsse der U.S. National Science Foundation unterstützt.", - "pt-br": + 'pt-br': "O software Specify é um produto do Consórcio de Coleções Specify, administrado e financiado por suas instituições associadas. Os membros fundadores do consórcio incluem: Organização de Pesquisa Científica e Industrial da Commonwealth (CSIRO), Consejo Superior de Investigaciones Científicas, Consórcio de Museus da Dinamarca, Muséum d'Histoire Naturelle Geneva, Universidade da Flórida, Universidade do Kansas e Universidade de Michigan. O consórcio opera sob o status tributário americano 501(c)3, sem fins lucrativos, do Centro de Pesquisa da Universidade do Kansas. O Specify foi apoiado de 1996 a 2018 por doações da Fundação Nacional de Ciências dos EUA.", }, licence: { - "en-us": - "Specify 7, Copyright 2025, University of Kansas Center for Research. Specify comes with ABSOLUTELY NO WARRANTY. This is free, open-source software licensed under GNU General Public License v2.", - "ru-ru": - "Specify 7, Авторские права 2025, University of Kansas для исследования. Specify поставляется с СОВЕРШЕННО ОТСУТСТВИЕМ ГАРАНТИИ. Это бесплатное программное обеспечение с открытым исходным кодом под лицензией GNU General Public License v2.", - "es-es": - "Specify 7 Copyright © 2025 University of Kansas Center for Research. Specify viene SIN NINGUNA GARANTÍA EN ABSOLUTO. Este es un programa libre, bajo licencia GNU General Public License 2 (GPL2).", - "fr-fr": + 'en-us': + 'Specify 7, Copyright 2025, University of Kansas Center for Research. Specify comes with ABSOLUTELY NO WARRANTY. This is free, open-source software licensed under GNU General Public License v2.', + 'ru-ru': + 'Specify 7, Авторские права 2025, University of Kansas для исследования. Specify поставляется с СОВЕРШЕННО ОТСУТСТВИЕМ ГАРАНТИИ. Это бесплатное программное обеспечение с открытым исходным кодом под лицензией GNU General Public License v2.', + 'es-es': + 'Specify 7 Copyright © 2025 University of Kansas Center for Research. Specify viene SIN NINGUNA GARANTÍA EN ABSOLUTO. Este es un programa libre, bajo licencia GNU General Public License 2 (GPL2).', + 'fr-fr': "Specify 7, Copyright 2025, Centre de recherche de l'Université du Kansas. Specify est fourni sans AUCUNE GARANTIE. Il s'agit d'un logiciel libre et open source, sous licence GNU General Public License v2.", - "uk-ua": - "Укажіть 7, авторське право 2025, Дослідницький центр Канзаського університету. Specify поставляється без АБСОЛЮТНОЇ ГАРАНТІЇ. Це безкоштовне програмне забезпечення з відкритим кодом, ліцензоване згідно з GNU General Public License v2.", - "de-ch": - "Specify 7, Copyright 2025, University of Kansas Center for Research. Specify kommt mit ABSOLUT KEINER GARANTIE. Dies ist freie, quelloffene Software, lizenziert unter GNU General Public License v2.", - "pt-br": - "Especifique 7, Copyright 2025, Centro de Pesquisa da Universidade do Kansas. Especifique NÃO OFERECE NENHUMA GARANTIA. Este é um software gratuito e de código aberto, licenciado sob a Licença Pública Geral GNU v2.", + 'uk-ua': + 'Укажіть 7, авторське право 2025, Дослідницький центр Канзаського університету. Specify поставляється без АБСОЛЮТНОЇ ГАРАНТІЇ. Це безкоштовне програмне забезпечення з відкритим кодом, ліцензоване згідно з GNU General Public License v2.', + 'de-ch': + 'Specify 7, Copyright 2025, University of Kansas Center for Research. Specify kommt mit ABSOLUT KEINER GARANTIE. Dies ist freie, quelloffene Software, lizenziert unter GNU General Public License v2.', + 'pt-br': + 'Especifique 7, Copyright 2025, Centro de Pesquisa da Universidade do Kansas. Especifique NÃO OFERECE NENHUMA GARANTIA. Este é um software gratuito e de código aberto, licenciado sob a Licença Pública Geral GNU v2.', }, systemInformation: { - "en-us": "System Information", - "ru-ru": "Системная информация", - "es-es": "Información del Sistema", - "fr-fr": "Informations système", - "uk-ua": "Інформація про систему", - "de-ch": "Systeminformationen", - "pt-br": "Informações do sistema", + 'en-us': 'System Information', + 'ru-ru': 'Системная информация', + 'es-es': 'Información del Sistema', + 'fr-fr': 'Informations système', + 'uk-ua': 'Інформація про систему', + 'de-ch': 'Systeminformationen', + 'pt-br': 'Informações do sistema', }, specifyVersion: { - "en-us": "Specify 7 Version:", - "ru-ru": "Specify 7 Версия:", - "es-es": "Especifique la versión 7:", - "fr-fr": "Spécifiez la version 7 :", - "uk-ua": "Вкажіть 7 версію:", - "de-ch": "Specify 7 Version:", - "pt-br": "Especifique 7 versões:", + 'en-us': 'Specify 7 Version:', + 'ru-ru': 'Specify 7 Версия:', + 'es-es': 'Especifique la versión 7:', + 'fr-fr': 'Spécifiez la version 7 :', + 'uk-ua': 'Вкажіть 7 версію:', + 'de-ch': 'Specify 7 Version:', + 'pt-br': 'Especifique 7 versões:', }, gitSha: { - "en-us": "Git SHA:", - "ru-ru": "Git SHA:", - "es-es": "Git SHA:", - "fr-fr": "Git SHA :", - "uk-ua": "Git SHA:", - "de-ch": "Git SHA:", - "pt-br": "Git SHA:", + 'en-us': 'Git SHA:', + 'ru-ru': 'Git SHA:', + 'es-es': 'Git SHA:', + 'fr-fr': 'Git SHA :', + 'uk-ua': 'Git SHA:', + 'de-ch': 'Git SHA:', + 'pt-br': 'Git SHA:', }, buildDate: { - "en-us": "Build Date:", - "ru-ru": "Дата сборки:", - "es-es": "La fecha de construcción:", - "fr-fr": "Date de construction :", - "uk-ua": "Дата збірки:", - "de-ch": "Datum des Builds:", - "pt-br": "Data de construção:", + 'en-us': 'Build Date:', + 'ru-ru': 'Дата сборки:', + 'es-es': 'La fecha de construcción:', + 'fr-fr': 'Date de construction :', + 'uk-ua': 'Дата збірки:', + 'de-ch': 'Datum des Builds:', + 'pt-br': 'Data de construção:', }, specifySixVersion: { - "en-us": "Specify 6 Version:", - "ru-ru": "Specify 6 Версия:", - "es-es": "Versión de Specify 6:", - "fr-fr": "Spécifiez la version 6 :", - "uk-ua": "Вкажіть 6 версію:", - "de-ch": "Specify 6 Version:", - "pt-br": "Especifique 6 versões:", + 'en-us': 'Specify 6 Version:', + 'ru-ru': 'Specify 6 Версия:', + 'es-es': 'Versión de Specify 6:', + 'fr-fr': 'Spécifiez la version 6 :', + 'uk-ua': 'Вкажіть 6 версію:', + 'de-ch': 'Specify 6 Version:', + 'pt-br': 'Especifique 6 versões:', }, databaseVersion: { - "en-us": "Database Version:", - "ru-ru": "Версия базы данных:", - "es-es": "Versión de la Base de Datos:", - "fr-fr": "Version de la base de données :", - "uk-ua": "Версія бази даних:", - "de-ch": "Datenbankversion:", - "pt-br": "Versão do banco de dados:", + 'en-us': 'Database Version:', + 'ru-ru': 'Версия базы данных:', + 'es-es': 'Versión de la Base de Datos:', + 'fr-fr': 'Version de la base de données :', + 'uk-ua': 'Версія бази даних:', + 'de-ch': 'Datenbankversion:', + 'pt-br': 'Versão do banco de dados:', }, schemaVersion: { - "en-us": "DB Schema Version", - "ru-ru": "Версия схемы базы данных", - "es-es": "Versión del Esquema de base de datos", - "fr-fr": "Version du schéma de la base de données", - "uk-ua": "Версія схеми БД", - "de-ch": "Datenbankschema-Version", - "pt-br": "Versão do esquema do banco de dados", + 'en-us': 'DB Schema Version', + 'ru-ru': 'Версия схемы базы данных', + 'es-es': 'Versión del Esquema de base de datos', + 'fr-fr': 'Version du schéma de la base de données', + 'uk-ua': 'Версія схеми БД', + 'de-ch': 'Datenbankschema-Version', + 'pt-br': 'Versão do esquema do banco de dados', }, databaseName: { - "en-us": "Database Name:", - "ru-ru": "Имя базы данных:", - "es-es": "Nombre de la Base de Datos:", - "fr-fr": "Nom de la base de données :", - "uk-ua": "Ім'я бази даних:", - "de-ch": "Datenbank-Name:", - "pt-br": "Nome do banco de dados:", + 'en-us': 'Database Name:', + 'ru-ru': 'Имя базы данных:', + 'es-es': 'Nombre de la Base de Datos:', + 'fr-fr': 'Nom de la base de données :', + 'uk-ua': "Ім'я бази даних:", + 'de-ch': 'Datenbank-Name:', + 'pt-br': 'Nome do banco de dados:', }, isaNumber: { - comment: "I believe ISA stands for Institution Service Agreement", - "en-us": "ISA Number:", - "ru-ru": "Номер ISA:", - "es-es": "Número ISA:", - "fr-fr": "Numéro ISA :", - "uk-ua": "Номер ISA:", - "de-ch": "ISA-Nummer:", - "pt-br": "Número ISA:", + comment: 'I believe ISA stands for Institution Service Agreement', + 'en-us': 'ISA Number:', + 'ru-ru': 'Номер ISA:', + 'es-es': 'Número ISA:', + 'fr-fr': 'Numéro ISA :', + 'uk-ua': 'Номер ISA:', + 'de-ch': 'ISA-Nummer:', + 'pt-br': 'Número ISA:', }, browser: { - "en-us": "Browser:", - "ru-ru": "Браузер:", - "es-es": "Navegador:", - "fr-fr": "Navigateur:", - "uk-ua": "Браузер:", - "de-ch": "Browser:", - "pt-br": "Navegador:", + 'en-us': 'Browser:', + 'ru-ru': 'Браузер:', + 'es-es': 'Navegador:', + 'fr-fr': 'Navigateur:', + 'uk-ua': 'Браузер:', + 'de-ch': 'Browser:', + 'pt-br': 'Navegador:', }, databaseCreationDate: { - "en-us": "DB Creation Date:", - "ru-ru": "Дата создания базы данных:", - "es-es": "Fecha de creación de la base de datos:", - "fr-fr": "Date de création de la base de données :", - "uk-ua": "Дата створення БД:", - "de-ch": "Datenbank Erstelldatum:", - "pt-br": "Data de criação do BD:", + 'en-us': 'DB Creation Date:', + 'ru-ru': 'Дата создания базы данных:', + 'es-es': 'Fecha de creación de la base de datos:', + 'fr-fr': 'Date de création de la base de données :', + 'uk-ua': 'Дата створення БД:', + 'de-ch': 'Datenbank Erstelldatum:', + 'pt-br': 'Data de criação do BD:', }, } as const); From 32d2a4f9858f62bcadaaff5c415ac770a4939f60 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 30 Sep 2025 21:23:46 -0400 Subject: [PATCH 024/115] Fix:Expose general collection prefs for picklist scoping and attachment defaults --- .../Preferences/CollectionDefinitions.tsx | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index ce8612a47fe..a250f3361e1 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -11,6 +11,36 @@ import type { GenericPreferences } from './types'; import { definePref } from './types'; export const collectionPreferenceDefinitions = { + general: { + title: preferencesText.general(), + subCategories: { + behavior: { + title: preferencesText.behavior(), + items: { + sp7_scope_table_picklists: definePref({ + title: localized( + "Limit 'Entire Table' picklists to values used by this collection" + ), + requiresReload: false, + visible: true, + defaultValue: true, + renderer: f.never, + container: 'label', + type: 'java.lang.Boolean', + }), + 'attachment.is_public_default': definePref({ + title: localized('Make new attachments public by default'), + requiresReload: false, + visible: true, + defaultValue: false, + renderer: f.never, + container: 'label', + type: 'java.lang.Boolean', + }), + }, + }, + }, + }, statistics: { title: statsText.statistics(), subCategories: { @@ -28,7 +58,7 @@ export const collectionPreferenceDefinitions = { showPreparationsTotal: definePref({ title: localized('Defines if preparation stats include total'), requiresReload: false, - visible: false, + visible: true, defaultValue: true, renderer: f.never, container: 'label', @@ -37,7 +67,7 @@ export const collectionPreferenceDefinitions = { refreshRate: definePref({ title: localized('_Defines the rate of auto refresh in hours'), requiresReload: false, - visible: false, + visible: true, defaultValue: 24, renderer: f.never, container: 'label', From 008fe07dedc58fc1fcc025fa9ce3ae1e9c0d58ce Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 2 Oct 2025 17:04:15 -0400 Subject: [PATCH 025/115] implement Collection Preferences UI with dedicated definitions --- .../AppResources/TabDefinitions.tsx | 3 +- .../Preferences/CollectionDefinitions.tsx | 246 ++++++++++++++---- 2 files changed, 193 insertions(+), 56 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx index b44e76eea67..cae713920a2 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx @@ -28,6 +28,7 @@ import { formattersSpec } from '../Formatters/spec'; import { FormEditor } from '../FormEditor'; import { viewSetsSpec } from '../FormEditor/spec'; import { UserPreferencesEditor } from '../Preferences/Editor'; +import { CollectionPreferencesEditor } from '../Preferences/CollectionPreferencesPage'; import { useDarkMode } from '../Preferences/Hooks'; import type { BaseSpec } from '../Syncer'; import type { SimpleXmlNode } from '../Syncer/xmlToJson'; @@ -156,7 +157,7 @@ export const visualAppResourceEditors = f.store< json: AppResourceTextEditor, }, collectionPreferences: { - // FEATURE: add visual editor + visual: CollectionPreferencesEditor, json: AppResourceTextEditor, }, leafletLayers: undefined, diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index a250f3361e1..448b2173046 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -1,3 +1,7 @@ +import React from 'react'; + +import { attachmentsText } from '../../localization/attachments'; +import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; import { specifyNetworkText } from '../../localization/specifyNetwork'; @@ -5,42 +9,151 @@ import { statsText } from '../../localization/stats'; import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; import { ensure, localized } from '../../utils/types'; -import type { QueryView } from '../QueryBuilder/Header'; +import { Link } from '../Atoms/Link'; import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; +const documentationLink = (url: string) => ( + {headerText.documentation()} +); + +const picklistDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562' +); + +const attachmentDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640' +); + +const treeDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4' +); + +const statisticsDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715' +); + +const specifyNetworkDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793' +); + +const catalogDocs = documentationLink( + 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859' +); + export const collectionPreferenceDefinitions = { general: { title: preferencesText.general(), subCategories: { - behavior: { - title: preferencesText.behavior(), + pickLists: { + title: localized('Pick lists'), items: { sp7_scope_table_picklists: definePref({ - title: localized( - "Limit 'Entire Table' picklists to values used by this collection" + title: localized('Scope “Entire Table” picklists'), + description: ( + <> + {localized( + 'Restrict “Entire Table” picklists to values used by records in this collection.' + )}{' '} + {picklistDocs} + ), requiresReload: false, visible: true, - defaultValue: true, - renderer: f.never, - container: 'label', + defaultValue: false, type: 'java.lang.Boolean', }), + }, + }, + attachments: { + title: attachmentsText.attachments(), + items: { 'attachment.is_public_default': definePref({ - title: localized('Make new attachments public by default'), + title: localized('New attachments are public'), + description: ( + <> + {localized( + 'Set the default visibility for attachments created within this collection.' + )}{' '} + {attachmentDocs} + + ), requiresReload: false, visible: true, defaultValue: false, - renderer: f.never, - container: 'label', type: 'java.lang.Boolean', }), }, }, }, }, + treeManagement: { + title: localized('Tree management'), + subCategories: { + synonymized: { + title: localized('Synonymized nodes'), + description: treeDocs, + items: { + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': + definePref({ + title: localized( + 'Allow children under synonymized Geologic Time Period nodes' + ), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': definePref({ + title: localized('Allow children under synonymized Taxon nodes'), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + 'sp7.allow_adding_child_to_synonymized_parent.Geography': + definePref({ + title: localized( + 'Allow children under synonymized Geography nodes' + ), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': + definePref({ + title: localized( + 'Allow children under synonymized Lithostratigraphy nodes' + ), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + 'sp7.allow_adding_child_to_synonymized_parent.Storage': + definePref({ + title: localized('Allow children under synonymized Storage nodes'), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': + definePref({ + title: localized( + 'Allow children under synonymized Tectonic Unit nodes' + ), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), + }, + }, + }, + }, statistics: { title: statsText.statistics(), subCategories: { @@ -56,71 +169,90 @@ export const collectionPreferenceDefinitions = { container: 'label', }), showPreparationsTotal: definePref({ - title: localized('Defines if preparation stats include total'), + title: localized('Show preparation totals'), + description: ( + <> + {localized( + 'Include an overall total across preparation types on the statistics page.' + )}{' '} + {statisticsDocs} + + ), requiresReload: false, visible: true, defaultValue: true, - renderer: f.never, - container: 'label', type: 'java.lang.Boolean', }), refreshRate: definePref({ - title: localized('_Defines the rate of auto refresh in hours'), + title: localized('Auto-refresh rate (hours)'), + description: ( + <> + {localized( + 'Specify how frequently shared statistics refresh their data.' + )}{' '} + {statisticsDocs} + + ), requiresReload: false, visible: true, defaultValue: 24, - renderer: f.never, - container: 'label', - type: 'java.lang.Float', + type: 'java.lang.Integer', }), }, }, - specifyNetwork: { - title: specifyNetworkText.specifyNetwork(), + }, + }, + specifyNetwork: { + title: specifyNetworkText.specifyNetwork(), + subCategories: { + gbif: { + title: localized('GBIF'), items: { publishingOrganization: definePref({ - title: localized('_Stores GBIF\'s "publishingOrgKey"'), + title: localized('Publishing organization key'), + description: ( + <> + {localized( + 'GBIF publishingOrgKey for this collection when contributing to the Specify Network.' + )}{' '} + {specifyNetworkDocs} + + ), requiresReload: false, - visible: false, + visible: true, defaultValue: undefined, - renderer: f.never, - container: 'label', + type: 'java.lang.String', }), collectionKey: definePref({ - title: localized('_Stores GBIF\'s "dataSetKey"'), + title: localized('Collection key'), + description: ( + <> + {localized( + 'GBIF dataSetKey used for this collection in the Specify Network.' + )}{' '} + {specifyNetworkDocs} + + ), requiresReload: false, - visible: false, + visible: true, defaultValue: undefined, - renderer: f.never, - container: 'label', - }), - }, - }, - }, - }, - queryBuilder: { - title: queryText.queryBuilder(), - subCategories: { - appearance: { - title: preferencesText.appearance(), - items: { - display: definePref({ - title: preferencesText.displayBasicView(), - requiresReload: false, - visible: false, - defaultValue: { - basicView: [], - detailedView: [], - }, - renderer: f.never, - container: 'div', + type: 'java.lang.String', }), }, }, }, }, + catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), + description: ( + <> + {localized( + 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.' + )}{' '} + {catalogDocs} + + ), subCategories: { behavior: { title: preferencesText.behavior(), @@ -128,10 +260,8 @@ export const collectionPreferenceDefinitions = { inheritance: definePref({ title: preferencesText.inheritanceCatNumberPref(), requiresReload: false, - visible: false, + visible: true, defaultValue: false, - renderer: f.never, - container: 'label', type: 'java.lang.Boolean', }), }, @@ -140,6 +270,14 @@ export const collectionPreferenceDefinitions = { }, catalogNumberParentInheritance: { title: queryText.catalogNumberParentCOInheritance(), + description: ( + <> + {localized( + 'Control whether component records inherit catalog numbers from their parent Collection Object.' + )}{' '} + {catalogDocs} + + ), subCategories: { behavior: { title: preferencesText.behavior(), @@ -147,10 +285,8 @@ export const collectionPreferenceDefinitions = { inheritance: definePref({ title: preferencesText.inheritanceCatNumberParentCOPref(), requiresReload: false, - visible: false, + visible: true, defaultValue: false, - renderer: f.never, - container: 'label', type: 'java.lang.Boolean', }), }, From a9fd48eb7df62291285800f4f99793b9f699de19 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 2 Oct 2025 17:07:34 -0400 Subject: [PATCH 026/115] adding missing files for the Collection preferences --- .../Preferences/CollectionPreferencesPage.tsx | 417 ++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx new file mode 100644 index 00000000000..4e4060dfb13 --- /dev/null +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx @@ -0,0 +1,417 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { usePromise } from '../../hooks/useAsyncState'; +import { useBooleanState } from '../../hooks/useBooleanState'; +import { useLiveState } from '../../hooks/useLiveState'; +import { commonText } from '../../localization/common'; +import { preferencesText } from '../../localization/preferences'; +import { Container, H2 } from '../Atoms'; +import { Button } from '../Atoms/Button'; +import { className } from '../Atoms/className'; +import { Form } from '../Atoms/Form'; +import { Link } from '../Atoms/Link'; +import { Submit } from '../Atoms/Submit'; +import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; +import { ErrorBoundary } from '../Errors/ErrorBoundary'; +import { ProtectedTool } from '../Permissions/PermissionDenied'; +import type { AppResourceTabProps } from '../AppResources/TabDefinitions'; +import { fetchContext as fetchRemotePrefs, getCollectionPref, getPref } from '../InitialContext/remotePrefs'; +import { schema } from '../DataModel/schema'; +import { collectionPreferences } from './collectionPreferences'; +import { collectionPreferenceDefinitions } from './CollectionDefinitions'; +import { DefaultPreferenceItemRender } from './Renderers'; +import type { GenericPreferences } from './types'; +import { BasePreferences } from './BasePreferences'; +import { useTopChild } from './useTopChild'; + +const preferencesPromise = collectionPreferences.fetch().then(() => true); + +type CollectionPreferencesInstance = BasePreferences; +type ItemEntry = ReturnType[number][1]['subCategories'][number][1]['items'][number]; + +function useCollectionPrefDefinitions() { + const visibilityContext = React.useMemo( + () => ({ isDarkMode: false, isRedirecting: false }), + [] + ); + return React.useMemo(() => + Object.entries(collectionPreferenceDefinitions as GenericPreferences) + .map(([category, { subCategories, ...categoryData }]) => [ + category, + { + ...categoryData, + subCategories: Object.entries(subCategories) + .map(([subcategory, { items, ...subcategoryData }]) => [ + subcategory, + { + ...subcategoryData, + items: Object.entries(items).filter(([, item]) => + typeof item.visible === 'function' + ? item.visible(visibilityContext) + : item.visible !== false + ), + }, + ] as const) + .filter(([, { items }]) => items.length > 0), + }, + ] as const) + .filter(([, { subCategories }]) => subCategories.length > 0), + [visibilityContext]); +} + +function CollectionPreferencesAside({ + definitions, + activeCategory, + setActiveCategory, + references, +}: { + readonly definitions: ReturnType; + readonly activeCategory: number | undefined; + readonly setActiveCategory: (index: number | undefined) => void; + readonly references: ReturnType['references']; +}): JSX.Element { + return ( + + ); +} + +function CollectionPreferencesContent({ + definitions, + preferences, + forwardRefs, +}: { + readonly definitions: ReturnType; + readonly preferences: CollectionPreferencesInstance; + readonly forwardRefs?: (index: number, element: HTMLElement | null) => void; +}): JSX.Element { + const isReadOnly = React.useContext(ReadOnlyContext); + + return ( +
+ {definitions.map(([category, { title, description, subCategories }], index) => ( + + +

{typeof title === 'function' ? title() : title}

+ {description !== undefined && ( +

+ {typeof description === 'function' ? description() : description} +

+ )} + {subCategories.map(([subcategory, { title: subTitle, description: subDescription, items }]) => ( +
+
+

+ {typeof subTitle === 'function' ? subTitle() : subTitle} +

+
+ + items.forEach(([name]) => { + const definition = preferences.definition( + category as never, + subcategory as never, + name as never + ); + preferences.set( + category as never, + subcategory as never, + name as never, + definition.defaultValue as never + ); + }) + } + > + {commonText.reset()} + +
+
+ {subDescription !== undefined && ( +

+ {typeof subDescription === 'function' + ? subDescription() + : subDescription} +

+ )} + {items.map((itemEntry) => ( + + ))} +
+ ))} +
+
+ ))} +
+ ); +} + +function CollectionPreferenceItem({ + category, + subcategory, + itemEntry, + preferences, + isReadOnly, +}: { + readonly category: string; + readonly subcategory: string; + readonly itemEntry: ItemEntry; + readonly preferences: CollectionPreferencesInstance; + readonly isReadOnly: boolean; +}): JSX.Element { + const [name, item] = itemEntry; + const [value, setValue] = preferences.use( + category as never, + subcategory as never, + name as never + ); + + const handleChange = React.useCallback( + (newValue: unknown) => { + if (isReadOnly) return; + setValue(newValue as never); + }, + [isReadOnly, setValue] + ); + + const Renderer = 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; + const props = { + className: `flex items-start gap-2 md:flex-row flex-col ${ + isReadOnly ? '!cursor-not-allowed' : '' + }`, + key: name, + } as const; + + const content = ( + <> +
+

+ {typeof item.title === 'function' ? item.title() : item.title} +

+ {item.description !== undefined && ( +

+ {typeof item.description === 'function' ? item.description() : item.description} +

+ )} +
+
+ + + +
+ + ); + + return 'container' in item && item.container === 'div' ? ( +
{content}
+ ) : ( + + ); +} + +function CollectionPreferences(): JSX.Element { + const [changesMade, markChangesMade, clearChanges] = useBooleanState(); + const loading = React.useContext(LoadingContext); + const navigate = useNavigate(); + const { + visibleChild, + setVisibleChild, + forwardRefs, + references, + scrollContainerRef, + } = useTopChild(); + const definitions = useCollectionPrefDefinitions(); + + React.useEffect(() => { + let cancelled = false; + + const migrateFromRemotePrefs = async () => { + await fetchRemotePrefs; + if (cancelled) return; + + const collectionId = schema.domainLevelIds.collection; + const migrationTargets: ReadonlyArray<{ + readonly category: string; + readonly subcategory: string; + readonly name: string; + readonly value: () => boolean; + }> = [ + { + category: 'general', + subcategory: 'pickLists', + name: 'sp7_scope_table_picklists', + value: () => getCollectionPref('sp7_scope_table_picklists', collectionId), + }, + { + category: 'general', + subcategory: 'attachments', + name: 'attachment.is_public_default', + value: () => getPref('attachment.is_public_default'), + }, + ...['GeologicTimePeriod', 'Taxon', 'Geography', 'LithoStrat', 'Storage', 'TectonicUnit'].map( + (treeName) => ({ + category: 'treeManagement', + subcategory: 'synonymized', + name: `sp7.allow_adding_child_to_synonymized_parent.${treeName}`, + value: () => getPref(`sp7.allow_adding_child_to_synonymized_parent.${treeName}`), + }) + ), + ]; + + migrationTargets.forEach(({ category, subcategory, name, value }) => { + const current = (collectionPreferences.getRaw() as Record)[category]?.[subcategory]?.[name]; + if (current !== undefined) return; + const definition = collectionPreferences.definition( + category as never, + subcategory as never, + name as never + ); + const remoteValue = value(); + if (remoteValue === definition.defaultValue) return; + collectionPreferences.set( + category as never, + subcategory as never, + name as never, + remoteValue as never + ); + }); + }; + + void migrateFromRemotePrefs(); + + return () => { + cancelled = true; + }; + }, []); + + React.useEffect(() => + collectionPreferences.events.on('update', () => { + markChangesMade(); + }), [markChangesMade]); + + return ( + + +

{preferencesText.collectionPreferences()}

+
+ loading( + collectionPreferences + .awaitSynced() + .then(() => { + clearChanges(); + navigate('/specify/'); + }) + ) + } + > +
+ + + +
+
+ {changesMade ? ( + {commonText.save()} + ) : ( + + {commonText.close()} + + )} +
+
+
+
+ ); +} + +export function CollectionPreferencesWrapper(): JSX.Element | null { + const [hasFetched] = usePromise(preferencesPromise, true); + return hasFetched ? : null; +} + +export function CollectionPreferencesEditor({ + data, + onChange, +}: AppResourceTabProps): JSX.Element { + const [preferencesInstance] = useLiveState( + React.useCallback(() => { + const prefs = new BasePreferences({ + definitions: collectionPreferenceDefinitions, + values: { + resourceName: 'CollectionPreferences', + fetchUrl: '/context/collection_resource/', + }, + defaultValues: undefined, + developmentGlobal: '_editingCollectionPreferences', + syncChanges: false, + }); + prefs.setRaw(JSON.parse(data === null || data.length === 0 ? '{}' : data)); + prefs.events.on('update', () => onChange(JSON.stringify(prefs.getRaw()))); + return prefs; + }, [onChange]) + ); + + const definitions = useCollectionPrefDefinitions(); + const Context = preferencesInstance.Context; + + return ( + + + + + + ); +} From 45b4734732cc25f006e00a9a69799c5c0dc58bbe Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 2 Oct 2025 21:25:58 -0400 Subject: [PATCH 027/115] resolve typecheck errors in Collection Preferences definitions --- .../Preferences/CollectionDefinitions.tsx | 35 ++++--------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 448b2173046..24909fd525f 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { attachmentsText } from '../../localization/attachments'; -import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; import { specifyNetworkText } from '../../localization/specifyNetwork'; @@ -9,38 +8,16 @@ import { statsText } from '../../localization/stats'; import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; import { ensure, localized } from '../../utils/types'; -import { Link } from '../Atoms/Link'; import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; -const documentationLink = (url: string) => ( - {headerText.documentation()} -); - -const picklistDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562' -); - -const attachmentDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640' -); - -const treeDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4' -); - -const statisticsDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715' -); - -const specifyNetworkDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793' -); - -const catalogDocs = documentationLink( - 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859' -); +const picklistDocs = 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562'; +const attachmentDocs = 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640'; +const treeDocs = 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; +const statisticsDocs = 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715'; +const specifyNetworkDocs = 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793'; +const catalogDocs = 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; export const collectionPreferenceDefinitions = { general: { From 9411b4aa5c5ff6d0d0bf5117f85e689c3c818034 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 3 Oct 2025 20:45:04 -0400 Subject: [PATCH 028/115] add Collection Preferences UI and editor with doc links --- .../AppResources/TabDefinitions.tsx | 2 +- .../Preferences/CollectionDefinitions.tsx | 93 +-- .../Preferences/CollectionPreferencesPage.tsx | 560 ++++++++---------- .../lib/components/Preferences/Editor.tsx | 36 ++ 4 files changed, 307 insertions(+), 384 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx index cae713920a2..3cf1e712444 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/TabDefinitions.tsx @@ -28,7 +28,7 @@ import { formattersSpec } from '../Formatters/spec'; import { FormEditor } from '../FormEditor'; import { viewSetsSpec } from '../FormEditor/spec'; import { UserPreferencesEditor } from '../Preferences/Editor'; -import { CollectionPreferencesEditor } from '../Preferences/CollectionPreferencesPage'; +import { CollectionPreferencesEditor } from '../Preferences/Editor'; import { useDarkMode } from '../Preferences/Hooks'; import type { BaseSpec } from '../Syncer'; import type { SimpleXmlNode } from '../Syncer/xmlToJson'; diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 24909fd525f..9bf3f5e7b73 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -1,4 +1,7 @@ -import React from 'react'; +/** + * Definitions for Collection preferences + */ +import type { LocalizedString } from 'typesafe-i18n'; import { attachmentsText } from '../../localization/attachments'; import { preferencesText } from '../../localization/preferences'; @@ -12,29 +15,17 @@ import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; -const picklistDocs = 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562'; -const attachmentDocs = 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640'; -const treeDocs = 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; -const statisticsDocs = 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715'; -const specifyNetworkDocs = 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793'; -const catalogDocs = 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; - export const collectionPreferenceDefinitions = { general: { title: preferencesText.general(), subCategories: { pickLists: { - title: localized('Pick lists'), + title: preferencesText.filterPickLists?.() ?? (localized('Pick lists') as LocalizedString), items: { sp7_scope_table_picklists: definePref({ title: localized('Scope “Entire Table” picklists'), - description: ( - <> - {localized( - 'Restrict “Entire Table” picklists to values used by records in this collection.' - )}{' '} - {picklistDocs} - + description: localized( + 'Restrict “Entire Table” picklists to values used by records in this collection.' ), requiresReload: false, visible: true, @@ -48,13 +39,8 @@ export const collectionPreferenceDefinitions = { items: { 'attachment.is_public_default': definePref({ title: localized('New attachments are public'), - description: ( - <> - {localized( - 'Set the default visibility for attachments created within this collection.' - )}{' '} - {attachmentDocs} - + description: localized( + 'Set the default visibility for attachments created within this collection.' ), requiresReload: false, visible: true, @@ -65,12 +51,15 @@ export const collectionPreferenceDefinitions = { }, }, }, + treeManagement: { title: localized('Tree management'), subCategories: { synonymized: { title: localized('Synonymized nodes'), - description: treeDocs, + description: localized( + 'Allow creating children under synonymized nodes in specific trees.' + ), items: { 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': definePref({ @@ -147,13 +136,8 @@ export const collectionPreferenceDefinitions = { }), showPreparationsTotal: definePref({ title: localized('Show preparation totals'), - description: ( - <> - {localized( - 'Include an overall total across preparation types on the statistics page.' - )}{' '} - {statisticsDocs} - + description: localized( + 'Include an overall total across preparation types on the statistics page.' ), requiresReload: false, visible: true, @@ -162,13 +146,8 @@ export const collectionPreferenceDefinitions = { }), refreshRate: definePref({ title: localized('Auto-refresh rate (hours)'), - description: ( - <> - {localized( - 'Specify how frequently shared statistics refresh their data.' - )}{' '} - {statisticsDocs} - + description: localized( + 'Specify how frequently shared statistics refresh their data.' ), requiresReload: false, visible: true, @@ -179,7 +158,7 @@ export const collectionPreferenceDefinitions = { }, }, }, - specifyNetwork: { + specifyNetwork: { title: specifyNetworkText.specifyNetwork(), subCategories: { gbif: { @@ -187,14 +166,6 @@ export const collectionPreferenceDefinitions = { items: { publishingOrganization: definePref({ title: localized('Publishing organization key'), - description: ( - <> - {localized( - 'GBIF publishingOrgKey for this collection when contributing to the Specify Network.' - )}{' '} - {specifyNetworkDocs} - - ), requiresReload: false, visible: true, defaultValue: undefined, @@ -202,14 +173,6 @@ export const collectionPreferenceDefinitions = { }), collectionKey: definePref({ title: localized('Collection key'), - description: ( - <> - {localized( - 'GBIF dataSetKey used for this collection in the Specify Network.' - )}{' '} - {specifyNetworkDocs} - - ), requiresReload: false, visible: true, defaultValue: undefined, @@ -219,16 +182,11 @@ export const collectionPreferenceDefinitions = { }, }, }, - + catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), - description: ( - <> - {localized( - 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.' - )}{' '} - {catalogDocs} - + description: localized( + 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.' ), subCategories: { behavior: { @@ -247,13 +205,8 @@ export const collectionPreferenceDefinitions = { }, catalogNumberParentInheritance: { title: queryText.catalogNumberParentCOInheritance(), - description: ( - <> - {localized( - 'Control whether component records inherit catalog numbers from their parent Collection Object.' - )}{' '} - {catalogDocs} - + description: localized( + 'Control whether component records inherit catalog numbers from their parent Collection Object.' ), subCategories: { behavior: { diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx index 4e4060dfb13..8c939535309 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx @@ -1,176 +1,177 @@ +/** + * Edit collection preferences + */ + import React from 'react'; import { useNavigate } from 'react-router-dom'; +import type { LocalizedString } from 'typesafe-i18n'; import { usePromise } from '../../hooks/useAsyncState'; import { useBooleanState } from '../../hooks/useBooleanState'; -import { useLiveState } from '../../hooks/useLiveState'; import { commonText } from '../../localization/common'; import { preferencesText } from '../../localization/preferences'; -import { Container, H2 } from '../Atoms'; +import { headerText } from '../../localization/header'; +import { StringToJsx } from '../../localization/utils'; +import { f } from '../../utils/functools'; +import { Container, Key } from '../Atoms'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; import { Form } from '../Atoms/Form'; import { Link } from '../Atoms/Link'; -import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { ProtectedTool } from '../Permissions/PermissionDenied'; -import type { AppResourceTabProps } from '../AppResources/TabDefinitions'; -import { fetchContext as fetchRemotePrefs, getCollectionPref, getPref } from '../InitialContext/remotePrefs'; -import { schema } from '../DataModel/schema'; +import { hasPermission } from '../Permissions/helpers'; + import { collectionPreferences } from './collectionPreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { DefaultPreferenceItemRender } from './Renderers'; -import type { GenericPreferences } from './types'; -import { BasePreferences } from './BasePreferences'; -import { useTopChild } from './useTopChild'; +import type { GenericPreferences, PreferenceItem } from './types'; -const preferencesPromise = collectionPreferences.fetch().then(() => true); +const preferencesPromise = Promise.all([collectionPreferences.fetch()]).then( + f.true +); -type CollectionPreferencesInstance = BasePreferences; -type ItemEntry = ReturnType[number][1]['subCategories'][number][1]['items'][number]; +const DOCS = { + picklists: + 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', + attachments: + 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', + trees: + 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', + stats: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + specifyNetwork: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', + catalogNumbers: + 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859', +} as const; -function useCollectionPrefDefinitions() { +export function useCollectionPrefDefinitions() { const visibilityContext = React.useMemo( () => ({ isDarkMode: false, isRedirecting: false }), [] ); - return React.useMemo(() => - Object.entries(collectionPreferenceDefinitions as GenericPreferences) - .map(([category, { subCategories, ...categoryData }]) => [ - category, - { - ...categoryData, - subCategories: Object.entries(subCategories) - .map(([subcategory, { items, ...subcategoryData }]) => [ - subcategory, + return React.useMemo( + () => + Object.entries(collectionPreferenceDefinitions as GenericPreferences) + .map( + ([category, { subCategories, ...categoryData }]) => + [ + category, { - ...subcategoryData, - items: Object.entries(items).filter(([, item]) => - typeof item.visible === 'function' - ? item.visible(visibilityContext) - : item.visible !== false - ), + ...categoryData, + subCategories: Object.entries(subCategories) + .map( + ([subCategory, { items, ...subCategoryData }]) => + [ + subCategory, + { + ...subCategoryData, + items: Object.entries(items).filter( + ([_name, { visible }]) => + typeof visible === 'function' + ? visible(visibilityContext) + : visible !== false + ), + }, + ] as const + ) + .filter(([_name, { items }]) => items.length > 0), }, - ] as const) - .filter(([, { items }]) => items.length > 0), - }, - ] as const) - .filter(([, { subCategories }]) => subCategories.length > 0), - [visibilityContext]); -} - -function CollectionPreferencesAside({ - definitions, - activeCategory, - setActiveCategory, - references, -}: { - readonly definitions: ReturnType; - readonly activeCategory: number | undefined; - readonly setActiveCategory: (index: number | undefined) => void; - readonly references: ReturnType['references']; -}): JSX.Element { - return ( - + ] as const + ) + .filter(([_name, { subCategories }]) => subCategories.length > 0), + [visibilityContext] ); } -function CollectionPreferencesContent({ - definitions, - preferences, - forwardRefs, -}: { - readonly definitions: ReturnType; - readonly preferences: CollectionPreferencesInstance; - readonly forwardRefs?: (index: number, element: HTMLElement | null) => void; -}): JSX.Element { - const isReadOnly = React.useContext(ReadOnlyContext); +type ItemEntry = ReturnType< + typeof useCollectionPrefDefinitions +>[number][1]['subCategories'][number][1]['items'][number]; + +export function CollectionPreferencesContent(): JSX.Element { + const definitions = useCollectionPrefDefinitions(); return (
- {definitions.map(([category, { title, description, subCategories }], index) => ( - - -

{typeof title === 'function' ? title() : title}

- {description !== undefined && ( -

- {typeof description === 'function' ? description() : description} -

- )} - {subCategories.map(([subcategory, { title: subTitle, description: subDescription, items }]) => ( -
-
-

- {typeof subTitle === 'function' ? subTitle() : subTitle} -

-
- - items.forEach(([name]) => { - const definition = preferences.definition( - category as never, - subcategory as never, - name as never - ); - preferences.set( - category as never, - subcategory as never, - name as never, - definition.defaultValue as never - ); - }) - } - > - {commonText.reset()} - -
-
- {subDescription !== undefined && ( -

- {typeof subDescription === 'function' - ? subDescription() - : subDescription} -

- )} - {items.map((itemEntry) => ( - - ))} -
- ))} -
-
- ))} + {definitions.map( + ( + [category, { title, description = undefined, subCategories }]) => ( + + +

+ {typeof title === 'function' ? title() : title} +

+ + {description !== undefined && ( +

+ {typeof description === 'function' + ? description() + : description} +

+ )} + + {subCategories.map( + ([subcategory, { title, description: subDesc, items }]) => ( +
+
+

+ {typeof title === 'function' ? title() : title} +

+ +
+ + items.forEach(([name]) => { + const def = collectionPreferences.definition( + category as never, + subcategory as never, + name as never + ); + collectionPreferences.set( + category as never, + subcategory as never, + name as never, + (def as { defaultValue: unknown }) + .defaultValue as never + ); + }) + } + > + {commonText.reset()} + +
+
+ + {subDesc !== undefined && ( +

+ {typeof subDesc === 'function' ? subDesc() : subDesc} +

+ )} + + {items.map((entry) => ( + + ))} +
+ ) + )} +
+
+ ) + )}
); } @@ -179,59 +180,97 @@ function CollectionPreferenceItem({ category, subcategory, itemEntry, - preferences, - isReadOnly, }: { readonly category: string; readonly subcategory: string; readonly itemEntry: ItemEntry; - readonly preferences: CollectionPreferencesInstance; - readonly isReadOnly: boolean; }): JSX.Element { + const isReadOnly = React.useContext(ReadOnlyContext); const [name, item] = itemEntry; - const [value, setValue] = preferences.use( + + const canEdit = + !isReadOnly && + (item.visible !== 'protected' || + hasPermission('/preferences/user', 'edit_protected')); + + const [value, setValue] = collectionPreferences.use( category as never, subcategory as never, name as never ); - const handleChange = React.useCallback( - (newValue: unknown) => { - if (isReadOnly) return; - setValue(newValue as never); - }, - [isReadOnly, setValue] - ); + const Renderer = + 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; + + // Minimal doc link mapping + const docHref: string | undefined = (() => { + if (name === 'sp7_scope_table_picklists') return DOCS.picklists; + if (name === 'attachment.is_public_default') return DOCS.attachments; + if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) + return DOCS.trees; + if (name === 'showPreparationsTotal' || name === 'refreshRate') + return DOCS.stats; + if (name === 'publishingOrganization' || name === 'collectionKey') + return DOCS.specifyNetwork; + if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; + return undefined; + })(); - const Renderer = 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; - const props = { - className: `flex items-start gap-2 md:flex-row flex-col ${ - isReadOnly ? '!cursor-not-allowed' : '' - }`, - key: name, + const wrapperProps = { + className: ` + flex items-start gap-2 md:flex-row flex-col + ${canEdit ? '' : '!cursor-not-allowed'} + `, + title: canEdit ? undefined : preferencesText.adminsOnlyPreference(), } as const; const content = ( <>

- {typeof item.title === 'function' ? item.title() : item.title} +

- {item.description !== undefined && ( + + {(item.description !== undefined || docHref) && (

- {typeof item.description === 'function' ? item.description() : item.description} + {item.description !== undefined && ( + + )} + {docHref && ( + <> + {item.description ? ' ' : null} + + {headerText.documentation + ? headerText.documentation() + : ('Documentation' as LocalizedString)} + + + )}

)}
+
- + } item={name} subcategory={subcategory} value={value} - onChange={handleChange} + onChange={setValue} />
@@ -239,9 +278,30 @@ function CollectionPreferenceItem({ ); return 'container' in item && item.container === 'div' ? ( -
{content}
+
{content}
) : ( - + + ); +} + +function FormatString({ + text, +}: { + readonly text: JSX.Element | LocalizedString; +}): JSX.Element { + return typeof text === 'object' ? ( + text + ) : text.includes('') ? ( + + {key}, + }} + string={text} + /> + + ) : ( + <>{text} ); } @@ -249,169 +309,43 @@ function CollectionPreferences(): JSX.Element { const [changesMade, markChangesMade, clearChanges] = useBooleanState(); const loading = React.useContext(LoadingContext); const navigate = useNavigate(); - const { - visibleChild, - setVisibleChild, - forwardRefs, - references, - scrollContainerRef, - } = useTopChild(); - const definitions = useCollectionPrefDefinitions(); - React.useEffect(() => { - let cancelled = false; - - const migrateFromRemotePrefs = async () => { - await fetchRemotePrefs; - if (cancelled) return; - - const collectionId = schema.domainLevelIds.collection; - const migrationTargets: ReadonlyArray<{ - readonly category: string; - readonly subcategory: string; - readonly name: string; - readonly value: () => boolean; - }> = [ - { - category: 'general', - subcategory: 'pickLists', - name: 'sp7_scope_table_picklists', - value: () => getCollectionPref('sp7_scope_table_picklists', collectionId), - }, - { - category: 'general', - subcategory: 'attachments', - name: 'attachment.is_public_default', - value: () => getPref('attachment.is_public_default'), - }, - ...['GeologicTimePeriod', 'Taxon', 'Geography', 'LithoStrat', 'Storage', 'TectonicUnit'].map( - (treeName) => ({ - category: 'treeManagement', - subcategory: 'synonymized', - name: `sp7.allow_adding_child_to_synonymized_parent.${treeName}`, - value: () => getPref(`sp7.allow_adding_child_to_synonymized_parent.${treeName}`), - }) - ), - ]; - - migrationTargets.forEach(({ category, subcategory, name, value }) => { - const current = (collectionPreferences.getRaw() as Record)[category]?.[subcategory]?.[name]; - if (current !== undefined) return; - const definition = collectionPreferences.definition( - category as never, - subcategory as never, - name as never - ); - const remoteValue = value(); - if (remoteValue === definition.defaultValue) return; - collectionPreferences.set( - category as never, - subcategory as never, - name as never, - remoteValue as never - ); - }); - }; - - void migrateFromRemotePrefs(); - - return () => { - cancelled = true; - }; - }, []); - - React.useEffect(() => - collectionPreferences.events.on('update', () => { - markChangesMade(); - }), [markChangesMade]); + React.useEffect( + () => collectionPreferences.events.on('update', () => markChangesMade()), + [markChangesMade] + ); + return ( - -

{preferencesText.collectionPreferences()}

+ + <> +
loading( - collectionPreferences - .awaitSynced() - .then(() => { - clearChanges(); - navigate('/specify/'); - }) + collectionPreferences.awaitSynced().then(() => { + clearChanges(); + navigate('/specify/'); + }) ) } > -
- - - -
-
- {changesMade ? ( - {commonText.save()} - ) : ( - - {commonText.close()} - - )} +
+ + +
+ + - + ); } export function CollectionPreferencesWrapper(): JSX.Element | null { const [hasFetched] = usePromise(preferencesPromise, true); - return hasFetched ? : null; -} - -export function CollectionPreferencesEditor({ - data, - onChange, -}: AppResourceTabProps): JSX.Element { - const [preferencesInstance] = useLiveState( - React.useCallback(() => { - const prefs = new BasePreferences({ - definitions: collectionPreferenceDefinitions, - values: { - resourceName: 'CollectionPreferences', - fetchUrl: '/context/collection_resource/', - }, - defaultValues: undefined, - developmentGlobal: '_editingCollectionPreferences', - syncChanges: false, - }); - prefs.setRaw(JSON.parse(data === null || data.length === 0 ? '{}' : data)); - prefs.events.on('update', () => onChange(JSON.stringify(prefs.getRaw()))); - return prefs; - }, [onChange]) - ); - - const definitions = useCollectionPrefDefinitions(); - const Context = preferencesInstance.Context; - - return ( - - - - - - ); + return hasFetched === true ? : null; } diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index bac46be2988..45e3cbed8fb 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -6,6 +6,9 @@ import { PreferencesContent } from '../Preferences'; import { BasePreferences } from '../Preferences/BasePreferences'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; +import { CollectionPreferencesContent } from './CollectionPreferencesPage'; +import { collectionPreferenceDefinitions } from './CollectionDefinitions'; +import { collectionPreferences } from './collectionPreferences'; export function UserPreferencesEditor({ data, @@ -40,3 +43,36 @@ export function UserPreferencesEditor({ ); } + +export function CollectionPreferencesEditor({ + data, + onChange, +}: AppResourceTabProps): JSX.Element { + const [preferencesInstance] = useLiveState( + React.useCallback(() => { + const tmpCollectionPrefs = new BasePreferences({ + definitions: collectionPreferenceDefinitions, + values: { + resourceName: 'CollectionPreferences', + fetchUrl: '/context/collection_resource/', + }, + defaultValues: undefined, + developmentGlobal: '_editingCollectionPreferences', + syncChanges: false, + }); + tmpCollectionPrefs.setRaw(JSON.parse(!data || data.length === 0 ? '{}' : data)); + tmpCollectionPrefs.events.on('update', () => + onChange(JSON.stringify(tmpCollectionPrefs.getRaw())) + ); + + return tmpCollectionPrefs; + }, [data, onChange]) + ); + const Context = collectionPreferences.Context; + + return ( + + + + ); +} \ No newline at end of file From d1858107589fd75ce18b77a14d96b818c045c186 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 3 Oct 2025 21:48:48 -0400 Subject: [PATCH 029/115] implify CollectionPreferences page by removing internal save --- .../Preferences/CollectionPreferencesPage.tsx | 41 ++----------------- 1 file changed, 4 insertions(+), 37 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx index 8c939535309..951bda72546 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx @@ -3,11 +3,9 @@ */ import React from 'react'; -import { useNavigate } from 'react-router-dom'; import type { LocalizedString } from 'typesafe-i18n'; import { usePromise } from '../../hooks/useAsyncState'; -import { useBooleanState } from '../../hooks/useBooleanState'; import { commonText } from '../../localization/common'; import { preferencesText } from '../../localization/preferences'; import { headerText } from '../../localization/header'; @@ -16,9 +14,8 @@ import { f } from '../../utils/functools'; import { Container, Key } from '../Atoms'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; -import { Form } from '../Atoms/Form'; import { Link } from '../Atoms/Link'; -import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; +import { ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { ProtectedTool } from '../Permissions/PermissionDenied'; import { hasPermission } from '../Permissions/helpers'; @@ -306,41 +303,11 @@ function FormatString({ } function CollectionPreferences(): JSX.Element { - const [changesMade, markChangesMade, clearChanges] = useBooleanState(); - const loading = React.useContext(LoadingContext); - const navigate = useNavigate(); - - React.useEffect( - () => collectionPreferences.events.on('update', () => markChangesMade()), - [markChangesMade] - ); - - return ( - - <> - -
- loading( - collectionPreferences.awaitSynced().then(() => { - clearChanges(); - navigate('/specify/'); - }) - ) - } - > -
- - - -
- - -
- +
+ +
); } From 3f199374caa9e2a348e1fe94d8b1f2bbf79e277e Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 3 Oct 2025 22:35:51 -0400 Subject: [PATCH 030/115] Corrected specifyNetwork keys to publishingOrg and datasetKey --- .../Preferences/CollectionDefinitions.tsx | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 9bf3f5e7b73..9655e329e19 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -20,7 +20,9 @@ export const collectionPreferenceDefinitions = { title: preferencesText.general(), subCategories: { pickLists: { - title: preferencesText.filterPickLists?.() ?? (localized('Pick lists') as LocalizedString), + title: + preferencesText.filterPickLists?.() ?? + (localized('Pick lists') as LocalizedString), items: { sp7_scope_table_picklists: definePref({ title: localized('Scope “Entire Table” picklists'), @@ -71,13 +73,14 @@ export const collectionPreferenceDefinitions = { defaultValue: false, type: 'java.lang.Boolean', }), - 'sp7.allow_adding_child_to_synonymized_parent.Taxon': definePref({ - title: localized('Allow children under synonymized Taxon nodes'), - requiresReload: false, - visible: true, - defaultValue: false, - type: 'java.lang.Boolean', - }), + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': + definePref({ + title: localized('Allow children under synonymized Taxon nodes'), + requiresReload: false, + visible: true, + defaultValue: false, + type: 'java.lang.Boolean', + }), 'sp7.allow_adding_child_to_synonymized_parent.Geography': definePref({ title: localized( @@ -120,6 +123,32 @@ export const collectionPreferenceDefinitions = { }, }, }, + queryBuilder: { + title: queryText.queryBuilder(), + subCategories: { + appearance: { + title: preferencesText.appearance(), + items: { + display: definePref<{ + readonly basicView: RA; + // detailedView shape isn’t used here; keep it permissive + readonly detailedView: unknown; + }>({ + title: preferencesText.displayBasicView(), + requiresReload: false, + visible: false, + defaultValue: { + basicView: [], + detailedView: {}, + }, + renderer: f.never, + container: 'label', + }), + }, + }, + }, + }, + statistics: { title: statsText.statistics(), subCategories: { @@ -158,20 +187,22 @@ export const collectionPreferenceDefinitions = { }, }, }, + specifyNetwork: { title: specifyNetworkText.specifyNetwork(), subCategories: { gbif: { title: localized('GBIF'), items: { - publishingOrganization: definePref({ + // Names chosen to match SpecifyNetworkCollection components + publishingOrg: definePref({ title: localized('Publishing organization key'), requiresReload: false, visible: true, defaultValue: undefined, type: 'java.lang.String', }), - collectionKey: definePref({ + datasetKey: definePref({ title: localized('Collection key'), requiresReload: false, visible: true, @@ -203,6 +234,7 @@ export const collectionPreferenceDefinitions = { }, }, }, + catalogNumberParentInheritance: { title: queryText.catalogNumberParentCOInheritance(), description: localized( @@ -223,6 +255,7 @@ export const collectionPreferenceDefinitions = { }, }, }, + uniqueCatalogNumberAccrossComponentAndCO: { title: queryText.uniqueCatalogNumberAcrossComponentAndCo(), subCategories: { @@ -244,4 +277,5 @@ export const collectionPreferenceDefinitions = { }, } as const; +// Keep the same type-assert pattern as UserDefinitions ensure()(collectionPreferenceDefinitions); From ce2b1c6a5fda6e2707c1e361dff1591b66ea11dd Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 3 Oct 2025 23:00:02 -0400 Subject: [PATCH 031/115] fix TypeScript errors in collection preference definitions --- .../components/Preferences/CollectionDefinitions.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 9655e329e19..1081a1ed6ac 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -25,9 +25,9 @@ export const collectionPreferenceDefinitions = { (localized('Pick lists') as LocalizedString), items: { sp7_scope_table_picklists: definePref({ - title: localized('Scope “Entire Table” picklists'), + title: localized('Scope "Entire Table" picklists'), description: localized( - 'Restrict “Entire Table” picklists to values used by records in this collection.' + 'Restrict "Entire Table" picklists to values used by records in this collection.' ), requiresReload: false, visible: true, @@ -131,8 +131,7 @@ export const collectionPreferenceDefinitions = { items: { display: definePref<{ readonly basicView: RA; - // detailedView shape isn’t used here; keep it permissive - readonly detailedView: unknown; + readonly detailedView: Record; }>({ title: preferencesText.displayBasicView(), requiresReload: false, @@ -194,7 +193,6 @@ export const collectionPreferenceDefinitions = { gbif: { title: localized('GBIF'), items: { - // Names chosen to match SpecifyNetworkCollection components publishingOrg: definePref({ title: localized('Publishing organization key'), requiresReload: false, @@ -277,5 +275,4 @@ export const collectionPreferenceDefinitions = { }, } as const; -// Keep the same type-assert pattern as UserDefinitions -ensure()(collectionPreferenceDefinitions); +ensure()(collectionPreferenceDefinitions); \ No newline at end of file From 45cbc313088cbd2efee00cd57ec33fc02de4deec Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sat, 4 Oct 2025 11:46:50 -0400 Subject: [PATCH 032/115] align CollectionDefinitions with UserDefinitions typing --- .../Preferences/CollectionDefinitions.tsx | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 1081a1ed6ac..9ac2b95a503 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -15,6 +15,23 @@ import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; +const specifyNetworkItems = { + publishingOrganization: definePref({ + title: localized('Publishing organization key'), + requiresReload: false, + visible: true, + defaultValue: undefined, + type: 'java.lang.String', + }), + collectionKey: definePref({ + title: localized('Collection key'), + requiresReload: false, + visible: true, + defaultValue: undefined, + type: 'java.lang.String', + }), +} as const; + export const collectionPreferenceDefinitions = { general: { title: preferencesText.general(), @@ -131,14 +148,14 @@ export const collectionPreferenceDefinitions = { items: { display: definePref<{ readonly basicView: RA; - readonly detailedView: Record; + readonly detailedView: RA; }>({ title: preferencesText.displayBasicView(), requiresReload: false, visible: false, defaultValue: { basicView: [], - detailedView: {}, + detailedView: [], }, renderer: f.never, container: 'label', @@ -184,6 +201,10 @@ export const collectionPreferenceDefinitions = { }), }, }, + specifyNetwork: { + title: specifyNetworkText.specifyNetwork(), + items: specifyNetworkItems, + }, }, }, @@ -192,22 +213,7 @@ export const collectionPreferenceDefinitions = { subCategories: { gbif: { title: localized('GBIF'), - items: { - publishingOrg: definePref({ - title: localized('Publishing organization key'), - requiresReload: false, - visible: true, - defaultValue: undefined, - type: 'java.lang.String', - }), - datasetKey: definePref({ - title: localized('Collection key'), - requiresReload: false, - visible: true, - defaultValue: undefined, - type: 'java.lang.String', - }), - }, + items: specifyNetworkItems, }, }, }, @@ -275,4 +281,4 @@ export const collectionPreferenceDefinitions = { }, } as const; -ensure()(collectionPreferenceDefinitions); \ No newline at end of file +ensure()(collectionPreferenceDefinitions); From d70cdd50fb1b2b632c2a6a2975d2bc03cb509e98 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sat, 4 Oct 2025 12:05:53 -0400 Subject: [PATCH 033/115] Fix localization scanner issues in preferences --- .../lib/components/Preferences/CollectionDefinitions.tsx | 5 +---- .../lib/components/Preferences/CollectionPreferencesPage.tsx | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 9ac2b95a503..ab894b89a70 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -1,7 +1,6 @@ /** * Definitions for Collection preferences */ -import type { LocalizedString } from 'typesafe-i18n'; import { attachmentsText } from '../../localization/attachments'; import { preferencesText } from '../../localization/preferences'; @@ -37,9 +36,7 @@ export const collectionPreferenceDefinitions = { title: preferencesText.general(), subCategories: { pickLists: { - title: - preferencesText.filterPickLists?.() ?? - (localized('Pick lists') as LocalizedString), + title: preferencesText.filterPickLists(), items: { sp7_scope_table_picklists: definePref({ title: localized('Scope "Entire Table" picklists'), diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx index 951bda72546..5eddc5b6626 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx @@ -249,9 +249,7 @@ function CollectionPreferenceItem({ <> {item.description ? ' ' : null} - {headerText.documentation - ? headerText.documentation() - : ('Documentation' as LocalizedString)} + {headerText.documentation()} )} From eb00132248006b4e41805e3dd6204410c0707b17 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sat, 4 Oct 2025 21:47:39 -0400 Subject: [PATCH 034/115] adding path for role gated access --- .../lib/components/Header/userToolDefinitions.ts | 6 ++++++ .../components/Preferences/CollectionDefinitions.tsx | 12 +----------- .../frontend/js_src/lib/components/Router/Routes.tsx | 8 ++++++++ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index 6855811b3b4..ef262b42e9f 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -57,6 +57,12 @@ const rawUserTools = ensure>>>()({ url: '/specify/user-preferences/', icon: icons.cog, }, + collectionPreferences: { + title: preferencesText.collectionPreferences(), + url: '/specify/collection-preferences/', + icon: icons.collection, + enabled: () => hasToolPermission('resources', 'update'), + }, schemaConfig: { title: schemaText.schemaConfig(), url: '/specify/schema-config/', diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index ab894b89a70..762cea9723c 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -155,7 +155,7 @@ export const collectionPreferenceDefinitions = { detailedView: [], }, renderer: f.never, - container: 'label', + container: 'div', }), }, }, @@ -205,16 +205,6 @@ export const collectionPreferenceDefinitions = { }, }, - specifyNetwork: { - title: specifyNetworkText.specifyNetwork(), - subCategories: { - gbif: { - title: localized('GBIF'), - items: specifyNetworkItems, - }, - }, - }, - catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), description: localized( diff --git a/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx b/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx index e932a03d020..678636cbaac 100644 --- a/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx +++ b/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx @@ -376,6 +376,14 @@ export const routes: RA = [ ({ PreferencesWrapper }) => PreferencesWrapper ), }, + { + path: 'collection-preferences', + title: preferencesText.collectionPreferences(), + element: () => + import('../Preferences/CollectionPreferencesPage').then( + ({ CollectionPreferencesWrapper }) => CollectionPreferencesWrapper + ), + }, { path: 'schema-config', title: schemaText.schemaConfig(), From fb3d6164f18de267ffdf1c6d297a4446dd3792e8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sat, 4 Oct 2025 16:10:26 +0000 Subject: [PATCH 035/115] Lint code with ESLint and Prettier Triggered by 20b207e0bd6648d0fd9991f97a1cca5eb0144998 on branch refs/heads/issue-7440 --- .../Preferences/CollectionPreferencesPage.tsx | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx index 5eddc5b6626..d5458ca9dd5 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx @@ -7,8 +7,8 @@ import type { LocalizedString } from 'typesafe-i18n'; import { usePromise } from '../../hooks/useAsyncState'; import { commonText } from '../../localization/common'; -import { preferencesText } from '../../localization/preferences'; import { headerText } from '../../localization/header'; +import { preferencesText } from '../../localization/preferences'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import { Container, Key } from '../Atoms'; @@ -17,11 +17,10 @@ import { className } from '../Atoms/className'; import { Link } from '../Atoms/Link'; import { ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; -import { ProtectedTool } from '../Permissions/PermissionDenied'; import { hasPermission } from '../Permissions/helpers'; - -import { collectionPreferences } from './collectionPreferences'; +import { ProtectedTool } from '../Permissions/PermissionDenied'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; +import { collectionPreferences } from './collectionPreferences'; import { DefaultPreferenceItemRender } from './Renderers'; import type { GenericPreferences, PreferenceItem } from './types'; @@ -92,8 +91,7 @@ export function CollectionPreferencesContent(): JSX.Element { return (
{definitions.map( - ( - [category, { title, description = undefined, subCategories }]) => ( + ([category, { title, description = undefined, subCategories }]) => ( ( ))} @@ -200,7 +198,7 @@ function CollectionPreferenceItem({ 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; // Minimal doc link mapping - const docHref: string | undefined = (() => { + const documentHref: string | undefined = (() => { if (name === 'sp7_scope_table_picklists') return DOCS.picklists; if (name === 'attachment.is_public_default') return DOCS.attachments; if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) @@ -234,7 +232,7 @@ function CollectionPreferenceItem({ />

- {(item.description !== undefined || docHref) && ( + {(item.description !== undefined || documentHref) && (

{item.description !== undefined && ( )} - {docHref && ( + {documentHref && ( <> {item.description ? ' ' : null} - + {headerText.documentation()} @@ -261,7 +259,7 @@ function CollectionPreferenceItem({ } + definition={item} item={name} subcategory={subcategory} value={value} From b59b33eaa2fe31a34995c1ab1c8bd64ba8a389a3 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 6 Oct 2025 17:17:11 -0400 Subject: [PATCH 036/115] Refactor collection preferences renderer and documentation link layout --- .../Preferences/CollectionPreferencesPage.tsx | 314 ------------------ .../lib/components/Preferences/Editor.tsx | 5 +- .../lib/components/Preferences/index.tsx | 170 ++++++++-- .../js_src/lib/components/Router/Routes.tsx | 2 +- 4 files changed, 140 insertions(+), 351 deletions(-) delete mode 100644 specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx deleted file mode 100644 index d5458ca9dd5..00000000000 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionPreferencesPage.tsx +++ /dev/null @@ -1,314 +0,0 @@ -/** - * Edit collection preferences - */ - -import React from 'react'; -import type { LocalizedString } from 'typesafe-i18n'; - -import { usePromise } from '../../hooks/useAsyncState'; -import { commonText } from '../../localization/common'; -import { headerText } from '../../localization/header'; -import { preferencesText } from '../../localization/preferences'; -import { StringToJsx } from '../../localization/utils'; -import { f } from '../../utils/functools'; -import { Container, Key } from '../Atoms'; -import { Button } from '../Atoms/Button'; -import { className } from '../Atoms/className'; -import { Link } from '../Atoms/Link'; -import { ReadOnlyContext } from '../Core/Contexts'; -import { ErrorBoundary } from '../Errors/ErrorBoundary'; -import { hasPermission } from '../Permissions/helpers'; -import { ProtectedTool } from '../Permissions/PermissionDenied'; -import { collectionPreferenceDefinitions } from './CollectionDefinitions'; -import { collectionPreferences } from './collectionPreferences'; -import { DefaultPreferenceItemRender } from './Renderers'; -import type { GenericPreferences, PreferenceItem } from './types'; - -const preferencesPromise = Promise.all([collectionPreferences.fetch()]).then( - f.true -); - -const DOCS = { - picklists: - 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', - attachments: - 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', - trees: - 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', - stats: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - specifyNetwork: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', - catalogNumbers: - 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859', -} as const; - -export function useCollectionPrefDefinitions() { - const visibilityContext = React.useMemo( - () => ({ isDarkMode: false, isRedirecting: false }), - [] - ); - return React.useMemo( - () => - Object.entries(collectionPreferenceDefinitions as GenericPreferences) - .map( - ([category, { subCategories, ...categoryData }]) => - [ - category, - { - ...categoryData, - subCategories: Object.entries(subCategories) - .map( - ([subCategory, { items, ...subCategoryData }]) => - [ - subCategory, - { - ...subCategoryData, - items: Object.entries(items).filter( - ([_name, { visible }]) => - typeof visible === 'function' - ? visible(visibilityContext) - : visible !== false - ), - }, - ] as const - ) - .filter(([_name, { items }]) => items.length > 0), - }, - ] as const - ) - .filter(([_name, { subCategories }]) => subCategories.length > 0), - [visibilityContext] - ); -} - -type ItemEntry = ReturnType< - typeof useCollectionPrefDefinitions ->[number][1]['subCategories'][number][1]['items'][number]; - -export function CollectionPreferencesContent(): JSX.Element { - const definitions = useCollectionPrefDefinitions(); - - return ( -

- {definitions.map( - ([category, { title, description = undefined, subCategories }]) => ( - - -

- {typeof title === 'function' ? title() : title} -

- - {description !== undefined && ( -

- {typeof description === 'function' - ? description() - : description} -

- )} - - {subCategories.map( - ([subcategory, { title, description: subDesc, items }]) => ( -
-
-

- {typeof title === 'function' ? title() : title} -

- -
- - items.forEach(([name]) => { - const def = collectionPreferences.definition( - category as never, - subcategory as never, - name as never - ); - collectionPreferences.set( - category as never, - subcategory as never, - name as never, - (def as { readonly defaultValue: unknown }) - .defaultValue as never - ); - }) - } - > - {commonText.reset()} - -
-
- - {subDesc !== undefined && ( -

- {typeof subDesc === 'function' ? subDesc() : subDesc} -

- )} - - {items.map((entry) => ( - - ))} -
- ) - )} -
-
- ) - )} -
- ); -} - -function CollectionPreferenceItem({ - category, - subcategory, - itemEntry, -}: { - readonly category: string; - readonly subcategory: string; - readonly itemEntry: ItemEntry; -}): JSX.Element { - const isReadOnly = React.useContext(ReadOnlyContext); - const [name, item] = itemEntry; - - const canEdit = - !isReadOnly && - (item.visible !== 'protected' || - hasPermission('/preferences/user', 'edit_protected')); - - const [value, setValue] = collectionPreferences.use( - category as never, - subcategory as never, - name as never - ); - - const Renderer = - 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; - - // Minimal doc link mapping - const documentHref: string | undefined = (() => { - if (name === 'sp7_scope_table_picklists') return DOCS.picklists; - if (name === 'attachment.is_public_default') return DOCS.attachments; - if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) - return DOCS.trees; - if (name === 'showPreparationsTotal' || name === 'refreshRate') - return DOCS.stats; - if (name === 'publishingOrganization' || name === 'collectionKey') - return DOCS.specifyNetwork; - if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; - return undefined; - })(); - - const wrapperProps = { - className: ` - flex items-start gap-2 md:flex-row flex-col - ${canEdit ? '' : '!cursor-not-allowed'} - `, - title: canEdit ? undefined : preferencesText.adminsOnlyPreference(), - } as const; - - const content = ( - <> -
-

- -

- - {(item.description !== undefined || documentHref) && ( -

- {item.description !== undefined && ( - - )} - {documentHref && ( - <> - {item.description ? ' ' : null} - - {headerText.documentation()} - - - )} -

- )} -
- -
- - - -
- - ); - - return 'container' in item && item.container === 'div' ? ( -
{content}
- ) : ( - - ); -} - -function FormatString({ - text, -}: { - readonly text: JSX.Element | LocalizedString; -}): JSX.Element { - return typeof text === 'object' ? ( - text - ) : text.includes('') ? ( - - {key}, - }} - string={text} - /> - - ) : ( - <>{text} - ); -} - -function CollectionPreferences(): JSX.Element { - return ( - -
- -
-
- ); -} - -export function CollectionPreferencesWrapper(): JSX.Element | null { - const [hasFetched] = usePromise(preferencesPromise, true); - return hasFetched === true ? : null; -} diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 45e3cbed8fb..601af11c2b5 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -6,7 +6,6 @@ import { PreferencesContent } from '../Preferences'; import { BasePreferences } from '../Preferences/BasePreferences'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; -import { CollectionPreferencesContent } from './CollectionPreferencesPage'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; @@ -72,7 +71,7 @@ export function CollectionPreferencesEditor({ return ( - + ); -} \ No newline at end of file +} diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 64faa2c0d8f..3244f3a3051 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -9,6 +9,7 @@ import type { LocalizedString } from 'typesafe-i18n'; import { usePromise } from '../../hooks/useAsyncState'; import { useBooleanState } from '../../hooks/useBooleanState'; import { commonText } from '../../localization/common'; +import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; @@ -22,6 +23,8 @@ import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { hasPermission } from '../Permissions/helpers'; import { PreferencesAside } from './Aside'; +import type { BasePreferences } from './BasePreferences'; +import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; import { useDarkMode } from './Hooks'; import { DefaultPreferenceItemRender } from './Renderers'; @@ -29,6 +32,59 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; +import { ProtectedTool } from '../Permissions/PermissionDenied'; + +const DOCS = { + picklists: + 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', + attachments: + 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', + trees: + 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', + stats: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + specifyNetwork: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', + catalogNumbers: + 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859', +} as const; + +const preferenceInstances = { + user: userPreferences as BasePreferences, + collection: collectionPreferences as BasePreferences, +} as const; + +const preferenceDefinitions = { + user: userPreferenceDefinitions as GenericPreferences, + collection: collectionPreferenceDefinitions as GenericPreferences, +} as const; + +const resolveCollectionDocHref = ( + category: string, + _subcategory: string, + name: string +): string | undefined => { + if (name === 'sp7_scope_table_picklists') return DOCS.picklists; + if (name === 'attachment.is_public_default') return DOCS.attachments; + if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) + return DOCS.trees; + if (name === 'showPreparationsTotal' || name === 'refreshRate') + return DOCS.stats; + if (name === 'publishingOrganization' || name === 'collectionKey') + return DOCS.specifyNetwork; + if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; + return undefined; +}; + +const docHrefResolvers = { + user: undefined, + collection: resolveCollectionDocHref, +} as const; + +export type PreferenceType = keyof typeof preferenceInstances; + +const collectionPreferencesPromise = Promise.all([ + collectionPreferences.fetch(), +]).then(f.true); /** * Fetch app resource that stores current user preferences @@ -110,10 +166,10 @@ function Preferences(): JSX.Element { } /** Hide invisible preferences. Remote empty categories and subCategories */ -export function usePrefDefinitions() { +export function usePrefDefinitions(prefType: PreferenceType = 'user') { const isDarkMode = useDarkMode(); const isRedirecting = React.useContext(userPreferences.Context) !== undefined; - const preferencesVisibilityContext = React.useMemo( + const userVisibilityContext = React.useMemo( () => ({ isDarkMode, isRedirecting, @@ -121,9 +177,19 @@ export function usePrefDefinitions() { [isDarkMode, isRedirecting] ); + const collectionVisibilityContext = React.useMemo( + () => ({ isDarkMode: false, isRedirecting: false }), + [] + ); + + const visibilityContext = + prefType === 'user' ? userVisibilityContext : collectionVisibilityContext; + + const definitions = preferenceDefinitions[prefType]; + return React.useMemo( () => - Object.entries(userPreferenceDefinitions as GenericPreferences) + Object.entries(definitions) .map( ([category, { subCategories, ...categoryData }]) => [ @@ -140,7 +206,7 @@ export function usePrefDefinitions() { items: Object.entries(items).filter( ([_name, { visible }]) => typeof visible === 'function' - ? visible(preferencesVisibilityContext) + ? visible(visibilityContext) : visible !== false ), }, @@ -151,17 +217,21 @@ export function usePrefDefinitions() { ] as const ) .filter(([_name, { subCategories }]) => subCategories.length > 0), - [preferencesVisibilityContext] + [definitions, visibilityContext] ); } export function PreferencesContent({ forwardRefs, + prefType = 'user', }: { readonly forwardRefs?: (index: number, element: HTMLElement | null) => void; + readonly prefType?: PreferenceType; }): JSX.Element { const isReadOnly = React.useContext(ReadOnlyContext); - const definitions = usePrefDefinitions(); + const definitions = usePrefDefinitions(prefType); + const preferences = preferenceInstances[prefType]; + const resolveDocHref = docHrefResolvers[prefType]; return (
{definitions.map( @@ -201,19 +271,16 @@ export function PreferencesContent({ items.forEach(([name]) => { - userPreferences.set( - category as 'general', - subcategory as 'ui', - name as 'theme', - /* - * Need to get default value via this - * function as defaults may be changed - */ - userPreferences.definition( - category as 'general', - subcategory as 'ui', - name as 'theme' - ).defaultValue + const definition = preferences.definition( + category as never, + subcategory as never, + name as never + ); + preferences.set( + category as never, + subcategory as never, + name as never, + definition.defaultValue as never ); }) } @@ -234,6 +301,9 @@ export function PreferencesContent({ !isReadOnly && (item.visible !== 'protected' || hasPermission('/preferences/user', 'edit_protected')); + const docHref = resolveDocHref?.(category, subcategory, name); + const stackDocumentation = + prefType === 'collection' && docHref !== undefined; const props = { className: ` flex items-start gap-2 md:flex-row flex-col @@ -261,15 +331,32 @@ export function PreferencesContent({ } />

- {item.description !== undefined && ( -

- + {(item.description !== undefined || + docHref !== undefined) && ( +

+ {item.description !== undefined && ( + + )} + {docHref !== undefined && ( + + {headerText.documentation()} + + )}

)}
@@ -284,6 +371,7 @@ export function PreferencesContent({ category={category} item={item} name={name} + preferences={preferences} subcategory={subcategory} /> @@ -333,19 +421,20 @@ function Item({ category, subcategory, name, + preferences, }: { readonly item: PreferenceItem; readonly category: string; readonly subcategory: string; readonly name: string; + readonly preferences: BasePreferences; }): JSX.Element { const Renderer = 'renderer' in item ? item.renderer : DefaultPreferenceItemRender; - const [value, setValue] = userPreferences.use( - // Asserting types just to simplify typing - category as 'general', - subcategory as 'ui', - name as 'theme' + const [value, setValue] = preferences.use( + category as never, + subcategory as never, + name as never ); const children = ( : null; } + +function CollectionPreferences(): JSX.Element { + return ( + +
+ +
+
+ ); +} + +export function CollectionPreferencesWrapper(): JSX.Element | null { + const [hasFetched] = usePromise(collectionPreferencesPromise, true); + return hasFetched === true ? : null; +} diff --git a/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx b/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx index 678636cbaac..5ddcf520692 100644 --- a/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx +++ b/specifyweb/frontend/js_src/lib/components/Router/Routes.tsx @@ -380,7 +380,7 @@ export const routes: RA = [ path: 'collection-preferences', title: preferencesText.collectionPreferences(), element: () => - import('../Preferences/CollectionPreferencesPage').then( + import('../Preferences').then( ({ CollectionPreferencesWrapper }) => CollectionPreferencesWrapper ), }, From b75ae777ae219476da8105a49aa1b771fea57250 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 6 Oct 2025 21:21:50 +0000 Subject: [PATCH 037/115] Lint code with ESLint and Prettier Triggered by 78c6e544302cc9a05cc53aece3e7c53295e17944 on branch refs/heads/issue-7440 --- .../Preferences/CollectionDefinitions.tsx | 4 ++- .../lib/components/Preferences/Editor.tsx | 14 +++++---- .../lib/components/Preferences/index.tsx | 30 ++++++++++++------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 762cea9723c..ef96f818cc1 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -117,7 +117,9 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Storage': definePref({ - title: localized('Allow children under synonymized Storage nodes'), + title: localized( + 'Allow children under synonymized Storage nodes' + ), requiresReload: false, visible: true, defaultValue: false, diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 601af11c2b5..5a761caa2b2 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -49,7 +49,7 @@ export function CollectionPreferencesEditor({ }: AppResourceTabProps): JSX.Element { const [preferencesInstance] = useLiveState( React.useCallback(() => { - const tmpCollectionPrefs = new BasePreferences({ + const temporaryCollectionPrefs = new BasePreferences({ definitions: collectionPreferenceDefinitions, values: { resourceName: 'CollectionPreferences', @@ -57,14 +57,16 @@ export function CollectionPreferencesEditor({ }, defaultValues: undefined, developmentGlobal: '_editingCollectionPreferences', - syncChanges: false, + syncChanges: false, }); - tmpCollectionPrefs.setRaw(JSON.parse(!data || data.length === 0 ? '{}' : data)); - tmpCollectionPrefs.events.on('update', () => - onChange(JSON.stringify(tmpCollectionPrefs.getRaw())) + temporaryCollectionPrefs.setRaw( + JSON.parse(!data || data.length === 0 ? '{}' : data) + ); + temporaryCollectionPrefs.events.on('update', () => + onChange(JSON.stringify(temporaryCollectionPrefs.getRaw())) ); - return tmpCollectionPrefs; + return temporaryCollectionPrefs; }, [data, onChange]) ); const Context = collectionPreferences.Context; diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 3244f3a3051..8c127b5c940 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -22,6 +22,7 @@ import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { hasPermission } from '../Permissions/helpers'; +import { ProtectedTool } from '../Permissions/PermissionDenied'; import { PreferencesAside } from './Aside'; import type { BasePreferences } from './BasePreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; @@ -32,7 +33,6 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; -import { ProtectedTool } from '../Permissions/PermissionDenied'; const DOCS = { picklists: @@ -58,7 +58,7 @@ const preferenceDefinitions = { collection: collectionPreferenceDefinitions as GenericPreferences, } as const; -const resolveCollectionDocHref = ( +const resolveCollectionDocumentHref = ( category: string, _subcategory: string, name: string @@ -75,9 +75,9 @@ const resolveCollectionDocHref = ( return undefined; }; -const docHrefResolvers = { +const documentHrefResolvers = { user: undefined, - collection: resolveCollectionDocHref, + collection: resolveCollectionDocumentHref, } as const; export type PreferenceType = keyof typeof preferenceInstances; @@ -231,7 +231,7 @@ export function PreferencesContent({ const isReadOnly = React.useContext(ReadOnlyContext); const definitions = usePrefDefinitions(prefType); const preferences = preferenceInstances[prefType]; - const resolveDocHref = docHrefResolvers[prefType]; + const resolveDocumentHref = documentHrefResolvers[prefType]; return (
{definitions.map( @@ -301,9 +301,13 @@ export function PreferencesContent({ !isReadOnly && (item.visible !== 'protected' || hasPermission('/preferences/user', 'edit_protected')); - const docHref = resolveDocHref?.(category, subcategory, name); + const documentHref = resolveDocumentHref?.( + category, + subcategory, + name + ); const stackDocumentation = - prefType === 'collection' && docHref !== undefined; + prefType === 'collection' && documentHref !== undefined; const props = { className: ` flex items-start gap-2 md:flex-row flex-col @@ -332,7 +336,7 @@ export function PreferencesContent({ />

{(item.description !== undefined || - docHref !== undefined) && ( + documentHref !== undefined) && (

)} - {docHref !== undefined && ( + {documentHref !== undefined && ( {headerText.documentation()} From 2beb3193963c45c3a3c04e1a48eb982ec4226169 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 6 Oct 2025 18:22:00 -0400 Subject: [PATCH 038/115] Localization cleanup for collection preferences --- .../Preferences/CollectionDefinitions.tsx | 71 +- .../js_src/lib/localization/attachments.ts | 1088 +++--- .../js_src/lib/localization/preferences.ts | 3355 ++++++++--------- .../js_src/lib/localization/specifyNetwork.ts | 318 +- .../js_src/lib/localization/stats.tsx | 15 + .../frontend/js_src/lib/localization/tree.ts | 1121 +++--- 6 files changed, 3032 insertions(+), 2936 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index ef96f818cc1..04b5dc5066e 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -6,24 +6,25 @@ import { attachmentsText } from '../../localization/attachments'; import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; import { specifyNetworkText } from '../../localization/specifyNetwork'; +import { treeText } from '../../localization/tree'; import { statsText } from '../../localization/stats'; import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; -import { ensure, localized } from '../../utils/types'; +import { ensure } from '../../utils/types'; import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; const specifyNetworkItems = { publishingOrganization: definePref({ - title: localized('Publishing organization key'), + title: specifyNetworkText.publishingOrganizationKey(), requiresReload: false, visible: true, defaultValue: undefined, type: 'java.lang.String', }), collectionKey: definePref({ - title: localized('Collection key'), + title: specifyNetworkText.collectionKey(), requiresReload: false, visible: true, defaultValue: undefined, @@ -39,10 +40,8 @@ export const collectionPreferenceDefinitions = { title: preferencesText.filterPickLists(), items: { sp7_scope_table_picklists: definePref({ - title: localized('Scope "Entire Table" picklists'), - description: localized( - 'Restrict "Entire Table" picklists to values used by records in this collection.' - ), + title: preferencesText.scopeEntireTablePicklists(), + description: preferencesText.scopeEntireTablePicklistsDescription(), requiresReload: false, visible: true, defaultValue: false, @@ -54,10 +53,8 @@ export const collectionPreferenceDefinitions = { title: attachmentsText.attachments(), items: { 'attachment.is_public_default': definePref({ - title: localized('New attachments are public'), - description: localized( - 'Set the default visibility for attachments created within this collection.' - ), + title: attachmentsText.publicDefault(), + description: attachmentsText.publicDefaultDescription(), requiresReload: false, visible: true, defaultValue: false, @@ -69,19 +66,15 @@ export const collectionPreferenceDefinitions = { }, treeManagement: { - title: localized('Tree management'), + title: treeText.treeManagement(), subCategories: { synonymized: { - title: localized('Synonymized nodes'), - description: localized( - 'Allow creating children under synonymized nodes in specific trees.' - ), + title: treeText.synonymizedNodes(), + description: treeText.synonymizedNodesDescription(), items: { 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': definePref({ - title: localized( - 'Allow children under synonymized Geologic Time Period nodes' - ), + title: treeText.allowSynonymizedGeologicTimePeriodChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -89,7 +82,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Taxon': definePref({ - title: localized('Allow children under synonymized Taxon nodes'), + title: treeText.allowSynonymizedTaxonChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -97,9 +90,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Geography': definePref({ - title: localized( - 'Allow children under synonymized Geography nodes' - ), + title: treeText.allowSynonymizedGeographyChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -107,9 +98,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': definePref({ - title: localized( - 'Allow children under synonymized Lithostratigraphy nodes' - ), + title: treeText.allowSynonymizedLithostratChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -117,9 +106,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Storage': definePref({ - title: localized( - 'Allow children under synonymized Storage nodes' - ), + title: treeText.allowSynonymizedStorageChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -127,9 +114,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': definePref({ - title: localized( - 'Allow children under synonymized Tectonic Unit nodes' - ), + title: treeText.allowSynonymizedTectonicUnitChildren(), requiresReload: false, visible: true, defaultValue: false, @@ -171,7 +156,7 @@ export const collectionPreferenceDefinitions = { title: preferencesText.appearance(), items: { layout: definePref | undefined>({ - title: localized('_Defines the layout of the stats page'), + title: statsText.layoutPreference(), requiresReload: false, visible: false, defaultValue: undefined, @@ -179,20 +164,16 @@ export const collectionPreferenceDefinitions = { container: 'label', }), showPreparationsTotal: definePref({ - title: localized('Show preparation totals'), - description: localized( - 'Include an overall total across preparation types on the statistics page.' - ), + title: statsText.showPreparationsTotal(), + description: statsText.showPreparationsTotalDescription(), requiresReload: false, visible: true, defaultValue: true, type: 'java.lang.Boolean', }), refreshRate: definePref({ - title: localized('Auto-refresh rate (hours)'), - description: localized( - 'Specify how frequently shared statistics refresh their data.' - ), + title: statsText.autoRefreshRate(), + description: statsText.autoRefreshRateDescription(), requiresReload: false, visible: true, defaultValue: 24, @@ -209,9 +190,7 @@ export const collectionPreferenceDefinitions = { catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), - description: localized( - 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.' - ), + description: preferencesText.catalogNumberInheritanceDescription(), subCategories: { behavior: { title: preferencesText.behavior(), @@ -230,9 +209,7 @@ export const collectionPreferenceDefinitions = { catalogNumberParentInheritance: { title: queryText.catalogNumberParentCOInheritance(), - description: localized( - 'Control whether component records inherit catalog numbers from their parent Collection Object.' - ), + description: preferencesText.catalogNumberParentInheritanceDescription(), subCategories: { behavior: { title: preferencesText.behavior(), diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index 349ce1d3c25..59133101931 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -4,689 +4,695 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const attachmentsText = createDictionary({ attachments: { - "en-us": "Attachments", - "ru-ru": "Вложения", - "es-es": "Adjuntos", - "fr-fr": "Pièces jointes", - "uk-ua": "Прикріплення", - "de-ch": "Anhänge", - "pt-br": "Anexos", + 'en-us': 'Attachments', + 'ru-ru': 'Вложения', + 'es-es': 'Adjuntos', + 'fr-fr': 'Pièces jointes', + 'uk-ua': 'Прикріплення', + 'de-ch': 'Anhänge', + 'pt-br': 'Anexos', }, scale: { - "en-us": "Scale", - "ru-ru": "Масштаб", - "es-es": "Escala", - "fr-fr": "Échelle", - "uk-ua": "масштаб", - "de-ch": "Massstab", - "pt-br": "Escala", + 'en-us': 'Scale', + 'ru-ru': 'Масштаб', + 'es-es': 'Escala', + 'fr-fr': 'Échelle', + 'uk-ua': 'масштаб', + 'de-ch': 'Massstab', + 'pt-br': 'Escala', }, attachmentServerUnavailable: { - "en-us": "Attachment server unavailable", - "ru-ru": "Сервер прикрепленных файлов недоступен", - "es-es": "Servidor de adjuntos no disponible", - "fr-fr": "Serveur de pièces jointes indisponible", - "uk-ua": "Сервер прикріплень недоступний", - "de-ch": "Attachment-Server nicht verfügbar", - "pt-br": "Servidor de anexos indisponível", + 'en-us': 'Attachment server unavailable', + 'ru-ru': 'Сервер прикрепленных файлов недоступен', + 'es-es': 'Servidor de adjuntos no disponible', + 'fr-fr': 'Serveur de pièces jointes indisponible', + 'uk-ua': 'Сервер прикріплень недоступний', + 'de-ch': 'Attachment-Server nicht verfügbar', + 'pt-br': 'Servidor de anexos indisponível', }, attachmentServerUnavailableDescription: { - "en-us": "Setup your attachment server", - "es-es": "Configura tu servidor de adjuntos", - "fr-fr": "Configurez votre serveur de pièces jointes", - "ru-ru": "Настройте сервер вложений", - "uk-ua": "Налаштуйте сервер прикріплень", - "de-ch": "Richten Sie Ihren Attachment-Server ein", - "pt-br": "Configure seu servidor de anexos", + 'en-us': 'Setup your attachment server', + 'es-es': 'Configura tu servidor de adjuntos', + 'fr-fr': 'Configurez votre serveur de pièces jointes', + 'ru-ru': 'Настройте сервер вложений', + 'uk-ua': 'Налаштуйте сервер прикріплень', + 'de-ch': 'Richten Sie Ihren Attachment-Server ein', + 'pt-br': 'Configure seu servidor de anexos', }, orderBy: { - "en-us": "Order By", - "ru-ru": "Сортировать по", - "es-es": "Ordenar por", - "fr-fr": "Trier par", - "uk-ua": "Сортувати по", - "de-ch": "Sortiere nach", - "pt-br": "Ordenar por", + 'en-us': 'Order By', + 'ru-ru': 'Сортировать по', + 'es-es': 'Ordenar por', + 'fr-fr': 'Trier par', + 'uk-ua': 'Сортувати по', + 'de-ch': 'Sortiere nach', + 'pt-br': 'Ordenar por', }, uploadingInline: { - "en-us": "Uploading…", - "ru-ru": "Закачивание…", - "es-es": "Subiendo…", - "fr-fr": "Envoi en cours…", - "uk-ua": "Завантаження…", - "de-ch": "Am Hochladen…", - "pt-br": "Enviando…", + 'en-us': 'Uploading…', + 'ru-ru': 'Закачивание…', + 'es-es': 'Subiendo…', + 'fr-fr': 'Envoi en cours…', + 'uk-ua': 'Завантаження…', + 'de-ch': 'Am Hochladen…', + 'pt-br': 'Enviando…', }, noAttachments: { - "en-us": "There are no attachments", - "ru-ru": "В вашей коллекции нет вложений", - "es-es": "No hay adjuntos", - "fr-fr": "Il n'y a pas de pièces jointes", - "uk-ua": "Прикріплень нема", - "de-ch": "Es gibt keine Anhänge", - "pt-br": "Não há anexos", + 'en-us': 'There are no attachments', + 'ru-ru': 'В вашей коллекции нет вложений', + 'es-es': 'No hay adjuntos', + 'fr-fr': "Il n'y a pas de pièces jointes", + 'uk-ua': 'Прикріплень нема', + 'de-ch': 'Es gibt keine Anhänge', + 'pt-br': 'Não há anexos', }, unableToFindRelatedRecord: { - "en-us": "Unable to find related record", - "es-es": "No se puede encontrar el registro relacionado", - "fr-fr": "Impossible de trouver l'enregistrement lié", - "ru-ru": "Не удалось найти связанную запись", - "uk-ua": "Неможливо знайти відповідний запис", - "de-ch": "Verknüpfter Datensatz kann nicht gefunden werden", - "pt-br": "Não foi possível encontrar o registro relacionado", + 'en-us': 'Unable to find related record', + 'es-es': 'No se puede encontrar el registro relacionado', + 'fr-fr': "Impossible de trouver l'enregistrement lié", + 'ru-ru': 'Не удалось найти связанную запись', + 'uk-ua': 'Неможливо знайти відповідний запис', + 'de-ch': 'Verknüpfter Datensatz kann nicht gefunden werden', + 'pt-br': 'Não foi possível encontrar o registro relacionado', }, unableToFindRelatedRecordDescription: { - "en-us": "Unable to find a record that this attachment is related to.", - "es-es": - "No se puede encontrar un registro con el que esté relacionado este adjunto.", - "fr-fr": - "Impossible de trouver un enregistrement auquel cette pièce jointe est liée.", - "ru-ru": "Не удалось найти запись, к которой относится это вложение.", - "uk-ua": "Не вдалося знайти запис, до якого відноситься це вкладення.", - "de-ch": - "Es konnte kein Datensatz gefunden werden, auf den sich dieser Anhang bezieht.", - "pt-br": - "Não foi possível encontrar um registro ao qual este anexo esteja relacionado.", + 'en-us': 'Unable to find a record that this attachment is related to.', + 'es-es': + 'No se puede encontrar un registro con el que esté relacionado este adjunto.', + 'fr-fr': + 'Impossible de trouver un enregistrement auquel cette pièce jointe est liée.', + 'ru-ru': 'Не удалось найти запись, к которой относится это вложение.', + 'uk-ua': 'Не вдалося знайти запис, до якого відноситься це вкладення.', + 'de-ch': + 'Es konnte kein Datensatz gefunden werden, auf den sich dieser Anhang bezieht.', + 'pt-br': + 'Não foi possível encontrar um registro ao qual este anexo esteja relacionado.', }, showForm: { - "en-us": "Show Form", - "es-es": "Mostrar formulario", - "fr-fr": "Afficher le formulaire", - "ru-ru": "Показать форму", - "uk-ua": "Показати форму", - "de-ch": "Formular anzeigen", - "pt-br": "Mostrar formulário", + 'en-us': 'Show Form', + 'es-es': 'Mostrar formulario', + 'fr-fr': 'Afficher le formulaire', + 'ru-ru': 'Показать форму', + 'uk-ua': 'Показати форму', + 'de-ch': 'Formular anzeigen', + 'pt-br': 'Mostrar formulário', }, multipleFilesSelected: { - "en-us": "Multiple files selected", - "de-ch": "Mehrere Dateien ausgewählt", - "es-es": "Varios archivos seleccionados", - "fr-fr": "Plusieurs fichiers sélectionnés", - "ru-ru": "Выбрано несколько файлов", - "uk-ua": "Вибрано декілька файлів", - "pt-br": "Vários arquivos selecionados", + 'en-us': 'Multiple files selected', + 'de-ch': 'Mehrere Dateien ausgewählt', + 'es-es': 'Varios archivos seleccionados', + 'fr-fr': 'Plusieurs fichiers sélectionnés', + 'ru-ru': 'Выбрано несколько файлов', + 'uk-ua': 'Вибрано декілька файлів', + 'pt-br': 'Vários arquivos selecionados', }, fileSize: { - "en-us": "File Size", - "de-ch": "Dateigröße", - "es-es": "Tamaño del archivo", - "fr-fr": "Taille du fichier", - "ru-ru": "Размер файла", - "uk-ua": "Розмір файлу", - "pt-br": "Tamanho do arquivo", + 'en-us': 'File Size', + 'de-ch': 'Dateigröße', + 'es-es': 'Tamaño del archivo', + 'fr-fr': 'Taille du fichier', + 'ru-ru': 'Размер файла', + 'uk-ua': 'Розмір файлу', + 'pt-br': 'Tamanho do arquivo', }, deleted: { - "en-us": "Deleted", - "de-ch": "Gelöscht", - "es-es": "Eliminado", - "fr-fr": "Supprimé", - "ru-ru": "Удалено", - "uk-ua": "Видалено", - "pt-br": "Excluído", + 'en-us': 'Deleted', + 'de-ch': 'Gelöscht', + 'es-es': 'Eliminado', + 'fr-fr': 'Supprimé', + 'ru-ru': 'Удалено', + 'uk-ua': 'Видалено', + 'pt-br': 'Excluído', }, noFile: { - "en-us": "No File", - "de-ch": "Keine Datei", - "es-es": "Ningún archivo", - "fr-fr": "Pas de fichier", - "uk-ua": "Немає файлу", - "ru-ru": "Нет файла", - "pt-br": "Nenhum arquivo", + 'en-us': 'No File', + 'de-ch': 'Keine Datei', + 'es-es': 'Ningún archivo', + 'fr-fr': 'Pas de fichier', + 'uk-ua': 'Немає файлу', + 'ru-ru': 'Нет файла', + 'pt-br': 'Nenhum arquivo', }, pleaseReselectAllFiles: { - "en-us": "Please reselect all files before uploading.", - "de-ch": "Bitte wählen Sie vor dem Hochladen alle Dateien erneut aus.", - "es-es": - "Por favor, vuelva a seleccionar todos los archivos antes de cargarlos.", - "fr-fr": - "Veuillez resélectionner tous les fichiers avant de les télécharger.", - "ru-ru": "Пожалуйста, повторно выберите все файлы перед загрузкой.", - "uk-ua": "Перед завантаженням повторно виберіть усі файли.", - "pt-br": "Selecione novamente todos os arquivos antes de fazer o upload.", + 'en-us': 'Please reselect all files before uploading.', + 'de-ch': 'Bitte wählen Sie vor dem Hochladen alle Dateien erneut aus.', + 'es-es': + 'Por favor, vuelva a seleccionar todos los archivos antes de cargarlos.', + 'fr-fr': + 'Veuillez resélectionner tous les fichiers avant de les télécharger.', + 'ru-ru': 'Пожалуйста, повторно выберите все файлы перед загрузкой.', + 'uk-ua': 'Перед завантаженням повторно виберіть усі файли.', + 'pt-br': 'Selecione novamente todos os arquivos antes de fazer o upload.', }, incorrectFormatter: { - "en-us": "Incorrectly Formatted", - "de-ch": "Falsch formatiert", - "es-es": "Formateado incorrectamente", - "fr-fr": "Incorrectement formaté", - "ru-ru": "Неправильно отформатировано", - "uk-ua": "Неправильно відформатований", - "pt-br": "Formatado incorretamente", + 'en-us': 'Incorrectly Formatted', + 'de-ch': 'Falsch formatiert', + 'es-es': 'Formateado incorrectamente', + 'fr-fr': 'Incorrectement formaté', + 'ru-ru': 'Неправильно отформатировано', + 'uk-ua': 'Неправильно відформатований', + 'pt-br': 'Formatado incorretamente', }, alreadyUploaded: { - "en-us": "Already Uploaded", - "de-ch": "Bereits hochgeladen", - "es-es": "Ya se ha cargado", - "fr-fr": "Déjà téléchargé", - "ru-ru": "Уже загружено", - "uk-ua": "Вже завантажено", - "pt-br": "Já carregado", + 'en-us': 'Already Uploaded', + 'de-ch': 'Bereits hochgeladen', + 'es-es': 'Ya se ha cargado', + 'fr-fr': 'Déjà téléchargé', + 'ru-ru': 'Уже загружено', + 'uk-ua': 'Вже завантажено', + 'pt-br': 'Já carregado', }, skipped: { - "en-us": "Skipped", - "de-ch": "Übersprungen", - "es-es": "Omitido", - "fr-fr": "Sauté", - "ru-ru": "Пропущено", - "uk-ua": "Пропущено", - "pt-br": "Ignorado", + 'en-us': 'Skipped', + 'de-ch': 'Übersprungen', + 'es-es': 'Omitido', + 'fr-fr': 'Sauté', + 'ru-ru': 'Пропущено', + 'uk-ua': 'Пропущено', + 'pt-br': 'Ignorado', }, cancelled: { - "en-us": "Cancelled", - "de-ch": "Abgesagt", - "es-es": "Anulado", - "fr-fr": "Annulé", - "ru-ru": "Отменено", - "uk-ua": "Скасовано", - "pt-br": "Cancelado", + 'en-us': 'Cancelled', + 'de-ch': 'Abgesagt', + 'es-es': 'Anulado', + 'fr-fr': 'Annulé', + 'ru-ru': 'Отменено', + 'uk-ua': 'Скасовано', + 'pt-br': 'Cancelado', }, frontEndInterruption: { - "en-us": "{action:string} was in progress when interruption occurred", - "de-ch": "{action:string} war im Gange, als die Unterbrechung auftrat", - "es-es": - "{action:string} estaba en curso cuando se produjo la interrupción", - "fr-fr": + 'en-us': '{action:string} was in progress when interruption occurred', + 'de-ch': '{action:string} war im Gange, als die Unterbrechung auftrat', + 'es-es': + '{action:string} estaba en curso cuando se produjo la interrupción', + 'fr-fr': "{action:string} était en cours lorsque l'interruption s'est produite", - "ru-ru": - "{action:string} был в процессе выполнения, когда произошло прерывание", - "uk-ua": "Виконувався {action:string}, коли сталася перерва", - "pt-br": "{action:string} estava em andamento quando a interrupção ocorreu", + 'ru-ru': + '{action:string} был в процессе выполнения, когда произошло прерывание', + 'uk-ua': 'Виконувався {action:string}, коли сталася перерва', + 'pt-br': '{action:string} estava em andamento quando a interrupção ocorreu', }, matchError: { - "en-us": "Match Error", - "de-ch": "Übereinstimmungsfehler", - "es-es": "Error de coincidencia", - "fr-fr": "Erreur de correspondance", - "ru-ru": "Ошибка соответствия", - "uk-ua": "Помилка збігу", - "pt-br": "Erro de correspondência", + 'en-us': 'Match Error', + 'de-ch': 'Übereinstimmungsfehler', + 'es-es': 'Error de coincidencia', + 'fr-fr': 'Erreur de correspondance', + 'ru-ru': 'Ошибка соответствия', + 'uk-ua': 'Помилка збігу', + 'pt-br': 'Erro de correspondência', }, errorReadingFile: { - "en-us": "Error reading file", - "es-es": "Error al leer el archivo", - "fr-fr": "Erreur de lecture du fichier", - "ru-ru": "Ошибка чтения файла", - "de-ch": "Fehler beim Lesen der Datei", - "uk-ua": "Помилка читання файлу", - "pt-br": "Erro ao ler o arquivo", + 'en-us': 'Error reading file', + 'es-es': 'Error al leer el archivo', + 'fr-fr': 'Erreur de lecture du fichier', + 'ru-ru': 'Ошибка чтения файла', + 'de-ch': 'Fehler beim Lesen der Datei', + 'uk-ua': 'Помилка читання файлу', + 'pt-br': 'Erro ao ler o arquivo', }, unhandledFatalResourceError: { - "en-us": "Unhandled fatal resource error:", - "de-ch": "Nicht behandelter schwerwiegender Ressourcenfehler:", - "es-es": "Error de recurso fatal no controlado:", - "fr-fr": "Erreur de ressource fatale non gérée :", - "ru-ru": "Необработанная фатальная ошибка ресурса:", - "uk-ua": "Необроблена критична помилка ресурсу:", - "pt-br": "Erro fatal de recurso não tratado:", + 'en-us': 'Unhandled fatal resource error:', + 'de-ch': 'Nicht behandelter schwerwiegender Ressourcenfehler:', + 'es-es': 'Error de recurso fatal no controlado:', + 'fr-fr': 'Erreur de ressource fatale non gérée :', + 'ru-ru': 'Необработанная фатальная ошибка ресурса:', + 'uk-ua': 'Необроблена критична помилка ресурсу:', + 'pt-br': 'Erro fatal de recurso não tratado:', }, attachmentImportDatasetsCount: { - "en-us": "Attachment Import Data Sets ({count:number})", - "de-ch": "Anhänge-Importdatensätze ({count:number})", - "es-es": "Adjuntar el conjuntos de datos de importación ({count:number})", - "fr-fr": "Import d'un jeu de données de pièces jointes ({count:number})", - "ru-ru": "Наборы данных импорта вложений ({count:number})", - "uk-ua": "Набори даних імпорту вкладених файлів ({count:number})", - "pt-br": "Conjuntos de dados de importação de anexos ({count:number})", + 'en-us': 'Attachment Import Data Sets ({count:number})', + 'de-ch': 'Anhänge-Importdatensätze ({count:number})', + 'es-es': 'Adjuntar el conjuntos de datos de importación ({count:number})', + 'fr-fr': "Import d'un jeu de données de pièces jointes ({count:number})", + 'ru-ru': 'Наборы данных импорта вложений ({count:number})', + 'uk-ua': 'Набори даних імпорту вкладених файлів ({count:number})', + 'pt-br': 'Conjuntos de dados de importação de anexos ({count:number})', }, newAttachmentDataset: { - "en-us": "New Attachment Data Set {date: string}", - "de-ch": "Neuer Anhangsdatensatz {date: string}", - "es-es": "Nuevo conjunto de datos adjuntos {date: string}", - "fr-fr": "Nouveau jeu de données de pièces jointes {date: string}", - "ru-ru": "Новый набор данных о вложениях {дата: строка}", - "uk-ua": "Новий набір даних вкладень {date: string}", - "pt-br": "Novo conjunto de dados de anexo {data: string}", + 'en-us': 'New Attachment Data Set {date: string}', + 'de-ch': 'Neuer Anhangsdatensatz {date: string}', + 'es-es': 'Nuevo conjunto de datos adjuntos {date: string}', + 'fr-fr': 'Nouveau jeu de données de pièces jointes {date: string}', + 'ru-ru': 'Новый набор данных о вложениях {дата: строка}', + 'uk-ua': 'Новий набір даних вкладень {date: string}', + 'pt-br': 'Novo conjunto de dados de anexo {data: string}', }, newAttachmentDatasetBase: { - "en-us": "New Attachment Data Set", - "de-ch": "Neuer Anhangsdatensatz", - "es-es": "Nuevo conjunto de datos adjuntos", - "uk-ua": "Новий набір даних вкладення", - "fr-fr": "Nouveau jeu de données de pièces jointes", - "ru-ru": "Новый набор данных о вложениях", - "pt-br": "Novo conjunto de dados de anexo", + 'en-us': 'New Attachment Data Set', + 'de-ch': 'Neuer Anhangsdatensatz', + 'es-es': 'Nuevo conjunto de datos adjuntos', + 'uk-ua': 'Новий набір даних вкладення', + 'fr-fr': 'Nouveau jeu de données de pièces jointes', + 'ru-ru': 'Новый набор данных о вложениях', + 'pt-br': 'Novo conjunto de dados de anexo', }, uploadInterrupted: { - "en-us": "Upload Interrupted", - "de-ch": "Upload unterbrochen", - "es-es": "Carga interrumpida", - "fr-fr": "Téléchargement interrompu", - "ru-ru": "Загрузка прервана", - "uk-ua": "Завантаження перервано", - "pt-br": "Upload interrompido", + 'en-us': 'Upload Interrupted', + 'de-ch': 'Upload unterbrochen', + 'es-es': 'Carga interrumpida', + 'fr-fr': 'Téléchargement interrompu', + 'ru-ru': 'Загрузка прервана', + 'uk-ua': 'Завантаження перервано', + 'pt-br': 'Upload interrompido', }, uploadInterruptedDescription: { - "en-us": - "The upload was in progress when an interruption occurred. Some files may have been uploaded.", - "de-ch": - "Der Upload war im Gange, als es zu einer Unterbrechung kam. Möglicherweise wurden einige Dateien hochgeladen.", - "es-es": - "La carga estaba en curso cuando se produjo una interrupción. Es posible que se hayan cargado algunos archivos.", - "fr-fr": + 'en-us': + 'The upload was in progress when an interruption occurred. Some files may have been uploaded.', + 'de-ch': + 'Der Upload war im Gange, als es zu einer Unterbrechung kam. Möglicherweise wurden einige Dateien hochgeladen.', + 'es-es': + 'La carga estaba en curso cuando se produjo una interrupción. Es posible que se hayan cargado algunos archivos.', + 'fr-fr': "Le téléchargement était en cours lorsqu'une interruption s'est produite. Certains fichiers peuvent avoir été téléchargés.", - "ru-ru": - "Загрузка была прервана. Возможно, некоторые файлы уже были загружены.", - "uk-ua": - "Під час завантаження виникла перерва. Можливо, деякі файли було завантажено.", - "pt-br": - "O upload estava em andamento quando ocorreu uma interrupção. Alguns arquivos podem ter sido enviados.", + 'ru-ru': + 'Загрузка была прервана. Возможно, некоторые файлы уже были загружены.', + 'uk-ua': + 'Під час завантаження виникла перерва. Можливо, деякі файли було завантажено.', + 'pt-br': + 'O upload estava em andamento quando ocorreu uma interrupção. Alguns arquivos podem ter sido enviados.', }, rollbackInterrupted: { - "en-us": "Rollback Interrupted", - "de-ch": "Rollback unterbrochen", - "es-es": "Reversión interrumpida", - "fr-fr": "Retour en arrière interrompu", - "ru-ru": "Откат прерван", - "uk-ua": "Відкат перервано", - "pt-br": "Rollback interrompido", + 'en-us': 'Rollback Interrupted', + 'de-ch': 'Rollback unterbrochen', + 'es-es': 'Reversión interrumpida', + 'fr-fr': 'Retour en arrière interrompu', + 'ru-ru': 'Откат прерван', + 'uk-ua': 'Відкат перервано', + 'pt-br': 'Rollback interrompido', }, rollbackInterruptedDescription: { - "en-us": - "The rollback was in progress when an interruption occurred. Some files may have been deleted", - "de-ch": - "Das Rollback war im Gange, als eine Unterbrechung auftrat. Einige Dateien wurden möglicherweise gelöscht", - "fr-fr": + 'en-us': + 'The rollback was in progress when an interruption occurred. Some files may have been deleted', + 'de-ch': + 'Das Rollback war im Gange, als eine Unterbrechung auftrat. Einige Dateien wurden möglicherweise gelöscht', + 'fr-fr': "Le retour en arrière était en cours lorsqu'une interruption s'est produite. Certains fichiers peuvent avoir été supprimés", - "ru-ru": - "Откат выполнялся, когда произошло прерывание. Некоторые файлы могли быть удалены.", - "uk-ua": - "Тривав відкат, коли сталася перерва. Деякі файли могли бути видалені", - "es-es": - "La reversión estaba en curso cuando se produjo una interrupción. Es posible que se hayan eliminado algunos archivos.", - "pt-br": - "A reversão estava em andamento quando ocorreu uma interrupção. Alguns arquivos podem ter sido excluídos.", + 'ru-ru': + 'Откат выполнялся, когда произошло прерывание. Некоторые файлы могли быть удалены.', + 'uk-ua': + 'Тривав відкат, коли сталася перерва. Деякі файли могли бути видалені', + 'es-es': + 'La reversión estaba en curso cuando se produjo una interrupción. Es posible que se hayan eliminado algunos archivos.', + 'pt-br': + 'A reversão estava em andamento quando ocorreu uma interrupção. Alguns arquivos podem ter sido excluídos.', }, attachmentId: { - "en-us": "Attachment ID", - "de-ch": "Anhangs-ID", - "es-es": "ID del archivo adjunto", - "fr-fr": "ID de la pièce jointe", - "ru-ru": "Идентификатор вложения", - "uk-ua": "ID вкладення", - "pt-br": "ID do anexo", + 'en-us': 'Attachment ID', + 'de-ch': 'Anhangs-ID', + 'es-es': 'ID del archivo adjunto', + 'fr-fr': 'ID de la pièce jointe', + 'ru-ru': 'Идентификатор вложения', + 'uk-ua': 'ID вкладення', + 'pt-br': 'ID do anexo', }, choosePath: { - "en-us": "Choose Path", - "de-ch": "Pfad wählen", - "es-es": "Seleccione la ruta", - "fr-fr": "Choisir le chemin", - "ru-ru": "Выбрать путь", - "uk-ua": "Виберіть шлях", - "pt-br": "Escolha o caminho", + 'en-us': 'Choose Path', + 'de-ch': 'Pfad wählen', + 'es-es': 'Seleccione la ruta', + 'fr-fr': 'Choisir le chemin', + 'ru-ru': 'Выбрать путь', + 'uk-ua': 'Виберіть шлях', + 'pt-br': 'Escolha o caminho', }, beginAttachmentUpload: { - "en-us": "Begin Attachment Upload?", - "de-ch": "Mit dem Hochladen des Anhangs beginnen?", - "es-es": "¿Comenzar a cargar archivos adjuntos?", - "fr-fr": "Commencer le téléchargement des pièces jointes ?", - "ru-ru": "Начать загрузку вложения?", - "uk-ua": "Почати завантаження вкладених файлів?", - "pt-br": "Iniciar upload de anexo?", + 'en-us': 'Begin Attachment Upload?', + 'de-ch': 'Mit dem Hochladen des Anhangs beginnen?', + 'es-es': '¿Comenzar a cargar archivos adjuntos?', + 'fr-fr': 'Commencer le téléchargement des pièces jointes ?', + 'ru-ru': 'Начать загрузку вложения?', + 'uk-ua': 'Почати завантаження вкладених файлів?', + 'pt-br': 'Iniciar upload de anexo?', }, beginUploadDescription: { - "en-us": - "Uploading the attachments will make attachments in the asset server and in the Specify database", - "de-ch": - "Durch das Hochladen der Anhänge werden Anhänge im Asset-Server und in der Specify-Datenbank erstellt.", - "es-es": "Interrumpido. Reintentando en [X25X]", - "fr-fr": + 'en-us': + 'Uploading the attachments will make attachments in the asset server and in the Specify database', + 'de-ch': + 'Durch das Hochladen der Anhänge werden Anhänge im Asset-Server und in der Specify-Datenbank erstellt.', + 'es-es': 'Interrumpido. Reintentando en [X25X]', + 'fr-fr': "Le téléchargement des pièces jointes créera des pièces jointes dans le serveur d'actifs et dans la base de données de spécification", - "ru-ru": - "Загрузка вложений создаст вложения на сервере активов и в базе данных Specify.", - "uk-ua": - "Завантаження вкладень призведе до створення вкладень на сервері активів і в базі даних Specify", - "pt-br": - "O upload dos anexos fará com que os anexos sejam criados no servidor de ativos e no banco de dados do Specify", + 'ru-ru': + 'Загрузка вложений создаст вложения на сервере активов и в базе данных Specify.', + 'uk-ua': + 'Завантаження вкладень призведе до створення вкладень на сервері активів і в базі даних Specify', + 'pt-br': + 'O upload dos anexos fará com que os anexos sejam criados no servidor de ativos e no banco de dados do Specify', }, interrupted: { - "en-us": "Interrupted", - "de-ch": "Unterbrochen", - "es-es": "interrumpido", - "fr-fr": "Interrompu", - "ru-ru": "Прерванный", - "uk-ua": "Перерваний", - "pt-br": "Interrompido", + 'en-us': 'Interrupted', + 'de-ch': 'Unterbrochen', + 'es-es': 'interrumpido', + 'fr-fr': 'Interrompu', + 'ru-ru': 'Прерванный', + 'uk-ua': 'Перерваний', + 'pt-br': 'Interrompido', }, tryNow: { - "en-us": "Try Now", - "de-ch": "Jetzt testen", - "es-es": "Probar ahora", - "fr-fr": "Essayez maintenant", - "ru-ru": "Попробуйте сейчас", - "uk-ua": "Спробуйте зараз", - "pt-br": "Experimente agora", + 'en-us': 'Try Now', + 'de-ch': 'Jetzt testen', + 'es-es': 'Probar ahora', + 'fr-fr': 'Essayez maintenant', + 'ru-ru': 'Попробуйте сейчас', + 'uk-ua': 'Спробуйте зараз', + 'pt-br': 'Experimente agora', }, interruptedTime: { - "en-us": "Interrupted. Retrying in {remainingTime:string}", - "de-ch": "Unterbrochen. Erneuter Versuch in {remainingTime:string}", - "es-es": "Interrumpido. Reintentando en {remainingTime:string}", - "fr-fr": "Interrompu. Réessayer dans {remainingTime:string}", - "ru-ru": "Прервано. Повторная попытка через {remainingTime:string}", - "uk-ua": "Перерваний. Повторна спроба через {remainingTime:string}", - "pt-br": "Interrompido. Tentando novamente em {remainingTime:string}", + 'en-us': 'Interrupted. Retrying in {remainingTime:string}', + 'de-ch': 'Unterbrochen. Erneuter Versuch in {remainingTime:string}', + 'es-es': 'Interrumpido. Reintentando en {remainingTime:string}', + 'fr-fr': 'Interrompu. Réessayer dans {remainingTime:string}', + 'ru-ru': 'Прервано. Повторная попытка через {remainingTime:string}', + 'uk-ua': 'Перерваний. Повторна спроба через {remainingTime:string}', + 'pt-br': 'Interrompido. Tentando novamente em {remainingTime:string}', }, rollbackDescription: { - "en-us": - "Rollback will delete the attachments from the Specify database and Asset Server", - "de-ch": - "Rollback löscht die Anhänge aus der Datenbank und dem Asset Server", - "es-es": - "La reversión eliminará los archivos adjuntos de la base de datos Specify y del servidor de activos.", - "fr-fr": + 'en-us': + 'Rollback will delete the attachments from the Specify database and Asset Server', + 'de-ch': + 'Rollback löscht die Anhänge aus der Datenbank und dem Asset Server', + 'es-es': + 'La reversión eliminará los archivos adjuntos de la base de datos Specify y del servidor de activos.', + 'fr-fr': "La restauration supprimera les pièces jointes de la base de données spécifiée et du serveur d'actifs.", - "ru-ru": - "Откат приведет к удалению вложений из базы данных Specify и сервера Asset.", - "uk-ua": - "Відкат видалить вкладення з бази даних Specify і сервера ресурсів", - "pt-br": - "A reversão excluirá os anexos do banco de dados Especificar e do Asset Server", + 'ru-ru': + 'Откат приведет к удалению вложений из базы данных Specify и сервера Asset.', + 'uk-ua': + 'Відкат видалить вкладення з бази даних Specify і сервера ресурсів', + 'pt-br': + 'A reversão excluirá os anexos do banco de dados Especificar e do Asset Server', }, noMatch: { - "en-us": "No match", - "de-ch": "Keine Übereinstimmung", - "es-es": "Sin coincidencia", - "fr-fr": "Aucune correspondance", - "ru-ru": "Нет совпадений", - "uk-ua": "Немає відповідності", - "pt-br": "Nenhuma correspondência", + 'en-us': 'No match', + 'de-ch': 'Keine Übereinstimmung', + 'es-es': 'Sin coincidencia', + 'fr-fr': 'Aucune correspondance', + 'ru-ru': 'Нет совпадений', + 'uk-ua': 'Немає відповідності', + 'pt-br': 'Nenhuma correspondência', }, attachmentHaltLimit: { - "en-us": - "No attachments have been found in the first {halt:number} records.", - "de-ch": - "In den ersten {halt:number}-Datensätzen wurden keine Anhänge gefunden.", - "es-es": - "No se han encontrado adjuntos en los primeros {halt:number} registros.", - "fr-fr": + 'en-us': + 'No attachments have been found in the first {halt:number} records.', + 'de-ch': + 'In den ersten {halt:number}-Datensätzen wurden keine Anhänge gefunden.', + 'es-es': + 'No se han encontrado adjuntos en los primeros {halt:number} registros.', + 'fr-fr': "Aucune pièce jointe n'a été trouvée dans les premiers enregistrements {halt:number}.", - "ru-ru": "В первых записях {halt:number} вложений не обнаружено.", - "uk-ua": "У перших записах {halt:number} вкладень не знайдено.", - "pt-br": - "Nenhum anexo foi encontrado nos primeiros registros {halt:number}.", + 'ru-ru': 'В первых записях {halt:number} вложений не обнаружено.', + 'uk-ua': 'У перших записах {halt:number} вкладень не знайдено.', + 'pt-br': + 'Nenhum anexo foi encontrado nos primeiros registros {halt:number}.', }, fetchNextAttachments: { - "en-us": "Look for more attachments", - "de-ch": "Suchen Sie nach weiteren Anhängen", - "es-es": "Buscar más adjuntos", - "fr-fr": "Rechercher plus de pièces jointes", - "ru-ru": "Найдите больше вложений", - "uk-ua": "Шукайте більше вкладень", - "pt-br": "Procure mais anexos", + 'en-us': 'Look for more attachments', + 'de-ch': 'Suchen Sie nach weiteren Anhängen', + 'es-es': 'Buscar más adjuntos', + 'fr-fr': 'Rechercher plus de pièces jointes', + 'ru-ru': 'Найдите больше вложений', + 'uk-ua': 'Шукайте більше вкладень', + 'pt-br': 'Procure mais anexos', }, hideForm: { - "en-us": "Hide Form", - "de-ch": "Formular ausblenden", - "es-es": "Ocultar formulario", - "fr-fr": "Masquer le formulaire", - "ru-ru": "Скрыть форму", - "uk-ua": "Сховати форму", - "pt-br": "Ocultar formulário", + 'en-us': 'Hide Form', + 'de-ch': 'Formular ausblenden', + 'es-es': 'Ocultar formulario', + 'fr-fr': 'Masquer le formulaire', + 'ru-ru': 'Скрыть форму', + 'uk-ua': 'Сховати форму', + 'pt-br': 'Ocultar formulário', }, multipleMatches: { - "en-us": "Multiple matches", - "de-ch": "Mehrere Übereinstimmungen", - "es-es": "Múltiples coincidencias", - "fr-fr": "Plusieurs correspondances", - "ru-ru": "Несколько совпадений", - "uk-ua": "Кілька збігів", - "pt-br": "Várias correspondências", + 'en-us': 'Multiple matches', + 'de-ch': 'Mehrere Übereinstimmungen', + 'es-es': 'Múltiples coincidencias', + 'fr-fr': 'Plusieurs correspondances', + 'ru-ru': 'Несколько совпадений', + 'uk-ua': 'Кілька збігів', + 'pt-br': 'Várias correspondências', }, multipleMatchesClick: { - "en-us": "Multiple Matches. Click To Disambiguate", - "de-ch": - "Mehrere Übereinstimmungen. Klicken Sie hier, um die Mehrdeutigkeit aufzuheben.", - "es-es": "Múltiples coincidencias. Haga clic para eliminar la ambigüedad", - "fr-fr": "Plusieurs correspondances. Cliquez pour clarifier", - "ru-ru": "Несколько совпадений. Нажмите, чтобы устранить неоднозначность.", - "uk-ua": "Кілька збігів. Натисніть, щоб усунути неоднозначність", - "pt-br": "Várias correspondências. Clique para desambiguar", + 'en-us': 'Multiple Matches. Click To Disambiguate', + 'de-ch': + 'Mehrere Übereinstimmungen. Klicken Sie hier, um die Mehrdeutigkeit aufzuheben.', + 'es-es': 'Múltiples coincidencias. Haga clic para eliminar la ambigüedad', + 'fr-fr': 'Plusieurs correspondances. Cliquez pour clarifier', + 'ru-ru': 'Несколько совпадений. Нажмите, чтобы устранить неоднозначность.', + 'uk-ua': 'Кілька збігів. Натисніть, щоб усунути неоднозначність', + 'pt-br': 'Várias correspondências. Clique para desambiguar', }, totalFiles: { - "en-us": "Total files", - "de-ch": "Gesamtzahl der Dateien", - "es-es": "Archivos totales", - "fr-fr": "Total des fichiers", - "ru-ru": "Всего файлов", - "uk-ua": "Всього файлів", - "pt-br": "Total de arquivos", + 'en-us': 'Total files', + 'de-ch': 'Gesamtzahl der Dateien', + 'es-es': 'Archivos totales', + 'fr-fr': 'Total des fichiers', + 'ru-ru': 'Всего файлов', + 'uk-ua': 'Всього файлів', + 'pt-br': 'Total de arquivos', }, correctlyFormatted: { - "en-us": "Correctly Formatted", - "de-ch": "Korrekt formatiert", - "es-es": "Formateado correctamente", - "fr-fr": "Correctement formaté", - "ru-ru": "Правильно отформатировано", - "uk-ua": "Правильно відформатований", - "pt-br": "Formatado corretamente", + 'en-us': 'Correctly Formatted', + 'de-ch': 'Korrekt formatiert', + 'es-es': 'Formateado correctamente', + 'fr-fr': 'Correctement formaté', + 'ru-ru': 'Правильно отформатировано', + 'uk-ua': 'Правильно відформатований', + 'pt-br': 'Formatado corretamente', }, stoppedByUser: { - "en-us": "Stopped By User", - "de-ch": "Vom Benutzer gestoppt", - "es-es": "Detenido por el usuario", - "fr-fr": "Arrêté par l'utilisateur", - "ru-ru": "Остановлено пользователем", - "uk-ua": "Зупинено користувачем", - "pt-br": "Parado pelo usuário", + 'en-us': 'Stopped By User', + 'de-ch': 'Vom Benutzer gestoppt', + 'es-es': 'Detenido por el usuario', + 'fr-fr': "Arrêté par l'utilisateur", + 'ru-ru': 'Остановлено пользователем', + 'uk-ua': 'Зупинено користувачем', + 'pt-br': 'Parado pelo usuário', }, importAttachments: { - "en-us": "Import Attachments", - "de-ch": "Anhänge importieren", - "es-es": "Importar archivos adjuntos", - "fr-fr": "Importer des pièces jointes", - "ru-ru": "Импорт вложений", - "uk-ua": "Імпорт вкладень", - "pt-br": "Importar anexos", + 'en-us': 'Import Attachments', + 'de-ch': 'Anhänge importieren', + 'es-es': 'Importar archivos adjuntos', + 'fr-fr': 'Importer des pièces jointes', + 'ru-ru': 'Импорт вложений', + 'uk-ua': 'Імпорт вкладень', + 'pt-br': 'Importar anexos', }, onFile: { - "en-us": "On File", - "de-ch": "In Datei", - "es-es": "En archivo", - "ru-ru": "В деле", - "uk-ua": "У файлі", - "fr-fr": "Dans le fichier", - "pt-br": "Em arquivo", + 'en-us': 'On File', + 'de-ch': 'In Datei', + 'es-es': 'En archivo', + 'ru-ru': 'В деле', + 'uk-ua': 'У файлі', + 'fr-fr': 'Dans le fichier', + 'pt-br': 'Em arquivo', }, duplicateFilesFound: { - "en-us": "Duplicate Files Found", - "de-ch": "Doppelte Dateien gefunden", - "es-es": "Archivos duplicados encontrados", - "fr-fr": "Fichiers en double trouvés", - "ru-ru": "Найдены дубликаты файлов", - "uk-ua": "Знайдено дублікати файлів", - "pt-br": "Arquivos duplicados encontrados", + 'en-us': 'Duplicate Files Found', + 'de-ch': 'Doppelte Dateien gefunden', + 'es-es': 'Archivos duplicados encontrados', + 'fr-fr': 'Fichiers en double trouvés', + 'ru-ru': 'Найдены дубликаты файлов', + 'uk-ua': 'Знайдено дублікати файлів', + 'pt-br': 'Arquivos duplicados encontrados', }, duplicateFilesDescription: { - "en-us": - "The following files are not selected because they already exist in this data set.", - "es-es": - "Los siguientes archivos no están seleccionados porque ya existen en este conjunto de datos.", - "fr-fr": - "Les fichiers suivants ne sont pas sélectionnés car ils existent déjà dans cet ensemble de données.", - "ru-ru": - "Следующие файлы не выбраны, поскольку они уже существуют в этом наборе данных.", - "de-ch": - "Die folgenden Dateien werden nicht ausgewählt, da sie in diesem Datensatz bereits vorhanden sind.", - "uk-ua": - "Наступні файли не вибрано, оскільки вони вже існують у цьому наборі даних.", - "pt-br": - "Os seguintes arquivos não foram selecionados porque já existem neste conjunto de dados.", + 'en-us': + 'The following files are not selected because they already exist in this data set.', + 'es-es': + 'Los siguientes archivos no están seleccionados porque ya existen en este conjunto de datos.', + 'fr-fr': + 'Les fichiers suivants ne sont pas sélectionnés car ils existent déjà dans cet ensemble de données.', + 'ru-ru': + 'Следующие файлы не выбраны, поскольку они уже существуют в этом наборе данных.', + 'de-ch': + 'Die folgenden Dateien werden nicht ausgewählt, da sie in diesem Datensatz bereits vorhanden sind.', + 'uk-ua': + 'Наступні файли не вибрано, оскільки вони вже існують у цьому наборі даних.', + 'pt-br': + 'Os seguintes arquivos não foram selecionados porque já existem neste conjunto de dados.', }, errorFetchingRecord: { - "en-us": "Error fetching record", - "de-ch": "Fehler beim Abrufen des Datensatzes", - "es-es": "Error al obtener el registro", - "fr-fr": "Erreur lors de la récupération de l'enregistrement", - "ru-ru": "Ошибка при извлечении записи", - "uk-ua": "Помилка отримання запису", - "pt-br": "Erro ao buscar registro", + 'en-us': 'Error fetching record', + 'de-ch': 'Fehler beim Abrufen des Datensatzes', + 'es-es': 'Error al obtener el registro', + 'fr-fr': "Erreur lors de la récupération de l'enregistrement", + 'ru-ru': 'Ошибка при извлечении записи', + 'uk-ua': 'Помилка отримання запису', + 'pt-br': 'Erro ao buscar registro', }, errorSavingRecord: { - "en-us": "Error saving record", - "de-ch": "Fehler beim Speichern des Datensatzes", - "es-es": "Error al guardar el registro", - "fr-fr": "Erreur lors de la sauvegarde de l'enregistrement", - "ru-ru": "Ошибка сохранения записи", - "uk-ua": "Помилка збереження запису", - "pt-br": "Erro ao salvar registro", + 'en-us': 'Error saving record', + 'de-ch': 'Fehler beim Speichern des Datensatzes', + 'es-es': 'Error al guardar el registro', + 'fr-fr': "Erreur lors de la sauvegarde de l'enregistrement", + 'ru-ru': 'Ошибка сохранения записи', + 'uk-ua': 'Помилка збереження запису', + 'pt-br': 'Erro ao salvar registro', }, interruptionStopped: { - "en-us": "Stopped because of error uploading a previous file", - "de-ch": - "Wegen eines Fehlers beim Hochladen einer vorherigen Datei angehalten", - "es-es": "Detenido debido a un error al cargar un archivo anterior", - "fr-fr": + 'en-us': 'Stopped because of error uploading a previous file', + 'de-ch': + 'Wegen eines Fehlers beim Hochladen einer vorherigen Datei angehalten', + 'es-es': 'Detenido debido a un error al cargar un archivo anterior', + 'fr-fr': "Arrêté à cause d'une erreur de téléchargement du précédent fichier", - "ru-ru": "Остановлено из-за ошибки при загрузке предыдущего файла", - "uk-ua": "Зупинено через помилку завантаження попереднього файлу", - "pt-br": "Interrompido devido a erro ao carregar um arquivo anterior", + 'ru-ru': 'Остановлено из-за ошибки при загрузке предыдущего файла', + 'uk-ua': 'Зупинено через помилку завантаження попереднього файлу', + 'pt-br': 'Interrompido devido a erro ao carregar um arquivo anterior', }, chooseFilesToGetStarted: { - "en-us": "Choose files or drag them here to get started.", - "de-ch": - "Wählen Sie Dateien aus oder ziehen Sie sie hierher, um zu beginnen.", - "es-es": "Elija archivos o arrástrelos aquí para comenzar.", - "fr-fr": - "Choisissez des fichiers ou faites-les glisser ici pour commencer.", - "ru-ru": "Чтобы начать, выберите файлы или перетащите их сюда.", - "uk-ua": "Щоб почати, виберіть файли або перетягніть їх сюди.", - "pt-br": "Escolha os arquivos ou arraste-os aqui para começar.", + 'en-us': 'Choose files or drag them here to get started.', + 'de-ch': + 'Wählen Sie Dateien aus oder ziehen Sie sie hierher, um zu beginnen.', + 'es-es': 'Elija archivos o arrástrelos aquí para comenzar.', + 'fr-fr': + 'Choisissez des fichiers ou faites-les glisser ici pour commencer.', + 'ru-ru': 'Чтобы начать, выберите файлы или перетащите их сюда.', + 'uk-ua': 'Щоб почати, виберіть файли або перетягніть їх сюди.', + 'pt-br': 'Escolha os arquivos ou arraste-os aqui para começar.', }, selectIdentifier: { - "en-us": "Select an identifier to match the files name against.", - "de-ch": - "Wählen Sie eine Kennung aus, mit der der Dateiname abgeglichen werden soll.", - "es-es": - "Seleccione un identificador para hacer coincidir el nombre de los archivos.", - "fr-fr": - "Sélectionnez un identifiant pour faire correspondre le nom des fichiers.", - "ru-ru": - "Выберите идентификатор, с которым будет сопоставляться имя файла.", - "uk-ua": "Виберіть ідентифікатор для відповідності імені файлу.", - "pt-br": - "Selecione um identificador para comparar com o nome dos arquivos.", + 'en-us': 'Select an identifier to match the files name against.', + 'de-ch': + 'Wählen Sie eine Kennung aus, mit der der Dateiname abgeglichen werden soll.', + 'es-es': + 'Seleccione un identificador para hacer coincidir el nombre de los archivos.', + 'fr-fr': + 'Sélectionnez un identifiant pour faire correspondre le nom des fichiers.', + 'ru-ru': + 'Выберите идентификатор, с которым будет сопоставляться имя файла.', + 'uk-ua': 'Виберіть ідентифікатор для відповідності імені файлу.', + 'pt-br': + 'Selecione um identificador para comparar com o nome dos arquivos.', }, progress: { - "en-us": "Progress", - "de-ch": "Fortschritt", - "es-es": "Progreso", - "fr-fr": "En cours", - "ru-ru": "Прогресс", - "uk-ua": "Прогрес", - "pt-br": "Progresso", + 'en-us': 'Progress', + 'de-ch': 'Fortschritt', + 'es-es': 'Progreso', + 'fr-fr': 'En cours', + 'ru-ru': 'Прогресс', + 'uk-ua': 'Прогрес', + 'pt-br': 'Progresso', }, rollbackResults: { - "en-us": "Rollback Results", - "de-ch": "Rollback-Ergebnisse", - "es-es": "Resultados de reversión", - "fr-fr": "Résultats du retour en arrière", - "ru-ru": "Результаты отката", - "uk-ua": "Результати відкату", - "pt-br": "Resultados da reversão", + 'en-us': 'Rollback Results', + 'de-ch': 'Rollback-Ergebnisse', + 'es-es': 'Resultados de reversión', + 'fr-fr': 'Résultats du retour en arrière', + 'ru-ru': 'Результаты отката', + 'uk-ua': 'Результати відкату', + 'pt-br': 'Resultados da reversão', }, resultValue: { - "en-us": - "{success: number} out of the {total: number} attachments in the data set have been {action: string}.", - "de-ch": - "{success: number} der {total: number} Anhänge im Datensatz waren {action: string}.", - "es-es": - "{éxito: número} de los {total: número} archivos adjuntos en el conjunto de datos han sido {acción: cadena}.", - "fr-fr": - "{success : number} sur les {total : number} pièces jointes du jeu de données étaient {action : string}.", - "ru-ru": - "{success: number} из {total: number} вложений в наборе данных были {action: string}.", - "uk-ua": - "{success: number} із {total: number} вкладень у наборі даних було {action: string}.", - "pt-br": - "{success: number} dos {total: number} anexos no conjunto de dados foram {action: string}.", + 'en-us': + '{success: number} out of the {total: number} attachments in the data set have been {action: string}.', + 'de-ch': + '{success: number} der {total: number} Anhänge im Datensatz waren {action: string}.', + 'es-es': + '{éxito: número} de los {total: número} archivos adjuntos en el conjunto de datos han sido {acción: cadena}.', + 'fr-fr': + '{success : number} sur les {total : number} pièces jointes du jeu de données étaient {action : string}.', + 'ru-ru': + '{success: number} из {total: number} вложений в наборе данных были {action: string}.', + 'uk-ua': + '{success: number} із {total: number} вкладень у наборі даних було {action: string}.', + 'pt-br': + '{success: number} dos {total: number} anexos no conjunto de dados foram {action: string}.', }, deleteAttachmentDataSetDescription: { - "en-us": - "Deleting a Data Set permanently removes it and its Upload Path. Also after deleting, Rollback will no longer be an option for an uploaded Data Set.", - "de-ch": - "Durch das Löschen eines Datensatzes werden dieser und sein Upload-Pfad dauerhaft entfernt. Nach dem Löschen ist für einen hochgeladenen Datensatz auch kein Rollback mehr möglich.", - "es-es": - "Al eliminar un conjunto de datos, se elimina permanentemente este y su ruta de carga. Además, después de la eliminación, la Reversión ya no será una opción para un conjunto de datos cargado.", - "fr-fr": - "Supprimer un jeu de données le retire définitivement ainsi que son chemin de téléchargement. De plus, après la suppression, le retour en arrière ne sera plus possible pour un jeu de données téléchargé.", - "ru-ru": - "Удаление набора данных приводит к его безвозвратному удалению вместе с путём загрузки. Кроме того, после удаления откат загруженного набора данных больше не будет доступен.", - "uk-ua": - "Видалення набору даних остаточно видаляє його та його шлях завантаження. Крім того, після видалення відкат більше не буде доступним для завантаженого набору даних.", - "pt-br": - "Excluir um Conjunto de Dados remove permanentemente o conjunto e seu Caminho de Upload. Além disso, após a exclusão, a opção de Reverter não será mais uma opção para um Conjunto de Dados carregado.", + 'en-us': + 'Deleting a Data Set permanently removes it and its Upload Path. Also after deleting, Rollback will no longer be an option for an uploaded Data Set.', + 'de-ch': + 'Durch das Löschen eines Datensatzes werden dieser und sein Upload-Pfad dauerhaft entfernt. Nach dem Löschen ist für einen hochgeladenen Datensatz auch kein Rollback mehr möglich.', + 'es-es': + 'Al eliminar un conjunto de datos, se elimina permanentemente este y su ruta de carga. Además, después de la eliminación, la Reversión ya no será una opción para un conjunto de datos cargado.', + 'fr-fr': + 'Supprimer un jeu de données le retire définitivement ainsi que son chemin de téléchargement. De plus, après la suppression, le retour en arrière ne sera plus possible pour un jeu de données téléchargé.', + 'ru-ru': + 'Удаление набора данных приводит к его безвозвратному удалению вместе с путём загрузки. Кроме того, после удаления откат загруженного набора данных больше не будет доступен.', + 'uk-ua': + 'Видалення набору даних остаточно видаляє його та його шлях завантаження. Крім того, після видалення відкат більше не буде доступним для завантаженого набору даних.', + 'pt-br': + 'Excluir um Conjunto de Dados remove permanentemente o conjunto e seu Caminho de Upload. Além disso, após a exclusão, a opção de Reverter não será mais uma opção para um Conjunto de Dados carregado.', }, attachmentUploadError: { - "en-us": - "Error Uploading Attachment. Attachment server maybe unavailable or there was an error reading the file.", - "de-ch": - "Fehler beim Hochladen des Anhangs. Der Anhangsserver ist möglicherweise nicht verfügbar oder beim Lesen der Datei ist ein Fehler aufgetreten.", - "es-es": - "Error al cargar el archivo adjunto. Es posible que el servidor de archivos adjuntos no esté disponible o hubo un error al leer el archivo.", - "fr-fr": + 'en-us': + 'Error Uploading Attachment. Attachment server maybe unavailable or there was an error reading the file.', + 'de-ch': + 'Fehler beim Hochladen des Anhangs. Der Anhangsserver ist möglicherweise nicht verfügbar oder beim Lesen der Datei ist ein Fehler aufgetreten.', + 'es-es': + 'Error al cargar el archivo adjunto. Es posible que el servidor de archivos adjuntos no esté disponible o hubo un error al leer el archivo.', + 'fr-fr': "Erreur lors du téléchargement de la pièce jointe. Le serveur de pièces jointes est peut-être indisponible ou une erreur s'est produite lors de la lecture du fichier.", - "ru-ru": - "Ошибка загрузки вложения. Возможно, сервер вложения недоступен или произошла ошибка при чтении файла.", - "uk-ua": - "Помилка завантаження вкладення. Можливо, сервер вкладень недоступний або під час читання файлу сталася помилка.", - "pt-br": - "Erro ao carregar anexo. O servidor de anexos pode estar indisponível ou ocorreu um erro ao ler o arquivo.", + 'ru-ru': + 'Ошибка загрузки вложения. Возможно, сервер вложения недоступен или произошла ошибка при чтении файла.', + 'uk-ua': + 'Помилка завантаження вкладення. Можливо, сервер вкладень недоступний або під час читання файлу сталася помилка.', + 'pt-br': + 'Erro ao carregar anexo. O servidor de anexos pode estar indisponível ou ocorreu um erro ao ler o arquivo.', }, downloadAll: { - "en-us": "Download All", - "de-ch": "Alles herunterladen", - "es-es": "Descargar todo", - "fr-fr": "Télécharger tout", - "pt-br": "Baixar tudo", - "ru-ru": "Скачать все", - "uk-ua": "Завантажити все", + 'en-us': 'Download All', + 'de-ch': 'Alles herunterladen', + 'es-es': 'Descargar todo', + 'fr-fr': 'Télécharger tout', + 'pt-br': 'Baixar tudo', + 'ru-ru': 'Скачать все', + 'uk-ua': 'Завантажити все', }, downloadAllDescription: { - "en-us": "Download all found attachments", - "de-ch": "Alle gefundenen Anhänge herunterladen", - "es-es": "Descargar todos los archivos adjuntos encontrados", - "fr-fr": "Télécharger toutes les pièces jointes trouvées", - "pt-br": "Baixar todos os anexos encontrados", - "ru-ru": "Загрузить все найденные вложения", - "uk-ua": "Завантажити всі знайдені вкладення", + 'en-us': 'Download all found attachments', + 'de-ch': 'Alle gefundenen Anhänge herunterladen', + 'es-es': 'Descargar todos los archivos adjuntos encontrados', + 'fr-fr': 'Télécharger toutes les pièces jointes trouvées', + 'pt-br': 'Baixar todos os anexos encontrados', + 'ru-ru': 'Загрузить все найденные вложения', + 'uk-ua': 'Завантажити всі знайдені вкладення', }, createRecordSetToDownloadAll: { - "en-us": - "Not all attachments have been loaded. Please create a record set of the query results to download all the attachments.", - "de-ch": - "Es wurden nicht alle Anhänge geladen. Bitte erstellen Sie einen Datensatz der Abfrageergebnisse, um alle Anhänge herunterzuladen.", - "es-es": - "No se han cargado todos los archivos adjuntos. Cree un conjunto de registros con los resultados de la consulta para descargarlos todos.", - "fr-fr": - "Toutes les pièces jointes n'ont pas été chargées. Veuillez créer un ensemble d'enregistrements des résultats de la requête pour télécharger toutes les pièces jointes.", - "pt-br": - "Nem todos os anexos foram carregados. Crie um conjunto de registros dos resultados da consulta para baixar todos os anexos.", - "ru-ru": - "Не все вложения загружены. Создайте набор записей результатов запроса, чтобы загрузить все вложения.", - "uk-ua": - "Не всі вкладення завантажено. Будь ласка, створіть набір записів результатів запиту, щоб завантажити всі вкладення.", + 'en-us': + 'Not all attachments have been loaded. Please create a record set of the query results to download all the attachments.', }, deleteAttachmentWarning: { - "en-us": "Are you sure you want to delete this attachment?", - "de-ch": "Möchten Sie diesen Anhang wirklich löschen?", - "es-es": "¿Está seguro que desea eliminar este archivo adjunto?", - "fr-fr": "Etes-vous sûr de vouloir supprimer cette pièce jointe ?", - "pt-br": "Tem certeza de que deseja excluir este anexo?", - "ru-ru": "Вы уверены, что хотите удалить это вложение?", - "uk-ua": "Ви впевнені, що хочете видалити цей вкладений файл?", + 'en-us': 'Are you sure you want to delete this attachment?', + 'de-ch': 'Möchten Sie diesen Anhang wirklich löschen?', + 'es-es': '¿Está seguro que desea eliminar este archivo adjunto?', + 'fr-fr': 'Etes-vous sûr de vouloir supprimer cette pièce jointe ?', + 'pt-br': 'Tem certeza de que deseja excluir este anexo?', + 'ru-ru': 'Вы уверены, что хотите удалить это вложение?', + 'uk-ua': 'Ви впевнені, що хочете видалити цей вкладений файл?', }, attachmentDelition: { - "en-us": "Attachment deletion", - "de-ch": "Löschen von Anhängen", - "es-es": "Eliminación de archivos adjuntos", - "fr-fr": "Suppression des pièces jointes", - "pt-br": "Exclusão de anexos", - "ru-ru": "Удаление вложения", - "uk-ua": "Видалення вкладень", + 'en-us': 'Attachment deletion', + 'de-ch': 'Löschen von Anhängen', + 'es-es': 'Eliminación de archivos adjuntos', + 'fr-fr': 'Suppression des pièces jointes', + 'pt-br': 'Exclusão de anexos', + 'ru-ru': 'Удаление вложения', + 'uk-ua': 'Видалення вкладень', + }, + publicDefault: { + 'en-us': 'New attachments are public', + 'ru-ru': 'New attachments are public', + 'es-es': 'New attachments are public', + 'fr-fr': 'New attachments are public', + 'uk-ua': 'New attachments are public', + 'de-ch': 'New attachments are public', + 'pt-br': 'New attachments are public', + }, + publicDefaultDescription: { + 'en-us': 'Set the default visibility for attachments created within this collection.', + 'ru-ru': 'Set the default visibility for attachments created within this collection.', + 'es-es': 'Set the default visibility for attachments created within this collection.', + 'fr-fr': 'Set the default visibility for attachments created within this collection.', + 'uk-ua': 'Set the default visibility for attachments created within this collection.', + 'de-ch': 'Set the default visibility for attachments created within this collection.', + 'pt-br': 'Set the default visibility for attachments created within this collection.', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index fda4eb3a9a9..d7e3e453d2f 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -4,2128 +4,2127 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const preferencesText = createDictionary({ preferences: { - "en-us": "Preferences", - "ru-ru": "Настройки", - "es-es": "Preferencias", - "fr-fr": "Préférences", - "uk-ua": "Уподобання", - "de-ch": "Einstellungen", - "pt-br": "Preferências", + 'en-us': 'Preferences', + 'ru-ru': 'Настройки', + 'es-es': 'Preferencias', + 'fr-fr': 'Préférences', + 'uk-ua': 'Уподобання', + 'de-ch': 'Einstellungen', + 'pt-br': 'Preferências', }, customization: { - "en-us": "Customization", - "ru-ru": "Настройка", - "es-es": "Personalización", - "fr-fr": "Personnalisation", - "uk-ua": "Спеціальнізація", - "de-ch": "Anpassung", - "pt-br": "Personalização", + 'en-us': 'Customization', + 'ru-ru': 'Настройка', + 'es-es': 'Personalización', + 'fr-fr': 'Personnalisation', + 'uk-ua': 'Спеціальнізація', + 'de-ch': 'Anpassung', + 'pt-br': 'Personalização', }, userPreferences: { - "en-us": "User Preferences", - "ru-ru": "Настройки пользователя", - "es-es": "Preferencias del usuario", - "fr-fr": "Préférences de l'utilisateur", - "uk-ua": "Налаштування користувача", - "de-ch": "Benutzereinstellungen", - "pt-br": "Preferências do usuário", + 'en-us': 'User Preferences', + 'ru-ru': 'Настройки пользователя', + 'es-es': 'Preferencias del usuario', + 'fr-fr': "Préférences de l'utilisateur", + 'uk-ua': 'Налаштування користувача', + 'de-ch': 'Benutzereinstellungen', + 'pt-br': 'Preferências do usuário', }, defaultUserPreferences: { - "en-us": "Default User Preferences", - "ru-ru": "Настройки пользователя по умолчанию", - "es-es": "Preferencias de usuario predeterminadas", - "fr-fr": "Préférences utilisateur par défaut", - "uk-ua": "Параметри користувача за умовчанням", - "de-ch": "Standardbenutzereinstellungen", - "pt-br": "Preferências de usuário padrão", + 'en-us': 'Default User Preferences', + 'ru-ru': 'Настройки пользователя по умолчанию', + 'es-es': 'Preferencias de usuario predeterminadas', + 'fr-fr': 'Préférences utilisateur par défaut', + 'uk-ua': 'Параметри користувача за умовчанням', + 'de-ch': 'Standardbenutzereinstellungen', + 'pt-br': 'Preferências de usuário padrão', }, general: { - "en-us": "General", - "ru-ru": "Общий", - "es-es": "General", - "fr-fr": "Image personnalisée", - "uk-ua": "Спеціальне зображення", - "de-ch": "Allgemein", - "pt-br": "Em geral", + 'en-us': 'General', + 'ru-ru': 'Общий', + 'es-es': 'General', + 'fr-fr': 'Image personnalisée', + 'uk-ua': 'Спеціальне зображення', + 'de-ch': 'Allgemein', + 'pt-br': 'Em geral', }, ui: { - "en-us": "User Interface", - "ru-ru": "Пользовательский интерфейс", - "es-es": "Interfaz de usuario", - "fr-fr": "Interface utilisateur", - "uk-ua": "Інтерфейс користувача", - "de-ch": "Benutzeroberfläche", - "pt-br": "Interface do usuário", + 'en-us': 'User Interface', + 'ru-ru': 'Пользовательский интерфейс', + 'es-es': 'Interfaz de usuario', + 'fr-fr': 'Interface utilisateur', + 'uk-ua': 'Інтерфейс користувача', + 'de-ch': 'Benutzeroberfläche', + 'pt-br': 'Interface do usuário', }, theme: { - "en-us": "Theme", - "ru-ru": "Тема", - "es-es": "Tema", - "fr-fr": "Thème", - "uk-ua": "Тема", - "de-ch": "Thema", - "pt-br": "Tema", + 'en-us': 'Theme', + 'ru-ru': 'Тема', + 'es-es': 'Tema', + 'fr-fr': 'Thème', + 'uk-ua': 'Тема', + 'de-ch': 'Thema', + 'pt-br': 'Tema', }, useSystemSetting: { - "en-us": "Use system setting", - "ru-ru": "Использовать системные настройки", - "es-es": "Utilizar la configuración del sistema", - "fr-fr": "Utiliser les paramètres du système", - "uk-ua": "Використовуйте налаштування системи", - "de-ch": "Systemeinstellung verwenden", - "pt-br": "Usar configuração do sistema", + 'en-us': 'Use system setting', + 'ru-ru': 'Использовать системные настройки', + 'es-es': 'Utilizar la configuración del sistema', + 'fr-fr': 'Utiliser les paramètres du système', + 'uk-ua': 'Використовуйте налаштування системи', + 'de-ch': 'Systemeinstellung verwenden', + 'pt-br': 'Usar configuração do sistema', }, inheritOsSettings: { - "en-us": "Copies value from your Operating System settings", - "ru-ru": "Копирует значение из настроек вашей операционной системы", - "es-es": "Copia el valor de la configuración de su sistema operativo", - "fr-fr": "Copie la valeur des paramètres de votre système d'exploitation", - "uk-ua": "Копіює значення з налаштувань вашої операційної системи", - "de-ch": "Übernimmt den Wert aus Ihren Betriebssystemeinstellungen", - "pt-br": "Copia o valor das configurações do seu sistema operacional", + 'en-us': 'Copies value from your Operating System settings', + 'ru-ru': 'Копирует значение из настроек вашей операционной системы', + 'es-es': 'Copia el valor de la configuración de su sistema operativo', + 'fr-fr': "Copie la valeur des paramètres de votre système d'exploitation", + 'uk-ua': 'Копіює значення з налаштувань вашої операційної системи', + 'de-ch': 'Übernimmt den Wert aus Ihren Betriebssystemeinstellungen', + 'pt-br': 'Copia o valor das configurações do seu sistema operacional', }, light: { - comment: "Light mode", - "en-us": "Light", - "ru-ru": "Свет", - "es-es": "Claro", - "fr-fr": "Lumière", - "uk-ua": "світло", - "de-ch": "Hell", - "pt-br": "Luz", + comment: 'Light mode', + 'en-us': 'Light', + 'ru-ru': 'Свет', + 'es-es': 'Claro', + 'fr-fr': 'Lumière', + 'uk-ua': 'світло', + 'de-ch': 'Hell', + 'pt-br': 'Luz', }, dark: { - comment: "Dark mode", - "en-us": "Dark", - "ru-ru": "Темный", - "es-es": "Oscuro", - "fr-fr": "Sombre", - "uk-ua": "Темний", - "de-ch": "Dunkel", - "pt-br": "Escuro", + comment: 'Dark mode', + 'en-us': 'Dark', + 'ru-ru': 'Темный', + 'es-es': 'Oscuro', + 'fr-fr': 'Sombre', + 'uk-ua': 'Темний', + 'de-ch': 'Dunkel', + 'pt-br': 'Escuro', }, reduceMotion: { - "en-us": "Reduce motion", - "ru-ru": "Уменьшите движение", - "es-es": "Reducir el movimiento", - "fr-fr": "Réduire les mouvements", - "uk-ua": "Зменшити рух", - "de-ch": "Bewegung reduzieren", - "pt-br": "Reduzir movimento", + 'en-us': 'Reduce motion', + 'ru-ru': 'Уменьшите движение', + 'es-es': 'Reducir el movimiento', + 'fr-fr': 'Réduire les mouvements', + 'uk-ua': 'Зменшити рух', + 'de-ch': 'Bewegung reduzieren', + 'pt-br': 'Reduzir movimento', }, reduceMotionDescription: { - "en-us": "Disable non-essential animations and transitions.", - "ru-ru": "Отключите ненужные анимации и переходы.", - "es-es": "Desactivar animaciones y transiciones no esenciales.", - "fr-fr": "Désactivez les animations et les transitions non essentielles.", - "uk-ua": "Вимкніть необов'язкову анімацію та переходи.", - "de-ch": "Nicht erforderliche Animationen und Übergänge deaktivieren.", - "pt-br": "Desabilite animações e transições não essenciais.", + 'en-us': 'Disable non-essential animations and transitions.', + 'ru-ru': 'Отключите ненужные анимации и переходы.', + 'es-es': 'Desactivar animaciones y transiciones no esenciales.', + 'fr-fr': 'Désactivez les animations et les transitions non essentielles.', + 'uk-ua': "Вимкніть необов'язкову анімацію та переходи.", + 'de-ch': 'Nicht erforderliche Animationen und Übergänge deaktivieren.', + 'pt-br': 'Desabilite animações e transições não essenciais.', }, reduceTransparency: { - "en-us": "Reduce transparency", - "ru-ru": "Уменьшить прозрачность", - "es-es": "Reducir la transparencia", - "fr-fr": "Réduire la transparence", - "uk-ua": "Зменшити прозорість", - "de-ch": "Transparenz reduzieren", - "pt-br": "Reduzir a transparência", + 'en-us': 'Reduce transparency', + 'ru-ru': 'Уменьшить прозрачность', + 'es-es': 'Reducir la transparencia', + 'fr-fr': 'Réduire la transparence', + 'uk-ua': 'Зменшити прозорість', + 'de-ch': 'Transparenz reduzieren', + 'pt-br': 'Reduzir a transparência', }, reduceTransparencyDescription: { - "en-us": - "Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).", - "ru-ru": - "Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).", - "es-es": - "Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).", - "fr-fr": + 'en-us': + 'Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).', + 'ru-ru': + 'Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).', + 'es-es': + 'Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).', + 'fr-fr': "S'il faut désactiver les arrière-plans translucides pour les composants de l'interface utilisateur chaque fois que possible (par exemple, les en-têtes de tableau dans l'arborescence).", - "uk-ua": - "Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).", - "de-ch": - "Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).", - "pt-br": - "Se deve desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).", + 'uk-ua': + 'Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).', + 'de-ch': + 'Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).', + 'pt-br': + 'Se deve desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).', }, contrast: { - "en-us": "Contrast", - "ru-ru": "Контраст", - "es-es": "Contraste", - "fr-fr": "Contraste", - "uk-ua": "Контраст", - "de-ch": "Kontrast", - "pt-br": "Contraste", + 'en-us': 'Contrast', + 'ru-ru': 'Контраст', + 'es-es': 'Contraste', + 'fr-fr': 'Contraste', + 'uk-ua': 'Контраст', + 'de-ch': 'Kontrast', + 'pt-br': 'Contraste', }, increase: { - "en-us": "Increase", - "ru-ru": "Увеличивать", - "es-es": "Aumentar", - "fr-fr": "Augmenter", - "uk-ua": "Збільшити", - "de-ch": "Erhöhen", - "pt-br": "Aumentar", + 'en-us': 'Increase', + 'ru-ru': 'Увеличивать', + 'es-es': 'Aumentar', + 'fr-fr': 'Augmenter', + 'uk-ua': 'Збільшити', + 'de-ch': 'Erhöhen', + 'pt-br': 'Aumentar', }, reduce: { - "en-us": "Reduce", - "ru-ru": "Уменьшать", - "es-es": "Reducir", - "fr-fr": "Réduire", - "uk-ua": "Зменшити", - "de-ch": "Verringern", - "pt-br": "Reduzir", + 'en-us': 'Reduce', + 'ru-ru': 'Уменьшать', + 'es-es': 'Reducir', + 'fr-fr': 'Réduire', + 'uk-ua': 'Зменшити', + 'de-ch': 'Verringern', + 'pt-br': 'Reduzir', }, noPreference: { - "en-us": "No preference", - "ru-ru": "Нет предпочтений", - "es-es": "Sin preferencia", - "fr-fr": "Pas de préférence", - "uk-ua": "Без переваг", - "de-ch": "Keine Präferenz", - "pt-br": "Sem preferência", + 'en-us': 'No preference', + 'ru-ru': 'Нет предпочтений', + 'es-es': 'Sin preferencia', + 'fr-fr': 'Pas de préférence', + 'uk-ua': 'Без переваг', + 'de-ch': 'Keine Präferenz', + 'pt-br': 'Sem preferência', }, fontSize: { - "en-us": "Font size", - "ru-ru": "Размер шрифта", - "es-es": "Tamaño de fuente", - "fr-fr": "Taille de police", - "uk-ua": "Розмір шрифту", - "de-ch": "Schriftgrösse", - "pt-br": "Tamanho da fonte", + 'en-us': 'Font size', + 'ru-ru': 'Размер шрифта', + 'es-es': 'Tamaño de fuente', + 'fr-fr': 'Taille de police', + 'uk-ua': 'Розмір шрифту', + 'de-ch': 'Schriftgrösse', + 'pt-br': 'Tamanho da fonte', }, fontFamily: { - "en-us": "Font family", - "ru-ru": "Семейство шрифтов", - "es-es": "Familia de fuentes", - "fr-fr": "Famille de polices", - "uk-ua": "Сімейство шрифтів", - "de-ch": "Schrift-Familie", - "pt-br": "Família de fontes", + 'en-us': 'Font family', + 'ru-ru': 'Семейство шрифтов', + 'es-es': 'Familia de fuentes', + 'fr-fr': 'Famille de polices', + 'uk-ua': 'Сімейство шрифтів', + 'de-ch': 'Schrift-Familie', + 'pt-br': 'Família de fontes', }, fontFamilyDescription: { - "en-us": - "You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.", - "ru-ru": - "Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.", - "es-es": - "Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.", - "fr-fr": + 'en-us': + 'You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.', + 'ru-ru': + 'Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.', + 'es-es': + 'Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.', + 'fr-fr': "Vous pouvez spécifier n'importe quelle police présente sur votre ordinateur, même si elle ne figure pas dans la liste. Une liste de polices séparées par des virgules est également prise en charge ; chaque police suivante sera utilisée si la précédente n'est pas disponible.", - "uk-ua": + 'uk-ua': "Ви можете вказати будь-який шрифт, який є на вашому комп'ютері, навіть якщо його немає в списку. Також підтримується розділений комами список шрифтів, у якому використовуватиметься другий шрифт, якщо перший недоступний тощо.", - "de-ch": - "Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.", - "pt-br": - "Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.", + 'de-ch': + 'Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.', + 'pt-br': + 'Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.', }, defaultFont: { - "en-us": "(default font)", - "ru-ru": "(шрифт по умолчанию)", - "es-es": "(fuente predeterminada)", - "fr-fr": "(police par défaut)", - "uk-ua": "(типовий шрифт)", - "de-ch": "(Standardschriftart)", - "pt-br": "(fonte padrão)", + 'en-us': '(default font)', + 'ru-ru': '(шрифт по умолчанию)', + 'es-es': '(fuente predeterminada)', + 'fr-fr': '(police par défaut)', + 'uk-ua': '(типовий шрифт)', + 'de-ch': '(Standardschriftart)', + 'pt-br': '(fonte padrão)', }, maxFormWidth: { - "en-us": "Max form width", - "ru-ru": "Максимальная ширина формы", - "es-es": "Ancho máximo del formulario", - "fr-fr": "Largeur maximale du formulaire", - "uk-ua": "Максимальна ширина форми", - "de-ch": "Maximale Formularbreite", - "pt-br": "Largura máxima do formulário", + 'en-us': 'Max form width', + 'ru-ru': 'Максимальная ширина формы', + 'es-es': 'Ancho máximo del formulario', + 'fr-fr': 'Largeur maximale du formulaire', + 'uk-ua': 'Максимальна ширина форми', + 'de-ch': 'Maximale Formularbreite', + 'pt-br': 'Largura máxima do formulário', }, fieldBackgrounds: { - "en-us": "Field backgrounds", - "ru-ru": "Фоны полей", - "es-es": "Fondos de campo", - "fr-fr": "Milieux de terrain", - "uk-ua": "Польові фони", - "de-ch": "Feldhintergründe", - "pt-br": "Fundos de campo", + 'en-us': 'Field backgrounds', + 'ru-ru': 'Фоны полей', + 'es-es': 'Fondos de campo', + 'fr-fr': 'Milieux de terrain', + 'uk-ua': 'Польові фони', + 'de-ch': 'Feldhintergründe', + 'pt-br': 'Fundos de campo', }, fieldBackground: { - "en-us": "Field background", - "ru-ru": "Фон поля", - "es-es": "Fondo de campo", - "fr-fr": "Contexte du terrain", - "uk-ua": "Поле фону", - "de-ch": "Feldhintergrund", - "pt-br": "Contexto de campo", + 'en-us': 'Field background', + 'ru-ru': 'Фон поля', + 'es-es': 'Fondo de campo', + 'fr-fr': 'Contexte du terrain', + 'uk-ua': 'Поле фону', + 'de-ch': 'Feldhintergrund', + 'pt-br': 'Contexto de campo', }, disabledFieldBackground: { - "en-us": "Disabled field background", - "ru-ru": "Отключенный фон поля", - "es-es": "Fondo de campo deshabilitado", - "fr-fr": "Fond de champ désactivé", - "uk-ua": "Вимкнений фон поля", - "de-ch": "Deaktivierter Feldhintergrund", - "pt-br": "Fundo de campo desativado", + 'en-us': 'Disabled field background', + 'ru-ru': 'Отключенный фон поля', + 'es-es': 'Fondo de campo deshabilitado', + 'fr-fr': 'Fond de champ désactivé', + 'uk-ua': 'Вимкнений фон поля', + 'de-ch': 'Deaktivierter Feldhintergrund', + 'pt-br': 'Fundo de campo desativado', }, invalidFieldBackground: { - "en-us": "Invalid field background", - "ru-ru": "Неверный фон поля", - "es-es": "Fondo de campo no válido", - "fr-fr": "Fond de champ invalide", - "uk-ua": "Недійсний фон поля", - "de-ch": "Ungültiger Feldhintergrund", - "pt-br": "Fundo de campo inválido", + 'en-us': 'Invalid field background', + 'ru-ru': 'Неверный фон поля', + 'es-es': 'Fondo de campo no válido', + 'fr-fr': 'Fond de champ invalide', + 'uk-ua': 'Недійсний фон поля', + 'de-ch': 'Ungültiger Feldhintergrund', + 'pt-br': 'Fundo de campo inválido', }, requiredFieldBackground: { - "en-us": "Required field background", - "ru-ru": "Обязательное поле фон", - "es-es": "Fondo del campo obligatorio", - "fr-fr": "Contexte du champ obligatoire", - "uk-ua": "Обов'язковий фон поля", - "de-ch": "Feldhintergrund erforderlich", - "pt-br": "Histórico de campo obrigatório", + 'en-us': 'Required field background', + 'ru-ru': 'Обязательное поле фон', + 'es-es': 'Fondo del campo obligatorio', + 'fr-fr': 'Contexte du champ obligatoire', + 'uk-ua': "Обов'язковий фон поля", + 'de-ch': 'Feldhintergrund erforderlich', + 'pt-br': 'Histórico de campo obrigatório', }, darkFieldBackground: { - "en-us": "Field background (dark theme)", - "ru-ru": "Фон поля (тёмная тема)", - "es-es": "Fondo de campo (tema oscuro)", - "fr-fr": "Fond de champ (thème sombre)", - "uk-ua": "Фон поля (темна тема)", - "de-ch": "Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo (tema escuro)", + 'en-us': 'Field background (dark theme)', + 'ru-ru': 'Фон поля (тёмная тема)', + 'es-es': 'Fondo de campo (tema oscuro)', + 'fr-fr': 'Fond de champ (thème sombre)', + 'uk-ua': 'Фон поля (темна тема)', + 'de-ch': 'Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo (tema escuro)', }, darkDisabledFieldBackground: { - "en-us": "Disabled field background (dark theme)", - "ru-ru": "Отключенный фон поля (тёмная тема)", - "es-es": "Fondo de campo deshabilitado (tema oscuro)", - "fr-fr": "Fond de champ désactivé (thème sombre)", - "uk-ua": "Вимкнений фон поля (темна тема)", - "de-ch": "Deaktivierter Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo desativado (tema escuro)", + 'en-us': 'Disabled field background (dark theme)', + 'ru-ru': 'Отключенный фон поля (тёмная тема)', + 'es-es': 'Fondo de campo deshabilitado (tema oscuro)', + 'fr-fr': 'Fond de champ désactivé (thème sombre)', + 'uk-ua': 'Вимкнений фон поля (темна тема)', + 'de-ch': 'Deaktivierter Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo desativado (tema escuro)', }, darkInvalidFieldBackground: { - "en-us": "Invalid field background (dark theme)", - "ru-ru": "Недопустимый фон поля (тёмная тема)", - "es-es": "Fondo de campo no válido (tema oscuro)", - "fr-fr": "Largeur de colonne de grille de sous-vue flexible", - "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", - "de-ch": "Ungültiger Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo inválido (tema escuro)", + 'en-us': 'Invalid field background (dark theme)', + 'ru-ru': 'Недопустимый фон поля (тёмная тема)', + 'es-es': 'Fondo de campo no válido (tema oscuro)', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Ungültiger Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo inválido (tema escuro)', }, darkRequiredFieldBackground: { - "en-us": "Required field background (dark theme)", - "ru-ru": "Обязательное поле фон (тёмная тема)", - "es-es": "Fondo del campo obligatorio (tema oscuro)", - "fr-fr": "Fond de champ obligatoire (thème sombre)", - "uk-ua": "Обов’язковий фон поля (темна тема)", - "de-ch": "Feldhintergrund erforderlich (Dunkles Thema)", - "pt-br": "Fundo de campo obrigatório (tema escuro)", + 'en-us': 'Required field background (dark theme)', + 'ru-ru': 'Обязательное поле фон (тёмная тема)', + 'es-es': 'Fondo del campo obligatorio (tema oscuro)', + 'fr-fr': 'Fond de champ obligatoire (thème sombre)', + 'uk-ua': 'Обов’язковий фон поля (темна тема)', + 'de-ch': 'Feldhintergrund erforderlich (Dunkles Thema)', + 'pt-br': 'Fundo de campo obrigatório (tema escuro)', }, dialogs: { - "en-us": "Dialogs", - "ru-ru": "Диалоги", - "es-es": "Diálogos", - "fr-fr": "Boîtes de dialogue", - "uk-ua": "Діалоги", - "de-ch": "Dialoge", - "pt-br": "Diálogos", + 'en-us': 'Dialogs', + 'ru-ru': 'Диалоги', + 'es-es': 'Diálogos', + 'fr-fr': 'Boîtes de dialogue', + 'uk-ua': 'Діалоги', + 'de-ch': 'Dialoge', + 'pt-br': 'Diálogos', }, appearance: { - "en-us": "Appearance", - "ru-ru": "Появление", - "es-es": "Apariencia", - "fr-fr": "Apparence", - "uk-ua": "Зовнішній вигляд", - "de-ch": "Aussehen", - "pt-br": "Aparência", + 'en-us': 'Appearance', + 'ru-ru': 'Появление', + 'es-es': 'Apariencia', + 'fr-fr': 'Apparence', + 'uk-ua': 'Зовнішній вигляд', + 'de-ch': 'Aussehen', + 'pt-br': 'Aparência', }, buttonsLight: { - "en-us": "Buttons (light mode)", - "de-ch": "Buttons (Helles Thema)", - "es-es": "Botones (modo luz)", - "fr-fr": "Boutons (mode lumière)", - "ru-ru": "Кнопки (световой режим)", - "uk-ua": "Кнопки (світлий режим)", - "pt-br": "Botões (modo claro)", + 'en-us': 'Buttons (light mode)', + 'de-ch': 'Buttons (Helles Thema)', + 'es-es': 'Botones (modo luz)', + 'fr-fr': 'Boutons (mode lumière)', + 'ru-ru': 'Кнопки (световой режим)', + 'uk-ua': 'Кнопки (світлий режим)', + 'pt-br': 'Botões (modo claro)', }, buttonsDark: { - "en-us": "Buttons (dark mode)", - "de-ch": "Buttons (Dunkles Thema)", - "es-es": "Botones (modo oscuro)", - "fr-fr": "Boutons (mode sombre)", - "ru-ru": "Кнопки (темный режим)", - "uk-ua": "Кнопки (темний режим)", - "pt-br": "Botões (modo escuro)", + 'en-us': 'Buttons (dark mode)', + 'de-ch': 'Buttons (Dunkles Thema)', + 'es-es': 'Botones (modo oscuro)', + 'fr-fr': 'Boutons (mode sombre)', + 'ru-ru': 'Кнопки (темный режим)', + 'uk-ua': 'Кнопки (темний режим)', + 'pt-br': 'Botões (modo escuro)', }, translucentDialog: { - "en-us": "Translucent dialogs", - "ru-ru": "Прозрачные диалоги", - "es-es": "Diálogos translúcidos", - "fr-fr": "Dialogues translucides", - "uk-ua": "Напівпрозорі діалоги", - "de-ch": "Durchscheinende Dialoge", - "pt-br": "Diálogos translúcidos", + 'en-us': 'Translucent dialogs', + 'ru-ru': 'Прозрачные диалоги', + 'es-es': 'Diálogos translúcidos', + 'fr-fr': 'Dialogues translucides', + 'uk-ua': 'Напівпрозорі діалоги', + 'de-ch': 'Durchscheinende Dialoge', + 'pt-br': 'Diálogos translúcidos', }, translucentDialogDescription: { - "en-us": "Whether dialogs have translucent background.", - "ru-ru": "Имеют ли диалоговые окна полупрозрачный фон.", - "es-es": "Si los diálogos tienen fondo translúcido.", - "fr-fr": "Si les boîtes de dialogue ont un fond translucide.", - "uk-ua": "Чи мають діалоги прозорий фон.", - "de-ch": "Dialogfenster mit durchscheinenden Hintergrund.", - "pt-br": "Se os diálogos têm fundo translúcido.", + 'en-us': 'Whether dialogs have translucent background.', + 'ru-ru': 'Имеют ли диалоговые окна полупрозрачный фон.', + 'es-es': 'Si los diálogos tienen fondo translúcido.', + 'fr-fr': 'Si les boîtes de dialogue ont un fond translucide.', + 'uk-ua': 'Чи мають діалоги прозорий фон.', + 'de-ch': 'Dialogfenster mit durchscheinenden Hintergrund.', + 'pt-br': 'Se os diálogos têm fundo translúcido.', }, alwaysPrompt: { - "en-us": "Always prompt to choose collection", - "ru-ru": "Всегда предлагайте выбрать коллекцию", - "es-es": "Siempre dispuesto a elegir la colección", - "fr-fr": "Toujours invité à choisir la collection", - "uk-ua": "Завжди підкажуть вибрати колекцію", - "de-ch": "Immer zur Auswahl der Sammlung auffordern", - "pt-br": "Sempre pronto para escolher a coleção", + 'en-us': 'Always prompt to choose collection', + 'ru-ru': 'Всегда предлагайте выбрать коллекцию', + 'es-es': 'Siempre dispuesto a elegir la colección', + 'fr-fr': 'Toujours invité à choisir la collection', + 'uk-ua': 'Завжди підкажуть вибрати колекцію', + 'de-ch': 'Immer zur Auswahl der Sammlung auffordern', + 'pt-br': 'Sempre pronto para escolher a coleção', }, treeEditor: { - "en-us": "Tree Editor", - "ru-ru": "Редактор деревьев", - "es-es": "Editor de árboles", - "fr-fr": "Éditeur d'arborescence", - "uk-ua": "Редактор дерева", - "de-ch": "Baumeditor", - "pt-br": "Editor de Árvore", + 'en-us': 'Tree Editor', + 'ru-ru': 'Редактор деревьев', + 'es-es': 'Editor de árboles', + 'fr-fr': "Éditeur d'arborescence", + 'uk-ua': 'Редактор дерева', + 'de-ch': 'Baumeditor', + 'pt-br': 'Editor de Árvore', }, treeAccentColor: { - "en-us": "Tree accent color", - "ru-ru": "Акцентный цвет дерева", - "es-es": "Color de acento del árbol", - "fr-fr": "Couleur d'accent d'arbre", - "uk-ua": "Колір акценту дерева", - "de-ch": "Baumakzentfarbe", - "pt-br": "Cor de destaque da árvore", + 'en-us': 'Tree accent color', + 'ru-ru': 'Акцентный цвет дерева', + 'es-es': 'Color de acento del árbol', + 'fr-fr': "Couleur d'accent d'arbre", + 'uk-ua': 'Колір акценту дерева', + 'de-ch': 'Baumakzentfarbe', + 'pt-br': 'Cor de destaque da árvore', }, synonymColor: { - "en-us": "Synonym color", - "ru-ru": "Синоним цвет", - "es-es": "Color sinónimo", - "fr-fr": "Synonyme couleur", - "uk-ua": "Синонім кольору", - "de-ch": "Synonymfarbe", - "pt-br": "Cor sinônimo", + 'en-us': 'Synonym color', + 'ru-ru': 'Синоним цвет', + 'es-es': 'Color sinónimo', + 'fr-fr': 'Synonyme couleur', + 'uk-ua': 'Синонім кольору', + 'de-ch': 'Synonymfarbe', + 'pt-br': 'Cor sinônimo', }, showNewDataSetWarning: { - "en-us": "Show new Data Set warning", - "ru-ru": "Показать предупреждение о новом наборе данных", - "es-es": "Mostrar nueva advertencia de conjunto de datos", - "fr-fr": "Afficher un nouvel avertissement sur l'ensemble de données", - "uk-ua": "Показати попередження про новий набір даних", - "de-ch": "Warnung für neuen Datensatz anzeigen", - "pt-br": "Mostrar novo aviso de conjunto de dados", + 'en-us': 'Show new Data Set warning', + 'ru-ru': 'Показать предупреждение о новом наборе данных', + 'es-es': 'Mostrar nueva advertencia de conjunto de datos', + 'fr-fr': "Afficher un nouvel avertissement sur l'ensemble de données", + 'uk-ua': 'Показати попередження про новий набір даних', + 'de-ch': 'Warnung für neuen Datensatz anzeigen', + 'pt-br': 'Mostrar novo aviso de conjunto de dados', }, showNewDataSetWarningDescription: { - "en-us": "Show an informational message when creating a new Data Set.", - "ru-ru": - "Показывать информационное сообщение при создании нового набора данных.", - "es-es": - "Mostrar un mensaje informativo al crear un nuevo conjunto de datos.", - "fr-fr": + 'en-us': 'Show an informational message when creating a new Data Set.', + 'ru-ru': + 'Показывать информационное сообщение при создании нового набора данных.', + 'es-es': + 'Mostrar un mensaje informativo al crear un nuevo conjunto de datos.', + 'fr-fr': "Afficher un message d'information lors de la création d'un nouvel ensemble de données.", - "uk-ua": - "Показувати інформаційне повідомлення під час створення нового набору даних.", - "de-ch": "Zeige eine Meldung beim erstellen eines neuen Datensatzes an.", - "pt-br": - "Exibir uma mensagem informativa ao criar um novo conjunto de dados.", + 'uk-ua': + 'Показувати інформаційне повідомлення під час створення нового набору даних.', + 'de-ch': 'Zeige eine Meldung beim erstellen eines neuen Datensatzes an.', + 'pt-br': + 'Exibir uma mensagem informativa ao criar um novo conjunto de dados.', }, header: { - "en-us": "Navigation Menu", - "ru-ru": "Меню навигации", - "es-es": "Menú de navegación", - "fr-fr": "le menu de navigation", - "uk-ua": "Навігаційне меню", - "de-ch": "Navigationsmenü", - "pt-br": "Menu de navegação", + 'en-us': 'Navigation Menu', + 'ru-ru': 'Меню навигации', + 'es-es': 'Menú de navegación', + 'fr-fr': 'le menu de navigation', + 'uk-ua': 'Навігаційне меню', + 'de-ch': 'Navigationsmenü', + 'pt-br': 'Menu de navegação', }, application: { - "en-us": "Application", - "ru-ru": "Приложение", - "es-es": "Solicitud", - "fr-fr": "Application", - "uk-ua": "застосування", - "de-ch": "Anwendung", - "pt-br": "Aplicativo", + 'en-us': 'Application', + 'ru-ru': 'Приложение', + 'es-es': 'Solicitud', + 'fr-fr': 'Application', + 'uk-ua': 'застосування', + 'de-ch': 'Anwendung', + 'pt-br': 'Aplicativo', }, allowDismissingErrors: { - "en-us": "Allow dismissing error messages", - "ru-ru": "Разрешить отклонять сообщения об ошибках", - "es-es": "Permitir descartar mensajes de error", - "fr-fr": "Autoriser le rejet des messages d'erreur", - "uk-ua": "Дозволити закривати повідомлення про помилки", - "de-ch": "Erlaube das Verwerfen von Fehlermeldungen", - "pt-br": "Permitir descartar mensagens de erro", + 'en-us': 'Allow dismissing error messages', + 'ru-ru': 'Разрешить отклонять сообщения об ошибках', + 'es-es': 'Permitir descartar mensajes de error', + 'fr-fr': "Autoriser le rejet des messages d'erreur", + 'uk-ua': 'Дозволити закривати повідомлення про помилки', + 'de-ch': 'Erlaube das Verwerfen von Fehlermeldungen', + 'pt-br': 'Permitir descartar mensagens de erro', }, updatePageTitle: { - "en-us": "Update page title", - "ru-ru": "Обновить заголовок страницы", - "es-es": "Actualizar el título de la página", - "fr-fr": "Mettre à jour le titre de la page", - "uk-ua": "Оновити назву сторінки", - "de-ch": "Seitentitel aktualisieren", - "pt-br": "Atualizar título da página", + 'en-us': 'Update page title', + 'ru-ru': 'Обновить заголовок страницы', + 'es-es': 'Actualizar el título de la página', + 'fr-fr': 'Mettre à jour le titre de la page', + 'uk-ua': 'Оновити назву сторінки', + 'de-ch': 'Seitentitel aktualisieren', + 'pt-br': 'Atualizar título da página', }, updatePageTitleDescription: { - "en-us": + 'en-us': "Whether to update the title of the page to match dialog's header.", - "ru-ru": - "Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.", - "es-es": - "Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.", - "fr-fr": + 'ru-ru': + 'Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.', + 'es-es': + 'Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.', + 'fr-fr': "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'en-tête de la boîte de dialogue.", - "uk-ua": - "Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.", - "de-ch": - "Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.", - "pt-br": - "Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.", + 'uk-ua': + 'Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.', + 'de-ch': + 'Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.', }, updatePageTitleFormDescription: { - "en-us": "Whether to update the title of the page to match current record.", - "ru-ru": - "Следует ли обновить заголовок страницы в соответствии с текущей записью.", - "es-es": - "Si desea actualizar el título de la página para que coincida con el registro actual.", - "fr-fr": + 'en-us': 'Whether to update the title of the page to match current record.', + 'ru-ru': + 'Следует ли обновить заголовок страницы в соответствии с текущей записью.', + 'es-es': + 'Si desea actualizar el título de la página para que coincida con el registro actual.', + 'fr-fr': "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'enregistrement actuel.", - "uk-ua": "Чи оновлювати назву сторінки відповідно до поточного запису.", - "de-ch": - "Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.", - "pt-br": - "Se o título da página deve ser atualizado para corresponder ao registro atual.", + 'uk-ua': 'Чи оновлювати назву сторінки відповідно до поточного запису.', + 'de-ch': + 'Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao registro atual.', }, queryComboBox: { - "en-us": "Query Combo Box", - "ru-ru": "Поле со списком запросов", - "es-es": "Cuadro combinado de consulta", - "uk-ua": "Поле зі списком запитів", - "de-ch": "Abfrage-Kombinationsfeld", - "fr-fr": "Zone de liste déroulante de requête", - "pt-br": "Caixa de combinação de consulta", + 'en-us': 'Query Combo Box', + 'ru-ru': 'Поле со списком запросов', + 'es-es': 'Cuadro combinado de consulta', + 'uk-ua': 'Поле зі списком запитів', + 'de-ch': 'Abfrage-Kombinationsfeld', + 'fr-fr': 'Zone de liste déroulante de requête', + 'pt-br': 'Caixa de combinação de consulta', }, searchAlgorithm: { - "en-us": "Search Algorithm", - "ru-ru": "Алгоритм поиска", - "es-es": "Algoritmo de búsqueda", - "fr-fr": "Algorithme de recherche", - "uk-ua": "Алгоритм пошуку", - "de-ch": "Suchalgorithmus", - "pt-br": "Algoritmo de Busca", + 'en-us': 'Search Algorithm', + 'ru-ru': 'Алгоритм поиска', + 'es-es': 'Algoritmo de búsqueda', + 'fr-fr': 'Algorithme de recherche', + 'uk-ua': 'Алгоритм пошуку', + 'de-ch': 'Suchalgorithmus', + 'pt-br': 'Algoritmo de Busca', }, treeSearchAlgorithm: { - "en-us": "Search Algorithm (for relationships with tree tables)", - "ru-ru": "Алгоритм поиска (для связей с древовидными таблицами)", - "es-es": "Algoritmo de búsqueda (para relaciones con tablas de árboles)", - "fr-fr": - "Algorithme de recherche (pour les relations avec les tables arborescentes)", - "uk-ua": "Алгоритм пошуку (для зв’язків із деревоподібними таблицями)", - "de-ch": "Suchalgorithmus (für Beziehungen mit Baumtabellen)", - "pt-br": "Algoritmo de busca (para relacionamentos com tabelas de árvore)", + 'en-us': 'Search Algorithm (for relationships with tree tables)', + 'ru-ru': 'Алгоритм поиска (для связей с древовидными таблицами)', + 'es-es': 'Algoritmo de búsqueda (para relaciones con tablas de árboles)', + 'fr-fr': + 'Algorithme de recherche (pour les relations avec les tables arborescentes)', + 'uk-ua': 'Алгоритм пошуку (для зв’язків із деревоподібними таблицями)', + 'de-ch': 'Suchalgorithmus (für Beziehungen mit Baumtabellen)', + 'pt-br': 'Algoritmo de busca (para relacionamentos com tabelas de árvore)', }, startsWithInsensitive: { - "en-us": "Starts With (case-insensitive)", - "ru-ru": "Начинается с (без учета регистра)", - "es-es": "Comienza con (sin distinguir entre mayúsculas y minúsculas)", - "fr-fr": "Commence par (insensible à la casse)", - "uk-ua": "Починається з (без урахування регістру)", - "de-ch": "Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)", - "pt-br": "Começa com (sem distinção entre maiúsculas e minúsculas)", + 'en-us': 'Starts With (case-insensitive)', + 'ru-ru': 'Начинается с (без учета регистра)', + 'es-es': 'Comienza con (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (insensible à la casse)', + 'uk-ua': 'Починається з (без урахування регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Começa com (sem distinção entre maiúsculas e minúsculas)', }, startsWithDescription: { - "en-us": "Search for values that begin with a given query string.", - "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", - "es-es": - "Busque valores que comiencen con una cadena de consulta determinada.", - "fr-fr": - "Rechercher des valeurs commençant par une chaîne de requête donnée.", - "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", - "de-ch": - "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", - "pt-br": - "Pesquise valores que começam com uma determinada sequência de consulta.", + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Rechercher des valeurs commençant par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquise valores que começam com uma determinada sequência de consulta.', }, startsWithCaseSensitive: { - "en-us": "Starts With (case-sensitive)", - "ru-ru": "Начинается с (с учетом регистра)", - "es-es": "Comienza con (sensible a mayúsculas y minúsculas)", - "fr-fr": "Commence par (sensible à la casse)", - "uk-ua": "Починається з (з урахуванням регістру)", - "de-ch": "Beginnt mit (Groß-/Kleinschreibung beachten)", - "pt-br": "Começa com (diferencia maiúsculas de minúsculas)", + 'en-us': 'Starts With (case-sensitive)', + 'ru-ru': 'Начинается с (с учетом регистра)', + 'es-es': 'Comienza con (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (sensible à la casse)', + 'uk-ua': 'Починається з (з урахуванням регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Começa com (diferencia maiúsculas de minúsculas)', }, startsWithCaseSensitiveDescription: { - "en-us": "Search for values that begin with a given query string.", - "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", - "es-es": - "Busque valores que comiencen con una cadena de consulta determinada.", - "fr-fr": - "Recherchez les valeurs qui commencent par une chaîne de requête donnée.", - "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", - "de-ch": - "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", - "pt-br": - "Pesquise valores que começam com uma determinada sequência de consulta.", + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Recherchez les valeurs qui commencent par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquise valores que começam com uma determinada sequência de consulta.', }, containsInsensitive: { - "en-us": "Contains (case-insensitive)", - "ru-ru": "Содержит (без учета регистра)", - "es-es": "Contiene (sin distinguir entre mayúsculas y minúsculas)", - "fr-fr": "Contient (insensible à la casse)", - "uk-ua": "Містить (незалежно від регістру)", - "de-ch": "Enthält (Groß-/Kleinschreibung wird nicht beachtet)", - "pt-br": "Contém (sem distinção entre maiúsculas e minúsculas)", + 'en-us': 'Contains (case-insensitive)', + 'ru-ru': 'Содержит (без учета регистра)', + 'es-es': 'Contiene (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Contient (insensible à la casse)', + 'uk-ua': 'Містить (незалежно від регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Contém (sem distinção entre maiúsculas e minúsculas)', }, containsCaseSensitive: { - "en-us": "Contains (case-sensitive)", - "ru-ru": "Содержит (с учетом регистра)", - "es-es": "Contiene (sensible a mayúsculas y minúsculas)", - "fr-fr": "Contient (sensible à la casse)", - "uk-ua": "Містить (з урахуванням регістру)", - "de-ch": "Enthält (Groß-/Kleinschreibung beachten)", - "pt-br": "Contém (diferencia maiúsculas de minúsculas)", + 'en-us': 'Contains (case-sensitive)', + 'ru-ru': 'Содержит (с учетом регистра)', + 'es-es': 'Contiene (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Contient (sensible à la casse)', + 'uk-ua': 'Містить (з урахуванням регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Contém (diferencia maiúsculas de minúsculas)', }, containsDescription: { - "en-us": - "Search for values that contain a given query string (case-insensitive).", - "ru-ru": - "Поиск значений, содержащих заданную строку запроса (без учета регистра).", - "es-es": - "Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).", - "uk-ua": - "Пошук значень, які містять заданий рядок запиту (незалежно від регістру).", - "de-ch": - "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).", - "fr-fr": - "Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).", - "pt-br": - "Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).", + 'en-us': + 'Search for values that contain a given query string (case-insensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (без учета регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (незалежно від регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).', }, containsCaseSensitiveDescription: { - "en-us": - "Search for values that contain a given query string (case-sensitive).", - "ru-ru": - "Поиск значений, содержащих заданную строку запроса (с учетом регистра).", - "es-es": - "Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).", - "fr-fr": - "Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).", - "uk-ua": - "Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).", - "de-ch": - "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).", - "pt-br": - "Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).", + 'en-us': + 'Search for values that contain a given query string (case-sensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (с учетом регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).', }, containsSecondDescription: { - "en-us": - "Can use _ to match any single character or % to match any number of characters.", - "ru-ru": - "Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.", - "es-es": - "Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.", - "fr-fr": + 'en-us': + 'Can use _ to match any single character or % to match any number of characters.', + 'ru-ru': + 'Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.', + 'es-es': + 'Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.', + 'fr-fr': "Peut utiliser _ pour correspondre à n'importe quel caractère ou % pour correspondre à n'importe quel nombre de caractères.", - "uk-ua": - "Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.", - "de-ch": - "Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.", - "pt-br": - "Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.", + 'uk-ua': + 'Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.', + 'de-ch': + 'Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.', + 'pt-br': + 'Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.', }, highlightMatch: { - "en-us": "Highlight matched substring", - "ru-ru": "Выделить совпавшую подстроку", - "es-es": "Resaltar la subcadena coincidente", - "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", - "uk-ua": "Виділіть збіг підрядка", - "de-ch": "Markieren Sie übereinstimmende Teilzeichenfolgen", - "pt-br": "Destacar substring correspondente", + 'en-us': 'Highlight matched substring', + 'ru-ru': 'Выделить совпавшую подстроку', + 'es-es': 'Resaltar la subcadena coincidente', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'uk-ua': 'Виділіть збіг підрядка', + 'de-ch': 'Markieren Sie übereinstimmende Teilzeichenfolgen', + 'pt-br': 'Destacar substring correspondente', }, languageDescription: { - "en-us": "Determines field captions, usage notes and table captions.", - "ru-ru": - "Определяет заголовки полей, примечания по использованию и заголовки таблиц.", - "es-es": "Determina títulos de campos, notas de uso y títulos de tablas.", - "fr-fr": + 'en-us': 'Determines field captions, usage notes and table captions.', + 'ru-ru': + 'Определяет заголовки полей, примечания по использованию и заголовки таблиц.', + 'es-es': 'Determina títulos de campos, notas de uso y títulos de tablas.', + 'fr-fr': "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux.", - "uk-ua": - "Визначає підписи полів, примітки щодо використання та підписи таблиць.", - "de-ch": - "Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.", - "pt-br": "Determina legendas de campo, notas de uso e legendas de tabela.", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць.', + 'de-ch': + 'Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.', + 'pt-br': 'Determina legendas de campo, notas de uso e legendas de tabela.', }, showDialogIcon: { - "en-us": "Show icon in the header", - "ru-ru": "Показывать значок в заголовке", - "es-es": "Mostrar icono en el encabezado", - "fr-fr": "Afficher l'icône dans l'en-tête", - "uk-ua": "Показати значок у заголовку", - "de-ch": "Symbol in der Kopfzeile anzeigen", - "pt-br": "Mostrar ícone no cabeçalho", + 'en-us': 'Show icon in the header', + 'ru-ru': 'Показывать значок в заголовке', + 'es-es': 'Mostrar icono en el encabezado', + 'fr-fr': "Afficher l'icône dans l'en-tête", + 'uk-ua': 'Показати значок у заголовку', + 'de-ch': 'Symbol in der Kopfzeile anzeigen', + 'pt-br': 'Mostrar ícone no cabeçalho', }, scaleInterface: { - "en-us": "Scale Interface", - "ru-ru": "Интерфейс масштабирования", - "es-es": "Interfaz de escala", - "fr-fr": "Interface de balance", - "uk-ua": "Інтерфейс масштабу", - "de-ch": "Waagenschnittstelle", - "pt-br": "Interface de escala", + 'en-us': 'Scale Interface', + 'ru-ru': 'Интерфейс масштабирования', + 'es-es': 'Interfaz de escala', + 'fr-fr': 'Interface de balance', + 'uk-ua': 'Інтерфейс масштабу', + 'de-ch': 'Waagenschnittstelle', + 'pt-br': 'Interface de escala', }, scaleInterfaceDescription: { - "en-us": "Scale interface to match font size.", - "ru-ru": "Масштабируйте интерфейс в соответствии с размером шрифта.", - "es-es": "Escala la interfaz para que coincida con el tamaño de la fuente.", - "fr-fr": "Adapter l'interface à la taille de la police.", - "uk-ua": "Масштабуйте інтерфейс відповідно до розміру шрифту.", - "de-ch": - "Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.", - "pt-br": "Dimensione a interface para corresponder ao tamanho da fonte.", + 'en-us': 'Scale interface to match font size.', + 'ru-ru': 'Масштабируйте интерфейс в соответствии с размером шрифта.', + 'es-es': 'Escala la interfaz para que coincida con el tamaño de la fuente.', + 'fr-fr': "Adapter l'interface à la taille de la police.", + 'uk-ua': 'Масштабуйте інтерфейс відповідно до розміру шрифту.', + 'de-ch': + 'Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.', + 'pt-br': 'Dimensione a interface para corresponder ao tamanho da fonte.', }, displayAuthor: { - "en-us": "Show author in the tree", - "ru-ru": "Показать автора в дереве", - "es-es": "Mostrar autor en el árbol", - "fr-fr": "Afficher l'auteur dans l'arbre", - "uk-ua": "Показати автора в дереві", - "de-ch": "Autor im Baum anzeigen", - "pt-br": "Mostrar autor", + 'en-us': 'Show author in the tree', + 'ru-ru': 'Показать автора в дереве', + 'es-es': 'Mostrar autor en el árbol', + 'fr-fr': "Afficher l'auteur dans l'arbre", + 'uk-ua': 'Показати автора в дереві', + 'de-ch': 'Autor im Baum anzeigen', + 'pt-br': 'Mostrar autor', }, welcomePage: { - "en-us": "Home Page", - "ru-ru": "Домашняя страница", - "es-es": "Página de inicio", - "fr-fr": "Page d'accueil", - "uk-ua": "Домашня сторінка", - "de-ch": "Startseite", - "pt-br": "Página inicial", + 'en-us': 'Home Page', + 'ru-ru': 'Домашняя страница', + 'es-es': 'Página de inicio', + 'fr-fr': "Page d'accueil", + 'uk-ua': 'Домашня сторінка', + 'de-ch': 'Startseite', + 'pt-br': 'Página inicial', }, content: { - "en-us": "Content", - "ru-ru": "Содержание", - "es-es": "Contenido", - "fr-fr": "Contenu", - "uk-ua": "Зміст", - "de-ch": "Inhalt", - "pt-br": "Contente", + 'en-us': 'Content', + 'ru-ru': 'Содержание', + 'es-es': 'Contenido', + 'fr-fr': 'Contenu', + 'uk-ua': 'Зміст', + 'de-ch': 'Inhalt', + 'pt-br': 'Contente', }, defaultImage: { - "en-us": "Specify Logo", - "ru-ru": "Укажите логотип", - "es-es": "Especificar logotipo", - "fr-fr": "Spécifier le logo", - "uk-ua": "Вкажіть логотип", - "de-ch": "Logo angeben", - "pt-br": "Especificar logotipo", + 'en-us': 'Specify Logo', + 'ru-ru': 'Укажите логотип', + 'es-es': 'Especificar logotipo', + 'fr-fr': 'Spécifier le logo', + 'uk-ua': 'Вкажіть логотип', + 'de-ch': 'Logo angeben', + 'pt-br': 'Especificar logotipo', }, customImage: { - "en-us": "Custom Image", - "ru-ru": "Пользовательское изображение", - "es-es": "Imagen personalizada", - "fr-fr": "Image personnalisée", - "uk-ua": "Спеціальне зображення", - "de-ch": "Benutzerdefiniertes Bild", - "pt-br": "Imagem personalizada", + 'en-us': 'Custom Image', + 'ru-ru': 'Пользовательское изображение', + 'es-es': 'Imagen personalizada', + 'fr-fr': 'Image personnalisée', + 'uk-ua': 'Спеціальне зображення', + 'de-ch': 'Benutzerdefiniertes Bild', + 'pt-br': 'Imagem personalizada', }, embeddedWebpage: { - "en-us": "Embedded web page", - "ru-ru": "Встроенная веб-страница", - "es-es": "Página web incrustada", - "fr-fr": "Page Web intégrée", - "uk-ua": "Вбудована веб-сторінка", - "de-ch": "Eingebettete Webseite", - "pt-br": "Página da web incorporada", + 'en-us': 'Embedded web page', + 'ru-ru': 'Встроенная веб-страница', + 'es-es': 'Página web incrustada', + 'fr-fr': 'Page Web intégrée', + 'uk-ua': 'Вбудована веб-сторінка', + 'de-ch': 'Eingebettete Webseite', + 'pt-br': 'Página da web incorporada', }, embeddedWebpageDescription: { - "en-us": "A URL to a page that would be embedded on the home page:", - "ru-ru": "URL-адрес страницы, которая будет встроена в домашнюю страницу:", - "es-es": "Una URL a una página que se integrará en la página de inicio:", - "fr-fr": "Une URL vers une page qui serait intégrée à la page d'accueil :", - "uk-ua": "URL-адреса сторінки, яка буде вбудована на домашній сторінці:", - "de-ch": - "Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:", - "pt-br": "Um URL para uma página que seria incorporada na página inicial:", + 'en-us': 'A URL to a page that would be embedded on the home page:', + 'ru-ru': 'URL-адрес страницы, которая будет встроена в домашнюю страницу:', + 'es-es': 'Una URL a una página que se integrará en la página de inicio:', + 'fr-fr': "Une URL vers une page qui serait intégrée à la page d'accueil :", + 'uk-ua': 'URL-адреса сторінки, яка буде вбудована на домашній сторінці:', + 'de-ch': + 'Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:', + 'pt-br': 'Um URL para uma página que seria incorporada na página inicial:', }, behavior: { - "en-us": "Behavior", - "ru-ru": "Поведение", - "es-es": "Comportamiento", - "fr-fr": "Comportement", - "uk-ua": "Поведінка", - "de-ch": "Verhalten", - "pt-br": "Comportamento", + 'en-us': 'Behavior', + 'ru-ru': 'Поведение', + 'es-es': 'Comportamiento', + 'fr-fr': 'Comportement', + 'uk-ua': 'Поведінка', + 'de-ch': 'Verhalten', + 'pt-br': 'Comportamento', }, noRestrictionsMode: { - "en-us": "No restrictions mode", - "ru-ru": "Режим без ограничений", - "es-es": "Modo sin restricciones", - "fr-fr": "Mode sans restriction", - "uk-ua": "Режим без обмежень", - "de-ch": "Modus „Keine Einschränkungen“", - "pt-br": "Modo sem restrições", + 'en-us': 'No restrictions mode', + 'ru-ru': 'Режим без ограничений', + 'es-es': 'Modo sin restricciones', + 'fr-fr': 'Mode sans restriction', + 'uk-ua': 'Режим без обмежень', + 'de-ch': 'Modus „Keine Einschränkungen“', + 'pt-br': 'Modo sem restrições', }, noRestrictionsModeWbDescription: { - "en-us": "Allows uploading data to any field in any table.", - "ru-ru": "Позволяет загружать данные в любое поле любой таблицы.", - "es-es": "Permite cargar datos a cualquier campo de cualquier tabla.", - "fr-fr": + 'en-us': 'Allows uploading data to any field in any table.', + 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', + 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', + 'fr-fr': "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", - "uk-ua": "Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.", - "de-ch": - "Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.", - "pt-br": "Permite carregar dados em qualquer campo de qualquer tabela.", + 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', + 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', }, noRestrictionsModeQueryDescription: { - "en-us": "Allows querying data from any field in any table.", - "ru-ru": "Позволяет запрашивать данные из любого поля любой таблицы.", - "es-es": "Permite consultar datos de cualquier campo de cualquier tabla.", - "fr-fr": + 'en-us': 'Allows querying data from any field in any table.', + 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', + 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', + 'fr-fr': "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", - "uk-ua": "Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.", - "de-ch": - "Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.", - "pt-br": "Permite consultar dados de qualquer campo em qualquer tabela.", + 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', + 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', }, noRestrictionsModeWarning: { - "en-us": - "WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.", - "ru-ru": - "ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.", - "es-es": - "ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.", - "uk-ua": - "ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.", - "de-ch": - "WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.", - "fr-fr": + 'en-us': + 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', + 'ru-ru': + 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', + 'es-es': + 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', + 'uk-ua': + 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', + 'de-ch': + 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', + 'fr-fr': "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", - "pt-br": - "AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.", + 'pt-br': + 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', }, adminsOnlyPreference: { - "en-us": "You don't have permission to change this option", - "ru-ru": "У вас нет разрешения на изменение этой опции.", - "es-es": "No tienes permiso para cambiar esta opción", - "fr-fr": "Vous n'êtes pas autorisé à modifier cette option", - "uk-ua": "Ви не маєте дозволу змінювати цей параметр", - "de-ch": "Sie haben keine Berechtigung, diese Option zu ändern", - "pt-br": "Você não tem permissão para alterar esta opção", + 'en-us': "You don't have permission to change this option", + 'ru-ru': 'У вас нет разрешения на изменение этой опции.', + 'es-es': 'No tienes permiso para cambiar esta opción', + 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", + 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', + 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', + 'pt-br': 'Você não tem permissão para alterar esta opção', }, stickyScrolling: { - "en-us": "Sticky scroll bar", - "ru-ru": "Липкая полоса прокрутки", - "es-es": "Barra de desplazamiento fija", - "fr-fr": "Barre de défilement collante", - "uk-ua": "Липка смуга прокрутки", - "de-ch": "Klebrige Bildlaufleiste", - "pt-br": "Barra de rolagem fixa", + 'en-us': 'Sticky scroll bar', + 'ru-ru': 'Липкая полоса прокрутки', + 'es-es': 'Barra de desplazamiento fija', + 'fr-fr': 'Barre de défilement collante', + 'uk-ua': 'Липка смуга прокрутки', + 'de-ch': 'Klebrige Bildlaufleiste', + 'pt-br': 'Barra de rolagem fixa', }, foreground: { - "en-us": "Foreground", - "ru-ru": "Передний план", - "es-es": "Primer plano", - "fr-fr": "Premier plan", - "uk-ua": "Передній план", - "de-ch": "Vordergrund", - "pt-br": "Primeiro plano", + 'en-us': 'Foreground', + 'ru-ru': 'Передний план', + 'es-es': 'Primer plano', + 'fr-fr': 'Premier plan', + 'uk-ua': 'Передній план', + 'de-ch': 'Vordergrund', + 'pt-br': 'Primeiro plano', }, background: { - "en-us": "Background", - "ru-ru": "Фон", - "es-es": "Fondo", - "fr-fr": "Arrière-plan", - "uk-ua": "Фон", - "de-ch": "Hintergrund", - "pt-br": "Fundo", + 'en-us': 'Background', + 'ru-ru': 'Фон', + 'es-es': 'Fondo', + 'fr-fr': 'Arrière-plan', + 'uk-ua': 'Фон', + 'de-ch': 'Hintergrund', + 'pt-br': 'Fundo', }, sidebarTheme: { - "en-us": "Sidebar theme", - "de-ch": "Seitenleistenthema", - "es-es": "Tema de la barra lateral", - "fr-fr": "Thème de la barre latérale", - "ru-ru": "Тема боковой панели", - "uk-ua": "Тема бічної панелі", - "pt-br": "Tema da barra lateral", + 'en-us': 'Sidebar theme', + 'de-ch': 'Seitenleistenthema', + 'es-es': 'Tema de la barra lateral', + 'fr-fr': 'Thème de la barre latérale', + 'ru-ru': 'Тема боковой панели', + 'uk-ua': 'Тема бічної панелі', + 'pt-br': 'Tema da barra lateral', }, darkForeground: { - "en-us": "Foreground (dark theme)", - "ru-ru": "Передний план (тёмная тема)", - "es-es": "Primer plano (tema oscuro)", - "fr-fr": "Premier plan (thème sombre)", - "uk-ua": "Передній план (темна тема)", - "de-ch": "Vordergrund (dunkles Design)", - "pt-br": "Primeiro plano (tema escuro)", + 'en-us': 'Foreground (dark theme)', + 'ru-ru': 'Передний план (тёмная тема)', + 'es-es': 'Primer plano (tema oscuro)', + 'fr-fr': 'Premier plan (thème sombre)', + 'uk-ua': 'Передній план (темна тема)', + 'de-ch': 'Vordergrund (dunkles Design)', + 'pt-br': 'Primeiro plano (tema escuro)', }, darkBackground: { - "en-us": "Background (dark theme)", - "ru-ru": "Фон (тёмная тема)", - "es-es": "Fondo (tema oscuro)", - "fr-fr": "Arrière-plan (thème sombre)", - "uk-ua": "Фон (темна тема)", - "de-ch": "Hintergrund (dunkles Design)", - "pt-br": "Plano de fundo (tema escuro)", + 'en-us': 'Background (dark theme)', + 'ru-ru': 'Фон (тёмная тема)', + 'es-es': 'Fondo (tema oscuro)', + 'fr-fr': 'Arrière-plan (thème sombre)', + 'uk-ua': 'Фон (темна тема)', + 'de-ch': 'Hintergrund (dunkles Design)', + 'pt-br': 'Plano de fundo (tema escuro)', }, accentColor1: { - "en-us": "Accent color 1", - "ru-ru": "Акцентный цвет 1", - "es-es": "Color de acento 1", - "fr-fr": "Couleur d'accent 1", - "uk-ua": "Акцентний колір 1", - "de-ch": "Akzentfarbe 1", - "pt-br": "Cor de destaque 1", + 'en-us': 'Accent color 1', + 'ru-ru': 'Акцентный цвет 1', + 'es-es': 'Color de acento 1', + 'fr-fr': "Couleur d'accent 1", + 'uk-ua': 'Акцентний колір 1', + 'de-ch': 'Akzentfarbe 1', + 'pt-br': 'Cor de destaque 1', }, accentColor2: { - "en-us": "Accent color 2", - "ru-ru": "Акцентный цвет 2", - "es-es": "Color de acento 2", - "fr-fr": "Couleur d'accent 2", - "uk-ua": "Акцентний колір 2", - "de-ch": "Akzentfarbe 2", - "pt-br": "Cor de destaque 2", + 'en-us': 'Accent color 2', + 'ru-ru': 'Акцентный цвет 2', + 'es-es': 'Color de acento 2', + 'fr-fr': "Couleur d'accent 2", + 'uk-ua': 'Акцентний колір 2', + 'de-ch': 'Akzentfarbe 2', + 'pt-br': 'Cor de destaque 2', }, accentColor3: { - "en-us": "Accent color 3", - "ru-ru": "Акцентный цвет 3", - "es-es": "Color de acento 3", - "fr-fr": "Couleur d'accent 3", - "uk-ua": "Акцентний колір 3", - "de-ch": "Akzentfarbe 3", - "pt-br": "Cor de destaque 3", + 'en-us': 'Accent color 3', + 'ru-ru': 'Акцентный цвет 3', + 'es-es': 'Color de acento 3', + 'fr-fr': "Couleur d'accent 3", + 'uk-ua': 'Акцентний колір 3', + 'de-ch': 'Akzentfarbe 3', + 'pt-br': 'Cor de destaque 3', }, accentColor4: { - "en-us": "Accent color 4", - "ru-ru": "Акцентный цвет 4", - "es-es": "Color de acento 4", - "fr-fr": "Couleur d'accent 4", - "uk-ua": "Акцентний колір 4", - "de-ch": "Akzentfarbe 4", - "pt-br": "Cor de destaque 4", + 'en-us': 'Accent color 4', + 'ru-ru': 'Акцентный цвет 4', + 'es-es': 'Color de acento 4', + 'fr-fr': "Couleur d'accent 4", + 'uk-ua': 'Акцентний колір 4', + 'de-ch': 'Akzentfarbe 4', + 'pt-br': 'Cor de destaque 4', }, accentColor5: { - "en-us": "Accent color 5", - "ru-ru": "Акцентный цвет 5", - "es-es": "Color de acento 5", - "fr-fr": "Couleur d'accent 5", - "uk-ua": "Акцентний колір 5", - "de-ch": "Akzentfarbe 5", - "pt-br": "Cor de destaque 5", + 'en-us': 'Accent color 5', + 'ru-ru': 'Акцентный цвет 5', + 'es-es': 'Color de acento 5', + 'fr-fr': "Couleur d'accent 5", + 'uk-ua': 'Акцентний колір 5', + 'de-ch': 'Akzentfarbe 5', + 'pt-br': 'Cor de destaque 5', }, spreadsheet: { - "en-us": "Spreadsheet", - "ru-ru": "Электронная таблица", - "es-es": "Hoja de cálculo", - "fr-fr": "Tableur", - "uk-ua": "Електронна таблиця", - "de-ch": "Kalkulationstabelle", - "pt-br": "Planilha", + 'en-us': 'Spreadsheet', + 'ru-ru': 'Электронная таблица', + 'es-es': 'Hoja de cálculo', + 'fr-fr': 'Tableur', + 'uk-ua': 'Електронна таблиця', + 'de-ch': 'Kalkulationstabelle', + 'pt-br': 'Planilha', }, minSpareRows: { - "en-us": "Number of blank rows at the end", - "ru-ru": "Количество пустых строк в конце", - "es-es": "Número de filas en blanco al final", - "fr-fr": "Nombre de lignes vides à la fin", - "uk-ua": "Кількість порожніх рядків у кінці", - "de-ch": "Anzahl der leeren Zeilen am Ende", - "pt-br": "Número de linhas em branco no final", + 'en-us': 'Number of blank rows at the end', + 'ru-ru': 'Количество пустых строк в конце', + 'es-es': 'Número de filas en blanco al final', + 'fr-fr': 'Nombre de lignes vides à la fin', + 'uk-ua': 'Кількість порожніх рядків у кінці', + 'de-ch': 'Anzahl der leeren Zeilen am Ende', + 'pt-br': 'Número de linhas em branco no final', }, autoWrapCols: { - "en-us": "Navigate to the other side when reaching the edge column", - "ru-ru": "Достигнув крайней колонны, перейдите на другую сторону.", - "es-es": "Navegue hacia el otro lado al llegar a la columna del borde.", - "fr-fr": - "Naviguez de l’autre côté lorsque vous atteignez la colonne de bord", - "uk-ua": "Перейдіть на іншу сторону, коли досягнете краю колонки", - "de-ch": - "Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen", - "pt-br": "Navegue para o outro lado ao atingir a coluna da borda", + 'en-us': 'Navigate to the other side when reaching the edge column', + 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', }, autoWrapRows: { - "en-us": "Navigate to the other side when reaching the edge row", - "ru-ru": "Достигнув крайнего ряда, перейдите на другую сторону.", - "es-es": "Navegue hacia el otro lado al llegar a la fila del borde.", - "fr-fr": - "Naviguez de l’autre côté lorsque vous atteignez la rangée de bord", - "uk-ua": "Перейдіть на іншу сторону, коли досягнете крайнього ряду", - "de-ch": - "Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen", - "pt-br": "Navegue para o outro lado ao atingir a fileira de bordas", + 'en-us': 'Navigate to the other side when reaching the edge row', + 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', }, enterBeginsEditing: { - "en-us": "Enter key begins editing cell", - "ru-ru": "Клавиша Enter начинает редактирование ячейки.", - "es-es": "La tecla Enter inicia la edición de la celda", - "fr-fr": "La touche Entrée commence à modifier la cellule", - "uk-ua": "Клавіша Enter починає редагування клітинки", - "de-ch": "Mit der Eingabetaste beginnt die Bearbeitung der Zelle", - "pt-br": "A tecla Enter inicia a edição da célula", + 'en-us': 'Enter key begins editing cell', + 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', + 'es-es': 'La tecla Enter inicia la edición de la celda', + 'fr-fr': 'La touche Entrée commence à modifier la cellule', + 'uk-ua': 'Клавіша Enter починає редагування клітинки', + 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', + 'pt-br': 'A tecla Enter inicia a edição da célula', }, tabMoveDirection: { - "en-us": "Direction of movement when Tab key is pressed", - "ru-ru": "Направление движения при нажатии клавиши Tab", - "es-es": - "Dirección de movimiento cuando se presiona la tecla Tab", - "fr-fr": - "Sens de déplacement lorsque la touche Tabulation est enfoncée", - "uk-ua": "Напрямок руху при натисканні клавіші Tab", - "de-ch": "Bewegungsrichtung beim Drücken der Tab-Taste", - "pt-br": "Direção do movimento quando a tecla Tab é pressionada", + 'en-us': 'Direction of movement when Tab key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Tab', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Tab', + 'fr-fr': + 'Sens de déplacement lorsque la touche Tabulation est enfoncée', + 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', + 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', + 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', }, tabMoveDirectionDescription: { - "en-us": - "You can move in the opposite direction by pressing Shift+Tab.", - "ru-ru": - "Вы можете двигаться в обратном направлении, нажав Shift+Tab.", - "es-es": - "Puedes moverte en la dirección opuesta presionando Shift+Tab.", - "fr-fr": - "Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.", - "uk-ua": - "Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.", - "de-ch": - "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.", - "pt-br": - "Você pode mover na direção oposta pressionando Shift+Tab.", + 'en-us': + 'You can move in the opposite direction by pressing Shift+Tab.', + 'ru-ru': + 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', + 'fr-fr': + 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', + 'uk-ua': + 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Tab.', }, column: { - "en-us": "Column", - "ru-ru": "Столбец", - "es-es": "Columna", - "fr-fr": "Colonne", - "uk-ua": "Колонка", - "de-ch": "Spalte", - "pt-br": "Coluna", + 'en-us': 'Column', + 'ru-ru': 'Столбец', + 'es-es': 'Columna', + 'fr-fr': 'Colonne', + 'uk-ua': 'Колонка', + 'de-ch': 'Spalte', + 'pt-br': 'Coluna', }, row: { - "en-us": "Row", - "ru-ru": "Ряд", - "es-es": "Fila", - "fr-fr": "Rangée", - "uk-ua": "рядок", - "de-ch": "Reihe", - "pt-br": "Linha", + 'en-us': 'Row', + 'ru-ru': 'Ряд', + 'es-es': 'Fila', + 'fr-fr': 'Rangée', + 'uk-ua': 'рядок', + 'de-ch': 'Reihe', + 'pt-br': 'Linha', }, enterMoveDirection: { - "en-us": "Direction of movement when Enter key is pressed", - "ru-ru": "Направление движения при нажатии клавиши Enter", - "es-es": - "Dirección de movimiento cuando se presiona la tecla Enter", - "uk-ua": "Напрямок руху, коли натиснуто клавішу Enter", - "de-ch": "Bewegungsrichtung beim Drücken der Taste Enter", - "fr-fr": - "Direction du mouvement lorsque la touche Entrer est enfoncée", - "pt-br": - "Direção do movimento quando a tecla Enter é pressionada", + 'en-us': 'Direction of movement when Enter key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Enter', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Enter', + 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', + 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', + 'fr-fr': + 'Direction du mouvement lorsque la touche Entrer est enfoncée', + 'pt-br': + 'Direção do movimento quando a tecla Enter é pressionada', }, enterMoveDirectionDescription: { - "en-us": - "You can move in the opposite direction by pressing Shift+Enter.", - "ru-ru": - "Вы можете двигаться в противоположном направлении, нажав Shift+Enter.", - "es-es": - "Puedes moverte en la dirección opuesta presionando Shift+Enter.", - "fr-fr": "Synonyme couleur.", - "uk-ua": - "Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.", - "de-ch": - "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.", - "pt-br": - "Você pode mover na direção oposta pressionando Shift+Enter.", + 'en-us': + 'You can move in the opposite direction by pressing Shift+Enter.', + 'ru-ru': + 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', + 'fr-fr': 'Synonyme couleur.', + 'uk-ua': + 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Enter.', }, filterPickLists: { - "en-us": "Filter pick list items", - "ru-ru": "Фильтрация элементов списка выбора", - "es-es": "Filtrar elementos de la lista de selección", - "fr-fr": "Filtrer les éléments de la liste de sélection", - "uk-ua": "Фільтр вибору елементів списку", - "de-ch": "Auswahllistenelemente filtern", - "pt-br": "Filtrar itens da lista de seleção", + 'en-us': 'Filter pick list items', + 'ru-ru': 'Фильтрация элементов списка выбора', + 'es-es': 'Filtrar elementos de la lista de selección', + 'fr-fr': 'Filtrer les éléments de la liste de sélection', + 'uk-ua': 'Фільтр вибору елементів списку', + 'de-ch': 'Auswahllistenelemente filtern', + 'pt-br': 'Filtrar itens da lista de seleção', }, exportFileDelimiter: { - "en-us": "Export file delimiter", - "ru-ru": "Разделитель файлов экспорта", - "es-es": "Delimitador de archivo de exportación", - "fr-fr": "Délimiteur de fichier d'exportation", - "uk-ua": "Роздільник файлу експорту", - "de-ch": "Dateitrennzeichen exportieren", - "pt-br": "Delimitador de arquivo de exportação", + 'en-us': 'Export file delimiter', + 'ru-ru': 'Разделитель файлов экспорта', + 'es-es': 'Delimitador de archivo de exportación', + 'fr-fr': "Délimiteur de fichier d'exportation", + 'uk-ua': 'Роздільник файлу експорту', + 'de-ch': 'Dateitrennzeichen exportieren', + 'pt-br': 'Delimitador de arquivo de exportação', }, exportCsvUtf8Bom: { - "en-us": "Add UTF-8 BOM to CSV file exports", - "ru-ru": "Добавить UTF-8 BOM в экспорт CSV-файла", - "es-es": "Agregar BOM UTF-8 a las exportaciones de archivos CSV", - "fr-fr": "Ajouter UTF-8 BOM aux exportations de fichiers CSV", - "uk-ua": "Додайте специфікацію UTF-8 до експорту файлу CSVу", - "de-ch": "UTF-8 BOM zum CSV-Dateiexport hinzufügen", - "pt-br": "Adicionar UTF-8 BOM às exportações de arquivos CSV", + 'en-us': 'Add UTF-8 BOM to CSV file exports', + 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', + 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', + 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', + 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', + 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', + 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', }, exportCsvUtf8BomDescription: { - "en-us": - "Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.", - "ru-ru": "Корректное отображение экспортированных CSV-файлов в Excel.", - "es-es": - "Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.", - "fr-fr": + 'en-us': + 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', + 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', + 'es-es': + 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', + 'fr-fr': "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", - "uk-ua": "Змушує експорт файлів CSV правильно відображатися в Excel.", - "de-ch": - "Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.", - "pt-br": - "Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.", + 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', + 'de-ch': + 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', + 'pt-br': + 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', }, caseSensitive: { - "en-us": "Case-sensitive", - "ru-ru": "С учетом регистра", - "es-es": "Distingue mayúsculas y minúsculas", - "fr-fr": "Sensible aux majuscules et minuscules", - "uk-ua": "Чутливий до регістру", - "de-ch": "Groß- und Kleinschreibung beachten", - "pt-br": "Maiúsculas e minúsculas", + 'en-us': 'Case-sensitive', + 'ru-ru': 'С учетом регистра', + 'es-es': 'Distingue mayúsculas y minúsculas', + 'fr-fr': 'Sensible aux majuscules et minuscules', + 'uk-ua': 'Чутливий до регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'pt-br': 'Maiúsculas e minúsculas', }, caseInsensitive: { - "en-us": "Case-insensitive", - "ru-ru": "Без учета регистра", - "es-es": "No distingue entre mayúsculas y minúsculas", - "fr-fr": "Insensible à la casse", - "uk-ua": "Регістр не враховується", - "de-ch": "Groß- und Kleinschreibung wird nicht berücksichtigt", - "pt-br": "Não diferencia maiúsculas de minúsculas", + 'en-us': 'Case-insensitive', + 'ru-ru': 'Без учета регистра', + 'es-es': 'No distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Insensible à la casse', + 'uk-ua': 'Регістр не враховується', + 'de-ch': 'Groß- und Kleinschreibung wird nicht berücksichtigt', + 'pt-br': 'Não diferencia maiúsculas de minúsculas', }, showNoReadTables: { - "en-us": 'Show tables without "Read" access', - "ru-ru": "Показывать таблицы без доступа «Чтение»", - "es-es": 'Mostrar tablas sin acceso de "Lectura"', - "fr-fr": 'Afficher les tableaux sans accès "Lecture"', - "uk-ua": "Показувати таблиці без доступу «Читання»", - "de-ch": "Tabellen ohne Lesezugriff anzeigen", - "pt-br": 'Mostrar tabelas sem acesso de "Leitura"', + 'en-us': 'Show tables without "Read" access', + 'ru-ru': 'Показывать таблицы без доступа «Чтение»', + 'es-es': 'Mostrar tablas sin acceso de "Lectura"', + 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', + 'uk-ua': 'Показувати таблиці без доступу «Читання»', + 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', }, showNoAccessTables: { - "en-us": 'Show tables without "Create" access', - "ru-ru": "Показывать таблицы без права «Создать»", - "es-es": 'Mostrar tablas sin acceso "Crear"', - "fr-fr": 'Afficher les tableaux sans accès "Créer"', - "uk-ua": "Показувати таблиці без доступу «Створити»", - "de-ch": "Tabellen ohne „Erstellen“-Zugriff anzeigen", - "pt-br": 'Mostrar tabelas sem acesso "Criar"', + 'en-us': 'Show tables without "Create" access', + 'ru-ru': 'Показывать таблицы без права «Создать»', + 'es-es': 'Mostrar tablas sin acceso "Crear"', + 'fr-fr': 'Afficher les tableaux sans accès "Créer"', + 'uk-ua': 'Показувати таблиці без доступу «Створити»', + 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso "Criar"', }, textAreaAutoGrow: { - "en-us": "Text boxes grow automatically", - "ru-ru": "Текстовые поля увеличиваются автоматически", - "es-es": "Los cuadros de texto crecen automáticamente", - "fr-fr": "Les zones de texte s'agrandissent automatiquement", - "uk-ua": "Текстові поля збільшуються автоматично", - "de-ch": "Textfelder werden automatisch vergrößert", - "pt-br": "As caixas de texto crescem automaticamente", + 'en-us': 'Text boxes grow automatically', + 'ru-ru': 'Текстовые поля увеличиваются автоматически', + 'es-es': 'Los cuadros de texto crecen automáticamente', + 'fr-fr': "Les zones de texte s'agrandissent automatiquement", + 'uk-ua': 'Текстові поля збільшуються автоматично', + 'de-ch': 'Textfelder werden automatisch vergrößert', + 'pt-br': 'As caixas de texto crescem automaticamente', }, clearQueryFilters: { - "en-us": "Reset query filters", - "ru-ru": "Сбросить фильтры запроса", - "es-es": "Restablecer filtros de consulta", - "fr-fr": "Réinitialiser les filtres de requête", - "uk-ua": "Скинути фільтри запитів", - "de-ch": "Abfragefilter zurücksetzen", - "pt-br": "Redefinir filtros de consulta", + 'en-us': 'Reset query filters', + 'ru-ru': 'Сбросить фильтры запроса', + 'es-es': 'Restablecer filtros de consulta', + 'fr-fr': 'Réinitialiser les filtres de requête', + 'uk-ua': 'Скинути фільтри запитів', + 'de-ch': 'Abfragefilter zurücksetzen', + 'pt-br': 'Redefinir filtros de consulta', }, clearQueryFiltersDescription: { - "en-us": "Clears all query filters when running a Report from a Form.", - "de-ch": - "Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.", - "es-es": - "Borra todos los filtros de consulta al ejecutar un informe desde un formulario.", - "fr-fr": + 'en-us': 'Clears all query filters when running a Report from a Form.', + 'de-ch': + 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', + 'es-es': + 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', + 'fr-fr': "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", - "ru-ru": "Очищает все фильтры запроса при запуске отчета из формы.", - "uk-ua": "Очищає всі фільтри запитів під час запуску звіту з форми.", - "pt-br": - "Limpa todos os filtros de consulta ao executar um relatório de um formulário.", + 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', + 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', + 'pt-br': + 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', }, queryParamtersFromForm: { - "en-us": "Show query filters when running a Report from a Form", - "de-ch": - "Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird", - "es-es": - "Mostrar filtros de consulta al ejecutar un informe desde un formulario", - "fr-fr": + 'en-us': 'Show query filters when running a Report from a Form', + 'de-ch': + 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', + 'es-es': + 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', + 'fr-fr': "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", - "ru-ru": "Показывать фильтры запроса при запуске отчета из формы", - "uk-ua": "Показувати фільтри запитів під час запуску звіту з форми", - "pt-br": - "Mostrar filtros de consulta ao executar um relatório de um formulário", + 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', + 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', + 'pt-br': + 'Mostrar filtros de consulta ao executar um relatório de um formulário', }, autoGrowAutoComplete: { - "en-us": "Allow autocomplete to grow as wide as need", - "ru-ru": - "Разрешить автозаполнению расширяться настолько, насколько это необходимо", - "es-es": "Permitir que el autocompletado crezca tanto como sea necesario", - "fr-fr": - "Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée", - "uk-ua": - "Дозволити автозаповнення розширюватися настільки, наскільки потрібно", - "de-ch": - "Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen", - "pt-br": - "Permitir que o preenchimento automático cresça o quanto for necessário", + 'en-us': 'Allow autocomplete to grow as wide as need', + 'ru-ru': + 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', + 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', + 'fr-fr': + 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', + 'uk-ua': + 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', + 'de-ch': + 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', + 'pt-br': + 'Permitir que o preenchimento automático cresça o quanto for necessário', }, tableNameInTitle: { - "en-us": "Include table name in the browser page title", - "ru-ru": "Включить имя таблицы в заголовок страницы браузера", - "es-es": - "Incluir el nombre de la tabla en el título de la página del navegador", - "fr-fr": - "Inclure le nom de la table dans le titre de la page du navigateur", - "uk-ua": "Включіть назву таблиці в заголовок сторінки браузера", - "de-ch": "Tabellennamen in den Seitentitel des Browsers aufnehmen", - "pt-br": "Incluir nome da tabela no título da página do navegador", + 'en-us': 'Include table name in the browser page title', + 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', + 'es-es': + 'Incluir el nombre de la tabla en el título de la página del navegador', + 'fr-fr': + 'Inclure le nom de la table dans le titre de la page du navigateur', + 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', + 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', + 'pt-br': 'Incluir nome da tabela no título da página do navegador', }, focusFirstField: { - "en-us": "Focus first field", - "de-ch": "Fokus erstes Feld", - "es-es": "Enfoque el primer campo", - "fr-fr": "Concentrez-vous sur le premier champ", - "ru-ru": "Фокус первого поля", - "uk-ua": "Перейти до першого поля", - "pt-br": "Foco primeiro campo", + 'en-us': 'Focus first field', + 'de-ch': 'Fokus erstes Feld', + 'es-es': 'Enfoque el primer campo', + 'fr-fr': 'Concentrez-vous sur le premier champ', + 'ru-ru': 'Фокус первого поля', + 'uk-ua': 'Перейти до першого поля', + 'pt-br': 'Foco primeiro campo', }, doubleClickZoom: { - "en-us": "Double click to zoom", - "ru-ru": "Дважды щелкните, чтобы увеличить", - "es-es": "Haga doble clic para ampliar", - "fr-fr": "Double-cliquez pour zoomer", - "uk-ua": "Двічі клацніть, щоб збільшити", - "de-ch": "Zum Vergrößern doppelklicken", - "pt-br": "Clique duas vezes para ampliar", + 'en-us': 'Double click to zoom', + 'ru-ru': 'Дважды щелкните, чтобы увеличить', + 'es-es': 'Haga doble clic para ampliar', + 'fr-fr': 'Double-cliquez pour zoomer', + 'uk-ua': 'Двічі клацніть, щоб збільшити', + 'de-ch': 'Zum Vergrößern doppelklicken', + 'pt-br': 'Clique duas vezes para ampliar', }, closePopupOnClick: { - "en-us": "Close pop-up on outside click", - "ru-ru": "Закрытие всплывающего окна при внешнем щелчке", - "es-es": "Cerrar ventana emergente al hacer clic desde fuera", - "fr-fr": "Fermer la pop-up lors d'un clic extérieur", - "uk-ua": "Закрити спливаюче вікно при зовнішньому клацанні", - "de-ch": "Popup bei externem Klick schließen", - "pt-br": "Fechar pop-up ao clicar fora", + 'en-us': 'Close pop-up on outside click', + 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', + 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', + 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", + 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', + 'de-ch': 'Popup bei externem Klick schließen', + 'pt-br': 'Fechar pop-up ao clicar fora', }, animateTransitions: { - "en-us": "Animate transitions", - "ru-ru": "Анимированные переходы", - "es-es": "Animar transiciones", - "fr-fr": "Animer les transitions", - "uk-ua": "Анімація переходів", - "de-ch": "Übergänge animieren", - "pt-br": "Transições animadas", + 'en-us': 'Animate transitions', + 'ru-ru': 'Анимированные переходы', + 'es-es': 'Animar transiciones', + 'fr-fr': 'Animer les transitions', + 'uk-ua': 'Анімація переходів', + 'de-ch': 'Übergänge animieren', + 'pt-br': 'Transições animadas', }, panInertia: { - "en-us": "Pan inertia", - "ru-ru": "Инерция пан", - "es-es": "Inercia de la sartén", - "fr-fr": "Inertie du bac", - "uk-ua": "Інерція панорами", - "de-ch": "Schwenkträgheit", - "pt-br": "Inércia da panela", + 'en-us': 'Pan inertia', + 'ru-ru': 'Инерция пан', + 'es-es': 'Inercia de la sartén', + 'fr-fr': 'Inertie du bac', + 'uk-ua': 'Інерція панорами', + 'de-ch': 'Schwenkträgheit', + 'pt-br': 'Inércia da panela', }, mouseDrags: { - "en-us": "Mouse drags", - "ru-ru": "Перетаскивание мышью", - "es-es": "El ratón arrastra", - "uk-ua": "Виділіть відповідний підрядок", - "de-ch": "Maus zieht", - "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", - "pt-br": "Arrastos do mouse", + 'en-us': 'Mouse drags', + 'ru-ru': 'Перетаскивание мышью', + 'es-es': 'El ratón arrastra', + 'uk-ua': 'Виділіть відповідний підрядок', + 'de-ch': 'Maus zieht', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'pt-br': 'Arrastos do mouse', }, scrollWheelZoom: { - "en-us": "Scroll wheel zoom", - "ru-ru": "Масштабирование с помощью колеса прокрутки", - "es-es": "Zoom con rueda de desplazamiento", - "fr-fr": "Zoom avec la molette de défilement", - "uk-ua": "Масштаб колеса прокрутки", - "de-ch": "Scrollrad-Zoom", - "pt-br": "Zoom da roda de rolagem", + 'en-us': 'Scroll wheel zoom', + 'ru-ru': 'Масштабирование с помощью колеса прокрутки', + 'es-es': 'Zoom con rueda de desplazamiento', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Scrollrad-Zoom', + 'pt-br': 'Zoom da roda de rolagem', }, flexibleColumnWidth: { - "en-us": "Flexible column width", - "ru-ru": "Гибкая ширина столбца", - "es-es": "Ancho de columna flexible", - "fr-fr": "Largeur de colonne flexible", - "uk-ua": "Гнучка ширина колонки", - "de-ch": "Flexible Spaltenbreite", - "pt-br": "Largura de coluna flexível", + 'en-us': 'Flexible column width', + 'ru-ru': 'Гибкая ширина столбца', + 'es-es': 'Ancho de columna flexible', + 'fr-fr': 'Largeur de colonne flexible', + 'uk-ua': 'Гнучка ширина колонки', + 'de-ch': 'Flexible Spaltenbreite', + 'pt-br': 'Largura de coluna flexível', }, flexibleSubGridColumnWidth: { - "en-us": "Flexible subview grid column width", - "ru-ru": "Гибкая ширина столбца сетки подпредставлений", - "es-es": "Ancho de columna de cuadrícula de subvista flexible", - "fr-fr": "Largeur de colonne de grille de sous-vue flexible", - "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", - "de-ch": "Flexible Rasterspaltenbreite der Unteransicht", - "pt-br": "Largura flexível da coluna da grade de subvisualização", + 'en-us': 'Flexible subview grid column width', + 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', + 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Flexible Rasterspaltenbreite der Unteransicht', + 'pt-br': 'Largura flexível da coluna da grade de subvisualização', }, closeOnEsc: { - "en-us": "Close on ESC key press", - "ru-ru": "Закрыть нажатием клавиши ESC", - "es-es": "Cerrar al presionar la tecla ESC", - "fr-fr": "Icône et nom de la table", - "uk-ua": "Закриття натисканням клавіші ESC", - "de-ch": "Schließen durch Drücken der Taste ESC", - "pt-br": "Fechar ao pressionar a tecla ESC", + 'en-us': 'Close on ESC key press', + 'ru-ru': 'Закрыть нажатием клавиши ESC', + 'es-es': 'Cerrar al presionar la tecla ESC', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Закриття натисканням клавіші ESC', + 'de-ch': 'Schließen durch Drücken der Taste ESC', + 'pt-br': 'Fechar ao pressionar a tecla ESC', }, closeOnOutsideClick: { - "en-us": "Close on outside click", - "ru-ru": "Закрытие по внешнему щелчку", - "es-es": "Cerrar al hacer clic desde fuera", - "fr-fr": "Fermer sur clic extérieur", - "uk-ua": "Закрийте зовнішнім клацанням", - "de-ch": "Schließen durch Klicken von außen", - "pt-br": "Fechar com clique externo", + 'en-us': 'Close on outside click', + 'ru-ru': 'Закрытие по внешнему щелчку', + 'es-es': 'Cerrar al hacer clic desde fuera', + 'fr-fr': 'Fermer sur clic extérieur', + 'uk-ua': 'Закрийте зовнішнім клацанням', + 'de-ch': 'Schließen durch Klicken von außen', + 'pt-br': 'Fechar com clique externo', + }, + scopeEntireTablePicklists: { + 'en-us': 'Scope "Entire Table" picklists', + 'ru-ru': 'Scope "Entire Table" picklists', + 'es-es': 'Scope "Entire Table" picklists', + 'fr-fr': 'Scope "Entire Table" picklists', + 'uk-ua': 'Scope "Entire Table" picklists', + 'de-ch': 'Scope "Entire Table" picklists', + 'pt-br': 'Scope "Entire Table" picklists', + }, + scopeEntireTablePicklistsDescription: { + 'en-us': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'ru-ru': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'es-es': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'fr-fr': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'uk-ua': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'de-ch': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'pt-br': 'Restrict "Entire Table" picklists to values used by records in this collection.', + }, + catalogNumberInheritanceDescription:{ + 'en-us': 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.', + }, + catalogNumberParentInheritanceDescription:{ + 'en-us': 'Control whether component records inherit catalog numbers from their parent Collection Object.' }, specifyNetworkBadge: { - "en-us": "Specify Network Badge", - "ru-ru": "Укажите сетевой значок", - "es-es": "Especificar la insignia de red", - "fr-fr": "Spécifier le badge réseau", - "uk-ua": "Укажіть значок мережі", - "de-ch": "Netzwerk-Badge angeben", - "pt-br": "Especificar emblema de rede", - }, - useAccessibleFullDatePicker: { - "en-us": "Use accessible full date picker", - "ru-ru": "Используйте доступный полный выбор даты", - "es-es": "Utilice el selector de fecha completo y accesible", - "fr-fr": "Utiliser un sélecteur de date complet accessible", - "uk-ua": "Використовуйте доступний повний засіб вибору дати", - "de-ch": "Verwenden Sie eine barrierefreie Datumsauswahl", - "pt-br": "Use o seletor de data completo acessível", + 'en-us': 'Specify Network Badge', + 'ru-ru': 'Укажите сетевой значок', + 'es-es': 'Especificar la insignia de red', + 'fr-fr': 'Spécifier le badge réseau', + 'uk-ua': 'Укажіть значок мережі', + 'de-ch': 'Netzwerk-Badge angeben', + 'pt-br': 'Especificar emblema de rede', + }, + useAccessibleFullDatePicker: { + 'en-us': 'Use accessible full date picker', + 'ru-ru': 'Используйте доступный полный выбор даты', + 'es-es': 'Utilice el selector de fecha completo y accesible', + 'fr-fr': 'Utiliser un sélecteur de date complet accessible', + 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', + 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', + 'pt-br': 'Use o seletor de data completo acessível', }, useAccessibleMonthPicker: { - "en-us": "Use accessible month picker", - "ru-ru": "Используйте доступный выбор месяца", - "es-es": "Utilice el selector de meses accesible", - "fr-fr": "Utiliser le sélecteur de mois accessible", - "uk-ua": "Використовуйте доступний засіб вибору місяця", - "de-ch": "Verwenden Sie die barrierefreie Monatsauswahl", - "pt-br": "Use o seletor de meses acessível", + 'en-us': 'Use accessible month picker', + 'ru-ru': 'Используйте доступный выбор месяца', + 'es-es': 'Utilice el selector de meses accesible', + 'fr-fr': 'Utiliser le sélecteur de mois accessible', + 'uk-ua': 'Використовуйте доступний засіб вибору місяця', + 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', + 'pt-br': 'Use o seletor de meses acessível', }, rightAlignNumberFields: { - "en-us": "Right-Justify numeric fields", - "ru-ru": "Выравнивание числовых полей по правому краю", - "es-es": "Justificar a la derecha los campos numéricos", - "fr-fr": "Justifier à droite les champs numériques", - "uk-ua": "Вирівнювання по правому краю числових полів", - "de-ch": "Rechtsbündige Ausrichtung numerischer Felder", - "pt-br": "Justificar à direita campos numéricos", + 'en-us': 'Right-Justify numeric fields', + 'ru-ru': 'Выравнивание числовых полей по правому краю', + 'es-es': 'Justificar a la derecha los campos numéricos', + 'fr-fr': 'Justifier à droite les champs numériques', + 'uk-ua': 'Вирівнювання по правому краю числових полів', + 'de-ch': 'Rechtsbündige Ausrichtung numerischer Felder', + 'pt-br': 'Justificar à direita campos numéricos', }, roundedCorners: { - "en-us": "Rounded corners", - "ru-ru": "Закругленные углы", - "es-es": "esquinas redondeadas", - "fr-fr": "Coins arrondis", - "uk-ua": "Заокруглені кути", - "de-ch": "Abgerundete Ecken", - "pt-br": "Cantos arredondados", + 'en-us': 'Rounded corners', + 'ru-ru': 'Закругленные углы', + 'es-es': 'esquinas redondeadas', + 'fr-fr': 'Coins arrondis', + 'uk-ua': 'Заокруглені кути', + 'de-ch': 'Abgerundete Ecken', + 'pt-br': 'Cantos arredondados', }, showSubviewBorders: { - "en-us": "Show borders around subviews", - "de-ch": "Rahmen um Unteransichten anzeigen", - "es-es": "Mostrar bordes alrededor de las subvistas", - "fr-fr": "Afficher les bordures autour des sous-vues", - "pt-br": "Mostrar bordas ao redor das subvisualizações", - "ru-ru": "Показывать границы вокруг подпредставлений", - "uk-ua": "Показати межі навколо підвидів", + 'en-us': 'Show borders around subviews', + 'de-ch': 'Rahmen um Unteransichten anzeigen', + 'es-es': 'Mostrar bordes alrededor de las subvistas', + 'fr-fr': 'Afficher les bordures autour des sous-vues', + 'pt-br': 'Mostrar bordas ao redor das subvisualizações', + 'ru-ru': 'Показывать границы вокруг подпредставлений', + 'uk-ua': 'Показати межі навколо підвидів', }, limitMaxFieldWidth: { - "en-us": "Limit max field width", - "ru-ru": "Ограничить максимальную ширину поля", - "es-es": "Limitar el ancho máximo del campo", - "fr-fr": "Limiter la largeur maximale du champ", - "uk-ua": "Обмеження максимальної ширини поля", - "de-ch": "Maximale Feldbreite begrenzen", - "pt-br": "Limite a largura máxima do campo", + 'en-us': 'Limit max field width', + 'ru-ru': 'Ограничить максимальную ширину поля', + 'es-es': 'Limitar el ancho máximo del campo', + 'fr-fr': 'Limiter la largeur maximale du champ', + 'uk-ua': 'Обмеження максимальної ширини поля', + 'de-ch': 'Maximale Feldbreite begrenzen', + 'pt-br': 'Limite a largura máxima do campo', }, condenseQueryResults: { - "en-us": "Condense query results", - "ru-ru": "Сжать результаты запроса", - "es-es": "Condensar los resultados de la consulta", - "fr-fr": "Condenser les résultats de la requête", - "uk-ua": "Згорнути результати запиту", - "de-ch": "Abfrageergebnisse verdichten", - "pt-br": "Condensar resultados da consulta", + 'en-us': 'Condense query results', + 'ru-ru': 'Сжать результаты запроса', + 'es-es': 'Condensar los resultados de la consulta', + 'fr-fr': 'Condenser les résultats de la requête', + 'uk-ua': 'Згорнути результати запиту', + 'de-ch': 'Abfrageergebnisse verdichten', + 'pt-br': 'Condensar resultados da consulta', }, blurContentBehindDialog: { - "en-us": "Blur content behind the dialog", - "ru-ru": "Размытие содержимого за диалогом", - "es-es": "Desenfocar el contenido detrás del diálogo", - "fr-fr": "Flou le contenu derrière la boîte de dialogue", - "uk-ua": "Розмити вміст за діалоговим вікном", - "de-ch": "Inhalte hinter dem Dialog verwischen", - "pt-br": "Desfocar o conteúdo atrás do diálogo", + 'en-us': 'Blur content behind the dialog', + 'ru-ru': 'Размытие содержимого за диалогом', + 'es-es': 'Desenfocar el contenido detrás del diálogo', + 'fr-fr': 'Flou le contenu derrière la boîte de dialogue', + 'uk-ua': 'Розмити вміст за діалоговим вікном', + 'de-ch': 'Inhalte hinter dem Dialog verwischen', + 'pt-br': 'Desfocar o conteúdo atrás do diálogo', }, collectionSortOrderDescription: { - "en-us": "This determines the visual order of collections.", - "ru-ru": "Это определяет визуальный порядок коллекций.", - "es-es": "Esto determina el orden visual de las colecciones.", - "fr-fr": "Ceci détermine l'ordre visuel des collections.", - "uk-ua": "Це визначає візуальний порядок колекцій.", - "de-ch": "Dies bestimmt die visuelle Reihenfolge der Sammlungen.", - "pt-br": "Isso determina a ordem visual das coleções.", + 'en-us': 'This determines the visual order of collections.', + 'ru-ru': 'Это определяет визуальный порядок коллекций.', + 'es-es': 'Esto determina el orden visual de las colecciones.', + 'fr-fr': "Ceci détermine l'ordre visuel des collections.", + 'uk-ua': 'Це визначає візуальний порядок колекцій.', + 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', + 'pt-br': 'Isso determina a ordem visual das coleções.', }, recordSetRecordToOpen: { - "en-us": "Record to open by default", - "ru-ru": "Запись для открытия по умолчанию", - "es-es": "Registro para abrir por defecto", - "fr-fr": "Enregistrement à ouvrir par défaut", - "uk-ua": "Запис відкривається за умовчанням", - "de-ch": "Standardmäßig zu öffnender Datensatz", - "pt-br": "Gravar para abrir por padrão", + 'en-us': 'Record to open by default', + 'ru-ru': 'Запись для открытия по умолчанию', + 'es-es': 'Registro para abrir por defecto', + 'fr-fr': 'Enregistrement à ouvrir par défaut', + 'uk-ua': 'Запис відкривається за умовчанням', + 'de-ch': 'Standardmäßig zu öffnender Datensatz', + 'pt-br': 'Gravar para abrir por padrão', }, altClickToSupressNewTab: { - "en-us": - "{altKeyName:string}+Click to suppress new tab", - "ru-ru": - "{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку", - "es-es": - "{altKeyName:string}+Haga clic en para suprimir la nueva pestaña", - "fr-fr": - "{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet", - "uk-ua": - "{altKeyName:string}+Натисніть , щоб закрити нову вкладку", - "de-ch": - "{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken", - "pt-br": - "{altKeyName:string}+Clique em para suprimir a nova guia", + 'en-us': + '{altKeyName:string}+Click to suppress new tab', + 'ru-ru': + '{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку', + 'es-es': + '{altKeyName:string}+Haga clic en para suprimir la nueva pestaña', + 'fr-fr': + '{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet', + 'uk-ua': + '{altKeyName:string}+Натисніть , щоб закрити нову вкладку', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken', + 'pt-br': + '{altKeyName:string}+Clique em para suprimir a nova guia', }, altClickToSupressNewTabDescription: { - "en-us": - "{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.", - "ru-ru": - "{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.", - "es-es": - "{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.", - "fr-fr": "Utiliser le sélecteur de mois accessible.", - "uk-ua": - "{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.", - "de-ch": - "{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.", - "pt-br": - "{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.", + 'en-us': + '{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.', + 'ru-ru': + '{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.', + 'es-es': + '{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.', + 'fr-fr': 'Utiliser le sélecteur de mois accessible.', + 'uk-ua': + '{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.', + 'pt-br': + '{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.', }, makeFormDialogsModal: { - "en-us": "Make form dialogs gray out the background", - "ru-ru": "Сделать фон диалоговых окон серым", - "es-es": - "Hacer que los cuadros de diálogo del formulario tengan el fondo en gris", - "fr-fr": + 'en-us': 'Make form dialogs gray out the background', + 'ru-ru': 'Сделать фон диалоговых окон серым', + 'es-es': + 'Hacer que los cuadros de diálogo del formulario tengan el fondo en gris', + 'fr-fr': "Rendre les boîtes de dialogue de formulaire grisées sur l'arrière-plan", - "uk-ua": "Зробіть діалогові вікна форми сірими фоном", - "de-ch": "Den Hintergrund von Formulardialogen ausgrauen", - "pt-br": - "Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado", + 'uk-ua': 'Зробіть діалогові вікна форми сірими фоном', + 'de-ch': 'Den Hintergrund von Formulardialogen ausgrauen', + 'pt-br': + 'Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado', }, autoScrollTree: { - "en-us": "Auto scroll tree to focused node", - "ru-ru": "Автоматическая прокрутка дерева к выбранному узлу", - "es-es": "Desplazamiento automático del árbol al nodo enfocado", - "fr-fr": "Arbre de défilement automatique vers le nœud ciblé", - "uk-ua": "Автоматичне прокручування дерева до виділеного вузла", - "de-ch": "Automatisches Scrollen des Baums zum fokussierten Knoten", - "pt-br": "Rolagem automática da árvore para o nó em foco", + 'en-us': 'Auto scroll tree to focused node', + 'ru-ru': 'Автоматическая прокрутка дерева к выбранному узлу', + 'es-es': 'Desplazamiento automático del árbol al nodo enfocado', + 'fr-fr': 'Arbre de défilement automatique vers le nœud ciblé', + 'uk-ua': 'Автоматичне прокручування дерева до виділеного вузла', + 'de-ch': 'Automatisches Scrollen des Baums zum fokussierten Knoten', + 'pt-br': 'Rolagem automática da árvore para o nó em foco', }, sortByField: { - "en-us": "Order By Field", - "de-ch": "Nach Feld sortieren", - "es-es": "Ordenar por campo", - "fr-fr": "Trier par champ", - "pt-br": "Ordenar por campo", - "ru-ru": "Сортировать по полю", - "uk-ua": "Сортувати за полем", - }, - treeStatsThreshold: { - 'en-us': 'Minimum rank for Collection Object counts', - 'ru-ru': 'Минимальный ранг для подсчета коллекционных объектов', - 'es-es': 'Rango mínimo para recuentos de objetos de colección', - 'fr-fr': 'Rang minimal pour les comptes des objets de collection', - 'uk-ua': 'Мінімальний ранг для підрахунку колекційних об’єктів', - 'de-ch': 'Minimaler Rang für Sammlungsobjektzählungen', - 'pt-br': 'Classificação mínima para contagens de objetos de coleção', - }, - treeStatsThresholdDescription: { - 'en-us': - 'Show Collection Object counts only for nodes with RankID greater than or equal to this value.', - 'ru-ru': - 'Показывать количество коллекционных объектов только для узлов с RankID больше или равным этому значению.', - 'es-es': - 'Mostrar recuentos de objetos de colección solo para nodos con RankID mayor o igual que este valor.', - 'fr-fr': - 'Afficher les comptes d’objets de collection uniquement pour les nœuds dont le RankID est supérieur ou égal à cette valeur.', - 'uk-ua': - 'Показувати кількість колекційних об’єктів лише для вузлів з RankID, що дорівнює або перевищує це значення.', - 'de-ch': - 'Zeige Zählungen von Sammlungsobjekten nur für Knoten mit einem RankID grösser oder gleich diesem Wert.', - 'pt-br': - 'Mostrar contagens de objetos de coleção apenas para nós com RankID maior ou igual a este valor.', + 'en-us': 'Order By Field', + 'de-ch': 'Nach Feld sortieren', + 'es-es': 'Ordenar por campo', + 'fr-fr': 'Trier par champ', + 'pt-br': 'Ordenar por campo', + 'ru-ru': 'Сортировать по полю', + 'uk-ua': 'Сортувати за полем', }, lineWrap: { - "en-us": "Line wrap", - "ru-ru": "Перенос строки", - "es-es": "Ajuste de línea", - "fr-fr": "Retour à la ligne", - "uk-ua": "Обтікання лініями", - "de-ch": "Zeilenumbruch", - "pt-br": "Quebra de linha", + 'en-us': 'Line wrap', + 'ru-ru': 'Перенос строки', + 'es-es': 'Ajuste de línea', + 'fr-fr': 'Retour à la ligne', + 'uk-ua': 'Обтікання лініями', + 'de-ch': 'Zeilenumbruch', + 'pt-br': 'Quebra de linha', }, indentSize: { - "en-us": "Indent size", - "ru-ru": "Размер отступа", - "es-es": "Tamaño de sangría", - "fr-fr": "Taille du retrait", - "uk-ua": "Розмір відступу", - "de-ch": "Einzugsgröße", - "pt-br": "Tamanho do recuo", + 'en-us': 'Indent size', + 'ru-ru': 'Размер отступа', + 'es-es': 'Tamaño de sangría', + 'fr-fr': 'Taille du retrait', + 'uk-ua': 'Розмір відступу', + 'de-ch': 'Einzugsgröße', + 'pt-br': 'Tamanho do recuo', }, indentWithTab: { - "en-us": "Indent with Tab", - "ru-ru": "Отступ с помощью Tab", - "es-es": "Sangría con Tab", - "fr-fr": "Indenter avec Tabulation", - "uk-ua": "Відступ із Tab", - "de-ch": "Einrücken mit Tab", - "pt-br": "Recuo com Tab", + 'en-us': 'Indent with Tab', + 'ru-ru': 'Отступ с помощью Tab', + 'es-es': 'Sangría con Tab', + 'fr-fr': 'Indenter avec Tabulation', + 'uk-ua': 'Відступ із Tab', + 'de-ch': 'Einrücken mit Tab', + 'pt-br': 'Recuo com Tab', }, formHeaderFormat: { - "en-us": "Form header format", - "ru-ru": "Формат заголовка формы", - "es-es": "Formato del encabezado del formulario", - "fr-fr": "Format d'en-tête de formulaire", - "uk-ua": "Формат заголовка форми", - "de-ch": "Formularkopfformat", - "pt-br": "Formato do cabeçalho do formulário", + 'en-us': 'Form header format', + 'ru-ru': 'Формат заголовка формы', + 'es-es': 'Formato del encabezado del formulario', + 'fr-fr': "Format d'en-tête de formulaire", + 'uk-ua': 'Формат заголовка форми', + 'de-ch': 'Formularkopfformat', + 'pt-br': 'Formato do cabeçalho do formulário', }, iconAndTableName: { - "en-us": "Icon and table name", - "ru-ru": "Значок и название таблицы", - "es-es": "Icono y nombre de la tabla", - "fr-fr": "Icône et nom de la table", - "uk-ua": "Значок і назва таблиці", - "de-ch": "Symbol und Tabellenname", - "pt-br": "Ícone e nome da tabela", + 'en-us': 'Icon and table name', + 'ru-ru': 'Значок и название таблицы', + 'es-es': 'Icono y nombre de la tabla', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Значок і назва таблиці', + 'de-ch': 'Symbol und Tabellenname', + 'pt-br': 'Ícone e nome da tabela', }, tableIcon: { - "en-us": "Table icon", - "ru-ru": "Значок таблицы", - "es-es": "Icono de tabla", - "fr-fr": "Icône de tableau", - "uk-ua": "Значок таблиці", - "de-ch": "Tabellensymbol", - "pt-br": "Ícone de tabela", + 'en-us': 'Table icon', + 'ru-ru': 'Значок таблицы', + 'es-es': 'Icono de tabla', + 'fr-fr': 'Icône de tableau', + 'uk-ua': 'Значок таблиці', + 'de-ch': 'Tabellensymbol', + 'pt-br': 'Ícone de tabela', }, maxHeight: { - "en-us": "Max height", - "ru-ru": "Максимальная высота", - "es-es": "Altura máxima", - "fr-fr": "hauteur maximum", - "uk-ua": "Максимальна висота", - "de-ch": "Maximale Höhe", - "pt-br": "Altura máxima", + 'en-us': 'Max height', + 'ru-ru': 'Максимальная высота', + 'es-es': 'Altura máxima', + 'fr-fr': 'hauteur maximum', + 'uk-ua': 'Максимальна висота', + 'de-ch': 'Maximale Höhe', + 'pt-br': 'Altura máxima', }, autoComplete: { - "en-us": "Auto complete", - "ru-ru": "Автозаполнение", - "es-es": "Autocompletar", - "fr-fr": + 'en-us': 'Auto complete', + 'ru-ru': 'Автозаполнение', + 'es-es': 'Autocompletar', + 'fr-fr': "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", - "uk-ua": - "Визначає підписи полів, примітки щодо використання та підписи таблиць", - "de-ch": "Autovervollständigung", - "pt-br": "Preenchimento automático", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць', + 'de-ch': 'Autovervollständigung', + 'pt-br': 'Preenchimento automático', }, searchCaseSensitive: { - "en-us": "Case-sensitive search", - "es-es": "Búsqueda que distingue entre mayúsculas y minúsculas", - "fr-fr": "Recherche sensible à la casse", - "uk-ua": "Пошук з урахуванням регістру", - "de-ch": "Groß- und Kleinschreibung beachten", - "ru-ru": "Поиск с учетом регистра", - "pt-br": "Pesquisa com diferenciação entre maiúsculas e minúsculas", + 'en-us': 'Case-sensitive search', + 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Recherche sensible à la casse', + 'uk-ua': 'Пошук з урахуванням регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'ru-ru': 'Поиск с учетом регистра', + 'pt-br': 'Pesquisa com diferenciação entre maiúsculas e minúsculas', }, searchField: { - "en-us": "Search Field", - "ru-ru": "Поле поиска", - "es-es": "Campo de búsqueda", - "fr-fr": "Champ de recherche", - "uk-ua": "Поле пошуку", - "de-ch": "Suchfeld", - "pt-br": "Campo de pesquisa", + 'en-us': 'Search Field', + 'ru-ru': 'Поле поиска', + 'es-es': 'Campo de búsqueda', + 'fr-fr': 'Champ de recherche', + 'uk-ua': 'Поле пошуку', + 'de-ch': 'Suchfeld', + 'pt-br': 'Campo de pesquisa', }, createInteractions: { - "en-us": "Creating an interaction", - "ru-ru": "Создание взаимодействия", - "es-es": "Creando una interacción", - "fr-fr": "Créer une interaction", - "uk-ua": "Створення взаємодії", - "de-ch": "Erstellen einer Interaktion", - "pt-br": "Criando uma interação", + 'en-us': 'Creating an interaction', + 'ru-ru': 'Создание взаимодействия', + 'es-es': 'Creando una interacción', + 'fr-fr': 'Créer une interaction', + 'uk-ua': 'Створення взаємодії', + 'de-ch': 'Erstellen einer Interaktion', + 'pt-br': 'Criando uma interação', }, useSpaceAsDelimiter: { - "en-us": "Use space as delimiter", - "ru-ru": "Используйте пробел в качестве разделителя", - "es-es": "Utilice el espacio como delimitador", - "fr-fr": "Utiliser l'espace comme délimiteur", - "uk-ua": "Використовуйте пробіл як роздільник", - "de-ch": "Leerzeichen als Trennzeichen verwenden", - "pt-br": "Use espaço como delimitador", + 'en-us': 'Use space as delimiter', + 'ru-ru': 'Используйте пробел в качестве разделителя', + 'es-es': 'Utilice el espacio como delimitador', + 'fr-fr': "Utiliser l'espace comme délimiteur", + 'uk-ua': 'Використовуйте пробіл як роздільник', + 'de-ch': 'Leerzeichen als Trennzeichen verwenden', + 'pt-br': 'Use espaço como delimitador', }, useCommaAsDelimiter: { - "en-us": "Use comma as delimiter", - "ru-ru": "Используйте запятую в качестве разделителя", - "es-es": "Utilice la coma como delimitador", - "fr-fr": "Utiliser la virgule comme délimiteur", - "uk-ua": "Використовуйте кому як роздільник", - "de-ch": "Verwenden Sie Kommas als Trennzeichen", - "pt-br": "Use vírgula como delimitador", + 'en-us': 'Use comma as delimiter', + 'ru-ru': 'Используйте запятую в качестве разделителя', + 'es-es': 'Utilice la coma como delimitador', + 'fr-fr': 'Utiliser la virgule comme délimiteur', + 'uk-ua': 'Використовуйте кому як роздільник', + 'de-ch': 'Verwenden Sie Kommas als Trennzeichen', + 'pt-br': 'Use vírgula como delimitador', }, useNewLineAsDelimiter: { - "en-us": "Use new line as delimiter", - "ru-ru": "Использовать новую строку в качестве разделителя", - "es-es": "Utilice nueva línea como delimitador", - "fr-fr": "Utiliser une nouvelle ligne comme délimiteur", - "uk-ua": "Використовуйте новий рядок як роздільник", - "de-ch": "Neue Zeile als Trennzeichen verwenden", - "pt-br": "Use nova linha como delimitador", + 'en-us': 'Use new line as delimiter', + 'ru-ru': 'Использовать новую строку в качестве разделителя', + 'es-es': 'Utilice nueva línea como delimitador', + 'fr-fr': 'Utiliser une nouvelle ligne comme délimiteur', + 'uk-ua': 'Використовуйте новий рядок як роздільник', + 'de-ch': 'Neue Zeile als Trennzeichen verwenden', + 'pt-br': 'Use nova linha como delimitador', }, useCustomDelimiters: { - "en-us": "Use custom delimiters", - "ru-ru": "Используйте пользовательские разделители", - "es-es": "Utilice delimitadores personalizados", - "fr-fr": "Utiliser des délimiteurs personnalisés", - "uk-ua": "Використовуйте спеціальні роздільники", - "de-ch": "Benutzerdefinierte Trennzeichen verwenden", - "pt-br": "Use delimitadores personalizados", + 'en-us': 'Use custom delimiters', + 'ru-ru': 'Используйте пользовательские разделители', + 'es-es': 'Utilice delimitadores personalizados', + 'fr-fr': 'Utiliser des délimiteurs personnalisés', + 'uk-ua': 'Використовуйте спеціальні роздільники', + 'de-ch': 'Benutzerdefinierte Trennzeichen verwenden', + 'pt-br': 'Use delimitadores personalizados', }, useCustomDelimitersDescription: { - "en-us": - "A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.", - "ru-ru": - "Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.", - "es-es": - "Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.", - "fr-fr": - "Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.", - "uk-ua": - "Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.", - "de-ch": - "Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.", - "pt-br": - "Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.", + 'en-us': + 'A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.', + 'ru-ru': + 'Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.', + 'es-es': + 'Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.', + 'fr-fr': + 'Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.', + 'uk-ua': + 'Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.', + 'de-ch': + 'Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.', + 'pt-br': + 'Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.', }, detectAutomaticallyDescription: { - "en-us": "Detect automatically based on catalog number format.", - "ru-ru": "Автоматическое определение на основе формата каталожного номера.", - "es-es": - "Detectar automáticamente según el formato del número de catálogo.", - "fr-fr": - "Détecter automatiquement en fonction du format du numéro de catalogue.", - "uk-ua": "Визначати автоматично на основі формату номера каталогу.", - "de-ch": "Automatische Erkennung basierend auf dem Katalognummernformat.", - "pt-br": - "Detectar automaticamente com base no formato do número de catálogo.", + 'en-us': 'Detect automatically based on catalog number format.', + 'ru-ru': 'Автоматическое определение на основе формата каталожного номера.', + 'es-es': + 'Detectar automáticamente según el formato del número de catálogo.', + 'fr-fr': + 'Détecter automatiquement en fonction du format du numéro de catalogue.', + 'uk-ua': 'Визначати автоматично на основі формату номера каталогу.', + 'de-ch': 'Automatische Erkennung basierend auf dem Katalognummernformat.', + 'pt-br': + 'Detectar automaticamente com base no formato do número de catálogo.', }, use: { - comment: "Verb", - "en-us": "Use", - "ru-ru": "Использовать", - "es-es": "Usar", - "fr-fr": "Utiliser", - "uk-ua": "використання", - "de-ch": "Verwenden", - "pt-br": "Usar", + comment: 'Verb', + 'en-us': 'Use', + 'ru-ru': 'Использовать', + 'es-es': 'Usar', + 'fr-fr': 'Utiliser', + 'uk-ua': 'використання', + 'de-ch': 'Verwenden', + 'pt-br': 'Usar', }, dontUse: { - "en-us": "Don’t use", - "ru-ru": "Не использовать", - "es-es": "No utilizar", - "fr-fr": "Zoom avec la molette de défilement", - "uk-ua": "Масштаб колеса прокрутки", - "de-ch": "Nicht verwenden", - "pt-br": "Não use", + 'en-us': 'Don’t use', + 'ru-ru': 'Не использовать', + 'es-es': 'No utilizar', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Nicht verwenden', + 'pt-br': 'Não use', }, position: { - "en-us": "Position", - "es-es": "Posición", - "fr-fr": "Position", - "ru-ru": "Позиция", - "uk-ua": "Позиція", - "de-ch": "Position", - "pt-br": "Posição", + 'en-us': 'Position', + 'es-es': 'Posición', + 'fr-fr': 'Position', + 'ru-ru': 'Позиция', + 'uk-ua': 'Позиція', + 'de-ch': 'Position', + 'pt-br': 'Posição', }, top: { - "en-us": "Top", - "es-es": "Arriba", - "fr-fr": "Haut", - "ru-ru": "Вершина", - "uk-ua": "Топ", - "de-ch": "Spitze", - "pt-br": "Principal", + 'en-us': 'Top', + 'es-es': 'Arriba', + 'fr-fr': 'Haut', + 'ru-ru': 'Вершина', + 'uk-ua': 'Топ', + 'de-ch': 'Spitze', + 'pt-br': 'Principal', }, bottom: { - "en-us": "Bottom", - "es-es": "Abajo", - "ru-ru": "Нижний", - "uk-ua": "Дно", - "de-ch": "Unten", - "fr-fr": "Bas", - "pt-br": "Fundo", + 'en-us': 'Bottom', + 'es-es': 'Abajo', + 'ru-ru': 'Нижний', + 'uk-ua': 'Дно', + 'de-ch': 'Unten', + 'fr-fr': 'Bas', + 'pt-br': 'Fundo', }, left: { - "en-us": "Left", - "es-es": "Izquierda", - "fr-fr": "Gauche", - "ru-ru": "Левый", - "uk-ua": "Ліворуч", - "de-ch": "Links", - "pt-br": "Esquerda", + 'en-us': 'Left', + 'es-es': 'Izquierda', + 'fr-fr': 'Gauche', + 'ru-ru': 'Левый', + 'uk-ua': 'Ліворуч', + 'de-ch': 'Links', + 'pt-br': 'Esquerda', }, right: { - "en-us": "Right", - "es-es": "Bien", - "fr-fr": "Droite", - "ru-ru": "Верно", - "uk-ua": "правильно", - "de-ch": "Rechts", - "pt-br": "Certo", + 'en-us': 'Right', + 'es-es': 'Bien', + 'fr-fr': 'Droite', + 'ru-ru': 'Верно', + 'uk-ua': 'правильно', + 'de-ch': 'Rechts', + 'pt-br': 'Certo', }, showUnsavedIndicator: { - "en-us": "Show unsaved changes indicator", - "ru-ru": "Показать индикатор несохраненных изменений", - "es-es": "Mostrar indicador de cambios no guardados", - "fr-fr": "Afficher l'indicateur de modifications non enregistrées", - "uk-ua": "Показати індикатор незбережених змін", - "de-ch": "Indikator für nicht gespeicherte Änderungen anzeigen", - "pt-br": "Mostrar indicador de alterações não salvas", + 'en-us': 'Show unsaved changes indicator', + 'ru-ru': 'Показать индикатор несохраненных изменений', + 'es-es': 'Mostrar indicador de cambios no guardados', + 'fr-fr': "Afficher l'indicateur de modifications non enregistrées", + 'uk-ua': 'Показати індикатор незбережених змін', + 'de-ch': 'Indikator für nicht gespeicherte Änderungen anzeigen', + 'pt-br': 'Mostrar indicador de alterações não salvas', }, showUnsavedIndicatorDescription: { - "en-us": + 'en-us': 'Show an "*" in the tab title when there are unsaved changes in the current tab.', - "es-es": + 'es-es': 'Mostrar un "*" en el título de la pestaña cuando haya cambios sin guardar en la pestaña actual.', - "fr-fr": + 'fr-fr': "Afficher un \"*\" dans le titre de l'onglet lorsqu'il y a des modifications non enregistrées dans l'onglet actuel.", - "ru-ru": - "Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.", - "uk-ua": - "Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.", - "de-ch": - "Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.", - "pt-br": + 'ru-ru': + 'Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.', + 'uk-ua': + 'Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.', + 'de-ch': + 'Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.', + 'pt-br': 'Exibir um "*" no título da aba quando houver alterações não salvas na aba atual.', }, autoPopulateDescription: { - "en-us": - "Auto populate the merged record with values from duplicates when opening the merging dialog.", - "ru-ru": - "Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.", - "de-ch": - "Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.", - "es-es": - "Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.", - "fr-fr": + 'en-us': + 'Auto populate the merged record with values from duplicates when opening the merging dialog.', + 'ru-ru': + 'Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.', + 'de-ch': + 'Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.', + 'es-es': + 'Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.', + 'fr-fr': "Remplir automatiquement l'enregistrement fusionné avec les valeurs des doublons lors de l'ouverture de la boîte de dialogue de fusion.", - "uk-ua": - "Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.", - "pt-br": - "Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.", + 'uk-ua': + 'Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.', + 'pt-br': + 'Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.', }, autoCreateVariants: { - "en-us": "Automatically create {agentVariantTable:string} records", - "ru-ru": "Автоматически создавать записи {agentVariantTable:string}", - "de-ch": "{agentVariantTable:string}-Datensätze automatisch erstellen", - "es-es": "Crear automáticamente registros {agentVariantTable:string}", - "fr-fr": - "Créer automatiquement des enregistrements {agentVariantTable:string}", - "uk-ua": "Автоматично створювати записи {agentVariantTable:string}", - "pt-br": "Criar automaticamente registros {agentVariantTable:string}", + 'en-us': 'Automatically create {agentVariantTable:string} records', + 'ru-ru': 'Автоматически создавать записи {agentVariantTable:string}', + 'de-ch': '{agentVariantTable:string}-Datensätze automatisch erstellen', + 'es-es': 'Crear automáticamente registros {agentVariantTable:string}', + 'fr-fr': + 'Créer automatiquement des enregistrements {agentVariantTable:string}', + 'uk-ua': 'Автоматично створювати записи {agentVariantTable:string}', + 'pt-br': 'Criar automaticamente registros {agentVariantTable:string}', }, autoCreateVariantsDescription: { - "en-us": - "When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.", - "ru-ru": - "При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.", - "de-ch": - "Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.", - "es-es": - "Al fusionar agentes, se crean automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.", - "fr-fr": + 'en-us': + 'When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.', + 'ru-ru': + 'При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.', + 'de-ch': + 'Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.', + 'es-es': + 'Al fusionar agentes, se crean automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.', + 'fr-fr': "Lors de la fusion d'agents, créez automatiquement des enregistrements {agentVariantTable:string} en fonction des variations du prénom/nom.", - "uk-ua": - "Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.", - "pt-br": - "Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.", + 'uk-ua': + 'Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.', + 'pt-br': + 'Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.', }, collectionPreferences: { - "en-us": "Collection Preferences", - "de-ch": "Sammlungseinstellungen", - "es-es": "Preferencias de colección", - "fr-fr": "Personnalisation", - "ru-ru": "Настройки коллекции", - "uk-ua": "Налаштування", - "pt-br": "Preferências de coleção", + 'en-us': 'Collection Preferences', + 'de-ch': 'Sammlungseinstellungen', + 'es-es': 'Preferencias de colección', + 'fr-fr': 'Personnalisation', + 'ru-ru': 'Настройки коллекции', + 'uk-ua': 'Налаштування', + 'pt-br': 'Preferências de coleção', }, rememberDialogSizes: { - "en-us": "Remember dialog window sizes", - "ru-ru": "Запомните размеры диалоговых окон", - "es-es": "Recordar los tamaños de las ventanas de diálogo", - "fr-fr": "Mémoriser les tailles des fenêtres de dialogue", - "uk-ua": "Запам'ятайте розміри діалогових вікон", - "de-ch": "Dialogfenstergrößen merken", - "pt-br": "Lembrar tamanhos de janelas de diálogo", + 'en-us': 'Remember dialog window sizes', + 'ru-ru': 'Запомните размеры диалоговых окон', + 'es-es': 'Recordar los tamaños de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les tailles des fenêtres de dialogue', + 'uk-ua': "Запам'ятайте розміри діалогових вікон", + 'de-ch': 'Dialogfenstergrößen merken', + 'pt-br': 'Lembrar tamanhos de janelas de diálogo', }, rememberDialogPositions: { - "en-us": "Remember dialog window positions", - "ru-ru": "Запомнить позиции диалоговых окон", - "es-es": "Recordar las posiciones de las ventanas de diálogo", - "fr-fr": "Mémoriser les positions des fenêtres de dialogue", - "uk-ua": "Запам'ятовуйте положення діалогового вікна", - "de-ch": "Dialogfensterpositionen merken", - "pt-br": "Lembrar posições da janela de diálogo", + 'en-us': 'Remember dialog window positions', + 'ru-ru': 'Запомнить позиции диалоговых окон', + 'es-es': 'Recordar las posiciones de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les positions des fenêtres de dialogue', + 'uk-ua': "Запам'ятовуйте положення діалогового вікна", + 'de-ch': 'Dialogfensterpositionen merken', + 'pt-br': 'Lembrar posições da janela de diálogo', }, autoPlayMedia: { - "en-us": "Automatically play media", - "ru-ru": "Автоматически воспроизводить медиа", - "es-es": "Reproducir automáticamente medios", - "fr-fr": "Lire automatiquement les médias", - "uk-ua": "Автоматичне відтворення медіа", - "de-ch": "Medien automatisch abspielen", - "pt-br": "Reproduzir mídia automaticamente", + 'en-us': 'Automatically play media', + 'ru-ru': 'Автоматически воспроизводить медиа', + 'es-es': 'Reproducir automáticamente medios', + 'fr-fr': 'Lire automatiquement les médias', + 'uk-ua': 'Автоматичне відтворення медіа', + 'de-ch': 'Medien automatisch abspielen', + 'pt-br': 'Reproduzir mídia automaticamente', }, useCustomTooltips: { - "en-us": "Use modern tooltips", - "ru-ru": "Используйте современные подсказки", - "es-es": "Utilice información sobre herramientas moderna", - "fr-fr": "Utiliser des info-bulles modernes", - "uk-ua": "Використовуйте сучасні підказки", - "de-ch": "Verwenden Sie moderne Tooltips", - "pt-br": "Use dicas de ferramentas modernas", + 'en-us': 'Use modern tooltips', + 'ru-ru': 'Используйте современные подсказки', + 'es-es': 'Utilice información sobre herramientas moderna', + 'fr-fr': 'Utiliser des info-bulles modernes', + 'uk-ua': 'Використовуйте сучасні підказки', + 'de-ch': 'Verwenden Sie moderne Tooltips', + 'pt-br': 'Use dicas de ferramentas modernas', }, alwaysUseQueryBuilder: { - "en-us": "Always use query builder search inside of search form", - "de-ch": - "Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche", - "es-es": - "Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda", - "fr-fr": - "Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche", - "ru-ru": "Всегда используйте конструктор запросов внутри формы поиска.", - "uk-ua": "Завжди використовуйте пошук конструктора запитів у формі пошуку", - "pt-br": - "Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa", + 'en-us': 'Always use query builder search inside of search form', + 'de-ch': + 'Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche', + 'es-es': + 'Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda', + 'fr-fr': + 'Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche', + 'ru-ru': 'Всегда используйте конструктор запросов внутри формы поиска.', + 'uk-ua': 'Завжди використовуйте пошук конструктора запитів у формі пошуку', + 'pt-br': + 'Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa', }, localizeResourceNames: { - "en-us": "Localize the names of recognized app resources", - "de-ch": "Lokalisieren Sie die Namen erkannter App-Ressourcen", - "es-es": - "Localizar los nombres de los recursos de aplicaciones reconocidos", - "fr-fr": "Localiser les noms des ressources d'application reconnues", - "ru-ru": "Локализуйте названия распознанных ресурсов приложения", - "uk-ua": "Локалізувати назви розпізнаних ресурсів програми", - "pt-br": "Localize os nomes dos recursos de aplicativos reconhecidos", + 'en-us': 'Localize the names of recognized app resources', + 'de-ch': 'Lokalisieren Sie die Namen erkannter App-Ressourcen', + 'es-es': + 'Localizar los nombres de los recursos de aplicaciones reconocidos', + 'fr-fr': "Localiser les noms des ressources d'application reconnues", + 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения', + 'uk-ua': 'Локалізувати назви розпізнаних ресурсів програми', + 'pt-br': 'Localize os nomes dos recursos de aplicativos reconhecidos', }, splitLongXml: { - "en-us": "Split long lines of XML into multiple lines", - "de-ch": "Teilen Sie lange XML-Zeilen in mehrere Zeilen auf", - "es-es": "Dividir líneas largas de XML en varias líneas", - "fr-fr": "Diviser les longues lignes de XML en plusieurs lignes", - "ru-ru": "Разделить длинные строки XML на несколько строк", - "uk-ua": "Розділіть довгі рядки XML на кілька рядків", - "pt-br": "Dividir longas linhas de XML em várias linhas", + 'en-us': 'Split long lines of XML into multiple lines', + 'de-ch': 'Teilen Sie lange XML-Zeilen in mehrere Zeilen auf', + 'es-es': 'Dividir líneas largas de XML en varias líneas', + 'fr-fr': 'Diviser les longues lignes de XML en plusieurs lignes', + 'ru-ru': 'Разделить длинные строки XML на несколько строк', + 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', + 'pt-br': 'Dividir longas linhas de XML em várias linhas', }, url: { - "en-us": "URL", - "de-ch": "URL", - "es-es": "URL", - "fr-fr": "URL", - "uk-ua": "URL", - "ru-ru": "URL", - "pt-br": "URL", + 'en-us': 'URL', + 'de-ch': 'URL', + 'es-es': 'URL', + 'fr-fr': 'URL', + 'uk-ua': 'URL', + 'ru-ru': 'URL', + 'pt-br': 'URL', }, pickAttachment: { - "en-us": "Pick an attachment", - "es-es": "Elige un archivo adjunto", - "fr-fr": "Choisissez une pièce jointe", - "ru-ru": "Выберите вложение", - "uk-ua": "Виберіть вкладення", - "de-ch": "Wählen Sie einen Anhang", - "pt-br": "Escolha um anexo", + 'en-us': 'Pick an attachment', + 'es-es': 'Elige un archivo adjunto', + 'fr-fr': 'Choisissez une pièce jointe', + 'ru-ru': 'Выберите вложение', + 'uk-ua': 'Виберіть вкладення', + 'de-ch': 'Wählen Sie einen Anhang', + 'pt-br': 'Escolha um anexo', }, attachmentFailed: { - "en-us": "The attachment failed to load.", - "de-ch": "Der Anhang konnte nicht geladen werden.", - "es-es": "No se pudo cargar el archivo adjunto.", - "fr-fr": "La pièce jointe n'a pas pu être chargée.", - "ru-ru": "Не удалось загрузить вложение.", - "uk-ua": "Не вдалося завантажити вкладений файл.", - "pt-br": "O anexo não pôde ser carregado.", + 'en-us': 'The attachment failed to load.', + 'de-ch': 'Der Anhang konnte nicht geladen werden.', + 'es-es': 'No se pudo cargar el archivo adjunto.', + 'fr-fr': "La pièce jointe n'a pas pu être chargée.", + 'ru-ru': 'Не удалось загрузить вложение.', + 'uk-ua': 'Не вдалося завантажити вкладений файл.', + 'pt-br': 'O anexo não pôde ser carregado.', }, pickImage: { - "en-us": "Pick an image", - "de-ch": "Wählen Sie ein Bild aus", - "es-es": "Elige una imagen", - "fr-fr": "Choisissez une image", - "ru-ru": "Выберите изображение", - "uk-ua": "Виберіть зображення", - "pt-br": "Escolha uma imagem", + 'en-us': 'Pick an image', + 'de-ch': 'Wählen Sie ein Bild aus', + 'es-es': 'Elige una imagen', + 'fr-fr': 'Choisissez une image', + 'ru-ru': 'Выберите изображение', + 'uk-ua': 'Виберіть зображення', + 'pt-br': 'Escolha uma imagem', }, customLogo: { - "en-us": "Expanded Image URL", - "de-ch": "Erweiterte Bild-URL", - "es-es": "URL de imagen expandida", - "fr-fr": "URL de l'image étendue", - "ru-ru": "URL-адрес развернутого изображения", - "uk-ua": "Розширена URL-адреса зображення", - "pt-br": "URL da imagem expandida", + 'en-us': 'Expanded Image URL', + 'de-ch': 'Erweiterte Bild-URL', + 'es-es': 'URL de imagen expandida', + 'fr-fr': "URL de l'image étendue", + 'ru-ru': 'URL-адрес развернутого изображения', + 'uk-ua': 'Розширена URL-адреса зображення', + 'pt-br': 'URL da imagem expandida', }, customLogoCollapsed: { - "en-us": "Collapsed Image URL", - "de-ch": "URL des minimierten Bildes", - "es-es": "URL de imagen contraída", - "fr-fr": "URL de l'image réduite", - "ru-ru": "URL-адрес свернутого изображения", - "uk-ua": "URL-адреса згорнутого зображення", - "pt-br": "URL da imagem recolhida", + 'en-us': 'Collapsed Image URL', + 'de-ch': 'URL des minimierten Bildes', + 'es-es': 'URL de imagen contraída', + 'fr-fr': "URL de l'image réduite", + 'ru-ru': 'URL-адрес свернутого изображения', + 'uk-ua': 'URL-адреса згорнутого зображення', + 'pt-br': 'URL da imagem recolhida', }, customLogoDescription: { - "en-us": - "A URL to an image that would be displayed next to the Specify logo in the navigation menu.", - "de-ch": - "Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.", - "es-es": - "Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.", - "fr-fr": - "Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.", - "ru-ru": - "URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.", - "uk-ua": - "URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.", - "pt-br": - "Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.", + 'en-us': + 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', + 'de-ch': + 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', + 'es-es': + 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', + 'fr-fr': + 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', + 'ru-ru': + 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', + 'uk-ua': + 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', + 'pt-br': + 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', }, showLineNumber: { - "en-us": "Show query result line number", - "de-ch": "Zeilennummer des Abfrageergebnisses anzeigen", - "es-es": "Mostrar el número de línea del resultado de la consulta", - "fr-fr": "Afficher le numéro de ligne du résultat de la requête", - "ru-ru": "Показать номер строки результата запроса", - "uk-ua": "Показати номер рядка результату запиту", - "pt-br": "Mostrar número da linha do resultado da consulta", + 'en-us': 'Show query result line number', + 'de-ch': 'Zeilennummer des Abfrageergebnisses anzeigen', + 'es-es': 'Mostrar el número de línea del resultado de la consulta', + 'fr-fr': 'Afficher le numéro de ligne du résultat de la requête', + 'ru-ru': 'Показать номер строки результата запроса', + 'uk-ua': 'Показати номер рядка результату запиту', + 'pt-br': 'Mostrar número da linha do resultado da consulta', }, saveButtonColor: { - "en-us": "Save button color", - "de-ch": "Farbe der Schaltfläche „Speichern“", - "es-es": "Guardar color del botón", - "fr-fr": "Couleur du bouton Enregistrer", - "ru-ru": "Сохранить цвет кнопки", - "uk-ua": "Зберегти колір кнопки", - "pt-br": "Cor do botão Salvar", + 'en-us': 'Save button color', + 'de-ch': 'Farbe der Schaltfläche „Speichern“', + 'es-es': 'Guardar color del botón', + 'fr-fr': 'Couleur du bouton Enregistrer', + 'ru-ru': 'Сохранить цвет кнопки', + 'uk-ua': 'Зберегти колір кнопки', + 'pt-br': 'Cor do botão Salvar', }, secondaryButtonColor: { - "en-us": "Secondary button color", - "es-es": "Color del botón secundario", - "fr-fr": "Couleur du bouton secondaire", - "ru-ru": "Цвет вторичной кнопки", - "uk-ua": "Колір вторинної кнопки", - "de-ch": "Sekundäre Schaltflächenfarbe", - "pt-br": "Cor do botão secundário", + 'en-us': 'Secondary button color', + 'es-es': 'Color del botón secundario', + 'fr-fr': 'Couleur du bouton secondaire', + 'ru-ru': 'Цвет вторичной кнопки', + 'uk-ua': 'Колір вторинної кнопки', + 'de-ch': 'Sekundäre Schaltflächenfarbe', + 'pt-br': 'Cor do botão secundário', }, secondaryLightButtonColor: { - "en-us": "Secondary light button color", - "de-ch": "Farbe der sekundären Lichttaste", - "es-es": "Color del botón de luz secundaria", - "fr-fr": "Couleur du bouton lumineux secondaire", - "ru-ru": "Цвет кнопки дополнительного освещения", - "uk-ua": "Колір вторинної світлової кнопки", - "pt-br": "Cor do botão de luz secundária", + 'en-us': 'Secondary light button color', + 'de-ch': 'Farbe der sekundären Lichttaste', + 'es-es': 'Color del botón de luz secundaria', + 'fr-fr': 'Couleur du bouton lumineux secondaire', + 'ru-ru': 'Цвет кнопки дополнительного освещения', + 'uk-ua': 'Колір вторинної світлової кнопки', + 'pt-br': 'Cor do botão de luz secundária', }, dangerButtonColor: { - "en-us": "Danger button color", - "de-ch": "Farbe der Gefahrenschaltfläche", - "es-es": "Color del botón de peligro", - "fr-fr": "Couleur du bouton de danger", - "ru-ru": "Цвет кнопки «Опасность»", - "uk-ua": "Колір кнопки небезпеки", - "pt-br": "Cor do botão de perigo", + 'en-us': 'Danger button color', + 'de-ch': 'Farbe der Gefahrenschaltfläche', + 'es-es': 'Color del botón de peligro', + 'fr-fr': 'Couleur du bouton de danger', + 'ru-ru': 'Цвет кнопки «Опасность»', + 'uk-ua': 'Колір кнопки небезпеки', + 'pt-br': 'Cor do botão de perigo', }, infoButtonColor: { - "en-us": "Info button color", - "de-ch": "Farbe der Info-Schaltfläche", - "es-es": "Color del botón de información", - "fr-fr": "Couleur du bouton d'information", - "ru-ru": "Цвет кнопки информации", - "uk-ua": "Колір інформаційної кнопки", - "pt-br": "Cor do botão de informações", + 'en-us': 'Info button color', + 'de-ch': 'Farbe der Info-Schaltfläche', + 'es-es': 'Color del botón de información', + 'fr-fr': "Couleur du bouton d'information", + 'ru-ru': 'Цвет кнопки информации', + 'uk-ua': 'Колір інформаційної кнопки', + 'pt-br': 'Cor do botão de informações', }, warningButtonColor: { - "en-us": "Warning button color", - "de-ch": "Farbe der Warnschaltfläche", - "es-es": "Color del botón de advertencia", - "fr-fr": "Couleur du bouton d'avertissement", - "ru-ru": "Цвет кнопки предупреждения", - "uk-ua": "Колір кнопки попередження", - "pt-br": "Cor do botão de aviso", + 'en-us': 'Warning button color', + 'de-ch': 'Farbe der Warnschaltfläche', + 'es-es': 'Color del botón de advertencia', + 'fr-fr': "Couleur du bouton d'avertissement", + 'ru-ru': 'Цвет кнопки предупреждения', + 'uk-ua': 'Колір кнопки попередження', + 'pt-br': 'Cor do botão de aviso', }, successButtonColor: { - "en-us": "Success button color", - "de-ch": "Farbe der Schaltfläche „Erfolg“", - "es-es": "Color del botón de éxito", - "fr-fr": "Couleur du bouton de réussite", - "ru-ru": "Цвет кнопки «Успех»", - "uk-ua": "Колір кнопки успіху", - "pt-br": "Cor do botão de sucesso", + 'en-us': 'Success button color', + 'de-ch': 'Farbe der Schaltfläche „Erfolg“', + 'es-es': 'Color del botón de éxito', + 'fr-fr': 'Couleur du bouton de réussite', + 'ru-ru': 'Цвет кнопки «Успех»', + 'uk-ua': 'Колір кнопки успіху', + 'pt-br': 'Cor do botão de sucesso', }, openAsReadOnly: { - "en-us": "Open all records in read-only mode", - "de-ch": "Alle Datensätze im schreibgeschützten Modus öffnen", - "es-es": "Abrir todos los registros en modo de solo lectura", - "fr-fr": "Ouvrir tous les enregistrements en mode lecture seule", - "ru-ru": "Открыть все записи в режиме только для чтения", - "uk-ua": "Відкрити всі записи в режимі лише для читання", - "pt-br": "Abra todos os registros no modo somente leitura", + 'en-us': 'Open all records in read-only mode', + 'de-ch': 'Alle Datensätze im schreibgeschützten Modus öffnen', + 'es-es': 'Abrir todos los registros en modo de solo lectura', + 'fr-fr': 'Ouvrir tous les enregistrements en mode lecture seule', + 'ru-ru': 'Открыть все записи в режиме только для чтения', + 'uk-ua': 'Відкрити всі записи в режимі лише для читання', + 'pt-br': 'Abra todos os registros no modo somente leitura', }, displayBasicView: { - "en-us": "Display basic view", - "de-ch": "Basisansicht anzeigen", - "es-es": "Mostrar vista básica", - "fr-fr": "Afficher la vue de base", - "ru-ru": "Отобразить базовый вид", - "uk-ua": "Відобразити базовий вигляд", - "pt-br": "Exibir visualização básica", + 'en-us': 'Display basic view', + 'de-ch': 'Basisansicht anzeigen', + 'es-es': 'Mostrar vista básica', + 'fr-fr': 'Afficher la vue de base', + 'ru-ru': 'Отобразить базовый вид', + 'uk-ua': 'Відобразити базовий вигляд', + 'pt-br': 'Exibir visualização básica', }, showComparisonOperatorsForString: { - "en-us": "Show comparison operators for text-based fields", - "de-ch": "Vergleichsoperatoren für textbasierte Felder anzeigen", - "es-es": "Mostrar operadores de comparación para campos basados en texto", - "fr-fr": "Afficher les opérateurs de comparaison pour les champs textuels", - "pt-br": "Mostrar operadores de comparação para campos baseados em texto", - "ru-ru": "Показать операторы сравнения для текстовых полей", - "uk-ua": "Показати оператори порівняння для текстових полів", + 'en-us': 'Show comparison operators for text-based fields', + 'de-ch': 'Vergleichsoperatoren für textbasierte Felder anzeigen', + 'es-es': 'Mostrar operadores de comparación para campos basados en texto', + 'fr-fr': 'Afficher les opérateurs de comparaison pour les champs textuels', + 'pt-br': 'Mostrar operadores de comparação para campos baseados em texto', + 'ru-ru': 'Показать операторы сравнения для текстовых полей', + 'uk-ua': 'Показати оператори порівняння для текстових полів', }, showComparisonOperatorsDescription: { - "en-us": - "Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to", - "de-ch": - "Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich", - "es-es": - "Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que", - "fr-fr": + 'en-us': + 'Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to', + 'de-ch': + 'Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich', + 'es-es': + 'Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que', + 'fr-fr': "Permet d'appliquer les filtres suivants aux champs de texte : Supérieur à, Inférieur à, Supérieur ou égal à et Inférieur ou égal à", - "pt-br": - "Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a", - "ru-ru": - "Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».", - "uk-ua": - "Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»", + 'pt-br': + 'Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a', + 'ru-ru': + 'Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».', + 'uk-ua': + 'Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»', }, basicView: { - "en-us": "Basic view", - "de-ch": "Basisansicht", - "es-es": "Vista básica", - "fr-fr": "Vue de base", - "ru-ru": "Базовый вид", - "uk-ua": "Основний вигляд", - "pt-br": "Visão básica", + 'en-us': 'Basic view', + 'de-ch': 'Basisansicht', + 'es-es': 'Vista básica', + 'fr-fr': 'Vue de base', + 'ru-ru': 'Базовый вид', + 'uk-ua': 'Основний вигляд', + 'pt-br': 'Visão básica', }, detailedView: { - "en-us": "Detailed view", - "de-ch": "Detailansicht", - "es-es": "Vista detallada", - "fr-fr": "Vue détaillée", - "ru-ru": "Подробный вид", - "uk-ua": "Детальний вигляд", - "pt-br": "Visão detalhada", + 'en-us': 'Detailed view', + 'de-ch': 'Detailansicht', + 'es-es': 'Vista detallada', + 'fr-fr': 'Vue détaillée', + 'ru-ru': 'Подробный вид', + 'uk-ua': 'Детальний вигляд', + 'pt-br': 'Visão detalhada', }, attachmentPreviewMode: { - "en-us": "Attachment preview mode", - "de-ch": "Anhangsvorschaumodus", - "es-es": "Modo de vista previa de archivos adjuntos", - "fr-fr": "Mode d'aperçu des pièces jointes", - "ru-ru": "Режим предварительного просмотра вложений", - "uk-ua": "Режим попереднього перегляду вкладених файлів", - "pt-br": "Modo de visualização de anexos", + 'en-us': 'Attachment preview mode', + 'de-ch': 'Anhangsvorschaumodus', + 'es-es': 'Modo de vista previa de archivos adjuntos', + 'fr-fr': "Mode d'aperçu des pièces jointes", + 'ru-ru': 'Режим предварительного просмотра вложений', + 'uk-ua': 'Режим попереднього перегляду вкладених файлів', + 'pt-br': 'Modo de visualização de anexos', }, fullResolution: { - "en-us": "Full Resolution", - "de-ch": "Volle Auflösung", - "es-es": "Resolución completa", - "fr-fr": "Pleine résolution", - "ru-ru": "Полное разрешение", - "uk-ua": "Повна роздільна здатність", - "pt-br": "Resolução completa", + 'en-us': 'Full Resolution', + 'de-ch': 'Volle Auflösung', + 'es-es': 'Resolución completa', + 'fr-fr': 'Pleine résolution', + 'ru-ru': 'Полное разрешение', + 'uk-ua': 'Повна роздільна здатність', + 'pt-br': 'Resolução completa', }, thumbnail: { - "en-us": "Thumbnail", - "de-ch": "Miniaturansicht", - "es-es": "Uña del pulgar", - "fr-fr": "Vignette", - "ru-ru": "Миниатюра", - "uk-ua": "Мініатюра", - "pt-br": "Miniatura", + 'en-us': 'Thumbnail', + 'de-ch': 'Miniaturansicht', + 'es-es': 'Uña del pulgar', + 'fr-fr': 'Vignette', + 'ru-ru': 'Миниатюра', + 'uk-ua': 'Мініатюра', + 'pt-br': 'Miniatura', }, addSearchBarHomePage: { - "en-us": "Add Search Bar on home page", - "de-ch": "Suchleiste auf der Startseite hinzufügen", - "es-es": "Agregar barra de búsqueda en la página de inicio", - "fr-fr": "Ajouter une barre de recherche sur la page d'accueil", - "ru-ru": "Добавить панель поиска на домашнюю страницу", - "uk-ua": "Додайте рядок пошуку на головну сторінку", - "pt-br": "Adicionar barra de pesquisa na página inicial", + 'en-us': 'Add Search Bar on home page', + 'de-ch': 'Suchleiste auf der Startseite hinzufügen', + 'es-es': 'Agregar barra de búsqueda en la página de inicio', + 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", + 'ru-ru': 'Добавить панель поиска на домашнюю страницу', + 'uk-ua': 'Додайте рядок пошуку на головну сторінку', + 'pt-br': 'Adicionar barra de pesquisa na página inicial', }, inheritanceCatNumberPref: { - "en-us": - "Enable the inheritance of the primary catalog number to its empty siblings.", - "de-ch": - "Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.", - "es-es": - "Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.", - "fr-fr": + 'en-us': + 'Enable the inheritance of the primary catalog number to its empty siblings.', + 'de-ch': + 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', + 'es-es': + 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', + 'fr-fr': "Activer l'héritage du numéro de catalogue principal à ses frères vides.", - "pt-br": - "Habilitar a herança do número de catálogo primário para seus irmãos vazios.", - "ru-ru": - "Включить наследование основного каталожного номера его пустыми родственными номерами.", - "uk-ua": - "Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.", + 'pt-br': + 'Habilitar a herança do número de catálogo primário para seus irmãos vazios.', + 'ru-ru': + 'Включить наследование основного каталожного номера его пустыми родственными номерами.', + 'uk-ua': + 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', }, inheritanceCatNumberParentCOPref: { - "en-us": - "Enable the inheritance of the parent catalog number to its empty children.", - "de-ch": - "Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.", - "es-es": - "Habilitar la herencia del número de catálogo padre a sus hijos vacíos.", - "fr-fr": + 'en-us': + 'Enable the inheritance of the parent catalog number to its empty children.', + 'de-ch': + 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.', + 'es-es': + 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', + 'fr-fr': "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", - "pt-br": - "Habilita a herança do número do catálogo pai para seus filhos vazios.", - "ru-ru": - "Включить наследование родительского каталожного номера его пустыми дочерними элементами.", - "uk-ua": - "Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.", + 'pt-br': + 'Habilita a herança do número do catálogo pai para seus filhos vazios.', + 'ru-ru': + 'Включить наследование родительского каталожного номера его пустыми дочерними элементами.', + 'uk-ua': + 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', }, uniqueCatNumberAcrossCompAndCo: { - "en-us": - "Catalog Number field need to be unique across Component and CO tables", - "de-ch": - "Das Feld „Katalognummer“ muss in allen Komponenten- und CO-Tabellen eindeutig sein", - "es-es": - "El campo Número de catálogo debe ser único en las tablas de componentes y CO", - "fr-fr": - "Le champ Numéro de catalogue doit être unique dans les tables Composant et CO", - "pt-br": - "O campo Número de catálogo precisa ser exclusivo nas tabelas Componente e CO", - "ru-ru": - "Поле «Номер каталога» должно быть уникальным в таблицах «Компонент» и «CO».", - "uk-ua": - "Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO»", + 'en-us': + 'Catalog Number field need to be unique across Component and CO tables', + 'de-ch': + 'Das Feld „Katalognummer“ muss in allen Komponenten- und CO-Tabellen eindeutig sein', + 'es-es': + 'El campo Número de catálogo debe ser único en las tablas de componentes y CO', + 'fr-fr': + 'Le champ Numéro de catalogue doit être unique dans les tables Composant et CO', + 'pt-br': + 'O campo Número de catálogo precisa ser exclusivo nas tabelas Componente e CO', + 'ru-ru': + 'Поле «Номер каталога» должно быть уникальным в таблицах «Компонент» и «CO».', + 'uk-ua': + 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO».', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts index b6f00862831..8fec68d009c 100644 --- a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts +++ b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts @@ -2,193 +2,211 @@ * Localization strings for the Specify Network integration */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const specifyNetworkText = createDictionary({ specifyNetwork: { - "en-us": "Specify Network", - "ru-ru": "Укажите сеть", - "es-es": "Specify red", - "fr-fr": "Réseau Specify", - "uk-ua": "Specify Network", - "de-ch": "Specify Network", - "pt-br": "Especificar rede", + 'en-us': 'Specify Network', + 'ru-ru': 'Укажите сеть', + 'es-es': 'Specify red', + 'fr-fr': 'Réseau Specify', + 'uk-ua': 'Specify Network', + 'de-ch': 'Specify Network', + 'pt-br': 'Especificar rede', + }, + publishingOrganizationKey: { + 'en-us': 'Publishing organization key', + 'ru-ru': 'Publishing organization key', + 'es-es': 'Publishing organization key', + 'fr-fr': "Clé d’organisation de publication", + 'uk-ua': 'Publishing organization key', + 'de-ch': 'Publishing organization key', + 'pt-br': 'Chave da organização publicadora', + }, + collectionKey: { + 'en-us': 'Collection key', + 'ru-ru': 'Collection key', + 'es-es': 'Collection key', + 'fr-fr': 'Identifiant de collection', + 'uk-ua': 'Collection key', + 'de-ch': 'Collection key', + 'pt-br': 'Chave da coleção', }, occurrenceOrGuidRequired: { - "en-us": "Species Name or GUID must be provided to display this page", - "de-ch": - "Zur Anzeige dieser Seite muss der Artname oder die GUID angegeben werden", - "es-es": - "Se debe proporcionar el nombre de especie o el GUID para mostrar esta página", - "fr-fr": + 'en-us': 'Species Name or GUID must be provided to display this page', + 'de-ch': + 'Zur Anzeige dieser Seite muss der Artname oder die GUID angegeben werden', + 'es-es': + 'Se debe proporcionar el nombre de especie o el GUID para mostrar esta página', + 'fr-fr': "Le nom de l'espèce ou le GUID doit être fourni pour afficher cette page", - "ru-ru": - "Для отображения этой страницы необходимо указать название вида или GUID.", - "uk-ua": - "Щоб відобразити цю сторінку, потрібно вказати назву виду або GUID", - "pt-br": - "O nome da espécie ou GUID deve ser fornecido para exibir esta página", + 'ru-ru': + 'Для отображения этой страницы необходимо указать название вида или GUID.', + 'uk-ua': + 'Щоб відобразити цю сторінку, потрібно вказати назву виду або GUID', + 'pt-br': + 'O nome da espécie ou GUID deve ser fornecido para exibir esta página', }, noDataError: { - "en-us": "Unable to find any data for this request", - "de-ch": "Zu dieser Anfrage konnten keine Daten gefunden werden", - "es-es": "No se encuentran datos para esta solicitud", - "fr-fr": "Impossible de trouver des données pour cette demande", - "ru-ru": "Не удалось найти данные по этому запросу.", - "uk-ua": "Неможливо знайти дані для цього запиту", - "pt-br": "Não foi possível encontrar nenhum dado para esta solicitação", + 'en-us': 'Unable to find any data for this request', + 'de-ch': 'Zu dieser Anfrage konnten keine Daten gefunden werden', + 'es-es': 'No se encuentran datos para esta solicitud', + 'fr-fr': 'Impossible de trouver des données pour cette demande', + 'ru-ru': 'Не удалось найти данные по этому запросу.', + 'uk-ua': 'Неможливо знайти дані для цього запиту', + 'pt-br': 'Não foi possível encontrar nenhum dado para esta solicitação', }, noDataErrorDescription: { - "en-us": "Please try searching for a different record", - "de-ch": "Versuchen Sie bitte, nach einem anderen Datensatz zu suchen", - "es-es": "Intente buscar un registro diferente", - "fr-fr": "Veuillez essayer de rechercher un autre enregistrement", - "ru-ru": "Попробуйте поискать другую запись.", - "uk-ua": "Будь ласка, спробуйте знайти інший запис", - "pt-br": "Por favor, tente procurar um registro diferente", + 'en-us': 'Please try searching for a different record', + 'de-ch': 'Versuchen Sie bitte, nach einem anderen Datensatz zu suchen', + 'es-es': 'Intente buscar un registro diferente', + 'fr-fr': 'Veuillez essayer de rechercher un autre enregistrement', + 'ru-ru': 'Попробуйте поискать другую запись.', + 'uk-ua': 'Будь ласка, спробуйте знайти інший запис', + 'pt-br': 'Por favor, tente procurar um registro diferente', }, dataQuality: { - "en-us": "Data Quality", - "de-ch": "Datenqualität", - "es-es": "Calidad de datos", - "fr-fr": "Qualité des données", - "ru-ru": "Качество данных", - "uk-ua": "Якість даних", - "pt-br": "Qualidade de dados", + 'en-us': 'Data Quality', + 'de-ch': 'Datenqualität', + 'es-es': 'Calidad de datos', + 'fr-fr': 'Qualité des données', + 'ru-ru': 'Качество данных', + 'uk-ua': 'Якість даних', + 'pt-br': 'Qualidade de dados', }, reportedBy: { - "en-us": "Reported by {provider:string}", - "de-ch": "Gemeldet von {provider:string}", - "es-es": "Reportado por {provider:string}", - "fr-fr": "Signalé par {provider:string}", - "ru-ru": "Сообщил {provider:string}", - "uk-ua": "Повідомив {provider:string}", - "pt-br": "Reportado por {provider:string}", + 'en-us': 'Reported by {provider:string}', + 'de-ch': 'Gemeldet von {provider:string}', + 'es-es': 'Reportado por {provider:string}', + 'fr-fr': 'Signalé par {provider:string}', + 'ru-ru': 'Сообщил {provider:string}', + 'uk-ua': 'Повідомив {provider:string}', + 'pt-br': 'Reportado por {provider:string}', }, collectionDate: { - "en-us": "Collection Date", - "de-ch": "Abholdatum", - "es-es": "Fecha de colecta", - "fr-fr": "Date de collecte", - "ru-ru": "Дата сбора", - "uk-ua": "Дата збору", - "pt-br": "Data de coleta", + 'en-us': 'Collection Date', + 'de-ch': 'Abholdatum', + 'es-es': 'Fecha de colecta', + 'fr-fr': 'Date de collecte', + 'ru-ru': 'Дата сбора', + 'uk-ua': 'Дата збору', + 'pt-br': 'Data de coleta', }, mapDescription: { - "en-us": - "This map shows occurrences of this taxon from the iDigBio and GBIF aggregators.", - "de-ch": - "Diese Karte zeigt Vorkommen dieses Taxons aus den Aggregatoren iDigBio und GBIF.", - "es-es": - "Este mapa muestra los registros de este taxón en los agregadores iDigBio y GBIF.", - "fr-fr": - "Cette carte montre les occurrences de ce taxon à partir des agrégateurs iDigBio et GBIF.", - "ru-ru": - "На этой карте показаны случаи встречаемости этого таксона по данным агрегаторов iDigBio и GBIF.", - "uk-ua": - "Ця карта показує випадки появи цього таксону з агрегаторів iDigBio та GBIF.", - "pt-br": - "Este mapa mostra ocorrências deste táxon dos agregadores iDigBio e GBIF.", + 'en-us': + 'This map shows occurrences of this taxon from the iDigBio and GBIF aggregators.', + 'de-ch': + 'Diese Karte zeigt Vorkommen dieses Taxons aus den Aggregatoren iDigBio und GBIF.', + 'es-es': + 'Este mapa muestra los registros de este taxón en los agregadores iDigBio y GBIF.', + 'fr-fr': + 'Cette carte montre les occurrences de ce taxon à partir des agrégateurs iDigBio et GBIF.', + 'ru-ru': + 'На этой карте показаны случаи встречаемости этого таксона по данным агрегаторов iDigBio и GBIF.', + 'uk-ua': + 'Ця карта показує випадки появи цього таксону з агрегаторів iDigBio та GBIF.', + 'pt-br': + 'Este mapa mostra ocorrências deste táxon dos agregadores iDigBio e GBIF.', }, iDigBioDescription: { - "en-us": - "Occurrences recorded in iDigBio are shown as round green points, except for those from the current collection recorded in iDigBio that are round red points. Zooming in on the red points brings up a blue teardrop pin, clicking on the pin executes a locality query in Specify that shows all of the species in the current Specify database collected from that location.", - "de-ch": - "In iDigBio erfasste Vorkommen werden als runde grüne Punkte angezeigt, mit Ausnahme der in iDigBio erfassten Vorkommen, die als runde rote Punkte dargestellt sind. Beim Vergrößern der roten Punkte wird eine blaue Stecknadel angezeigt. Durch Klicken auf diese Stecknadel wird eine Standortabfrage in Specify ausgeführt, die alle an diesem Standort gesammelten Arten der aktuellen Specify-Datenbank anzeigt.", - "es-es": - "Los registros recogidos en iDigBio se muestran como puntos verdes redondos, excepto los de esta colección, registrados en iDigBio, que son puntos rojos redondos. Al acercarse a los puntos rojos, aparece una chincheta en forma de lágrima azul; al hacer clic en la chincheta, se ejecuta una consulta de localidad en Specify que muestra todas las especies en la base de datos actual de Specify colectadas en esa localización.", - "fr-fr": + 'en-us': + 'Occurrences recorded in iDigBio are shown as round green points, except for those from the current collection recorded in iDigBio that are round red points. Zooming in on the red points brings up a blue teardrop pin, clicking on the pin executes a locality query in Specify that shows all of the species in the current Specify database collected from that location.', + 'de-ch': + 'In iDigBio erfasste Vorkommen werden als runde grüne Punkte angezeigt, mit Ausnahme der in iDigBio erfassten Vorkommen, die als runde rote Punkte dargestellt sind. Beim Vergrößern der roten Punkte wird eine blaue Stecknadel angezeigt. Durch Klicken auf diese Stecknadel wird eine Standortabfrage in Specify ausgeführt, die alle an diesem Standort gesammelten Arten der aktuellen Specify-Datenbank anzeigt.', + 'es-es': + 'Los registros recogidos en iDigBio se muestran como puntos verdes redondos, excepto los de esta colección, registrados en iDigBio, que son puntos rojos redondos. Al acercarse a los puntos rojos, aparece una chincheta en forma de lágrima azul; al hacer clic en la chincheta, se ejecuta una consulta de localidad en Specify que muestra todas las especies en la base de datos actual de Specify colectadas en esa localización.', + 'fr-fr': "Les occurrences enregistrées dans iDigBio sont représentées par des points verts ronds, à l'exception de celles de la collection actuelle, qui sont représentées par des points rouges ronds. Un zoom sur les points rouges fait apparaître une épingle bleue en forme de larme. Cliquer dessus exécute une requête de localité dans Specify, qui affiche toutes les espèces de la base de données Specify collectées à cet endroit.", - "ru-ru": - "Встречи, зарегистрированные в iDigBio, отображаются круглыми зелёными точками, за исключением случаев из текущей коллекции, зарегистрированной в iDigBio, которые обозначены круглыми красными точками. При увеличении красных точек появляется синяя каплевидная метка; нажатие на метку выполняет запрос по местоположению в Specify, который отображает все виды из текущей базы данных Specify, собранные в этом месте.", - "uk-ua": - "Випадки, записані в iDigBio, відображаються круглими зеленими точками, за винятком випадків із поточної колекції, записаної в iDigBio, які мають круглі червоні точки. Збільшення масштабу червоних крапок відкриває блакитну шпильку-сльозинку, клацання шпильки виконує запит місцевості в Specify, який показує всі види в поточній базі даних Specify, зібрані з цього місця.", - "pt-br": - "As ocorrências registradas no iDigBio são mostradas como pontos verdes redondos, exceto aquelas da coleção atual registrada no iDigBio, que são pontos vermelhos redondos. Ao ampliar os pontos vermelhos, um alfinete azul em forma de lágrima é exibido. Clicar no alfinete executa uma consulta de localidade no Specify, que mostra todas as espécies coletadas naquele local no banco de dados do Specify atual.", + 'ru-ru': + 'Встречи, зарегистрированные в iDigBio, отображаются круглыми зелёными точками, за исключением случаев из текущей коллекции, зарегистрированной в iDigBio, которые обозначены круглыми красными точками. При увеличении красных точек появляется синяя каплевидная метка; нажатие на метку выполняет запрос по местоположению в Specify, который отображает все виды из текущей базы данных Specify, собранные в этом месте.', + 'uk-ua': + 'Випадки, записані в iDigBio, відображаються круглими зеленими точками, за винятком випадків із поточної колекції, записаної в iDigBio, які мають круглі червоні точки. Збільшення масштабу червоних крапок відкриває блакитну шпильку-сльозинку, клацання шпильки виконує запит місцевості в Specify, який показує всі види в поточній базі даних Specify, зібрані з цього місця.', + 'pt-br': + 'As ocorrências registradas no iDigBio são mostradas como pontos verdes redondos, exceto aquelas da coleção atual registrada no iDigBio, que são pontos vermelhos redondos. Ao ampliar os pontos vermelhos, um alfinete azul em forma de lágrima é exibido. Clicar no alfinete executa uma consulta de localidade no Specify, que mostra todas as espécies coletadas naquele local no banco de dados do Specify atual.', }, gbifDescription: { - "en-us": - "For GBIF data, individual points and clusters of points are shown as hexagons of different colors ranging from yellow to orange to red. Dark red hexagons corresponding to densest distributions of collected specimens of that species.", - "de-ch": - "Bei GBIF-Daten werden einzelne Punkte und Punktcluster als Sechsecke in verschiedenen Farben von Gelb über Orange bis Rot angezeigt. Dunkelrote Sechsecke entsprechen der dichtesten Verteilung gesammelter Exemplare dieser Art.", - "es-es": - "Para los datos de GBIF, los puntos individuales y los grupos de puntos se muestran como hexágonos de diferentes colores que van del amarillo al naranja y al rojo. Hexágonos de color rojo oscuro que corresponden a las distribuciones más densas de especímenes colectados de esa especie.", - "fr-fr": + 'en-us': + 'For GBIF data, individual points and clusters of points are shown as hexagons of different colors ranging from yellow to orange to red. Dark red hexagons corresponding to densest distributions of collected specimens of that species.', + 'de-ch': + 'Bei GBIF-Daten werden einzelne Punkte und Punktcluster als Sechsecke in verschiedenen Farben von Gelb über Orange bis Rot angezeigt. Dunkelrote Sechsecke entsprechen der dichtesten Verteilung gesammelter Exemplare dieser Art.', + 'es-es': + 'Para los datos de GBIF, los puntos individuales y los grupos de puntos se muestran como hexágonos de diferentes colores que van del amarillo al naranja y al rojo. Hexágonos de color rojo oscuro que corresponden a las distribuciones más densas de especímenes colectados de esa especie.', + 'fr-fr': "Pour les données GBIF, les points individuels et les groupes de points sont représentés par des hexagones de différentes couleurs, allant du jaune à l'orange et au rouge. Les hexagones rouge foncé correspondent aux distributions les plus denses de spécimens collectés de l'espèce.", - "ru-ru": - "В данных GBIF отдельные точки и скопления точек показаны шестиугольниками разных цветов: от жёлтого до оранжевого и красного. Тёмно-красные шестиугольники соответствуют наиболее плотному распределению собранных особей данного вида.", - "uk-ua": - "Для даних GBIF окремі точки та кластери точок відображаються у вигляді шестикутників різних кольорів від жовтого до оранжевого та червоного. Темно-червоні шестикутники відповідають найщільнішому розподілу зібраних зразків цього виду.", - "pt-br": - "Para dados GBIF, pontos individuais e grupos de pontos são mostrados como hexágonos de cores diferentes, variando de amarelo a laranja e vermelho. Hexágonos vermelho-escuros correspondem às distribuições mais densas de espécimes coletados daquela espécie.", + 'ru-ru': + 'В данных GBIF отдельные точки и скопления точек показаны шестиугольниками разных цветов: от жёлтого до оранжевого и красного. Тёмно-красные шестиугольники соответствуют наиболее плотному распределению собранных особей данного вида.', + 'uk-ua': + 'Для даних GBIF окремі точки та кластери точок відображаються у вигляді шестикутників різних кольорів від жовтого до оранжевого та червоного. Темно-червоні шестикутники відповідають найщільнішому розподілу зібраних зразків цього виду.', + 'pt-br': + 'Para dados GBIF, pontos individuais e grupos de pontos são mostrados como hexágonos de cores diferentes, variando de amarelo a laranja e vermelho. Hexágonos vermelho-escuros correspondem às distribuições mais densas de espécimes coletados daquela espécie.', }, connectToGbif: { - "en-us": "Connect to GBIF", - "de-ch": "Mit GBIF verbinden", - "es-es": "Conectarse a GBIF", - "fr-fr": "Se connecter au GBIF", - "ru-ru": "Подключиться к ГБИФ", - "uk-ua": "Підключіться до GBIF", - "pt-br": "Conecte-se ao GBIF", + 'en-us': 'Connect to GBIF', + 'de-ch': 'Mit GBIF verbinden', + 'es-es': 'Conectarse a GBIF', + 'fr-fr': 'Se connecter au GBIF', + 'ru-ru': 'Подключиться к ГБИФ', + 'uk-ua': 'Підключіться до GBIF', + 'pt-br': 'Conecte-se ao GBIF', }, searchForInstitution: { - "en-us": "Search for your institution:", - "de-ch": "Suchen Sie nach Ihrer Institution:", - "es-es": "Busque su institución:", - "fr-fr": "Recherchez votre établissement :", - "ru-ru": "Поиск вашего учреждения:", - "uk-ua": "Підключіться до GBIF", - "pt-br": "Pesquise sua instituição:", + 'en-us': 'Search for your institution:', + 'de-ch': 'Suchen Sie nach Ihrer Institution:', + 'es-es': 'Busque su institución:', + 'fr-fr': 'Recherchez votre établissement :', + 'ru-ru': 'Поиск вашего учреждения:', + 'uk-ua': 'Підключіться до GBIF', + 'pt-br': 'Pesquise sua instituição:', }, institutionDistributionMap: { - "en-us": - "Distribution map of all of the digitized specimens curated in your Institution", - "de-ch": - "Verbreitungskarte aller digitalisierten Exemplare, die in Ihrer Institution kuratiert werden", - "es-es": - "Mapa de distribución de todos los ejemplares digitalizados conservados en su Institución", - "fr-fr": - "Carte de distribution de tous les spécimens numérisés conservés dans votre institution", - "ru-ru": - "Карта распределения всех оцифрованных образцов, хранящихся в вашем учреждении", - "uk-ua": - "Карта розповсюдження всіх оцифрованих зразків, збережених у вашій установі", - "pt-br": - "Mapa de distribuição de todos os espécimes digitalizados e curados em sua Instituição", + 'en-us': + 'Distribution map of all of the digitized specimens curated in your Institution', + 'de-ch': + 'Verbreitungskarte aller digitalisierten Exemplare, die in Ihrer Institution kuratiert werden', + 'es-es': + 'Mapa de distribución de todos los ejemplares digitalizados conservados en su Institución', + 'fr-fr': + 'Carte de distribution de tous les spécimens numérisés conservés dans votre institution', + 'ru-ru': + 'Карта распределения всех оцифрованных образцов, хранящихся в вашем учреждении', + 'uk-ua': + 'Карта розповсюдження всіх оцифрованих зразків, збережених у вашій установі', + 'pt-br': + 'Mapa de distribuição de todos os espécimes digitalizados e curados em sua Instituição', }, collectionDistributionMap: { - "en-us": - "Distribution map of all of the digitized specimens curated in your Collection", - "de-ch": "Verbreitungskarte aller digitalisierten Exemplare Ihrer Sammlung", - "es-es": - "Mapa de distribución de todos los ejemplares digitalizados conservados en su Colección", - "fr-fr": - "Carte de répartition de tous les spécimens numérisés conservés dans votre collection", - "ru-ru": - "Карта распределения всех оцифрованных образцов, хранящихся в вашей коллекции", - "uk-ua": - "Карта розповсюдження всіх оцифрованих зразків, збережених у вашій колекції", - "pt-br": - "Mapa de distribuição de todos os espécimes digitalizados selecionados em sua coleção", + 'en-us': + 'Distribution map of all of the digitized specimens curated in your Collection', + 'de-ch': 'Verbreitungskarte aller digitalisierten Exemplare Ihrer Sammlung', + 'es-es': + 'Mapa de distribución de todos los ejemplares digitalizados conservados en su Colección', + 'fr-fr': + 'Carte de répartition de tous les spécimens numérisés conservés dans votre collection', + 'ru-ru': + 'Карта распределения всех оцифрованных образцов, хранящихся в вашей коллекции', + 'uk-ua': + 'Карта розповсюдження всіх оцифрованих зразків, збережених у вашій колекції', + 'pt-br': + 'Mapa de distribuição de todos os espécimes digitalizados selecionados em sua coleção', }, startYear: { - "en-us": "Start Year", - "de-ch": "Startjahr", - "es-es": "Año de inicio", - "fr-fr": "Année de début", - "ru-ru": "Год начала", - "uk-ua": "Рік початку", - "pt-br": "Ano de início", + 'en-us': 'Start Year', + 'de-ch': 'Startjahr', + 'es-es': 'Año de inicio', + 'fr-fr': 'Année de début', + 'ru-ru': 'Год начала', + 'uk-ua': 'Рік початку', + 'pt-br': 'Ano de início', }, endYear: { - "en-us": "End Year", - "de-ch": "Jahresende", - "es-es": "Año final", - "fr-fr": "Fin d'année", - "ru-ru": "Конец года", - "uk-ua": "Кінцевий рік", - "pt-br": "Fim de ano", + 'en-us': 'End Year', + 'de-ch': 'Jahresende', + 'es-es': 'Año final', + 'fr-fr': "Fin d'année", + 'ru-ru': 'Конец года', + 'uk-ua': 'Кінцевий рік', + 'pt-br': 'Fim de ano', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/stats.tsx b/specifyweb/frontend/js_src/lib/localization/stats.tsx index d7e726cd65d..bf901980c06 100644 --- a/specifyweb/frontend/js_src/lib/localization/stats.tsx +++ b/specifyweb/frontend/js_src/lib/localization/stats.tsx @@ -313,5 +313,20 @@ export const statsText = createDictionary({ categoryToDelete: { 'en-us': 'This will permanently delete the following category', }, + layoutPreference: { + 'en-us': 'Defines the layout of the statistics page', + }, + showPreparationsTotal: { + 'en-us': 'Show preparation totals', + }, + showPreparationsTotalDescription: { + 'en-us': 'Include an overall total across preparation types on the statistics page.', + }, + autoRefreshRate: { + 'en-us': 'Auto-refresh rate (hours)', + }, + autoRefreshRateDescription: { + 'en-us': 'Specify how frequently shared statistics refresh their data.', + }, }); /* eslint-enable @typescript-eslint/naming-convention */ diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index e974d25f7cd..f362d2bdd73 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -4,703 +4,784 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const treeText = createDictionary({ trees: { - "en-us": "Trees", - "ru-ru": "Деревья", - "es-es": "Árboles", - "fr-fr": "Arbres", - "uk-ua": "дерева", - "de-ch": "Hierarchien", - "pt-br": "Árvores", + 'en-us': 'Trees', + 'ru-ru': 'Деревья', + 'es-es': 'Árboles', + 'fr-fr': 'Arbres', + 'uk-ua': 'дерева', + 'de-ch': 'Hierarchien', + 'pt-br': 'Árvores', }, badStructure: { - "en-us": "Bad tree structure.", - "ru-ru": "Плохая структура дерева.", - "es-es": "Estructura de árbol incorrecta.", - "fr-fr": "Mauvaise arborescence.", - "uk-ua": "Погана структура дерева.", - "de-ch": "Fehlerhafte Baumstruktur.", - "pt-br": "Estrutura de árvore ruim.", + 'en-us': 'Bad tree structure.', + 'ru-ru': 'Плохая структура дерева.', + 'es-es': 'Estructura de árbol incorrecta.', + 'fr-fr': 'Mauvaise arborescence.', + 'uk-ua': 'Погана структура дерева.', + 'de-ch': 'Fehlerhafte Baumstruktur.', + 'pt-br': 'Estrutura de árvore ruim.', }, move: { - "en-us": "Move", - "ru-ru": "Двигаться", - "es-es": "Mover", - "fr-fr": "Déplacer", - "uk-ua": "рухатися", - "de-ch": "Verschieben", - "pt-br": "Mover", + 'en-us': 'Move', + 'ru-ru': 'Двигаться', + 'es-es': 'Mover', + 'fr-fr': 'Déplacer', + 'uk-ua': 'рухатися', + 'de-ch': 'Verschieben', + 'pt-br': 'Mover', }, merge: { - "en-us": "Merge", - "ru-ru": "Слияние", - "es-es": "Unir", - "fr-fr": "Fusionner", - "uk-ua": "Об’єднати", - "de-ch": "Zusammenführen", - "pt-br": "Mesclar", + 'en-us': 'Merge', + 'ru-ru': 'Слияние', + 'es-es': 'Unir', + 'fr-fr': 'Fusionner', + 'uk-ua': 'Об’єднати', + 'de-ch': 'Zusammenführen', + 'pt-br': 'Mesclar', }, undoSynonymy: { - "en-us": "Undo Synonymy", - "ru-ru": "Отменить синонимию", - "es-es": "Deshacer sinonimia", - "fr-fr": "Annuler la synonymie", - "uk-ua": "Скасувати синонімію", - "de-ch": "Synonymie rückgängig machen", - "pt-br": "Desfazer Sinonímia", + 'en-us': 'Undo Synonymy', + 'ru-ru': 'Отменить синонимию', + 'es-es': 'Deshacer sinonimia', + 'fr-fr': 'Annuler la synonymie', + 'uk-ua': 'Скасувати синонімію', + 'de-ch': 'Synonymie rückgängig machen', + 'pt-br': 'Desfazer Sinonímia', }, synonymize: { - "en-us": "Synonymize", - "ru-ru": "Подбирать синонимы", - "es-es": "Sinonimizar", - "fr-fr": "Synonymiser", - "uk-ua": "Синонімізувати", - "de-ch": "Synonymisieren", - "pt-br": "Sinonímia", + 'en-us': 'Synonymize', + 'ru-ru': 'Подбирать синонимы', + 'es-es': 'Sinonimizar', + 'fr-fr': 'Synonymiser', + 'uk-ua': 'Синонімізувати', + 'de-ch': 'Synonymisieren', + 'pt-br': 'Sinonímia', }, actionFailed: { - "en-us": "Operation failed", - "ru-ru": "Операция провалилась", - "es-es": "Operación fallida", - "fr-fr": "L'opération a échoué", - "uk-ua": "Операція не вдалася", - "de-ch": "Vorgang fehlgeschlagen", - "pt-br": "A operação falhou", + 'en-us': 'Operation failed', + 'ru-ru': 'Операция провалилась', + 'es-es': 'Operación fallida', + 'fr-fr': "L'opération a échoué", + 'uk-ua': 'Операція не вдалася', + 'de-ch': 'Vorgang fehlgeschlagen', + 'pt-br': 'A operação falhou', }, actionFailedDescription: { - "en-us": - "The operation could not be completed due to the following errors:", - "ru-ru": "Операция не может быть завершена из-за следующих ошибок:", - "es-es": - "La operación no se pudo completar debido a los siguientes errores:", - "fr-fr": + 'en-us': + 'The operation could not be completed due to the following errors:', + 'ru-ru': 'Операция не может быть завершена из-за следующих ошибок:', + 'es-es': + 'La operación no se pudo completar debido a los siguientes errores:', + 'fr-fr': "L'opération n'a pas pu être terminée en raison des erreurs suivantes :", - "de-ch": - "Der Vorgang konnte aufgrund der folgenden Fehler nicht ausgeführt werden:", - "uk-ua": "Операцію не вдалося завершити через такі помилки:", - "pt-br": "A operação não pôde ser concluída devido aos seguintes erros:", + 'de-ch': + 'Der Vorgang konnte aufgrund der folgenden Fehler nicht ausgeführt werden:', + 'uk-ua': 'Операцію не вдалося завершити через такі помилки:', + 'pt-br': 'A operação não pôde ser concluída devido aos seguintes erros:', }, moveNode: { - "en-us": "Move node", - "ru-ru": "Переместить узел", - "es-es": "Mover nodo", - "fr-fr": "Déplacer le nœud", - "uk-ua": "Перемістити вузол", - "de-ch": "Knoten verschieben", - "pt-br": "Mover nó", + 'en-us': 'Move node', + 'ru-ru': 'Переместить узел', + 'es-es': 'Mover nodo', + 'fr-fr': 'Déplacer le nœud', + 'uk-ua': 'Перемістити вузол', + 'de-ch': 'Knoten verschieben', + 'pt-br': 'Mover nó', }, addChild: { - "en-us": "Add Child", - "ru-ru": "Добавить ребенка", - "es-es": "Agregar hijo", - "fr-fr": "Ajouter un enfant", - "uk-ua": "Додати дитину", - "de-ch": "Kind hinzuzufügen", - "pt-br": "Adicionar criança", + 'en-us': 'Add Child', + 'ru-ru': 'Добавить ребенка', + 'es-es': 'Agregar hijo', + 'fr-fr': 'Ajouter un enfant', + 'uk-ua': 'Додати дитину', + 'de-ch': 'Kind hinzuzufügen', + 'pt-br': 'Adicionar criança', }, moveNodeHere: { - "en-us": 'Move "{nodeName:string}" here', - "ru-ru": "Переместите «{nodeName:string}» сюда", - "es-es": 'Mover "{nodeName:string}" aquí', - "fr-fr": "Déplacer « {nodeName:string} » ici", - "uk-ua": 'Перемістіть сюди "{nodeName:string}"', - "de-ch": 'Verschiebe "{nodeName:string}" hierhin', - "pt-br": 'Mova "{nodeName:string}" aqui', + 'en-us': 'Move "{nodeName:string}" here', + 'ru-ru': 'Переместите «{nodeName:string}» сюда', + 'es-es': 'Mover "{nodeName:string}" aquí', + 'fr-fr': 'Déplacer « {nodeName:string} » ici', + 'uk-ua': 'Перемістіть сюди "{nodeName:string}"', + 'de-ch': 'Verschiebe "{nodeName:string}" hierhin', + 'pt-br': 'Mova "{nodeName:string}" aqui', }, moveNodePreparationsHere: { - "en-us": 'Move all "{nodeName:string}" preparations here', - "de-ch": 'Verschieben Sie alle "{nodeName:string}"-Vorbereitungen hierher', - "es-es": 'Mover todas las preparaciones "{nodeName:string}" aquí', - "fr-fr": "Déplacer toutes les préparations « {nodeName:string} » ici", - "ru-ru": "Переместить все препараты «{nodeName:string}» сюда", - "uk-ua": 'Перемістіть сюди всі препарати "{nodeName:string}"', - "pt-br": 'Mova todos os preparativos "{nodeName:string}" aqui', + 'en-us': 'Move all "{nodeName:string}" preparations here', + 'de-ch': 'Verschieben Sie alle "{nodeName:string}"-Vorbereitungen hierher', + 'es-es': 'Mover todas las preparaciones "{nodeName:string}" aquí', + 'fr-fr': 'Déplacer toutes les préparations « {nodeName:string} » ici', + 'ru-ru': 'Переместить все препараты «{nodeName:string}» сюда', + 'uk-ua': 'Перемістіть сюди всі препарати "{nodeName:string}"', + 'pt-br': 'Mova todos os preparativos "{nodeName:string}" aqui', }, nodeMoveMessage: { - "en-us": + 'en-us': 'The {treeName:string} node "{nodeName:string}" will be placed, along with all of its descendants, under the new parent "{parentName:string}".', - "ru-ru": - "Узел {treeName:string} «{nodeName:string}» будет помещен вместе со всеми его потомками под новый родительский узел «{parentName:string}».", - "es-es": + 'ru-ru': + 'Узел {treeName:string} «{nodeName:string}» будет помещен вместе со всеми его потомками под новый родительский узел «{parentName:string}».', + 'es-es': 'El nodo {treeName:string} "{nodeName:string}" se colocará, junto con todos sus descendientes, bajo el nuevo padre "{parentName:string}".', - "fr-fr": - "Le nœud {treeName:string} « {nodeName:string} » sera placé, ainsi que tous ses descendants, sous le nouveau parent « {parentName:string} ».", - "uk-ua": + 'fr-fr': + 'Le nœud {treeName:string} « {nodeName:string} » sera placé, ainsi que tous ses descendants, sous le nouveau parent « {parentName:string} ».', + 'uk-ua': 'Вузол {treeName:string} "{nodeName:string}" буде розміщено разом із усіма його нащадками під новим батьківським вузлом "{parentName:string}".', - "de-ch": + 'de-ch': 'Der {treeName:string} Knoten "{nodeName:string}" wird zusammen mit allen seinen Unterknoten unter den neuen übergeordneten Knoten "{parentName:string}" platziert.', - "pt-br": + 'pt-br': 'O nó {treeName:string} "{nodeName:string}" será colocado, junto com todos os seus descendentes, sob o novo pai "{parentName:string}".', }, nodeBulkMoveMessage: { - "en-us": + 'en-us': 'The {treeName:string} node "{nodeName:string}" preparations will be placed under the new location "{parentName:string}".', - "de-ch": - "Die Vorbereitungen für den {treeName:string}-Knoten „{nodeName:string}“ werden unter dem neuen Standort „{parentName:string}“ platziert.", - "es-es": + 'de-ch': + 'Die Vorbereitungen für den {treeName:string}-Knoten „{nodeName:string}“ werden unter dem neuen Standort „{parentName:string}“ platziert.', + 'es-es': 'Las preparaciones del nodo {treeName:string} "{nodeName:string}" se colocarán en la nueva ubicación "{parentName:string}".', - "fr-fr": - "Les préparations du nœud {treeName:string} « {nodeName:string} » seront placées sous le nouvel emplacement « {parentName:string} ».", - "ru-ru": - "Заготовки узла {treeName:string} «{nodeName:string}» будут размещены в новом месте «{parentName:string}».", - "uk-ua": + 'fr-fr': + 'Les préparations du nœud {treeName:string} « {nodeName:string} » seront placées sous le nouvel emplacement « {parentName:string} ».', + 'ru-ru': + 'Заготовки узла {treeName:string} «{nodeName:string}» будут размещены в новом месте «{parentName:string}».', + 'uk-ua': 'Підготовка вузла {treeName:string} "{nodeName:string}" буде розміщена в новому місці розташування "{parentName:string}".', - "pt-br": + 'pt-br': 'Os preparativos do nó {treeName:string} "{nodeName:string}" serão colocados no novo local "{parentName:string}".', }, cantMoveHere: { - "en-us": "Can't move this tree node here", - "ru-ru": "Невозможно переместить этот узел дерева сюда.", - "es-es": "No se puede mover este nodo del árbol aquí", - "fr-fr": "Impossible de déplacer ce nœud d'arbre ici", - "uk-ua": "Неможливо перемістити цей вузол дерева сюди", - "de-ch": "Dieser Knoten kann nicht hierhin verschoben werden", - "pt-br": "Não é possível mover este nó da árvore aqui", + 'en-us': "Can't move this tree node here", + 'ru-ru': 'Невозможно переместить этот узел дерева сюда.', + 'es-es': 'No se puede mover este nodo del árbol aquí', + 'fr-fr': "Impossible de déplacer ce nœud d'arbre ici", + 'uk-ua': 'Неможливо перемістити цей вузол дерева сюди', + 'de-ch': 'Dieser Knoten kann nicht hierhin verschoben werden', + 'pt-br': 'Não é possível mover este nó da árvore aqui', }, cantMergeHere: { - "en-us": "Can't merge this tree node here", - "ru-ru": "Невозможно объединить этот узел дерева здесь.", - "es-es": "No se puede fusionar este nodo de árbol aquí", - "fr-fr": "Impossible de fusionner ce nœud d'arbre ici", - "uk-ua": "Неможливо об’єднати цей вузол дерева тут", - "de-ch": "Dieser Knoten kann hier nicht zusammengelegt werden", - "pt-br": "Não é possível mesclar este nó da árvore aqui", + 'en-us': "Can't merge this tree node here", + 'ru-ru': 'Невозможно объединить этот узел дерева здесь.', + 'es-es': 'No se puede fusionar este nodo de árbol aquí', + 'fr-fr': "Impossible de fusionner ce nœud d'arbre ici", + 'uk-ua': 'Неможливо об’єднати цей вузол дерева тут', + 'de-ch': 'Dieser Knoten kann hier nicht zusammengelegt werden', + 'pt-br': 'Não é possível mesclar este nó da árvore aqui', }, cantMoveToSynonym: { - "en-us": "Can't move to a synonym", - "ru-ru": "Невозможно перейти к синониму", - "es-es": "No se puede mover a un sinónimo", - "fr-fr": "Impossible de passer à un synonyme", - "uk-ua": "Неможливо перейти до синоніма", - "de-ch": "Kann nicht zu einem Synonym verschieben", - "pt-br": "Não é possível mover para um sinônimo", + 'en-us': "Can't move to a synonym", + 'ru-ru': 'Невозможно перейти к синониму', + 'es-es': 'No se puede mover a un sinónimo', + 'fr-fr': 'Impossible de passer à un synonyme', + 'uk-ua': 'Неможливо перейти до синоніма', + 'de-ch': 'Kann nicht zu einem Synonym verschieben', + 'pt-br': 'Não é possível mover para um sinônimo', }, cantMergeIntoSynonym: { - "en-us": "Can't merge into synonyms", - "ru-ru": "Невозможно объединить в синонимы", - "es-es": "No se pueden fusionar en sinónimos", - "fr-fr": "Impossible de fusionner en synonymes", - "uk-ua": "Не можна об’єднувати в синоніми", - "de-ch": "Kann nicht zu Synonymen zusammenführen", - "pt-br": "Não é possível mesclar em sinônimos", + 'en-us': "Can't merge into synonyms", + 'ru-ru': 'Невозможно объединить в синонимы', + 'es-es': 'No se pueden fusionar en sinónimos', + 'fr-fr': 'Impossible de fusionner en synonymes', + 'uk-ua': 'Не можна об’єднувати в синоніми', + 'de-ch': 'Kann nicht zu Synonymen zusammenführen', + 'pt-br': 'Não é possível mesclar em sinônimos', }, cantSynonymizeSynonym: { - "en-us": "Can't synonymize with a synonym", - "ru-ru": "Невозможно синонимизировать с помощью синонима", - "es-es": "No se puede sinonimizar con un sinónimo", - "fr-fr": "Impossible de synonymiser avec un synonyme", - "uk-ua": "Не можна синонімізувати синонім", - "de-ch": "Kann nicht mit einem Synonym synonymisiert werden", - "pt-br": "Não é possível sinonimizar com um sinônimo", + 'en-us': "Can't synonymize with a synonym", + 'ru-ru': 'Невозможно синонимизировать с помощью синонима', + 'es-es': 'No se puede sinonimizar con un sinónimo', + 'fr-fr': 'Impossible de synonymiser avec un synonyme', + 'uk-ua': 'Не можна синонімізувати синонім', + 'de-ch': 'Kann nicht mit einem Synonym synonymisiert werden', + 'pt-br': 'Não é possível sinonimizar com um sinônimo', }, nodeMoveHintMessage: { - "en-us": 'Select a new parent for "{nodeName:string}"', - "ru-ru": "Выберите нового родителя для «{nodeName:string}»", - "es-es": 'Seleccione un nuevo padre para "{nodeName:string}"', - "fr-fr": "Sélectionnez un nouveau parent pour « {nodeName:string} »", - "uk-ua": 'Виберіть новий батьківський елемент для "{nodeName:string}"', - "de-ch": 'Wählen Sie ein neues Elternelement für "{nodeName:string}"', - "pt-br": 'Selecione um novo pai para "{nodeName:string}"', + 'en-us': 'Select a new parent for "{nodeName:string}"', + 'ru-ru': 'Выберите нового родителя для «{nodeName:string}»', + 'es-es': 'Seleccione un nuevo padre para "{nodeName:string}"', + 'fr-fr': 'Sélectionnez un nouveau parent pour « {nodeName:string} »', + 'uk-ua': 'Виберіть новий батьківський елемент для "{nodeName:string}"', + 'de-ch': 'Wählen Sie ein neues Elternelement für "{nodeName:string}"', + 'pt-br': 'Selecione um novo pai para "{nodeName:string}"', }, mergeNode: { - "en-us": "Merge node", - "ru-ru": "Узел слияния", - "es-es": "Fusionar el nodo", - "fr-fr": "Fusionner le nœud", - "uk-ua": "Вузол злиття", - "de-ch": "Knoten zusammenführen", - "pt-br": "Nó de mesclagem", + 'en-us': 'Merge node', + 'ru-ru': 'Узел слияния', + 'es-es': 'Fusionar el nodo', + 'fr-fr': 'Fusionner le nœud', + 'uk-ua': 'Вузол злиття', + 'de-ch': 'Knoten zusammenführen', + 'pt-br': 'Nó de mesclagem', }, mergeNodeHere: { - "en-us": 'Merge "{nodeName:string}" here', - "ru-ru": "Объединить «{nodeName:string}» здесь", - "es-es": 'Fusionar "{nodeName:string}" aquí', - "fr-fr": "Fusionner « {nodeName:string} » ici", - "uk-ua": 'Об\'єднайте "{nodeName:string}" тут', - "de-ch": 'Führe "{nodeName:string}" hier zusammen', - "pt-br": 'Mesclar "{nodeName:string}" aqui', + 'en-us': 'Merge "{nodeName:string}" here', + 'ru-ru': 'Объединить «{nodeName:string}» здесь', + 'es-es': 'Fusionar "{nodeName:string}" aquí', + 'fr-fr': 'Fusionner « {nodeName:string} » ici', + 'uk-ua': 'Об\'єднайте "{nodeName:string}" тут', + 'de-ch': 'Führe "{nodeName:string}" hier zusammen', + 'pt-br': 'Mesclar "{nodeName:string}" aqui', }, mergeNodeHintMessage: { - "en-us": 'Select a new target for "{nodeName:string}" to be merged into', - "ru-ru": "Выберите новую цель для объединения «{nodeName:string}»", - "es-es": 'Seleccione un nuevo objetivo para fusionar "{nodeName:string}"', - "fr-fr": - "Sélectionnez une nouvelle cible dans laquelle « {nodeName:string} » doit être fusionné", - "uk-ua": - "Виберіть нову ціль для «{nodeName:string}», у яку потрібно об’єднати", - "de-ch": 'Wähle ein neues Ziel um "{nodeName:string}" zusammenzuführen', - "pt-br": 'Selecione um novo alvo para "{nodeName:string}" a ser mesclado', + 'en-us': 'Select a new target for "{nodeName:string}" to be merged into', + 'ru-ru': 'Выберите новую цель для объединения «{nodeName:string}»', + 'es-es': 'Seleccione un nuevo objetivo para fusionar "{nodeName:string}"', + 'fr-fr': + 'Sélectionnez une nouvelle cible dans laquelle « {nodeName:string} » doit être fusionné', + 'uk-ua': + 'Виберіть нову ціль для «{nodeName:string}», у яку потрібно об’єднати', + 'de-ch': 'Wähle ein neues Ziel um "{nodeName:string}" zusammenzuführen', + 'pt-br': 'Selecione um novo alvo para "{nodeName:string}" a ser mesclado', }, bulkMoveNodeHintMessage: { - "en-us": + 'en-us': 'Select a new target for "{nodeName:string}" preparations to be moved into', - "de-ch": + 'de-ch': 'Wählen Sie ein neues Ziel für die "{nodeName:string}"-Vorbereitungen, in die Sie verschieben möchten', - "es-es": + 'es-es': 'Seleccione un nuevo objetivo para los preparaciones "{nodeName:string}" que se trasladarán a', - "fr-fr": - "Sélectionnez une nouvelle cible pour les préparations « {nodeName:string} » à déplacer", - "ru-ru": - "Выберите новую цель для перемещения препаратов «{nodeName:string}»", - "uk-ua": + 'fr-fr': + 'Sélectionnez une nouvelle cible pour les préparations « {nodeName:string} » à déplacer', + 'ru-ru': + 'Выберите новую цель для перемещения препаратов «{nodeName:string}»', + 'uk-ua': 'Виберіть нову ціль для препаратів "{nodeName:string}", до якої потрібно переміститися', - "pt-br": + 'pt-br': 'Selecione um novo alvo para os preparativos "{nodeName:string}" a serem movidos para', }, mergeNodeMessage: { - "en-us": + 'en-us': 'All references to {treeName:string} node "{nodeName:string}" will be replaced with "{parentName:string}", and all descendants of "{nodeName:string}" will be moved to "{parentName:string}" with any descendants matching in name and rank being themselves merged recursively.', - "ru-ru": - "Все ссылки на узел {treeName:string} «{nodeName:string}» будут заменены на «{parentName:string}», а все потомки «{nodeName:string}» будут перемещены в «{parentName:string}», при этом все потомки, совпадающие по имени и рангу, будут рекурсивно объединены.", - "es-es": + 'ru-ru': + 'Все ссылки на узел {treeName:string} «{nodeName:string}» будут заменены на «{parentName:string}», а все потомки «{nodeName:string}» будут перемещены в «{parentName:string}», при этом все потомки, совпадающие по имени и рангу, будут рекурсивно объединены.', + 'es-es': 'Todas las referencias al nodo {treeName:string} "{nodeName:string}" serán reemplazadas por "{parentName:string}", todos los descendientes de "{nodeName:string}" se moverán a "{parentName:string}" y todos los descendientes que coincidan en nombre y rango se fusionarán de forma recursiva.', - "fr-fr": - "Toutes les références au nœud {treeName:string} « {nodeName:string} » seront remplacées par « {parentName:string} », et tous les descendants de « {nodeName:string} » seront déplacés vers « {parentName:string} », tous les descendants correspondant au nom et au rang étant eux-mêmes fusionnés de manière récursive.", - "uk-ua": + 'fr-fr': + 'Toutes les références au nœud {treeName:string} « {nodeName:string} » seront remplacées par « {parentName:string} », et tous les descendants de « {nodeName:string} » seront déplacés vers « {parentName:string} », tous les descendants correspondant au nom et au rang étant eux-mêmes fusionnés de manière récursive.', + 'uk-ua': "Усі посилання на вузол {treeName:string} «{nodeName:string}» буде замінено на «{parentName:string}», а всі нащадки «{nodeName:string}» буде переміщено до «{parentName:string}», а будь-які нащадки, що відповідають імені та рангу, будуть самі собою об'єднані рекурсивно.", - "de-ch": + 'de-ch': 'Alle Referenzen zu {treeName:string} "{nodeName:string}" werden mit "{parentName:string}" ersetzt. Alle Nachkommen von "{nodeName:string}" werden nach "{parentName:string}" verschoben, wobei alle Nachkommen, die in Name und Rang übereinstimmen, selbst rekursiv zusammengeführt werden.', - "pt-br": + 'pt-br': 'Todas as referências ao nó {treeName:string} "{nodeName:string}" serão substituídas por "{parentName:string}", e todos os descendentes de "{nodeName:string}" serão movidos para "{parentName:string}", com quaisquer descendentes correspondentes em nome e classificação sendo eles próprios mesclados recursivamente.', }, synonymizeNode: { - "en-us": "Synonymize node", - "ru-ru": "Узел синонимизации", - "es-es": "Sinonimizar nodo", - "fr-fr": "Synonymiser le nœud", - "uk-ua": "Синонімізувати вузол", - "de-ch": "Knoten synonymisieren", - "pt-br": "Sinonímia do nó", + 'en-us': 'Synonymize node', + 'ru-ru': 'Узел синонимизации', + 'es-es': 'Sinonimizar nodo', + 'fr-fr': 'Synonymiser le nœud', + 'uk-ua': 'Синонімізувати вузол', + 'de-ch': 'Knoten synonymisieren', + 'pt-br': 'Sinonímia do nó', }, makeSynonym: { - "en-us": "Make {nodeName:string} a synonym of {synonymName:string}", - "ru-ru": "Сделайте {nodeName:string} синонимом {synonymName:string}", - "es-es": "Hacer de {nodeName:string} un sinónimo de {synonymName:string}", - "fr-fr": "Faire de {nodeName:string} un synonyme de {synonymName:string}", - "uk-ua": "Зробити {nodeName:string} синонімом {synonymName:string}", - "de-ch": - "Aus {nodeName:string} ein Synonym von {synonymName:string} machen", - "pt-br": "Faça {nodeName:string} um sinônimo de {synonymName:string}", + 'en-us': 'Make {nodeName:string} a synonym of {synonymName:string}', + 'ru-ru': 'Сделайте {nodeName:string} синонимом {synonymName:string}', + 'es-es': 'Hacer de {nodeName:string} un sinónimo de {synonymName:string}', + 'fr-fr': 'Faire de {nodeName:string} un synonyme de {synonymName:string}', + 'uk-ua': 'Зробити {nodeName:string} синонімом {synonymName:string}', + 'de-ch': + 'Aus {nodeName:string} ein Synonym von {synonymName:string} machen', + 'pt-br': 'Faça {nodeName:string} um sinônimo de {synonymName:string}', }, synonymizeNodeHintMessage: { - "en-us": 'Select a target for "{nodeName:string}" to be synonymized to', - "ru-ru": "Выберите цель для синонимизации «{nodeName:string}»", - "es-es": + 'en-us': 'Select a target for "{nodeName:string}" to be synonymized to', + 'ru-ru': 'Выберите цель для синонимизации «{nodeName:string}»', + 'es-es': 'Seleccione un objetivo para que "{nodeName:string}" se convierta en sinónimo', - "fr-fr": - "Sélectionnez une cible pour laquelle « {nodeName:string} » doit être synonymisé", - "uk-ua": 'Виберіть ціль для "{nodeName:string}", який буде синонімічним', - "de-ch": 'Wähle Ziel um "{nodeName:string}" daran zu synonymisieren', - "pt-br": 'Selecione um alvo para "{nodeName:string}" ser sinonimizado', + 'fr-fr': + 'Sélectionnez une cible pour laquelle « {nodeName:string} » doit être synonymisé', + 'uk-ua': 'Виберіть ціль для "{nodeName:string}", який буде синонімічним', + 'de-ch': 'Wähle Ziel um "{nodeName:string}" daran zu synonymisieren', + 'pt-br': 'Selecione um alvo para "{nodeName:string}" ser sinonimizado', }, synonymizeMessage: { - "en-us": + 'en-us': 'The {treeName:string} node "{nodeName:string}" will be made a synonym of "{synonymName:string}".', - "ru-ru": - "Узел {treeName:string} «{nodeName:string}» станет синонимом «{synonymName:string}».", - "es-es": + 'ru-ru': + 'Узел {treeName:string} «{nodeName:string}» станет синонимом «{synonymName:string}».', + 'es-es': 'El nodo {treeName:string} "{nodeName:string}" se convertirá en sinónimo de "{synonymName:string}".', - "fr-fr": - "Le nœud {treeName:string} « {nodeName:string} » deviendra synonyme de « {synonymName:string} ».", - "de-ch": + 'fr-fr': + 'Le nœud {treeName:string} « {nodeName:string} » deviendra synonyme de « {synonymName:string} ».', + 'de-ch': 'Der {treeName:string}-Knoten "{nodeName:string}" wird zu einem Synonym von "{synonymName:string}".', - "uk-ua": + 'uk-ua': 'Вузол {treeName:string} "{nodeName:string}" стане синонімом "{synonymName:string}".', - "pt-br": + 'pt-br': 'O nó {treeName:string} "{nodeName:string}" se tornará sinônimo de "{synonymName:string}".', }, desynonymizeNode: { - "en-us": "Desynonymize node", - "ru-ru": "Узел десиномизации", - "es-es": "Desinonimizar nodo", - "fr-fr": "Désynonymiser le nœud", - "uk-ua": "Десинонімізувати вузол", - "de-ch": "Knoten desynonymisieren", - "pt-br": "Dessinonimizar nó", + 'en-us': 'Desynonymize node', + 'ru-ru': 'Узел десиномизации', + 'es-es': 'Desinonimizar nodo', + 'fr-fr': 'Désynonymiser le nœud', + 'uk-ua': 'Десинонімізувати вузол', + 'de-ch': 'Knoten desynonymisieren', + 'pt-br': 'Dessinonimizar nó', }, desynonymizeNodeMessage: { - "en-us": + 'en-us': '"{nodeName:string}" will no longer be a synonym of "{synonymName:string}".', - "ru-ru": - "«{nodeName:string}» больше не будет синонимом «{synonymName:string}».", - "es-es": + 'ru-ru': + '«{nodeName:string}» больше не будет синонимом «{synonymName:string}».', + 'es-es': '"{nodeName:string}" ya no será sinónimo de "{synonymName:string}".', - "fr-fr": - "« {nodeName:string} » ne sera plus synonyme de « {synonymName:string} ».", - "de-ch": + 'fr-fr': + '« {nodeName:string} » ne sera plus synonyme de « {synonymName:string} ».', + 'de-ch': '"{nodeName:string}" wird nicht mehr ein Synonym von "{synonymName:string}" sein.', - "uk-ua": + 'uk-ua': '"{nodeName:string}" більше не буде синонімом "{synonymName:string}".', - "pt-br": + 'pt-br': '"{nodeName:string}" não será mais sinônimo de "{synonymName:string}".', }, acceptedName: { - "en-us": "Preferred: {name:string}", - "ru-ru": "Предпочтительно: {name:string}", - "es-es": "Preferido: {name:string}", - "fr-fr": "Préféré : {name:string}", - "uk-ua": "Бажано: {name:string}", - "de-ch": "Bevorzugt: {name:string}", - "pt-br": "Preferido: {name:string}", + 'en-us': 'Preferred: {name:string}', + 'ru-ru': 'Предпочтительно: {name:string}', + 'es-es': 'Preferido: {name:string}', + 'fr-fr': 'Préféré : {name:string}', + 'uk-ua': 'Бажано: {name:string}', + 'de-ch': 'Bevorzugt: {name:string}', + 'pt-br': 'Preferido: {name:string}', }, synonyms: { - "en-us": "Synonyms: {names:string}", - "de-ch": "Synonyme: {names:string}", - "es-es": "Sinónimos: {names:string}", - "fr-fr": "Synonymes : {names:string}", - "ru-ru": "Синонимы: {names:string}", - "uk-ua": "Синоніми: {names:string}", - "pt-br": "Sinônimos: {names:string}", + 'en-us': 'Synonyms: {names:string}', + 'de-ch': 'Synonyme: {names:string}', + 'es-es': 'Sinónimos: {names:string}', + 'fr-fr': 'Synonymes : {names:string}', + 'ru-ru': 'Синонимы: {names:string}', + 'uk-ua': 'Синоніми: {names:string}', + 'pt-br': 'Sinônimos: {names:string}', }, treeViewTitle: { - "en-us": "{treeName:string} Tree", - "ru-ru": "{treeName:string} Дерево", - "es-es": "{treeName:string} Árbol", - "fr-fr": "{treeName:string} Arbre", - "uk-ua": "{treeName:string} Дерево", - "de-ch": "{treeName:string} Baum", - "pt-br": "{treeName:string} Árvore", + 'en-us': '{treeName:string} Tree', + 'ru-ru': '{treeName:string} Дерево', + 'es-es': '{treeName:string} Árbol', + 'fr-fr': '{treeName:string} Arbre', + 'uk-ua': '{treeName:string} Дерево', + 'de-ch': '{treeName:string} Baum', + 'pt-br': '{treeName:string} Árvore', }, searchTreePlaceholder: { - "en-us": "Search Tree", - "ru-ru": "Дерево поиска", - "es-es": "Árbol de búsqueda", - "fr-fr": "Rechercher dans l'arbre", - "uk-ua": "Дерево пошуку", - "de-ch": "Baum durchsuchen", - "pt-br": "Árvore de Pesquisa", + 'en-us': 'Search Tree', + 'ru-ru': 'Дерево поиска', + 'es-es': 'Árbol de búsqueda', + 'fr-fr': "Rechercher dans l'arbre", + 'uk-ua': 'Дерево пошуку', + 'de-ch': 'Baum durchsuchen', + 'pt-br': 'Árvore de Pesquisa', }, opened: { - "en-us": "Opened", - "ru-ru": "Открыто", - "es-es": "Abierto", - "fr-fr": "Ouvert", - "uk-ua": "Відкрито", - "de-ch": "Geöffnet", - "pt-br": "Aberto", + 'en-us': 'Opened', + 'ru-ru': 'Открыто', + 'es-es': 'Abierto', + 'fr-fr': 'Ouvert', + 'uk-ua': 'Відкрито', + 'de-ch': 'Geöffnet', + 'pt-br': 'Aberto', }, closed: { - "en-us": "Closed", - "ru-ru": "Закрыто", - "es-es": "Cerrado", - "fr-fr": "Fermé", - "uk-ua": "ЗАЧИНЕНО", - "de-ch": "Geschlossen", - "pt-br": "Fechado", + 'en-us': 'Closed', + 'ru-ru': 'Закрыто', + 'es-es': 'Cerrado', + 'fr-fr': 'Fermé', + 'uk-ua': 'ЗАЧИНЕНО', + 'de-ch': 'Geschlossen', + 'pt-br': 'Fechado', }, leafNode: { - "en-us": "Leaf Node", - "ru-ru": "Листовой узел", - "es-es": "Nodo de hoja", - "fr-fr": "Nœud feuille", - "uk-ua": "Листковий вузол", - "de-ch": "Blattknoten", - "pt-br": "Nó Folha", + 'en-us': 'Leaf Node', + 'ru-ru': 'Листовой узел', + 'es-es': 'Nodo de hoja', + 'fr-fr': 'Nœud feuille', + 'uk-ua': 'Листковий вузол', + 'de-ch': 'Blattknoten', + 'pt-br': 'Nó Folha', }, nodeStats: { comment: "Used to show tree node's direct and indirect usages", - "en-us": "({directCount:number|formatted}, {childCount:number|formatted})", - "ru-ru": "({directCount:number|formatted}, {childCount:number|formatted})", - "es-es": "({directCount:number|formatted}, {childCount:number|formatted})", - "fr-fr": "({directCount:number|formatted}, {childCount:number|formatted})", - "uk-ua": "({directCount:number|formatted}', {childCount:number|formatted})", - "de-ch": "({directCount:number|formatted}, {childCount:number|formatted})", - "pt-br": "({directCount:number|formatted}, {childCount:number|formatted})", + 'en-us': '({directCount:number|formatted}, {childCount:number|formatted})', + 'ru-ru': '({directCount:number|formatted}, {childCount:number|formatted})', + 'es-es': '({directCount:number|formatted}, {childCount:number|formatted})', + 'fr-fr': '({directCount:number|formatted}, {childCount:number|formatted})', + 'uk-ua': "({directCount:number|formatted}', {childCount:number|formatted})", + 'de-ch': '({directCount:number|formatted}, {childCount:number|formatted})', + 'pt-br': '({directCount:number|formatted}, {childCount:number|formatted})', }, leafNodeStats: { comment: "Used to show leaf tree node's direct usages", - "en-us": "({directCount:number|formatted})", - "ru-ru": "({directCount:number|formatted})", - "es-es": "({directCount:number|formatted})", - "fr-fr": "({directCount:number|formatted})", - "uk-ua": "({directCount:number|formatted})'", - "de-ch": "({directCount:number|formatted})", - "pt-br": "({directCount:number|formatted})", + 'en-us': '({directCount:number|formatted})', + 'ru-ru': '({directCount:number|formatted})', + 'es-es': '({directCount:number|formatted})', + 'fr-fr': '({directCount:number|formatted})', + 'uk-ua': "({directCount:number|formatted})'", + 'de-ch': '({directCount:number|formatted})', + 'pt-br': '({directCount:number|formatted})', }, directCollectionObjectCount: { - comment: "Example: Direct Collection Object count", - "en-us": "Direct {collectionObjectTable:string} Count", - "ru-ru": "Прямой {collectionObjectTable:string} счет", - "es-es": "Recuento directo {collectionObjectTable:string}", - "de-ch": "Direkte {collectionObjectTable:string} Anzahl", - "fr-fr": "Compte direct {collectionObjectTable:string}", - "uk-ua": "Прямий підрахунок {collectionObjectTable:string}", - "pt-br": "Contagem direta {collectionObjectTable:string}", + comment: 'Example: Direct Collection Object count', + 'en-us': 'Direct {collectionObjectTable:string} Count', + 'ru-ru': 'Прямой {collectionObjectTable:string} счет', + 'es-es': 'Recuento directo {collectionObjectTable:string}', + 'de-ch': 'Direkte {collectionObjectTable:string} Anzahl', + 'fr-fr': 'Compte direct {collectionObjectTable:string}', + 'uk-ua': 'Прямий підрахунок {collectionObjectTable:string}', + 'pt-br': 'Contagem direta {collectionObjectTable:string}', }, indirectCollectionObjectCount: { - comment: "Example: Indirect Collection Object count", - "en-us": "Indirect {collectionObjectTable:string} Count", - "ru-ru": "Косвенный {collectionObjectTable:string} счет", - "es-es": "Recuento indirecto {collectionObjectTable:string}", - "fr-fr": "Compte indirect {collectionObjectTable:string}", - "uk-ua": "Непрямий підрахунок {collectionObjectTable:string}", - "de-ch": "Indirekte {collectionObjectTable:string} Anzahl", - "pt-br": "Contagem indireta {collectionObjectTable:string}", + comment: 'Example: Indirect Collection Object count', + 'en-us': 'Indirect {collectionObjectTable:string} Count', + 'ru-ru': 'Косвенный {collectionObjectTable:string} счет', + 'es-es': 'Recuento indirecto {collectionObjectTable:string}', + 'fr-fr': 'Compte indirect {collectionObjectTable:string}', + 'uk-ua': 'Непрямий підрахунок {collectionObjectTable:string}', + 'de-ch': 'Indirekte {collectionObjectTable:string} Anzahl', + 'pt-br': 'Contagem indireta {collectionObjectTable:string}', }, editRanks: { - "en-us": "Edit Ranks", - "ru-ru": "Редактировать ранги", - "es-es": "Editar rangos", - "fr-fr": "Modifier les rangs", - "uk-ua": "Редагувати ранги", - "de-ch": "Positionen bearbeiten", - "pt-br": "Editar classificações", + 'en-us': 'Edit Ranks', + 'ru-ru': 'Редактировать ранги', + 'es-es': 'Editar rangos', + 'fr-fr': 'Modifier les rangs', + 'uk-ua': 'Редагувати ранги', + 'de-ch': 'Positionen bearbeiten', + 'pt-br': 'Editar classificações', }, resourceToDelete: { - "en-us": "This will permanently delete the following resource", - "es-es": "Esto eliminará permanentemente el siguiente recurso", - "fr-fr": "Cela supprimera définitivement la ressource suivante", - "ru-ru": "Это приведет к безвозвратному удалению следующего ресурса:", - "uk-ua": "Це призведе до остаточного видалення наступного ресурсу", - "de-ch": "Dadurch wird die folgende Ressource dauerhaft gelöscht", - "pt-br": "Isso excluirá permanentemente o seguinte recurso", + 'en-us': 'This will permanently delete the following resource', + 'es-es': 'Esto eliminará permanentemente el siguiente recurso', + 'fr-fr': 'Cela supprimera définitivement la ressource suivante', + 'ru-ru': 'Это приведет к безвозвратному удалению следующего ресурса:', + 'uk-ua': 'Це призведе до остаточного видалення наступного ресурсу', + 'de-ch': 'Dadurch wird die folgende Ressource dauerhaft gelöscht', + 'pt-br': 'Isso excluirá permanentemente o seguinte recurso', }, associatedNodesOnly: { - "en-us": "Show only nodes with associated objects", - "de-ch": "Nur Knoten mit zugehörigen Objekten anzeigen", - "es-es": "Mostrar solo nodos con objetos asociados", - "fr-fr": "Afficher uniquement les nœuds avec des objets associés", - "ru-ru": "Показывать только узлы со связанными объектами", - "uk-ua": "Показувати лише вузли з пов'язаними об'єктами", - "pt-br": "Mostrar apenas nós com objetos associados", + 'en-us': 'Show only nodes with associated objects', + 'de-ch': 'Nur Knoten mit zugehörigen Objekten anzeigen', + 'es-es': 'Mostrar solo nodos con objetos asociados', + 'fr-fr': 'Afficher uniquement les nœuds avec des objets associés', + 'ru-ru': 'Показывать только узлы со связанными объектами', + 'uk-ua': "Показувати лише вузли з пов'язаними об'єктами", + 'pt-br': 'Mostrar apenas nós com objetos associados', }, splitView: { - "en-us": "Split View", - "de-ch": "Geteilte Sicht", - "es-es": "Vista dividida", - "fr-fr": "Vue fractionnée", - "ru-ru": "Разделенный вид", - "uk-ua": "Розділений вид", - "pt-br": "Visualização dividida", + 'en-us': 'Split View', + 'de-ch': 'Geteilte Sicht', + 'es-es': 'Vista dividida', + 'fr-fr': 'Vue fractionnée', + 'ru-ru': 'Разделенный вид', + 'uk-ua': 'Розділений вид', + 'pt-br': 'Visualização dividida', }, horizontal: { - "en-us": "Horizontal", - "de-ch": "Horizontal", - "es-es": "Horizontal", - "fr-fr": "Horizontal", - "ru-ru": "Горизонтальный", - "uk-ua": "Горизонтальний", - "pt-br": "Horizontal", + 'en-us': 'Horizontal', + 'de-ch': 'Horizontal', + 'es-es': 'Horizontal', + 'fr-fr': 'Horizontal', + 'ru-ru': 'Горизонтальный', + 'uk-ua': 'Горизонтальний', + 'pt-br': 'Horizontal', }, vertical: { - "en-us": "Vertical", - "de-ch": "Vertikal", - "es-es": "Vertical", - "fr-fr": "Vertical", - "ru-ru": "Вертикальный", - "uk-ua": "Вертикальний", - "pt-br": "Vertical", + 'en-us': 'Vertical', + 'de-ch': 'Vertikal', + 'es-es': 'Vertical', + 'fr-fr': 'Vertical', + 'ru-ru': 'Вертикальный', + 'uk-ua': 'Вертикальний', + 'pt-br': 'Vertical', }, synchronize: { - "en-us": "Synchronize", - "de-ch": "Synchronisieren", - "es-es": "Sincronizar", - "fr-fr": "Synchroniser", - "uk-ua": "Синхронізувати", - "ru-ru": "Синхронизировать", - "pt-br": "Sincronizar", + 'en-us': 'Synchronize', + 'de-ch': 'Synchronisieren', + 'es-es': 'Sincronizar', + 'fr-fr': 'Synchroniser', + 'uk-ua': 'Синхронізувати', + 'ru-ru': 'Синхронизировать', + 'pt-br': 'Sincronizar', }, addNewRank: { - "en-us": "Add New Rank", - "de-ch": "Neuen Rang hinzufügen", - "es-es": "Añadir nuevo rango", - "fr-fr": "Ajouter un nouveau rang", - "ru-ru": "Добавить новый ранг", - "uk-ua": "Додати новий ранг", - "pt-br": "Adicionar nova classificação", + 'en-us': 'Add New Rank', + 'de-ch': 'Neuen Rang hinzufügen', + 'es-es': 'Añadir nuevo rango', + 'fr-fr': 'Ajouter un nouveau rang', + 'ru-ru': 'Добавить новый ранг', + 'uk-ua': 'Додати новий ранг', + 'pt-br': 'Adicionar nova classificação', }, chooseParentRank: { - "en-us": "Choose Parent Rank", - "de-ch": "Wählen Sie den übergeordneten Rang", - "es-es": "Elija el rango de los padres", - "fr-fr": "Choisissez le rang des parents", - "ru-ru": "Выберите родительский ранг", - "uk-ua": "Виберіть батьківський рейтинг", - "pt-br": "Escolha a classificação dos pais", + 'en-us': 'Choose Parent Rank', + 'de-ch': 'Wählen Sie den übergeordneten Rang', + 'es-es': 'Elija el rango de los padres', + 'fr-fr': 'Choisissez le rang des parents', + 'ru-ru': 'Выберите родительский ранг', + 'uk-ua': 'Виберіть батьківський рейтинг', + 'pt-br': 'Escolha a classificação dos pais', }, moveItems: { - "en-us": "Move Items", - "de-ch": "Elemente verschieben", - "es-es": "Mover elementos", - "fr-fr": "Déplacer des éléments", - "ru-ru": "Переместить элементы", - "uk-ua": "Переміщення елементів", - "pt-br": "Mover itens", + 'en-us': 'Move Items', + 'de-ch': 'Elemente verschieben', + 'es-es': 'Mover elementos', + 'fr-fr': 'Déplacer des éléments', + 'ru-ru': 'Переместить элементы', + 'uk-ua': 'Переміщення елементів', + 'pt-br': 'Mover itens', }, addTree: { - "en-us": "Add Tree", - "de-ch": "Baum hinzufügen", - "es-es": "Agregar árbol", - "fr-fr": "Ajouter un arbre", - "pt-br": "Adicionar árvore", - "ru-ru": "Добавить дерево", - "uk-ua": "Додати дерево", + 'en-us': 'Add Tree', + 'de-ch': 'Baum hinzufügen', + 'es-es': 'Agregar árbol', + 'fr-fr': 'Ajouter un arbre', + 'pt-br': 'Adicionar árvore', + 'ru-ru': 'Добавить дерево', + 'uk-ua': 'Додати дерево', }, addRootNode: { - "en-us": "Add root node", - "de-ch": "Stammknoten hinzufügen", - "es-es": "Agregar nodo raíz", - "fr-fr": "Ajouter un nœud racine", - "pt-br": "Adicionar nó raiz", - "ru-ru": "Добавить корневой узел", - "uk-ua": "Додати кореневий вузол", + 'en-us': 'Add root node', + 'de-ch': 'Stammknoten hinzufügen', + 'es-es': 'Agregar nodo raíz', + 'fr-fr': 'Ajouter un nœud racine', + 'pt-br': 'Adicionar nó raiz', + 'ru-ru': 'Добавить корневой узел', + 'uk-ua': 'Додати кореневий вузол', }, treePicker: { - "en-us": "Tree Picker", - "de-ch": "Baumpflücker", - "es-es": "Selector de árboles", - "fr-fr": "Cueilleur d'arbres", - "pt-br": "Colhedor de árvores", - "ru-ru": "Сборщик деревьев", - "uk-ua": "Збирач дерев", + 'en-us': 'Tree Picker', + 'de-ch': 'Baumpflücker', + 'es-es': 'Selector de árboles', + 'fr-fr': "Cueilleur d'arbres", + 'pt-br': 'Colhedor de árvores', + 'ru-ru': 'Сборщик деревьев', + 'uk-ua': 'Збирач дерев', }, botany: { - "en-us": "Botany", - "de-ch": "Botanik", - "es-es": "Botánica", - "fr-fr": "Botanique", - "pt-br": "Botânica", - "ru-ru": "Ботаника", - "uk-ua": "Ботаніка", + 'en-us': 'Botany', + 'de-ch': 'Botanik', + 'es-es': 'Botánica', + 'fr-fr': 'Botanique', + 'pt-br': 'Botânica', + 'ru-ru': 'Ботаника', + 'uk-ua': 'Ботаніка', }, entomology: { - "en-us": "Entomology", - "de-ch": "Entomologie", - "es-es": "Entomología", - "fr-fr": "Entomologie", - "pt-br": "Entomologia", - "ru-ru": "Энтомология", - "uk-ua": "Ентомологія", + 'en-us': 'Entomology', + 'de-ch': 'Entomologie', + 'es-es': 'Entomología', + 'fr-fr': 'Entomologie', + 'pt-br': 'Entomologia', + 'ru-ru': 'Энтомология', + 'uk-ua': 'Ентомологія', }, herpetology: { - "en-us": "Herpetology", - "de-ch": "Herpetologie", - "es-es": "Herpetología", - "fr-fr": "Herpétologie", - "pt-br": "Herpetologia", - "ru-ru": "Герпетология", - "uk-ua": "Герпетологія", + 'en-us': 'Herpetology', + 'de-ch': 'Herpetologie', + 'es-es': 'Herpetología', + 'fr-fr': 'Herpétologie', + 'pt-br': 'Herpetologia', + 'ru-ru': 'Герпетология', + 'uk-ua': 'Герпетологія', }, ichthyology: { - "en-us": "Ichthyology", - "de-ch": "Fischkunde", - "es-es": "Ictiología", - "fr-fr": "Ichtyologie", - "pt-br": "Ictiologia", - "ru-ru": "Ихтиология", - "uk-ua": "Іхтіологія", + 'en-us': 'Ichthyology', + 'de-ch': 'Fischkunde', + 'es-es': 'Ictiología', + 'fr-fr': 'Ichtyologie', + 'pt-br': 'Ictiologia', + 'ru-ru': 'Ихтиология', + 'uk-ua': 'Іхтіологія', }, invertpaleo: { - "en-us": "Invertebrate Paleontology", - "de-ch": "Paläontologie der Wirbellosen", - "es-es": "Paleontología de invertebrados", - "fr-fr": "Paléontologie des invertébrés", - "pt-br": "Paleontologia de Invertebrados", - "ru-ru": "Палеонтология беспозвоночных", - "uk-ua": "Палеонтологія безхребетних", + 'en-us': 'Invertebrate Paleontology', + 'de-ch': 'Paläontologie der Wirbellosen', + 'es-es': 'Paleontología de invertebrados', + 'fr-fr': 'Paléontologie des invertébrés', + 'pt-br': 'Paleontologia de Invertebrados', + 'ru-ru': 'Палеонтология беспозвоночных', + 'uk-ua': 'Палеонтологія безхребетних', }, invertzoo: { - "en-us": "Invertebrate Zoology", - "de-ch": "Wirbellose Zoologie", - "es-es": "Zoología de invertebrados", - "fr-fr": "Zoologie des invertébrés", - "pt-br": "Zoologia de Invertebrados", - "ru-ru": "Зоология беспозвоночных", - "uk-ua": "Зоологія безхребетних", + 'en-us': 'Invertebrate Zoology', + 'de-ch': 'Wirbellose Zoologie', + 'es-es': 'Zoología de invertebrados', + 'fr-fr': 'Zoologie des invertébrés', + 'pt-br': 'Zoologia de Invertebrados', + 'ru-ru': 'Зоология беспозвоночных', + 'uk-ua': 'Зоологія безхребетних', }, mammalogy: { - "en-us": "Mammalogy", - "de-ch": "Mammalogie", - "es-es": "Mastozoología", - "fr-fr": "Mammalogie", - "pt-br": "Mammalogia", - "ru-ru": "Маммология", - "uk-ua": "Мамалогія", + 'en-us': 'Mammalogy', + 'de-ch': 'Mammalogie', + 'es-es': 'Mastozoología', + 'fr-fr': 'Mammalogie', + 'pt-br': 'Mammalogia', + 'ru-ru': 'Маммология', + 'uk-ua': 'Мамалогія', }, ornithology: { - "en-us": "Ornithology", - "de-ch": "Vogelkunde", - "es-es": "Ornitología", - "fr-fr": "Ornithologie", - "pt-br": "Ornitologia", - "ru-ru": "Орнитология", - "uk-ua": "Орнітологія", + 'en-us': 'Ornithology', + 'de-ch': 'Vogelkunde', + 'es-es': 'Ornitología', + 'fr-fr': 'Ornithologie', + 'pt-br': 'Ornitologia', + 'ru-ru': 'Орнитология', + 'uk-ua': 'Орнітологія', }, paleobot: { - "en-us": "Paleobotany", - "de-ch": "Paläobotanik", - "es-es": "Paleobotánica", - "fr-fr": "Paléobotanique", - "pt-br": "Paleobotânica", - "ru-ru": "Палеоботаника", - "uk-ua": "Палеоботаніка", + 'en-us': 'Paleobotany', + 'de-ch': 'Paläobotanik', + 'es-es': 'Paleobotánica', + 'fr-fr': 'Paléobotanique', + 'pt-br': 'Paleobotânica', + 'ru-ru': 'Палеоботаника', + 'uk-ua': 'Палеоботаніка', }, vascplant: { - "en-us": "Vascular Plants", - "de-ch": "Gefäßpflanzen", - "es-es": "Plantas vasculares", - "fr-fr": "Plantes vasculaires", - "pt-br": "Plantas Vasculares", - "ru-ru": "Сосудистые растения", - "uk-ua": "Судинні рослини", + 'en-us': 'Vascular Plants', + 'de-ch': 'Gefäßpflanzen', + 'es-es': 'Plantas vasculares', + 'fr-fr': 'Plantes vasculaires', + 'pt-br': 'Plantas Vasculares', + 'ru-ru': 'Сосудистые растения', + 'uk-ua': 'Судинні рослини', }, vertpaleo: { - "en-us": "Vertebrate Paleontology", - "de-ch": "Wirbeltierpaläontologie", - "es-es": "Paleontología de vertebrados", - "fr-fr": "Paléontologie des vertébrés", - "pt-br": "Paleontologia de Vertebrados", - "ru-ru": "Палеонтология позвоночных", - "uk-ua": "Палеонтологія хребетних", + 'en-us': 'Vertebrate Paleontology', + 'de-ch': 'Wirbeltierpaläontologie', + 'es-es': 'Paleontología de vertebrados', + 'fr-fr': 'Paléontologie des vertébrés', + 'pt-br': 'Paleontologia de Vertebrados', + 'ru-ru': 'Палеонтология позвоночных', + 'uk-ua': 'Палеонтологія хребетних', }, defaultRemarks: { - "en-us": "A default taxon tree", - "de-ch": "Ein Standard-Taxonbaum", - "es-es": "Un árbol de taxones predeterminado", - "fr-fr": "Un arbre taxonomique par défaut", - "pt-br": "Uma árvore de táxons padrão", - "ru-ru": "Дерево таксона по умолчанию", - "uk-ua": "Дерево таксонів за замовчуванням", + 'en-us': 'A default taxon tree', + 'de-ch': 'Ein Standard-Taxonbaum', + 'es-es': 'Un árbol de taxones predeterminado', + 'fr-fr': 'Un arbre taxonomique par défaut', + 'pt-br': 'Uma árvore de táxons padrão', + 'ru-ru': 'Дерево таксона по умолчанию', + 'uk-ua': 'Дерево таксонів за замовчуванням', }, emptyTree: { - "en-us": "Empty Tree", - "de-ch": "Leerer Baum", - "es-es": "Árbol vacío", - "fr-fr": "Arbre vide", - "pt-br": "Árvore vazia", - "ru-ru": "Пустое дерево", - "uk-ua": "Порожнє дерево", + 'en-us': 'Empty Tree', + 'de-ch': 'Leerer Baum', + 'es-es': 'Árbol vacío', + 'fr-fr': 'Arbre vide', + 'pt-br': 'Árvore vazia', + 'ru-ru': 'Пустое дерево', + 'uk-ua': 'Порожнє дерево', }, minerals: { - "en-us": "Minerals", - "de-ch": "Mineralien", - "es-es": "Minerales", - "fr-fr": "Minéraux", - "pt-br": "Minerais", - "ru-ru": "Минералы", - "uk-ua": "Мінерали", + 'en-us': 'Minerals', + 'de-ch': 'Mineralien', + 'es-es': 'Minerales', + 'fr-fr': 'Minéraux', + 'pt-br': 'Minerais', + 'ru-ru': 'Минералы', + 'uk-ua': 'Мінерали', }, rocks: { - "en-us": "Rocks", - "de-ch": "Felsen", - "es-es": "Rocas", - "fr-fr": "Rochers", - "pt-br": "Rochas", - "ru-ru": "Скалы", - "uk-ua": "Скелі", + 'en-us': 'Rocks', + 'de-ch': 'Felsen', + 'es-es': 'Rocas', + 'fr-fr': 'Rochers', + 'pt-br': 'Rochas', + 'ru-ru': 'Скалы', + 'uk-ua': 'Скелі', }, meteorites: { - "en-us": "Meteorites", - "de-ch": "Meteoriten", - "es-es": "Meteoritos", - "fr-fr": "Météorites", - "pt-br": "Meteoritos", - "ru-ru": "Метеориты", - "uk-ua": "Метеорити", + 'en-us': 'Meteorites', + 'de-ch': 'Meteoriten', + 'es-es': 'Meteoritos', + 'fr-fr': 'Météorites', + 'pt-br': 'Meteoritos', + 'ru-ru': 'Метеориты', + 'uk-ua': 'Метеорити', + }, + treeManagement: { + 'en-us': 'Tree management', + 'ru-ru': 'Tree management', + 'es-es': 'Tree management', + 'fr-fr': 'Tree management', + 'uk-ua': 'Tree management', + 'de-ch': 'Tree management', + 'pt-br': 'Tree management', + }, + synonymizedNodes: { + 'en-us': 'Synonymized nodes', + 'ru-ru': 'Synonymized nodes', + 'es-es': 'Synonymized nodes', + 'fr-fr': 'Synonymized nodes', + 'uk-ua': 'Synonymized nodes', + 'de-ch': 'Synonymized nodes', + 'pt-br': 'Synonymized nodes', + }, + synonymizedNodesDescription: { + 'en-us': 'Allow creating children under synonymized nodes in specific trees.', + 'ru-ru': 'Allow creating children under synonymized nodes in specific trees.', + 'es-es': 'Allow creating children under synonymized nodes in specific trees.', + 'fr-fr': 'Allow creating children under synonymized nodes in specific trees.', + 'uk-ua': 'Allow creating children under synonymized nodes in specific trees.', + 'de-ch': 'Allow creating children under synonymized nodes in specific trees.', + 'pt-br': 'Allow creating children under synonymized nodes in specific trees.', + }, + allowSynonymizedGeologicTimePeriodChildren: { + 'en-us': 'Allow children under synonymized Geologic Time Period nodes', + 'ru-ru': 'Allow children under synonymized Geologic Time Period nodes', + 'es-es': 'Allow children under synonymized Geologic Time Period nodes', + 'fr-fr': 'Allow children under synonymized Geologic Time Period nodes', + 'uk-ua': 'Allow children under synonymized Geologic Time Period nodes', + 'de-ch': 'Allow children under synonymized Geologic Time Period nodes', + 'pt-br': 'Allow children under synonymized Geologic Time Period nodes', + }, + allowSynonymizedTaxonChildren: { + 'en-us': 'Allow children under synonymized Taxon nodes', + 'ru-ru': 'Allow children under synonymized Taxon nodes', + 'es-es': 'Allow children under synonymized Taxon nodes', + 'fr-fr': 'Allow children under synonymized Taxon nodes', + 'uk-ua': 'Allow children under synonymized Taxon nodes', + 'de-ch': 'Allow children under synonymized Taxon nodes', + 'pt-br': 'Allow children under synonymized Taxon nodes', + }, + allowSynonymizedGeographyChildren: { + 'en-us': 'Allow children under synonymized Geography nodes', + 'ru-ru': 'Allow children under synonymized Geography nodes', + 'es-es': 'Allow children under synonymized Geography nodes', + 'fr-fr': 'Allow children under synonymized Geography nodes', + 'uk-ua': 'Allow children under synonymized Geography nodes', + 'de-ch': 'Allow children under synonymized Geography nodes', + 'pt-br': 'Allow children under synonymized Geography nodes', + }, + allowSynonymizedLithostratChildren: { + 'en-us': 'Allow children under synonymized Lithostratigraphy nodes', + 'ru-ru': 'Allow children under synonymized Lithostratigraphy nodes', + 'es-es': 'Allow children under synonymized Lithostratigraphy nodes', + 'fr-fr': 'Allow children under synonymized Lithostratigraphy nodes', + 'uk-ua': 'Allow children under synonymized Lithostratigraphy nodes', + 'de-ch': 'Allow children under synonymized Lithostratigraphy nodes', + 'pt-br': 'Allow children under synonymized Lithostratigraphy nodes', + }, + allowSynonymizedStorageChildren: { + 'en-us': 'Allow children under synonymized Storage nodes', + 'ru-ru': 'Allow children under synonymized Storage nodes', + 'es-es': 'Allow children under synonymized Storage nodes', + 'fr-fr': 'Allow children under synonymized Storage nodes', + 'uk-ua': 'Allow children under synonymized Storage nodes', + 'de-ch': 'Allow children under synonymized Storage nodes', + 'pt-br': 'Allow children under synonymized Storage nodes', + }, + allowSynonymizedTectonicUnitChildren: { + 'en-us': 'Allow children under synonymized Tectonic Unit nodes', + 'ru-ru': 'Allow children under synonymized Tectonic Unit nodes', + 'es-es': 'Allow children under synonymized Tectonic Unit nodes', + 'fr-fr': 'Allow children under synonymized Tectonic Unit nodes', + 'uk-ua': 'Allow children under synonymized Tectonic Unit nodes', + 'de-ch': 'Allow children under synonymized Tectonic Unit nodes', + 'pt-br': 'Allow children under synonymized Tectonic Unit nodes', }, } as const); From 7e905d0bdec5e0bf6004531f15e92c685ef7987e Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 6 Oct 2025 23:20:19 +0000 Subject: [PATCH 039/115] Lint code with ESLint and Prettier Triggered by c4ddea8efb09522d45738b84f5587708f324b757 on branch refs/heads/issue-7440 --- .../Preferences/CollectionDefinitions.tsx | 2 +- .../js_src/lib/localization/attachments.ts | 21 ++++++++---- .../js_src/lib/localization/preferences.ts | 33 ++++++++++++------- .../js_src/lib/localization/specifyNetwork.ts | 4 +-- .../js_src/lib/localization/stats.tsx | 3 +- .../frontend/js_src/lib/localization/tree.ts | 21 ++++++++---- 6 files changed, 54 insertions(+), 30 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 04b5dc5066e..ed10364a63a 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -6,8 +6,8 @@ import { attachmentsText } from '../../localization/attachments'; import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; import { specifyNetworkText } from '../../localization/specifyNetwork'; -import { treeText } from '../../localization/tree'; import { statsText } from '../../localization/stats'; +import { treeText } from '../../localization/tree'; import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; import { ensure } from '../../utils/types'; diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index 59133101931..0c930242d8b 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -687,12 +687,19 @@ export const attachmentsText = createDictionary({ 'pt-br': 'New attachments are public', }, publicDefaultDescription: { - 'en-us': 'Set the default visibility for attachments created within this collection.', - 'ru-ru': 'Set the default visibility for attachments created within this collection.', - 'es-es': 'Set the default visibility for attachments created within this collection.', - 'fr-fr': 'Set the default visibility for attachments created within this collection.', - 'uk-ua': 'Set the default visibility for attachments created within this collection.', - 'de-ch': 'Set the default visibility for attachments created within this collection.', - 'pt-br': 'Set the default visibility for attachments created within this collection.', + 'en-us': + 'Set the default visibility for attachments created within this collection.', + 'ru-ru': + 'Set the default visibility for attachments created within this collection.', + 'es-es': + 'Set the default visibility for attachments created within this collection.', + 'fr-fr': + 'Set the default visibility for attachments created within this collection.', + 'uk-ua': + 'Set the default visibility for attachments created within this collection.', + 'de-ch': + 'Set the default visibility for attachments created within this collection.', + 'pt-br': + 'Set the default visibility for attachments created within this collection.', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index d7e3e453d2f..f4a452a27ad 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -1293,19 +1293,28 @@ export const preferencesText = createDictionary({ 'pt-br': 'Scope "Entire Table" picklists', }, scopeEntireTablePicklistsDescription: { - 'en-us': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'ru-ru': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'es-es': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'fr-fr': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'uk-ua': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'de-ch': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'pt-br': 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'en-us': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'ru-ru': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'es-es': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'fr-fr': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'uk-ua': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'de-ch': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'pt-br': + 'Restrict "Entire Table" picklists to values used by records in this collection.', }, - catalogNumberInheritanceDescription:{ - 'en-us': 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.', + catalogNumberInheritanceDescription: { + 'en-us': + 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.', }, - catalogNumberParentInheritanceDescription:{ - 'en-us': 'Control whether component records inherit catalog numbers from their parent Collection Object.' + catalogNumberParentInheritanceDescription: { + 'en-us': + 'Control whether component records inherit catalog numbers from their parent Collection Object.', }, specifyNetworkBadge: { 'en-us': 'Specify Network Badge', @@ -1316,7 +1325,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Netzwerk-Badge angeben', 'pt-br': 'Especificar emblema de rede', }, - useAccessibleFullDatePicker: { + useAccessibleFullDatePicker: { 'en-us': 'Use accessible full date picker', 'ru-ru': 'Используйте доступный полный выбор даты', 'es-es': 'Utilice el selector de fecha completo y accesible', diff --git a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts index 8fec68d009c..5ab1a107d5c 100644 --- a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts +++ b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts @@ -20,12 +20,12 @@ export const specifyNetworkText = createDictionary({ 'en-us': 'Publishing organization key', 'ru-ru': 'Publishing organization key', 'es-es': 'Publishing organization key', - 'fr-fr': "Clé d’organisation de publication", + 'fr-fr': 'Clé d’organisation de publication', 'uk-ua': 'Publishing organization key', 'de-ch': 'Publishing organization key', 'pt-br': 'Chave da organização publicadora', }, - collectionKey: { + collectionKey: { 'en-us': 'Collection key', 'ru-ru': 'Collection key', 'es-es': 'Collection key', diff --git a/specifyweb/frontend/js_src/lib/localization/stats.tsx b/specifyweb/frontend/js_src/lib/localization/stats.tsx index bf901980c06..9ac2e816daf 100644 --- a/specifyweb/frontend/js_src/lib/localization/stats.tsx +++ b/specifyweb/frontend/js_src/lib/localization/stats.tsx @@ -320,7 +320,8 @@ export const statsText = createDictionary({ 'en-us': 'Show preparation totals', }, showPreparationsTotalDescription: { - 'en-us': 'Include an overall total across preparation types on the statistics page.', + 'en-us': + 'Include an overall total across preparation types on the statistics page.', }, autoRefreshRate: { 'en-us': 'Auto-refresh rate (hours)', diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index f362d2bdd73..1979ee56de4 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -722,13 +722,20 @@ export const treeText = createDictionary({ 'pt-br': 'Synonymized nodes', }, synonymizedNodesDescription: { - 'en-us': 'Allow creating children under synonymized nodes in specific trees.', - 'ru-ru': 'Allow creating children under synonymized nodes in specific trees.', - 'es-es': 'Allow creating children under synonymized nodes in specific trees.', - 'fr-fr': 'Allow creating children under synonymized nodes in specific trees.', - 'uk-ua': 'Allow creating children under synonymized nodes in specific trees.', - 'de-ch': 'Allow creating children under synonymized nodes in specific trees.', - 'pt-br': 'Allow creating children under synonymized nodes in specific trees.', + 'en-us': + 'Allow creating children under synonymized nodes in specific trees.', + 'ru-ru': + 'Allow creating children under synonymized nodes in specific trees.', + 'es-es': + 'Allow creating children under synonymized nodes in specific trees.', + 'fr-fr': + 'Allow creating children under synonymized nodes in specific trees.', + 'uk-ua': + 'Allow creating children under synonymized nodes in specific trees.', + 'de-ch': + 'Allow creating children under synonymized nodes in specific trees.', + 'pt-br': + 'Allow creating children under synonymized nodes in specific trees.', }, allowSynonymizedGeologicTimePeriodChildren: { 'en-us': 'Allow children under synonymized Geologic Time Period nodes', From c37ae85910d230caa4a906e3bb329fcc36660b49 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 6 Oct 2025 19:31:36 -0400 Subject: [PATCH 040/115] removed collection pref refrence from User Tools --- .../js_src/lib/components/Header/userToolDefinitions.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index ef262b42e9f..6855811b3b4 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -57,12 +57,6 @@ const rawUserTools = ensure>>>()({ url: '/specify/user-preferences/', icon: icons.cog, }, - collectionPreferences: { - title: preferencesText.collectionPreferences(), - url: '/specify/collection-preferences/', - icon: icons.collection, - enabled: () => hasToolPermission('resources', 'update'), - }, schemaConfig: { title: schemaText.schemaConfig(), url: '/specify/schema-config/', From d84ba94a5103c8abc55b14172fe294c976d203fa Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 08:49:49 -0400 Subject: [PATCH 041/115] remove extra language lines and keep only 'en-us' --- .../js_src/lib/localization/attachments.ts | 18 ---------- .../js_src/lib/localization/preferences.ts | 18 ---------- .../js_src/lib/localization/specifyNetwork.ts | 12 ------- .../frontend/js_src/lib/localization/tree.ts | 36 ------------------- 4 files changed, 84 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index 0c930242d8b..81100afff64 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -679,27 +679,9 @@ export const attachmentsText = createDictionary({ }, publicDefault: { 'en-us': 'New attachments are public', - 'ru-ru': 'New attachments are public', - 'es-es': 'New attachments are public', - 'fr-fr': 'New attachments are public', - 'uk-ua': 'New attachments are public', - 'de-ch': 'New attachments are public', - 'pt-br': 'New attachments are public', }, publicDefaultDescription: { 'en-us': 'Set the default visibility for attachments created within this collection.', - 'ru-ru': - 'Set the default visibility for attachments created within this collection.', - 'es-es': - 'Set the default visibility for attachments created within this collection.', - 'fr-fr': - 'Set the default visibility for attachments created within this collection.', - 'uk-ua': - 'Set the default visibility for attachments created within this collection.', - 'de-ch': - 'Set the default visibility for attachments created within this collection.', - 'pt-br': - 'Set the default visibility for attachments created within this collection.', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index f4a452a27ad..9c8e7c81d84 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -1285,28 +1285,10 @@ export const preferencesText = createDictionary({ }, scopeEntireTablePicklists: { 'en-us': 'Scope "Entire Table" picklists', - 'ru-ru': 'Scope "Entire Table" picklists', - 'es-es': 'Scope "Entire Table" picklists', - 'fr-fr': 'Scope "Entire Table" picklists', - 'uk-ua': 'Scope "Entire Table" picklists', - 'de-ch': 'Scope "Entire Table" picklists', - 'pt-br': 'Scope "Entire Table" picklists', }, scopeEntireTablePicklistsDescription: { 'en-us': 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'ru-ru': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'es-es': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'fr-fr': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'uk-ua': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'de-ch': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - 'pt-br': - 'Restrict "Entire Table" picklists to values used by records in this collection.', }, catalogNumberInheritanceDescription: { 'en-us': diff --git a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts index 5ab1a107d5c..37b3516e2e6 100644 --- a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts +++ b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts @@ -18,21 +18,9 @@ export const specifyNetworkText = createDictionary({ }, publishingOrganizationKey: { 'en-us': 'Publishing organization key', - 'ru-ru': 'Publishing organization key', - 'es-es': 'Publishing organization key', - 'fr-fr': 'Clé d’organisation de publication', - 'uk-ua': 'Publishing organization key', - 'de-ch': 'Publishing organization key', - 'pt-br': 'Chave da organização publicadora', }, collectionKey: { 'en-us': 'Collection key', - 'ru-ru': 'Collection key', - 'es-es': 'Collection key', - 'fr-fr': 'Identifiant de collection', - 'uk-ua': 'Collection key', - 'de-ch': 'Collection key', - 'pt-br': 'Chave da coleção', }, occurrenceOrGuidRequired: { 'en-us': 'Species Name or GUID must be provided to display this page', diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index 1979ee56de4..adcf8ed6ddb 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -739,56 +739,20 @@ export const treeText = createDictionary({ }, allowSynonymizedGeologicTimePeriodChildren: { 'en-us': 'Allow children under synonymized Geologic Time Period nodes', - 'ru-ru': 'Allow children under synonymized Geologic Time Period nodes', - 'es-es': 'Allow children under synonymized Geologic Time Period nodes', - 'fr-fr': 'Allow children under synonymized Geologic Time Period nodes', - 'uk-ua': 'Allow children under synonymized Geologic Time Period nodes', - 'de-ch': 'Allow children under synonymized Geologic Time Period nodes', - 'pt-br': 'Allow children under synonymized Geologic Time Period nodes', }, allowSynonymizedTaxonChildren: { 'en-us': 'Allow children under synonymized Taxon nodes', - 'ru-ru': 'Allow children under synonymized Taxon nodes', - 'es-es': 'Allow children under synonymized Taxon nodes', - 'fr-fr': 'Allow children under synonymized Taxon nodes', - 'uk-ua': 'Allow children under synonymized Taxon nodes', - 'de-ch': 'Allow children under synonymized Taxon nodes', - 'pt-br': 'Allow children under synonymized Taxon nodes', }, allowSynonymizedGeographyChildren: { 'en-us': 'Allow children under synonymized Geography nodes', - 'ru-ru': 'Allow children under synonymized Geography nodes', - 'es-es': 'Allow children under synonymized Geography nodes', - 'fr-fr': 'Allow children under synonymized Geography nodes', - 'uk-ua': 'Allow children under synonymized Geography nodes', - 'de-ch': 'Allow children under synonymized Geography nodes', - 'pt-br': 'Allow children under synonymized Geography nodes', }, allowSynonymizedLithostratChildren: { 'en-us': 'Allow children under synonymized Lithostratigraphy nodes', - 'ru-ru': 'Allow children under synonymized Lithostratigraphy nodes', - 'es-es': 'Allow children under synonymized Lithostratigraphy nodes', - 'fr-fr': 'Allow children under synonymized Lithostratigraphy nodes', - 'uk-ua': 'Allow children under synonymized Lithostratigraphy nodes', - 'de-ch': 'Allow children under synonymized Lithostratigraphy nodes', - 'pt-br': 'Allow children under synonymized Lithostratigraphy nodes', }, allowSynonymizedStorageChildren: { 'en-us': 'Allow children under synonymized Storage nodes', - 'ru-ru': 'Allow children under synonymized Storage nodes', - 'es-es': 'Allow children under synonymized Storage nodes', - 'fr-fr': 'Allow children under synonymized Storage nodes', - 'uk-ua': 'Allow children under synonymized Storage nodes', - 'de-ch': 'Allow children under synonymized Storage nodes', - 'pt-br': 'Allow children under synonymized Storage nodes', }, allowSynonymizedTectonicUnitChildren: { 'en-us': 'Allow children under synonymized Tectonic Unit nodes', - 'ru-ru': 'Allow children under synonymized Tectonic Unit nodes', - 'es-es': 'Allow children under synonymized Tectonic Unit nodes', - 'fr-fr': 'Allow children under synonymized Tectonic Unit nodes', - 'uk-ua': 'Allow children under synonymized Tectonic Unit nodes', - 'de-ch': 'Allow children under synonymized Tectonic Unit nodes', - 'pt-br': 'Allow children under synonymized Tectonic Unit nodes', }, } as const); From 70780ae86006c1f7f6f2581c7d3bbdd4144ebc4f Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 09:36:23 -0400 Subject: [PATCH 042/115] extract shared logic into createPreferencesEditor and wire User/Collection editors --- .../lib/components/Preferences/Editor.tsx | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 5a761caa2b2..0d10d03c2db 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -9,71 +9,74 @@ import { userPreferences } from '../Preferences/userPreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; -export function UserPreferencesEditor({ - data, - onChange: handleChange, -}: AppResourceTabProps): JSX.Element { - const [preferencesContext] = useLiveState( - React.useCallback(() => { - const userPreferences = new BasePreferences({ - definitions: userPreferenceDefinitions, - values: { - resourceName: 'UserPreferences', - fetchUrl: '/context/user_resource/', - }, - defaultValues: undefined, - developmentGlobal: '_editingUserPreferences', - syncChanges: false, - }); - userPreferences.setRaw( - JSON.parse(data === null || data.length === 0 ? '{}' : data) - ); - userPreferences.events.on('update', () => - handleChange(JSON.stringify(userPreferences.getRaw())) - ); - return userPreferences; - }, [handleChange]) - ); +type CreatePreferencesEditorArgs = { + contextModule: { Context: React.Context }; + definitions: typeof userPreferenceDefinitions | typeof collectionPreferenceDefinitions; + resourceName: 'UserPreferences' | 'CollectionPreferences'; + fetchUrl: '/context/user_resource/' | '/context/collection_resource/'; + developmentGlobal: + | '_editingUserPreferences' + | '_editingCollectionPreferences'; + prefType?: 'collection' | 'user'; +}; +function createPreferencesEditor({ + contextModule, + definitions, + resourceName, + fetchUrl, + developmentGlobal, + prefType, +}: CreatePreferencesEditorArgs) { + const Editor = ({ data, onChange }: AppResourceTabProps): JSX.Element => { + const [preferencesInstance] = useLiveState( + React.useCallback(() => { + const prefs = new BasePreferences({ + definitions, + values: { + resourceName, + fetchUrl, + }, + defaultValues: undefined, + developmentGlobal, + syncChanges: false, + }); + prefs.setRaw(JSON.parse(!data || data.length === 0 ? '{}' : data)); + prefs.events.on('update', () => onChange(JSON.stringify(prefs.getRaw()))); - const Context = userPreferences.Context; - return ( - - - - ); -} + return prefs; + }, [data, onChange]) + ); -export function CollectionPreferencesEditor({ - data, - onChange, -}: AppResourceTabProps): JSX.Element { - const [preferencesInstance] = useLiveState( - React.useCallback(() => { - const temporaryCollectionPrefs = new BasePreferences({ - definitions: collectionPreferenceDefinitions, - values: { - resourceName: 'CollectionPreferences', - fetchUrl: '/context/collection_resource/', - }, - defaultValues: undefined, - developmentGlobal: '_editingCollectionPreferences', - syncChanges: false, - }); - temporaryCollectionPrefs.setRaw( - JSON.parse(!data || data.length === 0 ? '{}' : data) - ); - temporaryCollectionPrefs.events.on('update', () => - onChange(JSON.stringify(temporaryCollectionPrefs.getRaw())) - ); + const Context = contextModule.Context; - return temporaryCollectionPrefs; - }, [data, onChange]) - ); - const Context = collectionPreferences.Context; + return ( + + {prefType ? ( + + ) : ( + + )} + + ); + }; + Editor.displayName = `${resourceName}Editor`; - return ( - - - - ); + return Editor; } + +export const UserPreferencesEditor = createPreferencesEditor({ + contextModule: userPreferences, + definitions: userPreferenceDefinitions, + resourceName: 'UserPreferences', + fetchUrl: '/context/user_resource/', + developmentGlobal: '_editingUserPreferences', +}); + +export const CollectionPreferencesEditor = createPreferencesEditor({ + contextModule: collectionPreferences, + definitions: collectionPreferenceDefinitions, + resourceName: 'CollectionPreferences', + fetchUrl: '/context/collection_resource/', + developmentGlobal: '_editingCollectionPreferences', + prefType: 'collection', +}); From ccd5d0c543e4343d584e5e9dc570746dc0df34b8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 10:02:54 -0400 Subject: [PATCH 043/115] implemented IR for preferences typing --- .../lib/components/Preferences/index.tsx | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 8c127b5c940..c5397613017 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -48,15 +48,22 @@ const DOCS = { 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859', } as const; -const preferenceInstances = { - user: userPreferences as BasePreferences, - collection: collectionPreferences as BasePreferences, -} as const; +export type PreferenceType = keyof typeof preferenceInstances; -const preferenceDefinitions = { - user: userPreferenceDefinitions as GenericPreferences, - collection: collectionPreferenceDefinitions as GenericPreferences, -} as const; +type IR = { + user: T; + collection: T; +}; + +const preferenceInstances: IR> = { + user: userPreferences, + collection: collectionPreferences, +}; + +const preferenceDefinitions: IR = { + user: userPreferenceDefinitions, + collection: collectionPreferenceDefinitions, +}; const resolveCollectionDocumentHref = ( category: string, @@ -75,12 +82,14 @@ const resolveCollectionDocumentHref = ( return undefined; }; -const documentHrefResolvers = { +type DocHrefResolver = + | ((category: string, subcategory: string, name: string) => string | undefined) + | undefined; + +const documentHrefResolvers: IR = { user: undefined, collection: resolveCollectionDocumentHref, -} as const; - -export type PreferenceType = keyof typeof preferenceInstances; +}; const collectionPreferencesPromise = Promise.all([ collectionPreferences.fetch(), From 80a946764c1df4cb032717d180c157daa19279cb Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 13:41:06 +0000 Subject: [PATCH 044/115] Lint code with ESLint and Prettier Triggered by ad70ddc29986383d6ead31e885fb1ccfb60458d2 on branch refs/heads/issue-7440 --- .../lib/components/Preferences/Editor.tsx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 0d10d03c2db..89eb39b64db 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -10,14 +10,13 @@ import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; type CreatePreferencesEditorArgs = { - contextModule: { Context: React.Context }; - definitions: typeof userPreferenceDefinitions | typeof collectionPreferenceDefinitions; - resourceName: 'UserPreferences' | 'CollectionPreferences'; - fetchUrl: '/context/user_resource/' | '/context/collection_resource/'; - developmentGlobal: - | '_editingUserPreferences' - | '_editingCollectionPreferences'; - prefType?: 'collection' | 'user'; + readonly contextModule: { readonly Context: React.Context }; + readonly definitions: typeof collectionPreferenceDefinitions | typeof userPreferenceDefinitions; + readonly resourceName: 'CollectionPreferences' | 'UserPreferences'; + readonly fetchUrl: '/context/collection_resource/' | '/context/user_resource/'; + readonly developmentGlobal: + '_editingCollectionPreferences' | '_editingUserPreferences'; + readonly prefType?: 'collection' | 'user'; }; function createPreferencesEditor({ contextModule, @@ -27,7 +26,7 @@ function createPreferencesEditor({ developmentGlobal, prefType, }: CreatePreferencesEditorArgs) { - const Editor = ({ data, onChange }: AppResourceTabProps): JSX.Element => { + function Editor({ data, onChange }: AppResourceTabProps): JSX.Element { const [preferencesInstance] = useLiveState( React.useCallback(() => { const prefs = new BasePreferences({ @@ -58,7 +57,7 @@ function createPreferencesEditor({ )} ); - }; + } Editor.displayName = `${resourceName}Editor`; return Editor; From d1bdadafb2ca9166905a04573f9243bf10340e2e Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 10:31:55 -0400 Subject: [PATCH 045/115] resolve BasePreferences context type incompatibility in index.tsx --- .../lib/components/Preferences/Editor.tsx | 97 ++++++++++++------- .../lib/components/Preferences/index.tsx | 4 +- 2 files changed, 62 insertions(+), 39 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 89eb39b64db..31f5f8abe7f 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -3,33 +3,54 @@ import React from 'react'; import { useLiveState } from '../../hooks/useLiveState'; import type { AppResourceTabProps } from '../AppResources/TabDefinitions'; import { PreferencesContent } from '../Preferences'; +import type { PreferenceType } from '../Preferences'; import { BasePreferences } from '../Preferences/BasePreferences'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; +import type { GenericPreferences } from './types'; -type CreatePreferencesEditorArgs = { - readonly contextModule: { readonly Context: React.Context }; - readonly definitions: typeof collectionPreferenceDefinitions | typeof userPreferenceDefinitions; - readonly resourceName: 'CollectionPreferences' | 'UserPreferences'; - readonly fetchUrl: '/context/collection_resource/' | '/context/user_resource/'; - readonly developmentGlobal: - '_editingCollectionPreferences' | '_editingUserPreferences'; - readonly prefType?: 'collection' | 'user'; +type EditorDependencies = Pick; + +type PreferencesEditorConfig = { + readonly definitions: DEFINITIONS; + readonly Context: BasePreferences['Context']; + readonly resourceName: string; + readonly fetchUrl: string; + readonly developmentGlobal: string; + readonly prefType?: PreferenceType; + readonly dependencyResolver?: ( + inputs: EditorDependencies + ) => React.DependencyList; }; -function createPreferencesEditor({ - contextModule, - definitions, - resourceName, - fetchUrl, - developmentGlobal, - prefType, -}: CreatePreferencesEditorArgs) { - function Editor({ data, onChange }: AppResourceTabProps): JSX.Element { - const [preferencesInstance] = useLiveState( + +const defaultDependencyResolver = ({ onChange }: EditorDependencies) => [ + onChange, +]; + +function createPreferencesEditor( + config: PreferencesEditorConfig +) { + const { + definitions, + Context, + resourceName, + fetchUrl, + developmentGlobal, + prefType, + dependencyResolver = defaultDependencyResolver, + } = config; + + return function PreferencesEditor({ + data, + onChange, + }: AppResourceTabProps): JSX.Element { + const dependencies = dependencyResolver({ data, onChange }); + + const [preferencesInstance] = useLiveState>( React.useCallback(() => { - const prefs = new BasePreferences({ + const preferences = new BasePreferences({ definitions, values: { resourceName, @@ -39,43 +60,45 @@ function createPreferencesEditor({ developmentGlobal, syncChanges: false, }); - prefs.setRaw(JSON.parse(!data || data.length === 0 ? '{}' : data)); - prefs.events.on('update', () => onChange(JSON.stringify(prefs.getRaw()))); - return prefs; - }, [data, onChange]) + preferences.setRaw( + JSON.parse(data === null || data.length === 0 ? '{}' : data) + ); + + preferences.events.on('update', () => + onChange(JSON.stringify(preferences.getRaw())) + ); + + return preferences; + }, dependencies) ); - const Context = contextModule.Context; + const Provider = Context.Provider; + const contentProps = prefType === undefined ? {} : { prefType }; return ( - - {prefType ? ( - - ) : ( - - )} - + + + ); - } - Editor.displayName = `${resourceName}Editor`; - - return Editor; + }; } export const UserPreferencesEditor = createPreferencesEditor({ - contextModule: userPreferences, definitions: userPreferenceDefinitions, + Context: userPreferences.Context, resourceName: 'UserPreferences', fetchUrl: '/context/user_resource/', developmentGlobal: '_editingUserPreferences', + dependencyResolver: ({ onChange }) => [onChange], }); export const CollectionPreferencesEditor = createPreferencesEditor({ - contextModule: collectionPreferences, definitions: collectionPreferenceDefinitions, + Context: collectionPreferences.Context, resourceName: 'CollectionPreferences', fetchUrl: '/context/collection_resource/', developmentGlobal: '_editingCollectionPreferences', prefType: 'collection', + dependencyResolver: ({ data, onChange }) => [data, onChange], }); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index c5397613017..e7a8c652d7b 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -56,8 +56,8 @@ type IR = { }; const preferenceInstances: IR> = { - user: userPreferences, - collection: collectionPreferences, + user: userPreferences as unknown as BasePreferences, + collection: collectionPreferences as unknown as BasePreferences, }; const preferenceDefinitions: IR = { From f534d6c9a6d887ce811e158ba91aeb137186868a Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 11:15:19 -0400 Subject: [PATCH 046/115] simplify resolveCollectionDocumentHref logic using unified NAME_DOCS_MAP --- .../lib/components/Preferences/index.tsx | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index e7a8c652d7b..f3f948eb932 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -33,6 +33,7 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; +import type { IR } from '../../utils/types'; const DOCS = { picklists: @@ -50,11 +51,6 @@ const DOCS = { export type PreferenceType = keyof typeof preferenceInstances; -type IR = { - user: T; - collection: T; -}; - const preferenceInstances: IR> = { user: userPreferences as unknown as BasePreferences, collection: collectionPreferences as unknown as BasePreferences, @@ -65,20 +61,31 @@ const preferenceDefinitions: IR = { collection: collectionPreferenceDefinitions, }; +const NAME_DOCS_MAP: Record = { + sp7_scope_table_picklists: + 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', + 'attachment.is_public_default': + 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', + showPreparationsTotal: + 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + refreshRate: + 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + publishingOrganization: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', + collectionKey: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', +}; + const resolveCollectionDocumentHref = ( category: string, _subcategory: string, name: string ): string | undefined => { - if (name === 'sp7_scope_table_picklists') return DOCS.picklists; - if (name === 'attachment.is_public_default') return DOCS.attachments; + if (NAME_DOCS_MAP[name]) return NAME_DOCS_MAP[name]; if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) - return DOCS.trees; - if (name === 'showPreparationsTotal' || name === 'refreshRate') - return DOCS.stats; - if (name === 'publishingOrganization' || name === 'collectionKey') - return DOCS.specifyNetwork; - if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; + return 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; + if (category.startsWith('catalogNumber')) + return 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; return undefined; }; From baaebaca1d4e678b9b682cc99c27fb6d47349d86 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 14:37:02 +0000 Subject: [PATCH 047/115] Lint code with ESLint and Prettier Triggered by e58d9f0d7089509cb0f0f5e0edb622beb2800281 on branch refs/heads/issue-7440 --- .../lib/components/Preferences/Editor.tsx | 2 +- .../lib/components/Preferences/index.tsx | 46 +++++++++---------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 31f5f8abe7f..6b6be980014 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -2,8 +2,8 @@ import React from 'react'; import { useLiveState } from '../../hooks/useLiveState'; import type { AppResourceTabProps } from '../AppResources/TabDefinitions'; -import { PreferencesContent } from '../Preferences'; import type { PreferenceType } from '../Preferences'; +import { PreferencesContent } from '../Preferences'; import { BasePreferences } from '../Preferences/BasePreferences'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index f3f948eb932..20952417971 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -33,7 +33,6 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; -import type { IR } from '../../utils/types'; const DOCS = { picklists: @@ -51,9 +50,15 @@ const DOCS = { export type PreferenceType = keyof typeof preferenceInstances; +type IR = { + readonly user: T; + readonly collection: T; +}; + const preferenceInstances: IR> = { user: userPreferences as unknown as BasePreferences, - collection: collectionPreferences as unknown as BasePreferences, + collection: + collectionPreferences as unknown as BasePreferences, }; const preferenceDefinitions: IR = { @@ -61,39 +66,32 @@ const preferenceDefinitions: IR = { collection: collectionPreferenceDefinitions, }; -const NAME_DOCS_MAP: Record = { - sp7_scope_table_picklists: - 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', - 'attachment.is_public_default': - 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', - showPreparationsTotal: - 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - refreshRate: - 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - publishingOrganization: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', - collectionKey: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', -}; - const resolveCollectionDocumentHref = ( category: string, _subcategory: string, name: string ): string | undefined => { - if (NAME_DOCS_MAP[name]) return NAME_DOCS_MAP[name]; + if (name === 'sp7_scope_table_picklists') return DOCS.picklists; + if (name === 'attachment.is_public_default') return DOCS.attachments; if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) - return 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; - if (category.startsWith('catalogNumber')) - return 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; + return DOCS.trees; + if (name === 'showPreparationsTotal' || name === 'refreshRate') + return DOCS.stats; + if (name === 'publishingOrganization' || name === 'collectionKey') + return DOCS.specifyNetwork; + if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; return undefined; }; -type DocHrefResolver = - | ((category: string, subcategory: string, name: string) => string | undefined) +type DocumentHrefResolver = + | (( + category: string, + subcategory: string, + name: string + ) => string | undefined) | undefined; -const documentHrefResolvers: IR = { +const documentHrefResolvers: IR = { user: undefined, collection: resolveCollectionDocumentHref, }; From 5369e91e072fca317991c7a9de8b138a40018c24 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 12:18:53 -0400 Subject: [PATCH 048/115] unify visibilityContext to remove duplication --- .../lib/components/Preferences/index.tsx | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 20952417971..842e2080a30 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -183,21 +183,14 @@ function Preferences(): JSX.Element { export function usePrefDefinitions(prefType: PreferenceType = 'user') { const isDarkMode = useDarkMode(); const isRedirecting = React.useContext(userPreferences.Context) !== undefined; - const userVisibilityContext = React.useMemo( - () => ({ - isDarkMode, - isRedirecting, - }), - [isDarkMode, isRedirecting] - ); - - const collectionVisibilityContext = React.useMemo( - () => ({ isDarkMode: false, isRedirecting: false }), - [] - ); - const visibilityContext = - prefType === 'user' ? userVisibilityContext : collectionVisibilityContext; +const visibilityContext = React.useMemo( + () => + prefType === 'user' + ? { isDarkMode, isRedirecting } + : { isDarkMode: false, isRedirecting: false }, + [prefType, isDarkMode, isRedirecting] +); const definitions = preferenceDefinitions[prefType]; From 53490e7fcc7018c4b029e2dba6d0a58c59ce6153 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 15:46:22 +0000 Subject: [PATCH 049/115] Lint code with ESLint and Prettier Triggered by ff875da5c2871b33b2748d21ed233877702adb30 on branch refs/heads/issue-7440 --- .../lib/components/Preferences/index.tsx | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 842e2080a30..03055623da5 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -13,6 +13,7 @@ import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; +import type { IR } from '../../utils/types'; import { Container, H2, Key } from '../Atoms'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; @@ -34,27 +35,8 @@ import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; -const DOCS = { - picklists: - 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', - attachments: - 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', - trees: - 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', - stats: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - specifyNetwork: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', - catalogNumbers: - 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859', -} as const; - export type PreferenceType = keyof typeof preferenceInstances; -type IR = { - readonly user: T; - readonly collection: T; -}; - const preferenceInstances: IR> = { user: userPreferences as unknown as BasePreferences, collection: @@ -66,20 +48,31 @@ const preferenceDefinitions: IR = { collection: collectionPreferenceDefinitions, }; +const NAME_DOCS_MAP: Record = { + sp7_scope_table_picklists: + 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', + 'attachment.is_public_default': + 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', + showPreparationsTotal: + 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + refreshRate: + 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + publishingOrganization: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', + collectionKey: + 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', +}; + const resolveCollectionDocumentHref = ( category: string, _subcategory: string, name: string ): string | undefined => { - if (name === 'sp7_scope_table_picklists') return DOCS.picklists; - if (name === 'attachment.is_public_default') return DOCS.attachments; + if (NAME_DOCS_MAP[name]) return NAME_DOCS_MAP[name]; if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) - return DOCS.trees; - if (name === 'showPreparationsTotal' || name === 'refreshRate') - return DOCS.stats; - if (name === 'publishingOrganization' || name === 'collectionKey') - return DOCS.specifyNetwork; - if (category.startsWith('catalogNumber')) return DOCS.catalogNumbers; + return 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; + if (category.startsWith('catalogNumber')) + return 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; return undefined; }; @@ -183,14 +176,21 @@ function Preferences(): JSX.Element { export function usePrefDefinitions(prefType: PreferenceType = 'user') { const isDarkMode = useDarkMode(); const isRedirecting = React.useContext(userPreferences.Context) !== undefined; + const userVisibilityContext = React.useMemo( + () => ({ + isDarkMode, + isRedirecting, + }), + [isDarkMode, isRedirecting] + ); + + const collectionVisibilityContext = React.useMemo( + () => ({ isDarkMode: false, isRedirecting: false }), + [] + ); -const visibilityContext = React.useMemo( - () => - prefType === 'user' - ? { isDarkMode, isRedirecting } - : { isDarkMode: false, isRedirecting: false }, - [prefType, isDarkMode, isRedirecting] -); + const visibilityContext = + prefType === 'user' ? userVisibilityContext : collectionVisibilityContext; const definitions = preferenceDefinitions[prefType]; From 7bb534f400880f40df2d1387018fc507ab41265e Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 15:54:08 -0400 Subject: [PATCH 050/115] optimize preferences wrappers by introducing FetchGate component. --- .../lib/components/Preferences/index.tsx | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 03055623da5..5d66c45d537 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -468,11 +468,6 @@ function Item({ ); } -export function PreferencesWrapper(): JSX.Element | null { - const [hasFetched] = usePromise(preferencesPromise, true); - return hasFetched === true ? : null; -} - function CollectionPreferences(): JSX.Element { return ( @@ -483,7 +478,29 @@ function CollectionPreferences(): JSX.Element { ); } -export function CollectionPreferencesWrapper(): JSX.Element | null { - const [hasFetched] = usePromise(collectionPreferencesPromise, true); - return hasFetched === true ? : null; +function FetchGate({ + promise, + children, +}: { + readonly promise: Promise; + readonly children?: React.ReactNode; +}): JSX.Element | null { + const [hasFetched] = usePromise(promise, true); + return hasFetched ? <>{children} : null; +} + +export function PreferencesWrapper(): JSX.Element | null { + return ( + + + + ); } + +export function CollectionPreferencesWrapper(): JSX.Element | null { + return ( + + + + ); +} \ No newline at end of file From b7fb8804cc34c4843c656e337b67bf86c2719cb1 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 7 Oct 2025 16:13:50 -0400 Subject: [PATCH 051/115] simplify className logic for documentation paragraph --- .../lib/components/Preferences/index.tsx | 84 ++++++++----------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 5d66c45d537..a007f92428f 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -78,10 +78,10 @@ const resolveCollectionDocumentHref = ( type DocumentHrefResolver = | (( - category: string, - subcategory: string, - name: string - ) => string | undefined) + category: string, + subcategory: string, + name: string + ) => string | undefined) | undefined; const documentHrefResolvers: IR = { @@ -176,22 +176,15 @@ function Preferences(): JSX.Element { export function usePrefDefinitions(prefType: PreferenceType = 'user') { const isDarkMode = useDarkMode(); const isRedirecting = React.useContext(userPreferences.Context) !== undefined; - const userVisibilityContext = React.useMemo( - () => ({ - isDarkMode, - isRedirecting, - }), - [isDarkMode, isRedirecting] - ); - const collectionVisibilityContext = React.useMemo( - () => ({ isDarkMode: false, isRedirecting: false }), - [] + const visibilityContext = React.useMemo( + () => + prefType === 'user' + ? { isDarkMode, isRedirecting } + : { isDarkMode: false, isRedirecting: false }, + [prefType, isDarkMode, isRedirecting] ); - const visibilityContext = - prefType === 'user' ? userVisibilityContext : collectionVisibilityContext; - const definitions = preferenceDefinitions[prefType]; return React.useMemo( @@ -344,36 +337,33 @@ export function PreferencesContent({

{(item.description !== undefined || documentHref !== undefined) && ( -

- {item.description !== undefined && ( - - )} - {documentHref !== undefined && ( - - {headerText.documentation()} - - )} -

- )} +

+ {item.description !== undefined && ( + + )} + {documentHref !== undefined && ( + + {headerText.documentation()} + + )} +

+ )}
Date: Wed, 8 Oct 2025 12:20:35 -0400 Subject: [PATCH 052/115] Localization cleanup for collection preferences --- .../frontend/js_src/lib/localization/tree.ts | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index adcf8ed6ddb..667f6af34bc 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -705,37 +705,13 @@ export const treeText = createDictionary({ }, treeManagement: { 'en-us': 'Tree management', - 'ru-ru': 'Tree management', - 'es-es': 'Tree management', - 'fr-fr': 'Tree management', - 'uk-ua': 'Tree management', - 'de-ch': 'Tree management', - 'pt-br': 'Tree management', }, synonymizedNodes: { 'en-us': 'Synonymized nodes', - 'ru-ru': 'Synonymized nodes', - 'es-es': 'Synonymized nodes', - 'fr-fr': 'Synonymized nodes', - 'uk-ua': 'Synonymized nodes', - 'de-ch': 'Synonymized nodes', - 'pt-br': 'Synonymized nodes', }, synonymizedNodesDescription: { 'en-us': 'Allow creating children under synonymized nodes in specific trees.', - 'ru-ru': - 'Allow creating children under synonymized nodes in specific trees.', - 'es-es': - 'Allow creating children under synonymized nodes in specific trees.', - 'fr-fr': - 'Allow creating children under synonymized nodes in specific trees.', - 'uk-ua': - 'Allow creating children under synonymized nodes in specific trees.', - 'de-ch': - 'Allow creating children under synonymized nodes in specific trees.', - 'pt-br': - 'Allow creating children under synonymized nodes in specific trees.', }, allowSynonymizedGeologicTimePeriodChildren: { 'en-us': 'Allow children under synonymized Geologic Time Period nodes', From 0cd11cb73f0bc0ebaf51a5f7a4959386ff872b65 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Wed, 8 Oct 2025 13:04:09 -0400 Subject: [PATCH 053/115] removed `as unknown` casts --- .../frontend/js_src/lib/components/Preferences/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index a007f92428f..18711d20fce 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -37,10 +37,9 @@ import { useTopChild } from './useTopChild'; export type PreferenceType = keyof typeof preferenceInstances; -const preferenceInstances: IR> = { - user: userPreferences as unknown as BasePreferences, - collection: - collectionPreferences as unknown as BasePreferences, +const preferenceInstances: IR> = { + user: userPreferences, + collection: collectionPreferences, }; const preferenceDefinitions: IR = { From 665e6c752b6faca603d658da98405b08e70e3194 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 10 Oct 2025 16:25:04 -0400 Subject: [PATCH 054/115] consolidate doc links and merge catalog-number card --- .../lib/components/Preferences/index.tsx | 423 ++++++++++-------- .../js_src/lib/localization/preferences.ts | 2 +- 2 files changed, 241 insertions(+), 184 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 18711d20fce..7b7b667d3b3 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -11,6 +11,8 @@ import { useBooleanState } from '../../hooks/useBooleanState'; import { commonText } from '../../localization/common'; import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; +import { statsText } from '../../localization/stats'; +import { treeText } from '../../localization/tree'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; @@ -47,32 +49,24 @@ const preferenceDefinitions: IR = { collection: collectionPreferenceDefinitions, }; -const NAME_DOCS_MAP: Record = { - sp7_scope_table_picklists: - 'https://discourse.specifysoftware.org/t/picklists-in-specify-7/2562', - 'attachment.is_public_default': - 'https://discourse.specifysoftware.org/t/attachments-security-and-permissions/640', - showPreparationsTotal: - 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - refreshRate: - 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', - publishingOrganization: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', - collectionKey: - 'https://discourse.specifysoftware.org/t/specify-network-gbif-integration/2793', +type SubcategoryDocumentation = { + readonly href: string; + readonly label: LocalizedString | (() => LocalizedString); }; -const resolveCollectionDocumentHref = ( - category: string, - _subcategory: string, - name: string -): string | undefined => { - if (NAME_DOCS_MAP[name]) return NAME_DOCS_MAP[name]; - if (name.startsWith('sp7.allow_adding_child_to_synonymized_parent.')) - return 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4'; - if (category.startsWith('catalogNumber')) - return 'https://discourse.specifysoftware.org/t/catalog-number-inheritance/2859'; - return undefined; +const SUBCATEGORY_DOCS_MAP: Record> = { + treeManagement: { + synonymized: { + href: 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', + label: headerText.documentation, + }, + }, + statistics: { + appearance: { + href: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + label: headerText.documentation, + }, + }, }; type DocumentHrefResolver = @@ -85,7 +79,7 @@ type DocumentHrefResolver = const documentHrefResolvers: IR = { user: undefined, - collection: resolveCollectionDocumentHref, + collection: undefined, }; const collectionPreferencesPromise = Promise.all([ @@ -231,169 +225,232 @@ export function PreferencesContent({ const definitions = usePrefDefinitions(prefType); const preferences = preferenceInstances[prefType]; const resolveDocumentHref = documentHrefResolvers[prefType]; + const definitionsMap = React.useMemo( + () => new Map(definitions), + [definitions] + ); + + const renderSubCategory = React.useCallback( + ( + categoryKey: string, + subcategoryKey: string, + { + title, + description = undefined, + items, + }: { + readonly title: LocalizedString | (() => LocalizedString); + readonly description?: LocalizedString | (() => LocalizedString); + readonly items: readonly (readonly [string, PreferenceItem])[]; + }, + options: { readonly hideTitle?: boolean } = {} + ): JSX.Element => { + const subcategoryDoc = + SUBCATEGORY_DOCS_MAP[categoryKey]?.[subcategoryKey]; + const { hideTitle = false } = options; + + return ( +
+
+

+ {typeof title === 'function' ? title() : title} +

+
+ + items.forEach(([name]) => { + const definition = preferences.definition( + categoryKey as never, + subcategoryKey as never, + name as never + ); + preferences.set( + categoryKey as never, + subcategoryKey as never, + name as never, + definition.defaultValue as never + ); + }) + } + > + {commonText.reset()} + +
+
+ {subcategoryDoc !== undefined && ( +

+ + + +

+ )} + {description !== undefined && ( +

+ {typeof description === 'function' ? description() : description} +

+ )} + {items.map(([name, item]) => { + const canEdit = + !isReadOnly && + (item.visible !== 'protected' || + hasPermission('/preferences/user', 'edit_protected')); + const documentHref = resolveDocumentHref?.( + categoryKey, + subcategoryKey, + name + ); + const stackDocumentation = + prefType === 'collection' && documentHref !== undefined; + const props = { + className: ` + flex items-start gap-2 md:flex-row flex-col + ${canEdit ? '' : '!cursor-not-allowed'} + `, + key: name, + title: canEdit ? undefined : preferencesText.adminsOnlyPreference(), + }; + const children = ( + <> +
+

+ +

+ {(item.description !== undefined || + documentHref !== undefined) && ( +

+ {item.description !== undefined && ( + + )} + {documentHref !== undefined && ( + + {headerText.documentation()} + + )} +

+ )} +
+
+ + + +
+ + ); + return 'container' in item && item.container === 'div' ? ( +
{children}
+ ) : ( + + ); + })} +
+ ); + }, + [ + isReadOnly, + prefType, + preferences, + resolveDocumentHref, + ] + ); + return (
{definitions.map( ( [category, { title, description = undefined, subCategories }], index - ) => ( - - -

- {typeof title === 'function' ? title() : title} -

- {description !== undefined && ( -

- {typeof description === 'function' - ? description() - : description} -

- )} - {subCategories.map( - ([subcategory, { title, description = undefined, items }]) => ( -
-
-

- {typeof title === 'function' ? title() : title} -

-
- - items.forEach(([name]) => { - const definition = preferences.definition( - category as never, - subcategory as never, - name as never - ); - preferences.set( - category as never, - subcategory as never, - name as never, - definition.defaultValue as never - ); - }) - } - > - {commonText.reset()} - -
-
- {description !== undefined && ( -

- {typeof description === 'function' - ? description() - : description} -

- )} - {items.map(([name, item]) => { - const canEdit = - !isReadOnly && - (item.visible !== 'protected' || - hasPermission('/preferences/user', 'edit_protected')); - const documentHref = resolveDocumentHref?.( - category, - subcategory, - name - ); - const stackDocumentation = - prefType === 'collection' && documentHref !== undefined; - const props = { - className: ` - flex items-start gap-2 md:flex-row flex-col - ${canEdit ? '' : '!cursor-not-allowed'} - `, - key: name, - title: canEdit - ? undefined - : preferencesText.adminsOnlyPreference(), - }; - const children = ( - <> -
-

- -

- {(item.description !== undefined || - documentHref !== undefined) && ( -

- {item.description !== undefined && ( - - )} - {documentHref !== undefined && ( - - {headerText.documentation()} - - )} -

- )} -
-
- - - -
- - ); - return 'container' in item && item.container === 'div' ? ( -
{children}
- ) : ( - - ); - })} -
- ) - )} -
-
- ) + ) => { + if (prefType === 'collection' && category === 'catalogNumberParentInheritance') + return null; + + const isCatalogInheritance = + prefType === 'collection' && category === 'catalogNumberInheritance'; + const parentDefinition = isCatalogInheritance + ? definitionsMap.get('catalogNumberParentInheritance') ?? undefined + : undefined; + + return ( + + +

+ {typeof title === 'function' ? title() : title} +

+ {description !== undefined && ( +

+ {typeof description === 'function' + ? description() + : description} +

+ )} + {subCategories.map(([subcategory, data]) => + renderSubCategory(category, subcategory, data) + )} + {isCatalogInheritance && + parentDefinition?.subCategories.map(([subcategory, data]) => + renderSubCategory( + 'catalogNumberParentInheritance', + subcategory, + data, + { hideTitle: true } + ) + )} +
+
+ ); + } )}
); @@ -492,4 +549,4 @@ export function CollectionPreferencesWrapper(): JSX.Element | null { ); -} \ No newline at end of file +} diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 9c8e7c81d84..fc7c813b9a0 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -1292,7 +1292,7 @@ export const preferencesText = createDictionary({ }, catalogNumberInheritanceDescription: { 'en-us': - 'Configure whether sibling Collection Objects inherit catalog numbers from the primary record.', + 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', }, catalogNumberParentInheritanceDescription: { 'en-us': From a315d412440880a1d8f1873d8c2b56c401d15099 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 10 Oct 2025 16:38:39 -0400 Subject: [PATCH 055/115] removed unused imports --- specifyweb/frontend/js_src/lib/components/Preferences/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 7b7b667d3b3..394aae55d4d 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -11,8 +11,6 @@ import { useBooleanState } from '../../hooks/useBooleanState'; import { commonText } from '../../localization/common'; import { headerText } from '../../localization/header'; import { preferencesText } from '../../localization/preferences'; -import { statsText } from '../../localization/stats'; -import { treeText } from '../../localization/tree'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; From 85413e468438c853edf5674ef9c587b70633a99c Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 10 Oct 2025 16:49:48 -0400 Subject: [PATCH 056/115] function call --- .../frontend/js_src/lib/components/Preferences/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 394aae55d4d..c23aa4fac61 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -56,13 +56,13 @@ const SUBCATEGORY_DOCS_MAP: Record Date: Sat, 11 Oct 2025 11:18:11 -0400 Subject: [PATCH 057/115] render editor inline for User tools menu --- .../components/Header/userToolDefinitions.ts | 6 + .../lib/components/Preferences/index.tsx | 219 +++++++++++++++++- 2 files changed, 221 insertions(+), 4 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index 6855811b3b4..ef262b42e9f 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -57,6 +57,12 @@ const rawUserTools = ensure>>>()({ url: '/specify/user-preferences/', icon: icons.cog, }, + collectionPreferences: { + title: preferencesText.collectionPreferences(), + url: '/specify/collection-preferences/', + icon: icons.collection, + enabled: () => hasToolPermission('resources', 'update'), + }, schemaConfig: { title: schemaText.schemaConfig(), url: '/specify/schema-config/', diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index c23aa4fac61..aa15fd028c3 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -15,6 +15,7 @@ import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; import { Container, H2, Key } from '../Atoms'; +import { DataEntry } from '../Atoms/DataEntry'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; import { Form } from '../Atoms/Form'; @@ -22,6 +23,9 @@ import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; +import { AppResourceEditor } from '../AppResources/Editor'; +import { getScope, globalResourceKey } from '../AppResources/tree'; +import type { ScopedAppResourceDir } from '../AppResources/types'; import { hasPermission } from '../Permissions/helpers'; import { ProtectedTool } from '../Permissions/PermissionDenied'; import { PreferencesAside } from './Aside'; @@ -34,6 +38,16 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; +import { formatUrl } from '../Router/queryString'; +import { fetchResource, strictIdFromUrl } from '../DataModel/resource'; +import { serializeResource } from '../DataModel/serializers'; +import type { + SpAppResource, + SpAppResourceDir, + SpViewSetObj, +} from '../DataModel/types'; +import type { SerializedResource } from '../DataModel/helperTypes'; +import { userTypes } from '../PickLists/definitions'; export type PreferenceType = keyof typeof preferenceInstances; @@ -221,7 +235,8 @@ export function PreferencesContent({ }): JSX.Element { const isReadOnly = React.useContext(ReadOnlyContext); const definitions = usePrefDefinitions(prefType); - const preferences = preferenceInstances[prefType]; + const basePreferences = preferenceInstances[prefType]; + const preferences = React.useContext(basePreferences.Context) ?? basePreferences; const resolveDocumentHref = documentHrefResolvers[prefType]; const definitionsMap = React.useMemo( () => new Map(definitions), @@ -515,9 +530,7 @@ function Item({ function CollectionPreferences(): JSX.Element { return ( -
- -
+
); } @@ -548,3 +561,201 @@ export function CollectionPreferencesWrapper(): JSX.Element | null { ); } + +type ResourceWithData = { + readonly id: number; + readonly data: string | null; + readonly name: string; + readonly mimetype: string | null; + readonly metadata: string | null; +}; + +type LoadedCollectionPreferences = { + readonly resource: SerializedResource; + readonly directory: ScopedAppResourceDir; + readonly data: ResourceWithData; +}; + +const isAppResource = ( + resource: SerializedResource +): resource is SerializedResource => + resource._tableName === 'SpAppResource'; + +function CollectionPreferencesStandalone(): JSX.Element { + const navigate = useNavigate(); + const [state, setState] = React.useState( + undefined + ); + const [error, setError] = React.useState(undefined); + + const renderStatus = React.useCallback( + (body: React.ReactNode, role?: 'alert'): JSX.Element => ( + +

{preferencesText.collectionPreferences()}

+
+ {body} +
+
+ ), + [] + ); + + React.useEffect(() => { + let isMounted = true; + const load = async () => { + try { + const rawData = (await collectionPreferences.fetch()) as ResourceWithData; + const data: ResourceWithData = { + ...rawData, + data: rawData.data ?? '', + }; + if (!isMounted) return; + const resource = await fetchResource('SpAppResource', data.id); + if (!isMounted) return; + const directory = await resolveDirectory(resource); + if (!isMounted) return; + setState({ resource, directory, data }); + } catch (loadError) { + if (!isMounted) return; + setError(loadError); + } + }; + load(); + return () => { + isMounted = false; + }; + }, []); + + const handleClone = React.useCallback( + ( + clonedResource: SerializedResource, + cloneId: number | undefined + ) => { + const appResourceClone = isAppResource(clonedResource) + ? clonedResource + : undefined; + if (appResourceClone === undefined) return; + const directoryKey = + state === undefined + ? globalResourceKey + : getDirectoryKey(state.directory) ?? globalResourceKey; + navigate( + formatUrl('/specify/resources/app-resource/new/', { + directoryKey, + name: appResourceClone.name, + ...(appResourceClone.mimeType == null + ? {} + : { mimeType: appResourceClone.mimeType }), + clone: cloneId, + }) + ); + }, + [navigate, state] + ); + + if (error !== undefined && state === undefined) + return renderStatus( + 'Failed to open collection preferences. Try accessing them through App Resources.', + 'alert' + ); + + if (state === undefined) return renderStatus(commonText.loading()); + + return ( + + { + setState((previousState) => + previousState === undefined + ? previousState + : { + resource: + updatedResource as SerializedResource, + directory: updatedDirectory, + data: previousState.data, + } + ); + collectionPreferences + .fetch() + .then((rawData) => ({ + ...rawData, + data: rawData.data ?? '', + })) + .then((updatedData) => { + setState({ + resource: updatedResource as SerializedResource, + directory: updatedDirectory, + data: updatedData as ResourceWithData, + }); + }) + .catch((fetchError) => { + if (state === undefined) setError(fetchError); + }); + }} + > + {({ headerJsx, headerButtons, form, footer }): JSX.Element => ( + + + {headerJsx} + {headerButtons} + + {form} + {footer} + + )} + + + ); +} + +async function resolveDirectory( + resource: SerializedResource +): Promise { + const rawDirectory = resource.spAppResourceDir; + let directory: SerializedResource; + if (typeof rawDirectory === 'string') { + directory = await fetchResource( + 'SpAppResourceDir', + strictIdFromUrl(rawDirectory) + ); + } else if (typeof rawDirectory === 'object' && rawDirectory !== null) { + directory = serializeResource(rawDirectory); + } else { + throw new Error('Collection preferences resource is missing directory'); + } + return { + ...directory, + scope: getScope(directory), + }; +} + +function getDirectoryKey(directory: ScopedAppResourceDir): string | undefined { + if (directory.scope === 'global') return globalResourceKey; + if (directory.scope === 'discipline' && directory.discipline !== null) + return `discipline_${strictIdFromUrl(directory.discipline)}`; + if (directory.scope === 'collection' && directory.collection !== null) + return `collection_${strictIdFromUrl(directory.collection)}`; + if ( + directory.scope === 'userType' && + directory.collection !== null && + directory.userType !== null + ) { + const userTypeLabel = + userTypes.find( + (type) => type.toLowerCase() === directory.userType?.toLowerCase() + ) ?? directory.userType; + return `collection_${strictIdFromUrl(directory.collection)}_userType_${userTypeLabel}`; + } + if ( + directory.scope === 'user' && + directory.collection !== null && + directory.specifyUser !== null + ) + return `collection_${strictIdFromUrl(directory.collection)}_user_${strictIdFromUrl(directory.specifyUser)}`; + return undefined; +} From 88a62800659e47d702996913b5b749a39a8b436a Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 10 Oct 2025 20:54:14 +0000 Subject: [PATCH 058/115] Lint code with ESLint and Prettier Triggered by c69f079b8c6f12797890cc2450849d5e9d3d0711 on branch refs/heads/issue-7440 --- .../js_src/lib/components/Preferences/index.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index aa15fd028c3..03b8d54c50e 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -258,7 +258,7 @@ export function PreferencesContent({ }, options: { readonly hideTitle?: boolean } = {} ): JSX.Element => { - const subcategoryDoc = + const subcategoryDocument = SUBCATEGORY_DOCS_MAP[categoryKey]?.[subcategoryKey]; const { hideTitle = false } = options; @@ -269,9 +269,9 @@ export function PreferencesContent({ >

{typeof title === 'function' ? title() : title} @@ -298,14 +298,14 @@ export function PreferencesContent({

- {subcategoryDoc !== undefined && ( + {subcategoryDocument !== undefined && (

- + From 5bec699d79000f305211d4172992bcad30cc84d3 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sat, 11 Oct 2025 15:26:01 +0000 Subject: [PATCH 059/115] Lint code with ESLint and Prettier Triggered by 04c17881a15b18e607c5554491a25aed4f56ca2c on branch refs/heads/issue-7440 --- .../lib/components/Preferences/index.tsx | 198 ++++++++++-------- 1 file changed, 106 insertions(+), 92 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 03b8d54c50e..b6973374ae4 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -14,20 +14,30 @@ import { preferencesText } from '../../localization/preferences'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; +import { AppResourceEditor } from '../AppResources/Editor'; +import { getScope, globalResourceKey } from '../AppResources/tree'; +import type { ScopedAppResourceDir } from '../AppResources/types'; import { Container, H2, Key } from '../Atoms'; -import { DataEntry } from '../Atoms/DataEntry'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; +import { DataEntry } from '../Atoms/DataEntry'; import { Form } from '../Atoms/Form'; import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; +import type { SerializedResource } from '../DataModel/helperTypes'; +import { fetchResource, strictIdFromUrl } from '../DataModel/resource'; +import { serializeResource } from '../DataModel/serializers'; +import type { + SpAppResource, + SpAppResourceDir, + SpViewSetObj, +} from '../DataModel/types'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; -import { AppResourceEditor } from '../AppResources/Editor'; -import { getScope, globalResourceKey } from '../AppResources/tree'; -import type { ScopedAppResourceDir } from '../AppResources/types'; import { hasPermission } from '../Permissions/helpers'; import { ProtectedTool } from '../Permissions/PermissionDenied'; +import { userTypes } from '../PickLists/definitions'; +import { formatUrl } from '../Router/queryString'; import { PreferencesAside } from './Aside'; import type { BasePreferences } from './BasePreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; @@ -38,16 +48,6 @@ import type { GenericPreferences, PreferenceItem } from './types'; import { userPreferenceDefinitions } from './UserDefinitions'; import { userPreferences } from './userPreferences'; import { useTopChild } from './useTopChild'; -import { formatUrl } from '../Router/queryString'; -import { fetchResource, strictIdFromUrl } from '../DataModel/resource'; -import { serializeResource } from '../DataModel/serializers'; -import type { - SpAppResource, - SpAppResourceDir, - SpViewSetObj, -} from '../DataModel/types'; -import type { SerializedResource } from '../DataModel/helperTypes'; -import { userTypes } from '../PickLists/definitions'; export type PreferenceType = keyof typeof preferenceInstances; @@ -66,7 +66,10 @@ type SubcategoryDocumentation = { readonly label: LocalizedString | (() => LocalizedString); }; -const SUBCATEGORY_DOCS_MAP: Record> = { +const SUBCATEGORY_DOCS_MAP: Record< + string, + Record +> = { treeManagement: { synonymized: { href: 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', @@ -83,10 +86,10 @@ const SUBCATEGORY_DOCS_MAP: Record string | undefined) + category: string, + subcategory: string, + name: string + ) => string | undefined) | undefined; const documentHrefResolvers: IR = { @@ -236,7 +239,8 @@ export function PreferencesContent({ const isReadOnly = React.useContext(ReadOnlyContext); const definitions = usePrefDefinitions(prefType); const basePreferences = preferenceInstances[prefType]; - const preferences = React.useContext(basePreferences.Context) ?? basePreferences; + const preferences = + React.useContext(basePreferences.Context) ?? basePreferences; const resolveDocumentHref = documentHrefResolvers[prefType]; const definitionsMap = React.useMemo( () => new Map(definitions), @@ -316,48 +320,52 @@ export function PreferencesContent({ {typeof description === 'function' ? description() : description}

)} - {items.map(([name, item]) => { - const canEdit = - !isReadOnly && - (item.visible !== 'protected' || - hasPermission('/preferences/user', 'edit_protected')); - const documentHref = resolveDocumentHref?.( - categoryKey, - subcategoryKey, - name - ); - const stackDocumentation = - prefType === 'collection' && documentHref !== undefined; - const props = { - className: ` + {items.map(([name, item]) => { + const canEdit = + !isReadOnly && + (item.visible !== 'protected' || + hasPermission('/preferences/user', 'edit_protected')); + const documentHref = resolveDocumentHref?.( + categoryKey, + subcategoryKey, + name + ); + const stackDocumentation = + prefType === 'collection' && documentHref !== undefined; + const props = { + className: ` flex items-start gap-2 md:flex-row flex-col ${canEdit ? '' : '!cursor-not-allowed'} `, - key: name, - title: canEdit ? undefined : preferencesText.adminsOnlyPreference(), - }; - const children = ( - <> -
-

+

+

- -

- {(item.description !== undefined || - documentHref !== undefined) && ( + > + +

+ {(item.description !== undefined || + documentHref !== undefined) && (

{item.description !== undefined && ( @@ -371,7 +379,9 @@ export function PreferencesContent({ )} {documentHref !== undefined && ( {headerText.documentation()} @@ -379,40 +389,35 @@ export function PreferencesContent({ )}

)} -
-
+
- - - -
- - ); - return 'container' in item && item.container === 'div' ? ( -
{children}
- ) : ( - - ); - })} + > + + + +
+ + ); + return 'container' in item && item.container === 'div' ? ( +
{children}
+ ) : ( + + ); + })} ); }, - [ - isReadOnly, - prefType, - preferences, - resolveDocumentHref, - ] + [isReadOnly, prefType, preferences, resolveDocumentHref] ); return ( @@ -422,13 +427,18 @@ export function PreferencesContent({ [category, { title, description = undefined, subCategories }], index ) => { - if (prefType === 'collection' && category === 'catalogNumberParentInheritance') + if ( + prefType === 'collection' && + category === 'catalogNumberParentInheritance' + ) return null; const isCatalogInheritance = - prefType === 'collection' && category === 'catalogNumberInheritance'; + prefType === 'collection' && + category === 'catalogNumberInheritance'; const parentDefinition = isCatalogInheritance - ? definitionsMap.get('catalogNumberParentInheritance') ?? undefined + ? (definitionsMap.get('catalogNumberParentInheritance') ?? + undefined) : undefined; return ( @@ -583,16 +593,19 @@ const isAppResource = ( function CollectionPreferencesStandalone(): JSX.Element { const navigate = useNavigate(); - const [state, setState] = React.useState( - undefined - ); + const [state, setState] = React.useState< + LoadedCollectionPreferences | undefined + >(undefined); const [error, setError] = React.useState(undefined); const renderStatus = React.useCallback( (body: React.ReactNode, role?: 'alert'): JSX.Element => (

{preferencesText.collectionPreferences()}

-
+
{body}
@@ -604,7 +617,8 @@ function CollectionPreferencesStandalone(): JSX.Element { let isMounted = true; const load = async () => { try { - const rawData = (await collectionPreferences.fetch()) as ResourceWithData; + const rawData = + (await collectionPreferences.fetch()) as ResourceWithData; const data: ResourceWithData = { ...rawData, data: rawData.data ?? '', @@ -638,7 +652,7 @@ function CollectionPreferencesStandalone(): JSX.Element { const directoryKey = state === undefined ? globalResourceKey - : getDirectoryKey(state.directory) ?? globalResourceKey; + : (getDirectoryKey(state.directory) ?? globalResourceKey); navigate( formatUrl('/specify/resources/app-resource/new/', { directoryKey, From 18ae49a7e02cd3ca0e851e9afadb2c8e3772be98 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 16 Oct 2025 16:31:40 -0400 Subject: [PATCH 060/115] Modularize preferences localization into smaller files --- .../lib/localization/preferences.behavior.ts | 731 +++++++++ .../lib/localization/preferences.content.ts | 700 ++++++++ .../js_src/lib/localization/preferences.ts | 1433 +---------------- 3 files changed, 1446 insertions(+), 1418 deletions(-) create mode 100644 specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts create mode 100644 specifyweb/frontend/js_src/lib/localization/preferences.content.ts diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts new file mode 100644 index 00000000000..beb694d64ec --- /dev/null +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -0,0 +1,731 @@ +/** + * Localization strings for behavioral and advanced preferences. + * + * @module + */ + +export const preferencesBehaviorDict = { + altClickToSupressNewTab: { + 'en-us': + '{altKeyName:string}+Click to suppress new tab', + 'ru-ru': + '{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку', + 'es-es': + '{altKeyName:string}+Haga clic en para suprimir la nueva pestaña', + 'fr-fr': + '{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet', + 'uk-ua': + '{altKeyName:string}+Натисніть , щоб закрити нову вкладку', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken', + 'pt-br': + '{altKeyName:string}+Clique em para suprimir a nova guia', + }, + altClickToSupressNewTabDescription: { + 'en-us': + '{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.', + 'ru-ru': + '{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.', + 'es-es': + '{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.', + 'fr-fr': 'Utiliser le sélecteur de mois accessible.', + 'uk-ua': + '{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.', + 'pt-br': + '{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.', + }, + makeFormDialogsModal: { + 'en-us': 'Make form dialogs gray out the background', + 'ru-ru': 'Сделать фон диалоговых окон серым', + 'es-es': + 'Hacer que los cuadros de diálogo del formulario tengan el fondo en gris', + 'fr-fr': + "Rendre les boîtes de dialogue de formulaire grisées sur l'arrière-plan", + 'uk-ua': 'Зробіть діалогові вікна форми сірими фоном', + 'de-ch': 'Den Hintergrund von Formulardialogen ausgrauen', + 'pt-br': + 'Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado', + }, + autoScrollTree: { + 'en-us': 'Auto scroll tree to focused node', + 'ru-ru': 'Автоматическая прокрутка дерева к выбранному узлу', + 'es-es': 'Desplazamiento automático del árbol al nodo enfocado', + 'fr-fr': 'Arbre de défilement automatique vers le nœud ciblé', + 'uk-ua': 'Автоматичне прокручування дерева до виділеного вузла', + 'de-ch': 'Automatisches Scrollen des Baums zum fokussierten Knoten', + 'pt-br': 'Rolagem automática da árvore para o nó em foco', + }, + sortByField: { + 'en-us': 'Order By Field', + 'de-ch': 'Nach Feld sortieren', + 'es-es': 'Ordenar por campo', + 'fr-fr': 'Trier par champ', + 'pt-br': 'Ordenar por campo', + 'ru-ru': 'Сортировать по полю', + 'uk-ua': 'Сортувати за полем', + }, + lineWrap: { + 'en-us': 'Line wrap', + 'ru-ru': 'Перенос строки', + 'es-es': 'Ajuste de línea', + 'fr-fr': 'Retour à la ligne', + 'uk-ua': 'Обтікання лініями', + 'de-ch': 'Zeilenumbruch', + 'pt-br': 'Quebra de linha', + }, + indentSize: { + 'en-us': 'Indent size', + 'ru-ru': 'Размер отступа', + 'es-es': 'Tamaño de sangría', + 'fr-fr': 'Taille du retrait', + 'uk-ua': 'Розмір відступу', + 'de-ch': 'Einzugsgröße', + 'pt-br': 'Tamanho do recuo', + }, + indentWithTab: { + 'en-us': 'Indent with Tab', + 'ru-ru': 'Отступ с помощью Tab', + 'es-es': 'Sangría con Tab', + 'fr-fr': 'Indenter avec Tabulation', + 'uk-ua': 'Відступ із Tab', + 'de-ch': 'Einrücken mit Tab', + 'pt-br': 'Recuo com Tab', + }, + formHeaderFormat: { + 'en-us': 'Form header format', + 'ru-ru': 'Формат заголовка формы', + 'es-es': 'Formato del encabezado del formulario', + 'fr-fr': "Format d'en-tête de formulaire", + 'uk-ua': 'Формат заголовка форми', + 'de-ch': 'Formularkopfformat', + 'pt-br': 'Formato do cabeçalho do formulário', + }, + iconAndTableName: { + 'en-us': 'Icon and table name', + 'ru-ru': 'Значок и название таблицы', + 'es-es': 'Icono y nombre de la tabla', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Значок і назва таблиці', + 'de-ch': 'Symbol und Tabellenname', + 'pt-br': 'Ícone e nome da tabela', + }, + tableIcon: { + 'en-us': 'Table icon', + 'ru-ru': 'Значок таблицы', + 'es-es': 'Icono de tabla', + 'fr-fr': 'Icône de tableau', + 'uk-ua': 'Значок таблиці', + 'de-ch': 'Tabellensymbol', + 'pt-br': 'Ícone de tabela', + }, + maxHeight: { + 'en-us': 'Max height', + 'ru-ru': 'Максимальная высота', + 'es-es': 'Altura máxima', + 'fr-fr': 'hauteur maximum', + 'uk-ua': 'Максимальна висота', + 'de-ch': 'Maximale Höhe', + 'pt-br': 'Altura máxima', + }, + autoComplete: { + 'en-us': 'Auto complete', + 'ru-ru': 'Автозаполнение', + 'es-es': 'Autocompletar', + 'fr-fr': + "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць', + 'de-ch': 'Autovervollständigung', + 'pt-br': 'Preenchimento automático', + }, + searchCaseSensitive: { + 'en-us': 'Case-sensitive search', + 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Recherche sensible à la casse', + 'uk-ua': 'Пошук з урахуванням регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'ru-ru': 'Поиск с учетом регистра', + 'pt-br': 'Pesquisa com diferenciação entre maiúsculas e minúsculas', + }, + searchField: { + 'en-us': 'Search Field', + 'ru-ru': 'Поле поиска', + 'es-es': 'Campo de búsqueda', + 'fr-fr': 'Champ de recherche', + 'uk-ua': 'Поле пошуку', + 'de-ch': 'Suchfeld', + 'pt-br': 'Campo de pesquisa', + }, + createInteractions: { + 'en-us': 'Creating an interaction', + 'ru-ru': 'Создание взаимодействия', + 'es-es': 'Creando una interacción', + 'fr-fr': 'Créer une interaction', + 'uk-ua': 'Створення взаємодії', + 'de-ch': 'Erstellen einer Interaktion', + 'pt-br': 'Criando uma interação', + }, + useSpaceAsDelimiter: { + 'en-us': 'Use space as delimiter', + 'ru-ru': 'Используйте пробел в качестве разделителя', + 'es-es': 'Utilice el espacio como delimitador', + 'fr-fr': "Utiliser l'espace comme délimiteur", + 'uk-ua': 'Використовуйте пробіл як роздільник', + 'de-ch': 'Leerzeichen als Trennzeichen verwenden', + 'pt-br': 'Use espaço como delimitador', + }, + useCommaAsDelimiter: { + 'en-us': 'Use comma as delimiter', + 'ru-ru': 'Используйте запятую в качестве разделителя', + 'es-es': 'Utilice la coma como delimitador', + 'fr-fr': 'Utiliser la virgule comme délimiteur', + 'uk-ua': 'Використовуйте кому як роздільник', + 'de-ch': 'Verwenden Sie Kommas als Trennzeichen', + 'pt-br': 'Use vírgula como delimitador', + }, + useNewLineAsDelimiter: { + 'en-us': 'Use new line as delimiter', + 'ru-ru': 'Использовать новую строку в качестве разделителя', + 'es-es': 'Utilice nueva línea como delimitador', + 'fr-fr': 'Utiliser une nouvelle ligne comme délimiteur', + 'uk-ua': 'Використовуйте новий рядок як роздільник', + 'de-ch': 'Neue Zeile als Trennzeichen verwenden', + 'pt-br': 'Use nova linha como delimitador', + }, + useCustomDelimiters: { + 'en-us': 'Use custom delimiters', + 'ru-ru': 'Используйте пользовательские разделители', + 'es-es': 'Utilice delimitadores personalizados', + 'fr-fr': 'Utiliser des délimiteurs personnalisés', + 'uk-ua': 'Використовуйте спеціальні роздільники', + 'de-ch': 'Benutzerdefinierte Trennzeichen verwenden', + 'pt-br': 'Use delimitadores personalizados', + }, + useCustomDelimitersDescription: { + 'en-us': + 'A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.', + 'ru-ru': + 'Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.', + 'es-es': + 'Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.', + 'fr-fr': + 'Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.', + 'uk-ua': + 'Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.', + 'de-ch': + 'Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.', + 'pt-br': + 'Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.', + }, + detectAutomaticallyDescription: { + 'en-us': 'Detect automatically based on catalog number format.', + 'ru-ru': 'Автоматическое определение на основе формата каталожного номера.', + 'es-es': + 'Detectar automáticamente según el formato del número de catálogo.', + 'fr-fr': + 'Détecter automatiquement en fonction du format du numéro de catalogue.', + 'uk-ua': 'Визначати автоматично на основі формату номера каталогу.', + 'de-ch': 'Automatische Erkennung basierend auf dem Katalognummernformat.', + 'pt-br': + 'Detectar automaticamente com base no formato do número de catálogo.', + }, + use: { + comment: 'Verb', + 'en-us': 'Use', + 'ru-ru': 'Использовать', + 'es-es': 'Usar', + 'fr-fr': 'Utiliser', + 'uk-ua': 'використання', + 'de-ch': 'Verwenden', + 'pt-br': 'Usar', + }, + dontUse: { + 'en-us': 'Don’t use', + 'ru-ru': 'Не использовать', + 'es-es': 'No utilizar', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Nicht verwenden', + 'pt-br': 'Não use', + }, + position: { + 'en-us': 'Position', + 'es-es': 'Posición', + 'fr-fr': 'Position', + 'ru-ru': 'Позиция', + 'uk-ua': 'Позиція', + 'de-ch': 'Position', + 'pt-br': 'Posição', + }, + top: { + 'en-us': 'Top', + 'es-es': 'Arriba', + 'fr-fr': 'Haut', + 'ru-ru': 'Вершина', + 'uk-ua': 'Топ', + 'de-ch': 'Spitze', + 'pt-br': 'Principal', + }, + bottom: { + 'en-us': 'Bottom', + 'es-es': 'Abajo', + 'ru-ru': 'Нижний', + 'uk-ua': 'Дно', + 'de-ch': 'Unten', + 'fr-fr': 'Bas', + 'pt-br': 'Fundo', + }, + left: { + 'en-us': 'Left', + 'es-es': 'Izquierda', + 'fr-fr': 'Gauche', + 'ru-ru': 'Левый', + 'uk-ua': 'Ліворуч', + 'de-ch': 'Links', + 'pt-br': 'Esquerda', + }, + right: { + 'en-us': 'Right', + 'es-es': 'Bien', + 'fr-fr': 'Droite', + 'ru-ru': 'Верно', + 'uk-ua': 'правильно', + 'de-ch': 'Rechts', + 'pt-br': 'Certo', + }, + showUnsavedIndicator: { + 'en-us': 'Show unsaved changes indicator', + 'ru-ru': 'Показать индикатор несохраненных изменений', + 'es-es': 'Mostrar indicador de cambios no guardados', + 'fr-fr': "Afficher l'indicateur de modifications non enregistrées", + 'uk-ua': 'Показати індикатор незбережених змін', + 'de-ch': 'Indikator für nicht gespeicherte Änderungen anzeigen', + 'pt-br': 'Mostrar indicador de alterações não salvas', + }, + showUnsavedIndicatorDescription: { + 'en-us': + 'Show an "*" in the tab title when there are unsaved changes in the current tab.', + 'es-es': + 'Mostrar un "*" en el título de la pestaña cuando haya cambios sin guardar en la pestaña actual.', + 'fr-fr': + "Afficher un \"*\" dans le titre de l'onglet lorsqu'il y a des modifications non enregistrées dans l'onglet actuel.", + 'ru-ru': + 'Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.', + 'uk-ua': + 'Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.', + 'de-ch': + 'Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.', + 'pt-br': + 'Exibir um "*" no título da aba quando houver alterações não salvas na aba atual.', + }, + autoPopulateDescription: { + 'en-us': + 'Auto populate the merged record with values from duplicates when opening the merging dialog.', + 'ru-ru': + 'Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.', + 'de-ch': + 'Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.', + 'es-es': + 'Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.', + 'fr-fr': + "Remplir automatiquement l'enregistrement fusionné avec les valeurs des doublons lors de l'ouverture de la boîte de dialogue de fusion.", + 'uk-ua': + 'Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.', + 'pt-br': + 'Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.', + }, + autoCreateVariants: { + 'en-us': 'Automatically create {agentVariantTable:string} records', + 'ru-ru': 'Автоматически создавать записи {agentVariantTable:string}', + 'de-ch': '{agentVariantTable:string}-Datensätze automatisch erstellen', + 'es-es': 'Crear automáticamente registros {agentVariantTable:string}', + 'fr-fr': + 'Créer automatiquement des enregistrements {agentVariantTable:string}', + 'uk-ua': 'Автоматично створювати записи {agentVariantTable:string}', + 'pt-br': 'Criar automaticamente registros {agentVariantTable:string}', + }, + autoCreateVariantsDescription: { + 'en-us': + 'When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.', + 'ru-ru': + 'При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.', + 'de-ch': + 'Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.', + 'es-es': + 'Al fusionar agentes, se crean automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.', + 'fr-fr': + "Lors de la fusion d'agents, créez automatiquement des enregistrements {agentVariantTable:string} en fonction des variations du prénom/nom.", + 'uk-ua': + 'Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.', + 'pt-br': + 'Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.', + }, + collectionPreferences: { + 'en-us': 'Collection Preferences', + 'de-ch': 'Sammlungseinstellungen', + 'es-es': 'Preferencias de colección', + 'fr-fr': 'Personnalisation', + 'ru-ru': 'Настройки коллекции', + 'uk-ua': 'Налаштування', + 'pt-br': 'Preferências de coleção', + }, + rememberDialogSizes: { + 'en-us': 'Remember dialog window sizes', + 'ru-ru': 'Запомните размеры диалоговых окон', + 'es-es': 'Recordar los tamaños de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les tailles des fenêtres de dialogue', + 'uk-ua': "Запам'ятайте розміри діалогових вікон", + 'de-ch': 'Dialogfenstergrößen merken', + 'pt-br': 'Lembrar tamanhos de janelas de diálogo', + }, + rememberDialogPositions: { + 'en-us': 'Remember dialog window positions', + 'ru-ru': 'Запомнить позиции диалоговых окон', + 'es-es': 'Recordar las posiciones de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les positions des fenêtres de dialogue', + 'uk-ua': "Запам'ятовуйте положення діалогового вікна", + 'de-ch': 'Dialogfensterpositionen merken', + 'pt-br': 'Lembrar posições da janela de diálogo', + }, + autoPlayMedia: { + 'en-us': 'Automatically play media', + 'ru-ru': 'Автоматически воспроизводить медиа', + 'es-es': 'Reproducir automáticamente medios', + 'fr-fr': 'Lire automatiquement les médias', + 'uk-ua': 'Автоматичне відтворення медіа', + 'de-ch': 'Medien automatisch abspielen', + 'pt-br': 'Reproduzir mídia automaticamente', + }, + useCustomTooltips: { + 'en-us': 'Use modern tooltips', + 'ru-ru': 'Используйте современные подсказки', + 'es-es': 'Utilice información sobre herramientas moderna', + 'fr-fr': 'Utiliser des info-bulles modernes', + 'uk-ua': 'Використовуйте сучасні підказки', + 'de-ch': 'Verwenden Sie moderne Tooltips', + 'pt-br': 'Use dicas de ferramentas modernas', + }, + alwaysUseQueryBuilder: { + 'en-us': 'Always use query builder search inside of search form', + 'de-ch': + 'Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche', + 'es-es': + 'Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda', + 'fr-fr': + 'Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche', + 'ru-ru': 'Всегда используйте конструктор запросов внутри формы поиска.', + 'uk-ua': 'Завжди використовуйте пошук конструктора запитів у формі пошуку', + 'pt-br': + 'Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa', + }, + localizeResourceNames: { + 'en-us': 'Localize the names of recognized app resources', + 'de-ch': 'Lokalisieren Sie die Namen erkannter App-Ressourcen', + 'es-es': + 'Localizar los nombres de los recursos de aplicaciones reconocidos', + 'fr-fr': "Localiser les noms des ressources d'application reconnues", + 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения', + 'uk-ua': 'Локалізувати назви розпізнаних ресурсів програми', + 'pt-br': 'Localize os nomes dos recursos de aplicativos reconhecidos', + }, + splitLongXml: { + 'en-us': 'Split long lines of XML into multiple lines', + 'de-ch': 'Teilen Sie lange XML-Zeilen in mehrere Zeilen auf', + 'es-es': 'Dividir líneas largas de XML en varias líneas', + 'fr-fr': 'Diviser les longues lignes de XML en plusieurs lignes', + 'ru-ru': 'Разделить длинные строки XML на несколько строк', + 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', + 'pt-br': 'Dividir longas linhas de XML em várias linhas', + }, + url: { + 'en-us': 'URL', + 'de-ch': 'URL', + 'es-es': 'URL', + 'fr-fr': 'URL', + 'uk-ua': 'URL', + 'ru-ru': 'URL', + 'pt-br': 'URL', + }, + pickAttachment: { + 'en-us': 'Pick an attachment', + 'es-es': 'Elige un archivo adjunto', + 'fr-fr': 'Choisissez une pièce jointe', + 'ru-ru': 'Выберите вложение', + 'uk-ua': 'Виберіть вкладення', + 'de-ch': 'Wählen Sie einen Anhang', + 'pt-br': 'Escolha um anexo', + }, + attachmentFailed: { + 'en-us': 'The attachment failed to load.', + 'de-ch': 'Der Anhang konnte nicht geladen werden.', + 'es-es': 'No se pudo cargar el archivo adjunto.', + 'fr-fr': "La pièce jointe n'a pas pu être chargée.", + 'ru-ru': 'Не удалось загрузить вложение.', + 'uk-ua': 'Не вдалося завантажити вкладений файл.', + 'pt-br': 'O anexo não pôde ser carregado.', + }, + pickImage: { + 'en-us': 'Pick an image', + 'de-ch': 'Wählen Sie ein Bild aus', + 'es-es': 'Elige una imagen', + 'fr-fr': 'Choisissez une image', + 'ru-ru': 'Выберите изображение', + 'uk-ua': 'Виберіть зображення', + 'pt-br': 'Escolha uma imagem', + }, + customLogo: { + 'en-us': 'Expanded Image URL', + 'de-ch': 'Erweiterte Bild-URL', + 'es-es': 'URL de imagen expandida', + 'fr-fr': "URL de l'image étendue", + 'ru-ru': 'URL-адрес развернутого изображения', + 'uk-ua': 'Розширена URL-адреса зображення', + 'pt-br': 'URL da imagem expandida', + }, + customLogoCollapsed: { + 'en-us': 'Collapsed Image URL', + 'de-ch': 'URL des minimierten Bildes', + 'es-es': 'URL de imagen contraída', + 'fr-fr': "URL de l'image réduite", + 'ru-ru': 'URL-адрес свернутого изображения', + 'uk-ua': 'URL-адреса згорнутого зображення', + 'pt-br': 'URL da imagem recolhida', + }, + customLogoDescription: { + 'en-us': + 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', + 'de-ch': + 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', + 'es-es': + 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', + 'fr-fr': + 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', + 'ru-ru': + 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', + 'uk-ua': + 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', + 'pt-br': + 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', + }, + showLineNumber: { + 'en-us': 'Show query result line number', + 'de-ch': 'Zeilennummer des Abfrageergebnisses anzeigen', + 'es-es': 'Mostrar el número de línea del resultado de la consulta', + 'fr-fr': 'Afficher le numéro de ligne du résultat de la requête', + 'ru-ru': 'Показать номер строки результата запроса', + 'uk-ua': 'Показати номер рядка результату запиту', + 'pt-br': 'Mostrar número da linha do resultado da consulta', + }, + saveButtonColor: { + 'en-us': 'Save button color', + 'de-ch': 'Farbe der Schaltfläche „Speichern“', + 'es-es': 'Guardar color del botón', + 'fr-fr': 'Couleur du bouton Enregistrer', + 'ru-ru': 'Сохранить цвет кнопки', + 'uk-ua': 'Зберегти колір кнопки', + 'pt-br': 'Cor do botão Salvar', + }, + secondaryButtonColor: { + 'en-us': 'Secondary button color', + 'es-es': 'Color del botón secundario', + 'fr-fr': 'Couleur du bouton secondaire', + 'ru-ru': 'Цвет вторичной кнопки', + 'uk-ua': 'Колір вторинної кнопки', + 'de-ch': 'Sekundäre Schaltflächenfarbe', + 'pt-br': 'Cor do botão secundário', + }, + secondaryLightButtonColor: { + 'en-us': 'Secondary light button color', + 'de-ch': 'Farbe der sekundären Lichttaste', + 'es-es': 'Color del botón de luz secundaria', + 'fr-fr': 'Couleur du bouton lumineux secondaire', + 'ru-ru': 'Цвет кнопки дополнительного освещения', + 'uk-ua': 'Колір вторинної світлової кнопки', + 'pt-br': 'Cor do botão de luz secundária', + }, + dangerButtonColor: { + 'en-us': 'Danger button color', + 'de-ch': 'Farbe der Gefahrenschaltfläche', + 'es-es': 'Color del botón de peligro', + 'fr-fr': 'Couleur du bouton de danger', + 'ru-ru': 'Цвет кнопки «Опасность»', + 'uk-ua': 'Колір кнопки небезпеки', + 'pt-br': 'Cor do botão de perigo', + }, + infoButtonColor: { + 'en-us': 'Info button color', + 'de-ch': 'Farbe der Info-Schaltfläche', + 'es-es': 'Color del botón de información', + 'fr-fr': "Couleur du bouton d'information", + 'ru-ru': 'Цвет кнопки информации', + 'uk-ua': 'Колір інформаційної кнопки', + 'pt-br': 'Cor do botão de informações', + }, + warningButtonColor: { + 'en-us': 'Warning button color', + 'de-ch': 'Farbe der Warnschaltfläche', + 'es-es': 'Color del botón de advertencia', + 'fr-fr': "Couleur du bouton d'avertissement", + 'ru-ru': 'Цвет кнопки предупреждения', + 'uk-ua': 'Колір кнопки попередження', + 'pt-br': 'Cor do botão de aviso', + }, + successButtonColor: { + 'en-us': 'Success button color', + 'de-ch': 'Farbe der Schaltfläche „Erfolg“', + 'es-es': 'Color del botón de éxito', + 'fr-fr': 'Couleur du bouton de réussite', + 'ru-ru': 'Цвет кнопки «Успех»', + 'uk-ua': 'Колір кнопки успіху', + 'pt-br': 'Cor do botão de sucesso', + }, + openAsReadOnly: { + 'en-us': 'Open all records in read-only mode', + 'de-ch': 'Alle Datensätze im schreibgeschützten Modus öffnen', + 'es-es': 'Abrir todos los registros en modo de solo lectura', + 'fr-fr': 'Ouvrir tous les enregistrements en mode lecture seule', + 'ru-ru': 'Открыть все записи в режиме только для чтения', + 'uk-ua': 'Відкрити всі записи в режимі лише для читання', + 'pt-br': 'Abra todos os registros no modo somente leitura', + }, + displayBasicView: { + 'en-us': 'Display basic view', + 'de-ch': 'Basisansicht anzeigen', + 'es-es': 'Mostrar vista básica', + 'fr-fr': 'Afficher la vue de base', + 'ru-ru': 'Отобразить базовый вид', + 'uk-ua': 'Відобразити базовий вигляд', + 'pt-br': 'Exibir visualização básica', + }, + showComparisonOperatorsForString: { + 'en-us': 'Show comparison operators for text-based fields', + 'de-ch': 'Vergleichsoperatoren für textbasierte Felder anzeigen', + 'es-es': 'Mostrar operadores de comparación para campos basados en texto', + 'fr-fr': 'Afficher les opérateurs de comparaison pour les champs textuels', + 'pt-br': 'Mostrar operadores de comparação para campos baseados em texto', + 'ru-ru': 'Показать операторы сравнения для текстовых полей', + 'uk-ua': 'Показати оператори порівняння для текстових полів', + }, + showComparisonOperatorsDescription: { + 'en-us': + 'Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to', + 'de-ch': + 'Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich', + 'es-es': + 'Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que', + 'fr-fr': + "Permet d'appliquer les filtres suivants aux champs de texte : Supérieur à, Inférieur à, Supérieur ou égal à et Inférieur ou égal à", + 'pt-br': + 'Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a', + 'ru-ru': + 'Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».', + 'uk-ua': + 'Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»', + }, + basicView: { + 'en-us': 'Basic view', + 'de-ch': 'Basisansicht', + 'es-es': 'Vista básica', + 'fr-fr': 'Vue de base', + 'ru-ru': 'Базовый вид', + 'uk-ua': 'Основний вигляд', + 'pt-br': 'Visão básica', + }, + detailedView: { + 'en-us': 'Detailed view', + 'de-ch': 'Detailansicht', + 'es-es': 'Vista detallada', + 'fr-fr': 'Vue détaillée', + 'ru-ru': 'Подробный вид', + 'uk-ua': 'Детальний вигляд', + 'pt-br': 'Visão detalhada', + }, + attachmentPreviewMode: { + 'en-us': 'Attachment preview mode', + 'de-ch': 'Anhangsvorschaumodus', + 'es-es': 'Modo de vista previa de archivos adjuntos', + 'fr-fr': "Mode d'aperçu des pièces jointes", + 'ru-ru': 'Режим предварительного просмотра вложений', + 'uk-ua': 'Режим попереднього перегляду вкладених файлів', + 'pt-br': 'Modo de visualização de anexos', + }, + fullResolution: { + 'en-us': 'Full Resolution', + 'de-ch': 'Volle Auflösung', + 'es-es': 'Resolución completa', + 'fr-fr': 'Pleine résolution', + 'ru-ru': 'Полное разрешение', + 'uk-ua': 'Повна роздільна здатність', + 'pt-br': 'Resolução completa', + }, + thumbnail: { + 'en-us': 'Thumbnail', + 'de-ch': 'Miniaturansicht', + 'es-es': 'Uña del pulgar', + 'fr-fr': 'Vignette', + 'ru-ru': 'Миниатюра', + 'uk-ua': 'Мініатюра', + 'pt-br': 'Miniatura', + }, + addSearchBarHomePage: { + 'en-us': 'Add Search Bar on home page', + 'de-ch': 'Suchleiste auf der Startseite hinzufügen', + 'es-es': 'Agregar barra de búsqueda en la página de inicio', + 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", + 'ru-ru': 'Добавить панель поиска на домашнюю страницу', + 'uk-ua': 'Додайте рядок пошуку на головну сторінку', + 'pt-br': 'Adicionar barra de pesquisa na página inicial', + }, + inheritanceCatNumberPref: { + 'en-us': + 'Enable the inheritance of the primary catalog number to its empty siblings.', + 'de-ch': + 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', + 'es-es': + 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', + 'fr-fr': + "Activer l'héritage du numéro de catalogue principal à ses frères vides.", + 'pt-br': + 'Habilitar a herança do número de catálogo primário para seus irmãos vazios.', + 'ru-ru': + 'Включить наследование основного каталожного номера его пустыми родственными номерами.', + 'uk-ua': + 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', + }, + inheritanceCatNumberParentCOPref: { + 'en-us': + 'Enable the inheritance of the parent catalog number to its empty children.', + 'de-ch': + 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.', + 'es-es': + 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', + 'fr-fr': + "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", + 'pt-br': + 'Habilita a herança do número do catálogo pai para seus filhos vazios.', + 'ru-ru': + 'Включить наследование родительского каталожного номера его пустыми дочерними элементами.', + 'uk-ua': + 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', + }, + uniqueCatNumberAcrossCompAndCo: { + 'en-us': + 'Catalog Number field need to be unique across Component and CO tables', + 'de-ch': + 'Das Feld „Katalognummer“ muss in allen Komponenten- und CO-Tabellen eindeutig sein', + 'es-es': + 'El campo Número de catálogo debe ser único en las tablas de componentes y CO', + 'fr-fr': + 'Le champ Numéro de catalogue doit être unique dans les tables Composant et CO', + 'pt-br': + 'O campo Número de catálogo precisa ser exclusivo nas tabelas Componente e CO', + 'ru-ru': + 'Поле «Номер каталога» должно быть уникальным в таблицах «Компонент» и «CO».', + 'uk-ua': + 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO».', + }, +} as const; + +export default preferencesBehaviorDict; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts new file mode 100644 index 00000000000..aa09742e5ff --- /dev/null +++ b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts @@ -0,0 +1,700 @@ +/** + * Localization strings for content and asset preferences. + * + * @module + */ + +export const preferencesContentDict = { + content: { + 'en-us': 'Content', + 'ru-ru': 'Содержание', + 'es-es': 'Contenido', + 'fr-fr': 'Contenu', + 'uk-ua': 'Зміст', + 'de-ch': 'Inhalt', + 'pt-br': 'Contente', + }, + defaultImage: { + 'en-us': 'Specify Logo', + 'ru-ru': 'Укажите логотип', + 'es-es': 'Especificar logotipo', + 'fr-fr': 'Spécifier le logo', + 'uk-ua': 'Вкажіть логотип', + 'de-ch': 'Logo angeben', + 'pt-br': 'Especificar logotipo', + }, + customImage: { + 'en-us': 'Custom Image', + 'ru-ru': 'Пользовательское изображение', + 'es-es': 'Imagen personalizada', + 'fr-fr': 'Image personnalisée', + 'uk-ua': 'Спеціальне зображення', + 'de-ch': 'Benutzerdefiniertes Bild', + 'pt-br': 'Imagem personalizada', + }, + embeddedWebpage: { + 'en-us': 'Embedded web page', + 'ru-ru': 'Встроенная веб-страница', + 'es-es': 'Página web incrustada', + 'fr-fr': 'Page Web intégrée', + 'uk-ua': 'Вбудована веб-сторінка', + 'de-ch': 'Eingebettete Webseite', + 'pt-br': 'Página da web incorporada', + }, + embeddedWebpageDescription: { + 'en-us': 'A URL to a page that would be embedded on the home page:', + 'ru-ru': 'URL-адрес страницы, которая будет встроена в домашнюю страницу:', + 'es-es': 'Una URL a una página que se integrará en la página de inicio:', + 'fr-fr': "Une URL vers une page qui serait intégrée à la page d'accueil :", + 'uk-ua': 'URL-адреса сторінки, яка буде вбудована на домашній сторінці:', + 'de-ch': + 'Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:', + 'pt-br': 'Um URL para uma página que seria incorporada na página inicial:', + }, + behavior: { + 'en-us': 'Behavior', + 'ru-ru': 'Поведение', + 'es-es': 'Comportamiento', + 'fr-fr': 'Comportement', + 'uk-ua': 'Поведінка', + 'de-ch': 'Verhalten', + 'pt-br': 'Comportamento', + }, + noRestrictionsMode: { + 'en-us': 'No restrictions mode', + 'ru-ru': 'Режим без ограничений', + 'es-es': 'Modo sin restricciones', + 'fr-fr': 'Mode sans restriction', + 'uk-ua': 'Режим без обмежень', + 'de-ch': 'Modus „Keine Einschränkungen“', + 'pt-br': 'Modo sem restrições', + }, + noRestrictionsModeWbDescription: { + 'en-us': 'Allows uploading data to any field in any table.', + 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', + 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', + 'fr-fr': + "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", + 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', + 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', + }, + noRestrictionsModeQueryDescription: { + 'en-us': 'Allows querying data from any field in any table.', + 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', + 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', + 'fr-fr': + "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", + 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', + 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', + }, + noRestrictionsModeWarning: { + 'en-us': + 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', + 'ru-ru': + 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', + 'es-es': + 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', + 'uk-ua': + 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', + 'de-ch': + 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', + 'fr-fr': + "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", + 'pt-br': + 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', + }, + adminsOnlyPreference: { + 'en-us': "You don't have permission to change this option", + 'ru-ru': 'У вас нет разрешения на изменение этой опции.', + 'es-es': 'No tienes permiso para cambiar esta opción', + 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", + 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', + 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', + 'pt-br': 'Você não tem permissão para alterar esta opção', + }, + stickyScrolling: { + 'en-us': 'Sticky scroll bar', + 'ru-ru': 'Липкая полоса прокрутки', + 'es-es': 'Barra de desplazamiento fija', + 'fr-fr': 'Barre de défilement collante', + 'uk-ua': 'Липка смуга прокрутки', + 'de-ch': 'Klebrige Bildlaufleiste', + 'pt-br': 'Barra de rolagem fixa', + }, + foreground: { + 'en-us': 'Foreground', + 'ru-ru': 'Передний план', + 'es-es': 'Primer plano', + 'fr-fr': 'Premier plan', + 'uk-ua': 'Передній план', + 'de-ch': 'Vordergrund', + 'pt-br': 'Primeiro plano', + }, + background: { + 'en-us': 'Background', + 'ru-ru': 'Фон', + 'es-es': 'Fondo', + 'fr-fr': 'Arrière-plan', + 'uk-ua': 'Фон', + 'de-ch': 'Hintergrund', + 'pt-br': 'Fundo', + }, + sidebarTheme: { + 'en-us': 'Sidebar theme', + 'de-ch': 'Seitenleistenthema', + 'es-es': 'Tema de la barra lateral', + 'fr-fr': 'Thème de la barre latérale', + 'ru-ru': 'Тема боковой панели', + 'uk-ua': 'Тема бічної панелі', + 'pt-br': 'Tema da barra lateral', + }, + darkForeground: { + 'en-us': 'Foreground (dark theme)', + 'ru-ru': 'Передний план (тёмная тема)', + 'es-es': 'Primer plano (tema oscuro)', + 'fr-fr': 'Premier plan (thème sombre)', + 'uk-ua': 'Передній план (темна тема)', + 'de-ch': 'Vordergrund (dunkles Design)', + 'pt-br': 'Primeiro plano (tema escuro)', + }, + darkBackground: { + 'en-us': 'Background (dark theme)', + 'ru-ru': 'Фон (тёмная тема)', + 'es-es': 'Fondo (tema oscuro)', + 'fr-fr': 'Arrière-plan (thème sombre)', + 'uk-ua': 'Фон (темна тема)', + 'de-ch': 'Hintergrund (dunkles Design)', + 'pt-br': 'Plano de fundo (tema escuro)', + }, + accentColor1: { + 'en-us': 'Accent color 1', + 'ru-ru': 'Акцентный цвет 1', + 'es-es': 'Color de acento 1', + 'fr-fr': "Couleur d'accent 1", + 'uk-ua': 'Акцентний колір 1', + 'de-ch': 'Akzentfarbe 1', + 'pt-br': 'Cor de destaque 1', + }, + accentColor2: { + 'en-us': 'Accent color 2', + 'ru-ru': 'Акцентный цвет 2', + 'es-es': 'Color de acento 2', + 'fr-fr': "Couleur d'accent 2", + 'uk-ua': 'Акцентний колір 2', + 'de-ch': 'Akzentfarbe 2', + 'pt-br': 'Cor de destaque 2', + }, + accentColor3: { + 'en-us': 'Accent color 3', + 'ru-ru': 'Акцентный цвет 3', + 'es-es': 'Color de acento 3', + 'fr-fr': "Couleur d'accent 3", + 'uk-ua': 'Акцентний колір 3', + 'de-ch': 'Akzentfarbe 3', + 'pt-br': 'Cor de destaque 3', + }, + accentColor4: { + 'en-us': 'Accent color 4', + 'ru-ru': 'Акцентный цвет 4', + 'es-es': 'Color de acento 4', + 'fr-fr': "Couleur d'accent 4", + 'uk-ua': 'Акцентний колір 4', + 'de-ch': 'Akzentfarbe 4', + 'pt-br': 'Cor de destaque 4', + }, + accentColor5: { + 'en-us': 'Accent color 5', + 'ru-ru': 'Акцентный цвет 5', + 'es-es': 'Color de acento 5', + 'fr-fr': "Couleur d'accent 5", + 'uk-ua': 'Акцентний колір 5', + 'de-ch': 'Akzentfarbe 5', + 'pt-br': 'Cor de destaque 5', + }, + spreadsheet: { + 'en-us': 'Spreadsheet', + 'ru-ru': 'Электронная таблица', + 'es-es': 'Hoja de cálculo', + 'fr-fr': 'Tableur', + 'uk-ua': 'Електронна таблиця', + 'de-ch': 'Kalkulationstabelle', + 'pt-br': 'Planilha', + }, + minSpareRows: { + 'en-us': 'Number of blank rows at the end', + 'ru-ru': 'Количество пустых строк в конце', + 'es-es': 'Número de filas en blanco al final', + 'fr-fr': 'Nombre de lignes vides à la fin', + 'uk-ua': 'Кількість порожніх рядків у кінці', + 'de-ch': 'Anzahl der leeren Zeilen am Ende', + 'pt-br': 'Número de linhas em branco no final', + }, + autoWrapCols: { + 'en-us': 'Navigate to the other side when reaching the edge column', + 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', + }, + autoWrapRows: { + 'en-us': 'Navigate to the other side when reaching the edge row', + 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', + }, + enterBeginsEditing: { + 'en-us': 'Enter key begins editing cell', + 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', + 'es-es': 'La tecla Enter inicia la edición de la celda', + 'fr-fr': 'La touche Entrée commence à modifier la cellule', + 'uk-ua': 'Клавіша Enter починає редагування клітинки', + 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', + 'pt-br': 'A tecla Enter inicia a edição da célula', + }, + tabMoveDirection: { + 'en-us': 'Direction of movement when Tab key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Tab', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Tab', + 'fr-fr': + 'Sens de déplacement lorsque la touche Tabulation est enfoncée', + 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', + 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', + 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', + }, + tabMoveDirectionDescription: { + 'en-us': + 'You can move in the opposite direction by pressing Shift+Tab.', + 'ru-ru': + 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', + 'fr-fr': + 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', + 'uk-ua': + 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Tab.', + }, + column: { + 'en-us': 'Column', + 'ru-ru': 'Столбец', + 'es-es': 'Columna', + 'fr-fr': 'Colonne', + 'uk-ua': 'Колонка', + 'de-ch': 'Spalte', + 'pt-br': 'Coluna', + }, + row: { + 'en-us': 'Row', + 'ru-ru': 'Ряд', + 'es-es': 'Fila', + 'fr-fr': 'Rangée', + 'uk-ua': 'рядок', + 'de-ch': 'Reihe', + 'pt-br': 'Linha', + }, + enterMoveDirection: { + 'en-us': 'Direction of movement when Enter key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Enter', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Enter', + 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', + 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', + 'fr-fr': + 'Direction du mouvement lorsque la touche Entrer est enfoncée', + 'pt-br': + 'Direção do movimento quando a tecla Enter é pressionada', + }, + enterMoveDirectionDescription: { + 'en-us': + 'You can move in the opposite direction by pressing Shift+Enter.', + 'ru-ru': + 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', + 'fr-fr': 'Synonyme couleur.', + 'uk-ua': + 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Enter.', + }, + filterPickLists: { + 'en-us': 'Filter pick list items', + 'ru-ru': 'Фильтрация элементов списка выбора', + 'es-es': 'Filtrar elementos de la lista de selección', + 'fr-fr': 'Filtrer les éléments de la liste de sélection', + 'uk-ua': 'Фільтр вибору елементів списку', + 'de-ch': 'Auswahllistenelemente filtern', + 'pt-br': 'Filtrar itens da lista de seleção', + }, + exportFileDelimiter: { + 'en-us': 'Export file delimiter', + 'ru-ru': 'Разделитель файлов экспорта', + 'es-es': 'Delimitador de archivo de exportación', + 'fr-fr': "Délimiteur de fichier d'exportation", + 'uk-ua': 'Роздільник файлу експорту', + 'de-ch': 'Dateitrennzeichen exportieren', + 'pt-br': 'Delimitador de arquivo de exportação', + }, + exportCsvUtf8Bom: { + 'en-us': 'Add UTF-8 BOM to CSV file exports', + 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', + 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', + 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', + 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', + 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', + 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', + }, + exportCsvUtf8BomDescription: { + 'en-us': + 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', + 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', + 'es-es': + 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', + 'fr-fr': + "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", + 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', + 'de-ch': + 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', + 'pt-br': + 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', + }, + caseSensitive: { + 'en-us': 'Case-sensitive', + 'ru-ru': 'С учетом регистра', + 'es-es': 'Distingue mayúsculas y minúsculas', + 'fr-fr': 'Sensible aux majuscules et minuscules', + 'uk-ua': 'Чутливий до регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'pt-br': 'Maiúsculas e minúsculas', + }, + caseInsensitive: { + 'en-us': 'Case-insensitive', + 'ru-ru': 'Без учета регистра', + 'es-es': 'No distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Insensible à la casse', + 'uk-ua': 'Регістр не враховується', + 'de-ch': 'Groß- und Kleinschreibung wird nicht berücksichtigt', + 'pt-br': 'Não diferencia maiúsculas de minúsculas', + }, + showNoReadTables: { + 'en-us': 'Show tables without "Read" access', + 'ru-ru': 'Показывать таблицы без доступа «Чтение»', + 'es-es': 'Mostrar tablas sin acceso de "Lectura"', + 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', + 'uk-ua': 'Показувати таблиці без доступу «Читання»', + 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', + }, + showNoAccessTables: { + 'en-us': 'Show tables without "Create" access', + 'ru-ru': 'Показывать таблицы без права «Создать»', + 'es-es': 'Mostrar tablas sin acceso "Crear"', + 'fr-fr': 'Afficher les tableaux sans accès "Créer"', + 'uk-ua': 'Показувати таблиці без доступу «Створити»', + 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso "Criar"', + }, + textAreaAutoGrow: { + 'en-us': 'Text boxes grow automatically', + 'ru-ru': 'Текстовые поля увеличиваются автоматически', + 'es-es': 'Los cuadros de texto crecen automáticamente', + 'fr-fr': "Les zones de texte s'agrandissent automatiquement", + 'uk-ua': 'Текстові поля збільшуються автоматично', + 'de-ch': 'Textfelder werden automatisch vergrößert', + 'pt-br': 'As caixas de texto crescem automaticamente', + }, + clearQueryFilters: { + 'en-us': 'Reset query filters', + 'ru-ru': 'Сбросить фильтры запроса', + 'es-es': 'Restablecer filtros de consulta', + 'fr-fr': 'Réinitialiser les filtres de requête', + 'uk-ua': 'Скинути фільтри запитів', + 'de-ch': 'Abfragefilter zurücksetzen', + 'pt-br': 'Redefinir filtros de consulta', + }, + clearQueryFiltersDescription: { + 'en-us': 'Clears all query filters when running a Report from a Form.', + 'de-ch': + 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', + 'es-es': + 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', + 'fr-fr': + "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", + 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', + 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', + 'pt-br': + 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', + }, + queryParamtersFromForm: { + 'en-us': 'Show query filters when running a Report from a Form', + 'de-ch': + 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', + 'es-es': + 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', + 'fr-fr': + "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", + 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', + 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', + 'pt-br': + 'Mostrar filtros de consulta ao executar um relatório de um formulário', + }, + autoGrowAutoComplete: { + 'en-us': 'Allow autocomplete to grow as wide as need', + 'ru-ru': + 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', + 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', + 'fr-fr': + 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', + 'uk-ua': + 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', + 'de-ch': + 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', + 'pt-br': + 'Permitir que o preenchimento automático cresça o quanto for necessário', + }, + tableNameInTitle: { + 'en-us': 'Include table name in the browser page title', + 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', + 'es-es': + 'Incluir el nombre de la tabla en el título de la página del navegador', + 'fr-fr': + 'Inclure le nom de la table dans le titre de la page du navigateur', + 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', + 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', + 'pt-br': 'Incluir nome da tabela no título da página do navegador', + }, + focusFirstField: { + 'en-us': 'Focus first field', + 'de-ch': 'Fokus erstes Feld', + 'es-es': 'Enfoque el primer campo', + 'fr-fr': 'Concentrez-vous sur le premier champ', + 'ru-ru': 'Фокус первого поля', + 'uk-ua': 'Перейти до першого поля', + 'pt-br': 'Foco primeiro campo', + }, + doubleClickZoom: { + 'en-us': 'Double click to zoom', + 'ru-ru': 'Дважды щелкните, чтобы увеличить', + 'es-es': 'Haga doble clic para ampliar', + 'fr-fr': 'Double-cliquez pour zoomer', + 'uk-ua': 'Двічі клацніть, щоб збільшити', + 'de-ch': 'Zum Vergrößern doppelklicken', + 'pt-br': 'Clique duas vezes para ampliar', + }, + closePopupOnClick: { + 'en-us': 'Close pop-up on outside click', + 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', + 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', + 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", + 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', + 'de-ch': 'Popup bei externem Klick schließen', + 'pt-br': 'Fechar pop-up ao clicar fora', + }, + animateTransitions: { + 'en-us': 'Animate transitions', + 'ru-ru': 'Анимированные переходы', + 'es-es': 'Animar transiciones', + 'fr-fr': 'Animer les transitions', + 'uk-ua': 'Анімація переходів', + 'de-ch': 'Übergänge animieren', + 'pt-br': 'Transições animadas', + }, + panInertia: { + 'en-us': 'Pan inertia', + 'ru-ru': 'Инерция пан', + 'es-es': 'Inercia de la sartén', + 'fr-fr': 'Inertie du bac', + 'uk-ua': 'Інерція панорами', + 'de-ch': 'Schwenkträgheit', + 'pt-br': 'Inércia da panela', + }, + mouseDrags: { + 'en-us': 'Mouse drags', + 'ru-ru': 'Перетаскивание мышью', + 'es-es': 'El ratón arrastra', + 'uk-ua': 'Виділіть відповідний підрядок', + 'de-ch': 'Maus zieht', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'pt-br': 'Arrastos do mouse', + }, + scrollWheelZoom: { + 'en-us': 'Scroll wheel zoom', + 'ru-ru': 'Масштабирование с помощью колеса прокрутки', + 'es-es': 'Zoom con rueda de desplazamiento', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Scrollrad-Zoom', + 'pt-br': 'Zoom da roda de rolagem', + }, + flexibleColumnWidth: { + 'en-us': 'Flexible column width', + 'ru-ru': 'Гибкая ширина столбца', + 'es-es': 'Ancho de columna flexible', + 'fr-fr': 'Largeur de colonne flexible', + 'uk-ua': 'Гнучка ширина колонки', + 'de-ch': 'Flexible Spaltenbreite', + 'pt-br': 'Largura de coluna flexível', + }, + flexibleSubGridColumnWidth: { + 'en-us': 'Flexible subview grid column width', + 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', + 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Flexible Rasterspaltenbreite der Unteransicht', + 'pt-br': 'Largura flexível da coluna da grade de subvisualização', + }, + closeOnEsc: { + 'en-us': 'Close on ESC key press', + 'ru-ru': 'Закрыть нажатием клавиши ESC', + 'es-es': 'Cerrar al presionar la tecla ESC', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Закриття натисканням клавіші ESC', + 'de-ch': 'Schließen durch Drücken der Taste ESC', + 'pt-br': 'Fechar ao pressionar a tecla ESC', + }, + closeOnOutsideClick: { + 'en-us': 'Close on outside click', + 'ru-ru': 'Закрытие по внешнему щелчку', + 'es-es': 'Cerrar al hacer clic desde fuera', + 'fr-fr': 'Fermer sur clic extérieur', + 'uk-ua': 'Закрийте зовнішнім клацанням', + 'de-ch': 'Schließen durch Klicken von außen', + 'pt-br': 'Fechar com clique externo', + }, + scopeEntireTablePicklists: { + 'en-us': 'Scope "Entire Table" picklists', + }, + scopeEntireTablePicklistsDescription: { + 'en-us': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + }, + catalogNumberInheritanceDescription: { + 'en-us': + 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', + }, + catalogNumberParentInheritanceDescription: { + 'en-us': + 'Control whether component records inherit catalog numbers from their parent Collection Object.', + }, + specifyNetworkBadge: { + 'en-us': 'Specify Network Badge', + 'ru-ru': 'Укажите сетевой значок', + 'es-es': 'Especificar la insignia de red', + 'fr-fr': 'Spécifier le badge réseau', + 'uk-ua': 'Укажіть значок мережі', + 'de-ch': 'Netzwerk-Badge angeben', + 'pt-br': 'Especificar emblema de rede', + }, + useAccessibleFullDatePicker: { + 'en-us': 'Use accessible full date picker', + 'ru-ru': 'Используйте доступный полный выбор даты', + 'es-es': 'Utilice el selector de fecha completo y accesible', + 'fr-fr': 'Utiliser un sélecteur de date complet accessible', + 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', + 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', + 'pt-br': 'Use o seletor de data completo acessível', + }, + useAccessibleMonthPicker: { + 'en-us': 'Use accessible month picker', + 'ru-ru': 'Используйте доступный выбор месяца', + 'es-es': 'Utilice el selector de meses accesible', + 'fr-fr': 'Utiliser le sélecteur de mois accessible', + 'uk-ua': 'Використовуйте доступний засіб вибору місяця', + 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', + 'pt-br': 'Use o seletor de meses acessível', + }, + rightAlignNumberFields: { + 'en-us': 'Right-Justify numeric fields', + 'ru-ru': 'Выравнивание числовых полей по правому краю', + 'es-es': 'Justificar a la derecha los campos numéricos', + 'fr-fr': 'Justifier à droite les champs numériques', + 'uk-ua': 'Вирівнювання по правому краю числових полів', + 'de-ch': 'Rechtsbündige Ausrichtung numerischer Felder', + 'pt-br': 'Justificar à direita campos numéricos', + }, + roundedCorners: { + 'en-us': 'Rounded corners', + 'ru-ru': 'Закругленные углы', + 'es-es': 'esquinas redondeadas', + 'fr-fr': 'Coins arrondis', + 'uk-ua': 'Заокруглені кути', + 'de-ch': 'Abgerundete Ecken', + 'pt-br': 'Cantos arredondados', + }, + showSubviewBorders: { + 'en-us': 'Show borders around subviews', + 'de-ch': 'Rahmen um Unteransichten anzeigen', + 'es-es': 'Mostrar bordes alrededor de las subvistas', + 'fr-fr': 'Afficher les bordures autour des sous-vues', + 'pt-br': 'Mostrar bordas ao redor das subvisualizações', + 'ru-ru': 'Показывать границы вокруг подпредставлений', + 'uk-ua': 'Показати межі навколо підвидів', + }, + limitMaxFieldWidth: { + 'en-us': 'Limit max field width', + 'ru-ru': 'Ограничить максимальную ширину поля', + 'es-es': 'Limitar el ancho máximo del campo', + 'fr-fr': 'Limiter la largeur maximale du champ', + 'uk-ua': 'Обмеження максимальної ширини поля', + 'de-ch': 'Maximale Feldbreite begrenzen', + 'pt-br': 'Limite a largura máxima do campo', + }, + condenseQueryResults: { + 'en-us': 'Condense query results', + 'ru-ru': 'Сжать результаты запроса', + 'es-es': 'Condensar los resultados de la consulta', + 'fr-fr': 'Condenser les résultats de la requête', + 'uk-ua': 'Згорнути результати запиту', + 'de-ch': 'Abfrageergebnisse verdichten', + 'pt-br': 'Condensar resultados da consulta', + }, + blurContentBehindDialog: { + 'en-us': 'Blur content behind the dialog', + 'ru-ru': 'Размытие содержимого за диалогом', + 'es-es': 'Desenfocar el contenido detrás del diálogo', + 'fr-fr': 'Flou le contenu derrière la boîte de dialogue', + 'uk-ua': 'Розмити вміст за діалоговим вікном', + 'de-ch': 'Inhalte hinter dem Dialog verwischen', + 'pt-br': 'Desfocar o conteúdo atrás do diálogo', + }, + collectionSortOrderDescription: { + 'en-us': 'This determines the visual order of collections.', + 'ru-ru': 'Это определяет визуальный порядок коллекций.', + 'es-es': 'Esto determina el orden visual de las colecciones.', + 'fr-fr': "Ceci détermine l'ordre visuel des collections.", + 'uk-ua': 'Це визначає візуальний порядок колекцій.', + 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', + 'pt-br': 'Isso determina a ordem visual das coleções.', + }, + recordSetRecordToOpen: { + 'en-us': 'Record to open by default', + 'ru-ru': 'Запись для открытия по умолчанию', + 'es-es': 'Registro para abrir por defecto', + 'fr-fr': 'Enregistrement à ouvrir par défaut', + 'uk-ua': 'Запис відкривається за умовчанням', + 'de-ch': 'Standardmäßig zu öffnender Datensatz', + 'pt-br': 'Gravar para abrir por padrão', + }, +} as const; + +export default preferencesContentDict; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index fc7c813b9a0..544708ca970 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -1,14 +1,13 @@ /** - * Localization strings for the preferences menu + * Localization strings for the preferences menu (split into manageable sections). * * @module */ - import { createDictionary } from './utils'; - +import { preferencesContentDict } from './preferences.content'; +import { preferencesBehaviorDict } from './preferences.behavior'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file - -export const preferencesText = createDictionary({ +export const preferencesGeneralDict= { preferences: { 'en-us': 'Preferences', 'ru-ru': 'Настройки', @@ -706,1416 +705,14 @@ export const preferencesText = createDictionary({ 'uk-ua': 'Домашня сторінка', 'de-ch': 'Startseite', 'pt-br': 'Página inicial', - }, - content: { - 'en-us': 'Content', - 'ru-ru': 'Содержание', - 'es-es': 'Contenido', - 'fr-fr': 'Contenu', - 'uk-ua': 'Зміст', - 'de-ch': 'Inhalt', - 'pt-br': 'Contente', - }, - defaultImage: { - 'en-us': 'Specify Logo', - 'ru-ru': 'Укажите логотип', - 'es-es': 'Especificar logotipo', - 'fr-fr': 'Spécifier le logo', - 'uk-ua': 'Вкажіть логотип', - 'de-ch': 'Logo angeben', - 'pt-br': 'Especificar logotipo', - }, - customImage: { - 'en-us': 'Custom Image', - 'ru-ru': 'Пользовательское изображение', - 'es-es': 'Imagen personalizada', - 'fr-fr': 'Image personnalisée', - 'uk-ua': 'Спеціальне зображення', - 'de-ch': 'Benutzerdefiniertes Bild', - 'pt-br': 'Imagem personalizada', - }, - embeddedWebpage: { - 'en-us': 'Embedded web page', - 'ru-ru': 'Встроенная веб-страница', - 'es-es': 'Página web incrustada', - 'fr-fr': 'Page Web intégrée', - 'uk-ua': 'Вбудована веб-сторінка', - 'de-ch': 'Eingebettete Webseite', - 'pt-br': 'Página da web incorporada', - }, - embeddedWebpageDescription: { - 'en-us': 'A URL to a page that would be embedded on the home page:', - 'ru-ru': 'URL-адрес страницы, которая будет встроена в домашнюю страницу:', - 'es-es': 'Una URL a una página que se integrará en la página de inicio:', - 'fr-fr': "Une URL vers une page qui serait intégrée à la page d'accueil :", - 'uk-ua': 'URL-адреса сторінки, яка буде вбудована на домашній сторінці:', - 'de-ch': - 'Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:', - 'pt-br': 'Um URL para uma página que seria incorporada na página inicial:', - }, - behavior: { - 'en-us': 'Behavior', - 'ru-ru': 'Поведение', - 'es-es': 'Comportamiento', - 'fr-fr': 'Comportement', - 'uk-ua': 'Поведінка', - 'de-ch': 'Verhalten', - 'pt-br': 'Comportamento', - }, - noRestrictionsMode: { - 'en-us': 'No restrictions mode', - 'ru-ru': 'Режим без ограничений', - 'es-es': 'Modo sin restricciones', - 'fr-fr': 'Mode sans restriction', - 'uk-ua': 'Режим без обмежень', - 'de-ch': 'Modus „Keine Einschränkungen“', - 'pt-br': 'Modo sem restrições', - }, - noRestrictionsModeWbDescription: { - 'en-us': 'Allows uploading data to any field in any table.', - 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', - 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', - 'fr-fr': - "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", - 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', - 'de-ch': - 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', - 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', - }, - noRestrictionsModeQueryDescription: { - 'en-us': 'Allows querying data from any field in any table.', - 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', - 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', - 'fr-fr': - "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", - 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', - 'de-ch': - 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', - 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', - }, - noRestrictionsModeWarning: { - 'en-us': - 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', - 'ru-ru': - 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', - 'es-es': - 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', - 'uk-ua': - 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', - 'de-ch': - 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', - 'fr-fr': - "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", - 'pt-br': - 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', - }, - adminsOnlyPreference: { - 'en-us': "You don't have permission to change this option", - 'ru-ru': 'У вас нет разрешения на изменение этой опции.', - 'es-es': 'No tienes permiso para cambiar esta opción', - 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", - 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', - 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', - 'pt-br': 'Você não tem permissão para alterar esta opção', - }, - stickyScrolling: { - 'en-us': 'Sticky scroll bar', - 'ru-ru': 'Липкая полоса прокрутки', - 'es-es': 'Barra de desplazamiento fija', - 'fr-fr': 'Barre de défilement collante', - 'uk-ua': 'Липка смуга прокрутки', - 'de-ch': 'Klebrige Bildlaufleiste', - 'pt-br': 'Barra de rolagem fixa', - }, - foreground: { - 'en-us': 'Foreground', - 'ru-ru': 'Передний план', - 'es-es': 'Primer plano', - 'fr-fr': 'Premier plan', - 'uk-ua': 'Передній план', - 'de-ch': 'Vordergrund', - 'pt-br': 'Primeiro plano', - }, - background: { - 'en-us': 'Background', - 'ru-ru': 'Фон', - 'es-es': 'Fondo', - 'fr-fr': 'Arrière-plan', - 'uk-ua': 'Фон', - 'de-ch': 'Hintergrund', - 'pt-br': 'Fundo', - }, - sidebarTheme: { - 'en-us': 'Sidebar theme', - 'de-ch': 'Seitenleistenthema', - 'es-es': 'Tema de la barra lateral', - 'fr-fr': 'Thème de la barre latérale', - 'ru-ru': 'Тема боковой панели', - 'uk-ua': 'Тема бічної панелі', - 'pt-br': 'Tema da barra lateral', - }, - darkForeground: { - 'en-us': 'Foreground (dark theme)', - 'ru-ru': 'Передний план (тёмная тема)', - 'es-es': 'Primer plano (tema oscuro)', - 'fr-fr': 'Premier plan (thème sombre)', - 'uk-ua': 'Передній план (темна тема)', - 'de-ch': 'Vordergrund (dunkles Design)', - 'pt-br': 'Primeiro plano (tema escuro)', - }, - darkBackground: { - 'en-us': 'Background (dark theme)', - 'ru-ru': 'Фон (тёмная тема)', - 'es-es': 'Fondo (tema oscuro)', - 'fr-fr': 'Arrière-plan (thème sombre)', - 'uk-ua': 'Фон (темна тема)', - 'de-ch': 'Hintergrund (dunkles Design)', - 'pt-br': 'Plano de fundo (tema escuro)', - }, - accentColor1: { - 'en-us': 'Accent color 1', - 'ru-ru': 'Акцентный цвет 1', - 'es-es': 'Color de acento 1', - 'fr-fr': "Couleur d'accent 1", - 'uk-ua': 'Акцентний колір 1', - 'de-ch': 'Akzentfarbe 1', - 'pt-br': 'Cor de destaque 1', - }, - accentColor2: { - 'en-us': 'Accent color 2', - 'ru-ru': 'Акцентный цвет 2', - 'es-es': 'Color de acento 2', - 'fr-fr': "Couleur d'accent 2", - 'uk-ua': 'Акцентний колір 2', - 'de-ch': 'Akzentfarbe 2', - 'pt-br': 'Cor de destaque 2', - }, - accentColor3: { - 'en-us': 'Accent color 3', - 'ru-ru': 'Акцентный цвет 3', - 'es-es': 'Color de acento 3', - 'fr-fr': "Couleur d'accent 3", - 'uk-ua': 'Акцентний колір 3', - 'de-ch': 'Akzentfarbe 3', - 'pt-br': 'Cor de destaque 3', - }, - accentColor4: { - 'en-us': 'Accent color 4', - 'ru-ru': 'Акцентный цвет 4', - 'es-es': 'Color de acento 4', - 'fr-fr': "Couleur d'accent 4", - 'uk-ua': 'Акцентний колір 4', - 'de-ch': 'Akzentfarbe 4', - 'pt-br': 'Cor de destaque 4', - }, - accentColor5: { - 'en-us': 'Accent color 5', - 'ru-ru': 'Акцентный цвет 5', - 'es-es': 'Color de acento 5', - 'fr-fr': "Couleur d'accent 5", - 'uk-ua': 'Акцентний колір 5', - 'de-ch': 'Akzentfarbe 5', - 'pt-br': 'Cor de destaque 5', - }, - spreadsheet: { - 'en-us': 'Spreadsheet', - 'ru-ru': 'Электронная таблица', - 'es-es': 'Hoja de cálculo', - 'fr-fr': 'Tableur', - 'uk-ua': 'Електронна таблиця', - 'de-ch': 'Kalkulationstabelle', - 'pt-br': 'Planilha', - }, - minSpareRows: { - 'en-us': 'Number of blank rows at the end', - 'ru-ru': 'Количество пустых строк в конце', - 'es-es': 'Número de filas en blanco al final', - 'fr-fr': 'Nombre de lignes vides à la fin', - 'uk-ua': 'Кількість порожніх рядків у кінці', - 'de-ch': 'Anzahl der leeren Zeilen am Ende', - 'pt-br': 'Número de linhas em branco no final', - }, - autoWrapCols: { - 'en-us': 'Navigate to the other side when reaching the edge column', - 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', - 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', - 'fr-fr': - 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', - 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', - 'de-ch': - 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', - 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', - }, - autoWrapRows: { - 'en-us': 'Navigate to the other side when reaching the edge row', - 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', - 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', - 'fr-fr': - 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', - 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', - 'de-ch': - 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', - 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', - }, - enterBeginsEditing: { - 'en-us': 'Enter key begins editing cell', - 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', - 'es-es': 'La tecla Enter inicia la edición de la celda', - 'fr-fr': 'La touche Entrée commence à modifier la cellule', - 'uk-ua': 'Клавіша Enter починає редагування клітинки', - 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', - 'pt-br': 'A tecla Enter inicia a edição da célula', - }, - tabMoveDirection: { - 'en-us': 'Direction of movement when Tab key is pressed', - 'ru-ru': 'Направление движения при нажатии клавиши Tab', - 'es-es': - 'Dirección de movimiento cuando se presiona la tecla Tab', - 'fr-fr': - 'Sens de déplacement lorsque la touche Tabulation est enfoncée', - 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', - 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', - 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', - }, - tabMoveDirectionDescription: { - 'en-us': - 'You can move in the opposite direction by pressing Shift+Tab.', - 'ru-ru': - 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', - 'es-es': - 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', - 'fr-fr': - 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', - 'uk-ua': - 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', - 'de-ch': - 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', - 'pt-br': - 'Você pode mover na direção oposta pressionando Shift+Tab.', - }, - column: { - 'en-us': 'Column', - 'ru-ru': 'Столбец', - 'es-es': 'Columna', - 'fr-fr': 'Colonne', - 'uk-ua': 'Колонка', - 'de-ch': 'Spalte', - 'pt-br': 'Coluna', - }, - row: { - 'en-us': 'Row', - 'ru-ru': 'Ряд', - 'es-es': 'Fila', - 'fr-fr': 'Rangée', - 'uk-ua': 'рядок', - 'de-ch': 'Reihe', - 'pt-br': 'Linha', - }, - enterMoveDirection: { - 'en-us': 'Direction of movement when Enter key is pressed', - 'ru-ru': 'Направление движения при нажатии клавиши Enter', - 'es-es': - 'Dirección de movimiento cuando se presiona la tecla Enter', - 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', - 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', - 'fr-fr': - 'Direction du mouvement lorsque la touche Entrer est enfoncée', - 'pt-br': - 'Direção do movimento quando a tecla Enter é pressionada', - }, - enterMoveDirectionDescription: { - 'en-us': - 'You can move in the opposite direction by pressing Shift+Enter.', - 'ru-ru': - 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', - 'es-es': - 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', - 'fr-fr': 'Synonyme couleur.', - 'uk-ua': - 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', - 'de-ch': - 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', - 'pt-br': - 'Você pode mover na direção oposta pressionando Shift+Enter.', - }, - filterPickLists: { - 'en-us': 'Filter pick list items', - 'ru-ru': 'Фильтрация элементов списка выбора', - 'es-es': 'Filtrar elementos de la lista de selección', - 'fr-fr': 'Filtrer les éléments de la liste de sélection', - 'uk-ua': 'Фільтр вибору елементів списку', - 'de-ch': 'Auswahllistenelemente filtern', - 'pt-br': 'Filtrar itens da lista de seleção', - }, - exportFileDelimiter: { - 'en-us': 'Export file delimiter', - 'ru-ru': 'Разделитель файлов экспорта', - 'es-es': 'Delimitador de archivo de exportación', - 'fr-fr': "Délimiteur de fichier d'exportation", - 'uk-ua': 'Роздільник файлу експорту', - 'de-ch': 'Dateitrennzeichen exportieren', - 'pt-br': 'Delimitador de arquivo de exportação', - }, - exportCsvUtf8Bom: { - 'en-us': 'Add UTF-8 BOM to CSV file exports', - 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', - 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', - 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', - 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', - 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', - 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', - }, - exportCsvUtf8BomDescription: { - 'en-us': - 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', - 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', - 'es-es': - 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', - 'fr-fr': - "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", - 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', - 'de-ch': - 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', - 'pt-br': - 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', - }, - caseSensitive: { - 'en-us': 'Case-sensitive', - 'ru-ru': 'С учетом регистра', - 'es-es': 'Distingue mayúsculas y minúsculas', - 'fr-fr': 'Sensible aux majuscules et minuscules', - 'uk-ua': 'Чутливий до регістру', - 'de-ch': 'Groß- und Kleinschreibung beachten', - 'pt-br': 'Maiúsculas e minúsculas', - }, - caseInsensitive: { - 'en-us': 'Case-insensitive', - 'ru-ru': 'Без учета регистра', - 'es-es': 'No distingue entre mayúsculas y minúsculas', - 'fr-fr': 'Insensible à la casse', - 'uk-ua': 'Регістр не враховується', - 'de-ch': 'Groß- und Kleinschreibung wird nicht berücksichtigt', - 'pt-br': 'Não diferencia maiúsculas de minúsculas', - }, - showNoReadTables: { - 'en-us': 'Show tables without "Read" access', - 'ru-ru': 'Показывать таблицы без доступа «Чтение»', - 'es-es': 'Mostrar tablas sin acceso de "Lectura"', - 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', - 'uk-ua': 'Показувати таблиці без доступу «Читання»', - 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', - 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', - }, - showNoAccessTables: { - 'en-us': 'Show tables without "Create" access', - 'ru-ru': 'Показывать таблицы без права «Создать»', - 'es-es': 'Mostrar tablas sin acceso "Crear"', - 'fr-fr': 'Afficher les tableaux sans accès "Créer"', - 'uk-ua': 'Показувати таблиці без доступу «Створити»', - 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', - 'pt-br': 'Mostrar tabelas sem acesso "Criar"', - }, - textAreaAutoGrow: { - 'en-us': 'Text boxes grow automatically', - 'ru-ru': 'Текстовые поля увеличиваются автоматически', - 'es-es': 'Los cuadros de texto crecen automáticamente', - 'fr-fr': "Les zones de texte s'agrandissent automatiquement", - 'uk-ua': 'Текстові поля збільшуються автоматично', - 'de-ch': 'Textfelder werden automatisch vergrößert', - 'pt-br': 'As caixas de texto crescem automaticamente', - }, - clearQueryFilters: { - 'en-us': 'Reset query filters', - 'ru-ru': 'Сбросить фильтры запроса', - 'es-es': 'Restablecer filtros de consulta', - 'fr-fr': 'Réinitialiser les filtres de requête', - 'uk-ua': 'Скинути фільтри запитів', - 'de-ch': 'Abfragefilter zurücksetzen', - 'pt-br': 'Redefinir filtros de consulta', - }, - clearQueryFiltersDescription: { - 'en-us': 'Clears all query filters when running a Report from a Form.', - 'de-ch': - 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', - 'es-es': - 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', - 'fr-fr': - "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", - 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', - 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', - 'pt-br': - 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', - }, - queryParamtersFromForm: { - 'en-us': 'Show query filters when running a Report from a Form', - 'de-ch': - 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', - 'es-es': - 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', - 'fr-fr': - "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", - 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', - 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', - 'pt-br': - 'Mostrar filtros de consulta ao executar um relatório de um formulário', - }, - autoGrowAutoComplete: { - 'en-us': 'Allow autocomplete to grow as wide as need', - 'ru-ru': - 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', - 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', - 'fr-fr': - 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', - 'uk-ua': - 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', - 'de-ch': - 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', - 'pt-br': - 'Permitir que o preenchimento automático cresça o quanto for necessário', - }, - tableNameInTitle: { - 'en-us': 'Include table name in the browser page title', - 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', - 'es-es': - 'Incluir el nombre de la tabla en el título de la página del navegador', - 'fr-fr': - 'Inclure le nom de la table dans le titre de la page du navigateur', - 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', - 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', - 'pt-br': 'Incluir nome da tabela no título da página do navegador', - }, - focusFirstField: { - 'en-us': 'Focus first field', - 'de-ch': 'Fokus erstes Feld', - 'es-es': 'Enfoque el primer campo', - 'fr-fr': 'Concentrez-vous sur le premier champ', - 'ru-ru': 'Фокус первого поля', - 'uk-ua': 'Перейти до першого поля', - 'pt-br': 'Foco primeiro campo', - }, - doubleClickZoom: { - 'en-us': 'Double click to zoom', - 'ru-ru': 'Дважды щелкните, чтобы увеличить', - 'es-es': 'Haga doble clic para ampliar', - 'fr-fr': 'Double-cliquez pour zoomer', - 'uk-ua': 'Двічі клацніть, щоб збільшити', - 'de-ch': 'Zum Vergrößern doppelklicken', - 'pt-br': 'Clique duas vezes para ampliar', - }, - closePopupOnClick: { - 'en-us': 'Close pop-up on outside click', - 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', - 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', - 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", - 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', - 'de-ch': 'Popup bei externem Klick schließen', - 'pt-br': 'Fechar pop-up ao clicar fora', - }, - animateTransitions: { - 'en-us': 'Animate transitions', - 'ru-ru': 'Анимированные переходы', - 'es-es': 'Animar transiciones', - 'fr-fr': 'Animer les transitions', - 'uk-ua': 'Анімація переходів', - 'de-ch': 'Übergänge animieren', - 'pt-br': 'Transições animadas', - }, - panInertia: { - 'en-us': 'Pan inertia', - 'ru-ru': 'Инерция пан', - 'es-es': 'Inercia de la sartén', - 'fr-fr': 'Inertie du bac', - 'uk-ua': 'Інерція панорами', - 'de-ch': 'Schwenkträgheit', - 'pt-br': 'Inércia da panela', - }, - mouseDrags: { - 'en-us': 'Mouse drags', - 'ru-ru': 'Перетаскивание мышью', - 'es-es': 'El ratón arrastra', - 'uk-ua': 'Виділіть відповідний підрядок', - 'de-ch': 'Maus zieht', - 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', - 'pt-br': 'Arrastos do mouse', - }, - scrollWheelZoom: { - 'en-us': 'Scroll wheel zoom', - 'ru-ru': 'Масштабирование с помощью колеса прокрутки', - 'es-es': 'Zoom con rueda de desplazamiento', - 'fr-fr': 'Zoom avec la molette de défilement', - 'uk-ua': 'Масштаб колеса прокрутки', - 'de-ch': 'Scrollrad-Zoom', - 'pt-br': 'Zoom da roda de rolagem', - }, - flexibleColumnWidth: { - 'en-us': 'Flexible column width', - 'ru-ru': 'Гибкая ширина столбца', - 'es-es': 'Ancho de columna flexible', - 'fr-fr': 'Largeur de colonne flexible', - 'uk-ua': 'Гнучка ширина колонки', - 'de-ch': 'Flexible Spaltenbreite', - 'pt-br': 'Largura de coluna flexível', - }, - flexibleSubGridColumnWidth: { - 'en-us': 'Flexible subview grid column width', - 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', - 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', - 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', - 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', - 'de-ch': 'Flexible Rasterspaltenbreite der Unteransicht', - 'pt-br': 'Largura flexível da coluna da grade de subvisualização', - }, - closeOnEsc: { - 'en-us': 'Close on ESC key press', - 'ru-ru': 'Закрыть нажатием клавиши ESC', - 'es-es': 'Cerrar al presionar la tecla ESC', - 'fr-fr': 'Icône et nom de la table', - 'uk-ua': 'Закриття натисканням клавіші ESC', - 'de-ch': 'Schließen durch Drücken der Taste ESC', - 'pt-br': 'Fechar ao pressionar a tecla ESC', - }, - closeOnOutsideClick: { - 'en-us': 'Close on outside click', - 'ru-ru': 'Закрытие по внешнему щелчку', - 'es-es': 'Cerrar al hacer clic desde fuera', - 'fr-fr': 'Fermer sur clic extérieur', - 'uk-ua': 'Закрийте зовнішнім клацанням', - 'de-ch': 'Schließen durch Klicken von außen', - 'pt-br': 'Fechar com clique externo', - }, - scopeEntireTablePicklists: { - 'en-us': 'Scope "Entire Table" picklists', - }, - scopeEntireTablePicklistsDescription: { - 'en-us': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - }, - catalogNumberInheritanceDescription: { - 'en-us': - 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', - }, - catalogNumberParentInheritanceDescription: { - 'en-us': - 'Control whether component records inherit catalog numbers from their parent Collection Object.', - }, - specifyNetworkBadge: { - 'en-us': 'Specify Network Badge', - 'ru-ru': 'Укажите сетевой значок', - 'es-es': 'Especificar la insignia de red', - 'fr-fr': 'Spécifier le badge réseau', - 'uk-ua': 'Укажіть значок мережі', - 'de-ch': 'Netzwerk-Badge angeben', - 'pt-br': 'Especificar emblema de rede', - }, - useAccessibleFullDatePicker: { - 'en-us': 'Use accessible full date picker', - 'ru-ru': 'Используйте доступный полный выбор даты', - 'es-es': 'Utilice el selector de fecha completo y accesible', - 'fr-fr': 'Utiliser un sélecteur de date complet accessible', - 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', - 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', - 'pt-br': 'Use o seletor de data completo acessível', - }, - useAccessibleMonthPicker: { - 'en-us': 'Use accessible month picker', - 'ru-ru': 'Используйте доступный выбор месяца', - 'es-es': 'Utilice el selector de meses accesible', - 'fr-fr': 'Utiliser le sélecteur de mois accessible', - 'uk-ua': 'Використовуйте доступний засіб вибору місяця', - 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', - 'pt-br': 'Use o seletor de meses acessível', - }, - rightAlignNumberFields: { - 'en-us': 'Right-Justify numeric fields', - 'ru-ru': 'Выравнивание числовых полей по правому краю', - 'es-es': 'Justificar a la derecha los campos numéricos', - 'fr-fr': 'Justifier à droite les champs numériques', - 'uk-ua': 'Вирівнювання по правому краю числових полів', - 'de-ch': 'Rechtsbündige Ausrichtung numerischer Felder', - 'pt-br': 'Justificar à direita campos numéricos', - }, - roundedCorners: { - 'en-us': 'Rounded corners', - 'ru-ru': 'Закругленные углы', - 'es-es': 'esquinas redondeadas', - 'fr-fr': 'Coins arrondis', - 'uk-ua': 'Заокруглені кути', - 'de-ch': 'Abgerundete Ecken', - 'pt-br': 'Cantos arredondados', - }, - showSubviewBorders: { - 'en-us': 'Show borders around subviews', - 'de-ch': 'Rahmen um Unteransichten anzeigen', - 'es-es': 'Mostrar bordes alrededor de las subvistas', - 'fr-fr': 'Afficher les bordures autour des sous-vues', - 'pt-br': 'Mostrar bordas ao redor das subvisualizações', - 'ru-ru': 'Показывать границы вокруг подпредставлений', - 'uk-ua': 'Показати межі навколо підвидів', - }, - limitMaxFieldWidth: { - 'en-us': 'Limit max field width', - 'ru-ru': 'Ограничить максимальную ширину поля', - 'es-es': 'Limitar el ancho máximo del campo', - 'fr-fr': 'Limiter la largeur maximale du champ', - 'uk-ua': 'Обмеження максимальної ширини поля', - 'de-ch': 'Maximale Feldbreite begrenzen', - 'pt-br': 'Limite a largura máxima do campo', - }, - condenseQueryResults: { - 'en-us': 'Condense query results', - 'ru-ru': 'Сжать результаты запроса', - 'es-es': 'Condensar los resultados de la consulta', - 'fr-fr': 'Condenser les résultats de la requête', - 'uk-ua': 'Згорнути результати запиту', - 'de-ch': 'Abfrageergebnisse verdichten', - 'pt-br': 'Condensar resultados da consulta', - }, - blurContentBehindDialog: { - 'en-us': 'Blur content behind the dialog', - 'ru-ru': 'Размытие содержимого за диалогом', - 'es-es': 'Desenfocar el contenido detrás del diálogo', - 'fr-fr': 'Flou le contenu derrière la boîte de dialogue', - 'uk-ua': 'Розмити вміст за діалоговим вікном', - 'de-ch': 'Inhalte hinter dem Dialog verwischen', - 'pt-br': 'Desfocar o conteúdo atrás do diálogo', - }, - collectionSortOrderDescription: { - 'en-us': 'This determines the visual order of collections.', - 'ru-ru': 'Это определяет визуальный порядок коллекций.', - 'es-es': 'Esto determina el orden visual de las colecciones.', - 'fr-fr': "Ceci détermine l'ordre visuel des collections.", - 'uk-ua': 'Це визначає візуальний порядок колекцій.', - 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', - 'pt-br': 'Isso determina a ordem visual das coleções.', - }, - recordSetRecordToOpen: { - 'en-us': 'Record to open by default', - 'ru-ru': 'Запись для открытия по умолчанию', - 'es-es': 'Registro para abrir por defecto', - 'fr-fr': 'Enregistrement à ouvrir par défaut', - 'uk-ua': 'Запис відкривається за умовчанням', - 'de-ch': 'Standardmäßig zu öffnender Datensatz', - 'pt-br': 'Gravar para abrir por padrão', - }, - altClickToSupressNewTab: { - 'en-us': - '{altKeyName:string}+Click to suppress new tab', - 'ru-ru': - '{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку', - 'es-es': - '{altKeyName:string}+Haga clic en para suprimir la nueva pestaña', - 'fr-fr': - '{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet', - 'uk-ua': - '{altKeyName:string}+Натисніть , щоб закрити нову вкладку', - 'de-ch': - '{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken', - 'pt-br': - '{altKeyName:string}+Clique em para suprimir a nova guia', - }, - altClickToSupressNewTabDescription: { - 'en-us': - '{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.', - 'ru-ru': - '{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.', - 'es-es': - '{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.', - 'fr-fr': 'Utiliser le sélecteur de mois accessible.', - 'uk-ua': - '{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.', - 'de-ch': - '{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.', - 'pt-br': - '{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.', - }, - makeFormDialogsModal: { - 'en-us': 'Make form dialogs gray out the background', - 'ru-ru': 'Сделать фон диалоговых окон серым', - 'es-es': - 'Hacer que los cuadros de diálogo del formulario tengan el fondo en gris', - 'fr-fr': - "Rendre les boîtes de dialogue de formulaire grisées sur l'arrière-plan", - 'uk-ua': 'Зробіть діалогові вікна форми сірими фоном', - 'de-ch': 'Den Hintergrund von Formulardialogen ausgrauen', - 'pt-br': - 'Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado', - }, - autoScrollTree: { - 'en-us': 'Auto scroll tree to focused node', - 'ru-ru': 'Автоматическая прокрутка дерева к выбранному узлу', - 'es-es': 'Desplazamiento automático del árbol al nodo enfocado', - 'fr-fr': 'Arbre de défilement automatique vers le nœud ciblé', - 'uk-ua': 'Автоматичне прокручування дерева до виділеного вузла', - 'de-ch': 'Automatisches Scrollen des Baums zum fokussierten Knoten', - 'pt-br': 'Rolagem automática da árvore para o nó em foco', - }, - sortByField: { - 'en-us': 'Order By Field', - 'de-ch': 'Nach Feld sortieren', - 'es-es': 'Ordenar por campo', - 'fr-fr': 'Trier par champ', - 'pt-br': 'Ordenar por campo', - 'ru-ru': 'Сортировать по полю', - 'uk-ua': 'Сортувати за полем', - }, - lineWrap: { - 'en-us': 'Line wrap', - 'ru-ru': 'Перенос строки', - 'es-es': 'Ajuste de línea', - 'fr-fr': 'Retour à la ligne', - 'uk-ua': 'Обтікання лініями', - 'de-ch': 'Zeilenumbruch', - 'pt-br': 'Quebra de linha', - }, - indentSize: { - 'en-us': 'Indent size', - 'ru-ru': 'Размер отступа', - 'es-es': 'Tamaño de sangría', - 'fr-fr': 'Taille du retrait', - 'uk-ua': 'Розмір відступу', - 'de-ch': 'Einzugsgröße', - 'pt-br': 'Tamanho do recuo', - }, - indentWithTab: { - 'en-us': 'Indent with Tab', - 'ru-ru': 'Отступ с помощью Tab', - 'es-es': 'Sangría con Tab', - 'fr-fr': 'Indenter avec Tabulation', - 'uk-ua': 'Відступ із Tab', - 'de-ch': 'Einrücken mit Tab', - 'pt-br': 'Recuo com Tab', - }, - formHeaderFormat: { - 'en-us': 'Form header format', - 'ru-ru': 'Формат заголовка формы', - 'es-es': 'Formato del encabezado del formulario', - 'fr-fr': "Format d'en-tête de formulaire", - 'uk-ua': 'Формат заголовка форми', - 'de-ch': 'Formularkopfformat', - 'pt-br': 'Formato do cabeçalho do formulário', - }, - iconAndTableName: { - 'en-us': 'Icon and table name', - 'ru-ru': 'Значок и название таблицы', - 'es-es': 'Icono y nombre de la tabla', - 'fr-fr': 'Icône et nom de la table', - 'uk-ua': 'Значок і назва таблиці', - 'de-ch': 'Symbol und Tabellenname', - 'pt-br': 'Ícone e nome da tabela', - }, - tableIcon: { - 'en-us': 'Table icon', - 'ru-ru': 'Значок таблицы', - 'es-es': 'Icono de tabla', - 'fr-fr': 'Icône de tableau', - 'uk-ua': 'Значок таблиці', - 'de-ch': 'Tabellensymbol', - 'pt-br': 'Ícone de tabela', - }, - maxHeight: { - 'en-us': 'Max height', - 'ru-ru': 'Максимальная высота', - 'es-es': 'Altura máxima', - 'fr-fr': 'hauteur maximum', - 'uk-ua': 'Максимальна висота', - 'de-ch': 'Maximale Höhe', - 'pt-br': 'Altura máxima', - }, - autoComplete: { - 'en-us': 'Auto complete', - 'ru-ru': 'Автозаполнение', - 'es-es': 'Autocompletar', - 'fr-fr': - "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", - 'uk-ua': - 'Визначає підписи полів, примітки щодо використання та підписи таблиць', - 'de-ch': 'Autovervollständigung', - 'pt-br': 'Preenchimento automático', - }, - searchCaseSensitive: { - 'en-us': 'Case-sensitive search', - 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', - 'fr-fr': 'Recherche sensible à la casse', - 'uk-ua': 'Пошук з урахуванням регістру', - 'de-ch': 'Groß- und Kleinschreibung beachten', - 'ru-ru': 'Поиск с учетом регистра', - 'pt-br': 'Pesquisa com diferenciação entre maiúsculas e minúsculas', - }, - searchField: { - 'en-us': 'Search Field', - 'ru-ru': 'Поле поиска', - 'es-es': 'Campo de búsqueda', - 'fr-fr': 'Champ de recherche', - 'uk-ua': 'Поле пошуку', - 'de-ch': 'Suchfeld', - 'pt-br': 'Campo de pesquisa', - }, - createInteractions: { - 'en-us': 'Creating an interaction', - 'ru-ru': 'Создание взаимодействия', - 'es-es': 'Creando una interacción', - 'fr-fr': 'Créer une interaction', - 'uk-ua': 'Створення взаємодії', - 'de-ch': 'Erstellen einer Interaktion', - 'pt-br': 'Criando uma interação', - }, - useSpaceAsDelimiter: { - 'en-us': 'Use space as delimiter', - 'ru-ru': 'Используйте пробел в качестве разделителя', - 'es-es': 'Utilice el espacio como delimitador', - 'fr-fr': "Utiliser l'espace comme délimiteur", - 'uk-ua': 'Використовуйте пробіл як роздільник', - 'de-ch': 'Leerzeichen als Trennzeichen verwenden', - 'pt-br': 'Use espaço como delimitador', - }, - useCommaAsDelimiter: { - 'en-us': 'Use comma as delimiter', - 'ru-ru': 'Используйте запятую в качестве разделителя', - 'es-es': 'Utilice la coma como delimitador', - 'fr-fr': 'Utiliser la virgule comme délimiteur', - 'uk-ua': 'Використовуйте кому як роздільник', - 'de-ch': 'Verwenden Sie Kommas als Trennzeichen', - 'pt-br': 'Use vírgula como delimitador', - }, - useNewLineAsDelimiter: { - 'en-us': 'Use new line as delimiter', - 'ru-ru': 'Использовать новую строку в качестве разделителя', - 'es-es': 'Utilice nueva línea como delimitador', - 'fr-fr': 'Utiliser une nouvelle ligne comme délimiteur', - 'uk-ua': 'Використовуйте новий рядок як роздільник', - 'de-ch': 'Neue Zeile als Trennzeichen verwenden', - 'pt-br': 'Use nova linha como delimitador', - }, - useCustomDelimiters: { - 'en-us': 'Use custom delimiters', - 'ru-ru': 'Используйте пользовательские разделители', - 'es-es': 'Utilice delimitadores personalizados', - 'fr-fr': 'Utiliser des délimiteurs personnalisés', - 'uk-ua': 'Використовуйте спеціальні роздільники', - 'de-ch': 'Benutzerdefinierte Trennzeichen verwenden', - 'pt-br': 'Use delimitadores personalizados', - }, - useCustomDelimitersDescription: { - 'en-us': - 'A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.', - 'ru-ru': - 'Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.', - 'es-es': - 'Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.', - 'fr-fr': - 'Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.', - 'uk-ua': - 'Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.', - 'de-ch': - 'Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.', - 'pt-br': - 'Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.', - }, - detectAutomaticallyDescription: { - 'en-us': 'Detect automatically based on catalog number format.', - 'ru-ru': 'Автоматическое определение на основе формата каталожного номера.', - 'es-es': - 'Detectar automáticamente según el formato del número de catálogo.', - 'fr-fr': - 'Détecter automatiquement en fonction du format du numéro de catalogue.', - 'uk-ua': 'Визначати автоматично на основі формату номера каталогу.', - 'de-ch': 'Automatische Erkennung basierend auf dem Katalognummernformat.', - 'pt-br': - 'Detectar automaticamente com base no formato do número de catálogo.', - }, - use: { - comment: 'Verb', - 'en-us': 'Use', - 'ru-ru': 'Использовать', - 'es-es': 'Usar', - 'fr-fr': 'Utiliser', - 'uk-ua': 'використання', - 'de-ch': 'Verwenden', - 'pt-br': 'Usar', - }, - dontUse: { - 'en-us': 'Don’t use', - 'ru-ru': 'Не использовать', - 'es-es': 'No utilizar', - 'fr-fr': 'Zoom avec la molette de défilement', - 'uk-ua': 'Масштаб колеса прокрутки', - 'de-ch': 'Nicht verwenden', - 'pt-br': 'Não use', - }, - position: { - 'en-us': 'Position', - 'es-es': 'Posición', - 'fr-fr': 'Position', - 'ru-ru': 'Позиция', - 'uk-ua': 'Позиція', - 'de-ch': 'Position', - 'pt-br': 'Posição', - }, - top: { - 'en-us': 'Top', - 'es-es': 'Arriba', - 'fr-fr': 'Haut', - 'ru-ru': 'Вершина', - 'uk-ua': 'Топ', - 'de-ch': 'Spitze', - 'pt-br': 'Principal', - }, - bottom: { - 'en-us': 'Bottom', - 'es-es': 'Abajo', - 'ru-ru': 'Нижний', - 'uk-ua': 'Дно', - 'de-ch': 'Unten', - 'fr-fr': 'Bas', - 'pt-br': 'Fundo', - }, - left: { - 'en-us': 'Left', - 'es-es': 'Izquierda', - 'fr-fr': 'Gauche', - 'ru-ru': 'Левый', - 'uk-ua': 'Ліворуч', - 'de-ch': 'Links', - 'pt-br': 'Esquerda', - }, - right: { - 'en-us': 'Right', - 'es-es': 'Bien', - 'fr-fr': 'Droite', - 'ru-ru': 'Верно', - 'uk-ua': 'правильно', - 'de-ch': 'Rechts', - 'pt-br': 'Certo', - }, - showUnsavedIndicator: { - 'en-us': 'Show unsaved changes indicator', - 'ru-ru': 'Показать индикатор несохраненных изменений', - 'es-es': 'Mostrar indicador de cambios no guardados', - 'fr-fr': "Afficher l'indicateur de modifications non enregistrées", - 'uk-ua': 'Показати індикатор незбережених змін', - 'de-ch': 'Indikator für nicht gespeicherte Änderungen anzeigen', - 'pt-br': 'Mostrar indicador de alterações não salvas', - }, - showUnsavedIndicatorDescription: { - 'en-us': - 'Show an "*" in the tab title when there are unsaved changes in the current tab.', - 'es-es': - 'Mostrar un "*" en el título de la pestaña cuando haya cambios sin guardar en la pestaña actual.', - 'fr-fr': - "Afficher un \"*\" dans le titre de l'onglet lorsqu'il y a des modifications non enregistrées dans l'onglet actuel.", - 'ru-ru': - 'Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.', - 'uk-ua': - 'Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.', - 'de-ch': - 'Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.', - 'pt-br': - 'Exibir um "*" no título da aba quando houver alterações não salvas na aba atual.', - }, - autoPopulateDescription: { - 'en-us': - 'Auto populate the merged record with values from duplicates when opening the merging dialog.', - 'ru-ru': - 'Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.', - 'de-ch': - 'Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.', - 'es-es': - 'Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.', - 'fr-fr': - "Remplir automatiquement l'enregistrement fusionné avec les valeurs des doublons lors de l'ouverture de la boîte de dialogue de fusion.", - 'uk-ua': - 'Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.', - 'pt-br': - 'Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.', - }, - autoCreateVariants: { - 'en-us': 'Automatically create {agentVariantTable:string} records', - 'ru-ru': 'Автоматически создавать записи {agentVariantTable:string}', - 'de-ch': '{agentVariantTable:string}-Datensätze automatisch erstellen', - 'es-es': 'Crear automáticamente registros {agentVariantTable:string}', - 'fr-fr': - 'Créer automatiquement des enregistrements {agentVariantTable:string}', - 'uk-ua': 'Автоматично створювати записи {agentVariantTable:string}', - 'pt-br': 'Criar automaticamente registros {agentVariantTable:string}', - }, - autoCreateVariantsDescription: { - 'en-us': - 'When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.', - 'ru-ru': - 'При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.', - 'de-ch': - 'Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.', - 'es-es': - 'Al fusionar agentes, se crean automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.', - 'fr-fr': - "Lors de la fusion d'agents, créez automatiquement des enregistrements {agentVariantTable:string} en fonction des variations du prénom/nom.", - 'uk-ua': - 'Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.', - 'pt-br': - 'Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.', - }, - collectionPreferences: { - 'en-us': 'Collection Preferences', - 'de-ch': 'Sammlungseinstellungen', - 'es-es': 'Preferencias de colección', - 'fr-fr': 'Personnalisation', - 'ru-ru': 'Настройки коллекции', - 'uk-ua': 'Налаштування', - 'pt-br': 'Preferências de coleção', - }, - rememberDialogSizes: { - 'en-us': 'Remember dialog window sizes', - 'ru-ru': 'Запомните размеры диалоговых окон', - 'es-es': 'Recordar los tamaños de las ventanas de diálogo', - 'fr-fr': 'Mémoriser les tailles des fenêtres de dialogue', - 'uk-ua': "Запам'ятайте розміри діалогових вікон", - 'de-ch': 'Dialogfenstergrößen merken', - 'pt-br': 'Lembrar tamanhos de janelas de diálogo', - }, - rememberDialogPositions: { - 'en-us': 'Remember dialog window positions', - 'ru-ru': 'Запомнить позиции диалоговых окон', - 'es-es': 'Recordar las posiciones de las ventanas de diálogo', - 'fr-fr': 'Mémoriser les positions des fenêtres de dialogue', - 'uk-ua': "Запам'ятовуйте положення діалогового вікна", - 'de-ch': 'Dialogfensterpositionen merken', - 'pt-br': 'Lembrar posições da janela de diálogo', - }, - autoPlayMedia: { - 'en-us': 'Automatically play media', - 'ru-ru': 'Автоматически воспроизводить медиа', - 'es-es': 'Reproducir automáticamente medios', - 'fr-fr': 'Lire automatiquement les médias', - 'uk-ua': 'Автоматичне відтворення медіа', - 'de-ch': 'Medien automatisch abspielen', - 'pt-br': 'Reproduzir mídia automaticamente', - }, - useCustomTooltips: { - 'en-us': 'Use modern tooltips', - 'ru-ru': 'Используйте современные подсказки', - 'es-es': 'Utilice información sobre herramientas moderna', - 'fr-fr': 'Utiliser des info-bulles modernes', - 'uk-ua': 'Використовуйте сучасні підказки', - 'de-ch': 'Verwenden Sie moderne Tooltips', - 'pt-br': 'Use dicas de ferramentas modernas', - }, - alwaysUseQueryBuilder: { - 'en-us': 'Always use query builder search inside of search form', - 'de-ch': - 'Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche', - 'es-es': - 'Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda', - 'fr-fr': - 'Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche', - 'ru-ru': 'Всегда используйте конструктор запросов внутри формы поиска.', - 'uk-ua': 'Завжди використовуйте пошук конструктора запитів у формі пошуку', - 'pt-br': - 'Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa', - }, - localizeResourceNames: { - 'en-us': 'Localize the names of recognized app resources', - 'de-ch': 'Lokalisieren Sie die Namen erkannter App-Ressourcen', - 'es-es': - 'Localizar los nombres de los recursos de aplicaciones reconocidos', - 'fr-fr': "Localiser les noms des ressources d'application reconnues", - 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения', - 'uk-ua': 'Локалізувати назви розпізнаних ресурсів програми', - 'pt-br': 'Localize os nomes dos recursos de aplicativos reconhecidos', - }, - splitLongXml: { - 'en-us': 'Split long lines of XML into multiple lines', - 'de-ch': 'Teilen Sie lange XML-Zeilen in mehrere Zeilen auf', - 'es-es': 'Dividir líneas largas de XML en varias líneas', - 'fr-fr': 'Diviser les longues lignes de XML en plusieurs lignes', - 'ru-ru': 'Разделить длинные строки XML на несколько строк', - 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', - 'pt-br': 'Dividir longas linhas de XML em várias linhas', - }, - url: { - 'en-us': 'URL', - 'de-ch': 'URL', - 'es-es': 'URL', - 'fr-fr': 'URL', - 'uk-ua': 'URL', - 'ru-ru': 'URL', - 'pt-br': 'URL', - }, - pickAttachment: { - 'en-us': 'Pick an attachment', - 'es-es': 'Elige un archivo adjunto', - 'fr-fr': 'Choisissez une pièce jointe', - 'ru-ru': 'Выберите вложение', - 'uk-ua': 'Виберіть вкладення', - 'de-ch': 'Wählen Sie einen Anhang', - 'pt-br': 'Escolha um anexo', - }, - attachmentFailed: { - 'en-us': 'The attachment failed to load.', - 'de-ch': 'Der Anhang konnte nicht geladen werden.', - 'es-es': 'No se pudo cargar el archivo adjunto.', - 'fr-fr': "La pièce jointe n'a pas pu être chargée.", - 'ru-ru': 'Не удалось загрузить вложение.', - 'uk-ua': 'Не вдалося завантажити вкладений файл.', - 'pt-br': 'O anexo não pôde ser carregado.', - }, - pickImage: { - 'en-us': 'Pick an image', - 'de-ch': 'Wählen Sie ein Bild aus', - 'es-es': 'Elige una imagen', - 'fr-fr': 'Choisissez une image', - 'ru-ru': 'Выберите изображение', - 'uk-ua': 'Виберіть зображення', - 'pt-br': 'Escolha uma imagem', - }, - customLogo: { - 'en-us': 'Expanded Image URL', - 'de-ch': 'Erweiterte Bild-URL', - 'es-es': 'URL de imagen expandida', - 'fr-fr': "URL de l'image étendue", - 'ru-ru': 'URL-адрес развернутого изображения', - 'uk-ua': 'Розширена URL-адреса зображення', - 'pt-br': 'URL da imagem expandida', - }, - customLogoCollapsed: { - 'en-us': 'Collapsed Image URL', - 'de-ch': 'URL des minimierten Bildes', - 'es-es': 'URL de imagen contraída', - 'fr-fr': "URL de l'image réduite", - 'ru-ru': 'URL-адрес свернутого изображения', - 'uk-ua': 'URL-адреса згорнутого зображення', - 'pt-br': 'URL da imagem recolhida', - }, - customLogoDescription: { - 'en-us': - 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', - 'de-ch': - 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', - 'es-es': - 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', - 'fr-fr': - 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', - 'ru-ru': - 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', - 'uk-ua': - 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', - 'pt-br': - 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', - }, - showLineNumber: { - 'en-us': 'Show query result line number', - 'de-ch': 'Zeilennummer des Abfrageergebnisses anzeigen', - 'es-es': 'Mostrar el número de línea del resultado de la consulta', - 'fr-fr': 'Afficher le numéro de ligne du résultat de la requête', - 'ru-ru': 'Показать номер строки результата запроса', - 'uk-ua': 'Показати номер рядка результату запиту', - 'pt-br': 'Mostrar número da linha do resultado da consulta', - }, - saveButtonColor: { - 'en-us': 'Save button color', - 'de-ch': 'Farbe der Schaltfläche „Speichern“', - 'es-es': 'Guardar color del botón', - 'fr-fr': 'Couleur du bouton Enregistrer', - 'ru-ru': 'Сохранить цвет кнопки', - 'uk-ua': 'Зберегти колір кнопки', - 'pt-br': 'Cor do botão Salvar', - }, - secondaryButtonColor: { - 'en-us': 'Secondary button color', - 'es-es': 'Color del botón secundario', - 'fr-fr': 'Couleur du bouton secondaire', - 'ru-ru': 'Цвет вторичной кнопки', - 'uk-ua': 'Колір вторинної кнопки', - 'de-ch': 'Sekundäre Schaltflächenfarbe', - 'pt-br': 'Cor do botão secundário', - }, - secondaryLightButtonColor: { - 'en-us': 'Secondary light button color', - 'de-ch': 'Farbe der sekundären Lichttaste', - 'es-es': 'Color del botón de luz secundaria', - 'fr-fr': 'Couleur du bouton lumineux secondaire', - 'ru-ru': 'Цвет кнопки дополнительного освещения', - 'uk-ua': 'Колір вторинної світлової кнопки', - 'pt-br': 'Cor do botão de luz secundária', - }, - dangerButtonColor: { - 'en-us': 'Danger button color', - 'de-ch': 'Farbe der Gefahrenschaltfläche', - 'es-es': 'Color del botón de peligro', - 'fr-fr': 'Couleur du bouton de danger', - 'ru-ru': 'Цвет кнопки «Опасность»', - 'uk-ua': 'Колір кнопки небезпеки', - 'pt-br': 'Cor do botão de perigo', - }, - infoButtonColor: { - 'en-us': 'Info button color', - 'de-ch': 'Farbe der Info-Schaltfläche', - 'es-es': 'Color del botón de información', - 'fr-fr': "Couleur du bouton d'information", - 'ru-ru': 'Цвет кнопки информации', - 'uk-ua': 'Колір інформаційної кнопки', - 'pt-br': 'Cor do botão de informações', - }, - warningButtonColor: { - 'en-us': 'Warning button color', - 'de-ch': 'Farbe der Warnschaltfläche', - 'es-es': 'Color del botón de advertencia', - 'fr-fr': "Couleur du bouton d'avertissement", - 'ru-ru': 'Цвет кнопки предупреждения', - 'uk-ua': 'Колір кнопки попередження', - 'pt-br': 'Cor do botão de aviso', - }, - successButtonColor: { - 'en-us': 'Success button color', - 'de-ch': 'Farbe der Schaltfläche „Erfolg“', - 'es-es': 'Color del botón de éxito', - 'fr-fr': 'Couleur du bouton de réussite', - 'ru-ru': 'Цвет кнопки «Успех»', - 'uk-ua': 'Колір кнопки успіху', - 'pt-br': 'Cor do botão de sucesso', - }, - openAsReadOnly: { - 'en-us': 'Open all records in read-only mode', - 'de-ch': 'Alle Datensätze im schreibgeschützten Modus öffnen', - 'es-es': 'Abrir todos los registros en modo de solo lectura', - 'fr-fr': 'Ouvrir tous les enregistrements en mode lecture seule', - 'ru-ru': 'Открыть все записи в режиме только для чтения', - 'uk-ua': 'Відкрити всі записи в режимі лише для читання', - 'pt-br': 'Abra todos os registros no modo somente leitura', - }, - displayBasicView: { - 'en-us': 'Display basic view', - 'de-ch': 'Basisansicht anzeigen', - 'es-es': 'Mostrar vista básica', - 'fr-fr': 'Afficher la vue de base', - 'ru-ru': 'Отобразить базовый вид', - 'uk-ua': 'Відобразити базовий вигляд', - 'pt-br': 'Exibir visualização básica', - }, - showComparisonOperatorsForString: { - 'en-us': 'Show comparison operators for text-based fields', - 'de-ch': 'Vergleichsoperatoren für textbasierte Felder anzeigen', - 'es-es': 'Mostrar operadores de comparación para campos basados en texto', - 'fr-fr': 'Afficher les opérateurs de comparaison pour les champs textuels', - 'pt-br': 'Mostrar operadores de comparação para campos baseados em texto', - 'ru-ru': 'Показать операторы сравнения для текстовых полей', - 'uk-ua': 'Показати оператори порівняння для текстових полів', - }, - showComparisonOperatorsDescription: { - 'en-us': - 'Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to', - 'de-ch': - 'Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich', - 'es-es': - 'Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que', - 'fr-fr': - "Permet d'appliquer les filtres suivants aux champs de texte : Supérieur à, Inférieur à, Supérieur ou égal à et Inférieur ou égal à", - 'pt-br': - 'Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a', - 'ru-ru': - 'Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».', - 'uk-ua': - 'Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»', - }, - basicView: { - 'en-us': 'Basic view', - 'de-ch': 'Basisansicht', - 'es-es': 'Vista básica', - 'fr-fr': 'Vue de base', - 'ru-ru': 'Базовый вид', - 'uk-ua': 'Основний вигляд', - 'pt-br': 'Visão básica', - }, - detailedView: { - 'en-us': 'Detailed view', - 'de-ch': 'Detailansicht', - 'es-es': 'Vista detallada', - 'fr-fr': 'Vue détaillée', - 'ru-ru': 'Подробный вид', - 'uk-ua': 'Детальний вигляд', - 'pt-br': 'Visão detalhada', - }, - attachmentPreviewMode: { - 'en-us': 'Attachment preview mode', - 'de-ch': 'Anhangsvorschaumodus', - 'es-es': 'Modo de vista previa de archivos adjuntos', - 'fr-fr': "Mode d'aperçu des pièces jointes", - 'ru-ru': 'Режим предварительного просмотра вложений', - 'uk-ua': 'Режим попереднього перегляду вкладених файлів', - 'pt-br': 'Modo de visualização de anexos', - }, - fullResolution: { - 'en-us': 'Full Resolution', - 'de-ch': 'Volle Auflösung', - 'es-es': 'Resolución completa', - 'fr-fr': 'Pleine résolution', - 'ru-ru': 'Полное разрешение', - 'uk-ua': 'Повна роздільна здатність', - 'pt-br': 'Resolução completa', - }, - thumbnail: { - 'en-us': 'Thumbnail', - 'de-ch': 'Miniaturansicht', - 'es-es': 'Uña del pulgar', - 'fr-fr': 'Vignette', - 'ru-ru': 'Миниатюра', - 'uk-ua': 'Мініатюра', - 'pt-br': 'Miniatura', - }, - addSearchBarHomePage: { - 'en-us': 'Add Search Bar on home page', - 'de-ch': 'Suchleiste auf der Startseite hinzufügen', - 'es-es': 'Agregar barra de búsqueda en la página de inicio', - 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", - 'ru-ru': 'Добавить панель поиска на домашнюю страницу', - 'uk-ua': 'Додайте рядок пошуку на головну сторінку', - 'pt-br': 'Adicionar barra de pesquisa na página inicial', - }, - inheritanceCatNumberPref: { - 'en-us': - 'Enable the inheritance of the primary catalog number to its empty siblings.', - 'de-ch': - 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', - 'es-es': - 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', - 'fr-fr': - "Activer l'héritage du numéro de catalogue principal à ses frères vides.", - 'pt-br': - 'Habilitar a herança do número de catálogo primário para seus irmãos vazios.', - 'ru-ru': - 'Включить наследование основного каталожного номера его пустыми родственными номерами.', - 'uk-ua': - 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', - }, - inheritanceCatNumberParentCOPref: { - 'en-us': - 'Enable the inheritance of the parent catalog number to its empty children.', - 'de-ch': - 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.', - 'es-es': - 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', - 'fr-fr': - "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", - 'pt-br': - 'Habilita a herança do número do catálogo pai para seus filhos vazios.', - 'ru-ru': - 'Включить наследование родительского каталожного номера его пустыми дочерними элементами.', - 'uk-ua': - 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', - }, - uniqueCatNumberAcrossCompAndCo: { - 'en-us': - 'Catalog Number field need to be unique across Component and CO tables', - 'de-ch': - 'Das Feld „Katalognummer“ muss in allen Komponenten- und CO-Tabellen eindeutig sein', - 'es-es': - 'El campo Número de catálogo debe ser único en las tablas de componentes y CO', - 'fr-fr': - 'Le champ Numéro de catalogue doit être unique dans les tables Composant et CO', - 'pt-br': - 'O campo Número de catálogo precisa ser exclusivo nas tabelas Componente e CO', - 'ru-ru': - 'Поле «Номер каталога» должно быть уникальным в таблицах «Компонент» и «CO».', - 'uk-ua': - 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO».', - }, -} as const); + }, + +} as const; + +const aggregatedPreferences = { + ...preferencesGeneralDict, + ...preferencesContentDict, + ...preferencesBehaviorDict, +} as const; + +export const preferencesText = createDictionary(aggregatedPreferences); From 0baff4d392486fe01e1162e979234b437be20879 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 17 Oct 2025 09:21:02 -0400 Subject: [PATCH 061/115] createDictionary export for modularize prefrences --- .../js_src/lib/localization/preferences.behavior.ts | 5 +++-- .../frontend/js_src/lib/localization/preferences.content.ts | 5 +++-- specifyweb/frontend/js_src/lib/localization/preferences.ts | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index beb694d64ec..23b0dc1dcc8 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -3,8 +3,9 @@ * * @module */ +import { createDictionary } from './utils'; -export const preferencesBehaviorDict = { +export const preferencesBehaviorDict = createDictionary ({ altClickToSupressNewTab: { 'en-us': '{altKeyName:string}+Click to suppress new tab', @@ -726,6 +727,6 @@ export const preferencesBehaviorDict = { 'uk-ua': 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO».', }, -} as const; +} as const); export default preferencesBehaviorDict; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts index aa09742e5ff..60ac80d0ebb 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts @@ -3,8 +3,9 @@ * * @module */ +import { createDictionary } from './utils'; -export const preferencesContentDict = { +export const preferencesContentDict = createDictionary({ content: { 'en-us': 'Content', 'ru-ru': 'Содержание', @@ -695,6 +696,6 @@ export const preferencesContentDict = { 'de-ch': 'Standardmäßig zu öffnender Datensatz', 'pt-br': 'Gravar para abrir por padrão', }, -} as const; +} as const); export default preferencesContentDict; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 544708ca970..5556c57d063 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -7,7 +7,7 @@ import { createDictionary } from './utils'; import { preferencesContentDict } from './preferences.content'; import { preferencesBehaviorDict } from './preferences.behavior'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file -export const preferencesGeneralDict= { +export const preferencesGeneralDict= createDictionary({ preferences: { 'en-us': 'Preferences', 'ru-ru': 'Настройки', @@ -707,7 +707,7 @@ export const preferencesGeneralDict= { 'pt-br': 'Página inicial', }, -} as const; +} as const); const aggregatedPreferences = { ...preferencesGeneralDict, @@ -715,4 +715,4 @@ const aggregatedPreferences = { ...preferencesBehaviorDict, } as const; -export const preferencesText = createDictionary(aggregatedPreferences); +export const preferencesText = (aggregatedPreferences); From c7fc0db96b396a8eb03a247d65896c75aa1e7f5c Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 17 Oct 2025 12:21:54 -0400 Subject: [PATCH 062/115] Refactor preference localization dictionaries to expose raw maps --- .../lib/localization/preferences.behavior.ts | 10 +++++-- .../lib/localization/preferences.content.ts | 10 +++++-- .../js_src/lib/localization/preferences.ts | 30 ++++++++++++------- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 23b0dc1dcc8..21105babdc3 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -5,7 +5,7 @@ */ import { createDictionary } from './utils'; -export const preferencesBehaviorDict = createDictionary ({ +export const preferencesBehaviorStrings = { altClickToSupressNewTab: { 'en-us': '{altKeyName:string}+Click to suppress new tab', @@ -727,6 +727,10 @@ export const preferencesBehaviorDict = createDictionary ({ 'uk-ua': 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO».', }, -} as const); +} as const; -export default preferencesBehaviorDict; +export const preferencesBehaviorText = createDictionary( + preferencesBehaviorStrings +); + +export default preferencesBehaviorText; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts index 60ac80d0ebb..22be0918050 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts @@ -5,7 +5,7 @@ */ import { createDictionary } from './utils'; -export const preferencesContentDict = createDictionary({ +export const preferencesContentStrings = { content: { 'en-us': 'Content', 'ru-ru': 'Содержание', @@ -696,6 +696,10 @@ export const preferencesContentDict = createDictionary({ 'de-ch': 'Standardmäßig zu öffnender Datensatz', 'pt-br': 'Gravar para abrir por padrão', }, -} as const); +} as const; -export default preferencesContentDict; +export const preferencesContentText = createDictionary( + preferencesContentStrings +); + +export default preferencesContentText; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 5556c57d063..7ea7903bc8c 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -4,10 +4,14 @@ * @module */ import { createDictionary } from './utils'; -import { preferencesContentDict } from './preferences.content'; -import { preferencesBehaviorDict } from './preferences.behavior'; +import { + preferencesContentText, +} from './preferences.content'; +import { + preferencesBehaviorText, +} from './preferences.behavior'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file -export const preferencesGeneralDict= createDictionary({ +export const preferencesGeneralStrings = { preferences: { 'en-us': 'Preferences', 'ru-ru': 'Настройки', @@ -705,14 +709,18 @@ export const preferencesGeneralDict= createDictionary({ 'uk-ua': 'Домашня сторінка', 'de-ch': 'Startseite', 'pt-br': 'Página inicial', - }, - -} as const); + }, -const aggregatedPreferences = { - ...preferencesGeneralDict, - ...preferencesContentDict, - ...preferencesBehaviorDict, } as const; -export const preferencesText = (aggregatedPreferences); +export const preferencesGeneralDict = createDictionary(preferencesGeneralStrings); + +type PreferencesText = typeof preferencesGeneralDict & + typeof preferencesContentText & + typeof preferencesBehaviorText; + +export const preferencesText = Object.assign( + preferencesGeneralDict, + preferencesContentText, + preferencesBehaviorText +) as PreferencesText; From 694864ad62bf7712ec66ca27fa5f5d93f5eea242 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 17 Oct 2025 14:11:30 -0400 Subject: [PATCH 063/115] Modularize preferences localization dictionary --- .../lib/localization/preferences.behavior.ts | 1013 +++++--- .../lib/localization/preferences.content.ts | 767 +----- .../lib/localization/preferences.general.ts | 2092 +++++++++++++++++ .../js_src/lib/localization/preferences.ts | 727 +----- .../lib/localization/utils/scanUsages.ts | 29 +- 5 files changed, 2981 insertions(+), 1647 deletions(-) create mode 100644 specifyweb/frontend/js_src/lib/localization/preferences.general.ts diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 21105babdc3..df9608745f5 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -1,12 +1,743 @@ /** - * Localization strings for behavioral and advanced preferences. + * Localization strings for behavioral preferences. * * @module */ import { createDictionary } from './utils'; - -export const preferencesBehaviorStrings = { - altClickToSupressNewTab: { +// Refer to "Guidelines for Programmers" in ./README.md before editing this file +export const preferencesBehaviorDictionary = { + alwaysPrompt: { + 'en-us': 'Always prompt to choose collection', + 'ru-ru': 'Всегда предлагайте выбрать коллекцию', + 'es-es': 'Siempre dispuesto a elegir la colección', + 'fr-fr': 'Toujours invité à choisir la collection', + 'uk-ua': 'Завжди підкажуть вибрати колекцію', + 'de-ch': 'Immer zur Auswahl der Sammlung auffordern', + 'pt-br': 'Sempre pronto para escolher a coleção', + }, + showNewDataSetWarning: { + 'en-us': 'Show new Data Set warning', + 'ru-ru': 'Показать предупреждение о новом наборе данных', + 'es-es': 'Mostrar nueva advertencia de conjunto de datos', + 'fr-fr': "Afficher un nouvel avertissement sur l'ensemble de données", + 'uk-ua': 'Показати попередження про новий набір даних', + 'de-ch': 'Warnung für neuen Datensatz anzeigen', + 'pt-br': 'Mostrar novo aviso de conjunto de dados', + }, + showNewDataSetWarningDescription: { + 'en-us': 'Show an informational message when creating a new Data Set.', + 'ru-ru': + 'Показывать информационное сообщение при создании нового набора данных.', + 'es-es': + 'Mostrar un mensaje informativo al crear un nuevo conjunto de datos.', + 'fr-fr': + "Afficher un message d'information lors de la création d'un nouvel ensemble de données.", + 'uk-ua': + 'Показувати інформаційне повідомлення під час створення нового набору даних.', + 'de-ch': 'Zeige eine Meldung beim erstellen eines neuen Datensatzes an.', + 'pt-br': + 'Exibir uma mensagem informativa ao criar um novo conjunto de dados.', + }, + allowDismissingErrors: { + 'en-us': 'Allow dismissing error messages', + 'ru-ru': 'Разрешить отклонять сообщения об ошибках', + 'es-es': 'Permitir descartar mensajes de error', + 'fr-fr': "Autoriser le rejet des messages d'erreur", + 'uk-ua': 'Дозволити закривати повідомлення про помилки', + 'de-ch': 'Erlaube das Verwerfen von Fehlermeldungen', + 'pt-br': 'Permitir descartar mensagens de erro', + }, + updatePageTitle: { + 'en-us': 'Update page title', + 'ru-ru': 'Обновить заголовок страницы', + 'es-es': 'Actualizar el título de la página', + 'fr-fr': 'Mettre à jour le titre de la page', + 'uk-ua': 'Оновити назву сторінки', + 'de-ch': 'Seitentitel aktualisieren', + 'pt-br': 'Atualizar título da página', + }, + updatePageTitleDescription: { + 'en-us': + "Whether to update the title of the page to match dialog's header.", + 'ru-ru': + 'Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.', + 'es-es': + 'Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.', + 'fr-fr': + "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'en-tête de la boîte de dialogue.", + 'uk-ua': + 'Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.', + 'de-ch': + 'Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.', + }, + updatePageTitleFormDescription: { + 'en-us': 'Whether to update the title of the page to match current record.', + 'ru-ru': + 'Следует ли обновить заголовок страницы в соответствии с текущей записью.', + 'es-es': + 'Si desea actualizar el título de la página para que coincida con el registro actual.', + 'fr-fr': + "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'enregistrement actuel.", + 'uk-ua': 'Чи оновлювати назву сторінки відповідно до поточного запису.', + 'de-ch': + 'Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao registro atual.', + }, + queryComboBox: { + 'en-us': 'Query Combo Box', + 'ru-ru': 'Поле со списком запросов', + 'es-es': 'Cuadro combinado de consulta', + 'uk-ua': 'Поле зі списком запитів', + 'de-ch': 'Abfrage-Kombinationsfeld', + 'fr-fr': 'Zone de liste déroulante de requête', + 'pt-br': 'Caixa de combinação de consulta', + }, + searchAlgorithm: { + 'en-us': 'Search Algorithm', + 'ru-ru': 'Алгоритм поиска', + 'es-es': 'Algoritmo de búsqueda', + 'fr-fr': 'Algorithme de recherche', + 'uk-ua': 'Алгоритм пошуку', + 'de-ch': 'Suchalgorithmus', + 'pt-br': 'Algoritmo de Busca', + }, + treeSearchAlgorithm: { + 'en-us': 'Search Algorithm (for relationships with tree tables)', + 'ru-ru': 'Алгоритм поиска (для связей с древовидными таблицами)', + 'es-es': 'Algoritmo de búsqueda (para relaciones con tablas de árboles)', + 'fr-fr': + 'Algorithme de recherche (pour les relations avec les tables arborescentes)', + 'uk-ua': 'Алгоритм пошуку (для зв’язків із деревоподібними таблицями)', + 'de-ch': 'Suchalgorithmus (für Beziehungen mit Baumtabellen)', + 'pt-br': 'Algoritmo de busca (para relacionamentos com tabelas de árvore)', + }, + startsWithInsensitive: { + 'en-us': 'Starts With (case-insensitive)', + 'ru-ru': 'Начинается с (без учета регистра)', + 'es-es': 'Comienza con (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (insensible à la casse)', + 'uk-ua': 'Починається з (без урахування регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Começa com (sem distinção entre maiúsculas e minúsculas)', + }, + startsWithDescription: { + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Rechercher des valeurs commençant par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquise valores que começam com uma determinada sequência de consulta.', + }, + startsWithCaseSensitive: { + 'en-us': 'Starts With (case-sensitive)', + 'ru-ru': 'Начинается с (с учетом регистра)', + 'es-es': 'Comienza con (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (sensible à la casse)', + 'uk-ua': 'Починається з (з урахуванням регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Começa com (diferencia maiúsculas de minúsculas)', + }, + startsWithCaseSensitiveDescription: { + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Recherchez les valeurs qui commencent par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquise valores que começam com uma determinada sequência de consulta.', + }, + containsInsensitive: { + 'en-us': 'Contains (case-insensitive)', + 'ru-ru': 'Содержит (без учета регистра)', + 'es-es': 'Contiene (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Contient (insensible à la casse)', + 'uk-ua': 'Містить (незалежно від регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Contém (sem distinção entre maiúsculas e minúsculas)', + }, + containsCaseSensitive: { + 'en-us': 'Contains (case-sensitive)', + 'ru-ru': 'Содержит (с учетом регистра)', + 'es-es': 'Contiene (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Contient (sensible à la casse)', + 'uk-ua': 'Містить (з урахуванням регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Contém (diferencia maiúsculas de minúsculas)', + }, + containsDescription: { + 'en-us': + 'Search for values that contain a given query string (case-insensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (без учета регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (незалежно від регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).', + }, + containsCaseSensitiveDescription: { + 'en-us': + 'Search for values that contain a given query string (case-sensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (с учетом регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).', + }, + containsSecondDescription: { + 'en-us': + 'Can use _ to match any single character or % to match any number of characters.', + 'ru-ru': + 'Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.', + 'es-es': + 'Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.', + 'fr-fr': + "Peut utiliser _ pour correspondre à n'importe quel caractère ou % pour correspondre à n'importe quel nombre de caractères.", + 'uk-ua': + 'Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.', + 'de-ch': + 'Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.', + 'pt-br': + 'Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.', + }, + highlightMatch: { + 'en-us': 'Highlight matched substring', + 'ru-ru': 'Выделить совпавшую подстроку', + 'es-es': 'Resaltar la subcadena coincidente', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'uk-ua': 'Виділіть збіг підрядка', + 'de-ch': 'Markieren Sie übereinstimmende Teilzeichenfolgen', + 'pt-br': 'Destacar substring correspondente', + }, + languageDescription: { + 'en-us': 'Determines field captions, usage notes and table captions.', + 'ru-ru': + 'Определяет заголовки полей, примечания по использованию и заголовки таблиц.', + 'es-es': 'Determina títulos de campos, notas de uso y títulos de tablas.', + 'fr-fr': + "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux.", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць.', + 'de-ch': + 'Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.', + 'pt-br': 'Determina legendas de campo, notas de uso e legendas de tabela.', + }, + behavior: { + 'en-us': 'Behavior', + 'ru-ru': 'Поведение', + 'es-es': 'Comportamiento', + 'fr-fr': 'Comportement', + 'uk-ua': 'Поведінка', + 'de-ch': 'Verhalten', + 'pt-br': 'Comportamento', + }, + noRestrictionsMode: { + 'en-us': 'No restrictions mode', + 'ru-ru': 'Режим без ограничений', + 'es-es': 'Modo sin restricciones', + 'fr-fr': 'Mode sans restriction', + 'uk-ua': 'Режим без обмежень', + 'de-ch': 'Modus „Keine Einschränkungen“', + 'pt-br': 'Modo sem restrições', + }, + noRestrictionsModeWbDescription: { + 'en-us': 'Allows uploading data to any field in any table.', + 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', + 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', + 'fr-fr': + "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", + 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', + 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', + }, + noRestrictionsModeQueryDescription: { + 'en-us': 'Allows querying data from any field in any table.', + 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', + 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', + 'fr-fr': + "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", + 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', + 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', + }, + noRestrictionsModeWarning: { + 'en-us': + 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', + 'ru-ru': + 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', + 'es-es': + 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', + 'uk-ua': + 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', + 'de-ch': + 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', + 'fr-fr': + "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", + 'pt-br': + 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', + }, + adminsOnlyPreference: { + 'en-us': "You don't have permission to change this option", + 'ru-ru': 'У вас нет разрешения на изменение этой опции.', + 'es-es': 'No tienes permiso para cambiar esta opción', + 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", + 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', + 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', + 'pt-br': 'Você não tem permissão para alterar esta opção', + }, + stickyScrolling: { + 'en-us': 'Sticky scroll bar', + 'ru-ru': 'Липкая полоса прокрутки', + 'es-es': 'Barra de desplazamiento fija', + 'fr-fr': 'Barre de défilement collante', + 'uk-ua': 'Липка смуга прокрутки', + 'de-ch': 'Klebrige Bildlaufleiste', + 'pt-br': 'Barra de rolagem fixa', + }, + spreadsheet: { + 'en-us': 'Spreadsheet', + 'ru-ru': 'Электронная таблица', + 'es-es': 'Hoja de cálculo', + 'fr-fr': 'Tableur', + 'uk-ua': 'Електронна таблиця', + 'de-ch': 'Kalkulationstabelle', + 'pt-br': 'Planilha', + }, + minSpareRows: { + 'en-us': 'Number of blank rows at the end', + 'ru-ru': 'Количество пустых строк в конце', + 'es-es': 'Número de filas en blanco al final', + 'fr-fr': 'Nombre de lignes vides à la fin', + 'uk-ua': 'Кількість порожніх рядків у кінці', + 'de-ch': 'Anzahl der leeren Zeilen am Ende', + 'pt-br': 'Número de linhas em branco no final', + }, + autoWrapCols: { + 'en-us': 'Navigate to the other side when reaching the edge column', + 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', + }, + autoWrapRows: { + 'en-us': 'Navigate to the other side when reaching the edge row', + 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', + }, + enterBeginsEditing: { + 'en-us': 'Enter key begins editing cell', + 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', + 'es-es': 'La tecla Enter inicia la edición de la celda', + 'fr-fr': 'La touche Entrée commence à modifier la cellule', + 'uk-ua': 'Клавіша Enter починає редагування клітинки', + 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', + 'pt-br': 'A tecla Enter inicia a edição da célula', + }, + tabMoveDirection: { + 'en-us': 'Direction of movement when Tab key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Tab', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Tab', + 'fr-fr': + 'Sens de déplacement lorsque la touche Tabulation est enfoncée', + 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', + 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', + 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', + }, + tabMoveDirectionDescription: { + 'en-us': + 'You can move in the opposite direction by pressing Shift+Tab.', + 'ru-ru': + 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', + 'fr-fr': + 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', + 'uk-ua': + 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Tab.', + }, + column: { + 'en-us': 'Column', + 'ru-ru': 'Столбец', + 'es-es': 'Columna', + 'fr-fr': 'Colonne', + 'uk-ua': 'Колонка', + 'de-ch': 'Spalte', + 'pt-br': 'Coluna', + }, + row: { + 'en-us': 'Row', + 'ru-ru': 'Ряд', + 'es-es': 'Fila', + 'fr-fr': 'Rangée', + 'uk-ua': 'рядок', + 'de-ch': 'Reihe', + 'pt-br': 'Linha', + }, + enterMoveDirection: { + 'en-us': 'Direction of movement when Enter key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Enter', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Enter', + 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', + 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', + 'fr-fr': + 'Direction du mouvement lorsque la touche Entrer est enfoncée', + 'pt-br': + 'Direção do movimento quando a tecla Enter é pressionada', + }, + enterMoveDirectionDescription: { + 'en-us': + 'You can move in the opposite direction by pressing Shift+Enter.', + 'ru-ru': + 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', + 'fr-fr': 'Synonyme couleur.', + 'uk-ua': + 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Enter.', + }, + filterPickLists: { + 'en-us': 'Filter pick list items', + 'ru-ru': 'Фильтрация элементов списка выбора', + 'es-es': 'Filtrar elementos de la lista de selección', + 'fr-fr': 'Filtrer les éléments de la liste de sélection', + 'uk-ua': 'Фільтр вибору елементів списку', + 'de-ch': 'Auswahllistenelemente filtern', + 'pt-br': 'Filtrar itens da lista de seleção', + }, + exportFileDelimiter: { + 'en-us': 'Export file delimiter', + 'ru-ru': 'Разделитель файлов экспорта', + 'es-es': 'Delimitador de archivo de exportación', + 'fr-fr': "Délimiteur de fichier d'exportation", + 'uk-ua': 'Роздільник файлу експорту', + 'de-ch': 'Dateitrennzeichen exportieren', + 'pt-br': 'Delimitador de arquivo de exportação', + }, + exportCsvUtf8Bom: { + 'en-us': 'Add UTF-8 BOM to CSV file exports', + 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', + 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', + 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', + 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', + 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', + 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', + }, + exportCsvUtf8BomDescription: { + 'en-us': + 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', + 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', + 'es-es': + 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', + 'fr-fr': + "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", + 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', + 'de-ch': + 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', + 'pt-br': + 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', + }, + caseSensitive: { + 'en-us': 'Case-sensitive', + 'ru-ru': 'С учетом регистра', + 'es-es': 'Distingue mayúsculas y minúsculas', + 'fr-fr': 'Sensible aux majuscules et minuscules', + 'uk-ua': 'Чутливий до регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'pt-br': 'Maiúsculas e minúsculas', + }, + caseInsensitive: { + 'en-us': 'Case-insensitive', + 'ru-ru': 'Без учета регистра', + 'es-es': 'No distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Insensible à la casse', + 'uk-ua': 'Регістр не враховується', + 'de-ch': 'Groß- und Kleinschreibung wird nicht berücksichtigt', + 'pt-br': 'Não diferencia maiúsculas de minúsculas', + }, + showNoReadTables: { + 'en-us': 'Show tables without "Read" access', + 'ru-ru': 'Показывать таблицы без доступа «Чтение»', + 'es-es': 'Mostrar tablas sin acceso de "Lectura"', + 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', + 'uk-ua': 'Показувати таблиці без доступу «Читання»', + 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', + }, + showNoAccessTables: { + 'en-us': 'Show tables without "Create" access', + 'ru-ru': 'Показывать таблицы без права «Создать»', + 'es-es': 'Mostrar tablas sin acceso "Crear"', + 'fr-fr': 'Afficher les tableaux sans accès "Créer"', + 'uk-ua': 'Показувати таблиці без доступу «Створити»', + 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso "Criar"', + }, + textAreaAutoGrow: { + 'en-us': 'Text boxes grow automatically', + 'ru-ru': 'Текстовые поля увеличиваются автоматически', + 'es-es': 'Los cuadros de texto crecen automáticamente', + 'fr-fr': "Les zones de texte s'agrandissent automatiquement", + 'uk-ua': 'Текстові поля збільшуються автоматично', + 'de-ch': 'Textfelder werden automatisch vergrößert', + 'pt-br': 'As caixas de texto crescem automaticamente', + }, + clearQueryFilters: { + 'en-us': 'Reset query filters', + 'ru-ru': 'Сбросить фильтры запроса', + 'es-es': 'Restablecer filtros de consulta', + 'fr-fr': 'Réinitialiser les filtres de requête', + 'uk-ua': 'Скинути фільтри запитів', + 'de-ch': 'Abfragefilter zurücksetzen', + 'pt-br': 'Redefinir filtros de consulta', + }, + clearQueryFiltersDescription: { + 'en-us': 'Clears all query filters when running a Report from a Form.', + 'de-ch': + 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', + 'es-es': + 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', + 'fr-fr': + "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", + 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', + 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', + 'pt-br': + 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', + }, + queryParamtersFromForm: { + 'en-us': 'Show query filters when running a Report from a Form', + 'de-ch': + 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', + 'es-es': + 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', + 'fr-fr': + "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", + 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', + 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', + 'pt-br': + 'Mostrar filtros de consulta ao executar um relatório de um formulário', + }, + autoGrowAutoComplete: { + 'en-us': 'Allow autocomplete to grow as wide as need', + 'ru-ru': + 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', + 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', + 'fr-fr': + 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', + 'uk-ua': + 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', + 'de-ch': + 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', + 'pt-br': + 'Permitir que o preenchimento automático cresça o quanto for necessário', + }, + tableNameInTitle: { + 'en-us': 'Include table name in the browser page title', + 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', + 'es-es': + 'Incluir el nombre de la tabla en el título de la página del navegador', + 'fr-fr': + 'Inclure le nom de la table dans le titre de la page du navigateur', + 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', + 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', + 'pt-br': 'Incluir nome da tabela no título da página do navegador', + }, + focusFirstField: { + 'en-us': 'Focus first field', + 'de-ch': 'Fokus erstes Feld', + 'es-es': 'Enfoque el primer campo', + 'fr-fr': 'Concentrez-vous sur le premier champ', + 'ru-ru': 'Фокус первого поля', + 'uk-ua': 'Перейти до першого поля', + 'pt-br': 'Foco primeiro campo', + }, + doubleClickZoom: { + 'en-us': 'Double click to zoom', + 'ru-ru': 'Дважды щелкните, чтобы увеличить', + 'es-es': 'Haga doble clic para ampliar', + 'fr-fr': 'Double-cliquez pour zoomer', + 'uk-ua': 'Двічі клацніть, щоб збільшити', + 'de-ch': 'Zum Vergrößern doppelklicken', + 'pt-br': 'Clique duas vezes para ampliar', + }, + closePopupOnClick: { + 'en-us': 'Close pop-up on outside click', + 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', + 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', + 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", + 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', + 'de-ch': 'Popup bei externem Klick schließen', + 'pt-br': 'Fechar pop-up ao clicar fora', + }, + animateTransitions: { + 'en-us': 'Animate transitions', + 'ru-ru': 'Анимированные переходы', + 'es-es': 'Animar transiciones', + 'fr-fr': 'Animer les transitions', + 'uk-ua': 'Анімація переходів', + 'de-ch': 'Übergänge animieren', + 'pt-br': 'Transições animadas', + }, + panInertia: { + 'en-us': 'Pan inertia', + 'ru-ru': 'Инерция пан', + 'es-es': 'Inercia de la sartén', + 'fr-fr': 'Inertie du bac', + 'uk-ua': 'Інерція панорами', + 'de-ch': 'Schwenkträgheit', + 'pt-br': 'Inércia da panela', + }, + mouseDrags: { + 'en-us': 'Mouse drags', + 'ru-ru': 'Перетаскивание мышью', + 'es-es': 'El ratón arrastra', + 'uk-ua': 'Виділіть відповідний підрядок', + 'de-ch': 'Maus zieht', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'pt-br': 'Arrastos do mouse', + }, + scrollWheelZoom: { + 'en-us': 'Scroll wheel zoom', + 'ru-ru': 'Масштабирование с помощью колеса прокрутки', + 'es-es': 'Zoom con rueda de desplazamiento', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Scrollrad-Zoom', + 'pt-br': 'Zoom da roda de rolagem', + }, + flexibleColumnWidth: { + 'en-us': 'Flexible column width', + 'ru-ru': 'Гибкая ширина столбца', + 'es-es': 'Ancho de columna flexible', + 'fr-fr': 'Largeur de colonne flexible', + 'uk-ua': 'Гнучка ширина колонки', + 'de-ch': 'Flexible Spaltenbreite', + 'pt-br': 'Largura de coluna flexível', + }, + flexibleSubGridColumnWidth: { + 'en-us': 'Flexible subview grid column width', + 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', + 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Flexible Rasterspaltenbreite der Unteransicht', + 'pt-br': 'Largura flexível da coluna da grade de subvisualização', + }, + closeOnEsc: { + 'en-us': 'Close on ESC key press', + 'ru-ru': 'Закрыть нажатием клавиши ESC', + 'es-es': 'Cerrar al presionar la tecla ESC', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Закриття натисканням клавіші ESC', + 'de-ch': 'Schließen durch Drücken der Taste ESC', + 'pt-br': 'Fechar ao pressionar a tecla ESC', + }, + closeOnOutsideClick: { + 'en-us': 'Close on outside click', + 'ru-ru': 'Закрытие по внешнему щелчку', + 'es-es': 'Cerrar al hacer clic desde fuera', + 'fr-fr': 'Fermer sur clic extérieur', + 'uk-ua': 'Закрийте зовнішнім клацанням', + 'de-ch': 'Schließen durch Klicken von außen', + 'pt-br': 'Fechar com clique externo', + }, + scopeEntireTablePicklists: { + 'en-us': 'Scope "Entire Table" picklists', + }, + scopeEntireTablePicklistsDescription: { + 'en-us': + 'Restrict "Entire Table" picklists to values used by records in this collection.', + }, + catalogNumberInheritanceDescription: { + 'en-us': + 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', + }, + catalogNumberParentInheritanceDescription: { + 'en-us': + 'Control whether component records inherit catalog numbers from their parent Collection Object.', + }, + useAccessibleFullDatePicker: { + 'en-us': 'Use accessible full date picker', + 'ru-ru': 'Используйте доступный полный выбор даты', + 'es-es': 'Utilice el selector de fecha completo y accesible', + 'fr-fr': 'Utiliser un sélecteur de date complet accessible', + 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', + 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', + 'pt-br': 'Use o seletor de data completo acessível', + }, + useAccessibleMonthPicker: { + 'en-us': 'Use accessible month picker', + 'ru-ru': 'Используйте доступный выбор месяца', + 'es-es': 'Utilice el selector de meses accesible', + 'fr-fr': 'Utiliser le sélecteur de mois accessible', + 'uk-ua': 'Використовуйте доступний засіб вибору місяця', + 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', + 'pt-br': 'Use o seletor de meses acessível', + }, + collectionSortOrderDescription: { + 'en-us': 'This determines the visual order of collections.', + 'ru-ru': 'Это определяет визуальный порядок коллекций.', + 'es-es': 'Esto determina el orden visual de las colecciones.', + 'fr-fr': "Ceci détermine l'ordre visuel des collections.", + 'uk-ua': 'Це визначає візуальний порядок колекцій.', + 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', + 'pt-br': 'Isso determina a ordem visual das coleções.', + }, + recordSetRecordToOpen: { + 'en-us': 'Record to open by default', + 'ru-ru': 'Запись для открытия по умолчанию', + 'es-es': 'Registro para abrir por defecto', + 'fr-fr': 'Enregistrement à ouvrir par défaut', + 'uk-ua': 'Запис відкривається за умовчанням', + 'de-ch': 'Standardmäßig zu öffnender Datensatz', + 'pt-br': 'Gravar para abrir por padrão', + }, +altClickToSupressNewTab: { 'en-us': '{altKeyName:string}+Click to suppress new tab', 'ru-ru': @@ -67,98 +798,6 @@ export const preferencesBehaviorStrings = { 'ru-ru': 'Сортировать по полю', 'uk-ua': 'Сортувати за полем', }, - lineWrap: { - 'en-us': 'Line wrap', - 'ru-ru': 'Перенос строки', - 'es-es': 'Ajuste de línea', - 'fr-fr': 'Retour à la ligne', - 'uk-ua': 'Обтікання лініями', - 'de-ch': 'Zeilenumbruch', - 'pt-br': 'Quebra de linha', - }, - indentSize: { - 'en-us': 'Indent size', - 'ru-ru': 'Размер отступа', - 'es-es': 'Tamaño de sangría', - 'fr-fr': 'Taille du retrait', - 'uk-ua': 'Розмір відступу', - 'de-ch': 'Einzugsgröße', - 'pt-br': 'Tamanho do recuo', - }, - indentWithTab: { - 'en-us': 'Indent with Tab', - 'ru-ru': 'Отступ с помощью Tab', - 'es-es': 'Sangría con Tab', - 'fr-fr': 'Indenter avec Tabulation', - 'uk-ua': 'Відступ із Tab', - 'de-ch': 'Einrücken mit Tab', - 'pt-br': 'Recuo com Tab', - }, - formHeaderFormat: { - 'en-us': 'Form header format', - 'ru-ru': 'Формат заголовка формы', - 'es-es': 'Formato del encabezado del formulario', - 'fr-fr': "Format d'en-tête de formulaire", - 'uk-ua': 'Формат заголовка форми', - 'de-ch': 'Formularkopfformat', - 'pt-br': 'Formato do cabeçalho do formulário', - }, - iconAndTableName: { - 'en-us': 'Icon and table name', - 'ru-ru': 'Значок и название таблицы', - 'es-es': 'Icono y nombre de la tabla', - 'fr-fr': 'Icône et nom de la table', - 'uk-ua': 'Значок і назва таблиці', - 'de-ch': 'Symbol und Tabellenname', - 'pt-br': 'Ícone e nome da tabela', - }, - tableIcon: { - 'en-us': 'Table icon', - 'ru-ru': 'Значок таблицы', - 'es-es': 'Icono de tabla', - 'fr-fr': 'Icône de tableau', - 'uk-ua': 'Значок таблиці', - 'de-ch': 'Tabellensymbol', - 'pt-br': 'Ícone de tabela', - }, - maxHeight: { - 'en-us': 'Max height', - 'ru-ru': 'Максимальная высота', - 'es-es': 'Altura máxima', - 'fr-fr': 'hauteur maximum', - 'uk-ua': 'Максимальна висота', - 'de-ch': 'Maximale Höhe', - 'pt-br': 'Altura máxima', - }, - autoComplete: { - 'en-us': 'Auto complete', - 'ru-ru': 'Автозаполнение', - 'es-es': 'Autocompletar', - 'fr-fr': - "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", - 'uk-ua': - 'Визначає підписи полів, примітки щодо використання та підписи таблиць', - 'de-ch': 'Autovervollständigung', - 'pt-br': 'Preenchimento automático', - }, - searchCaseSensitive: { - 'en-us': 'Case-sensitive search', - 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', - 'fr-fr': 'Recherche sensible à la casse', - 'uk-ua': 'Пошук з урахуванням регістру', - 'de-ch': 'Groß- und Kleinschreibung beachten', - 'ru-ru': 'Поиск с учетом регистра', - 'pt-br': 'Pesquisa com diferenciação entre maiúsculas e minúsculas', - }, - searchField: { - 'en-us': 'Search Field', - 'ru-ru': 'Поле поиска', - 'es-es': 'Campo de búsqueda', - 'fr-fr': 'Champ de recherche', - 'uk-ua': 'Поле пошуку', - 'de-ch': 'Suchfeld', - 'pt-br': 'Campo de pesquisa', - }, createInteractions: { 'en-us': 'Creating an interaction', 'ru-ru': 'Создание взаимодействия', @@ -440,148 +1079,6 @@ export const preferencesBehaviorStrings = { 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', 'pt-br': 'Dividir longas linhas de XML em várias linhas', }, - url: { - 'en-us': 'URL', - 'de-ch': 'URL', - 'es-es': 'URL', - 'fr-fr': 'URL', - 'uk-ua': 'URL', - 'ru-ru': 'URL', - 'pt-br': 'URL', - }, - pickAttachment: { - 'en-us': 'Pick an attachment', - 'es-es': 'Elige un archivo adjunto', - 'fr-fr': 'Choisissez une pièce jointe', - 'ru-ru': 'Выберите вложение', - 'uk-ua': 'Виберіть вкладення', - 'de-ch': 'Wählen Sie einen Anhang', - 'pt-br': 'Escolha um anexo', - }, - attachmentFailed: { - 'en-us': 'The attachment failed to load.', - 'de-ch': 'Der Anhang konnte nicht geladen werden.', - 'es-es': 'No se pudo cargar el archivo adjunto.', - 'fr-fr': "La pièce jointe n'a pas pu être chargée.", - 'ru-ru': 'Не удалось загрузить вложение.', - 'uk-ua': 'Не вдалося завантажити вкладений файл.', - 'pt-br': 'O anexo não pôde ser carregado.', - }, - pickImage: { - 'en-us': 'Pick an image', - 'de-ch': 'Wählen Sie ein Bild aus', - 'es-es': 'Elige una imagen', - 'fr-fr': 'Choisissez une image', - 'ru-ru': 'Выберите изображение', - 'uk-ua': 'Виберіть зображення', - 'pt-br': 'Escolha uma imagem', - }, - customLogo: { - 'en-us': 'Expanded Image URL', - 'de-ch': 'Erweiterte Bild-URL', - 'es-es': 'URL de imagen expandida', - 'fr-fr': "URL de l'image étendue", - 'ru-ru': 'URL-адрес развернутого изображения', - 'uk-ua': 'Розширена URL-адреса зображення', - 'pt-br': 'URL da imagem expandida', - }, - customLogoCollapsed: { - 'en-us': 'Collapsed Image URL', - 'de-ch': 'URL des minimierten Bildes', - 'es-es': 'URL de imagen contraída', - 'fr-fr': "URL de l'image réduite", - 'ru-ru': 'URL-адрес свернутого изображения', - 'uk-ua': 'URL-адреса згорнутого зображення', - 'pt-br': 'URL da imagem recolhida', - }, - customLogoDescription: { - 'en-us': - 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', - 'de-ch': - 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', - 'es-es': - 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', - 'fr-fr': - 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', - 'ru-ru': - 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', - 'uk-ua': - 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', - 'pt-br': - 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', - }, - showLineNumber: { - 'en-us': 'Show query result line number', - 'de-ch': 'Zeilennummer des Abfrageergebnisses anzeigen', - 'es-es': 'Mostrar el número de línea del resultado de la consulta', - 'fr-fr': 'Afficher le numéro de ligne du résultat de la requête', - 'ru-ru': 'Показать номер строки результата запроса', - 'uk-ua': 'Показати номер рядка результату запиту', - 'pt-br': 'Mostrar número da linha do resultado da consulta', - }, - saveButtonColor: { - 'en-us': 'Save button color', - 'de-ch': 'Farbe der Schaltfläche „Speichern“', - 'es-es': 'Guardar color del botón', - 'fr-fr': 'Couleur du bouton Enregistrer', - 'ru-ru': 'Сохранить цвет кнопки', - 'uk-ua': 'Зберегти колір кнопки', - 'pt-br': 'Cor do botão Salvar', - }, - secondaryButtonColor: { - 'en-us': 'Secondary button color', - 'es-es': 'Color del botón secundario', - 'fr-fr': 'Couleur du bouton secondaire', - 'ru-ru': 'Цвет вторичной кнопки', - 'uk-ua': 'Колір вторинної кнопки', - 'de-ch': 'Sekundäre Schaltflächenfarbe', - 'pt-br': 'Cor do botão secundário', - }, - secondaryLightButtonColor: { - 'en-us': 'Secondary light button color', - 'de-ch': 'Farbe der sekundären Lichttaste', - 'es-es': 'Color del botón de luz secundaria', - 'fr-fr': 'Couleur du bouton lumineux secondaire', - 'ru-ru': 'Цвет кнопки дополнительного освещения', - 'uk-ua': 'Колір вторинної світлової кнопки', - 'pt-br': 'Cor do botão de luz secundária', - }, - dangerButtonColor: { - 'en-us': 'Danger button color', - 'de-ch': 'Farbe der Gefahrenschaltfläche', - 'es-es': 'Color del botón de peligro', - 'fr-fr': 'Couleur du bouton de danger', - 'ru-ru': 'Цвет кнопки «Опасность»', - 'uk-ua': 'Колір кнопки небезпеки', - 'pt-br': 'Cor do botão de perigo', - }, - infoButtonColor: { - 'en-us': 'Info button color', - 'de-ch': 'Farbe der Info-Schaltfläche', - 'es-es': 'Color del botón de información', - 'fr-fr': "Couleur du bouton d'information", - 'ru-ru': 'Цвет кнопки информации', - 'uk-ua': 'Колір інформаційної кнопки', - 'pt-br': 'Cor do botão de informações', - }, - warningButtonColor: { - 'en-us': 'Warning button color', - 'de-ch': 'Farbe der Warnschaltfläche', - 'es-es': 'Color del botón de advertencia', - 'fr-fr': "Couleur du bouton d'avertissement", - 'ru-ru': 'Цвет кнопки предупреждения', - 'uk-ua': 'Колір кнопки попередження', - 'pt-br': 'Cor do botão de aviso', - }, - successButtonColor: { - 'en-us': 'Success button color', - 'de-ch': 'Farbe der Schaltfläche „Erfolg“', - 'es-es': 'Color del botón de éxito', - 'fr-fr': 'Couleur du bouton de réussite', - 'ru-ru': 'Цвет кнопки «Успех»', - 'uk-ua': 'Колір кнопки успіху', - 'pt-br': 'Cor do botão de sucesso', - }, openAsReadOnly: { 'en-us': 'Open all records in read-only mode', 'de-ch': 'Alle Datensätze im schreibgeschützten Modus öffnen', @@ -643,42 +1140,6 @@ export const preferencesBehaviorStrings = { 'uk-ua': 'Детальний вигляд', 'pt-br': 'Visão detalhada', }, - attachmentPreviewMode: { - 'en-us': 'Attachment preview mode', - 'de-ch': 'Anhangsvorschaumodus', - 'es-es': 'Modo de vista previa de archivos adjuntos', - 'fr-fr': "Mode d'aperçu des pièces jointes", - 'ru-ru': 'Режим предварительного просмотра вложений', - 'uk-ua': 'Режим попереднього перегляду вкладених файлів', - 'pt-br': 'Modo de visualização de anexos', - }, - fullResolution: { - 'en-us': 'Full Resolution', - 'de-ch': 'Volle Auflösung', - 'es-es': 'Resolución completa', - 'fr-fr': 'Pleine résolution', - 'ru-ru': 'Полное разрешение', - 'uk-ua': 'Повна роздільна здатність', - 'pt-br': 'Resolução completa', - }, - thumbnail: { - 'en-us': 'Thumbnail', - 'de-ch': 'Miniaturansicht', - 'es-es': 'Uña del pulgar', - 'fr-fr': 'Vignette', - 'ru-ru': 'Миниатюра', - 'uk-ua': 'Мініатюра', - 'pt-br': 'Miniatura', - }, - addSearchBarHomePage: { - 'en-us': 'Add Search Bar on home page', - 'de-ch': 'Suchleiste auf der Startseite hinzufügen', - 'es-es': 'Agregar barra de búsqueda en la página de inicio', - 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", - 'ru-ru': 'Добавить панель поиска на домашнюю страницу', - 'uk-ua': 'Додайте рядок пошуку на головну сторінку', - 'pt-br': 'Adicionar barra de pesquisa na página inicial', - }, inheritanceCatNumberPref: { 'en-us': 'Enable the inheritance of the primary catalog number to its empty siblings.', @@ -730,7 +1191,5 @@ export const preferencesBehaviorStrings = { } as const; export const preferencesBehaviorText = createDictionary( - preferencesBehaviorStrings + preferencesBehaviorDictionary ); - -export default preferencesBehaviorText; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts index 22be0918050..aa371bc7816 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.content.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.content.ts @@ -1,11 +1,29 @@ /** - * Localization strings for content and asset preferences. + * Localization strings for content-related preferences. * * @module */ import { createDictionary } from './utils'; - -export const preferencesContentStrings = { +// Refer to "Guidelines for Programmers" in ./README.md before editing this file +export const preferencesContentDictionary = { + displayAuthor: { + 'en-us': 'Show author in the tree', + 'ru-ru': 'Показать автора в дереве', + 'es-es': 'Mostrar autor en el árbol', + 'fr-fr': "Afficher l'auteur dans l'arbre", + 'uk-ua': 'Показати автора в дереві', + 'de-ch': 'Autor im Baum anzeigen', + 'pt-br': 'Mostrar autor', + }, + welcomePage: { + 'en-us': 'Home Page', + 'ru-ru': 'Домашняя страница', + 'es-es': 'Página de inicio', + 'fr-fr': "Page d'accueil", + 'uk-ua': 'Домашня сторінка', + 'de-ch': 'Startseite', + 'pt-br': 'Página inicial', + }, content: { 'en-us': 'Content', 'ru-ru': 'Содержание', @@ -52,551 +70,6 @@ export const preferencesContentStrings = { 'Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:', 'pt-br': 'Um URL para uma página que seria incorporada na página inicial:', }, - behavior: { - 'en-us': 'Behavior', - 'ru-ru': 'Поведение', - 'es-es': 'Comportamiento', - 'fr-fr': 'Comportement', - 'uk-ua': 'Поведінка', - 'de-ch': 'Verhalten', - 'pt-br': 'Comportamento', - }, - noRestrictionsMode: { - 'en-us': 'No restrictions mode', - 'ru-ru': 'Режим без ограничений', - 'es-es': 'Modo sin restricciones', - 'fr-fr': 'Mode sans restriction', - 'uk-ua': 'Режим без обмежень', - 'de-ch': 'Modus „Keine Einschränkungen“', - 'pt-br': 'Modo sem restrições', - }, - noRestrictionsModeWbDescription: { - 'en-us': 'Allows uploading data to any field in any table.', - 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', - 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', - 'fr-fr': - "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", - 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', - 'de-ch': - 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', - 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', - }, - noRestrictionsModeQueryDescription: { - 'en-us': 'Allows querying data from any field in any table.', - 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', - 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', - 'fr-fr': - "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", - 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', - 'de-ch': - 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', - 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', - }, - noRestrictionsModeWarning: { - 'en-us': - 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', - 'ru-ru': - 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', - 'es-es': - 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', - 'uk-ua': - 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', - 'de-ch': - 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', - 'fr-fr': - "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", - 'pt-br': - 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', - }, - adminsOnlyPreference: { - 'en-us': "You don't have permission to change this option", - 'ru-ru': 'У вас нет разрешения на изменение этой опции.', - 'es-es': 'No tienes permiso para cambiar esta opción', - 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", - 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', - 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', - 'pt-br': 'Você não tem permissão para alterar esta opção', - }, - stickyScrolling: { - 'en-us': 'Sticky scroll bar', - 'ru-ru': 'Липкая полоса прокрутки', - 'es-es': 'Barra de desplazamiento fija', - 'fr-fr': 'Barre de défilement collante', - 'uk-ua': 'Липка смуга прокрутки', - 'de-ch': 'Klebrige Bildlaufleiste', - 'pt-br': 'Barra de rolagem fixa', - }, - foreground: { - 'en-us': 'Foreground', - 'ru-ru': 'Передний план', - 'es-es': 'Primer plano', - 'fr-fr': 'Premier plan', - 'uk-ua': 'Передній план', - 'de-ch': 'Vordergrund', - 'pt-br': 'Primeiro plano', - }, - background: { - 'en-us': 'Background', - 'ru-ru': 'Фон', - 'es-es': 'Fondo', - 'fr-fr': 'Arrière-plan', - 'uk-ua': 'Фон', - 'de-ch': 'Hintergrund', - 'pt-br': 'Fundo', - }, - sidebarTheme: { - 'en-us': 'Sidebar theme', - 'de-ch': 'Seitenleistenthema', - 'es-es': 'Tema de la barra lateral', - 'fr-fr': 'Thème de la barre latérale', - 'ru-ru': 'Тема боковой панели', - 'uk-ua': 'Тема бічної панелі', - 'pt-br': 'Tema da barra lateral', - }, - darkForeground: { - 'en-us': 'Foreground (dark theme)', - 'ru-ru': 'Передний план (тёмная тема)', - 'es-es': 'Primer plano (tema oscuro)', - 'fr-fr': 'Premier plan (thème sombre)', - 'uk-ua': 'Передній план (темна тема)', - 'de-ch': 'Vordergrund (dunkles Design)', - 'pt-br': 'Primeiro plano (tema escuro)', - }, - darkBackground: { - 'en-us': 'Background (dark theme)', - 'ru-ru': 'Фон (тёмная тема)', - 'es-es': 'Fondo (tema oscuro)', - 'fr-fr': 'Arrière-plan (thème sombre)', - 'uk-ua': 'Фон (темна тема)', - 'de-ch': 'Hintergrund (dunkles Design)', - 'pt-br': 'Plano de fundo (tema escuro)', - }, - accentColor1: { - 'en-us': 'Accent color 1', - 'ru-ru': 'Акцентный цвет 1', - 'es-es': 'Color de acento 1', - 'fr-fr': "Couleur d'accent 1", - 'uk-ua': 'Акцентний колір 1', - 'de-ch': 'Akzentfarbe 1', - 'pt-br': 'Cor de destaque 1', - }, - accentColor2: { - 'en-us': 'Accent color 2', - 'ru-ru': 'Акцентный цвет 2', - 'es-es': 'Color de acento 2', - 'fr-fr': "Couleur d'accent 2", - 'uk-ua': 'Акцентний колір 2', - 'de-ch': 'Akzentfarbe 2', - 'pt-br': 'Cor de destaque 2', - }, - accentColor3: { - 'en-us': 'Accent color 3', - 'ru-ru': 'Акцентный цвет 3', - 'es-es': 'Color de acento 3', - 'fr-fr': "Couleur d'accent 3", - 'uk-ua': 'Акцентний колір 3', - 'de-ch': 'Akzentfarbe 3', - 'pt-br': 'Cor de destaque 3', - }, - accentColor4: { - 'en-us': 'Accent color 4', - 'ru-ru': 'Акцентный цвет 4', - 'es-es': 'Color de acento 4', - 'fr-fr': "Couleur d'accent 4", - 'uk-ua': 'Акцентний колір 4', - 'de-ch': 'Akzentfarbe 4', - 'pt-br': 'Cor de destaque 4', - }, - accentColor5: { - 'en-us': 'Accent color 5', - 'ru-ru': 'Акцентный цвет 5', - 'es-es': 'Color de acento 5', - 'fr-fr': "Couleur d'accent 5", - 'uk-ua': 'Акцентний колір 5', - 'de-ch': 'Akzentfarbe 5', - 'pt-br': 'Cor de destaque 5', - }, - spreadsheet: { - 'en-us': 'Spreadsheet', - 'ru-ru': 'Электронная таблица', - 'es-es': 'Hoja de cálculo', - 'fr-fr': 'Tableur', - 'uk-ua': 'Електронна таблиця', - 'de-ch': 'Kalkulationstabelle', - 'pt-br': 'Planilha', - }, - minSpareRows: { - 'en-us': 'Number of blank rows at the end', - 'ru-ru': 'Количество пустых строк в конце', - 'es-es': 'Número de filas en blanco al final', - 'fr-fr': 'Nombre de lignes vides à la fin', - 'uk-ua': 'Кількість порожніх рядків у кінці', - 'de-ch': 'Anzahl der leeren Zeilen am Ende', - 'pt-br': 'Número de linhas em branco no final', - }, - autoWrapCols: { - 'en-us': 'Navigate to the other side when reaching the edge column', - 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', - 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', - 'fr-fr': - 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', - 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', - 'de-ch': - 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', - 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', - }, - autoWrapRows: { - 'en-us': 'Navigate to the other side when reaching the edge row', - 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', - 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', - 'fr-fr': - 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', - 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', - 'de-ch': - 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', - 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', - }, - enterBeginsEditing: { - 'en-us': 'Enter key begins editing cell', - 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', - 'es-es': 'La tecla Enter inicia la edición de la celda', - 'fr-fr': 'La touche Entrée commence à modifier la cellule', - 'uk-ua': 'Клавіша Enter починає редагування клітинки', - 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', - 'pt-br': 'A tecla Enter inicia a edição da célula', - }, - tabMoveDirection: { - 'en-us': 'Direction of movement when Tab key is pressed', - 'ru-ru': 'Направление движения при нажатии клавиши Tab', - 'es-es': - 'Dirección de movimiento cuando se presiona la tecla Tab', - 'fr-fr': - 'Sens de déplacement lorsque la touche Tabulation est enfoncée', - 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', - 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', - 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', - }, - tabMoveDirectionDescription: { - 'en-us': - 'You can move in the opposite direction by pressing Shift+Tab.', - 'ru-ru': - 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', - 'es-es': - 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', - 'fr-fr': - 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', - 'uk-ua': - 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', - 'de-ch': - 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', - 'pt-br': - 'Você pode mover na direção oposta pressionando Shift+Tab.', - }, - column: { - 'en-us': 'Column', - 'ru-ru': 'Столбец', - 'es-es': 'Columna', - 'fr-fr': 'Colonne', - 'uk-ua': 'Колонка', - 'de-ch': 'Spalte', - 'pt-br': 'Coluna', - }, - row: { - 'en-us': 'Row', - 'ru-ru': 'Ряд', - 'es-es': 'Fila', - 'fr-fr': 'Rangée', - 'uk-ua': 'рядок', - 'de-ch': 'Reihe', - 'pt-br': 'Linha', - }, - enterMoveDirection: { - 'en-us': 'Direction of movement when Enter key is pressed', - 'ru-ru': 'Направление движения при нажатии клавиши Enter', - 'es-es': - 'Dirección de movimiento cuando se presiona la tecla Enter', - 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', - 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', - 'fr-fr': - 'Direction du mouvement lorsque la touche Entrer est enfoncée', - 'pt-br': - 'Direção do movimento quando a tecla Enter é pressionada', - }, - enterMoveDirectionDescription: { - 'en-us': - 'You can move in the opposite direction by pressing Shift+Enter.', - 'ru-ru': - 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', - 'es-es': - 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', - 'fr-fr': 'Synonyme couleur.', - 'uk-ua': - 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', - 'de-ch': - 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', - 'pt-br': - 'Você pode mover na direção oposta pressionando Shift+Enter.', - }, - filterPickLists: { - 'en-us': 'Filter pick list items', - 'ru-ru': 'Фильтрация элементов списка выбора', - 'es-es': 'Filtrar elementos de la lista de selección', - 'fr-fr': 'Filtrer les éléments de la liste de sélection', - 'uk-ua': 'Фільтр вибору елементів списку', - 'de-ch': 'Auswahllistenelemente filtern', - 'pt-br': 'Filtrar itens da lista de seleção', - }, - exportFileDelimiter: { - 'en-us': 'Export file delimiter', - 'ru-ru': 'Разделитель файлов экспорта', - 'es-es': 'Delimitador de archivo de exportación', - 'fr-fr': "Délimiteur de fichier d'exportation", - 'uk-ua': 'Роздільник файлу експорту', - 'de-ch': 'Dateitrennzeichen exportieren', - 'pt-br': 'Delimitador de arquivo de exportação', - }, - exportCsvUtf8Bom: { - 'en-us': 'Add UTF-8 BOM to CSV file exports', - 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', - 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', - 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', - 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', - 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', - 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', - }, - exportCsvUtf8BomDescription: { - 'en-us': - 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', - 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', - 'es-es': - 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', - 'fr-fr': - "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", - 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', - 'de-ch': - 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', - 'pt-br': - 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', - }, - caseSensitive: { - 'en-us': 'Case-sensitive', - 'ru-ru': 'С учетом регистра', - 'es-es': 'Distingue mayúsculas y minúsculas', - 'fr-fr': 'Sensible aux majuscules et minuscules', - 'uk-ua': 'Чутливий до регістру', - 'de-ch': 'Groß- und Kleinschreibung beachten', - 'pt-br': 'Maiúsculas e minúsculas', - }, - caseInsensitive: { - 'en-us': 'Case-insensitive', - 'ru-ru': 'Без учета регистра', - 'es-es': 'No distingue entre mayúsculas y minúsculas', - 'fr-fr': 'Insensible à la casse', - 'uk-ua': 'Регістр не враховується', - 'de-ch': 'Groß- und Kleinschreibung wird nicht berücksichtigt', - 'pt-br': 'Não diferencia maiúsculas de minúsculas', - }, - showNoReadTables: { - 'en-us': 'Show tables without "Read" access', - 'ru-ru': 'Показывать таблицы без доступа «Чтение»', - 'es-es': 'Mostrar tablas sin acceso de "Lectura"', - 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', - 'uk-ua': 'Показувати таблиці без доступу «Читання»', - 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', - 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', - }, - showNoAccessTables: { - 'en-us': 'Show tables without "Create" access', - 'ru-ru': 'Показывать таблицы без права «Создать»', - 'es-es': 'Mostrar tablas sin acceso "Crear"', - 'fr-fr': 'Afficher les tableaux sans accès "Créer"', - 'uk-ua': 'Показувати таблиці без доступу «Створити»', - 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', - 'pt-br': 'Mostrar tabelas sem acesso "Criar"', - }, - textAreaAutoGrow: { - 'en-us': 'Text boxes grow automatically', - 'ru-ru': 'Текстовые поля увеличиваются автоматически', - 'es-es': 'Los cuadros de texto crecen automáticamente', - 'fr-fr': "Les zones de texte s'agrandissent automatiquement", - 'uk-ua': 'Текстові поля збільшуються автоматично', - 'de-ch': 'Textfelder werden automatisch vergrößert', - 'pt-br': 'As caixas de texto crescem automaticamente', - }, - clearQueryFilters: { - 'en-us': 'Reset query filters', - 'ru-ru': 'Сбросить фильтры запроса', - 'es-es': 'Restablecer filtros de consulta', - 'fr-fr': 'Réinitialiser les filtres de requête', - 'uk-ua': 'Скинути фільтри запитів', - 'de-ch': 'Abfragefilter zurücksetzen', - 'pt-br': 'Redefinir filtros de consulta', - }, - clearQueryFiltersDescription: { - 'en-us': 'Clears all query filters when running a Report from a Form.', - 'de-ch': - 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', - 'es-es': - 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', - 'fr-fr': - "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", - 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', - 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', - 'pt-br': - 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', - }, - queryParamtersFromForm: { - 'en-us': 'Show query filters when running a Report from a Form', - 'de-ch': - 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', - 'es-es': - 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', - 'fr-fr': - "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", - 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', - 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', - 'pt-br': - 'Mostrar filtros de consulta ao executar um relatório de um formulário', - }, - autoGrowAutoComplete: { - 'en-us': 'Allow autocomplete to grow as wide as need', - 'ru-ru': - 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', - 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', - 'fr-fr': - 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', - 'uk-ua': - 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', - 'de-ch': - 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', - 'pt-br': - 'Permitir que o preenchimento automático cresça o quanto for necessário', - }, - tableNameInTitle: { - 'en-us': 'Include table name in the browser page title', - 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', - 'es-es': - 'Incluir el nombre de la tabla en el título de la página del navegador', - 'fr-fr': - 'Inclure le nom de la table dans le titre de la page du navigateur', - 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', - 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', - 'pt-br': 'Incluir nome da tabela no título da página do navegador', - }, - focusFirstField: { - 'en-us': 'Focus first field', - 'de-ch': 'Fokus erstes Feld', - 'es-es': 'Enfoque el primer campo', - 'fr-fr': 'Concentrez-vous sur le premier champ', - 'ru-ru': 'Фокус первого поля', - 'uk-ua': 'Перейти до першого поля', - 'pt-br': 'Foco primeiro campo', - }, - doubleClickZoom: { - 'en-us': 'Double click to zoom', - 'ru-ru': 'Дважды щелкните, чтобы увеличить', - 'es-es': 'Haga doble clic para ampliar', - 'fr-fr': 'Double-cliquez pour zoomer', - 'uk-ua': 'Двічі клацніть, щоб збільшити', - 'de-ch': 'Zum Vergrößern doppelklicken', - 'pt-br': 'Clique duas vezes para ampliar', - }, - closePopupOnClick: { - 'en-us': 'Close pop-up on outside click', - 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', - 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', - 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", - 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', - 'de-ch': 'Popup bei externem Klick schließen', - 'pt-br': 'Fechar pop-up ao clicar fora', - }, - animateTransitions: { - 'en-us': 'Animate transitions', - 'ru-ru': 'Анимированные переходы', - 'es-es': 'Animar transiciones', - 'fr-fr': 'Animer les transitions', - 'uk-ua': 'Анімація переходів', - 'de-ch': 'Übergänge animieren', - 'pt-br': 'Transições animadas', - }, - panInertia: { - 'en-us': 'Pan inertia', - 'ru-ru': 'Инерция пан', - 'es-es': 'Inercia de la sartén', - 'fr-fr': 'Inertie du bac', - 'uk-ua': 'Інерція панорами', - 'de-ch': 'Schwenkträgheit', - 'pt-br': 'Inércia da panela', - }, - mouseDrags: { - 'en-us': 'Mouse drags', - 'ru-ru': 'Перетаскивание мышью', - 'es-es': 'El ratón arrastra', - 'uk-ua': 'Виділіть відповідний підрядок', - 'de-ch': 'Maus zieht', - 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', - 'pt-br': 'Arrastos do mouse', - }, - scrollWheelZoom: { - 'en-us': 'Scroll wheel zoom', - 'ru-ru': 'Масштабирование с помощью колеса прокрутки', - 'es-es': 'Zoom con rueda de desplazamiento', - 'fr-fr': 'Zoom avec la molette de défilement', - 'uk-ua': 'Масштаб колеса прокрутки', - 'de-ch': 'Scrollrad-Zoom', - 'pt-br': 'Zoom da roda de rolagem', - }, - flexibleColumnWidth: { - 'en-us': 'Flexible column width', - 'ru-ru': 'Гибкая ширина столбца', - 'es-es': 'Ancho de columna flexible', - 'fr-fr': 'Largeur de colonne flexible', - 'uk-ua': 'Гнучка ширина колонки', - 'de-ch': 'Flexible Spaltenbreite', - 'pt-br': 'Largura de coluna flexível', - }, - flexibleSubGridColumnWidth: { - 'en-us': 'Flexible subview grid column width', - 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', - 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', - 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', - 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', - 'de-ch': 'Flexible Rasterspaltenbreite der Unteransicht', - 'pt-br': 'Largura flexível da coluna da grade de subvisualização', - }, - closeOnEsc: { - 'en-us': 'Close on ESC key press', - 'ru-ru': 'Закрыть нажатием клавиши ESC', - 'es-es': 'Cerrar al presionar la tecla ESC', - 'fr-fr': 'Icône et nom de la table', - 'uk-ua': 'Закриття натисканням клавіші ESC', - 'de-ch': 'Schließen durch Drücken der Taste ESC', - 'pt-br': 'Fechar ao pressionar a tecla ESC', - }, - closeOnOutsideClick: { - 'en-us': 'Close on outside click', - 'ru-ru': 'Закрытие по внешнему щелчку', - 'es-es': 'Cerrar al hacer clic desde fuera', - 'fr-fr': 'Fermer sur clic extérieur', - 'uk-ua': 'Закрийте зовнішнім клацанням', - 'de-ch': 'Schließen durch Klicken von außen', - 'pt-br': 'Fechar com clique externo', - }, - scopeEntireTablePicklists: { - 'en-us': 'Scope "Entire Table" picklists', - }, - scopeEntireTablePicklistsDescription: { - 'en-us': - 'Restrict "Entire Table" picklists to values used by records in this collection.', - }, - catalogNumberInheritanceDescription: { - 'en-us': - 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', - }, - catalogNumberParentInheritanceDescription: { - 'en-us': - 'Control whether component records inherit catalog numbers from their parent Collection Object.', - }, specifyNetworkBadge: { 'en-us': 'Specify Network Badge', 'ru-ru': 'Укажите сетевой значок', @@ -606,100 +79,114 @@ export const preferencesContentStrings = { 'de-ch': 'Netzwerk-Badge angeben', 'pt-br': 'Especificar emblema de rede', }, - useAccessibleFullDatePicker: { - 'en-us': 'Use accessible full date picker', - 'ru-ru': 'Используйте доступный полный выбор даты', - 'es-es': 'Utilice el selector de fecha completo y accesible', - 'fr-fr': 'Utiliser un sélecteur de date complet accessible', - 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', - 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', - 'pt-br': 'Use o seletor de data completo acessível', - }, - useAccessibleMonthPicker: { - 'en-us': 'Use accessible month picker', - 'ru-ru': 'Используйте доступный выбор месяца', - 'es-es': 'Utilice el selector de meses accesible', - 'fr-fr': 'Utiliser le sélecteur de mois accessible', - 'uk-ua': 'Використовуйте доступний засіб вибору місяця', - 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', - 'pt-br': 'Use o seletor de meses acessível', - }, - rightAlignNumberFields: { - 'en-us': 'Right-Justify numeric fields', - 'ru-ru': 'Выравнивание числовых полей по правому краю', - 'es-es': 'Justificar a la derecha los campos numéricos', - 'fr-fr': 'Justifier à droite les champs numériques', - 'uk-ua': 'Вирівнювання по правому краю числових полів', - 'de-ch': 'Rechtsbündige Ausrichtung numerischer Felder', - 'pt-br': 'Justificar à direita campos numéricos', - }, - roundedCorners: { - 'en-us': 'Rounded corners', - 'ru-ru': 'Закругленные углы', - 'es-es': 'esquinas redondeadas', - 'fr-fr': 'Coins arrondis', - 'uk-ua': 'Заокруглені кути', - 'de-ch': 'Abgerundete Ecken', - 'pt-br': 'Cantos arredondados', - }, - showSubviewBorders: { - 'en-us': 'Show borders around subviews', - 'de-ch': 'Rahmen um Unteransichten anzeigen', - 'es-es': 'Mostrar bordes alrededor de las subvistas', - 'fr-fr': 'Afficher les bordures autour des sous-vues', - 'pt-br': 'Mostrar bordas ao redor das subvisualizações', - 'ru-ru': 'Показывать границы вокруг подпредставлений', - 'uk-ua': 'Показати межі навколо підвидів', - }, - limitMaxFieldWidth: { - 'en-us': 'Limit max field width', - 'ru-ru': 'Ограничить максимальную ширину поля', - 'es-es': 'Limitar el ancho máximo del campo', - 'fr-fr': 'Limiter la largeur maximale du champ', - 'uk-ua': 'Обмеження максимальної ширини поля', - 'de-ch': 'Maximale Feldbreite begrenzen', - 'pt-br': 'Limite a largura máxima do campo', - }, - condenseQueryResults: { - 'en-us': 'Condense query results', - 'ru-ru': 'Сжать результаты запроса', - 'es-es': 'Condensar los resultados de la consulta', - 'fr-fr': 'Condenser les résultats de la requête', - 'uk-ua': 'Згорнути результати запиту', - 'de-ch': 'Abfrageergebnisse verdichten', - 'pt-br': 'Condensar resultados da consulta', - }, - blurContentBehindDialog: { - 'en-us': 'Blur content behind the dialog', - 'ru-ru': 'Размытие содержимого за диалогом', - 'es-es': 'Desenfocar el contenido detrás del diálogo', - 'fr-fr': 'Flou le contenu derrière la boîte de dialogue', - 'uk-ua': 'Розмити вміст за діалоговим вікном', - 'de-ch': 'Inhalte hinter dem Dialog verwischen', - 'pt-br': 'Desfocar o conteúdo atrás do diálogo', - }, - collectionSortOrderDescription: { - 'en-us': 'This determines the visual order of collections.', - 'ru-ru': 'Это определяет визуальный порядок коллекций.', - 'es-es': 'Esto determina el orden visual de las colecciones.', - 'fr-fr': "Ceci détermine l'ordre visuel des collections.", - 'uk-ua': 'Це визначає візуальний порядок колекцій.', - 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', - 'pt-br': 'Isso determina a ordem visual das coleções.', - }, - recordSetRecordToOpen: { - 'en-us': 'Record to open by default', - 'ru-ru': 'Запись для открытия по умолчанию', - 'es-es': 'Registro para abrir por defecto', - 'fr-fr': 'Enregistrement à ouvrir par défaut', - 'uk-ua': 'Запис відкривається за умовчанням', - 'de-ch': 'Standardmäßig zu öffnender Datensatz', - 'pt-br': 'Gravar para abrir por padrão', + url: { + 'en-us': 'URL', + 'de-ch': 'URL', + 'es-es': 'URL', + 'fr-fr': 'URL', + 'uk-ua': 'URL', + 'ru-ru': 'URL', + 'pt-br': 'URL', + }, + pickAttachment: { + 'en-us': 'Pick an attachment', + 'es-es': 'Elige un archivo adjunto', + 'fr-fr': 'Choisissez une pièce jointe', + 'ru-ru': 'Выберите вложение', + 'uk-ua': 'Виберіть вкладення', + 'de-ch': 'Wählen Sie einen Anhang', + 'pt-br': 'Escolha um anexo', + }, + attachmentFailed: { + 'en-us': 'The attachment failed to load.', + 'de-ch': 'Der Anhang konnte nicht geladen werden.', + 'es-es': 'No se pudo cargar el archivo adjunto.', + 'fr-fr': "La pièce jointe n'a pas pu être chargée.", + 'ru-ru': 'Не удалось загрузить вложение.', + 'uk-ua': 'Не вдалося завантажити вкладений файл.', + 'pt-br': 'O anexo não pôde ser carregado.', + }, + pickImage: { + 'en-us': 'Pick an image', + 'de-ch': 'Wählen Sie ein Bild aus', + 'es-es': 'Elige una imagen', + 'fr-fr': 'Choisissez une image', + 'ru-ru': 'Выберите изображение', + 'uk-ua': 'Виберіть зображення', + 'pt-br': 'Escolha uma imagem', + }, + customLogo: { + 'en-us': 'Expanded Image URL', + 'de-ch': 'Erweiterte Bild-URL', + 'es-es': 'URL de imagen expandida', + 'fr-fr': "URL de l'image étendue", + 'ru-ru': 'URL-адрес развернутого изображения', + 'uk-ua': 'Розширена URL-адреса зображення', + 'pt-br': 'URL da imagem expandida', + }, + customLogoCollapsed: { + 'en-us': 'Collapsed Image URL', + 'de-ch': 'URL des minimierten Bildes', + 'es-es': 'URL de imagen contraída', + 'fr-fr': "URL de l'image réduite", + 'ru-ru': 'URL-адрес свернутого изображения', + 'uk-ua': 'URL-адреса згорнутого зображення', + 'pt-br': 'URL da imagem recolhida', + }, + customLogoDescription: { + 'en-us': + 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', + 'de-ch': + 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', + 'es-es': + 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', + 'fr-fr': + 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', + 'ru-ru': + 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', + 'uk-ua': + 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', + 'pt-br': + 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', + }, + attachmentPreviewMode: { + 'en-us': 'Attachment preview mode', + 'de-ch': 'Anhangsvorschaumodus', + 'es-es': 'Modo de vista previa de archivos adjuntos', + 'fr-fr': "Mode d'aperçu des pièces jointes", + 'ru-ru': 'Режим предварительного просмотра вложений', + 'uk-ua': 'Режим попереднього перегляду вкладених файлів', + 'pt-br': 'Modo de visualização de anexos', + }, + fullResolution: { + 'en-us': 'Full Resolution', + 'de-ch': 'Volle Auflösung', + 'es-es': 'Resolución completa', + 'fr-fr': 'Pleine résolution', + 'ru-ru': 'Полное разрешение', + 'uk-ua': 'Повна роздільна здатність', + 'pt-br': 'Resolução completa', + }, + thumbnail: { + 'en-us': 'Thumbnail', + 'de-ch': 'Miniaturansicht', + 'es-es': 'Uña del pulgar', + 'fr-fr': 'Vignette', + 'ru-ru': 'Миниатюра', + 'uk-ua': 'Мініатюра', + 'pt-br': 'Miniatura', + }, + addSearchBarHomePage: { + 'en-us': 'Add Search Bar on home page', + 'de-ch': 'Suchleiste auf der Startseite hinzufügen', + 'es-es': 'Agregar barra de búsqueda en la página de inicio', + 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", + 'ru-ru': 'Добавить панель поиска на домашнюю страницу', + 'uk-ua': 'Додайте рядок пошуку на головну сторінку', + 'pt-br': 'Adicionar barra de pesquisa na página inicial', }, } as const; export const preferencesContentText = createDictionary( - preferencesContentStrings + preferencesContentDictionary ); - -export default preferencesContentText; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts new file mode 100644 index 00000000000..30d8adf9225 --- /dev/null +++ b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts @@ -0,0 +1,2092 @@ +/** + * Localization strings for general preferences. + * + * @module + */ +import { createDictionary } from './utils'; +// Refer to "Guidelines for Programmers" in ./README.md before editing this file +export const preferencesGeneralDictionary = { + preferences: { + "en-us": "Preferences", + "ru-ru": "Настройки", + "es-es": "Preferencias", + "fr-fr": "Préférences", + "uk-ua": "Уподобання", + "de-ch": "Einstellungen", + "pt-br": "Preferências", + }, + customization: { + "en-us": "Customization", + "ru-ru": "Настройка", + "es-es": "Personalización", + "fr-fr": "Personnalisation", + "uk-ua": "Спеціальнізація", + "de-ch": "Anpassung", + "pt-br": "Personalização", + }, + userPreferences: { + "en-us": "User Preferences", + "ru-ru": "Настройки пользователя", + "es-es": "Preferencias del usuario", + "fr-fr": "Préférences de l'utilisateur", + "uk-ua": "Налаштування користувача", + "de-ch": "Benutzereinstellungen", + "pt-br": "Preferências do usuário", + }, + defaultUserPreferences: { + "en-us": "Default User Preferences", + "ru-ru": "Настройки пользователя по умолчанию", + "es-es": "Preferencias de usuario predeterminadas", + "fr-fr": "Préférences utilisateur par défaut", + "uk-ua": "Параметри користувача за умовчанням", + "de-ch": "Standardbenutzereinstellungen", + "pt-br": "Preferências de usuário padrão", + }, + general: { + "en-us": "General", + "ru-ru": "Общий", + "es-es": "General", + "fr-fr": "Image personnalisée", + "uk-ua": "Спеціальне зображення", + "de-ch": "Allgemein", + "pt-br": "Em geral", + }, + ui: { + "en-us": "User Interface", + "ru-ru": "Пользовательский интерфейс", + "es-es": "Interfaz de usuario", + "fr-fr": "Interface utilisateur", + "uk-ua": "Інтерфейс користувача", + "de-ch": "Benutzeroberfläche", + "pt-br": "Interface do usuário", + }, + theme: { + "en-us": "Theme", + "ru-ru": "Тема", + "es-es": "Tema", + "fr-fr": "Thème", + "uk-ua": "Тема", + "de-ch": "Thema", + "pt-br": "Tema", + }, + useSystemSetting: { + "en-us": "Use system setting", + "ru-ru": "Использовать системные настройки", + "es-es": "Utilizar la configuración del sistema", + "fr-fr": "Utiliser les paramètres du système", + "uk-ua": "Використовуйте налаштування системи", + "de-ch": "Systemeinstellung verwenden", + "pt-br": "Usar configuração do sistema", + }, + inheritOsSettings: { + "en-us": "Copies value from your Operating System settings", + "ru-ru": "Копирует значение из настроек вашей операционной системы", + "es-es": "Copia el valor de la configuración de su sistema operativo", + "fr-fr": "Copie la valeur des paramètres de votre système d'exploitation", + "uk-ua": "Копіює значення з налаштувань вашої операційної системи", + "de-ch": "Übernimmt den Wert aus Ihren Betriebssystemeinstellungen", + "pt-br": "Copia o valor das configurações do seu sistema operacional", + }, + light: { + comment: "Light mode", + "en-us": "Light", + "ru-ru": "Свет", + "es-es": "Luz", + "fr-fr": "Lumière", + "uk-ua": "світло", + "de-ch": "Hell", + "pt-br": "Luz", + }, + dark: { + comment: "Dark mode", + "en-us": "Dark", + "ru-ru": "Темный", + "es-es": "Oscuro", + "fr-fr": "Sombre", + "uk-ua": "Темний", + "de-ch": "Dunkel", + "pt-br": "Escuro", + }, + reduceMotion: { + "en-us": "Reduce motion", + "ru-ru": "Уменьшите движение", + "es-es": "Reducir el movimiento", + "fr-fr": "Réduire les mouvements", + "uk-ua": "Зменшити рух", + "de-ch": "Bewegung reduzieren", + "pt-br": "Reduzir movimento", + }, + reduceMotionDescription: { + "en-us": "Disable non-essential animations and transitions.", + "ru-ru": "Отключите ненужные анимации и переходы.", + "es-es": "Desactivar animaciones y transiciones no esenciales.", + "fr-fr": "Désactivez les animations et les transitions non essentielles.", + "uk-ua": "Вимкніть необов'язкову анімацію та переходи.", + "de-ch": "Nicht erforderliche Animationen und Übergänge deaktivieren.", + "pt-br": "Desabilite animações e transições não essenciais.", + }, + reduceTransparency: { + "en-us": "Reduce transparency", + "ru-ru": "Уменьшить прозрачность", + "es-es": "Reducir la transparencia", + "fr-fr": "Réduire la transparence", + "uk-ua": "Зменшити прозорість", + "de-ch": "Transparenz reduzieren", + "pt-br": "Reduzir a transparência", + }, + reduceTransparencyDescription: { + "en-us": + "Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).", + "ru-ru": + "Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).", + "es-es": + "Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).", + "fr-fr": + "S'il faut désactiver les arrière-plans translucides pour les composants de l'interface utilisateur chaque fois que possible (par exemple, les en-têtes de tableau dans l'arborescence).", + "uk-ua": + "Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).", + "de-ch": + "Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).", + "pt-br": + "Se deve ou não desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).", + }, + contrast: { + "en-us": "Contrast", + "ru-ru": "Контраст", + "es-es": "Contraste", + "fr-fr": "Contraste", + "uk-ua": "Контраст", + "de-ch": "Kontrast", + "pt-br": "Contraste", + }, + increase: { + "en-us": "Increase", + "ru-ru": "Увеличивать", + "es-es": "Aumentar", + "fr-fr": "Augmenter", + "uk-ua": "Збільшити", + "de-ch": "Erhöhen", + "pt-br": "Aumentar", + }, + reduce: { + "en-us": "Reduce", + "ru-ru": "Уменьшать", + "es-es": "Reducir", + "fr-fr": "Réduire", + "uk-ua": "Зменшити", + "de-ch": "Verringern", + "pt-br": "Reduzir", + }, + noPreference: { + "en-us": "No preference", + "ru-ru": "Нет предпочтений", + "es-es": "Sin preferencia", + "fr-fr": "Pas de préférence", + "uk-ua": "Без переваг", + "de-ch": "Keine Präferenz", + "pt-br": "Sem preferência", + }, + fontSize: { + "en-us": "Font size", + "ru-ru": "Размер шрифта", + "es-es": "Tamaño de fuente", + "fr-fr": "Taille de police", + "uk-ua": "Розмір шрифту", + "de-ch": "Schriftgrösse", + "pt-br": "Tamanho da fonte", + }, + fontFamily: { + "en-us": "Font family", + "ru-ru": "Семейство шрифтов", + "es-es": "Familia de fuentes", + "fr-fr": "Famille de polices", + "uk-ua": "Сімейство шрифтів", + "de-ch": "Schrift-Familie", + "pt-br": "Família de fontes", + }, + fontFamilyDescription: { + "en-us": + "You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.", + "ru-ru": + "Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.", + "es-es": + "Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.", + "fr-fr": + "Vous pouvez spécifier n'importe quelle police présente sur votre ordinateur, même si elle ne figure pas dans la liste. Une liste de polices séparées par des virgules est également prise en charge ; chaque police suivante sera utilisée si la précédente n'est pas disponible.", + "uk-ua": + "Ви можете вказати будь-який шрифт, який є на вашому комп'ютері, навіть якщо його немає в списку. Також підтримується розділений комами список шрифтів, у якому використовуватиметься другий шрифт, якщо перший недоступний тощо.", + "de-ch": + "Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.", + "pt-br": + "Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.", + }, + defaultFont: { + "en-us": "(default font)", + "ru-ru": "(шрифт по умолчанию)", + "es-es": "(fuente predeterminada)", + "fr-fr": "(police par défaut)", + "uk-ua": "(типовий шрифт)", + "de-ch": "(Standardschriftart)", + "pt-br": "(fonte padrão)", + }, + maxFormWidth: { + "en-us": "Max form width", + "ru-ru": "Максимальная ширина формы", + "es-es": "Ancho máximo del formulario", + "fr-fr": "Largeur maximale du formulaire", + "uk-ua": "Максимальна ширина форми", + "de-ch": "Maximale Formularbreite", + "pt-br": "Largura máxima do formulário", + }, + fieldBackgrounds: { + "en-us": "Field backgrounds", + "ru-ru": "Фоны полей", + "es-es": "Fondos de campo", + "fr-fr": "Milieux de terrain", + "uk-ua": "Польові фони", + "de-ch": "Feldhintergründe", + "pt-br": "Fundos de campo", + }, + fieldBackground: { + "en-us": "Field background", + "ru-ru": "Фон поля", + "es-es": "Fondo de campo", + "fr-fr": "Contexte du terrain", + "uk-ua": "Поле фону", + "de-ch": "Feldhintergrund", + "pt-br": "Contexto de campo", + }, + disabledFieldBackground: { + "en-us": "Disabled field background", + "ru-ru": "Отключенный фон поля", + "es-es": "Fondo de campo deshabilitado", + "fr-fr": "Fond de champ désactivé", + "uk-ua": "Вимкнений фон поля", + "de-ch": "Deaktivierter Feldhintergrund", + "pt-br": "Fundo de campo desativado", + }, + invalidFieldBackground: { + "en-us": "Invalid field background", + "ru-ru": "Неверный фон поля", + "es-es": "Fondo de campo no válido", + "fr-fr": "Fond de champ invalide", + "uk-ua": "Недійсний фон поля", + "de-ch": "Ungültiger Feldhintergrund", + "pt-br": "Fundo de campo inválido", + }, + requiredFieldBackground: { + "en-us": "Required field background", + "ru-ru": "Обязательное поле фон", + "es-es": "Antecedentes del campo obligatorio", + "fr-fr": "Contexte du champ obligatoire", + "uk-ua": "Обов'язковий фон поля", + "de-ch": "Feldhintergrund erforderlich", + "pt-br": "Histórico de campo obrigatório", + }, + darkFieldBackground: { + "en-us": "Field background (dark theme)", + "ru-ru": "Фон поля (тёмная тема)", + "es-es": "Fondo de campo (tema oscuro)", + "fr-fr": "Fond de champ (thème sombre)", + "uk-ua": "Фон поля (темна тема)", + "de-ch": "Feldhintergrund (Dunkles Thema)", + "pt-br": "Fundo de campo (tema escuro)", + }, + darkDisabledFieldBackground: { + "en-us": "Disabled field background (dark theme)", + "ru-ru": "Отключенный фон поля (тёмная тема)", + "es-es": "Fondo de campo deshabilitado (tema oscuro)", + "fr-fr": "Fond de champ désactivé (thème sombre)", + "uk-ua": "Вимкнений фон поля (темна тема)", + "de-ch": "Deaktivierter Feldhintergrund (Dunkles Thema)", + "pt-br": "Fundo de campo desativado (tema escuro)", + }, + darkInvalidFieldBackground: { + "en-us": "Invalid field background (dark theme)", + "ru-ru": "Недопустимый фон поля (тёмная тема)", + "es-es": "Fondo de campo no válido (tema oscuro)", + "fr-fr": "Largeur de colonne de grille de sous-vue flexible", + "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", + "de-ch": "Ungültiger Feldhintergrund (Dunkles Thema)", + "pt-br": "Fundo de campo inválido (tema escuro)", + }, + darkRequiredFieldBackground: { + "en-us": "Required field background (dark theme)", + "ru-ru": "Обязательное поле фон (тёмная тема)", + "es-es": "Fondo del campo obligatorio (tema oscuro)", + "fr-fr": "Fond de champ obligatoire (thème sombre)", + "uk-ua": "Обов’язковий фон поля (темна тема)", + "de-ch": "Feldhintergrund erforderlich (Dunkles Thema)", + "pt-br": "Fundo de campo obrigatório (tema escuro)", + }, + dialogs: { + "en-us": "Dialogs", + "ru-ru": "Диалоги", + "es-es": "Diálogos", + "fr-fr": "Boîtes de dialogue", + "uk-ua": "Діалоги", + "de-ch": "Dialoge", + "pt-br": "Diálogos", + }, + appearance: { + "en-us": "Appearance", + "ru-ru": "Появление", + "es-es": "Apariencia", + "fr-fr": "Apparence", + "uk-ua": "Зовнішній вигляд", + "de-ch": "Aussehen", + "pt-br": "Aparência", + }, + buttonsLight: { + "en-us": "Buttons (light mode)", + "de-ch": "Buttons (Helles Thema)", + "es-es": "Botones (modo luz)", + "fr-fr": "Boutons (mode lumière)", + "ru-ru": "Кнопки (световой режим)", + "uk-ua": "Кнопки (світлий режим)", + "pt-br": "Botões (modo claro)", + }, + buttonsDark: { + "en-us": "Buttons (dark mode)", + "de-ch": "Buttons (Dunkles Thema)", + "es-es": "Botones (modo oscuro)", + "fr-fr": "Boutons (mode sombre)", + "ru-ru": "Кнопки (темный режим)", + "uk-ua": "Кнопки (темний режим)", + "pt-br": "Botões (modo escuro)", + }, + translucentDialog: { + "en-us": "Translucent dialogs", + "ru-ru": "Прозрачные диалоги", + "es-es": "Diálogos translúcidos", + "fr-fr": "Dialogues translucides", + "uk-ua": "Напівпрозорі діалоги", + "de-ch": "Durchscheinende Dialoge", + "pt-br": "Diálogos translúcidos", + }, + translucentDialogDescription: { + "en-us": "Whether dialogs have translucent background.", + "ru-ru": "Имеют ли диалоговые окна полупрозрачный фон.", + "es-es": "Si los diálogos tienen fondo translúcido.", + "fr-fr": "Si les boîtes de dialogue ont un fond translucide.", + "uk-ua": "Чи мають діалоги прозорий фон.", + "de-ch": "Dialogfenster mit durchscheinenden Hintergrund.", + "pt-br": "Se os diálogos têm fundo translúcido.", + }, + alwaysPrompt: { + "en-us": "Always prompt to choose collection", + "ru-ru": "Всегда предлагайте выбрать коллекцию", + "es-es": "Siempre dispuesto a elegir la colección", + "fr-fr": "Toujours invité à choisir la collection", + "uk-ua": "Завжди підкажуть вибрати колекцію", + "de-ch": "Immer zur Auswahl der Sammlung auffordern", + "pt-br": "Sempre pronto para escolher a coleção", + }, + treeEditor: { + "en-us": "Tree Editor", + "ru-ru": "Редактор деревьев", + "es-es": "Editor de árboles", + "fr-fr": "Éditeur d'arborescence", + "uk-ua": "Редактор дерева", + "de-ch": "Baumeditor", + "pt-br": "Editor de Árvore", + }, + treeAccentColor: { + "en-us": "Tree accent color", + "ru-ru": "Акцентный цвет дерева", + "es-es": "Color de acento del árbol", + "fr-fr": "Couleur d'accent d'arbre", + "uk-ua": "Колір акценту дерева", + "de-ch": "Baumakzentfarbe", + "pt-br": "Cor de destaque da árvore", + }, + synonymColor: { + "en-us": "Synonym color", + "ru-ru": "Синоним цвет", + "es-es": "Color sinónimo", + "fr-fr": "Synonyme couleur", + "uk-ua": "Синонім кольору", + "de-ch": "Synonymfarbe", + "pt-br": "Cor sinônimo", + }, + showNewDataSetWarning: { + "en-us": "Show new Data Set warning", + "ru-ru": "Показать предупреждение о новом наборе данных", + "es-es": "Mostrar nueva advertencia de conjunto de datos", + "fr-fr": "Afficher un nouvel avertissement sur l'ensemble de données", + "uk-ua": "Показати попередження про новий набір даних", + "de-ch": "Warnung für neuen Datensatz anzeigen", + "pt-br": "Mostrar novo aviso de conjunto de dados", + }, + showNewDataSetWarningDescription: { + "en-us": "Show an informational message when creating a new Data Set.", + "ru-ru": + "Показывать информационное сообщение при создании нового набора данных.", + "es-es": + "Mostrar un mensaje informativo al crear un nuevo conjunto de datos.", + "fr-fr": + "Afficher un message d'information lors de la création d'un nouvel ensemble de données.", + "uk-ua": + "Показувати інформаційне повідомлення під час створення нового набору даних.", + "de-ch": "Zeige eine Meldung beim erstellen eines neuen Datensatzes an.", + "pt-br": + "Exibir uma mensagem informativa ao criar um novo conjunto de dados.", + }, + header: { + "en-us": "Navigation Menu", + "ru-ru": "Меню навигации", + "es-es": "Menú de navegación", + "fr-fr": "le menu de navigation", + "uk-ua": "Навігаційне меню", + "de-ch": "Navigationsmenü", + "pt-br": "Menu de navegação", + }, + application: { + "en-us": "Application", + "ru-ru": "Приложение", + "es-es": "Solicitud", + "fr-fr": "Application", + "uk-ua": "застосування", + "de-ch": "Anwendung", + "pt-br": "Aplicativo", + }, + allowDismissingErrors: { + "en-us": "Allow dismissing error messages", + "ru-ru": "Разрешить отклонять сообщения об ошибках", + "es-es": "Permitir descartar mensajes de error", + "fr-fr": "Autoriser le rejet des messages d'erreur", + "uk-ua": "Дозволити закривати повідомлення про помилки", + "de-ch": "Erlaube das Verwerfen von Fehlermeldungen", + "pt-br": "Permitir descartar mensagens de erro", + }, + updatePageTitle: { + "en-us": "Update page title", + "ru-ru": "Обновить заголовок страницы", + "es-es": "Actualizar el título de la página", + "fr-fr": "Mettre à jour le titre de la page", + "uk-ua": "Оновити назву сторінки", + "de-ch": "Seitentitel aktualisieren", + "pt-br": "Atualizar título da página", + }, + updatePageTitleDescription: { + "en-us": + "Whether to update the title of the page to match dialog's header.", + "ru-ru": + "Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.", + "es-es": + "Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.", + "fr-fr": + "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'en-tête de la boîte de dialogue.", + "uk-ua": + "Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.", + "de-ch": + "Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.", + "pt-br": + "Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.", + }, + updatePageTitleFormDescription: { + "en-us": "Whether to update the title of the page to match current record.", + "ru-ru": + "Следует ли обновить заголовок страницы в соответствии с текущей записью.", + "es-es": + "Si desea actualizar el título de la página para que coincida con el registro actual.", + "fr-fr": + "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'enregistrement actuel.", + "uk-ua": "Чи оновлювати назву сторінки відповідно до поточного запису.", + "de-ch": + "Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.", + "pt-br": + "Se o título da página deve ser atualizado para corresponder ao registro atual.", + }, + queryComboBox: { + "en-us": "Query Combo Box", + "ru-ru": "Поле со списком запросов", + "es-es": "Cuadro combinado de consulta", + "uk-ua": "Поле зі списком запитів", + "de-ch": "Abfrage-Kombinationsfeld", + "fr-fr": "Zone de liste déroulante de requête", + "pt-br": "Caixa de combinação de consulta", + }, + searchAlgorithm: { + "en-us": "Search Algorithm", + "ru-ru": "Алгоритм поиска", + "es-es": "Algoritmo de búsqueda", + "fr-fr": "Algorithme de recherche", + "uk-ua": "Алгоритм пошуку", + "de-ch": "Suchalgorithmus", + "pt-br": "Algoritmo de Busca", + }, + treeSearchAlgorithm: { + "en-us": "Search Algorithm (for relationships with tree tables)", + "ru-ru": "Алгоритм поиска (для связей с древовидными таблицами)", + "es-es": "Algoritmo de búsqueda (para relaciones con tablas de árbol)", + "fr-fr": + "Algorithme de recherche (pour les relations avec les tables arborescentes)", + "uk-ua": "Алгоритм пошуку (для зв’язків із деревоподібними таблицями)", + "de-ch": "Suchalgorithmus (für Beziehungen mit Baumtabellen)", + "pt-br": "Algoritmo de busca (para relacionamentos com tabelas de árvore)", + }, + startsWithInsensitive: { + "en-us": "Starts With (case-insensitive)", + "ru-ru": "Начинается с (без учета регистра)", + "es-es": "Comienza con (sin distinguir entre mayúsculas y minúsculas)", + "fr-fr": "Commence par (insensible à la casse)", + "uk-ua": "Починається з (без урахування регістру)", + "de-ch": "Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)", + "pt-br": "Começa com (sem distinção de maiúsculas e minúsculas)", + }, + startsWithDescription: { + "en-us": "Search for values that begin with a given query string.", + "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", + "es-es": + "Busque valores que comiencen con una cadena de consulta determinada.", + "fr-fr": + "Rechercher des valeurs commençant par une chaîne de requête donnée.", + "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", + "de-ch": + "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", + "pt-br": + "Pesquisar valores que começam com uma determinada sequência de consulta.", + }, + startsWithCaseSensitive: { + "en-us": "Starts With (case-sensitive)", + "ru-ru": "Начинается с (с учетом регистра)", + "es-es": "Comienza con (sensible a mayúsculas y minúsculas)", + "fr-fr": "Commence par (sensible à la casse)", + "uk-ua": "Починається з (з урахуванням регістру)", + "de-ch": "Beginnt mit (Groß-/Kleinschreibung beachten)", + "pt-br": "Começa com (diferencia maiúsculas de minúsculas)", + }, + startsWithCaseSensitiveDescription: { + "en-us": "Search for values that begin with a given query string.", + "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", + "es-es": + "Busque valores que comiencen con una cadena de consulta determinada.", + "fr-fr": + "Recherchez les valeurs qui commencent par une chaîne de requête donnée.", + "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", + "de-ch": + "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", + "pt-br": + "Pesquisar valores que começam com uma determinada sequência de consulta.", + }, + containsInsensitive: { + "en-us": "Contains (case-insensitive)", + "ru-ru": "Содержит (без учета регистра)", + "es-es": "Contiene (sin distinguir entre mayúsculas y minúsculas)", + "fr-fr": "Contient (insensible à la casse)", + "uk-ua": "Містить (незалежно від регістру)", + "de-ch": "Enthält (Groß-/Kleinschreibung wird nicht beachtet)", + "pt-br": "Contém (sem distinção entre maiúsculas e minúsculas)", + }, + containsCaseSensitive: { + "en-us": "Contains (case-sensitive)", + "ru-ru": "Содержит (с учетом регистра)", + "es-es": "Contiene (sensible a mayúsculas y minúsculas)", + "fr-fr": "Contient (sensible à la casse)", + "uk-ua": "Містить (з урахуванням регістру)", + "de-ch": "Enthält (Groß-/Kleinschreibung beachten)", + "pt-br": "Contém (diferencia maiúsculas de minúsculas)", + }, + containsDescription: { + "en-us": + "Search for values that contain a given query string (case-insensitive).", + "ru-ru": + "Поиск значений, содержащих заданную строку запроса (без учета регистра).", + "es-es": + "Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).", + "uk-ua": + "Пошук значень, які містять заданий рядок запиту (незалежно від регістру).", + "de-ch": + "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).", + "fr-fr": + "Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).", + "pt-br": + "Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).", + }, + containsCaseSensitiveDescription: { + "en-us": + "Search for values that contain a given query string (case-sensitive).", + "ru-ru": + "Поиск значений, содержащих заданную строку запроса (с учетом регистра).", + "es-es": + "Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).", + "fr-fr": + "Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).", + "uk-ua": + "Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).", + "de-ch": + "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).", + "pt-br": + "Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).", + }, + containsSecondDescription: { + "en-us": + "Can use _ to match any single character or % to match any number of characters.", + "ru-ru": + "Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.", + "es-es": + "Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.", + "fr-fr": + "Peut utiliser _ pour correspondre à n'importe quel caractère ou % pour correspondre à n'importe quel nombre de caractères.", + "uk-ua": + "Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.", + "de-ch": + "Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.", + "pt-br": + "Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.", + }, + highlightMatch: { + "en-us": "Highlight matched substring", + "ru-ru": "Выделить совпавшую подстроку", + "es-es": "Resaltar la subcadena coincidente", + "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", + "uk-ua": "Виділіть збіг підрядка", + "de-ch": "Markieren Sie übereinstimmende Teilzeichenfolgen", + "pt-br": "Destacar substring correspondente", + }, + languageDescription: { + "en-us": "Determines field captions, usage notes and table captions.", + "ru-ru": + "Определяет заголовки полей, примечания по использованию и заголовки таблиц.", + "es-es": "Determina títulos de campos, notas de uso y títulos de tablas.", + "fr-fr": + "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux.", + "uk-ua": + "Визначає підписи полів, примітки щодо використання та підписи таблиць.", + "de-ch": + "Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.", + "pt-br": "Determina legendas de campo, notas de uso e legendas de tabela.", + }, + showDialogIcon: { + "en-us": "Show icon in the header", + "ru-ru": "Показывать значок в заголовке", + "es-es": "Mostrar icono en el encabezado", + "fr-fr": "Afficher l'icône dans l'en-tête", + "uk-ua": "Показати значок у заголовку", + "de-ch": "Symbol in der Kopfzeile anzeigen", + "pt-br": "Mostrar ícone no cabeçalho", + }, + scaleInterface: { + "en-us": "Scale Interface", + "ru-ru": "Интерфейс масштабирования", + "es-es": "Interfaz de escala", + "fr-fr": "Interface de balance", + "uk-ua": "Інтерфейс масштабу", + "de-ch": "Waagenschnittstelle", + "pt-br": "Interface de escala", + }, + scaleInterfaceDescription: { + "en-us": "Scale interface to match font size.", + "ru-ru": "Масштабируйте интерфейс в соответствии с размером шрифта.", + "es-es": "Escala la interfaz para que coincida con el tamaño de la fuente.", + "fr-fr": "Adapter l'interface à la taille de la police.", + "uk-ua": "Масштабуйте інтерфейс відповідно до розміру шрифту.", + "de-ch": + "Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.", + "pt-br": "Dimensione a interface para corresponder ao tamanho da fonte.", + }, + displayAuthor: { + "en-us": "Show author in the tree", + "ru-ru": "Показать автора в дереве", + "es-es": "Mostrar autor en el árbol", + "fr-fr": "Afficher l'auteur dans l'arbre", + "uk-ua": "Показати автора в дереві", + "de-ch": "Autor im Baum anzeigen", + "pt-br": "Mostrar autor", + }, + welcomePage: { + "en-us": "Home Page", + "ru-ru": "Домашняя страница", + "es-es": "Página de inicio", + "fr-fr": "Page d'accueil", + "uk-ua": "Домашня сторінка", + "de-ch": "Startseite", + "pt-br": "Página inicial", + }, + content: { + "en-us": "Content", + "ru-ru": "Содержание", + "es-es": "Contenido", + "fr-fr": "Contenu", + "uk-ua": "Зміст", + "de-ch": "Inhalt", + "pt-br": "Contente", + }, + defaultImage: { + "en-us": "Specify Logo", + "ru-ru": "Укажите логотип", + "es-es": "Especificar logotipo", + "fr-fr": "Spécifier le logo", + "uk-ua": "Вкажіть логотип", + "de-ch": "Logo angeben", + "pt-br": "Especificar logotipo", + }, + customImage: { + "en-us": "Custom Image", + "ru-ru": "Пользовательское изображение", + "es-es": "Imagen personalizada", + "fr-fr": "Image personnalisée", + "uk-ua": "Спеціальне зображення", + "de-ch": "Benutzerdefiniertes Bild", + "pt-br": "Imagem personalizada", + }, + embeddedWebpage: { + "en-us": "Embedded web page", + "ru-ru": "Встроенная веб-страница", + "es-es": "Página web incrustada", + "fr-fr": "Page Web intégrée", + "uk-ua": "Вбудована веб-сторінка", + "de-ch": "Eingebettete Webseite", + "pt-br": "Página da web incorporada", + }, + embeddedWebpageDescription: { + "en-us": "A URL to a page that would be embedded on the home page:", + "ru-ru": "URL-адрес страницы, которая будет встроена в домашнюю страницу:", + "es-es": "Una URL a una página que se integrará en la página de inicio:", + "fr-fr": "Une URL vers une page qui serait intégrée à la page d'accueil :", + "uk-ua": "URL-адреса сторінки, яка буде вбудована на домашній сторінці:", + "de-ch": + "Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:", + "pt-br": "Um URL para uma página que seria incorporada na página inicial:", + }, + behavior: { + "en-us": "Behavior", + "ru-ru": "Поведение", + "es-es": "Comportamiento", + "fr-fr": "Comportement", + "uk-ua": "Поведінка", + "de-ch": "Verhalten", + "pt-br": "Comportamento", + }, + noRestrictionsMode: { + "en-us": "No restrictions mode", + "ru-ru": "Режим без ограничений", + "es-es": "Modo sin restricciones", + "fr-fr": "Mode sans restriction", + "uk-ua": "Режим без обмежень", + "de-ch": "Modus „Keine Einschränkungen“", + "pt-br": "Modo sem restrições", + }, + noRestrictionsModeWbDescription: { + "en-us": "Allows uploading data to any field in any table.", + "ru-ru": "Позволяет загружать данные в любое поле любой таблицы.", + "es-es": "Permite cargar datos a cualquier campo de cualquier tabla.", + "fr-fr": + "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", + "uk-ua": "Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.", + "de-ch": + "Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.", + "pt-br": "Permite carregar dados em qualquer campo de qualquer tabela.", + }, + noRestrictionsModeQueryDescription: { + "en-us": "Allows querying data from any field in any table.", + "ru-ru": "Позволяет запрашивать данные из любого поля любой таблицы.", + "es-es": "Permite consultar datos de cualquier campo de cualquier tabla.", + "fr-fr": + "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", + "uk-ua": "Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.", + "de-ch": + "Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.", + "pt-br": "Permite consultar dados de qualquer campo em qualquer tabela.", + }, + noRestrictionsModeWarning: { + "en-us": + "WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.", + "ru-ru": + "ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.", + "es-es": + "ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.", + "uk-ua": + "ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.", + "de-ch": + "WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.", + "fr-fr": + "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", + "pt-br": + "AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.", + }, + adminsOnlyPreference: { + "en-us": "You don't have permission to change this option", + "ru-ru": "У вас нет разрешения на изменение этой опции.", + "es-es": "No tienes permiso para cambiar esta opción", + "fr-fr": "Vous n'êtes pas autorisé à modifier cette option", + "uk-ua": "Ви не маєте дозволу змінювати цей параметр", + "de-ch": "Sie haben keine Berechtigung, diese Option zu ändern", + "pt-br": "Você não tem permissão para alterar esta opção", + }, + stickyScrolling: { + "en-us": "Sticky scroll bar", + "ru-ru": "Липкая полоса прокрутки", + "es-es": "Barra de desplazamiento fija", + "fr-fr": "Barre de défilement collante", + "uk-ua": "Липка смуга прокрутки", + "de-ch": "Klebrige Bildlaufleiste", + "pt-br": "Barra de rolagem fixa", + }, + foreground: { + "en-us": "Foreground", + "ru-ru": "Передний план", + "es-es": "Primer plano", + "fr-fr": "Premier plan", + "uk-ua": "Передній план", + "de-ch": "Vordergrund", + "pt-br": "Primeiro plano", + }, + background: { + "en-us": "Background", + "ru-ru": "Фон", + "es-es": "Fondo", + "fr-fr": "Arrière-plan", + "uk-ua": "Фон", + "de-ch": "Hintergrund", + "pt-br": "Fundo", + }, + sidebarTheme: { + "en-us": "Sidebar theme", + "de-ch": "Seitenleistenthema", + "es-es": "Tema de la barra lateral", + "fr-fr": "Thème de la barre latérale", + "ru-ru": "Тема боковой панели", + "uk-ua": "Тема бічної панелі", + "pt-br": "Tema da barra lateral", + }, + darkForeground: { + "en-us": "Foreground (dark theme)", + "ru-ru": "Передний план (тёмная тема)", + "es-es": "Primer plano (tema oscuro)", + "fr-fr": "Premier plan (thème sombre)", + "uk-ua": "Передній план (темна тема)", + "de-ch": "Vordergrund (dunkles Design)", + "pt-br": "Primeiro plano (tema escuro)", + }, + darkBackground: { + "en-us": "Background (dark theme)", + "ru-ru": "Фон (тёмная тема)", + "es-es": "Fondo (tema oscuro)", + "fr-fr": "Arrière-plan (thème sombre)", + "uk-ua": "Фон (темна тема)", + "de-ch": "Hintergrund (dunkles Design)", + "pt-br": "Plano de fundo (tema escuro)", + }, + accentColor1: { + "en-us": "Accent color 1", + "ru-ru": "Акцентный цвет 1", + "es-es": "Color de acento 1", + "fr-fr": "Couleur d'accent 1", + "uk-ua": "Акцентний колір 1", + "de-ch": "Akzentfarbe 1", + "pt-br": "Cor de destaque 1", + }, + accentColor2: { + "en-us": "Accent color 2", + "ru-ru": "Акцентный цвет 2", + "es-es": "Color de acento 2", + "fr-fr": "Couleur d'accent 2", + "uk-ua": "Акцентний колір 2", + "de-ch": "Akzentfarbe 2", + "pt-br": "Cor de destaque 2", + }, + accentColor3: { + "en-us": "Accent color 3", + "ru-ru": "Акцентный цвет 3", + "es-es": "Color de acento 3", + "fr-fr": "Couleur d'accent 3", + "uk-ua": "Акцентний колір 3", + "de-ch": "Akzentfarbe 3", + "pt-br": "Cor de destaque 3", + }, + accentColor4: { + "en-us": "Accent color 4", + "ru-ru": "Акцентный цвет 4", + "es-es": "Color de acento 4", + "fr-fr": "Couleur d'accent 4", + "uk-ua": "Акцентний колір 4", + "de-ch": "Akzentfarbe 4", + "pt-br": "Cor de destaque 4", + }, + accentColor5: { + "en-us": "Accent color 5", + "ru-ru": "Акцентный цвет 5", + "es-es": "Color de acento 5", + "fr-fr": "Couleur d'accent 5", + "uk-ua": "Акцентний колір 5", + "de-ch": "Akzentfarbe 5", + "pt-br": "Cor de destaque 5", + }, + spreadsheet: { + "en-us": "Spreadsheet", + "ru-ru": "Электронная таблица", + "es-es": "Hoja de cálculo", + "fr-fr": "Tableur", + "uk-ua": "Електронна таблиця", + "de-ch": "Kalkulationstabelle", + "pt-br": "Planilha", + }, + minSpareRows: { + "en-us": "Number of blank rows at the end", + "ru-ru": "Количество пустых строк в конце", + "es-es": "Número de filas en blanco al final", + "fr-fr": "Nombre de lignes vides à la fin", + "uk-ua": "Кількість порожніх рядків у кінці", + "de-ch": "Anzahl der leeren Zeilen am Ende", + "pt-br": "Número de linhas em branco no final", + }, + autoWrapCols: { + "en-us": "Navigate to the other side when reaching the edge column", + "ru-ru": "Достигнув крайней колонны, перейдите на другую сторону.", + "es-es": "Navegue hacia el otro lado al llegar a la columna del borde.", + "fr-fr": + "Naviguez de l’autre côté lorsque vous atteignez la colonne de bord", + "uk-ua": "Перейдіть на іншу сторону, коли досягнете краю колонки", + "de-ch": + "Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen", + "pt-br": "Navegue para o outro lado ao atingir a coluna da borda", + }, + autoWrapRows: { + "en-us": "Navigate to the other side when reaching the edge row", + "ru-ru": "Достигнув крайнего ряда, перейдите на другую сторону.", + "es-es": "Navegue hacia el otro lado al llegar a la fila del borde.", + "fr-fr": + "Naviguez de l’autre côté lorsque vous atteignez la rangée de bord", + "uk-ua": "Перейдіть на іншу сторону, коли досягнете крайнього ряду", + "de-ch": + "Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen", + "pt-br": "Navegue para o outro lado ao atingir a fileira de bordas", + }, + enterBeginsEditing: { + "en-us": "Enter key begins editing cell", + "ru-ru": "Клавиша Enter начинает редактирование ячейки.", + "es-es": "La tecla Enter inicia la edición de la celda", + "fr-fr": "La touche Entrée commence à modifier la cellule", + "uk-ua": "Клавіша Enter починає редагування клітинки", + "de-ch": "Mit der Eingabetaste beginnt die Bearbeitung der Zelle", + "pt-br": "A tecla Enter inicia a edição da célula", + }, + tabMoveDirection: { + "en-us": "Direction of movement when Tab key is pressed", + "ru-ru": "Направление движения при нажатии клавиши Tab", + "es-es": + "Dirección de movimiento cuando se presiona la tecla Tab", + "fr-fr": + "Sens de déplacement lorsque la touche Tabulation est enfoncée", + "uk-ua": "Напрямок руху при натисканні клавіші Tab", + "de-ch": "Bewegungsrichtung beim Drücken der Tab-Taste", + "pt-br": "Direção do movimento quando a tecla Tab é pressionada", + }, + tabMoveDirectionDescription: { + "en-us": + "You can move in the opposite direction by pressing Shift+Tab.", + "ru-ru": + "Вы можете двигаться в обратном направлении, нажав Shift+Tab.", + "es-es": + "Puedes moverte en la dirección opuesta presionando Shift+Tab.", + "fr-fr": + "Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.", + "uk-ua": + "Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.", + "de-ch": + "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.", + "pt-br": + "Você pode mover na direção oposta pressionando Shift+Tab.", + }, + column: { + "en-us": "Column", + "ru-ru": "Столбец", + "es-es": "Columna", + "fr-fr": "Colonne", + "uk-ua": "Колонка", + "de-ch": "Spalte", + "pt-br": "Coluna", + }, + row: { + "en-us": "Row", + "ru-ru": "Ряд", + "es-es": "Fila", + "fr-fr": "Rangée", + "uk-ua": "рядок", + "de-ch": "Reihe", + "pt-br": "Linha", + }, + enterMoveDirection: { + "en-us": "Direction of movement when Enter key is pressed", + "ru-ru": "Направление движения при нажатии клавиши Enter", + "es-es": + "Dirección de movimiento cuando se presiona la tecla Enter", + "uk-ua": "Напрямок руху, коли натиснуто клавішу Enter", + "de-ch": "Bewegungsrichtung beim Drücken der Taste Enter", + "fr-fr": + "Direction du mouvement lorsque la touche Entrer est enfoncée", + "pt-br": + "Direção do movimento quando a tecla Enter é pressionada", + }, + enterMoveDirectionDescription: { + "en-us": + "You can move in the opposite direction by pressing Shift+Enter.", + "ru-ru": + "Вы можете двигаться в противоположном направлении, нажав Shift+Enter.", + "es-es": + "Puedes moverte en la dirección opuesta presionando Shift+Enter.", + "fr-fr": "Synonyme couleur.", + "uk-ua": + "Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.", + "de-ch": + "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.", + "pt-br": + "Você pode mover na direção oposta pressionando Shift+Enter.", + }, + filterPickLists: { + "en-us": "Filter pick list items", + "ru-ru": "Фильтрация элементов списка выбора", + "es-es": "Filtrar elementos de la lista de selección", + "fr-fr": "Filtrer les éléments de la liste de sélection", + "uk-ua": "Фільтр вибору елементів списку", + "de-ch": "Auswahllistenelemente filtern", + "pt-br": "Filtrar itens da lista de seleção", + }, + exportFileDelimiter: { + "en-us": "Export file delimiter", + "ru-ru": "Разделитель файлов экспорта", + "es-es": "Delimitador de archivo de exportación", + "fr-fr": "Délimiteur de fichier d'exportation", + "uk-ua": "Роздільник файлу експорту", + "de-ch": "Dateitrennzeichen exportieren", + "pt-br": "Delimitador de arquivo de exportação", + }, + exportCsvUtf8Bom: { + "en-us": "Add UTF-8 BOM to CSV file exports", + "ru-ru": "Добавить UTF-8 BOM в экспорт CSV-файла", + "es-es": "Agregar BOM UTF-8 a las exportaciones de archivos CSV", + "fr-fr": "Ajouter UTF-8 BOM aux exportations de fichiers CSV", + "uk-ua": "Додайте специфікацію UTF-8 до експорту файлу CSVу", + "de-ch": "UTF-8 BOM zum CSV-Dateiexport hinzufügen", + "pt-br": "Adicionar UTF-8 BOM às exportações de arquivos CSV", + }, + exportCsvUtf8BomDescription: { + "en-us": + "Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.", + "ru-ru": "Корректное отображение экспортированных CSV-файлов в Excel.", + "es-es": + "Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.", + "fr-fr": + "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", + "uk-ua": "Змушує експорт файлів CSV правильно відображатися в Excel.", + "de-ch": + "Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.", + "pt-br": + "Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.", + }, + caseSensitive: { + "en-us": "Case-sensitive", + "ru-ru": "С учетом регистра", + "es-es": "Distingue mayúsculas y minúsculas", + "fr-fr": "Sensible aux majuscules et minuscules", + "uk-ua": "Чутливий до регістру", + "de-ch": "Groß- und Kleinschreibung beachten", + "pt-br": "Maiúsculas e minúsculas", + }, + caseInsensitive: { + "en-us": "Case-insensitive", + "ru-ru": "Без учета регистра", + "es-es": "Sin distinción entre mayúsculas y minúsculas", + "fr-fr": "Insensible à la casse", + "uk-ua": "Регістр не враховується", + "de-ch": "Groß-/Kleinschreibung wird nicht beachtet", + "pt-br": "Não diferencia maiúsculas de minúsculas", + }, + showNoReadTables: { + "en-us": 'Show tables without "Read" access', + "ru-ru": "Показывать таблицы без доступа «Чтение»", + "es-es": 'Mostrar tablas sin acceso de "Lectura"', + "fr-fr": 'Afficher les tableaux sans accès "Lecture"', + "uk-ua": "Показувати таблиці без доступу «Читання»", + "de-ch": "Tabellen ohne Lesezugriff anzeigen", + "pt-br": 'Mostrar tabelas sem acesso de "Leitura"', + }, + showNoAccessTables: { + "en-us": 'Show tables without "Create" access', + "ru-ru": "Показывать таблицы без права «Создать»", + "es-es": 'Mostrar tablas sin acceso "Crear"', + "fr-fr": 'Afficher les tableaux sans accès "Créer"', + "uk-ua": "Показувати таблиці без доступу «Створити»", + "de-ch": "Tabellen ohne „Erstellen“-Zugriff anzeigen", + "pt-br": 'Mostrar tabelas sem acesso "Criar"', + }, + textAreaAutoGrow: { + "en-us": "Text boxes grow automatically", + "ru-ru": "Текстовые поля увеличиваются автоматически", + "es-es": "Los cuadros de texto crecen automáticamente", + "fr-fr": "Les zones de texte s'agrandissent automatiquement", + "uk-ua": "Текстові поля збільшуються автоматично", + "de-ch": "Textfelder werden automatisch vergrößert", + "pt-br": "As caixas de texto crescem automaticamente", + }, + clearQueryFilters: { + "en-us": "Reset query filters", + "ru-ru": "Сбросить фильтры запроса", + "es-es": "Restablecer filtros de consulta", + "fr-fr": "Réinitialiser les filtres de requête", + "uk-ua": "Скинути фільтри запитів", + "de-ch": "Abfragefilter zurücksetzen", + "pt-br": "Redefinir filtros de consulta", + }, + clearQueryFiltersDescription: { + "en-us": "Clears all query filters when running a Report from a Form.", + "de-ch": + "Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.", + "es-es": + "Borra todos los filtros de consulta al ejecutar un informe desde un formulario.", + "fr-fr": + "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", + "ru-ru": "Очищает все фильтры запроса при запуске отчета из формы.", + "uk-ua": "Очищає всі фільтри запитів під час запуску звіту з форми.", + "pt-br": + "Limpa todos os filtros de consulta ao executar um relatório de um formulário.", + }, + queryParamtersFromForm: { + "en-us": "Show query filters when running a Report from a Form", + "de-ch": + "Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird", + "es-es": + "Mostrar filtros de consulta al ejecutar un informe desde un formulario", + "fr-fr": + "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", + "ru-ru": "Показывать фильтры запроса при запуске отчета из формы", + "uk-ua": "Показувати фільтри запитів під час запуску звіту з форми", + "pt-br": + "Mostrar filtros de consulta ao executar um relatório de um formulário", + }, + autoGrowAutoComplete: { + "en-us": "Allow autocomplete to grow as wide as need", + "ru-ru": + "Разрешить автозаполнению расширяться настолько, насколько это необходимо", + "es-es": "Permitir que el autocompletado crezca tanto como sea necesario", + "fr-fr": + "Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée", + "uk-ua": + "Дозволити автозаповнення розширюватися настільки, наскільки потрібно", + "de-ch": + "Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen", + "pt-br": + "Permitir que o preenchimento automático cresça o quanto for necessário", + }, + tableNameInTitle: { + "en-us": "Include table name in the browser page title", + "ru-ru": "Включить имя таблицы в заголовок страницы браузера", + "es-es": + "Incluir el nombre de la tabla en el título de la página del navegador", + "fr-fr": + "Inclure le nom de la table dans le titre de la page du navigateur", + "uk-ua": "Включіть назву таблиці в заголовок сторінки браузера", + "de-ch": "Tabellennamen in den Seitentitel des Browsers aufnehmen", + "pt-br": "Incluir nome da tabela no título da página do navegador", + }, + focusFirstField: { + "en-us": "Focus first field", + "de-ch": "Fokus erstes Feld", + "es-es": "Enfoque el primer campo", + "fr-fr": "Concentrez-vous sur le premier champ", + "ru-ru": "Фокус первого поля", + "uk-ua": "Перейти до першого поля", + "pt-br": "Foco primeiro no campo", + }, + doubleClickZoom: { + "en-us": "Double click to zoom", + "ru-ru": "Дважды щелкните, чтобы увеличить", + "es-es": "Haga doble clic para ampliar", + "fr-fr": "Double-cliquez pour zoomer", + "uk-ua": "Двічі клацніть, щоб збільшити", + "de-ch": "Zum Vergrößern doppelklicken", + "pt-br": "Clique duas vezes para ampliar", + }, + closePopupOnClick: { + "en-us": "Close pop-up on outside click", + "ru-ru": "Закрытие всплывающего окна при внешнем щелчке", + "es-es": "Cerrar ventana emergente al hacer clic desde fuera", + "fr-fr": "Fermer la pop-up lors d'un clic extérieur", + "uk-ua": "Закрити спливаюче вікно при зовнішньому клацанні", + "de-ch": "Popup bei externem Klick schließen", + "pt-br": "Fechar pop-up ao clicar fora", + }, + animateTransitions: { + "en-us": "Animate transitions", + "ru-ru": "Анимированные переходы", + "es-es": "Transiciones animadas", + "fr-fr": "Animer les transitions", + "uk-ua": "Анімація переходів", + "de-ch": "Übergänge animieren", + "pt-br": "Transições animadas", + }, + panInertia: { + "en-us": "Pan inertia", + "ru-ru": "Инерция пан", + "es-es": "Inercia de la sartén", + "fr-fr": "Inertie du bac", + "uk-ua": "Інерція панорами", + "de-ch": "Schwenkträgheit", + "pt-br": "Inércia da panela", + }, + mouseDrags: { + "en-us": "Mouse drags", + "ru-ru": "Перетаскивание мышью", + "es-es": "El ratón arrastra", + "uk-ua": "Виділіть відповідний підрядок", + "de-ch": "Maus zieht", + "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", + "pt-br": "Arrastos do mouse", + }, + scrollWheelZoom: { + "en-us": "Scroll wheel zoom", + "ru-ru": "Масштабирование с помощью колеса прокрутки", + "es-es": "Zoom con rueda de desplazamiento", + "fr-fr": "Zoom avec la molette de défilement", + "uk-ua": "Масштаб колеса прокрутки", + "de-ch": "Scrollrad-Zoom", + "pt-br": "Zoom da roda de rolagem", + }, + flexibleColumnWidth: { + "en-us": "Flexible column width", + "ru-ru": "Гибкая ширина столбца", + "es-es": "Ancho de columna flexible", + "fr-fr": "Largeur de colonne flexible", + "uk-ua": "Гнучка ширина колонки", + "de-ch": "Flexible Spaltenbreite", + "pt-br": "Largura de coluna flexível", + }, + flexibleSubGridColumnWidth: { + "en-us": "Flexible subview grid column width", + "ru-ru": "Гибкая ширина столбца сетки подпредставлений", + "es-es": "Ancho de columna de cuadrícula de subvista flexible", + "fr-fr": "Largeur de colonne de grille de sous-vue flexible", + "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", + "de-ch": "Flexible Spaltenbreite des Unteransichtsrasters", + "pt-br": "Largura flexível da coluna da grade de subvisualização", + }, + closeOnEsc: { + "en-us": "Close on ESC key press", + "ru-ru": "Закрыть нажатием клавиши ESC", + "es-es": "Cerrar al presionar la tecla ESC", + "fr-fr": "Icône et nom de la table", + "uk-ua": "Закриття натисканням клавіші ESC", + "de-ch": "Schließen durch Drücken der Taste ESC", + "pt-br": "Fechar ao pressionar a tecla ESC", + }, + closeOnOutsideClick: { + "en-us": "Close on outside click", + "ru-ru": "Закрытие по внешнему щелчку", + "es-es": "Cerrar al hacer clic desde fuera", + "fr-fr": "Fermer sur clic extérieur", + "uk-ua": "Закрийте зовнішнім клацанням", + "de-ch": "Schließen durch Klicken von außen", + "pt-br": "Fechar com clique externo", + }, + specifyNetworkBadge: { + "en-us": "Specify Network Badge", + "ru-ru": "Укажите сетевой значок", + "es-es": "Especificar la insignia de red", + "fr-fr": "Spécifier le badge réseau", + "uk-ua": "Укажіть значок мережі", + "de-ch": "Netzwerk-Badge angeben", + "pt-br": "Especificar emblema de rede", + }, + useAccessibleFullDatePicker: { + "en-us": "Use accessible full date picker", + "ru-ru": "Используйте доступный полный выбор даты", + "es-es": "Utilice el selector de fecha completo y accesible", + "fr-fr": "Utiliser un sélecteur de date complet accessible", + "uk-ua": "Використовуйте доступний повний засіб вибору дати", + "de-ch": "Verwenden Sie eine barrierefreie Datumsauswahl", + "pt-br": "Use o seletor de data completo acessível", + }, + useAccessibleMonthPicker: { + "en-us": "Use accessible month picker", + "ru-ru": "Используйте доступный выбор месяца", + "es-es": "Utilice el selector de meses accesible", + "fr-fr": "Utiliser le sélecteur de mois accessible", + "uk-ua": "Використовуйте доступний засіб вибору місяця", + "de-ch": "Verwenden Sie die barrierefreie Monatsauswahl", + "pt-br": "Use o seletor de meses acessível", + }, + rightAlignNumberFields: { + "en-us": "Right-Justify numeric fields", + "ru-ru": "Выравнивание числовых полей по правому краю", + "es-es": "Justificar a la derecha los campos numéricos", + "fr-fr": "Justifier à droite les champs numériques", + "uk-ua": "Вирівнювання по правому краю числових полів", + "de-ch": "Rechtsbündige Ausrichtung numerischer Felder", + "pt-br": "Justificar à direita campos numéricos", + }, + roundedCorners: { + "en-us": "Rounded corners", + "ru-ru": "Закругленные углы", + "es-es": "esquinas redondeadas", + "fr-fr": "Coins arrondis", + "uk-ua": "Заокруглені кути", + "de-ch": "Abgerundete Ecken", + "pt-br": "Cantos arredondados", + }, + showSubviewBorders: { + "en-us": "Show borders around subviews", + "de-ch": "Rahmen um Unteransichten anzeigen", + "es-es": "Mostrar bordes alrededor de las subvistas", + "fr-fr": "Afficher les bordures autour des sous-vues", + "pt-br": "Mostrar bordas ao redor das subvisualizações", + "ru-ru": "Показывать границы вокруг подпредставлений", + "uk-ua": "Показати межі навколо підвидів", + }, + limitMaxFieldWidth: { + "en-us": "Limit max field width", + "ru-ru": "Ограничить максимальную ширину поля", + "es-es": "Limitar el ancho máximo del campo", + "fr-fr": "Limiter la largeur maximale du champ", + "uk-ua": "Обмеження максимальної ширини поля", + "de-ch": "Maximale Feldbreite begrenzen", + "pt-br": "Limite máximo de largura do campo", + }, + condenseQueryResults: { + "en-us": "Condense query results", + "ru-ru": "Сжать результаты запроса", + "es-es": "Condensar los resultados de la consulta", + "fr-fr": "Condenser les résultats de la requête", + "uk-ua": "Згорнути результати запиту", + "de-ch": "Abfrageergebnisse verdichten", + "pt-br": "Condensar resultados da consulta", + }, + blurContentBehindDialog: { + "en-us": "Blur content behind the dialog", + "ru-ru": "Размытие содержимого за диалогом", + "es-es": "Desenfocar el contenido detrás del diálogo", + "fr-fr": "Flou le contenu derrière la boîte de dialogue", + "uk-ua": "Розмити вміст за діалоговим вікном", + "de-ch": "Inhalte hinter dem Dialog verwischen", + "pt-br": "Desfocar o conteúdo atrás do diálogo", + }, + collectionSortOrderDescription: { + "en-us": "This determines the visual order of collections.", + "ru-ru": "Это определяет визуальный порядок коллекций.", + "es-es": "Esto determina el orden visual de las colecciones.", + "fr-fr": "Ceci détermine l'ordre visuel des collections.", + "uk-ua": "Це визначає візуальний порядок колекцій.", + "de-ch": "Dies bestimmt die visuelle Reihenfolge der Sammlungen.", + "pt-br": "Isso determina a ordem visual das coleções.", + }, + recordSetRecordToOpen: { + "en-us": "Record to open by default", + "ru-ru": "Запись для открытия по умолчанию", + "es-es": "Registro para abrir por defecto", + "fr-fr": "Enregistrement à ouvrir par défaut", + "uk-ua": "Запис відкривається за умовчанням", + "de-ch": "Standardmäßig zu öffnender Datensatz", + "pt-br": "Gravar para abrir por padrão", + }, + altClickToSupressNewTab: { + "en-us": + "{altKeyName:string}+Click to suppress new tab", + "ru-ru": + "{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку", + "es-es": + "{altKeyName:string}+Haga clic en para suprimir la nueva pestaña", + "fr-fr": + "{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet", + "uk-ua": + "{altKeyName:string}+Натисніть , щоб закрити нову вкладку", + "de-ch": + "{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken", + "pt-br": + "{altKeyName:string}+Clique em para suprimir a nova guia", + }, + altClickToSupressNewTabDescription: { + "en-us": + "{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.", + "ru-ru": + "{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.", + "es-es": + "{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.", + "fr-fr": "Utiliser le sélecteur de mois accessible.", + "uk-ua": + "{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.", + "de-ch": + "{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.", + "pt-br": + "{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.", + }, + makeFormDialogsModal: { + "en-us": "Make form dialogs gray out the background", + "ru-ru": "Сделать фон диалоговых окон серым", + "es-es": + "Hacer que los cuadros de diálogo del formulario tengan el fondo en gris", + "fr-fr": + "Rendre les boîtes de dialogue de formulaire grisées sur l'arrière-plan", + "uk-ua": "Зробіть діалогові вікна форми сірими фоном", + "de-ch": "Den Hintergrund von Formulardialogen ausgrauen", + "pt-br": + "Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado", + }, + autoScrollTree: { + "en-us": "Auto scroll tree to focused node", + "ru-ru": "Автоматическая прокрутка дерева к выбранному узлу", + "es-es": "Desplazamiento automático del árbol al nodo enfocado", + "fr-fr": "Arbre de défilement automatique vers le nœud ciblé", + "uk-ua": "Автоматичне прокручування дерева до виділеного вузла", + "de-ch": "Automatisches Scrollen des Baums zum fokussierten Knoten", + "pt-br": "Rolagem automática da árvore para o nó em foco", + }, + sortByField: { + "en-us": "Order By Field", + "de-ch": "Nach Feld sortieren", + "es-es": "Ordenar por campo", + "fr-fr": "Trier par champ", + "pt-br": "Ordenar por campo", + "ru-ru": "Сортировать по полю", + "uk-ua": "Сортувати за полем", + }, + lineWrap: { + "en-us": "Line wrap", + "ru-ru": "Перенос строки", + "es-es": "Ajuste de línea", + "fr-fr": "Retour à la ligne", + "uk-ua": "Обтікання лініями", + "de-ch": "Zeilenumbruch", + "pt-br": "Quebra de linha", + }, + indentSize: { + "en-us": "Indent size", + "ru-ru": "Размер отступа", + "es-es": "Tamaño de sangría", + "fr-fr": "Taille du retrait", + "uk-ua": "Розмір відступу", + "de-ch": "Einzugsgröße", + "pt-br": "Tamanho do recuo", + }, + indentWithTab: { + "en-us": "Indent with Tab", + "ru-ru": "Отступ с помощью Tab", + "es-es": "Sangría con Tab", + "fr-fr": "Indenter avec Tabulation", + "uk-ua": "Відступ із Tab", + "de-ch": "Einrücken mit Tab", + "pt-br": "Recuo com Tab", + }, + formHeaderFormat: { + "en-us": "Form header format", + "ru-ru": "Формат заголовка формы", + "es-es": "Formato del encabezado del formulario", + "fr-fr": "Format d'en-tête de formulaire", + "uk-ua": "Формат заголовка форми", + "de-ch": "Formularkopfformat", + "pt-br": "Formato do cabeçalho do formulário", + }, + iconAndTableName: { + "en-us": "Icon and table name", + "ru-ru": "Значок и название таблицы", + "es-es": "Icono y nombre de la tabla", + "fr-fr": "Icône et nom de la table", + "uk-ua": "Значок і назва таблиці", + "de-ch": "Symbol und Tabellenname", + "pt-br": "Ícone e nome da tabela", + }, + tableIcon: { + "en-us": "Table icon", + "ru-ru": "Значок таблицы", + "es-es": "Icono de tabla", + "fr-fr": "Icône de tableau", + "uk-ua": "Значок таблиці", + "de-ch": "Tabellensymbol", + "pt-br": "Ícone de tabela", + }, + maxHeight: { + "en-us": "Max height", + "ru-ru": "Максимальная высота", + "es-es": "Altura máxima", + "fr-fr": "hauteur maximum", + "uk-ua": "Максимальна висота", + "de-ch": "Maximale Höhe", + "pt-br": "Altura máxima", + }, + autoComplete: { + "en-us": "Auto complete", + "ru-ru": "Автозаполнение", + "es-es": "Autocompletar", + "fr-fr": + "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", + "uk-ua": + "Визначає підписи полів, примітки щодо використання та підписи таблиць", + "de-ch": "Autovervollständigung", + "pt-br": "Preenchimento automático", + }, + searchCaseSensitive: { + "en-us": "Case-sensitive search", + "es-es": "Búsqueda que distingue entre mayúsculas y minúsculas", + "fr-fr": "Recherche sensible à la casse", + "uk-ua": "Пошук з урахуванням регістру", + "de-ch": "Groß- und Kleinschreibung beachten", + "ru-ru": "Поиск с учетом регистра", + "pt-br": "Pesquisa com diferenciação entre maiúsculas e minúsculas", + }, + searchField: { + "en-us": "Search Field", + "ru-ru": "Поле поиска", + "es-es": "Campo de búsqueda", + "fr-fr": "Champ de recherche", + "uk-ua": "Поле пошуку", + "de-ch": "Suchfeld", + "pt-br": "Campo de pesquisa", + }, + createInteractions: { + "en-us": "Creating an interaction", + "ru-ru": "Создание взаимодействия", + "es-es": "Creando una interacción", + "fr-fr": "Créer une interaction", + "uk-ua": "Створення взаємодії", + "de-ch": "Erstellen einer Interaktion", + "pt-br": "Criando uma interação", + }, + useSpaceAsDelimiter: { + "en-us": "Use space as delimiter", + "ru-ru": "Используйте пробел в качестве разделителя", + "es-es": "Utilice el espacio como delimitador", + "fr-fr": "Utiliser l'espace comme délimiteur", + "uk-ua": "Використовуйте пробіл як роздільник", + "de-ch": "Leerzeichen als Trennzeichen verwenden", + "pt-br": "Use espaço como delimitador", + }, + useCommaAsDelimiter: { + "en-us": "Use comma as delimiter", + "ru-ru": "Используйте запятую в качестве разделителя", + "es-es": "Utilice la coma como delimitador", + "fr-fr": "Utiliser la virgule comme délimiteur", + "uk-ua": "Використовуйте кому як роздільник", + "de-ch": "Verwenden Sie Kommas als Trennzeichen.", + "pt-br": "Use vírgula como delimitador", + }, + useNewLineAsDelimiter: { + "en-us": "Use new line as delimiter", + "ru-ru": "Использовать новую строку в качестве разделителя", + "es-es": "Utilice nueva línea como delimitador", + "fr-fr": "Utiliser une nouvelle ligne comme délimiteur", + "uk-ua": "Використовуйте новий рядок як роздільник", + "de-ch": "Neue Zeile als Trennzeichen verwenden", + "pt-br": "Use nova linha como delimitador", + }, + useCustomDelimiters: { + "en-us": "Use custom delimiters", + "ru-ru": "Используйте пользовательские разделители", + "es-es": "Utilice delimitadores personalizados", + "fr-fr": "Utiliser des délimiteurs personnalisés", + "uk-ua": "Використовуйте спеціальні роздільники", + "de-ch": "Benutzerdefinierte Trennzeichen verwenden", + "pt-br": "Use delimitadores personalizados", + }, + useCustomDelimitersDescription: { + "en-us": + "A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.", + "ru-ru": + "Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.", + "es-es": + "Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.", + "fr-fr": + "Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.", + "uk-ua": + "Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.", + "de-ch": + "Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.", + "pt-br": + "Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.", + }, + detectAutomaticallyDescription: { + "en-us": "Detect automatically based on catalog number format.", + "ru-ru": "Автоматическое определение на основе формата каталожного номера.", + "es-es": + "Detectar automáticamente según el formato del número de catálogo.", + "fr-fr": + "Détecter automatiquement en fonction du format du numéro de catalogue.", + "uk-ua": "Визначати автоматично на основі формату номера каталогу.", + "de-ch": "Automatische Erkennung basierend auf dem Katalognummernformat.", + "pt-br": + "Detecte automaticamente com base no formato do número de catálogo.", + }, + use: { + comment: "Verb", + "en-us": "Use", + "ru-ru": "Использовать", + "es-es": "Usar", + "fr-fr": "Utiliser", + "uk-ua": "використання", + "de-ch": "Verwenden", + "pt-br": "Usar", + }, + dontUse: { + "en-us": "Don’t use", + "ru-ru": "Не использовать", + "es-es": "No utilizar", + "fr-fr": "Zoom avec la molette de défilement", + "uk-ua": "Масштаб колеса прокрутки", + "de-ch": "Nicht verwenden", + "pt-br": "Não use", + }, + position: { + "en-us": "Position", + "es-es": "Posición", + "fr-fr": "Position", + "ru-ru": "Позиция", + "uk-ua": "Позиція", + "de-ch": "Position", + "pt-br": "Posição", + }, + top: { + "en-us": "Top", + "es-es": "Arriba", + "fr-fr": "Haut", + "ru-ru": "Вершина", + "uk-ua": "Топ", + "de-ch": "Spitze", + "pt-br": "Principal", + }, + bottom: { + "en-us": "Bottom", + "es-es": "Abajo", + "ru-ru": "Нижний", + "uk-ua": "Дно", + "de-ch": "Unten", + "fr-fr": "Bas", + "pt-br": "Fundo", + }, + left: { + "en-us": "Left", + "es-es": "Izquierda", + "fr-fr": "Gauche", + "ru-ru": "Левый", + "uk-ua": "Ліворуч", + "de-ch": "Links", + "pt-br": "Esquerda", + }, + right: { + "en-us": "Right", + "es-es": "Bien", + "fr-fr": "Droite", + "ru-ru": "Верно", + "uk-ua": "правильно", + "de-ch": "Rechts", + "pt-br": "Certo", + }, + showUnsavedIndicator: { + "en-us": "Show unsaved changes indicator", + "ru-ru": "Показать индикатор несохраненных изменений", + "es-es": "Mostrar indicador de cambios no guardados", + "fr-fr": "Afficher l'indicateur de modifications non enregistrées", + "uk-ua": "Показати індикатор незбережених змін", + "de-ch": "Indikator für nicht gespeicherte Änderungen anzeigen", + "pt-br": "Mostrar indicador de alterações não salvas", + }, + showUnsavedIndicatorDescription: { + "en-us": + 'Show an "*" in the tab title when there are unsaved changes in the current tab.', + "es-es": + 'Mostrar un "*" en el título de la pestaña cuando haya cambios sin guardar en la pestaña actual.', + "fr-fr": + "Afficher un \"*\" dans le titre de l'onglet lorsqu'il y a des modifications non enregistrées dans l'onglet actuel.", + "ru-ru": + "Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.", + "uk-ua": + "Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.", + "de-ch": + "Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.", + "pt-br": + 'Exibir um "*" no título da aba quando houver alterações não salvas na aba atual.', + }, + autoPopulateDescription: { + "en-us": + "Auto populate the merged record with values from duplicates when opening the merging dialog.", + "ru-ru": + "Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.", + "de-ch": + "Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.", + "es-es": + "Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.", + "fr-fr": + "Remplir automatiquement l'enregistrement fusionné avec les valeurs des doublons lors de l'ouverture de la boîte de dialogue de fusion.", + "uk-ua": + "Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.", + "pt-br": + "Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.", + }, + autoCreateVariants: { + "en-us": "Automatically create {agentVariantTable:string} records", + "ru-ru": "Автоматически создавать записи {agentVariantTable:string}", + "de-ch": "{agentVariantTable:string}-Datensätze automatisch erstellen", + "es-es": "Crear automáticamente registros {agentVariantTable:string}", + "fr-fr": + "Créer automatiquement des enregistrements {agentVariantTable:string}", + "uk-ua": "Автоматично створювати записи {agentVariantTable:string}", + "pt-br": "Criar automaticamente registros {agentVariantTable:string}", + }, + autoCreateVariantsDescription: { + "en-us": + "When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.", + "ru-ru": + "При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.", + "de-ch": + "Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.", + "es-es": + "Al fusionar agentes, cree automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.", + "fr-fr": + "Lors de la fusion d'agents, créez automatiquement des enregistrements {agentVariantTable:string} en fonction des variations du prénom/nom.", + "uk-ua": + "Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.", + "pt-br": + "Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.", + }, + collectionPreferences: { + "en-us": "Collection Preferences", + "de-ch": "Sammlungseinstellungen", + "es-es": "Preferencias de colección", + "fr-fr": "Personnalisation", + "ru-ru": "Настройки коллекции", + "uk-ua": "Налаштування", + "pt-br": "Preferências de coleção", + }, + rememberDialogSizes: { + "en-us": "Remember dialog window sizes", + "ru-ru": "Запомните размеры диалоговых окон", + "es-es": "Recordar los tamaños de las ventanas de diálogo", + "fr-fr": "Mémoriser les tailles des fenêtres de dialogue", + "uk-ua": "Запам'ятайте розміри діалогових вікон", + "de-ch": "Dialogfenstergrößen merken", + "pt-br": "Lembrar tamanhos de janelas de diálogo", + }, + rememberDialogPositions: { + "en-us": "Remember dialog window positions", + "ru-ru": "Запомнить позиции диалоговых окон", + "es-es": "Recordar las posiciones de las ventanas de diálogo", + "fr-fr": "Mémoriser les positions des fenêtres de dialogue", + "uk-ua": "Запам'ятовуйте положення діалогового вікна", + "de-ch": "Dialogfensterpositionen merken", + "pt-br": "Lembrar posições da janela de diálogo", + }, + autoPlayMedia: { + "en-us": "Automatically play media", + "ru-ru": "Автоматически воспроизводить медиа", + "es-es": "Reproducir automáticamente medios", + "fr-fr": "Lire automatiquement les médias", + "uk-ua": "Автоматичне відтворення медіа", + "de-ch": "Medien automatisch abspielen", + "pt-br": "Reproduzir mídia automaticamente", + }, + useCustomTooltips: { + "en-us": "Use modern tooltips", + "ru-ru": "Используйте современные подсказки", + "es-es": "Utilice información sobre herramientas moderna", + "fr-fr": "Utiliser des info-bulles modernes", + "uk-ua": "Використовуйте сучасні підказки", + "de-ch": "Verwenden Sie moderne Tooltips", + "pt-br": "Use dicas de ferramentas modernas", + }, + alwaysUseQueryBuilder: { + "en-us": "Always use query builder search inside of search form", + "de-ch": + "Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche", + "es-es": + "Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda", + "fr-fr": + "Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche", + "ru-ru": "Всегда используйте конструктор запросов внутри формы поиска.", + "uk-ua": "Завжди використовуйте пошук конструктора запитів у формі пошуку", + "pt-br": + "Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa", + }, + localizeResourceNames: { + "en-us": "Localize the names of recognized app resources", + "de-ch": "Lokalisieren Sie die Namen erkannter App-Ressourcen", + "es-es": + "Localizar los nombres de los recursos de aplicaciones reconocidos", + "fr-fr": "Localiser les noms des ressources d'application reconnues", + "ru-ru": "Локализуйте названия распознанных ресурсов приложения", + "uk-ua": "Локалізувати назви розпізнаних ресурсів програми", + "pt-br": "Localize os nomes dos recursos de aplicativos reconhecidos", + }, + splitLongXml: { + "en-us": "Split long lines of XML into multiple lines", + "de-ch": "Teilen Sie lange XML-Zeilen in mehrere Zeilen auf", + "es-es": "Dividir líneas largas de XML en varias líneas", + "fr-fr": "Diviser les longues lignes de XML en plusieurs lignes", + "ru-ru": "Разделить длинные строки XML на несколько строк", + "uk-ua": "Розділіть довгі рядки XML на кілька рядків", + "pt-br": "Dividir longas linhas de XML em várias linhas", + }, + url: { + "en-us": "URL", + "de-ch": "URL", + "es-es": "URL", + "fr-fr": "URL", + "uk-ua": "URL", + "ru-ru": "URL", + "pt-br": "URL", + }, + pickAttachment: { + "en-us": "Pick an attachment", + "es-es": "Elige un archivo adjunto", + "fr-fr": "Choisissez une pièce jointe", + "ru-ru": "Выберите вложение", + "uk-ua": "Виберіть вкладення", + "de-ch": "Wählen Sie einen Anhang", + "pt-br": "Escolha um anexo", + }, + attachmentFailed: { + "en-us": "The attachment failed to load.", + "de-ch": "Der Anhang konnte nicht geladen werden.", + "es-es": "No se pudo cargar el archivo adjunto.", + "fr-fr": "La pièce jointe n'a pas pu être chargée.", + "ru-ru": "Не удалось загрузить вложение.", + "uk-ua": "Не вдалося завантажити вкладений файл.", + "pt-br": "O anexo não pôde ser carregado.", + }, + pickImage: { + "en-us": "Pick an image", + "de-ch": "Wählen Sie ein Bild aus", + "es-es": "Elige una imagen", + "fr-fr": "Choisissez une image", + "ru-ru": "Выберите изображение", + "uk-ua": "Виберіть зображення", + "pt-br": "Escolha uma imagem", + }, + customLogo: { + "en-us": "Expanded Image URL", + "de-ch": "Erweiterte Bild-URL", + "es-es": "URL de imagen expandida", + "fr-fr": "URL de l'image étendue", + "ru-ru": "URL-адрес развернутого изображения", + "uk-ua": "Розширена URL-адреса зображення", + "pt-br": "URL da imagem expandida", + }, + customLogoCollapsed: { + "en-us": "Collapsed Image URL", + "de-ch": "URL des minimierten Bildes", + "es-es": "URL de imagen contraída", + "fr-fr": "URL de l'image réduite", + "ru-ru": "URL-адрес свернутого изображения", + "uk-ua": "URL-адреса згорнутого зображення", + "pt-br": "URL da imagem recolhida", + }, + customLogoDescription: { + "en-us": + "A URL to an image that would be displayed next to the Specify logo in the navigation menu.", + "de-ch": + "Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.", + "es-es": + "Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.", + "fr-fr": + "Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.", + "ru-ru": + "URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.", + "uk-ua": + "URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.", + "pt-br": + "Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.", + }, + showLineNumber: { + "en-us": "Show query result line number", + "de-ch": "Zeilennummer des Abfrageergebnisses anzeigen", + "es-es": "Mostrar el número de línea del resultado de la consulta", + "fr-fr": "Afficher le numéro de ligne du résultat de la requête", + "ru-ru": "Показать номер строки результата запроса", + "uk-ua": "Показати номер рядка результату запиту", + "pt-br": "Mostrar número da linha do resultado da consulta", + }, + saveButtonColor: { + "en-us": "Save button color", + "de-ch": "Farbe der Schaltfläche „Speichern“", + "es-es": "Guardar el color del botón", + "fr-fr": "Couleur du bouton Enregistrer", + "ru-ru": "Сохранить цвет кнопки", + "uk-ua": "Зберегти колір кнопки", + "pt-br": "Cor do botão Salvar", + }, + secondaryButtonColor: { + "en-us": "Secondary button color", + "es-es": "Color del botón secundario", + "fr-fr": "Couleur du bouton secondaire", + "ru-ru": "Цвет вторичной кнопки", + "uk-ua": "Колір вторинної кнопки", + "de-ch": "Sekundäre Schaltflächenfarbe", + "pt-br": "Cor do botão secundário", + }, + secondaryLightButtonColor: { + "en-us": "Secondary light button color", + "de-ch": "Farbe der sekundären Lichttaste", + "es-es": "Color del botón de luz secundaria", + "fr-fr": "Couleur du bouton lumineux secondaire", + "ru-ru": "Цвет кнопки дополнительного освещения", + "uk-ua": "Колір вторинної світлової кнопки", + "pt-br": "Cor do botão de luz secundária", + }, + dangerButtonColor: { + "en-us": "Danger button color", + "de-ch": "Farbe der Gefahrenschaltfläche", + "es-es": "Color del botón de peligro", + "fr-fr": "Couleur du bouton de danger", + "ru-ru": "Цвет кнопки «Опасность»", + "uk-ua": "Колір кнопки небезпеки", + "pt-br": "Cor do botão de perigo", + }, + infoButtonColor: { + "en-us": "Info button color", + "de-ch": "Farbe der Info-Schaltfläche", + "es-es": "Color del botón de información", + "fr-fr": "Couleur du bouton d'information", + "ru-ru": "Цвет кнопки информации", + "uk-ua": "Колір інформаційної кнопки", + "pt-br": "Cor do botão de informações", + }, + warningButtonColor: { + "en-us": "Warning button color", + "de-ch": "Farbe der Warnschaltfläche", + "es-es": "Color del botón de advertencia", + "fr-fr": "Couleur du bouton d'avertissement", + "ru-ru": "Цвет кнопки предупреждения", + "uk-ua": "Колір кнопки попередження", + "pt-br": "Cor do botão de aviso", + }, + successButtonColor: { + "en-us": "Success button color", + "de-ch": "Farbe der Schaltfläche „Erfolg“", + "es-es": "Color del botón de éxito", + "fr-fr": "Couleur du bouton de réussite", + "ru-ru": "Цвет кнопки «Успех»", + "uk-ua": "Колір кнопки успіху", + "pt-br": "Cor do botão de sucesso", + }, + openAsReadOnly: { + "en-us": "Open all records in read-only mode", + "de-ch": "Alle Datensätze im schreibgeschützten Modus öffnen", + "es-es": "Abrir todos los registros en modo de solo lectura", + "fr-fr": "Ouvrir tous les enregistrements en mode lecture seule", + "ru-ru": "Открыть все записи в режиме только для чтения", + "uk-ua": "Відкрити всі записи в режимі лише для читання", + "pt-br": "Abra todos os registros no modo somente leitura", + }, + displayBasicView: { + "en-us": "Display basic view", + "de-ch": "Basisansicht anzeigen", + "es-es": "Mostrar vista básica", + "fr-fr": "Afficher la vue de base", + "ru-ru": "Отобразить базовый вид", + "uk-ua": "Відобразити базовий вигляд", + "pt-br": "Exibir visualização básica", + }, + showComparisonOperatorsForString: { + "en-us": "Show comparison operators for text-based fields", + "de-ch": "Vergleichsoperatoren für textbasierte Felder anzeigen", + "es-es": "Mostrar operadores de comparación para campos basados en texto", + "fr-fr": "Afficher les opérateurs de comparaison pour les champs textuels", + "pt-br": "Mostrar operadores de comparação para campos baseados em texto", + "ru-ru": "Показать операторы сравнения для текстовых полей", + "uk-ua": "Показати оператори порівняння для текстових полів", + }, + showComparisonOperatorsDescription: { + "en-us": + "Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to", + "de-ch": + "Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich", + "es-es": + "Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que", + "fr-fr": + "Permet d'appliquer les filtres suivants aux champs de texte : Supérieur à, Inférieur à, Supérieur ou égal à et Inférieur ou égal à", + "pt-br": + "Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a", + "ru-ru": + "Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».", + "uk-ua": + "Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»", + }, + basicView: { + "en-us": "Basic view", + "de-ch": "Basisansicht", + "es-es": "Vista básica", + "fr-fr": "Vue de base", + "ru-ru": "Базовый вид", + "uk-ua": "Основний вигляд", + "pt-br": "Visão básica", + }, + detailedView: { + "en-us": "Detailed view", + "de-ch": "Detailansicht", + "es-es": "Vista detallada", + "fr-fr": "Vue détaillée", + "ru-ru": "Подробный вид", + "uk-ua": "Детальний вигляд", + "pt-br": "Visão detalhada", + }, + attachmentPreviewMode: { + "en-us": "Attachment preview mode", + "de-ch": "Anhangsvorschaumodus", + "es-es": "Modo de vista previa de archivos adjuntos", + "fr-fr": "Mode d'aperçu des pièces jointes", + "ru-ru": "Режим предварительного просмотра вложений", + "uk-ua": "Режим попереднього перегляду вкладених файлів", + "pt-br": "Modo de visualização de anexos", + }, + fullResolution: { + "en-us": "Full Resolution", + "de-ch": "Volle Auflösung", + "es-es": "Resolución completa", + "fr-fr": "Pleine résolution", + "ru-ru": "Полное разрешение", + "uk-ua": "Повна роздільна здатність", + "pt-br": "Resolução completa", + }, + thumbnail: { + "en-us": "Thumbnail", + "de-ch": "Miniaturansicht", + "es-es": "Uña del pulgar", + "fr-fr": "Vignette", + "ru-ru": "Миниатюра", + "uk-ua": "Мініатюра", + "pt-br": "Miniatura", + }, + addSearchBarHomePage: { + "en-us": "Add Search Bar on home page", + "de-ch": "Suchleiste auf der Startseite hinzufügen", + "es-es": "Agregar barra de búsqueda en la página de inicio", + "fr-fr": "Ajouter une barre de recherche sur la page d'accueil", + "ru-ru": "Добавить панель поиска на домашнюю страницу", + "uk-ua": "Додайте рядок пошуку на головну сторінку", + "pt-br": "Adicionar barra de pesquisa na página inicial", + }, + inheritanceCatNumberPref: { + "en-us": + "Enable the inheritance of the primary catalog number to its empty siblings.", + "de-ch": + "Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.", + "es-es": + "Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.", + "fr-fr": + "Activez l'héritage du numéro de catalogue principal vers ses frères vides.", + "pt-br": + "Habilitar a herança do número do catálogo primário para seus irmãos vazios.", + "ru-ru": + "Включить наследование основного каталожного номера его пустыми родственными номерами.", + "uk-ua": + "Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.", + }, + inheritanceCatNumberParentCOPref: { + "en-us": + "Enable the inheritance of the parent catalog number to its empty children.", + "de-ch": + "Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.", + "es-es": + "Habilitar la herencia del número de catálogo padre a sus hijos vacíos.", + "fr-fr": + "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", + "pt-br": + "Habilitar a herança do número do catálogo pai para seus filhos vazios.", + "ru-ru": + "Включить наследование родительского каталожного номера его пустыми дочерними элементами.", + "uk-ua": + "Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.", + }, +} as const; + + +export const preferencesGeneralText = createDictionary( + preferencesGeneralDictionary +); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 7ea7903bc8c..bed614cba81 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -1,726 +1,17 @@ /** - * Localization strings for the preferences menu (split into manageable sections). + * Localization strings for the preferences menu (aggregated from modular sections). * * @module */ import { createDictionary } from './utils'; -import { - preferencesContentText, -} from './preferences.content'; -import { - preferencesBehaviorText, -} from './preferences.behavior'; +import { preferencesBehaviorDictionary } from './preferences.behavior'; +import { preferencesContentDictionary } from './preferences.content'; +import { preferencesGeneralDictionary } from './preferences.general'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file -export const preferencesGeneralStrings = { - preferences: { - 'en-us': 'Preferences', - 'ru-ru': 'Настройки', - 'es-es': 'Preferencias', - 'fr-fr': 'Préférences', - 'uk-ua': 'Уподобання', - 'de-ch': 'Einstellungen', - 'pt-br': 'Preferências', - }, - customization: { - 'en-us': 'Customization', - 'ru-ru': 'Настройка', - 'es-es': 'Personalización', - 'fr-fr': 'Personnalisation', - 'uk-ua': 'Спеціальнізація', - 'de-ch': 'Anpassung', - 'pt-br': 'Personalização', - }, - userPreferences: { - 'en-us': 'User Preferences', - 'ru-ru': 'Настройки пользователя', - 'es-es': 'Preferencias del usuario', - 'fr-fr': "Préférences de l'utilisateur", - 'uk-ua': 'Налаштування користувача', - 'de-ch': 'Benutzereinstellungen', - 'pt-br': 'Preferências do usuário', - }, - defaultUserPreferences: { - 'en-us': 'Default User Preferences', - 'ru-ru': 'Настройки пользователя по умолчанию', - 'es-es': 'Preferencias de usuario predeterminadas', - 'fr-fr': 'Préférences utilisateur par défaut', - 'uk-ua': 'Параметри користувача за умовчанням', - 'de-ch': 'Standardbenutzereinstellungen', - 'pt-br': 'Preferências de usuário padrão', - }, - general: { - 'en-us': 'General', - 'ru-ru': 'Общий', - 'es-es': 'General', - 'fr-fr': 'Image personnalisée', - 'uk-ua': 'Спеціальне зображення', - 'de-ch': 'Allgemein', - 'pt-br': 'Em geral', - }, - ui: { - 'en-us': 'User Interface', - 'ru-ru': 'Пользовательский интерфейс', - 'es-es': 'Interfaz de usuario', - 'fr-fr': 'Interface utilisateur', - 'uk-ua': 'Інтерфейс користувача', - 'de-ch': 'Benutzeroberfläche', - 'pt-br': 'Interface do usuário', - }, - theme: { - 'en-us': 'Theme', - 'ru-ru': 'Тема', - 'es-es': 'Tema', - 'fr-fr': 'Thème', - 'uk-ua': 'Тема', - 'de-ch': 'Thema', - 'pt-br': 'Tema', - }, - useSystemSetting: { - 'en-us': 'Use system setting', - 'ru-ru': 'Использовать системные настройки', - 'es-es': 'Utilizar la configuración del sistema', - 'fr-fr': 'Utiliser les paramètres du système', - 'uk-ua': 'Використовуйте налаштування системи', - 'de-ch': 'Systemeinstellung verwenden', - 'pt-br': 'Usar configuração do sistema', - }, - inheritOsSettings: { - 'en-us': 'Copies value from your Operating System settings', - 'ru-ru': 'Копирует значение из настроек вашей операционной системы', - 'es-es': 'Copia el valor de la configuración de su sistema operativo', - 'fr-fr': "Copie la valeur des paramètres de votre système d'exploitation", - 'uk-ua': 'Копіює значення з налаштувань вашої операційної системи', - 'de-ch': 'Übernimmt den Wert aus Ihren Betriebssystemeinstellungen', - 'pt-br': 'Copia o valor das configurações do seu sistema operacional', - }, - light: { - comment: 'Light mode', - 'en-us': 'Light', - 'ru-ru': 'Свет', - 'es-es': 'Claro', - 'fr-fr': 'Lumière', - 'uk-ua': 'світло', - 'de-ch': 'Hell', - 'pt-br': 'Luz', - }, - dark: { - comment: 'Dark mode', - 'en-us': 'Dark', - 'ru-ru': 'Темный', - 'es-es': 'Oscuro', - 'fr-fr': 'Sombre', - 'uk-ua': 'Темний', - 'de-ch': 'Dunkel', - 'pt-br': 'Escuro', - }, - reduceMotion: { - 'en-us': 'Reduce motion', - 'ru-ru': 'Уменьшите движение', - 'es-es': 'Reducir el movimiento', - 'fr-fr': 'Réduire les mouvements', - 'uk-ua': 'Зменшити рух', - 'de-ch': 'Bewegung reduzieren', - 'pt-br': 'Reduzir movimento', - }, - reduceMotionDescription: { - 'en-us': 'Disable non-essential animations and transitions.', - 'ru-ru': 'Отключите ненужные анимации и переходы.', - 'es-es': 'Desactivar animaciones y transiciones no esenciales.', - 'fr-fr': 'Désactivez les animations et les transitions non essentielles.', - 'uk-ua': "Вимкніть необов'язкову анімацію та переходи.", - 'de-ch': 'Nicht erforderliche Animationen und Übergänge deaktivieren.', - 'pt-br': 'Desabilite animações e transições não essenciais.', - }, - reduceTransparency: { - 'en-us': 'Reduce transparency', - 'ru-ru': 'Уменьшить прозрачность', - 'es-es': 'Reducir la transparencia', - 'fr-fr': 'Réduire la transparence', - 'uk-ua': 'Зменшити прозорість', - 'de-ch': 'Transparenz reduzieren', - 'pt-br': 'Reduzir a transparência', - }, - reduceTransparencyDescription: { - 'en-us': - 'Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).', - 'ru-ru': - 'Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).', - 'es-es': - 'Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).', - 'fr-fr': - "S'il faut désactiver les arrière-plans translucides pour les composants de l'interface utilisateur chaque fois que possible (par exemple, les en-têtes de tableau dans l'arborescence).", - 'uk-ua': - 'Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).', - 'de-ch': - 'Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).', - 'pt-br': - 'Se deve desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).', - }, - contrast: { - 'en-us': 'Contrast', - 'ru-ru': 'Контраст', - 'es-es': 'Contraste', - 'fr-fr': 'Contraste', - 'uk-ua': 'Контраст', - 'de-ch': 'Kontrast', - 'pt-br': 'Contraste', - }, - increase: { - 'en-us': 'Increase', - 'ru-ru': 'Увеличивать', - 'es-es': 'Aumentar', - 'fr-fr': 'Augmenter', - 'uk-ua': 'Збільшити', - 'de-ch': 'Erhöhen', - 'pt-br': 'Aumentar', - }, - reduce: { - 'en-us': 'Reduce', - 'ru-ru': 'Уменьшать', - 'es-es': 'Reducir', - 'fr-fr': 'Réduire', - 'uk-ua': 'Зменшити', - 'de-ch': 'Verringern', - 'pt-br': 'Reduzir', - }, - noPreference: { - 'en-us': 'No preference', - 'ru-ru': 'Нет предпочтений', - 'es-es': 'Sin preferencia', - 'fr-fr': 'Pas de préférence', - 'uk-ua': 'Без переваг', - 'de-ch': 'Keine Präferenz', - 'pt-br': 'Sem preferência', - }, - fontSize: { - 'en-us': 'Font size', - 'ru-ru': 'Размер шрифта', - 'es-es': 'Tamaño de fuente', - 'fr-fr': 'Taille de police', - 'uk-ua': 'Розмір шрифту', - 'de-ch': 'Schriftgrösse', - 'pt-br': 'Tamanho da fonte', - }, - fontFamily: { - 'en-us': 'Font family', - 'ru-ru': 'Семейство шрифтов', - 'es-es': 'Familia de fuentes', - 'fr-fr': 'Famille de polices', - 'uk-ua': 'Сімейство шрифтів', - 'de-ch': 'Schrift-Familie', - 'pt-br': 'Família de fontes', - }, - fontFamilyDescription: { - 'en-us': - 'You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.', - 'ru-ru': - 'Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.', - 'es-es': - 'Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.', - 'fr-fr': - "Vous pouvez spécifier n'importe quelle police présente sur votre ordinateur, même si elle ne figure pas dans la liste. Une liste de polices séparées par des virgules est également prise en charge ; chaque police suivante sera utilisée si la précédente n'est pas disponible.", - 'uk-ua': - "Ви можете вказати будь-який шрифт, який є на вашому комп'ютері, навіть якщо його немає в списку. Також підтримується розділений комами список шрифтів, у якому використовуватиметься другий шрифт, якщо перший недоступний тощо.", - 'de-ch': - 'Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.', - 'pt-br': - 'Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.', - }, - defaultFont: { - 'en-us': '(default font)', - 'ru-ru': '(шрифт по умолчанию)', - 'es-es': '(fuente predeterminada)', - 'fr-fr': '(police par défaut)', - 'uk-ua': '(типовий шрифт)', - 'de-ch': '(Standardschriftart)', - 'pt-br': '(fonte padrão)', - }, - maxFormWidth: { - 'en-us': 'Max form width', - 'ru-ru': 'Максимальная ширина формы', - 'es-es': 'Ancho máximo del formulario', - 'fr-fr': 'Largeur maximale du formulaire', - 'uk-ua': 'Максимальна ширина форми', - 'de-ch': 'Maximale Formularbreite', - 'pt-br': 'Largura máxima do formulário', - }, - fieldBackgrounds: { - 'en-us': 'Field backgrounds', - 'ru-ru': 'Фоны полей', - 'es-es': 'Fondos de campo', - 'fr-fr': 'Milieux de terrain', - 'uk-ua': 'Польові фони', - 'de-ch': 'Feldhintergründe', - 'pt-br': 'Fundos de campo', - }, - fieldBackground: { - 'en-us': 'Field background', - 'ru-ru': 'Фон поля', - 'es-es': 'Fondo de campo', - 'fr-fr': 'Contexte du terrain', - 'uk-ua': 'Поле фону', - 'de-ch': 'Feldhintergrund', - 'pt-br': 'Contexto de campo', - }, - disabledFieldBackground: { - 'en-us': 'Disabled field background', - 'ru-ru': 'Отключенный фон поля', - 'es-es': 'Fondo de campo deshabilitado', - 'fr-fr': 'Fond de champ désactivé', - 'uk-ua': 'Вимкнений фон поля', - 'de-ch': 'Deaktivierter Feldhintergrund', - 'pt-br': 'Fundo de campo desativado', - }, - invalidFieldBackground: { - 'en-us': 'Invalid field background', - 'ru-ru': 'Неверный фон поля', - 'es-es': 'Fondo de campo no válido', - 'fr-fr': 'Fond de champ invalide', - 'uk-ua': 'Недійсний фон поля', - 'de-ch': 'Ungültiger Feldhintergrund', - 'pt-br': 'Fundo de campo inválido', - }, - requiredFieldBackground: { - 'en-us': 'Required field background', - 'ru-ru': 'Обязательное поле фон', - 'es-es': 'Fondo del campo obligatorio', - 'fr-fr': 'Contexte du champ obligatoire', - 'uk-ua': "Обов'язковий фон поля", - 'de-ch': 'Feldhintergrund erforderlich', - 'pt-br': 'Histórico de campo obrigatório', - }, - darkFieldBackground: { - 'en-us': 'Field background (dark theme)', - 'ru-ru': 'Фон поля (тёмная тема)', - 'es-es': 'Fondo de campo (tema oscuro)', - 'fr-fr': 'Fond de champ (thème sombre)', - 'uk-ua': 'Фон поля (темна тема)', - 'de-ch': 'Feldhintergrund (Dunkles Thema)', - 'pt-br': 'Fundo de campo (tema escuro)', - }, - darkDisabledFieldBackground: { - 'en-us': 'Disabled field background (dark theme)', - 'ru-ru': 'Отключенный фон поля (тёмная тема)', - 'es-es': 'Fondo de campo deshabilitado (tema oscuro)', - 'fr-fr': 'Fond de champ désactivé (thème sombre)', - 'uk-ua': 'Вимкнений фон поля (темна тема)', - 'de-ch': 'Deaktivierter Feldhintergrund (Dunkles Thema)', - 'pt-br': 'Fundo de campo desativado (tema escuro)', - }, - darkInvalidFieldBackground: { - 'en-us': 'Invalid field background (dark theme)', - 'ru-ru': 'Недопустимый фон поля (тёмная тема)', - 'es-es': 'Fondo de campo no válido (tema oscuro)', - 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', - 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', - 'de-ch': 'Ungültiger Feldhintergrund (Dunkles Thema)', - 'pt-br': 'Fundo de campo inválido (tema escuro)', - }, - darkRequiredFieldBackground: { - 'en-us': 'Required field background (dark theme)', - 'ru-ru': 'Обязательное поле фон (тёмная тема)', - 'es-es': 'Fondo del campo obligatorio (tema oscuro)', - 'fr-fr': 'Fond de champ obligatoire (thème sombre)', - 'uk-ua': 'Обов’язковий фон поля (темна тема)', - 'de-ch': 'Feldhintergrund erforderlich (Dunkles Thema)', - 'pt-br': 'Fundo de campo obrigatório (tema escuro)', - }, - dialogs: { - 'en-us': 'Dialogs', - 'ru-ru': 'Диалоги', - 'es-es': 'Diálogos', - 'fr-fr': 'Boîtes de dialogue', - 'uk-ua': 'Діалоги', - 'de-ch': 'Dialoge', - 'pt-br': 'Diálogos', - }, - appearance: { - 'en-us': 'Appearance', - 'ru-ru': 'Появление', - 'es-es': 'Apariencia', - 'fr-fr': 'Apparence', - 'uk-ua': 'Зовнішній вигляд', - 'de-ch': 'Aussehen', - 'pt-br': 'Aparência', - }, - buttonsLight: { - 'en-us': 'Buttons (light mode)', - 'de-ch': 'Buttons (Helles Thema)', - 'es-es': 'Botones (modo luz)', - 'fr-fr': 'Boutons (mode lumière)', - 'ru-ru': 'Кнопки (световой режим)', - 'uk-ua': 'Кнопки (світлий режим)', - 'pt-br': 'Botões (modo claro)', - }, - buttonsDark: { - 'en-us': 'Buttons (dark mode)', - 'de-ch': 'Buttons (Dunkles Thema)', - 'es-es': 'Botones (modo oscuro)', - 'fr-fr': 'Boutons (mode sombre)', - 'ru-ru': 'Кнопки (темный режим)', - 'uk-ua': 'Кнопки (темний режим)', - 'pt-br': 'Botões (modo escuro)', - }, - translucentDialog: { - 'en-us': 'Translucent dialogs', - 'ru-ru': 'Прозрачные диалоги', - 'es-es': 'Diálogos translúcidos', - 'fr-fr': 'Dialogues translucides', - 'uk-ua': 'Напівпрозорі діалоги', - 'de-ch': 'Durchscheinende Dialoge', - 'pt-br': 'Diálogos translúcidos', - }, - translucentDialogDescription: { - 'en-us': 'Whether dialogs have translucent background.', - 'ru-ru': 'Имеют ли диалоговые окна полупрозрачный фон.', - 'es-es': 'Si los diálogos tienen fondo translúcido.', - 'fr-fr': 'Si les boîtes de dialogue ont un fond translucide.', - 'uk-ua': 'Чи мають діалоги прозорий фон.', - 'de-ch': 'Dialogfenster mit durchscheinenden Hintergrund.', - 'pt-br': 'Se os diálogos têm fundo translúcido.', - }, - alwaysPrompt: { - 'en-us': 'Always prompt to choose collection', - 'ru-ru': 'Всегда предлагайте выбрать коллекцию', - 'es-es': 'Siempre dispuesto a elegir la colección', - 'fr-fr': 'Toujours invité à choisir la collection', - 'uk-ua': 'Завжди підкажуть вибрати колекцію', - 'de-ch': 'Immer zur Auswahl der Sammlung auffordern', - 'pt-br': 'Sempre pronto para escolher a coleção', - }, - treeEditor: { - 'en-us': 'Tree Editor', - 'ru-ru': 'Редактор деревьев', - 'es-es': 'Editor de árboles', - 'fr-fr': "Éditeur d'arborescence", - 'uk-ua': 'Редактор дерева', - 'de-ch': 'Baumeditor', - 'pt-br': 'Editor de Árvore', - }, - treeAccentColor: { - 'en-us': 'Tree accent color', - 'ru-ru': 'Акцентный цвет дерева', - 'es-es': 'Color de acento del árbol', - 'fr-fr': "Couleur d'accent d'arbre", - 'uk-ua': 'Колір акценту дерева', - 'de-ch': 'Baumakzentfarbe', - 'pt-br': 'Cor de destaque da árvore', - }, - synonymColor: { - 'en-us': 'Synonym color', - 'ru-ru': 'Синоним цвет', - 'es-es': 'Color sinónimo', - 'fr-fr': 'Synonyme couleur', - 'uk-ua': 'Синонім кольору', - 'de-ch': 'Synonymfarbe', - 'pt-br': 'Cor sinônimo', - }, - showNewDataSetWarning: { - 'en-us': 'Show new Data Set warning', - 'ru-ru': 'Показать предупреждение о новом наборе данных', - 'es-es': 'Mostrar nueva advertencia de conjunto de datos', - 'fr-fr': "Afficher un nouvel avertissement sur l'ensemble de données", - 'uk-ua': 'Показати попередження про новий набір даних', - 'de-ch': 'Warnung für neuen Datensatz anzeigen', - 'pt-br': 'Mostrar novo aviso de conjunto de dados', - }, - showNewDataSetWarningDescription: { - 'en-us': 'Show an informational message when creating a new Data Set.', - 'ru-ru': - 'Показывать информационное сообщение при создании нового набора данных.', - 'es-es': - 'Mostrar un mensaje informativo al crear un nuevo conjunto de datos.', - 'fr-fr': - "Afficher un message d'information lors de la création d'un nouvel ensemble de données.", - 'uk-ua': - 'Показувати інформаційне повідомлення під час створення нового набору даних.', - 'de-ch': 'Zeige eine Meldung beim erstellen eines neuen Datensatzes an.', - 'pt-br': - 'Exibir uma mensagem informativa ao criar um novo conjunto de dados.', - }, - header: { - 'en-us': 'Navigation Menu', - 'ru-ru': 'Меню навигации', - 'es-es': 'Menú de navegación', - 'fr-fr': 'le menu de navigation', - 'uk-ua': 'Навігаційне меню', - 'de-ch': 'Navigationsmenü', - 'pt-br': 'Menu de navegação', - }, - application: { - 'en-us': 'Application', - 'ru-ru': 'Приложение', - 'es-es': 'Solicitud', - 'fr-fr': 'Application', - 'uk-ua': 'застосування', - 'de-ch': 'Anwendung', - 'pt-br': 'Aplicativo', - }, - allowDismissingErrors: { - 'en-us': 'Allow dismissing error messages', - 'ru-ru': 'Разрешить отклонять сообщения об ошибках', - 'es-es': 'Permitir descartar mensajes de error', - 'fr-fr': "Autoriser le rejet des messages d'erreur", - 'uk-ua': 'Дозволити закривати повідомлення про помилки', - 'de-ch': 'Erlaube das Verwerfen von Fehlermeldungen', - 'pt-br': 'Permitir descartar mensagens de erro', - }, - updatePageTitle: { - 'en-us': 'Update page title', - 'ru-ru': 'Обновить заголовок страницы', - 'es-es': 'Actualizar el título de la página', - 'fr-fr': 'Mettre à jour le titre de la page', - 'uk-ua': 'Оновити назву сторінки', - 'de-ch': 'Seitentitel aktualisieren', - 'pt-br': 'Atualizar título da página', - }, - updatePageTitleDescription: { - 'en-us': - "Whether to update the title of the page to match dialog's header.", - 'ru-ru': - 'Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.', - 'es-es': - 'Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.', - 'fr-fr': - "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'en-tête de la boîte de dialogue.", - 'uk-ua': - 'Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.', - 'de-ch': - 'Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.', - 'pt-br': - 'Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.', - }, - updatePageTitleFormDescription: { - 'en-us': 'Whether to update the title of the page to match current record.', - 'ru-ru': - 'Следует ли обновить заголовок страницы в соответствии с текущей записью.', - 'es-es': - 'Si desea actualizar el título de la página para que coincida con el registro actual.', - 'fr-fr': - "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'enregistrement actuel.", - 'uk-ua': 'Чи оновлювати назву сторінки відповідно до поточного запису.', - 'de-ch': - 'Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.', - 'pt-br': - 'Se o título da página deve ser atualizado para corresponder ao registro atual.', - }, - queryComboBox: { - 'en-us': 'Query Combo Box', - 'ru-ru': 'Поле со списком запросов', - 'es-es': 'Cuadro combinado de consulta', - 'uk-ua': 'Поле зі списком запитів', - 'de-ch': 'Abfrage-Kombinationsfeld', - 'fr-fr': 'Zone de liste déroulante de requête', - 'pt-br': 'Caixa de combinação de consulta', - }, - searchAlgorithm: { - 'en-us': 'Search Algorithm', - 'ru-ru': 'Алгоритм поиска', - 'es-es': 'Algoritmo de búsqueda', - 'fr-fr': 'Algorithme de recherche', - 'uk-ua': 'Алгоритм пошуку', - 'de-ch': 'Suchalgorithmus', - 'pt-br': 'Algoritmo de Busca', - }, - treeSearchAlgorithm: { - 'en-us': 'Search Algorithm (for relationships with tree tables)', - 'ru-ru': 'Алгоритм поиска (для связей с древовидными таблицами)', - 'es-es': 'Algoritmo de búsqueda (para relaciones con tablas de árboles)', - 'fr-fr': - 'Algorithme de recherche (pour les relations avec les tables arborescentes)', - 'uk-ua': 'Алгоритм пошуку (для зв’язків із деревоподібними таблицями)', - 'de-ch': 'Suchalgorithmus (für Beziehungen mit Baumtabellen)', - 'pt-br': 'Algoritmo de busca (para relacionamentos com tabelas de árvore)', - }, - startsWithInsensitive: { - 'en-us': 'Starts With (case-insensitive)', - 'ru-ru': 'Начинается с (без учета регистра)', - 'es-es': 'Comienza con (sin distinguir entre mayúsculas y minúsculas)', - 'fr-fr': 'Commence par (insensible à la casse)', - 'uk-ua': 'Починається з (без урахування регістру)', - 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)', - 'pt-br': 'Começa com (sem distinção entre maiúsculas e minúsculas)', - }, - startsWithDescription: { - 'en-us': 'Search for values that begin with a given query string.', - 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', - 'es-es': - 'Busque valores que comiencen con una cadena de consulta determinada.', - 'fr-fr': - 'Rechercher des valeurs commençant par une chaîne de requête donnée.', - 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', - 'de-ch': - 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', - 'pt-br': - 'Pesquise valores que começam com uma determinada sequência de consulta.', - }, - startsWithCaseSensitive: { - 'en-us': 'Starts With (case-sensitive)', - 'ru-ru': 'Начинается с (с учетом регистра)', - 'es-es': 'Comienza con (sensible a mayúsculas y minúsculas)', - 'fr-fr': 'Commence par (sensible à la casse)', - 'uk-ua': 'Починається з (з урахуванням регістру)', - 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung beachten)', - 'pt-br': 'Começa com (diferencia maiúsculas de minúsculas)', - }, - startsWithCaseSensitiveDescription: { - 'en-us': 'Search for values that begin with a given query string.', - 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', - 'es-es': - 'Busque valores que comiencen con una cadena de consulta determinada.', - 'fr-fr': - 'Recherchez les valeurs qui commencent par une chaîne de requête donnée.', - 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', - 'de-ch': - 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', - 'pt-br': - 'Pesquise valores que começam com uma determinada sequência de consulta.', - }, - containsInsensitive: { - 'en-us': 'Contains (case-insensitive)', - 'ru-ru': 'Содержит (без учета регистра)', - 'es-es': 'Contiene (sin distinguir entre mayúsculas y minúsculas)', - 'fr-fr': 'Contient (insensible à la casse)', - 'uk-ua': 'Містить (незалежно від регістру)', - 'de-ch': 'Enthält (Groß-/Kleinschreibung wird nicht beachtet)', - 'pt-br': 'Contém (sem distinção entre maiúsculas e minúsculas)', - }, - containsCaseSensitive: { - 'en-us': 'Contains (case-sensitive)', - 'ru-ru': 'Содержит (с учетом регистра)', - 'es-es': 'Contiene (sensible a mayúsculas y minúsculas)', - 'fr-fr': 'Contient (sensible à la casse)', - 'uk-ua': 'Містить (з урахуванням регістру)', - 'de-ch': 'Enthält (Groß-/Kleinschreibung beachten)', - 'pt-br': 'Contém (diferencia maiúsculas de minúsculas)', - }, - containsDescription: { - 'en-us': - 'Search for values that contain a given query string (case-insensitive).', - 'ru-ru': - 'Поиск значений, содержащих заданную строку запроса (без учета регистра).', - 'es-es': - 'Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).', - 'uk-ua': - 'Пошук значень, які містять заданий рядок запиту (незалежно від регістру).', - 'de-ch': - 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).', - 'fr-fr': - 'Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).', - 'pt-br': - 'Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).', - }, - containsCaseSensitiveDescription: { - 'en-us': - 'Search for values that contain a given query string (case-sensitive).', - 'ru-ru': - 'Поиск значений, содержащих заданную строку запроса (с учетом регистра).', - 'es-es': - 'Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).', - 'fr-fr': - 'Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).', - 'uk-ua': - 'Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).', - 'de-ch': - 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).', - 'pt-br': - 'Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).', - }, - containsSecondDescription: { - 'en-us': - 'Can use _ to match any single character or % to match any number of characters.', - 'ru-ru': - 'Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.', - 'es-es': - 'Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.', - 'fr-fr': - "Peut utiliser _ pour correspondre à n'importe quel caractère ou % pour correspondre à n'importe quel nombre de caractères.", - 'uk-ua': - 'Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.', - 'de-ch': - 'Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.', - 'pt-br': - 'Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.', - }, - highlightMatch: { - 'en-us': 'Highlight matched substring', - 'ru-ru': 'Выделить совпавшую подстроку', - 'es-es': 'Resaltar la subcadena coincidente', - 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', - 'uk-ua': 'Виділіть збіг підрядка', - 'de-ch': 'Markieren Sie übereinstimmende Teilzeichenfolgen', - 'pt-br': 'Destacar substring correspondente', - }, - languageDescription: { - 'en-us': 'Determines field captions, usage notes and table captions.', - 'ru-ru': - 'Определяет заголовки полей, примечания по использованию и заголовки таблиц.', - 'es-es': 'Determina títulos de campos, notas de uso y títulos de tablas.', - 'fr-fr': - "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux.", - 'uk-ua': - 'Визначає підписи полів, примітки щодо використання та підписи таблиць.', - 'de-ch': - 'Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.', - 'pt-br': 'Determina legendas de campo, notas de uso e legendas de tabela.', - }, - showDialogIcon: { - 'en-us': 'Show icon in the header', - 'ru-ru': 'Показывать значок в заголовке', - 'es-es': 'Mostrar icono en el encabezado', - 'fr-fr': "Afficher l'icône dans l'en-tête", - 'uk-ua': 'Показати значок у заголовку', - 'de-ch': 'Symbol in der Kopfzeile anzeigen', - 'pt-br': 'Mostrar ícone no cabeçalho', - }, - scaleInterface: { - 'en-us': 'Scale Interface', - 'ru-ru': 'Интерфейс масштабирования', - 'es-es': 'Interfaz de escala', - 'fr-fr': 'Interface de balance', - 'uk-ua': 'Інтерфейс масштабу', - 'de-ch': 'Waagenschnittstelle', - 'pt-br': 'Interface de escala', - }, - scaleInterfaceDescription: { - 'en-us': 'Scale interface to match font size.', - 'ru-ru': 'Масштабируйте интерфейс в соответствии с размером шрифта.', - 'es-es': 'Escala la interfaz para que coincida con el tamaño de la fuente.', - 'fr-fr': "Adapter l'interface à la taille de la police.", - 'uk-ua': 'Масштабуйте інтерфейс відповідно до розміру шрифту.', - 'de-ch': - 'Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.', - 'pt-br': 'Dimensione a interface para corresponder ao tamanho da fonte.', - }, - displayAuthor: { - 'en-us': 'Show author in the tree', - 'ru-ru': 'Показать автора в дереве', - 'es-es': 'Mostrar autor en el árbol', - 'fr-fr': "Afficher l'auteur dans l'arbre", - 'uk-ua': 'Показати автора в дереві', - 'de-ch': 'Autor im Baum anzeigen', - 'pt-br': 'Mostrar autor', - }, - welcomePage: { - 'en-us': 'Home Page', - 'ru-ru': 'Домашняя страница', - 'es-es': 'Página de inicio', - 'fr-fr': "Page d'accueil", - 'uk-ua': 'Домашня сторінка', - 'de-ch': 'Startseite', - 'pt-br': 'Página inicial', - }, - +const preferencesDictionary = { + ...preferencesGeneralDictionary, + ...preferencesContentDictionary, + ...preferencesBehaviorDictionary, } as const; -export const preferencesGeneralDict = createDictionary(preferencesGeneralStrings); - -type PreferencesText = typeof preferencesGeneralDict & - typeof preferencesContentText & - typeof preferencesBehaviorText; - -export const preferencesText = Object.assign( - preferencesGeneralDict, - preferencesContentText, - preferencesBehaviorText -) as PreferencesText; +export const preferencesText = createDictionary(preferencesDictionary); diff --git a/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts b/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts index 7de4b6cacd0..136391ca942 100644 --- a/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts +++ b/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts @@ -12,6 +12,7 @@ import fs from 'node:fs'; import path from 'node:path'; +import { pathToFileURL } from 'node:url'; import { formatConjunction } from '../../components/Atoms/Internationalization'; import { f } from '../../utils/functools'; @@ -76,13 +77,11 @@ export async function extractStrings(): Promise { return undefined; const compiledFilePath = path.join(localizationDirectory, filePath); - const filePathWithoutExtension = compiledFilePath - .split('.') - .slice(0, -1) - .join('.'); - const fileName = filePathWithoutExtension.split('/').at(-1)!; + const fileUrl = pathToFileURL(compiledFilePath).href; + const { name: fileName } = path.parse(compiledFilePath); + if (fileName.includes('.')) return undefined; - const dictionaryFile = await import(filePathWithoutExtension); + const dictionaryFile = await import(fileUrl); const dictionaries = Object.keys(dictionaryFile ?? {}).filter( (dictionaryName) => dictionaryName.endsWith('Text') @@ -168,9 +167,15 @@ export async function scanUsages( { categoryName, strings: Object.fromEntries( - Object.entries(strings).map(([key, strings]) => { - Object.keys(strings) - .filter((key) => !f.has(expectedKeys, key)) + Object.keys(strings).map((key) => { + const rawStrings = + (Reflect.getOwnPropertyDescriptor(strings, key)?.value ?? + (strings as LanguageDictionary)[ + key as keyof LanguageDictionary + ]) as LocalizationEntry; + + Object.keys(rawStrings) + .filter((language) => !f.has(expectedKeys, language)) .forEach((language) => error( [ @@ -189,7 +194,7 @@ export async function scanUsages( ); // Search for blacklisted characters - Object.entries(strings).forEach(([language, string]) => { + Object.entries(rawStrings).forEach(([language, string]) => { if (f.includes(localizationMetaKeys, language)) return; characterBlacklist[language] @@ -211,9 +216,9 @@ export async function scanUsages( key, { strings: { - ...strings, + ...rawStrings, comment: f.maybe( - localized(strings.comment), + localized(rawStrings.comment), whitespaceSensitive ), }, From a22c3cd209aa9da6017d8e6e9eb34e60b1ff3e41 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 12:30:25 -0500 Subject: [PATCH 064/115] fix: links to docs --- .../frontend/js_src/lib/components/Preferences/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index b6973374ae4..02a26d1d4c7 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -72,13 +72,13 @@ const SUBCATEGORY_DOCS_MAP: Record< > = { treeManagement: { synonymized: { - href: 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987/4', + href: 'https://discourse.specifysoftware.org/t/enable-creating-children-for-synonymized-nodes/987', label: headerText.documentation(), }, }, statistics: { appearance: { - href: 'https://discourse.specifysoftware.org/t/specify-7-statistics/1715', + href: 'https://discourse.specifysoftware.org/t/statistics-page/1135', label: headerText.documentation(), }, }, From 67c9b7832382c552546d96d05cfc4061ba5dd834 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 17 Oct 2025 18:17:42 +0000 Subject: [PATCH 065/115] Lint code with ESLint and Prettier Triggered by b1b03396ac63b5e308ecd46143c8c30267665cc5 on branch refs/heads/issue-7440 --- .../lib/localization/preferences.general.ts | 3273 ++++++++--------- .../js_src/lib/localization/preferences.ts | 2 +- .../lib/localization/utils/scanUsages.ts | 8 +- 3 files changed, 1640 insertions(+), 1643 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts index 30d8adf9225..f17d027dffd 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts @@ -7,2086 +7,2085 @@ import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const preferencesGeneralDictionary = { preferences: { - "en-us": "Preferences", - "ru-ru": "Настройки", - "es-es": "Preferencias", - "fr-fr": "Préférences", - "uk-ua": "Уподобання", - "de-ch": "Einstellungen", - "pt-br": "Preferências", + 'en-us': 'Preferences', + 'ru-ru': 'Настройки', + 'es-es': 'Preferencias', + 'fr-fr': 'Préférences', + 'uk-ua': 'Уподобання', + 'de-ch': 'Einstellungen', + 'pt-br': 'Preferências', }, customization: { - "en-us": "Customization", - "ru-ru": "Настройка", - "es-es": "Personalización", - "fr-fr": "Personnalisation", - "uk-ua": "Спеціальнізація", - "de-ch": "Anpassung", - "pt-br": "Personalização", + 'en-us': 'Customization', + 'ru-ru': 'Настройка', + 'es-es': 'Personalización', + 'fr-fr': 'Personnalisation', + 'uk-ua': 'Спеціальнізація', + 'de-ch': 'Anpassung', + 'pt-br': 'Personalização', }, userPreferences: { - "en-us": "User Preferences", - "ru-ru": "Настройки пользователя", - "es-es": "Preferencias del usuario", - "fr-fr": "Préférences de l'utilisateur", - "uk-ua": "Налаштування користувача", - "de-ch": "Benutzereinstellungen", - "pt-br": "Preferências do usuário", + 'en-us': 'User Preferences', + 'ru-ru': 'Настройки пользователя', + 'es-es': 'Preferencias del usuario', + 'fr-fr': "Préférences de l'utilisateur", + 'uk-ua': 'Налаштування користувача', + 'de-ch': 'Benutzereinstellungen', + 'pt-br': 'Preferências do usuário', }, defaultUserPreferences: { - "en-us": "Default User Preferences", - "ru-ru": "Настройки пользователя по умолчанию", - "es-es": "Preferencias de usuario predeterminadas", - "fr-fr": "Préférences utilisateur par défaut", - "uk-ua": "Параметри користувача за умовчанням", - "de-ch": "Standardbenutzereinstellungen", - "pt-br": "Preferências de usuário padrão", + 'en-us': 'Default User Preferences', + 'ru-ru': 'Настройки пользователя по умолчанию', + 'es-es': 'Preferencias de usuario predeterminadas', + 'fr-fr': 'Préférences utilisateur par défaut', + 'uk-ua': 'Параметри користувача за умовчанням', + 'de-ch': 'Standardbenutzereinstellungen', + 'pt-br': 'Preferências de usuário padrão', }, general: { - "en-us": "General", - "ru-ru": "Общий", - "es-es": "General", - "fr-fr": "Image personnalisée", - "uk-ua": "Спеціальне зображення", - "de-ch": "Allgemein", - "pt-br": "Em geral", + 'en-us': 'General', + 'ru-ru': 'Общий', + 'es-es': 'General', + 'fr-fr': 'Image personnalisée', + 'uk-ua': 'Спеціальне зображення', + 'de-ch': 'Allgemein', + 'pt-br': 'Em geral', }, ui: { - "en-us": "User Interface", - "ru-ru": "Пользовательский интерфейс", - "es-es": "Interfaz de usuario", - "fr-fr": "Interface utilisateur", - "uk-ua": "Інтерфейс користувача", - "de-ch": "Benutzeroberfläche", - "pt-br": "Interface do usuário", + 'en-us': 'User Interface', + 'ru-ru': 'Пользовательский интерфейс', + 'es-es': 'Interfaz de usuario', + 'fr-fr': 'Interface utilisateur', + 'uk-ua': 'Інтерфейс користувача', + 'de-ch': 'Benutzeroberfläche', + 'pt-br': 'Interface do usuário', }, theme: { - "en-us": "Theme", - "ru-ru": "Тема", - "es-es": "Tema", - "fr-fr": "Thème", - "uk-ua": "Тема", - "de-ch": "Thema", - "pt-br": "Tema", + 'en-us': 'Theme', + 'ru-ru': 'Тема', + 'es-es': 'Tema', + 'fr-fr': 'Thème', + 'uk-ua': 'Тема', + 'de-ch': 'Thema', + 'pt-br': 'Tema', }, useSystemSetting: { - "en-us": "Use system setting", - "ru-ru": "Использовать системные настройки", - "es-es": "Utilizar la configuración del sistema", - "fr-fr": "Utiliser les paramètres du système", - "uk-ua": "Використовуйте налаштування системи", - "de-ch": "Systemeinstellung verwenden", - "pt-br": "Usar configuração do sistema", + 'en-us': 'Use system setting', + 'ru-ru': 'Использовать системные настройки', + 'es-es': 'Utilizar la configuración del sistema', + 'fr-fr': 'Utiliser les paramètres du système', + 'uk-ua': 'Використовуйте налаштування системи', + 'de-ch': 'Systemeinstellung verwenden', + 'pt-br': 'Usar configuração do sistema', }, inheritOsSettings: { - "en-us": "Copies value from your Operating System settings", - "ru-ru": "Копирует значение из настроек вашей операционной системы", - "es-es": "Copia el valor de la configuración de su sistema operativo", - "fr-fr": "Copie la valeur des paramètres de votre système d'exploitation", - "uk-ua": "Копіює значення з налаштувань вашої операційної системи", - "de-ch": "Übernimmt den Wert aus Ihren Betriebssystemeinstellungen", - "pt-br": "Copia o valor das configurações do seu sistema operacional", + 'en-us': 'Copies value from your Operating System settings', + 'ru-ru': 'Копирует значение из настроек вашей операционной системы', + 'es-es': 'Copia el valor de la configuración de su sistema operativo', + 'fr-fr': "Copie la valeur des paramètres de votre système d'exploitation", + 'uk-ua': 'Копіює значення з налаштувань вашої операційної системи', + 'de-ch': 'Übernimmt den Wert aus Ihren Betriebssystemeinstellungen', + 'pt-br': 'Copia o valor das configurações do seu sistema operacional', }, light: { - comment: "Light mode", - "en-us": "Light", - "ru-ru": "Свет", - "es-es": "Luz", - "fr-fr": "Lumière", - "uk-ua": "світло", - "de-ch": "Hell", - "pt-br": "Luz", + comment: 'Light mode', + 'en-us': 'Light', + 'ru-ru': 'Свет', + 'es-es': 'Luz', + 'fr-fr': 'Lumière', + 'uk-ua': 'світло', + 'de-ch': 'Hell', + 'pt-br': 'Luz', }, dark: { - comment: "Dark mode", - "en-us": "Dark", - "ru-ru": "Темный", - "es-es": "Oscuro", - "fr-fr": "Sombre", - "uk-ua": "Темний", - "de-ch": "Dunkel", - "pt-br": "Escuro", + comment: 'Dark mode', + 'en-us': 'Dark', + 'ru-ru': 'Темный', + 'es-es': 'Oscuro', + 'fr-fr': 'Sombre', + 'uk-ua': 'Темний', + 'de-ch': 'Dunkel', + 'pt-br': 'Escuro', }, reduceMotion: { - "en-us": "Reduce motion", - "ru-ru": "Уменьшите движение", - "es-es": "Reducir el movimiento", - "fr-fr": "Réduire les mouvements", - "uk-ua": "Зменшити рух", - "de-ch": "Bewegung reduzieren", - "pt-br": "Reduzir movimento", + 'en-us': 'Reduce motion', + 'ru-ru': 'Уменьшите движение', + 'es-es': 'Reducir el movimiento', + 'fr-fr': 'Réduire les mouvements', + 'uk-ua': 'Зменшити рух', + 'de-ch': 'Bewegung reduzieren', + 'pt-br': 'Reduzir movimento', }, reduceMotionDescription: { - "en-us": "Disable non-essential animations and transitions.", - "ru-ru": "Отключите ненужные анимации и переходы.", - "es-es": "Desactivar animaciones y transiciones no esenciales.", - "fr-fr": "Désactivez les animations et les transitions non essentielles.", - "uk-ua": "Вимкніть необов'язкову анімацію та переходи.", - "de-ch": "Nicht erforderliche Animationen und Übergänge deaktivieren.", - "pt-br": "Desabilite animações e transições não essenciais.", + 'en-us': 'Disable non-essential animations and transitions.', + 'ru-ru': 'Отключите ненужные анимации и переходы.', + 'es-es': 'Desactivar animaciones y transiciones no esenciales.', + 'fr-fr': 'Désactivez les animations et les transitions non essentielles.', + 'uk-ua': "Вимкніть необов'язкову анімацію та переходи.", + 'de-ch': 'Nicht erforderliche Animationen und Übergänge deaktivieren.', + 'pt-br': 'Desabilite animações e transições não essenciais.', }, reduceTransparency: { - "en-us": "Reduce transparency", - "ru-ru": "Уменьшить прозрачность", - "es-es": "Reducir la transparencia", - "fr-fr": "Réduire la transparence", - "uk-ua": "Зменшити прозорість", - "de-ch": "Transparenz reduzieren", - "pt-br": "Reduzir a transparência", + 'en-us': 'Reduce transparency', + 'ru-ru': 'Уменьшить прозрачность', + 'es-es': 'Reducir la transparencia', + 'fr-fr': 'Réduire la transparence', + 'uk-ua': 'Зменшити прозорість', + 'de-ch': 'Transparenz reduzieren', + 'pt-br': 'Reduzir a transparência', }, reduceTransparencyDescription: { - "en-us": - "Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).", - "ru-ru": - "Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).", - "es-es": - "Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).", - "fr-fr": + 'en-us': + 'Whether to disable translucent backgrounds for user interface components whenever possible (e.g. table headers in tree view).', + 'ru-ru': + 'Следует ли отключать полупрозрачный фон для компонентов пользовательского интерфейса, когда это возможно (например, заголовки таблиц в древовидной структуре).', + 'es-es': + 'Si se deben deshabilitar los fondos translúcidos para los componentes de la interfaz de usuario siempre que sea posible (por ejemplo, encabezados de tabla en la vista de árbol).', + 'fr-fr': "S'il faut désactiver les arrière-plans translucides pour les composants de l'interface utilisateur chaque fois que possible (par exemple, les en-têtes de tableau dans l'arborescence).", - "uk-ua": - "Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).", - "de-ch": - "Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).", - "pt-br": - "Se deve ou não desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).", + 'uk-ua': + 'Чи вимикати напівпрозорий фон для компонентів інтерфейсу користувача, коли це можливо (наприклад, заголовки таблиць у перегляді дерева).', + 'de-ch': + 'Durchsichtige Hintergründe für Benutzeroberflächenkomponenten wann immer möglich deaktivieren (z. B. Tabellenüberschriften in der Baumansicht).', + 'pt-br': + 'Se deve ou não desabilitar fundos translúcidos para componentes da interface do usuário sempre que possível (por exemplo, cabeçalhos de tabela na visualização em árvore).', }, contrast: { - "en-us": "Contrast", - "ru-ru": "Контраст", - "es-es": "Contraste", - "fr-fr": "Contraste", - "uk-ua": "Контраст", - "de-ch": "Kontrast", - "pt-br": "Contraste", + 'en-us': 'Contrast', + 'ru-ru': 'Контраст', + 'es-es': 'Contraste', + 'fr-fr': 'Contraste', + 'uk-ua': 'Контраст', + 'de-ch': 'Kontrast', + 'pt-br': 'Contraste', }, increase: { - "en-us": "Increase", - "ru-ru": "Увеличивать", - "es-es": "Aumentar", - "fr-fr": "Augmenter", - "uk-ua": "Збільшити", - "de-ch": "Erhöhen", - "pt-br": "Aumentar", + 'en-us': 'Increase', + 'ru-ru': 'Увеличивать', + 'es-es': 'Aumentar', + 'fr-fr': 'Augmenter', + 'uk-ua': 'Збільшити', + 'de-ch': 'Erhöhen', + 'pt-br': 'Aumentar', }, reduce: { - "en-us": "Reduce", - "ru-ru": "Уменьшать", - "es-es": "Reducir", - "fr-fr": "Réduire", - "uk-ua": "Зменшити", - "de-ch": "Verringern", - "pt-br": "Reduzir", + 'en-us': 'Reduce', + 'ru-ru': 'Уменьшать', + 'es-es': 'Reducir', + 'fr-fr': 'Réduire', + 'uk-ua': 'Зменшити', + 'de-ch': 'Verringern', + 'pt-br': 'Reduzir', }, noPreference: { - "en-us": "No preference", - "ru-ru": "Нет предпочтений", - "es-es": "Sin preferencia", - "fr-fr": "Pas de préférence", - "uk-ua": "Без переваг", - "de-ch": "Keine Präferenz", - "pt-br": "Sem preferência", + 'en-us': 'No preference', + 'ru-ru': 'Нет предпочтений', + 'es-es': 'Sin preferencia', + 'fr-fr': 'Pas de préférence', + 'uk-ua': 'Без переваг', + 'de-ch': 'Keine Präferenz', + 'pt-br': 'Sem preferência', }, fontSize: { - "en-us": "Font size", - "ru-ru": "Размер шрифта", - "es-es": "Tamaño de fuente", - "fr-fr": "Taille de police", - "uk-ua": "Розмір шрифту", - "de-ch": "Schriftgrösse", - "pt-br": "Tamanho da fonte", + 'en-us': 'Font size', + 'ru-ru': 'Размер шрифта', + 'es-es': 'Tamaño de fuente', + 'fr-fr': 'Taille de police', + 'uk-ua': 'Розмір шрифту', + 'de-ch': 'Schriftgrösse', + 'pt-br': 'Tamanho da fonte', }, fontFamily: { - "en-us": "Font family", - "ru-ru": "Семейство шрифтов", - "es-es": "Familia de fuentes", - "fr-fr": "Famille de polices", - "uk-ua": "Сімейство шрифтів", - "de-ch": "Schrift-Familie", - "pt-br": "Família de fontes", + 'en-us': 'Font family', + 'ru-ru': 'Семейство шрифтов', + 'es-es': 'Familia de fuentes', + 'fr-fr': 'Famille de polices', + 'uk-ua': 'Сімейство шрифтів', + 'de-ch': 'Schrift-Familie', + 'pt-br': 'Família de fontes', }, fontFamilyDescription: { - "en-us": - "You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.", - "ru-ru": - "Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.", - "es-es": - "Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.", - "fr-fr": + 'en-us': + 'You can specify any font that is on your computer, even if it is not in the list. A comma-separated list of fonts is also supported, where each subsequent font will be used if the previous one is not available.', + 'ru-ru': + 'Вы можете указать любой шрифт, установленный на вашем компьютере, даже если его нет в списке. Также поддерживается список шрифтов, разделённый запятыми, где каждый последующий шрифт будет использоваться, если предыдущий недоступен.', + 'es-es': + 'Puede especificar cualquier fuente de su ordenador, incluso si no está en la lista. También se admite una lista de fuentes separadas por comas, donde se usará cada fuente subsiguiente si la anterior no está disponible.', + 'fr-fr': "Vous pouvez spécifier n'importe quelle police présente sur votre ordinateur, même si elle ne figure pas dans la liste. Une liste de polices séparées par des virgules est également prise en charge ; chaque police suivante sera utilisée si la précédente n'est pas disponible.", - "uk-ua": + 'uk-ua': "Ви можете вказати будь-який шрифт, який є на вашому комп'ютері, навіть якщо його немає в списку. Також підтримується розділений комами список шрифтів, у якому використовуватиметься другий шрифт, якщо перший недоступний тощо.", - "de-ch": - "Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.", - "pt-br": - "Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.", + 'de-ch': + 'Sie können jede Schriftart angeben, die sich auf Ihrem Computer befindet, auch wenn diese nicht in der Liste enthalten ist. Eine durch Kommas getrennte Liste von Schriftarten wird ebenfalls unterstützt, wobei die zweite Schriftart verwendet wird, wenn die erste nicht verfügbar ist usw.', + 'pt-br': + 'Você pode especificar qualquer fonte que esteja no seu computador, mesmo que ela não esteja na lista. Uma lista de fontes separadas por vírgulas também é suportada, onde cada fonte subsequente será usada se a anterior não estiver disponível.', }, defaultFont: { - "en-us": "(default font)", - "ru-ru": "(шрифт по умолчанию)", - "es-es": "(fuente predeterminada)", - "fr-fr": "(police par défaut)", - "uk-ua": "(типовий шрифт)", - "de-ch": "(Standardschriftart)", - "pt-br": "(fonte padrão)", + 'en-us': '(default font)', + 'ru-ru': '(шрифт по умолчанию)', + 'es-es': '(fuente predeterminada)', + 'fr-fr': '(police par défaut)', + 'uk-ua': '(типовий шрифт)', + 'de-ch': '(Standardschriftart)', + 'pt-br': '(fonte padrão)', }, maxFormWidth: { - "en-us": "Max form width", - "ru-ru": "Максимальная ширина формы", - "es-es": "Ancho máximo del formulario", - "fr-fr": "Largeur maximale du formulaire", - "uk-ua": "Максимальна ширина форми", - "de-ch": "Maximale Formularbreite", - "pt-br": "Largura máxima do formulário", + 'en-us': 'Max form width', + 'ru-ru': 'Максимальная ширина формы', + 'es-es': 'Ancho máximo del formulario', + 'fr-fr': 'Largeur maximale du formulaire', + 'uk-ua': 'Максимальна ширина форми', + 'de-ch': 'Maximale Formularbreite', + 'pt-br': 'Largura máxima do formulário', }, fieldBackgrounds: { - "en-us": "Field backgrounds", - "ru-ru": "Фоны полей", - "es-es": "Fondos de campo", - "fr-fr": "Milieux de terrain", - "uk-ua": "Польові фони", - "de-ch": "Feldhintergründe", - "pt-br": "Fundos de campo", + 'en-us': 'Field backgrounds', + 'ru-ru': 'Фоны полей', + 'es-es': 'Fondos de campo', + 'fr-fr': 'Milieux de terrain', + 'uk-ua': 'Польові фони', + 'de-ch': 'Feldhintergründe', + 'pt-br': 'Fundos de campo', }, fieldBackground: { - "en-us": "Field background", - "ru-ru": "Фон поля", - "es-es": "Fondo de campo", - "fr-fr": "Contexte du terrain", - "uk-ua": "Поле фону", - "de-ch": "Feldhintergrund", - "pt-br": "Contexto de campo", + 'en-us': 'Field background', + 'ru-ru': 'Фон поля', + 'es-es': 'Fondo de campo', + 'fr-fr': 'Contexte du terrain', + 'uk-ua': 'Поле фону', + 'de-ch': 'Feldhintergrund', + 'pt-br': 'Contexto de campo', }, disabledFieldBackground: { - "en-us": "Disabled field background", - "ru-ru": "Отключенный фон поля", - "es-es": "Fondo de campo deshabilitado", - "fr-fr": "Fond de champ désactivé", - "uk-ua": "Вимкнений фон поля", - "de-ch": "Deaktivierter Feldhintergrund", - "pt-br": "Fundo de campo desativado", + 'en-us': 'Disabled field background', + 'ru-ru': 'Отключенный фон поля', + 'es-es': 'Fondo de campo deshabilitado', + 'fr-fr': 'Fond de champ désactivé', + 'uk-ua': 'Вимкнений фон поля', + 'de-ch': 'Deaktivierter Feldhintergrund', + 'pt-br': 'Fundo de campo desativado', }, invalidFieldBackground: { - "en-us": "Invalid field background", - "ru-ru": "Неверный фон поля", - "es-es": "Fondo de campo no válido", - "fr-fr": "Fond de champ invalide", - "uk-ua": "Недійсний фон поля", - "de-ch": "Ungültiger Feldhintergrund", - "pt-br": "Fundo de campo inválido", + 'en-us': 'Invalid field background', + 'ru-ru': 'Неверный фон поля', + 'es-es': 'Fondo de campo no válido', + 'fr-fr': 'Fond de champ invalide', + 'uk-ua': 'Недійсний фон поля', + 'de-ch': 'Ungültiger Feldhintergrund', + 'pt-br': 'Fundo de campo inválido', }, requiredFieldBackground: { - "en-us": "Required field background", - "ru-ru": "Обязательное поле фон", - "es-es": "Antecedentes del campo obligatorio", - "fr-fr": "Contexte du champ obligatoire", - "uk-ua": "Обов'язковий фон поля", - "de-ch": "Feldhintergrund erforderlich", - "pt-br": "Histórico de campo obrigatório", + 'en-us': 'Required field background', + 'ru-ru': 'Обязательное поле фон', + 'es-es': 'Antecedentes del campo obligatorio', + 'fr-fr': 'Contexte du champ obligatoire', + 'uk-ua': "Обов'язковий фон поля", + 'de-ch': 'Feldhintergrund erforderlich', + 'pt-br': 'Histórico de campo obrigatório', }, darkFieldBackground: { - "en-us": "Field background (dark theme)", - "ru-ru": "Фон поля (тёмная тема)", - "es-es": "Fondo de campo (tema oscuro)", - "fr-fr": "Fond de champ (thème sombre)", - "uk-ua": "Фон поля (темна тема)", - "de-ch": "Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo (tema escuro)", + 'en-us': 'Field background (dark theme)', + 'ru-ru': 'Фон поля (тёмная тема)', + 'es-es': 'Fondo de campo (tema oscuro)', + 'fr-fr': 'Fond de champ (thème sombre)', + 'uk-ua': 'Фон поля (темна тема)', + 'de-ch': 'Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo (tema escuro)', }, darkDisabledFieldBackground: { - "en-us": "Disabled field background (dark theme)", - "ru-ru": "Отключенный фон поля (тёмная тема)", - "es-es": "Fondo de campo deshabilitado (tema oscuro)", - "fr-fr": "Fond de champ désactivé (thème sombre)", - "uk-ua": "Вимкнений фон поля (темна тема)", - "de-ch": "Deaktivierter Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo desativado (tema escuro)", + 'en-us': 'Disabled field background (dark theme)', + 'ru-ru': 'Отключенный фон поля (тёмная тема)', + 'es-es': 'Fondo de campo deshabilitado (tema oscuro)', + 'fr-fr': 'Fond de champ désactivé (thème sombre)', + 'uk-ua': 'Вимкнений фон поля (темна тема)', + 'de-ch': 'Deaktivierter Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo desativado (tema escuro)', }, darkInvalidFieldBackground: { - "en-us": "Invalid field background (dark theme)", - "ru-ru": "Недопустимый фон поля (тёмная тема)", - "es-es": "Fondo de campo no válido (tema oscuro)", - "fr-fr": "Largeur de colonne de grille de sous-vue flexible", - "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", - "de-ch": "Ungültiger Feldhintergrund (Dunkles Thema)", - "pt-br": "Fundo de campo inválido (tema escuro)", + 'en-us': 'Invalid field background (dark theme)', + 'ru-ru': 'Недопустимый фон поля (тёмная тема)', + 'es-es': 'Fondo de campo no válido (tema oscuro)', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Ungültiger Feldhintergrund (Dunkles Thema)', + 'pt-br': 'Fundo de campo inválido (tema escuro)', }, darkRequiredFieldBackground: { - "en-us": "Required field background (dark theme)", - "ru-ru": "Обязательное поле фон (тёмная тема)", - "es-es": "Fondo del campo obligatorio (tema oscuro)", - "fr-fr": "Fond de champ obligatoire (thème sombre)", - "uk-ua": "Обов’язковий фон поля (темна тема)", - "de-ch": "Feldhintergrund erforderlich (Dunkles Thema)", - "pt-br": "Fundo de campo obrigatório (tema escuro)", + 'en-us': 'Required field background (dark theme)', + 'ru-ru': 'Обязательное поле фон (тёмная тема)', + 'es-es': 'Fondo del campo obligatorio (tema oscuro)', + 'fr-fr': 'Fond de champ obligatoire (thème sombre)', + 'uk-ua': 'Обов’язковий фон поля (темна тема)', + 'de-ch': 'Feldhintergrund erforderlich (Dunkles Thema)', + 'pt-br': 'Fundo de campo obrigatório (tema escuro)', }, dialogs: { - "en-us": "Dialogs", - "ru-ru": "Диалоги", - "es-es": "Diálogos", - "fr-fr": "Boîtes de dialogue", - "uk-ua": "Діалоги", - "de-ch": "Dialoge", - "pt-br": "Diálogos", + 'en-us': 'Dialogs', + 'ru-ru': 'Диалоги', + 'es-es': 'Diálogos', + 'fr-fr': 'Boîtes de dialogue', + 'uk-ua': 'Діалоги', + 'de-ch': 'Dialoge', + 'pt-br': 'Diálogos', }, appearance: { - "en-us": "Appearance", - "ru-ru": "Появление", - "es-es": "Apariencia", - "fr-fr": "Apparence", - "uk-ua": "Зовнішній вигляд", - "de-ch": "Aussehen", - "pt-br": "Aparência", + 'en-us': 'Appearance', + 'ru-ru': 'Появление', + 'es-es': 'Apariencia', + 'fr-fr': 'Apparence', + 'uk-ua': 'Зовнішній вигляд', + 'de-ch': 'Aussehen', + 'pt-br': 'Aparência', }, buttonsLight: { - "en-us": "Buttons (light mode)", - "de-ch": "Buttons (Helles Thema)", - "es-es": "Botones (modo luz)", - "fr-fr": "Boutons (mode lumière)", - "ru-ru": "Кнопки (световой режим)", - "uk-ua": "Кнопки (світлий режим)", - "pt-br": "Botões (modo claro)", + 'en-us': 'Buttons (light mode)', + 'de-ch': 'Buttons (Helles Thema)', + 'es-es': 'Botones (modo luz)', + 'fr-fr': 'Boutons (mode lumière)', + 'ru-ru': 'Кнопки (световой режим)', + 'uk-ua': 'Кнопки (світлий режим)', + 'pt-br': 'Botões (modo claro)', }, buttonsDark: { - "en-us": "Buttons (dark mode)", - "de-ch": "Buttons (Dunkles Thema)", - "es-es": "Botones (modo oscuro)", - "fr-fr": "Boutons (mode sombre)", - "ru-ru": "Кнопки (темный режим)", - "uk-ua": "Кнопки (темний режим)", - "pt-br": "Botões (modo escuro)", + 'en-us': 'Buttons (dark mode)', + 'de-ch': 'Buttons (Dunkles Thema)', + 'es-es': 'Botones (modo oscuro)', + 'fr-fr': 'Boutons (mode sombre)', + 'ru-ru': 'Кнопки (темный режим)', + 'uk-ua': 'Кнопки (темний режим)', + 'pt-br': 'Botões (modo escuro)', }, translucentDialog: { - "en-us": "Translucent dialogs", - "ru-ru": "Прозрачные диалоги", - "es-es": "Diálogos translúcidos", - "fr-fr": "Dialogues translucides", - "uk-ua": "Напівпрозорі діалоги", - "de-ch": "Durchscheinende Dialoge", - "pt-br": "Diálogos translúcidos", + 'en-us': 'Translucent dialogs', + 'ru-ru': 'Прозрачные диалоги', + 'es-es': 'Diálogos translúcidos', + 'fr-fr': 'Dialogues translucides', + 'uk-ua': 'Напівпрозорі діалоги', + 'de-ch': 'Durchscheinende Dialoge', + 'pt-br': 'Diálogos translúcidos', }, translucentDialogDescription: { - "en-us": "Whether dialogs have translucent background.", - "ru-ru": "Имеют ли диалоговые окна полупрозрачный фон.", - "es-es": "Si los diálogos tienen fondo translúcido.", - "fr-fr": "Si les boîtes de dialogue ont un fond translucide.", - "uk-ua": "Чи мають діалоги прозорий фон.", - "de-ch": "Dialogfenster mit durchscheinenden Hintergrund.", - "pt-br": "Se os diálogos têm fundo translúcido.", + 'en-us': 'Whether dialogs have translucent background.', + 'ru-ru': 'Имеют ли диалоговые окна полупрозрачный фон.', + 'es-es': 'Si los diálogos tienen fondo translúcido.', + 'fr-fr': 'Si les boîtes de dialogue ont un fond translucide.', + 'uk-ua': 'Чи мають діалоги прозорий фон.', + 'de-ch': 'Dialogfenster mit durchscheinenden Hintergrund.', + 'pt-br': 'Se os diálogos têm fundo translúcido.', }, alwaysPrompt: { - "en-us": "Always prompt to choose collection", - "ru-ru": "Всегда предлагайте выбрать коллекцию", - "es-es": "Siempre dispuesto a elegir la colección", - "fr-fr": "Toujours invité à choisir la collection", - "uk-ua": "Завжди підкажуть вибрати колекцію", - "de-ch": "Immer zur Auswahl der Sammlung auffordern", - "pt-br": "Sempre pronto para escolher a coleção", + 'en-us': 'Always prompt to choose collection', + 'ru-ru': 'Всегда предлагайте выбрать коллекцию', + 'es-es': 'Siempre dispuesto a elegir la colección', + 'fr-fr': 'Toujours invité à choisir la collection', + 'uk-ua': 'Завжди підкажуть вибрати колекцію', + 'de-ch': 'Immer zur Auswahl der Sammlung auffordern', + 'pt-br': 'Sempre pronto para escolher a coleção', }, treeEditor: { - "en-us": "Tree Editor", - "ru-ru": "Редактор деревьев", - "es-es": "Editor de árboles", - "fr-fr": "Éditeur d'arborescence", - "uk-ua": "Редактор дерева", - "de-ch": "Baumeditor", - "pt-br": "Editor de Árvore", + 'en-us': 'Tree Editor', + 'ru-ru': 'Редактор деревьев', + 'es-es': 'Editor de árboles', + 'fr-fr': "Éditeur d'arborescence", + 'uk-ua': 'Редактор дерева', + 'de-ch': 'Baumeditor', + 'pt-br': 'Editor de Árvore', }, treeAccentColor: { - "en-us": "Tree accent color", - "ru-ru": "Акцентный цвет дерева", - "es-es": "Color de acento del árbol", - "fr-fr": "Couleur d'accent d'arbre", - "uk-ua": "Колір акценту дерева", - "de-ch": "Baumakzentfarbe", - "pt-br": "Cor de destaque da árvore", + 'en-us': 'Tree accent color', + 'ru-ru': 'Акцентный цвет дерева', + 'es-es': 'Color de acento del árbol', + 'fr-fr': "Couleur d'accent d'arbre", + 'uk-ua': 'Колір акценту дерева', + 'de-ch': 'Baumakzentfarbe', + 'pt-br': 'Cor de destaque da árvore', }, synonymColor: { - "en-us": "Synonym color", - "ru-ru": "Синоним цвет", - "es-es": "Color sinónimo", - "fr-fr": "Synonyme couleur", - "uk-ua": "Синонім кольору", - "de-ch": "Synonymfarbe", - "pt-br": "Cor sinônimo", + 'en-us': 'Synonym color', + 'ru-ru': 'Синоним цвет', + 'es-es': 'Color sinónimo', + 'fr-fr': 'Synonyme couleur', + 'uk-ua': 'Синонім кольору', + 'de-ch': 'Synonymfarbe', + 'pt-br': 'Cor sinônimo', }, showNewDataSetWarning: { - "en-us": "Show new Data Set warning", - "ru-ru": "Показать предупреждение о новом наборе данных", - "es-es": "Mostrar nueva advertencia de conjunto de datos", - "fr-fr": "Afficher un nouvel avertissement sur l'ensemble de données", - "uk-ua": "Показати попередження про новий набір даних", - "de-ch": "Warnung für neuen Datensatz anzeigen", - "pt-br": "Mostrar novo aviso de conjunto de dados", + 'en-us': 'Show new Data Set warning', + 'ru-ru': 'Показать предупреждение о новом наборе данных', + 'es-es': 'Mostrar nueva advertencia de conjunto de datos', + 'fr-fr': "Afficher un nouvel avertissement sur l'ensemble de données", + 'uk-ua': 'Показати попередження про новий набір даних', + 'de-ch': 'Warnung für neuen Datensatz anzeigen', + 'pt-br': 'Mostrar novo aviso de conjunto de dados', }, showNewDataSetWarningDescription: { - "en-us": "Show an informational message when creating a new Data Set.", - "ru-ru": - "Показывать информационное сообщение при создании нового набора данных.", - "es-es": - "Mostrar un mensaje informativo al crear un nuevo conjunto de datos.", - "fr-fr": + 'en-us': 'Show an informational message when creating a new Data Set.', + 'ru-ru': + 'Показывать информационное сообщение при создании нового набора данных.', + 'es-es': + 'Mostrar un mensaje informativo al crear un nuevo conjunto de datos.', + 'fr-fr': "Afficher un message d'information lors de la création d'un nouvel ensemble de données.", - "uk-ua": - "Показувати інформаційне повідомлення під час створення нового набору даних.", - "de-ch": "Zeige eine Meldung beim erstellen eines neuen Datensatzes an.", - "pt-br": - "Exibir uma mensagem informativa ao criar um novo conjunto de dados.", + 'uk-ua': + 'Показувати інформаційне повідомлення під час створення нового набору даних.', + 'de-ch': 'Zeige eine Meldung beim erstellen eines neuen Datensatzes an.', + 'pt-br': + 'Exibir uma mensagem informativa ao criar um novo conjunto de dados.', }, header: { - "en-us": "Navigation Menu", - "ru-ru": "Меню навигации", - "es-es": "Menú de navegación", - "fr-fr": "le menu de navigation", - "uk-ua": "Навігаційне меню", - "de-ch": "Navigationsmenü", - "pt-br": "Menu de navegação", + 'en-us': 'Navigation Menu', + 'ru-ru': 'Меню навигации', + 'es-es': 'Menú de navegación', + 'fr-fr': 'le menu de navigation', + 'uk-ua': 'Навігаційне меню', + 'de-ch': 'Navigationsmenü', + 'pt-br': 'Menu de navegação', }, application: { - "en-us": "Application", - "ru-ru": "Приложение", - "es-es": "Solicitud", - "fr-fr": "Application", - "uk-ua": "застосування", - "de-ch": "Anwendung", - "pt-br": "Aplicativo", + 'en-us': 'Application', + 'ru-ru': 'Приложение', + 'es-es': 'Solicitud', + 'fr-fr': 'Application', + 'uk-ua': 'застосування', + 'de-ch': 'Anwendung', + 'pt-br': 'Aplicativo', }, allowDismissingErrors: { - "en-us": "Allow dismissing error messages", - "ru-ru": "Разрешить отклонять сообщения об ошибках", - "es-es": "Permitir descartar mensajes de error", - "fr-fr": "Autoriser le rejet des messages d'erreur", - "uk-ua": "Дозволити закривати повідомлення про помилки", - "de-ch": "Erlaube das Verwerfen von Fehlermeldungen", - "pt-br": "Permitir descartar mensagens de erro", + 'en-us': 'Allow dismissing error messages', + 'ru-ru': 'Разрешить отклонять сообщения об ошибках', + 'es-es': 'Permitir descartar mensajes de error', + 'fr-fr': "Autoriser le rejet des messages d'erreur", + 'uk-ua': 'Дозволити закривати повідомлення про помилки', + 'de-ch': 'Erlaube das Verwerfen von Fehlermeldungen', + 'pt-br': 'Permitir descartar mensagens de erro', }, updatePageTitle: { - "en-us": "Update page title", - "ru-ru": "Обновить заголовок страницы", - "es-es": "Actualizar el título de la página", - "fr-fr": "Mettre à jour le titre de la page", - "uk-ua": "Оновити назву сторінки", - "de-ch": "Seitentitel aktualisieren", - "pt-br": "Atualizar título da página", + 'en-us': 'Update page title', + 'ru-ru': 'Обновить заголовок страницы', + 'es-es': 'Actualizar el título de la página', + 'fr-fr': 'Mettre à jour le titre de la page', + 'uk-ua': 'Оновити назву сторінки', + 'de-ch': 'Seitentitel aktualisieren', + 'pt-br': 'Atualizar título da página', }, updatePageTitleDescription: { - "en-us": + 'en-us': "Whether to update the title of the page to match dialog's header.", - "ru-ru": - "Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.", - "es-es": - "Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.", - "fr-fr": + 'ru-ru': + 'Обновлять ли заголовок страницы в соответствии с заголовком диалогового окна.', + 'es-es': + 'Si se debe actualizar el título de la página para que coincida con el encabezado del cuadro de diálogo.', + 'fr-fr': "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'en-tête de la boîte de dialogue.", - "uk-ua": - "Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.", - "de-ch": - "Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.", - "pt-br": - "Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.", + 'uk-ua': + 'Чи оновлювати назву сторінки відповідно до заголовка діалогового вікна.', + 'de-ch': + 'Titel der Seite so aktualisieren, dass er mit der Kopfzeile des Dialogs übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao cabeçalho da caixa de diálogo.', }, updatePageTitleFormDescription: { - "en-us": "Whether to update the title of the page to match current record.", - "ru-ru": - "Следует ли обновить заголовок страницы в соответствии с текущей записью.", - "es-es": - "Si desea actualizar el título de la página para que coincida con el registro actual.", - "fr-fr": + 'en-us': 'Whether to update the title of the page to match current record.', + 'ru-ru': + 'Следует ли обновить заголовок страницы в соответствии с текущей записью.', + 'es-es': + 'Si desea actualizar el título de la página para que coincida con el registro actual.', + 'fr-fr': "S'il faut mettre à jour le titre de la page pour qu'il corresponde à l'enregistrement actuel.", - "uk-ua": "Чи оновлювати назву сторінки відповідно до поточного запису.", - "de-ch": - "Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.", - "pt-br": - "Se o título da página deve ser atualizado para corresponder ao registro atual.", + 'uk-ua': 'Чи оновлювати назву сторінки відповідно до поточного запису.', + 'de-ch': + 'Titel der Seite aktualisieren, damit er mit dem aktuellen Datensatz übereinstimmt.', + 'pt-br': + 'Se o título da página deve ser atualizado para corresponder ao registro atual.', }, queryComboBox: { - "en-us": "Query Combo Box", - "ru-ru": "Поле со списком запросов", - "es-es": "Cuadro combinado de consulta", - "uk-ua": "Поле зі списком запитів", - "de-ch": "Abfrage-Kombinationsfeld", - "fr-fr": "Zone de liste déroulante de requête", - "pt-br": "Caixa de combinação de consulta", + 'en-us': 'Query Combo Box', + 'ru-ru': 'Поле со списком запросов', + 'es-es': 'Cuadro combinado de consulta', + 'uk-ua': 'Поле зі списком запитів', + 'de-ch': 'Abfrage-Kombinationsfeld', + 'fr-fr': 'Zone de liste déroulante de requête', + 'pt-br': 'Caixa de combinação de consulta', }, searchAlgorithm: { - "en-us": "Search Algorithm", - "ru-ru": "Алгоритм поиска", - "es-es": "Algoritmo de búsqueda", - "fr-fr": "Algorithme de recherche", - "uk-ua": "Алгоритм пошуку", - "de-ch": "Suchalgorithmus", - "pt-br": "Algoritmo de Busca", + 'en-us': 'Search Algorithm', + 'ru-ru': 'Алгоритм поиска', + 'es-es': 'Algoritmo de búsqueda', + 'fr-fr': 'Algorithme de recherche', + 'uk-ua': 'Алгоритм пошуку', + 'de-ch': 'Suchalgorithmus', + 'pt-br': 'Algoritmo de Busca', }, treeSearchAlgorithm: { - "en-us": "Search Algorithm (for relationships with tree tables)", - "ru-ru": "Алгоритм поиска (для связей с древовидными таблицами)", - "es-es": "Algoritmo de búsqueda (para relaciones con tablas de árbol)", - "fr-fr": - "Algorithme de recherche (pour les relations avec les tables arborescentes)", - "uk-ua": "Алгоритм пошуку (для зв’язків із деревоподібними таблицями)", - "de-ch": "Suchalgorithmus (für Beziehungen mit Baumtabellen)", - "pt-br": "Algoritmo de busca (para relacionamentos com tabelas de árvore)", + 'en-us': 'Search Algorithm (for relationships with tree tables)', + 'ru-ru': 'Алгоритм поиска (для связей с древовидными таблицами)', + 'es-es': 'Algoritmo de búsqueda (para relaciones con tablas de árbol)', + 'fr-fr': + 'Algorithme de recherche (pour les relations avec les tables arborescentes)', + 'uk-ua': 'Алгоритм пошуку (для зв’язків із деревоподібними таблицями)', + 'de-ch': 'Suchalgorithmus (für Beziehungen mit Baumtabellen)', + 'pt-br': 'Algoritmo de busca (para relacionamentos com tabelas de árvore)', }, startsWithInsensitive: { - "en-us": "Starts With (case-insensitive)", - "ru-ru": "Начинается с (без учета регистра)", - "es-es": "Comienza con (sin distinguir entre mayúsculas y minúsculas)", - "fr-fr": "Commence par (insensible à la casse)", - "uk-ua": "Починається з (без урахування регістру)", - "de-ch": "Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)", - "pt-br": "Começa com (sem distinção de maiúsculas e minúsculas)", + 'en-us': 'Starts With (case-insensitive)', + 'ru-ru': 'Начинается с (без учета регистра)', + 'es-es': 'Comienza con (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (insensible à la casse)', + 'uk-ua': 'Починається з (без урахування регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Começa com (sem distinção de maiúsculas e minúsculas)', }, startsWithDescription: { - "en-us": "Search for values that begin with a given query string.", - "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", - "es-es": - "Busque valores que comiencen con una cadena de consulta determinada.", - "fr-fr": - "Rechercher des valeurs commençant par une chaîne de requête donnée.", - "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", - "de-ch": - "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", - "pt-br": - "Pesquisar valores que começam com uma determinada sequência de consulta.", + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Rechercher des valeurs commençant par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquisar valores que começam com uma determinada sequência de consulta.', }, startsWithCaseSensitive: { - "en-us": "Starts With (case-sensitive)", - "ru-ru": "Начинается с (с учетом регистра)", - "es-es": "Comienza con (sensible a mayúsculas y minúsculas)", - "fr-fr": "Commence par (sensible à la casse)", - "uk-ua": "Починається з (з урахуванням регістру)", - "de-ch": "Beginnt mit (Groß-/Kleinschreibung beachten)", - "pt-br": "Começa com (diferencia maiúsculas de minúsculas)", + 'en-us': 'Starts With (case-sensitive)', + 'ru-ru': 'Начинается с (с учетом регистра)', + 'es-es': 'Comienza con (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Commence par (sensible à la casse)', + 'uk-ua': 'Починається з (з урахуванням регістру)', + 'de-ch': 'Beginnt mit (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Começa com (diferencia maiúsculas de minúsculas)', }, startsWithCaseSensitiveDescription: { - "en-us": "Search for values that begin with a given query string.", - "ru-ru": "Поиск значений, начинающихся с заданной строки запроса.", - "es-es": - "Busque valores que comiencen con una cadena de consulta determinada.", - "fr-fr": - "Recherchez les valeurs qui commencent par une chaîne de requête donnée.", - "uk-ua": "Пошук значень, які починаються з заданого рядка запиту.", - "de-ch": - "Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.", - "pt-br": - "Pesquisar valores que começam com uma determinada sequência de consulta.", + 'en-us': 'Search for values that begin with a given query string.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', + 'es-es': + 'Busque valores que comiencen con una cadena de consulta determinada.', + 'fr-fr': + 'Recherchez les valeurs qui commencent par une chaîne de requête donnée.', + 'uk-ua': 'Пошук значень, які починаються з заданого рядка запиту.', + 'de-ch': + 'Suchen Sie nach Werten, die mit einer bestimmten Abfragezeichenfolge beginnen.', + 'pt-br': + 'Pesquisar valores que começam com uma determinada sequência de consulta.', }, containsInsensitive: { - "en-us": "Contains (case-insensitive)", - "ru-ru": "Содержит (без учета регистра)", - "es-es": "Contiene (sin distinguir entre mayúsculas y minúsculas)", - "fr-fr": "Contient (insensible à la casse)", - "uk-ua": "Містить (незалежно від регістру)", - "de-ch": "Enthält (Groß-/Kleinschreibung wird nicht beachtet)", - "pt-br": "Contém (sem distinção entre maiúsculas e minúsculas)", + 'en-us': 'Contains (case-insensitive)', + 'ru-ru': 'Содержит (без учета регистра)', + 'es-es': 'Contiene (sin distinguir entre mayúsculas y minúsculas)', + 'fr-fr': 'Contient (insensible à la casse)', + 'uk-ua': 'Містить (незалежно від регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung wird nicht beachtet)', + 'pt-br': 'Contém (sem distinção entre maiúsculas e minúsculas)', }, containsCaseSensitive: { - "en-us": "Contains (case-sensitive)", - "ru-ru": "Содержит (с учетом регистра)", - "es-es": "Contiene (sensible a mayúsculas y minúsculas)", - "fr-fr": "Contient (sensible à la casse)", - "uk-ua": "Містить (з урахуванням регістру)", - "de-ch": "Enthält (Groß-/Kleinschreibung beachten)", - "pt-br": "Contém (diferencia maiúsculas de minúsculas)", + 'en-us': 'Contains (case-sensitive)', + 'ru-ru': 'Содержит (с учетом регистра)', + 'es-es': 'Contiene (sensible a mayúsculas y minúsculas)', + 'fr-fr': 'Contient (sensible à la casse)', + 'uk-ua': 'Містить (з урахуванням регістру)', + 'de-ch': 'Enthält (Groß-/Kleinschreibung beachten)', + 'pt-br': 'Contém (diferencia maiúsculas de minúsculas)', }, containsDescription: { - "en-us": - "Search for values that contain a given query string (case-insensitive).", - "ru-ru": - "Поиск значений, содержащих заданную строку запроса (без учета регистра).", - "es-es": - "Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).", - "uk-ua": - "Пошук значень, які містять заданий рядок запиту (незалежно від регістру).", - "de-ch": - "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).", - "fr-fr": - "Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).", - "pt-br": - "Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).", + 'en-us': + 'Search for values that contain a given query string (case-insensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (без учета регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (sin distinguir entre mayúsculas y minúsculas).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (незалежно від регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (ohne Berücksichtigung der Groß-/Kleinschreibung).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (insensible à la casse).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (sem distinção de maiúsculas e minúsculas).', }, containsCaseSensitiveDescription: { - "en-us": - "Search for values that contain a given query string (case-sensitive).", - "ru-ru": - "Поиск значений, содержащих заданную строку запроса (с учетом регистра).", - "es-es": - "Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).", - "fr-fr": - "Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).", - "uk-ua": - "Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).", - "de-ch": - "Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).", - "pt-br": - "Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).", + 'en-us': + 'Search for values that contain a given query string (case-sensitive).', + 'ru-ru': + 'Поиск значений, содержащих заданную строку запроса (с учетом регистра).', + 'es-es': + 'Busque valores que contengan una cadena de consulta determinada (distingue entre mayúsculas y minúsculas).', + 'fr-fr': + 'Recherchez les valeurs contenant une chaîne de requête donnée (sensible à la casse).', + 'uk-ua': + 'Пошук значень, які містять заданий рядок запиту (з урахуванням регістру).', + 'de-ch': + 'Suchen Sie nach Werten, die eine bestimmte Abfragezeichenfolge enthalten (Groß-/Kleinschreibung beachten).', + 'pt-br': + 'Pesquisar valores que contenham uma determinada sequência de consulta (diferencia maiúsculas de minúsculas).', }, containsSecondDescription: { - "en-us": - "Can use _ to match any single character or % to match any number of characters.", - "ru-ru": - "Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.", - "es-es": - "Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.", - "fr-fr": + 'en-us': + 'Can use _ to match any single character or % to match any number of characters.', + 'ru-ru': + 'Можно использовать _ для соответствия любому отдельному символу или % для соответствия любому количеству символов.', + 'es-es': + 'Puede utilizar _ para que coincida con cualquier carácter individual o % para que coincida con cualquier número de caracteres.', + 'fr-fr': "Peut utiliser _ pour correspondre à n'importe quel caractère ou % pour correspondre à n'importe quel nombre de caractères.", - "uk-ua": - "Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.", - "de-ch": - "Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.", - "pt-br": - "Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.", + 'uk-ua': + 'Можна використовувати _ для відповідності будь-якому одному символу або % для відповідності будь-якій кількості символів.', + 'de-ch': + 'Sie können _ verwenden, um ein beliebiges einzelnes Zeichen abzugleichen, oder %, um eine beliebige Anzahl von Zeichen abzugleichen.', + 'pt-br': + 'Pode usar _ para corresponder a qualquer caractere único ou % para corresponder a qualquer número de caracteres.', }, highlightMatch: { - "en-us": "Highlight matched substring", - "ru-ru": "Выделить совпавшую подстроку", - "es-es": "Resaltar la subcadena coincidente", - "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", - "uk-ua": "Виділіть збіг підрядка", - "de-ch": "Markieren Sie übereinstimmende Teilzeichenfolgen", - "pt-br": "Destacar substring correspondente", + 'en-us': 'Highlight matched substring', + 'ru-ru': 'Выделить совпавшую подстроку', + 'es-es': 'Resaltar la subcadena coincidente', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'uk-ua': 'Виділіть збіг підрядка', + 'de-ch': 'Markieren Sie übereinstimmende Teilzeichenfolgen', + 'pt-br': 'Destacar substring correspondente', }, languageDescription: { - "en-us": "Determines field captions, usage notes and table captions.", - "ru-ru": - "Определяет заголовки полей, примечания по использованию и заголовки таблиц.", - "es-es": "Determina títulos de campos, notas de uso y títulos de tablas.", - "fr-fr": + 'en-us': 'Determines field captions, usage notes and table captions.', + 'ru-ru': + 'Определяет заголовки полей, примечания по использованию и заголовки таблиц.', + 'es-es': 'Determina títulos de campos, notas de uso y títulos de tablas.', + 'fr-fr': "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux.", - "uk-ua": - "Визначає підписи полів, примітки щодо використання та підписи таблиць.", - "de-ch": - "Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.", - "pt-br": "Determina legendas de campo, notas de uso e legendas de tabela.", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць.', + 'de-ch': + 'Legt Feldbeschriftungen, Verwendungshinweise und Tabellenbeschriftungen fest.', + 'pt-br': 'Determina legendas de campo, notas de uso e legendas de tabela.', }, showDialogIcon: { - "en-us": "Show icon in the header", - "ru-ru": "Показывать значок в заголовке", - "es-es": "Mostrar icono en el encabezado", - "fr-fr": "Afficher l'icône dans l'en-tête", - "uk-ua": "Показати значок у заголовку", - "de-ch": "Symbol in der Kopfzeile anzeigen", - "pt-br": "Mostrar ícone no cabeçalho", + 'en-us': 'Show icon in the header', + 'ru-ru': 'Показывать значок в заголовке', + 'es-es': 'Mostrar icono en el encabezado', + 'fr-fr': "Afficher l'icône dans l'en-tête", + 'uk-ua': 'Показати значок у заголовку', + 'de-ch': 'Symbol in der Kopfzeile anzeigen', + 'pt-br': 'Mostrar ícone no cabeçalho', }, scaleInterface: { - "en-us": "Scale Interface", - "ru-ru": "Интерфейс масштабирования", - "es-es": "Interfaz de escala", - "fr-fr": "Interface de balance", - "uk-ua": "Інтерфейс масштабу", - "de-ch": "Waagenschnittstelle", - "pt-br": "Interface de escala", + 'en-us': 'Scale Interface', + 'ru-ru': 'Интерфейс масштабирования', + 'es-es': 'Interfaz de escala', + 'fr-fr': 'Interface de balance', + 'uk-ua': 'Інтерфейс масштабу', + 'de-ch': 'Waagenschnittstelle', + 'pt-br': 'Interface de escala', }, scaleInterfaceDescription: { - "en-us": "Scale interface to match font size.", - "ru-ru": "Масштабируйте интерфейс в соответствии с размером шрифта.", - "es-es": "Escala la interfaz para que coincida con el tamaño de la fuente.", - "fr-fr": "Adapter l'interface à la taille de la police.", - "uk-ua": "Масштабуйте інтерфейс відповідно до розміру шрифту.", - "de-ch": - "Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.", - "pt-br": "Dimensione a interface para corresponder ao tamanho da fonte.", + 'en-us': 'Scale interface to match font size.', + 'ru-ru': 'Масштабируйте интерфейс в соответствии с размером шрифта.', + 'es-es': 'Escala la interfaz para que coincida con el tamaño de la fuente.', + 'fr-fr': "Adapter l'interface à la taille de la police.", + 'uk-ua': 'Масштабуйте інтерфейс відповідно до розміру шрифту.', + 'de-ch': + 'Skalieren Sie die Benutzeroberfläche, um sie an die Schriftgröße anzupassen.', + 'pt-br': 'Dimensione a interface para corresponder ao tamanho da fonte.', }, displayAuthor: { - "en-us": "Show author in the tree", - "ru-ru": "Показать автора в дереве", - "es-es": "Mostrar autor en el árbol", - "fr-fr": "Afficher l'auteur dans l'arbre", - "uk-ua": "Показати автора в дереві", - "de-ch": "Autor im Baum anzeigen", - "pt-br": "Mostrar autor", + 'en-us': 'Show author in the tree', + 'ru-ru': 'Показать автора в дереве', + 'es-es': 'Mostrar autor en el árbol', + 'fr-fr': "Afficher l'auteur dans l'arbre", + 'uk-ua': 'Показати автора в дереві', + 'de-ch': 'Autor im Baum anzeigen', + 'pt-br': 'Mostrar autor', }, welcomePage: { - "en-us": "Home Page", - "ru-ru": "Домашняя страница", - "es-es": "Página de inicio", - "fr-fr": "Page d'accueil", - "uk-ua": "Домашня сторінка", - "de-ch": "Startseite", - "pt-br": "Página inicial", + 'en-us': 'Home Page', + 'ru-ru': 'Домашняя страница', + 'es-es': 'Página de inicio', + 'fr-fr': "Page d'accueil", + 'uk-ua': 'Домашня сторінка', + 'de-ch': 'Startseite', + 'pt-br': 'Página inicial', }, content: { - "en-us": "Content", - "ru-ru": "Содержание", - "es-es": "Contenido", - "fr-fr": "Contenu", - "uk-ua": "Зміст", - "de-ch": "Inhalt", - "pt-br": "Contente", + 'en-us': 'Content', + 'ru-ru': 'Содержание', + 'es-es': 'Contenido', + 'fr-fr': 'Contenu', + 'uk-ua': 'Зміст', + 'de-ch': 'Inhalt', + 'pt-br': 'Contente', }, defaultImage: { - "en-us": "Specify Logo", - "ru-ru": "Укажите логотип", - "es-es": "Especificar logotipo", - "fr-fr": "Spécifier le logo", - "uk-ua": "Вкажіть логотип", - "de-ch": "Logo angeben", - "pt-br": "Especificar logotipo", + 'en-us': 'Specify Logo', + 'ru-ru': 'Укажите логотип', + 'es-es': 'Especificar logotipo', + 'fr-fr': 'Spécifier le logo', + 'uk-ua': 'Вкажіть логотип', + 'de-ch': 'Logo angeben', + 'pt-br': 'Especificar logotipo', }, customImage: { - "en-us": "Custom Image", - "ru-ru": "Пользовательское изображение", - "es-es": "Imagen personalizada", - "fr-fr": "Image personnalisée", - "uk-ua": "Спеціальне зображення", - "de-ch": "Benutzerdefiniertes Bild", - "pt-br": "Imagem personalizada", + 'en-us': 'Custom Image', + 'ru-ru': 'Пользовательское изображение', + 'es-es': 'Imagen personalizada', + 'fr-fr': 'Image personnalisée', + 'uk-ua': 'Спеціальне зображення', + 'de-ch': 'Benutzerdefiniertes Bild', + 'pt-br': 'Imagem personalizada', }, embeddedWebpage: { - "en-us": "Embedded web page", - "ru-ru": "Встроенная веб-страница", - "es-es": "Página web incrustada", - "fr-fr": "Page Web intégrée", - "uk-ua": "Вбудована веб-сторінка", - "de-ch": "Eingebettete Webseite", - "pt-br": "Página da web incorporada", + 'en-us': 'Embedded web page', + 'ru-ru': 'Встроенная веб-страница', + 'es-es': 'Página web incrustada', + 'fr-fr': 'Page Web intégrée', + 'uk-ua': 'Вбудована веб-сторінка', + 'de-ch': 'Eingebettete Webseite', + 'pt-br': 'Página da web incorporada', }, embeddedWebpageDescription: { - "en-us": "A URL to a page that would be embedded on the home page:", - "ru-ru": "URL-адрес страницы, которая будет встроена в домашнюю страницу:", - "es-es": "Una URL a una página que se integrará en la página de inicio:", - "fr-fr": "Une URL vers une page qui serait intégrée à la page d'accueil :", - "uk-ua": "URL-адреса сторінки, яка буде вбудована на домашній сторінці:", - "de-ch": - "Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:", - "pt-br": "Um URL para uma página que seria incorporada na página inicial:", + 'en-us': 'A URL to a page that would be embedded on the home page:', + 'ru-ru': 'URL-адрес страницы, которая будет встроена в домашнюю страницу:', + 'es-es': 'Una URL a una página que se integrará en la página de inicio:', + 'fr-fr': "Une URL vers une page qui serait intégrée à la page d'accueil :", + 'uk-ua': 'URL-адреса сторінки, яка буде вбудована на домашній сторінці:', + 'de-ch': + 'Eine URL zu einer Seite, die auf der Startseite eingebettet werden soll:', + 'pt-br': 'Um URL para uma página que seria incorporada na página inicial:', }, behavior: { - "en-us": "Behavior", - "ru-ru": "Поведение", - "es-es": "Comportamiento", - "fr-fr": "Comportement", - "uk-ua": "Поведінка", - "de-ch": "Verhalten", - "pt-br": "Comportamento", + 'en-us': 'Behavior', + 'ru-ru': 'Поведение', + 'es-es': 'Comportamiento', + 'fr-fr': 'Comportement', + 'uk-ua': 'Поведінка', + 'de-ch': 'Verhalten', + 'pt-br': 'Comportamento', }, noRestrictionsMode: { - "en-us": "No restrictions mode", - "ru-ru": "Режим без ограничений", - "es-es": "Modo sin restricciones", - "fr-fr": "Mode sans restriction", - "uk-ua": "Режим без обмежень", - "de-ch": "Modus „Keine Einschränkungen“", - "pt-br": "Modo sem restrições", + 'en-us': 'No restrictions mode', + 'ru-ru': 'Режим без ограничений', + 'es-es': 'Modo sin restricciones', + 'fr-fr': 'Mode sans restriction', + 'uk-ua': 'Режим без обмежень', + 'de-ch': 'Modus „Keine Einschränkungen“', + 'pt-br': 'Modo sem restrições', }, noRestrictionsModeWbDescription: { - "en-us": "Allows uploading data to any field in any table.", - "ru-ru": "Позволяет загружать данные в любое поле любой таблицы.", - "es-es": "Permite cargar datos a cualquier campo de cualquier tabla.", - "fr-fr": + 'en-us': 'Allows uploading data to any field in any table.', + 'ru-ru': 'Позволяет загружать данные в любое поле любой таблицы.', + 'es-es': 'Permite cargar datos a cualquier campo de cualquier tabla.', + 'fr-fr': "Permet de télécharger des données dans n'importe quel champ de n'importe quelle table.", - "uk-ua": "Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.", - "de-ch": - "Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.", - "pt-br": "Permite carregar dados em qualquer campo de qualquer tabela.", + 'uk-ua': 'Дозволяє завантажувати дані в будь-яке поле будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Hochladen von Daten in jedes Feld einer beliebigen Tabelle.', + 'pt-br': 'Permite carregar dados em qualquer campo de qualquer tabela.', }, noRestrictionsModeQueryDescription: { - "en-us": "Allows querying data from any field in any table.", - "ru-ru": "Позволяет запрашивать данные из любого поля любой таблицы.", - "es-es": "Permite consultar datos de cualquier campo de cualquier tabla.", - "fr-fr": + 'en-us': 'Allows querying data from any field in any table.', + 'ru-ru': 'Позволяет запрашивать данные из любого поля любой таблицы.', + 'es-es': 'Permite consultar datos de cualquier campo de cualquier tabla.', + 'fr-fr': "Permet d'interroger les données de n'importe quel champ de n'importe quelle table.", - "uk-ua": "Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.", - "de-ch": - "Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.", - "pt-br": "Permite consultar dados de qualquer campo em qualquer tabela.", + 'uk-ua': 'Дозволяє запитувати дані з будь-якого поля будь-якої таблиці.', + 'de-ch': + 'Ermöglicht das Abfragen von Daten aus jedem Feld in jeder Tabelle.', + 'pt-br': 'Permite consultar dados de qualquer campo em qualquer tabela.', }, noRestrictionsModeWarning: { - "en-us": - "WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.", - "ru-ru": - "ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.", - "es-es": - "ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.", - "uk-ua": - "ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.", - "de-ch": - "WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.", - "fr-fr": + 'en-us': + 'WARNING: enabling this may lead to data loss or database corruption. Please make sure you know what you are doing.', + 'ru-ru': + 'ВНИМАНИЕ: включение этой функции может привести к потере данных или повреждению базы данных. Убедитесь, что вы понимаете, что делаете.', + 'es-es': + 'ADVERTENCIA: Habilitar esta opción podría provocar la pérdida de datos o la corrupción de la base de datos. Asegúrese de saber lo que está haciendo.', + 'uk-ua': + 'ПОПЕРЕДЖЕННЯ: увімкнення цієї функції може призвести до втрати даних або пошкодження бази даних. Переконайтеся, що ви знаєте, що робите.', + 'de-ch': + 'WARNUNG: Das Aktivieren dieser Option kann zu Datenverlust oder Datenbankbeschädigung führen. Bitte stellen Sie sicher, dass Sie wissen, was Sie tun.', + 'fr-fr': "AVERTISSEMENT : l'activation de cette option peut entraîner une perte de données ou une corruption de la base de données. Veuillez vous assurer que vous savez ce que vous faites.", - "pt-br": - "AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.", + 'pt-br': + 'AVISO: habilitar esta opção pode levar à perda de dados ou à corrupção do banco de dados. Certifique-se de saber o que está fazendo.', }, adminsOnlyPreference: { - "en-us": "You don't have permission to change this option", - "ru-ru": "У вас нет разрешения на изменение этой опции.", - "es-es": "No tienes permiso para cambiar esta opción", - "fr-fr": "Vous n'êtes pas autorisé à modifier cette option", - "uk-ua": "Ви не маєте дозволу змінювати цей параметр", - "de-ch": "Sie haben keine Berechtigung, diese Option zu ändern", - "pt-br": "Você não tem permissão para alterar esta opção", + 'en-us': "You don't have permission to change this option", + 'ru-ru': 'У вас нет разрешения на изменение этой опции.', + 'es-es': 'No tienes permiso para cambiar esta opción', + 'fr-fr': "Vous n'êtes pas autorisé à modifier cette option", + 'uk-ua': 'Ви не маєте дозволу змінювати цей параметр', + 'de-ch': 'Sie haben keine Berechtigung, diese Option zu ändern', + 'pt-br': 'Você não tem permissão para alterar esta opção', }, stickyScrolling: { - "en-us": "Sticky scroll bar", - "ru-ru": "Липкая полоса прокрутки", - "es-es": "Barra de desplazamiento fija", - "fr-fr": "Barre de défilement collante", - "uk-ua": "Липка смуга прокрутки", - "de-ch": "Klebrige Bildlaufleiste", - "pt-br": "Barra de rolagem fixa", + 'en-us': 'Sticky scroll bar', + 'ru-ru': 'Липкая полоса прокрутки', + 'es-es': 'Barra de desplazamiento fija', + 'fr-fr': 'Barre de défilement collante', + 'uk-ua': 'Липка смуга прокрутки', + 'de-ch': 'Klebrige Bildlaufleiste', + 'pt-br': 'Barra de rolagem fixa', }, foreground: { - "en-us": "Foreground", - "ru-ru": "Передний план", - "es-es": "Primer plano", - "fr-fr": "Premier plan", - "uk-ua": "Передній план", - "de-ch": "Vordergrund", - "pt-br": "Primeiro plano", + 'en-us': 'Foreground', + 'ru-ru': 'Передний план', + 'es-es': 'Primer plano', + 'fr-fr': 'Premier plan', + 'uk-ua': 'Передній план', + 'de-ch': 'Vordergrund', + 'pt-br': 'Primeiro plano', }, background: { - "en-us": "Background", - "ru-ru": "Фон", - "es-es": "Fondo", - "fr-fr": "Arrière-plan", - "uk-ua": "Фон", - "de-ch": "Hintergrund", - "pt-br": "Fundo", + 'en-us': 'Background', + 'ru-ru': 'Фон', + 'es-es': 'Fondo', + 'fr-fr': 'Arrière-plan', + 'uk-ua': 'Фон', + 'de-ch': 'Hintergrund', + 'pt-br': 'Fundo', }, sidebarTheme: { - "en-us": "Sidebar theme", - "de-ch": "Seitenleistenthema", - "es-es": "Tema de la barra lateral", - "fr-fr": "Thème de la barre latérale", - "ru-ru": "Тема боковой панели", - "uk-ua": "Тема бічної панелі", - "pt-br": "Tema da barra lateral", + 'en-us': 'Sidebar theme', + 'de-ch': 'Seitenleistenthema', + 'es-es': 'Tema de la barra lateral', + 'fr-fr': 'Thème de la barre latérale', + 'ru-ru': 'Тема боковой панели', + 'uk-ua': 'Тема бічної панелі', + 'pt-br': 'Tema da barra lateral', }, darkForeground: { - "en-us": "Foreground (dark theme)", - "ru-ru": "Передний план (тёмная тема)", - "es-es": "Primer plano (tema oscuro)", - "fr-fr": "Premier plan (thème sombre)", - "uk-ua": "Передній план (темна тема)", - "de-ch": "Vordergrund (dunkles Design)", - "pt-br": "Primeiro plano (tema escuro)", + 'en-us': 'Foreground (dark theme)', + 'ru-ru': 'Передний план (тёмная тема)', + 'es-es': 'Primer plano (tema oscuro)', + 'fr-fr': 'Premier plan (thème sombre)', + 'uk-ua': 'Передній план (темна тема)', + 'de-ch': 'Vordergrund (dunkles Design)', + 'pt-br': 'Primeiro plano (tema escuro)', }, darkBackground: { - "en-us": "Background (dark theme)", - "ru-ru": "Фон (тёмная тема)", - "es-es": "Fondo (tema oscuro)", - "fr-fr": "Arrière-plan (thème sombre)", - "uk-ua": "Фон (темна тема)", - "de-ch": "Hintergrund (dunkles Design)", - "pt-br": "Plano de fundo (tema escuro)", + 'en-us': 'Background (dark theme)', + 'ru-ru': 'Фон (тёмная тема)', + 'es-es': 'Fondo (tema oscuro)', + 'fr-fr': 'Arrière-plan (thème sombre)', + 'uk-ua': 'Фон (темна тема)', + 'de-ch': 'Hintergrund (dunkles Design)', + 'pt-br': 'Plano de fundo (tema escuro)', }, accentColor1: { - "en-us": "Accent color 1", - "ru-ru": "Акцентный цвет 1", - "es-es": "Color de acento 1", - "fr-fr": "Couleur d'accent 1", - "uk-ua": "Акцентний колір 1", - "de-ch": "Akzentfarbe 1", - "pt-br": "Cor de destaque 1", + 'en-us': 'Accent color 1', + 'ru-ru': 'Акцентный цвет 1', + 'es-es': 'Color de acento 1', + 'fr-fr': "Couleur d'accent 1", + 'uk-ua': 'Акцентний колір 1', + 'de-ch': 'Akzentfarbe 1', + 'pt-br': 'Cor de destaque 1', }, accentColor2: { - "en-us": "Accent color 2", - "ru-ru": "Акцентный цвет 2", - "es-es": "Color de acento 2", - "fr-fr": "Couleur d'accent 2", - "uk-ua": "Акцентний колір 2", - "de-ch": "Akzentfarbe 2", - "pt-br": "Cor de destaque 2", + 'en-us': 'Accent color 2', + 'ru-ru': 'Акцентный цвет 2', + 'es-es': 'Color de acento 2', + 'fr-fr': "Couleur d'accent 2", + 'uk-ua': 'Акцентний колір 2', + 'de-ch': 'Akzentfarbe 2', + 'pt-br': 'Cor de destaque 2', }, accentColor3: { - "en-us": "Accent color 3", - "ru-ru": "Акцентный цвет 3", - "es-es": "Color de acento 3", - "fr-fr": "Couleur d'accent 3", - "uk-ua": "Акцентний колір 3", - "de-ch": "Akzentfarbe 3", - "pt-br": "Cor de destaque 3", + 'en-us': 'Accent color 3', + 'ru-ru': 'Акцентный цвет 3', + 'es-es': 'Color de acento 3', + 'fr-fr': "Couleur d'accent 3", + 'uk-ua': 'Акцентний колір 3', + 'de-ch': 'Akzentfarbe 3', + 'pt-br': 'Cor de destaque 3', }, accentColor4: { - "en-us": "Accent color 4", - "ru-ru": "Акцентный цвет 4", - "es-es": "Color de acento 4", - "fr-fr": "Couleur d'accent 4", - "uk-ua": "Акцентний колір 4", - "de-ch": "Akzentfarbe 4", - "pt-br": "Cor de destaque 4", + 'en-us': 'Accent color 4', + 'ru-ru': 'Акцентный цвет 4', + 'es-es': 'Color de acento 4', + 'fr-fr': "Couleur d'accent 4", + 'uk-ua': 'Акцентний колір 4', + 'de-ch': 'Akzentfarbe 4', + 'pt-br': 'Cor de destaque 4', }, accentColor5: { - "en-us": "Accent color 5", - "ru-ru": "Акцентный цвет 5", - "es-es": "Color de acento 5", - "fr-fr": "Couleur d'accent 5", - "uk-ua": "Акцентний колір 5", - "de-ch": "Akzentfarbe 5", - "pt-br": "Cor de destaque 5", + 'en-us': 'Accent color 5', + 'ru-ru': 'Акцентный цвет 5', + 'es-es': 'Color de acento 5', + 'fr-fr': "Couleur d'accent 5", + 'uk-ua': 'Акцентний колір 5', + 'de-ch': 'Akzentfarbe 5', + 'pt-br': 'Cor de destaque 5', }, spreadsheet: { - "en-us": "Spreadsheet", - "ru-ru": "Электронная таблица", - "es-es": "Hoja de cálculo", - "fr-fr": "Tableur", - "uk-ua": "Електронна таблиця", - "de-ch": "Kalkulationstabelle", - "pt-br": "Planilha", + 'en-us': 'Spreadsheet', + 'ru-ru': 'Электронная таблица', + 'es-es': 'Hoja de cálculo', + 'fr-fr': 'Tableur', + 'uk-ua': 'Електронна таблиця', + 'de-ch': 'Kalkulationstabelle', + 'pt-br': 'Planilha', }, minSpareRows: { - "en-us": "Number of blank rows at the end", - "ru-ru": "Количество пустых строк в конце", - "es-es": "Número de filas en blanco al final", - "fr-fr": "Nombre de lignes vides à la fin", - "uk-ua": "Кількість порожніх рядків у кінці", - "de-ch": "Anzahl der leeren Zeilen am Ende", - "pt-br": "Número de linhas em branco no final", + 'en-us': 'Number of blank rows at the end', + 'ru-ru': 'Количество пустых строк в конце', + 'es-es': 'Número de filas en blanco al final', + 'fr-fr': 'Nombre de lignes vides à la fin', + 'uk-ua': 'Кількість порожніх рядків у кінці', + 'de-ch': 'Anzahl der leeren Zeilen am Ende', + 'pt-br': 'Número de linhas em branco no final', }, autoWrapCols: { - "en-us": "Navigate to the other side when reaching the edge column", - "ru-ru": "Достигнув крайней колонны, перейдите на другую сторону.", - "es-es": "Navegue hacia el otro lado al llegar a la columna del borde.", - "fr-fr": - "Naviguez de l’autre côté lorsque vous atteignez la colonne de bord", - "uk-ua": "Перейдіть на іншу сторону, коли досягнете краю колонки", - "de-ch": - "Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen", - "pt-br": "Navegue para o outro lado ao atingir a coluna da borda", + 'en-us': 'Navigate to the other side when reaching the edge column', + 'ru-ru': 'Достигнув крайней колонны, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la columna del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la colonne de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете краю колонки', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randspalte erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a coluna da borda', }, autoWrapRows: { - "en-us": "Navigate to the other side when reaching the edge row", - "ru-ru": "Достигнув крайнего ряда, перейдите на другую сторону.", - "es-es": "Navegue hacia el otro lado al llegar a la fila del borde.", - "fr-fr": - "Naviguez de l’autre côté lorsque vous atteignez la rangée de bord", - "uk-ua": "Перейдіть на іншу сторону, коли досягнете крайнього ряду", - "de-ch": - "Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen", - "pt-br": "Navegue para o outro lado ao atingir a fileira de bordas", + 'en-us': 'Navigate to the other side when reaching the edge row', + 'ru-ru': 'Достигнув крайнего ряда, перейдите на другую сторону.', + 'es-es': 'Navegue hacia el otro lado al llegar a la fila del borde.', + 'fr-fr': + 'Naviguez de l’autre côté lorsque vous atteignez la rangée de bord', + 'uk-ua': 'Перейдіть на іншу сторону, коли досягнете крайнього ряду', + 'de-ch': + 'Navigieren Sie zur anderen Seite, wenn Sie die Randreihe erreichen', + 'pt-br': 'Navegue para o outro lado ao atingir a fileira de bordas', }, enterBeginsEditing: { - "en-us": "Enter key begins editing cell", - "ru-ru": "Клавиша Enter начинает редактирование ячейки.", - "es-es": "La tecla Enter inicia la edición de la celda", - "fr-fr": "La touche Entrée commence à modifier la cellule", - "uk-ua": "Клавіша Enter починає редагування клітинки", - "de-ch": "Mit der Eingabetaste beginnt die Bearbeitung der Zelle", - "pt-br": "A tecla Enter inicia a edição da célula", + 'en-us': 'Enter key begins editing cell', + 'ru-ru': 'Клавиша Enter начинает редактирование ячейки.', + 'es-es': 'La tecla Enter inicia la edición de la celda', + 'fr-fr': 'La touche Entrée commence à modifier la cellule', + 'uk-ua': 'Клавіша Enter починає редагування клітинки', + 'de-ch': 'Mit der Eingabetaste beginnt die Bearbeitung der Zelle', + 'pt-br': 'A tecla Enter inicia a edição da célula', }, tabMoveDirection: { - "en-us": "Direction of movement when Tab key is pressed", - "ru-ru": "Направление движения при нажатии клавиши Tab", - "es-es": - "Dirección de movimiento cuando se presiona la tecla Tab", - "fr-fr": - "Sens de déplacement lorsque la touche Tabulation est enfoncée", - "uk-ua": "Напрямок руху при натисканні клавіші Tab", - "de-ch": "Bewegungsrichtung beim Drücken der Tab-Taste", - "pt-br": "Direção do movimento quando a tecla Tab é pressionada", + 'en-us': 'Direction of movement when Tab key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Tab', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Tab', + 'fr-fr': + 'Sens de déplacement lorsque la touche Tabulation est enfoncée', + 'uk-ua': 'Напрямок руху при натисканні клавіші Tab', + 'de-ch': 'Bewegungsrichtung beim Drücken der Tab-Taste', + 'pt-br': 'Direção do movimento quando a tecla Tab é pressionada', }, tabMoveDirectionDescription: { - "en-us": - "You can move in the opposite direction by pressing Shift+Tab.", - "ru-ru": - "Вы можете двигаться в обратном направлении, нажав Shift+Tab.", - "es-es": - "Puedes moverte en la dirección opuesta presionando Shift+Tab.", - "fr-fr": - "Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.", - "uk-ua": - "Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.", - "de-ch": - "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.", - "pt-br": - "Você pode mover na direção oposta pressionando Shift+Tab.", + 'en-us': + 'You can move in the opposite direction by pressing Shift+Tab.', + 'ru-ru': + 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', + 'fr-fr': + 'Vous pouvez vous déplacer dans la direction opposée en appuyant sur Shift+Tab.', + 'uk-ua': + 'Ви можете рухатися в протилежному напрямку, натискаючи Shift+Tab.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Tab drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Tab.', }, column: { - "en-us": "Column", - "ru-ru": "Столбец", - "es-es": "Columna", - "fr-fr": "Colonne", - "uk-ua": "Колонка", - "de-ch": "Spalte", - "pt-br": "Coluna", + 'en-us': 'Column', + 'ru-ru': 'Столбец', + 'es-es': 'Columna', + 'fr-fr': 'Colonne', + 'uk-ua': 'Колонка', + 'de-ch': 'Spalte', + 'pt-br': 'Coluna', }, row: { - "en-us": "Row", - "ru-ru": "Ряд", - "es-es": "Fila", - "fr-fr": "Rangée", - "uk-ua": "рядок", - "de-ch": "Reihe", - "pt-br": "Linha", + 'en-us': 'Row', + 'ru-ru': 'Ряд', + 'es-es': 'Fila', + 'fr-fr': 'Rangée', + 'uk-ua': 'рядок', + 'de-ch': 'Reihe', + 'pt-br': 'Linha', }, enterMoveDirection: { - "en-us": "Direction of movement when Enter key is pressed", - "ru-ru": "Направление движения при нажатии клавиши Enter", - "es-es": - "Dirección de movimiento cuando se presiona la tecla Enter", - "uk-ua": "Напрямок руху, коли натиснуто клавішу Enter", - "de-ch": "Bewegungsrichtung beim Drücken der Taste Enter", - "fr-fr": - "Direction du mouvement lorsque la touche Entrer est enfoncée", - "pt-br": - "Direção do movimento quando a tecla Enter é pressionada", + 'en-us': 'Direction of movement when Enter key is pressed', + 'ru-ru': 'Направление движения при нажатии клавиши Enter', + 'es-es': + 'Dirección de movimiento cuando se presiona la tecla Enter', + 'uk-ua': 'Напрямок руху, коли натиснуто клавішу Enter', + 'de-ch': 'Bewegungsrichtung beim Drücken der Taste Enter', + 'fr-fr': + 'Direction du mouvement lorsque la touche Entrer est enfoncée', + 'pt-br': + 'Direção do movimento quando a tecla Enter é pressionada', }, enterMoveDirectionDescription: { - "en-us": - "You can move in the opposite direction by pressing Shift+Enter.", - "ru-ru": - "Вы можете двигаться в противоположном направлении, нажав Shift+Enter.", - "es-es": - "Puedes moverte en la dirección opuesta presionando Shift+Enter.", - "fr-fr": "Synonyme couleur.", - "uk-ua": - "Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.", - "de-ch": - "Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.", - "pt-br": - "Você pode mover na direção oposta pressionando Shift+Enter.", + 'en-us': + 'You can move in the opposite direction by pressing Shift+Enter.', + 'ru-ru': + 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', + 'es-es': + 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', + 'fr-fr': 'Synonyme couleur.', + 'uk-ua': + 'Ви можете рухатися у протилежному напрямку, натискаючи Shift+Enter.', + 'de-ch': + 'Sie können sich in die entgegengesetzte Richtung bewegen, indem Sie Umschalt+Eingabe drücken.', + 'pt-br': + 'Você pode mover na direção oposta pressionando Shift+Enter.', }, filterPickLists: { - "en-us": "Filter pick list items", - "ru-ru": "Фильтрация элементов списка выбора", - "es-es": "Filtrar elementos de la lista de selección", - "fr-fr": "Filtrer les éléments de la liste de sélection", - "uk-ua": "Фільтр вибору елементів списку", - "de-ch": "Auswahllistenelemente filtern", - "pt-br": "Filtrar itens da lista de seleção", + 'en-us': 'Filter pick list items', + 'ru-ru': 'Фильтрация элементов списка выбора', + 'es-es': 'Filtrar elementos de la lista de selección', + 'fr-fr': 'Filtrer les éléments de la liste de sélection', + 'uk-ua': 'Фільтр вибору елементів списку', + 'de-ch': 'Auswahllistenelemente filtern', + 'pt-br': 'Filtrar itens da lista de seleção', }, exportFileDelimiter: { - "en-us": "Export file delimiter", - "ru-ru": "Разделитель файлов экспорта", - "es-es": "Delimitador de archivo de exportación", - "fr-fr": "Délimiteur de fichier d'exportation", - "uk-ua": "Роздільник файлу експорту", - "de-ch": "Dateitrennzeichen exportieren", - "pt-br": "Delimitador de arquivo de exportação", + 'en-us': 'Export file delimiter', + 'ru-ru': 'Разделитель файлов экспорта', + 'es-es': 'Delimitador de archivo de exportación', + 'fr-fr': "Délimiteur de fichier d'exportation", + 'uk-ua': 'Роздільник файлу експорту', + 'de-ch': 'Dateitrennzeichen exportieren', + 'pt-br': 'Delimitador de arquivo de exportação', }, exportCsvUtf8Bom: { - "en-us": "Add UTF-8 BOM to CSV file exports", - "ru-ru": "Добавить UTF-8 BOM в экспорт CSV-файла", - "es-es": "Agregar BOM UTF-8 a las exportaciones de archivos CSV", - "fr-fr": "Ajouter UTF-8 BOM aux exportations de fichiers CSV", - "uk-ua": "Додайте специфікацію UTF-8 до експорту файлу CSVу", - "de-ch": "UTF-8 BOM zum CSV-Dateiexport hinzufügen", - "pt-br": "Adicionar UTF-8 BOM às exportações de arquivos CSV", + 'en-us': 'Add UTF-8 BOM to CSV file exports', + 'ru-ru': 'Добавить UTF-8 BOM в экспорт CSV-файла', + 'es-es': 'Agregar BOM UTF-8 a las exportaciones de archivos CSV', + 'fr-fr': 'Ajouter UTF-8 BOM aux exportations de fichiers CSV', + 'uk-ua': 'Додайте специфікацію UTF-8 до експорту файлу CSVу', + 'de-ch': 'UTF-8 BOM zum CSV-Dateiexport hinzufügen', + 'pt-br': 'Adicionar UTF-8 BOM às exportações de arquivos CSV', }, exportCsvUtf8BomDescription: { - "en-us": - "Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.", - "ru-ru": "Корректное отображение экспортированных CSV-файлов в Excel.", - "es-es": - "Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.", - "fr-fr": + 'en-us': + 'Adds a BOM (Byte Order Mark) to exported CSV files to ensure that the file is correctly recognized and displayed by various programs (Excel, OpenRefine, etc.), preventing issues with special characters and formatting.', + 'ru-ru': 'Корректное отображение экспортированных CSV-файлов в Excel.', + 'es-es': + 'Agrega una BOM (marca de orden de bytes) a los archivos CSV exportados para garantizar que el archivo sea reconocido y mostrado correctamente por varios programas (Excel, OpenRefine, etc.), evitando problemas con caracteres especiales y formato.', + 'fr-fr': "Permet aux exportations de fichiers CSV de s'afficher correctement dans Excel.", - "uk-ua": "Змушує експорт файлів CSV правильно відображатися в Excel.", - "de-ch": - "Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.", - "pt-br": - "Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.", + 'uk-ua': 'Змушує експорт файлів CSV правильно відображатися в Excel.', + 'de-ch': + 'Sorgt dafür, dass CSV-Dateiexporte in Excel korrekt angezeigt werden.', + 'pt-br': + 'Adiciona uma BOM (Byte Order Mark) aos arquivos CSV exportados para garantir que o arquivo seja reconhecido e exibido corretamente por vários programas (Excel, OpenRefine, etc.), evitando problemas com caracteres especiais e formatação.', }, caseSensitive: { - "en-us": "Case-sensitive", - "ru-ru": "С учетом регистра", - "es-es": "Distingue mayúsculas y minúsculas", - "fr-fr": "Sensible aux majuscules et minuscules", - "uk-ua": "Чутливий до регістру", - "de-ch": "Groß- und Kleinschreibung beachten", - "pt-br": "Maiúsculas e minúsculas", + 'en-us': 'Case-sensitive', + 'ru-ru': 'С учетом регистра', + 'es-es': 'Distingue mayúsculas y minúsculas', + 'fr-fr': 'Sensible aux majuscules et minuscules', + 'uk-ua': 'Чутливий до регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'pt-br': 'Maiúsculas e minúsculas', }, caseInsensitive: { - "en-us": "Case-insensitive", - "ru-ru": "Без учета регистра", - "es-es": "Sin distinción entre mayúsculas y minúsculas", - "fr-fr": "Insensible à la casse", - "uk-ua": "Регістр не враховується", - "de-ch": "Groß-/Kleinschreibung wird nicht beachtet", - "pt-br": "Não diferencia maiúsculas de minúsculas", + 'en-us': 'Case-insensitive', + 'ru-ru': 'Без учета регистра', + 'es-es': 'Sin distinción entre mayúsculas y minúsculas', + 'fr-fr': 'Insensible à la casse', + 'uk-ua': 'Регістр не враховується', + 'de-ch': 'Groß-/Kleinschreibung wird nicht beachtet', + 'pt-br': 'Não diferencia maiúsculas de minúsculas', }, showNoReadTables: { - "en-us": 'Show tables without "Read" access', - "ru-ru": "Показывать таблицы без доступа «Чтение»", - "es-es": 'Mostrar tablas sin acceso de "Lectura"', - "fr-fr": 'Afficher les tableaux sans accès "Lecture"', - "uk-ua": "Показувати таблиці без доступу «Читання»", - "de-ch": "Tabellen ohne Lesezugriff anzeigen", - "pt-br": 'Mostrar tabelas sem acesso de "Leitura"', + 'en-us': 'Show tables without "Read" access', + 'ru-ru': 'Показывать таблицы без доступа «Чтение»', + 'es-es': 'Mostrar tablas sin acceso de "Lectura"', + 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', + 'uk-ua': 'Показувати таблиці без доступу «Читання»', + 'de-ch': 'Tabellen ohne Lesezugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso de "Leitura"', }, showNoAccessTables: { - "en-us": 'Show tables without "Create" access', - "ru-ru": "Показывать таблицы без права «Создать»", - "es-es": 'Mostrar tablas sin acceso "Crear"', - "fr-fr": 'Afficher les tableaux sans accès "Créer"', - "uk-ua": "Показувати таблиці без доступу «Створити»", - "de-ch": "Tabellen ohne „Erstellen“-Zugriff anzeigen", - "pt-br": 'Mostrar tabelas sem acesso "Criar"', + 'en-us': 'Show tables without "Create" access', + 'ru-ru': 'Показывать таблицы без права «Создать»', + 'es-es': 'Mostrar tablas sin acceso "Crear"', + 'fr-fr': 'Afficher les tableaux sans accès "Créer"', + 'uk-ua': 'Показувати таблиці без доступу «Створити»', + 'de-ch': 'Tabellen ohne „Erstellen“-Zugriff anzeigen', + 'pt-br': 'Mostrar tabelas sem acesso "Criar"', }, textAreaAutoGrow: { - "en-us": "Text boxes grow automatically", - "ru-ru": "Текстовые поля увеличиваются автоматически", - "es-es": "Los cuadros de texto crecen automáticamente", - "fr-fr": "Les zones de texte s'agrandissent automatiquement", - "uk-ua": "Текстові поля збільшуються автоматично", - "de-ch": "Textfelder werden automatisch vergrößert", - "pt-br": "As caixas de texto crescem automaticamente", + 'en-us': 'Text boxes grow automatically', + 'ru-ru': 'Текстовые поля увеличиваются автоматически', + 'es-es': 'Los cuadros de texto crecen automáticamente', + 'fr-fr': "Les zones de texte s'agrandissent automatiquement", + 'uk-ua': 'Текстові поля збільшуються автоматично', + 'de-ch': 'Textfelder werden automatisch vergrößert', + 'pt-br': 'As caixas de texto crescem automaticamente', }, clearQueryFilters: { - "en-us": "Reset query filters", - "ru-ru": "Сбросить фильтры запроса", - "es-es": "Restablecer filtros de consulta", - "fr-fr": "Réinitialiser les filtres de requête", - "uk-ua": "Скинути фільтри запитів", - "de-ch": "Abfragefilter zurücksetzen", - "pt-br": "Redefinir filtros de consulta", + 'en-us': 'Reset query filters', + 'ru-ru': 'Сбросить фильтры запроса', + 'es-es': 'Restablecer filtros de consulta', + 'fr-fr': 'Réinitialiser les filtres de requête', + 'uk-ua': 'Скинути фільтри запитів', + 'de-ch': 'Abfragefilter zurücksetzen', + 'pt-br': 'Redefinir filtros de consulta', }, clearQueryFiltersDescription: { - "en-us": "Clears all query filters when running a Report from a Form.", - "de-ch": - "Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.", - "es-es": - "Borra todos los filtros de consulta al ejecutar un informe desde un formulario.", - "fr-fr": + 'en-us': 'Clears all query filters when running a Report from a Form.', + 'de-ch': + 'Löscht alle Abfragefilter, wenn ein Bericht aus einem Formular ausgeführt wird.', + 'es-es': + 'Borra todos los filtros de consulta al ejecutar un informe desde un formulario.', + 'fr-fr': "Efface tous les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire.", - "ru-ru": "Очищает все фильтры запроса при запуске отчета из формы.", - "uk-ua": "Очищає всі фільтри запитів під час запуску звіту з форми.", - "pt-br": - "Limpa todos os filtros de consulta ao executar um relatório de um formulário.", + 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', + 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', + 'pt-br': + 'Limpa todos os filtros de consulta ao executar um relatório de um formulário.', }, queryParamtersFromForm: { - "en-us": "Show query filters when running a Report from a Form", - "de-ch": - "Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird", - "es-es": - "Mostrar filtros de consulta al ejecutar un informe desde un formulario", - "fr-fr": + 'en-us': 'Show query filters when running a Report from a Form', + 'de-ch': + 'Abfragefilter anzeigen, wenn ein Bericht aus einem Formular ausgeführt wird', + 'es-es': + 'Mostrar filtros de consulta al ejecutar un informe desde un formulario', + 'fr-fr': "Afficher les filtres de requête lors de l'exécution d'un rapport à partir d'un formulaire", - "ru-ru": "Показывать фильтры запроса при запуске отчета из формы", - "uk-ua": "Показувати фільтри запитів під час запуску звіту з форми", - "pt-br": - "Mostrar filtros de consulta ao executar um relatório de um formulário", + 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', + 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', + 'pt-br': + 'Mostrar filtros de consulta ao executar um relatório de um formulário', }, autoGrowAutoComplete: { - "en-us": "Allow autocomplete to grow as wide as need", - "ru-ru": - "Разрешить автозаполнению расширяться настолько, насколько это необходимо", - "es-es": "Permitir que el autocompletado crezca tanto como sea necesario", - "fr-fr": - "Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée", - "uk-ua": - "Дозволити автозаповнення розширюватися настільки, наскільки потрібно", - "de-ch": - "Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen", - "pt-br": - "Permitir que o preenchimento automático cresça o quanto for necessário", + 'en-us': 'Allow autocomplete to grow as wide as need', + 'ru-ru': + 'Разрешить автозаполнению расширяться настолько, насколько это необходимо', + 'es-es': 'Permitir que el autocompletado crezca tanto como sea necesario', + 'fr-fr': + 'Sens de déplacement lorsque la touche [X27X]Tabulation[X35X] est enfoncée', + 'uk-ua': + 'Дозволити автозаповнення розширюватися настільки, наскільки потрібно', + 'de-ch': + 'Erlauben Sie der Autovervollständigung, so weit wie nötig zu wachsen', + 'pt-br': + 'Permitir que o preenchimento automático cresça o quanto for necessário', }, tableNameInTitle: { - "en-us": "Include table name in the browser page title", - "ru-ru": "Включить имя таблицы в заголовок страницы браузера", - "es-es": - "Incluir el nombre de la tabla en el título de la página del navegador", - "fr-fr": - "Inclure le nom de la table dans le titre de la page du navigateur", - "uk-ua": "Включіть назву таблиці в заголовок сторінки браузера", - "de-ch": "Tabellennamen in den Seitentitel des Browsers aufnehmen", - "pt-br": "Incluir nome da tabela no título da página do navegador", + 'en-us': 'Include table name in the browser page title', + 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', + 'es-es': + 'Incluir el nombre de la tabla en el título de la página del navegador', + 'fr-fr': + 'Inclure le nom de la table dans le titre de la page du navigateur', + 'uk-ua': 'Включіть назву таблиці в заголовок сторінки браузера', + 'de-ch': 'Tabellennamen in den Seitentitel des Browsers aufnehmen', + 'pt-br': 'Incluir nome da tabela no título da página do navegador', }, focusFirstField: { - "en-us": "Focus first field", - "de-ch": "Fokus erstes Feld", - "es-es": "Enfoque el primer campo", - "fr-fr": "Concentrez-vous sur le premier champ", - "ru-ru": "Фокус первого поля", - "uk-ua": "Перейти до першого поля", - "pt-br": "Foco primeiro no campo", + 'en-us': 'Focus first field', + 'de-ch': 'Fokus erstes Feld', + 'es-es': 'Enfoque el primer campo', + 'fr-fr': 'Concentrez-vous sur le premier champ', + 'ru-ru': 'Фокус первого поля', + 'uk-ua': 'Перейти до першого поля', + 'pt-br': 'Foco primeiro no campo', }, doubleClickZoom: { - "en-us": "Double click to zoom", - "ru-ru": "Дважды щелкните, чтобы увеличить", - "es-es": "Haga doble clic para ampliar", - "fr-fr": "Double-cliquez pour zoomer", - "uk-ua": "Двічі клацніть, щоб збільшити", - "de-ch": "Zum Vergrößern doppelklicken", - "pt-br": "Clique duas vezes para ampliar", + 'en-us': 'Double click to zoom', + 'ru-ru': 'Дважды щелкните, чтобы увеличить', + 'es-es': 'Haga doble clic para ampliar', + 'fr-fr': 'Double-cliquez pour zoomer', + 'uk-ua': 'Двічі клацніть, щоб збільшити', + 'de-ch': 'Zum Vergrößern doppelklicken', + 'pt-br': 'Clique duas vezes para ampliar', }, closePopupOnClick: { - "en-us": "Close pop-up on outside click", - "ru-ru": "Закрытие всплывающего окна при внешнем щелчке", - "es-es": "Cerrar ventana emergente al hacer clic desde fuera", - "fr-fr": "Fermer la pop-up lors d'un clic extérieur", - "uk-ua": "Закрити спливаюче вікно при зовнішньому клацанні", - "de-ch": "Popup bei externem Klick schließen", - "pt-br": "Fechar pop-up ao clicar fora", + 'en-us': 'Close pop-up on outside click', + 'ru-ru': 'Закрытие всплывающего окна при внешнем щелчке', + 'es-es': 'Cerrar ventana emergente al hacer clic desde fuera', + 'fr-fr': "Fermer la pop-up lors d'un clic extérieur", + 'uk-ua': 'Закрити спливаюче вікно при зовнішньому клацанні', + 'de-ch': 'Popup bei externem Klick schließen', + 'pt-br': 'Fechar pop-up ao clicar fora', }, animateTransitions: { - "en-us": "Animate transitions", - "ru-ru": "Анимированные переходы", - "es-es": "Transiciones animadas", - "fr-fr": "Animer les transitions", - "uk-ua": "Анімація переходів", - "de-ch": "Übergänge animieren", - "pt-br": "Transições animadas", + 'en-us': 'Animate transitions', + 'ru-ru': 'Анимированные переходы', + 'es-es': 'Transiciones animadas', + 'fr-fr': 'Animer les transitions', + 'uk-ua': 'Анімація переходів', + 'de-ch': 'Übergänge animieren', + 'pt-br': 'Transições animadas', }, panInertia: { - "en-us": "Pan inertia", - "ru-ru": "Инерция пан", - "es-es": "Inercia de la sartén", - "fr-fr": "Inertie du bac", - "uk-ua": "Інерція панорами", - "de-ch": "Schwenkträgheit", - "pt-br": "Inércia da panela", + 'en-us': 'Pan inertia', + 'ru-ru': 'Инерция пан', + 'es-es': 'Inercia de la sartén', + 'fr-fr': 'Inertie du bac', + 'uk-ua': 'Інерція панорами', + 'de-ch': 'Schwenkträgheit', + 'pt-br': 'Inércia da panela', }, mouseDrags: { - "en-us": "Mouse drags", - "ru-ru": "Перетаскивание мышью", - "es-es": "El ratón arrastra", - "uk-ua": "Виділіть відповідний підрядок", - "de-ch": "Maus zieht", - "fr-fr": "Mettre en surbrillance la sous-chaîne correspondante", - "pt-br": "Arrastos do mouse", + 'en-us': 'Mouse drags', + 'ru-ru': 'Перетаскивание мышью', + 'es-es': 'El ratón arrastra', + 'uk-ua': 'Виділіть відповідний підрядок', + 'de-ch': 'Maus zieht', + 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', + 'pt-br': 'Arrastos do mouse', }, scrollWheelZoom: { - "en-us": "Scroll wheel zoom", - "ru-ru": "Масштабирование с помощью колеса прокрутки", - "es-es": "Zoom con rueda de desplazamiento", - "fr-fr": "Zoom avec la molette de défilement", - "uk-ua": "Масштаб колеса прокрутки", - "de-ch": "Scrollrad-Zoom", - "pt-br": "Zoom da roda de rolagem", + 'en-us': 'Scroll wheel zoom', + 'ru-ru': 'Масштабирование с помощью колеса прокрутки', + 'es-es': 'Zoom con rueda de desplazamiento', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Scrollrad-Zoom', + 'pt-br': 'Zoom da roda de rolagem', }, flexibleColumnWidth: { - "en-us": "Flexible column width", - "ru-ru": "Гибкая ширина столбца", - "es-es": "Ancho de columna flexible", - "fr-fr": "Largeur de colonne flexible", - "uk-ua": "Гнучка ширина колонки", - "de-ch": "Flexible Spaltenbreite", - "pt-br": "Largura de coluna flexível", + 'en-us': 'Flexible column width', + 'ru-ru': 'Гибкая ширина столбца', + 'es-es': 'Ancho de columna flexible', + 'fr-fr': 'Largeur de colonne flexible', + 'uk-ua': 'Гнучка ширина колонки', + 'de-ch': 'Flexible Spaltenbreite', + 'pt-br': 'Largura de coluna flexível', }, flexibleSubGridColumnWidth: { - "en-us": "Flexible subview grid column width", - "ru-ru": "Гибкая ширина столбца сетки подпредставлений", - "es-es": "Ancho de columna de cuadrícula de subvista flexible", - "fr-fr": "Largeur de colonne de grille de sous-vue flexible", - "uk-ua": "Гнучка ширина стовпця сітки вкладеного перегляду", - "de-ch": "Flexible Spaltenbreite des Unteransichtsrasters", - "pt-br": "Largura flexível da coluna da grade de subvisualização", + 'en-us': 'Flexible subview grid column width', + 'ru-ru': 'Гибкая ширина столбца сетки подпредставлений', + 'es-es': 'Ancho de columna de cuadrícula de subvista flexible', + 'fr-fr': 'Largeur de colonne de grille de sous-vue flexible', + 'uk-ua': 'Гнучка ширина стовпця сітки вкладеного перегляду', + 'de-ch': 'Flexible Spaltenbreite des Unteransichtsrasters', + 'pt-br': 'Largura flexível da coluna da grade de subvisualização', }, closeOnEsc: { - "en-us": "Close on ESC key press", - "ru-ru": "Закрыть нажатием клавиши ESC", - "es-es": "Cerrar al presionar la tecla ESC", - "fr-fr": "Icône et nom de la table", - "uk-ua": "Закриття натисканням клавіші ESC", - "de-ch": "Schließen durch Drücken der Taste ESC", - "pt-br": "Fechar ao pressionar a tecla ESC", + 'en-us': 'Close on ESC key press', + 'ru-ru': 'Закрыть нажатием клавиши ESC', + 'es-es': 'Cerrar al presionar la tecla ESC', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Закриття натисканням клавіші ESC', + 'de-ch': 'Schließen durch Drücken der Taste ESC', + 'pt-br': 'Fechar ao pressionar a tecla ESC', }, closeOnOutsideClick: { - "en-us": "Close on outside click", - "ru-ru": "Закрытие по внешнему щелчку", - "es-es": "Cerrar al hacer clic desde fuera", - "fr-fr": "Fermer sur clic extérieur", - "uk-ua": "Закрийте зовнішнім клацанням", - "de-ch": "Schließen durch Klicken von außen", - "pt-br": "Fechar com clique externo", + 'en-us': 'Close on outside click', + 'ru-ru': 'Закрытие по внешнему щелчку', + 'es-es': 'Cerrar al hacer clic desde fuera', + 'fr-fr': 'Fermer sur clic extérieur', + 'uk-ua': 'Закрийте зовнішнім клацанням', + 'de-ch': 'Schließen durch Klicken von außen', + 'pt-br': 'Fechar com clique externo', }, specifyNetworkBadge: { - "en-us": "Specify Network Badge", - "ru-ru": "Укажите сетевой значок", - "es-es": "Especificar la insignia de red", - "fr-fr": "Spécifier le badge réseau", - "uk-ua": "Укажіть значок мережі", - "de-ch": "Netzwerk-Badge angeben", - "pt-br": "Especificar emblema de rede", + 'en-us': 'Specify Network Badge', + 'ru-ru': 'Укажите сетевой значок', + 'es-es': 'Especificar la insignia de red', + 'fr-fr': 'Spécifier le badge réseau', + 'uk-ua': 'Укажіть значок мережі', + 'de-ch': 'Netzwerk-Badge angeben', + 'pt-br': 'Especificar emblema de rede', }, useAccessibleFullDatePicker: { - "en-us": "Use accessible full date picker", - "ru-ru": "Используйте доступный полный выбор даты", - "es-es": "Utilice el selector de fecha completo y accesible", - "fr-fr": "Utiliser un sélecteur de date complet accessible", - "uk-ua": "Використовуйте доступний повний засіб вибору дати", - "de-ch": "Verwenden Sie eine barrierefreie Datumsauswahl", - "pt-br": "Use o seletor de data completo acessível", + 'en-us': 'Use accessible full date picker', + 'ru-ru': 'Используйте доступный полный выбор даты', + 'es-es': 'Utilice el selector de fecha completo y accesible', + 'fr-fr': 'Utiliser un sélecteur de date complet accessible', + 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', + 'de-ch': 'Verwenden Sie eine barrierefreie Datumsauswahl', + 'pt-br': 'Use o seletor de data completo acessível', }, useAccessibleMonthPicker: { - "en-us": "Use accessible month picker", - "ru-ru": "Используйте доступный выбор месяца", - "es-es": "Utilice el selector de meses accesible", - "fr-fr": "Utiliser le sélecteur de mois accessible", - "uk-ua": "Використовуйте доступний засіб вибору місяця", - "de-ch": "Verwenden Sie die barrierefreie Monatsauswahl", - "pt-br": "Use o seletor de meses acessível", + 'en-us': 'Use accessible month picker', + 'ru-ru': 'Используйте доступный выбор месяца', + 'es-es': 'Utilice el selector de meses accesible', + 'fr-fr': 'Utiliser le sélecteur de mois accessible', + 'uk-ua': 'Використовуйте доступний засіб вибору місяця', + 'de-ch': 'Verwenden Sie die barrierefreie Monatsauswahl', + 'pt-br': 'Use o seletor de meses acessível', }, rightAlignNumberFields: { - "en-us": "Right-Justify numeric fields", - "ru-ru": "Выравнивание числовых полей по правому краю", - "es-es": "Justificar a la derecha los campos numéricos", - "fr-fr": "Justifier à droite les champs numériques", - "uk-ua": "Вирівнювання по правому краю числових полів", - "de-ch": "Rechtsbündige Ausrichtung numerischer Felder", - "pt-br": "Justificar à direita campos numéricos", + 'en-us': 'Right-Justify numeric fields', + 'ru-ru': 'Выравнивание числовых полей по правому краю', + 'es-es': 'Justificar a la derecha los campos numéricos', + 'fr-fr': 'Justifier à droite les champs numériques', + 'uk-ua': 'Вирівнювання по правому краю числових полів', + 'de-ch': 'Rechtsbündige Ausrichtung numerischer Felder', + 'pt-br': 'Justificar à direita campos numéricos', }, roundedCorners: { - "en-us": "Rounded corners", - "ru-ru": "Закругленные углы", - "es-es": "esquinas redondeadas", - "fr-fr": "Coins arrondis", - "uk-ua": "Заокруглені кути", - "de-ch": "Abgerundete Ecken", - "pt-br": "Cantos arredondados", + 'en-us': 'Rounded corners', + 'ru-ru': 'Закругленные углы', + 'es-es': 'esquinas redondeadas', + 'fr-fr': 'Coins arrondis', + 'uk-ua': 'Заокруглені кути', + 'de-ch': 'Abgerundete Ecken', + 'pt-br': 'Cantos arredondados', }, showSubviewBorders: { - "en-us": "Show borders around subviews", - "de-ch": "Rahmen um Unteransichten anzeigen", - "es-es": "Mostrar bordes alrededor de las subvistas", - "fr-fr": "Afficher les bordures autour des sous-vues", - "pt-br": "Mostrar bordas ao redor das subvisualizações", - "ru-ru": "Показывать границы вокруг подпредставлений", - "uk-ua": "Показати межі навколо підвидів", + 'en-us': 'Show borders around subviews', + 'de-ch': 'Rahmen um Unteransichten anzeigen', + 'es-es': 'Mostrar bordes alrededor de las subvistas', + 'fr-fr': 'Afficher les bordures autour des sous-vues', + 'pt-br': 'Mostrar bordas ao redor das subvisualizações', + 'ru-ru': 'Показывать границы вокруг подпредставлений', + 'uk-ua': 'Показати межі навколо підвидів', }, limitMaxFieldWidth: { - "en-us": "Limit max field width", - "ru-ru": "Ограничить максимальную ширину поля", - "es-es": "Limitar el ancho máximo del campo", - "fr-fr": "Limiter la largeur maximale du champ", - "uk-ua": "Обмеження максимальної ширини поля", - "de-ch": "Maximale Feldbreite begrenzen", - "pt-br": "Limite máximo de largura do campo", + 'en-us': 'Limit max field width', + 'ru-ru': 'Ограничить максимальную ширину поля', + 'es-es': 'Limitar el ancho máximo del campo', + 'fr-fr': 'Limiter la largeur maximale du champ', + 'uk-ua': 'Обмеження максимальної ширини поля', + 'de-ch': 'Maximale Feldbreite begrenzen', + 'pt-br': 'Limite máximo de largura do campo', }, condenseQueryResults: { - "en-us": "Condense query results", - "ru-ru": "Сжать результаты запроса", - "es-es": "Condensar los resultados de la consulta", - "fr-fr": "Condenser les résultats de la requête", - "uk-ua": "Згорнути результати запиту", - "de-ch": "Abfrageergebnisse verdichten", - "pt-br": "Condensar resultados da consulta", + 'en-us': 'Condense query results', + 'ru-ru': 'Сжать результаты запроса', + 'es-es': 'Condensar los resultados de la consulta', + 'fr-fr': 'Condenser les résultats de la requête', + 'uk-ua': 'Згорнути результати запиту', + 'de-ch': 'Abfrageergebnisse verdichten', + 'pt-br': 'Condensar resultados da consulta', }, blurContentBehindDialog: { - "en-us": "Blur content behind the dialog", - "ru-ru": "Размытие содержимого за диалогом", - "es-es": "Desenfocar el contenido detrás del diálogo", - "fr-fr": "Flou le contenu derrière la boîte de dialogue", - "uk-ua": "Розмити вміст за діалоговим вікном", - "de-ch": "Inhalte hinter dem Dialog verwischen", - "pt-br": "Desfocar o conteúdo atrás do diálogo", + 'en-us': 'Blur content behind the dialog', + 'ru-ru': 'Размытие содержимого за диалогом', + 'es-es': 'Desenfocar el contenido detrás del diálogo', + 'fr-fr': 'Flou le contenu derrière la boîte de dialogue', + 'uk-ua': 'Розмити вміст за діалоговим вікном', + 'de-ch': 'Inhalte hinter dem Dialog verwischen', + 'pt-br': 'Desfocar o conteúdo atrás do diálogo', }, collectionSortOrderDescription: { - "en-us": "This determines the visual order of collections.", - "ru-ru": "Это определяет визуальный порядок коллекций.", - "es-es": "Esto determina el orden visual de las colecciones.", - "fr-fr": "Ceci détermine l'ordre visuel des collections.", - "uk-ua": "Це визначає візуальний порядок колекцій.", - "de-ch": "Dies bestimmt die visuelle Reihenfolge der Sammlungen.", - "pt-br": "Isso determina a ordem visual das coleções.", + 'en-us': 'This determines the visual order of collections.', + 'ru-ru': 'Это определяет визуальный порядок коллекций.', + 'es-es': 'Esto determina el orden visual de las colecciones.', + 'fr-fr': "Ceci détermine l'ordre visuel des collections.", + 'uk-ua': 'Це визначає візуальний порядок колекцій.', + 'de-ch': 'Dies bestimmt die visuelle Reihenfolge der Sammlungen.', + 'pt-br': 'Isso determina a ordem visual das coleções.', }, recordSetRecordToOpen: { - "en-us": "Record to open by default", - "ru-ru": "Запись для открытия по умолчанию", - "es-es": "Registro para abrir por defecto", - "fr-fr": "Enregistrement à ouvrir par défaut", - "uk-ua": "Запис відкривається за умовчанням", - "de-ch": "Standardmäßig zu öffnender Datensatz", - "pt-br": "Gravar para abrir por padrão", + 'en-us': 'Record to open by default', + 'ru-ru': 'Запись для открытия по умолчанию', + 'es-es': 'Registro para abrir por defecto', + 'fr-fr': 'Enregistrement à ouvrir par défaut', + 'uk-ua': 'Запис відкривається за умовчанням', + 'de-ch': 'Standardmäßig zu öffnender Datensatz', + 'pt-br': 'Gravar para abrir por padrão', }, altClickToSupressNewTab: { - "en-us": - "{altKeyName:string}+Click to suppress new tab", - "ru-ru": - "{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку", - "es-es": - "{altKeyName:string}+Haga clic en para suprimir la nueva pestaña", - "fr-fr": - "{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet", - "uk-ua": - "{altKeyName:string}+Натисніть , щоб закрити нову вкладку", - "de-ch": - "{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken", - "pt-br": - "{altKeyName:string}+Clique em para suprimir a nova guia", + 'en-us': + '{altKeyName:string}+Click to suppress new tab', + 'ru-ru': + '{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку', + 'es-es': + '{altKeyName:string}+Haga clic en para suprimir la nueva pestaña', + 'fr-fr': + '{altKeyName:string}+Cliquez sur pour supprimer le nouvel onglet', + 'uk-ua': + '{altKeyName:string}+Натисніть , щоб закрити нову вкладку', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf, um neue Registerkarten zu unterdrücken', + 'pt-br': + '{altKeyName:string}+Clique em para suprimir a nova guia', }, altClickToSupressNewTabDescription: { - "en-us": - "{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.", - "ru-ru": - "{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.", - "es-es": - "{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.", - "fr-fr": "Utiliser le sélecteur de mois accessible.", - "uk-ua": - "{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.", - "de-ch": - "{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.", - "pt-br": - "{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.", + 'en-us': + '{altKeyName:string}+Click a link that usually opens in a new tab to open it in the current tab.', + 'ru-ru': + '{altKeyName:string}+Нажмите на ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.', + 'es-es': + '{altKeyName:string}+Haga clic en un enlace que normalmente se abre en una nueva pestaña para abrirlo en la pestaña actual.', + 'fr-fr': 'Utiliser le sélecteur de mois accessible.', + 'uk-ua': + '{altKeyName:string}+Натисніть посилання, яке зазвичай відкривається в новій вкладці, щоб відкрити його в поточній вкладці.', + 'de-ch': + '{altKeyName:string}+Klicken Sie auf einen Link, der normalerweise in einem neuen Tab geöffnet wird, um ihn im aktuellen Tab zu öffnen.', + 'pt-br': + '{altKeyName:string}+Clique em um link que geralmente abre em uma nova aba para abri-lo na aba atual.', }, makeFormDialogsModal: { - "en-us": "Make form dialogs gray out the background", - "ru-ru": "Сделать фон диалоговых окон серым", - "es-es": - "Hacer que los cuadros de diálogo del formulario tengan el fondo en gris", - "fr-fr": + 'en-us': 'Make form dialogs gray out the background', + 'ru-ru': 'Сделать фон диалоговых окон серым', + 'es-es': + 'Hacer que los cuadros de diálogo del formulario tengan el fondo en gris', + 'fr-fr': "Rendre les boîtes de dialogue de formulaire grisées sur l'arrière-plan", - "uk-ua": "Зробіть діалогові вікна форми сірими фоном", - "de-ch": "Den Hintergrund von Formulardialogen ausgrauen", - "pt-br": - "Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado", + 'uk-ua': 'Зробіть діалогові вікна форми сірими фоном', + 'de-ch': 'Den Hintergrund von Formulardialogen ausgrauen', + 'pt-br': + 'Faça com que as caixas de diálogo do formulário fiquem com o fundo acinzentado', }, autoScrollTree: { - "en-us": "Auto scroll tree to focused node", - "ru-ru": "Автоматическая прокрутка дерева к выбранному узлу", - "es-es": "Desplazamiento automático del árbol al nodo enfocado", - "fr-fr": "Arbre de défilement automatique vers le nœud ciblé", - "uk-ua": "Автоматичне прокручування дерева до виділеного вузла", - "de-ch": "Automatisches Scrollen des Baums zum fokussierten Knoten", - "pt-br": "Rolagem automática da árvore para o nó em foco", + 'en-us': 'Auto scroll tree to focused node', + 'ru-ru': 'Автоматическая прокрутка дерева к выбранному узлу', + 'es-es': 'Desplazamiento automático del árbol al nodo enfocado', + 'fr-fr': 'Arbre de défilement automatique vers le nœud ciblé', + 'uk-ua': 'Автоматичне прокручування дерева до виділеного вузла', + 'de-ch': 'Automatisches Scrollen des Baums zum fokussierten Knoten', + 'pt-br': 'Rolagem automática da árvore para o nó em foco', }, sortByField: { - "en-us": "Order By Field", - "de-ch": "Nach Feld sortieren", - "es-es": "Ordenar por campo", - "fr-fr": "Trier par champ", - "pt-br": "Ordenar por campo", - "ru-ru": "Сортировать по полю", - "uk-ua": "Сортувати за полем", + 'en-us': 'Order By Field', + 'de-ch': 'Nach Feld sortieren', + 'es-es': 'Ordenar por campo', + 'fr-fr': 'Trier par champ', + 'pt-br': 'Ordenar por campo', + 'ru-ru': 'Сортировать по полю', + 'uk-ua': 'Сортувати за полем', }, lineWrap: { - "en-us": "Line wrap", - "ru-ru": "Перенос строки", - "es-es": "Ajuste de línea", - "fr-fr": "Retour à la ligne", - "uk-ua": "Обтікання лініями", - "de-ch": "Zeilenumbruch", - "pt-br": "Quebra de linha", + 'en-us': 'Line wrap', + 'ru-ru': 'Перенос строки', + 'es-es': 'Ajuste de línea', + 'fr-fr': 'Retour à la ligne', + 'uk-ua': 'Обтікання лініями', + 'de-ch': 'Zeilenumbruch', + 'pt-br': 'Quebra de linha', }, indentSize: { - "en-us": "Indent size", - "ru-ru": "Размер отступа", - "es-es": "Tamaño de sangría", - "fr-fr": "Taille du retrait", - "uk-ua": "Розмір відступу", - "de-ch": "Einzugsgröße", - "pt-br": "Tamanho do recuo", + 'en-us': 'Indent size', + 'ru-ru': 'Размер отступа', + 'es-es': 'Tamaño de sangría', + 'fr-fr': 'Taille du retrait', + 'uk-ua': 'Розмір відступу', + 'de-ch': 'Einzugsgröße', + 'pt-br': 'Tamanho do recuo', }, indentWithTab: { - "en-us": "Indent with Tab", - "ru-ru": "Отступ с помощью Tab", - "es-es": "Sangría con Tab", - "fr-fr": "Indenter avec Tabulation", - "uk-ua": "Відступ із Tab", - "de-ch": "Einrücken mit Tab", - "pt-br": "Recuo com Tab", + 'en-us': 'Indent with Tab', + 'ru-ru': 'Отступ с помощью Tab', + 'es-es': 'Sangría con Tab', + 'fr-fr': 'Indenter avec Tabulation', + 'uk-ua': 'Відступ із Tab', + 'de-ch': 'Einrücken mit Tab', + 'pt-br': 'Recuo com Tab', }, formHeaderFormat: { - "en-us": "Form header format", - "ru-ru": "Формат заголовка формы", - "es-es": "Formato del encabezado del formulario", - "fr-fr": "Format d'en-tête de formulaire", - "uk-ua": "Формат заголовка форми", - "de-ch": "Formularkopfformat", - "pt-br": "Formato do cabeçalho do formulário", + 'en-us': 'Form header format', + 'ru-ru': 'Формат заголовка формы', + 'es-es': 'Formato del encabezado del formulario', + 'fr-fr': "Format d'en-tête de formulaire", + 'uk-ua': 'Формат заголовка форми', + 'de-ch': 'Formularkopfformat', + 'pt-br': 'Formato do cabeçalho do formulário', }, iconAndTableName: { - "en-us": "Icon and table name", - "ru-ru": "Значок и название таблицы", - "es-es": "Icono y nombre de la tabla", - "fr-fr": "Icône et nom de la table", - "uk-ua": "Значок і назва таблиці", - "de-ch": "Symbol und Tabellenname", - "pt-br": "Ícone e nome da tabela", + 'en-us': 'Icon and table name', + 'ru-ru': 'Значок и название таблицы', + 'es-es': 'Icono y nombre de la tabla', + 'fr-fr': 'Icône et nom de la table', + 'uk-ua': 'Значок і назва таблиці', + 'de-ch': 'Symbol und Tabellenname', + 'pt-br': 'Ícone e nome da tabela', }, tableIcon: { - "en-us": "Table icon", - "ru-ru": "Значок таблицы", - "es-es": "Icono de tabla", - "fr-fr": "Icône de tableau", - "uk-ua": "Значок таблиці", - "de-ch": "Tabellensymbol", - "pt-br": "Ícone de tabela", + 'en-us': 'Table icon', + 'ru-ru': 'Значок таблицы', + 'es-es': 'Icono de tabla', + 'fr-fr': 'Icône de tableau', + 'uk-ua': 'Значок таблиці', + 'de-ch': 'Tabellensymbol', + 'pt-br': 'Ícone de tabela', }, maxHeight: { - "en-us": "Max height", - "ru-ru": "Максимальная высота", - "es-es": "Altura máxima", - "fr-fr": "hauteur maximum", - "uk-ua": "Максимальна висота", - "de-ch": "Maximale Höhe", - "pt-br": "Altura máxima", + 'en-us': 'Max height', + 'ru-ru': 'Максимальная высота', + 'es-es': 'Altura máxima', + 'fr-fr': 'hauteur maximum', + 'uk-ua': 'Максимальна висота', + 'de-ch': 'Maximale Höhe', + 'pt-br': 'Altura máxima', }, autoComplete: { - "en-us": "Auto complete", - "ru-ru": "Автозаполнение", - "es-es": "Autocompletar", - "fr-fr": + 'en-us': 'Auto complete', + 'ru-ru': 'Автозаполнение', + 'es-es': 'Autocompletar', + 'fr-fr': "Détermine les légendes des champs, les notes d'utilisation et les légendes des tableaux", - "uk-ua": - "Визначає підписи полів, примітки щодо використання та підписи таблиць", - "de-ch": "Autovervollständigung", - "pt-br": "Preenchimento automático", + 'uk-ua': + 'Визначає підписи полів, примітки щодо використання та підписи таблиць', + 'de-ch': 'Autovervollständigung', + 'pt-br': 'Preenchimento automático', }, searchCaseSensitive: { - "en-us": "Case-sensitive search", - "es-es": "Búsqueda que distingue entre mayúsculas y minúsculas", - "fr-fr": "Recherche sensible à la casse", - "uk-ua": "Пошук з урахуванням регістру", - "de-ch": "Groß- und Kleinschreibung beachten", - "ru-ru": "Поиск с учетом регистра", - "pt-br": "Pesquisa com diferenciação entre maiúsculas e minúsculas", + 'en-us': 'Case-sensitive search', + 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', + 'fr-fr': 'Recherche sensible à la casse', + 'uk-ua': 'Пошук з урахуванням регістру', + 'de-ch': 'Groß- und Kleinschreibung beachten', + 'ru-ru': 'Поиск с учетом регистра', + 'pt-br': 'Pesquisa com diferenciação entre maiúsculas e minúsculas', }, searchField: { - "en-us": "Search Field", - "ru-ru": "Поле поиска", - "es-es": "Campo de búsqueda", - "fr-fr": "Champ de recherche", - "uk-ua": "Поле пошуку", - "de-ch": "Suchfeld", - "pt-br": "Campo de pesquisa", + 'en-us': 'Search Field', + 'ru-ru': 'Поле поиска', + 'es-es': 'Campo de búsqueda', + 'fr-fr': 'Champ de recherche', + 'uk-ua': 'Поле пошуку', + 'de-ch': 'Suchfeld', + 'pt-br': 'Campo de pesquisa', }, createInteractions: { - "en-us": "Creating an interaction", - "ru-ru": "Создание взаимодействия", - "es-es": "Creando una interacción", - "fr-fr": "Créer une interaction", - "uk-ua": "Створення взаємодії", - "de-ch": "Erstellen einer Interaktion", - "pt-br": "Criando uma interação", + 'en-us': 'Creating an interaction', + 'ru-ru': 'Создание взаимодействия', + 'es-es': 'Creando una interacción', + 'fr-fr': 'Créer une interaction', + 'uk-ua': 'Створення взаємодії', + 'de-ch': 'Erstellen einer Interaktion', + 'pt-br': 'Criando uma interação', }, useSpaceAsDelimiter: { - "en-us": "Use space as delimiter", - "ru-ru": "Используйте пробел в качестве разделителя", - "es-es": "Utilice el espacio como delimitador", - "fr-fr": "Utiliser l'espace comme délimiteur", - "uk-ua": "Використовуйте пробіл як роздільник", - "de-ch": "Leerzeichen als Trennzeichen verwenden", - "pt-br": "Use espaço como delimitador", + 'en-us': 'Use space as delimiter', + 'ru-ru': 'Используйте пробел в качестве разделителя', + 'es-es': 'Utilice el espacio como delimitador', + 'fr-fr': "Utiliser l'espace comme délimiteur", + 'uk-ua': 'Використовуйте пробіл як роздільник', + 'de-ch': 'Leerzeichen als Trennzeichen verwenden', + 'pt-br': 'Use espaço como delimitador', }, useCommaAsDelimiter: { - "en-us": "Use comma as delimiter", - "ru-ru": "Используйте запятую в качестве разделителя", - "es-es": "Utilice la coma como delimitador", - "fr-fr": "Utiliser la virgule comme délimiteur", - "uk-ua": "Використовуйте кому як роздільник", - "de-ch": "Verwenden Sie Kommas als Trennzeichen.", - "pt-br": "Use vírgula como delimitador", + 'en-us': 'Use comma as delimiter', + 'ru-ru': 'Используйте запятую в качестве разделителя', + 'es-es': 'Utilice la coma como delimitador', + 'fr-fr': 'Utiliser la virgule comme délimiteur', + 'uk-ua': 'Використовуйте кому як роздільник', + 'de-ch': 'Verwenden Sie Kommas als Trennzeichen.', + 'pt-br': 'Use vírgula como delimitador', }, useNewLineAsDelimiter: { - "en-us": "Use new line as delimiter", - "ru-ru": "Использовать новую строку в качестве разделителя", - "es-es": "Utilice nueva línea como delimitador", - "fr-fr": "Utiliser une nouvelle ligne comme délimiteur", - "uk-ua": "Використовуйте новий рядок як роздільник", - "de-ch": "Neue Zeile als Trennzeichen verwenden", - "pt-br": "Use nova linha como delimitador", + 'en-us': 'Use new line as delimiter', + 'ru-ru': 'Использовать новую строку в качестве разделителя', + 'es-es': 'Utilice nueva línea como delimitador', + 'fr-fr': 'Utiliser une nouvelle ligne comme délimiteur', + 'uk-ua': 'Використовуйте новий рядок як роздільник', + 'de-ch': 'Neue Zeile als Trennzeichen verwenden', + 'pt-br': 'Use nova linha como delimitador', }, useCustomDelimiters: { - "en-us": "Use custom delimiters", - "ru-ru": "Используйте пользовательские разделители", - "es-es": "Utilice delimitadores personalizados", - "fr-fr": "Utiliser des délimiteurs personnalisés", - "uk-ua": "Використовуйте спеціальні роздільники", - "de-ch": "Benutzerdefinierte Trennzeichen verwenden", - "pt-br": "Use delimitadores personalizados", + 'en-us': 'Use custom delimiters', + 'ru-ru': 'Используйте пользовательские разделители', + 'es-es': 'Utilice delimitadores personalizados', + 'fr-fr': 'Utiliser des délimiteurs personnalisés', + 'uk-ua': 'Використовуйте спеціальні роздільники', + 'de-ch': 'Benutzerdefinierte Trennzeichen verwenden', + 'pt-br': 'Use delimitadores personalizados', }, useCustomDelimitersDescription: { - "en-us": - "A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.", - "ru-ru": - "Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.", - "es-es": - "Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.", - "fr-fr": - "Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.", - "uk-ua": - "Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.", - "de-ch": - "Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.", - "pt-br": - "Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.", + 'en-us': + 'A list of delimiters to use, in addition to the ones defined above. Put one delimiter per line.', + 'ru-ru': + 'Список разделителей, которые можно использовать в дополнение к указанным выше. Используйте по одному разделителю на строку.', + 'es-es': + 'Una lista de delimitadores para usar, además de los definidos anteriormente. Coloque un delimitador por línea.', + 'fr-fr': + 'Une liste de délimiteurs à utiliser, en plus de ceux définis ci-dessus. Mettez un délimiteur par ligne.', + 'uk-ua': + 'Список розділювачів для використання на додаток до визначених вище. Поставте один роздільник на рядок.', + 'de-ch': + 'Eine Liste der zu verwendenden Trennzeichen zusätzlich zu den oben definierten. Geben Sie pro Zeile ein Trennzeichen ein.', + 'pt-br': + 'Uma lista de delimitadores a serem usados, além dos definidos acima. Coloque um delimitador por linha.', }, detectAutomaticallyDescription: { - "en-us": "Detect automatically based on catalog number format.", - "ru-ru": "Автоматическое определение на основе формата каталожного номера.", - "es-es": - "Detectar automáticamente según el formato del número de catálogo.", - "fr-fr": - "Détecter automatiquement en fonction du format du numéro de catalogue.", - "uk-ua": "Визначати автоматично на основі формату номера каталогу.", - "de-ch": "Automatische Erkennung basierend auf dem Katalognummernformat.", - "pt-br": - "Detecte automaticamente com base no formato do número de catálogo.", + 'en-us': 'Detect automatically based on catalog number format.', + 'ru-ru': 'Автоматическое определение на основе формата каталожного номера.', + 'es-es': + 'Detectar automáticamente según el formato del número de catálogo.', + 'fr-fr': + 'Détecter automatiquement en fonction du format du numéro de catalogue.', + 'uk-ua': 'Визначати автоматично на основі формату номера каталогу.', + 'de-ch': 'Automatische Erkennung basierend auf dem Katalognummernformat.', + 'pt-br': + 'Detecte automaticamente com base no formato do número de catálogo.', }, use: { - comment: "Verb", - "en-us": "Use", - "ru-ru": "Использовать", - "es-es": "Usar", - "fr-fr": "Utiliser", - "uk-ua": "використання", - "de-ch": "Verwenden", - "pt-br": "Usar", + comment: 'Verb', + 'en-us': 'Use', + 'ru-ru': 'Использовать', + 'es-es': 'Usar', + 'fr-fr': 'Utiliser', + 'uk-ua': 'використання', + 'de-ch': 'Verwenden', + 'pt-br': 'Usar', }, dontUse: { - "en-us": "Don’t use", - "ru-ru": "Не использовать", - "es-es": "No utilizar", - "fr-fr": "Zoom avec la molette de défilement", - "uk-ua": "Масштаб колеса прокрутки", - "de-ch": "Nicht verwenden", - "pt-br": "Não use", + 'en-us': 'Don’t use', + 'ru-ru': 'Не использовать', + 'es-es': 'No utilizar', + 'fr-fr': 'Zoom avec la molette de défilement', + 'uk-ua': 'Масштаб колеса прокрутки', + 'de-ch': 'Nicht verwenden', + 'pt-br': 'Não use', }, position: { - "en-us": "Position", - "es-es": "Posición", - "fr-fr": "Position", - "ru-ru": "Позиция", - "uk-ua": "Позиція", - "de-ch": "Position", - "pt-br": "Posição", + 'en-us': 'Position', + 'es-es': 'Posición', + 'fr-fr': 'Position', + 'ru-ru': 'Позиция', + 'uk-ua': 'Позиція', + 'de-ch': 'Position', + 'pt-br': 'Posição', }, top: { - "en-us": "Top", - "es-es": "Arriba", - "fr-fr": "Haut", - "ru-ru": "Вершина", - "uk-ua": "Топ", - "de-ch": "Spitze", - "pt-br": "Principal", + 'en-us': 'Top', + 'es-es': 'Arriba', + 'fr-fr': 'Haut', + 'ru-ru': 'Вершина', + 'uk-ua': 'Топ', + 'de-ch': 'Spitze', + 'pt-br': 'Principal', }, bottom: { - "en-us": "Bottom", - "es-es": "Abajo", - "ru-ru": "Нижний", - "uk-ua": "Дно", - "de-ch": "Unten", - "fr-fr": "Bas", - "pt-br": "Fundo", + 'en-us': 'Bottom', + 'es-es': 'Abajo', + 'ru-ru': 'Нижний', + 'uk-ua': 'Дно', + 'de-ch': 'Unten', + 'fr-fr': 'Bas', + 'pt-br': 'Fundo', }, left: { - "en-us": "Left", - "es-es": "Izquierda", - "fr-fr": "Gauche", - "ru-ru": "Левый", - "uk-ua": "Ліворуч", - "de-ch": "Links", - "pt-br": "Esquerda", + 'en-us': 'Left', + 'es-es': 'Izquierda', + 'fr-fr': 'Gauche', + 'ru-ru': 'Левый', + 'uk-ua': 'Ліворуч', + 'de-ch': 'Links', + 'pt-br': 'Esquerda', }, right: { - "en-us": "Right", - "es-es": "Bien", - "fr-fr": "Droite", - "ru-ru": "Верно", - "uk-ua": "правильно", - "de-ch": "Rechts", - "pt-br": "Certo", + 'en-us': 'Right', + 'es-es': 'Bien', + 'fr-fr': 'Droite', + 'ru-ru': 'Верно', + 'uk-ua': 'правильно', + 'de-ch': 'Rechts', + 'pt-br': 'Certo', }, showUnsavedIndicator: { - "en-us": "Show unsaved changes indicator", - "ru-ru": "Показать индикатор несохраненных изменений", - "es-es": "Mostrar indicador de cambios no guardados", - "fr-fr": "Afficher l'indicateur de modifications non enregistrées", - "uk-ua": "Показати індикатор незбережених змін", - "de-ch": "Indikator für nicht gespeicherte Änderungen anzeigen", - "pt-br": "Mostrar indicador de alterações não salvas", + 'en-us': 'Show unsaved changes indicator', + 'ru-ru': 'Показать индикатор несохраненных изменений', + 'es-es': 'Mostrar indicador de cambios no guardados', + 'fr-fr': "Afficher l'indicateur de modifications non enregistrées", + 'uk-ua': 'Показати індикатор незбережених змін', + 'de-ch': 'Indikator für nicht gespeicherte Änderungen anzeigen', + 'pt-br': 'Mostrar indicador de alterações não salvas', }, showUnsavedIndicatorDescription: { - "en-us": + 'en-us': 'Show an "*" in the tab title when there are unsaved changes in the current tab.', - "es-es": + 'es-es': 'Mostrar un "*" en el título de la pestaña cuando haya cambios sin guardar en la pestaña actual.', - "fr-fr": + 'fr-fr': "Afficher un \"*\" dans le titre de l'onglet lorsqu'il y a des modifications non enregistrées dans l'onglet actuel.", - "ru-ru": - "Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.", - "uk-ua": - "Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.", - "de-ch": - "Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.", - "pt-br": + 'ru-ru': + 'Отображать «*» в заголовке вкладки, если на текущей вкладке есть несохраненные изменения.', + 'uk-ua': + 'Показувати «*» у заголовку вкладки, якщо в поточній вкладці є незбережені зміни.', + 'de-ch': + 'Zeigen Sie im Registerkartentitel ein „*“ an, wenn in der aktuellen Registerkarte nicht gespeicherte Änderungen vorhanden sind.', + 'pt-br': 'Exibir um "*" no título da aba quando houver alterações não salvas na aba atual.', }, autoPopulateDescription: { - "en-us": - "Auto populate the merged record with values from duplicates when opening the merging dialog.", - "ru-ru": - "Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.", - "de-ch": - "Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.", - "es-es": - "Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.", - "fr-fr": + 'en-us': + 'Auto populate the merged record with values from duplicates when opening the merging dialog.', + 'ru-ru': + 'Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.', + 'de-ch': + 'Füllen Sie den zusammengeführten Datensatz beim Öffnen des Zusammenführungsdialogs automatisch mit Werten aus Duplikaten.', + 'es-es': + 'Rellene automáticamente el registro fusionado con valores de duplicados al abrir el cuadro de diálogo de fusión.', + 'fr-fr': "Remplir automatiquement l'enregistrement fusionné avec les valeurs des doublons lors de l'ouverture de la boîte de dialogue de fusion.", - "uk-ua": - "Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.", - "pt-br": - "Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.", + 'uk-ua': + 'Автоматичне заповнення об’єднаного запису значеннями з дублікатів під час відкриття діалогового вікна об’єднання.', + 'pt-br': + 'Preencha automaticamente o registro mesclado com valores de duplicatas ao abrir a caixa de diálogo de mesclagem.', }, autoCreateVariants: { - "en-us": "Automatically create {agentVariantTable:string} records", - "ru-ru": "Автоматически создавать записи {agentVariantTable:string}", - "de-ch": "{agentVariantTable:string}-Datensätze automatisch erstellen", - "es-es": "Crear automáticamente registros {agentVariantTable:string}", - "fr-fr": - "Créer automatiquement des enregistrements {agentVariantTable:string}", - "uk-ua": "Автоматично створювати записи {agentVariantTable:string}", - "pt-br": "Criar automaticamente registros {agentVariantTable:string}", + 'en-us': 'Automatically create {agentVariantTable:string} records', + 'ru-ru': 'Автоматически создавать записи {agentVariantTable:string}', + 'de-ch': '{agentVariantTable:string}-Datensätze automatisch erstellen', + 'es-es': 'Crear automáticamente registros {agentVariantTable:string}', + 'fr-fr': + 'Créer automatiquement des enregistrements {agentVariantTable:string}', + 'uk-ua': 'Автоматично створювати записи {agentVariantTable:string}', + 'pt-br': 'Criar automaticamente registros {agentVariantTable:string}', }, autoCreateVariantsDescription: { - "en-us": - "When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.", - "ru-ru": - "При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.", - "de-ch": - "Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.", - "es-es": - "Al fusionar agentes, cree automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.", - "fr-fr": + 'en-us': + 'When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.', + 'ru-ru': + 'При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.', + 'de-ch': + 'Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze basierend auf den Variationen von Vorname/Nachname erstellt.', + 'es-es': + 'Al fusionar agentes, cree automáticamente registros {agentVariantTable:string} basados en las variaciones de nombre/apellido.', + 'fr-fr': "Lors de la fusion d'agents, créez automatiquement des enregistrements {agentVariantTable:string} en fonction des variations du prénom/nom.", - "uk-ua": - "Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.", - "pt-br": - "Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.", + 'uk-ua': + 'Під час об’єднання агентів автоматично створювати записи {agentVariantTable:string} на основі варіацій імені/прізвища.', + 'pt-br': + 'Ao mesclar agentes, crie automaticamente registros {agentVariantTable:string} com base nas variações de nome/sobrenome.', }, collectionPreferences: { - "en-us": "Collection Preferences", - "de-ch": "Sammlungseinstellungen", - "es-es": "Preferencias de colección", - "fr-fr": "Personnalisation", - "ru-ru": "Настройки коллекции", - "uk-ua": "Налаштування", - "pt-br": "Preferências de coleção", + 'en-us': 'Collection Preferences', + 'de-ch': 'Sammlungseinstellungen', + 'es-es': 'Preferencias de colección', + 'fr-fr': 'Personnalisation', + 'ru-ru': 'Настройки коллекции', + 'uk-ua': 'Налаштування', + 'pt-br': 'Preferências de coleção', }, rememberDialogSizes: { - "en-us": "Remember dialog window sizes", - "ru-ru": "Запомните размеры диалоговых окон", - "es-es": "Recordar los tamaños de las ventanas de diálogo", - "fr-fr": "Mémoriser les tailles des fenêtres de dialogue", - "uk-ua": "Запам'ятайте розміри діалогових вікон", - "de-ch": "Dialogfenstergrößen merken", - "pt-br": "Lembrar tamanhos de janelas de diálogo", + 'en-us': 'Remember dialog window sizes', + 'ru-ru': 'Запомните размеры диалоговых окон', + 'es-es': 'Recordar los tamaños de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les tailles des fenêtres de dialogue', + 'uk-ua': "Запам'ятайте розміри діалогових вікон", + 'de-ch': 'Dialogfenstergrößen merken', + 'pt-br': 'Lembrar tamanhos de janelas de diálogo', }, rememberDialogPositions: { - "en-us": "Remember dialog window positions", - "ru-ru": "Запомнить позиции диалоговых окон", - "es-es": "Recordar las posiciones de las ventanas de diálogo", - "fr-fr": "Mémoriser les positions des fenêtres de dialogue", - "uk-ua": "Запам'ятовуйте положення діалогового вікна", - "de-ch": "Dialogfensterpositionen merken", - "pt-br": "Lembrar posições da janela de diálogo", + 'en-us': 'Remember dialog window positions', + 'ru-ru': 'Запомнить позиции диалоговых окон', + 'es-es': 'Recordar las posiciones de las ventanas de diálogo', + 'fr-fr': 'Mémoriser les positions des fenêtres de dialogue', + 'uk-ua': "Запам'ятовуйте положення діалогового вікна", + 'de-ch': 'Dialogfensterpositionen merken', + 'pt-br': 'Lembrar posições da janela de diálogo', }, autoPlayMedia: { - "en-us": "Automatically play media", - "ru-ru": "Автоматически воспроизводить медиа", - "es-es": "Reproducir automáticamente medios", - "fr-fr": "Lire automatiquement les médias", - "uk-ua": "Автоматичне відтворення медіа", - "de-ch": "Medien automatisch abspielen", - "pt-br": "Reproduzir mídia automaticamente", + 'en-us': 'Automatically play media', + 'ru-ru': 'Автоматически воспроизводить медиа', + 'es-es': 'Reproducir automáticamente medios', + 'fr-fr': 'Lire automatiquement les médias', + 'uk-ua': 'Автоматичне відтворення медіа', + 'de-ch': 'Medien automatisch abspielen', + 'pt-br': 'Reproduzir mídia automaticamente', }, useCustomTooltips: { - "en-us": "Use modern tooltips", - "ru-ru": "Используйте современные подсказки", - "es-es": "Utilice información sobre herramientas moderna", - "fr-fr": "Utiliser des info-bulles modernes", - "uk-ua": "Використовуйте сучасні підказки", - "de-ch": "Verwenden Sie moderne Tooltips", - "pt-br": "Use dicas de ferramentas modernas", + 'en-us': 'Use modern tooltips', + 'ru-ru': 'Используйте современные подсказки', + 'es-es': 'Utilice información sobre herramientas moderna', + 'fr-fr': 'Utiliser des info-bulles modernes', + 'uk-ua': 'Використовуйте сучасні підказки', + 'de-ch': 'Verwenden Sie moderne Tooltips', + 'pt-br': 'Use dicas de ferramentas modernas', }, alwaysUseQueryBuilder: { - "en-us": "Always use query builder search inside of search form", - "de-ch": - "Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche", - "es-es": - "Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda", - "fr-fr": - "Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche", - "ru-ru": "Всегда используйте конструктор запросов внутри формы поиска.", - "uk-ua": "Завжди використовуйте пошук конструктора запитів у формі пошуку", - "pt-br": - "Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa", + 'en-us': 'Always use query builder search inside of search form', + 'de-ch': + 'Verwenden Sie innerhalb des Suchformulars immer die Abfragegeneratorsuche', + 'es-es': + 'Utilice siempre la búsqueda del generador de consultas dentro del formulario de búsqueda', + 'fr-fr': + 'Utilisez toujours la recherche du générateur de requêtes dans le formulaire de recherche', + 'ru-ru': 'Всегда используйте конструктор запросов внутри формы поиска.', + 'uk-ua': 'Завжди використовуйте пошук конструктора запитів у формі пошуку', + 'pt-br': + 'Sempre use a pesquisa do construtor de consultas dentro do formulário de pesquisa', }, localizeResourceNames: { - "en-us": "Localize the names of recognized app resources", - "de-ch": "Lokalisieren Sie die Namen erkannter App-Ressourcen", - "es-es": - "Localizar los nombres de los recursos de aplicaciones reconocidos", - "fr-fr": "Localiser les noms des ressources d'application reconnues", - "ru-ru": "Локализуйте названия распознанных ресурсов приложения", - "uk-ua": "Локалізувати назви розпізнаних ресурсів програми", - "pt-br": "Localize os nomes dos recursos de aplicativos reconhecidos", + 'en-us': 'Localize the names of recognized app resources', + 'de-ch': 'Lokalisieren Sie die Namen erkannter App-Ressourcen', + 'es-es': + 'Localizar los nombres de los recursos de aplicaciones reconocidos', + 'fr-fr': "Localiser les noms des ressources d'application reconnues", + 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения', + 'uk-ua': 'Локалізувати назви розпізнаних ресурсів програми', + 'pt-br': 'Localize os nomes dos recursos de aplicativos reconhecidos', }, splitLongXml: { - "en-us": "Split long lines of XML into multiple lines", - "de-ch": "Teilen Sie lange XML-Zeilen in mehrere Zeilen auf", - "es-es": "Dividir líneas largas de XML en varias líneas", - "fr-fr": "Diviser les longues lignes de XML en plusieurs lignes", - "ru-ru": "Разделить длинные строки XML на несколько строк", - "uk-ua": "Розділіть довгі рядки XML на кілька рядків", - "pt-br": "Dividir longas linhas de XML em várias linhas", + 'en-us': 'Split long lines of XML into multiple lines', + 'de-ch': 'Teilen Sie lange XML-Zeilen in mehrere Zeilen auf', + 'es-es': 'Dividir líneas largas de XML en varias líneas', + 'fr-fr': 'Diviser les longues lignes de XML en plusieurs lignes', + 'ru-ru': 'Разделить длинные строки XML на несколько строк', + 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', + 'pt-br': 'Dividir longas linhas de XML em várias linhas', }, url: { - "en-us": "URL", - "de-ch": "URL", - "es-es": "URL", - "fr-fr": "URL", - "uk-ua": "URL", - "ru-ru": "URL", - "pt-br": "URL", + 'en-us': 'URL', + 'de-ch': 'URL', + 'es-es': 'URL', + 'fr-fr': 'URL', + 'uk-ua': 'URL', + 'ru-ru': 'URL', + 'pt-br': 'URL', }, pickAttachment: { - "en-us": "Pick an attachment", - "es-es": "Elige un archivo adjunto", - "fr-fr": "Choisissez une pièce jointe", - "ru-ru": "Выберите вложение", - "uk-ua": "Виберіть вкладення", - "de-ch": "Wählen Sie einen Anhang", - "pt-br": "Escolha um anexo", + 'en-us': 'Pick an attachment', + 'es-es': 'Elige un archivo adjunto', + 'fr-fr': 'Choisissez une pièce jointe', + 'ru-ru': 'Выберите вложение', + 'uk-ua': 'Виберіть вкладення', + 'de-ch': 'Wählen Sie einen Anhang', + 'pt-br': 'Escolha um anexo', }, attachmentFailed: { - "en-us": "The attachment failed to load.", - "de-ch": "Der Anhang konnte nicht geladen werden.", - "es-es": "No se pudo cargar el archivo adjunto.", - "fr-fr": "La pièce jointe n'a pas pu être chargée.", - "ru-ru": "Не удалось загрузить вложение.", - "uk-ua": "Не вдалося завантажити вкладений файл.", - "pt-br": "O anexo não pôde ser carregado.", + 'en-us': 'The attachment failed to load.', + 'de-ch': 'Der Anhang konnte nicht geladen werden.', + 'es-es': 'No se pudo cargar el archivo adjunto.', + 'fr-fr': "La pièce jointe n'a pas pu être chargée.", + 'ru-ru': 'Не удалось загрузить вложение.', + 'uk-ua': 'Не вдалося завантажити вкладений файл.', + 'pt-br': 'O anexo não pôde ser carregado.', }, pickImage: { - "en-us": "Pick an image", - "de-ch": "Wählen Sie ein Bild aus", - "es-es": "Elige una imagen", - "fr-fr": "Choisissez une image", - "ru-ru": "Выберите изображение", - "uk-ua": "Виберіть зображення", - "pt-br": "Escolha uma imagem", + 'en-us': 'Pick an image', + 'de-ch': 'Wählen Sie ein Bild aus', + 'es-es': 'Elige una imagen', + 'fr-fr': 'Choisissez une image', + 'ru-ru': 'Выберите изображение', + 'uk-ua': 'Виберіть зображення', + 'pt-br': 'Escolha uma imagem', }, customLogo: { - "en-us": "Expanded Image URL", - "de-ch": "Erweiterte Bild-URL", - "es-es": "URL de imagen expandida", - "fr-fr": "URL de l'image étendue", - "ru-ru": "URL-адрес развернутого изображения", - "uk-ua": "Розширена URL-адреса зображення", - "pt-br": "URL da imagem expandida", + 'en-us': 'Expanded Image URL', + 'de-ch': 'Erweiterte Bild-URL', + 'es-es': 'URL de imagen expandida', + 'fr-fr': "URL de l'image étendue", + 'ru-ru': 'URL-адрес развернутого изображения', + 'uk-ua': 'Розширена URL-адреса зображення', + 'pt-br': 'URL da imagem expandida', }, customLogoCollapsed: { - "en-us": "Collapsed Image URL", - "de-ch": "URL des minimierten Bildes", - "es-es": "URL de imagen contraída", - "fr-fr": "URL de l'image réduite", - "ru-ru": "URL-адрес свернутого изображения", - "uk-ua": "URL-адреса згорнутого зображення", - "pt-br": "URL da imagem recolhida", + 'en-us': 'Collapsed Image URL', + 'de-ch': 'URL des minimierten Bildes', + 'es-es': 'URL de imagen contraída', + 'fr-fr': "URL de l'image réduite", + 'ru-ru': 'URL-адрес свернутого изображения', + 'uk-ua': 'URL-адреса згорнутого зображення', + 'pt-br': 'URL da imagem recolhida', }, customLogoDescription: { - "en-us": - "A URL to an image that would be displayed next to the Specify logo in the navigation menu.", - "de-ch": - "Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.", - "es-es": - "Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.", - "fr-fr": - "Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.", - "ru-ru": - "URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.", - "uk-ua": - "URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.", - "pt-br": - "Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.", + 'en-us': + 'A URL to an image that would be displayed next to the Specify logo in the navigation menu.', + 'de-ch': + 'Eine URL zu einem Bild, das neben dem angegebenen Logo im Navigationsmenü angezeigt wird.', + 'es-es': + 'Una URL a una imagen que se mostrará junto al logotipo Especificar en el menú de navegación.', + 'fr-fr': + 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', + 'ru-ru': + 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', + 'uk-ua': + 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', + 'pt-br': + 'Um URL para uma imagem que seria exibida ao lado do logotipo Especificar no menu de navegação.', }, showLineNumber: { - "en-us": "Show query result line number", - "de-ch": "Zeilennummer des Abfrageergebnisses anzeigen", - "es-es": "Mostrar el número de línea del resultado de la consulta", - "fr-fr": "Afficher le numéro de ligne du résultat de la requête", - "ru-ru": "Показать номер строки результата запроса", - "uk-ua": "Показати номер рядка результату запиту", - "pt-br": "Mostrar número da linha do resultado da consulta", + 'en-us': 'Show query result line number', + 'de-ch': 'Zeilennummer des Abfrageergebnisses anzeigen', + 'es-es': 'Mostrar el número de línea del resultado de la consulta', + 'fr-fr': 'Afficher le numéro de ligne du résultat de la requête', + 'ru-ru': 'Показать номер строки результата запроса', + 'uk-ua': 'Показати номер рядка результату запиту', + 'pt-br': 'Mostrar número da linha do resultado da consulta', }, saveButtonColor: { - "en-us": "Save button color", - "de-ch": "Farbe der Schaltfläche „Speichern“", - "es-es": "Guardar el color del botón", - "fr-fr": "Couleur du bouton Enregistrer", - "ru-ru": "Сохранить цвет кнопки", - "uk-ua": "Зберегти колір кнопки", - "pt-br": "Cor do botão Salvar", + 'en-us': 'Save button color', + 'de-ch': 'Farbe der Schaltfläche „Speichern“', + 'es-es': 'Guardar el color del botón', + 'fr-fr': 'Couleur du bouton Enregistrer', + 'ru-ru': 'Сохранить цвет кнопки', + 'uk-ua': 'Зберегти колір кнопки', + 'pt-br': 'Cor do botão Salvar', }, secondaryButtonColor: { - "en-us": "Secondary button color", - "es-es": "Color del botón secundario", - "fr-fr": "Couleur du bouton secondaire", - "ru-ru": "Цвет вторичной кнопки", - "uk-ua": "Колір вторинної кнопки", - "de-ch": "Sekundäre Schaltflächenfarbe", - "pt-br": "Cor do botão secundário", + 'en-us': 'Secondary button color', + 'es-es': 'Color del botón secundario', + 'fr-fr': 'Couleur du bouton secondaire', + 'ru-ru': 'Цвет вторичной кнопки', + 'uk-ua': 'Колір вторинної кнопки', + 'de-ch': 'Sekundäre Schaltflächenfarbe', + 'pt-br': 'Cor do botão secundário', }, secondaryLightButtonColor: { - "en-us": "Secondary light button color", - "de-ch": "Farbe der sekundären Lichttaste", - "es-es": "Color del botón de luz secundaria", - "fr-fr": "Couleur du bouton lumineux secondaire", - "ru-ru": "Цвет кнопки дополнительного освещения", - "uk-ua": "Колір вторинної світлової кнопки", - "pt-br": "Cor do botão de luz secundária", + 'en-us': 'Secondary light button color', + 'de-ch': 'Farbe der sekundären Lichttaste', + 'es-es': 'Color del botón de luz secundaria', + 'fr-fr': 'Couleur du bouton lumineux secondaire', + 'ru-ru': 'Цвет кнопки дополнительного освещения', + 'uk-ua': 'Колір вторинної світлової кнопки', + 'pt-br': 'Cor do botão de luz secundária', }, dangerButtonColor: { - "en-us": "Danger button color", - "de-ch": "Farbe der Gefahrenschaltfläche", - "es-es": "Color del botón de peligro", - "fr-fr": "Couleur du bouton de danger", - "ru-ru": "Цвет кнопки «Опасность»", - "uk-ua": "Колір кнопки небезпеки", - "pt-br": "Cor do botão de perigo", + 'en-us': 'Danger button color', + 'de-ch': 'Farbe der Gefahrenschaltfläche', + 'es-es': 'Color del botón de peligro', + 'fr-fr': 'Couleur du bouton de danger', + 'ru-ru': 'Цвет кнопки «Опасность»', + 'uk-ua': 'Колір кнопки небезпеки', + 'pt-br': 'Cor do botão de perigo', }, infoButtonColor: { - "en-us": "Info button color", - "de-ch": "Farbe der Info-Schaltfläche", - "es-es": "Color del botón de información", - "fr-fr": "Couleur du bouton d'information", - "ru-ru": "Цвет кнопки информации", - "uk-ua": "Колір інформаційної кнопки", - "pt-br": "Cor do botão de informações", + 'en-us': 'Info button color', + 'de-ch': 'Farbe der Info-Schaltfläche', + 'es-es': 'Color del botón de información', + 'fr-fr': "Couleur du bouton d'information", + 'ru-ru': 'Цвет кнопки информации', + 'uk-ua': 'Колір інформаційної кнопки', + 'pt-br': 'Cor do botão de informações', }, warningButtonColor: { - "en-us": "Warning button color", - "de-ch": "Farbe der Warnschaltfläche", - "es-es": "Color del botón de advertencia", - "fr-fr": "Couleur du bouton d'avertissement", - "ru-ru": "Цвет кнопки предупреждения", - "uk-ua": "Колір кнопки попередження", - "pt-br": "Cor do botão de aviso", + 'en-us': 'Warning button color', + 'de-ch': 'Farbe der Warnschaltfläche', + 'es-es': 'Color del botón de advertencia', + 'fr-fr': "Couleur du bouton d'avertissement", + 'ru-ru': 'Цвет кнопки предупреждения', + 'uk-ua': 'Колір кнопки попередження', + 'pt-br': 'Cor do botão de aviso', }, successButtonColor: { - "en-us": "Success button color", - "de-ch": "Farbe der Schaltfläche „Erfolg“", - "es-es": "Color del botón de éxito", - "fr-fr": "Couleur du bouton de réussite", - "ru-ru": "Цвет кнопки «Успех»", - "uk-ua": "Колір кнопки успіху", - "pt-br": "Cor do botão de sucesso", + 'en-us': 'Success button color', + 'de-ch': 'Farbe der Schaltfläche „Erfolg“', + 'es-es': 'Color del botón de éxito', + 'fr-fr': 'Couleur du bouton de réussite', + 'ru-ru': 'Цвет кнопки «Успех»', + 'uk-ua': 'Колір кнопки успіху', + 'pt-br': 'Cor do botão de sucesso', }, openAsReadOnly: { - "en-us": "Open all records in read-only mode", - "de-ch": "Alle Datensätze im schreibgeschützten Modus öffnen", - "es-es": "Abrir todos los registros en modo de solo lectura", - "fr-fr": "Ouvrir tous les enregistrements en mode lecture seule", - "ru-ru": "Открыть все записи в режиме только для чтения", - "uk-ua": "Відкрити всі записи в режимі лише для читання", - "pt-br": "Abra todos os registros no modo somente leitura", + 'en-us': 'Open all records in read-only mode', + 'de-ch': 'Alle Datensätze im schreibgeschützten Modus öffnen', + 'es-es': 'Abrir todos los registros en modo de solo lectura', + 'fr-fr': 'Ouvrir tous les enregistrements en mode lecture seule', + 'ru-ru': 'Открыть все записи в режиме только для чтения', + 'uk-ua': 'Відкрити всі записи в режимі лише для читання', + 'pt-br': 'Abra todos os registros no modo somente leitura', }, displayBasicView: { - "en-us": "Display basic view", - "de-ch": "Basisansicht anzeigen", - "es-es": "Mostrar vista básica", - "fr-fr": "Afficher la vue de base", - "ru-ru": "Отобразить базовый вид", - "uk-ua": "Відобразити базовий вигляд", - "pt-br": "Exibir visualização básica", + 'en-us': 'Display basic view', + 'de-ch': 'Basisansicht anzeigen', + 'es-es': 'Mostrar vista básica', + 'fr-fr': 'Afficher la vue de base', + 'ru-ru': 'Отобразить базовый вид', + 'uk-ua': 'Відобразити базовий вигляд', + 'pt-br': 'Exibir visualização básica', }, showComparisonOperatorsForString: { - "en-us": "Show comparison operators for text-based fields", - "de-ch": "Vergleichsoperatoren für textbasierte Felder anzeigen", - "es-es": "Mostrar operadores de comparación para campos basados en texto", - "fr-fr": "Afficher les opérateurs de comparaison pour les champs textuels", - "pt-br": "Mostrar operadores de comparação para campos baseados em texto", - "ru-ru": "Показать операторы сравнения для текстовых полей", - "uk-ua": "Показати оператори порівняння для текстових полів", + 'en-us': 'Show comparison operators for text-based fields', + 'de-ch': 'Vergleichsoperatoren für textbasierte Felder anzeigen', + 'es-es': 'Mostrar operadores de comparación para campos basados en texto', + 'fr-fr': 'Afficher les opérateurs de comparaison pour les champs textuels', + 'pt-br': 'Mostrar operadores de comparação para campos baseados em texto', + 'ru-ru': 'Показать операторы сравнения для текстовых полей', + 'uk-ua': 'Показати оператори порівняння для текстових полів', }, showComparisonOperatorsDescription: { - "en-us": - "Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to", - "de-ch": - "Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich", - "es-es": - "Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que", - "fr-fr": + 'en-us': + 'Allows the following filters to apply to text fields: Greater Than, Less Than, Greater Than or Equal to, and Less Than or Equal to', + 'de-ch': + 'Ermöglicht die Anwendung der folgenden Filter auf Textfelder: Größer als, Kleiner als, Größer als oder gleich und Kleiner als oder gleich', + 'es-es': + 'Permite aplicar los siguientes filtros a los campos de texto: Mayor que, Menor que, Mayor o igual que y Menor o igual que', + 'fr-fr': "Permet d'appliquer les filtres suivants aux champs de texte : Supérieur à, Inférieur à, Supérieur ou égal à et Inférieur ou égal à", - "pt-br": - "Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a", - "ru-ru": - "Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».", - "uk-ua": - "Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»", + 'pt-br': + 'Permite que os seguintes filtros sejam aplicados aos campos de texto: Maior que, Menor que, Maior ou igual a e Menor ou igual a', + 'ru-ru': + 'Позволяет применять к текстовым полям следующие фильтры: «Больше», «Меньше», «Больше или равно» и «Меньше или равно».', + 'uk-ua': + 'Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»', }, basicView: { - "en-us": "Basic view", - "de-ch": "Basisansicht", - "es-es": "Vista básica", - "fr-fr": "Vue de base", - "ru-ru": "Базовый вид", - "uk-ua": "Основний вигляд", - "pt-br": "Visão básica", + 'en-us': 'Basic view', + 'de-ch': 'Basisansicht', + 'es-es': 'Vista básica', + 'fr-fr': 'Vue de base', + 'ru-ru': 'Базовый вид', + 'uk-ua': 'Основний вигляд', + 'pt-br': 'Visão básica', }, detailedView: { - "en-us": "Detailed view", - "de-ch": "Detailansicht", - "es-es": "Vista detallada", - "fr-fr": "Vue détaillée", - "ru-ru": "Подробный вид", - "uk-ua": "Детальний вигляд", - "pt-br": "Visão detalhada", + 'en-us': 'Detailed view', + 'de-ch': 'Detailansicht', + 'es-es': 'Vista detallada', + 'fr-fr': 'Vue détaillée', + 'ru-ru': 'Подробный вид', + 'uk-ua': 'Детальний вигляд', + 'pt-br': 'Visão detalhada', }, attachmentPreviewMode: { - "en-us": "Attachment preview mode", - "de-ch": "Anhangsvorschaumodus", - "es-es": "Modo de vista previa de archivos adjuntos", - "fr-fr": "Mode d'aperçu des pièces jointes", - "ru-ru": "Режим предварительного просмотра вложений", - "uk-ua": "Режим попереднього перегляду вкладених файлів", - "pt-br": "Modo de visualização de anexos", + 'en-us': 'Attachment preview mode', + 'de-ch': 'Anhangsvorschaumodus', + 'es-es': 'Modo de vista previa de archivos adjuntos', + 'fr-fr': "Mode d'aperçu des pièces jointes", + 'ru-ru': 'Режим предварительного просмотра вложений', + 'uk-ua': 'Режим попереднього перегляду вкладених файлів', + 'pt-br': 'Modo de visualização de anexos', }, fullResolution: { - "en-us": "Full Resolution", - "de-ch": "Volle Auflösung", - "es-es": "Resolución completa", - "fr-fr": "Pleine résolution", - "ru-ru": "Полное разрешение", - "uk-ua": "Повна роздільна здатність", - "pt-br": "Resolução completa", + 'en-us': 'Full Resolution', + 'de-ch': 'Volle Auflösung', + 'es-es': 'Resolución completa', + 'fr-fr': 'Pleine résolution', + 'ru-ru': 'Полное разрешение', + 'uk-ua': 'Повна роздільна здатність', + 'pt-br': 'Resolução completa', }, thumbnail: { - "en-us": "Thumbnail", - "de-ch": "Miniaturansicht", - "es-es": "Uña del pulgar", - "fr-fr": "Vignette", - "ru-ru": "Миниатюра", - "uk-ua": "Мініатюра", - "pt-br": "Miniatura", + 'en-us': 'Thumbnail', + 'de-ch': 'Miniaturansicht', + 'es-es': 'Uña del pulgar', + 'fr-fr': 'Vignette', + 'ru-ru': 'Миниатюра', + 'uk-ua': 'Мініатюра', + 'pt-br': 'Miniatura', }, addSearchBarHomePage: { - "en-us": "Add Search Bar on home page", - "de-ch": "Suchleiste auf der Startseite hinzufügen", - "es-es": "Agregar barra de búsqueda en la página de inicio", - "fr-fr": "Ajouter une barre de recherche sur la page d'accueil", - "ru-ru": "Добавить панель поиска на домашнюю страницу", - "uk-ua": "Додайте рядок пошуку на головну сторінку", - "pt-br": "Adicionar barra de pesquisa na página inicial", + 'en-us': 'Add Search Bar on home page', + 'de-ch': 'Suchleiste auf der Startseite hinzufügen', + 'es-es': 'Agregar barra de búsqueda en la página de inicio', + 'fr-fr': "Ajouter une barre de recherche sur la page d'accueil", + 'ru-ru': 'Добавить панель поиска на домашнюю страницу', + 'uk-ua': 'Додайте рядок пошуку на головну сторінку', + 'pt-br': 'Adicionar barra de pesquisa na página inicial', }, inheritanceCatNumberPref: { - "en-us": - "Enable the inheritance of the primary catalog number to its empty siblings.", - "de-ch": - "Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.", - "es-es": - "Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.", - "fr-fr": + 'en-us': + 'Enable the inheritance of the primary catalog number to its empty siblings.', + 'de-ch': + 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', + 'es-es': + 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', + 'fr-fr': "Activez l'héritage du numéro de catalogue principal vers ses frères vides.", - "pt-br": - "Habilitar a herança do número do catálogo primário para seus irmãos vazios.", - "ru-ru": - "Включить наследование основного каталожного номера его пустыми родственными номерами.", - "uk-ua": - "Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.", + 'pt-br': + 'Habilitar a herança do número do catálogo primário para seus irmãos vazios.', + 'ru-ru': + 'Включить наследование основного каталожного номера его пустыми родственными номерами.', + 'uk-ua': + 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', }, inheritanceCatNumberParentCOPref: { - "en-us": - "Enable the inheritance of the parent catalog number to its empty children.", - "de-ch": - "Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.", - "es-es": - "Habilitar la herencia del número de catálogo padre a sus hijos vacíos.", - "fr-fr": + 'en-us': + 'Enable the inheritance of the parent catalog number to its empty children.', + 'de-ch': + 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.', + 'es-es': + 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', + 'fr-fr': "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", - "pt-br": - "Habilitar a herança do número do catálogo pai para seus filhos vazios.", - "ru-ru": - "Включить наследование родительского каталожного номера его пустыми дочерними элементами.", - "uk-ua": - "Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.", + 'pt-br': + 'Habilitar a herança do número do catálogo pai para seus filhos vazios.', + 'ru-ru': + 'Включить наследование родительского каталожного номера его пустыми дочерними элементами.', + 'uk-ua': + 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', }, } as const; - export const preferencesGeneralText = createDictionary( preferencesGeneralDictionary ); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index bed614cba81..0bf175a8b64 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -3,10 +3,10 @@ * * @module */ -import { createDictionary } from './utils'; import { preferencesBehaviorDictionary } from './preferences.behavior'; import { preferencesContentDictionary } from './preferences.content'; import { preferencesGeneralDictionary } from './preferences.general'; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file const preferencesDictionary = { ...preferencesGeneralDictionary, diff --git a/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts b/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts index 136391ca942..94e8790abf2 100644 --- a/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts +++ b/specifyweb/frontend/js_src/lib/localization/utils/scanUsages.ts @@ -168,11 +168,9 @@ export async function scanUsages( categoryName, strings: Object.fromEntries( Object.keys(strings).map((key) => { - const rawStrings = - (Reflect.getOwnPropertyDescriptor(strings, key)?.value ?? - (strings as LanguageDictionary)[ - key as keyof LanguageDictionary - ]) as LocalizationEntry; + const rawStrings = (Reflect.getOwnPropertyDescriptor(strings, key) + ?.value ?? + (strings as LanguageDictionary)[key]) as LocalizationEntry; Object.keys(rawStrings) .filter((language) => !f.has(expectedKeys, language)) From 3c7088bd5ebcb93583b38f33f6072e6e8786b67a Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:15:42 -0500 Subject: [PATCH 066/115] refactor(preferences): improve tree management --- .../Preferences/CollectionDefinitions.tsx | 20 +++++++++++----- .../lib/localization/preferences.behavior.ts | 18 +++++++------- .../frontend/js_src/lib/localization/tree.ts | 24 +++---------------- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index ed10364a63a..fda34b26545 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -2,6 +2,8 @@ * Definitions for Collection preferences */ +import type { LocalizedString } from 'typesafe-i18n'; + import { attachmentsText } from '../../localization/attachments'; import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; @@ -11,10 +13,16 @@ import { treeText } from '../../localization/tree'; import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; import { ensure } from '../../utils/types'; +import { camelToHuman } from '../../utils/utils'; import type { StatLayout } from '../Statistics/types'; +import { genericTables } from '../DataModel/tables'; +import type { Tables } from '../DataModel/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; +const tableLabel = (tableName: keyof Tables): LocalizedString => + genericTables[tableName]?.label ?? camelToHuman(tableName); + const specifyNetworkItems = { publishingOrganization: definePref({ title: specifyNetworkText.publishingOrganizationKey(), @@ -74,7 +82,7 @@ export const collectionPreferenceDefinitions = { items: { 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': definePref({ - title: treeText.allowSynonymizedGeologicTimePeriodChildren(), + title: () => tableLabel('GeologicTimePeriod'), requiresReload: false, visible: true, defaultValue: false, @@ -82,7 +90,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Taxon': definePref({ - title: treeText.allowSynonymizedTaxonChildren(), + title: () => tableLabel('Taxon'), requiresReload: false, visible: true, defaultValue: false, @@ -90,7 +98,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Geography': definePref({ - title: treeText.allowSynonymizedGeographyChildren(), + title: () => tableLabel('Geography'), requiresReload: false, visible: true, defaultValue: false, @@ -98,7 +106,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': definePref({ - title: treeText.allowSynonymizedLithostratChildren(), + title: () => tableLabel('LithoStrat'), requiresReload: false, visible: true, defaultValue: false, @@ -106,7 +114,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.Storage': definePref({ - title: treeText.allowSynonymizedStorageChildren(), + title: () => tableLabel('Storage'), requiresReload: false, visible: true, defaultValue: false, @@ -114,7 +122,7 @@ export const collectionPreferenceDefinitions = { }), 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': definePref({ - title: treeText.allowSynonymizedTectonicUnitChildren(), + title: () => tableLabel('TectonicUnit'), requiresReload: false, visible: true, defaultValue: false, diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index df9608745f5..7f7b9efb1af 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -442,13 +442,13 @@ export const preferencesBehaviorDictionary = { 'Você pode mover na direção oposta pressionando Shift+Enter.', }, filterPickLists: { - 'en-us': 'Filter pick list items', - 'ru-ru': 'Фильтрация элементов списка выбора', - 'es-es': 'Filtrar elementos de la lista de selección', - 'fr-fr': 'Filtrer les éléments de la liste de sélection', - 'uk-ua': 'Фільтр вибору елементів списку', - 'de-ch': 'Auswahllistenelemente filtern', - 'pt-br': 'Filtrar itens da lista de seleção', + 'en-us': 'Pick List Filtering', + 'ru-ru': 'Фильтрация списка выбора', + 'es-es': 'Filtrado de lista de selección', + 'fr-fr': 'Filtrage de la liste de sélection', + 'uk-ua': 'Фільтрація списку вибору', + 'de-ch': 'Picklistenfilterung', + 'pt-br': 'Filtragem de lista de seleção', }, exportFileDelimiter: { 'en-us': 'Export file delimiter', @@ -687,11 +687,11 @@ export const preferencesBehaviorDictionary = { 'pt-br': 'Fechar com clique externo', }, scopeEntireTablePicklists: { - 'en-us': 'Scope "Entire Table" picklists', + 'en-us': 'Scope "Entire Table" Picklists', }, scopeEntireTablePicklistsDescription: { 'en-us': - 'Restrict "Entire Table" picklists to values used by records in this collection.', + 'If enabled, picklists of type "Entire Table" will only show items that are in use within the current collection.', }, catalogNumberInheritanceDescription: { 'en-us': diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index 667f6af34bc..7b9993f4bb2 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -704,31 +704,13 @@ export const treeText = createDictionary({ 'uk-ua': 'Метеорити', }, treeManagement: { - 'en-us': 'Tree management', + 'en-us': 'Tree Management', }, synonymizedNodes: { - 'en-us': 'Synonymized nodes', + 'en-us': 'Synonym Behavior', }, synonymizedNodesDescription: { 'en-us': - 'Allow creating children under synonymized nodes in specific trees.', - }, - allowSynonymizedGeologicTimePeriodChildren: { - 'en-us': 'Allow children under synonymized Geologic Time Period nodes', - }, - allowSynonymizedTaxonChildren: { - 'en-us': 'Allow children under synonymized Taxon nodes', - }, - allowSynonymizedGeographyChildren: { - 'en-us': 'Allow children under synonymized Geography nodes', - }, - allowSynonymizedLithostratChildren: { - 'en-us': 'Allow children under synonymized Lithostratigraphy nodes', - }, - allowSynonymizedStorageChildren: { - 'en-us': 'Allow children under synonymized Storage nodes', - }, - allowSynonymizedTectonicUnitChildren: { - 'en-us': 'Allow children under synonymized Tectonic Unit nodes', + 'If enabled, this allows users to add children to synonymized parents and to synonymize a node with children.', }, } as const); From 43a5c90e41bc9f4eecf83968d0ec4857f6645db6 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:16:09 -0500 Subject: [PATCH 067/115] fix: improve public attachment description --- specifyweb/frontend/js_src/lib/localization/attachments.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index 81100afff64..c969db23a3a 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -678,10 +678,10 @@ export const attachmentsText = createDictionary({ 'uk-ua': 'Видалення вкладень', }, publicDefault: { - 'en-us': 'New attachments are public', + 'en-us': 'Make Attachments Public by Default', }, publicDefaultDescription: { 'en-us': - 'Set the default visibility for attachments created within this collection.', + 'This controls whether or not new attachments added to this collection are flagged as "Public" by default. Public attachments will be visible for everyone viewing a linked Specify Web Portal. This setting can be overridden on a per-attachment basis and does not affect existing attachments.', }, } as const); From 527c1cbb5a5e58963fdc97f4d7fd377820983b0e Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:16:50 -0500 Subject: [PATCH 068/115] Update attachments.ts --- specifyweb/frontend/js_src/lib/localization/attachments.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index c969db23a3a..50268c30a30 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -682,6 +682,6 @@ export const attachmentsText = createDictionary({ }, publicDefaultDescription: { 'en-us': - 'This controls whether or not new attachments added to this collection are flagged as "Public" by default. Public attachments will be visible for everyone viewing a linked Specify Web Portal. This setting can be overridden on a per-attachment basis and does not affect existing attachments.', + 'This controls whether or not new attachments added to this collection are flagged as "Public" by default. Public attachments will automatically be visible on a Specify Web Portal. This setting can be overridden on a per-attachment basis and does not affect existing attachments.', }, } as const); From b9b57a61c0375fcae64613743ea34305d046e96b Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:24:03 -0500 Subject: [PATCH 069/115] feat: add descriptions for specify network fields --- .../components/Preferences/CollectionDefinitions.tsx | 2 ++ .../js_src/lib/localization/specifyNetwork.ts | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index fda34b26545..786a8f1e586 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -26,6 +26,7 @@ const tableLabel = (tableName: keyof Tables): LocalizedString => const specifyNetworkItems = { publishingOrganization: definePref({ title: specifyNetworkText.publishingOrganizationKey(), + description: specifyNetworkText.publishingOrganizationKeyDescription(), requiresReload: false, visible: true, defaultValue: undefined, @@ -33,6 +34,7 @@ const specifyNetworkItems = { }), collectionKey: definePref({ title: specifyNetworkText.collectionKey(), + description: specifyNetworkText.collectionKeyDescription(), requiresReload: false, visible: true, defaultValue: undefined, diff --git a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts index 37b3516e2e6..08d37debb90 100644 --- a/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts +++ b/specifyweb/frontend/js_src/lib/localization/specifyNetwork.ts @@ -17,10 +17,18 @@ export const specifyNetworkText = createDictionary({ 'pt-br': 'Especificar rede', }, publishingOrganizationKey: { - 'en-us': 'Publishing organization key', + 'en-us': 'GBIF Publishing Organization Key', + }, + publishingOrganizationKeyDescription: { + 'en-us': + 'The GBIF "publishingOrgKey" (a UUID) for this collection, used for Specify Network integration.', }, collectionKey: { - 'en-us': 'Collection key', + 'en-us': 'GBIF Data Set Key', + }, + collectionKeyDescription: { + 'en-us': + 'The GBIF "dataSetKey" (a UUID) for this collection, used for Specify Network integration.', }, occurrenceOrGuidRequired: { 'en-us': 'Species Name or GUID must be provided to display this page', From 322e760d8554199c65194764c6e1348149b90fb9 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:24:15 -0500 Subject: [PATCH 070/115] feat: improve descriptions for stats fields --- specifyweb/frontend/js_src/lib/localization/stats.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/stats.tsx b/specifyweb/frontend/js_src/lib/localization/stats.tsx index 9ac2e816daf..e531316937b 100644 --- a/specifyweb/frontend/js_src/lib/localization/stats.tsx +++ b/specifyweb/frontend/js_src/lib/localization/stats.tsx @@ -317,17 +317,17 @@ export const statsText = createDictionary({ 'en-us': 'Defines the layout of the statistics page', }, showPreparationsTotal: { - 'en-us': 'Show preparation totals', + 'en-us': 'Show Preparations Totals', }, showPreparationsTotalDescription: { 'en-us': - 'Include an overall total across preparation types on the statistics page.', + 'If enabled, the default Preparations statistics panel will include a total count for each preparation of a particular preparation type alongside the overall total. This is useful for lot-based collections.', }, autoRefreshRate: { - 'en-us': 'Auto-refresh rate (hours)', + 'en-us': 'Auto-Refresh Rate (Hours)', }, autoRefreshRateDescription: { - 'en-us': 'Specify how frequently shared statistics refresh their data.', + 'en-us': 'The time interval, in hours, at which the statistics page will automatically refresh its data. Default is 24.', }, }); /* eslint-enable @typescript-eslint/naming-convention */ From 02e7a2696a5f3298402f36ad813f7d35fa3a60c7 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:24:57 -0500 Subject: [PATCH 071/115] feat: improve title for synonym behavior section --- specifyweb/frontend/js_src/lib/localization/tree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index 7b9993f4bb2..4a3f2737142 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -707,7 +707,7 @@ export const treeText = createDictionary({ 'en-us': 'Tree Management', }, synonymizedNodes: { - 'en-us': 'Synonym Behavior', + 'en-us': 'Expand Synonym Behavior', }, synonymizedNodesDescription: { 'en-us': From 6a2306c5b15f792ede2f2a3e7603cd65b5fdd997 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:51:36 -0500 Subject: [PATCH 072/115] feat: improve cat number inheritance --- .../Preferences/CollectionDefinitions.tsx | 20 ++++------ .../lib/localization/preferences.behavior.ts | 40 +++++-------------- .../frontend/js_src/lib/localization/tree.ts | 4 ++ 3 files changed, 22 insertions(+), 42 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 786a8f1e586..ffedbb29c31 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -200,13 +200,13 @@ export const collectionPreferenceDefinitions = { catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), - description: preferencesText.catalogNumberInheritanceDescription(), subCategories: { - behavior: { - title: preferencesText.behavior(), + collectionObject: { + title: () => tableLabel('CollectionObjectGroup'), items: { inheritance: definePref({ title: preferencesText.inheritanceCatNumberPref(), + description: preferencesText.inheritanceCatNumberPrefDescription(), requiresReload: false, visible: true, defaultValue: false, @@ -214,18 +214,12 @@ export const collectionPreferenceDefinitions = { }), }, }, - }, - }, - - catalogNumberParentInheritance: { - title: queryText.catalogNumberParentCOInheritance(), - description: preferencesText.catalogNumberParentInheritanceDescription(), - subCategories: { - behavior: { - title: preferencesText.behavior(), + component: { + title: () => camelToHuman('Component'), items: { inheritance: definePref({ title: preferencesText.inheritanceCatNumberParentCOPref(), + description: preferencesText.inheritanceCatNumberParentCOPrefDescription(), requiresReload: false, visible: true, defaultValue: false, @@ -236,6 +230,8 @@ export const collectionPreferenceDefinitions = { }, }, + /* catalogNumberParentInheritance removed - folded into catalogNumberInheritance */ + uniqueCatalogNumberAccrossComponentAndCO: { title: queryText.uniqueCatalogNumberAcrossComponentAndCo(), subCategories: { diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 7f7b9efb1af..7ea667010ed 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -693,10 +693,6 @@ export const preferencesBehaviorDictionary = { 'en-us': 'If enabled, picklists of type "Entire Table" will only show items that are in use within the current collection.', }, - catalogNumberInheritanceDescription: { - 'en-us': - 'Configure whether sibling Collection Objects and their child Collection Objects inherit catalog numbers from the primary or parent record.', - }, catalogNumberParentInheritanceDescription: { 'en-us': 'Control whether component records inherit catalog numbers from their parent Collection Object.', @@ -1142,35 +1138,19 @@ altClickToSupressNewTab: { }, inheritanceCatNumberPref: { 'en-us': - 'Enable the inheritance of the primary catalog number to its empty siblings.', - 'de-ch': - 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', - 'es-es': - 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', - 'fr-fr': - "Activer l'héritage du numéro de catalogue principal à ses frères vides.", - 'pt-br': - 'Habilitar a herança do número de catálogo primário para seus irmãos vazios.', - 'ru-ru': - 'Включить наследование основного каталожного номера его пустыми родственными номерами.', - 'uk-ua': - 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', + 'Enable Catalog Number Inheritance From Primary CO', + }, + inheritanceCatNumberPrefDescription: { + 'en-us': + 'Control whether component records inherit catalog numbers from their primary Collection Object.', }, inheritanceCatNumberParentCOPref: { 'en-us': - 'Enable the inheritance of the parent catalog number to its empty children.', - 'de-ch': - 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an ihre leeren untergeordneten Elemente.', - 'es-es': - 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', - 'fr-fr': - "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", - 'pt-br': - 'Habilita a herança do número do catálogo pai para seus filhos vazios.', - 'ru-ru': - 'Включить наследование родительского каталожного номера его пустыми дочерними элементами.', - 'uk-ua': - 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', + 'Enable Catalog Number Inheritance From Parent CO', + }, + inheritanceCatNumberParentCOPrefDescription: { + 'en-us': + 'Control whether component records inherit catalog numbers from their parent Collection Object.', }, uniqueCatNumberAcrossCompAndCo: { 'en-us': diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index 4a3f2737142..d41144cffcc 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -713,4 +713,8 @@ export const treeText = createDictionary({ 'en-us': 'If enabled, this allows users to add children to synonymized parents and to synonymize a node with children.', }, + synonymizedNodesPermissionDescription: { + 'en-us': + 'Enable adding children to synonymized parents on this tree. When enabled, users may add child nodes beneath parents that have been marked as synonyms.', + }, } as const); From ade9f2452cbdf6c08e35232e0cc8559915f3fd1d Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:10:12 -0500 Subject: [PATCH 073/115] feat: improve descriptions for catalog number inheritance --- .../Preferences/CollectionDefinitions.tsx | 38 +++++++++++++++++-- .../lib/localization/preferences.behavior.ts | 8 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index ffedbb29c31..449b1ed2be8 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -19,6 +19,8 @@ import { genericTables } from '../DataModel/tables'; import type { Tables } from '../DataModel/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; +import { tables } from '../DataModel/tables'; +import { getField } from '../DataModel/helpers'; const tableLabel = (tableName: keyof Tables): LocalizedString => genericTables[tableName]?.label ?? camelToHuman(tableName); @@ -205,8 +207,22 @@ export const collectionPreferenceDefinitions = { title: () => tableLabel('CollectionObjectGroup'), items: { inheritance: definePref({ - title: preferencesText.inheritanceCatNumberPref(), - description: preferencesText.inheritanceCatNumberPrefDescription(), + title: () => + preferencesText.inheritanceCatNumberPref({ + catalogNumber: getField( + tables.CollectionObject, + 'catalogNumber' + ).label, + collectionObject: tables.CollectionObject.label, + }), + description: () => + preferencesText.inheritanceCatNumberPrefDescription({ + catalogNumber: getField( + tables.CollectionObject, + 'catalogNumber' + ).label, + collectionObject: tables.CollectionObject.label, + }), requiresReload: false, visible: true, defaultValue: false, @@ -218,8 +234,22 @@ export const collectionPreferenceDefinitions = { title: () => camelToHuman('Component'), items: { inheritance: definePref({ - title: preferencesText.inheritanceCatNumberParentCOPref(), - description: preferencesText.inheritanceCatNumberParentCOPrefDescription(), + title: () => + preferencesText.inheritanceCatNumberPref({ + catalogNumber: getField( + tables.CollectionObject, + 'catalogNumber' + ).label, + collectionObject: tables.CollectionObject.label, + }), + description: () => + preferencesText.inheritanceCatNumberParentCOPrefDescription({ + catalogNumber: getField( + tables.CollectionObject, + 'catalogNumber' + ).label, + collectionObject: tables.CollectionObject.label, + }), requiresReload: false, visible: true, defaultValue: false, diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 7ea667010ed..9b0cf0e6901 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -1138,19 +1138,19 @@ altClickToSupressNewTab: { }, inheritanceCatNumberPref: { 'en-us': - 'Enable Catalog Number Inheritance From Primary CO', + 'Enable {catalogNumber:string} Inheritance From Primary {collectionObject:string}', }, inheritanceCatNumberPrefDescription: { 'en-us': - 'Control whether component records inherit catalog numbers from their primary Collection Object.', + 'Control whether component records inherit the {catalogNumber:string} from the primary {collectionObject:string}.', }, inheritanceCatNumberParentCOPref: { 'en-us': - 'Enable Catalog Number Inheritance From Parent CO', + 'Enable {catalogNumber:string} Inheritance From Parent {collectionObject:string}', }, inheritanceCatNumberParentCOPrefDescription: { 'en-us': - 'Control whether component records inherit catalog numbers from their parent Collection Object.', + 'Control whether component records inherit the {catalogNumber:string} from the parent {collectionObject:string}.', }, uniqueCatNumberAcrossCompAndCo: { 'en-us': From 88b775b8875fca1ec6b9025a0b6049a09fcb6620 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:15:05 -0500 Subject: [PATCH 074/115] feat: add better icon, distinguish preferences --- specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx | 1 + .../js_src/lib/components/Header/userToolDefinitions.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx index ef689b4435e..793d9c6c750 100644 --- a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx +++ b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx @@ -107,6 +107,7 @@ export const icons = { minus: , minusCircle: , nonStrict: , + building: , pencil: , pencilAt: , photos: , diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index ef262b42e9f..7e423a86b32 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -53,14 +53,14 @@ const rawUserTools = ensure>>>()({ }, [preferencesText.customization()]: { userPreferences: { - title: preferencesText.preferences(), + title: preferencesText.userPreferences(), url: '/specify/user-preferences/', icon: icons.cog, }, collectionPreferences: { title: preferencesText.collectionPreferences(), url: '/specify/collection-preferences/', - icon: icons.collection, + icon: icons.building, enabled: () => hasToolPermission('resources', 'update'), }, schemaConfig: { From 8fcfeea393b7b562265c9bea9633833d322889a4 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:20:43 -0500 Subject: [PATCH 075/115] fix: reorder trees in order of relevance --- .../Preferences/CollectionDefinitions.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 449b1ed2be8..32d63057f1f 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -84,41 +84,41 @@ export const collectionPreferenceDefinitions = { title: treeText.synonymizedNodes(), description: treeText.synonymizedNodesDescription(), items: { - 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': definePref({ - title: () => tableLabel('GeologicTimePeriod'), + title: () => tableLabel('Taxon'), requiresReload: false, visible: true, defaultValue: false, type: 'java.lang.Boolean', }), - 'sp7.allow_adding_child_to_synonymized_parent.Taxon': + 'sp7.allow_adding_child_to_synonymized_parent.Geography': definePref({ - title: () => tableLabel('Taxon'), + title: () => tableLabel('Geography'), requiresReload: false, visible: true, defaultValue: false, type: 'java.lang.Boolean', }), - 'sp7.allow_adding_child_to_synonymized_parent.Geography': + 'sp7.allow_adding_child_to_synonymized_parent.Storage': definePref({ - title: () => tableLabel('Geography'), + title: () => tableLabel('Storage'), requiresReload: false, visible: true, defaultValue: false, type: 'java.lang.Boolean', }), - 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': definePref({ - title: () => tableLabel('LithoStrat'), + title: () => tableLabel('GeologicTimePeriod'), requiresReload: false, visible: true, defaultValue: false, type: 'java.lang.Boolean', }), - 'sp7.allow_adding_child_to_synonymized_parent.Storage': + 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': definePref({ - title: () => tableLabel('Storage'), + title: () => tableLabel('LithoStrat'), requiresReload: false, visible: true, defaultValue: false, From 9f315e431e9adf13c70b3b1f1fdcb4f5318aa4fb Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:33:43 -0500 Subject: [PATCH 076/115] feat(collection preferences): add sidebar --- .../lib/components/Preferences/Aside.tsx | 5 +++- .../lib/components/Preferences/Editor.tsx | 24 ++++++++++++++++++- .../components/Preferences/useTopChild.tsx | 14 +++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx index 806575fafad..2e4e6cd813e 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx @@ -7,18 +7,21 @@ import type { GetSet, WritableArray } from '../../utils/types'; import { Link } from '../Atoms/Link'; import { pathIsOverlay } from '../Router/UnloadProtect'; import { scrollIntoView } from '../TreeView/helpers'; +import type { PreferenceType } from './index'; import { usePrefDefinitions } from './index'; export function PreferencesAside({ activeCategory, setActiveCategory, references, + prefType = 'user', }: { readonly activeCategory: number | undefined; readonly setActiveCategory: (activeCategory: number | undefined) => void; readonly references: React.RefObject>; + readonly prefType?: PreferenceType; }): JSX.Element { - const definitions = usePrefDefinitions(); + const definitions = usePrefDefinitions(prefType); const navigate = useNavigate(); const location = useLocation(); const isInOverlay = pathIsOverlay(location.pathname); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 6b6be980014..7d29fcd96d9 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -4,7 +4,9 @@ import { useLiveState } from '../../hooks/useLiveState'; import type { AppResourceTabProps } from '../AppResources/TabDefinitions'; import type { PreferenceType } from '../Preferences'; import { PreferencesContent } from '../Preferences'; +import { PreferencesAside } from '../Preferences/Aside'; import { BasePreferences } from '../Preferences/BasePreferences'; +import { useTopChild } from '../Preferences/useTopChild'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; @@ -75,10 +77,30 @@ function createPreferencesEditor( const Provider = Context.Provider; const contentProps = prefType === undefined ? {} : { prefType }; + const { + visibleChild, + setVisibleChild, + references, + forwardRefs, + scrollContainerRef, + } = useTopChild(); + const asidePrefType = prefType ?? 'user'; return ( - +
+ + + +
); }; diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx index cfa5e33cc54..ffd024d0195 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx @@ -54,10 +54,20 @@ export function useTopChild(): { const observer = new ResizeObserver(handleChange); observer.observe(container); - const scroll = listen(container, 'scroll', handleChange); + const scrollTargets: HTMLElement[] = []; + for ( + let element: HTMLElement | null = container; + element !== null; + element = element.parentElement + ) + scrollTargets.push(element); + const uniqueScrollTargets = Array.from(new Set(scrollTargets)); + const scrollCleanups = uniqueScrollTargets.map((target) => + listen(target, 'scroll', handleChange) + ); return (): void => { observer.disconnect(); - scroll(); + scrollCleanups.forEach((cleanup) => cleanup()); }; }, [container]); From 1eec2582eb20bdc2b139372e2bb6766034f249f5 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:43:59 -0500 Subject: [PATCH 077/115] feat(preferences): match user preferences visual --- .../lib/components/Preferences/index.tsx | 240 ++---------------- 1 file changed, 17 insertions(+), 223 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 02a26d1d4c7..ac4cd639ee6 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -14,30 +14,16 @@ import { preferencesText } from '../../localization/preferences'; import { StringToJsx } from '../../localization/utils'; import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; -import { AppResourceEditor } from '../AppResources/Editor'; -import { getScope, globalResourceKey } from '../AppResources/tree'; -import type { ScopedAppResourceDir } from '../AppResources/types'; import { Container, H2, Key } from '../Atoms'; import { Button } from '../Atoms/Button'; import { className } from '../Atoms/className'; -import { DataEntry } from '../Atoms/DataEntry'; import { Form } from '../Atoms/Form'; import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; -import type { SerializedResource } from '../DataModel/helperTypes'; -import { fetchResource, strictIdFromUrl } from '../DataModel/resource'; -import { serializeResource } from '../DataModel/serializers'; -import type { - SpAppResource, - SpAppResourceDir, - SpViewSetObj, -} from '../DataModel/types'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { hasPermission } from '../Permissions/helpers'; import { ProtectedTool } from '../Permissions/PermissionDenied'; -import { userTypes } from '../PickLists/definitions'; -import { formatUrl } from '../Router/queryString'; import { PreferencesAside } from './Aside'; import type { BasePreferences } from './BasePreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; @@ -113,20 +99,29 @@ const preferencesPromise = Promise.all([ collectionPreferences.fetch(), ]).then(f.true); -function Preferences(): JSX.Element { +function Preferences({ + prefType = 'user', +}: { + readonly prefType?: PreferenceType; +} = {}): JSX.Element { const [changesMade, handleChangesMade] = useBooleanState(); const [needsRestart, handleRestartNeeded] = useBooleanState(); const loading = React.useContext(LoadingContext); const navigate = useNavigate(); + const basePreferences = preferenceInstances[prefType]; + const heading = + prefType === 'collection' + ? preferencesText.collectionPreferences() + : preferencesText.preferences(); React.useEffect( () => - userPreferences.events.on('update', (payload) => { + basePreferences.events.on('update', (payload) => { if (payload?.definition?.requiresReload === true) handleRestartNeeded(); handleChangesMade(); }), - [handleChangesMade, handleRestartNeeded] + [basePreferences, handleChangesMade, handleRestartNeeded] ); const { @@ -139,12 +134,12 @@ function Preferences(): JSX.Element { return ( -

{preferencesText.preferences()}

+

{heading}

loading( - userPreferences + basePreferences .awaitSynced() .then(() => needsRestart @@ -160,10 +155,11 @@ function Preferences(): JSX.Element { > - +
@@ -540,7 +536,7 @@ function Item({ function CollectionPreferences(): JSX.Element { return ( - + ); } @@ -571,205 +567,3 @@ export function CollectionPreferencesWrapper(): JSX.Element | null { ); } - -type ResourceWithData = { - readonly id: number; - readonly data: string | null; - readonly name: string; - readonly mimetype: string | null; - readonly metadata: string | null; -}; - -type LoadedCollectionPreferences = { - readonly resource: SerializedResource; - readonly directory: ScopedAppResourceDir; - readonly data: ResourceWithData; -}; - -const isAppResource = ( - resource: SerializedResource -): resource is SerializedResource => - resource._tableName === 'SpAppResource'; - -function CollectionPreferencesStandalone(): JSX.Element { - const navigate = useNavigate(); - const [state, setState] = React.useState< - LoadedCollectionPreferences | undefined - >(undefined); - const [error, setError] = React.useState(undefined); - - const renderStatus = React.useCallback( - (body: React.ReactNode, role?: 'alert'): JSX.Element => ( - -

{preferencesText.collectionPreferences()}

-
- {body} -
-
- ), - [] - ); - - React.useEffect(() => { - let isMounted = true; - const load = async () => { - try { - const rawData = - (await collectionPreferences.fetch()) as ResourceWithData; - const data: ResourceWithData = { - ...rawData, - data: rawData.data ?? '', - }; - if (!isMounted) return; - const resource = await fetchResource('SpAppResource', data.id); - if (!isMounted) return; - const directory = await resolveDirectory(resource); - if (!isMounted) return; - setState({ resource, directory, data }); - } catch (loadError) { - if (!isMounted) return; - setError(loadError); - } - }; - load(); - return () => { - isMounted = false; - }; - }, []); - - const handleClone = React.useCallback( - ( - clonedResource: SerializedResource, - cloneId: number | undefined - ) => { - const appResourceClone = isAppResource(clonedResource) - ? clonedResource - : undefined; - if (appResourceClone === undefined) return; - const directoryKey = - state === undefined - ? globalResourceKey - : (getDirectoryKey(state.directory) ?? globalResourceKey); - navigate( - formatUrl('/specify/resources/app-resource/new/', { - directoryKey, - name: appResourceClone.name, - ...(appResourceClone.mimeType == null - ? {} - : { mimeType: appResourceClone.mimeType }), - clone: cloneId, - }) - ); - }, - [navigate, state] - ); - - if (error !== undefined && state === undefined) - return renderStatus( - 'Failed to open collection preferences. Try accessing them through App Resources.', - 'alert' - ); - - if (state === undefined) return renderStatus(commonText.loading()); - - return ( - - { - setState((previousState) => - previousState === undefined - ? previousState - : { - resource: - updatedResource as SerializedResource, - directory: updatedDirectory, - data: previousState.data, - } - ); - collectionPreferences - .fetch() - .then((rawData) => ({ - ...rawData, - data: rawData.data ?? '', - })) - .then((updatedData) => { - setState({ - resource: updatedResource as SerializedResource, - directory: updatedDirectory, - data: updatedData as ResourceWithData, - }); - }) - .catch((fetchError) => { - if (state === undefined) setError(fetchError); - }); - }} - > - {({ headerJsx, headerButtons, form, footer }): JSX.Element => ( - - - {headerJsx} - {headerButtons} - - {form} - {footer} - - )} - - - ); -} - -async function resolveDirectory( - resource: SerializedResource -): Promise { - const rawDirectory = resource.spAppResourceDir; - let directory: SerializedResource; - if (typeof rawDirectory === 'string') { - directory = await fetchResource( - 'SpAppResourceDir', - strictIdFromUrl(rawDirectory) - ); - } else if (typeof rawDirectory === 'object' && rawDirectory !== null) { - directory = serializeResource(rawDirectory); - } else { - throw new Error('Collection preferences resource is missing directory'); - } - return { - ...directory, - scope: getScope(directory), - }; -} - -function getDirectoryKey(directory: ScopedAppResourceDir): string | undefined { - if (directory.scope === 'global') return globalResourceKey; - if (directory.scope === 'discipline' && directory.discipline !== null) - return `discipline_${strictIdFromUrl(directory.discipline)}`; - if (directory.scope === 'collection' && directory.collection !== null) - return `collection_${strictIdFromUrl(directory.collection)}`; - if ( - directory.scope === 'userType' && - directory.collection !== null && - directory.userType !== null - ) { - const userTypeLabel = - userTypes.find( - (type) => type.toLowerCase() === directory.userType?.toLowerCase() - ) ?? directory.userType; - return `collection_${strictIdFromUrl(directory.collection)}_userType_${userTypeLabel}`; - } - if ( - directory.scope === 'user' && - directory.collection !== null && - directory.specifyUser !== null - ) - return `collection_${strictIdFromUrl(directory.collection)}_user_${strictIdFromUrl(directory.specifyUser)}`; - return undefined; -} From 0d16c07ca982dc3a3bcc3d3c0e165c179709f952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Tue, 14 Oct 2025 11:08:15 +0000 Subject: [PATCH 078/115] Sync localization strings with Weblate Triggered by 51785669349b5cd30b9a4caf28b0e305ebec1449 on branch refs/heads/weblate-localization --- .../frontend/js_src/lib/localization/forms.ts | 26 +- .../frontend/js_src/lib/localization/query.ts | 1577 +++++++++-------- .../js_src/lib/localization/resources.ts | 133 +- 3 files changed, 903 insertions(+), 833 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/forms.ts b/specifyweb/frontend/js_src/lib/localization/forms.ts index 2a0134fe21b..15fcf9ac64e 100644 --- a/specifyweb/frontend/js_src/lib/localization/forms.ts +++ b/specifyweb/frontend/js_src/lib/localization/forms.ts @@ -1042,20 +1042,22 @@ export const formsText = createDictionary({ "pt-br": "Numeração automática", }, autoNumberByYear: { - 'en-us': 'Auto-number by year', - 'de-ch': 'Auto-Nummer nach Jahr', - 'es-es': 'Auto-número por año', - 'fr-fr': 'Auto-numéro par année', - 'ru-ru': 'Автонумерация по году', - 'uk-ua': 'Автонумерація за роком', + "en-us": "Auto-number by year", + "de-ch": "Auto-Nummer nach Jahr", + "es-es": "Auto-número por año", + "fr-fr": "Auto-numéro par année", + "ru-ru": "Автонумерация по году", + "uk-ua": "Автонумерація за роком", + "pt-br": "", }, autoNumber: { - 'en-us': 'Auto-number', - 'de-ch': 'Auto-Nummer', - 'es-es': 'Auto-número', - 'fr-fr': 'Auto-numéro', - 'ru-ru': 'Автонумерация', - 'uk-ua': 'Автонумерація', + "en-us": "Auto-number", + "de-ch": "Auto-Nummer", + "es-es": "Auto-número", + "fr-fr": "Auto-numéro", + "ru-ru": "Автонумерация", + "uk-ua": "Автонумерація", + "pt-br": "", }, editFormDefinition: { "en-us": "Edit Form Definition", diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index 6cb86bf80f1..0b711313afe 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -4,977 +4,978 @@ * @module */ -import { createDictionary } from './utils'; +import { createDictionary } from "./utils"; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const queryText = createDictionary({ query: { - 'en-us': 'Query', - 'ru-ru': 'Запрос', - 'es-es': 'Consulta', - 'fr-fr': 'Requête', - 'uk-ua': 'Запит', - 'de-ch': 'Abfrage', - 'pt-br': 'Consulta', + "en-us": "Query", + "ru-ru": "Запрос", + "es-es": "Consulta", + "fr-fr": "Requête", + "uk-ua": "Запит", + "de-ch": "Abfrage", + "pt-br": "Consulta", }, queries: { - 'en-us': 'Queries', - 'ru-ru': 'Запросы', - 'es-es': 'Consultas', - 'fr-fr': 'Requêtes', - 'uk-ua': 'Запити', - 'de-ch': 'Abfragen', - 'pt-br': 'Consultas', + "en-us": "Queries", + "ru-ru": "Запросы", + "es-es": "Consultas", + "fr-fr": "Requêtes", + "uk-ua": "Запити", + "de-ch": "Abfragen", + "pt-br": "Consultas", }, queryBuilder: { - 'en-us': 'Query Builder', - 'ru-ru': 'Конструктор запросов', - 'es-es': 'Generador de consultas', - 'fr-fr': 'Générateur de requêtes', - 'uk-ua': 'Конструктор запитів', - 'de-ch': 'Query Builder', - 'pt-br': 'Construtor de consultas', + "en-us": "Query Builder", + "ru-ru": "Конструктор запросов", + "es-es": "Generador de consultas", + "fr-fr": "Générateur de requêtes", + "uk-ua": "Конструктор запитів", + "de-ch": "Query Builder", + "pt-br": "Construtor de consultas", }, newQueryName: { - 'en-us': 'New Query', - 'es-es': 'Nueva consulta', - 'uk-ua': 'Новий запит', - 'de-ch': 'Neue Abfrage', - 'fr-fr': 'Nouvelle requête', - 'ru-ru': 'Новый запрос', - 'pt-br': 'Nova consulta', + "en-us": "New Query", + "es-es": "Nueva consulta", + "uk-ua": "Новий запит", + "de-ch": "Neue Abfrage", + "fr-fr": "Nouvelle requête", + "ru-ru": "Новый запрос", + "pt-br": "Nova consulta", }, searchFields: { comment: ` Used in a Query Combo Box's hover-over message to show which fields are being searched on `, - 'en-us': 'Searched fields', - 'ru-ru': 'Поля поиска', - 'es-es': 'Campos buscados', - 'fr-fr': 'Champs recherchés', - 'uk-ua': 'Пошукові поля', - 'de-ch': 'Durchsuchte Felder', - 'pt-br': 'Campos pesquisados', + "en-us": "Searched fields", + "ru-ru": "Поля поиска", + "es-es": "Campos buscados", + "fr-fr": "Champs recherchés", + "uk-ua": "Пошукові поля", + "de-ch": "Durchsuchte Felder", + "pt-br": "Campos pesquisados", }, any: { - 'en-us': 'Any', - 'ru-ru': 'Любой', - 'es-es': 'Cualquiera', - 'fr-fr': "N'importe lequel", - 'uk-ua': 'Будь-який', - 'de-ch': 'Beliebig', - 'pt-br': 'Qualquer', + "en-us": "Any", + "ru-ru": "Любой", + "es-es": "Cualquiera", + "fr-fr": "N'importe lequel", + "uk-ua": "Будь-який", + "de-ch": "Beliebig", + "pt-br": "Qualquer", }, startValue: { - 'en-us': 'Start Value', - 'ru-ru': 'Начальное значение', - 'es-es': 'Valor inicial', - 'fr-fr': 'Valeur de départ', - 'uk-ua': 'Початкове значення', - 'de-ch': 'Startwert', - 'pt-br': 'Valor inicial', + "en-us": "Start Value", + "ru-ru": "Начальное значение", + "es-es": "Valor inicial", + "fr-fr": "Valeur de départ", + "uk-ua": "Початкове значення", + "de-ch": "Startwert", + "pt-br": "Valor inicial", }, endValue: { - 'en-us': 'End Value', - 'ru-ru': 'Конечное значение', - 'es-es': 'Valor final', - 'fr-fr': 'Valeur finale', - 'uk-ua': 'Кінцеве значення', - 'de-ch': 'Endwert', - 'pt-br': 'Valor final', + "en-us": "End Value", + "ru-ru": "Конечное значение", + "es-es": "Valor final", + "fr-fr": "Valeur finale", + "uk-ua": "Кінцеве значення", + "de-ch": "Endwert", + "pt-br": "Valor final", }, saveQuery: { - 'en-us': 'Save Query', - 'ru-ru': 'Сохранить запрос', - 'es-es': 'Guardar consulta', - 'fr-fr': 'Enregistrer la requête', - 'uk-ua': 'Зберегти запит', - 'de-ch': 'Abfrage speichern', - 'pt-br': 'Salvar consulta', + "en-us": "Save Query", + "ru-ru": "Сохранить запрос", + "es-es": "Guardar consulta", + "fr-fr": "Enregistrer la requête", + "uk-ua": "Зберегти запит", + "de-ch": "Abfrage speichern", + "pt-br": "Salvar consulta", }, saveClonedQuery: { - 'en-us': 'Save query as...', - 'ru-ru': 'Сохранить запрос как...', - 'es-es': 'Guardar consulta como...', - 'fr-fr': 'Enregistrer la requête sous...', - 'uk-ua': 'Зберегти запит як...', - 'de-ch': 'Abfrage speichern unter...', - 'pt-br': 'Salvar consulta como...', + "en-us": "Save query as...", + "ru-ru": "Сохранить запрос как...", + "es-es": "Guardar consulta como...", + "fr-fr": "Enregistrer la requête sous...", + "uk-ua": "Зберегти запит як...", + "de-ch": "Abfrage speichern unter...", + "pt-br": "Salvar consulta como...", }, saveClonedQueryDescription: { - 'en-us': - 'The query will be saved with a new name leaving the current query unchanged.', - 'ru-ru': - 'Запрос будет сохранен под новым именем, текущий запрос останется без изменений.', - 'es-es': - 'La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.', - 'fr-fr': - 'La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.', - 'uk-ua': - 'Запит буде збережено з новою назвою, а поточний запит залишиться без змін.', - 'de-ch': - 'Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.', - 'pt-br': - 'A consulta será salva com um novo nome, deixando a consulta atual inalterada.', + "en-us": + "The query will be saved with a new name leaving the current query unchanged.", + "ru-ru": + "Запрос будет сохранен под новым именем, текущий запрос останется без изменений.", + "es-es": + "La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.", + "fr-fr": + "La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.", + "uk-ua": + "Запит буде збережено з новою назвою, а поточний запит залишиться без змін.", + "de-ch": + "Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.", + "pt-br": + "A consulta será salva com um novo nome, deixando a consulta atual inalterada.", }, queryDeleteIncomplete: { - 'en-us': 'Query definition contains incomplete fields', - 'ru-ru': 'Определение запроса содержит неполные поля', - 'es-es': 'La definición de consulta contiene campos incompletos', - 'fr-fr': 'La définition de la requête contient des champs incomplets', - 'uk-ua': 'Визначення запиту містить незаповнені поля', - 'de-ch': 'Abfragedefinition enthält unvollständige Felder', - 'pt-br': 'A definição da consulta contém campos incompletos', + "en-us": "Query definition contains incomplete fields", + "ru-ru": "Определение запроса содержит неполные поля", + "es-es": "La definición de consulta contiene campos incompletos", + "fr-fr": "La définition de la requête contient des champs incomplets", + "uk-ua": "Визначення запиту містить незаповнені поля", + "de-ch": "Abfragedefinition enthält unvollständige Felder", + "pt-br": "A definição da consulta contém campos incompletos", }, queryDeleteIncompleteDescription: { - 'en-us': - 'There are uncompleted fields in the query definition. Do you want to remove them?', - 'ru-ru': - 'В определении запроса есть незаполненные поля. Хотите их удалить?', - 'es-es': - 'Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?', - 'fr-fr': - 'Il y a des champs incomplets dans la définition de la requête. Voulez-vous les supprimer ?', - 'uk-ua': 'У визначенні запиту є незаповнені поля. Ви хочете видалити їх?', - 'de-ch': - 'Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?', - 'pt-br': - 'Há campos incompletos na definição da consulta. Deseja removê-los?', + "en-us": + "There are uncompleted fields in the query definition. Do you want to remove them?", + "ru-ru": + "В определении запроса есть незаполненные поля. Хотите их удалить?", + "es-es": + "Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?", + "fr-fr": + "Il y a des champs incomplets dans la définition de la requête. Voulez-vous les supprimer ?", + "uk-ua": "У визначенні запиту є незаповнені поля. Ви хочете видалити їх?", + "de-ch": + "Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?", + "pt-br": + "Há campos incompletos na definição da consulta. Deseja removê-los?", }, queryUnloadProtect: { - 'en-us': 'The new or modified query definition has not been saved', - 'ru-ru': 'Новое или измененное определение запроса не было сохранено.', - 'es-es': 'La definición de consulta nueva o modificada no se ha guardado', - 'fr-fr': + "en-us": "The new or modified query definition has not been saved", + "ru-ru": "Новое или измененное определение запроса не было сохранено.", + "es-es": "La definición de consulta nueva o modificada no se ha guardado", + "fr-fr": "La définition de requête nouvelle ou modifiée n'a pas été enregistrée", - 'uk-ua': 'Нове або змінене визначення запиту не було збережено', - 'de-ch': - 'Die neue oder geänderte Abfragedefinition wurde nicht gespeichert', - 'pt-br': 'A definição de consulta nova ou modificada não foi salva', + "uk-ua": "Нове або змінене визначення запиту не було збережено", + "de-ch": + "Die neue oder geänderte Abfragedefinition wurde nicht gespeichert", + "pt-br": "A definição de consulta nova ou modificada não foi salva", }, recordSetToQuery: { - comment: 'Example: Creating a Record Set from Query', - 'en-us': 'Creating a {recordSetTable:string} from Query', - 'ru-ru': 'Создание {recordSetTable:string} из запроса', - 'es-es': 'Creando un {recordSetTable:string} a partir de una consulta', - 'fr-fr': "Création d'un {recordSetTable:string} à partir d'une requête", - 'uk-ua': 'Створення {recordSetTable:string} із запиту', - 'de-ch': 'Erstellen eines {recordSetTable:string} aus einer Abfrage', - 'pt-br': 'Criando um {recordSetTable:string} a partir da consulta', + comment: "Example: Creating a Record Set from Query", + "en-us": "Creating a {recordSetTable:string} from Query", + "ru-ru": "Создание {recordSetTable:string} из запроса", + "es-es": "Creando un {recordSetTable:string} a partir de una consulta", + "fr-fr": "Création d'un {recordSetTable:string} à partir d'une requête", + "uk-ua": "Створення {recordSetTable:string} із запиту", + "de-ch": "Erstellen eines {recordSetTable:string} aus einer Abfrage", + "pt-br": "Criando um {recordSetTable:string} a partir da consulta", }, recordSetToQueryDescription: { - 'en-us': 'Generating {recordSetTable:string}...', - 'ru-ru': 'Генерация {recordSetTable:string}...', - 'es-es': 'Generando {recordSetTable:string}...', - 'fr-fr': 'Génération de {recordSetTable:string}...', - 'uk-ua': 'Створення {recordSetTable:string}...', - 'de-ch': '{recordSetTable:string} wird generiert...', - 'pt-br': 'Gerando {recordSetTable:string}...', + "en-us": "Generating {recordSetTable:string}...", + "ru-ru": "Генерация {recordSetTable:string}...", + "es-es": "Generando {recordSetTable:string}...", + "fr-fr": "Génération de {recordSetTable:string}...", + "uk-ua": "Створення {recordSetTable:string}...", + "de-ch": "{recordSetTable:string} wird generiert...", + "pt-br": "Gerando {recordSetTable:string}...", }, recordSetCreated: { - 'en-us': '{recordSetTable:string} Created', - 'ru-ru': '{recordSetTable:string} Создано', - 'es-es': '{recordSetTable:string} Creado', - 'fr-fr': '{recordSetTable:string} Créé', - 'uk-ua': '{recordSetTable:string} Створено', - 'de-ch': '{recordSetTable:string} Erstellt', - 'pt-br': '{recordSetTable:string} Criado', + "en-us": "{recordSetTable:string} Created", + "ru-ru": "{recordSetTable:string} Создано", + "es-es": "{recordSetTable:string} Creado", + "fr-fr": "{recordSetTable:string} Créé", + "uk-ua": "{recordSetTable:string} Створено", + "de-ch": "{recordSetTable:string} Erstellt", + "pt-br": "{recordSetTable:string} Criado", }, missingCoordinatesForKml: { - 'en-us': 'Unable to export to KML', - 'ru-ru': 'Невозможно экспортировать в KML', - 'es-es': 'No se puede exportar a KML', - 'fr-fr': "Impossible d'exporter vers KML", - 'uk-ua': 'Не вдалося експортувати в KML', - 'de-ch': 'Export in KML nicht möglich', - 'pt-br': 'Não é possível exportar para KML', + "en-us": "Unable to export to KML", + "ru-ru": "Невозможно экспортировать в KML", + "es-es": "No se puede exportar a KML", + "fr-fr": "Impossible d'exporter vers KML", + "uk-ua": "Не вдалося експортувати в KML", + "de-ch": "Export in KML nicht möglich", + "pt-br": "Não é possível exportar para KML", }, missingCoordinatesForKmlDescription: { - 'en-us': 'Please add latitude and longitude fields to the query.', - 'ru-ru': 'Пожалуйста, добавьте в запрос поля широты и долготы.', - 'es-es': 'Agregue campos de latitud y longitud a la consulta.', - 'fr-fr': - 'Veuillez ajouter les champs de latitude et de longitude à la requête.', - 'uk-ua': 'Будь ласка, додайте поля широти та довготи до запиту.', - 'de-ch': 'Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.', - 'pt-br': 'Adicione campos de latitude e longitude à consulta.', + "en-us": "Please add latitude and longitude fields to the query.", + "ru-ru": "Пожалуйста, добавьте в запрос поля широты и долготы.", + "es-es": "Agregue campos de latitud y longitud a la consulta.", + "fr-fr": + "Veuillez ajouter les champs de latitude et de longitude à la requête.", + "uk-ua": "Будь ласка, додайте поля широти та довготи до запиту.", + "de-ch": "Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.", + "pt-br": "Adicione campos de latitude e longitude à consulta.", }, queryExportStarted: { - 'en-us': 'Export File Being Created', - 'ru-ru': 'Создается экспортный файл', - 'es-es': 'Creando archivo de exportación', - 'fr-fr': "Fichier d'exportation en cours de création", - 'uk-ua': 'Експортний файл створюється', - 'de-ch': 'Exportdatei wird erstellt', - 'pt-br': 'Arquivo de exportação sendo criado', + "en-us": "Export File Being Created", + "ru-ru": "Создается экспортный файл", + "es-es": "Creando archivo de exportación", + "fr-fr": "Fichier d'exportation en cours de création", + "uk-ua": "Експортний файл створюється", + "de-ch": "Exportdatei wird erstellt", + "pt-br": "Arquivo de exportação sendo criado", }, queryExportStartedDescription: { - 'en-us': - 'A notification will appear when the export file is complete and ready for download.', - 'es-es': - 'Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.', - 'uk-ua': - 'Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.', - 'de-ch': - 'Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.', - 'fr-fr': + "en-us": + "A notification will appear when the export file is complete and ready for download.", + "es-es": + "Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.", + "uk-ua": + "Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.", + "de-ch": + "Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.", + "fr-fr": "Une notification apparaîtra lorsque le fichier d'exportation sera terminé et prêt à être téléchargé.", - 'ru-ru': - 'Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.', - 'pt-br': - 'Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.', + "ru-ru": + "Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.", + "pt-br": + "Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.", }, invalidPicklistValue: { - comment: 'Used when selected pick list value is not one of allowed values', - 'en-us': '{value:string} (current, invalid value)', - 'ru-ru': '{value:string} (текущее, недопустимое значение)', - 'es-es': '{value:string} (valor actual, no válido)', - 'fr-fr': '{value:string} (valeur actuelle, non valide)', - 'uk-ua': '{value:string} (поточне, недійсне значення)', - 'de-ch': '{value:string} (aktueller, ungültiger Wert)', - 'pt-br': '{value:string} (valor atual, inválido)', + comment: "Used when selected pick list value is not one of allowed values", + "en-us": "{value:string} (current, invalid value)", + "ru-ru": "{value:string} (текущее, недопустимое значение)", + "es-es": "{value:string} (valor actual, no válido)", + "fr-fr": "{value:string} (valeur actuelle, non valide)", + "uk-ua": "{value:string} (поточне, недійсне значення)", + "de-ch": "{value:string} (aktueller, ungültiger Wert)", + "pt-br": "{value:string} (valor atual, inválido)", }, queryRecordSetTitle: { - comment: 'Used in query builder header when querying on record set', - 'en-us': + comment: "Used in query builder header when querying on record set", + "en-us": 'Query: "{queryName:string}" on {recordSetTable:string}: "{recordSetName:string}"', - 'ru-ru': + "ru-ru": 'Запрос: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - 'es-es': + "es-es": 'Consulta: "{queryName:string}" en {recordSetTable:string}: "{recordSetName:string}"', - 'fr-fr': - 'Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »', - 'uk-ua': + "fr-fr": + "Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »", + "uk-ua": 'Запит: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - 'de-ch': + "de-ch": 'Abfrage: "{queryName:string}" auf {recordSetTable:string}: "{recordSetName:string}"', - 'pt-br': + "pt-br": 'Consulta: "{queryName:string}" em {recordSetTable:string}: "{recordSetName:string}"', }, treeQueryName: { - comment: 'Used in query builder header when querying on tree node usages', - 'en-us': '{tableName:string} using "{nodeFullName:string}"', - 'ru-ru': '{tableName:string} используя «{nodeFullName:string}»', - 'es-es': '{tableName:string} usando "{nodeFullName:string}"', - 'fr-fr': '{tableName:string} en utilisant « {nodeFullName:string} »', - 'uk-ua': '{tableName:string} за допомогою "{nodeFullName:string}"', - 'de-ch': '{tableName:string} mit "{nodeFullName:string}"', - 'pt-br': '{tableName:string} usando "{nodeFullName:string}"', + comment: "Used in query builder header when querying on tree node usages", + "en-us": '{tableName:string} using "{nodeFullName:string}"', + "ru-ru": "{tableName:string} используя «{nodeFullName:string}»", + "es-es": '{tableName:string} usando "{nodeFullName:string}"', + "fr-fr": "{tableName:string} en utilisant « {nodeFullName:string} »", + "uk-ua": '{tableName:string} за допомогою "{nodeFullName:string}"', + "de-ch": '{tableName:string} mit "{nodeFullName:string}"', + "pt-br": '{tableName:string} usando "{nodeFullName:string}"', }, newButtonDescription: { - 'en-us': 'Add New Field', - 'ru-ru': 'Добавить новое поле', - 'es-es': 'Agregar nuevo campo', - 'fr-fr': 'Ajouter un nouveau champ', - 'uk-ua': 'Додати нове поле', - 'de-ch': 'Neues Feld hinzufügen', - 'pt-br': 'Adicionar novo campo', + "en-us": "Add New Field", + "ru-ru": "Добавить новое поле", + "es-es": "Agregar nuevo campo", + "fr-fr": "Ajouter un nouveau champ", + "uk-ua": "Додати нове поле", + "de-ch": "Neues Feld hinzufügen", + "pt-br": "Adicionar novo campo", }, countOnly: { - comment: 'Verb', - 'en-us': 'Count', - 'ru-ru': 'Считать', - 'es-es': 'Conteo', - 'fr-fr': 'Compter', - 'uk-ua': 'Рахувати', - 'de-ch': 'Zählen', - 'pt-br': 'Contar', + comment: "Verb", + "en-us": "Count", + "ru-ru": "Считать", + "es-es": "Conteo", + "fr-fr": "Compter", + "uk-ua": "Рахувати", + "de-ch": "Zählen", + "pt-br": "Contar", }, distinct: { - 'en-us': 'Distinct', - 'ru-ru': 'Отчетливый', - 'es-es': 'Distinto', - 'fr-fr': 'Distinct', - 'uk-ua': 'Виразний', - 'de-ch': 'Unterscheidbar', - 'pt-br': 'Distinto', + "en-us": "Distinct", + "ru-ru": "Отчетливый", + "es-es": "Distinto", + "fr-fr": "Distinct", + "uk-ua": "Виразний", + "de-ch": "Unterscheidbar", + "pt-br": "Distinto", }, series: { - 'en-us': 'Series', - 'de-ch': 'Serie', - 'es-es': 'Serie', - 'fr-fr': 'Série', - 'pt-br': 'Série', - 'ru-ru': 'Ряд', - 'uk-ua': 'Серія', + "en-us": "Series", + "de-ch": "Serie", + "es-es": "Serie", + "fr-fr": "Série", + "pt-br": "Série", + "ru-ru": "Ряд", + "uk-ua": "Серія", }, createCsv: { - 'en-us': 'Create CSV', - 'ru-ru': 'Создать CSV-файл', - 'es-es': 'Crear CSV', - 'fr-fr': 'Créer un fichier CSV', - 'uk-ua': 'Створити CSV', - 'de-ch': 'CSV erstellen', - 'pt-br': 'Criar CSV', + "en-us": "Create CSV", + "ru-ru": "Создать CSV-файл", + "es-es": "Crear CSV", + "fr-fr": "Créer un fichier CSV", + "uk-ua": "Створити CSV", + "de-ch": "CSV erstellen", + "pt-br": "Criar CSV", }, createKml: { - 'en-us': 'Create KML', - 'ru-ru': 'Создать KML', - 'es-es': 'Crear KML', - 'fr-fr': 'Créer un fichier KML', - 'uk-ua': 'Створіть KML', - 'de-ch': 'KML erstellen', - 'pt-br': 'Criar KML', + "en-us": "Create KML", + "ru-ru": "Создать KML", + "es-es": "Crear KML", + "fr-fr": "Créer un fichier KML", + "uk-ua": "Створіть KML", + "de-ch": "KML erstellen", + "pt-br": "Criar KML", }, createRecordSet: { - 'en-us': 'Create {recordSetTable:string}', - 'ru-ru': 'Создать {recordSetTable:string}', - 'es-es': 'Crear {recordSetTable:string}', - 'fr-fr': 'Créer {recordSetTable:string}', - 'uk-ua': 'Створити {recordSetTable:string}', - 'de-ch': 'Erstellen {recordSetTable:string}', - 'pt-br': 'Criar {recordSetTable:string}', + "en-us": "Create {recordSetTable:string}", + "ru-ru": "Создать {recordSetTable:string}", + "es-es": "Crear {recordSetTable:string}", + "fr-fr": "Créer {recordSetTable:string}", + "uk-ua": "Створити {recordSetTable:string}", + "de-ch": "Erstellen {recordSetTable:string}", + "pt-br": "Criar {recordSetTable:string}", }, saveAs: { - 'en-us': 'Save As', - 'es-es': 'Guardar como', - 'uk-ua': 'Зберегти як', - 'de-ch': 'Speichern unter', - 'fr-fr': 'Enregistrer sous', - 'ru-ru': 'Сохранить как', - 'pt-br': 'Salvar como', + "en-us": "Save As", + "es-es": "Guardar como", + "uk-ua": "Зберегти як", + "de-ch": "Speichern unter", + "fr-fr": "Enregistrer sous", + "ru-ru": "Сохранить как", + "pt-br": "Salvar como", }, anyRank: { - 'en-us': '(any rank)', - 'ru-ru': '(любой ранг)', - 'es-es': '(cualquier rango)', - 'fr-fr': "(n'importe quel rang)", - 'uk-ua': '(будь-який ранг)', - 'de-ch': '(jeder Rang)', - 'pt-br': '(qualquer classificação)', + "en-us": "(any rank)", + "ru-ru": "(любой ранг)", + "es-es": "(cualquier rango)", + "fr-fr": "(n'importe quel rang)", + "uk-ua": "(будь-який ранг)", + "de-ch": "(jeder Rang)", + "pt-br": "(qualquer classificação)", }, anyTree: { - 'en-us': '(any tree)', - 'de-ch': '(jeder Baum)', - 'es-es': '(cualquier árbol)', - 'fr-fr': "(n'importe quel arbre)", - 'pt-br': '(qualquer árvore)', - 'ru-ru': '(любое дерево)', - 'uk-ua': '(будь-яке дерево)', + "en-us": "(any tree)", + "de-ch": "(jeder Baum)", + "es-es": "(cualquier árbol)", + "fr-fr": "(n'importe quel arbre)", + "pt-br": "(qualquer árvore)", + "ru-ru": "(любое дерево)", + "uk-ua": "(будь-яке дерево)", }, moveUp: { - comment: 'As in move it up', - 'en-us': 'Move Up', - 'ru-ru': 'Двигаться вверх', - 'es-es': 'Mover hacia arriba', - 'fr-fr': 'Monter', - 'uk-ua': 'Рухатися вгору', - 'de-ch': 'Nach oben', - 'pt-br': 'Mover para cima', + comment: "As in move it up", + "en-us": "Move Up", + "ru-ru": "Двигаться вверх", + "es-es": "Mover hacia arriba", + "fr-fr": "Monter", + "uk-ua": "Рухатися вгору", + "de-ch": "Nach oben", + "pt-br": "Mover para cima", }, moveDown: { - comment: 'As in move it down', - 'en-us': 'Move Down', - 'ru-ru': 'Двигаться вниз', - 'es-es': 'Mover hacia abajo', - 'fr-fr': 'Descendre', - 'uk-ua': 'Рухатися вниз', - 'de-ch': 'Nach unten', - 'pt-br': 'Mover para baixo', + comment: "As in move it down", + "en-us": "Move Down", + "ru-ru": "Двигаться вниз", + "es-es": "Mover hacia abajo", + "fr-fr": "Descendre", + "uk-ua": "Рухатися вниз", + "de-ch": "Nach unten", + "pt-br": "Mover para baixo", }, sort: { - 'en-us': 'Sort', - 'ru-ru': 'Сортировать', - 'es-es': 'Ordenar', - 'fr-fr': 'Trier', - 'uk-ua': 'Сортувати', - 'de-ch': 'Sortieren', - 'pt-br': 'Organizar', + "en-us": "Sort", + "ru-ru": "Сортировать", + "es-es": "Ordenar", + "fr-fr": "Trier", + "uk-ua": "Сортувати", + "de-ch": "Sortieren", + "pt-br": "Organizar", }, ascendingSort: { - 'en-us': 'Ascending Sort', - 'ru-ru': 'Сортировка по возрастанию', - 'es-es': 'Orden ascendente', - 'fr-fr': 'Tri croissant', - 'uk-ua': 'Сортування за зростанням', - 'de-ch': 'Aufsteigende Sortierung', - 'pt-br': 'Classificação crescente', + "en-us": "Ascending Sort", + "ru-ru": "Сортировка по возрастанию", + "es-es": "Orden ascendente", + "fr-fr": "Tri croissant", + "uk-ua": "Сортування за зростанням", + "de-ch": "Aufsteigende Sortierung", + "pt-br": "Classificação crescente", }, descendingSort: { - 'en-us': 'Descending Sort', - 'ru-ru': 'Сортировка по убыванию', - 'es-es': 'Orden descendente', - 'fr-fr': 'Tri décroissant', - 'uk-ua': 'Сортування за спаданням', - 'de-ch': 'Absteigende Sortierung', - 'pt-br': 'Classificação decrescente', + "en-us": "Descending Sort", + "ru-ru": "Сортировка по убыванию", + "es-es": "Orden descendente", + "fr-fr": "Tri décroissant", + "uk-ua": "Сортування за спаданням", + "de-ch": "Absteigende Sortierung", + "pt-br": "Classificação decrescente", }, negate: { - comment: 'as in negate query condition', - 'en-us': 'Negate', - 'ru-ru': 'Отрицать', - 'es-es': 'Negar', - 'fr-fr': 'Nier', - 'uk-ua': 'Заперечувати', - 'de-ch': 'Negieren', - 'pt-br': 'Negar', + comment: "as in negate query condition", + "en-us": "Negate", + "ru-ru": "Отрицать", + "es-es": "Negar", + "fr-fr": "Nier", + "uk-ua": "Заперечувати", + "de-ch": "Negieren", + "pt-br": "Negar", }, showButtonDescription: { - 'en-us': 'Show in results', - 'es-es': 'Mostrar en resultados', - 'uk-ua': 'Показати в результатах', - 'de-ch': 'In Ergebnissen anzeigen', - 'fr-fr': 'Afficher dans les résultats', - 'ru-ru': 'Показать в результатах', - 'pt-br': 'Mostrar nos resultados', + "en-us": "Show in results", + "es-es": "Mostrar en resultados", + "uk-ua": "Показати в результатах", + "de-ch": "In Ergebnissen anzeigen", + "fr-fr": "Afficher dans les résultats", + "ru-ru": "Показать в результатах", + "pt-br": "Mostrar nos resultados", }, aggregatedInline: { - 'en-us': '(aggregated)', - 'ru-ru': '(агрегированные)', - 'es-es': '(agregado)', - 'fr-fr': '(agrégés)', - 'uk-ua': '(узагальнено)', - 'de-ch': '(aggregiert)', - 'pt-br': '(agregado)', + "en-us": "(aggregated)", + "ru-ru": "(агрегированные)", + "es-es": "(agregado)", + "fr-fr": "(agrégés)", + "uk-ua": "(узагальнено)", + "de-ch": "(aggregiert)", + "pt-br": "(agregado)", }, formattedInline: { - 'en-us': '(formatted)', - 'ru-ru': '(отформатировано)', - 'es-es': '(formateado)', - 'fr-fr': '(formaté)', - 'uk-ua': '(відформатований)', - 'de-ch': '(formatiert)', - 'pt-br': '(formatado)', + "en-us": "(formatted)", + "ru-ru": "(отформатировано)", + "es-es": "(formateado)", + "fr-fr": "(formaté)", + "uk-ua": "(відформатований)", + "de-ch": "(formatiert)", + "pt-br": "(formatado)", }, like: { - 'en-us': 'Like', - 'ru-ru': 'Нравиться', - 'es-es': 'Como', - 'fr-fr': 'Comme', - 'uk-ua': 'Люблю', - 'de-ch': 'Wie', - 'pt-br': 'Como', + "en-us": "Like", + "ru-ru": "Нравиться", + "es-es": "Como", + "fr-fr": "Comme", + "uk-ua": "Люблю", + "de-ch": "Wie", + "pt-br": "Como", }, likeDescription: { comment: 'Explains the use of special symbols for the "like" query filter', - 'en-us': + "en-us": 'Use "%" to match any number of characters.\n\nUse "_" to match a single character', - 'ru-ru': - 'Используйте «%» для обозначения любого количества символов.\n\nИспользуйте «_» для обозначения одного символа.', - 'es-es': + "ru-ru": + "Используйте «%» для обозначения любого количества символов.\n\nИспользуйте «_» для обозначения одного символа.", + "es-es": 'Usar "%" para hacer coincidir cualquier número de caracteres.\n\nUsar "_" para hacer coincidir un solo carácter', - 'fr-fr': + "fr-fr": "Utilisez « % » pour correspondre à n'importe quel nombre de caractères.\n\nUtilisez « _ » pour correspondre à un seul caractère.", - 'uk-ua': + "uk-ua": 'Використовуйте "%", щоб відповідати будь-якій кількості символів.\n\nВикористовуйте "_", щоб відповідати одному символу', - 'de-ch': - 'Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen', - 'pt-br': + "de-ch": + "Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen", + "pt-br": 'Use "%" para corresponder a qualquer número de caracteres.\n\nUse "_" para corresponder a um único caractere.', }, equal: { - 'en-us': 'Equal', - 'ru-ru': 'Равный', - 'es-es': 'Igual', - 'fr-fr': 'Égal', - 'uk-ua': 'Рівні', - 'de-ch': 'Gleich', - 'pt-br': 'Igual', + "en-us": "Equal", + "ru-ru": "Равный", + "es-es": "Igual", + "fr-fr": "Égal", + "uk-ua": "Рівні", + "de-ch": "Gleich", + "pt-br": "Igual", }, greaterThan: { - 'en-us': 'Greater than', - 'ru-ru': 'Больше чем', - 'es-es': 'Mayor que', - 'fr-fr': 'Plus grand que', - 'uk-ua': 'Більш чим', - 'de-ch': 'Größer als', - 'pt-br': 'Maior que', + "en-us": "Greater than", + "ru-ru": "Больше чем", + "es-es": "Mayor que", + "fr-fr": "Plus grand que", + "uk-ua": "Більш чим", + "de-ch": "Größer als", + "pt-br": "Maior que", }, lessThan: { - 'en-us': 'Less than', - 'ru-ru': 'Меньше, чем', - 'es-es': 'Menor que', - 'fr-fr': 'Moins que', - 'uk-ua': 'Менше ніж', - 'de-ch': 'Weniger als', - 'pt-br': 'Menor que', + "en-us": "Less than", + "ru-ru": "Меньше, чем", + "es-es": "Menor que", + "fr-fr": "Moins que", + "uk-ua": "Менше ніж", + "de-ch": "Weniger als", + "pt-br": "Menor que", }, greaterOrEqualTo: { - 'en-us': 'Greater or Equal to', - 'ru-ru': 'Больше или равно', - 'es-es': 'Mayor o igual a', - 'fr-fr': 'Supérieur ou égal à', - 'uk-ua': 'Більше або дорівнює', - 'de-ch': 'Größer oder gleich', - 'pt-br': 'Maior ou igual a', + "en-us": "Greater or Equal to", + "ru-ru": "Больше или равно", + "es-es": "Mayor o igual a", + "fr-fr": "Supérieur ou égal à", + "uk-ua": "Більше або дорівнює", + "de-ch": "Größer oder gleich", + "pt-br": "Maior ou igual a", }, lessOrEqualTo: { - 'en-us': 'Less or Equal to', - 'ru-ru': 'Меньше или равно', - 'es-es': 'Menor o igual a', - 'fr-fr': 'Inférieur ou égal à', - 'uk-ua': 'Менше або дорівнює', - 'de-ch': 'Kleiner oder gleich', - 'pt-br': 'Menor ou igual a', + "en-us": "Less or Equal to", + "ru-ru": "Меньше или равно", + "es-es": "Menor o igual a", + "fr-fr": "Inférieur ou égal à", + "uk-ua": "Менше або дорівнює", + "de-ch": "Kleiner oder gleich", + "pt-br": "Menor ou igual a", }, true: { - 'en-us': 'True', - 'ru-ru': 'Истинный', - 'es-es': 'Verdadero', - 'fr-fr': 'Vrai', - 'uk-ua': 'правда', - 'de-ch': 'WAHR', - 'pt-br': 'Verdadeiro', + "en-us": "True", + "ru-ru": "Истинный", + "es-es": "Verdadero", + "fr-fr": "Vrai", + "uk-ua": "правда", + "de-ch": "WAHR", + "pt-br": "Verdadeiro", }, false: { - 'en-us': 'False', - 'ru-ru': 'ЛОЖЬ', - 'es-es': 'Falso', - 'fr-fr': 'FAUX', - 'uk-ua': 'помилковий', - 'de-ch': 'FALSCH', - 'pt-br': 'Falso', + "en-us": "False", + "ru-ru": "ЛОЖЬ", + "es-es": "Falso", + "fr-fr": "FAUX", + "uk-ua": "помилковий", + "de-ch": "FALSCH", + "pt-br": "Falso", }, trueOrNull: { - 'en-us': 'True or Empty', - 'ru-ru': 'Истина или Пусто', - 'es-es': 'Verdadero o vacío', - 'fr-fr': 'Vrai ou vide', - 'uk-ua': 'True або Empty', - 'de-ch': 'Wahr oder leer', - 'pt-br': 'Verdadeiro ou Vazio', + "en-us": "True or Empty", + "ru-ru": "Истина или Пусто", + "es-es": "Verdadero o vacío", + "fr-fr": "Vrai ou vide", + "uk-ua": "True або Empty", + "de-ch": "Wahr oder leer", + "pt-br": "Verdadeiro ou Vazio", }, falseOrNull: { - 'en-us': 'False or Empty', - 'ru-ru': 'Ложь или пусто', - 'es-es': 'Falso o vacío', - 'fr-fr': 'Faux ou vide', - 'uk-ua': 'False або Empty', - 'de-ch': 'Falsch oder leer', - 'pt-br': 'Falso ou Vazio', + "en-us": "False or Empty", + "ru-ru": "Ложь или пусто", + "es-es": "Falso o vacío", + "fr-fr": "Faux ou vide", + "uk-ua": "False або Empty", + "de-ch": "Falsch oder leer", + "pt-br": "Falso ou Vazio", }, between: { - 'en-us': 'Between', - 'ru-ru': 'Между', - 'es-es': 'Entre', - 'fr-fr': 'Entre', - 'uk-ua': 'Між', - 'de-ch': 'Zwischen', - 'pt-br': 'Entre', + "en-us": "Between", + "ru-ru": "Между", + "es-es": "Entre", + "fr-fr": "Entre", + "uk-ua": "Між", + "de-ch": "Zwischen", + "pt-br": "Entre", }, in: { - 'en-us': 'In', - 'ru-ru': 'В', - 'es-es': 'En', - 'fr-fr': 'Dans', - 'uk-ua': 'в', - 'de-ch': 'In', - 'pt-br': 'Em', + "en-us": "In", + "ru-ru": "В", + "es-es": "En", + "fr-fr": "Dans", + "uk-ua": "в", + "de-ch": "In", + "pt-br": "Em", }, inDescription: { - 'en-us': 'A comma-separated list of values', - 'ru-ru': 'Список значений, разделенных запятыми', - 'es-es': 'Una lista de valores separados por comas', - 'fr-fr': 'Une liste de valeurs séparées par des virgules', - 'uk-ua': 'Список значень, розділених комами', - 'de-ch': 'Eine durch Kommas getrennte Liste von Werten', - 'pt-br': 'Uma lista de valores separados por vírgulas', + "en-us": "A comma-separated list of values", + "ru-ru": "Список значений, разделенных запятыми", + "es-es": "Una lista de valores separados por comas", + "fr-fr": "Une liste de valeurs séparées par des virgules", + "uk-ua": "Список значень, розділених комами", + "de-ch": "Eine durch Kommas getrennte Liste von Werten", + "pt-br": "Uma lista de valores separados por vírgulas", }, contains: { - 'en-us': 'Contains', - 'ru-ru': 'Содержит', - 'es-es': 'Contiene', - 'fr-fr': 'Contient', - 'uk-ua': 'Містить', - 'de-ch': 'Enthält', - 'pt-br': 'Contém', + "en-us": "Contains", + "ru-ru": "Содержит", + "es-es": "Contiene", + "fr-fr": "Contient", + "uk-ua": "Містить", + "de-ch": "Enthält", + "pt-br": "Contém", }, empty: { - 'en-us': 'Empty', - 'ru-ru': 'Пустой', - 'es-es': 'Vacío', - 'fr-fr': 'Vide', - 'uk-ua': 'Порожній', - 'de-ch': 'Leer', - 'pt-br': 'Vazio', + "en-us": "Empty", + "ru-ru": "Пустой", + "es-es": "Vacío", + "fr-fr": "Vide", + "uk-ua": "Порожній", + "de-ch": "Leer", + "pt-br": "Vazio", }, and: { - 'en-us': 'and', - 'ru-ru': 'и', - 'es-es': 'y', - 'fr-fr': 'et', - 'uk-ua': 'і', - 'de-ch': 'Und', - 'pt-br': 'e', + "en-us": "and", + "ru-ru": "и", + "es-es": "y", + "fr-fr": "et", + "uk-ua": "і", + "de-ch": "Und", + "pt-br": "e", }, startsWith: { - 'en-us': 'Starts With', - 'ru-ru': 'Начинается с', - 'es-es': 'Comienza con', - 'fr-fr': 'Commence par', - 'uk-ua': 'Починається з', - 'de-ch': 'Beginnt mit', - 'pt-br': 'Começa com', + "en-us": "Starts With", + "ru-ru": "Начинается с", + "es-es": "Comienza con", + "fr-fr": "Commence par", + "uk-ua": "Починається з", + "de-ch": "Beginnt mit", + "pt-br": "Começa com", }, endsWith: { - 'en-us': 'Ends With', - 'de-ch': 'Endet mit', - 'es-es': 'Termina con', - 'fr-fr': 'Se termine par', - 'pt-br': 'Termina com', - 'ru-ru': 'Заканчивается с', - 'uk-ua': 'Закінчується на', + "en-us": "Ends With", + "de-ch": "Endet mit", + "es-es": "Termina con", + "fr-fr": "Se termine par", + "pt-br": "Termina com", + "ru-ru": "Заканчивается с", + "uk-ua": "Закінчується на", }, or: { - 'en-us': 'or', - 'ru-ru': 'или', - 'es-es': 'o', - 'fr-fr': 'ou', - 'uk-ua': 'або', - 'de-ch': 'oder', - 'pt-br': 'ou', + "en-us": "or", + "ru-ru": "или", + "es-es": "o", + "fr-fr": "ou", + "uk-ua": "або", + "de-ch": "oder", + "pt-br": "ou", }, yes: { - 'en-us': 'Yes', - 'ru-ru': 'Да', - 'es-es': 'Sí', - 'fr-fr': 'Oui', - 'uk-ua': 'Так', - 'de-ch': 'Ja', - 'pt-br': 'Sim', + "en-us": "Yes", + "ru-ru": "Да", + "es-es": "Sí", + "fr-fr": "Oui", + "uk-ua": "Так", + "de-ch": "Ja", + "pt-br": "Sim", }, queryResults: { - 'en-us': 'Query Results', - 'ru-ru': 'Результаты запроса', - 'es-es': 'Resultados de la consulta', - 'fr-fr': 'Résultats de la requête', - 'uk-ua': 'Результати запиту', - 'de-ch': 'Abfrageergebnisse', - 'pt-br': 'Resultados da consulta', + "en-us": "Query Results", + "ru-ru": "Результаты запроса", + "es-es": "Resultados de la consulta", + "fr-fr": "Résultats de la requête", + "uk-ua": "Результати запиту", + "de-ch": "Abfrageergebnisse", + "pt-br": "Resultados da consulta", }, browseInForms: { - 'en-us': 'Browse in Forms', - 'ru-ru': 'Просмотр в формах', - 'es-es': 'Navegar en formularios', - 'fr-fr': 'Parcourir les formulaires', - 'uk-ua': 'Перегляд у Формах', - 'de-ch': 'In Formularen blättern', - 'pt-br': 'Navegar em Formulários', + "en-us": "Browse in Forms", + "ru-ru": "Просмотр в формах", + "es-es": "Navegar en formularios", + "fr-fr": "Parcourir les formulaires", + "uk-ua": "Перегляд у Формах", + "de-ch": "In Formularen blättern", + "pt-br": "Navegar em Formulários", }, configureQueryTables: { - 'en-us': 'Configure visible query tables', - 'ru-ru': 'Настроить видимые таблицы запросов', - 'es-es': 'Configurar tablas de consulta visibles', - 'fr-fr': 'Configurer les tables de requête visibles', - 'uk-ua': 'Налаштувати видимі таблиці запитів', - 'de-ch': 'Konfigurieren sichtbarer Abfragetabellen', - 'pt-br': 'Configurar tabelas de consulta visíveis', + "en-us": "Configure visible query tables", + "ru-ru": "Настроить видимые таблицы запросов", + "es-es": "Configurar tablas de consulta visibles", + "fr-fr": "Configurer les tables de requête visibles", + "uk-ua": "Налаштувати видимі таблиці запитів", + "de-ch": "Konfigurieren sichtbarer Abfragetabellen", + "pt-br": "Configurar tabelas de consulta visíveis", }, exportQueryForDwca: { - 'en-us': 'Export query for DwCA definition', - 'ru-ru': 'Экспорт запроса на определение DwCA', - 'es-es': 'Consulta de exportación para la definición de DwCA', - 'fr-fr': "Requête d'exportation pour la définition DwCA", - 'uk-ua': 'Експорт запиту для визначення DwCA', - 'de-ch': 'Exportabfrage für DwCA-Definition', - 'pt-br': 'Consulta de exportação para definição DwCA', + "en-us": "Export query for DwCA definition", + "ru-ru": "Экспорт запроса на определение DwCA", + "es-es": "Consulta de exportación para la definición de DwCA", + "fr-fr": "Requête d'exportation pour la définition DwCA", + "uk-ua": "Експорт запиту для визначення DwCA", + "de-ch": "Exportabfrage für DwCA-Definition", + "pt-br": "Consulta de exportação para definição DwCA", }, exportQueryAsReport: { - 'en-us': 'Define report based on query', - 'ru-ru': 'Определить отчет на основе запроса', - 'es-es': 'Definir informe basado en consulta', - 'fr-fr': 'Définir un rapport basé sur une requête', - 'uk-ua': 'Визначити звіт на основі запиту', - 'de-ch': 'Definieren Sie den Bericht basierend auf der Abfrage', - 'pt-br': 'Definir relatório com base na consulta', + "en-us": "Define report based on query", + "ru-ru": "Определить отчет на основе запроса", + "es-es": "Definir informe basado en consulta", + "fr-fr": "Définir un rapport basé sur une requête", + "uk-ua": "Визначити звіт на основі запиту", + "de-ch": "Definieren Sie den Bericht basierend auf der Abfrage", + "pt-br": "Definir relatório com base na consulta", }, exportQueryAsLabel: { - 'en-us': 'Define label based on query', - 'ru-ru': 'Определить метку на основе запроса', - 'es-es': 'Definir etiqueta según consulta', - 'fr-fr': "Définir l'étiquette en fonction de la requête", - 'uk-ua': 'Визначте мітку на основі запиту', - 'de-ch': 'Definieren Sie das Label basierend auf der Abfrage', - 'pt-br': 'Definir rótulo com base na consulta', + "en-us": "Define label based on query", + "ru-ru": "Определить метку на основе запроса", + "es-es": "Definir etiqueta según consulta", + "fr-fr": "Définir l'étiquette en fonction de la requête", + "uk-ua": "Визначте мітку на основі запиту", + "de-ch": "Definieren Sie das Label basierend auf der Abfrage", + "pt-br": "Definir rótulo com base na consulta", }, treeMerge: { - comment: 'Audit Log Action Type', - 'en-us': 'Tree Merge', - 'ru-ru': 'Слияние деревьев', - 'es-es': 'Fusión de árboles', - 'fr-fr': "Fusion d'arbres", - 'uk-ua': "Об'єднання дерев", - 'de-ch': 'Baumzusammenführung', - 'pt-br': 'Mesclagem de Árvores', + comment: "Audit Log Action Type", + "en-us": "Tree Merge", + "ru-ru": "Слияние деревьев", + "es-es": "Fusión de árboles", + "fr-fr": "Fusion d'arbres", + "uk-ua": "Об'єднання дерев", + "de-ch": "Baumzusammenführung", + "pt-br": "Mesclagem de Árvores", }, treeMove: { - comment: 'Audit Log Action Type', - 'en-us': 'Tree Move', - 'ru-ru': 'Перемещение дерева', - 'es-es': 'Movimiento de árbol', - 'fr-fr': "Déplacement d'arbre", - 'uk-ua': 'Переміщення дерева', - 'de-ch': 'Baum verschieben', - 'pt-br': 'Movimentação de árvores', + comment: "Audit Log Action Type", + "en-us": "Tree Move", + "ru-ru": "Перемещение дерева", + "es-es": "Movimiento de árbol", + "fr-fr": "Déplacement d'arbre", + "uk-ua": "Переміщення дерева", + "de-ch": "Baum verschieben", + "pt-br": "Movimentação de árvores", }, treeSynonymize: { - comment: 'Audit Log Action Type', - 'en-us': 'Tree Synonymize', - 'ru-ru': 'Дерево Синонимизировать', - 'es-es': 'Árbol Sinónimos', - 'fr-fr': "Synonyme d'arbre", - 'uk-ua': 'Синонімізувати дерево', - 'de-ch': 'Baum synonymisieren', - 'pt-br': 'Árvore Sinonímia', + comment: "Audit Log Action Type", + "en-us": "Tree Synonymize", + "ru-ru": "Дерево Синонимизировать", + "es-es": "Árbol Sinónimos", + "fr-fr": "Synonyme d'arbre", + "uk-ua": "Синонімізувати дерево", + "de-ch": "Baum synonymisieren", + "pt-br": "Árvore Sinonímia", }, treeDesynonymize: { - comment: 'Audit Log Action Type', - 'en-us': 'Tree Desynonymize', - 'ru-ru': 'Десинонимизация дерева', - 'es-es': 'Desinonimizar árboles', - 'fr-fr': 'Arbre désynonymisé', - 'uk-ua': 'Десинонімізація дерева', - 'de-ch': 'Baum desynonymisieren', - 'pt-br': 'Árvore Dessinonimizar', + comment: "Audit Log Action Type", + "en-us": "Tree Desynonymize", + "ru-ru": "Десинонимизация дерева", + "es-es": "Desinonimizar árboles", + "fr-fr": "Arbre désynonymisé", + "uk-ua": "Десинонімізація дерева", + "de-ch": "Baum desynonymisieren", + "pt-br": "Árvore Dessinonimizar", }, treeBulkMove: { - comment: 'Audit Log Action Type', - 'en-us': 'Tree Bulk Move', - 'de-ch': 'Massenbewegung von Bäumen', - 'es-es': 'Movimiento masivo de árboles', - 'fr-fr': "Déplacement d'arbres en vrac", - 'ru-ru': 'Массовая перевозка деревьев', - 'uk-ua': 'Масове переміщення дерева', - 'pt-br': 'Mudança de árvores em massa', + comment: "Audit Log Action Type", + "en-us": "Tree Bulk Move", + "de-ch": "Massenbewegung von Bäumen", + "es-es": "Movimiento masivo de árboles", + "fr-fr": "Déplacement d'arbres en vrac", + "ru-ru": "Массовая перевозка деревьев", + "uk-ua": "Масове переміщення дерева", + "pt-br": "Mudança de árvores em massa", }, tooLongErrorMessage: { - 'en-us': - 'Field value is too long. Max allowed length is {maxLength:number|formatted}', - 'ru-ru': - 'Значение поля слишком длинное. Максимально допустимая длина: {maxLength:number|formatted}.', - 'es-es': - 'El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.', - 'fr-fr': - 'La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.', - 'uk-ua': - 'Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}', - 'de-ch': - 'Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}', - 'pt-br': - 'O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}', + "en-us": + "Field value is too long. Max allowed length is {maxLength:number|formatted}", + "ru-ru": + "Значение поля слишком длинное. Максимально допустимая длина: {maxLength:number|formatted}.", + "es-es": + "El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.", + "fr-fr": + "La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.", + "uk-ua": + "Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}", + "de-ch": + "Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}", + "pt-br": + "O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}", }, future: { - 'en-us': 'in the future', - 'de-ch': 'in der Zukunft', - 'es-es': 'en el futuro', - 'fr-fr': "à l'avenir", - 'ru-ru': 'в будущем', - 'uk-ua': 'в майбутньому', - 'pt-br': 'no futuro', + "en-us": "in the future", + "de-ch": "in der Zukunft", + "es-es": "en el futuro", + "fr-fr": "à l'avenir", + "ru-ru": "в будущем", + "uk-ua": "в майбутньому", + "pt-br": "no futuro", }, past: { - 'en-us': 'in the past', - 'de-ch': 'in der Vergangenheit', - 'es-es': 'en el pasado', - 'fr-fr': 'dans le passé', - 'ru-ru': 'в прошлом', - 'uk-ua': 'в минулому', - 'pt-br': 'no passado', + "en-us": "in the past", + "de-ch": "in der Vergangenheit", + "es-es": "en el pasado", + "fr-fr": "dans le passé", + "ru-ru": "в прошлом", + "uk-ua": "в минулому", + "pt-br": "no passado", }, days: { - 'en-us': 'Days', - 'es-es': 'Días', - 'fr-fr': 'Jours', - 'ru-ru': 'Дни', - 'uk-ua': 'днів', - 'de-ch': 'Tage', - 'pt-br': 'Dias', + "en-us": "Days", + "es-es": "Días", + "fr-fr": "Jours", + "ru-ru": "Дни", + "uk-ua": "днів", + "de-ch": "Tage", + "pt-br": "Dias", }, weeks: { - 'en-us': 'Weeks', - 'de-ch': 'Wochen', - 'es-es': 'Semanas', - 'fr-fr': 'Semaines', - 'ru-ru': 'Недели', - 'uk-ua': 'тижнів', - 'pt-br': 'Semanas', + "en-us": "Weeks", + "de-ch": "Wochen", + "es-es": "Semanas", + "fr-fr": "Semaines", + "ru-ru": "Недели", + "uk-ua": "тижнів", + "pt-br": "Semanas", }, months: { - 'en-us': 'Months', - 'de-ch': 'Monate', - 'es-es': 'Meses', - 'fr-fr': 'Mois', - 'ru-ru': 'Месяцы', - 'uk-ua': 'Місяці', - 'pt-br': 'Meses', + "en-us": "Months", + "de-ch": "Monate", + "es-es": "Meses", + "fr-fr": "Mois", + "ru-ru": "Месяцы", + "uk-ua": "Місяці", + "pt-br": "Meses", }, years: { - 'en-us': 'Years', - 'de-ch': 'Jahre', - 'es-es': 'Años', - 'fr-fr': 'Années', - 'ru-ru': 'Годы', - 'uk-ua': 'років', - 'pt-br': 'Anos', + "en-us": "Years", + "de-ch": "Jahre", + "es-es": "Años", + "fr-fr": "Années", + "ru-ru": "Годы", + "uk-ua": "років", + "pt-br": "Anos", }, year: { - 'en-us': 'Year', - 'de-ch': 'Jahr', - 'es-es': 'Año', - 'fr-fr': 'Année', - 'ru-ru': 'Год', - 'uk-ua': 'рік', + "en-us": "Year", + "de-ch": "Jahr", + "es-es": "Año", + "fr-fr": "Année", + "ru-ru": "Год", + "uk-ua": "рік", + "pt-br": "", }, relativeDate: { comment: ` Used in query builder lines, will be shown as a number followed by a period of time (ie: day, month or week) then a direction (past or future) `, - 'en-us': - '{size:number} {type:string} {direction:string}', - 'de-ch': - '{size:number} {type:string} {direction:string}', - 'es-es': - '{size:number} {type:string} {direction:string}', - 'fr-fr': - '{size:number} {type:string} {direction:string}', - 'ru-ru': - '{size:number} {type:string} {direction:string}', - 'uk-ua': - '{size:number} {type:string} {direction:string}', - 'pt-br': - '{size:number} {type:string} {direction:string}', + "en-us": + "{size:number} {type:string} {direction:string}", + "de-ch": + "{size:number} {type:string} {direction:string}", + "es-es": + "{size:number} {type:string} {direction:string}", + "fr-fr": + "{size:number} {type:string} {direction:string}", + "ru-ru": + "{size:number} {type:string} {direction:string}", + "uk-ua": + "{size:number} {type:string} {direction:string}", + "pt-br": + "{size:number} {type:string} {direction:string}", }, importHiddenFields: { - 'en-us': 'The following fields are hidden in the query you imported:', - 'es-es': 'Los siguientes campos están ocultos en la consulta que importó:', - 'fr-fr': - 'Les champs suivants sont masqués dans la requête que vous avez importée :', - 'ru-ru': 'В импортированном вами запросе скрыты следующие поля:', - 'uk-ua': 'В імпортованому вами запиті приховано такі поля:', - 'de-ch': - 'Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:', - 'pt-br': 'Os seguintes campos estão ocultos na consulta que você importou:', + "en-us": "The following fields are hidden in the query you imported:", + "es-es": "Los siguientes campos están ocultos en la consulta que importó:", + "fr-fr": + "Les champs suivants sont masqués dans la requête que vous avez importée :", + "ru-ru": "В импортированном вами запросе скрыты следующие поля:", + "uk-ua": "В імпортованому вами запиті приховано такі поля:", + "de-ch": + "Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:", + "pt-br": "Os seguintes campos estão ocultos na consulta que você importou:", }, importNoReadPermission: { - 'en-us': - 'The query you imported contains tables you do not have read access to:', - 'es-es': - 'La consulta que importó contiene tablas a las que no tiene acceso de lectura:', - 'fr-fr': - 'La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :', - 'ru-ru': - 'Импортированный вами запрос содержит таблицы, к которым у вас нет доступа на чтение:', - 'uk-ua': - 'Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:', - 'de-ch': - 'Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:', - 'pt-br': - 'A consulta que você importou contém tabelas às quais você não tem acesso de leitura:', + "en-us": + "The query you imported contains tables you do not have read access to:", + "es-es": + "La consulta que importó contiene tablas a las que no tiene acceso de lectura:", + "fr-fr": + "La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :", + "ru-ru": + "Импортированный вами запрос содержит таблицы, к которым у вас нет доступа на чтение:", + "uk-ua": + "Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:", + "de-ch": + "Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:", + "pt-br": + "A consulta que você importou contém tabelas às quais você não tem acesso de leitura:", }, noReadPermission: { - 'en-us': 'No read permission', - 'es-es': 'Sin permiso de lectura', - 'fr-fr': 'Aucune autorisation de lecture', - 'ru-ru': 'Нет разрешения на чтение', - 'uk-ua': 'Немає дозволу на читання', - 'de-ch': 'Keine Leseberechtigung', - 'pt-br': 'Sem permissão de leitura', + "en-us": "No read permission", + "es-es": "Sin permiso de lectura", + "fr-fr": "Aucune autorisation de lecture", + "ru-ru": "Нет разрешения на чтение", + "uk-ua": "Немає дозволу на читання", + "de-ch": "Keine Leseberechtigung", + "pt-br": "Sem permissão de leitura", }, switchToRelative: { - 'en-us': 'Switch to relative', - 'de-ch': 'Wechseln zu relativ', - 'es-es': 'Cambiar a relativo', - 'fr-fr': 'Passer au relatif', - 'ru-ru': 'Переключиться на относительный', - 'uk-ua': 'Перейти до відносного', - 'pt-br': 'Mudar para relativo', + "en-us": "Switch to relative", + "de-ch": "Wechseln zu relativ", + "es-es": "Cambiar a relativo", + "fr-fr": "Passer au relatif", + "ru-ru": "Переключиться на относительный", + "uk-ua": "Перейти до відносного", + "pt-br": "Mudar para relativo", }, switchToAbsolute: { - 'en-us': 'Switch to absolute', - 'de-ch': 'Wechseln Sie zu absolut', - 'es-es': 'Cambiar a absoluto', - 'fr-fr': "Passer à l'absolu", - 'ru-ru': 'Переключиться на абсолютный', - 'uk-ua': 'Перейти до відносного', - 'pt-br': 'Mudar para absoluto', + "en-us": "Switch to absolute", + "de-ch": "Wechseln Sie zu absolut", + "es-es": "Cambiar a absoluto", + "fr-fr": "Passer à l'absolu", + "ru-ru": "Переключиться на абсолютный", + "uk-ua": "Перейти до відносного", + "pt-br": "Mudar para absoluto", }, scrollToEditor: { - 'en-us': 'Scroll to editor', - 'de-ch': 'Zum Editor scrollen', - 'es-es': 'Desplazarse al editor', - 'uk-ua': 'Перейдіть до редактора', - 'fr-fr': "Faites défiler jusqu'à l'éditeur", - 'ru-ru': 'Прокрутите до редактора', - 'pt-br': 'Vá até o editor', + "en-us": "Scroll to editor", + "de-ch": "Zum Editor scrollen", + "es-es": "Desplazarse al editor", + "uk-ua": "Перейдіть до редактора", + "fr-fr": "Faites défiler jusqu'à l'éditeur", + "ru-ru": "Прокрутите до редактора", + "pt-br": "Vá até o editor", }, viewRecords: { - 'en-us': 'View records', - 'de-ch': 'Datensätze anzeigen', - 'es-es': 'Ver registros', - 'fr-fr': 'Afficher les enregistrements', - 'ru-ru': 'Просмотреть записи', - 'uk-ua': 'Переглянути записи', - 'pt-br': 'Ver registros', + "en-us": "View records", + "de-ch": "Datensätze anzeigen", + "es-es": "Ver registros", + "fr-fr": "Afficher les enregistrements", + "ru-ru": "Просмотреть записи", + "uk-ua": "Переглянути записи", + "pt-br": "Ver registros", }, chooseFormatter: { - 'en-us': 'Choose formatter', - 'de-ch': 'Formatierer auswählen', - 'es-es': 'Elija el formateador', - 'fr-fr': 'Choisir le formateur', - 'ru-ru': 'Выбрать форматировщик', - 'uk-ua': 'Виберіть форматер', - 'pt-br': 'Escolha o formatador', + "en-us": "Choose formatter", + "de-ch": "Formatierer auswählen", + "es-es": "Elija el formateador", + "fr-fr": "Choisir le formateur", + "ru-ru": "Выбрать форматировщик", + "uk-ua": "Виберіть форматер", + "pt-br": "Escolha o formatador", }, range: { - 'en-us': 'Range', - 'de-ch': 'Reichweite', - 'es-es': 'Rango', - 'fr-fr': 'Gamme', - 'pt-br': 'Faixa', - 'ru-ru': 'Диапазон', - 'uk-ua': 'Діапазон', + "en-us": "Range", + "de-ch": "Reichweite", + "es-es": "Rango", + "fr-fr": "Gamme", + "pt-br": "Faixa", + "ru-ru": "Диапазон", + "uk-ua": "Діапазон", }, strict: { - 'en-us': 'Strict', - 'de-ch': 'Strikt', - 'es-es': 'Estricto', - 'fr-fr': 'Strict', - 'pt-br': 'Estrito', - 'ru-ru': 'Строгий', - 'uk-ua': 'Суворий', + "en-us": "Strict", + "de-ch": "Strikt", + "es-es": "Estricto", + "fr-fr": "Strict", + "pt-br": "Estrito", + "ru-ru": "Строгий", + "uk-ua": "Суворий", }, nonStrict: { - 'en-us': 'Non strict', - 'de-ch': 'Nicht streng', - 'es-es': 'No estricto', - 'fr-fr': 'Non strict', - 'pt-br': 'Não rigoroso', - 'ru-ru': 'Нестрогий', - 'uk-ua': 'Не суворий', + "en-us": "Non strict", + "de-ch": "Nicht streng", + "es-es": "No estricto", + "fr-fr": "Non strict", + "pt-br": "Não rigoroso", + "ru-ru": "Нестрогий", + "uk-ua": "Не суворий", }, catalogNumberInheritance: { - 'en-us': 'Catalog Number Inheritance', - 'de-ch': 'Katalognummernvererbung', - 'es-es': 'Herencia del número de catálogo', - 'fr-fr': 'Héritage du numéro de catalogue', - 'pt-br': 'Herança de números de catálogo', - 'ru-ru': 'Наследование каталожного номера', - 'uk-ua': 'Успадкування каталожних номерів', + "en-us": "Catalog Number Inheritance", + "de-ch": "Katalognummernvererbung", + "es-es": "Herencia del número de catálogo", + "fr-fr": "Héritage du numéro de catalogue", + "pt-br": "Herança de números de catálogo", + "ru-ru": "Наследование каталожного номера", + "uk-ua": "Успадкування каталожних номерів", }, catalogNumberParentCOInheritance: { - 'en-us': 'Catalog Number Parent Collection Object Inheritance', - 'de-ch': 'Katalognummer Übergeordnete Sammlung Objektvererbung', - 'es-es': - 'Herencia de objetos de la colección principal del número de catálogo', - 'fr-fr': "Numéro de catalogue Collection parente Héritage d'objet", - 'pt-br': 'Herança de objeto de coleção pai de número de catálogo', - 'ru-ru': 'Номер каталога Родительская коллекция Объект Наследование', - 'uk-ua': "Успадкування батьківського об'єкта колекції за номером каталогу", + "en-us": "Catalog Number Parent Collection Object Inheritance", + "de-ch": "Katalognummer Übergeordnete Sammlung Objektvererbung", + "es-es": + "Herencia de objetos de la colección principal del número de catálogo", + "fr-fr": "Numéro de catalogue Collection parente Héritage d'objet", + "pt-br": "Herança de objeto de coleção pai de número de catálogo", + "ru-ru": "Номер каталога Родительская коллекция Объект Наследование", + "uk-ua": "Успадкування батьківського об'єкта колекції за номером каталогу", }, uniqueCatalogNumberAcrossComponentAndCo: { - 'en-us': 'Catalog Number Uniqueness Across Component And CO tables', - 'de-ch': 'Eindeutigkeit der Katalognummer in Komponenten- und CO-Tabellen', - 'es-es': - 'Unicidad del número de catálogo en las tablas de componentes y CO', - 'fr-fr': - 'Unicité des numéros de catalogue entre les tableaux de composants et de CO', - 'pt-br': - 'Exclusividade do número de catálogo nas tabelas de componentes e CO', - 'ru-ru': 'Уникальность каталожного номера в таблицах компонентов и CO', - 'uk-ua': 'Унікальність каталожних номерів у таблицях компонентів та CO', + "en-us": "Catalog Number Uniqueness Across Component And CO tables", + "de-ch": "Eindeutigkeit der Katalognummer in Komponenten- und CO-Tabellen", + "es-es": + "Unicidad del número de catálogo en las tablas de componentes y CO", + "fr-fr": + "Unicité des numéros de catalogue entre les tableaux de composants et de CO", + "pt-br": + "Exclusividade do número de catálogo nas tabelas de componentes e CO", + "ru-ru": "Уникальность каталожного номера в таблицах компонентов и CO", + "uk-ua": "Унікальність каталожних номерів у таблицях компонентів та CO", }, formatInputAs: { comment: ` @@ -984,52 +985,52 @@ export const queryText = createDictionary({ Example: Format As: Ichthyology Example: Format As: Rock, Mineral `, - 'en-us': 'Format As: {commaSeparatedFormats:string}', - 'de-ch': 'Formatieren als: {commaSeparatedFormats:string}', - 'es-es': 'Formato como: {commaSeparatedFormats:string}', - 'fr-fr': 'Formater comme : {commaSeparatedFormats:string}', - 'pt-br': 'Formato como: {commaSeparatedFormats:string}', - 'ru-ru': 'Форматировать как: {commaSeparatedFormats:string}', - 'uk-ua': 'Форматувати як: {commaSeparatedFormats:string}', + "en-us": "Format As: {commaSeparatedFormats:string}", + "de-ch": "Formatieren als: {commaSeparatedFormats:string}", + "es-es": "Formato como: {commaSeparatedFormats:string}", + "fr-fr": "Formater comme : {commaSeparatedFormats:string}", + "pt-br": "Formato como: {commaSeparatedFormats:string}", + "ru-ru": "Форматировать как: {commaSeparatedFormats:string}", + "uk-ua": "Форматувати як: {commaSeparatedFormats:string}", }, unsavedChangesInQuery: { - 'en-us': 'Query has unsaved changes', - 'de-ch': 'Die Abfrage enthält nicht gespeicherte Änderungen', - 'es-es': 'La consulta tiene cambios sin guardar', - 'fr-fr': 'La requête comporte des modifications non enregistrées', - 'pt-br': 'A consulta possui alterações não salvas', - 'ru-ru': 'Запрос имеет несохраненные изменения', - 'uk-ua': 'Запит містить незбережені зміни', + "en-us": "Query has unsaved changes", + "de-ch": "Die Abfrage enthält nicht gespeicherte Änderungen", + "es-es": "La consulta tiene cambios sin guardar", + "fr-fr": "La requête comporte des modifications non enregistrées", + "pt-br": "A consulta possui alterações não salvas", + "ru-ru": "Запрос имеет несохраненные изменения", + "uk-ua": "Запит містить незбережені зміни", }, unsavedChangesInQueryDescription: { - 'en-us': 'Please save the query before running Batch Edit', - 'de-ch': - 'Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen', - 'es-es': 'Guarde la consulta antes de ejecutar la edición por lotes', - 'fr-fr': + "en-us": "Please save the query before running Batch Edit", + "de-ch": + "Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen", + "es-es": "Guarde la consulta antes de ejecutar la edición por lotes", + "fr-fr": "Veuillez enregistrer la requête avant d'exécuter l'édition par lots", - 'pt-br': 'Salve a consulta antes de executar a edição em lote', - 'ru-ru': - 'Пожалуйста, сохраните запрос перед запуском пакетного редактирования.', - 'uk-ua': 'Будь ласка, збережіть запит перед запуском пакетного редагування', + "pt-br": "Salve a consulta antes de executar a edição em lote", + "ru-ru": + "Пожалуйста, сохраните запрос перед запуском пакетного редактирования.", + "uk-ua": "Будь ласка, збережіть запит перед запуском пакетного редагування", }, noPreparationsToReturn: { - 'en-us': 'There are no unresolved items to return', - 'ru-ru': 'Нет нерешенных вопросов для возврата', - 'es-es': 'No hay items sin resolver para devolver', - 'fr-fr': "Il n'y a aucun article non résolu à retourner", - 'uk-ua': 'Немає невирішених елементів для повернення', - 'de-ch': - 'Es gibt keine ungelösten Elemente, die zurückgegeben werden müssen', - 'pt-br': 'Não há itens não resolvidos para retornar', + "en-us": "There are no unresolved items to return", + "ru-ru": "Нет нерешенных вопросов для возврата", + "es-es": "No hay items sin resolver para devolver", + "fr-fr": "Il n'y a aucun article non résolu à retourner", + "uk-ua": "Немає невирішених елементів для повернення", + "de-ch": + "Es gibt keine ungelösten Elemente, die zurückgegeben werden müssen", + "pt-br": "Não há itens não resolvidos para retornar", }, itemsReturned: { - 'en-us': 'Items have been returned', - 'ru-ru': 'Товары были возвращены', - 'es-es': 'Los items han sido devueltos', - 'fr-fr': 'Les articles ont été retournés', - 'uk-ua': 'Товари повернуто', - 'de-ch': 'Artikel wurden zurückgegeben', - 'pt-br': 'Os itens foram devolvidos', + "en-us": "Items have been returned", + "ru-ru": "Товары были возвращены", + "es-es": "Los items han sido devueltos", + "fr-fr": "Les articles ont été retournés", + "uk-ua": "Товари повернуто", + "de-ch": "Artikel wurden zurückgegeben", + "pt-br": "Os itens foram devolvidos", }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/resources.ts b/specifyweb/frontend/js_src/lib/localization/resources.ts index c5b95d2b9ce..a8a3dcbfed0 100644 --- a/specifyweb/frontend/js_src/lib/localization/resources.ts +++ b/specifyweb/frontend/js_src/lib/localization/resources.ts @@ -181,11 +181,15 @@ export const resourcesText = createDictionary({ "pt-br": "Formatadores de campo", }, fieldFormattersDescription: { - 'en-us': ` - The “Field Format” controls how data for a specific table field is - displayed in query results, exports, and forms. It manages autonumbering - and the composition of various parts that define the field. - `, + "en-us": + "The “Field Format” controls how data for a specific table field is displayed in query results, exports, and forms. It manages autonumbering and the composition of various parts that define the field.", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": + "«Формат поля» контролює, як дані для певного поля таблиці відображаються в результатах запиту, експорті та формах. Він керує автонумерацією та композицією різних частин, що визначають поле.", }, dataObjectFormatters: { "en-us": "Record Formatters", @@ -283,15 +287,22 @@ export const resourcesText = createDictionary({ "pt-br": "Links da Web disponíveis", }, availableFieldFormatters: { - 'en-us': 'Available Field Formatters', - 'de-ch': 'Verfügbare Feldformatierer', - 'es-es': 'Formateadores de campo disponibles', - 'fr-fr': 'Formateurs de champs disponibles', - 'ru-ru': 'Доступные форматеры полей', - 'uk-ua': 'Доступні форматувальники полів', + "en-us": "Available Field Formatters", + "de-ch": "Verfügbare Feldformatierer", + "es-es": "Formateadores de campo disponibles", + "fr-fr": "Formateurs de champs disponibles", + "ru-ru": "Доступные форматеры полей", + "uk-ua": "Доступні форматувальники полів", + "pt-br": "", }, selectDefaultFormatter: { - 'en-us': 'Please designate one of the formatters as default', + "en-us": "Please designate one of the formatters as default", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Будь ласка, призначте один із форматувальників як стандартний", }, duplicateFormatters: { "en-us": "Record formatter names must be unique", @@ -1021,46 +1032,102 @@ export const resourcesText = createDictionary({ "uk-ua": "Видаліть початкові нулі з числових значень.", }, formatterPreviewUnavailable: { - 'en-us': 'Preview for formatter of this type is not available', + "en-us": "Preview for formatter of this type is not available", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Попередній перегляд для форматера цього типу недоступний", }, nonConformingInline: { - 'en-us': '(non-conforming)', + "en-us": "(non-conforming)", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "(невідповідний)", }, value: { - 'en-us': 'Value', - 'de-ch': 'Wert', - 'es-es': 'Valor', - 'fr-fr': 'Valeur', - 'ru-ru': 'Значение', - 'uk-ua': 'Значення', + "en-us": "Value", + "de-ch": "Wert", + "es-es": "Valor", + "fr-fr": "Valeur", + "ru-ru": "Значение", + "uk-ua": "Значення", + "pt-br": "", }, constant: { - 'en-us': 'Constant', + "en-us": "Constant", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Постійна", }, alpha: { - 'en-us': 'Alpha', + "en-us": "Alpha", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Альфа", }, numeric: { - 'en-us': 'Numeric', + "en-us": "Numeric", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Числовий", }, alphanumeric: { - 'en-us': 'Alphanumeric', + "en-us": "Alphanumeric", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Буквено-цифровий", }, anychar: { - 'en-us': 'Any character', + "en-us": "Any character", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Будь-який символ", }, regex: { - 'en-us': 'Regular expression', + "en-us": "Regular expression", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Регулярний вираз", }, exampleField: { - 'en-us': 'Example Field', - 'de-ch': 'Beispielfeld', - 'es-es': 'Campo de ejemplo', - 'fr-fr': "Champ d'exemple", - 'ru-ru': 'Пример поля', - 'uk-ua': 'Приклад поле', + "en-us": "Example Field", + "de-ch": "Beispielfeld", + "es-es": "Campo de ejemplo", + "fr-fr": "Champ d'exemple", + "ru-ru": "Пример поля", + "uk-ua": "Приклад поле", + "pt-br": "", }, pattern: { - 'en-us': 'Pattern', + "en-us": "Pattern", + "de-ch": "", + "es-es": "", + "fr-fr": "", + "pt-br": "", + "ru-ru": "", + "uk-ua": "Візерунок", }, } as const); From 51bd2bd98cd458e9ca033e3b3e545b1304d1c3b3 Mon Sep 17 00:00:00 2001 From: Google Translate Date: Fri, 17 Oct 2025 05:09:06 +0000 Subject: [PATCH 079/115] Sync localization strings with Weblate Triggered by 6d89cd44f33a2fc30736c2f10f6ff9ba04d98600 on branch refs/heads/weblate-localization --- .../frontend/js_src/lib/localization/schema.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/localization/schema.ts b/specifyweb/frontend/js_src/lib/localization/schema.ts index c6baf2525c8..6f7d9544804 100644 --- a/specifyweb/frontend/js_src/lib/localization/schema.ts +++ b/specifyweb/frontend/js_src/lib/localization/schema.ts @@ -22,7 +22,7 @@ export const schemaText = createDictionary({ "en-us": "Tables", "ru-ru": "Таблицы", "es-es": "Tablas", - "fr-fr": "Tableaux", + "fr-fr": "Tables", "uk-ua": "Столи", "de-ch": "Tabellen", "pt-br": "Tabelas", @@ -58,7 +58,7 @@ export const schemaText = createDictionary({ "en-us": "Schema changes have not been saved", "ru-ru": "Изменения схемы не были сохранены", "es-es": "Los cambios en el esquema no se han guardado", - "fr-fr": "Les modifications du schéma n'ont pas été enregistrées", + "fr-fr": "Les modifications de schéma n'ont pas été enregistrées", "uk-ua": "Зміни схеми не збережено", "de-ch": "Schema Änderungen wurden nicht gespeichert", "pt-br": "As alterações de esquema não foram salvas", @@ -67,7 +67,7 @@ export const schemaText = createDictionary({ "en-us": "Change Base Table", "ru-ru": "Изменить базовую таблицу", "es-es": "Cambiar la tabla base", - "fr-fr": "Changer la table de base", + "fr-fr": "Modifier la table de base", "uk-ua": "Змінити базову таблицю", "de-ch": "Basis-Tabelle ändern", "pt-br": "Alterar tabela base", @@ -286,7 +286,7 @@ export const schemaText = createDictionary({ "fr-fr": "Colonne de base de données", "uk-ua": "Стовпець бази даних", "de-ch": "Datenbank-Spalte", - "pt-br": "Coluna do Banco de Dados", + "pt-br": "Coluna do banco de dados", }, relatedTable: { "en-us": "Related Model", @@ -376,7 +376,7 @@ export const schemaText = createDictionary({ "fr-fr": "Nombre de relations", "uk-ua": "Кількість зв'язків", "de-ch": "Anzahl Beziehungen", - "pt-br": "Contagem de relacionamento", + "pt-br": "Contagem de relacionamentos", }, databaseSchema: { "en-us": "Database Schema", @@ -400,7 +400,7 @@ export const schemaText = createDictionary({ "en-us": "Possible Tables", "ru-ru": "Возможные таблицы", "es-es": "Tablas posibles", - "fr-fr": "Tableaux possibles", + "fr-fr": "Tables possibles", "uk-ua": "Можливі таблиці", "de-ch": "Mögliche Tabellen", "pt-br": "Tabelas Possíveis", @@ -426,7 +426,7 @@ export const schemaText = createDictionary({ tableUniquenessRules: { "en-us": "{tableName:string} Uniqueness Rules", "de-ch": "{tableName:string} Eindeutigkeitsregeln", - "es-es": "{tableName:string} Reglas de unicidad", + "es-es": "{tableName:string} Reglas de singularidad", "fr-fr": "{tableName:string} Règles d'unicité", "ru-ru": "{tableName:string} Правила уникальности", "uk-ua": "{tableName:string} Правила унікальності", From 9f180acfd75f8bf396708a8459e25b97a7ab102e Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 21:51:49 -0500 Subject: [PATCH 080/115] fix: failing test --- specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx | 2 +- .../frontend/js_src/lib/components/FormFields/Field.tsx | 6 +++--- .../js_src/lib/components/Header/userToolDefinitions.ts | 2 +- .../lib/components/Preferences/CollectionDefinitions.tsx | 2 -- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx index 793d9c6c750..b3dad736695 100644 --- a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx +++ b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx @@ -107,7 +107,7 @@ export const icons = { minus: , minusCircle: , nonStrict: , - building: , + office: , pencil: , pencilAt: , photos: , diff --git a/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx b/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx index 1d1f69191a2..1fb8295b8dc 100644 --- a/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx @@ -139,14 +139,14 @@ function Field({ // Check if collection pref wants to inherit primary cat num for empty CO cat num sibilings inside of a COG const [displayPrimaryCatNumberPref] = collectionPreferences.use( 'catalogNumberInheritance', - 'behavior', + 'collectionObject', 'inheritance' ); // Check if collection pref wants to inherit parent cat num for empty CO cat num children const [displayParentCatNumberPref] = collectionPreferences.use( - 'catalogNumberParentInheritance', - 'behavior', + 'catalogNumberInheritance', + 'component', 'inheritance' ); diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index 7e423a86b32..3ed5ee2a4e3 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -60,7 +60,7 @@ const rawUserTools = ensure>>>()({ collectionPreferences: { title: preferencesText.collectionPreferences(), url: '/specify/collection-preferences/', - icon: icons.building, + icon: icons.office, enabled: () => hasToolPermission('resources', 'update'), }, schemaConfig: { diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 32d63057f1f..07c0756b394 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -260,8 +260,6 @@ export const collectionPreferenceDefinitions = { }, }, - /* catalogNumberParentInheritance removed - folded into catalogNumberInheritance */ - uniqueCatalogNumberAccrossComponentAndCO: { title: queryText.uniqueCatalogNumberAcrossComponentAndCo(), subCategories: { From ec5c1f7156cb5bcb0607b64cf525216d9b856ca2 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 22:07:50 -0500 Subject: [PATCH 081/115] fix: remove unused localization strings --- .../components/Preferences/CollectionDefinitions.tsx | 4 ++-- .../js_src/lib/localization/preferences.behavior.ts | 4 ---- specifyweb/frontend/js_src/lib/localization/query.ts | 10 ---------- specifyweb/frontend/js_src/lib/localization/tree.ts | 4 ---- 4 files changed, 2 insertions(+), 20 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 07c0756b394..a6c56a06656 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -235,12 +235,12 @@ export const collectionPreferenceDefinitions = { items: { inheritance: definePref({ title: () => - preferencesText.inheritanceCatNumberPref({ + preferencesText.inheritanceCatNumberParentCOPref({ catalogNumber: getField( tables.CollectionObject, 'catalogNumber' ).label, - collectionObject: tables.CollectionObject.label, + collectionObject: tables.CollectionObject.label, }), description: () => preferencesText.inheritanceCatNumberParentCOPrefDescription({ diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 9b0cf0e6901..7c33aa8a54c 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -693,10 +693,6 @@ export const preferencesBehaviorDictionary = { 'en-us': 'If enabled, picklists of type "Entire Table" will only show items that are in use within the current collection.', }, - catalogNumberParentInheritanceDescription: { - 'en-us': - 'Control whether component records inherit catalog numbers from their parent Collection Object.', - }, useAccessibleFullDatePicker: { 'en-us': 'Use accessible full date picker', 'ru-ru': 'Используйте доступный полный выбор даты', diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index 0b711313afe..a591c9a7b89 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -955,16 +955,6 @@ export const queryText = createDictionary({ "ru-ru": "Наследование каталожного номера", "uk-ua": "Успадкування каталожних номерів", }, - catalogNumberParentCOInheritance: { - "en-us": "Catalog Number Parent Collection Object Inheritance", - "de-ch": "Katalognummer Übergeordnete Sammlung Objektvererbung", - "es-es": - "Herencia de objetos de la colección principal del número de catálogo", - "fr-fr": "Numéro de catalogue Collection parente Héritage d'objet", - "pt-br": "Herança de objeto de coleção pai de número de catálogo", - "ru-ru": "Номер каталога Родительская коллекция Объект Наследование", - "uk-ua": "Успадкування батьківського об'єкта колекції за номером каталогу", - }, uniqueCatalogNumberAcrossComponentAndCo: { "en-us": "Catalog Number Uniqueness Across Component And CO tables", "de-ch": "Eindeutigkeit der Katalognummer in Komponenten- und CO-Tabellen", diff --git a/specifyweb/frontend/js_src/lib/localization/tree.ts b/specifyweb/frontend/js_src/lib/localization/tree.ts index d41144cffcc..4a3f2737142 100644 --- a/specifyweb/frontend/js_src/lib/localization/tree.ts +++ b/specifyweb/frontend/js_src/lib/localization/tree.ts @@ -713,8 +713,4 @@ export const treeText = createDictionary({ 'en-us': 'If enabled, this allows users to add children to synonymized parents and to synonymize a node with children.', }, - synonymizedNodesPermissionDescription: { - 'en-us': - 'Enable adding children to synonymized parents on this tree. When enabled, users may add child nodes beneath parents that have been marked as synonyms.', - }, } as const); From 854550219f44860bd5f37f3552425368c3400a32 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Fri, 17 Oct 2025 22:14:19 -0500 Subject: [PATCH 082/115] refactor: simplify code --- .../js_src/lib/components/Preferences/Editor.tsx | 4 ++-- .../lib/components/Preferences/useTopChild.tsx | 14 ++------------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 7d29fcd96d9..18f1b272358 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -111,7 +111,7 @@ export const UserPreferencesEditor = createPreferencesEditor({ Context: userPreferences.Context, resourceName: 'UserPreferences', fetchUrl: '/context/user_resource/', - developmentGlobal: '_editingUserPreferences', + developmentGlobal: 'editingUserPreferences', dependencyResolver: ({ onChange }) => [onChange], }); @@ -120,7 +120,7 @@ export const CollectionPreferencesEditor = createPreferencesEditor({ Context: collectionPreferences.Context, resourceName: 'CollectionPreferences', fetchUrl: '/context/collection_resource/', - developmentGlobal: '_editingCollectionPreferences', + developmentGlobal: 'editingCollectionPreferences', prefType: 'collection', dependencyResolver: ({ data, onChange }) => [data, onChange], }); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx index ffd024d0195..cfa5e33cc54 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/useTopChild.tsx @@ -54,20 +54,10 @@ export function useTopChild(): { const observer = new ResizeObserver(handleChange); observer.observe(container); - const scrollTargets: HTMLElement[] = []; - for ( - let element: HTMLElement | null = container; - element !== null; - element = element.parentElement - ) - scrollTargets.push(element); - const uniqueScrollTargets = Array.from(new Set(scrollTargets)); - const scrollCleanups = uniqueScrollTargets.map((target) => - listen(target, 'scroll', handleChange) - ); + const scroll = listen(container, 'scroll', handleChange); return (): void => { observer.disconnect(); - scrollCleanups.forEach((cleanup) => cleanup()); + scroll(); }; }, [container]); From 536711f8ba6e053a810c6d65bb0900cdec7558fc Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Sat, 18 Oct 2025 03:21:02 +0000 Subject: [PATCH 083/115] Lint code with ESLint and Prettier Triggered by a0e546302ba2c795fa9e3dbe5fcbb21ff0049222 on branch refs/heads/issue-7440 --- .../Preferences/CollectionDefinitions.tsx | 6 +- .../lib/components/Preferences/Editor.tsx | 2 +- .../lib/localization/preferences.behavior.ts | 2 +- .../frontend/js_src/lib/localization/query.ts | 1562 ++++++++--------- 4 files changed, 786 insertions(+), 786 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index a6c56a06656..1e26542ee5c 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -14,13 +14,13 @@ import { f } from '../../utils/functools'; import type { RA } from '../../utils/types'; import { ensure } from '../../utils/types'; import { camelToHuman } from '../../utils/utils'; -import type { StatLayout } from '../Statistics/types'; +import { getField } from '../DataModel/helpers'; import { genericTables } from '../DataModel/tables'; +import { tables } from '../DataModel/tables'; import type { Tables } from '../DataModel/types'; +import type { StatLayout } from '../Statistics/types'; import type { GenericPreferences } from './types'; import { definePref } from './types'; -import { tables } from '../DataModel/tables'; -import { getField } from '../DataModel/helpers'; const tableLabel = (tableName: keyof Tables): LocalizedString => genericTables[tableName]?.label ?? camelToHuman(tableName); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx index 18f1b272358..b7b53ff6ad1 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Editor.tsx @@ -6,9 +6,9 @@ import type { PreferenceType } from '../Preferences'; import { PreferencesContent } from '../Preferences'; import { PreferencesAside } from '../Preferences/Aside'; import { BasePreferences } from '../Preferences/BasePreferences'; -import { useTopChild } from '../Preferences/useTopChild'; import { userPreferenceDefinitions } from '../Preferences/UserDefinitions'; import { userPreferences } from '../Preferences/userPreferences'; +import { useTopChild } from '../Preferences/useTopChild'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; import { collectionPreferences } from './collectionPreferences'; import type { GenericPreferences } from './types'; diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts index 7c33aa8a54c..0e0aef8ea43 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.behavior.ts @@ -729,7 +729,7 @@ export const preferencesBehaviorDictionary = { 'de-ch': 'Standardmäßig zu öffnender Datensatz', 'pt-br': 'Gravar para abrir por padrão', }, -altClickToSupressNewTab: { + altClickToSupressNewTab: { 'en-us': '{altKeyName:string}+Click to suppress new tab', 'ru-ru': diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index a591c9a7b89..618f5b01e38 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -4,968 +4,968 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const queryText = createDictionary({ query: { - "en-us": "Query", - "ru-ru": "Запрос", - "es-es": "Consulta", - "fr-fr": "Requête", - "uk-ua": "Запит", - "de-ch": "Abfrage", - "pt-br": "Consulta", + 'en-us': 'Query', + 'ru-ru': 'Запрос', + 'es-es': 'Consulta', + 'fr-fr': 'Requête', + 'uk-ua': 'Запит', + 'de-ch': 'Abfrage', + 'pt-br': 'Consulta', }, queries: { - "en-us": "Queries", - "ru-ru": "Запросы", - "es-es": "Consultas", - "fr-fr": "Requêtes", - "uk-ua": "Запити", - "de-ch": "Abfragen", - "pt-br": "Consultas", + 'en-us': 'Queries', + 'ru-ru': 'Запросы', + 'es-es': 'Consultas', + 'fr-fr': 'Requêtes', + 'uk-ua': 'Запити', + 'de-ch': 'Abfragen', + 'pt-br': 'Consultas', }, queryBuilder: { - "en-us": "Query Builder", - "ru-ru": "Конструктор запросов", - "es-es": "Generador de consultas", - "fr-fr": "Générateur de requêtes", - "uk-ua": "Конструктор запитів", - "de-ch": "Query Builder", - "pt-br": "Construtor de consultas", + 'en-us': 'Query Builder', + 'ru-ru': 'Конструктор запросов', + 'es-es': 'Generador de consultas', + 'fr-fr': 'Générateur de requêtes', + 'uk-ua': 'Конструктор запитів', + 'de-ch': 'Query Builder', + 'pt-br': 'Construtor de consultas', }, newQueryName: { - "en-us": "New Query", - "es-es": "Nueva consulta", - "uk-ua": "Новий запит", - "de-ch": "Neue Abfrage", - "fr-fr": "Nouvelle requête", - "ru-ru": "Новый запрос", - "pt-br": "Nova consulta", + 'en-us': 'New Query', + 'es-es': 'Nueva consulta', + 'uk-ua': 'Новий запит', + 'de-ch': 'Neue Abfrage', + 'fr-fr': 'Nouvelle requête', + 'ru-ru': 'Новый запрос', + 'pt-br': 'Nova consulta', }, searchFields: { comment: ` Used in a Query Combo Box's hover-over message to show which fields are being searched on `, - "en-us": "Searched fields", - "ru-ru": "Поля поиска", - "es-es": "Campos buscados", - "fr-fr": "Champs recherchés", - "uk-ua": "Пошукові поля", - "de-ch": "Durchsuchte Felder", - "pt-br": "Campos pesquisados", + 'en-us': 'Searched fields', + 'ru-ru': 'Поля поиска', + 'es-es': 'Campos buscados', + 'fr-fr': 'Champs recherchés', + 'uk-ua': 'Пошукові поля', + 'de-ch': 'Durchsuchte Felder', + 'pt-br': 'Campos pesquisados', }, any: { - "en-us": "Any", - "ru-ru": "Любой", - "es-es": "Cualquiera", - "fr-fr": "N'importe lequel", - "uk-ua": "Будь-який", - "de-ch": "Beliebig", - "pt-br": "Qualquer", + 'en-us': 'Any', + 'ru-ru': 'Любой', + 'es-es': 'Cualquiera', + 'fr-fr': "N'importe lequel", + 'uk-ua': 'Будь-який', + 'de-ch': 'Beliebig', + 'pt-br': 'Qualquer', }, startValue: { - "en-us": "Start Value", - "ru-ru": "Начальное значение", - "es-es": "Valor inicial", - "fr-fr": "Valeur de départ", - "uk-ua": "Початкове значення", - "de-ch": "Startwert", - "pt-br": "Valor inicial", + 'en-us': 'Start Value', + 'ru-ru': 'Начальное значение', + 'es-es': 'Valor inicial', + 'fr-fr': 'Valeur de départ', + 'uk-ua': 'Початкове значення', + 'de-ch': 'Startwert', + 'pt-br': 'Valor inicial', }, endValue: { - "en-us": "End Value", - "ru-ru": "Конечное значение", - "es-es": "Valor final", - "fr-fr": "Valeur finale", - "uk-ua": "Кінцеве значення", - "de-ch": "Endwert", - "pt-br": "Valor final", + 'en-us': 'End Value', + 'ru-ru': 'Конечное значение', + 'es-es': 'Valor final', + 'fr-fr': 'Valeur finale', + 'uk-ua': 'Кінцеве значення', + 'de-ch': 'Endwert', + 'pt-br': 'Valor final', }, saveQuery: { - "en-us": "Save Query", - "ru-ru": "Сохранить запрос", - "es-es": "Guardar consulta", - "fr-fr": "Enregistrer la requête", - "uk-ua": "Зберегти запит", - "de-ch": "Abfrage speichern", - "pt-br": "Salvar consulta", + 'en-us': 'Save Query', + 'ru-ru': 'Сохранить запрос', + 'es-es': 'Guardar consulta', + 'fr-fr': 'Enregistrer la requête', + 'uk-ua': 'Зберегти запит', + 'de-ch': 'Abfrage speichern', + 'pt-br': 'Salvar consulta', }, saveClonedQuery: { - "en-us": "Save query as...", - "ru-ru": "Сохранить запрос как...", - "es-es": "Guardar consulta como...", - "fr-fr": "Enregistrer la requête sous...", - "uk-ua": "Зберегти запит як...", - "de-ch": "Abfrage speichern unter...", - "pt-br": "Salvar consulta como...", + 'en-us': 'Save query as...', + 'ru-ru': 'Сохранить запрос как...', + 'es-es': 'Guardar consulta como...', + 'fr-fr': 'Enregistrer la requête sous...', + 'uk-ua': 'Зберегти запит як...', + 'de-ch': 'Abfrage speichern unter...', + 'pt-br': 'Salvar consulta como...', }, saveClonedQueryDescription: { - "en-us": - "The query will be saved with a new name leaving the current query unchanged.", - "ru-ru": - "Запрос будет сохранен под новым именем, текущий запрос останется без изменений.", - "es-es": - "La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.", - "fr-fr": - "La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.", - "uk-ua": - "Запит буде збережено з новою назвою, а поточний запит залишиться без змін.", - "de-ch": - "Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.", - "pt-br": - "A consulta será salva com um novo nome, deixando a consulta atual inalterada.", + 'en-us': + 'The query will be saved with a new name leaving the current query unchanged.', + 'ru-ru': + 'Запрос будет сохранен под новым именем, текущий запрос останется без изменений.', + 'es-es': + 'La consulta se guardará con un nuevo nombre dejando la consulta actual sin cambios.', + 'fr-fr': + 'La requête sera enregistrée avec un nouveau nom, laissant la requête actuelle inchangée.', + 'uk-ua': + 'Запит буде збережено з новою назвою, а поточний запит залишиться без змін.', + 'de-ch': + 'Die Abfrage wird unter einem neuen Namen gespeichert, die aktuelle Abfrage bleibt unverändert.', + 'pt-br': + 'A consulta será salva com um novo nome, deixando a consulta atual inalterada.', }, queryDeleteIncomplete: { - "en-us": "Query definition contains incomplete fields", - "ru-ru": "Определение запроса содержит неполные поля", - "es-es": "La definición de consulta contiene campos incompletos", - "fr-fr": "La définition de la requête contient des champs incomplets", - "uk-ua": "Визначення запиту містить незаповнені поля", - "de-ch": "Abfragedefinition enthält unvollständige Felder", - "pt-br": "A definição da consulta contém campos incompletos", + 'en-us': 'Query definition contains incomplete fields', + 'ru-ru': 'Определение запроса содержит неполные поля', + 'es-es': 'La definición de consulta contiene campos incompletos', + 'fr-fr': 'La définition de la requête contient des champs incomplets', + 'uk-ua': 'Визначення запиту містить незаповнені поля', + 'de-ch': 'Abfragedefinition enthält unvollständige Felder', + 'pt-br': 'A definição da consulta contém campos incompletos', }, queryDeleteIncompleteDescription: { - "en-us": - "There are uncompleted fields in the query definition. Do you want to remove them?", - "ru-ru": - "В определении запроса есть незаполненные поля. Хотите их удалить?", - "es-es": - "Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?", - "fr-fr": - "Il y a des champs incomplets dans la définition de la requête. Voulez-vous les supprimer ?", - "uk-ua": "У визначенні запиту є незаповнені поля. Ви хочете видалити їх?", - "de-ch": - "Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?", - "pt-br": - "Há campos incompletos na definição da consulta. Deseja removê-los?", + 'en-us': + 'There are uncompleted fields in the query definition. Do you want to remove them?', + 'ru-ru': + 'В определении запроса есть незаполненные поля. Хотите их удалить?', + 'es-es': + 'Hay campos sin completar en la definición de la consulta. ¿Desea eliminarlos?', + 'fr-fr': + 'Il y a des champs incomplets dans la définition de la requête. Voulez-vous les supprimer ?', + 'uk-ua': 'У визначенні запиту є незаповнені поля. Ви хочете видалити їх?', + 'de-ch': + 'Die Abfragedefinition enthält unvollständige Felder. Möchten Sie diese entfernen?', + 'pt-br': + 'Há campos incompletos na definição da consulta. Deseja removê-los?', }, queryUnloadProtect: { - "en-us": "The new or modified query definition has not been saved", - "ru-ru": "Новое или измененное определение запроса не было сохранено.", - "es-es": "La definición de consulta nueva o modificada no se ha guardado", - "fr-fr": + 'en-us': 'The new or modified query definition has not been saved', + 'ru-ru': 'Новое или измененное определение запроса не было сохранено.', + 'es-es': 'La definición de consulta nueva o modificada no se ha guardado', + 'fr-fr': "La définition de requête nouvelle ou modifiée n'a pas été enregistrée", - "uk-ua": "Нове або змінене визначення запиту не було збережено", - "de-ch": - "Die neue oder geänderte Abfragedefinition wurde nicht gespeichert", - "pt-br": "A definição de consulta nova ou modificada não foi salva", + 'uk-ua': 'Нове або змінене визначення запиту не було збережено', + 'de-ch': + 'Die neue oder geänderte Abfragedefinition wurde nicht gespeichert', + 'pt-br': 'A definição de consulta nova ou modificada não foi salva', }, recordSetToQuery: { - comment: "Example: Creating a Record Set from Query", - "en-us": "Creating a {recordSetTable:string} from Query", - "ru-ru": "Создание {recordSetTable:string} из запроса", - "es-es": "Creando un {recordSetTable:string} a partir de una consulta", - "fr-fr": "Création d'un {recordSetTable:string} à partir d'une requête", - "uk-ua": "Створення {recordSetTable:string} із запиту", - "de-ch": "Erstellen eines {recordSetTable:string} aus einer Abfrage", - "pt-br": "Criando um {recordSetTable:string} a partir da consulta", + comment: 'Example: Creating a Record Set from Query', + 'en-us': 'Creating a {recordSetTable:string} from Query', + 'ru-ru': 'Создание {recordSetTable:string} из запроса', + 'es-es': 'Creando un {recordSetTable:string} a partir de una consulta', + 'fr-fr': "Création d'un {recordSetTable:string} à partir d'une requête", + 'uk-ua': 'Створення {recordSetTable:string} із запиту', + 'de-ch': 'Erstellen eines {recordSetTable:string} aus einer Abfrage', + 'pt-br': 'Criando um {recordSetTable:string} a partir da consulta', }, recordSetToQueryDescription: { - "en-us": "Generating {recordSetTable:string}...", - "ru-ru": "Генерация {recordSetTable:string}...", - "es-es": "Generando {recordSetTable:string}...", - "fr-fr": "Génération de {recordSetTable:string}...", - "uk-ua": "Створення {recordSetTable:string}...", - "de-ch": "{recordSetTable:string} wird generiert...", - "pt-br": "Gerando {recordSetTable:string}...", + 'en-us': 'Generating {recordSetTable:string}...', + 'ru-ru': 'Генерация {recordSetTable:string}...', + 'es-es': 'Generando {recordSetTable:string}...', + 'fr-fr': 'Génération de {recordSetTable:string}...', + 'uk-ua': 'Створення {recordSetTable:string}...', + 'de-ch': '{recordSetTable:string} wird generiert...', + 'pt-br': 'Gerando {recordSetTable:string}...', }, recordSetCreated: { - "en-us": "{recordSetTable:string} Created", - "ru-ru": "{recordSetTable:string} Создано", - "es-es": "{recordSetTable:string} Creado", - "fr-fr": "{recordSetTable:string} Créé", - "uk-ua": "{recordSetTable:string} Створено", - "de-ch": "{recordSetTable:string} Erstellt", - "pt-br": "{recordSetTable:string} Criado", + 'en-us': '{recordSetTable:string} Created', + 'ru-ru': '{recordSetTable:string} Создано', + 'es-es': '{recordSetTable:string} Creado', + 'fr-fr': '{recordSetTable:string} Créé', + 'uk-ua': '{recordSetTable:string} Створено', + 'de-ch': '{recordSetTable:string} Erstellt', + 'pt-br': '{recordSetTable:string} Criado', }, missingCoordinatesForKml: { - "en-us": "Unable to export to KML", - "ru-ru": "Невозможно экспортировать в KML", - "es-es": "No se puede exportar a KML", - "fr-fr": "Impossible d'exporter vers KML", - "uk-ua": "Не вдалося експортувати в KML", - "de-ch": "Export in KML nicht möglich", - "pt-br": "Não é possível exportar para KML", + 'en-us': 'Unable to export to KML', + 'ru-ru': 'Невозможно экспортировать в KML', + 'es-es': 'No se puede exportar a KML', + 'fr-fr': "Impossible d'exporter vers KML", + 'uk-ua': 'Не вдалося експортувати в KML', + 'de-ch': 'Export in KML nicht möglich', + 'pt-br': 'Não é possível exportar para KML', }, missingCoordinatesForKmlDescription: { - "en-us": "Please add latitude and longitude fields to the query.", - "ru-ru": "Пожалуйста, добавьте в запрос поля широты и долготы.", - "es-es": "Agregue campos de latitud y longitud a la consulta.", - "fr-fr": - "Veuillez ajouter les champs de latitude et de longitude à la requête.", - "uk-ua": "Будь ласка, додайте поля широти та довготи до запиту.", - "de-ch": "Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.", - "pt-br": "Adicione campos de latitude e longitude à consulta.", + 'en-us': 'Please add latitude and longitude fields to the query.', + 'ru-ru': 'Пожалуйста, добавьте в запрос поля широты и долготы.', + 'es-es': 'Agregue campos de latitud y longitud a la consulta.', + 'fr-fr': + 'Veuillez ajouter les champs de latitude et de longitude à la requête.', + 'uk-ua': 'Будь ласка, додайте поля широти та довготи до запиту.', + 'de-ch': 'Bitte fügen Sie der Abfrage Breiten- und Längengradfelder hinzu.', + 'pt-br': 'Adicione campos de latitude e longitude à consulta.', }, queryExportStarted: { - "en-us": "Export File Being Created", - "ru-ru": "Создается экспортный файл", - "es-es": "Creando archivo de exportación", - "fr-fr": "Fichier d'exportation en cours de création", - "uk-ua": "Експортний файл створюється", - "de-ch": "Exportdatei wird erstellt", - "pt-br": "Arquivo de exportação sendo criado", + 'en-us': 'Export File Being Created', + 'ru-ru': 'Создается экспортный файл', + 'es-es': 'Creando archivo de exportación', + 'fr-fr': "Fichier d'exportation en cours de création", + 'uk-ua': 'Експортний файл створюється', + 'de-ch': 'Exportdatei wird erstellt', + 'pt-br': 'Arquivo de exportação sendo criado', }, queryExportStartedDescription: { - "en-us": - "A notification will appear when the export file is complete and ready for download.", - "es-es": - "Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.", - "uk-ua": - "Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.", - "de-ch": - "Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.", - "fr-fr": + 'en-us': + 'A notification will appear when the export file is complete and ready for download.', + 'es-es': + 'Aparecerá una notificación cuando el archivo de exportación esté completo y listo para descargar.', + 'uk-ua': + 'Коли файл експорту буде завершено та готовий до завантаження, з’явиться сповіщення.', + 'de-ch': + 'Wenn die Exportdatei vollständig ist und zum Download bereit steht, wird eine Benachrichtigung angezeigt.', + 'fr-fr': "Une notification apparaîtra lorsque le fichier d'exportation sera terminé et prêt à être téléchargé.", - "ru-ru": - "Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.", - "pt-br": - "Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.", + 'ru-ru': + 'Когда файл экспорта будет завершен и готов к загрузке, появится уведомление.', + 'pt-br': + 'Uma notificação aparecerá quando o arquivo de exportação estiver concluído e pronto para download.', }, invalidPicklistValue: { - comment: "Used when selected pick list value is not one of allowed values", - "en-us": "{value:string} (current, invalid value)", - "ru-ru": "{value:string} (текущее, недопустимое значение)", - "es-es": "{value:string} (valor actual, no válido)", - "fr-fr": "{value:string} (valeur actuelle, non valide)", - "uk-ua": "{value:string} (поточне, недійсне значення)", - "de-ch": "{value:string} (aktueller, ungültiger Wert)", - "pt-br": "{value:string} (valor atual, inválido)", + comment: 'Used when selected pick list value is not one of allowed values', + 'en-us': '{value:string} (current, invalid value)', + 'ru-ru': '{value:string} (текущее, недопустимое значение)', + 'es-es': '{value:string} (valor actual, no válido)', + 'fr-fr': '{value:string} (valeur actuelle, non valide)', + 'uk-ua': '{value:string} (поточне, недійсне значення)', + 'de-ch': '{value:string} (aktueller, ungültiger Wert)', + 'pt-br': '{value:string} (valor atual, inválido)', }, queryRecordSetTitle: { - comment: "Used in query builder header when querying on record set", - "en-us": + comment: 'Used in query builder header when querying on record set', + 'en-us': 'Query: "{queryName:string}" on {recordSetTable:string}: "{recordSetName:string}"', - "ru-ru": + 'ru-ru': 'Запрос: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - "es-es": + 'es-es': 'Consulta: "{queryName:string}" en {recordSetTable:string}: "{recordSetName:string}"', - "fr-fr": - "Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »", - "uk-ua": + 'fr-fr': + 'Requête : « {queryName:string} » sur {recordSetTable:string} : « {recordSetName:string} »', + 'uk-ua': 'Запит: "{queryName:string}" на {recordSetTable:string}: "{recordSetName:string}"', - "de-ch": + 'de-ch': 'Abfrage: "{queryName:string}" auf {recordSetTable:string}: "{recordSetName:string}"', - "pt-br": + 'pt-br': 'Consulta: "{queryName:string}" em {recordSetTable:string}: "{recordSetName:string}"', }, treeQueryName: { - comment: "Used in query builder header when querying on tree node usages", - "en-us": '{tableName:string} using "{nodeFullName:string}"', - "ru-ru": "{tableName:string} используя «{nodeFullName:string}»", - "es-es": '{tableName:string} usando "{nodeFullName:string}"', - "fr-fr": "{tableName:string} en utilisant « {nodeFullName:string} »", - "uk-ua": '{tableName:string} за допомогою "{nodeFullName:string}"', - "de-ch": '{tableName:string} mit "{nodeFullName:string}"', - "pt-br": '{tableName:string} usando "{nodeFullName:string}"', + comment: 'Used in query builder header when querying on tree node usages', + 'en-us': '{tableName:string} using "{nodeFullName:string}"', + 'ru-ru': '{tableName:string} используя «{nodeFullName:string}»', + 'es-es': '{tableName:string} usando "{nodeFullName:string}"', + 'fr-fr': '{tableName:string} en utilisant « {nodeFullName:string} »', + 'uk-ua': '{tableName:string} за допомогою "{nodeFullName:string}"', + 'de-ch': '{tableName:string} mit "{nodeFullName:string}"', + 'pt-br': '{tableName:string} usando "{nodeFullName:string}"', }, newButtonDescription: { - "en-us": "Add New Field", - "ru-ru": "Добавить новое поле", - "es-es": "Agregar nuevo campo", - "fr-fr": "Ajouter un nouveau champ", - "uk-ua": "Додати нове поле", - "de-ch": "Neues Feld hinzufügen", - "pt-br": "Adicionar novo campo", + 'en-us': 'Add New Field', + 'ru-ru': 'Добавить новое поле', + 'es-es': 'Agregar nuevo campo', + 'fr-fr': 'Ajouter un nouveau champ', + 'uk-ua': 'Додати нове поле', + 'de-ch': 'Neues Feld hinzufügen', + 'pt-br': 'Adicionar novo campo', }, countOnly: { - comment: "Verb", - "en-us": "Count", - "ru-ru": "Считать", - "es-es": "Conteo", - "fr-fr": "Compter", - "uk-ua": "Рахувати", - "de-ch": "Zählen", - "pt-br": "Contar", + comment: 'Verb', + 'en-us': 'Count', + 'ru-ru': 'Считать', + 'es-es': 'Conteo', + 'fr-fr': 'Compter', + 'uk-ua': 'Рахувати', + 'de-ch': 'Zählen', + 'pt-br': 'Contar', }, distinct: { - "en-us": "Distinct", - "ru-ru": "Отчетливый", - "es-es": "Distinto", - "fr-fr": "Distinct", - "uk-ua": "Виразний", - "de-ch": "Unterscheidbar", - "pt-br": "Distinto", + 'en-us': 'Distinct', + 'ru-ru': 'Отчетливый', + 'es-es': 'Distinto', + 'fr-fr': 'Distinct', + 'uk-ua': 'Виразний', + 'de-ch': 'Unterscheidbar', + 'pt-br': 'Distinto', }, series: { - "en-us": "Series", - "de-ch": "Serie", - "es-es": "Serie", - "fr-fr": "Série", - "pt-br": "Série", - "ru-ru": "Ряд", - "uk-ua": "Серія", + 'en-us': 'Series', + 'de-ch': 'Serie', + 'es-es': 'Serie', + 'fr-fr': 'Série', + 'pt-br': 'Série', + 'ru-ru': 'Ряд', + 'uk-ua': 'Серія', }, createCsv: { - "en-us": "Create CSV", - "ru-ru": "Создать CSV-файл", - "es-es": "Crear CSV", - "fr-fr": "Créer un fichier CSV", - "uk-ua": "Створити CSV", - "de-ch": "CSV erstellen", - "pt-br": "Criar CSV", + 'en-us': 'Create CSV', + 'ru-ru': 'Создать CSV-файл', + 'es-es': 'Crear CSV', + 'fr-fr': 'Créer un fichier CSV', + 'uk-ua': 'Створити CSV', + 'de-ch': 'CSV erstellen', + 'pt-br': 'Criar CSV', }, createKml: { - "en-us": "Create KML", - "ru-ru": "Создать KML", - "es-es": "Crear KML", - "fr-fr": "Créer un fichier KML", - "uk-ua": "Створіть KML", - "de-ch": "KML erstellen", - "pt-br": "Criar KML", + 'en-us': 'Create KML', + 'ru-ru': 'Создать KML', + 'es-es': 'Crear KML', + 'fr-fr': 'Créer un fichier KML', + 'uk-ua': 'Створіть KML', + 'de-ch': 'KML erstellen', + 'pt-br': 'Criar KML', }, createRecordSet: { - "en-us": "Create {recordSetTable:string}", - "ru-ru": "Создать {recordSetTable:string}", - "es-es": "Crear {recordSetTable:string}", - "fr-fr": "Créer {recordSetTable:string}", - "uk-ua": "Створити {recordSetTable:string}", - "de-ch": "Erstellen {recordSetTable:string}", - "pt-br": "Criar {recordSetTable:string}", + 'en-us': 'Create {recordSetTable:string}', + 'ru-ru': 'Создать {recordSetTable:string}', + 'es-es': 'Crear {recordSetTable:string}', + 'fr-fr': 'Créer {recordSetTable:string}', + 'uk-ua': 'Створити {recordSetTable:string}', + 'de-ch': 'Erstellen {recordSetTable:string}', + 'pt-br': 'Criar {recordSetTable:string}', }, saveAs: { - "en-us": "Save As", - "es-es": "Guardar como", - "uk-ua": "Зберегти як", - "de-ch": "Speichern unter", - "fr-fr": "Enregistrer sous", - "ru-ru": "Сохранить как", - "pt-br": "Salvar como", + 'en-us': 'Save As', + 'es-es': 'Guardar como', + 'uk-ua': 'Зберегти як', + 'de-ch': 'Speichern unter', + 'fr-fr': 'Enregistrer sous', + 'ru-ru': 'Сохранить как', + 'pt-br': 'Salvar como', }, anyRank: { - "en-us": "(any rank)", - "ru-ru": "(любой ранг)", - "es-es": "(cualquier rango)", - "fr-fr": "(n'importe quel rang)", - "uk-ua": "(будь-який ранг)", - "de-ch": "(jeder Rang)", - "pt-br": "(qualquer classificação)", + 'en-us': '(any rank)', + 'ru-ru': '(любой ранг)', + 'es-es': '(cualquier rango)', + 'fr-fr': "(n'importe quel rang)", + 'uk-ua': '(будь-який ранг)', + 'de-ch': '(jeder Rang)', + 'pt-br': '(qualquer classificação)', }, anyTree: { - "en-us": "(any tree)", - "de-ch": "(jeder Baum)", - "es-es": "(cualquier árbol)", - "fr-fr": "(n'importe quel arbre)", - "pt-br": "(qualquer árvore)", - "ru-ru": "(любое дерево)", - "uk-ua": "(будь-яке дерево)", + 'en-us': '(any tree)', + 'de-ch': '(jeder Baum)', + 'es-es': '(cualquier árbol)', + 'fr-fr': "(n'importe quel arbre)", + 'pt-br': '(qualquer árvore)', + 'ru-ru': '(любое дерево)', + 'uk-ua': '(будь-яке дерево)', }, moveUp: { - comment: "As in move it up", - "en-us": "Move Up", - "ru-ru": "Двигаться вверх", - "es-es": "Mover hacia arriba", - "fr-fr": "Monter", - "uk-ua": "Рухатися вгору", - "de-ch": "Nach oben", - "pt-br": "Mover para cima", + comment: 'As in move it up', + 'en-us': 'Move Up', + 'ru-ru': 'Двигаться вверх', + 'es-es': 'Mover hacia arriba', + 'fr-fr': 'Monter', + 'uk-ua': 'Рухатися вгору', + 'de-ch': 'Nach oben', + 'pt-br': 'Mover para cima', }, moveDown: { - comment: "As in move it down", - "en-us": "Move Down", - "ru-ru": "Двигаться вниз", - "es-es": "Mover hacia abajo", - "fr-fr": "Descendre", - "uk-ua": "Рухатися вниз", - "de-ch": "Nach unten", - "pt-br": "Mover para baixo", + comment: 'As in move it down', + 'en-us': 'Move Down', + 'ru-ru': 'Двигаться вниз', + 'es-es': 'Mover hacia abajo', + 'fr-fr': 'Descendre', + 'uk-ua': 'Рухатися вниз', + 'de-ch': 'Nach unten', + 'pt-br': 'Mover para baixo', }, sort: { - "en-us": "Sort", - "ru-ru": "Сортировать", - "es-es": "Ordenar", - "fr-fr": "Trier", - "uk-ua": "Сортувати", - "de-ch": "Sortieren", - "pt-br": "Organizar", + 'en-us': 'Sort', + 'ru-ru': 'Сортировать', + 'es-es': 'Ordenar', + 'fr-fr': 'Trier', + 'uk-ua': 'Сортувати', + 'de-ch': 'Sortieren', + 'pt-br': 'Organizar', }, ascendingSort: { - "en-us": "Ascending Sort", - "ru-ru": "Сортировка по возрастанию", - "es-es": "Orden ascendente", - "fr-fr": "Tri croissant", - "uk-ua": "Сортування за зростанням", - "de-ch": "Aufsteigende Sortierung", - "pt-br": "Classificação crescente", + 'en-us': 'Ascending Sort', + 'ru-ru': 'Сортировка по возрастанию', + 'es-es': 'Orden ascendente', + 'fr-fr': 'Tri croissant', + 'uk-ua': 'Сортування за зростанням', + 'de-ch': 'Aufsteigende Sortierung', + 'pt-br': 'Classificação crescente', }, descendingSort: { - "en-us": "Descending Sort", - "ru-ru": "Сортировка по убыванию", - "es-es": "Orden descendente", - "fr-fr": "Tri décroissant", - "uk-ua": "Сортування за спаданням", - "de-ch": "Absteigende Sortierung", - "pt-br": "Classificação decrescente", + 'en-us': 'Descending Sort', + 'ru-ru': 'Сортировка по убыванию', + 'es-es': 'Orden descendente', + 'fr-fr': 'Tri décroissant', + 'uk-ua': 'Сортування за спаданням', + 'de-ch': 'Absteigende Sortierung', + 'pt-br': 'Classificação decrescente', }, negate: { - comment: "as in negate query condition", - "en-us": "Negate", - "ru-ru": "Отрицать", - "es-es": "Negar", - "fr-fr": "Nier", - "uk-ua": "Заперечувати", - "de-ch": "Negieren", - "pt-br": "Negar", + comment: 'as in negate query condition', + 'en-us': 'Negate', + 'ru-ru': 'Отрицать', + 'es-es': 'Negar', + 'fr-fr': 'Nier', + 'uk-ua': 'Заперечувати', + 'de-ch': 'Negieren', + 'pt-br': 'Negar', }, showButtonDescription: { - "en-us": "Show in results", - "es-es": "Mostrar en resultados", - "uk-ua": "Показати в результатах", - "de-ch": "In Ergebnissen anzeigen", - "fr-fr": "Afficher dans les résultats", - "ru-ru": "Показать в результатах", - "pt-br": "Mostrar nos resultados", + 'en-us': 'Show in results', + 'es-es': 'Mostrar en resultados', + 'uk-ua': 'Показати в результатах', + 'de-ch': 'In Ergebnissen anzeigen', + 'fr-fr': 'Afficher dans les résultats', + 'ru-ru': 'Показать в результатах', + 'pt-br': 'Mostrar nos resultados', }, aggregatedInline: { - "en-us": "(aggregated)", - "ru-ru": "(агрегированные)", - "es-es": "(agregado)", - "fr-fr": "(agrégés)", - "uk-ua": "(узагальнено)", - "de-ch": "(aggregiert)", - "pt-br": "(agregado)", + 'en-us': '(aggregated)', + 'ru-ru': '(агрегированные)', + 'es-es': '(agregado)', + 'fr-fr': '(agrégés)', + 'uk-ua': '(узагальнено)', + 'de-ch': '(aggregiert)', + 'pt-br': '(agregado)', }, formattedInline: { - "en-us": "(formatted)", - "ru-ru": "(отформатировано)", - "es-es": "(formateado)", - "fr-fr": "(formaté)", - "uk-ua": "(відформатований)", - "de-ch": "(formatiert)", - "pt-br": "(formatado)", + 'en-us': '(formatted)', + 'ru-ru': '(отформатировано)', + 'es-es': '(formateado)', + 'fr-fr': '(formaté)', + 'uk-ua': '(відформатований)', + 'de-ch': '(formatiert)', + 'pt-br': '(formatado)', }, like: { - "en-us": "Like", - "ru-ru": "Нравиться", - "es-es": "Como", - "fr-fr": "Comme", - "uk-ua": "Люблю", - "de-ch": "Wie", - "pt-br": "Como", + 'en-us': 'Like', + 'ru-ru': 'Нравиться', + 'es-es': 'Como', + 'fr-fr': 'Comme', + 'uk-ua': 'Люблю', + 'de-ch': 'Wie', + 'pt-br': 'Como', }, likeDescription: { comment: 'Explains the use of special symbols for the "like" query filter', - "en-us": + 'en-us': 'Use "%" to match any number of characters.\n\nUse "_" to match a single character', - "ru-ru": - "Используйте «%» для обозначения любого количества символов.\n\nИспользуйте «_» для обозначения одного символа.", - "es-es": + 'ru-ru': + 'Используйте «%» для обозначения любого количества символов.\n\nИспользуйте «_» для обозначения одного символа.', + 'es-es': 'Usar "%" para hacer coincidir cualquier número de caracteres.\n\nUsar "_" para hacer coincidir un solo carácter', - "fr-fr": + 'fr-fr': "Utilisez « % » pour correspondre à n'importe quel nombre de caractères.\n\nUtilisez « _ » pour correspondre à un seul caractère.", - "uk-ua": + 'uk-ua': 'Використовуйте "%", щоб відповідати будь-якій кількості символів.\n\nВикористовуйте "_", щоб відповідати одному символу', - "de-ch": - "Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen", - "pt-br": + 'de-ch': + 'Verwenden Sie „%“, um eine beliebige Anzahl von Zeichen abzugleichen.\n\nVerwenden Sie „_“, um ein einzelnes Zeichen abzugleichen', + 'pt-br': 'Use "%" para corresponder a qualquer número de caracteres.\n\nUse "_" para corresponder a um único caractere.', }, equal: { - "en-us": "Equal", - "ru-ru": "Равный", - "es-es": "Igual", - "fr-fr": "Égal", - "uk-ua": "Рівні", - "de-ch": "Gleich", - "pt-br": "Igual", + 'en-us': 'Equal', + 'ru-ru': 'Равный', + 'es-es': 'Igual', + 'fr-fr': 'Égal', + 'uk-ua': 'Рівні', + 'de-ch': 'Gleich', + 'pt-br': 'Igual', }, greaterThan: { - "en-us": "Greater than", - "ru-ru": "Больше чем", - "es-es": "Mayor que", - "fr-fr": "Plus grand que", - "uk-ua": "Більш чим", - "de-ch": "Größer als", - "pt-br": "Maior que", + 'en-us': 'Greater than', + 'ru-ru': 'Больше чем', + 'es-es': 'Mayor que', + 'fr-fr': 'Plus grand que', + 'uk-ua': 'Більш чим', + 'de-ch': 'Größer als', + 'pt-br': 'Maior que', }, lessThan: { - "en-us": "Less than", - "ru-ru": "Меньше, чем", - "es-es": "Menor que", - "fr-fr": "Moins que", - "uk-ua": "Менше ніж", - "de-ch": "Weniger als", - "pt-br": "Menor que", + 'en-us': 'Less than', + 'ru-ru': 'Меньше, чем', + 'es-es': 'Menor que', + 'fr-fr': 'Moins que', + 'uk-ua': 'Менше ніж', + 'de-ch': 'Weniger als', + 'pt-br': 'Menor que', }, greaterOrEqualTo: { - "en-us": "Greater or Equal to", - "ru-ru": "Больше или равно", - "es-es": "Mayor o igual a", - "fr-fr": "Supérieur ou égal à", - "uk-ua": "Більше або дорівнює", - "de-ch": "Größer oder gleich", - "pt-br": "Maior ou igual a", + 'en-us': 'Greater or Equal to', + 'ru-ru': 'Больше или равно', + 'es-es': 'Mayor o igual a', + 'fr-fr': 'Supérieur ou égal à', + 'uk-ua': 'Більше або дорівнює', + 'de-ch': 'Größer oder gleich', + 'pt-br': 'Maior ou igual a', }, lessOrEqualTo: { - "en-us": "Less or Equal to", - "ru-ru": "Меньше или равно", - "es-es": "Menor o igual a", - "fr-fr": "Inférieur ou égal à", - "uk-ua": "Менше або дорівнює", - "de-ch": "Kleiner oder gleich", - "pt-br": "Menor ou igual a", + 'en-us': 'Less or Equal to', + 'ru-ru': 'Меньше или равно', + 'es-es': 'Menor o igual a', + 'fr-fr': 'Inférieur ou égal à', + 'uk-ua': 'Менше або дорівнює', + 'de-ch': 'Kleiner oder gleich', + 'pt-br': 'Menor ou igual a', }, true: { - "en-us": "True", - "ru-ru": "Истинный", - "es-es": "Verdadero", - "fr-fr": "Vrai", - "uk-ua": "правда", - "de-ch": "WAHR", - "pt-br": "Verdadeiro", + 'en-us': 'True', + 'ru-ru': 'Истинный', + 'es-es': 'Verdadero', + 'fr-fr': 'Vrai', + 'uk-ua': 'правда', + 'de-ch': 'WAHR', + 'pt-br': 'Verdadeiro', }, false: { - "en-us": "False", - "ru-ru": "ЛОЖЬ", - "es-es": "Falso", - "fr-fr": "FAUX", - "uk-ua": "помилковий", - "de-ch": "FALSCH", - "pt-br": "Falso", + 'en-us': 'False', + 'ru-ru': 'ЛОЖЬ', + 'es-es': 'Falso', + 'fr-fr': 'FAUX', + 'uk-ua': 'помилковий', + 'de-ch': 'FALSCH', + 'pt-br': 'Falso', }, trueOrNull: { - "en-us": "True or Empty", - "ru-ru": "Истина или Пусто", - "es-es": "Verdadero o vacío", - "fr-fr": "Vrai ou vide", - "uk-ua": "True або Empty", - "de-ch": "Wahr oder leer", - "pt-br": "Verdadeiro ou Vazio", + 'en-us': 'True or Empty', + 'ru-ru': 'Истина или Пусто', + 'es-es': 'Verdadero o vacío', + 'fr-fr': 'Vrai ou vide', + 'uk-ua': 'True або Empty', + 'de-ch': 'Wahr oder leer', + 'pt-br': 'Verdadeiro ou Vazio', }, falseOrNull: { - "en-us": "False or Empty", - "ru-ru": "Ложь или пусто", - "es-es": "Falso o vacío", - "fr-fr": "Faux ou vide", - "uk-ua": "False або Empty", - "de-ch": "Falsch oder leer", - "pt-br": "Falso ou Vazio", + 'en-us': 'False or Empty', + 'ru-ru': 'Ложь или пусто', + 'es-es': 'Falso o vacío', + 'fr-fr': 'Faux ou vide', + 'uk-ua': 'False або Empty', + 'de-ch': 'Falsch oder leer', + 'pt-br': 'Falso ou Vazio', }, between: { - "en-us": "Between", - "ru-ru": "Между", - "es-es": "Entre", - "fr-fr": "Entre", - "uk-ua": "Між", - "de-ch": "Zwischen", - "pt-br": "Entre", + 'en-us': 'Between', + 'ru-ru': 'Между', + 'es-es': 'Entre', + 'fr-fr': 'Entre', + 'uk-ua': 'Між', + 'de-ch': 'Zwischen', + 'pt-br': 'Entre', }, in: { - "en-us": "In", - "ru-ru": "В", - "es-es": "En", - "fr-fr": "Dans", - "uk-ua": "в", - "de-ch": "In", - "pt-br": "Em", + 'en-us': 'In', + 'ru-ru': 'В', + 'es-es': 'En', + 'fr-fr': 'Dans', + 'uk-ua': 'в', + 'de-ch': 'In', + 'pt-br': 'Em', }, inDescription: { - "en-us": "A comma-separated list of values", - "ru-ru": "Список значений, разделенных запятыми", - "es-es": "Una lista de valores separados por comas", - "fr-fr": "Une liste de valeurs séparées par des virgules", - "uk-ua": "Список значень, розділених комами", - "de-ch": "Eine durch Kommas getrennte Liste von Werten", - "pt-br": "Uma lista de valores separados por vírgulas", + 'en-us': 'A comma-separated list of values', + 'ru-ru': 'Список значений, разделенных запятыми', + 'es-es': 'Una lista de valores separados por comas', + 'fr-fr': 'Une liste de valeurs séparées par des virgules', + 'uk-ua': 'Список значень, розділених комами', + 'de-ch': 'Eine durch Kommas getrennte Liste von Werten', + 'pt-br': 'Uma lista de valores separados por vírgulas', }, contains: { - "en-us": "Contains", - "ru-ru": "Содержит", - "es-es": "Contiene", - "fr-fr": "Contient", - "uk-ua": "Містить", - "de-ch": "Enthält", - "pt-br": "Contém", + 'en-us': 'Contains', + 'ru-ru': 'Содержит', + 'es-es': 'Contiene', + 'fr-fr': 'Contient', + 'uk-ua': 'Містить', + 'de-ch': 'Enthält', + 'pt-br': 'Contém', }, empty: { - "en-us": "Empty", - "ru-ru": "Пустой", - "es-es": "Vacío", - "fr-fr": "Vide", - "uk-ua": "Порожній", - "de-ch": "Leer", - "pt-br": "Vazio", + 'en-us': 'Empty', + 'ru-ru': 'Пустой', + 'es-es': 'Vacío', + 'fr-fr': 'Vide', + 'uk-ua': 'Порожній', + 'de-ch': 'Leer', + 'pt-br': 'Vazio', }, and: { - "en-us": "and", - "ru-ru": "и", - "es-es": "y", - "fr-fr": "et", - "uk-ua": "і", - "de-ch": "Und", - "pt-br": "e", + 'en-us': 'and', + 'ru-ru': 'и', + 'es-es': 'y', + 'fr-fr': 'et', + 'uk-ua': 'і', + 'de-ch': 'Und', + 'pt-br': 'e', }, startsWith: { - "en-us": "Starts With", - "ru-ru": "Начинается с", - "es-es": "Comienza con", - "fr-fr": "Commence par", - "uk-ua": "Починається з", - "de-ch": "Beginnt mit", - "pt-br": "Começa com", + 'en-us': 'Starts With', + 'ru-ru': 'Начинается с', + 'es-es': 'Comienza con', + 'fr-fr': 'Commence par', + 'uk-ua': 'Починається з', + 'de-ch': 'Beginnt mit', + 'pt-br': 'Começa com', }, endsWith: { - "en-us": "Ends With", - "de-ch": "Endet mit", - "es-es": "Termina con", - "fr-fr": "Se termine par", - "pt-br": "Termina com", - "ru-ru": "Заканчивается с", - "uk-ua": "Закінчується на", + 'en-us': 'Ends With', + 'de-ch': 'Endet mit', + 'es-es': 'Termina con', + 'fr-fr': 'Se termine par', + 'pt-br': 'Termina com', + 'ru-ru': 'Заканчивается с', + 'uk-ua': 'Закінчується на', }, or: { - "en-us": "or", - "ru-ru": "или", - "es-es": "o", - "fr-fr": "ou", - "uk-ua": "або", - "de-ch": "oder", - "pt-br": "ou", + 'en-us': 'or', + 'ru-ru': 'или', + 'es-es': 'o', + 'fr-fr': 'ou', + 'uk-ua': 'або', + 'de-ch': 'oder', + 'pt-br': 'ou', }, yes: { - "en-us": "Yes", - "ru-ru": "Да", - "es-es": "Sí", - "fr-fr": "Oui", - "uk-ua": "Так", - "de-ch": "Ja", - "pt-br": "Sim", + 'en-us': 'Yes', + 'ru-ru': 'Да', + 'es-es': 'Sí', + 'fr-fr': 'Oui', + 'uk-ua': 'Так', + 'de-ch': 'Ja', + 'pt-br': 'Sim', }, queryResults: { - "en-us": "Query Results", - "ru-ru": "Результаты запроса", - "es-es": "Resultados de la consulta", - "fr-fr": "Résultats de la requête", - "uk-ua": "Результати запиту", - "de-ch": "Abfrageergebnisse", - "pt-br": "Resultados da consulta", + 'en-us': 'Query Results', + 'ru-ru': 'Результаты запроса', + 'es-es': 'Resultados de la consulta', + 'fr-fr': 'Résultats de la requête', + 'uk-ua': 'Результати запиту', + 'de-ch': 'Abfrageergebnisse', + 'pt-br': 'Resultados da consulta', }, browseInForms: { - "en-us": "Browse in Forms", - "ru-ru": "Просмотр в формах", - "es-es": "Navegar en formularios", - "fr-fr": "Parcourir les formulaires", - "uk-ua": "Перегляд у Формах", - "de-ch": "In Formularen blättern", - "pt-br": "Navegar em Formulários", + 'en-us': 'Browse in Forms', + 'ru-ru': 'Просмотр в формах', + 'es-es': 'Navegar en formularios', + 'fr-fr': 'Parcourir les formulaires', + 'uk-ua': 'Перегляд у Формах', + 'de-ch': 'In Formularen blättern', + 'pt-br': 'Navegar em Formulários', }, configureQueryTables: { - "en-us": "Configure visible query tables", - "ru-ru": "Настроить видимые таблицы запросов", - "es-es": "Configurar tablas de consulta visibles", - "fr-fr": "Configurer les tables de requête visibles", - "uk-ua": "Налаштувати видимі таблиці запитів", - "de-ch": "Konfigurieren sichtbarer Abfragetabellen", - "pt-br": "Configurar tabelas de consulta visíveis", + 'en-us': 'Configure visible query tables', + 'ru-ru': 'Настроить видимые таблицы запросов', + 'es-es': 'Configurar tablas de consulta visibles', + 'fr-fr': 'Configurer les tables de requête visibles', + 'uk-ua': 'Налаштувати видимі таблиці запитів', + 'de-ch': 'Konfigurieren sichtbarer Abfragetabellen', + 'pt-br': 'Configurar tabelas de consulta visíveis', }, exportQueryForDwca: { - "en-us": "Export query for DwCA definition", - "ru-ru": "Экспорт запроса на определение DwCA", - "es-es": "Consulta de exportación para la definición de DwCA", - "fr-fr": "Requête d'exportation pour la définition DwCA", - "uk-ua": "Експорт запиту для визначення DwCA", - "de-ch": "Exportabfrage für DwCA-Definition", - "pt-br": "Consulta de exportação para definição DwCA", + 'en-us': 'Export query for DwCA definition', + 'ru-ru': 'Экспорт запроса на определение DwCA', + 'es-es': 'Consulta de exportación para la definición de DwCA', + 'fr-fr': "Requête d'exportation pour la définition DwCA", + 'uk-ua': 'Експорт запиту для визначення DwCA', + 'de-ch': 'Exportabfrage für DwCA-Definition', + 'pt-br': 'Consulta de exportação para definição DwCA', }, exportQueryAsReport: { - "en-us": "Define report based on query", - "ru-ru": "Определить отчет на основе запроса", - "es-es": "Definir informe basado en consulta", - "fr-fr": "Définir un rapport basé sur une requête", - "uk-ua": "Визначити звіт на основі запиту", - "de-ch": "Definieren Sie den Bericht basierend auf der Abfrage", - "pt-br": "Definir relatório com base na consulta", + 'en-us': 'Define report based on query', + 'ru-ru': 'Определить отчет на основе запроса', + 'es-es': 'Definir informe basado en consulta', + 'fr-fr': 'Définir un rapport basé sur une requête', + 'uk-ua': 'Визначити звіт на основі запиту', + 'de-ch': 'Definieren Sie den Bericht basierend auf der Abfrage', + 'pt-br': 'Definir relatório com base na consulta', }, exportQueryAsLabel: { - "en-us": "Define label based on query", - "ru-ru": "Определить метку на основе запроса", - "es-es": "Definir etiqueta según consulta", - "fr-fr": "Définir l'étiquette en fonction de la requête", - "uk-ua": "Визначте мітку на основі запиту", - "de-ch": "Definieren Sie das Label basierend auf der Abfrage", - "pt-br": "Definir rótulo com base na consulta", + 'en-us': 'Define label based on query', + 'ru-ru': 'Определить метку на основе запроса', + 'es-es': 'Definir etiqueta según consulta', + 'fr-fr': "Définir l'étiquette en fonction de la requête", + 'uk-ua': 'Визначте мітку на основі запиту', + 'de-ch': 'Definieren Sie das Label basierend auf der Abfrage', + 'pt-br': 'Definir rótulo com base na consulta', }, treeMerge: { - comment: "Audit Log Action Type", - "en-us": "Tree Merge", - "ru-ru": "Слияние деревьев", - "es-es": "Fusión de árboles", - "fr-fr": "Fusion d'arbres", - "uk-ua": "Об'єднання дерев", - "de-ch": "Baumzusammenführung", - "pt-br": "Mesclagem de Árvores", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Merge', + 'ru-ru': 'Слияние деревьев', + 'es-es': 'Fusión de árboles', + 'fr-fr': "Fusion d'arbres", + 'uk-ua': "Об'єднання дерев", + 'de-ch': 'Baumzusammenführung', + 'pt-br': 'Mesclagem de Árvores', }, treeMove: { - comment: "Audit Log Action Type", - "en-us": "Tree Move", - "ru-ru": "Перемещение дерева", - "es-es": "Movimiento de árbol", - "fr-fr": "Déplacement d'arbre", - "uk-ua": "Переміщення дерева", - "de-ch": "Baum verschieben", - "pt-br": "Movimentação de árvores", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Move', + 'ru-ru': 'Перемещение дерева', + 'es-es': 'Movimiento de árbol', + 'fr-fr': "Déplacement d'arbre", + 'uk-ua': 'Переміщення дерева', + 'de-ch': 'Baum verschieben', + 'pt-br': 'Movimentação de árvores', }, treeSynonymize: { - comment: "Audit Log Action Type", - "en-us": "Tree Synonymize", - "ru-ru": "Дерево Синонимизировать", - "es-es": "Árbol Sinónimos", - "fr-fr": "Synonyme d'arbre", - "uk-ua": "Синонімізувати дерево", - "de-ch": "Baum synonymisieren", - "pt-br": "Árvore Sinonímia", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Synonymize', + 'ru-ru': 'Дерево Синонимизировать', + 'es-es': 'Árbol Sinónimos', + 'fr-fr': "Synonyme d'arbre", + 'uk-ua': 'Синонімізувати дерево', + 'de-ch': 'Baum synonymisieren', + 'pt-br': 'Árvore Sinonímia', }, treeDesynonymize: { - comment: "Audit Log Action Type", - "en-us": "Tree Desynonymize", - "ru-ru": "Десинонимизация дерева", - "es-es": "Desinonimizar árboles", - "fr-fr": "Arbre désynonymisé", - "uk-ua": "Десинонімізація дерева", - "de-ch": "Baum desynonymisieren", - "pt-br": "Árvore Dessinonimizar", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Desynonymize', + 'ru-ru': 'Десинонимизация дерева', + 'es-es': 'Desinonimizar árboles', + 'fr-fr': 'Arbre désynonymisé', + 'uk-ua': 'Десинонімізація дерева', + 'de-ch': 'Baum desynonymisieren', + 'pt-br': 'Árvore Dessinonimizar', }, treeBulkMove: { - comment: "Audit Log Action Type", - "en-us": "Tree Bulk Move", - "de-ch": "Massenbewegung von Bäumen", - "es-es": "Movimiento masivo de árboles", - "fr-fr": "Déplacement d'arbres en vrac", - "ru-ru": "Массовая перевозка деревьев", - "uk-ua": "Масове переміщення дерева", - "pt-br": "Mudança de árvores em massa", + comment: 'Audit Log Action Type', + 'en-us': 'Tree Bulk Move', + 'de-ch': 'Massenbewegung von Bäumen', + 'es-es': 'Movimiento masivo de árboles', + 'fr-fr': "Déplacement d'arbres en vrac", + 'ru-ru': 'Массовая перевозка деревьев', + 'uk-ua': 'Масове переміщення дерева', + 'pt-br': 'Mudança de árvores em massa', }, tooLongErrorMessage: { - "en-us": - "Field value is too long. Max allowed length is {maxLength:number|formatted}", - "ru-ru": - "Значение поля слишком длинное. Максимально допустимая длина: {maxLength:number|formatted}.", - "es-es": - "El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.", - "fr-fr": - "La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.", - "uk-ua": - "Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}", - "de-ch": - "Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}", - "pt-br": - "O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}", + 'en-us': + 'Field value is too long. Max allowed length is {maxLength:number|formatted}', + 'ru-ru': + 'Значение поля слишком длинное. Максимально допустимая длина: {maxLength:number|formatted}.', + 'es-es': + 'El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.', + 'fr-fr': + 'La valeur du champ est trop longue. La longueur maximale autorisée est {maxLength:number|formatted}.', + 'uk-ua': + 'Значення поля задовге. Максимальна дозволена довжина {maxLength:number|formatted}', + 'de-ch': + 'Der Feldwert ist zu lang. Die maximal zulässige Länge beträgt {maxLength:number|formatted}', + 'pt-br': + 'O valor do campo é muito longo. O comprimento máximo permitido é {maxLength:number|formatted}', }, future: { - "en-us": "in the future", - "de-ch": "in der Zukunft", - "es-es": "en el futuro", - "fr-fr": "à l'avenir", - "ru-ru": "в будущем", - "uk-ua": "в майбутньому", - "pt-br": "no futuro", + 'en-us': 'in the future', + 'de-ch': 'in der Zukunft', + 'es-es': 'en el futuro', + 'fr-fr': "à l'avenir", + 'ru-ru': 'в будущем', + 'uk-ua': 'в майбутньому', + 'pt-br': 'no futuro', }, past: { - "en-us": "in the past", - "de-ch": "in der Vergangenheit", - "es-es": "en el pasado", - "fr-fr": "dans le passé", - "ru-ru": "в прошлом", - "uk-ua": "в минулому", - "pt-br": "no passado", + 'en-us': 'in the past', + 'de-ch': 'in der Vergangenheit', + 'es-es': 'en el pasado', + 'fr-fr': 'dans le passé', + 'ru-ru': 'в прошлом', + 'uk-ua': 'в минулому', + 'pt-br': 'no passado', }, days: { - "en-us": "Days", - "es-es": "Días", - "fr-fr": "Jours", - "ru-ru": "Дни", - "uk-ua": "днів", - "de-ch": "Tage", - "pt-br": "Dias", + 'en-us': 'Days', + 'es-es': 'Días', + 'fr-fr': 'Jours', + 'ru-ru': 'Дни', + 'uk-ua': 'днів', + 'de-ch': 'Tage', + 'pt-br': 'Dias', }, weeks: { - "en-us": "Weeks", - "de-ch": "Wochen", - "es-es": "Semanas", - "fr-fr": "Semaines", - "ru-ru": "Недели", - "uk-ua": "тижнів", - "pt-br": "Semanas", + 'en-us': 'Weeks', + 'de-ch': 'Wochen', + 'es-es': 'Semanas', + 'fr-fr': 'Semaines', + 'ru-ru': 'Недели', + 'uk-ua': 'тижнів', + 'pt-br': 'Semanas', }, months: { - "en-us": "Months", - "de-ch": "Monate", - "es-es": "Meses", - "fr-fr": "Mois", - "ru-ru": "Месяцы", - "uk-ua": "Місяці", - "pt-br": "Meses", + 'en-us': 'Months', + 'de-ch': 'Monate', + 'es-es': 'Meses', + 'fr-fr': 'Mois', + 'ru-ru': 'Месяцы', + 'uk-ua': 'Місяці', + 'pt-br': 'Meses', }, years: { - "en-us": "Years", - "de-ch": "Jahre", - "es-es": "Años", - "fr-fr": "Années", - "ru-ru": "Годы", - "uk-ua": "років", - "pt-br": "Anos", + 'en-us': 'Years', + 'de-ch': 'Jahre', + 'es-es': 'Años', + 'fr-fr': 'Années', + 'ru-ru': 'Годы', + 'uk-ua': 'років', + 'pt-br': 'Anos', }, year: { - "en-us": "Year", - "de-ch": "Jahr", - "es-es": "Año", - "fr-fr": "Année", - "ru-ru": "Год", - "uk-ua": "рік", - "pt-br": "", + 'en-us': 'Year', + 'de-ch': 'Jahr', + 'es-es': 'Año', + 'fr-fr': 'Année', + 'ru-ru': 'Год', + 'uk-ua': 'рік', + 'pt-br': '', }, relativeDate: { comment: ` Used in query builder lines, will be shown as a number followed by a period of time (ie: day, month or week) then a direction (past or future) `, - "en-us": - "{size:number} {type:string} {direction:string}", - "de-ch": - "{size:number} {type:string} {direction:string}", - "es-es": - "{size:number} {type:string} {direction:string}", - "fr-fr": - "{size:number} {type:string} {direction:string}", - "ru-ru": - "{size:number} {type:string} {direction:string}", - "uk-ua": - "{size:number} {type:string} {direction:string}", - "pt-br": - "{size:number} {type:string} {direction:string}", + 'en-us': + '{size:number} {type:string} {direction:string}', + 'de-ch': + '{size:number} {type:string} {direction:string}', + 'es-es': + '{size:number} {type:string} {direction:string}', + 'fr-fr': + '{size:number} {type:string} {direction:string}', + 'ru-ru': + '{size:number} {type:string} {direction:string}', + 'uk-ua': + '{size:number} {type:string} {direction:string}', + 'pt-br': + '{size:number} {type:string} {direction:string}', }, importHiddenFields: { - "en-us": "The following fields are hidden in the query you imported:", - "es-es": "Los siguientes campos están ocultos en la consulta que importó:", - "fr-fr": - "Les champs suivants sont masqués dans la requête que vous avez importée :", - "ru-ru": "В импортированном вами запросе скрыты следующие поля:", - "uk-ua": "В імпортованому вами запиті приховано такі поля:", - "de-ch": - "Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:", - "pt-br": "Os seguintes campos estão ocultos na consulta que você importou:", + 'en-us': 'The following fields are hidden in the query you imported:', + 'es-es': 'Los siguientes campos están ocultos en la consulta que importó:', + 'fr-fr': + 'Les champs suivants sont masqués dans la requête que vous avez importée :', + 'ru-ru': 'В импортированном вами запросе скрыты следующие поля:', + 'uk-ua': 'В імпортованому вами запиті приховано такі поля:', + 'de-ch': + 'Die folgenden Felder sind in der von Ihnen importierten Abfrage ausgeblendet:', + 'pt-br': 'Os seguintes campos estão ocultos na consulta que você importou:', }, importNoReadPermission: { - "en-us": - "The query you imported contains tables you do not have read access to:", - "es-es": - "La consulta que importó contiene tablas a las que no tiene acceso de lectura:", - "fr-fr": - "La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :", - "ru-ru": - "Импортированный вами запрос содержит таблицы, к которым у вас нет доступа на чтение:", - "uk-ua": - "Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:", - "de-ch": - "Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:", - "pt-br": - "A consulta que você importou contém tabelas às quais você não tem acesso de leitura:", + 'en-us': + 'The query you imported contains tables you do not have read access to:', + 'es-es': + 'La consulta que importó contiene tablas a las que no tiene acceso de lectura:', + 'fr-fr': + 'La requête que vous avez importée contient des tables auxquelles vous n’avez pas accès en lecture :', + 'ru-ru': + 'Импортированный вами запрос содержит таблицы, к которым у вас нет доступа на чтение:', + 'uk-ua': + 'Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:', + 'de-ch': + 'Die von Ihnen importierte Abfrage enthält Tabellen, auf die Sie keinen Lesezugriff haben:', + 'pt-br': + 'A consulta que você importou contém tabelas às quais você não tem acesso de leitura:', }, noReadPermission: { - "en-us": "No read permission", - "es-es": "Sin permiso de lectura", - "fr-fr": "Aucune autorisation de lecture", - "ru-ru": "Нет разрешения на чтение", - "uk-ua": "Немає дозволу на читання", - "de-ch": "Keine Leseberechtigung", - "pt-br": "Sem permissão de leitura", + 'en-us': 'No read permission', + 'es-es': 'Sin permiso de lectura', + 'fr-fr': 'Aucune autorisation de lecture', + 'ru-ru': 'Нет разрешения на чтение', + 'uk-ua': 'Немає дозволу на читання', + 'de-ch': 'Keine Leseberechtigung', + 'pt-br': 'Sem permissão de leitura', }, switchToRelative: { - "en-us": "Switch to relative", - "de-ch": "Wechseln zu relativ", - "es-es": "Cambiar a relativo", - "fr-fr": "Passer au relatif", - "ru-ru": "Переключиться на относительный", - "uk-ua": "Перейти до відносного", - "pt-br": "Mudar para relativo", + 'en-us': 'Switch to relative', + 'de-ch': 'Wechseln zu relativ', + 'es-es': 'Cambiar a relativo', + 'fr-fr': 'Passer au relatif', + 'ru-ru': 'Переключиться на относительный', + 'uk-ua': 'Перейти до відносного', + 'pt-br': 'Mudar para relativo', }, switchToAbsolute: { - "en-us": "Switch to absolute", - "de-ch": "Wechseln Sie zu absolut", - "es-es": "Cambiar a absoluto", - "fr-fr": "Passer à l'absolu", - "ru-ru": "Переключиться на абсолютный", - "uk-ua": "Перейти до відносного", - "pt-br": "Mudar para absoluto", + 'en-us': 'Switch to absolute', + 'de-ch': 'Wechseln Sie zu absolut', + 'es-es': 'Cambiar a absoluto', + 'fr-fr': "Passer à l'absolu", + 'ru-ru': 'Переключиться на абсолютный', + 'uk-ua': 'Перейти до відносного', + 'pt-br': 'Mudar para absoluto', }, scrollToEditor: { - "en-us": "Scroll to editor", - "de-ch": "Zum Editor scrollen", - "es-es": "Desplazarse al editor", - "uk-ua": "Перейдіть до редактора", - "fr-fr": "Faites défiler jusqu'à l'éditeur", - "ru-ru": "Прокрутите до редактора", - "pt-br": "Vá até o editor", + 'en-us': 'Scroll to editor', + 'de-ch': 'Zum Editor scrollen', + 'es-es': 'Desplazarse al editor', + 'uk-ua': 'Перейдіть до редактора', + 'fr-fr': "Faites défiler jusqu'à l'éditeur", + 'ru-ru': 'Прокрутите до редактора', + 'pt-br': 'Vá até o editor', }, viewRecords: { - "en-us": "View records", - "de-ch": "Datensätze anzeigen", - "es-es": "Ver registros", - "fr-fr": "Afficher les enregistrements", - "ru-ru": "Просмотреть записи", - "uk-ua": "Переглянути записи", - "pt-br": "Ver registros", + 'en-us': 'View records', + 'de-ch': 'Datensätze anzeigen', + 'es-es': 'Ver registros', + 'fr-fr': 'Afficher les enregistrements', + 'ru-ru': 'Просмотреть записи', + 'uk-ua': 'Переглянути записи', + 'pt-br': 'Ver registros', }, chooseFormatter: { - "en-us": "Choose formatter", - "de-ch": "Formatierer auswählen", - "es-es": "Elija el formateador", - "fr-fr": "Choisir le formateur", - "ru-ru": "Выбрать форматировщик", - "uk-ua": "Виберіть форматер", - "pt-br": "Escolha o formatador", + 'en-us': 'Choose formatter', + 'de-ch': 'Formatierer auswählen', + 'es-es': 'Elija el formateador', + 'fr-fr': 'Choisir le formateur', + 'ru-ru': 'Выбрать форматировщик', + 'uk-ua': 'Виберіть форматер', + 'pt-br': 'Escolha o formatador', }, range: { - "en-us": "Range", - "de-ch": "Reichweite", - "es-es": "Rango", - "fr-fr": "Gamme", - "pt-br": "Faixa", - "ru-ru": "Диапазон", - "uk-ua": "Діапазон", + 'en-us': 'Range', + 'de-ch': 'Reichweite', + 'es-es': 'Rango', + 'fr-fr': 'Gamme', + 'pt-br': 'Faixa', + 'ru-ru': 'Диапазон', + 'uk-ua': 'Діапазон', }, strict: { - "en-us": "Strict", - "de-ch": "Strikt", - "es-es": "Estricto", - "fr-fr": "Strict", - "pt-br": "Estrito", - "ru-ru": "Строгий", - "uk-ua": "Суворий", + 'en-us': 'Strict', + 'de-ch': 'Strikt', + 'es-es': 'Estricto', + 'fr-fr': 'Strict', + 'pt-br': 'Estrito', + 'ru-ru': 'Строгий', + 'uk-ua': 'Суворий', }, nonStrict: { - "en-us": "Non strict", - "de-ch": "Nicht streng", - "es-es": "No estricto", - "fr-fr": "Non strict", - "pt-br": "Não rigoroso", - "ru-ru": "Нестрогий", - "uk-ua": "Не суворий", + 'en-us': 'Non strict', + 'de-ch': 'Nicht streng', + 'es-es': 'No estricto', + 'fr-fr': 'Non strict', + 'pt-br': 'Não rigoroso', + 'ru-ru': 'Нестрогий', + 'uk-ua': 'Не суворий', }, catalogNumberInheritance: { - "en-us": "Catalog Number Inheritance", - "de-ch": "Katalognummernvererbung", - "es-es": "Herencia del número de catálogo", - "fr-fr": "Héritage du numéro de catalogue", - "pt-br": "Herança de números de catálogo", - "ru-ru": "Наследование каталожного номера", - "uk-ua": "Успадкування каталожних номерів", + 'en-us': 'Catalog Number Inheritance', + 'de-ch': 'Katalognummernvererbung', + 'es-es': 'Herencia del número de catálogo', + 'fr-fr': 'Héritage du numéro de catalogue', + 'pt-br': 'Herança de números de catálogo', + 'ru-ru': 'Наследование каталожного номера', + 'uk-ua': 'Успадкування каталожних номерів', }, uniqueCatalogNumberAcrossComponentAndCo: { - "en-us": "Catalog Number Uniqueness Across Component And CO tables", - "de-ch": "Eindeutigkeit der Katalognummer in Komponenten- und CO-Tabellen", - "es-es": - "Unicidad del número de catálogo en las tablas de componentes y CO", - "fr-fr": - "Unicité des numéros de catalogue entre les tableaux de composants et de CO", - "pt-br": - "Exclusividade do número de catálogo nas tabelas de componentes e CO", - "ru-ru": "Уникальность каталожного номера в таблицах компонентов и CO", - "uk-ua": "Унікальність каталожних номерів у таблицях компонентів та CO", + 'en-us': 'Catalog Number Uniqueness Across Component And CO tables', + 'de-ch': 'Eindeutigkeit der Katalognummer in Komponenten- und CO-Tabellen', + 'es-es': + 'Unicidad del número de catálogo en las tablas de componentes y CO', + 'fr-fr': + 'Unicité des numéros de catalogue entre les tableaux de composants et de CO', + 'pt-br': + 'Exclusividade do número de catálogo nas tabelas de componentes e CO', + 'ru-ru': 'Уникальность каталожного номера в таблицах компонентов и CO', + 'uk-ua': 'Унікальність каталожних номерів у таблицях компонентів та CO', }, formatInputAs: { comment: ` @@ -975,52 +975,52 @@ export const queryText = createDictionary({ Example: Format As: Ichthyology Example: Format As: Rock, Mineral `, - "en-us": "Format As: {commaSeparatedFormats:string}", - "de-ch": "Formatieren als: {commaSeparatedFormats:string}", - "es-es": "Formato como: {commaSeparatedFormats:string}", - "fr-fr": "Formater comme : {commaSeparatedFormats:string}", - "pt-br": "Formato como: {commaSeparatedFormats:string}", - "ru-ru": "Форматировать как: {commaSeparatedFormats:string}", - "uk-ua": "Форматувати як: {commaSeparatedFormats:string}", + 'en-us': 'Format As: {commaSeparatedFormats:string}', + 'de-ch': 'Formatieren als: {commaSeparatedFormats:string}', + 'es-es': 'Formato como: {commaSeparatedFormats:string}', + 'fr-fr': 'Formater comme : {commaSeparatedFormats:string}', + 'pt-br': 'Formato como: {commaSeparatedFormats:string}', + 'ru-ru': 'Форматировать как: {commaSeparatedFormats:string}', + 'uk-ua': 'Форматувати як: {commaSeparatedFormats:string}', }, unsavedChangesInQuery: { - "en-us": "Query has unsaved changes", - "de-ch": "Die Abfrage enthält nicht gespeicherte Änderungen", - "es-es": "La consulta tiene cambios sin guardar", - "fr-fr": "La requête comporte des modifications non enregistrées", - "pt-br": "A consulta possui alterações não salvas", - "ru-ru": "Запрос имеет несохраненные изменения", - "uk-ua": "Запит містить незбережені зміни", + 'en-us': 'Query has unsaved changes', + 'de-ch': 'Die Abfrage enthält nicht gespeicherte Änderungen', + 'es-es': 'La consulta tiene cambios sin guardar', + 'fr-fr': 'La requête comporte des modifications non enregistrées', + 'pt-br': 'A consulta possui alterações não salvas', + 'ru-ru': 'Запрос имеет несохраненные изменения', + 'uk-ua': 'Запит містить незбережені зміни', }, unsavedChangesInQueryDescription: { - "en-us": "Please save the query before running Batch Edit", - "de-ch": - "Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen", - "es-es": "Guarde la consulta antes de ejecutar la edición por lotes", - "fr-fr": + 'en-us': 'Please save the query before running Batch Edit', + 'de-ch': + 'Bitte speichern Sie die Abfrage, bevor Sie die Stapelbearbeitung ausführen', + 'es-es': 'Guarde la consulta antes de ejecutar la edición por lotes', + 'fr-fr': "Veuillez enregistrer la requête avant d'exécuter l'édition par lots", - "pt-br": "Salve a consulta antes de executar a edição em lote", - "ru-ru": - "Пожалуйста, сохраните запрос перед запуском пакетного редактирования.", - "uk-ua": "Будь ласка, збережіть запит перед запуском пакетного редагування", + 'pt-br': 'Salve a consulta antes de executar a edição em lote', + 'ru-ru': + 'Пожалуйста, сохраните запрос перед запуском пакетного редактирования.', + 'uk-ua': 'Будь ласка, збережіть запит перед запуском пакетного редагування', }, noPreparationsToReturn: { - "en-us": "There are no unresolved items to return", - "ru-ru": "Нет нерешенных вопросов для возврата", - "es-es": "No hay items sin resolver para devolver", - "fr-fr": "Il n'y a aucun article non résolu à retourner", - "uk-ua": "Немає невирішених елементів для повернення", - "de-ch": - "Es gibt keine ungelösten Elemente, die zurückgegeben werden müssen", - "pt-br": "Não há itens não resolvidos para retornar", + 'en-us': 'There are no unresolved items to return', + 'ru-ru': 'Нет нерешенных вопросов для возврата', + 'es-es': 'No hay items sin resolver para devolver', + 'fr-fr': "Il n'y a aucun article non résolu à retourner", + 'uk-ua': 'Немає невирішених елементів для повернення', + 'de-ch': + 'Es gibt keine ungelösten Elemente, die zurückgegeben werden müssen', + 'pt-br': 'Não há itens não resolvidos para retornar', }, itemsReturned: { - "en-us": "Items have been returned", - "ru-ru": "Товары были возвращены", - "es-es": "Los items han sido devueltos", - "fr-fr": "Les articles ont été retournés", - "uk-ua": "Товари повернуто", - "de-ch": "Artikel wurden zurückgegeben", - "pt-br": "Os itens foram devolvidos", + 'en-us': 'Items have been returned', + 'ru-ru': 'Товары были возвращены', + 'es-es': 'Los items han sido devueltos', + 'fr-fr': 'Les articles ont été retournés', + 'uk-ua': 'Товари повернуто', + 'de-ch': 'Artikel wurden zurückgegeben', + 'pt-br': 'Os itens foram devolvidos', }, } as const); From 151e6422b0c08bf28c4ec1c3481d73924cc55ac7 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:40:41 -0500 Subject: [PATCH 084/115] fix(prefs): use collection pref for tree settings --- specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index 984a52bdfe1..14b46b6a57f 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -69,7 +69,7 @@ export function TreeViewActions({ const resourceName = `/tree/edit/${toLowerCase(tableName)}` as const; const isSynonym = typeof focusedRow?.acceptedId === 'number'; - const doExpandSynonymActionsPref = getPref( + const doExpandSynonymActionsPref = getCollectionPref( `sp7.allow_adding_child_to_synonymized_parent.${tableName}` ); From 7583ea67fa1b338cdaacc43772351b87a5e8d7d8 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Mon, 27 Oct 2025 20:20:06 -0500 Subject: [PATCH 085/115] fix: collection pref --- specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index 14b46b6a57f..984a52bdfe1 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -69,7 +69,7 @@ export function TreeViewActions({ const resourceName = `/tree/edit/${toLowerCase(tableName)}` as const; const isSynonym = typeof focusedRow?.acceptedId === 'number'; - const doExpandSynonymActionsPref = getCollectionPref( + const doExpandSynonymActionsPref = getPref( `sp7.allow_adding_child_to_synonymized_parent.${tableName}` ); From 799707de41d5f1b27334dd62451f4163ac48a8d9 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:19:16 +0000 Subject: [PATCH 086/115] Lint code with ESLint and Prettier Triggered by 22672487608f815aa2eb0384c60e049c5d79809b on branch refs/heads/issue-7440 --- .../js_src/lib/components/Atoms/Icons.tsx | 2 +- .../Preferences/CollectionDefinitions.tsx | 6 +- .../js_src/lib/localization/attachments.ts | 12 + .../frontend/js_src/lib/localization/forms.ts | 2016 ++++++++--------- .../js_src/lib/localization/resources.ts | 1744 +++++++------- .../js_src/lib/localization/schema.ts | 842 +++---- .../js_src/lib/localization/stats.tsx | 3 +- 7 files changed, 2319 insertions(+), 2306 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx index b3dad736695..c0a9970e909 100644 --- a/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx +++ b/specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx @@ -107,7 +107,7 @@ export const icons = { minus: , minusCircle: , nonStrict: , - office: , + office: , pencil: , pencilAt: , photos: , diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 1e26542ee5c..e867562f7fa 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -213,9 +213,9 @@ export const collectionPreferenceDefinitions = { tables.CollectionObject, 'catalogNumber' ).label, - collectionObject: tables.CollectionObject.label, + collectionObject: tables.CollectionObject.label, }), - description: () => + description: () => preferencesText.inheritanceCatNumberPrefDescription({ catalogNumber: getField( tables.CollectionObject, @@ -242,7 +242,7 @@ export const collectionPreferenceDefinitions = { ).label, collectionObject: tables.CollectionObject.label, }), - description: () => + description: () => preferencesText.inheritanceCatNumberParentCOPrefDescription({ catalogNumber: getField( tables.CollectionObject, diff --git a/specifyweb/frontend/js_src/lib/localization/attachments.ts b/specifyweb/frontend/js_src/lib/localization/attachments.ts index 50268c30a30..c01262d08ef 100644 --- a/specifyweb/frontend/js_src/lib/localization/attachments.ts +++ b/specifyweb/frontend/js_src/lib/localization/attachments.ts @@ -658,6 +658,18 @@ export const attachmentsText = createDictionary({ createRecordSetToDownloadAll: { 'en-us': 'Not all attachments have been loaded. Please create a record set of the query results to download all the attachments.', + 'de-ch': + 'Es wurden nicht alle Anhänge geladen. Bitte erstellen Sie einen Datensatz der Abfrageergebnisse, um alle Anhänge herunterzuladen.', + 'es-es': + 'No se han cargado todos los archivos adjuntos. Cree un conjunto de registros con los resultados de la consulta para descargarlos todos.', + 'fr-fr': + "Toutes les pièces jointes n'ont pas été chargées. Veuillez créer un ensemble d'enregistrements des résultats de la requête pour télécharger toutes les pièces jointes.", + 'pt-br': + 'Nem todos os anexos foram carregados. Crie um conjunto de registros dos resultados da consulta para baixar todos os anexos.', + 'ru-ru': + 'Не все вложения загружены. Создайте набор записей результатов запроса, чтобы загрузить все вложения.', + 'uk-ua': + 'Не всі вкладення завантажено. Будь ласка, створіть набір записів результатів запиту, щоб завантажити всі вкладення.', }, deleteAttachmentWarning: { 'en-us': 'Are you sure you want to delete this attachment?', diff --git a/specifyweb/frontend/js_src/lib/localization/forms.ts b/specifyweb/frontend/js_src/lib/localization/forms.ts index 15fcf9ac64e..464de5a3141 100644 --- a/specifyweb/frontend/js_src/lib/localization/forms.ts +++ b/specifyweb/frontend/js_src/lib/localization/forms.ts @@ -5,1314 +5,1314 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const formsText = createDictionary({ forms: { - "en-us": "Forms", - "ru-ru": "Формы", - "es-es": "Formularios", - "fr-fr": "Formulaires", - "uk-ua": "Форми", - "de-ch": "Formulare", - "pt-br": "Formulários", + 'en-us': 'Forms', + 'ru-ru': 'Формы', + 'es-es': 'Formularios', + 'fr-fr': 'Formulaires', + 'uk-ua': 'Форми', + 'de-ch': 'Formulare', + 'pt-br': 'Formulários', }, clone: { - "en-us": "Clone", - "ru-ru": "Клон", - "es-es": "Clon", - "fr-fr": "Cloner", - "uk-ua": "Клон", - "de-ch": "Klone", - "pt-br": "Clone", + 'en-us': 'Clone', + 'ru-ru': 'Клон', + 'es-es': 'Clon', + 'fr-fr': 'Cloner', + 'uk-ua': 'Клон', + 'de-ch': 'Klone', + 'pt-br': 'Clone', }, cloneDescription: { - "en-us": "Create a full copy of current record", - "ru-ru": "Создать полную копию текущей записи", - "es-es": "Crear una copia completa del registro actual", - "fr-fr": "Créer une copie complète de l'enregistrement actuel", - "uk-ua": "Створити повну копію поточного запису", - "de-ch": "Erstellen einer kompletten Kopie des aktuellen Datensatzes", - "pt-br": "Crie uma cópia completa do registro atual", + 'en-us': 'Create a full copy of current record', + 'ru-ru': 'Создать полную копию текущей записи', + 'es-es': 'Crear una copia completa del registro actual', + 'fr-fr': "Créer une copie complète de l'enregistrement actuel", + 'uk-ua': 'Створити повну копію поточного запису', + 'de-ch': 'Erstellen einer kompletten Kopie des aktuellen Datensatzes', + 'pt-br': 'Crie uma cópia completa do registro atual', }, valueMustBeUniqueToField: { - "en-us": "Value must be unique to {fieldName:string}", - "ru-ru": "Значение должно быть уникальным для {fieldName:string}", - "es-es": "El valor debe ser exclusivo de {fieldName:string}", - "fr-fr": "La valeur doit être unique à {fieldName:string}", - "uk-ua": "Значення має бути унікальним для {fieldName:string}", - "de-ch": "Der Wert muss für {fieldName:string} eindeutig sein", - "pt-br": "O valor deve ser exclusivo para {fieldName:string}", + 'en-us': 'Value must be unique to {fieldName:string}', + 'ru-ru': 'Значение должно быть уникальным для {fieldName:string}', + 'es-es': 'El valor debe ser exclusivo de {fieldName:string}', + 'fr-fr': 'La valeur doit être unique à {fieldName:string}', + 'uk-ua': 'Значення має бути унікальним для {fieldName:string}', + 'de-ch': 'Der Wert muss für {fieldName:string} eindeutig sein', + 'pt-br': 'O valor deve ser exclusivo para {fieldName:string}', }, valueMustBeUniqueToDatabase: { - "en-us": "Value must be unique to database", - "ru-ru": "Значение должно быть уникальным для БД", - "es-es": "El valor debe ser exclusivo de la base de datos.", - "fr-fr": "La valeur doit être unique dans la base de données", - "uk-ua": "Значення має бути унікальним для бази даних", - "de-ch": "Der Wert muss für die Datenbank eindeutig sein", - "pt-br": "O valor deve ser exclusivo para o banco de dados", + 'en-us': 'Value must be unique to database', + 'ru-ru': 'Значение должно быть уникальным для БД', + 'es-es': 'El valor debe ser exclusivo de la base de datos.', + 'fr-fr': 'La valeur doit être unique dans la base de données', + 'uk-ua': 'Значення має бути унікальним для бази даних', + 'de-ch': 'Der Wert muss für die Datenbank eindeutig sein', + 'pt-br': 'O valor deve ser exclusivo para o banco de dados', }, valuesOfMustBeUniqueToField: { - "en-us": "Values of {values:string} must be unique to {fieldName:string}", - "ru-ru": - "Значения {values:string} должны быть уникальными для {fieldName:string}", - "es-es": - "Los valores de {values:string} deben ser únicos para {fieldName:string}", - "fr-fr": - "Les valeurs de {values:string} doivent être uniques à {fieldName:string}", - "uk-ua": - "Значення {values:string} мають бути унікальними для {fieldName:string}", - "de-ch": - "Werte von {values:string} müssen für {fieldName:string} eindeutig sein.", - "pt-br": - "Os valores de {values:string} devem ser exclusivos de {fieldName:string}", + 'en-us': 'Values of {values:string} must be unique to {fieldName:string}', + 'ru-ru': + 'Значения {values:string} должны быть уникальными для {fieldName:string}', + 'es-es': + 'Los valores de {values:string} deben ser únicos para {fieldName:string}', + 'fr-fr': + 'Les valeurs de {values:string} doivent être uniques à {fieldName:string}', + 'uk-ua': + 'Значення {values:string} мають бути унікальними для {fieldName:string}', + 'de-ch': + 'Werte von {values:string} müssen für {fieldName:string} eindeutig sein.', + 'pt-br': + 'Os valores de {values:string} devem ser exclusivos de {fieldName:string}', }, valuesOfMustBeUniqueToDatabase: { - "en-us": "Values of {values:string} must be unique to database", - "ru-ru": "Значения {values:string} должны быть уникальными в базе данных.", - "es-es": - "Los valores de {values:string} deben ser únicos para la base de datos.", - "fr-fr": - "Les valeurs de {values:string} doivent être uniques à la base de données", - "uk-ua": "Значення {values:string} мають бути унікальними для бази даних", - "de-ch": "Werte von {values:string} müssen in der Datenbank eindeutig sein", - "pt-br": - "Os valores de {values:string} devem ser exclusivos do banco de dados", + 'en-us': 'Values of {values:string} must be unique to database', + 'ru-ru': 'Значения {values:string} должны быть уникальными в базе данных.', + 'es-es': + 'Los valores de {values:string} deben ser únicos para la base de datos.', + 'fr-fr': + 'Les valeurs de {values:string} doivent être uniques à la base de données', + 'uk-ua': 'Значення {values:string} мають бути унікальними для бази даних', + 'de-ch': 'Werte von {values:string} müssen in der Datenbank eindeutig sein', + 'pt-br': + 'Os valores de {values:string} devem ser exclusivos do banco de dados', }, checkingIfResourceCanBeDeleted: { - "en-us": "Checking if resource can be deleted…", - "ru-ru": "Проверка возможности удаления ресурса…", - "es-es": "Comprobando si el recurso se puede eliminar…", - "fr-fr": "Vérification si la ressource peut être supprimée…", - "uk-ua": "Перевірка можливості видалення ресурсу…", - "de-ch": "Überprüfen, ob die Ressource gelöscht werden kann …", - "pt-br": "Verificando se o recurso pode ser excluído…", + 'en-us': 'Checking if resource can be deleted…', + 'ru-ru': 'Проверка возможности удаления ресурса…', + 'es-es': 'Comprobando si el recurso se puede eliminar…', + 'fr-fr': 'Vérification si la ressource peut être supprimée…', + 'uk-ua': 'Перевірка можливості видалення ресурсу…', + 'de-ch': 'Überprüfen, ob die Ressource gelöscht werden kann …', + 'pt-br': 'Verificando se o recurso pode ser excluído…', }, checkingIfResourceIsUsed: { - "en-us": "Checking if this record is currently in use…", - "de-ch": "Es wird geprüft, ob dieser Datensatz derzeit verwendet wird …", - "es-es": "Comprobando si este registro está actualmente en uso…", - "fr-fr": "Vérification si cet enregistrement est actuellement utilisé…", - "pt-br": "Verificando se este registro está em uso no momento…", - "ru-ru": "Проверяем, используется ли эта запись в данный момент…", - "uk-ua": "Перевірка, чи цей запис зараз використовується…", + 'en-us': 'Checking if this record is currently in use…', + 'de-ch': 'Es wird geprüft, ob dieser Datensatz derzeit verwendet wird …', + 'es-es': 'Comprobando si este registro está actualmente en uso…', + 'fr-fr': 'Vérification si cet enregistrement est actuellement utilisé…', + 'pt-br': 'Verificando se este registro está em uso no momento…', + 'ru-ru': 'Проверяем, используется ли эта запись в данный момент…', + 'uk-ua': 'Перевірка, чи цей запис зараз використовується…', }, noLinkedRecords: { - "en-us": "No linked records", - "de-ch": "Keine verknüpften Datensätze", - "es-es": "No hay registros vinculados", - "fr-fr": "Aucun enregistrement lié", - "pt-br": "Nenhum registro vinculado", - "ru-ru": "Нет связанных записей", - "uk-ua": "Немає пов'язаних записів", + 'en-us': 'No linked records', + 'de-ch': 'Keine verknüpften Datensätze', + 'es-es': 'No hay registros vinculados', + 'fr-fr': 'Aucun enregistrement lié', + 'pt-br': 'Nenhum registro vinculado', + 'ru-ru': 'Нет связанных записей', + 'uk-ua': "Немає пов'язаних записів", }, recordUsedDescription: { - "en-us": "This resource is currently linked to the following records:", - "de-ch": - "Diese Ressource ist derzeit mit den folgenden Datensätzen verknüpft:", - "es-es": - "Este recurso está actualmente vinculado a los siguientes registros:", - "fr-fr": - "Cette ressource est actuellement liée aux enregistrements suivants :", - "pt-br": "Este recurso está atualmente vinculado aos seguintes registros:", - "ru-ru": "В настоящее время этот ресурс связан со следующими записями:", - "uk-ua": "Цей ресурс наразі пов’язаний з такими записами:", + 'en-us': 'This resource is currently linked to the following records:', + 'de-ch': + 'Diese Ressource ist derzeit mit den folgenden Datensätzen verknüpft:', + 'es-es': + 'Este recurso está actualmente vinculado a los siguientes registros:', + 'fr-fr': + 'Cette ressource est actuellement liée aux enregistrements suivants :', + 'pt-br': 'Este recurso está atualmente vinculado aos seguintes registros:', + 'ru-ru': 'В настоящее время этот ресурс связан со следующими записями:', + 'uk-ua': 'Цей ресурс наразі пов’язаний з такими записами:', }, deleteBlocked: { - "en-us": "Delete blocked", - "ru-ru": "Удалить заблокированный", - "es-es": "Eliminar bloqueado", - "fr-fr": "Suppression bloquée", - "uk-ua": "Видалити заблоковано", - "de-ch": "Gesperrte löschen", - "pt-br": "Excluir bloqueado", + 'en-us': 'Delete blocked', + 'ru-ru': 'Удалить заблокированный', + 'es-es': 'Eliminar bloqueado', + 'fr-fr': 'Suppression bloquée', + 'uk-ua': 'Видалити заблоковано', + 'de-ch': 'Gesperrte löschen', + 'pt-br': 'Excluir bloqueado', }, deleteBlockedDescription: { - "en-us": - "The resource cannot be deleted because it is referenced by the following resources:", - "de-ch": - "Die Ressource kann nicht gelöscht werden, da sie von den folgenden Ressourcen referenziert wird:", - "es-es": "encontrar usos", - "fr-fr": - "La ressource ne peut pas être supprimée car les ressources suivantes y font référence :", - "ru-ru": - "Ресурс не может быть удален, поскольку на него ссылаются следующие ресурсы:", - "uk-ua": - "Ресурс не можна видалити, оскільки на нього посилаються такі ресурси:", - "pt-br": - "O recurso não pode ser excluído porque é referenciado pelos seguintes recursos:", + 'en-us': + 'The resource cannot be deleted because it is referenced by the following resources:', + 'de-ch': + 'Die Ressource kann nicht gelöscht werden, da sie von den folgenden Ressourcen referenziert wird:', + 'es-es': 'encontrar usos', + 'fr-fr': + 'La ressource ne peut pas être supprimée car les ressources suivantes y font référence :', + 'ru-ru': + 'Ресурс не может быть удален, поскольку на него ссылаются следующие ресурсы:', + 'uk-ua': + 'Ресурс не можна видалити, оскільки на нього посилаються такі ресурси:', + 'pt-br': + 'O recurso não pode ser excluído porque é referenciado pelos seguintes recursos:', }, relationship: { - "en-us": "Relationship", - "ru-ru": "Отношение", - "es-es": "Relación", - "fr-fr": "Relation", - "uk-ua": "Стосунків", - "de-ch": "Beziehung", - "pt-br": "Relação", + 'en-us': 'Relationship', + 'ru-ru': 'Отношение', + 'es-es': 'Relación', + 'fr-fr': 'Relation', + 'uk-ua': 'Стосунків', + 'de-ch': 'Beziehung', + 'pt-br': 'Relação', }, paleoMap: { - "en-us": "Paleo Map", - "ru-ru": "Палеокарта", - "es-es": "Mapa Paleo", - "fr-fr": "Carte Paléo", - "uk-ua": "Палео-мапа", - "de-ch": "Paläo-Karte", - "pt-br": "Mapa Paleo", + 'en-us': 'Paleo Map', + 'ru-ru': 'Палеокарта', + 'es-es': 'Mapa Paleo', + 'fr-fr': 'Carte Paléo', + 'uk-ua': 'Палео-мапа', + 'de-ch': 'Paläo-Karte', + 'pt-br': 'Mapa Paleo', }, paleoRequiresGeography: { - comment: "Example: Geography Required", - "en-us": "{geographyTable:string} Required", - "ru-ru": "{geographyTable:string} Требуется", - "es-es": "{geographyTable:string} Requerido", - "fr-fr": "{geographyTable:string} Obligatoire", - "uk-ua": "{geographyTable:string} Обов'язково", - "de-ch": "{geographyTable:string} Erforderlich", - "pt-br": "{geographyTable:string} Obrigatório", + comment: 'Example: Geography Required', + 'en-us': '{geographyTable:string} Required', + 'ru-ru': '{geographyTable:string} Требуется', + 'es-es': '{geographyTable:string} Requerido', + 'fr-fr': '{geographyTable:string} Obligatoire', + 'uk-ua': "{geographyTable:string} Обов'язково", + 'de-ch': '{geographyTable:string} Erforderlich', + 'pt-br': '{geographyTable:string} Obrigatório', }, paleoRequiresGeographyDescription: { - "en-us": - "The Paleo Map plugin requires that the {localityTable:string} have geographic coordinates and that the paleo context have a geographic age with at least a start time or and end time populated.", - "de-ch": - "Das Paleo Map-Plugin erfordert, dass {localityTable:string} geografische Koordinaten hat und dass der Paläo-Kontext ein geografisches Alter mit mindestens einer ausgefüllten Start- oder Endzeit hat.", - "es-es": "Seleccionar fuente de tablas", - "fr-fr": - "Le plugin Paleo Map nécessite que les {localityTable:string} aient des coordonnées géographiques et que le contexte paléo ait un âge géographique avec au moins une heure de début ou une heure de fin renseignée.", - "ru-ru": - "Плагин Paleo Map требует, чтобы {localityTable:string} имел географические координаты и чтобы палеоконтекст имел географический возраст с указанием как минимум начального и конечного времени.", - "uk-ua": - "Плагін Paleo Map вимагає, щоб {localityTable:string} мав географічні координати, а палеодієнтний контекст мав географічний вік із зазначенням принаймні часу початку або часу завершення.", - "pt-br": - "O plugin Paleo Map requer que o {localityTable:string} tenha coordenadas geográficas e que o contexto paleo tenha uma idade geográfica com pelo menos um horário de início ou término preenchidos.", + 'en-us': + 'The Paleo Map plugin requires that the {localityTable:string} have geographic coordinates and that the paleo context have a geographic age with at least a start time or and end time populated.', + 'de-ch': + 'Das Paleo Map-Plugin erfordert, dass {localityTable:string} geografische Koordinaten hat und dass der Paläo-Kontext ein geografisches Alter mit mindestens einer ausgefüllten Start- oder Endzeit hat.', + 'es-es': 'Seleccionar fuente de tablas', + 'fr-fr': + 'Le plugin Paleo Map nécessite que les {localityTable:string} aient des coordonnées géographiques et que le contexte paléo ait un âge géographique avec au moins une heure de début ou une heure de fin renseignée.', + 'ru-ru': + 'Плагин Paleo Map требует, чтобы {localityTable:string} имел географические координаты и чтобы палеоконтекст имел географический возраст с указанием как минимум начального и конечного времени.', + 'uk-ua': + 'Плагін Paleo Map вимагає, щоб {localityTable:string} мав географічні координати, а палеодієнтний контекст мав географічний вік із зазначенням принаймні часу початку або часу завершення.', + 'pt-br': + 'O plugin Paleo Map requer que o {localityTable:string} tenha coordenadas geográficas e que o contexto paleo tenha uma idade geográfica com pelo menos um horário de início ou término preenchidos.', }, invalidDate: { - "en-us": "Invalid Date", - "ru-ru": "Неверная дата", - "es-es": "Fecha invalida", - "fr-fr": "Date invalide", - "uk-ua": "Недійсна дата", - "de-ch": "Ungültiges Datum", - "pt-br": "Data inválida", + 'en-us': 'Invalid Date', + 'ru-ru': 'Неверная дата', + 'es-es': 'Fecha invalida', + 'fr-fr': 'Date invalide', + 'uk-ua': 'Недійсна дата', + 'de-ch': 'Ungültiges Datum', + 'pt-br': 'Data inválida', }, deleteConfirmation: { - "en-us": - "Are you sure you want to permanently delete this {tableName:string} from the database?", - "de-ch": - "Sind Sie sicher, dass Sie diesen {tableName:string} dauerhaft aus der Datenbank löschen möchten?", - "es-es": "El valor debe ser exclusivo de la base de datos.", - "fr-fr": - "Êtes-vous sûr de vouloir supprimer définitivement ce {tableName:string} de la base de données ?", - "ru-ru": - "Вы уверены, что хотите навсегда удалить {tableName:string} из базы данных?", - "uk-ua": - "Ви впевнені, що хочете остаточно видалити цей {tableName:string} з бази даних?", - "pt-br": - "Tem certeza de que deseja excluir permanentemente este {tableName:string} do banco de dados?", + 'en-us': + 'Are you sure you want to permanently delete this {tableName:string} from the database?', + 'de-ch': + 'Sind Sie sicher, dass Sie diesen {tableName:string} dauerhaft aus der Datenbank löschen möchten?', + 'es-es': 'El valor debe ser exclusivo de la base de datos.', + 'fr-fr': + 'Êtes-vous sûr de vouloir supprimer définitivement ce {tableName:string} de la base de données ?', + 'ru-ru': + 'Вы уверены, что хотите навсегда удалить {tableName:string} из базы данных?', + 'uk-ua': + 'Ви впевнені, що хочете остаточно видалити цей {tableName:string} з бази даних?', + 'pt-br': + 'Tem certeza de que deseja excluir permanentemente este {tableName:string} do banco de dados?', }, deleteConfirmationDescription: { - "en-us": "This action cannot be undone.", - "ru-ru": "Это действие не может быть отменено.", - "es-es": "Esta acción no se puede deshacer.", - "fr-fr": "Cette action ne peut pas être annulée.", - "uk-ua": "Цю дію не можна скасувати.", - "de-ch": "Diese Aktion kann nicht rückgängig gemacht werden.", - "pt-br": "Esta ação não pode ser desfeita.", + 'en-us': 'This action cannot be undone.', + 'ru-ru': 'Это действие не может быть отменено.', + 'es-es': 'Esta acción no se puede deshacer.', + 'fr-fr': 'Cette action ne peut pas être annulée.', + 'uk-ua': 'Цю дію не можна скасувати.', + 'de-ch': 'Diese Aktion kann nicht rückgängig gemacht werden.', + 'pt-br': 'Esta ação não pode ser desfeita.', }, datePrecision: { - "en-us": "Date Precision", - "ru-ru": "Точность даты", - "es-es": "Precisión de fecha", - "fr-fr": "Précision de la date", - "uk-ua": "Точність дати", - "de-ch": "Datumsgenauigkeit", - "pt-br": "Precisão de data", + 'en-us': 'Date Precision', + 'ru-ru': 'Точность даты', + 'es-es': 'Precisión de fecha', + 'fr-fr': 'Précision de la date', + 'uk-ua': 'Точність дати', + 'de-ch': 'Datumsgenauigkeit', + 'pt-br': 'Precisão de data', }, monthYear: { comment: ` A placeholder for partial date field when "month /year" type is selected. Visible only in browsers that don\'t support the "month" input type. `, - "en-us": "Mon / Year", - "ru-ru": "Пн / Год", - "es-es": "Usar configuraciones personalizadas", - "fr-fr": "Mois / Année", - "uk-ua": "Пн / Рік", - "de-ch": "Mo / Jahr", - "pt-br": "Seg / Ano", + 'en-us': 'Mon / Year', + 'ru-ru': 'Пн / Год', + 'es-es': 'Usar configuraciones personalizadas', + 'fr-fr': 'Mois / Année', + 'uk-ua': 'Пн / Рік', + 'de-ch': 'Mo / Jahr', + 'pt-br': 'Seg / Ano', }, yearPlaceholder: { comment: 'A placeholder for partial date field when "year" type is selected', - "en-us": "YYYY", - "ru-ru": "ГГГГ", - "es-es": "AAAA", - "fr-fr": "AAAA", - "uk-ua": "РРРР", - "de-ch": "JJJJ", - "pt-br": "AAAA", + 'en-us': 'YYYY', + 'ru-ru': 'ГГГГ', + 'es-es': 'AAAA', + 'fr-fr': 'AAAA', + 'uk-ua': 'РРРР', + 'de-ch': 'JJJJ', + 'pt-br': 'AAAA', }, today: { - "en-us": "Today", - "ru-ru": "Сегодня", - "es-es": "Hoy", - "fr-fr": "Aujourd'hui", - "uk-ua": "Сьогодні", - "de-ch": "Heute", - "pt-br": "Hoje", + 'en-us': 'Today', + 'ru-ru': 'Сегодня', + 'es-es': 'Hoy', + 'fr-fr': "Aujourd'hui", + 'uk-ua': 'Сьогодні', + 'de-ch': 'Heute', + 'pt-br': 'Hoje', }, todayButtonDescription: { - "en-us": "Set to current date", - "ru-ru": "Установить на текущую дату", - "es-es": "Establecer en la fecha actual", - "fr-fr": "Définir sur la date actuelle", - "uk-ua": "Встановити на поточну дату", - "de-ch": "Auf aktuelles Datum einstellen", - "pt-br": "Definir para a data atual", + 'en-us': 'Set to current date', + 'ru-ru': 'Установить на текущую дату', + 'es-es': 'Establecer en la fecha actual', + 'fr-fr': 'Définir sur la date actuelle', + 'uk-ua': 'Встановити на поточну дату', + 'de-ch': 'Auf aktuelles Datum einstellen', + 'pt-br': 'Definir para a data atual', }, addToPickListConfirmation: { - "en-us": "Add to {pickListTable:string}?", - "ru-ru": "Добавить в {pickListTable:string}?", - "es-es": "¿Añadir a {pickListTable:string}?", - "fr-fr": "Ajouter à {pickListTable:string} ?", - "uk-ua": "Додати до {pickListTable:string}?", - "de-ch": "Zu {pickListTable:string} hinzufügen?", - "pt-br": "Adicionar a {pickListTable:string}?", + 'en-us': 'Add to {pickListTable:string}?', + 'ru-ru': 'Добавить в {pickListTable:string}?', + 'es-es': '¿Añadir a {pickListTable:string}?', + 'fr-fr': 'Ajouter à {pickListTable:string} ?', + 'uk-ua': 'Додати до {pickListTable:string}?', + 'de-ch': 'Zu {pickListTable:string} hinzufügen?', + 'pt-br': 'Adicionar a {pickListTable:string}?', }, addToPickListConfirmationDescription: { - "en-us": + 'en-us': 'Add value "{value:string}" to the {pickListTable:string} named "{pickListName:string}"?', - "de-ch": - "Wert „{value:string}“ zum {pickListTable:string} mit dem Namen „{pickListName:string}“ hinzufügen?", - "es-es": + 'de-ch': + 'Wert „{value:string}“ zum {pickListTable:string} mit dem Namen „{pickListName:string}“ hinzufügen?', + 'es-es': '¿Agregar valor "{value:string}" al {pickListTable:string} llamado "{pickListName:string}"?', - "fr-fr": - "Ajouter la valeur « {value:string} » au {pickListTable:string} nommé « {pickListName:string} » ?", - "ru-ru": - "Добавить значение «{value:string}» к {pickListTable:string} с именем «{pickListName:string}»?", - "uk-ua": + 'fr-fr': + 'Ajouter la valeur « {value:string} » au {pickListTable:string} nommé « {pickListName:string} » ?', + 'ru-ru': + 'Добавить значение «{value:string}» к {pickListTable:string} с именем «{pickListName:string}»?', + 'uk-ua': 'Додати значення "{value:string}" до {pickListTable:string} з назвою "{pickListName:string}"?', - "pt-br": + 'pt-br': 'Adicionar valor "{value:string}" ao {pickListTable:string} chamado "{pickListName:string}"?', }, invalidType: { - "en-us": "Invalid Type", - "ru-ru": "Неверный тип", - "es-es": "Tipo inválido", - "fr-fr": "Type invalide", - "uk-ua": "Недійсний тип", - "de-ch": "Ungültiger Typ", - "pt-br": "Tipo inválido", + 'en-us': 'Invalid Type', + 'ru-ru': 'Неверный тип', + 'es-es': 'Tipo inválido', + 'fr-fr': 'Type invalide', + 'uk-ua': 'Недійсний тип', + 'de-ch': 'Ungültiger Typ', + 'pt-br': 'Tipo inválido', }, invalidNumericPicklistValue: { - "en-us": "Only numeric values are supported in this {pickListTable:string}", - "de-ch": - "In diesem {pickListTable:string} werden nur numerische Werte unterstützt.", - "es-es": "En este {pickListTable:string} solo se admiten valores numéricos", - "fr-fr": - "Seules les valeurs numériques sont prises en charge dans ce {pickListTable:string}", - "ru-ru": - "В этом {pickListTable:string} поддерживаются только числовые значения.", - "uk-ua": - "У цьому {pickListTable:string} підтримуються лише числові значення", - "pt-br": - "Somente valores numéricos são suportados neste {pickListTable:string}", + 'en-us': 'Only numeric values are supported in this {pickListTable:string}', + 'de-ch': + 'In diesem {pickListTable:string} werden nur numerische Werte unterstützt.', + 'es-es': 'En este {pickListTable:string} solo se admiten valores numéricos', + 'fr-fr': + 'Seules les valeurs numériques sont prises en charge dans ce {pickListTable:string}', + 'ru-ru': + 'В этом {pickListTable:string} поддерживаются только числовые значения.', + 'uk-ua': + 'У цьому {pickListTable:string} підтримуються лише числові значення', + 'pt-br': + 'Somente valores numéricos são suportados neste {pickListTable:string}', }, noData: { - "en-us": "No Data.", - "ru-ru": "Нет данных.", - "es-es": "Sin datos.", - "fr-fr": "Aucune donnée.", - "uk-ua": "Немає даних.", - "de-ch": "Keine Daten.", - "pt-br": "Sem dados.", + 'en-us': 'No Data.', + 'ru-ru': 'Нет данных.', + 'es-es': 'Sin datos.', + 'fr-fr': 'Aucune donnée.', + 'uk-ua': 'Немає даних.', + 'de-ch': 'Keine Daten.', + 'pt-br': 'Sem dados.', }, recordSetDeletionWarning: { - "en-us": + 'en-us': 'The {recordSetTable:string} "{recordSetName:string}" will be deleted. The referenced records will NOT be deleted from the database.', - "ru-ru": + 'ru-ru': '{recordSetTable:string} "{recordSetName:string}" будет удалён. Связанные с этим записи НЕ будут удалены из базы данных.', - "es-es": + 'es-es': 'Se eliminará el {recordSetTable:string} "{recordSetName:string}". Los registros referenciados no se eliminarán de la base de datos.', - "fr-fr": - "Le {recordSetTable:string} « {recordSetName:string} » sera supprimé. Les enregistrements référencés ne seront PAS supprimés de la base de données.", - "uk-ua": + 'fr-fr': + 'Le {recordSetTable:string} « {recordSetName:string} » sera supprimé. Les enregistrements référencés ne seront PAS supprimés de la base de données.', + 'uk-ua': '{recordSetTable:string} "{recordSetName:string}" буде видалено. Записи, на які посилаються, НЕ будуть видалені з бази даних.', - "de-ch": + 'de-ch': 'Der {recordSetTable:string} "{recordSetName:string}" wird gelöscht. Die referenzierten Datensätze werden NICHT aus der Datenbank gelöscht.', - "pt-br": + 'pt-br': 'O {recordSetTable:string} "{recordSetName:string}" será excluído. Os registros referenciados NÃO serão excluídos do banco de dados.', }, saveRecordFirst: { - "en-us": "Save record first", - "ru-ru": "Сначала сохраните запись", - "es-es": "Guardar registro primero", - "fr-fr": "Sauvegarder d'abord l'enregistrement", - "uk-ua": "Спочатку збережіть запис", - "de-ch": "Datensatz zuerst speichern", - "pt-br": "Salvar registro primeiro", + 'en-us': 'Save record first', + 'ru-ru': 'Сначала сохраните запись', + 'es-es': 'Guardar registro primero', + 'fr-fr': "Sauvegarder d'abord l'enregistrement", + 'uk-ua': 'Спочатку збережіть запис', + 'de-ch': 'Datensatz zuerst speichern', + 'pt-br': 'Salvar registro primeiro', }, firstRecord: { - "en-us": "First Record", - "ru-ru": "Первая запись", - "es-es": "Primer disco", - "fr-fr": "Premier enregistrement", - "uk-ua": "Перший запис", - "de-ch": "Erster Eintrag", - "pt-br": "Primeiro Registro", + 'en-us': 'First Record', + 'ru-ru': 'Первая запись', + 'es-es': 'Primer disco', + 'fr-fr': 'Premier enregistrement', + 'uk-ua': 'Перший запис', + 'de-ch': 'Erster Eintrag', + 'pt-br': 'Primeiro Registro', }, lastRecord: { - "en-us": "Last Record", - "ru-ru": "Последняя запись", - "es-es": "Último registro", - "fr-fr": "Dernier enregistrement", - "uk-ua": "Останній запис", - "de-ch": "Letzter Datensatz", - "pt-br": "Último registro", + 'en-us': 'Last Record', + 'ru-ru': 'Последняя запись', + 'es-es': 'Último registro', + 'fr-fr': 'Dernier enregistrement', + 'uk-ua': 'Останній запис', + 'de-ch': 'Letzter Datensatz', + 'pt-br': 'Último registro', }, previousRecord: { - "en-us": "Previous Record", - "ru-ru": "Предыдущая запись", - "es-es": "Registro anterior", - "fr-fr": "Enregistrement précédent", - "uk-ua": "Попередній запис", - "de-ch": "Vorheriger Datensatz", - "pt-br": "Registro anterior", + 'en-us': 'Previous Record', + 'ru-ru': 'Предыдущая запись', + 'es-es': 'Registro anterior', + 'fr-fr': 'Enregistrement précédent', + 'uk-ua': 'Попередній запис', + 'de-ch': 'Vorheriger Datensatz', + 'pt-br': 'Registro anterior', }, nextRecord: { - "en-us": "Next Record", - "ru-ru": "Следующая запись", - "es-es": "Próximo récord", - "fr-fr": "Enregistrement suivant", - "uk-ua": "Наступний запис", - "de-ch": "Nächster Datensatz", - "pt-br": "Próximo registro", + 'en-us': 'Next Record', + 'ru-ru': 'Следующая запись', + 'es-es': 'Próximo récord', + 'fr-fr': 'Enregistrement suivant', + 'uk-ua': 'Наступний запис', + 'de-ch': 'Nächster Datensatz', + 'pt-br': 'Próximo registro', }, currentRecord: { - "en-us": "Current object (out of {total:number|formatted})", - "ru-ru": "Текущий объект (из {total:number|formatted})", - "es-es": "Objeto actual (de {total:number|formatted})", - "fr-fr": "Objet actuel (sur {total:number|formatted})", - "uk-ua": "Поточний об'єкт (з {total:number|formatted})", - "de-ch": "Aktuelles Objekt (aus {total:number|formatted})", - "pt-br": "Objeto atual (de {total:number|formatted})", + 'en-us': 'Current object (out of {total:number|formatted})', + 'ru-ru': 'Текущий объект (из {total:number|formatted})', + 'es-es': 'Objeto actual (de {total:number|formatted})', + 'fr-fr': 'Objet actuel (sur {total:number|formatted})', + 'uk-ua': "Поточний об'єкт (з {total:number|formatted})", + 'de-ch': 'Aktuelles Objekt (aus {total:number|formatted})', + 'pt-br': 'Objeto atual (de {total:number|formatted})', }, unsavedFormUnloadProtect: { - "en-us": "This form has not been saved.", - "ru-ru": "Эта форма не была сохранена.", - "es-es": "Este formulario no ha sido guardado.", - "fr-fr": "Ce formulaire n'a pas été enregistré.", - "uk-ua": "Цю форму не збережено.", - "de-ch": "Dieses Formular wurde nicht gespeichert.", - "pt-br": "Este formulário não foi salvo.", + 'en-us': 'This form has not been saved.', + 'ru-ru': 'Эта форма не была сохранена.', + 'es-es': 'Este formulario no ha sido guardado.', + 'fr-fr': "Ce formulaire n'a pas été enregistré.", + 'uk-ua': 'Цю форму не збережено.', + 'de-ch': 'Dieses Formular wurde nicht gespeichert.', + 'pt-br': 'Este formulário não foi salvo.', }, saveConflict: { - comment: "Meaning a conflict occurred when saving", - "en-us": "Save conflict", - "ru-ru": "Сохранить конфликт", - "es-es": "Guardar conflicto", - "fr-fr": "Sauvegarder le conflit", - "uk-ua": "Зберегти конфлікт", - "de-ch": "Konflikt speichern", - "pt-br": "Salvar conflito", + comment: 'Meaning a conflict occurred when saving', + 'en-us': 'Save conflict', + 'ru-ru': 'Сохранить конфликт', + 'es-es': 'Guardar conflicto', + 'fr-fr': 'Sauvegarder le conflit', + 'uk-ua': 'Зберегти конфлікт', + 'de-ch': 'Konflikt speichern', + 'pt-br': 'Salvar conflito', }, saveConflictDescription: { - "en-us": - "The data shown on this page has been changed by another user or in another browser tab and is out of date. The page must be reloaded to prevent inconsistent data from being saved.", - "ru-ru": - "Данные на этой странице были изменены другим пользователем или на другой вкладке браузера и устарели. Для предотвращения сохранения несоответствующих данных необходимо перезагрузить страницу.", - "es-es": - "Los datos que se muestran en esta página han sido modificados por otro usuario o en otra pestaña del navegador y están desactualizados. Es necesario recargar la página para evitar que se guarden datos incoherentes.", - "fr-fr": + 'en-us': + 'The data shown on this page has been changed by another user or in another browser tab and is out of date. The page must be reloaded to prevent inconsistent data from being saved.', + 'ru-ru': + 'Данные на этой странице были изменены другим пользователем или на другой вкладке браузера и устарели. Для предотвращения сохранения несоответствующих данных необходимо перезагрузить страницу.', + 'es-es': + 'Los datos que se muestran en esta página han sido modificados por otro usuario o en otra pestaña del navegador y están desactualizados. Es necesario recargar la página para evitar que se guarden datos incoherentes.', + 'fr-fr': "Les données affichées sur cette page ont été modifiées par un autre utilisateur ou dans un autre onglet du navigateur et sont obsolètes. La page doit être rechargée pour éviter l'enregistrement de données incohérentes.", - "uk-ua": - "Дані, що відображаються на цій сторінці, були змінені іншим користувачем або в іншій вкладці браузера та застарілі. Сторінку необхідно перезавантажити, щоб запобігти збереженню невідповідних даних.", - "de-ch": - "Die auf dieser Seite angezeigten Daten wurden von einem anderen Benutzer oder in einem anderen Browser-Tab geändert und sind veraltet. Um die Speicherung inkonsistenter Daten zu verhindern, muss die Seite neu geladen werden.", - "pt-br": - "Os dados exibidos nesta página foram alterados por outro usuário ou em outra aba do navegador e estão desatualizados. A página deve ser recarregada para evitar que dados inconsistentes sejam salvos.", + 'uk-ua': + 'Дані, що відображаються на цій сторінці, були змінені іншим користувачем або в іншій вкладці браузера та застарілі. Сторінку необхідно перезавантажити, щоб запобігти збереженню невідповідних даних.', + 'de-ch': + 'Die auf dieser Seite angezeigten Daten wurden von einem anderen Benutzer oder in einem anderen Browser-Tab geändert und sind veraltet. Um die Speicherung inkonsistenter Daten zu verhindern, muss die Seite neu geladen werden.', + 'pt-br': + 'Os dados exibidos nesta página foram alterados por outro usuário ou em outra aba do navegador e estão desatualizados. A página deve ser recarregada para evitar que dados inconsistentes sejam salvos.', }, saveBlocked: { - "en-us": "Save blocked", - "de-ch": "Speichern blockiert", - "es-es": "Guardar bloqueado", - "fr-fr": "Enregistrement bloqué", - "ru-ru": "Сохранить заблокировано", - "uk-ua": "Зберегти заблоковано", - "pt-br": "Salvar bloqueado", + 'en-us': 'Save blocked', + 'de-ch': 'Speichern blockiert', + 'es-es': 'Guardar bloqueado', + 'fr-fr': 'Enregistrement bloqué', + 'ru-ru': 'Сохранить заблокировано', + 'uk-ua': 'Зберегти заблоковано', + 'pt-br': 'Salvar bloqueado', }, saveBlockedDescription: { - "en-us": "Form cannot be saved because of the following error:", - "ru-ru": "Форму невозможно сохранить из-за следующей ошибки:", - "es-es": "No se puede guardar el formulario debido al siguiente error:", - "fr-fr": + 'en-us': 'Form cannot be saved because of the following error:', + 'ru-ru': 'Форму невозможно сохранить из-за следующей ошибки:', + 'es-es': 'No se puede guardar el formulario debido al siguiente error:', + 'fr-fr': "Le formulaire ne peut pas être enregistré en raison de l'erreur suivante :", - "uk-ua": "Форму неможливо зберегти через таку помилку:", - "de-ch": - "Das Formular kann aufgrund des folgenden Fehlers nicht gespeichert werden:", - "pt-br": "O formulário não pode ser salvo devido ao seguinte erro:", + 'uk-ua': 'Форму неможливо зберегти через таку помилку:', + 'de-ch': + 'Das Formular kann aufgrund des folgenden Fehlers nicht gespeichert werden:', + 'pt-br': 'O formulário não pode ser salvo devido ao seguinte erro:', }, unavailableCommandButton: { - "en-us": "Command N/A", - "ru-ru": "Команда N/A", - "es-es": "Comando N/A", - "fr-fr": "Commande N/A", - "uk-ua": "Команда Немає", - "de-ch": "Befehl N/A", - "pt-br": "Comando N/A", + 'en-us': 'Command N/A', + 'ru-ru': 'Команда N/A', + 'es-es': 'Comando N/A', + 'fr-fr': 'Commande N/A', + 'uk-ua': 'Команда Немає', + 'de-ch': 'Befehl N/A', + 'pt-br': 'Comando N/A', }, commandUnavailable: { - "en-us": "Command Not Available", - "ru-ru": "Команда недоступна", - "es-es": "Comando no disponible", - "fr-fr": "Commande non disponible", - "uk-ua": "Команда недоступна", - "de-ch": "Befehl nicht verfügbar", - "pt-br": "Comando não disponível", + 'en-us': 'Command Not Available', + 'ru-ru': 'Команда недоступна', + 'es-es': 'Comando no disponible', + 'fr-fr': 'Commande non disponible', + 'uk-ua': 'Команда недоступна', + 'de-ch': 'Befehl nicht verfügbar', + 'pt-br': 'Comando não disponível', }, commandUnavailableDescription: { - "en-us": "This command is currently unavailable for Specify 7.", - "ru-ru": "Эта команда в настоящее время недоступна для Specify 7.", - "es-es": "Este comando no está disponible actualmente para Specify 7.", - "uk-ua": "Ця команда наразі недоступна для Specify 7.", - "de-ch": "Dieser Befehl ist derzeit für Specify 7 nicht verfügbar.", - "fr-fr": "Cette commande n'est actuellement pas disponible pour Specify 7.", - "pt-br": "Este comando não está disponível no momento para o Specify 7.", + 'en-us': 'This command is currently unavailable for Specify 7.', + 'ru-ru': 'Эта команда в настоящее время недоступна для Specify 7.', + 'es-es': 'Este comando no está disponible actualmente para Specify 7.', + 'uk-ua': 'Ця команда наразі недоступна для Specify 7.', + 'de-ch': 'Dieser Befehl ist derzeit für Specify 7 nicht verfügbar.', + 'fr-fr': "Cette commande n'est actuellement pas disponible pour Specify 7.", + 'pt-br': 'Este comando não está disponível no momento para o Specify 7.', }, commandUnavailableSecondDescription: { - "en-us": - "It was probably included on this form from Specify 6 and may be supported in the future.", - "ru-ru": - "Вероятно, он был включен в эту форму из Specify 6 и может поддерживаться в будущем.", - "es-es": - "Probablemente se incluyó en este formulario de la Especificación 6 y es posible que se admita en el futuro.", - "fr-fr": + 'en-us': + 'It was probably included on this form from Specify 6 and may be supported in the future.', + 'ru-ru': + 'Вероятно, он был включен в эту форму из Specify 6 и может поддерживаться в будущем.', + 'es-es': + 'Probablemente se incluyó en este formulario de la Especificación 6 y es posible que se admita en el futuro.', + 'fr-fr': "Il a probablement été inclus dans ce formulaire à partir de Specify 6 et peut être pris en charge à l'avenir.", - "uk-ua": - "Ймовірно, це було включено до цієї форми з Specify 6 і може бути підтримано в майбутньому.", - "de-ch": - "Es war wahrscheinlich in diesem Formular von Specify 6 enthalten und wird möglicherweise in Zukunft unterstützt.", - "pt-br": - "Provavelmente foi incluído neste formulário do Specify 6 e pode ser suportado no futuro.", + 'uk-ua': + 'Ймовірно, це було включено до цієї форми з Specify 6 і може бути підтримано в майбутньому.', + 'de-ch': + 'Es war wahrscheinlich in diesem Formular von Specify 6 enthalten und wird möglicherweise in Zukunft unterstützt.', + 'pt-br': + 'Provavelmente foi incluído neste formulário do Specify 6 e pode ser suportado no futuro.', }, commandName: { - "en-us": "Command name", - "ru-ru": "Имя команды", - "es-es": "Nombre del comando", - "fr-fr": "Nom de la commande", - "uk-ua": "Назва команди", - "de-ch": "Befehlsname", - "pt-br": "Nome do comando", + 'en-us': 'Command name', + 'ru-ru': 'Имя команды', + 'es-es': 'Nombre del comando', + 'fr-fr': 'Nom de la commande', + 'uk-ua': 'Назва команди', + 'de-ch': 'Befehlsname', + 'pt-br': 'Nome do comando', }, unavailablePluginButton: { - "en-us": "Plugin N/A", - "ru-ru": "Плагин N/A", - "es-es": "Complemento N/A", - "fr-fr": "Plugin N/A", - "uk-ua": "Плагін Немає", - "de-ch": "Plugin N/A", - "pt-br": "Plugin N/A", + 'en-us': 'Plugin N/A', + 'ru-ru': 'Плагин N/A', + 'es-es': 'Complemento N/A', + 'fr-fr': 'Plugin N/A', + 'uk-ua': 'Плагін Немає', + 'de-ch': 'Plugin N/A', + 'pt-br': 'Plugin N/A', }, pluginNotAvailable: { - "en-us": "Plugin Not Available", - "ru-ru": "Плагин недоступен", - "es-es": "Complemento no disponible", - "fr-fr": "Plugin non disponible", - "uk-ua": "Плагін недоступний", - "de-ch": "Plugin nicht verfügbar", - "pt-br": "Plugin não disponível", + 'en-us': 'Plugin Not Available', + 'ru-ru': 'Плагин недоступен', + 'es-es': 'Complemento no disponible', + 'fr-fr': 'Plugin non disponible', + 'uk-ua': 'Плагін недоступний', + 'de-ch': 'Plugin nicht verfügbar', + 'pt-br': 'Plugin não disponível', }, pluginNotAvailableDescription: { - "en-us": "This plugin is currently unavailable for Specify 7", - "ru-ru": "Этот плагин в настоящее время недоступен для Specify 7.", - "es-es": "Este complemento no está disponible actualmente para Specify 7", - "fr-fr": "Ce plugin n'est actuellement pas disponible pour Specify 7", - "uk-ua": "Цей плагін наразі недоступний для Specify 7", - "de-ch": "Dieses Plugin ist derzeit für Specify 7 nicht verfügbar", - "pt-br": "Este plugin não está disponível no momento para o Specify 7", + 'en-us': 'This plugin is currently unavailable for Specify 7', + 'ru-ru': 'Этот плагин в настоящее время недоступен для Specify 7.', + 'es-es': 'Este complemento no está disponible actualmente para Specify 7', + 'fr-fr': "Ce plugin n'est actuellement pas disponible pour Specify 7", + 'uk-ua': 'Цей плагін наразі недоступний для Specify 7', + 'de-ch': 'Dieses Plugin ist derzeit für Specify 7 nicht verfügbar', + 'pt-br': 'Este plugin não está disponível no momento para o Specify 7', }, wrongTableForPlugin: { comment: - "Example: ... Locality, Collecting Event or Collection Object forms.", - "en-us": - "This plugin cannot be used on the {currentTable:string} form. Try moving it to the {supportedTables:string} forms.", - "ru-ru": - "Этот плагин нельзя использовать на форме {currentTable:string}. Попробуйте перенести его на формы {supportedTables:string}.", - "es-es": - "Este complemento no se puede utilizar en el formulario {currentTable:string}. Intente moverlo a los formularios {supportedTables:string}.", - "fr-fr": - "Ce plugin ne peut pas être utilisé dans le formulaire {currentTable:string}. Essayez de le déplacer vers les formulaires {supportedTables:string}.", - "uk-ua": - "Цей плагін не можна використовувати на формі {currentTable:string}. Спробуйте перемістити його на форми {supportedTables:string}.", - "de-ch": - "Dieses Plugin kann nicht im Formular {currentTable:string} verwendet werden. Versuchen Sie, es in die Formulare {supportedTables:string} zu verschieben.", - "pt-br": - "Este plugin não pode ser usado no formulário {currentTable:string}. Tente movê-lo para os formulários {supportedTables:string}.", + 'Example: ... Locality, Collecting Event or Collection Object forms.', + 'en-us': + 'This plugin cannot be used on the {currentTable:string} form. Try moving it to the {supportedTables:string} forms.', + 'ru-ru': + 'Этот плагин нельзя использовать на форме {currentTable:string}. Попробуйте перенести его на формы {supportedTables:string}.', + 'es-es': + 'Este complemento no se puede utilizar en el formulario {currentTable:string}. Intente moverlo a los formularios {supportedTables:string}.', + 'fr-fr': + 'Ce plugin ne peut pas être utilisé dans le formulaire {currentTable:string}. Essayez de le déplacer vers les formulaires {supportedTables:string}.', + 'uk-ua': + 'Цей плагін не можна використовувати на формі {currentTable:string}. Спробуйте перемістити його на форми {supportedTables:string}.', + 'de-ch': + 'Dieses Plugin kann nicht im Formular {currentTable:string} verwendet werden. Versuchen Sie, es in die Formulare {supportedTables:string} zu verschieben.', + 'pt-br': + 'Este plugin não pode ser usado no formulário {currentTable:string}. Tente movê-lo para os formulários {supportedTables:string}.', }, wrongTableForCommand: { - "en-us": - "The command cannot be used on the {currentTable:string} form. It can only be used on the {correctTable:string} form.", - "ru-ru": - "Эту команду нельзя использовать в форме {currentTable:string}. Её можно использовать только в форме {correctTable:string}.", - "es-es": - "El comando no se puede utilizar en el formulario {currentTable:string}. Sólo se puede utilizar en el formulario {correctTable:string}.", - "fr-fr": - "La commande ne peut pas être utilisée dans le formulaire {currentTable:string}. Elle ne peut être utilisée que dans le formulaire {correctTable:string}.", - "uk-ua": - "Команду не можна використовувати у формі {currentTable:string}. Її можна використовувати лише у формі {correctTable:string}.", - "de-ch": - "Der Befehl kann nicht auf dem Formular {currentTable:string} verwendet werden. Er kann nur auf dem Formular {correctTable:string} verwendet werden.", - "pt-br": - "O comando não pode ser usado no formato {currentTable:string}. Ele só pode ser usado no formato {correctTable:string}.", + 'en-us': + 'The command cannot be used on the {currentTable:string} form. It can only be used on the {correctTable:string} form.', + 'ru-ru': + 'Эту команду нельзя использовать в форме {currentTable:string}. Её можно использовать только в форме {correctTable:string}.', + 'es-es': + 'El comando no se puede utilizar en el formulario {currentTable:string}. Sólo se puede utilizar en el formulario {correctTable:string}.', + 'fr-fr': + 'La commande ne peut pas être utilisée dans le formulaire {currentTable:string}. Elle ne peut être utilisée que dans le formulaire {correctTable:string}.', + 'uk-ua': + 'Команду не можна використовувати у формі {currentTable:string}. Її можна використовувати лише у формі {correctTable:string}.', + 'de-ch': + 'Der Befehl kann nicht auf dem Formular {currentTable:string} verwendet werden. Er kann nur auf dem Formular {correctTable:string} verwendet werden.', + 'pt-br': + 'O comando não pode ser usado no formato {currentTable:string}. Ele só pode ser usado no formato {correctTable:string}.', }, pluginName: { - "en-us": "Plugin name", - "ru-ru": "Имя плагина", - "es-es": "Nombre del complemento", - "fr-fr": "Nom du plugin", - "uk-ua": "Назва плагіна", - "de-ch": "Plugin-Name", - "pt-br": "Nome do plugin", + 'en-us': 'Plugin name', + 'ru-ru': 'Имя плагина', + 'es-es': 'Nombre del complemento', + 'fr-fr': 'Nom du plugin', + 'uk-ua': 'Назва плагіна', + 'de-ch': 'Plugin-Name', + 'pt-br': 'Nome do plugin', }, illegalBool: { comment: ` Yes/No probably shouldn't be translated as Specify 7 does not support changing which values are recognized as Yes/No in a given language `, - "en-us": "Illegal value for a Yes/No field", - "ru-ru": "Недопустимое значение для поля «Да/Нет»", - "es-es": "Valor ilegal para un campo Sí/No", - "fr-fr": "Valeur interdite pour un champ Oui/Non", - "uk-ua": "Неприпустиме значення для поля «Так/Ні»", - "de-ch": "Unzulässiger Wert für ein Ja/Nein-Feld", - "pt-br": "Valor ilegal para um campo Sim/Não", + 'en-us': 'Illegal value for a Yes/No field', + 'ru-ru': 'Недопустимое значение для поля «Да/Нет»', + 'es-es': 'Valor ilegal para un campo Sí/No', + 'fr-fr': 'Valeur interdite pour un champ Oui/Non', + 'uk-ua': 'Неприпустиме значення для поля «Так/Ні»', + 'de-ch': 'Unzulässiger Wert für ein Ja/Nein-Feld', + 'pt-br': 'Valor ilegal para um campo Sim/Não', }, requiredField: { - "en-us": "Field is required.", - "ru-ru": "Поле обязательно для заполнения.", - "es-es": "Se requiere campo.", - "fr-fr": "Le champ est obligatoire.", - "uk-ua": "Поле обов'язкове для заповнення.", - "de-ch": "Pflichtfeld.", - "pt-br": "Campo obrigatório.", + 'en-us': 'Field is required.', + 'ru-ru': 'Поле обязательно для заполнения.', + 'es-es': 'Se requiere campo.', + 'fr-fr': 'Le champ est obligatoire.', + 'uk-ua': "Поле обов'язкове для заповнення.", + 'de-ch': 'Pflichtfeld.', + 'pt-br': 'Campo obrigatório.', }, invalidValue: { - "en-us": "Invalid value", - "ru-ru": "Недопустимое значение", - "es-es": "Hoy", - "fr-fr": "Valeur invalide", - "uk-ua": "Недійсне значення", - "de-ch": "Ungültiger Wert", - "pt-br": "Valor inválido", + 'en-us': 'Invalid value', + 'ru-ru': 'Недопустимое значение', + 'es-es': 'Hoy', + 'fr-fr': 'Valeur invalide', + 'uk-ua': 'Недійсне значення', + 'de-ch': 'Ungültiger Wert', + 'pt-br': 'Valor inválido', }, requiredFormat: { - comment: "Used in field validation messages on the form", - "en-us": "Required Format: {format:string}.", - "ru-ru": "Требуемый формат: {format:string}.", - "es-es": "Formato requerido: {format:string}.", - "fr-fr": "Format requis : {format:string}.", - "uk-ua": "Необхідний формат: {format:string}.", - "de-ch": "Erforderliches Format: {format:string}.", - "pt-br": "Formato necessário: {format:string}.", + comment: 'Used in field validation messages on the form', + 'en-us': 'Required Format: {format:string}.', + 'ru-ru': 'Требуемый формат: {format:string}.', + 'es-es': 'Formato requerido: {format:string}.', + 'fr-fr': 'Format requis : {format:string}.', + 'uk-ua': 'Необхідний формат: {format:string}.', + 'de-ch': 'Erforderliches Format: {format:string}.', + 'pt-br': 'Formato necessário: {format:string}.', }, inputTypeNumber: { - "en-us": "Value must be a number", - "ru-ru": "Значение должно быть числом.", - "es-es": "El valor debe ser un número.", - "uk-ua": "Значення має бути числом", - "de-ch": "Der Wert muss eine Zahl sein", - "fr-fr": "La valeur doit être un nombre", - "pt-br": "O valor deve ser um número", + 'en-us': 'Value must be a number', + 'ru-ru': 'Значение должно быть числом.', + 'es-es': 'El valor debe ser un número.', + 'uk-ua': 'Значення має бути числом', + 'de-ch': 'Der Wert muss eine Zahl sein', + 'fr-fr': 'La valeur doit être un nombre', + 'pt-br': 'O valor deve ser um número', }, organization: { - "en-us": "Organization", - "ru-ru": "Организация", - "es-es": "Organización", - "fr-fr": "Organisation", - "uk-ua": "Організація", - "de-ch": "Organisation", - "pt-br": "Organização", + 'en-us': 'Organization', + 'ru-ru': 'Организация', + 'es-es': 'Organización', + 'fr-fr': 'Organisation', + 'uk-ua': 'Організація', + 'de-ch': 'Organisation', + 'pt-br': 'Organização', }, person: { - "en-us": "Person", - "ru-ru": "Человек", - "es-es": "Persona", - "fr-fr": "Personne", - "uk-ua": "Людина", - "de-ch": "Person", - "pt-br": "Pessoa", + 'en-us': 'Person', + 'ru-ru': 'Человек', + 'es-es': 'Persona', + 'fr-fr': 'Personne', + 'uk-ua': 'Людина', + 'de-ch': 'Person', + 'pt-br': 'Pessoa', }, other: { - "en-us": "Other", - "ru-ru": "Другой", - "es-es": "Otro", - "fr-fr": "Autre", - "uk-ua": "Інше", - "de-ch": "Andere", - "pt-br": "Outro", + 'en-us': 'Other', + 'ru-ru': 'Другой', + 'es-es': 'Otro', + 'fr-fr': 'Autre', + 'uk-ua': 'Інше', + 'de-ch': 'Andere', + 'pt-br': 'Outro', }, group: { - "en-us": "Group", - "ru-ru": "Группа", - "es-es": "Grupo", - "fr-fr": "Groupe", - "uk-ua": "Група", - "de-ch": "Gruppe", - "pt-br": "Grupo", + 'en-us': 'Group', + 'ru-ru': 'Группа', + 'es-es': 'Grupo', + 'fr-fr': 'Groupe', + 'uk-ua': 'Група', + 'de-ch': 'Gruppe', + 'pt-br': 'Grupo', }, userDefinedItems: { - "en-us": "User Defined Items", - "ru-ru": "Элементы, определяемые пользователем", - "es-es": "Elementos definidos por el usuario", - "fr-fr": "Éléments définis par l'utilisateur", - "uk-ua": "Елементи, визначені користувачем", - "de-ch": "Benutzerdefinierte Elemente", - "pt-br": "Itens definidos pelo usuário", + 'en-us': 'User Defined Items', + 'ru-ru': 'Элементы, определяемые пользователем', + 'es-es': 'Elementos definidos por el usuario', + 'fr-fr': "Éléments définis par l'utilisateur", + 'uk-ua': 'Елементи, визначені користувачем', + 'de-ch': 'Benutzerdefinierte Elemente', + 'pt-br': 'Itens definidos pelo usuário', }, entireTable: { - "en-us": "Entire Table", - "ru-ru": "Вся таблица", - "es-es": "Tabla entera", - "fr-fr": "Table entière", - "uk-ua": "Вся таблиця", - "de-ch": "Gesamte Tabelle", - "pt-br": "Mesa inteira", + 'en-us': 'Entire Table', + 'ru-ru': 'Вся таблица', + 'es-es': 'Tabla entera', + 'fr-fr': 'Table entière', + 'uk-ua': 'Вся таблиця', + 'de-ch': 'Gesamte Tabelle', + 'pt-br': 'Mesa inteira', }, fieldFromTable: { - "en-us": "Field From Table", - "ru-ru": "Поле из таблицы", - "es-es": "Campo de la tabla", - "fr-fr": "Champ de la table", - "uk-ua": "Поле з таблиці", - "de-ch": "Feld aus Tabelle", - "pt-br": "Campo da Tabela", + 'en-us': 'Field From Table', + 'ru-ru': 'Поле из таблицы', + 'es-es': 'Campo de la tabla', + 'fr-fr': 'Champ de la table', + 'uk-ua': 'Поле з таблиці', + 'de-ch': 'Feld aus Tabelle', + 'pt-br': 'Campo da Tabela', }, unsupportedCellType: { - "en-us": "Unsupported cell type", - "ru-ru": "Неподдерживаемый тип ячейки", - "es-es": "Tipo de celda no compatible", - "fr-fr": "Type de cellule non pris en charge", - "uk-ua": "Непідтримуваний тип клітинки", - "de-ch": "Nicht unterstützter Zelltyp", - "pt-br": "Tipo de célula não suportado", + 'en-us': 'Unsupported cell type', + 'ru-ru': 'Неподдерживаемый тип ячейки', + 'es-es': 'Tipo de celda no compatible', + 'fr-fr': 'Type de cellule non pris en charge', + 'uk-ua': 'Непідтримуваний тип клітинки', + 'de-ch': 'Nicht unterstützter Zelltyp', + 'pt-br': 'Tipo de célula não suportado', }, additionalResultsOmitted: { comment: ` Represents truncated search dialog output (when lots of results returned) `, - "en-us": "Additional results omitted", - "ru-ru": "Дополнительные результаты пропущены", - "es-es": "Resultados adicionales omitidos", - "fr-fr": "Résultats supplémentaires masqués", - "uk-ua": "Додаткові результати пропущені", - "de-ch": "Zusätzliche Ergebnisse ausgelassen", - "pt-br": "Resultados adicionais omitidos", + 'en-us': 'Additional results omitted', + 'ru-ru': 'Дополнительные результаты пропущены', + 'es-es': 'Resultados adicionales omitidos', + 'fr-fr': 'Résultats supplémentaires masqués', + 'uk-ua': 'Додаткові результати пропущені', + 'de-ch': 'Zusätzliche Ergebnisse ausgelassen', + 'pt-br': 'Resultados adicionais omitidos', }, recordSelectorUnloadProtect: { - "en-us": "Proceed without saving?", - "ru-ru": "Продолжить без сохранения?", - "es-es": "¿Continuar sin guardar?", - "fr-fr": "Continuer sans enregistrer ?", - "uk-ua": "Продовжити без збереження?", - "de-ch": "Ohne Speichern fortfahren?", - "pt-br": "Continuar sem salvar?", + 'en-us': 'Proceed without saving?', + 'ru-ru': 'Продолжить без сохранения?', + 'es-es': '¿Continuar sin guardar?', + 'fr-fr': 'Continuer sans enregistrer ?', + 'uk-ua': 'Продовжити без збереження?', + 'de-ch': 'Ohne Speichern fortfahren?', + 'pt-br': 'Continuar sem salvar?', }, recordSelectorUnloadProtectDescription: { comment: ` When in record set and current record is unsaved and try to navigate to another record `, - "en-us": "You might want to save this record before navigating away.", - "ru-ru": "Возможно, вы захотите сохранить эту запись, прежде чем уйти.", - "es-es": "Es posible que desees guardar este registro antes de navegar.", - "fr-fr": - "Vous souhaiterez peut-être sauvegarder cet enregistrement avant de partir.", - "uk-ua": - "Можливо, ви захочете зберегти цей запис, перш ніж залишати сторінку.", - "de-ch": - "Möglicherweise möchten Sie diesen Datensatz speichern, bevor Sie wegnavigieren.", - "pt-br": "Talvez você queira salvar este registro antes de sair navegando.", + 'en-us': 'You might want to save this record before navigating away.', + 'ru-ru': 'Возможно, вы захотите сохранить эту запись, прежде чем уйти.', + 'es-es': 'Es posible que desees guardar este registro antes de navegar.', + 'fr-fr': + 'Vous souhaiterez peut-être sauvegarder cet enregistrement avant de partir.', + 'uk-ua': + 'Можливо, ви захочете зберегти цей запис, перш ніж залишати сторінку.', + 'de-ch': + 'Möglicherweise möchten Sie diesen Datensatz speichern, bevor Sie wegnavigieren.', + 'pt-br': 'Talvez você queira salvar este registro antes de sair navegando.', }, creatingNewRecord: { - "en-us": "Creating new record", - "ru-ru": "Создание новой записи", - "es-es": "Creando nuevo registro", - "fr-fr": "Création d'un nouvel enregistrement", - "uk-ua": "Створення нового запису", - "de-ch": "Neuen Datensatz erstellen", - "pt-br": "Criando novo registro", + 'en-us': 'Creating new record', + 'ru-ru': 'Создание новой записи', + 'es-es': 'Creando nuevo registro', + 'fr-fr': "Création d'un nouvel enregistrement", + 'uk-ua': 'Створення нового запису', + 'de-ch': 'Neuen Datensatz erstellen', + 'pt-br': 'Criando novo registro', }, createNewRecordSet: { - "en-us": "Create a new record set", - "ru-ru": "Создать новый набор записей", - "es-es": "Crear un nuevo conjunto de registros", - "fr-fr": "Créer un nouveau jeu d'enregistrements", - "uk-ua": "Створити новий набір записів", - "de-ch": "Erstellen Sie einen neuen Datensatz", - "pt-br": "Criar um novo conjunto de registros", + 'en-us': 'Create a new record set', + 'ru-ru': 'Создать новый набор записей', + 'es-es': 'Crear un nuevo conjunto de registros', + 'fr-fr': "Créer un nouveau jeu d'enregistrements", + 'uk-ua': 'Створити новий набір записів', + 'de-ch': 'Erstellen Sie einen neuen Datensatz', + 'pt-br': 'Criar um novo conjunto de registros', }, forward: { - "en-us": "Forward", - "ru-ru": "Вперед", - "es-es": "Adelante", - "fr-fr": "Avant", - "uk-ua": "Вперед", - "de-ch": "Nach vorne", - "pt-br": "Avançar", + 'en-us': 'Forward', + 'ru-ru': 'Вперед', + 'es-es': 'Adelante', + 'fr-fr': 'Avant', + 'uk-ua': 'Вперед', + 'de-ch': 'Nach vorne', + 'pt-br': 'Avançar', }, reverse: { - "en-us": "Reverse", - "ru-ru": "Обеспечить регресс", - "es-es": "Contrarrestar", - "fr-fr": "Inverse", - "uk-ua": "Зворотний", - "de-ch": "Umkehren", - "pt-br": "Reverter", + 'en-us': 'Reverse', + 'ru-ru': 'Обеспечить регресс', + 'es-es': 'Contrarrestar', + 'fr-fr': 'Inverse', + 'uk-ua': 'Зворотний', + 'de-ch': 'Umkehren', + 'pt-br': 'Reverter', }, deletedInline: { - "en-us": "(deleted)", - "ru-ru": "(удалено)", - "es-es": "(eliminado)", - "fr-fr": "(supprimé)", - "uk-ua": "(видалено)", - "de-ch": "(gestrichen)", - "pt-br": "(apagado)", + 'en-us': '(deleted)', + 'ru-ru': '(удалено)', + 'es-es': '(eliminado)', + 'fr-fr': '(supprimé)', + 'uk-ua': '(видалено)', + 'de-ch': '(gestrichen)', + 'pt-br': '(apagado)', }, duplicateRecordSetItem: { - comment: "Example: Duplicate Record Set Item", - "en-us": "Duplicate {recordSetItemTable:string}", - "ru-ru": "Дубликат {recordSetItemTable:string}", - "es-es": "Duplicado {recordSetItemTable:string}", - "uk-ua": "Дублікат {recordSetItemTable:string}", - "de-ch": "Duplikat {recordSetItemTable:string}", - "fr-fr": "Dupliquer {recordSetItemTable:string}", - "pt-br": "Duplicado {recordSetItemTable:string}", + comment: 'Example: Duplicate Record Set Item', + 'en-us': 'Duplicate {recordSetItemTable:string}', + 'ru-ru': 'Дубликат {recordSetItemTable:string}', + 'es-es': 'Duplicado {recordSetItemTable:string}', + 'uk-ua': 'Дублікат {recordSetItemTable:string}', + 'de-ch': 'Duplikat {recordSetItemTable:string}', + 'fr-fr': 'Dupliquer {recordSetItemTable:string}', + 'pt-br': 'Duplicado {recordSetItemTable:string}', }, duplicateRecordSetItemDescription: { - "en-us": - "This record is already present in the current {recordSetTable:string}", - "ru-ru": "Эта запись уже присутствует в текущем {recordSetTable:string}", - "es-es": - "Este registro ya está presente en el actual {recordSetTable:string}", - "fr-fr": - "Cet enregistrement est déjà présent dans le {recordSetTable:string} actuel", - "uk-ua": "Цей запис вже присутній у поточному {recordSetTable:string}", - "de-ch": - "Dieser Datensatz ist bereits im aktuellen {recordSetTable:string} vorhanden.", - "pt-br": "Este registro já está presente no atual {recordSetTable:string}", + 'en-us': + 'This record is already present in the current {recordSetTable:string}', + 'ru-ru': 'Эта запись уже присутствует в текущем {recordSetTable:string}', + 'es-es': + 'Este registro ya está presente en el actual {recordSetTable:string}', + 'fr-fr': + 'Cet enregistrement est déjà présent dans le {recordSetTable:string} actuel', + 'uk-ua': 'Цей запис вже присутній у поточному {recordSetTable:string}', + 'de-ch': + 'Dieser Datensatz ist bereits im aktuellen {recordSetTable:string} vorhanden.', + 'pt-br': 'Este registro já está presente no atual {recordSetTable:string}', }, addToRecordSet: { - "en-us": "Add to {recordSetTable:string}", - "ru-ru": "Добавить в {recordSetTable:string}", - "es-es": "Añadir a {recordSetTable:string}", - "fr-fr": "Ajouter à {recordSetTable:string}", - "uk-ua": "Додати до {recordSetTable:string}", - "de-ch": "Hinzufügen zu {recordSetTable:string}", - "pt-br": "Adicionar a {recordSetTable:string}", + 'en-us': 'Add to {recordSetTable:string}', + 'ru-ru': 'Добавить в {recordSetTable:string}', + 'es-es': 'Añadir a {recordSetTable:string}', + 'fr-fr': 'Ajouter à {recordSetTable:string}', + 'uk-ua': 'Додати до {recordSetTable:string}', + 'de-ch': 'Hinzufügen zu {recordSetTable:string}', + 'pt-br': 'Adicionar a {recordSetTable:string}', }, removeFromRecordSet: { - "en-us": "Remove from {recordSetTable:string}", - "ru-ru": "Удалить из {recordSetTable:string}", - "es-es": "Eliminar de {recordSetTable:string}", - "fr-fr": "Supprimer de {recordSetTable:string}", - "uk-ua": "Видалити з {recordSetTable:string}", - "de-ch": "Aus {recordSetTable:string} entfernen", - "pt-br": "Remover de {recordSetTable:string}", + 'en-us': 'Remove from {recordSetTable:string}', + 'ru-ru': 'Удалить из {recordSetTable:string}', + 'es-es': 'Eliminar de {recordSetTable:string}', + 'fr-fr': 'Supprimer de {recordSetTable:string}', + 'uk-ua': 'Видалити з {recordSetTable:string}', + 'de-ch': 'Aus {recordSetTable:string} entfernen', + 'pt-br': 'Remover de {recordSetTable:string}', }, nothingFound: { - "en-us": "Nothing found", - "ru-ru": "Ничего не найдено", - "es-es": "No se encontró nada", - "fr-fr": "Rien n'a été trouvé", - "uk-ua": "Нічого не знайдено", - "de-ch": "Nichts gefunden", - "pt-br": "Nada encontrado", + 'en-us': 'Nothing found', + 'ru-ru': 'Ничего не найдено', + 'es-es': 'No se encontró nada', + 'fr-fr': "Rien n'a été trouvé", + 'uk-ua': 'Нічого не знайдено', + 'de-ch': 'Nichts gefunden', + 'pt-br': 'Nada encontrado', }, carryForward: { - comment: "Verb. Button label", - "en-us": "Carry Forward", - "ru-ru": "Перенести вперед", - "es-es": "Llevar adelante", - "fr-fr": "Reporter", - "uk-ua": "Перенести далі", - "de-ch": "Weitertragen", - "pt-br": "Levar adiante", + comment: 'Verb. Button label', + 'en-us': 'Carry Forward', + 'ru-ru': 'Перенести вперед', + 'es-es': 'Llevar adelante', + 'fr-fr': 'Reporter', + 'uk-ua': 'Перенести далі', + 'de-ch': 'Weitertragen', + 'pt-br': 'Levar adiante', }, carryForwardEnabled: { - "en-us": "Show Carry Forward button", - "ru-ru": "Показать кнопку «Перенести вперед»", - "es-es": "Mostrar el botón Llevar adelante", - "fr-fr": "Afficher le bouton Reporter", - "uk-ua": "Показати кнопку «Перенести вперед»", - "de-ch": "Schaltfläche „Übertrag anzeigen“", - "pt-br": "Mostrar botão Transferir para frente", + 'en-us': 'Show Carry Forward button', + 'ru-ru': 'Показать кнопку «Перенести вперед»', + 'es-es': 'Mostrar el botón Llevar adelante', + 'fr-fr': 'Afficher le bouton Reporter', + 'uk-ua': 'Показати кнопку «Перенести вперед»', + 'de-ch': 'Schaltfläche „Übertrag anzeigen“', + 'pt-br': 'Mostrar botão Transferir para frente', }, bulkCarryForwardEnabled: { - "en-us": "Show Bulk Carry Forward count", - "de-ch": "Anzahl der Massenüberträge anzeigen", - "es-es": "Mostrar recuento de transferencia masiva", - "fr-fr": "Afficher le nombre de reports en masse", - "pt-br": "Mostrar contagem de transporte em massa", - "ru-ru": "Показать счетчик массового переноса данных", - "uk-ua": "Показати кількість групового перенесення", + 'en-us': 'Show Bulk Carry Forward count', + 'de-ch': 'Anzahl der Massenüberträge anzeigen', + 'es-es': 'Mostrar recuento de transferencia masiva', + 'fr-fr': 'Afficher le nombre de reports en masse', + 'pt-br': 'Mostrar contagem de transporte em massa', + 'ru-ru': 'Показать счетчик массового переноса данных', + 'uk-ua': 'Показати кількість групового перенесення', }, bulkCarryForwardCount: { - "en-us": "Bulk Carry Forward count", - "de-ch": "Anzahl der Massenüberträge", - "es-es": "Recuento de transferencia masiva", - "fr-fr": "Nombre de reports en masse", - "pt-br": "Contagem de transporte em massa", - "ru-ru": "Подсчет массового переноса данных", - "uk-ua": "Кількість перенесених даних", + 'en-us': 'Bulk Carry Forward count', + 'de-ch': 'Anzahl der Massenüberträge', + 'es-es': 'Recuento de transferencia masiva', + 'fr-fr': 'Nombre de reports en masse', + 'pt-br': 'Contagem de transporte em massa', + 'ru-ru': 'Подсчет массового переноса данных', + 'uk-ua': 'Кількість перенесених даних', }, carryForwardDescription: { - "en-us": "Create a new record with certain fields carried over", - "ru-ru": "Создайте новую запись с перенесенными определенными полями", - "es-es": "Crear un nuevo registro con ciertos campos transferidos", - "fr-fr": "Créer un nouvel enregistrement avec certains champs reportés", - "uk-ua": "Створити новий запис із перенесенням певних полів", - "de-ch": - "Erstellen Sie einen neuen Datensatz mit bestimmten übernommenen Feldern", - "pt-br": "Crie um novo registro com determinados campos transferidos", + 'en-us': 'Create a new record with certain fields carried over', + 'ru-ru': 'Создайте новую запись с перенесенными определенными полями', + 'es-es': 'Crear un nuevo registro con ciertos campos transferidos', + 'fr-fr': 'Créer un nouvel enregistrement avec certains champs reportés', + 'uk-ua': 'Створити новий запис із перенесенням певних полів', + 'de-ch': + 'Erstellen Sie einen neuen Datensatz mit bestimmten übernommenen Feldern', + 'pt-br': 'Crie um novo registro com determinados campos transferidos', }, carryForwardSettingsDescription: { - "en-us": "Configure fields to carry forward", - "ru-ru": "Настройте поля для переноса", - "es-es": "Configurar campos para transferir", - "fr-fr": "Configurer les champs à reporter", - "uk-ua": "Налаштуйте поля для перенесення", - "de-ch": "Konfigurieren Sie die zu übertragenden Felder", - "pt-br": "Configurar campos para levar adiante", + 'en-us': 'Configure fields to carry forward', + 'ru-ru': 'Настройте поля для переноса', + 'es-es': 'Configurar campos para transferir', + 'fr-fr': 'Configurer les champs à reporter', + 'uk-ua': 'Налаштуйте поля для перенесення', + 'de-ch': 'Konfigurieren Sie die zu übertragenden Felder', + 'pt-br': 'Configurar campos para levar adiante', }, bulkCarryForwardSettingsDescription: { - "en-us": "Configure fields to bulk carry forward", - "de-ch": "Konfigurieren von Feldern für die Massenübertragung", - "es-es": "Configurar campos para transferirlos en masa", - "fr-fr": "Configurer les champs pour un report en masse", - "pt-br": "Configurar campos para transporte em massa", - "ru-ru": "Настройте поля для массового переноса", - "uk-ua": "Налаштуйте поля для масового перенесення", + 'en-us': 'Configure fields to bulk carry forward', + 'de-ch': 'Konfigurieren von Feldern für die Massenübertragung', + 'es-es': 'Configurar campos para transferirlos en masa', + 'fr-fr': 'Configurer les champs pour un report en masse', + 'pt-br': 'Configurar campos para transporte em massa', + 'ru-ru': 'Настройте поля для массового переноса', + 'uk-ua': 'Налаштуйте поля для масового перенесення', }, carryForwardTableSettingsDescription: { - "en-us": "Configure fields to carry forward ({tableName:string})", - "ru-ru": "Настройте поля для переноса ({tableName:string})", - "es-es": "Configurar campos para trasladar ({tableName:string})", - "fr-fr": "Configurer les champs à reporter ({tableName:string})", - "uk-ua": "Налаштуйте поля для перенесення ({tableName:string})", - "de-ch": "Konfigurieren Sie die Felder zum Übertragen ({tableName:string})", - "pt-br": "Configurar campos para levar adiante ({tableName:string})", + 'en-us': 'Configure fields to carry forward ({tableName:string})', + 'ru-ru': 'Настройте поля для переноса ({tableName:string})', + 'es-es': 'Configurar campos para trasladar ({tableName:string})', + 'fr-fr': 'Configurer les champs à reporter ({tableName:string})', + 'uk-ua': 'Налаштуйте поля для перенесення ({tableName:string})', + 'de-ch': 'Konfigurieren Sie die Felder zum Übertragen ({tableName:string})', + 'pt-br': 'Configurar campos para levar adiante ({tableName:string})', }, bulkCarryForwardTableSettingsDescription: { - "en-us": "Configure fields to bulk carry forward ({tableName:string})", - "de-ch": - "Konfigurieren Sie Felder für den Massenübertrag ({tableName:string})", - "es-es": - "Configurar campos para transferirlos en masa ({tableName:string})", - "fr-fr": - "Configurer les champs pour un report en masse ({tableName:string})", - "pt-br": "Configurar campos para transporte em massa ({tableName:string})", - "ru-ru": "Настройте поля для массового переноса ({tableName:string})", - "uk-ua": "Налаштуйте поля для масового перенесення ({tableName:string})", + 'en-us': 'Configure fields to bulk carry forward ({tableName:string})', + 'de-ch': + 'Konfigurieren Sie Felder für den Massenübertrag ({tableName:string})', + 'es-es': + 'Configurar campos para transferirlos en masa ({tableName:string})', + 'fr-fr': + 'Configurer les champs pour un report en masse ({tableName:string})', + 'pt-br': 'Configurar campos para transporte em massa ({tableName:string})', + 'ru-ru': 'Настройте поля для массового переноса ({tableName:string})', + 'uk-ua': 'Налаштуйте поля для масового перенесення ({tableName:string})', }, carryForwardUniqueField: { - "en-us": "This field must be unique. It can not be carried over", - "ru-ru": "Это поле должно быть уникальным. Оно не может быть перенесено.", - "es-es": "Este campo debe ser único. No se puede transferir.", - "fr-fr": "Ce champ doit être unique. Il ne peut pas être reporté.", - "uk-ua": "Це поле має бути унікальним. Його не можна переносити", - "de-ch": "Dieses Feld muss eindeutig sein. Es kann nicht übertragen werden", - "pt-br": "Este campo deve ser único. Não pode ser transferido", + 'en-us': 'This field must be unique. It can not be carried over', + 'ru-ru': 'Это поле должно быть уникальным. Оно не может быть перенесено.', + 'es-es': 'Este campo debe ser único. No se puede transferir.', + 'fr-fr': 'Ce champ doit être unique. Il ne peut pas être reporté.', + 'uk-ua': 'Це поле має бути унікальним. Його не можна переносити', + 'de-ch': 'Dieses Feld muss eindeutig sein. Es kann nicht übertragen werden', + 'pt-br': 'Este campo deve ser único. Não pode ser transferido', }, carryForwardRequiredField: { - "en-us": "This field is required. It must be carried forward", - "ru-ru": "Это поле обязательно для заполнения. Его необходимо перенести.", - "es-es": "Este campo es obligatorio. Debe ser transferido", - "fr-fr": "Ce champ est obligatoire. Il doit être reporté", - "uk-ua": "Це поле обов'язкове. Його потрібно перенести", - "de-ch": "Dieses Feld ist erforderlich. Es muss übertragen werden", - "pt-br": "Este campo é obrigatório. Deve ser transportado para a frente", + 'en-us': 'This field is required. It must be carried forward', + 'ru-ru': 'Это поле обязательно для заполнения. Его необходимо перенести.', + 'es-es': 'Este campo es obligatorio. Debe ser transferido', + 'fr-fr': 'Ce champ est obligatoire. Il doit être reporté', + 'uk-ua': "Це поле обов'язкове. Його потрібно перенести", + 'de-ch': 'Dieses Feld ist erforderlich. Es muss übertragen werden', + 'pt-br': 'Este campo é obrigatório. Deve ser transportado para a frente', }, bulkCarryForwardRangeEnabled: { - "en-us": "Show Bulk Carry Forward range", - "de-ch": "Bulk Carry Forward-Bereich anzeigen", - "es-es": "Mostrar rango de transferencia masiva", - "fr-fr": "Afficher la plage de report en masse", - "pt-br": "Mostrar intervalo de transporte em massa", - "ru-ru": "Показать диапазон массового переноса данных", - "uk-ua": "Показати діапазон масового перенесення", + 'en-us': 'Show Bulk Carry Forward range', + 'de-ch': 'Bulk Carry Forward-Bereich anzeigen', + 'es-es': 'Mostrar rango de transferencia masiva', + 'fr-fr': 'Afficher la plage de report en masse', + 'pt-br': 'Mostrar intervalo de transporte em massa', + 'ru-ru': 'Показать диапазон массового переноса данных', + 'uk-ua': 'Показати діапазон масового перенесення', }, bulkCarryForwardRangeErrorDescription: { - "en-us": - "Cannot carry forward record through the specified {field:string} range.", - "de-ch": - "Der Datensatz kann nicht über den angegebenen Bereich {field:string} übertragen werden.", - "es-es": - "No se puede trasladar el registro a través del rango {field:string} especificado.", - "fr-fr": + 'en-us': + 'Cannot carry forward record through the specified {field:string} range.', + 'de-ch': + 'Der Datensatz kann nicht über den angegebenen Bereich {field:string} übertragen werden.', + 'es-es': + 'No se puede trasladar el registro a través del rango {field:string} especificado.', + 'fr-fr': "Impossible de reporter l'enregistrement sur la plage {field:string} spécifiée.", - "pt-br": - "Não é possível transferir o registro através do intervalo especificado {field:string}.", - "ru-ru": - "Невозможно перенести запись через указанный диапазон {field:string}.", - "uk-ua": "Неможливо перенести запис у вказаний діапазон {field:string}.", + 'pt-br': + 'Não é possível transferir o registro através do intervalo especificado {field:string}.', + 'ru-ru': + 'Невозможно перенести запись через указанный диапазон {field:string}.', + 'uk-ua': 'Неможливо перенести запис у вказаний діапазон {field:string}.', }, bulkCarryForwardRangeLimitExceeded: { - "en-us": "Range exceeds record limit of {limit:number}.", - "de-ch": - "Der Bereich überschreitet die Aufzeichnungsgrenze von {limit:number}.", - "es-es": "El rango excede el límite de registro de {limit:number}.", - "fr-fr": "La plage dépasse la limite d'enregistrement de {limit:number}.", - "pt-br": "O alcance excede o limite recorde de {limit:number}.", - "ru-ru": "Диапазон превышает предел записи {limit:number}.", - "uk-ua": "Діапазон перевищує ліміт записів {limit:number}.", + 'en-us': 'Range exceeds record limit of {limit:number}.', + 'de-ch': + 'Der Bereich überschreitet die Aufzeichnungsgrenze von {limit:number}.', + 'es-es': 'El rango excede el límite de registro de {limit:number}.', + 'fr-fr': "La plage dépasse la limite d'enregistrement de {limit:number}.", + 'pt-br': 'O alcance excede o limite recorde de {limit:number}.', + 'ru-ru': 'Диапазон превышает предел записи {limit:number}.', + 'uk-ua': 'Діапазон перевищує ліміт записів {limit:number}.', }, bulkCarryForwardRangeExistingRecords: { - "en-us": "The following numbers for {field:string} are already being used:", - "de-ch": "Folgende Nummern für {field:string} werden bereits verwendet:", - "es-es": - "Los siguientes números para {field:string} ya se están utilizando:", - "fr-fr": "Les numéros suivants pour {field:string} sont déjà utilisés :", - "pt-br": "Os seguintes números para {field:string} já estão sendo usados:", - "ru-ru": "Следующие номера для {field:string} уже используются:", - "uk-ua": "Наступні номери для {field:string} вже використовуються:", + 'en-us': 'The following numbers for {field:string} are already being used:', + 'de-ch': 'Folgende Nummern für {field:string} werden bereits verwendet:', + 'es-es': + 'Los siguientes números para {field:string} ya se están utilizando:', + 'fr-fr': 'Les numéros suivants pour {field:string} sont déjà utilisés :', + 'pt-br': 'Os seguintes números para {field:string} já estão sendo usados:', + 'ru-ru': 'Следующие номера для {field:string} уже используются:', + 'uk-ua': 'Наступні номери для {field:string} вже використовуються:', }, bulkCarryForwardRangeStart: { - "en-us": "Carry Forward Range Start", - "de-ch": "Übertragsbereichsanfang", - "es-es": "Arranque del rango de avance", - "fr-fr": "Début de la plage de report", - "pt-br": "Início do intervalo de transporte para frente", - "ru-ru": "Начало диапазона переноса вперед", - "uk-ua": "Початок діапазону перенесення вперед", + 'en-us': 'Carry Forward Range Start', + 'de-ch': 'Übertragsbereichsanfang', + 'es-es': 'Arranque del rango de avance', + 'fr-fr': 'Début de la plage de report', + 'pt-br': 'Início do intervalo de transporte para frente', + 'ru-ru': 'Начало диапазона переноса вперед', + 'uk-ua': 'Початок діапазону перенесення вперед', }, bulkCarryForwardRangeEnd: { - "en-us": "Carry Forward Range End", - "de-ch": "Übertragsbereichsende", - "es-es": "Llevar adelante el final del rango", - "fr-fr": "Fin de la plage de report", - "pt-br": "Fim do intervalo de transporte para frente", - "ru-ru": "Конец диапазона переноса вперед", - "uk-ua": "Кінець діапазону перенесення вперед", + 'en-us': 'Carry Forward Range End', + 'de-ch': 'Übertragsbereichsende', + 'es-es': 'Llevar adelante el final del rango', + 'fr-fr': 'Fin de la plage de report', + 'pt-br': 'Fim do intervalo de transporte para frente', + 'ru-ru': 'Конец диапазона переноса вперед', + 'uk-ua': 'Кінець діапазону перенесення вперед', }, createRecordSetOnBulkCarryForward: { - "en-us": "Create record set on Bulk Carry Forward", - "de-ch": "Datensatz für Massenübertrag erstellen", - "es-es": "Crear un conjunto de registros en Bulk Carry Forward", - "fr-fr": "Créer un ensemble d'enregistrements sur le report en masse", - "pt-br": "Criar conjunto de registros em Bulk Carry Forward", - "ru-ru": "Создать набор записей для массового переноса данных", - "uk-ua": "Створення набору записів для групового перенесення", + 'en-us': 'Create record set on Bulk Carry Forward', + 'de-ch': 'Datensatz für Massenübertrag erstellen', + 'es-es': 'Crear un conjunto de registros en Bulk Carry Forward', + 'fr-fr': "Créer un ensemble d'enregistrements sur le report en masse", + 'pt-br': 'Criar conjunto de registros em Bulk Carry Forward', + 'ru-ru': 'Создать набор записей для массового переноса данных', + 'uk-ua': 'Створення набору записів для групового перенесення', }, cloneButtonEnabled: { - "en-us": "Show Clone button", - "ru-ru": "Показать кнопку «Клонировать»", - "es-es": "Mostrar botón Clonar", - "fr-fr": "Afficher le bouton Cloner", - "uk-ua": "Кнопка «Показати клон»", - "de-ch": "Schaltfläche „Klonen“ anzeigen", - "pt-br": "Mostrar botão Clonar", + 'en-us': 'Show Clone button', + 'ru-ru': 'Показать кнопку «Клонировать»', + 'es-es': 'Mostrar botón Clonar', + 'fr-fr': 'Afficher le bouton Cloner', + 'uk-ua': 'Кнопка «Показати клон»', + 'de-ch': 'Schaltfläche „Klonen“ anzeigen', + 'pt-br': 'Mostrar botão Clonar', }, addButtonEnabled: { - "en-us": "Show Add button", - "ru-ru": "Показать кнопку «Добавить»", - "es-es": "Mostrar el botón Agregar", - "fr-fr": "Afficher le bouton Ajouter", - "uk-ua": "Показати кнопку «Додати»", - "de-ch": "Schaltfläche „Hinzufügen“ anzeigen", - "pt-br": "Mostrar botão Adicionar", + 'en-us': 'Show Add button', + 'ru-ru': 'Показать кнопку «Добавить»', + 'es-es': 'Mostrar el botón Agregar', + 'fr-fr': 'Afficher le bouton Ajouter', + 'uk-ua': 'Показати кнопку «Додати»', + 'de-ch': 'Schaltfläche „Hinzufügen“ anzeigen', + 'pt-br': 'Mostrar botão Adicionar', }, addButtonDescription: { - "en-us": "Create a new blank record", - "ru-ru": "Создать новую пустую запись", - "es-es": "Crear un nuevo registro en blanco", - "fr-fr": "Créer un nouvel enregistrement vierge", - "uk-ua": "Створити новий пустий запис", - "de-ch": "Erstellen Sie einen neuen leeren Datensatz", - "pt-br": "Criar um novo registro em branco", + 'en-us': 'Create a new blank record', + 'ru-ru': 'Создать новую пустую запись', + 'es-es': 'Crear un nuevo registro en blanco', + 'fr-fr': 'Créer un nouvel enregistrement vierge', + 'uk-ua': 'Створити новий пустий запис', + 'de-ch': 'Erstellen Sie einen neuen leeren Datensatz', + 'pt-br': 'Criar um novo registro em branco', }, autoNumbering: { - "en-us": "Auto Numbering", - "ru-ru": "Автоматическая нумерация", - "es-es": "Numeración automática", - "fr-fr": "Numérotation automatique", - "uk-ua": "Автоматична нумерація", - "de-ch": "Automatische Nummerierung", - "pt-br": "Numeração automática", + 'en-us': 'Auto Numbering', + 'ru-ru': 'Автоматическая нумерация', + 'es-es': 'Numeración automática', + 'fr-fr': 'Numérotation automatique', + 'uk-ua': 'Автоматична нумерація', + 'de-ch': 'Automatische Nummerierung', + 'pt-br': 'Numeração automática', }, autoNumberByYear: { - "en-us": "Auto-number by year", - "de-ch": "Auto-Nummer nach Jahr", - "es-es": "Auto-número por año", - "fr-fr": "Auto-numéro par année", - "ru-ru": "Автонумерация по году", - "uk-ua": "Автонумерація за роком", - "pt-br": "", + 'en-us': 'Auto-number by year', + 'de-ch': 'Auto-Nummer nach Jahr', + 'es-es': 'Auto-número por año', + 'fr-fr': 'Auto-numéro par année', + 'ru-ru': 'Автонумерация по году', + 'uk-ua': 'Автонумерація за роком', + 'pt-br': '', }, autoNumber: { - "en-us": "Auto-number", - "de-ch": "Auto-Nummer", - "es-es": "Auto-número", - "fr-fr": "Auto-numéro", - "ru-ru": "Автонумерация", - "uk-ua": "Автонумерація", - "pt-br": "", + 'en-us': 'Auto-number', + 'de-ch': 'Auto-Nummer', + 'es-es': 'Auto-número', + 'fr-fr': 'Auto-numéro', + 'ru-ru': 'Автонумерация', + 'uk-ua': 'Автонумерація', + 'pt-br': '', }, editFormDefinition: { - "en-us": "Edit Form Definition", - "ru-ru": "Редактировать определение формы", - "es-es": "Editar definición de formulario", - "fr-fr": "Modifier la définition du formulaire", - "uk-ua": "Редагувати визначення форми", - "de-ch": "Formulardefinition bearbeiten", - "pt-br": "Editar definição de formulário", + 'en-us': 'Edit Form Definition', + 'ru-ru': 'Редактировать определение формы', + 'es-es': 'Editar definición de formulario', + 'fr-fr': 'Modifier la définition du formulaire', + 'uk-ua': 'Редагувати визначення форми', + 'de-ch': 'Formulardefinition bearbeiten', + 'pt-br': 'Editar definição de formulário', }, useAutoGeneratedForm: { - "en-us": "Use Auto Generated Form", - "ru-ru": "Использовать автоматически сгенерированную форму", - "es-es": "Utilice el formulario generado automáticamente", - "fr-fr": "Utiliser le formulaire généré automatiquement", - "uk-ua": "Використати автоматично згенеровану форму", - "de-ch": "Automatisch generiertes Formular verwenden", - "pt-br": "Usar formulário gerado automaticamente", + 'en-us': 'Use Auto Generated Form', + 'ru-ru': 'Использовать автоматически сгенерированную форму', + 'es-es': 'Utilice el formulario generado automáticamente', + 'fr-fr': 'Utiliser le formulaire généré automatiquement', + 'uk-ua': 'Використати автоматично згенеровану форму', + 'de-ch': 'Automatisch generiertes Formular verwenden', + 'pt-br': 'Usar formulário gerado automaticamente', }, useFieldLabels: { - "en-us": "Use Localized Field Labels", - "ru-ru": "Используйте локализованные метки полей", - "es-es": "Utilice etiquetas de campo localizadas", - "fr-fr": "Utiliser les étiquettes de champs localisées", - "uk-ua": "Використовуйте локалізовані мітки полів", - "de-ch": "Lokalisierte Feldbezeichnungen verwenden", - "pt-br": "Use rótulos de campo localizados", + 'en-us': 'Use Localized Field Labels', + 'ru-ru': 'Используйте локализованные метки полей', + 'es-es': 'Utilice etiquetas de campo localizadas', + 'fr-fr': 'Utiliser les étiquettes de champs localisées', + 'uk-ua': 'Використовуйте локалізовані мітки полів', + 'de-ch': 'Lokalisierte Feldbezeichnungen verwenden', + 'pt-br': 'Use rótulos de campo localizados', }, showFieldLabels: { - "en-us": "Show Localized Field Labels", - "de-ch": "Lokalisierte Feldbezeichnungen anzeigen", - "es-es": "Mostrar etiquetas de campos localizados", - "fr-fr": "Afficher les étiquettes de champ localisées", - "ru-ru": "Показать локализованные метки полей", - "uk-ua": "Показати локалізовані підписи полів", - "pt-br": "Mostrar rótulos de campo localizados", + 'en-us': 'Show Localized Field Labels', + 'de-ch': 'Lokalisierte Feldbezeichnungen anzeigen', + 'es-es': 'Mostrar etiquetas de campos localizados', + 'fr-fr': 'Afficher les étiquettes de champ localisées', + 'ru-ru': 'Показать локализованные метки полей', + 'uk-ua': 'Показати локалізовані підписи полів', + 'pt-br': 'Mostrar rótulos de campo localizados', }, showDataModelLabels: { - "en-us": "Show Data Model Field Names", - "de-ch": "Datenmodell-Feldnamen anzeigen", - "es-es": "Mostrar nombres de campos del modelo de datos", - "fr-fr": "Afficher les noms des champs du modèle de données", - "ru-ru": "Показать имена полей модели данных", - "uk-ua": "Показати назви полів моделі даних", - "pt-br": "Mostrar nomes de campos do modelo de dados", + 'en-us': 'Show Data Model Field Names', + 'de-ch': 'Datenmodell-Feldnamen anzeigen', + 'es-es': 'Mostrar nombres de campos del modelo de datos', + 'fr-fr': 'Afficher les noms des champs du modèle de données', + 'ru-ru': 'Показать имена полей модели данных', + 'uk-ua': 'Показати назви полів моделі даних', + 'pt-br': 'Mostrar nomes de campos do modelo de dados', }, editHistory: { - "en-us": "Edit history", - "ru-ru": "История редактирования", - "es-es": "Historial de edición", - "fr-fr": "Modifier l'historique", - "uk-ua": "Історія редагування", - "de-ch": "Bearbeitungsgeschichte", - "pt-br": "Editar histórico", + 'en-us': 'Edit history', + 'ru-ru': 'История редактирования', + 'es-es': 'Historial de edición', + 'fr-fr': "Modifier l'historique", + 'uk-ua': 'Історія редагування', + 'de-ch': 'Bearbeitungsgeschichte', + 'pt-br': 'Editar histórico', }, editHistoryQueryName: { - "en-us": 'Edit history for "{formattedRecord:string}"', - "ru-ru": "История изменений для «{formattedRecord:string}»", - "es-es": 'Historial de edición de "{formattedRecord:string}"', - "fr-fr": "Modifier l'historique pour « {formattedRecord:string} »", - "uk-ua": 'Історія редагувань для "{formattedRecord:string}"', - "de-ch": "Bearbeitungsverlauf für „{formattedRecord:string}“", - "pt-br": 'Histórico de edição para "{formattedRecord:string}"', + 'en-us': 'Edit history for "{formattedRecord:string}"', + 'ru-ru': 'История изменений для «{formattedRecord:string}»', + 'es-es': 'Historial de edición de "{formattedRecord:string}"', + 'fr-fr': "Modifier l'historique pour « {formattedRecord:string} »", + 'uk-ua': 'Історія редагувань для "{formattedRecord:string}"', + 'de-ch': 'Bearbeitungsverlauf für „{formattedRecord:string}“', + 'pt-br': 'Histórico de edição para "{formattedRecord:string}"', }, formConfiguration: { - "en-us": "Form Configuration", - "ru-ru": "Конфигурация формы", - "es-es": "Configuración del formulario", - "fr-fr": "Configuration du formulaire", - "uk-ua": "Конфігурація форми", - "de-ch": "Formularkonfiguration", - "pt-br": "Configuração do formulário", + 'en-us': 'Form Configuration', + 'ru-ru': 'Конфигурация формы', + 'es-es': 'Configuración del formulario', + 'fr-fr': 'Configuration du formulaire', + 'uk-ua': 'Конфігурація форми', + 'de-ch': 'Formularkonfiguration', + 'pt-br': 'Configuração do formulário', }, formState: { - "en-us": "Form State", - "ru-ru": "Форма государства", - "es-es": "Estado del formulario", - "fr-fr": "État du formulaire", - "uk-ua": "Стан форми", - "de-ch": "Formularstatus", - "pt-br": "Estado do formulário", + 'en-us': 'Form State', + 'ru-ru': 'Форма государства', + 'es-es': 'Estado del formulario', + 'fr-fr': 'État du formulaire', + 'uk-ua': 'Стан форми', + 'de-ch': 'Formularstatus', + 'pt-br': 'Estado do formulário', }, recordInformation: { - "en-us": "Record Information", - "ru-ru": "Запись информации", - "es-es": "Información de registro", - "fr-fr": "Informations sur l'enregistrement", - "uk-ua": "Інформація про запис", - "de-ch": "Datensatzinformationen", - "pt-br": "Informações do registro", + 'en-us': 'Record Information', + 'ru-ru': 'Запись информации', + 'es-es': 'Información de registro', + 'fr-fr': "Informations sur l'enregistrement", + 'uk-ua': 'Інформація про запис', + 'de-ch': 'Datensatzinformationen', + 'pt-br': 'Informações do registro', }, shareRecord: { - "en-us": "Share Record", - "ru-ru": "Поделиться записью", - "es-es": "Compartir registro", - "fr-fr": "Partager l'enregistrement", - "uk-ua": "Поділитися записом", - "de-ch": "Datensatz teilen", - "pt-br": "Compartilhar registro", + 'en-us': 'Share Record', + 'ru-ru': 'Поделиться записью', + 'es-es': 'Compartir registro', + 'fr-fr': "Partager l'enregistrement", + 'uk-ua': 'Поділитися записом', + 'de-ch': 'Datensatz teilen', + 'pt-br': 'Compartilhar registro', }, findUsages: { - "en-us": "Find usages", - "ru-ru": "Найти случаи использования", - "es-es": "Encuentra usos", - "fr-fr": "Trouver des utilisations", - "uk-ua": "Знайти вживання", - "de-ch": "Verwendungen finden", - "pt-br": "Encontre usos", + 'en-us': 'Find usages', + 'ru-ru': 'Найти случаи использования', + 'es-es': 'Encuentra usos', + 'fr-fr': 'Trouver des utilisations', + 'uk-ua': 'Знайти вживання', + 'de-ch': 'Verwendungen finden', + 'pt-br': 'Encontre usos', }, usagesOfPickList: { - "en-us": 'Usages of "{pickList:string}" pick list', - "ru-ru": "Использование списка выбора «{pickList:string}»", - "es-es": 'Usos de la lista de selección "{pickList:string}"', - "fr-fr": "Utilisations de la liste de sélection « {pickList:string} »", - "uk-ua": 'Використання списку вибору "{pickList:string}"', - "de-ch": "Verwendungen der Auswahlliste „{pickList:string}“", - "pt-br": 'Usos da lista de seleção "{pickList:string}"', + 'en-us': 'Usages of "{pickList:string}" pick list', + 'ru-ru': 'Использование списка выбора «{pickList:string}»', + 'es-es': 'Usos de la lista de selección "{pickList:string}"', + 'fr-fr': 'Utilisations de la liste de sélection « {pickList:string} »', + 'uk-ua': 'Використання списку вибору "{pickList:string}"', + 'de-ch': 'Verwendungen der Auswahlliste „{pickList:string}“', + 'pt-br': 'Usos da lista de seleção "{pickList:string}"', }, subForm: { - "en-us": "Subform", - "ru-ru": "Подчиненная форма", - "es-es": "Subform", - "fr-fr": "Sous-formulaire", - "uk-ua": "Підформа", - "de-ch": "Unterformular", - "pt-br": "Subform", + 'en-us': 'Subform', + 'ru-ru': 'Подчиненная форма', + 'es-es': 'Subform', + 'fr-fr': 'Sous-formulaire', + 'uk-ua': 'Підформа', + 'de-ch': 'Unterformular', + 'pt-br': 'Subform', }, formTable: { - "en-us": "Grid", - "ru-ru": "Сетка", - "es-es": "Red", - "fr-fr": "Grille", - "uk-ua": "Сітка", - "de-ch": "Netz", - "pt-br": "Grade", + 'en-us': 'Grid', + 'ru-ru': 'Сетка', + 'es-es': 'Red', + 'fr-fr': 'Grille', + 'uk-ua': 'Сітка', + 'de-ch': 'Netz', + 'pt-br': 'Grade', }, subviewConfiguration: { - "en-us": "Subview", - "ru-ru": "Подвид", - "es-es": "Subvista", - "uk-ua": "Підвид", - "de-ch": "Unteransicht", - "fr-fr": "Sous-vue", - "pt-br": "Subvisualização", + 'en-us': 'Subview', + 'ru-ru': 'Подвид', + 'es-es': 'Subvista', + 'uk-ua': 'Підвид', + 'de-ch': 'Unteransicht', + 'fr-fr': 'Sous-vue', + 'pt-br': 'Subvisualização', }, disableReadOnly: { - "en-us": "Disable read-only mode", - "ru-ru": "Отключить режим только для чтения", - "es-es": "Deshabilitar el modo de solo lectura", - "fr-fr": "Désactiver le mode lecture seule", - "uk-ua": "Вимкнути режим лише для читання", - "de-ch": "Deaktivieren Sie den Nur-Lese-Modus", - "pt-br": "Desativar modo somente leitura", + 'en-us': 'Disable read-only mode', + 'ru-ru': 'Отключить режим только для чтения', + 'es-es': 'Deshabilitar el modo de solo lectura', + 'fr-fr': 'Désactiver le mode lecture seule', + 'uk-ua': 'Вимкнути режим лише для читання', + 'de-ch': 'Deaktivieren Sie den Nur-Lese-Modus', + 'pt-br': 'Desativar modo somente leitura', }, enableReadOnly: { - "en-us": "Enable read-only mode", - "ru-ru": "Включить режим только для чтения", - "es-es": "Habilitar el modo de solo lectura", - "fr-fr": "Activer le mode lecture seule", - "uk-ua": "Увімкнути режим лише для читання", - "de-ch": "Aktivieren Sie den Nur-Lese-Modus", - "pt-br": "Habilitar modo somente leitura", + 'en-us': 'Enable read-only mode', + 'ru-ru': 'Включить режим только для чтения', + 'es-es': 'Habilitar el modo de solo lectura', + 'fr-fr': 'Activer le mode lecture seule', + 'uk-ua': 'Увімкнути режим лише для читання', + 'de-ch': 'Aktivieren Sie den Nur-Lese-Modus', + 'pt-br': 'Habilitar modo somente leitura', }, configureDataEntryTables: { - "en-us": "Configure data entry tables", - "ru-ru": "Настройте таблицы ввода данных", - "es-es": "Configurar tablas de entrada de datos", - "fr-fr": "Configurer les tables de saisie de données", - "uk-ua": "Налаштування таблиць для введення даних", - "de-ch": "Konfigurieren von Dateneingabetabellen", - "pt-br": "Configurar tabelas de entrada de dados", + 'en-us': 'Configure data entry tables', + 'ru-ru': 'Настройте таблицы ввода данных', + 'es-es': 'Configurar tablas de entrada de datos', + 'fr-fr': 'Configurer les tables de saisie de données', + 'uk-ua': 'Налаштування таблиць для введення даних', + 'de-ch': 'Konfigurieren von Dateneingabetabellen', + 'pt-br': 'Configurar tabelas de entrada de dados', }, configureInteractionTables: { - "en-us": "Configure interaction tables", - "ru-ru": "Настроить таблицы взаимодействия", - "es-es": "Configurar tablas de interacción", - "fr-fr": "Configurer les tables d'interaction", - "uk-ua": "Налаштування таблиць взаємодії", - "de-ch": "Konfigurieren von Interaktionstabellen", - "pt-br": "Configurar tabelas de interação", + 'en-us': 'Configure interaction tables', + 'ru-ru': 'Настроить таблицы взаимодействия', + 'es-es': 'Configurar tablas de interacción', + 'fr-fr': "Configurer les tables d'interaction", + 'uk-ua': 'Налаштування таблиць взаємодії', + 'de-ch': 'Konfigurieren von Interaktionstabellen', + 'pt-br': 'Configurar tabelas de interação', }, formMeta: { - "en-us": "Form Meta", - "ru-ru": "Форма Мета", - "es-es": "Meta del formulario", - "fr-fr": "Formulaire Méta", - "uk-ua": "Метадані форми", - "de-ch": "Formular-Metadaten", - "pt-br": "Formulário Meta", + 'en-us': 'Form Meta', + 'ru-ru': 'Форма Мета', + 'es-es': 'Meta del formulario', + 'fr-fr': 'Formulaire Méta', + 'uk-ua': 'Метадані форми', + 'de-ch': 'Formular-Metadaten', + 'pt-br': 'Formulário Meta', }, newResourceTitle: { - "en-us": "New {tableName:string}", - "ru-ru": "Новый {tableName:string}", - "es-es": "Nuevo {tableName:string}", - "fr-fr": "Nouveau {tableName:string}", - "uk-ua": "Новий {tableName:string}", - "de-ch": "Neu {tableName:string}", - "pt-br": "Novo {tableName:string}", + 'en-us': 'New {tableName:string}', + 'ru-ru': 'Новый {tableName:string}', + 'es-es': 'Nuevo {tableName:string}', + 'fr-fr': 'Nouveau {tableName:string}', + 'uk-ua': 'Новий {tableName:string}', + 'de-ch': 'Neu {tableName:string}', + 'pt-br': 'Novo {tableName:string}', }, resourceFormatter: { comment: ` When resource does not have a formatter defined, this formatter is used `, - "en-us": "{tableName:string} #{id:number}", - "ru-ru": "{tableName:string} #{id:number}", - "es-es": "{tableName:string} #{id:number}", - "fr-fr": "{tableName:string} #{id:number}", - "uk-ua": "{tableName:string} '#{id:number}", - "de-ch": "{tableName:string} #{id:number}", - "pt-br": "{tableName:string} #{id:number}", + 'en-us': '{tableName:string} #{id:number}', + 'ru-ru': '{tableName:string} #{id:number}', + 'es-es': '{tableName:string} #{id:number}', + 'fr-fr': '{tableName:string} #{id:number}', + 'uk-ua': "{tableName:string} '#{id:number}", + 'de-ch': '{tableName:string} #{id:number}', + 'pt-br': '{tableName:string} #{id:number}', }, resourceDeleted: { - "en-us": "Resource deleted", - "ru-ru": "Ресурс удален", - "es-es": "Recurso eliminado", - "fr-fr": "Ressource supprimée", - "uk-ua": "Ресурс видалено", - "de-ch": "Ressource gelöscht", - "pt-br": "Recurso excluído", + 'en-us': 'Resource deleted', + 'ru-ru': 'Ресурс удален', + 'es-es': 'Recurso eliminado', + 'fr-fr': 'Ressource supprimée', + 'uk-ua': 'Ресурс видалено', + 'de-ch': 'Ressource gelöscht', + 'pt-br': 'Recurso excluído', }, resourceDeletedDescription: { - "en-us": "Item was deleted successfully.", - "ru-ru": "Элемент был успешно удален.", - "es-es": "El artículo fue eliminado exitosamente.", - "fr-fr": "L'élément a été supprimé avec succès.", - "uk-ua": "Елемент успішно видалено.", - "de-ch": "Element wurde erfolgreich gelöscht.", - "pt-br": "O item foi excluído com sucesso.", + 'en-us': 'Item was deleted successfully.', + 'ru-ru': 'Элемент был успешно удален.', + 'es-es': 'El artículo fue eliminado exitosamente.', + 'fr-fr': "L'élément a été supprimé avec succès.", + 'uk-ua': 'Елемент успішно видалено.', + 'de-ch': 'Element wurde erfolgreich gelöscht.', + 'pt-br': 'O item foi excluído com sucesso.', }, dateRange: { - "en-us": "(Range: {from:string} - {to:string})", - "ru-ru": "(Диапазон: {from:string} - {to:string})", - "es-es": "(Rango: {from:string} - {to:string})", - "fr-fr": "(Plage : {from:string} - {to:string})", - "uk-ua": "(Діапазон: {from:string} - {to:string})", - "de-ch": "(Bereich: {from:string} – {to:string})", - "pt-br": "(Intervalo: {from:string} - {to:string})", + 'en-us': '(Range: {from:string} - {to:string})', + 'ru-ru': '(Диапазон: {from:string} - {to:string})', + 'es-es': '(Rango: {from:string} - {to:string})', + 'fr-fr': '(Plage : {from:string} - {to:string})', + 'uk-ua': '(Діапазон: {from:string} - {to:string})', + 'de-ch': '(Bereich: {from:string} – {to:string})', + 'pt-br': '(Intervalo: {from:string} - {to:string})', }, catalogNumberNumericFormatter: { comment: 'Meaning "Catalog Number Numeric formatter"', - "en-us": "Catalog Number Numeric", - "de-ch": "Katalognummer numerisch", - "es-es": "Número de catálogo numérico", - "fr-fr": "Numéro de catalogue numérique", - "ru-ru": "Номер каталога Цифровой", - "uk-ua": "Номер у каталозі (числовий)", - "pt-br": "Número de catálogo Numérico", + 'en-us': 'Catalog Number Numeric', + 'de-ch': 'Katalognummer numerisch', + 'es-es': 'Número de catálogo numérico', + 'fr-fr': 'Numéro de catalogue numérique', + 'ru-ru': 'Номер каталога Цифровой', + 'uk-ua': 'Номер у каталозі (числовий)', + 'pt-br': 'Número de catálogo Numérico', }, addCOGChildren: { - "en-us": "Add COG Children", - "de-ch": "COG-Kinder hinzufügen", - "es-es": "Agregar niños COG", - "fr-fr": "Ajouter des enfants COG", - "pt-br": "Adicionar crianças COG", - "ru-ru": "Добавить детей COG", - "uk-ua": "Додати дочірні елементи COG", + 'en-us': 'Add COG Children', + 'de-ch': 'COG-Kinder hinzufügen', + 'es-es': 'Agregar niños COG', + 'fr-fr': 'Ajouter des enfants COG', + 'pt-br': 'Adicionar crianças COG', + 'ru-ru': 'Добавить детей COG', + 'uk-ua': 'Додати дочірні елементи COG', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/resources.ts b/specifyweb/frontend/js_src/lib/localization/resources.ts index a8a3dcbfed0..4701c89b883 100644 --- a/specifyweb/frontend/js_src/lib/localization/resources.ts +++ b/specifyweb/frontend/js_src/lib/localization/resources.ts @@ -4,1130 +4,1130 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const resourcesText = createDictionary({ appResources: { - "en-us": "App Resources", - "ru-ru": "Ресурсы приложений", - "es-es": "Recursos de la aplicación", - "fr-fr": "Ressources de l'application", - "uk-ua": "Ресурси програми", - "de-ch": "App Ressourcen", - "pt-br": "Recursos do aplicativo", + 'en-us': 'App Resources', + 'ru-ru': 'Ресурсы приложений', + 'es-es': 'Recursos de la aplicación', + 'fr-fr': "Ressources de l'application", + 'uk-ua': 'Ресурси програми', + 'de-ch': 'App Ressourcen', + 'pt-br': 'Recursos do aplicativo', }, formDefinition: { - "en-us": "Form Definition", - "ru-ru": "Определение формы", - "es-es": "Definición de formulario", - "fr-fr": "Définition du formulaire", - "uk-ua": "Визначення форми", - "de-ch": "Formular Definition", - "pt-br": "Definição de Formulário", + 'en-us': 'Form Definition', + 'ru-ru': 'Определение формы', + 'es-es': 'Definición de formulario', + 'fr-fr': 'Définition du formulaire', + 'uk-ua': 'Визначення форми', + 'de-ch': 'Formular Definition', + 'pt-br': 'Definição de Formulário', }, formDefinitions: { - "en-us": "Form Definition", - "ru-ru": "Определение формы", - "es-es": "Definición de formulario", - "fr-fr": "Définition du formulaire", - "uk-ua": "Визначення форми", - "de-ch": "Formulardefinition", - "pt-br": "Definição de Formulário", + 'en-us': 'Form Definition', + 'ru-ru': 'Определение формы', + 'es-es': 'Definición de formulario', + 'fr-fr': 'Définition du formulaire', + 'uk-ua': 'Визначення форми', + 'de-ch': 'Formulardefinition', + 'pt-br': 'Definição de Formulário', }, newViewDefinition: { - "en-us": "New View Definition", - "de-ch": "Neue Ansichtsdefinition", - "es-es": "Nueva definición de vista", - "fr-fr": "Nouvelle définition de vue", - "pt-br": "Nova Definição de Visualização", - "ru-ru": "Новое определение взгляда", - "uk-ua": "Нове визначення подання", + 'en-us': 'New View Definition', + 'de-ch': 'Neue Ansichtsdefinition', + 'es-es': 'Nueva definición de vista', + 'fr-fr': 'Nouvelle définition de vue', + 'pt-br': 'Nova Definição de Visualização', + 'ru-ru': 'Новое определение взгляда', + 'uk-ua': 'Нове визначення подання', }, loadFile: { - "en-us": "Load File", - "ru-ru": "Загрузить файл", - "es-es": "Cargar archivo", - "fr-fr": "Charger le fichier", - "uk-ua": "Завантажити файл", - "de-ch": "Datei Laden", - "pt-br": "Carregar arquivo", + 'en-us': 'Load File', + 'ru-ru': 'Загрузить файл', + 'es-es': 'Cargar archivo', + 'fr-fr': 'Charger le fichier', + 'uk-ua': 'Завантажити файл', + 'de-ch': 'Datei Laden', + 'pt-br': 'Carregar arquivo', }, globalResources: { - "en-us": "Global Resources", - "ru-ru": "Глобальные ресурсы", - "es-es": "Recursos globales", - "fr-fr": "Ressources mondiales", - "uk-ua": "Глобальні ресурси", - "de-ch": "Globale Ressourcen", - "pt-br": "Recursos Globais", + 'en-us': 'Global Resources', + 'ru-ru': 'Глобальные ресурсы', + 'es-es': 'Recursos globales', + 'fr-fr': 'Ressources mondiales', + 'uk-ua': 'Глобальні ресурси', + 'de-ch': 'Globale Ressourcen', + 'pt-br': 'Recursos Globais', }, disciplineResources: { - "en-us": "Discipline Resources", - "ru-ru": "Дисциплинарные ресурсы", - "es-es": "Recursos de disciplina", - "fr-fr": "Ressources disciplinaires", - "uk-ua": "Дисциплінарні ресурси", - "de-ch": "Disziplin-Ressourcen", - "pt-br": "Recursos de Disciplina", + 'en-us': 'Discipline Resources', + 'ru-ru': 'Дисциплинарные ресурсы', + 'es-es': 'Recursos de disciplina', + 'fr-fr': 'Ressources disciplinaires', + 'uk-ua': 'Дисциплінарні ресурси', + 'de-ch': 'Disziplin-Ressourcen', + 'pt-br': 'Recursos de Disciplina', }, type: { - "en-us": "Type", - "ru-ru": "Тип", - "es-es": "Tipo", - "fr-fr": "Taper", - "uk-ua": "Тип", - "de-ch": "Typ", - "pt-br": "Tipo", + 'en-us': 'Type', + 'ru-ru': 'Тип', + 'es-es': 'Tipo', + 'fr-fr': 'Taper', + 'uk-ua': 'Тип', + 'de-ch': 'Typ', + 'pt-br': 'Tipo', }, userTypes: { - "en-us": "User Types", - "ru-ru": "Типы пользователей", - "es-es": "Tipos de usuarios", - "fr-fr": "Types d'utilisateurs", - "uk-ua": "Типи користувачів", - "de-ch": "Benutzertypen", - "pt-br": "Tipos de Usuário", + 'en-us': 'User Types', + 'ru-ru': 'Типы пользователей', + 'es-es': 'Tipos de usuarios', + 'fr-fr': "Types d'utilisateurs", + 'uk-ua': 'Типи користувачів', + 'de-ch': 'Benutzertypen', + 'pt-br': 'Tipos de Usuário', }, resources: { - "en-us": "Resources", - "ru-ru": "Ресурсы", - "es-es": "Recursos", - "fr-fr": "Ressources", - "uk-ua": "Ресурси", - "de-ch": "Ressourcen", - "pt-br": "Recursos", + 'en-us': 'Resources', + 'ru-ru': 'Ресурсы', + 'es-es': 'Recursos', + 'fr-fr': 'Ressources', + 'uk-ua': 'Ресурси', + 'de-ch': 'Ressourcen', + 'pt-br': 'Recursos', }, subCategories: { - "en-us": "Sub-categories", - "ru-ru": "Подкатегории", - "es-es": "Subcategorías", - "fr-fr": "Sous-catégories", - "uk-ua": "Підкатегорії", - "de-ch": "Unterkategorien", - "pt-br": "Subcategorias", + 'en-us': 'Sub-categories', + 'ru-ru': 'Подкатегории', + 'es-es': 'Subcategorías', + 'fr-fr': 'Sous-catégories', + 'uk-ua': 'Підкатегорії', + 'de-ch': 'Unterkategorien', + 'pt-br': 'Subcategorias', }, addResource: { - "en-us": "Add Resource", - "ru-ru": "Добавить ресурс", - "es-es": "Agregar recurso", - "fr-fr": "Ajouter une ressource", - "uk-ua": "Додати ресурс", - "de-ch": "Ressource hinzufügen", - "pt-br": "Adicionar recurso", + 'en-us': 'Add Resource', + 'ru-ru': 'Добавить ресурс', + 'es-es': 'Agregar recurso', + 'fr-fr': 'Ajouter une ressource', + 'uk-ua': 'Додати ресурс', + 'de-ch': 'Ressource hinzufügen', + 'pt-br': 'Adicionar recurso', }, appResource: { - "en-us": "App Resource", - "ru-ru": "Подкатегории", - "es-es": "Recursos de la aplicación", - "fr-fr": "Ressource d'application", - "uk-ua": "Підкатегорії", - "de-ch": "App Ressource", - "pt-br": "Recurso do aplicativo", + 'en-us': 'App Resource', + 'ru-ru': 'Подкатегории', + 'es-es': 'Recursos de la aplicación', + 'fr-fr': "Ressource d'application", + 'uk-ua': 'Підкатегорії', + 'de-ch': 'App Ressource', + 'pt-br': 'Recurso do aplicativo', }, rssExportFeed: { - "en-us": "RSS Export Feed", - "ru-ru": "RSS-канал экспорта", - "es-es": "Fuente de exportación RSS", - "fr-fr": "Flux d'exportation RSS", - "uk-ua": "Канал експорту RSS", - "de-ch": "RSS-Export-Feed", - "pt-br": "Feed de exportação RSS", + 'en-us': 'RSS Export Feed', + 'ru-ru': 'RSS-канал экспорта', + 'es-es': 'Fuente de exportación RSS', + 'fr-fr': "Flux d'exportation RSS", + 'uk-ua': 'Канал експорту RSS', + 'de-ch': 'RSS-Export-Feed', + 'pt-br': 'Feed de exportação RSS', }, exports: { - "en-us": "Exports", - "de-ch": "Exporte", - "es-es": "Exportaciones", - "fr-fr": "Exportations", - "ru-ru": "Экспорт", - "uk-ua": "Експорт", - "pt-br": "Exportações", + 'en-us': 'Exports', + 'de-ch': 'Exporte', + 'es-es': 'Exportaciones', + 'fr-fr': 'Exportations', + 'ru-ru': 'Экспорт', + 'uk-ua': 'Експорт', + 'pt-br': 'Exportações', }, expressSearchConfig: { - "en-us": "Express Search Config", - "ru-ru": "Конфигурация экспресс-поиска", - "es-es": "Configuración de búsqueda rápida", - "fr-fr": "Configuration de la recherche express", - "uk-ua": "Конфігурація експрес-пошуку", - "de-ch": "Express Suche Konfigurieren", - "pt-br": "Configuração de pesquisa expressa", + 'en-us': 'Express Search Config', + 'ru-ru': 'Конфигурация экспресс-поиска', + 'es-es': 'Configuración de búsqueda rápida', + 'fr-fr': 'Configuration de la recherche express', + 'uk-ua': 'Конфігурація експрес-пошуку', + 'de-ch': 'Express Suche Konfigurieren', + 'pt-br': 'Configuração de pesquisa expressa', }, typeSearches: { - "en-us": "Type Searches", - "de-ch": "Typsuchen", - "es-es": "Búsquedas de tipos", - "fr-fr": "Recherches de type", - "ru-ru": "Тип поиска", - "uk-ua": "Пошук типів", - "pt-br": "Pesquisas de tipo", + 'en-us': 'Type Searches', + 'de-ch': 'Typsuchen', + 'es-es': 'Búsquedas de tipos', + 'fr-fr': 'Recherches de type', + 'ru-ru': 'Тип поиска', + 'uk-ua': 'Пошук типів', + 'pt-br': 'Pesquisas de tipo', }, webLinks: { - "en-us": "Web Links", - "ru-ru": "Веб ссылки", - "es-es": "Enlaces web", - "fr-fr": "Liens Web", - "uk-ua": "Веб-посилання", - "de-ch": "Weblinks", - "pt-br": "Links da Web", + 'en-us': 'Web Links', + 'ru-ru': 'Веб ссылки', + 'es-es': 'Enlaces web', + 'fr-fr': 'Liens Web', + 'uk-ua': 'Веб-посилання', + 'de-ch': 'Weblinks', + 'pt-br': 'Links da Web', }, uiFormatters: { - "en-us": "Field Formatters", - "ru-ru": "Форматировщики полей", - "es-es": "Formateadores de campos", - "fr-fr": "Formateurs de champs", - "uk-ua": "Форматувальники полів", - "de-ch": "Feldformatierer", - "pt-br": "Formatadores de campo", + 'en-us': 'Field Formatters', + 'ru-ru': 'Форматировщики полей', + 'es-es': 'Formateadores de campos', + 'fr-fr': 'Formateurs de champs', + 'uk-ua': 'Форматувальники полів', + 'de-ch': 'Feldformatierer', + 'pt-br': 'Formatadores de campo', }, fieldFormattersDescription: { - "en-us": - "The “Field Format” controls how data for a specific table field is displayed in query results, exports, and forms. It manages autonumbering and the composition of various parts that define the field.", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": - "«Формат поля» контролює, як дані для певного поля таблиці відображаються в результатах запиту, експорті та формах. Він керує автонумерацією та композицією різних частин, що визначають поле.", + 'en-us': + 'The “Field Format” controls how data for a specific table field is displayed in query results, exports, and forms. It manages autonumbering and the composition of various parts that define the field.', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': + '«Формат поля» контролює, як дані для певного поля таблиці відображаються в результатах запиту, експорті та формах. Він керує автонумерацією та композицією різних частин, що визначають поле.', }, dataObjectFormatters: { - "en-us": "Record Formatters", - "ru-ru": "Форматеры записи", - "es-es": "Formateadores de registros", - "uk-ua": "Форматувальники записів", - "de-ch": "Datensatz-Formatierer", - "fr-fr": "Formateurs d'enregistrements", - "pt-br": "Formatadores de registros", + 'en-us': 'Record Formatters', + 'ru-ru': 'Форматеры записи', + 'es-es': 'Formateadores de registros', + 'uk-ua': 'Форматувальники записів', + 'de-ch': 'Datensatz-Formatierer', + 'fr-fr': "Formateurs d'enregistrements", + 'pt-br': 'Formatadores de registros', }, formatter: { - "en-us": "Table Format", - "de-ch": "Tabellenformat", - "es-es": "Formato de tabla", - "fr-fr": "Format de tableau", - "ru-ru": "Формат таблицы", - "uk-ua": "Формат таблиці", - "pt-br": "Formato de tabela", + 'en-us': 'Table Format', + 'de-ch': 'Tabellenformat', + 'es-es': 'Formato de tabla', + 'fr-fr': 'Format de tableau', + 'ru-ru': 'Формат таблицы', + 'uk-ua': 'Формат таблиці', + 'pt-br': 'Formato de tabela', }, formatterDescription: { - "en-us": - "The “Table Format” controls how data from a specific table is shown in query results, exports, and query combo boxes. It determines the fields to display and their order. Conditional formatting can be configured based on a value in the record.", - "de-ch": - "Das Tabellenformat steuert die Darstellung von Daten aus einer bestimmten Tabelle in Abfrageergebnissen, Exporten und Abfrage-Kombinationsfeldern. Es bestimmt die anzuzeigenden Felder und deren Reihenfolge. Die bedingte Formatierung kann basierend auf einem Wert im Datensatz konfiguriert werden.", - "es-es": + 'en-us': + 'The “Table Format” controls how data from a specific table is shown in query results, exports, and query combo boxes. It determines the fields to display and their order. Conditional formatting can be configured based on a value in the record.', + 'de-ch': + 'Das Tabellenformat steuert die Darstellung von Daten aus einer bestimmten Tabelle in Abfrageergebnissen, Exporten und Abfrage-Kombinationsfeldern. Es bestimmt die anzuzeigenden Felder und deren Reihenfolge. Die bedingte Formatierung kann basierend auf einem Wert im Datensatz konfiguriert werden.', + 'es-es': 'El "Formato de tabla" controla cómo se muestran los datos de una tabla específica en los resultados de consultas, las exportaciones y los cuadros combinados de consultas. Determina los campos que se mostrarán y su orden. El formato condicional se puede configurar según un valor del registro.', - "fr-fr": + 'fr-fr': "Le « Format de table » contrôle l'affichage des données d'une table spécifique dans les résultats de requête, les exportations et les listes déroulantes. Il détermine les champs à afficher et leur ordre. La mise en forme conditionnelle peut être configurée en fonction d'une valeur de l'enregistrement.", - "ru-ru": - "«Формат таблицы» определяет, как данные из определенной таблицы отображаются в результатах запроса, экспорте и полях со списком запроса. Он определяет поля для отображения и их порядок. Условное форматирование можно настроить на основе значения в записи.", - "uk-ua": - "«Формат таблиці» керує тим, як дані з певної таблиці відображаються в результатах запитів, експорті та комбінованих полях запитів. Він визначає поля для відображення та їх порядок. Умовне форматування можна налаштувати на основі значення в записі.", - "pt-br": - "O “Formato da Tabela” controla como os dados de uma tabela específica são exibidos nos resultados da consulta, exportações e caixas de combinação da consulta. Ele determina os campos a serem exibidos e sua ordem. A formatação condicional pode ser configurada com base em um valor no registro.", + 'ru-ru': + '«Формат таблицы» определяет, как данные из определенной таблицы отображаются в результатах запроса, экспорте и полях со списком запроса. Он определяет поля для отображения и их порядок. Условное форматирование можно настроить на основе значения в записи.', + 'uk-ua': + '«Формат таблиці» керує тим, як дані з певної таблиці відображаються в результатах запитів, експорті та комбінованих полях запитів. Він визначає поля для відображення та їх порядок. Умовне форматування можна налаштувати на основі значення в записі.', + 'pt-br': + 'O “Formato da Tabela” controla como os dados de uma tabela específica são exibidos nos resultados da consulta, exportações e caixas de combinação da consulta. Ele determina os campos a serem exibidos e sua ordem. A formatação condicional pode ser configurada com base em um valor no registro.', }, aggregator: { - "en-us": "Table Aggregation", - "de-ch": "Tabellenaggregation", - "es-es": "Agregación de tablas", - "fr-fr": "Agrégation de table", - "ru-ru": "Агрегация таблиц", - "uk-ua": "Агрегація таблиць", - "pt-br": "Agregação de tabelas", + 'en-us': 'Table Aggregation', + 'de-ch': 'Tabellenaggregation', + 'es-es': 'Agregación de tablas', + 'fr-fr': 'Agrégation de table', + 'ru-ru': 'Агрегация таблиц', + 'uk-ua': 'Агрегація таблиць', + 'pt-br': 'Agregação de tabelas', }, aggregatorDescription: { - "en-us": - "The “Table Aggregation” controls how multiple table records are consolidated together into a single text string. The table format, separator, suffix, sort field, and record preview limit are customizable. It can be displayed in query results and table formats.", - "de-ch": - "Die „Tabellenaggregation“ steuert, wie mehrere Tabellendatensätze zu einer einzigen Textzeichenfolge zusammengefasst werden. Tabellenformat, Trennzeichen, Suffix, Sortierfeld und Datensatzvorschaulimit sind anpassbar. Die Anzeige kann in Abfrageergebnissen und Tabellenformaten erfolgen.", - "es-es": + 'en-us': + 'The “Table Aggregation” controls how multiple table records are consolidated together into a single text string. The table format, separator, suffix, sort field, and record preview limit are customizable. It can be displayed in query results and table formats.', + 'de-ch': + 'Die „Tabellenaggregation“ steuert, wie mehrere Tabellendatensätze zu einer einzigen Textzeichenfolge zusammengefasst werden. Tabellenformat, Trennzeichen, Suffix, Sortierfeld und Datensatzvorschaulimit sind anpassbar. Die Anzeige kann in Abfrageergebnissen und Tabellenformaten erfolgen.', + 'es-es': 'La "Agregación de Tablas" controla cómo se consolidan varios registros de tabla en una sola cadena de texto. El formato de tabla, el separador, el sufijo, el campo de ordenación y el límite de vista previa de registros son personalizables. Se pueden mostrar en los resultados de consultas y en los formatos de tabla.', - "fr-fr": + 'fr-fr': "L'« Agrégation de table » contrôle la consolidation de plusieurs enregistrements de table en une seule chaîne de texte. Le format de table, le séparateur, le suffixe, le champ de tri et la limite d'aperçu des enregistrements sont personnalisables. L'affichage peut être effectué dans les résultats de requête et les formats de table.", - "ru-ru": - "«Агрегация таблиц» управляет тем, как несколько записей таблицы объединяются в одну текстовую строку. Формат таблицы, разделитель, суффикс, поле сортировки и ограничение предварительного просмотра записи можно настроить. Его можно отобразить в результатах запроса и в форматах таблиц.", - "uk-ua": - "«Агрегація таблиць» контролює, як кілька записів таблиці об’єднуються разом в один текстовий рядок. Формат таблиці, роздільник, суфікс, поле сортування та ліміт попереднього перегляду запису можна налаштувати. Він може відображатися в результатах запитів і у форматах таблиць.", - "pt-br": + 'ru-ru': + '«Агрегация таблиц» управляет тем, как несколько записей таблицы объединяются в одну текстовую строку. Формат таблицы, разделитель, суффикс, поле сортировки и ограничение предварительного просмотра записи можно настроить. Его можно отобразить в результатах запроса и в форматах таблиц.', + 'uk-ua': + '«Агрегація таблиць» контролює, як кілька записів таблиці об’єднуються разом в один текстовий рядок. Формат таблиці, роздільник, суфікс, поле сортування та ліміт попереднього перегляду запису можна налаштувати. Він може відображатися в результатах запитів і у форматах таблиць.', + 'pt-br': 'A "Agregação de Tabelas" controla como vários registros de tabelas são consolidados em uma única sequência de texto. O formato da tabela, o separador, o sufixo, o campo de classificação e o limite de visualização de registros são personalizáveis. Ele pode ser exibido nos resultados da consulta e nos formatos de tabela.', }, formattedResource: { - "en-us": "Formatted Resource", - "de-ch": "Formatierte Ressource", - "es-es": "Recurso formateado", - "fr-fr": "Ressource formatée", - "ru-ru": "Форматированный ресурс", - "uk-ua": "Відформатований ресурс", - "pt-br": "Recurso formatado", + 'en-us': 'Formatted Resource', + 'de-ch': 'Formatierte Ressource', + 'es-es': 'Recurso formateado', + 'fr-fr': 'Ressource formatée', + 'ru-ru': 'Форматированный ресурс', + 'uk-ua': 'Відформатований ресурс', + 'pt-br': 'Recurso formatado', }, availableFormatters: { - "en-us": "Available Table Formats", - "de-ch": "Verfügbare Tabellenformate", - "es-es": "Formatos de tabla disponibles", - "fr-fr": "Formats de tableau disponibles", - "ru-ru": "Доступные форматы таблиц", - "uk-ua": "Доступні формати таблиць", - "pt-br": "Formatos de tabela disponíveis", + 'en-us': 'Available Table Formats', + 'de-ch': 'Verfügbare Tabellenformate', + 'es-es': 'Formatos de tabla disponibles', + 'fr-fr': 'Formats de tableau disponibles', + 'ru-ru': 'Доступные форматы таблиц', + 'uk-ua': 'Доступні формати таблиць', + 'pt-br': 'Formatos de tabela disponíveis', }, availableAggregators: { - "en-us": "Available Table Aggregations", - "de-ch": "Verfügbare Tabellenaggregationen", - "es-es": "Agregaciones de tablas disponibles", - "fr-fr": "Agrégations de tables disponibles", - "ru-ru": "Доступные агрегаты таблиц", - "uk-ua": "Доступні агрегації таблиць", - "pt-br": "Agregações de tabelas disponíveis", + 'en-us': 'Available Table Aggregations', + 'de-ch': 'Verfügbare Tabellenaggregationen', + 'es-es': 'Agregaciones de tablas disponibles', + 'fr-fr': 'Agrégations de tables disponibles', + 'ru-ru': 'Доступные агрегаты таблиц', + 'uk-ua': 'Доступні агрегації таблиць', + 'pt-br': 'Agregações de tabelas disponíveis', }, availableWebLink: { - "en-us": "Available Web Links", - "de-ch": "Verfügbare Weblinks", - "es-es": "Enlaces web disponibles", - "fr-fr": "Liens Web disponibles", - "ru-ru": "Доступные веб-ссылки", - "uk-ua": "Доступні веб-посилання", - "pt-br": "Links da Web disponíveis", + 'en-us': 'Available Web Links', + 'de-ch': 'Verfügbare Weblinks', + 'es-es': 'Enlaces web disponibles', + 'fr-fr': 'Liens Web disponibles', + 'ru-ru': 'Доступные веб-ссылки', + 'uk-ua': 'Доступні веб-посилання', + 'pt-br': 'Links da Web disponíveis', }, availableFieldFormatters: { - "en-us": "Available Field Formatters", - "de-ch": "Verfügbare Feldformatierer", - "es-es": "Formateadores de campo disponibles", - "fr-fr": "Formateurs de champs disponibles", - "ru-ru": "Доступные форматеры полей", - "uk-ua": "Доступні форматувальники полів", - "pt-br": "", + 'en-us': 'Available Field Formatters', + 'de-ch': 'Verfügbare Feldformatierer', + 'es-es': 'Formateadores de campo disponibles', + 'fr-fr': 'Formateurs de champs disponibles', + 'ru-ru': 'Доступные форматеры полей', + 'uk-ua': 'Доступні форматувальники полів', + 'pt-br': '', }, selectDefaultFormatter: { - "en-us": "Please designate one of the formatters as default", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Будь ласка, призначте один із форматувальників як стандартний", + 'en-us': 'Please designate one of the formatters as default', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Будь ласка, призначте один із форматувальників як стандартний', }, duplicateFormatters: { - "en-us": "Record formatter names must be unique", - "de-ch": "Datensatzformatierernamen müssen eindeutig sein", - "es-es": "Los nombres de los formateadores de registros deben ser únicos", - "fr-fr": "Les noms des formateurs d'enregistrement doivent être uniques", - "ru-ru": "Имена средств форматирования записей должны быть уникальными.", - "uk-ua": "Імена форматування записів мають бути унікальними", - "pt-br": "Os nomes dos formatadores de registro devem ser exclusivos", + 'en-us': 'Record formatter names must be unique', + 'de-ch': 'Datensatzformatierernamen müssen eindeutig sein', + 'es-es': 'Los nombres de los formateadores de registros deben ser únicos', + 'fr-fr': "Les noms des formateurs d'enregistrement doivent être uniques", + 'ru-ru': 'Имена средств форматирования записей должны быть уникальными.', + 'uk-ua': 'Імена форматування записів мають бути унікальними', + 'pt-br': 'Os nomes dos formatadores de registro devem ser exclusivos', }, dataEntryTables: { - "en-us": "Data Entry Tables", - "ru-ru": "Таблицы ввода данных", - "es-es": "Tablas de entrada de datos", - "fr-fr": "Tableaux de saisie de données", - "uk-ua": "Таблиці введення даних", - "de-ch": "Dateneingabetabellen", - "pt-br": "Tabelas de entrada de dados", + 'en-us': 'Data Entry Tables', + 'ru-ru': 'Таблицы ввода данных', + 'es-es': 'Tablas de entrada de datos', + 'fr-fr': 'Tableaux de saisie de données', + 'uk-ua': 'Таблиці введення даних', + 'de-ch': 'Dateneingabetabellen', + 'pt-br': 'Tabelas de entrada de dados', }, interactionsTables: { - "en-us": "Interactions Tables", - "ru-ru": "Таблицы взаимодействий", - "es-es": "Tablas de interacciones", - "fr-fr": "Tables d'interactions", - "uk-ua": "Таблиці взаємодій", - "de-ch": "Interaktionstabellen", - "pt-br": "Tabelas de Interações", + 'en-us': 'Interactions Tables', + 'ru-ru': 'Таблицы взаимодействий', + 'es-es': 'Tablas de interacciones', + 'fr-fr': "Tables d'interactions", + 'uk-ua': 'Таблиці взаємодій', + 'de-ch': 'Interaktionstabellen', + 'pt-br': 'Tabelas de Interações', }, otherXmlResource: { - "en-us": "Other XML Resource", - "ru-ru": "Выберите тип ресурса", - "es-es": "Otros recursos XML", - "fr-fr": "Autre ressource XML", - "uk-ua": "Інший XML-ресурс", - "de-ch": "Andere XML-Ressource", - "pt-br": "Outro recurso XML", + 'en-us': 'Other XML Resource', + 'ru-ru': 'Выберите тип ресурса', + 'es-es': 'Otros recursos XML', + 'fr-fr': 'Autre ressource XML', + 'uk-ua': 'Інший XML-ресурс', + 'de-ch': 'Andere XML-Ressource', + 'pt-br': 'Outro recurso XML', }, otherJsonResource: { - "en-us": "Other JSON Resource", - "ru-ru": "Другой ресурс JSON", - "es-es": "Otros recursos JSON", - "fr-fr": "Autre ressource JSON", - "uk-ua": "Інший JSON-ресурс", - "de-ch": "Andere JSON-Ressource", - "pt-br": "Outro recurso JSON", + 'en-us': 'Other JSON Resource', + 'ru-ru': 'Другой ресурс JSON', + 'es-es': 'Otros recursos JSON', + 'fr-fr': 'Autre ressource JSON', + 'uk-ua': 'Інший JSON-ресурс', + 'de-ch': 'Andere JSON-Ressource', + 'pt-br': 'Outro recurso JSON', }, otherPropertiesResource: { - "en-us": "Other Properties Resource", - "ru-ru": "Ресурс «Другие свойства»", - "es-es": "Recursos de otras propiedades", - "fr-fr": "Autres propriétés", - "uk-ua": "Ресурс інших властивостей", - "de-ch": "Andere Eigenschaften Ressource", - "pt-br": "Outros recursos de propriedades", + 'en-us': 'Other Properties Resource', + 'ru-ru': 'Ресурс «Другие свойства»', + 'es-es': 'Recursos de otras propiedades', + 'fr-fr': 'Autres propriétés', + 'uk-ua': 'Ресурс інших властивостей', + 'de-ch': 'Andere Eigenschaften Ressource', + 'pt-br': 'Outros recursos de propriedades', }, otherAppResource: { - "en-us": "Other Resource", - "ru-ru": "Другой ресурс", - "es-es": "Otros recursos", - "fr-fr": "Autre ressource", - "uk-ua": "Інший ресурс", - "de-ch": "Andere Ressource", - "pt-br": "Outros recursos", + 'en-us': 'Other Resource', + 'ru-ru': 'Другой ресурс', + 'es-es': 'Otros recursos', + 'fr-fr': 'Autre ressource', + 'uk-ua': 'Інший ресурс', + 'de-ch': 'Andere Ressource', + 'pt-br': 'Outros recursos', }, filters: { - "en-us": "Filters", - "ru-ru": "Фильтры", - "es-es": "Filtros", - "fr-fr": "Filtres", - "uk-ua": "Фільтри", - "de-ch": "Filter", - "pt-br": "Filtros", + 'en-us': 'Filters', + 'ru-ru': 'Фильтры', + 'es-es': 'Filtros', + 'fr-fr': 'Filtres', + 'uk-ua': 'Фільтри', + 'de-ch': 'Filter', + 'pt-br': 'Filtros', }, custom: { - "en-us": "Custom", - "ru-ru": "Обычай", - "es-es": "Costumbre", - "fr-fr": "Coutume", - "uk-ua": "Спеціальні", - "de-ch": "Individuell", - "pt-br": "Personalizado", + 'en-us': 'Custom', + 'ru-ru': 'Обычай', + 'es-es': 'Costumbre', + 'fr-fr': 'Coutume', + 'uk-ua': 'Спеціальні', + 'de-ch': 'Individuell', + 'pt-br': 'Personalizado', }, leafletLayers: { - "en-us": "Leaflet Layers", - "ru-ru": "Слои листовок", - "es-es": "Capas de los folletos", - "fr-fr": "Couches de folioles", - "uk-ua": "Шари листівок", - "de-ch": "Leaflet-Layer", - "pt-br": "Camadas de folhetos", + 'en-us': 'Leaflet Layers', + 'ru-ru': 'Слои листовок', + 'es-es': 'Capas de los folletos', + 'fr-fr': 'Couches de folioles', + 'uk-ua': 'Шари листівок', + 'de-ch': 'Leaflet-Layer', + 'pt-br': 'Camadas de folhetos', }, textEditor: { - "en-us": "Text Editor", - "ru-ru": "Текстовый редактор", - "es-es": "Editor de texto", - "fr-fr": "Éditeur de texte", - "uk-ua": "Текстовий редактор", - "de-ch": "Text-Editor", - "pt-br": "Editor de texto", + 'en-us': 'Text Editor', + 'ru-ru': 'Текстовый редактор', + 'es-es': 'Editor de texto', + 'fr-fr': 'Éditeur de texte', + 'uk-ua': 'Текстовий редактор', + 'de-ch': 'Text-Editor', + 'pt-br': 'Editor de texto', }, xmlEditor: { - "en-us": "XML Editor", - "ru-ru": "XML-редактор", - "es-es": "Editor XML", - "fr-fr": "Éditeur XML", - "uk-ua": "Редактор XML", - "de-ch": "XML-Editor", - "pt-br": "Editor XML", + 'en-us': 'XML Editor', + 'ru-ru': 'XML-редактор', + 'es-es': 'Editor XML', + 'fr-fr': 'Éditeur XML', + 'uk-ua': 'Редактор XML', + 'de-ch': 'XML-Editor', + 'pt-br': 'Editor XML', }, jsonEditor: { - "en-us": "JSON Editor", - "ru-ru": "Редактор JSON", - "es-es": "Editor JSON", - "fr-fr": "Éditeur JSON", - "uk-ua": "Редактор JSON", - "de-ch": "JSON-Editor", - "pt-br": "Editor JSON", + 'en-us': 'JSON Editor', + 'ru-ru': 'Редактор JSON', + 'es-es': 'Editor JSON', + 'fr-fr': 'Éditeur JSON', + 'uk-ua': 'Редактор JSON', + 'de-ch': 'JSON-Editor', + 'pt-br': 'Editor JSON', }, visualEditor: { - "en-us": "Visual Editor", - "ru-ru": "Визуальный редактор", - "es-es": "Editor visual", - "fr-fr": "Éditeur visuel", - "uk-ua": "Візуальний редактор", - "de-ch": "Visueller Editor", - "pt-br": "Editor Visual", + 'en-us': 'Visual Editor', + 'ru-ru': 'Визуальный редактор', + 'es-es': 'Editor visual', + 'fr-fr': 'Éditeur visuel', + 'uk-ua': 'Візуальний редактор', + 'de-ch': 'Visueller Editor', + 'pt-br': 'Editor Visual', }, selectResourceType: { - "en-us": "Select Resource Type", - "ru-ru": "Выберите тип ресурса", - "es-es": "Seleccionar el tipo de recurso", - "fr-fr": "Sélectionner le type de ressource", - "uk-ua": "Виберіть тип ресурсу", - "de-ch": "Ressourcentyp auswählen", - "pt-br": "Selecione o tipo de recurso", + 'en-us': 'Select Resource Type', + 'ru-ru': 'Выберите тип ресурса', + 'es-es': 'Seleccionar el tipo de recurso', + 'fr-fr': 'Sélectionner le type de ressource', + 'uk-ua': 'Виберіть тип ресурсу', + 'de-ch': 'Ressourcentyp auswählen', + 'pt-br': 'Selecione o tipo de recurso', }, globalPreferences: { - "en-us": "Global Preferences", - "ru-ru": "Глобальные настройки", - "es-es": "Preferencias globales", - "fr-fr": "Préférences globales", - "uk-ua": "Глобальні налаштування", - "de-ch": "Globale Einstellungen", - "pt-br": "Preferências globais", + 'en-us': 'Global Preferences', + 'ru-ru': 'Глобальные настройки', + 'es-es': 'Preferencias globales', + 'fr-fr': 'Préférences globales', + 'uk-ua': 'Глобальні налаштування', + 'de-ch': 'Globale Einstellungen', + 'pt-br': 'Preferências globais', }, remotePreferences: { - "en-us": "Remote Preferences", - "ru-ru": "Удаленные настройки", - "es-es": "Preferencias remotas", - "fr-fr": "Préférences à distance", - "uk-ua": "Віддалені параметри", - "de-ch": "Remote-Einstellungen", - "pt-br": "Preferências Remotas", + 'en-us': 'Remote Preferences', + 'ru-ru': 'Удаленные настройки', + 'es-es': 'Preferencias remotas', + 'fr-fr': 'Préférences à distance', + 'uk-ua': 'Віддалені параметри', + 'de-ch': 'Remote-Einstellungen', + 'pt-br': 'Preferências Remotas', }, failedParsingXml: { - "en-us": "Failed to parse XML", - "ru-ru": "Не удалось разобрать XML", - "de-ch": "XML konnte nicht analysiert werden", - "es-es": "No se pudo analizar XML", - "fr-fr": "Échec de l'analyse XML", - "uk-ua": "Не вдалося проаналізувати XML", - "pt-br": "Falha ao analisar XML", + 'en-us': 'Failed to parse XML', + 'ru-ru': 'Не удалось разобрать XML', + 'de-ch': 'XML konnte nicht analysiert werden', + 'es-es': 'No se pudo analizar XML', + 'fr-fr': "Échec de l'analyse XML", + 'uk-ua': 'Не вдалося проаналізувати XML', + 'pt-br': 'Falha ao analisar XML', }, name: { - "en-us": "Name", - "ru-ru": "Имя", - "de-ch": "Name", - "es-es": "Nombre", - "fr-fr": "Nom", - "uk-ua": "Ім'я", - "pt-br": "Nome", + 'en-us': 'Name', + 'ru-ru': 'Имя', + 'de-ch': 'Name', + 'es-es': 'Nombre', + 'fr-fr': 'Nom', + 'uk-ua': "Ім'я", + 'pt-br': 'Nome', }, title: { - "en-us": "Title", - "ru-ru": "Заголовок", - "de-ch": "Titel", - "es-es": "Título", - "fr-fr": "Titre", - "uk-ua": "Назва", - "pt-br": "Título", + 'en-us': 'Title', + 'ru-ru': 'Заголовок', + 'de-ch': 'Titel', + 'es-es': 'Título', + 'fr-fr': 'Titre', + 'uk-ua': 'Назва', + 'pt-br': 'Título', }, default: { - "en-us": "Default", - "ru-ru": "По умолчанию", - "de-ch": "Standard", - "es-es": "Por defecto", - "fr-fr": "Défaut", - "uk-ua": "За замовчуванням", - "pt-br": "Padrão", + 'en-us': 'Default', + 'ru-ru': 'По умолчанию', + 'de-ch': 'Standard', + 'es-es': 'Por defecto', + 'fr-fr': 'Défaut', + 'uk-ua': 'За замовчуванням', + 'pt-br': 'Padrão', }, separator: { - "en-us": "Separator", - "ru-ru": "Разделитель", - "de-ch": "Separator", - "es-es": "Separador", - "fr-fr": "Séparateur", - "uk-ua": "Роздільник", - "pt-br": "Separador", + 'en-us': 'Separator', + 'ru-ru': 'Разделитель', + 'de-ch': 'Separator', + 'es-es': 'Separador', + 'fr-fr': 'Séparateur', + 'uk-ua': 'Роздільник', + 'pt-br': 'Separador', }, suffix: { - "en-us": "Suffix", - "ru-ru": "Суффикс", - "de-ch": "Suffix", - "es-es": "Sufijo", - "fr-fr": "Suffixe", - "uk-ua": "Суфікс", - "pt-br": "Sufixo", + 'en-us': 'Suffix', + 'ru-ru': 'Суффикс', + 'de-ch': 'Suffix', + 'es-es': 'Sufijo', + 'fr-fr': 'Suffixe', + 'uk-ua': 'Суфікс', + 'pt-br': 'Sufixo', }, limit: { - "en-us": "Limit", - "ru-ru": "Лимит", - "de-ch": "Limit", - "es-es": "Límite", - "fr-fr": "Limite", - "uk-ua": "Ліміт", - "pt-br": "Limite", + 'en-us': 'Limit', + 'ru-ru': 'Лимит', + 'de-ch': 'Limit', + 'es-es': 'Límite', + 'fr-fr': 'Limite', + 'uk-ua': 'Ліміт', + 'pt-br': 'Limite', }, defaultInline: { - "en-us": "(default)", - "de-ch": "(Standard)", - "es-es": "(por defecto)", - "fr-fr": "(défaut)", - "ru-ru": "(по умолчанию)", - "uk-ua": "(за умовчанням)", - "pt-br": "(padrão)", + 'en-us': '(default)', + 'de-ch': '(Standard)', + 'es-es': '(por defecto)', + 'fr-fr': '(défaut)', + 'ru-ru': '(по умолчанию)', + 'uk-ua': '(за умовчанням)', + 'pt-br': '(padrão)', }, sortField: { - "en-us": "Sort Field", - "ru-ru": "Сортировать поле", - "de-ch": "Sortierfeld", - "es-es": "Campo de ordenación", - "fr-fr": "Champ de tri", - "uk-ua": "Поле сортування", - "pt-br": "Campo de classificação", + 'en-us': 'Sort Field', + 'ru-ru': 'Сортировать поле', + 'de-ch': 'Sortierfeld', + 'es-es': 'Campo de ordenación', + 'fr-fr': 'Champ de tri', + 'uk-ua': 'Поле сортування', + 'pt-br': 'Campo de classificação', }, preview: { - "en-us": "Preview", - "ru-ru": "Предварительный просмотр", - "de-ch": "Vorschau", - "es-es": "Avance", - "fr-fr": "Aperçu", - "uk-ua": "Попередній перегляд", - "pt-br": "Pré-visualização", + 'en-us': 'Preview', + 'ru-ru': 'Предварительный просмотр', + 'de-ch': 'Vorschau', + 'es-es': 'Avance', + 'fr-fr': 'Aperçu', + 'uk-ua': 'Попередній перегляд', + 'pt-br': 'Pré-visualização', }, previewExplainer: { - "en-us": "Search your collection records to preview the record formatter", - "de-ch": - "Durchsuchen Sie Ihre Sammlungsdatensätze, um eine Vorschau des Datensatzformatierers anzuzeigen", - "es-es": - "Busque en sus registros de colección para obtener una vista previa del formateador de registros", - "fr-fr": + 'en-us': 'Search your collection records to preview the record formatter', + 'de-ch': + 'Durchsuchen Sie Ihre Sammlungsdatensätze, um eine Vorschau des Datensatzformatierers anzuzeigen', + 'es-es': + 'Busque en sus registros de colección para obtener una vista previa del formateador de registros', + 'fr-fr': "Recherchez dans vos enregistrements de collection pour prévisualiser le formateur d'enregistrements", - "ru-ru": - "Выполните поиск в записях своей коллекции, чтобы просмотреть средство форматирования записей.", - "uk-ua": - "Виконайте пошук у своїх записах колекції, щоб переглянути інструмент форматування записів", - "pt-br": - "Pesquise os registros da sua coleção para visualizar o formatador de registros", + 'ru-ru': + 'Выполните поиск в записях своей коллекции, чтобы просмотреть средство форматирования записей.', + 'uk-ua': + 'Виконайте пошук у своїх записах колекції, щоб переглянути інструмент форматування записів', + 'pt-br': + 'Pesquise os registros da sua coleção para visualizar o formatador de registros', }, editorNotAvailable: { - "en-us": "Visual editor is not available for this resource", - "de-ch": "Für diese Ressource ist kein visueller Editor verfügbar", - "es-es": "El editor visual no está disponible para este recurso", - "fr-fr": "L'éditeur visuel n'est pas disponible pour cette ressource", - "ru-ru": "Визуальный редактор недоступен для этого ресурса.", - "uk-ua": "Візуальний редактор недоступний для цього ресурсу", - "pt-br": "O editor visual não está disponível para este recurso", + 'en-us': 'Visual editor is not available for this resource', + 'de-ch': 'Für diese Ressource ist kein visueller Editor verfügbar', + 'es-es': 'El editor visual no está disponible para este recurso', + 'fr-fr': "L'éditeur visuel n'est pas disponible pour cette ressource", + 'ru-ru': 'Визуальный редактор недоступен для этого ресурса.', + 'uk-ua': 'Візуальний редактор недоступний для цього ресурсу', + 'pt-br': 'O editor visual não está disponível para este recurso', }, definition: { - "en-us": "Definition", - "de-ch": "Definition", - "es-es": "Definición", - "fr-fr": "Définition", - "ru-ru": "Определение", - "uk-ua": "Визначення", - "pt-br": "Definição", + 'en-us': 'Definition', + 'de-ch': 'Definition', + 'es-es': 'Definición', + 'fr-fr': 'Définition', + 'ru-ru': 'Определение', + 'uk-ua': 'Визначення', + 'pt-br': 'Definição', }, addDefinition: { - "en-us": "Add definition", - "de-ch": "Definition hinzufügen", - "es-es": "Añadir definición", - "fr-fr": "Ajouter une définition", - "ru-ru": "Добавить определение", - "uk-ua": "Додайте визначення", - "pt-br": "Adicionar definição", + 'en-us': 'Add definition', + 'de-ch': 'Definition hinzufügen', + 'es-es': 'Añadir definición', + 'fr-fr': 'Ajouter une définition', + 'ru-ru': 'Добавить определение', + 'uk-ua': 'Додайте визначення', + 'pt-br': 'Adicionar definição', }, deleteDefinition: { - "en-us": "Delete definition", - "de-ch": "Definition löschen", - "es-es": "Eliminar definición", - "fr-fr": "Supprimer la définition", - "ru-ru": "Удалить определение", - "uk-ua": "Видалити визначення", - "pt-br": "Excluir definição", + 'en-us': 'Delete definition', + 'de-ch': 'Definition löschen', + 'es-es': 'Eliminar definición', + 'fr-fr': 'Supprimer la définition', + 'ru-ru': 'Удалить определение', + 'uk-ua': 'Видалити визначення', + 'pt-br': 'Excluir definição', }, urlPart: { - "en-us": "URL part", - "de-ch": "URL-Teil", - "es-es": "Parte de la URL", - "fr-fr": "partie URL", - "ru-ru": "Другой ресурс JSON", - "uk-ua": "URL-адреса", - "pt-br": "Parte da URL", + 'en-us': 'URL part', + 'de-ch': 'URL-Teil', + 'es-es': 'Parte de la URL', + 'fr-fr': 'partie URL', + 'ru-ru': 'Другой ресурс JSON', + 'uk-ua': 'URL-адреса', + 'pt-br': 'Parte da URL', }, addField: { - "en-us": "Add field", - "de-ch": "Feld hinzufügen", - "es-es": "Agregar campo", - "fr-fr": "Ajouter un champ", - "ru-ru": "Добавить поле", - "uk-ua": "Додати поле", - "pt-br": "Adicionar campo", + 'en-us': 'Add field', + 'de-ch': 'Feld hinzufügen', + 'es-es': 'Agregar campo', + 'fr-fr': 'Ajouter un champ', + 'ru-ru': 'Добавить поле', + 'uk-ua': 'Додати поле', + 'pt-br': 'Adicionar campo', }, thisField: { - "en-us": "This field", - "de-ch": "Dieses Feld", - "es-es": "Este campo", - "fr-fr": "Ce champ", - "ru-ru": "Это поле", - "uk-ua": "Це поле", - "pt-br": "Este campo", + 'en-us': 'This field', + 'de-ch': 'Dieses Feld', + 'es-es': 'Este campo', + 'fr-fr': 'Ce champ', + 'ru-ru': 'Это поле', + 'uk-ua': 'Це поле', + 'pt-br': 'Este campo', }, selectTableFirst: { - "en-us": "Select table first", - "de-ch": "Wählen Sie zuerst die Tabelle aus", - "es-es": "Seleccione la tabla primero", - "fr-fr": "Sélectionnez d'abord la table", - "ru-ru": "Сначала выберите таблицу", - "uk-ua": "Спочатку виберіть таблицю", - "pt-br": "Selecione a tabela primeiro", + 'en-us': 'Select table first', + 'de-ch': 'Wählen Sie zuerst die Tabelle aus', + 'es-es': 'Seleccione la tabla primero', + 'fr-fr': "Sélectionnez d'abord la table", + 'ru-ru': 'Сначала выберите таблицу', + 'uk-ua': 'Спочатку виберіть таблицю', + 'pt-br': 'Selecione a tabela primeiro', }, conditionFieldValue: { - "en-us": "Condition Field Value", - "de-ch": "Bedingungsfeldwert", - "es-es": "Valor del campo de condición", - "fr-fr": "Valeur du champ de condition", - "ru-ru": "Значение поля условия", - "uk-ua": "Умова Значення поля", - "pt-br": "Valor do campo de condição", + 'en-us': 'Condition Field Value', + 'de-ch': 'Bedingungsfeldwert', + 'es-es': 'Valor del campo de condición', + 'fr-fr': 'Valeur du champ de condition', + 'ru-ru': 'Значение поля условия', + 'uk-ua': 'Умова Значення поля', + 'pt-br': 'Valor do campo de condição', }, conditionDescription: { - "en-us": - "This format will be used only if the condition field value equals this condition and is not null.", - "de-ch": - "Dieses Format wird nur verwendet, wenn der Wert des Bedingungsfelds dieser Bedingung entspricht und nicht null ist.", - "es-es": - "Este formato se utilizará solo si el valor del campo de condición es igual a esta condición y no es nulo.", - "fr-fr": + 'en-us': + 'This format will be used only if the condition field value equals this condition and is not null.', + 'de-ch': + 'Dieses Format wird nur verwendet, wenn der Wert des Bedingungsfelds dieser Bedingung entspricht und nicht null ist.', + 'es-es': + 'Este formato se utilizará solo si el valor del campo de condición es igual a esta condición y no es nulo.', + 'fr-fr': "Ce format sera utilisé uniquement si la valeur du champ de condition est égale à cette condition et n'est pas nulle.", - "ru-ru": - "Этот формат будет использоваться только в том случае, если значение поля условия равно этому условию и не равно нулю.", - "uk-ua": - "Цей формат використовуватиметься, лише якщо значення поля умови дорівнює цій умові й не є нульовим.", - "pt-br": - "Este formato será usado somente se o valor do campo de condição for igual a esta condição e não for nulo.", + 'ru-ru': + 'Этот формат будет использоваться только в том случае, если значение поля условия равно этому условию и не равно нулю.', + 'uk-ua': + 'Цей формат використовуватиметься, лише якщо значення поля умови дорівнює цій умові й не є нульовим.', + 'pt-br': + 'Este formato será usado somente se o valor do campo de condição for igual a esta condição e não for nulo.', }, wrongScopeWarning: { - "en-us": + 'en-us': "This resource belongs to a different collection/discipline than the one you are currently in. It's recommended to switch collection before editing this resource", - "de-ch": - "Diese Ressource gehört zu einer anderen Sammlung/Disziplin als der, in der Sie sich gerade befinden. Es wird empfohlen, die Sammlung zu wechseln, bevor Sie diese Ressource bearbeiten.", - "es-es": - "Este recurso pertenece a una colección/disciplina diferente a la que estás actualmente. Se recomienda cambiar de colección antes de editar este recurso.", - "fr-fr": - "Cette ressource appartient à une collection/discipline différente de celle dans laquelle vous vous trouvez actuellement. Il est recommandé de changer de collection avant de modifier cette ressource.", - "ru-ru": - "Этот ресурс принадлежит к другой коллекции/дисциплине, отличной от той, в которой вы сейчас находитесь. Перед редактированием этого ресурса рекомендуется сменить коллекцию.", - "uk-ua": - "Цей ресурс належить до іншої колекції/дисципліни, ніж та, у якій ви зараз перебуваєте. Рекомендовано змінити колекцію перед редагуванням цього ресурсу", - "pt-br": - "Este recurso pertence a uma coleção/disciplina diferente daquela em que você está atualmente. É recomendável trocar de coleção antes de editar este recurso.", + 'de-ch': + 'Diese Ressource gehört zu einer anderen Sammlung/Disziplin als der, in der Sie sich gerade befinden. Es wird empfohlen, die Sammlung zu wechseln, bevor Sie diese Ressource bearbeiten.', + 'es-es': + 'Este recurso pertenece a una colección/disciplina diferente a la que estás actualmente. Se recomienda cambiar de colección antes de editar este recurso.', + 'fr-fr': + 'Cette ressource appartient à une collection/discipline différente de celle dans laquelle vous vous trouvez actuellement. Il est recommandé de changer de collection avant de modifier cette ressource.', + 'ru-ru': + 'Этот ресурс принадлежит к другой коллекции/дисциплине, отличной от той, в которой вы сейчас находитесь. Перед редактированием этого ресурса рекомендуется сменить коллекцию.', + 'uk-ua': + 'Цей ресурс належить до іншої колекції/дисципліни, ніж та, у якій ви зараз перебуваєте. Рекомендовано змінити колекцію перед редагуванням цього ресурсу', + 'pt-br': + 'Este recurso pertence a uma coleção/disciplina diferente daquela em que você está atualmente. É recomendável trocar de coleção antes de editar este recurso.', }, thisFieldName: { - "en-us": "This field name (for preview purposes only)", - "de-ch": "Dieser Feldname (nur für Vorschauzwecke)", - "es-es": "Este nombre de campo (solo para fines de vista previa)", - "fr-fr": "Ce nom de champ (à des fins d'aperçu uniquement)", - "ru-ru": "Имя этого поля (только для целей предварительного просмотра)", - "uk-ua": "Назва цього поля (лише для попереднього перегляду)", - "pt-br": "Este nome de campo (apenas para fins de visualização)", + 'en-us': 'This field name (for preview purposes only)', + 'de-ch': 'Dieser Feldname (nur für Vorschauzwecke)', + 'es-es': 'Este nombre de campo (solo para fines de vista previa)', + 'fr-fr': "Ce nom de champ (à des fins d'aperçu uniquement)", + 'ru-ru': 'Имя этого поля (только для целей предварительного просмотра)', + 'uk-ua': 'Назва цього поля (лише для попереднього перегляду)', + 'pt-br': 'Este nome de campo (apenas para fins de visualização)', }, publishEveryDays: { - "en-us": "Publish every N days", - "de-ch": "Alle N Tage veröffentlichen", - "es-es": "Publicar cada N días", - "fr-fr": "Publier tous les N jours", - "ru-ru": "Публиковать каждые N дней", - "uk-ua": "Публікуйте кожні N днів", - "pt-br": "Publicar a cada N dias", + 'en-us': 'Publish every N days', + 'de-ch': 'Alle N Tage veröffentlichen', + 'es-es': 'Publicar cada N días', + 'fr-fr': 'Publier tous les N jours', + 'ru-ru': 'Публиковать каждые N дней', + 'uk-ua': 'Публікуйте кожні N днів', + 'pt-br': 'Publicar a cada N dias', }, publish: { - "en-us": "Publish", - "de-ch": "Veröffentlichen", - "es-es": "Publicar", - "fr-fr": "Publier", - "ru-ru": "Публиковать", - "uk-ua": "Опублікувати", - "pt-br": "Publicar", + 'en-us': 'Publish', + 'de-ch': 'Veröffentlichen', + 'es-es': 'Publicar', + 'fr-fr': 'Publier', + 'ru-ru': 'Публиковать', + 'uk-ua': 'Опублікувати', + 'pt-br': 'Publicar', }, fileName: { - "en-us": "File name", - "de-ch": "Dateiname", - "es-es": "Nombre del archivo", - "fr-fr": "Nom de fichier", - "ru-ru": "Сначала выберите таблицу", - "uk-ua": "Ім'я файлу", - "pt-br": "Nome do arquivo", + 'en-us': 'File name', + 'de-ch': 'Dateiname', + 'es-es': 'Nombre del archivo', + 'fr-fr': 'Nom de fichier', + 'ru-ru': 'Сначала выберите таблицу', + 'uk-ua': "Ім'я файлу", + 'pt-br': 'Nome do arquivo', }, runAsUser: { - "en-us": "Run as user", - "de-ch": "Als Benutzer ausführen", - "es-es": "Ejecutar como usuario", - "fr-fr": "Exécuter en tant qu'utilisateur", - "ru-ru": "Запуск от имени пользователя", - "uk-ua": "Запуск від імені користувача", - "pt-br": "Executar como usuário", + 'en-us': 'Run as user', + 'de-ch': 'Als Benutzer ausführen', + 'es-es': 'Ejecutar como usuario', + 'fr-fr': "Exécuter en tant qu'utilisateur", + 'ru-ru': 'Запуск от имени пользователя', + 'uk-ua': 'Запуск від імені користувача', + 'pt-br': 'Executar como usuário', }, notifyUser: { - "en-us": "Send completion notification to user", - "de-ch": "Abschlussbenachrichtigung an Benutzer senden", - "es-es": "Enviar notificación de finalización al usuario", - "fr-fr": "Envoyer une notification d'achèvement à l'utilisateur", - "ru-ru": "Отправить уведомление о завершении пользователю", - "uk-ua": "Надіслати сповіщення про завершення користувачеві", - "pt-br": "Enviar notificação de conclusão ao usuário", + 'en-us': 'Send completion notification to user', + 'de-ch': 'Abschlussbenachrichtigung an Benutzer senden', + 'es-es': 'Enviar notificación de finalización al usuario', + 'fr-fr': "Envoyer une notification d'achèvement à l'utilisateur", + 'ru-ru': 'Отправить уведомление о завершении пользователю', + 'uk-ua': 'Надіслати сповіщення про завершення користувачеві', + 'pt-br': 'Enviar notificação de conclusão ao usuário', }, runInCollection: { - "en-us": "Run in collection", - "de-ch": "In der Sammlung ausführen", - "es-es": "Correr en colección", - "fr-fr": "Exécution en collection", - "ru-ru": "Запустить в коллекцию", - "uk-ua": "Запустити в колекції", - "pt-br": "Executar na coleção", + 'en-us': 'Run in collection', + 'de-ch': 'In der Sammlung ausführen', + 'es-es': 'Correr en colección', + 'fr-fr': 'Exécution en collection', + 'ru-ru': 'Запустить в коллекцию', + 'uk-ua': 'Запустити в колекції', + 'pt-br': 'Executar na coleção', }, createNewForm: { - "en-us": "Create a new view definition", - "de-ch": "Erstellen einer neuen Ansichtsdefinition", - "es-es": "Crear una nueva definición de vista", - "fr-fr": "Créer une nouvelle définition de vue", - "ru-ru": "Создайте новое определение представления", - "uk-ua": "Створіть нове визначення подання", - "pt-br": "Criar uma nova definição de visualização", + 'en-us': 'Create a new view definition', + 'de-ch': 'Erstellen einer neuen Ansichtsdefinition', + 'es-es': 'Crear una nueva definición de vista', + 'fr-fr': 'Créer une nouvelle définition de vue', + 'ru-ru': 'Создайте новое определение представления', + 'uk-ua': 'Створіть нове визначення подання', + 'pt-br': 'Criar uma nova definição de visualização', }, copyFromExistingForm: { - "en-us": "Copy existing view definition", - "de-ch": "Vorhandene Ansichtsdefinition kopieren", - "es-es": "Copiar la definición de vista existente", - "fr-fr": "Copier la définition de vue existante", - "ru-ru": "Копировать существующее определение представления", - "uk-ua": "Копіювати існуюче визначення перегляду", - "pt-br": "Copiar definição de visualização existente", + 'en-us': 'Copy existing view definition', + 'de-ch': 'Vorhandene Ansichtsdefinition kopieren', + 'es-es': 'Copiar la definición de vista existente', + 'fr-fr': 'Copier la définition de vue existante', + 'ru-ru': 'Копировать существующее определение представления', + 'uk-ua': 'Копіювати існуюче визначення перегляду', + 'pt-br': 'Copiar definição de visualização existente', }, copyDefaultForm: { - "en-us": "Copy default view definition", - "de-ch": "Standardansichtsdefinition kopieren", - "es-es": "Copiar la definición de vista predeterminada", - "fr-fr": "Copier la définition de la vue par défaut", - "ru-ru": "Форматеры записи", - "uk-ua": "Формати записів", - "pt-br": "Copiar definição de visualização padrão", + 'en-us': 'Copy default view definition', + 'de-ch': 'Standardansichtsdefinition kopieren', + 'es-es': 'Copiar la definición de vista predeterminada', + 'fr-fr': 'Copier la définition de la vue par défaut', + 'ru-ru': 'Форматеры записи', + 'uk-ua': 'Формати записів', + 'pt-br': 'Copiar definição de visualização padrão', }, copyDefaultForms: { - "en-us": "Copy default forms", - "de-ch": "Standardformulare kopieren", - "es-es": "Copiar formularios predeterminados", - "fr-fr": "Copier les formulaires par défaut", - "ru-ru": "Копировать формы по умолчанию", - "uk-ua": "Копіювати стандартні форми", - "pt-br": "Copiar formulários padrão", + 'en-us': 'Copy default forms', + 'de-ch': 'Standardformulare kopieren', + 'es-es': 'Copiar formularios predeterminados', + 'fr-fr': 'Copier les formulaires par défaut', + 'ru-ru': 'Копировать формы по умолчанию', + 'uk-ua': 'Копіювати стандартні форми', + 'pt-br': 'Copiar formulários padrão', }, saveFormFirst: { - "en-us": "Save form first", - "de-ch": "Formular zuerst speichern", - "es-es": "Guarde el formulario primero", - "fr-fr": "Enregistrer d'abord le formulaire", - "ru-ru": "Сначала сохраните форму", - "uk-ua": "Спочатку збережіть форму", - "pt-br": "Salve o formulário primeiro", + 'en-us': 'Save form first', + 'de-ch': 'Formular zuerst speichern', + 'es-es': 'Guarde el formulario primero', + 'fr-fr': "Enregistrer d'abord le formulaire", + 'ru-ru': 'Сначала сохраните форму', + 'uk-ua': 'Спочатку збережіть форму', + 'pt-br': 'Salve o formulário primeiro', }, saveFormFirstDescription: { - "en-us": "You need to save this form before you edit another one", - "de-ch": - "Sie müssen dieses Formular speichern, bevor Sie ein anderes bearbeiten", - "es-es": "Debes guardar este formulario antes de editar otro.", - "fr-fr": + 'en-us': 'You need to save this form before you edit another one', + 'de-ch': + 'Sie müssen dieses Formular speichern, bevor Sie ein anderes bearbeiten', + 'es-es': 'Debes guardar este formulario antes de editar otro.', + 'fr-fr': "Vous devez enregistrer ce formulaire avant d'en modifier un autre.", - "ru-ru": - "Вам необходимо сохранить эту форму, прежде чем редактировать другую.", - "uk-ua": "Вам потрібно зберегти цю форму, перш ніж редагувати іншу", - "pt-br": "Você precisa salvar este formulário antes de editar outro", + 'ru-ru': + 'Вам необходимо сохранить эту форму, прежде чем редактировать другую.', + 'uk-ua': 'Вам потрібно зберегти цю форму, перш ніж редагувати іншу', + 'pt-br': 'Você precisa salvar este formulário antes de editar outro', }, conditionalFormatter: { - "en-us": "Conditional Format", - "de-ch": "Bedingtes Format", - "es-es": "Formato condicional", - "fr-fr": "Format conditionnel", - "ru-ru": "Условный формат", - "uk-ua": "Умовний формат", - "pt-br": "Formato condicional", + 'en-us': 'Conditional Format', + 'de-ch': 'Bedingtes Format', + 'es-es': 'Formato condicional', + 'fr-fr': 'Format conditionnel', + 'ru-ru': 'Условный формат', + 'uk-ua': 'Умовний формат', + 'pt-br': 'Formato condicional', }, customizeFieldFormatters: { - "en-us": "Customize Field Formats", - "de-ch": "Feldformate anpassen", - "es-es": "Personalizar formatos de campo", - "fr-fr": "Personnaliser les formats de champ", - "ru-ru": "Настройте форматы полей", - "uk-ua": "Налаштувати формати полів", - "pt-br": "Personalizar formatos de campo", + 'en-us': 'Customize Field Formats', + 'de-ch': 'Feldformate anpassen', + 'es-es': 'Personalizar formatos de campo', + 'fr-fr': 'Personnaliser les formats de champ', + 'ru-ru': 'Настройте форматы полей', + 'uk-ua': 'Налаштувати формати полів', + 'pt-br': 'Personalizar formatos de campo', }, expandConditionalField: { - "en-us": "Expand Conditional Field", - "de-ch": "Bedingtes Feld erweitern", - "es-es": "Expandir campo condicional", - "fr-fr": "Développer le champ conditionnel", - "ru-ru": "Развернуть условное поле", - "uk-ua": "Розгорнути умовне поле", - "pt-br": "Expandir campo condicional", + 'en-us': 'Expand Conditional Field', + 'de-ch': 'Bedingtes Feld erweitern', + 'es-es': 'Expandir campo condicional', + 'fr-fr': 'Développer le champ conditionnel', + 'ru-ru': 'Развернуть условное поле', + 'uk-ua': 'Розгорнути умовне поле', + 'pt-br': 'Expandir campo condicional', }, collapseConditionalField: { - "en-us": "Collapse Conditional Field", - "de-ch": "Bedingtes Feld reduzieren", - "es-es": "Contraer campo condicional", - "fr-fr": "Champ conditionnel de réduction", - "ru-ru": "Свернуть условное поле", - "uk-ua": "Згорнути умовне поле", - "pt-br": "Recolher campo condicional", + 'en-us': 'Collapse Conditional Field', + 'de-ch': 'Bedingtes Feld reduzieren', + 'es-es': 'Contraer campo condicional', + 'fr-fr': 'Champ conditionnel de réduction', + 'ru-ru': 'Свернуть условное поле', + 'uk-ua': 'Згорнути умовне поле', + 'pt-br': 'Recolher campo condicional', }, conditionalFieldValue: { - "en-us": "Conditional Field Value", - "de-ch": "Bedingter Feldwert", - "es-es": "Valor de campo condicional", - "fr-fr": "Valeur du champ conditionnel", - "ru-ru": "Условное значение поля", - "uk-ua": "Умовне значення поля", - "pt-br": "Valor do campo condicional", + 'en-us': 'Conditional Field Value', + 'de-ch': 'Bedingter Feldwert', + 'es-es': 'Valor de campo condicional', + 'fr-fr': 'Valeur du champ conditionnel', + 'ru-ru': 'Условное значение поля', + 'uk-ua': 'Умовне значення поля', + 'pt-br': 'Valor do campo condicional', }, formatPreview: { - "en-us": "Format Preview", - "de-ch": "Formatvorschau", - "es-es": "Vista previa del formato", - "fr-fr": "Aperçu du format", - "ru-ru": "Предварительный просмотр формата", - "uk-ua": "Попередній перегляд формату", - "pt-br": "Visualização do formato", + 'en-us': 'Format Preview', + 'de-ch': 'Formatvorschau', + 'es-es': 'Vista previa del formato', + 'fr-fr': 'Aperçu du format', + 'ru-ru': 'Предварительный просмотр формата', + 'uk-ua': 'Попередній перегляд формату', + 'pt-br': 'Visualização do formato', }, currentDeterminationRequired: { - "en-us": "A current determination is required.", - "de-ch": "Eine aktuelle Feststellung ist erforderlich.", - "es-es": "Se requiere una determinación actual.", - "fr-fr": "Une détermination actuelle est requise.", - "ru-ru": "Требуется текущее определение.", - "uk-ua": "Потрібне поточне визначення.", - "pt-br": "É necessária uma determinação atual.", + 'en-us': 'A current determination is required.', + 'de-ch': 'Eine aktuelle Feststellung ist erforderlich.', + 'es-es': 'Se requiere una determinación actual.', + 'fr-fr': 'Une détermination actuelle est requise.', + 'ru-ru': 'Требуется текущее определение.', + 'uk-ua': 'Потрібне поточне визначення.', + 'pt-br': 'É necessária uma determinação atual.', }, cogAddedToItself: { - "en-us": "A COG cannot be added to itself.", - "de-ch": "Ein Schwerpunkt kann nicht zu sich selbst addiert werden.", - "es-es": "No se puede agregar un COG a sí mismo.", - "fr-fr": "Un COG ne peut pas être ajouté à lui-même.", - "pt-br": "Um COG não pode ser adicionado a si mesmo.", - "ru-ru": "COG не может быть сложен сам с собой.", - "uk-ua": "COG не можна додати до самого себе.", + 'en-us': 'A COG cannot be added to itself.', + 'de-ch': 'Ein Schwerpunkt kann nicht zu sich selbst addiert werden.', + 'es-es': 'No se puede agregar un COG a sí mismo.', + 'fr-fr': 'Un COG ne peut pas être ajouté à lui-même.', + 'pt-br': 'Um COG não pode ser adicionado a si mesmo.', + 'ru-ru': 'COG не может быть сложен сам с собой.', + 'uk-ua': 'COG не можна додати до самого себе.', }, primaryCogChildRequired: { - "en-us": - "A Consolidated Collection Object Group must have a primary Collection Object child", - "de-ch": - "Eine konsolidierte Sammlungsobjektgruppe muss ein primäres Sammlungsobjekt-Unterobjekt haben", - "es-es": - "Un grupo de objetos de colección consolidada debe tener un objeto de colección secundario principal", - "fr-fr": + 'en-us': + 'A Consolidated Collection Object Group must have a primary Collection Object child', + 'de-ch': + 'Eine konsolidierte Sammlungsobjektgruppe muss ein primäres Sammlungsobjekt-Unterobjekt haben', + 'es-es': + 'Un grupo de objetos de colección consolidada debe tener un objeto de colección secundario principal', + 'fr-fr': "Un groupe d'objets de collection consolidé doit avoir un objet de collection enfant principal", - "pt-br": - "Um Grupo de Objetos de Coleção Consolidada deve ter um Objeto de Coleção primário filho", - "ru-ru": - "Группа объектов консолидированной коллекции должна иметь основной дочерний объект коллекции.", - "uk-ua": + 'pt-br': + 'Um Grupo de Objetos de Coleção Consolidada deve ter um Objeto de Coleção primário filho', + 'ru-ru': + 'Группа объектов консолидированной коллекции должна иметь основной дочерний объект коллекции.', + 'uk-ua': "Консолідована група об'єктів колекції повинна мати дочірній об'єкт первинної колекції", }, deletePrimaryRecord: { - "en-us": "Primary record CO cannot be deleted.", - "de-ch": "Primärdatensatz CO kann nicht gelöscht werden.", - "es-es": "El registro primario CO no se puede eliminar.", - "fr-fr": "L'enregistrement principal CO ne peut pas être supprimé.", - "pt-br": "O registro primário CO não pode ser excluído.", - "ru-ru": "Первичная запись CO не может быть удалена.", - "uk-ua": "Основний запис CO неможливо видалити.", + 'en-us': 'Primary record CO cannot be deleted.', + 'de-ch': 'Primärdatensatz CO kann nicht gelöscht werden.', + 'es-es': 'El registro primario CO no se puede eliminar.', + 'fr-fr': "L'enregistrement principal CO ne peut pas être supprimé.", + 'pt-br': 'O registro primário CO não pode ser excluído.', + 'ru-ru': 'Первичная запись CO не может быть удалена.', + 'uk-ua': 'Основний запис CO неможливо видалити.', }, deleteLoanedPrep: { - "en-us": "A loaned preparation cannot be deleted", - "de-ch": "Eine ausgeliehene Zubereitung kann nicht gelöscht werden", - "es-es": "Una preparación prestada no se puede eliminar", - "fr-fr": "Une préparation prêtée ne peut pas être supprimée", - "pt-br": "Uma preparação emprestada não pode ser excluída", - "ru-ru": "Заимствованный препарат не может быть удален", - "uk-ua": "Позичений препарат не можна видалити", + 'en-us': 'A loaned preparation cannot be deleted', + 'de-ch': 'Eine ausgeliehene Zubereitung kann nicht gelöscht werden', + 'es-es': 'Una preparación prestada no se puede eliminar', + 'fr-fr': 'Une préparation prêtée ne peut pas être supprimée', + 'pt-br': 'Uma preparação emprestada não pode ser excluída', + 'ru-ru': 'Заимствованный препарат не может быть удален', + 'uk-ua': 'Позичений препарат не можна видалити', }, deleteGiftedPrep: { - "en-us": "A gifted preparation cannot be deleted", - "de-ch": "Eine geschenkte Vorbereitung kann nicht gelöscht werden", - "es-es": "Una preparación dotada no se puede eliminar", - "fr-fr": "Une préparation surdouée ne peut pas être supprimée", - "pt-br": "Uma preparação talentosa não pode ser apagada", - "ru-ru": "Подаренный препарат не может быть удален", - "uk-ua": "Подарований препарат не можна видалити", + 'en-us': 'A gifted preparation cannot be deleted', + 'de-ch': 'Eine geschenkte Vorbereitung kann nicht gelöscht werden', + 'es-es': 'Una preparación dotada no se puede eliminar', + 'fr-fr': 'Une préparation surdouée ne peut pas être supprimée', + 'pt-br': 'Uma preparação talentosa não pode ser apagada', + 'ru-ru': 'Подаренный препарат не может быть удален', + 'uk-ua': 'Подарований препарат не можна видалити', }, deleteDisposedPrep: { - "en-us": "A disposed preparation cannot be deleted", - "de-ch": "Eine entsorgte Zubereitung kann nicht gelöscht werden", - "es-es": "Una preparación desechada no se puede eliminar", - "fr-fr": "Une préparation éliminée ne peut pas être supprimée", - "pt-br": "Uma preparação descartada não pode ser excluída", - "ru-ru": "Утилизированный препарат не может быть удален", - "uk-ua": "Викинутий препарат не можна видалити", + 'en-us': 'A disposed preparation cannot be deleted', + 'de-ch': 'Eine entsorgte Zubereitung kann nicht gelöscht werden', + 'es-es': 'Una preparación desechada no se puede eliminar', + 'fr-fr': 'Une préparation éliminée ne peut pas être supprimée', + 'pt-br': 'Uma preparação descartada não pode ser excluída', + 'ru-ru': 'Утилизированный препарат не может быть удален', + 'uk-ua': 'Викинутий препарат не можна видалити', }, deleteExchangeOutPrep: { - "en-us": "A exchanged out preparation cannot be deleted", - "de-ch": "Ein ausgetauschtes Präparat kann nicht gelöscht werden", - "es-es": "No se puede eliminar una preparación intercambiada", - "fr-fr": "Une préparation échangée ne peut pas être supprimée", - "pt-br": "Uma preparação trocada não pode ser excluída", - "ru-ru": "Замененный препарат не может быть удален.", - "uk-ua": "Обмінений препарат не можна видалити", + 'en-us': 'A exchanged out preparation cannot be deleted', + 'de-ch': 'Ein ausgetauschtes Präparat kann nicht gelöscht werden', + 'es-es': 'No se puede eliminar una preparación intercambiada', + 'fr-fr': 'Une préparation échangée ne peut pas être supprimée', + 'pt-br': 'Uma preparação trocada não pode ser excluída', + 'ru-ru': 'Замененный препарат не может быть удален.', + 'uk-ua': 'Обмінений препарат не можна видалити', }, deleteExchangeInPrep: { - "en-us": "A exchanged in preparation cannot be deleted", - "de-ch": - "Ein in Vorbereitung befindlicher Austausch kann nicht gelöscht werden", - "es-es": "No se puede eliminar un intercambio en preparación", - "fr-fr": "Un échange en préparation ne peut pas être supprimé", - "pt-br": "Uma troca em preparação não pode ser excluída", - "ru-ru": "Обмен в стадии подготовки не может быть удален", - "uk-ua": "Обмін, що готується, не можна видалити", + 'en-us': 'A exchanged in preparation cannot be deleted', + 'de-ch': + 'Ein in Vorbereitung befindlicher Austausch kann nicht gelöscht werden', + 'es-es': 'No se puede eliminar un intercambio en preparación', + 'fr-fr': 'Un échange en préparation ne peut pas être supprimé', + 'pt-br': 'Uma troca em preparação não pode ser excluída', + 'ru-ru': 'Обмен в стадии подготовки не может быть удален', + 'uk-ua': 'Обмін, що готується, не можна видалити', }, invalidDeterminationTaxon: { - "en-us": - "Determination does not belong to the taxon tree associated with the Collection Object Type", - "de-ch": - "Die Bestimmung gehört nicht zum Taxonbaum, der mit dem Sammlungsobjekttyp verknüpft ist", - "es-es": - "La determinación no pertenece al árbol taxonómico asociado con el tipo de objeto de colección", - "fr-fr": + 'en-us': + 'Determination does not belong to the taxon tree associated with the Collection Object Type', + 'de-ch': + 'Die Bestimmung gehört nicht zum Taxonbaum, der mit dem Sammlungsobjekttyp verknüpft ist', + 'es-es': + 'La determinación no pertenece al árbol taxonómico asociado con el tipo de objeto de colección', + 'fr-fr': "La détermination n'appartient pas à l'arbre taxonomique associé au type d'objet de collection", - "pt-br": - "A determinação não pertence à árvore de táxons associada ao Tipo de Objeto de Coleção", - "ru-ru": - "Определение не принадлежит к таксонному дереву, связанному с типом объекта коллекции.", - "uk-ua": + 'pt-br': + 'A determinação não pertence à árvore de táxons associada ao Tipo de Objeto de Coleção', + 'ru-ru': + 'Определение не принадлежит к таксонному дереву, связанному с типом объекта коллекции.', + 'uk-ua': "Визначення не належить до дерева таксонів, пов'язаного з типом об'єкта колекції", }, invalidNameTaxon: { - "en-us": - "{taxonName: string} does not belong to the {taxonTableLabel: string} tree associated with {typeName: string}", - "de-ch": - "{taxonName: string} gehört nicht zum {taxonTableLabel: string}-Baum, der mit {typeName: string} verknüpft ist", - "es-es": - "{taxonName: string} no pertenece al árbol {taxonTableLabel: string} asociado con {typeName: string}", - "fr-fr": + 'en-us': + '{taxonName: string} does not belong to the {taxonTableLabel: string} tree associated with {typeName: string}', + 'de-ch': + '{taxonName: string} gehört nicht zum {taxonTableLabel: string}-Baum, der mit {typeName: string} verknüpft ist', + 'es-es': + '{taxonName: string} no pertenece al árbol {taxonTableLabel: string} asociado con {typeName: string}', + 'fr-fr': "{taxonName: string} n'appartient pas à l'arbre {taxonTableLabel: string} associé à {typeName: string}", - "pt-br": - "{taxonName: string} não pertence à árvore {taxonTableLabel: string} associada a {typeName: string}", - "ru-ru": - "{taxonName: string} не принадлежит дереву {taxonTableLabel: string}, связанному с {typeName: string}", - "uk-ua": + 'pt-br': + '{taxonName: string} não pertence à árvore {taxonTableLabel: string} associada a {typeName: string}', + 'ru-ru': + '{taxonName: string} не принадлежит дереву {taxonTableLabel: string}, связанному с {typeName: string}', + 'uk-ua': "{taxonName: string} не належить до дерева {taxonTableLabel: string}, пов'язаного з {typeName: string}", }, catalogNumberAlreadyUsed: { - "en-us": - "{catalogNumberFieldName: string} {catalogNumber: string} is already in use for another Component or Collection Object in this collection.", - "de-ch": - "{catalogNumberFieldName: string} {catalogNumber: string} wird bereits für eine andere Komponente oder ein anderes Sammlungsobjekt in dieser Sammlung verwendet.", - "es-es": - "{catalogNumberFieldName: string} {catalogNumber: string} ya está en uso para otro componente u objeto de colección en esta colección.", - "fr-fr": - "{catalogNumberFieldName: string} {catalogNumber: string} est déjà utilisé pour un autre composant ou objet de collection dans cette collection.", - "pt-br": - "{catalogNumberFieldName: string} {catalogNumber: string} já está em uso para outro Componente ou Objeto de Coleção nesta coleção.", - "ru-ru": - "{catalogNumberFieldName: string} {catalogNumber: string} уже используется для другого компонента или объекта коллекции в этой коллекции.", - "uk-ua": + 'en-us': + '{catalogNumberFieldName: string} {catalogNumber: string} is already in use for another Component or Collection Object in this collection.', + 'de-ch': + '{catalogNumberFieldName: string} {catalogNumber: string} wird bereits für eine andere Komponente oder ein anderes Sammlungsobjekt in dieser Sammlung verwendet.', + 'es-es': + '{catalogNumberFieldName: string} {catalogNumber: string} ya está en uso para otro componente u objeto de colección en esta colección.', + 'fr-fr': + '{catalogNumberFieldName: string} {catalogNumber: string} est déjà utilisé pour un autre composant ou objet de collection dans cette collection.', + 'pt-br': + '{catalogNumberFieldName: string} {catalogNumber: string} já está em uso para outro Componente ou Objeto de Coleção nesta coleção.', + 'ru-ru': + '{catalogNumberFieldName: string} {catalogNumber: string} уже используется для другого компонента или объекта коллекции в этой коллекции.', + 'uk-ua': "{catalogNumberFieldName: string} {catalogNumber: string} вже використовується для іншого компонента або об'єкта колекції в цій колекції.", }, preparationUsedInLoan: { - "en-us": "The preparation is used in a loan.", - "de-ch": "Das Präparat dient der Kreditvergabe.", - "es-es": "La preparación se utiliza en un préstamo.", - "fr-fr": "La préparation est utilisée dans un prêt.", - "pt-br": "A preparação é usada em um empréstimo.", - "ru-ru": "Препарат используется при кредитовании.", - "uk-ua": "Препарат використовується у позиці.", + 'en-us': 'The preparation is used in a loan.', + 'de-ch': 'Das Präparat dient der Kreditvergabe.', + 'es-es': 'La preparación se utiliza en un préstamo.', + 'fr-fr': 'La préparation est utilisée dans un prêt.', + 'pt-br': 'A preparação é usada em um empréstimo.', + 'ru-ru': 'Препарат используется при кредитовании.', + 'uk-ua': 'Препарат використовується у позиці.', }, preparationIsNegative: { - "en-us": "Preparation count cannot be negative", - "de-ch": "Die Anzahl der Vorbereitungen darf nicht negativ sein", - "es-es": "El recuento de preparación no puede ser negativo", - "fr-fr": "Le nombre de préparations ne peut pas être négatif", - "pt-br": "A contagem de preparação não pode ser negativa", - "ru-ru": "Количество приготовлений не может быть отрицательным.", - "uk-ua": "Кількість підготовок не може бути від'ємним значенням", + 'en-us': 'Preparation count cannot be negative', + 'de-ch': 'Die Anzahl der Vorbereitungen darf nicht negativ sein', + 'es-es': 'El recuento de preparación no puede ser negativo', + 'fr-fr': 'Le nombre de préparations ne peut pas être négatif', + 'pt-br': 'A contagem de preparação não pode ser negativa', + 'ru-ru': 'Количество приготовлений не может быть отрицательным.', + 'uk-ua': "Кількість підготовок не може бути від'ємним значенням", }, configureField: { - "en-us": "Configure field", - "de-ch": "Feld konfigurieren", - "es-es": "Configurar campo", - "fr-fr": "Configurer le champ", - "pt-br": "Configurar campo", - "ru-ru": "Настроить поле", - "uk-ua": "Налаштувати поле", + 'en-us': 'Configure field', + 'de-ch': 'Feld konfigurieren', + 'es-es': 'Configurar campo', + 'fr-fr': 'Configurer le champ', + 'pt-br': 'Configurar campo', + 'ru-ru': 'Настроить поле', + 'uk-ua': 'Налаштувати поле', }, trimZeros: { - "en-us": "Trim Leading Zeros", - "de-ch": "Führende Nullen entfernen", - "es-es": "Recortar ceros iniciales", - "fr-fr": "Couper les zéros non significatifs", - "pt-br": "Aparar zeros à esquerda", - "ru-ru": "Удалить начальные нули", - "uk-ua": "Видалити початкові нулі", + 'en-us': 'Trim Leading Zeros', + 'de-ch': 'Führende Nullen entfernen', + 'es-es': 'Recortar ceros iniciales', + 'fr-fr': 'Couper les zéros non significatifs', + 'pt-br': 'Aparar zeros à esquerda', + 'ru-ru': 'Удалить начальные нули', + 'uk-ua': 'Видалити початкові нулі', }, trimZerosDescription: { - "en-us": "Remove leading zeros from numeric values.", - "de-ch": "Entfernen Sie führende Nullen aus numerischen Werten.", - "es-es": "Eliminar los ceros iniciales de los valores numéricos.", - "fr-fr": "Supprimez les zéros non significatifs des valeurs numériques.", - "pt-br": "Remova os zeros à esquerda dos valores numéricos.", - "ru-ru": "Удалить начальные нули из числовых значений.", - "uk-ua": "Видаліть початкові нулі з числових значень.", + 'en-us': 'Remove leading zeros from numeric values.', + 'de-ch': 'Entfernen Sie führende Nullen aus numerischen Werten.', + 'es-es': 'Eliminar los ceros iniciales de los valores numéricos.', + 'fr-fr': 'Supprimez les zéros non significatifs des valeurs numériques.', + 'pt-br': 'Remova os zeros à esquerda dos valores numéricos.', + 'ru-ru': 'Удалить начальные нули из числовых значений.', + 'uk-ua': 'Видаліть початкові нулі з числових значень.', }, formatterPreviewUnavailable: { - "en-us": "Preview for formatter of this type is not available", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Попередній перегляд для форматера цього типу недоступний", + 'en-us': 'Preview for formatter of this type is not available', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Попередній перегляд для форматера цього типу недоступний', }, nonConformingInline: { - "en-us": "(non-conforming)", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "(невідповідний)", + 'en-us': '(non-conforming)', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': '(невідповідний)', }, value: { - "en-us": "Value", - "de-ch": "Wert", - "es-es": "Valor", - "fr-fr": "Valeur", - "ru-ru": "Значение", - "uk-ua": "Значення", - "pt-br": "", + 'en-us': 'Value', + 'de-ch': 'Wert', + 'es-es': 'Valor', + 'fr-fr': 'Valeur', + 'ru-ru': 'Значение', + 'uk-ua': 'Значення', + 'pt-br': '', }, constant: { - "en-us": "Constant", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Постійна", + 'en-us': 'Constant', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Постійна', }, alpha: { - "en-us": "Alpha", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Альфа", + 'en-us': 'Alpha', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Альфа', }, numeric: { - "en-us": "Numeric", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Числовий", + 'en-us': 'Numeric', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Числовий', }, alphanumeric: { - "en-us": "Alphanumeric", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Буквено-цифровий", + 'en-us': 'Alphanumeric', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Буквено-цифровий', }, anychar: { - "en-us": "Any character", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Будь-який символ", + 'en-us': 'Any character', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Будь-який символ', }, regex: { - "en-us": "Regular expression", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Регулярний вираз", + 'en-us': 'Regular expression', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Регулярний вираз', }, exampleField: { - "en-us": "Example Field", - "de-ch": "Beispielfeld", - "es-es": "Campo de ejemplo", - "fr-fr": "Champ d'exemple", - "ru-ru": "Пример поля", - "uk-ua": "Приклад поле", - "pt-br": "", + 'en-us': 'Example Field', + 'de-ch': 'Beispielfeld', + 'es-es': 'Campo de ejemplo', + 'fr-fr': "Champ d'exemple", + 'ru-ru': 'Пример поля', + 'uk-ua': 'Приклад поле', + 'pt-br': '', }, pattern: { - "en-us": "Pattern", - "de-ch": "", - "es-es": "", - "fr-fr": "", - "pt-br": "", - "ru-ru": "", - "uk-ua": "Візерунок", + 'en-us': 'Pattern', + 'de-ch': '', + 'es-es': '', + 'fr-fr': '', + 'pt-br': '', + 'ru-ru': '', + 'uk-ua': 'Візерунок', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/schema.ts b/specifyweb/frontend/js_src/lib/localization/schema.ts index 6f7d9544804..403174cd921 100644 --- a/specifyweb/frontend/js_src/lib/localization/schema.ts +++ b/specifyweb/frontend/js_src/lib/localization/schema.ts @@ -4,549 +4,549 @@ * @module */ -import { createDictionary } from "./utils"; +import { createDictionary } from './utils'; // Refer to "Guidelines for Programmers" in ./README.md before editing this file export const schemaText = createDictionary({ table: { - "en-us": "Table", - "ru-ru": "Стол", - "es-es": "Tabla", - "fr-fr": "Tableau", - "uk-ua": "Таблиця", - "de-ch": "Tabelle", - "pt-br": "Mesa", + 'en-us': 'Table', + 'ru-ru': 'Стол', + 'es-es': 'Tabla', + 'fr-fr': 'Tableau', + 'uk-ua': 'Таблиця', + 'de-ch': 'Tabelle', + 'pt-br': 'Mesa', }, tables: { - "en-us": "Tables", - "ru-ru": "Таблицы", - "es-es": "Tablas", - "fr-fr": "Tables", - "uk-ua": "Столи", - "de-ch": "Tabellen", - "pt-br": "Tabelas", + 'en-us': 'Tables', + 'ru-ru': 'Таблицы', + 'es-es': 'Tablas', + 'fr-fr': 'Tables', + 'uk-ua': 'Столи', + 'de-ch': 'Tabellen', + 'pt-br': 'Tabelas', }, tableName: { - "en-us": "Table Name", - "ru-ru": "Название таблицы", - "fr-fr": "Nom de la table", - "uk-ua": "Назва таблиці", - "de-ch": "Tabellennamen", - "es-es": "Nombre de la tabla", - "pt-br": "Nome da tabela", + 'en-us': 'Table Name', + 'ru-ru': 'Название таблицы', + 'fr-fr': 'Nom de la table', + 'uk-ua': 'Назва таблиці', + 'de-ch': 'Tabellennamen', + 'es-es': 'Nombre de la tabla', + 'pt-br': 'Nome da tabela', }, withoutTable: { - "en-us": "Without Table", - "de-ch": "Ohne Tisch", - "es-es": "Sin tabla", - "fr-fr": "Sans table", - "ru-ru": "Без стола", - "uk-ua": "Без столу", - "pt-br": "Sem mesa", + 'en-us': 'Without Table', + 'de-ch': 'Ohne Tisch', + 'es-es': 'Sin tabla', + 'fr-fr': 'Sans table', + 'ru-ru': 'Без стола', + 'uk-ua': 'Без столу', + 'pt-br': 'Sem mesa', }, schemaConfig: { - "en-us": "Schema Config", - "ru-ru": "Конфигурация схемы", - "es-es": "Configuración del esquema", - "fr-fr": "Configuration du schéma", - "uk-ua": "Конфігурація схеми", - "de-ch": "Schema konfigurieren", - "pt-br": "Configuração do esquema", + 'en-us': 'Schema Config', + 'ru-ru': 'Конфигурация схемы', + 'es-es': 'Configuración del esquema', + 'fr-fr': 'Configuration du schéma', + 'uk-ua': 'Конфігурація схеми', + 'de-ch': 'Schema konfigurieren', + 'pt-br': 'Configuração do esquema', }, unsavedSchemaUnloadProtect: { - "en-us": "Schema changes have not been saved", - "ru-ru": "Изменения схемы не были сохранены", - "es-es": "Los cambios en el esquema no se han guardado", - "fr-fr": "Les modifications de schéma n'ont pas été enregistrées", - "uk-ua": "Зміни схеми не збережено", - "de-ch": "Schema Änderungen wurden nicht gespeichert", - "pt-br": "As alterações de esquema não foram salvas", + 'en-us': 'Schema changes have not been saved', + 'ru-ru': 'Изменения схемы не были сохранены', + 'es-es': 'Los cambios en el esquema no se han guardado', + 'fr-fr': "Les modifications de schéma n'ont pas été enregistrées", + 'uk-ua': 'Зміни схеми не збережено', + 'de-ch': 'Schema Änderungen wurden nicht gespeichert', + 'pt-br': 'As alterações de esquema não foram salvas', }, changeBaseTable: { - "en-us": "Change Base Table", - "ru-ru": "Изменить базовую таблицу", - "es-es": "Cambiar la tabla base", - "fr-fr": "Modifier la table de base", - "uk-ua": "Змінити базову таблицю", - "de-ch": "Basis-Tabelle ändern", - "pt-br": "Alterar tabela base", + 'en-us': 'Change Base Table', + 'ru-ru': 'Изменить базовую таблицу', + 'es-es': 'Cambiar la tabla base', + 'fr-fr': 'Modifier la table de base', + 'uk-ua': 'Змінити базову таблицю', + 'de-ch': 'Basis-Tabelle ändern', + 'pt-br': 'Alterar tabela base', }, field: { - "en-us": "Field", - "ru-ru": "Поле", - "es-es": "Campo", - "fr-fr": "Champ", - "uk-ua": "Поле", - "de-ch": "Feld", - "pt-br": "Campo", + 'en-us': 'Field', + 'ru-ru': 'Поле', + 'es-es': 'Campo', + 'fr-fr': 'Champ', + 'uk-ua': 'Поле', + 'de-ch': 'Feld', + 'pt-br': 'Campo', }, fields: { - "en-us": "Fields", - "ru-ru": "Поля", - "es-es": "Campos", - "fr-fr": "Champs", - "uk-ua": "Поля", - "de-ch": "Felder", - "pt-br": "Campos", + 'en-us': 'Fields', + 'ru-ru': 'Поля', + 'es-es': 'Campos', + 'fr-fr': 'Champs', + 'uk-ua': 'Поля', + 'de-ch': 'Felder', + 'pt-br': 'Campos', }, relationships: { - "en-us": "Relationships", - "ru-ru": "Отношения", - "es-es": "Relaciones", - "fr-fr": "Relations", - "uk-ua": "Стосунки", - "de-ch": "Beziehungen", - "pt-br": "Relacionamentos", + 'en-us': 'Relationships', + 'ru-ru': 'Отношения', + 'es-es': 'Relaciones', + 'fr-fr': 'Relations', + 'uk-ua': 'Стосунки', + 'de-ch': 'Beziehungen', + 'pt-br': 'Relacionamentos', }, database: { - "en-us": "Database", - "de-ch": "Datenbank", - "fr-fr": "Base de données", - "ru-ru": "База данных", - "uk-ua": "База даних", - "es-es": "Base de datos", - "pt-br": "Banco de dados", + 'en-us': 'Database', + 'de-ch': 'Datenbank', + 'fr-fr': 'Base de données', + 'ru-ru': 'База данных', + 'uk-ua': 'База даних', + 'es-es': 'Base de datos', + 'pt-br': 'Banco de dados', }, setScope: { - "en-us": "Set Scope", - "de-ch": "Geltungsbereich festlegen", - "es-es": "Establecer alcance", - "fr-fr": "Définir la portée", - "ru-ru": "Установить область действия", - "uk-ua": "Встановити область дії", - "pt-br": "Definir escopo", + 'en-us': 'Set Scope', + 'de-ch': 'Geltungsbereich festlegen', + 'es-es': 'Establecer alcance', + 'fr-fr': 'Définir la portée', + 'ru-ru': 'Установить область действия', + 'uk-ua': 'Встановити область дії', + 'pt-br': 'Definir escopo', }, caption: { - "en-us": "Caption", - "ru-ru": "Подпись", - "es-es": "Subtítulo", - "fr-fr": "Légende", - "uk-ua": "Підпис", - "de-ch": "Beschriftung", - "pt-br": "Rubrica", + 'en-us': 'Caption', + 'ru-ru': 'Подпись', + 'es-es': 'Subtítulo', + 'fr-fr': 'Légende', + 'uk-ua': 'Підпис', + 'de-ch': 'Beschriftung', + 'pt-br': 'Rubrica', }, description: { - "en-us": "Description", - "ru-ru": "Описание", - "es-es": "Descripción", - "fr-fr": "Description", - "uk-ua": "Опис", - "de-ch": "Beschreibung", - "pt-br": "Descrição", + 'en-us': 'Description', + 'ru-ru': 'Описание', + 'es-es': 'Descripción', + 'fr-fr': 'Description', + 'uk-ua': 'Опис', + 'de-ch': 'Beschreibung', + 'pt-br': 'Descrição', }, hideTable: { - "en-us": "Hide Table", - "ru-ru": "Скрыть таблицу", - "es-es": "Ocultar tabla", - "fr-fr": "Masquer le tableau", - "uk-ua": "Приховати таблицю", - "de-ch": "Tabelle verbergen", - "pt-br": "Ocultar tabela", + 'en-us': 'Hide Table', + 'ru-ru': 'Скрыть таблицу', + 'es-es': 'Ocultar tabla', + 'fr-fr': 'Masquer le tableau', + 'uk-ua': 'Приховати таблицю', + 'de-ch': 'Tabelle verbergen', + 'pt-br': 'Ocultar tabela', }, hideField: { - "en-us": "Hide Field", - "ru-ru": "Скрыть поле", - "es-es": "Ocultar campo", - "fr-fr": "Masquer le champ", - "uk-ua": "Приховати поле", - "de-ch": "Feld verbergen", - "pt-br": "Ocultar campo", + 'en-us': 'Hide Field', + 'ru-ru': 'Скрыть поле', + 'es-es': 'Ocultar campo', + 'fr-fr': 'Masquer le champ', + 'uk-ua': 'Приховати поле', + 'de-ch': 'Feld verbergen', + 'pt-br': 'Ocultar campo', }, tableFormat: { - "en-us": "Table Format", - "ru-ru": "Формат таблицы", - "es-es": "Formato de tabla", - "fr-fr": "Format de tableau", - "uk-ua": "Формат таблиці", - "de-ch": "Tabellenformat", - "pt-br": "Formato de tabela", + 'en-us': 'Table Format', + 'ru-ru': 'Формат таблицы', + 'es-es': 'Formato de tabla', + 'fr-fr': 'Format de tableau', + 'uk-ua': 'Формат таблиці', + 'de-ch': 'Tabellenformat', + 'pt-br': 'Formato de tabela', }, tableAggregation: { - "en-us": "Table Aggregation", - "ru-ru": "Агрегация таблиц", - "es-es": "Agregación de tablas", - "fr-fr": "Agrégation de table", - "uk-ua": "Агрегація таблиць", - "de-ch": "Tabellenaggregation", - "pt-br": "Agregação de tabelas", + 'en-us': 'Table Aggregation', + 'ru-ru': 'Агрегация таблиц', + 'es-es': 'Agregación de tablas', + 'fr-fr': 'Agrégation de table', + 'uk-ua': 'Агрегація таблиць', + 'de-ch': 'Tabellenaggregation', + 'pt-br': 'Agregação de tabelas', }, oneToOne: { - "en-us": "One-to-one", - "ru-ru": "Один на один", - "es-es": "Uno-a-uno", - "fr-fr": "Un à un", - "uk-ua": "Один на один", - "de-ch": "Eins zu eins", - "pt-br": "Um para um", + 'en-us': 'One-to-one', + 'ru-ru': 'Один на один', + 'es-es': 'Uno-a-uno', + 'fr-fr': 'Un à un', + 'uk-ua': 'Один на один', + 'de-ch': 'Eins zu eins', + 'pt-br': 'Um para um', }, oneToMany: { - "en-us": "One-to-many", - "ru-ru": "Один ко многим", - "es-es": "Uno a muchos", - "fr-fr": "Un-à-plusieurs", - "uk-ua": "Один до багатьох", - "de-ch": "Eins zu vielen", - "pt-br": "Um para muitos", + 'en-us': 'One-to-many', + 'ru-ru': 'Один ко многим', + 'es-es': 'Uno a muchos', + 'fr-fr': 'Un-à-plusieurs', + 'uk-ua': 'Один до багатьох', + 'de-ch': 'Eins zu vielen', + 'pt-br': 'Um para muitos', }, manyToOne: { - "en-us": "Many-to-one", - "ru-ru": "Многие-к-одному", - "es-es": "Muchos a uno", - "fr-fr": "Plusieurs à un", - "uk-ua": "Багато до одного", - "de-ch": "Viele zu eins", - "pt-br": "Muitos para um", + 'en-us': 'Many-to-one', + 'ru-ru': 'Многие-к-одному', + 'es-es': 'Muchos a uno', + 'fr-fr': 'Plusieurs à un', + 'uk-ua': 'Багато до одного', + 'de-ch': 'Viele zu eins', + 'pt-br': 'Muitos para um', }, manyToMany: { - "en-us": "many-to-many", - "ru-ru": "многие-ко-многим", - "es-es": "de muchos a muchos", - "fr-fr": "plusieurs à plusieurs", - "uk-ua": "багато-до-багатьох", - "de-ch": "Viele zu viele", - "pt-br": "muitos para muitos", + 'en-us': 'many-to-many', + 'ru-ru': 'многие-ко-многим', + 'es-es': 'de muchos a muchos', + 'fr-fr': 'plusieurs à plusieurs', + 'uk-ua': 'багато-до-багатьох', + 'de-ch': 'Viele zu viele', + 'pt-br': 'muitos para muitos', }, fieldLength: { - "en-us": "Length", - "es-es": "Longitud", - "fr-fr": "Longueur", - "uk-ua": "Довжина", - "de-ch": "Länge", - "ru-ru": "Длина", - "pt-br": "Comprimento", + 'en-us': 'Length', + 'es-es': 'Longitud', + 'fr-fr': 'Longueur', + 'uk-ua': 'Довжина', + 'de-ch': 'Länge', + 'ru-ru': 'Длина', + 'pt-br': 'Comprimento', }, readOnly: { - "en-us": "Read-only", - "ru-ru": "Только для чтения", - "es-es": "Sólo lectura", - "fr-fr": "Lecture seule", - "uk-ua": "Тільки для читання", - "de-ch": "Nur-Lesen", - "pt-br": "Somente leitura", + 'en-us': 'Read-only', + 'ru-ru': 'Только для чтения', + 'es-es': 'Sólo lectura', + 'fr-fr': 'Lecture seule', + 'uk-ua': 'Тільки для читання', + 'de-ch': 'Nur-Lesen', + 'pt-br': 'Somente leitura', }, fieldFormat: { - "en-us": "Field Format", - "ru-ru": "Формат поля", - "es-es": "Formato de campo", - "fr-fr": "Format de champ", - "uk-ua": "Формат поля", - "de-ch": "Feldformat", - "pt-br": "Formato de campo", + 'en-us': 'Field Format', + 'ru-ru': 'Формат поля', + 'es-es': 'Formato de campo', + 'fr-fr': 'Format de champ', + 'uk-ua': 'Формат поля', + 'de-ch': 'Feldformat', + 'pt-br': 'Formato de campo', }, uiFormattersForField: { - "en-us": "Field Formatters for {fieldLabel:string}", - "de-ch": "Feldformatierer für {fieldLabel:string}", - "es-es": "Formateadores de campos para {fieldLabel:string}", - "fr-fr": "Formateurs de champs pour {fieldLabel:string}", - "pt-br": "Formatadores de campo para {fieldLabel:string}", - "ru-ru": "Форматировщики полей для {fieldLabel:string}", - "uk-ua": "Форматування полів для {fieldLabel:string}", + 'en-us': 'Field Formatters for {fieldLabel:string}', + 'de-ch': 'Feldformatierer für {fieldLabel:string}', + 'es-es': 'Formateadores de campos para {fieldLabel:string}', + 'fr-fr': 'Formateurs de champs pour {fieldLabel:string}', + 'pt-br': 'Formatadores de campo para {fieldLabel:string}', + 'ru-ru': 'Форматировщики полей для {fieldLabel:string}', + 'uk-ua': 'Форматування полів для {fieldLabel:string}', }, formatted: { - "en-us": "Formatted", - "ru-ru": "Отформатированный", - "es-es": "Formateado", - "fr-fr": "Formaté", - "uk-ua": "Відформатовано", - "de-ch": "Formatiert", - "pt-br": "Formatado", + 'en-us': 'Formatted', + 'ru-ru': 'Отформатированный', + 'es-es': 'Formateado', + 'fr-fr': 'Formaté', + 'uk-ua': 'Відформатовано', + 'de-ch': 'Formatiert', + 'pt-br': 'Formatado', }, webLink: { - "en-us": "Web Link", - "ru-ru": "Веб-ссылка", - "es-es": "Enlace web", - "fr-fr": "Lien Web", - "uk-ua": "Веб-посиланні", - "de-ch": "Web-Link", - "pt-br": "Link da Web", + 'en-us': 'Web Link', + 'ru-ru': 'Веб-ссылка', + 'es-es': 'Enlace web', + 'fr-fr': 'Lien Web', + 'uk-ua': 'Веб-посиланні', + 'de-ch': 'Web-Link', + 'pt-br': 'Link da Web', }, userDefined: { - "en-us": "User Defined", - "es-es": "Definido por el usuario", - "fr-fr": "Défini par l'utilisateur", - "uk-ua": "Визначено користувачем", - "de-ch": "Benutzerdefiniert", - "ru-ru": "Определяется пользователем", - "pt-br": "Definido pelo usuário", + 'en-us': 'User Defined', + 'es-es': 'Definido por el usuario', + 'fr-fr': "Défini par l'utilisateur", + 'uk-ua': 'Визначено користувачем', + 'de-ch': 'Benutzerdefiniert', + 'ru-ru': 'Определяется пользователем', + 'pt-br': 'Definido pelo usuário', }, addLanguage: { - "en-us": "Add Language", - "fr-fr": "Ajouter une langue", - "uk-ua": "Додати мову", - "de-ch": "Sprache hinzuzufügen", - "es-es": "Agregar idioma", - "ru-ru": "Добавить язык", - "pt-br": "Adicionar idioma", + 'en-us': 'Add Language', + 'fr-fr': 'Ajouter une langue', + 'uk-ua': 'Додати мову', + 'de-ch': 'Sprache hinzuzufügen', + 'es-es': 'Agregar idioma', + 'ru-ru': 'Добавить язык', + 'pt-br': 'Adicionar idioma', }, databaseColumn: { - "en-us": "Database Column", - "ru-ru": "Столбец базы данных", - "es-es": "Columna de base de datos", - "fr-fr": "Colonne de base de données", - "uk-ua": "Стовпець бази даних", - "de-ch": "Datenbank-Spalte", - "pt-br": "Coluna do banco de dados", + 'en-us': 'Database Column', + 'ru-ru': 'Столбец базы данных', + 'es-es': 'Columna de base de datos', + 'fr-fr': 'Colonne de base de données', + 'uk-ua': 'Стовпець бази даних', + 'de-ch': 'Datenbank-Spalte', + 'pt-br': 'Coluna do banco de dados', }, relatedTable: { - "en-us": "Related Model", - "ru-ru": "Связанная модель", - "es-es": "Modelo relacionado", - "fr-fr": "Modèle associé", - "uk-ua": "Пов'язана модель", - "de-ch": "Zugehöriges Modell", - "pt-br": "Modelo relacionado", + 'en-us': 'Related Model', + 'ru-ru': 'Связанная модель', + 'es-es': 'Modelo relacionado', + 'fr-fr': 'Modèle associé', + 'uk-ua': "Пов'язана модель", + 'de-ch': 'Zugehöriges Modell', + 'pt-br': 'Modelo relacionado', }, otherSideName: { - "en-us": "Other side name", - "ru-ru": "Имя другой стороны", - "fr-fr": "Nom de l'autre côté", - "uk-ua": "Інша назва сторони", - "de-ch": "Name der anderen Seite", - "es-es": "Nombre del otro lado", - "pt-br": "Nome do outro lado", + 'en-us': 'Other side name', + 'ru-ru': 'Имя другой стороны', + 'fr-fr': "Nom de l'autre côté", + 'uk-ua': 'Інша назва сторони', + 'de-ch': 'Name der anderen Seite', + 'es-es': 'Nombre del otro lado', + 'pt-br': 'Nome do outro lado', }, dependent: { - "en-us": "Dependent", - "ru-ru": "Зависимый", - "es-es": "Dependiente", - "fr-fr": "Dépendant", - "uk-ua": "Утриманець", - "de-ch": "Abhängig", - "pt-br": "Dependente", + 'en-us': 'Dependent', + 'ru-ru': 'Зависимый', + 'es-es': 'Dependiente', + 'fr-fr': 'Dépendant', + 'uk-ua': 'Утриманець', + 'de-ch': 'Abhängig', + 'pt-br': 'Dependente', }, independent: { - "en-us": "Independent", - "es-es": "Independiente", - "fr-fr": "Indépendant", - "ru-ru": "Независимый", - "uk-ua": "Незалежний", - "de-ch": "Unabhängig", - "pt-br": "Independente", + 'en-us': 'Independent', + 'es-es': 'Independiente', + 'fr-fr': 'Indépendant', + 'ru-ru': 'Независимый', + 'uk-ua': 'Незалежний', + 'de-ch': 'Unabhängig', + 'pt-br': 'Independente', }, downloadAsJson: { - "en-us": "Download as JSON", - "ru-ru": "Скачать как JSON", - "es-es": "Descargar como JSON", - "fr-fr": "Télécharger au format JSON", - "uk-ua": "Завантажити як JSON", - "de-ch": "Als JSON herunterladen", - "pt-br": "Baixar como JSON", + 'en-us': 'Download as JSON', + 'ru-ru': 'Скачать как JSON', + 'es-es': 'Descargar como JSON', + 'fr-fr': 'Télécharger au format JSON', + 'uk-ua': 'Завантажити як JSON', + 'de-ch': 'Als JSON herunterladen', + 'pt-br': 'Baixar como JSON', }, downloadAsXml: { - "en-us": "Download as XML", - "ru-ru": "Загрузить как XML", - "es-es": "Descargar como XML", - "fr-fr": "Télécharger au format XML", - "uk-ua": "Завантажити як XML", - "de-ch": "Als XML herunterladen", - "pt-br": "Baixar como XML", + 'en-us': 'Download as XML', + 'ru-ru': 'Загрузить как XML', + 'es-es': 'Descargar como XML', + 'fr-fr': 'Télécharger au format XML', + 'uk-ua': 'Завантажити як XML', + 'de-ch': 'Als XML herunterladen', + 'pt-br': 'Baixar como XML', }, downloadAsTsv: { - "en-us": "Download as TSV", - "ru-ru": "Загрузить как TSV", - "es-es": "Descargar como TSV", - "fr-fr": "Télécharger au format TSV", - "uk-ua": "Завантажити як TSV", - "de-ch": "Als TSV herunterladen", - "pt-br": "Baixar como TSV", + 'en-us': 'Download as TSV', + 'ru-ru': 'Загрузить как TSV', + 'es-es': 'Descargar como TSV', + 'fr-fr': 'Télécharger au format TSV', + 'uk-ua': 'Завантажити як TSV', + 'de-ch': 'Als TSV herunterladen', + 'pt-br': 'Baixar como TSV', }, tableId: { - "en-us": "Table ID", - "ru-ru": "Идентификатор таблицы", - "es-es": "ID de tabla", - "fr-fr": "ID de la table", - "uk-ua": "Ідентифікатор таблиці", - "de-ch": "Tabellen-ID", - "pt-br": "ID da tabela", + 'en-us': 'Table ID', + 'ru-ru': 'Идентификатор таблицы', + 'es-es': 'ID de tabla', + 'fr-fr': 'ID de la table', + 'uk-ua': 'Ідентифікатор таблиці', + 'de-ch': 'Tabellen-ID', + 'pt-br': 'ID da tabela', }, fieldCount: { - "en-us": "Field count", - "ru-ru": "Количество полей", - "es-es": "Recuento de campos", - "fr-fr": "Nombre de champs", - "uk-ua": "Кількість полів", - "de-ch": "Anzahl Felder", - "pt-br": "Contagem de campos", + 'en-us': 'Field count', + 'ru-ru': 'Количество полей', + 'es-es': 'Recuento de campos', + 'fr-fr': 'Nombre de champs', + 'uk-ua': 'Кількість полів', + 'de-ch': 'Anzahl Felder', + 'pt-br': 'Contagem de campos', }, relationshipCount: { - "en-us": "Relationship count", - "ru-ru": "Количество отношений", - "es-es": "Recuento de relaciones", - "fr-fr": "Nombre de relations", - "uk-ua": "Кількість зв'язків", - "de-ch": "Anzahl Beziehungen", - "pt-br": "Contagem de relacionamentos", + 'en-us': 'Relationship count', + 'ru-ru': 'Количество отношений', + 'es-es': 'Recuento de relaciones', + 'fr-fr': 'Nombre de relations', + 'uk-ua': "Кількість зв'язків", + 'de-ch': 'Anzahl Beziehungen', + 'pt-br': 'Contagem de relacionamentos', }, databaseSchema: { - "en-us": "Database Schema", - "ru-ru": "Схема базы данных", - "es-es": "Esquema de base de datos", - "fr-fr": "Schéma de base de données", - "uk-ua": "Схема бази даних", - "de-ch": "Datenbankschema", - "pt-br": "Esquema de banco de dados", + 'en-us': 'Database Schema', + 'ru-ru': 'Схема базы данных', + 'es-es': 'Esquema de base de datos', + 'fr-fr': 'Schéma de base de données', + 'uk-ua': 'Схема бази даних', + 'de-ch': 'Datenbankschema', + 'pt-br': 'Esquema de banco de dados', }, selectedTables: { - "en-us": "Selected Tables", - "ru-ru": "Избранные таблицы", - "es-es": "Tablas seleccionadas", - "fr-fr": "Tableaux sélectionnés", - "uk-ua": "Вибрані таблиці", - "de-ch": "Ausgewählte Tabellen", - "pt-br": "Tabelas Selecionadas", + 'en-us': 'Selected Tables', + 'ru-ru': 'Избранные таблицы', + 'es-es': 'Tablas seleccionadas', + 'fr-fr': 'Tableaux sélectionnés', + 'uk-ua': 'Вибрані таблиці', + 'de-ch': 'Ausgewählte Tabellen', + 'pt-br': 'Tabelas Selecionadas', }, possibleTables: { - "en-us": "Possible Tables", - "ru-ru": "Возможные таблицы", - "es-es": "Tablas posibles", - "fr-fr": "Tables possibles", - "uk-ua": "Можливі таблиці", - "de-ch": "Mögliche Tabellen", - "pt-br": "Tabelas Possíveis", + 'en-us': 'Possible Tables', + 'ru-ru': 'Возможные таблицы', + 'es-es': 'Tablas posibles', + 'fr-fr': 'Tables possibles', + 'uk-ua': 'Можливі таблиці', + 'de-ch': 'Mögliche Tabellen', + 'pt-br': 'Tabelas Possíveis', }, goToTop: { - "en-us": "Go to top", - "es-es": "Ir arriba", - "fr-fr": "Aller en haut", - "uk-ua": "Перейти на початок", - "de-ch": "Nach oben", - "ru-ru": "Перейти наверх", - "pt-br": "Ir para o topo", + 'en-us': 'Go to top', + 'es-es': 'Ir arriba', + 'fr-fr': 'Aller en haut', + 'uk-ua': 'Перейти на початок', + 'de-ch': 'Nach oben', + 'ru-ru': 'Перейти наверх', + 'pt-br': 'Ir para o topo', }, idField: { - "en-us": "ID Field", - "es-es": "Campo de identificación", - "fr-fr": "Champ d'identification", - "ru-ru": "Поле идентификатора", - "uk-ua": "Поле ідентифікатора", - "de-ch": "Feld-ID", - "pt-br": "Campo ID", + 'en-us': 'ID Field', + 'es-es': 'Campo de identificación', + 'fr-fr': "Champ d'identification", + 'ru-ru': 'Поле идентификатора', + 'uk-ua': 'Поле ідентифікатора', + 'de-ch': 'Feld-ID', + 'pt-br': 'Campo ID', }, tableUniquenessRules: { - "en-us": "{tableName:string} Uniqueness Rules", - "de-ch": "{tableName:string} Eindeutigkeitsregeln", - "es-es": "{tableName:string} Reglas de singularidad", - "fr-fr": "{tableName:string} Règles d'unicité", - "ru-ru": "{tableName:string} Правила уникальности", - "uk-ua": "{tableName:string} Правила унікальності", - "pt-br": "{tableName:string} Regras de Unicidade", + 'en-us': '{tableName:string} Uniqueness Rules', + 'de-ch': '{tableName:string} Eindeutigkeitsregeln', + 'es-es': '{tableName:string} Reglas de singularidad', + 'fr-fr': "{tableName:string} Règles d'unicité", + 'ru-ru': '{tableName:string} Правила уникальности', + 'uk-ua': '{tableName:string} Правила унікальності', + 'pt-br': '{tableName:string} Regras de Unicidade', }, uniquenessRules: { - "en-us": "Uniqueness Rules", - "de-ch": "Eindeutigkeitsregeln", - "es-es": "Reglas de unicidad", - "fr-fr": "Règles d'unicité", - "ru-ru": "Правила уникальности", - "uk-ua": "Правила унікальності", - "pt-br": "Regras de Unicidade", + 'en-us': 'Uniqueness Rules', + 'de-ch': 'Eindeutigkeitsregeln', + 'es-es': 'Reglas de unicidad', + 'fr-fr': "Règles d'unicité", + 'ru-ru': 'Правила уникальности', + 'uk-ua': 'Правила унікальності', + 'pt-br': 'Regras de Unicidade', }, uniqueFields: { - "en-us": "Unique Fields", - "de-ch": "Eindeutige Felder", - "es-es": "Campos únicos", - "fr-fr": "Champs uniques", - "ru-ru": "Уникальные поля", - "uk-ua": "Унікальні поля", - "pt-br": "Campos Únicos", + 'en-us': 'Unique Fields', + 'de-ch': 'Eindeutige Felder', + 'es-es': 'Campos únicos', + 'fr-fr': 'Champs uniques', + 'ru-ru': 'Уникальные поля', + 'uk-ua': 'Унікальні поля', + 'pt-br': 'Campos Únicos', }, addUniquenessRule: { - "en-us": "Add Uniqueness Rule", - "de-ch": "Eindeutigkeitsregel hinzufügen", - "es-es": "Agregar regla de unicidad", - "fr-fr": "Ajouter une règle d'unicité", - "ru-ru": "Добавить правило уникальности", - "uk-ua": "Додати правило унікальності", - "pt-br": "Adicionar regra de exclusividade", + 'en-us': 'Add Uniqueness Rule', + 'de-ch': 'Eindeutigkeitsregel hinzufügen', + 'es-es': 'Agregar regla de unicidad', + 'fr-fr': "Ajouter une règle d'unicité", + 'ru-ru': 'Добавить правило уникальности', + 'uk-ua': 'Додати правило унікальності', + 'pt-br': 'Adicionar regra de exclusividade', }, configureUniquenessRule: { - "en-us": "Configure Uniqueness Rule", - "de-ch": "Eindeutigkeitsregel konfigurieren", - "es-es": "Configurar regla de unicidad", - "fr-fr": "Configurer la règle d'unicité", - "ru-ru": "Настроить правило уникальности", - "uk-ua": "Налаштувати правило унікальності", - "pt-br": "Configurar regra de exclusividade", + 'en-us': 'Configure Uniqueness Rule', + 'de-ch': 'Eindeutigkeitsregel konfigurieren', + 'es-es': 'Configurar regla de unicidad', + 'fr-fr': "Configurer la règle d'unicité", + 'ru-ru': 'Настроить правило уникальности', + 'uk-ua': 'Налаштувати правило унікальності', + 'pt-br': 'Configurar regra de exclusividade', }, scope: { - "en-us": "Scope", - "es-es": "Alcance", - "fr-fr": "Portée", - "ru-ru": "Объем", - "uk-ua": "Сфера застосування", - "de-ch": "Anwendungsbereich", - "pt-br": "Escopo", + 'en-us': 'Scope', + 'es-es': 'Alcance', + 'fr-fr': 'Portée', + 'ru-ru': 'Объем', + 'uk-ua': 'Сфера застосування', + 'de-ch': 'Anwendungsbereich', + 'pt-br': 'Escopo', }, uniquenessDuplicatesFound: { - "en-us": "Duplicates found in database", - "de-ch": "In der Datenbank gefundene Duplikate", - "es-es": "muchos a uno", - "fr-fr": "Doublons trouvés dans la base de données", - "ru-ru": "В базе данных найдены дубликаты", - "uk-ua": "У базі даних знайдено дублікати", - "pt-br": "Duplicatas encontradas no banco de dados", + 'en-us': 'Duplicates found in database', + 'de-ch': 'In der Datenbank gefundene Duplikate', + 'es-es': 'muchos a uno', + 'fr-fr': 'Doublons trouvés dans la base de données', + 'ru-ru': 'В базе данных найдены дубликаты', + 'uk-ua': 'У базі даних знайдено дублікати', + 'pt-br': 'Duplicatas encontradas no banco de dados', }, exportDuplicates: { - "en-us": "Export Duplicates", - "de-ch": "Duplikate exportieren", - "es-es": "Exportar duplicados", - "fr-fr": "Exporter les doublons", - "ru-ru": "Экспортировать дубликаты", - "uk-ua": "Експорт дублікатів", - "pt-br": "Exportar Duplicatas", + 'en-us': 'Export Duplicates', + 'de-ch': 'Duplikate exportieren', + 'es-es': 'Exportar duplicados', + 'fr-fr': 'Exporter les doublons', + 'ru-ru': 'Экспортировать дубликаты', + 'uk-ua': 'Експорт дублікатів', + 'pt-br': 'Exportar Duplicatas', }, numberOfDuplicates: { - "en-us": "Number of Duplicates", - "de-ch": "Anzahl Duplikate", - "es-es": "Número de duplicados", - "fr-fr": "Nombre de doublons", - "ru-ru": "Количество дубликатов", - "uk-ua": "Кількість дублікатів", - "pt-br": "Número de duplicatas", + 'en-us': 'Number of Duplicates', + 'de-ch': 'Anzahl Duplikate', + 'es-es': 'Número de duplicados', + 'fr-fr': 'Nombre de doublons', + 'ru-ru': 'Количество дубликатов', + 'uk-ua': 'Кількість дублікатів', + 'pt-br': 'Número de duplicatas', }, schemaViewTitle: { - "en-us": "Schema Config: {tableName:string}", - "es-es": "Configuración del esquema: {tableName:string}", - "fr-fr": "Configuration du schéma : {tableName:string}", - "ru-ru": "Конфигурация схемы: {tableName:string}", - "uk-ua": "Конфігурація схеми: {tableName:string}", - "de-ch": "Schema-Konfiguration: {tableName:string}", - "pt-br": "Configuração do esquema: {tableName:string}", + 'en-us': 'Schema Config: {tableName:string}', + 'es-es': 'Configuración del esquema: {tableName:string}', + 'fr-fr': 'Configuration du schéma : {tableName:string}', + 'ru-ru': 'Конфигурация схемы: {tableName:string}', + 'uk-ua': 'Конфігурація схеми: {tableName:string}', + 'de-ch': 'Schema-Konfiguration: {tableName:string}', + 'pt-br': 'Configuração do esquema: {tableName:string}', }, schemaExportFileName: { - "en-us": "Specify 7 Data Model", - "ru-ru": "Укажите 7 моделей данных", - "es-es": "Especificar 7 modelos de datos", - "fr-fr": "Spécifier 7 modèles de données", - "uk-ua": "Specify 7 моделей даних", - "de-ch": "Specify 7 Datenmodell", - "pt-br": "Especifique 7 modelos de dados", + 'en-us': 'Specify 7 Data Model', + 'ru-ru': 'Укажите 7 моделей данных', + 'es-es': 'Especificar 7 modelos de datos', + 'fr-fr': 'Spécifier 7 modèles de données', + 'uk-ua': 'Specify 7 моделей даних', + 'de-ch': 'Specify 7 Datenmodell', + 'pt-br': 'Especifique 7 modelos de dados', }, sortByHiddenFields: { - "en-us": "Sort by hidden fields", - "de-ch": "Nach ausgeblendeten Feldern sortieren", - "es-es": "Ordenar por campos ocultos", - "fr-fr": "Trier par champs cachés", - "ru-ru": "Сортировать по скрытым полям", - "uk-ua": "Сортувати за прихованими полями", - "pt-br": "Classificar por campos ocultos", + 'en-us': 'Sort by hidden fields', + 'de-ch': 'Nach ausgeblendeten Feldern sortieren', + 'es-es': 'Ordenar por campos ocultos', + 'fr-fr': 'Trier par champs cachés', + 'ru-ru': 'Сортировать по скрытым полям', + 'uk-ua': 'Сортувати за прихованими полями', + 'pt-br': 'Classificar por campos ocultos', }, hidden: { - "en-us": "hidden", - "de-ch": "versteckt", - "es-es": "oculto", - "fr-fr": "caché", - "ru-ru": "скрытый", - "uk-ua": "прихований", - "pt-br": "escondido", + 'en-us': 'hidden', + 'de-ch': 'versteckt', + 'es-es': 'oculto', + 'fr-fr': 'caché', + 'ru-ru': 'скрытый', + 'uk-ua': 'прихований', + 'pt-br': 'escondido', }, customFieldFormat: { - "en-us": "Custom Field Format", - "de-ch": "Benutzerdefiniertes Feldformat", - "es-es": "Formato de campo personalizado", - "fr-fr": "Format de champ personnalisé", - "ru-ru": "Пользовательский формат поля", - "uk-ua": "Формат користувацького поля", - "pt-br": "Formato de campo personalizado", + 'en-us': 'Custom Field Format', + 'de-ch': 'Benutzerdefiniertes Feldformat', + 'es-es': 'Formato de campo personalizado', + 'fr-fr': 'Format de champ personnalisé', + 'ru-ru': 'Пользовательский формат поля', + 'uk-ua': 'Формат користувацького поля', + 'pt-br': 'Formato de campo personalizado', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/stats.tsx b/specifyweb/frontend/js_src/lib/localization/stats.tsx index e531316937b..e71a12cd578 100644 --- a/specifyweb/frontend/js_src/lib/localization/stats.tsx +++ b/specifyweb/frontend/js_src/lib/localization/stats.tsx @@ -327,7 +327,8 @@ export const statsText = createDictionary({ 'en-us': 'Auto-Refresh Rate (Hours)', }, autoRefreshRateDescription: { - 'en-us': 'The time interval, in hours, at which the statistics page will automatically refresh its data. Default is 24.', + 'en-us': + 'The time interval, in hours, at which the statistics page will automatically refresh its data. Default is 24.', }, }); /* eslint-enable @typescript-eslint/naming-convention */ From d5e96b985cb7a5153006862471f758a8ec69ae6c Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 28 Oct 2025 13:20:23 -0400 Subject: [PATCH 087/115] removed obsolete logic for statsThreshold --- .../Preferences/UserDefinitions.tsx | 56 +------------------ 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index 7f321bafaf6..8d0393a4373 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1458,15 +1458,6 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, taxon: { @@ -1495,15 +1486,6 @@ export const userPreferenceDefinitions = { defaultValue: true, type: 'java.lang.Boolean', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, storage: { @@ -1525,15 +1507,6 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, geologicTimePeriod: { @@ -1555,15 +1528,6 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, lithoStrat: { @@ -1585,15 +1549,6 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, tectonicUnit: { @@ -1615,15 +1570,6 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), - statsThreshold: definePref({ - title: preferencesText.treeStatsThreshold(), - description: preferencesText.treeStatsThresholdDescription(), - requiresReload: false, - visible: false, - defaultValue: 99_999, - type: 'java.lang.Long', - container: 'label', - }), }, }, }, @@ -2259,4 +2205,4 @@ import('../DataModel/tables') // Not using softFail here to avoid circular dependency .catch(console.error); -ensure()(userPreferenceDefinitions); +ensure()(userPreferenceDefinitions); \ No newline at end of file From 6cec0e11ea662c9ed586bb00786084742ffe7c72 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 28 Oct 2025 13:38:34 -0400 Subject: [PATCH 088/115] stats threshold preference definitions --- .../Preferences/UserDefinitions.tsx | 56 ++++++++++++++++++- .../lib/localization/preferences.general.ts | 25 +++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index 8d0393a4373..7f321bafaf6 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1458,6 +1458,15 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, taxon: { @@ -1486,6 +1495,15 @@ export const userPreferenceDefinitions = { defaultValue: true, type: 'java.lang.Boolean', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, storage: { @@ -1507,6 +1525,15 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, geologicTimePeriod: { @@ -1528,6 +1555,15 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, lithoStrat: { @@ -1549,6 +1585,15 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, tectonicUnit: { @@ -1570,6 +1615,15 @@ export const userPreferenceDefinitions = { renderer: ColorPickerPreferenceItem, container: 'label', }), + statsThreshold: definePref({ + title: preferencesText.treeStatsThreshold(), + description: preferencesText.treeStatsThresholdDescription(), + requiresReload: false, + visible: false, + defaultValue: 99_999, + type: 'java.lang.Long', + container: 'label', + }), }, }, }, @@ -2205,4 +2259,4 @@ import('../DataModel/tables') // Not using softFail here to avoid circular dependency .catch(console.error); -ensure()(userPreferenceDefinitions); \ No newline at end of file +ensure()(userPreferenceDefinitions); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts index f17d027dffd..2cf782ba120 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts @@ -409,6 +409,31 @@ export const preferencesGeneralDictionary = { 'de-ch': 'Synonymfarbe', 'pt-br': 'Cor sinônimo', }, + treeStatsThreshold: { + 'en-us': 'Minimum rank for Collection Object counts', + 'ru-ru': 'Минимальный ранг для подсчета коллекционных объектов', + 'es-es': 'Rango mínimo para recuentos de objetos de colección', + 'fr-fr': 'Rang minimal pour les comptes des objets de collection', + 'uk-ua': 'Мінімальний ранг для підрахунку колекційних об’єктів', + 'de-ch': 'Minimaler Rang für Sammlungsobjektzählungen', + 'pt-br': 'Classificação mínima para contagens de objetos de coleção', + }, + treeStatsThresholdDescription: { + 'en-us': + 'Show Collection Object counts only for nodes with RankID greater than or equal to this value.', + 'ru-ru': + 'Показывать количество коллекционных объектов только для узлов с RankID больше или равным этому значению.', + 'es-es': + 'Mostrar recuentos de objetos de colección solo para nodos con RankID mayor o igual que este valor.', + 'fr-fr': + 'Afficher les comptes d’objets de collection uniquement pour les nœuds dont le RankID est supérieur ou égal à cette valeur.', + 'uk-ua': + 'Показувати кількість колекційних об’єктів лише для вузлів з RankID, що дорівнює або перевищує це значення.', + 'de-ch': + 'Zeige Zählungen von Sammlungsobjekten nur für Knoten mit einem RankID grösser oder gleich diesem Wert.', + 'pt-br': + 'Mostrar contagens de objetos de coleção apenas para nós com RankID maior ou igual a este valor.', + }, showNewDataSetWarning: { 'en-us': 'Show new Data Set warning', 'ru-ru': 'Показать предупреждение о новом наборе данных', From 0a586ae28bc1c43810488c69583395032beabc88 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 13:41:18 -0400 Subject: [PATCH 089/115] Use collection-scoped remote prefs for synonym and attachment defaults --- .../lib/components/Attachments/attachments.ts | 34 ++++- .../DataModel/__tests__/businessRules.test.ts | 71 ++++++++-- .../components/DataModel/treeBusinessRules.ts | 78 ++++++++++- .../__snapshots__/remotePrefs.test.ts.snap | 4 +- .../__tests__/remotePrefs.test.ts | 21 +++ .../components/InitialContext/remotePrefs.ts | 125 ++++++++++++++---- .../lib/components/TreeView/Actions.tsx | 48 ++++++- .../static/context/remoteprefs.properties | 4 +- 8 files changed, 338 insertions(+), 47 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts index fde546546b0..5940f1bdf59 100644 --- a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts +++ b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts @@ -11,9 +11,14 @@ import type { SpecifyResource } from '../DataModel/legacyTypes'; import { tables } from '../DataModel/tables'; import type { Attachment } from '../DataModel/types'; import { load } from '../InitialContext'; -import { getPref } from '../InitialContext/remotePrefs'; +import { + ensureCollectionPreferencesLoaded, + getCollectionPref, + getPref, +} from '../InitialContext/remotePrefs'; import { downloadFile } from '../Molecules/FilePicker'; import { formatUrl } from '../Router/queryString'; +import { schema } from '../DataModel/schema'; // Import SVG icons, but better than in Icons.tsx import applicationJsonIcon from './MimetypeIcons/application-json.svg'; import applicationPdfIcon from './MimetypeIcons/application-pdf.svg'; @@ -284,15 +289,40 @@ export async function uploadFile( } }) ); + const isPublicDefault = await getAttachmentPublicDefault(); + return new tables.Attachment.Resource({ attachmentlocation: data.attachmentLocation, mimetype: fixMimeType(file.type), origfilename: file.name, title: file.name, - isPublic: getPref('attachment.is_public_default'), + isPublic: isPublicDefault, }); } +async function getAttachmentPublicDefault(): Promise { + const collectionId = schema.domainLevelIds.collection; + try { + const collectionPreferences = await ensureCollectionPreferencesLoaded(); + const rawValue = + collectionPreferences + .getRaw() + ?.general?.attachments?.['attachment.is_public_default']; + if (typeof rawValue === 'boolean') return rawValue; + return collectionPreferences.get( + 'general', + 'attachments', + 'attachment.is_public_default' + ); + } catch { + try { + return getCollectionPref('attachment.is_public_default', collectionId); + } catch { + return getPref('attachment.is_public_default'); + } + } +} + /** * A temporary workaround for mimeTypes for `.docx` and `.xlsx` files being * longer than the length limit on the `Attachment.mimeType` field. diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts index 4ec08b2b697..7c0b462d6bf 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts @@ -5,8 +5,8 @@ import { overrideAjax } from '../../../tests/ajax'; import { mockTime, requireContext } from '../../../tests/helpers'; import type { RA } from '../../../utils/types'; import { overwriteReadOnly } from '../../../utils/types'; -import { getPref } from '../../InitialContext/remotePrefs'; import { cogTypes } from '../helpers'; +import { getSynonymPreferenceForTree } from '../treeBusinessRules'; import type { SerializedResource } from '../helperTypes'; import { getResourceApiUrl } from '../resource'; import { useSaveBlockers } from '../saveBlockers'; @@ -864,14 +864,20 @@ describe('treeBusinessRules', () => { expect(fieldChangeResult.current[0]).toStrictEqual(['Bad tree structure.']); }); test('saveBlocker not on synonymized parent w/preference', async () => { - const remotePrefs = await import('../../InitialContext/remotePrefs'); - jest - .spyOn(remotePrefs, 'getPref') - .mockImplementation((key) => - key === 'sp7.allow_adding_child_to_synonymized_parent.Taxon' - ? true - : getPref(key) - ); + const { collectionPreferences } = await import( + '../../Preferences/collectionPreferences' + ); + const originalRaw = collectionPreferences.getRaw(); + collectionPreferences.setRaw({ + ...originalRaw, + treeManagement: { + ...originalRaw.treeManagement, + synonymized: { + ...originalRaw.treeManagement?.synonymized, + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': true, + }, + }, + } as typeof originalRaw); const taxon = new tables.Taxon.Resource({ name: 'dauricus', @@ -887,5 +893,52 @@ describe('treeBusinessRules', () => { useSaveBlockers(taxon, tables.Taxon.getField('parent')) ); expect(result.current[0]).toStrictEqual([]); + collectionPreferences.setRaw(originalRaw); + }); + + test('getSynonymPreferenceForTree respects geologic time pref', async () => { + const { collectionPreferences } = await import( + '../../Preferences/collectionPreferences' + ); + const originalRaw = collectionPreferences.getRaw(); + collectionPreferences.setRaw({ + ...originalRaw, + treeManagement: { + ...originalRaw.treeManagement, + synonymized: { + ...originalRaw.treeManagement?.synonymized, + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': true, + }, + }, + } as typeof originalRaw); + + await expect( + getSynonymPreferenceForTree('GeologicTimePeriod') + ).resolves.toBe(true); + + collectionPreferences.setRaw(originalRaw); + }); + + test('getSynonymPreferenceForTree handles chronostrat legacy key', async () => { + const { collectionPreferences } = await import( + '../../Preferences/collectionPreferences' + ); + const originalRaw = collectionPreferences.getRaw(); + collectionPreferences.setRaw({ + ...originalRaw, + treeManagement: { + ...originalRaw.treeManagement, + synonymized: { + ...originalRaw.treeManagement?.synonymized, + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat': true, + }, + }, + } as typeof originalRaw); + + await expect( + getSynonymPreferenceForTree('GeologicTimePeriod') + ).resolves.toBe(true); + + collectionPreferences.setRaw(originalRaw); }); }); diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts index f738a71b256..ac9f4feabb8 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts @@ -1,7 +1,6 @@ import { treeText } from '../../localization/tree'; import { ajax } from '../../utils/ajax'; import { f } from '../../utils/functools'; -import { getPref } from '../InitialContext/remotePrefs'; import { fetchPossibleRanks } from '../PickLists/TreeLevelPickList'; import { formatUrl } from '../Router/queryString'; import type { BusinessRuleResult } from './businessRules'; @@ -9,6 +8,30 @@ import type { AnyTree, TableFields } from './helperTypes'; import type { SpecifyResource } from './legacyTypes'; import { idFromUrl } from './resource'; import type { Tables } from './types'; +import { schema } from './schema'; +import { + getCollectionPref, + getPref, + ensureCollectionPreferencesLoaded, + collectionPrefsDefinitions, + remotePrefsDefinitions, +} from '../InitialContext/remotePrefs'; + +export const expandSynonymPrefItemsByTable: Record< + AnyTree['tableName'], + readonly string[] +> = { + Taxon: ['sp7.allow_adding_child_to_synonymized_parent.Taxon'], + Geography: ['sp7.allow_adding_child_to_synonymized_parent.Geography'], + Storage: ['sp7.allow_adding_child_to_synonymized_parent.Storage'], + GeologicTimePeriod: [ + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', + 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', + ], + LithoStrat: ['sp7.allow_adding_child_to_synonymized_parent.LithoStrat'], + TectonicUnit: ['sp7.allow_adding_child_to_synonymized_parent.TectonicUnit'], +}; // eslint-disable-next-line unicorn/prevent-abbreviations export type TreeDefItem = @@ -40,8 +63,8 @@ export const treeBusinessRules = async ( idFromUrl(parentDefItem.get('treeDef'))! ); - const doExpandSynonymActionsPref = getPref( - `sp7.allow_adding_child_to_synonymized_parent.${resource.specifyTable.name}` + const doExpandSynonymActionsPref = await getSynonymPreferenceForTree( + resource.specifyTable.name ); const isParentSynonym = !parent.get('isAccepted'); @@ -89,6 +112,55 @@ export const treeBusinessRules = async ( ); }); +export async function getSynonymPreferenceForTree( + tableName: AnyTree['tableName'] +): Promise { + const preferenceKeys = expandSynonymPrefItemsByTable[tableName] ?? []; + const [primaryKey] = preferenceKeys; + if (typeof primaryKey !== 'string') return false; + + const collectionId = schema.domainLevelIds.collection; + + try { + const collectionPreferences = + await ensureCollectionPreferencesLoaded(); + const rawSynonymPrefs = + collectionPreferences.getRaw()?.treeManagement?.synonymized ?? {}; + + for (const key of preferenceKeys) + if (Object.prototype.hasOwnProperty.call(rawSynonymPrefs, key)) { + const value = rawSynonymPrefs[key as keyof typeof rawSynonymPrefs]; + if (typeof value === 'boolean') return value; + } + + return collectionPreferences.get('treeManagement', 'synonymized', primaryKey); + } catch { + /* ignore and try fallbacks */ + } + + for (const key of preferenceKeys) + if (Object.prototype.hasOwnProperty.call(collectionPrefsDefinitions, key)) + try { + return getCollectionPref( + key as keyof typeof collectionPrefsDefinitions, + collectionId + ); + } catch { + /* continue */ + } + + const remoteDefinitions = remotePrefsDefinitions(); + for (const key of preferenceKeys) + if (Object.prototype.hasOwnProperty.call(remoteDefinitions, key)) + try { + return getPref(key as keyof typeof remoteDefinitions); + } catch { + /* continue */ + } + + return false; +} + const getRelatedTreeTables = async < TREE extends AnyTree, TREE_DEF_ITEM extends TreeDefItem, diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap index 0ba6373e6e3..26e00d51b5f 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap @@ -67,7 +67,7 @@ exports[`fetches and parses remotePrefs correctly 1`] = ` "Treeeditor.TreeColColor2.LithoStrat": "151, 221, 255", "Treeeditor.TreeColColor2.Storage": "128, 128, 0", "Treeeditor.TreeColColor2.Taxon": "151, 221, 255", - "attachment.is_public_default": "true", + "attachment.is_public_default_32768": "true", "attachment.key": "c3wNpDBTLMedXWSb8w2TeSwHWVFLvBwiYmtU0CdOzLQtelcibV9sTXW7NxZlX68", "attachment.path": "", "attachment.preview_size": "123.3", @@ -87,6 +87,8 @@ exports[`fetches and parses remotePrefs correctly 1`] = ` "loans.dueinmons": "6", "loans.shipmeth": "FedEx", "locale": "en", + "sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod_32768": "true", + "sp7.allow_adding_child_to_synonymized_parent.Taxon_32768": "true", "recent_collection_id.Abornstein.KU_Fish_Tissue": "4", "recent_collection_id.Vertnet.KU_Fish_Tissue": "4", "recent_collection_id.abentley.KU_Fish_Tissue": "4", diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts index d545c838da1..56ecb8c4cd0 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts @@ -24,3 +24,24 @@ describe('Parsing Remote Prefs', () => { test('can retrieve collection pref', () => expect(getCollectionPref('CO_CREATE_COA', 32_678)).toBe(false)); + +test('parses collection boolean pref', () => + expect( + getCollectionPref('attachment.is_public_default', 32_768) + ).toBe(true)); + +test('parses collection tree synonym pref', () => + expect( + getCollectionPref( + 'sp7.allow_adding_child_to_synonymized_parent.Taxon', + 32_768 + ) + ).toBe(true)); + +test('parses collection chronostrat synonym pref', () => + expect( + getCollectionPref( + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', + 32_768 + ) + ).toBe(true)); diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts index 0ab66f5601c..396fd426e6f 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts @@ -126,31 +126,6 @@ export const remotePrefsDefinitions = f.store( defaultValue: 'MM/YYYY', formatters: [formatter.trim, formatter.toUpperCase], }, - 'attachment.is_public_default': { - description: 'Whether new Attachments are public by default', - defaultValue: true, - parser: 'java.lang.Boolean', - isLegacy: true, - }, - 'attachment.preview_size': { - description: 'The size in px of the generated attachment thumbnails', - defaultValue: 123, - parser: 'java.lang.Long', - isLegacy: true, - }, - // These are used on the back end only: - 'auditing.do_audits': { - description: 'Whether Audit Log is enabled', - defaultValue: true, - parser: 'java.lang.Boolean', - isLegacy: true, - }, - 'auditing.audit_field_updates': { - description: 'Whether Audit Log records field value changes', - defaultValue: true, - parser: 'java.lang.Boolean', - isLegacy: true, - }, 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': { description: 'Allowed to add children to synopsized Geologic Time Period records', @@ -158,8 +133,16 @@ export const remotePrefsDefinitions = f.store( parser: 'java.lang.Boolean', isLegacy: false, }, - 'sp7.allow_adding_child_to_synonymized_parent.Taxon': { - description: 'Allowed to add children to synopsized Taxon records', + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat': { + description: + 'Allowed to add children to synopsized Chronostratigraphy records', + defaultValue: false, + parser: 'java.lang.Boolean', + isLegacy: false, + }, + 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat': { + description: + 'Allowed to add children to synopsized Chronostratigraphy records', defaultValue: false, parser: 'java.lang.Boolean', isLegacy: false, @@ -182,6 +165,12 @@ export const remotePrefsDefinitions = f.store( parser: 'java.lang.Boolean', isLegacy: false, }, + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': { + description: 'Allowed to add children to synopsized Taxon records', + defaultValue: false, + parser: 'java.lang.Boolean', + isLegacy: false, + }, 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': { description: 'Allowed to add children to synopsized TectonicUnit records', @@ -189,6 +178,25 @@ export const remotePrefsDefinitions = f.store( parser: 'java.lang.Boolean', isLegacy: false, }, + 'attachment.preview_size': { + description: 'The size in px of the generated attachment thumbnails', + defaultValue: 123, + parser: 'java.lang.Long', + isLegacy: true, + }, + // These are used on the back end only: + 'auditing.do_audits': { + description: 'Whether Audit Log is enabled', + defaultValue: true, + parser: 'java.lang.Boolean', + isLegacy: true, + }, + 'auditing.audit_field_updates': { + description: 'Whether Audit Log records field value changes', + defaultValue: true, + parser: 'java.lang.Boolean', + isLegacy: true, + }, // This is actually stored in Global Prefs: /* * 'AUDIT_LIFESPAN_MONTHS': { @@ -227,6 +235,50 @@ export const collectionPrefsDefinitions = { defaultValue: false, parser: 'java.lang.Boolean', }, + 'attachment.is_public_default': { + separator: '_', + description: 'Whether new Attachments are public by default', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.Taxon': { + separator: '_', + description: 'Allowed to add children to synopsized Taxon records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.Geography': { + separator: '_', + description: 'Allowed to add children to synopsized Geography records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.Storage': { + separator: '_', + description: 'Allowed to add children to synopsized Storage records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': { + separator: '_', + description: + 'Allowed to add children to synopsized Geologic Time Period records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat': { + separator: '_', + description: 'Allowed to add children to synopsized LithoStrat records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, + 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': { + separator: '_', + description: + 'Allowed to add children to synopsized TectonicUnit records', + defaultValue: false, + parser: 'java.lang.Boolean', + }, sp7_scope_table_picklists: { separator: '_', description: @@ -235,3 +287,22 @@ export const collectionPrefsDefinitions = { parser: 'java.lang.Boolean', }, } as const; + +let collectionPrefsFetchPromise: Promise | undefined; + +export async function ensureCollectionPreferencesLoaded(): Promise< + typeof import('../Preferences/collectionPreferences')['collectionPreferences'] +> { + const { collectionPreferences } = await import( + '../Preferences/collectionPreferences' + ); + if (Object.keys(collectionPreferences.getRaw()).length === 0) { + if (collectionPrefsFetchPromise === undefined) + collectionPrefsFetchPromise = collectionPreferences + .fetch() + .catch(() => undefined) + .then(() => undefined); + await collectionPrefsFetchPromise; + } + return collectionPreferences; +} diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index 984a52bdfe1..3cf6dc77b0a 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -17,12 +17,15 @@ import type { SpecifyResource } from '../DataModel/legacyTypes'; import type { SpecifyTable } from '../DataModel/specifyTable'; import { genericTables } from '../DataModel/tables'; import { DeleteButton } from '../Forms/DeleteButton'; -import { getPref } from '../InitialContext/remotePrefs'; import { Dialog } from '../Molecules/Dialog'; import { ResourceLink } from '../Molecules/ResourceLink'; import { hasPermission, hasTablePermission } from '../Permissions/helpers'; import type { Row } from './helpers'; import { checkMoveViolatesEnforced } from './helpers'; +import { + expandSynonymPrefItemsByTable, + getSynonymPreferenceForTree, +} from '../DataModel/treeBusinessRules'; const treeActions = [ 'add', @@ -69,9 +72,46 @@ export function TreeViewActions({ const resourceName = `/tree/edit/${toLowerCase(tableName)}` as const; const isSynonym = typeof focusedRow?.acceptedId === 'number'; - const doExpandSynonymActionsPref = getPref( - `sp7.allow_adding_child_to_synonymized_parent.${tableName}` - ); + const [doExpandSynonymActionsPref, setDoExpandSynonymActionsPref] = + React.useState(false); + + React.useEffect(() => { + let isMounted = true; + if ( + (expandSynonymPrefItemsByTable[tableName] ?? []).length === 0 + ) { + setDoExpandSynonymActionsPref(false); + return () => { + isMounted = false; + }; + } + + const update = (): void => { + getSynonymPreferenceForTree(tableName) + .then((value) => { + if (isMounted) setDoExpandSynonymActionsPref(value); + }) + .catch(() => { + if (isMounted) setDoExpandSynonymActionsPref(false); + }); + }; + + update(); + + let unsubscribe: (() => void) | undefined; + + import('../Preferences/collectionPreferences') + .then(({ collectionPreferences }) => { + if (!isMounted) return; + unsubscribe = collectionPreferences.events.on('update', update); + }) + .catch(() => undefined); + + return () => { + isMounted = false; + unsubscribe?.(); + }; + }, [tableName]); const disableButtons = focusedRow === undefined || typeof currentAction === 'string'; diff --git a/specifyweb/frontend/js_src/lib/tests/ajax/static/context/remoteprefs.properties b/specifyweb/frontend/js_src/lib/tests/ajax/static/context/remoteprefs.properties index e5c9ecce3df..b8573351e58 100644 --- a/specifyweb/frontend/js_src/lib/tests/ajax/static/context/remoteprefs.properties +++ b/specifyweb/frontend/js_src/lib/tests/ajax/static/context/remoteprefs.properties @@ -68,7 +68,9 @@ Treeeditor.SynonymyColor.GeologicTimePeriod=0, 0, 255 AttachmentsTask.OnTaskbar.fish=true Interactions.Doing.Exchanges.fish=false recent_collection_id.testuser.KU_Fish_Tissue=32768 -attachment.is_public_default=true +attachment.is_public_default_32768=true +sp7.allow_adding_child_to_synonymized_parent.Taxon_32768=true +sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod_32768=true settings.email.username=abentley checkforupdates= recent_collection_id.sowens.KU_Fish_Tissue=4 From ef5a8f7dffea986290cf9bc63420b0efd0a73758 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 14:22:25 -0400 Subject: [PATCH 090/115] Use collection-scoped remote prefs for synonym and attachment defaults --- .../lib/components/Attachments/attachments.ts | 6 +++-- .../components/DataModel/treeBusinessRules.ts | 22 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts index 5940f1bdf59..a4efac44145 100644 --- a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts +++ b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts @@ -301,6 +301,8 @@ export async function uploadFile( } async function getAttachmentPublicDefault(): Promise { + const collectionPrefKey = + 'attachment.is_public_default' as const; const collectionId = schema.domainLevelIds.collection; try { const collectionPreferences = await ensureCollectionPreferencesLoaded(); @@ -316,9 +318,9 @@ async function getAttachmentPublicDefault(): Promise { ); } catch { try { - return getCollectionPref('attachment.is_public_default', collectionId); + return getCollectionPref(collectionPrefKey, collectionId); } catch { - return getPref('attachment.is_public_default'); + return getPref(collectionPrefKey); } } } diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts index ac9f4feabb8..5b16289dbce 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts @@ -33,6 +33,17 @@ export const expandSynonymPrefItemsByTable: Record< TectonicUnit: ['sp7.allow_adding_child_to_synonymized_parent.TectonicUnit'], }; +const isCollectionPrefKey = ( + key: string +): key is keyof typeof collectionPrefsDefinitions => + Object.prototype.hasOwnProperty.call(collectionPrefsDefinitions, key); + +const isRemotePrefKey = ( + definitions: ReturnType, + key: string +): key is keyof typeof definitions => + Object.prototype.hasOwnProperty.call(definitions, key); + // eslint-disable-next-line unicorn/prevent-abbreviations export type TreeDefItem = Tables[`${TREE['tableName']}TreeDefItem`]; @@ -139,21 +150,18 @@ export async function getSynonymPreferenceForTree( } for (const key of preferenceKeys) - if (Object.prototype.hasOwnProperty.call(collectionPrefsDefinitions, key)) + if (isCollectionPrefKey(key)) try { - return getCollectionPref( - key as keyof typeof collectionPrefsDefinitions, - collectionId - ); + return getCollectionPref(key, collectionId); } catch { /* continue */ } const remoteDefinitions = remotePrefsDefinitions(); for (const key of preferenceKeys) - if (Object.prototype.hasOwnProperty.call(remoteDefinitions, key)) + if (isRemotePrefKey(remoteDefinitions, key)) try { - return getPref(key as keyof typeof remoteDefinitions); + return getPref(key); } catch { /* continue */ } From cd711e35b09e09361cb3ca89fd83bd6b76e76cba Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 15:16:57 -0400 Subject: [PATCH 091/115] Use collection-scoped remote prefs for synonym and attachment defaults --- .../js_src/lib/components/DataModel/treeBusinessRules.ts | 8 +++++++- .../js_src/lib/components/InitialContext/remotePrefs.ts | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts index 5b16289dbce..7f21cf7d053 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts @@ -144,7 +144,13 @@ export async function getSynonymPreferenceForTree( if (typeof value === 'boolean') return value; } - return collectionPreferences.get('treeManagement', 'synonymized', primaryKey); + const defaultCollectionKey = preferenceKeys.find(isCollectionPrefKey); + if (defaultCollectionKey !== undefined) + return collectionPreferences.get( + 'treeManagement', + 'synonymized', + defaultCollectionKey + ); } catch { /* ignore and try fallbacks */ } diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts index 396fd426e6f..4ba07e6f5ea 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts @@ -126,6 +126,12 @@ export const remotePrefsDefinitions = f.store( defaultValue: 'MM/YYYY', formatters: [formatter.trim, formatter.toUpperCase], }, + 'attachment.is_public_default': { + description: 'Whether new Attachments are public by default', + defaultValue: true, + parser: 'java.lang.Boolean', + isLegacy: true, + }, 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': { description: 'Allowed to add children to synopsized Geologic Time Period records', From 6e0ba1e296e286cea53637add1e253f4e1a98fa8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 15:39:35 -0400 Subject: [PATCH 092/115] Refine collection-pref lookup for synonym and attachment defaults --- .../components/DataModel/treeBusinessRules.ts | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts index 7f21cf7d053..96167d9a14b 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts @@ -13,36 +13,36 @@ import { getCollectionPref, getPref, ensureCollectionPreferencesLoaded, - collectionPrefsDefinitions, remotePrefsDefinitions, } from '../InitialContext/remotePrefs'; -export const expandSynonymPrefItemsByTable: Record< - AnyTree['tableName'], - readonly string[] -> = { - Taxon: ['sp7.allow_adding_child_to_synonymized_parent.Taxon'], - Geography: ['sp7.allow_adding_child_to_synonymized_parent.Geography'], - Storage: ['sp7.allow_adding_child_to_synonymized_parent.Storage'], +const remoteSynonymPrefKeysByTable = { + Taxon: ['sp7.allow_adding_child_to_synonymized_parent.Taxon'] as const, + Geography: ['sp7.allow_adding_child_to_synonymized_parent.Geography'] as const, + Storage: ['sp7.allow_adding_child_to_synonymized_parent.Storage'] as const, GeologicTimePeriod: [ 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', - ], - LithoStrat: ['sp7.allow_adding_child_to_synonymized_parent.LithoStrat'], - TectonicUnit: ['sp7.allow_adding_child_to_synonymized_parent.TectonicUnit'], -}; - -const isCollectionPrefKey = ( - key: string -): key is keyof typeof collectionPrefsDefinitions => - Object.prototype.hasOwnProperty.call(collectionPrefsDefinitions, key); - -const isRemotePrefKey = ( - definitions: ReturnType, - key: string -): key is keyof typeof definitions => - Object.prototype.hasOwnProperty.call(definitions, key); + ] as const, + LithoStrat: ['sp7.allow_adding_child_to_synonymized_parent.LithoStrat'] as const, + TectonicUnit: ['sp7.allow_adding_child_to_synonymized_parent.TectonicUnit'] as const, +} as const; + +type RemoteSynonymPrefKey = typeof remoteSynonymPrefKeysByTable[keyof typeof remoteSynonymPrefKeysByTable][number]; + +type CollectionSynonymPrefKey = typeof remoteSynonymPrefKeysByTable[keyof typeof remoteSynonymPrefKeysByTable][0]; + +export const expandSynonymPrefItemsByTable = remoteSynonymPrefKeysByTable; + +const collectionSynonymPrefKeyMap = Object.fromEntries( + (Object.values(remoteSynonymPrefKeysByTable) as ReadonlyArray< + readonly RemoteSynonymPrefKey[] + >).flatMap((keys) => { + const [primary, ...aliases] = keys; + return [[primary, primary], ...aliases.map((alias) => [alias, primary])]; + }) +) as Record; // eslint-disable-next-line unicorn/prevent-abbreviations export type TreeDefItem = @@ -144,7 +144,11 @@ export async function getSynonymPreferenceForTree( if (typeof value === 'boolean') return value; } - const defaultCollectionKey = preferenceKeys.find(isCollectionPrefKey); + const defaultCollectionKey = preferenceKeys + .map((key) => collectionSynonymPrefKeyMap[key]) + .find( + (key): key is CollectionSynonymPrefKey => key !== undefined + ); if (defaultCollectionKey !== undefined) return collectionPreferences.get( 'treeManagement', @@ -155,19 +159,23 @@ export async function getSynonymPreferenceForTree( /* ignore and try fallbacks */ } - for (const key of preferenceKeys) - if (isCollectionPrefKey(key)) + for (const key of preferenceKeys) { + const collectionKey = collectionSynonymPrefKeyMap[key]; + if (collectionKey !== undefined) try { - return getCollectionPref(key, collectionId); + return getCollectionPref(collectionKey, collectionId); } catch { /* continue */ } + } const remoteDefinitions = remotePrefsDefinitions(); for (const key of preferenceKeys) - if (isRemotePrefKey(remoteDefinitions, key)) + if (key in remoteDefinitions) try { - return getPref(key); + return getPref( + key as keyof ReturnType + ); } catch { /* continue */ } From 27160c895b5af281177467d927b2f0614682e370 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 15:46:02 -0400 Subject: [PATCH 093/115] remove always-false condition in Actions --- .../frontend/js_src/lib/components/TreeView/Actions.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index 3cf6dc77b0a..e8b7ff17c31 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -77,14 +77,6 @@ export function TreeViewActions({ React.useEffect(() => { let isMounted = true; - if ( - (expandSynonymPrefItemsByTable[tableName] ?? []).length === 0 - ) { - setDoExpandSynonymActionsPref(false); - return () => { - isMounted = false; - }; - } const update = (): void => { getSynonymPreferenceForTree(tableName) From bba8088fff9646636a34a554cfcc354b03f06a0c Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 15:50:36 -0400 Subject: [PATCH 094/115] removed unused imports --- specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index e8b7ff17c31..a559a066adb 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -23,7 +23,6 @@ import { hasPermission, hasTablePermission } from '../Permissions/helpers'; import type { Row } from './helpers'; import { checkMoveViolatesEnforced } from './helpers'; import { - expandSynonymPrefItemsByTable, getSynonymPreferenceForTree, } from '../DataModel/treeBusinessRules'; From e9b8f269b6b86004fe7671468c58d7f819dc3820 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 16:03:08 -0400 Subject: [PATCH 095/115] Update remotePrefs snapshot for collection pref keys --- .../__tests__/__snapshots__/remotePrefs.test.ts.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap index 26e00d51b5f..6b9a157028d 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/__snapshots__/remotePrefs.test.ts.snap @@ -87,8 +87,6 @@ exports[`fetches and parses remotePrefs correctly 1`] = ` "loans.dueinmons": "6", "loans.shipmeth": "FedEx", "locale": "en", - "sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod_32768": "true", - "sp7.allow_adding_child_to_synonymized_parent.Taxon_32768": "true", "recent_collection_id.Abornstein.KU_Fish_Tissue": "4", "recent_collection_id.Vertnet.KU_Fish_Tissue": "4", "recent_collection_id.abentley.KU_Fish_Tissue": "4", @@ -111,6 +109,8 @@ exports[`fetches and parses remotePrefs correctly 1`] = ` "settings.email.smtp": "authsmtp.ku.edu", "settings.email.testconnection": "", "settings.email.username": "abentley", + "sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod_32768": "true", + "sp7.allow_adding_child_to_synonymized_parent.Taxon_32768": "true", "specify.bg.image": "", "ui.formatting.disciplineicon.KUFishtissue": "colobj_backstop", "ui.formatting.disciplineicon.KUFishvoucher": "colobj_backstop", From 58bb93b8da7e41e6de85dd7f789553a3d78b36c6 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 30 Oct 2025 21:48:53 +0000 Subject: [PATCH 096/115] Lint code with ESLint and Prettier Triggered by e9b8f269b6b86004fe7671468c58d7f819dc3820 on branch refs/heads/issue-7440 --- .../lib/components/Attachments/attachments.ts | 2 +- .../DataModel/__tests__/businessRules.test.ts | 5 +- .../components/DataModel/treeBusinessRules.ts | 59 ++++++++++--------- .../__tests__/remotePrefs.test.ts | 4 +- .../components/InitialContext/remotePrefs.ts | 5 +- .../lib/components/TreeView/Actions.tsx | 4 +- 6 files changed, 40 insertions(+), 39 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts index a4efac44145..ac94e79001c 100644 --- a/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts +++ b/specifyweb/frontend/js_src/lib/components/Attachments/attachments.ts @@ -8,6 +8,7 @@ import type { UploadAttachmentSpec } from '../AttachmentsBulkImport/types'; import { getField } from '../DataModel/helpers'; import type { SerializedResource } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; +import { schema } from '../DataModel/schema'; import { tables } from '../DataModel/tables'; import type { Attachment } from '../DataModel/types'; import { load } from '../InitialContext'; @@ -18,7 +19,6 @@ import { } from '../InitialContext/remotePrefs'; import { downloadFile } from '../Molecules/FilePicker'; import { formatUrl } from '../Router/queryString'; -import { schema } from '../DataModel/schema'; // Import SVG icons, but better than in Icons.tsx import applicationJsonIcon from './MimetypeIcons/application-json.svg'; import applicationPdfIcon from './MimetypeIcons/application-pdf.svg'; diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts index 7c0b462d6bf..1c982de08d2 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/businessRules.test.ts @@ -6,13 +6,13 @@ import { mockTime, requireContext } from '../../../tests/helpers'; import type { RA } from '../../../utils/types'; import { overwriteReadOnly } from '../../../utils/types'; import { cogTypes } from '../helpers'; -import { getSynonymPreferenceForTree } from '../treeBusinessRules'; import type { SerializedResource } from '../helperTypes'; import { getResourceApiUrl } from '../resource'; import { useSaveBlockers } from '../saveBlockers'; import { schema } from '../schema'; import type { SpecifyTable } from '../specifyTable'; import { tables } from '../tables'; +import { getSynonymPreferenceForTree } from '../treeBusinessRules'; import type { CollectingEvent, CollectionObjectType, @@ -907,7 +907,8 @@ describe('treeBusinessRules', () => { ...originalRaw.treeManagement, synonymized: { ...originalRaw.treeManagement?.synonymized, - 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': true, + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod': + true, }, }, } as typeof originalRaw); diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts index 96167d9a14b..8657be7e748 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/treeBusinessRules.ts @@ -1,44 +1,54 @@ import { treeText } from '../../localization/tree'; import { ajax } from '../../utils/ajax'; import { f } from '../../utils/functools'; +import { + ensureCollectionPreferencesLoaded, + getCollectionPref, + getPref, + remotePrefsDefinitions, +} from '../InitialContext/remotePrefs'; import { fetchPossibleRanks } from '../PickLists/TreeLevelPickList'; import { formatUrl } from '../Router/queryString'; import type { BusinessRuleResult } from './businessRules'; import type { AnyTree, TableFields } from './helperTypes'; import type { SpecifyResource } from './legacyTypes'; import { idFromUrl } from './resource'; -import type { Tables } from './types'; import { schema } from './schema'; -import { - getCollectionPref, - getPref, - ensureCollectionPreferencesLoaded, - remotePrefsDefinitions, -} from '../InitialContext/remotePrefs'; +import type { Tables } from './types'; const remoteSynonymPrefKeysByTable = { Taxon: ['sp7.allow_adding_child_to_synonymized_parent.Taxon'] as const, - Geography: ['sp7.allow_adding_child_to_synonymized_parent.Geography'] as const, + Geography: [ + 'sp7.allow_adding_child_to_synonymized_parent.Geography', + ] as const, Storage: ['sp7.allow_adding_child_to_synonymized_parent.Storage'] as const, GeologicTimePeriod: [ 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', ] as const, - LithoStrat: ['sp7.allow_adding_child_to_synonymized_parent.LithoStrat'] as const, - TectonicUnit: ['sp7.allow_adding_child_to_synonymized_parent.TectonicUnit'] as const, + LithoStrat: [ + 'sp7.allow_adding_child_to_synonymized_parent.LithoStrat', + ] as const, + TectonicUnit: [ + 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit', + ] as const, } as const; -type RemoteSynonymPrefKey = typeof remoteSynonymPrefKeysByTable[keyof typeof remoteSynonymPrefKeysByTable][number]; +type RemoteSynonymPrefKey = + (typeof remoteSynonymPrefKeysByTable)[keyof typeof remoteSynonymPrefKeysByTable][number]; -type CollectionSynonymPrefKey = typeof remoteSynonymPrefKeysByTable[keyof typeof remoteSynonymPrefKeysByTable][0]; +type CollectionSynonymPrefKey = + (typeof remoteSynonymPrefKeysByTable)[keyof typeof remoteSynonymPrefKeysByTable][0]; export const expandSynonymPrefItemsByTable = remoteSynonymPrefKeysByTable; const collectionSynonymPrefKeyMap = Object.fromEntries( - (Object.values(remoteSynonymPrefKeysByTable) as ReadonlyArray< - readonly RemoteSynonymPrefKey[] - >).flatMap((keys) => { + ( + Object.values( + remoteSynonymPrefKeysByTable + ) as readonly (readonly RemoteSynonymPrefKey[])[] + ).flatMap((keys) => { const [primary, ...aliases] = keys; return [[primary, primary], ...aliases.map((alias) => [alias, primary])]; }) @@ -133,22 +143,19 @@ export async function getSynonymPreferenceForTree( const collectionId = schema.domainLevelIds.collection; try { - const collectionPreferences = - await ensureCollectionPreferencesLoaded(); + const collectionPreferences = await ensureCollectionPreferencesLoaded(); const rawSynonymPrefs = collectionPreferences.getRaw()?.treeManagement?.synonymized ?? {}; for (const key of preferenceKeys) - if (Object.prototype.hasOwnProperty.call(rawSynonymPrefs, key)) { + if (Object.hasOwn(rawSynonymPrefs, key)) { const value = rawSynonymPrefs[key as keyof typeof rawSynonymPrefs]; if (typeof value === 'boolean') return value; } const defaultCollectionKey = preferenceKeys .map((key) => collectionSynonymPrefKeyMap[key]) - .find( - (key): key is CollectionSynonymPrefKey => key !== undefined - ); + .find((key): key is CollectionSynonymPrefKey => key !== undefined); if (defaultCollectionKey !== undefined) return collectionPreferences.get( 'treeManagement', @@ -156,7 +163,7 @@ export async function getSynonymPreferenceForTree( defaultCollectionKey ); } catch { - /* ignore and try fallbacks */ + /* Ignore and try fallbacks */ } for (const key of preferenceKeys) { @@ -165,7 +172,7 @@ export async function getSynonymPreferenceForTree( try { return getCollectionPref(collectionKey, collectionId); } catch { - /* continue */ + /* Continue */ } } @@ -173,11 +180,9 @@ export async function getSynonymPreferenceForTree( for (const key of preferenceKeys) if (key in remoteDefinitions) try { - return getPref( - key as keyof ReturnType - ); + return getPref(key as keyof ReturnType); } catch { - /* continue */ + /* Continue */ } return false; diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts index 56ecb8c4cd0..19c97490e65 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/__tests__/remotePrefs.test.ts @@ -26,9 +26,7 @@ test('can retrieve collection pref', () => expect(getCollectionPref('CO_CREATE_COA', 32_678)).toBe(false)); test('parses collection boolean pref', () => - expect( - getCollectionPref('attachment.is_public_default', 32_768) - ).toBe(true)); + expect(getCollectionPref('attachment.is_public_default', 32_768)).toBe(true)); test('parses collection tree synonym pref', () => expect( diff --git a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts index 4ba07e6f5ea..e09ca3d3a45 100644 --- a/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts +++ b/specifyweb/frontend/js_src/lib/components/InitialContext/remotePrefs.ts @@ -280,8 +280,7 @@ export const collectionPrefsDefinitions = { }, 'sp7.allow_adding_child_to_synonymized_parent.TectonicUnit': { separator: '_', - description: - 'Allowed to add children to synopsized TectonicUnit records', + description: 'Allowed to add children to synopsized TectonicUnit records', defaultValue: false, parser: 'java.lang.Boolean', }, @@ -297,7 +296,7 @@ export const collectionPrefsDefinitions = { let collectionPrefsFetchPromise: Promise | undefined; export async function ensureCollectionPreferencesLoaded(): Promise< - typeof import('../Preferences/collectionPreferences')['collectionPreferences'] + (typeof import('../Preferences/collectionPreferences'))['collectionPreferences'] > { const { collectionPreferences } = await import( '../Preferences/collectionPreferences' diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx index a559a066adb..400aebfcf3d 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Actions.tsx @@ -16,15 +16,13 @@ import type { AnySchema, AnyTree } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; import type { SpecifyTable } from '../DataModel/specifyTable'; import { genericTables } from '../DataModel/tables'; +import { getSynonymPreferenceForTree } from '../DataModel/treeBusinessRules'; import { DeleteButton } from '../Forms/DeleteButton'; import { Dialog } from '../Molecules/Dialog'; import { ResourceLink } from '../Molecules/ResourceLink'; import { hasPermission, hasTablePermission } from '../Permissions/helpers'; import type { Row } from './helpers'; import { checkMoveViolatesEnforced } from './helpers'; -import { - getSynonymPreferenceForTree, -} from '../DataModel/treeBusinessRules'; const treeActions = [ 'add', From f1dc60e1525d89700cf815ae620595a5474b781e Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 19:14:25 -0400 Subject: [PATCH 097/115] Allow collections to enable synonym actions via preference. --- specifyweb/backend/trees/extras.py | 117 +++++++++++++++--- .../tests/test_tree_extras/test_synonymize.py | 83 ++++++++++++- 2 files changed, 183 insertions(+), 17 deletions(-) diff --git a/specifyweb/backend/trees/extras.py b/specifyweb/backend/trees/extras.py index b37158d25b9..276bc72e1bb 100644 --- a/specifyweb/backend/trees/extras.py +++ b/specifyweb/backend/trees/extras.py @@ -1,7 +1,8 @@ +import json import re from contextlib import contextmanager import logging -from typing import List +from typing import Iterable from specifyweb.backend.trees.ranks import RankOperation, post_tree_rank_save, pre_tree_rank_deletion, \ verify_rank_parent_chain_integrity, pre_tree_rank_init, post_tree_rank_deletion @@ -17,7 +18,97 @@ from specifyweb.backend.businessrules.exceptions import TreeBusinessRuleException import specifyweb.specify.models as spmodels -from specifyweb.backend.workbench.upload.auditcodes import TREE_BULK_MOVE, TREE_MERGE, TREE_SYNONYMIZE, TREE_DESYNONYMIZE +from specifyweb.backend.workbench.upload.auditcodes import TREE_BULK_MOVE, TREE_MERGE, TREE_SYNONYMIZE, TREE_DESYNONYMIZE + +_SYNONYM_PREF_KEYS_BY_TABLE: dict[str, tuple[str, ...]] = { + 'GeologicTimePeriod': ( + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', + 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', + ), + 'ChronosStrat': ( + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', + 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', + ), + 'ChronoStrat': ( + 'sp7.allow_adding_child_to_synonymized_parent.ChronoStrat', + 'sp7.allow_adding_child_to_synonymized_parent.GeologicTimePeriod', + 'sp7.allow_adding_child_to_synonymized_parent.ChronosStrat', + ), +} + + +def _synonym_pref_keys(node) -> tuple[str, ...]: + table_name = node.specify_model.name + base_key = f'sp7.allow_adding_child_to_synonymized_parent.{table_name}' + keys = _SYNONYM_PREF_KEYS_BY_TABLE.get(table_name) + if keys is None: + return (base_key,) + + if keys and keys[0] == base_key: + return keys + return (base_key, *keys) + + +def _collection_synonym_pref_enabled(keys: Iterable[str]) -> bool: + from specifyweb.specify.models import Spappresourcedata + + qs = Spappresourcedata.objects.filter( + spappresource__name='CollectionPreferences' + ).values_list('data', flat=True) + + for raw_data in qs: + if not raw_data: + continue + if isinstance(raw_data, memoryview): + raw_data = raw_data.tobytes() + if isinstance(raw_data, (bytes, bytearray)): + try: + raw_data = raw_data.decode('utf-8') + except UnicodeDecodeError: + continue + try: + prefs = json.loads(raw_data) + except (TypeError, ValueError): + continue + + if not isinstance(prefs, dict): + continue + + tree_management = prefs.get('treeManagement') + if not isinstance(tree_management, dict): + continue + + synonymized = tree_management.get('synonymized') + if not isinstance(synonymized, dict): + continue + + for key in keys: + value = synonymized.get(key) + if value is True: + return True + + return False + + +def _remote_synonym_pref_enabled(keys: Iterable[str]) -> bool: + from specifyweb.backend.context.remote_prefs import get_remote_prefs + + prefs_text = get_remote_prefs() + for key in keys: + pattern = r'^' + re.escape(key) + r'(?:_\d+)?=(.+)' + override = re.search(pattern, prefs_text, re.MULTILINE) + if override is not None and override.group(1).strip().lower() == "true": + return True + return False + + +def _synonym_override_enabled(node) -> bool: + """Return True when collection or remote prefs allow actions on synonymized parents.""" + + keys = _synonym_pref_keys(node) + return _collection_synonym_pref_enabled(keys) or _remote_synonym_pref_enabled(keys) @contextmanager def validate_node_numbers(table, revalidate_after=True): @@ -209,11 +300,10 @@ def adding_node(node): model = type(node) parent = model.objects.select_for_update().get(id=node.parent.id) if parent.accepted_id is not None: - from specifyweb.backend.context.remote_prefs import get_remote_prefs - # This business rule can be overriden by a remote pref. - pattern = r'^sp7\.allow_adding_child_to_synonymized_parent\.' + node.specify_model.name + '=(.+)' - override = re.search(pattern, get_remote_prefs(), re.MULTILINE) - if override is None or override.group(1).strip().lower() != "true": + if not _synonym_override_enabled(node): + node_children = [] if node.pk is None else list(node.children.values('id', 'fullname')) + parent_children = list(parent.children.values('id', 'fullname')) + parent_parent_id = parent.parent.id if parent.parent_id else None raise TreeBusinessRuleException( f'Adding node "{node.fullname}" to synonymized parent "{parent.fullname}"', {"tree" : "Taxon", @@ -224,14 +314,14 @@ def adding_node(node): "rankid" : node.rankid, "fullName" : node.fullname, "parentid": node.parent.id, - "children": list(node.children.values('id', 'fullname')) + "children": node_children }, "parent" : { "id" : parent.id, "rankid" : parent.rankid, "fullName" : parent.fullname, - "parentid": parent.parent.id, - "children": list(parent.children.values('id', 'fullname')) + "parentid": parent_parent_id, + "children": parent_children }}) insertion_point = open_interval(model, parent.nodenumber, 1) @@ -397,11 +487,8 @@ def synonymize(node, into, agent): node.isaccepted = False node.save() - # This check can be disabled by a remote pref - from specifyweb.backend.context.remote_prefs import get_remote_prefs - pattern = r'^sp7\.allow_adding_child_to_synonymized_parent\.' + node.specify_model.name + '=(.+)' - override = re.search(pattern, get_remote_prefs(), re.MULTILINE) - if node.children.count() > 0 and (override is None or override.group(1).strip().lower() != "true"): + # This check can be disabled by a remote or collection preference override + if node.children.count() > 0 and not _synonym_override_enabled(node): raise TreeBusinessRuleException( f'Synonymizing node "{node.fullname}" which has children', {"tree" : "Taxon", diff --git a/specifyweb/backend/trees/tests/test_tree_extras/test_synonymize.py b/specifyweb/backend/trees/tests/test_tree_extras/test_synonymize.py index ef724e0c7fe..107c2d2b012 100644 --- a/specifyweb/backend/trees/tests/test_tree_extras/test_synonymize.py +++ b/specifyweb/backend/trees/tests/test_tree_extras/test_synonymize.py @@ -1,11 +1,77 @@ +import json + from specifyweb.backend.businessrules.exceptions import TreeBusinessRuleException -from specifyweb.specify.models import Determination, Taxon, Taxontreedef +from specifyweb.specify.models import ( + Determination, + Spappresource, + Spappresourcedata, + Spappresourcedir, + Taxon, + Taxontreedef, +) from specifyweb.backend.trees.tests.test_trees import GeographyTree from specifyweb.backend.trees.extras import synonymize class TestSynonymize(GeographyTree): + def _set_synonym_pref(self, key: str, value: bool = True) -> None: + app_dir = Spappresourcedir.objects.filter( + ispersonal=False, + collection=self.collection, + discipline=self.discipline, + specifyuser=self.specifyuser, + ).first() + if app_dir is None: + app_dir = Spappresourcedir.objects.create( + ispersonal=False, + collection=self.collection, + discipline=self.discipline, + specifyuser=self.specifyuser, + ) + + app_resource = Spappresource.objects.filter( + spappresourcedir=app_dir, + name="CollectionPreferences", + specifyuser=self.specifyuser, + ).first() + if app_resource is None: + app_resource = Spappresource.objects.create( + spappresourcedir=app_dir, + name="CollectionPreferences", + level=0, + metadata="", + mimetype="application/json", + specifyuser=self.specifyuser, + ) + + app_data = Spappresourcedata.objects.filter( + spappresource=app_resource + ).first() + if app_data is None: + app_data = Spappresourcedata.objects.create( + spappresource=app_resource, + data=json.dumps({}), + ) + + raw_data = app_data.data + if isinstance(raw_data, memoryview): + raw_data = raw_data.tobytes() + if isinstance(raw_data, (bytes, bytearray)): + raw_data = raw_data.decode('utf-8') + + try: + prefs = json.loads(raw_data if raw_data else '{}') + except (TypeError, ValueError): + prefs = {} + + tree_management = prefs.setdefault('treeManagement', {}) + synonymized = tree_management.setdefault('synonymized', {}) + synonymized[key] = value + + app_data.data = json.dumps(prefs) + app_data.save() + def test_different_type(self): with self.assertRaises(AssertionError) as context: synonymize(self.na, self.collectionobjects[0], self.agent) @@ -69,6 +135,19 @@ def test_synonymize_geography_target_children(self): self.assertEqual(context.exception.args[1]['localizationKey'], "nodeSynonimizeWithChildren") + def test_synonymize_geography_target_children_with_collection_pref(self): + self._set_synonym_pref( + 'sp7.allow_adding_child_to_synonymized_parent.Geography', + True, + ) + + try: + synonymize(self.kansas, self.mo, self.agent) + except TreeBusinessRuleException: + self.fail( + 'synonymize raised TreeBusinessRuleException despite collection preference override' + ) + def test_synonymize_taxon_no_target_children(self): life = Taxon.objects.create( @@ -141,4 +220,4 @@ def test_synonymize_taxon_no_target_children(self): self.assertEqual(det_plantae_1.preferredtaxon_id, plantae.id) self.assertEqual(det_plantae_2.preferredtaxon_id, plantae.id) - \ No newline at end of file + From 8457181243e5e36298959b5fb9fa68b7e5ab3570 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 20:47:52 -0400 Subject: [PATCH 098/115] =?UTF-8?q?Fix=20picklist=20scoping=20to=20respect?= =?UTF-8?q?=20=E2=80=9CScope=20Entire=20Table=E2=80=9D=20preference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PickLists/__tests__/fetch.test.ts | 13 ++++++ .../js_src/lib/components/PickLists/fetch.ts | 43 +++++++++++++++---- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index 7889b2f32a5..a7a97f2ab58 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -18,6 +18,10 @@ const { unsafeFetchPickList, fetchPickListItems } = exportsForTests; requireContext(); +afterEach(() => { + jest.restoreAllMocks(); +}); + describe('unsafeFetchPickList', () => { test('front-end pick list', async () => { const resource = await unsafeFetchPickList('_AgentTypeComboBox'); @@ -148,6 +152,12 @@ describe('fetchPickListItems', () => { }); test('Picklistitems for Entire Table scoped by default', async () => { + const remotePrefs = await import('../../InitialContext/remotePrefs'); + jest + .spyOn(remotePrefs, 'ensureCollectionPreferencesLoaded') + .mockRejectedValue(new Error('no prefs')); + jest.spyOn(remotePrefs, 'getCollectionPref').mockReturnValue(true); + const picklist = deserializeResource( addMissingFields('PickList', { type: PickListTypes.TABLE, @@ -163,6 +173,9 @@ describe('fetchPickListItems', () => { test('Picklistitems unscoped for sp7_scope_table_picklists', async () => { const remotePrefs = await import('../../InitialContext/remotePrefs'); + jest + .spyOn(remotePrefs, 'ensureCollectionPreferencesLoaded') + .mockRejectedValue(new Error('no prefs')); jest .spyOn(remotePrefs, 'getCollectionPref') .mockImplementation(() => false); diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts index 1b6bcf4b785..3fd21f0e73b 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts @@ -24,7 +24,10 @@ import type { PickList, PickListItem, Tables } from '../DataModel/types'; import { softFail } from '../Errors/Crash'; import { format } from '../Formatters/formatters'; import type { PickListItemSimple } from '../FormFields/ComboBox'; -import { getCollectionPref } from '../InitialContext/remotePrefs'; +import { + ensureCollectionPreferencesLoaded, + getCollectionPref, +} from '../InitialContext/remotePrefs'; import { hasTablePermission, hasToolPermission } from '../Permissions/helpers'; import { createPickListItem, @@ -118,18 +121,40 @@ async function fetchFromTable( pickList: SpecifyResource, limit: number ): Promise> { - const tableName = strictGetTable(pickList.get('tableName')).name; + const specifyTable = strictGetTable(pickList.get('tableName')); + const tableName = specifyTable.name; if (!hasTablePermission(tableName, 'read')) return []; - const scopeTablePicklist = getCollectionPref( - 'sp7_scope_table_picklists', - schema.domainLevelIds.collection - ); + let scopeTablePicklist: boolean; + try { + const collectionPreferences = await ensureCollectionPreferencesLoaded(); + const rawValue = + collectionPreferences + .getRaw() + ?.general?.pickLists?.sp7_scope_table_picklists; + scopeTablePicklist = + typeof rawValue === 'boolean' + ? rawValue + : collectionPreferences.get( + 'general', + 'pickLists', + 'sp7_scope_table_picklists' + ); + } catch { + scopeTablePicklist = getCollectionPref( + 'sp7_scope_table_picklists', + schema.domainLevelIds.collection + ); + } + const tableHasScope = specifyTable.getScope() !== undefined; const { records } = await fetchCollection(tableName, { - domainFilter: scopeTablePicklist - ? true - : !f.includes(Object.keys(schema.domainLevelIds), toLowerCase(tableName)), + domainFilter: + tableHasScope === false + ? undefined + : scopeTablePicklist + ? true + : false, limit, }); return Promise.all( From 51e1d5c91a83f44b692b3f46f2747e030cb6b96a Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 20:57:33 -0400 Subject: [PATCH 099/115] Fix Entire Table picklist scoping toggle to respect collection prefs --- .../js_src/lib/components/PickLists/__tests__/fetch.test.ts | 2 +- specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index a7a97f2ab58..f8b07871992 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -141,7 +141,7 @@ describe('fetchPickListItems', () => { objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], }); - overrideAjax('/api/specify/collection/?limit=0', { +overrideAjax('/api/specify/collection/?domainfilter=false&limit=0', { meta: { total_count: 2, }, diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts index 3fd21f0e73b..56b5a6af367 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts @@ -148,9 +148,12 @@ async function fetchFromTable( } const tableHasScope = specifyTable.getScope() !== undefined; + const tableSupportsDomainFilter = + tableHasScope || + !f.includes(Object.keys(schema.domainLevelIds), toLowerCase(tableName)); const { records } = await fetchCollection(tableName, { domainFilter: - tableHasScope === false + tableSupportsDomainFilter === false ? undefined : scopeTablePicklist ? true From d99d8c2939fd42312bcefb961d52871b401508f8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 21:02:59 -0400 Subject: [PATCH 100/115] Fix Entire Table picklist scoping toggle to respect collection prefs --- .../PickLists/__tests__/fetch.test.ts | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index f8b07871992..3251c15fd5e 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -111,12 +111,21 @@ describe('fetchPickListItems', () => { await expect(fetchPickListItems(pickList)).resolves.toEqual(pickListItems); }); - overrideAjax('/api/specify/locality/?domainfilter=true&limit=0', { - meta: { - total_count: 1, - }, - objects: [{ id: 3, _tableName: 'Locality', localityname: 'abc' }], - }); +overrideAjax('/api/specify/locality/?domainfilter=true&limit=0', { + meta: { + total_count: 1, + }, + objects: [{ id: 3, _tableName: 'Locality', localityname: 'abc' }], +}); +overrideAjax('/api/specify/locality/?domainfilter=false&limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 3, _tableName: 'Locality', localityname: 'abc' }, + { id: 4, _tableName: 'Locality', localityname: 'def' }, + ], +}); test('pick list from entire table', async () => { const pickList = deserializeResource( addMissingFields('PickList', { @@ -134,18 +143,18 @@ describe('fetchPickListItems', () => { ]); }); - overrideAjax('/api/specify/collection/?domainfilter=true&limit=0', { - meta: { - total_count: 1, - }, - objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], +overrideAjax('/api/specify/collection/?domainfilter=true&limit=0', { + meta: { + total_count: 1, + }, + objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], }); overrideAjax('/api/specify/collection/?domainfilter=false&limit=0', { - meta: { - total_count: 2, - }, - objects: [ + meta: { + total_count: 2, + }, + objects: [ { id: 1, _tableName: 'Collection', collectionname: 'abc' }, { id: 2, _tableName: 'Collection', collectionname: 'cba' }, ], From a6a1065f9865f56079640f128bc713fe1e2d27a2 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 21:10:23 -0400 Subject: [PATCH 101/115] Added ajax overrides for the unscoped requests --- .../PickLists/__tests__/fetch.test.ts | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index 3251c15fd5e..673d61d5fe2 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -143,22 +143,42 @@ overrideAjax('/api/specify/locality/?domainfilter=false&limit=0', { ]); }); +overrideAjax('/api/specify/locality/?limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 3, _tableName: 'Locality', localityname: 'abc' }, + { id: 4, _tableName: 'Locality', localityname: 'def' }, + ], +}); + overrideAjax('/api/specify/collection/?domainfilter=true&limit=0', { meta: { total_count: 1, }, objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], - }); +}); overrideAjax('/api/specify/collection/?domainfilter=false&limit=0', { meta: { total_count: 2, }, objects: [ - { id: 1, _tableName: 'Collection', collectionname: 'abc' }, - { id: 2, _tableName: 'Collection', collectionname: 'cba' }, - ], - }); + { id: 1, _tableName: 'Collection', collectionname: 'abc' }, + { id: 2, _tableName: 'Collection', collectionname: 'cba' }, + ], +}); + +overrideAjax('/api/specify/collection/?limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 1, _tableName: 'Collection', collectionname: 'abc' }, + { id: 2, _tableName: 'Collection', collectionname: 'cba' }, + ], +}); test('Picklistitems for Entire Table scoped by default', async () => { const remotePrefs = await import('../../InitialContext/remotePrefs'); From 9b814bb0457baa2bce618bb6504dcc2933162ed7 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 31 Oct 2025 21:30:22 -0400 Subject: [PATCH 102/115] fixed failing tests --- .../PickLists/__tests__/fetch.test.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index 673d61d5fe2..0bc3487582f 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -126,12 +126,18 @@ overrideAjax('/api/specify/locality/?domainfilter=false&limit=0', { { id: 4, _tableName: 'Locality', localityname: 'def' }, ], }); - test('pick list from entire table', async () => { - const pickList = deserializeResource( - addMissingFields('PickList', { - type: PickListTypes.TABLE, - tableName: 'Locality', - pickListItems: [ +test('pick list from entire table', async () => { + const remotePrefs = await import('../../InitialContext/remotePrefs'); + jest + .spyOn(remotePrefs, 'ensureCollectionPreferencesLoaded') + .mockRejectedValue(new Error('no prefs')); + jest.spyOn(remotePrefs, 'getCollectionPref').mockReturnValue(true); + + const pickList = deserializeResource( + addMissingFields('PickList', { + type: PickListTypes.TABLE, + tableName: 'Locality', + pickListItems: [ // Should ignore this pick list item addMissingFields('PickListItem', { title: 'a', value: 'b' }), ], From 579a30bb6cdb9c1512a00c54a7acfde6cbc241c0 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 2 Nov 2025 15:40:44 -0500 Subject: [PATCH 103/115] Enable collection-level catalog-number inheritance toggles --- .../frontend/js_src/lib/components/FormFields/Field.tsx | 6 +++--- .../lib/components/Preferences/CollectionDefinitions.tsx | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx b/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx index 1fb8295b8dc..1d1f69191a2 100644 --- a/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormFields/Field.tsx @@ -139,14 +139,14 @@ function Field({ // Check if collection pref wants to inherit primary cat num for empty CO cat num sibilings inside of a COG const [displayPrimaryCatNumberPref] = collectionPreferences.use( 'catalogNumberInheritance', - 'collectionObject', + 'behavior', 'inheritance' ); // Check if collection pref wants to inherit parent cat num for empty CO cat num children const [displayParentCatNumberPref] = collectionPreferences.use( - 'catalogNumberInheritance', - 'component', + 'catalogNumberParentInheritance', + 'behavior', 'inheritance' ); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index e867562f7fa..a8944be59fc 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -203,7 +203,7 @@ export const collectionPreferenceDefinitions = { catalogNumberInheritance: { title: queryText.catalogNumberInheritance(), subCategories: { - collectionObject: { + behavior: { title: () => tableLabel('CollectionObjectGroup'), items: { inheritance: definePref({ @@ -230,7 +230,12 @@ export const collectionPreferenceDefinitions = { }), }, }, - component: { + }, + }, + catalogNumberParentInheritance: { + title: queryText.catalogNumberInheritance(), + subCategories: { + behavior: { title: () => camelToHuman('Component'), items: { inheritance: definePref({ From e8b6976730069ac0d2dbda3485e2c749c4e71a4b Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 2 Nov 2025 23:05:42 +0000 Subject: [PATCH 104/115] Lint code with ESLint and Prettier Triggered by 579a30bb6cdb9c1512a00c54a7acfde6cbc241c0 on branch refs/heads/issue-7440 --- .../PickLists/__tests__/fetch.test.ts | 120 +++++++++--------- .../js_src/lib/components/PickLists/fetch.ts | 14 +- 2 files changed, 65 insertions(+), 69 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts index 0bc3487582f..25f200f6147 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/__tests__/fetch.test.ts @@ -111,33 +111,33 @@ describe('fetchPickListItems', () => { await expect(fetchPickListItems(pickList)).resolves.toEqual(pickListItems); }); -overrideAjax('/api/specify/locality/?domainfilter=true&limit=0', { - meta: { - total_count: 1, - }, - objects: [{ id: 3, _tableName: 'Locality', localityname: 'abc' }], -}); -overrideAjax('/api/specify/locality/?domainfilter=false&limit=0', { - meta: { - total_count: 2, - }, - objects: [ - { id: 3, _tableName: 'Locality', localityname: 'abc' }, - { id: 4, _tableName: 'Locality', localityname: 'def' }, - ], -}); -test('pick list from entire table', async () => { - const remotePrefs = await import('../../InitialContext/remotePrefs'); - jest - .spyOn(remotePrefs, 'ensureCollectionPreferencesLoaded') - .mockRejectedValue(new Error('no prefs')); - jest.spyOn(remotePrefs, 'getCollectionPref').mockReturnValue(true); - - const pickList = deserializeResource( - addMissingFields('PickList', { - type: PickListTypes.TABLE, - tableName: 'Locality', - pickListItems: [ + overrideAjax('/api/specify/locality/?domainfilter=true&limit=0', { + meta: { + total_count: 1, + }, + objects: [{ id: 3, _tableName: 'Locality', localityname: 'abc' }], + }); + overrideAjax('/api/specify/locality/?domainfilter=false&limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 3, _tableName: 'Locality', localityname: 'abc' }, + { id: 4, _tableName: 'Locality', localityname: 'def' }, + ], + }); + test('pick list from entire table', async () => { + const remotePrefs = await import('../../InitialContext/remotePrefs'); + jest + .spyOn(remotePrefs, 'ensureCollectionPreferencesLoaded') + .mockRejectedValue(new Error('no prefs')); + jest.spyOn(remotePrefs, 'getCollectionPref').mockReturnValue(true); + + const pickList = deserializeResource( + addMissingFields('PickList', { + type: PickListTypes.TABLE, + tableName: 'Locality', + pickListItems: [ // Should ignore this pick list item addMissingFields('PickListItem', { title: 'a', value: 'b' }), ], @@ -149,42 +149,42 @@ test('pick list from entire table', async () => { ]); }); -overrideAjax('/api/specify/locality/?limit=0', { - meta: { - total_count: 2, - }, - objects: [ - { id: 3, _tableName: 'Locality', localityname: 'abc' }, - { id: 4, _tableName: 'Locality', localityname: 'def' }, - ], -}); + overrideAjax('/api/specify/locality/?limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 3, _tableName: 'Locality', localityname: 'abc' }, + { id: 4, _tableName: 'Locality', localityname: 'def' }, + ], + }); -overrideAjax('/api/specify/collection/?domainfilter=true&limit=0', { - meta: { - total_count: 1, - }, - objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], -}); + overrideAjax('/api/specify/collection/?domainfilter=true&limit=0', { + meta: { + total_count: 1, + }, + objects: [{ id: 1, _tableName: 'Collection', collectionname: 'abc' }], + }); -overrideAjax('/api/specify/collection/?domainfilter=false&limit=0', { - meta: { - total_count: 2, - }, - objects: [ - { id: 1, _tableName: 'Collection', collectionname: 'abc' }, - { id: 2, _tableName: 'Collection', collectionname: 'cba' }, - ], -}); + overrideAjax('/api/specify/collection/?domainfilter=false&limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 1, _tableName: 'Collection', collectionname: 'abc' }, + { id: 2, _tableName: 'Collection', collectionname: 'cba' }, + ], + }); -overrideAjax('/api/specify/collection/?limit=0', { - meta: { - total_count: 2, - }, - objects: [ - { id: 1, _tableName: 'Collection', collectionname: 'abc' }, - { id: 2, _tableName: 'Collection', collectionname: 'cba' }, - ], -}); + overrideAjax('/api/specify/collection/?limit=0', { + meta: { + total_count: 2, + }, + objects: [ + { id: 1, _tableName: 'Collection', collectionname: 'abc' }, + { id: 2, _tableName: 'Collection', collectionname: 'cba' }, + ], + }); test('Picklistitems for Entire Table scoped by default', async () => { const remotePrefs = await import('../../InitialContext/remotePrefs'); diff --git a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts index 56b5a6af367..6a187a28675 100644 --- a/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts +++ b/specifyweb/frontend/js_src/lib/components/PickLists/fetch.ts @@ -129,9 +129,8 @@ async function fetchFromTable( try { const collectionPreferences = await ensureCollectionPreferencesLoaded(); const rawValue = - collectionPreferences - .getRaw() - ?.general?.pickLists?.sp7_scope_table_picklists; + collectionPreferences.getRaw()?.general?.pickLists + ?.sp7_scope_table_picklists; scopeTablePicklist = typeof rawValue === 'boolean' ? rawValue @@ -152,12 +151,9 @@ async function fetchFromTable( tableHasScope || !f.includes(Object.keys(schema.domainLevelIds), toLowerCase(tableName)); const { records } = await fetchCollection(tableName, { - domainFilter: - tableSupportsDomainFilter === false - ? undefined - : scopeTablePicklist - ? true - : false, + domainFilter: tableSupportsDomainFilter + ? Boolean(scopeTablePicklist) + : undefined, limit, }); return Promise.all( From 0964161923bf0ace8cd55b0de697bb1a9b001b47 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Thu, 13 Nov 2025 21:16:50 -0500 Subject: [PATCH 105/115] Collection Preferences menu visibility based on roles and App Resource permissions --- .../lib/components/AppResources/Create.tsx | 17 +++-- .../lib/components/AppResources/Filters.tsx | 34 +++++++-- .../__tests__/AppResourcesAside.test.tsx | 9 +++ .../__tests__/AppResourcesFilters.test.tsx | 50 +++++++++++++ .../components/AppResources/filtersHelpers.ts | 11 ++- .../components/AppResources/permissions.ts | 75 +++++++++++++++++++ .../components/Header/userToolDefinitions.ts | 9 +-- .../lib/components/Permissions/definitions.ts | 1 + .../lib/components/Preferences/index.tsx | 13 +++- .../lib/components/Security/registry.ts | 12 ++- .../js_src/lib/components/Security/utils.ts | 7 +- 11 files changed, 209 insertions(+), 29 deletions(-) create mode 100644 specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx index 1f4b82d129c..be7917acfff 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx @@ -32,6 +32,7 @@ import type { AppResourcesTree } from './hooks'; import { useResourcesTree } from './hooks'; import type { AppResourcesOutlet } from './index'; import type { AppResourceType, ScopedAppResourceDir } from './types'; +import { shouldShowCollectionPreferenceSubType } from './permissions'; import { appResourceSubTypes, appResourceTypes } from './types'; /** @@ -60,6 +61,7 @@ export function CreateAppResource(): JSX.Element { const [templateFile, setTemplateFile] = React.useState< string | false | undefined >(undefined); + const canSeeCollectionPreferences = shouldShowCollectionPreferenceSubType(); return directory === undefined ? ( ) : type === undefined ? ( @@ -98,11 +100,16 @@ export function CreateAppResource(): JSX.Element { - {Object.entries(appResourceSubTypes).map( - ([ - key, - { icon, mimeType, name = '', documentationUrl, label, ...rest }, - ]) => + {Object.entries(appResourceSubTypes) + .filter( + ([key]) => + key !== 'collectionPreferences' || canSeeCollectionPreferences + ) + .map( + ([ + key, + { icon, mimeType, name = '', documentationUrl, label, ...rest }, + ]) => 'scope' in rest && !f.includes(rest.scope, directory.scope) ? undefined : ( diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx index e5ddd5ded39..107386f9906 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx @@ -22,6 +22,7 @@ import { isAllAppResourceTypes, } from './filtersHelpers'; import type { AppResources } from './hooks'; +import { shouldShowCollectionPreferenceSubType } from './permissions'; import { appResourceSubTypes, appResourceTypes } from './types'; export function AppResourcesFilters({ @@ -33,12 +34,23 @@ export function AppResourcesFilters({ 'appResources', 'filters' ); + const canSeeCollectionPreferences = shouldShowCollectionPreferenceSubType(); + const visibleAppResources = React.useMemo( + () => + canSeeCollectionPreferences + ? allAppResources + : allAppResources.filter((type) => type !== 'collectionPreferences'), + [canSeeCollectionPreferences] + ); - const showAllResources = isAllAppResourceTypes(filters.appResources); + const showAllResources = isAllAppResourceTypes( + filters.appResources, + visibleAppResources + ); const handleToggleResources = (): void => setFilters({ ...filters, - appResources: showAllResources ? [] : allAppResources, + appResources: showAllResources ? [] : visibleAppResources, }); const [isOpen, handleOpen, handleClose] = useBooleanState(); @@ -63,7 +75,9 @@ export function AppResourcesFilters({ setFilters({ viewSets: false, appResources: - filters.viewSets || !showAllResources ? allAppResources : [], + filters.viewSets || !showAllResources + ? visibleAppResources + : [], }) } > @@ -116,14 +130,19 @@ export function AppResourcesFilters({ {commonText.countLine({ resource: resourcesText.appResources(), count: countAppResources(initialResources, { - appResources: allAppResources, + appResources: visibleAppResources, viewSets: false, }), })}
    - {Object.entries(appResourceSubTypes).map( - ([key, { label, icon, documentationUrl }]): JSX.Element => ( + {Object.entries(appResourceSubTypes) + .filter( + ([key]) => + key !== 'collectionPreferences' || + canSeeCollectionPreferences + ) + .map(([key, { label, icon, documentationUrl }]): JSX.Element => (
  • - ) - )} + ))}
diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx index d661ae50a83..fe96ad44ba4 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx @@ -8,6 +8,15 @@ import type { AppResourcesConformation } from '../Aside'; import { AppResourcesAside } from '../Aside'; import { testAppResources } from './testAppResources'; +jest.mock('../permissions', () => { + const actual = jest.requireActual('../permissions'); + return { + ...actual, + filterCollectionPreferencesResources: (resources: any[]) => resources, + canAccessCollectionPreferencesResource: () => true, + }; +}); + requireContext(); describe('AppResourcesAside (simple no conformation case)', () => { diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx index 9f67a920b45..e14420381f1 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx @@ -6,7 +6,27 @@ import { UnloadProtectsContext } from '../../Router/UnloadProtect'; import { AppResourcesFilters } from '../Filters'; import { testAppResources } from './testAppResources'; +const mockCanSeeCollectionPreferences = jest.fn(() => false); + +jest.mock('../permissions', () => { + const actual = jest.requireActual('../permissions'); + return { + ...actual, + canAccessCollectionPreferencesResource: () => + mockCanSeeCollectionPreferences(), + shouldShowCollectionPreferenceSubType: () => + mockCanSeeCollectionPreferences(), + filterCollectionPreferencesResources: (resources: any[]) => + mockCanSeeCollectionPreferences() + ? resources + : resources.filter( + (resource) => resource?.name !== 'CollectionPreferences' + ), + }; +}); + beforeEach(() => { + mockCanSeeCollectionPreferences.mockReturnValue(true); setCache( 'appResources', 'filters', @@ -99,4 +119,34 @@ describe('AppResourcesFilters', () => { viewSets: true, }); }); + + test('collection preferences option visible when permitted', async () => { + mockCanSeeCollectionPreferences.mockReturnValue(true); + + const { getAllByRole, user } = mount( + + ); + + const button = getAllByRole('button')[1]; + + await user.click(button); + + const filters = getCache('appResources', 'filters'); + expect(filters).toBeDefined(); + expect(filters?.appResources).toContain('collectionPreferences'); + }); + + test('collection preferences option hidden when not permitted', async () => { + mockCanSeeCollectionPreferences.mockReturnValue(false); + + const { getAllByRole, user } = mount( + + ); + + const button = getAllByRole('button')[1]; + await user.click(button); + + const filters = getCache('appResources', 'filters'); + expect(filters?.appResources).not.toContain('collectionPreferences'); + }); }); diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/filtersHelpers.ts b/specifyweb/frontend/js_src/lib/components/AppResources/filtersHelpers.ts index 446eb29de05..e252f484d36 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/filtersHelpers.ts +++ b/specifyweb/frontend/js_src/lib/components/AppResources/filtersHelpers.ts @@ -5,6 +5,7 @@ import { toResource } from '../DataModel/helpers'; import type { SerializedResource } from '../DataModel/helperTypes'; import type { SpAppResource, SpViewSetObj } from '../DataModel/types'; import type { AppResources } from './hooks'; +import { filterCollectionPreferencesResources } from './permissions'; import { appResourceSubTypes } from './types'; export const allAppResources = Array.from( @@ -25,10 +26,11 @@ export type AppResourceFilters = { * Determine if all app resource types are visible */ export const isAllAppResourceTypes = ( - appResources: RA + appResources: RA, + universe: RA = allAppResources ): boolean => JSON.stringify(Array.from(appResources).sort(sortFunction(f.id))) === - JSON.stringify(allAppResources); + JSON.stringify(universe); export function countAppResources( resources: AppResources, @@ -44,14 +46,15 @@ export const filterAppResources = ( ): AppResources => ({ ...resources, viewSets: filters.viewSets ? resources.viewSets : [], - appResources: + appResources: filterCollectionPreferencesResources( filters.appResources.length === 0 ? [] : isAllAppResourceTypes(filters.appResources) ? resources.appResources : resources.appResources.filter((resource) => filters.appResources.includes(getAppResourceType(resource)) - ), + ) + ), }); export const getResourceType = ( diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts b/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts new file mode 100644 index 00000000000..9a549e67208 --- /dev/null +++ b/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts @@ -0,0 +1,75 @@ +import type { RA } from '../../utils/types'; +import type { SerializedResource } from '../DataModel/helperTypes'; +import { schema } from '../DataModel/schema'; +import type { SpAppResource, Tables } from '../DataModel/types'; +import { getOperationPermissions, getTablePermissions } from '../Permissions'; +import { toolDefinitions } from '../Security/registry'; +import { tableNameToResourceName } from '../Security/utils'; + +const COLLECTION_PREFERENCES_NAME = 'CollectionPreferences'; + +const getCollectionId = (): number => schema.domainLevelIds?.collection ?? -1; + +type OperationPermissionMap = Record>; +type TablePermissionMap = Record>; + +const getOperationPermissionMap = (): OperationPermissionMap => { + const collectionId = getCollectionId(); + return collectionId === -1 + ? ({} as OperationPermissionMap) + : ((getOperationPermissions()[collectionId] ?? {}) as OperationPermissionMap); +}; + +const getTablePermissionMap = (): TablePermissionMap => { + const collectionId = getCollectionId(); + return collectionId === -1 + ? ({} as TablePermissionMap) + : ((getTablePermissions()[collectionId] ?? {}) as TablePermissionMap); +}; + +const hasOperationPermission = (resource: string, action: string): boolean => { + const permissions = getOperationPermissionMap(); + return Boolean(permissions[resource]?.[action]); +}; + +const hasToolTablePermission = ( + tool: keyof ReturnType, + action: 'read' | 'create' | 'update' | 'delete' +): boolean => { + const tablePermissions = getTablePermissionMap(); + const tables = toolDefinitions()[tool].tables as RA; + return tables.every((tableName) => { + const resourceName = tableNameToResourceName(tableName); + return Boolean(tablePermissions[resourceName]?.[action]); + }); +}; + +export const canAccessCollectionPreferencesResource = (): boolean => { + const collectionId = getCollectionId(); + if (collectionId === -1) return true; + + const tablePermissions = getTablePermissionMap(); + const operationPermissions = getOperationPermissionMap(); + if ( + Object.keys(tablePermissions).length === 0 || + Object.keys(operationPermissions).length === 0 + ) + return true; + + return ( + hasToolTablePermission('resources', 'update') && + hasOperationPermission('/preferences/collection', 'edit_collection') + ); +}; + +export const filterCollectionPreferencesResources = < + RESOURCE extends SerializedResource +>(resources: RA): RA => + canAccessCollectionPreferencesResource() + ? resources + : resources.filter( + (resource) => resource.name !== COLLECTION_PREFERENCES_NAME + ); + +export const shouldShowCollectionPreferenceSubType = (): boolean => + canAccessCollectionPreferencesResource(); diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index 3ed5ee2a4e3..77a59d455c8 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -14,11 +14,8 @@ import type { MenuItem } from '../Core/Main'; import { getDisciplineTrees } from '../InitialContext/treeRanks'; import { userInformation } from '../InitialContext/userInformation'; import { fetchContext as userPermission } from '../Permissions'; -import { - hasPermission, - hasTablePermission, - hasToolPermission, -} from '../Permissions/helpers'; +import { hasPermission, hasTablePermission, hasToolPermission } from '../Permissions/helpers'; +import { canAccessCollectionPreferencesResource } from '../AppResources/permissions'; import { clearAllCache } from '../RouterCommands/CacheBuster'; import { filterMenuItems } from './menuItemProcessing'; @@ -61,7 +58,7 @@ const rawUserTools = ensure>>>()({ title: preferencesText.collectionPreferences(), url: '/specify/collection-preferences/', icon: icons.office, - enabled: () => hasToolPermission('resources', 'update'), + enabled: () => canAccessCollectionPreferencesResource(), }, schemaConfig: { title: schemaText.schemaConfig(), diff --git a/specifyweb/frontend/js_src/lib/components/Permissions/definitions.ts b/specifyweb/frontend/js_src/lib/components/Permissions/definitions.ts index a5ee87a2028..0045e7a884b 100644 --- a/specifyweb/frontend/js_src/lib/components/Permissions/definitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Permissions/definitions.ts @@ -122,6 +122,7 @@ export const institutionPermissions = new Set([ export const frontEndPermissions = { '/preferences/user': ['edit_protected'], '/preferences/statistics': ['edit_shared'], + '/preferences/collection': ['edit_collection'], } as const; /** diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index ac4cd639ee6..402010d7bfc 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -23,7 +23,7 @@ import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { hasPermission } from '../Permissions/helpers'; -import { ProtectedTool } from '../Permissions/PermissionDenied'; +import { ProtectedAction, ProtectedTool } from '../Permissions/PermissionDenied'; import { PreferencesAside } from './Aside'; import type { BasePreferences } from './BasePreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; @@ -535,9 +535,14 @@ function Item({ function CollectionPreferences(): JSX.Element { return ( - - - + + + + + ); } diff --git a/specifyweb/frontend/js_src/lib/components/Security/registry.ts b/specifyweb/frontend/js_src/lib/components/Security/registry.ts index 5c9f7ca2417..c3b94093b5b 100644 --- a/specifyweb/frontend/js_src/lib/components/Security/registry.ts +++ b/specifyweb/frontend/js_src/lib/components/Security/registry.ts @@ -1,6 +1,7 @@ import type { LocalizedString } from 'typesafe-i18n'; import { commonText } from '../../localization/common'; +import { preferencesText } from '../../localization/preferences'; import { queryText } from '../../localization/query'; import { resourcesText } from '../../localization/resources'; import { schemaText } from '../../localization/schema'; @@ -65,6 +66,13 @@ export const isUncommonPermissionTable = ({ /** Build a registry of all permissions, their labels and possible actions */ const buildRegistry = f.store((): IR => { + const frontEndLocalizedOverrides: Record> = { + '/preferences/collection': [ + preferencesText.preferences(), + preferencesText.collectionPreferences(), + ], + }; + const rules: RA<{ readonly resource: string; readonly localized: RA; @@ -95,7 +103,9 @@ const buildRegistry = f.store((): IR => { })), ...Object.entries(frontEndPermissions).map(([resource, actions]) => ({ resource, - localized: resourceNameToParts(resource).map(lowerToHuman), + localized: + frontEndLocalizedOverrides[resource] ?? + resourceNameToParts(resource).map(lowerToHuman), actions, groupName: localized(''), })), diff --git a/specifyweb/frontend/js_src/lib/components/Security/utils.ts b/specifyweb/frontend/js_src/lib/components/Security/utils.ts index 2d0149e7f8f..c328c417e97 100644 --- a/specifyweb/frontend/js_src/lib/components/Security/utils.ts +++ b/specifyweb/frontend/js_src/lib/components/Security/utils.ts @@ -1,5 +1,6 @@ import type { LocalizedString } from 'typesafe-i18n'; +import { commonText } from '../../localization/common'; import { userText } from '../../localization/user'; import { ajax } from '../../utils/ajax'; import { Http } from '../../utils/ajax/definitions'; @@ -141,7 +142,11 @@ export function getCollectionRegistriesFromPath(resourceParts: RA) { * Localize action name */ export const actionToLabel = (action: string): LocalizedString => - action === anyAction ? userText.allActions() : lowerToHuman(action); + action === anyAction + ? userText.allActions() + : action === 'edit_collection' + ? commonText.edit() + : lowerToHuman(action); export const toolPermissionPrefix = 'tools'; export const anyAction = '%'; From da5271afb2fd668cd89eef8da7a605d31d8e8d66 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 14 Nov 2025 02:20:56 +0000 Subject: [PATCH 106/115] Lint code with ESLint and Prettier Triggered by 0964161923bf0ace8cd55b0de697bb1a9b001b47 on branch refs/heads/issue-7440 --- .../lib/components/AppResources/Create.tsx | 2 +- .../lib/components/AppResources/Filters.tsx | 68 ++++++++++--------- .../__tests__/AppResourcesAside.test.tsx | 3 +- .../__tests__/AppResourcesFilters.test.tsx | 2 +- .../components/AppResources/permissions.ts | 11 +-- .../components/Header/userToolDefinitions.ts | 8 ++- .../lib/components/Preferences/index.tsx | 5 +- 7 files changed, 56 insertions(+), 43 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx index be7917acfff..64e0c8e0f49 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/Create.tsx @@ -31,8 +31,8 @@ import { formatUrl } from '../Router/queryString'; import type { AppResourcesTree } from './hooks'; import { useResourcesTree } from './hooks'; import type { AppResourcesOutlet } from './index'; -import type { AppResourceType, ScopedAppResourceDir } from './types'; import { shouldShowCollectionPreferenceSubType } from './permissions'; +import type { AppResourceType, ScopedAppResourceDir } from './types'; import { appResourceSubTypes, appResourceTypes } from './types'; /** diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx index 107386f9906..05ae7ac709d 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/Filters.tsx @@ -142,40 +142,42 @@ export function AppResourcesFilters({ key !== 'collectionPreferences' || canSeeCollectionPreferences ) - .map(([key, { label, icon, documentationUrl }]): JSX.Element => ( -
  • - - - setFilters({ - ...filters, - appResources: toggleItem( - filters.appResources, - key - ), - }) - } - /> - {icon} - {commonText.countLine({ - resource: label, - count: countAppResources(initialResources, { - appResources: [key], - viewSets: false, - }), - })} - {typeof documentationUrl === 'string' && ( - ( +
  • + + + setFilters({ + ...filters, + appResources: toggleItem( + filters.appResources, + key + ), + }) + } /> - )} - -
  • - ))} + {icon} + {commonText.countLine({ + resource: label, + count: countAppResources(initialResources, { + appResources: [key], + viewSets: false, + }), + })} + {typeof documentationUrl === 'string' && ( + + )} + + + ) + )} diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx index fe96ad44ba4..49fe636ffe4 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesAside.test.tsx @@ -12,7 +12,8 @@ jest.mock('../permissions', () => { const actual = jest.requireActual('../permissions'); return { ...actual, - filterCollectionPreferencesResources: (resources: any[]) => resources, + filterCollectionPreferencesResources: (resources: readonly any[]) => + resources, canAccessCollectionPreferencesResource: () => true, }; }); diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx index e14420381f1..4d8d7c42ad6 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/AppResources/__tests__/AppResourcesFilters.test.tsx @@ -16,7 +16,7 @@ jest.mock('../permissions', () => { mockCanSeeCollectionPreferences(), shouldShowCollectionPreferenceSubType: () => mockCanSeeCollectionPreferences(), - filterCollectionPreferencesResources: (resources: any[]) => + filterCollectionPreferencesResources: (resources: readonly any[]) => mockCanSeeCollectionPreferences() ? resources : resources.filter( diff --git a/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts b/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts index 9a549e67208..7105bbfa94e 100644 --- a/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts +++ b/specifyweb/frontend/js_src/lib/components/AppResources/permissions.ts @@ -17,7 +17,8 @@ const getOperationPermissionMap = (): OperationPermissionMap => { const collectionId = getCollectionId(); return collectionId === -1 ? ({} as OperationPermissionMap) - : ((getOperationPermissions()[collectionId] ?? {}) as OperationPermissionMap); + : ((getOperationPermissions()[collectionId] ?? + {}) as OperationPermissionMap); }; const getTablePermissionMap = (): TablePermissionMap => { @@ -34,7 +35,7 @@ const hasOperationPermission = (resource: string, action: string): boolean => { const hasToolTablePermission = ( tool: keyof ReturnType, - action: 'read' | 'create' | 'update' | 'delete' + action: 'create' | 'delete' | 'read' | 'update' ): boolean => { const tablePermissions = getTablePermissionMap(); const tables = toolDefinitions()[tool].tables as RA; @@ -63,8 +64,10 @@ export const canAccessCollectionPreferencesResource = (): boolean => { }; export const filterCollectionPreferencesResources = < - RESOURCE extends SerializedResource ->(resources: RA): RA => + RESOURCE extends SerializedResource, +>( + resources: RA +): RA => canAccessCollectionPreferencesResource() ? resources : resources.filter( diff --git a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts index 77a59d455c8..d0c7ea8bf52 100644 --- a/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts +++ b/specifyweb/frontend/js_src/lib/components/Header/userToolDefinitions.ts @@ -9,13 +9,17 @@ import { f } from '../../utils/functools'; import type { IR } from '../../utils/types'; import { ensure } from '../../utils/types'; import { toLowerCase } from '../../utils/utils'; +import { canAccessCollectionPreferencesResource } from '../AppResources/permissions'; import { icons } from '../Atoms/Icons'; import type { MenuItem } from '../Core/Main'; import { getDisciplineTrees } from '../InitialContext/treeRanks'; import { userInformation } from '../InitialContext/userInformation'; import { fetchContext as userPermission } from '../Permissions'; -import { hasPermission, hasTablePermission, hasToolPermission } from '../Permissions/helpers'; -import { canAccessCollectionPreferencesResource } from '../AppResources/permissions'; +import { + hasPermission, + hasTablePermission, + hasToolPermission, +} from '../Permissions/helpers'; import { clearAllCache } from '../RouterCommands/CacheBuster'; import { filterMenuItems } from './menuItemProcessing'; diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 402010d7bfc..643e145de04 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -23,7 +23,10 @@ import { Submit } from '../Atoms/Submit'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; import { ErrorBoundary } from '../Errors/ErrorBoundary'; import { hasPermission } from '../Permissions/helpers'; -import { ProtectedAction, ProtectedTool } from '../Permissions/PermissionDenied'; +import { + ProtectedAction, + ProtectedTool, +} from '../Permissions/PermissionDenied'; import { PreferencesAside } from './Aside'; import type { BasePreferences } from './BasePreferences'; import { collectionPreferenceDefinitions } from './CollectionDefinitions'; From 8b8f0c261757a18aa5707fc883a2186754f76998 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Fri, 14 Nov 2025 16:29:06 -0500 Subject: [PATCH 107/115] Fix catalog inheritance sidebar entry and show Component heading --- .../lib/components/Preferences/Aside.tsx | 24 ++++++++++++++++--- .../lib/components/Preferences/index.tsx | 3 +-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx index 2e4e6cd813e..4a5463691d3 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Aside.tsx @@ -41,6 +41,22 @@ export function PreferencesAside({ const [freezeCategory, setFreezeCategory] = useFrozenCategory(); const currentIndex = freezeCategory ?? activeCategory; + const visibleDefinitions = React.useMemo( + () => + definitions + .map( + (definition, index) => + [index, definition] as const + ) + .filter( + ([, [category]]) => + !( + prefType === 'collection' && + category === 'catalogNumberParentInheritance' + ) + ), + [definitions, prefType] + ); React.useEffect(() => { const active = location.hash.replace('#', '').toLowerCase(); @@ -61,12 +77,14 @@ export function PreferencesAside({ overflow-y-auto md:sticky md:flex-1 `} > - {definitions.map(([category, { title }], index) => ( + {visibleDefinitions.map(([definitionIndex, [category, { title }]]) => ( setFreezeCategory(index)} + onClick={(): void => setFreezeCategory(definitionIndex)} > {typeof title === 'function' ? title() : title} diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx index 643e145de04..3d188776f0b 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/index.tsx @@ -465,8 +465,7 @@ export function PreferencesContent({ renderSubCategory( 'catalogNumberParentInheritance', subcategory, - data, - { hideTitle: true } + data ) )} From 6dcc0f96d061aed2a79fd5e1a6dd36c67c3389dd Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 00:38:19 -0500 Subject: [PATCH 108/115] Restrict tree rank preference options to the active definition --- .../lib/components/Preferences/Renderers.tsx | 49 ++++++++------ .../__tests__/ThresholdRank.test.tsx | 64 +++++++++++++++++++ 2 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 48fe82b7838..8266eb3d410 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -24,7 +24,7 @@ import type { RA } from '../../utils/types'; import { Input, Select, Textarea } from '../Atoms/Form'; import { iconClassName } from '../Atoms/Icons'; import { ReadOnlyContext } from '../Core/Contexts'; -import type { AnySchema } from '../DataModel/helperTypes'; +import type { AnySchema, AnyTree } from '../DataModel/helperTypes'; import type { SpecifyTable } from '../DataModel/specifyTable'; import { tables } from '../DataModel/tables'; import type { Collection } from '../DataModel/types'; @@ -33,6 +33,7 @@ import { useMenuItems, useUserTools } from '../Header/menuItemProcessing'; import { AttachmentPicker } from '../Molecules/AttachmentPicker'; import { AutoComplete } from '../Molecules/AutoComplete'; import { ListEdit } from '../Toolbar/ListEdit'; +import { getTreeDefinitions, treeRanksPromise } from '../InitialContext/treeRanks'; import type { PreferenceItem, PreferenceRendererProps } from './types'; import { userPreferences } from './userPreferences'; @@ -389,31 +390,39 @@ export function ThresholdRank({ value, onChange, tableName, -}: PreferenceRendererProps & { readonly tableName: string }): JSX.Element { +}: PreferenceRendererProps & { + readonly tableName: AnyTree['tableName']; +}): JSX.Element { const [items, setItems] = React.useState([]); + React.useEffect(() => { - fetch(`/api/specify/${tableName.toLowerCase()}treedefitem/`) - .then(async res => { - if (!res.ok) throw new Error('Failed to fetch ThresholdRank items'); - return res.json(); - }) - .then((data: { readonly objects?: readonly { readonly rankid: number; readonly name: string }[] }) => + let isMounted = true; + treeRanksPromise + .then(() => { + const definitions = getTreeDefinitions(tableName); + const activeDefinition = definitions[0]; + /** + * Only expose ranks from the treedef tied to the current discipline. + * Otherwise ranks from unrelated trees leak into the dropdown. + */ + const ranks = activeDefinition?.ranks ?? []; + if (!isMounted) return; setItems( - (data.objects ?? []) - .map( - // Map the results to the Rank type - (item: { readonly rankid: number; readonly name: string }): Rank => ({ - rankId: item.rankid, - name: item.name, - }) - ) // This sorts the ranks so they appear in ascending order in the dropdown - .sort((rankA, rankB) => rankA.rankId - rankB.rankId) - ) - ) + ranks + .map(({ rankId, name }) => ({ + rankId, + name, + })) + .sort((rankA, rankB) => rankA.rankId - rankB.rankId) + ); + }) .catch((error: unknown) => { console.error('Error fetching ThresholdRank items:', error); - setItems([]); + if (isMounted) setItems([]); }); + return () => { + isMounted = false; + }; }, [tableName]); return ( diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx new file mode 100644 index 00000000000..a1930c0e2ac --- /dev/null +++ b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx @@ -0,0 +1,64 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { ThresholdRank } from '../Renderers'; +import { overrideAjax } from '../../../tests/ajax'; +import { requireContext } from '../../../tests/helpers'; +import * as treeRanks from '../../InitialContext/treeRanks'; +import { preferencesText } from '../../../localization/preferences'; +import type { PreferenceItem } from '../types'; + +overrideAjax('/context/schema_localization.json', {}); +requireContext(); + +const mockedGetTreeDefinitions = jest.spyOn( + treeRanks, + 'getTreeDefinitions' +); + +describe('ThresholdRank', () => { + beforeEach(() => { + mockedGetTreeDefinitions.mockReset(); + }); + + test('only renders ranks from the active tree definition', async () => { + mockedGetTreeDefinitions.mockReturnValue([ + { + definition: { id: 1 } as any, + ranks: [ + { rankId: 50, name: 'Active Rank B' }, + { rankId: 10, name: 'Active Rank A' }, + ] as any, + }, + { + definition: { id: 2 } as any, + ranks: [{ rankId: 5, name: 'Inactive Rank' }] as any, + }, + ]); + + const definition: PreferenceItem = { + title: preferencesText.rankThreshold, + requiresReload: false, + visible: true, + defaultValue: 0, + values: [], + }; + render( + + ); + + await waitFor(() => expect(screen.getAllByRole('option')).toHaveLength(3)); + + const labels = screen.getAllByRole('option').map((option) => option.textContent); + expect(labels).toEqual(['None', 'Active Rank A', 'Active Rank B']); + expect(screen.queryByText('Inactive Rank')).not.toBeInTheDocument(); + }); +}); From a995792daaafbefd0ae5f24c0dd60c84b8126ef9 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 00:58:18 -0500 Subject: [PATCH 109/115] installed ts-node devDependancy --- specifyweb/frontend/js_src/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/specifyweb/frontend/js_src/package.json b/specifyweb/frontend/js_src/package.json index feb02ced967..7ef2ba4f5e4 100644 --- a/specifyweb/frontend/js_src/package.json +++ b/specifyweb/frontend/js_src/package.json @@ -119,6 +119,7 @@ "regenerator-runtime": "^0.13.9", "style-loader": "^3.3.4", "tailwindcss": "^3.4.1", + "ts-node": "^10.9.2", "tsx": "^4.19.3", "typedoc": "^0.23.23", "typescript": "4.8.4", From b2391800fe38cad02a693d4307aae4e1885f5ce7 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 01:01:56 -0500 Subject: [PATCH 110/115] installed required dependancy --- specifyweb/frontend/js_src/package-lock.json | 116 +++++-------------- 1 file changed, 29 insertions(+), 87 deletions(-) diff --git a/specifyweb/frontend/js_src/package-lock.json b/specifyweb/frontend/js_src/package-lock.json index be8b446b31d..3b98dc4679c 100644 --- a/specifyweb/frontend/js_src/package-lock.json +++ b/specifyweb/frontend/js_src/package-lock.json @@ -27,7 +27,7 @@ "d3": "^7.6.1", "dayjs": "^1.10.7", "globals": "^13.19.0", - "handsontable": "^12.4.0", + "handsontable": "^12.1.0", "jquery": "~1.12.0", "leaflet": "^1.7.1", "leaflet-gesture-handling": "^1.2.2", @@ -99,6 +99,7 @@ "regenerator-runtime": "^0.13.9", "style-loader": "^3.3.4", "tailwindcss": "^3.4.1", + "ts-node": "^10.9.2", "tsx": "^4.19.3", "typedoc": "^0.23.23", "typescript": "4.8.4", @@ -1970,8 +1971,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1984,8 +1983,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, - "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3982,33 +3979,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@types/aria-query": { "version": "4.2.2", @@ -6609,9 +6598,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/crelt": { "version": "1.0.5", @@ -7354,8 +7341,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.3.1" } @@ -12035,9 +12020,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -16055,12 +16038,11 @@ "dev": true }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "optional": true, - "peer": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -16104,8 +16086,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -16118,8 +16098,6 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -16128,9 +16106,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/tsconfig-paths": { "version": "3.14.1", @@ -16596,9 +16572,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.0.1", @@ -17392,8 +17366,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=6" } @@ -18620,8 +18592,6 @@ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -18631,8 +18601,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -19891,33 +19859,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "@types/aria-query": { "version": "4.2.2", @@ -21871,9 +21831,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "crelt": { "version": "1.0.5" @@ -22356,9 +22314,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "diff-sequences": { "version": "28.1.1", @@ -25747,9 +25703,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "makeerror": { "version": "1.0.12", @@ -28399,12 +28353,10 @@ "dev": true }, "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, - "optional": true, - "peer": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -28425,25 +28377,19 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "optional": true, - "peer": true + "dev": true } } }, @@ -28767,9 +28713,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "v8-to-istanbul": { "version": "9.0.1", @@ -29302,9 +29246,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "yocto-queue": { "version": "0.1.0", From 9e574a6a35b2c41697544500eed98c23bfcd6452 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 01:10:21 -0500 Subject: [PATCH 111/115] Filter tree rank preference options --- .../lib/components/Preferences/__tests__/ThresholdRank.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx index a1930c0e2ac..31afb9a750f 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx @@ -37,7 +37,7 @@ describe('ThresholdRank', () => { ]); const definition: PreferenceItem = { - title: preferencesText.rankThreshold, + title: preferencesText.rankThreshold(), requiresReload: false, visible: true, defaultValue: 0, From f79c6c0ed2ee1fd0adb46a3c919c74567712c6bd Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 06:14:10 +0000 Subject: [PATCH 112/115] Lint code with ESLint and Prettier Triggered by 9e574a6a35b2c41697544500eed98c23bfcd6452 on branch refs/heads/issue-6843 --- .../components/Preferences/__tests__/ThresholdRank.test.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx index 31afb9a750f..0ce4c624967 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx @@ -1,11 +1,11 @@ import { render, screen, waitFor } from '@testing-library/react'; import React from 'react'; -import { ThresholdRank } from '../Renderers'; +import { preferencesText } from '../../../localization/preferences'; import { overrideAjax } from '../../../tests/ajax'; import { requireContext } from '../../../tests/helpers'; import * as treeRanks from '../../InitialContext/treeRanks'; -import { preferencesText } from '../../../localization/preferences'; +import { ThresholdRank } from '../Renderers'; import type { PreferenceItem } from '../types'; overrideAjax('/context/schema_localization.json', {}); @@ -49,9 +49,9 @@ describe('ThresholdRank', () => { definition={definition} item="rankThreshold" subcategory="geography" - onChange={jest.fn()} tableName="Geography" value={50} + onChange={jest.fn()} /> ); From 044b1df76253dda5a0c4fa7f936f51f610a437cc Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 16 Nov 2025 20:04:38 -0500 Subject: [PATCH 113/115] changed default value to name for Ordering the trees --- .../js_src/lib/components/Preferences/UserDefinitions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index 722657bfe27..f970ecf6bc2 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1395,7 +1395,7 @@ export const userPreferenceDefinitions = { title: preferencesText.sortByField(), requiresReload: false, visible: true, - defaultValue: 'rankId', + defaultValue: 'name', values: [ { value: 'name', From f454e18ada66041e24e7c7802830d07bce3f43ed Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 18 Nov 2025 17:23:44 +0000 Subject: [PATCH 114/115] Lint code with ESLint and Prettier Triggered by e908ed4dc76070661017838f247650eb0c5dd021 on branch refs/heads/issue-6843 --- .../Attachments/RecordSetAttachment.tsx | 48 +++++++++---------- .../js_src/lib/components/BatchEdit/index.tsx | 1 - .../lib/components/DataModel/businessRules.ts | 11 +++-- .../js_src/lib/components/TreeView/Tree.tsx | 8 ++-- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Attachments/RecordSetAttachment.tsx b/specifyweb/frontend/js_src/lib/components/Attachments/RecordSetAttachment.tsx index 597e4ed3665..c41f2c2da3e 100644 --- a/specifyweb/frontend/js_src/lib/components/Attachments/RecordSetAttachment.tsx +++ b/specifyweb/frontend/js_src/lib/components/Attachments/RecordSetAttachment.tsx @@ -109,7 +109,8 @@ export function RecordSetAttachments({ const isComplete = fetchedCount.current === recordCount; - const [showCreateRecordSetDialog, setShowCreateRecordSetDialog] = React.useState(false); + const [showCreateRecordSetDialog, setShowCreateRecordSetDialog] = + React.useState(false); return ( <> @@ -133,16 +134,17 @@ export function RecordSetAttachments({ - (recordSetId === undefined && !isComplete) ? - setShowCreateRecordSetDialog(true) - : - loading( - downloadAllAttachments( - (recordSetId !== undefined && !isComplete) ? [] : attachmentsRef.current?.attachments ?? [], - name, - recordSetId, - ) - ) + recordSetId === undefined && !isComplete + ? setShowCreateRecordSetDialog(true) + : loading( + downloadAllAttachments( + recordSetId !== undefined && !isComplete + ? [] + : (attachmentsRef.current?.attachments ?? []), + name, + recordSetId + ) + ) } > {attachmentsText.downloadAll()} @@ -157,15 +159,15 @@ export function RecordSetAttachments({ header={ attachmentsRef.current?.attachments === undefined ? attachmentsText.attachments() - : (isComplete ? - commonText.countLine({ - resource: attachmentsText.attachments(), - count: attachmentsRef.current.attachments.length - }) : - commonText.countLineOrMore({ - resource: attachmentsText.attachments(), - count: attachmentsRef.current.attachments.length - })) + : isComplete + ? commonText.countLine({ + resource: attachmentsText.attachments(), + count: attachmentsRef.current.attachments.length, + }) + : commonText.countLineOrMore({ + resource: attachmentsText.attachments(), + count: attachmentsRef.current.attachments.length, + }) } onClose={handleHideAttachments} > @@ -215,13 +217,11 @@ function CreateRecordSetDialog({ }): JSX.Element { return ( {commonText.close()} - } + buttons={{commonText.close()}} header={attachmentsText.downloadAll()} onClose={onClose} > {attachmentsText.createRecordSetToDownloadAll()} ); -} \ No newline at end of file +} diff --git a/specifyweb/frontend/js_src/lib/components/BatchEdit/index.tsx b/specifyweb/frontend/js_src/lib/components/BatchEdit/index.tsx index 31b410f3be4..59cb682763b 100644 --- a/specifyweb/frontend/js_src/lib/components/BatchEdit/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/BatchEdit/index.tsx @@ -247,7 +247,6 @@ const containsSystemTables = (queryFieldSpec: QueryFieldSpec) => { return Boolean(baseIsBlocked || pathHasBlockedSystem); }; - const hasHierarchyBaseTable = (queryFieldSpec: QueryFieldSpec) => Object.keys(schema.domainLevelIds).includes( queryFieldSpec.baseTable.name.toLowerCase() as 'collection' diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts index f7581eb2b30..868b11dac2a 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts @@ -7,7 +7,11 @@ import { softFail } from '../Errors/Crash'; import { isTreeResource } from '../InitialContext/treeRanks'; import type { BusinessRuleDefs } from './businessRuleDefs'; import { businessRuleDefs } from './businessRuleDefs'; -import { backboneFieldSeparator, backendFilter, djangoLookupSeparator } from './helpers'; +import { + backboneFieldSeparator, + backendFilter, + djangoLookupSeparator, +} from './helpers'; import type { AnySchema, AnyTree, @@ -316,10 +320,7 @@ export class BusinessRuleManager { ) ); - const stringValuesAreEqual = ( - left: string, - right: string - ): boolean => + const stringValuesAreEqual = (left: string, right: string): boolean => rule.isDatabaseConstraint ? left.localeCompare(right, undefined, { sensitivity: 'accent' }) === 0 : left === right; diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx index d81ed9e55a8..b343a725731 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Tree.tsx @@ -98,11 +98,11 @@ export function Tree< ); const [statsThreshold] = userPreferences.use( - 'treeEditor', - treeToPref[tableName], - 'rankThreshold' + 'treeEditor', + treeToPref[tableName], + 'rankThreshold' ); - + const getStats = React.useCallback( async (nodeId: number | 'null', rankId: number): Promise => rankId >= statsThreshold From fa688afc6a2971fce7a42a51d643d4192696e1f8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 18 Nov 2025 18:27:09 +0000 Subject: [PATCH 115/115] Lint code with ESLint and Prettier Triggered by 96c6e430790f79fb52ed57d968182e63a82695e0 on branch refs/heads/issue-7440 --- .../lib/components/Preferences/Renderers.tsx | 14 +++++++++++--- .../Preferences/__tests__/ThresholdRank.test.tsx | 9 ++++----- .../js_src/lib/localization/preferences.general.ts | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx index 8266eb3d410..a1d25e5ff3e 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/Renderers.tsx @@ -30,10 +30,13 @@ import { tables } from '../DataModel/tables'; import type { Collection } from '../DataModel/types'; import { rawMenuItemsPromise } from '../Header/menuItemDefinitions'; import { useMenuItems, useUserTools } from '../Header/menuItemProcessing'; +import { + getTreeDefinitions, + treeRanksPromise, +} from '../InitialContext/treeRanks'; import { AttachmentPicker } from '../Molecules/AttachmentPicker'; import { AutoComplete } from '../Molecules/AutoComplete'; import { ListEdit } from '../Toolbar/ListEdit'; -import { getTreeDefinitions, treeRanksPromise } from '../InitialContext/treeRanks'; import type { PreferenceItem, PreferenceRendererProps } from './types'; import { userPreferences } from './userPreferences'; @@ -426,10 +429,15 @@ export function ThresholdRank({ }, [tableName]); return ( - onChange(Number(e.target.value))} + > {items.map(({ rankId, name }) => ( - + ))} ); diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx index 0ce4c624967..5bc25699f33 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/__tests__/ThresholdRank.test.tsx @@ -11,10 +11,7 @@ import type { PreferenceItem } from '../types'; overrideAjax('/context/schema_localization.json', {}); requireContext(); -const mockedGetTreeDefinitions = jest.spyOn( - treeRanks, - 'getTreeDefinitions' -); +const mockedGetTreeDefinitions = jest.spyOn(treeRanks, 'getTreeDefinitions'); describe('ThresholdRank', () => { beforeEach(() => { @@ -57,7 +54,9 @@ describe('ThresholdRank', () => { await waitFor(() => expect(screen.getAllByRole('option')).toHaveLength(3)); - const labels = screen.getAllByRole('option').map((option) => option.textContent); + const labels = screen + .getAllByRole('option') + .map((option) => option.textContent); expect(labels).toEqual(['None', 'Active Rank A', 'Active Rank B']); expect(screen.queryByText('Inactive Rank')).not.toBeInTheDocument(); }); diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts index a25b4f6aafe..be5f0f1b3a9 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.general.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.general.ts @@ -2114,7 +2114,8 @@ export const preferencesGeneralDictionary = { }, rankThresholdDescription: { 'en-us': - 'Show the count of linked Collection Objects for all ranks below this one.',}, + 'Show the count of linked Collection Objects for all ranks below this one.', + }, } as const; export const preferencesGeneralText = createDictionary(