From d75e6dc78356c7acade79b9b09b40fd15c868a7f Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Sun, 5 Oct 2025 00:30:48 -0400 Subject: [PATCH 1/8] Fix: merge auto-populate to respect preference toggle --- specifyweb/frontend/js_src/lib/components/Merging/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx index e81ccae2f9d..b66e69ad874 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx @@ -219,7 +219,7 @@ function Merging({ autoMerge( table, initialRecords.current, - userPreferences.get( + !userPreferences.get( 'recordMerging', 'behavior', 'autoPopulate' From ba1cb7752c85a03cfc202083e6aca6f1ea25ed10 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Mon, 3 Nov 2025 21:45:50 -0500 Subject: [PATCH 2/8] Fix: auto-populate now correctly fills all eligible merge fields when enabled and leaves them blank when disabled --- .../Merging/__tests__/autoMerge.test.ts | 13 +++++ .../lib/components/Merging/autoMerge.ts | 3 +- .../js_src/lib/components/Merging/index.tsx | 54 +++++++++++-------- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts index 8edeb9850bb..0691bf7da49 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts @@ -636,4 +636,17 @@ describe('autoMerge', () => { } `); }); + + test('prefers longest string values when auto populating', () => { + const merged = autoMerge( + tables.Agent, + [ + addMissingFields('Agent', { lastName: '' }), + addMissingFields('Agent', { lastName: 'Longer Value' }), + addMissingFields('Agent', { lastName: 'Mid' }), + ] as unknown as RA>, + false + ); + expect(merged.lastName).toBe('Longer Value'); + }); }); diff --git a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts index 427a4958d3a..0469fc4c304 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts @@ -151,7 +151,8 @@ function mergeField( return ( Array.from(nonFalsyValues).sort( sortFunction((string) => - typeof string === 'string' ? string.length : 0 + typeof string === 'string' ? string.length : 0, + true ) )[0] ?? firstValue ); diff --git a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx index b66e69ad874..757fb80d790 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx @@ -23,6 +23,7 @@ import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext } from '../Core/Contexts'; import { runAllFieldChecks } from '../DataModel/businessRules'; +import { addMissingFields } from '../DataModel/addMissingFields'; import type { AnySchema, SerializedResource } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; import { fetchResource, resourceEvents } from '../DataModel/resource'; @@ -211,29 +212,38 @@ function Merging({ const [merged, setMerged] = useAsyncState( React.useCallback( - async () => - records === undefined || initialRecords.current === undefined - ? undefined - : postMergeResource( + async () => { + if ( + records === undefined || + initialRecords.current === undefined || + target === undefined + ) + return undefined; + + const shouldAutoPopulate = userPreferences.get( + 'recordMerging', + 'behavior', + 'autoPopulate' + ); + + const mergedPayload = shouldAutoPopulate + ? await postMergeResource( initialRecords.current, - autoMerge( - table, - initialRecords.current, - !userPreferences.get( - 'recordMerging', - 'behavior', - 'autoPopulate' - ), - target.id - ) - ).then(async (merged) => { - const mergedResource = deserializeResource( - merged as SerializedResource - ); - if (merged !== undefined) await runAllFieldChecks(mergedResource); - return mergedResource; - }), - [table, records] + autoMerge(table, initialRecords.current, false, target.id) + ) + : addMissingFields( + table.name, + {} as Partial> + ); + + const mergedResource = deserializeResource( + mergedPayload as SerializedResource + ); + if (mergedPayload !== undefined) + await runAllFieldChecks(mergedResource); + return mergedResource; + }, + [table, records, target] ), true ); From 5cf5124af9554f758cd62508c99274fc2ef770d8 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 4 Nov 2025 02:50:55 +0000 Subject: [PATCH 3/8] Lint code with ESLint and Prettier Triggered by ba1cb7752c85a03cfc202083e6aca6f1ea25ed10 on branch refs/heads/issue-4869 --- .../lib/components/Merging/autoMerge.ts | 4 +- .../js_src/lib/components/Merging/index.tsx | 64 +++++++++---------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts index 0469fc4c304..a304b016614 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts @@ -150,8 +150,8 @@ function mergeField( // Pick the longest value return ( Array.from(nonFalsyValues).sort( - sortFunction((string) => - typeof string === 'string' ? string.length : 0, + sortFunction( + (string) => (typeof string === 'string' ? string.length : 0), true ) )[0] ?? firstValue diff --git a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx index 757fb80d790..2c3f280a947 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx @@ -22,8 +22,8 @@ import { icons } from '../Atoms/Icons'; import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext } from '../Core/Contexts'; -import { runAllFieldChecks } from '../DataModel/businessRules'; import { addMissingFields } from '../DataModel/addMissingFields'; +import { runAllFieldChecks } from '../DataModel/businessRules'; import type { AnySchema, SerializedResource } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; import { fetchResource, resourceEvents } from '../DataModel/resource'; @@ -211,40 +211,36 @@ function Merging({ const clones = sortedResources.slice(1); const [merged, setMerged] = useAsyncState( - React.useCallback( - async () => { - if ( - records === undefined || - initialRecords.current === undefined || - target === undefined - ) - return undefined; - - const shouldAutoPopulate = userPreferences.get( - 'recordMerging', - 'behavior', - 'autoPopulate' - ); - - const mergedPayload = shouldAutoPopulate - ? await postMergeResource( - initialRecords.current, - autoMerge(table, initialRecords.current, false, target.id) - ) - : addMissingFields( - table.name, - {} as Partial> - ); + React.useCallback(async () => { + if ( + records === undefined || + initialRecords.current === undefined || + target === undefined + ) + return undefined; + + const shouldAutoPopulate = userPreferences.get( + 'recordMerging', + 'behavior', + 'autoPopulate' + ); + + const mergedPayload = shouldAutoPopulate + ? await postMergeResource( + initialRecords.current, + autoMerge(table, initialRecords.current, false, target.id) + ) + : addMissingFields( + table.name, + {} as Partial> + ); - const mergedResource = deserializeResource( - mergedPayload as SerializedResource - ); - if (mergedPayload !== undefined) - await runAllFieldChecks(mergedResource); - return mergedResource; - }, - [table, records, target] - ), + const mergedResource = deserializeResource( + mergedPayload as SerializedResource + ); + if (mergedPayload !== undefined) await runAllFieldChecks(mergedResource); + return mergedResource; + }, [table, records, target]), true ); From 7a2180c4852693c9dd3637bd8d7e33a3653eb179 Mon Sep 17 00:00:00 2001 From: Gitesh Sagvekar Date: Tue, 4 Nov 2025 21:27:01 -0500 Subject: [PATCH 4/8] Auto-populate for precision fields and merge snapshots updated --- .../Merging/__tests__/autoMerge.test.ts | 32 +++++++++++++++---- .../lib/components/Merging/autoMerge.ts | 20 ++++++++++-- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts index 0691bf7da49..7e686509cb8 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts @@ -248,7 +248,7 @@ describe('autoMerge', () => { "agentAttachments": [], "agentGeographies": [], "agentSpecialties": [], - "agentType": 1, + "agentType": 0, "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", "collContentContact": null, "collTechContact": null, @@ -257,7 +257,7 @@ describe('autoMerge', () => { "date1": null, "date1Precision": null, "date2": null, - "date2Precision": null, + "date2Precision": 2, "dateOfBirth": null, "dateOfBirthPrecision": null, "dateOfDeath": null, @@ -415,7 +415,7 @@ describe('autoMerge', () => { "agentAttachments": [], "agentGeographies": [], "agentSpecialties": [], - "agentType": 1, + "agentType": 0, "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", "collContentContact": null, "collTechContact": null, @@ -424,7 +424,7 @@ describe('autoMerge', () => { "date1": "2020-01-01", "date1Precision": null, "date2": null, - "date2Precision": null, + "date2Precision": 2, "dateOfBirth": null, "dateOfBirthPrecision": null, "dateOfDeath": null, @@ -582,7 +582,7 @@ describe('autoMerge', () => { "agentAttachments": [], "agentGeographies": [], "agentSpecialties": [], - "agentType": 1, + "agentType": 0, "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", "collContentContact": null, "collTechContact": null, @@ -591,7 +591,7 @@ describe('autoMerge', () => { "date1": null, "date1Precision": null, "date2": null, - "date2Precision": null, + "date2Precision": 2, "dateOfBirth": null, "dateOfBirthPrecision": null, "dateOfDeath": null, @@ -649,4 +649,24 @@ describe('autoMerge', () => { ); expect(merged.lastName).toBe('Longer Value'); }); + + test('fills dependent precision even if newest record lacks it', () => { + const merged = autoMerge( + tables.Agent, + [ + addMissingFields('Agent', { + timestampModified: '2024-01-01', + dateOfDeath: '2023-01-01', + dateOfDeathPrecision: null, + }), + addMissingFields('Agent', { + timestampModified: '2023-01-01', + dateOfDeath: '2023-01-01', + dateOfDeathPrecision: 0, + }), + ] as unknown as RA>, + false + ); + expect(merged.dateOfDeathPrecision).toBe(0); + }); }); diff --git a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts index a304b016614..0c405b0cb38 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/autoMerge.ts @@ -88,7 +88,16 @@ function mergeField( resource[field.name], ]); const values = parentChildValues.map(([_, child]) => child); - const nonFalsyValues = f.unique(values.filter(Boolean)); + const nonFalsyValues = f.unique( + values.filter( + (value) => + value !== null && + value !== undefined && + value !== '' && + // Preserve zeros and false, but drop NaN + value === value + ) + ); const firstValue = nonFalsyValues[0] ?? values[0]; if (field.isRelationship) if (field.isDependent()) @@ -214,10 +223,15 @@ function mergeDependentField( sourceValue: ReturnType ): ReturnType { const sourceField = strictDependentFields()[fieldName]; - const sourceResource = resources.find( + const matchingResources = resources.filter( (resource) => resource[sourceField] === sourceValue ); - return sourceResource?.[fieldName] ?? null; + const preferredResource = + matchingResources.find((resource) => { + const value = resource[fieldName]; + return value !== null && value !== undefined; + }) ?? matchingResources[0]; + return preferredResource?.[fieldName] ?? null; } /** From 21e3a13f0e2f8c799ba692178b9c5d64fa8ddbf5 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:52:56 -0600 Subject: [PATCH 5/8] fix: restore default to previous behavior --- .../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 273db7e5297..fad84e57965 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1711,7 +1711,7 @@ export const userPreferenceDefinitions = { description: preferencesText.autoPopulateDescription(), requiresReload: false, visible: 'protected', - defaultValue: false, + defaultValue: true, type: 'java.lang.Boolean', }), }, From fee0c9d79f1c39712cbff44b69fd46ca5994b6f4 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:56:41 -0600 Subject: [PATCH 6/8] fix: merge conflict for automerge test --- .../Merging/__tests__/autoMerge.test.ts | 532 +----------------- 1 file changed, 2 insertions(+), 530 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts index 7e686509cb8..bdef7a3638b 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts +++ b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/autoMerge.test.ts @@ -137,536 +137,8 @@ describe('autoMerge', () => { ); test('cautious', () => { - expect(run(true)).toMatchInlineSnapshot(` - { - "_tableName": "Agent", - "abbreviation": null, - "addresses": [ - { - "_tableName": "Address", - "address": "1", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "10", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "2", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - ], - "agentAttachments": [], - "agentGeographies": [], - "agentSpecialties": [], - "agentType": 0, - "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", - "collContentContact": null, - "collTechContact": null, - "collectors": "/api/specify/collector/?agent=2305", - "createdByAgent": "/api/specify/agent/1313/", - "date1": null, - "date1Precision": null, - "date2": null, - "date2Precision": 2, - "dateOfBirth": null, - "dateOfBirthPrecision": null, - "dateOfDeath": null, - "dateOfDeathPrecision": null, - "dateType": null, - "division": "/api/specify/division/2/", - "email": null, - "firstName": null, - "groups": [], - "guid": "d513a358-d978-496d-8f54-52b63d3d2f4c", - "identifiers": [], - "initials": null, - "instContentContact": null, - "instTechContact": null, - "integer1": null, - "integer2": null, - "interests": null, - "jobTitle": null, - "lastName": null, - "members": "/api/specify/groupperson/?member=2305", - "middleInitial": null, - "modifiedByAgent": null, - "orgMembers": "/api/specify/agent/?organization=2305", - "organization": null, - "remarks": null, - "resource_uri": undefined, - "specifyUser": null, - "suffix": null, - "text1": null, - "text2": null, - "text3": null, - "text4": null, - "text5": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "title": null, - "url": null, - "variants": [], - "verbatimDate1": null, - "verbatimDate2": null, - "version": 1, - } - `); - }); - - test('not cautious', () => - expect(run(false)).toMatchInlineSnapshot(` - { - "_tableName": "Agent", - "abbreviation": null, - "addresses": [ - { - "_tableName": "Address", - "address": "1", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "10", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "2", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": null, - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - ], - "agentAttachments": [], - "agentGeographies": [], - "agentSpecialties": [], - "agentType": 0, - "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", - "collContentContact": null, - "collTechContact": null, - "collectors": "/api/specify/collector/?agent=2305", - "createdByAgent": "/api/specify/agent/1313/", - "date1": "2020-01-01", - "date1Precision": null, - "date2": null, - "date2Precision": 2, - "dateOfBirth": null, - "dateOfBirthPrecision": null, - "dateOfDeath": null, - "dateOfDeathPrecision": null, - "dateType": null, - "division": "/api/specify/division/2/", - "email": null, - "firstName": null, - "groups": [], - "guid": "d513a358-d978-496d-8f54-52b63d3d2f4c", - "identifiers": [], - "initials": null, - "instContentContact": null, - "instTechContact": null, - "integer1": null, - "integer2": null, - "interests": null, - "jobTitle": null, - "lastName": "2", - "members": "/api/specify/groupperson/?member=2305", - "middleInitial": null, - "modifiedByAgent": null, - "orgMembers": "/api/specify/agent/?organization=2305", - "organization": null, - "remarks": null, - "resource_uri": undefined, - "specifyUser": null, - "suffix": null, - "text1": null, - "text2": null, - "text3": null, - "text4": null, - "text5": null, - "timestampCreated": "2023-01-28T00:36:28", - "timestampModified": "2023-01-29T00:36:28", - "title": null, - "url": null, - "variants": [], - "verbatimDate1": null, - "verbatimDate2": null, - "version": 1, - } - `)); - test('cautious with dropping only clones dependents', () => { - expect(run(true, 2300)).toMatchInlineSnapshot(` - { - "_tableName": "Agent", - "abbreviation": null, - "addresses": [ - { - "_tableName": "Address", - "address": "1", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": "/api/specify/agent/2300/", - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "id": 743, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": "/api/specify/address/742/", - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2023-02-28T00:04:16", - "timestampModified": "2023-03-28T00:04:16", - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "10", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": "/api/specify/agent/2300/", - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": undefined, - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "typeOfAddr": null, - "version": 1, - }, - { - "_tableName": "Address", - "address": "2", - "address2": null, - "address3": null, - "address4": null, - "address5": null, - "agent": "/api/specify/agent/2300/", - "city": null, - "country": null, - "createdByAgent": "/api/specify/agent/1313/", - "divisions": "/api/specify/division/?address=742", - "endDate": null, - "fax": null, - "id": 744, - "insitutions": "/api/specify/institution/?address=742", - "isCurrent": null, - "isPrimary": null, - "isShipping": null, - "modifiedByAgent": null, - "ordinal": null, - "phone1": null, - "phone2": null, - "positionHeld": null, - "postalCode": null, - "remarks": null, - "resource_uri": "/api/specify/address/742/", - "roomOrBuilding": null, - "startDate": null, - "state": null, - "timestampCreated": "2023-04-28T00:04:16", - "timestampModified": "2023-05-28T00:04:16", - "typeOfAddr": null, - "version": 1, - }, - ], - "agentAttachments": [], - "agentGeographies": [], - "agentSpecialties": [], - "agentType": 0, - "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", - "collContentContact": null, - "collTechContact": null, - "collectors": "/api/specify/collector/?agent=2305", - "createdByAgent": "/api/specify/agent/1313/", - "date1": null, - "date1Precision": null, - "date2": null, - "date2Precision": 2, - "dateOfBirth": null, - "dateOfBirthPrecision": null, - "dateOfDeath": null, - "dateOfDeathPrecision": null, - "dateType": null, - "division": "/api/specify/division/2/", - "email": null, - "firstName": null, - "groups": [], - "guid": "d513a358-d978-496d-8f54-52b63d3d2f4c", - "identifiers": [], - "initials": null, - "instContentContact": null, - "instTechContact": null, - "integer1": null, - "integer2": null, - "interests": null, - "jobTitle": null, - "lastName": null, - "members": "/api/specify/groupperson/?member=2305", - "middleInitial": null, - "modifiedByAgent": null, - "orgMembers": "/api/specify/agent/?organization=2305", - "organization": null, - "remarks": null, - "resource_uri": undefined, - "specifyUser": null, - "suffix": null, - "text1": null, - "text2": null, - "text3": null, - "text4": null, - "text5": null, - "timestampCreated": "2022-08-31", - "timestampModified": null, - "title": null, - "url": null, - "variants": [], - "verbatimDate1": null, - "verbatimDate2": null, - "version": 1, - } - `); - }); - - test('prefers longest string values when auto populating', () => { - const merged = autoMerge( - tables.Agent, - [ - addMissingFields('Agent', { lastName: '' }), - addMissingFields('Agent', { lastName: 'Longer Value' }), - addMissingFields('Agent', { lastName: 'Mid' }), - ] as unknown as RA>, - false - ); - expect(merged.lastName).toBe('Longer Value'); + expect(run(true)).toMatchSnapshot(); }); - test('fills dependent precision even if newest record lacks it', () => { - const merged = autoMerge( - tables.Agent, - [ - addMissingFields('Agent', { - timestampModified: '2024-01-01', - dateOfDeath: '2023-01-01', - dateOfDeathPrecision: null, - }), - addMissingFields('Agent', { - timestampModified: '2023-01-01', - dateOfDeath: '2023-01-01', - dateOfDeathPrecision: 0, - }), - ] as unknown as RA>, - false - ); - expect(merged.dateOfDeathPrecision).toBe(0); - }); + test('not cautious', () => expect(run(false)).toMatchSnapshot()); }); From 24d1cc95fab893c584706e52327f90acac8124a1 Mon Sep 17 00:00:00 2001 From: Caroline D <108160931+CarolineDenis@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:03:50 -0500 Subject: [PATCH 7/8] Fix: failing tests --- .../__snapshots__/autoMerge.test.ts.snap | 8 +-- .../Preferences/CollectionDefinitions.tsx | 53 +++++++++++++++---- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/__snapshots__/autoMerge.test.ts.snap b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/__snapshots__/autoMerge.test.ts.snap index a3e64a9b226..6c6d6979017 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/__tests__/__snapshots__/autoMerge.test.ts.snap +++ b/specifyweb/frontend/js_src/lib/components/Merging/__tests__/__snapshots__/autoMerge.test.ts.snap @@ -111,7 +111,7 @@ exports[`autoMerge cautious 1`] = ` "agentAttachments": [], "agentGeographies": [], "agentSpecialties": [], - "agentType": 1, + "agentType": 0, "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", "collContentContact": null, "collTechContact": null, @@ -121,7 +121,7 @@ exports[`autoMerge cautious 1`] = ` "date1": null, "date1Precision": null, "date2": null, - "date2Precision": null, + "date2Precision": 2, "dateOfBirth": null, "dateOfBirthPrecision": null, "dateOfDeath": null, @@ -277,7 +277,7 @@ exports[`autoMerge not cautious 1`] = ` "agentAttachments": [], "agentGeographies": [], "agentSpecialties": [], - "agentType": 1, + "agentType": 0, "catalogerOf": "/api/specify/CollectionObject?cataloger=2305", "collContentContact": null, "collTechContact": null, @@ -287,7 +287,7 @@ exports[`autoMerge not cautious 1`] = ` "date1": "2020-01-01", "date1Precision": null, "date2": null, - "date2Precision": null, + "date2Precision": 2, "dateOfBirth": null, "dateOfBirthPrecision": null, "dateOfDeath": null, diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 7d5c96f68ac..93536f952b3 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -20,7 +20,10 @@ import { definePref } from './types'; const tableLabel = (tableName: keyof Tables): LocalizedString => genericTables[tableName]?.label ?? camelToHuman(tableName); -const fieldLabel = (tableName: keyof Tables, fieldName: keyof typeof genericTables[keyof Tables]['field']): LocalizedString => +const fieldLabel = ( + tableName: keyof Tables, + fieldName: keyof (typeof genericTables)[keyof Tables]['field'] +): LocalizedString => genericTables[tableName]?.field[fieldName].label ?? camelToHuman(fieldName); export const collectionPreferenceDefinitions = { @@ -130,13 +133,16 @@ export const collectionPreferenceDefinitions = { }), showPreparationsTotal: definePref({ title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve statsText.showPreparationsTotal({ preparationTableName: tableLabel('Preparation'), }), description: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve statsText.showPreparationsTotalDescription({ preparationTableName: tableLabel('Preparation'), - lowerPreparationTableName: tableLabel('Preparation').toLowerCase(), + lowerPreparationTableName: + tableLabel('Preparation').toLowerCase(), prepTypeTableName: tableLabel('PrepType').toLowerCase(), }), requiresReload: false, @@ -180,6 +186,7 @@ export const collectionPreferenceDefinitions = { }, catalogNumberInheritance: { title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.primaryCatalogNumberInheritance({ collectionObjectTableName: tableLabel('CollectionObject'), }), @@ -189,15 +196,27 @@ export const collectionPreferenceDefinitions = { items: { inheritance: definePref({ title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberPref({ - catalogNumberFieldName: fieldLabel('CollectionObject','catalogNumber'), - collectionObjectGroupTableName: tableLabel('CollectionObjectGroup'), + catalogNumberFieldName: fieldLabel( + 'CollectionObject', + 'catalogNumber' + ), + collectionObjectGroupTableName: tableLabel( + 'CollectionObjectGroup' + ), }), description: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberPrefDescription({ - catalogNumberFieldName: fieldLabel('CollectionObject','catalogNumber'), + catalogNumberFieldName: fieldLabel( + 'CollectionObject', + 'catalogNumber' + ), collectionObjectTableName: tableLabel('CollectionObject'), - collectionObjectGroupTableName: tableLabel('CollectionObjectGroup'), + collectionObjectGroupTableName: tableLabel( + 'CollectionObjectGroup' + ), }), requiresReload: false, visible: true, @@ -210,8 +229,9 @@ export const collectionPreferenceDefinitions = { }, catalogNumberParentInheritance: { title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.parentCatalogNumberInheritance({ - componentTableName: tableLabel('Component') + componentTableName: tableLabel('Component'), }), subCategories: { behavior: { @@ -219,13 +239,21 @@ export const collectionPreferenceDefinitions = { items: { inheritance: definePref({ title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberParentCOPref({ - catalogNumberFieldName: fieldLabel('CollectionObject','catalogNumber'), + catalogNumberFieldName: fieldLabel( + 'CollectionObject', + 'catalogNumber' + ), componentTableName: tableLabel('Component'), }), description: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberParentCOPrefDescription({ - catalogNumberFieldName: fieldLabel('CollectionObject','catalogNumber'), + catalogNumberFieldName: fieldLabel( + 'CollectionObject', + 'catalogNumber' + ), componentTableName: tableLabel('Component'), collectionObjectTableName: tableLabel('CollectionObject'), }), @@ -240,6 +268,7 @@ export const collectionPreferenceDefinitions = { }, uniqueCatalogNumberAccrossComponentAndCO: { title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.uniqueCatalogNumberAcrossComponentAndCoTitle({ componentTableName: tableLabel('Component'), collectionObjectTableName: tableLabel('CollectionObject'), @@ -250,8 +279,12 @@ export const collectionPreferenceDefinitions = { items: { uniqueness: definePref({ title: () => + // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.uniqueCatNumberAcrossCompAndCo({ - catalogNumberFieldName: fieldLabel('CollectionObject','catalogNumber'), + catalogNumberFieldName: fieldLabel( + 'CollectionObject', + 'catalogNumber' + ), componentTableName: tableLabel('Component'), collectionObjectTableName: tableLabel('CollectionObject'), }), From 1e6c40b5e71829526cf7ddc8d8c3b90da965f42b Mon Sep 17 00:00:00 2001 From: Caroline D <108160931+CarolineDenis@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:18:51 -0500 Subject: [PATCH 8/8] Fix: Add missing localization --- .../Preferences/CollectionDefinitions.tsx | 10 - .../js_src/lib/localization/preferences.ts | 321 +++++++----------- .../frontend/js_src/lib/localization/query.ts | 95 +++--- .../frontend/js_src/lib/localization/stats.ts | 257 +------------- 4 files changed, 171 insertions(+), 512 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx index 93536f952b3..80093e9721c 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/CollectionDefinitions.tsx @@ -133,12 +133,10 @@ export const collectionPreferenceDefinitions = { }), showPreparationsTotal: definePref({ title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve statsText.showPreparationsTotal({ preparationTableName: tableLabel('Preparation'), }), description: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve statsText.showPreparationsTotalDescription({ preparationTableName: tableLabel('Preparation'), lowerPreparationTableName: @@ -186,7 +184,6 @@ export const collectionPreferenceDefinitions = { }, catalogNumberInheritance: { title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.primaryCatalogNumberInheritance({ collectionObjectTableName: tableLabel('CollectionObject'), }), @@ -196,7 +193,6 @@ export const collectionPreferenceDefinitions = { items: { inheritance: definePref({ title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberPref({ catalogNumberFieldName: fieldLabel( 'CollectionObject', @@ -207,7 +203,6 @@ export const collectionPreferenceDefinitions = { ), }), description: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberPrefDescription({ catalogNumberFieldName: fieldLabel( 'CollectionObject', @@ -229,7 +224,6 @@ export const collectionPreferenceDefinitions = { }, catalogNumberParentInheritance: { title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.parentCatalogNumberInheritance({ componentTableName: tableLabel('Component'), }), @@ -239,7 +233,6 @@ export const collectionPreferenceDefinitions = { items: { inheritance: definePref({ title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberParentCOPref({ catalogNumberFieldName: fieldLabel( 'CollectionObject', @@ -248,7 +241,6 @@ export const collectionPreferenceDefinitions = { componentTableName: tableLabel('Component'), }), description: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.inheritanceCatNumberParentCOPrefDescription({ catalogNumberFieldName: fieldLabel( 'CollectionObject', @@ -268,7 +260,6 @@ export const collectionPreferenceDefinitions = { }, uniqueCatalogNumberAccrossComponentAndCO: { title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve queryText.uniqueCatalogNumberAcrossComponentAndCoTitle({ componentTableName: tableLabel('Component'), collectionObjectTableName: tableLabel('CollectionObject'), @@ -279,7 +270,6 @@ export const collectionPreferenceDefinitions = { items: { uniqueness: definePref({ title: () => - // @ts-expect-error — upstream i18n typing incorrectly resolves params to neve preferencesText.uniqueCatNumberAcrossCompAndCo({ catalogNumberFieldName: fieldLabel( 'CollectionObject', diff --git a/specifyweb/frontend/js_src/lib/localization/preferences.ts b/specifyweb/frontend/js_src/lib/localization/preferences.ts index 534e3db3128..94007b7daa2 100644 --- a/specifyweb/frontend/js_src/lib/localization/preferences.ts +++ b/specifyweb/frontend/js_src/lib/localization/preferences.ts @@ -29,7 +29,7 @@ export const preferencesText = createDictionary({ }, userPreferences: { 'en-us': 'User Preferences', - 'ru-ru': 'Пользовательские настройки', + 'ru-ru': 'Настройки пользователя', 'es-es': 'Preferencias del usuario', 'fr-fr': "Préférences de l'utilisateur", 'uk-ua': 'Налаштування користувача', @@ -83,7 +83,7 @@ export const preferencesText = createDictionary({ }, inheritOsSettings: { 'en-us': 'Copies value from your Operating System settings', - 'ru-ru': 'Копирует значение из настроек вашей операционной системы.', + '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': 'Копіює значення з налаштувань вашої операційної системи', @@ -121,7 +121,7 @@ export const preferencesText = createDictionary({ }, reduceMotionDescription: { 'en-us': 'Disable non-essential animations and transitions.', - 'ru-ru': 'Отключите несущественные анимации и переходы.', + 'ru-ru': 'Отключите ненужные анимации и переходы.', 'es-es': 'Desactivar animaciones y transiciones no esenciales.', 'fr-fr': 'Désactivez les animations et les transitions non essentielles.', 'uk-ua': "Вимкніть необов'язкову анімацію та переходи.", @@ -130,12 +130,6 @@ export const preferencesText = createDictionary({ }, rankThreshold: { 'en-us': 'Show object count below', - 'de-ch': 'Objektanzahl unten anzeigen', - 'es-es': 'Mostrar el recuento de objetos a continuación', - 'fr-fr': "Afficher le nombre d'objets ci-dessous", - 'pt-br': 'Mostrar a contagem de objetos abaixo', - 'ru-ru': 'Ниже показано количество объектов.', - 'uk-ua': "Показати кількість об'єктів нижче", }, rankThresholdDescription: { 'en-us': @@ -155,7 +149,7 @@ export const preferencesText = createDictionary({ }, reduceTransparency: { 'en-us': 'Reduce transparency', - 'ru-ru': 'Снизить прозрачность', + 'ru-ru': 'Уменьшить прозрачность', 'es-es': 'Reducir la transparencia', 'fr-fr': 'Réduire la transparence', 'uk-ua': 'Зменшити прозорість', @@ -166,7 +160,7 @@ export const preferencesText = createDictionary({ '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': @@ -207,7 +201,7 @@ export const preferencesText = createDictionary({ }, noPreference: { 'en-us': 'No preference', - 'ru-ru': 'Без предпочтений', + 'ru-ru': 'Нет предпочтений', 'es-es': 'Sin preferencia', 'fr-fr': 'Pas de préférence', 'uk-ua': 'Без переваг', @@ -216,7 +210,7 @@ export const preferencesText = createDictionary({ }, fontSize: { 'en-us': 'Font size', - 'ru-ru': 'размер шрифта', + 'ru-ru': 'Размер шрифта', 'es-es': 'Tamaño de fuente', 'fr-fr': 'Taille de police', 'uk-ua': 'Розмір шрифту', @@ -236,7 +230,7 @@ export const preferencesText = createDictionary({ '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': @@ -268,7 +262,7 @@ export const preferencesText = createDictionary({ }, fieldBackgrounds: { 'en-us': 'Field backgrounds', - 'ru-ru': 'Полевые исследования', + 'ru-ru': 'Фоны полей', 'es-es': 'Fondos de campo', 'fr-fr': 'Milieux de terrain', 'uk-ua': 'Польові фони', @@ -277,7 +271,7 @@ export const preferencesText = createDictionary({ }, fieldBackground: { 'en-us': 'Field background', - 'ru-ru': 'Полевой фон', + 'ru-ru': 'Фон поля', 'es-es': 'Fondo de campo', 'fr-fr': 'Contexte du terrain', 'uk-ua': 'Поле фону', @@ -286,7 +280,7 @@ export const preferencesText = createDictionary({ }, disabledFieldBackground: { 'en-us': 'Disabled field background', - 'ru-ru': 'Фоновое поле инвалидности', + 'ru-ru': 'Отключенный фон поля', 'es-es': 'Fondo de campo deshabilitado', 'fr-fr': 'Fond de champ désactivé', 'uk-ua': 'Вимкнений фон поля', @@ -295,7 +289,7 @@ export const preferencesText = createDictionary({ }, invalidFieldBackground: { 'en-us': 'Invalid field background', - 'ru-ru': 'Недопустимое поле фона', + 'ru-ru': 'Неверный фон поля', 'es-es': 'Fondo de campo no válido', 'fr-fr': 'Fond de champ invalide', 'uk-ua': 'Недійсний фон поля', @@ -304,7 +298,7 @@ export const preferencesText = createDictionary({ }, requiredFieldBackground: { 'en-us': 'Required field background', - 'ru-ru': 'Требуемый опыт работы в данной области', + 'ru-ru': 'Обязательное поле фон', 'es-es': 'Fondo del campo obligatorio', 'fr-fr': 'Contexte du champ obligatoire', 'uk-ua': "Обов'язковий фон поля", @@ -313,7 +307,7 @@ export const preferencesText = createDictionary({ }, darkFieldBackground: { 'en-us': 'Field background (dark theme)', - 'ru-ru': 'Фоновое изображение поля (темная тема)', + 'ru-ru': 'Фон поля (тёмная тема)', 'es-es': 'Fondo de campo (tema oscuro)', 'fr-fr': 'Fond de champ (thème sombre)', 'uk-ua': 'Фон поля (темна тема)', @@ -322,7 +316,7 @@ export const preferencesText = createDictionary({ }, darkDisabledFieldBackground: { 'en-us': 'Disabled field background (dark theme)', - 'ru-ru': 'Фоновое изображение поля отключено (темная тема).', + 'ru-ru': 'Отключенный фон поля (тёмная тема)', 'es-es': 'Fondo de campo deshabilitado (tema oscuro)', 'fr-fr': 'Fond de champ désactivé (thème sombre)', 'uk-ua': 'Вимкнений фон поля (темна тема)', @@ -331,7 +325,7 @@ export const preferencesText = createDictionary({ }, darkInvalidFieldBackground: { 'en-us': 'Invalid field background (dark theme)', - 'ru-ru': 'Неверный фон поля (темная тема)', + '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': 'Гнучка ширина стовпця сітки вкладеного перегляду', @@ -340,7 +334,7 @@ export const preferencesText = createDictionary({ }, darkRequiredFieldBackground: { 'en-us': 'Required field background (dark theme)', - 'ru-ru': 'Фоновое изображение обязательного поля (темная тема).', + 'ru-ru': 'Обязательное поле фон (тёмная тема)', 'es-es': 'Fondo del campo obligatorio (tema oscuro)', 'fr-fr': 'Fond de champ obligatoire (thème sombre)', 'uk-ua': 'Обов’язковий фон поля (темна тема)', @@ -385,7 +379,7 @@ export const preferencesText = createDictionary({ }, translucentDialog: { 'en-us': 'Translucent dialogs', - 'ru-ru': 'Полупрозрачные диалоги', + 'ru-ru': 'Прозрачные диалоги', 'es-es': 'Diálogos translúcidos', 'fr-fr': 'Dialogues translucides', 'uk-ua': 'Напівпрозорі діалоги', @@ -394,7 +388,7 @@ export const preferencesText = createDictionary({ }, translucentDialogDescription: { 'en-us': 'Whether dialogs have translucent background.', - 'ru-ru': 'Есть ли у диалогов полупрозрачный фон.', + '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': 'Чи мають діалоги прозорий фон.', @@ -403,16 +397,16 @@ export const preferencesText = createDictionary({ }, alwaysPrompt: { 'en-us': 'Always prompt to choose collection', - 'ru-ru': 'Всегда на связи, выбирайте коллекцию', + '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 solicitando a seleção da coleção', + 'pt-br': 'Sempre solicitando a escolha da coleção', }, treeEditor: { 'en-us': 'Tree Editor', - 'ru-ru': 'Редактор дерева', + 'ru-ru': 'Редактор деревьев', 'es-es': 'Editor de árboles', 'fr-fr': "Éditeur d'arborescence", 'uk-ua': 'Редактор дерева', @@ -421,7 +415,7 @@ export const preferencesText = createDictionary({ }, treeAccentColor: { 'en-us': 'Tree accent color', - 'ru-ru': 'Цвет акцента дерева', + 'ru-ru': 'Акцентный цвет дерева', 'es-es': 'Color de acento del árbol', 'fr-fr': "Couleur d'accent d'arbre", 'uk-ua': 'Колір акценту дерева', @@ -430,16 +424,16 @@ export const preferencesText = createDictionary({ }, synonymColor: { 'en-us': 'Synonym color', - 'ru-ru': 'Синоним цвета', + 'ru-ru': 'Синоним цвет', 'es-es': 'Color sinónimo', 'fr-fr': 'Synonyme couleur', 'uk-ua': 'Синонім кольору', 'de-ch': 'Synonymfarbe', - 'pt-br': 'Cor (Sinônimo)', + 'pt-br': 'Cor (sinônimo)', }, showNewDataSetWarning: { 'en-us': 'Show new Data Set warning', - 'ru-ru': 'Показать новое предупреждение о наборе данных', + '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': 'Показати попередження про новий набір даних', @@ -449,7 +443,7 @@ export const preferencesText = createDictionary({ 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': @@ -462,7 +456,7 @@ export const preferencesText = createDictionary({ }, header: { 'en-us': 'Navigation Menu', - 'ru-ru': 'Навигационное меню', + 'ru-ru': 'Меню навигации', 'es-es': 'Menú de navegación', 'fr-fr': 'le menu de navigation', 'uk-ua': 'Навігаційне меню', @@ -480,7 +474,7 @@ export const preferencesText = createDictionary({ }, allowDismissingErrors: { 'en-us': 'Allow dismissing error messages', - 'ru-ru': 'Разрешить закрытие сообщений об ошибках', + 'ru-ru': 'Разрешить отклонять сообщения об ошибках', 'es-es': 'Permitir descartar mensajes de error', 'fr-fr': "Autoriser le rejet des messages d'erreur", 'uk-ua': 'Дозволити закривати повідомлення про помилки', @@ -500,7 +494,7 @@ export const preferencesText = createDictionary({ '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': @@ -528,7 +522,7 @@ export const preferencesText = createDictionary({ }, queryComboBox: { 'en-us': 'Query Combo Box', - 'ru-ru': 'Выпадающий список запросов', + 'ru-ru': 'Поле со списком запросов', 'es-es': 'Cuadro combinado de consulta', 'uk-ua': 'Поле зі списком запитів', 'de-ch': 'Abfrage-Kombinationsfeld', @@ -546,8 +540,7 @@ export const preferencesText = createDictionary({ }, treeSearchAlgorithm: { 'en-us': 'Search Algorithm (for relationships with tree tables)', - 'ru-ru': - 'Алгоритм поиска (для установления связей с помощью древовидных таблиц)', + '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)', @@ -557,7 +550,7 @@ export const preferencesText = createDictionary({ }, startsWithInsensitive: { 'en-us': 'Starts With (case-insensitive)', - 'ru-ru': 'Начинается с (регистр не учитывается)', + 'ru-ru': 'Начинается с (без учета регистра)', 'es-es': 'Comienza con (sin distinguir entre mayúsculas y minúsculas)', 'fr-fr': 'Commence par (insensible à la casse)', 'uk-ua': 'Починається з (без урахування регістру)', @@ -566,7 +559,7 @@ export const preferencesText = createDictionary({ }, startsWithDescription: { 'en-us': 'Search for values that begin with a given query string.', - 'ru-ru': 'Найдите значения, начинающиеся с заданной поисковой строки.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', 'es-es': 'Busque valores que comiencen con una cadena de consulta determinada.', 'fr-fr': @@ -579,7 +572,7 @@ export const preferencesText = createDictionary({ }, startsWithCaseSensitive: { 'en-us': 'Starts With (case-sensitive)', - 'ru-ru': 'Начинается с (регистр имеет значение)', + 'ru-ru': 'Начинается с (с учетом регистра)', 'es-es': 'Comienza con (sensible a mayúsculas y minúsculas)', 'fr-fr': 'Commence par (sensible à la casse)', 'uk-ua': 'Починається з (з урахуванням регістру)', @@ -588,7 +581,7 @@ export const preferencesText = createDictionary({ }, startsWithCaseSensitiveDescription: { 'en-us': 'Search for values that begin with a given query string.', - 'ru-ru': 'Найдите значения, начинающиеся с заданной поисковой строки.', + 'ru-ru': 'Поиск значений, начинающихся с заданной строки запроса.', 'es-es': 'Busque valores que comiencen con una cadena de consulta determinada.', 'fr-fr': @@ -601,7 +594,7 @@ export const preferencesText = createDictionary({ }, containsInsensitive: { 'en-us': 'Contains (case-insensitive)', - 'ru-ru': 'Содержит (регистр нечувствителен)', + 'ru-ru': 'Содержит (без учета регистра)', 'es-es': 'Contiene (sin distinguir entre mayúsculas y minúsculas)', 'fr-fr': 'Contient (insensible à la casse)', 'uk-ua': 'Містить (незалежно від регістру)', @@ -621,7 +614,7 @@ export const preferencesText = createDictionary({ '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': @@ -653,7 +646,7 @@ export const preferencesText = createDictionary({ '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': @@ -667,7 +660,7 @@ export const preferencesText = createDictionary({ }, highlightMatch: { 'en-us': 'Highlight matched substring', - 'ru-ru': 'Выделить найденную подстроку', + 'ru-ru': 'Выделить совпавшую подстроку', 'es-es': 'Resaltar la subcadena coincidente', 'fr-fr': 'Mettre en surbrillance la sous-chaîne correspondante', 'uk-ua': 'Виділіть збіг підрядка', @@ -690,7 +683,7 @@ export const preferencesText = createDictionary({ }, showDialogIcon: { 'en-us': 'Show icon in the header', - 'ru-ru': 'Показать значок в заголовке', + 'ru-ru': 'Показывать значок в заголовке', 'es-es': 'Mostrar icono en el encabezado', 'fr-fr': "Afficher l'icône dans l'en-tête", 'uk-ua': 'Показати значок у заголовку', @@ -699,7 +692,7 @@ export const preferencesText = createDictionary({ }, scaleInterface: { 'en-us': 'Scale Interface', - 'ru-ru': 'Масштабирование интерфейса', + 'ru-ru': 'Интерфейс масштабирования', 'es-es': 'Interfaz de escala', 'fr-fr': 'Interface de balance', 'uk-ua': 'Інтерфейс масштабу', @@ -726,7 +719,7 @@ export const preferencesText = createDictionary({ }, welcomePage: { 'en-us': 'Home Page', - 'ru-ru': 'Главная страница', + 'ru-ru': 'Домашняя страница', 'es-es': 'Página de inicio', 'fr-fr': "Page d'accueil", 'uk-ua': 'Домашня сторінка', @@ -771,7 +764,7 @@ export const preferencesText = createDictionary({ }, embeddedWebpageDescription: { 'en-us': 'A URL to a page that would be embedded on the home page:', - 'ru-ru': 'URL-адрес страницы, которая будет встроена на главную страницу:', + '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-адреса сторінки, яка буде вбудована на домашній сторінці:', @@ -827,7 +820,7 @@ export const preferencesText = createDictionary({ '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': @@ -850,7 +843,7 @@ export const preferencesText = createDictionary({ }, stickyScrolling: { 'en-us': 'Sticky scroll bar', - 'ru-ru': 'Залипающая полоса прокрутки', + 'ru-ru': 'Липкая полоса прокрутки', 'es-es': 'Barra de desplazamiento fija', 'fr-fr': 'Barre de défilement collante', 'uk-ua': 'Липка смуга прокрутки', @@ -886,7 +879,7 @@ export const preferencesText = createDictionary({ }, darkForeground: { 'en-us': 'Foreground (dark theme)', - 'ru-ru': 'Передний план (темная тема)', + 'ru-ru': 'Передний план (тёмная тема)', 'es-es': 'Primer plano (tema oscuro)', 'fr-fr': 'Premier plan (thème sombre)', 'uk-ua': 'Передній план (темна тема)', @@ -895,7 +888,7 @@ export const preferencesText = createDictionary({ }, darkBackground: { 'en-us': 'Background (dark theme)', - 'ru-ru': 'Фон (темная тема)', + 'ru-ru': 'Фон (тёмная тема)', 'es-es': 'Fondo (tema oscuro)', 'fr-fr': 'Arrière-plan (thème sombre)', 'uk-ua': 'Фон (темна тема)', @@ -904,7 +897,7 @@ export const preferencesText = createDictionary({ }, accentColor1: { 'en-us': 'Accent color 1', - 'ru-ru': 'Дополнительный цвет 1', + 'ru-ru': 'Акцентный цвет 1', 'es-es': 'Color de acento 1', 'fr-fr': "Couleur d'accent 1", 'uk-ua': 'Акцентний колір 1', @@ -931,7 +924,7 @@ export const preferencesText = createDictionary({ }, accentColor4: { 'en-us': 'Accent color 4', - 'ru-ru': 'Дополнительный цвет 4', + 'ru-ru': 'Акцентный цвет 4', 'es-es': 'Color de acento 4', 'fr-fr': "Couleur d'accent 4", 'uk-ua': 'Акцентний колір 4', @@ -967,7 +960,7 @@ export const preferencesText = createDictionary({ }, autoWrapCols: { 'en-us': 'Navigate to the other side when reaching the edge column', - 'ru-ru': 'Когда дойдете до краевого столбца, перейдите на другую сторону.', + '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', @@ -978,7 +971,7 @@ export const preferencesText = createDictionary({ }, autoWrapRows: { 'en-us': 'Navigate to the other side when reaching the edge row', - 'ru-ru': 'Когда дойдете до крайнего ряда, перейдите на другую сторону.', + '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', @@ -989,7 +982,7 @@ export const preferencesText = createDictionary({ }, enterBeginsEditing: { 'en-us': 'Enter key begins editing cell', - 'ru-ru': 'Нажатие клавиши Enter начинает редактирование ячейки', + '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 починає редагування клітинки', @@ -1011,7 +1004,7 @@ export const preferencesText = createDictionary({ 'en-us': 'You can move in the opposite direction by pressing Shift+Tab.', 'ru-ru': - 'Для перемещения в противоположном направлении нажмите Shift+Tab.', + 'Вы можете двигаться в обратном направлении, нажав Shift+Tab.', 'es-es': 'Puedes moverte en la dirección opuesta presionando Shift+Tab.', 'fr-fr': @@ -1057,7 +1050,7 @@ export const preferencesText = createDictionary({ 'en-us': 'You can move in the opposite direction by pressing Shift+Enter.', 'ru-ru': - 'Вы можете переместиться в противоположном направлении, нажав Shift+Enter.', + 'Вы можете двигаться в противоположном направлении, нажав Shift+Enter.', 'es-es': 'Puedes moverte en la dirección opuesta presionando Shift+Enter.', 'fr-fr': 'Synonyme couleur.', @@ -1070,7 +1063,7 @@ export const preferencesText = createDictionary({ }, filterPickLists: { 'en-us': 'Filter pick list items', - 'ru-ru': 'Фильтрация элементов выпадающего списка', + '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': 'Фільтр вибору елементів списку', @@ -1079,7 +1072,7 @@ export const preferencesText = createDictionary({ }, exportFileDelimiter: { 'en-us': 'Export file delimiter', - 'ru-ru': 'Разделитель экспортируемых файлов', + 'ru-ru': 'Разделитель файлов экспорта', 'es-es': 'Delimitador de archivo de exportación', 'fr-fr': "Délimiteur de fichier d'exportation", 'uk-ua': 'Роздільник файлу експорту', @@ -1120,7 +1113,7 @@ export const preferencesText = createDictionary({ }, caseInsensitive: { 'en-us': 'Case-insensitive', - 'ru-ru': 'регистронечувствительный', + 'ru-ru': 'Без учета регистра', 'es-es': 'No distingue entre mayúsculas y minúsculas', 'fr-fr': 'Insensible à la casse', 'uk-ua': 'Регістр не враховується', @@ -1129,7 +1122,7 @@ export const preferencesText = createDictionary({ }, showNoReadTables: { 'en-us': 'Show tables without "Read" access', - 'ru-ru': 'Показать таблицы без доступа на чтение.', + 'ru-ru': 'Показывать таблицы без доступа «Чтение»', 'es-es': 'Mostrar tablas sin acceso de "Lectura"', 'fr-fr': 'Afficher les tableaux sans accès "Lecture"', 'uk-ua': 'Показувати таблиці без доступу «Читання»', @@ -1138,7 +1131,7 @@ export const preferencesText = createDictionary({ }, showNoAccessTables: { 'en-us': 'Show tables without "Create" access', - 'ru-ru': 'Показать таблицы без доступа "Создать".', + 'ru-ru': 'Показывать таблицы без права «Создать»', 'es-es': 'Mostrar tablas sin acceso "Crear"', 'fr-fr': 'Afficher les tableaux sans accès "Créer"', 'uk-ua': 'Показувати таблиці без доступу «Створити»', @@ -1147,7 +1140,7 @@ export const preferencesText = createDictionary({ }, textAreaAutoGrow: { 'en-us': 'Text boxes grow automatically', - 'ru-ru': 'Текстовые поля автоматически увеличиваются в размере.', + 'ru-ru': 'Текстовые поля увеличиваются автоматически', 'es-es': 'Los cuadros de texto crecen automáticamente', 'fr-fr': "Les zones de texte s'agrandissent automatiquement", 'uk-ua': 'Текстові поля збільшуються автоматично', @@ -1171,7 +1164,7 @@ export const preferencesText = createDictionary({ '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': 'Сбрасывает все фильтры запроса при запуске отчета из формы.', + 'ru-ru': 'Очищает все фильтры запроса при запуске отчета из формы.', 'uk-ua': 'Очищає всі фільтри запитів під час запуску звіту з форми.', 'pt-br': 'Limpa todos os filtros de consulta ao executar um relatório a partir de um formulário.', @@ -1184,14 +1177,15 @@ export const preferencesText = createDictionary({ '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': 'Отображать фильтры запроса при создании отчета из формы', + 'ru-ru': 'Показывать фильтры запроса при запуске отчета из формы', 'uk-ua': 'Показувати фільтри запитів під час запуску звіту з форми', 'pt-br': 'Exibir filtros de consulta ao executar um relatório a partir de um formulário.', }, autoGrowAutoComplete: { 'en-us': 'Allow autocomplete to grow as wide as need', - 'ru-ru': 'Разрешите автозаполнению расширяться до необходимой ширины.', + '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', @@ -1204,7 +1198,7 @@ export const preferencesText = createDictionary({ }, tableNameInTitle: { 'en-us': 'Include table name in the browser page title', - 'ru-ru': 'Включите название таблицы в заголовок страницы в браузере.', + 'ru-ru': 'Включить имя таблицы в заголовок страницы браузера', 'es-es': 'Incluir el nombre de la tabla en el título de la página del navegador', 'fr-fr': @@ -1218,13 +1212,13 @@ export const preferencesText = createDictionary({ 'de-ch': 'Fokus zuerst Feld', 'es-es': 'Enfoque el primer campo', 'fr-fr': 'Concentrez-vous sur le premier champ', - 'ru-ru': 'Сосредоточьтесь на первом поле', + 'ru-ru': 'Фокус первого поля', 'uk-ua': 'Перейти до першого поля', 'pt-br': 'Foque primeiro no campo', }, doubleClickZoom: { 'en-us': 'Double click to zoom', - 'ru-ru': 'Двойной щелчок для увеличения', + 'ru-ru': 'Дважды щелкните, чтобы увеличить', 'es-es': 'Haga doble clic para ampliar', 'fr-fr': 'Double-cliquez pour zoomer', 'uk-ua': 'Двічі клацніть, щоб збільшити', @@ -1233,7 +1227,7 @@ export const preferencesText = createDictionary({ }, closePopupOnClick: { 'en-us': 'Close pop-up on outside click', - 'ru-ru': 'Закрыть всплывающее окно при внешнем клике', + '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': 'Закрити спливаюче вікно при зовнішньому клацанні', @@ -1243,7 +1237,7 @@ export const preferencesText = createDictionary({ animateTransitions: { 'en-us': 'Animate transitions', 'ru-ru': 'Анимированные переходы', - 'es-es': 'Transiciones animadas', + 'es-es': 'Animar transiciones', 'fr-fr': 'Animer les transitions', 'uk-ua': 'Анімація переходів', 'de-ch': 'Übergänge animieren', @@ -1251,7 +1245,7 @@ export const preferencesText = createDictionary({ }, panInertia: { 'en-us': 'Pan inertia', - 'ru-ru': 'пан инерция', + 'ru-ru': 'Инерция пан', 'es-es': 'Inercia de la sartén', 'fr-fr': 'Inertie du bac', 'uk-ua': 'Інерція панорами', @@ -1269,7 +1263,7 @@ export const preferencesText = createDictionary({ }, scrollWheelZoom: { 'en-us': 'Scroll wheel zoom', - 'ru-ru': 'масштабирование с помощью колесика мыши', + 'ru-ru': 'Масштабирование с помощью колеса прокрутки', 'es-es': 'Zoom con rueda de desplazamiento', 'fr-fr': 'Zoom avec la molette de défilement', 'uk-ua': 'Масштаб колеса прокрутки', @@ -1278,7 +1272,7 @@ export const preferencesText = createDictionary({ }, flexibleColumnWidth: { 'en-us': 'Flexible column width', - 'ru-ru': 'Гибкая ширина колонки', + 'ru-ru': 'Гибкая ширина столбца', 'es-es': 'Ancho de columna flexible', 'fr-fr': 'Largeur de colonne flexible', 'uk-ua': 'Гнучка ширина колонки', @@ -1296,7 +1290,7 @@ export const preferencesText = createDictionary({ }, closeOnEsc: { 'en-us': 'Close on ESC key press', - 'ru-ru': 'Закрыть при нажатии клавиши ESC', + 'ru-ru': 'Закрыть нажатием клавиши ESC', 'es-es': 'Cerrar al presionar la tecla ESC', 'fr-fr': 'Icône et nom de la table', 'uk-ua': 'Закриття натисканням клавіші ESC', @@ -1305,7 +1299,7 @@ export const preferencesText = createDictionary({ }, closeOnOutsideClick: { 'en-us': 'Close on outside click', - 'ru-ru': 'Закрыть при внешнем щелчке', + 'ru-ru': 'Закрытие по внешнему щелчку', 'es-es': 'Cerrar al hacer clic desde fuera', 'fr-fr': 'Fermer sur clic extérieur', 'uk-ua': 'Закрийте зовнішнім клацанням', @@ -1323,7 +1317,7 @@ export const preferencesText = createDictionary({ }, useAccessibleFullDatePicker: { 'en-us': 'Use accessible full date picker', - 'ru-ru': 'Используйте удобный полнофункциональный инструмент выбора даты.', + 'ru-ru': 'Используйте доступный полный выбор даты', 'es-es': 'Utilice el selector de fecha completo y accesible', 'fr-fr': 'Utiliser un sélecteur de date complet accessible', 'uk-ua': 'Використовуйте доступний повний засіб вибору дати', @@ -1332,7 +1326,7 @@ export const preferencesText = createDictionary({ }, useAccessibleMonthPicker: { 'en-us': 'Use accessible month picker', - 'ru-ru': 'Используйте удобный инструмент выбора месяца.', + 'ru-ru': 'Используйте доступный выбор месяца', 'es-es': 'Utilice el selector de meses accesible', 'fr-fr': 'Utiliser le sélecteur de mois accessible', 'uk-ua': 'Використовуйте доступний засіб вибору місяця', @@ -1363,7 +1357,7 @@ export const preferencesText = createDictionary({ 'es-es': 'Mostrar bordes alrededor de las subvistas', 'fr-fr': 'Afficher les bordures autour des sous-vues', 'pt-br': 'Exibir bordas ao redor das subvisualizações', - 'ru-ru': 'Отобразить границы вокруг дочерних представлений', + 'ru-ru': 'Показывать границы вокруг подпредставлений', 'uk-ua': 'Показати межі навколо підвидів', }, limitMaxFieldWidth: { @@ -1386,7 +1380,7 @@ export const preferencesText = createDictionary({ }, blurContentBehindDialog: { 'en-us': 'Blur content behind the dialog', - 'ru-ru': 'Размыть содержимое за диалоговым окном', + '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': 'Розмити вміст за діалоговим вікном', @@ -1404,7 +1398,7 @@ export const preferencesText = createDictionary({ }, recordSetRecordToOpen: { 'en-us': 'Record to open by default', - 'ru-ru': 'Запись, которая будет открыта по умолчанию', + 'ru-ru': 'Запись для открытия по умолчанию', 'es-es': 'Registro para abrir por defecto', 'fr-fr': 'Enregistrement à ouvrir par défaut', 'uk-ua': 'Запис відкривається за умовчанням', @@ -1415,7 +1409,7 @@ export const preferencesText = createDictionary({ 'en-us': '{altKeyName:string}+Click to suppress new tab', 'ru-ru': - '{altKeyName:string}+Нажмите, чтобы скрыть новую вкладку', + '{altKeyName:string}+Нажмите , чтобы скрыть новую вкладку', 'es-es': '{altKeyName:string}+Haga clic en para suprimir la nueva pestaña', 'fr-fr': @@ -1431,7 +1425,7 @@ export const preferencesText = createDictionary({ '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}+Щелкните ссылку, которая обычно открывается в новой вкладке, чтобы открыть ее в текущей вкладке.', + '{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.', @@ -1444,7 +1438,7 @@ export const preferencesText = createDictionary({ }, makeFormDialogsModal: { 'en-us': 'Make form dialogs gray out the background', - 'ru-ru': 'Сделайте так, чтобы диалоговые окна форм были затемнены.', + 'ru-ru': 'Сделать фон диалоговых окон серым', 'es-es': 'Hacer que los cuadros de diálogo del formulario tengan el fondo en gris', 'fr-fr': @@ -1456,7 +1450,7 @@ export const preferencesText = createDictionary({ }, autoScrollTree: { 'en-us': 'Auto scroll tree to focused node', - 'ru-ru': 'Автоматическая прокрутка дерева к сфокусированному узлу', + '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': 'Автоматичне прокручування дерева до виділеного вузла', @@ -1474,7 +1468,7 @@ export const preferencesText = createDictionary({ }, lineWrap: { 'en-us': 'Line wrap', - 'ru-ru': 'перенос строки', + 'ru-ru': 'Перенос строки', 'es-es': 'Ajuste de línea', 'fr-fr': 'Retour à la ligne', 'uk-ua': 'Обтікання лініями', @@ -1519,7 +1513,7 @@ export const preferencesText = createDictionary({ }, tableIcon: { 'en-us': 'Table icon', - 'ru-ru': 'значок таблицы', + 'ru-ru': 'Значок таблицы', 'es-es': 'Icono de tabla', 'fr-fr': 'Icône de tableau', 'uk-ua': 'Значок таблиці', @@ -1551,7 +1545,7 @@ export const preferencesText = createDictionary({ 'es-es': 'Búsqueda que distingue entre mayúsculas y minúsculas', 'fr-fr': 'Recherche sensible à la casse', 'uk-ua': 'Пошук з урахуванням регістру', - 'de-ch': 'Suche mit Berücksichtigung der Groß-/Kleinschreibung', + 'de-ch': 'Suche mit Berücksichtigung der Groß- und Kleinschreibung', 'ru-ru': 'Поиск с учетом регистра', 'pt-br': 'Pesquisa que diferencia maiúsculas de minúsculas', }, @@ -1575,7 +1569,7 @@ export const preferencesText = createDictionary({ }, useSpaceAsDelimiter: { 'en-us': 'Use space as delimiter', - 'ru-ru': 'Используйте пробел в качестве разделителя.', + 'ru-ru': 'Используйте пробел в качестве разделителя', 'es-es': 'Utilice el espacio como delimitador', 'fr-fr': "Utiliser l'espace comme délimiteur", 'uk-ua': 'Використовуйте пробіл як роздільник', @@ -1584,7 +1578,7 @@ export const preferencesText = createDictionary({ }, useCommaAsDelimiter: { 'en-us': 'Use comma as delimiter', - 'ru-ru': 'Используйте запятую в качестве разделителя.', + 'ru-ru': 'Используйте запятую в качестве разделителя', 'es-es': 'Utilice la coma como delimitador', 'fr-fr': 'Utiliser la virgule comme délimiteur', 'uk-ua': 'Використовуйте кому як роздільник', @@ -1593,7 +1587,7 @@ export const preferencesText = createDictionary({ }, useNewLineAsDelimiter: { 'en-us': 'Use new line as delimiter', - 'ru-ru': 'Используйте новую строку в качестве разделителя.', + 'ru-ru': 'Использовать новую строку в качестве разделителя', 'es-es': 'Utilice nueva línea como delimitador', 'fr-fr': 'Utiliser une nouvelle ligne comme délimiteur', 'uk-ua': 'Використовуйте новий рядок як роздільник', @@ -1613,7 +1607,7 @@ export const preferencesText = createDictionary({ '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': @@ -1720,7 +1714,7 @@ export const preferencesText = createDictionary({ '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': @@ -1732,7 +1726,7 @@ export const preferencesText = createDictionary({ 'en-us': 'Auto populate the merged record with values from duplicates when opening the merging dialog.', 'ru-ru': - 'При открытии диалогового окна слияния объединенная запись автоматически заполняется значениями из дубликатов.', + 'Автоматически заполнять объединенную запись значениями из дубликатов при открытии диалогового окна слияния.', 'de-ch': 'Beim Öffnen des Zusammenführungsdialogs werden die Werte aus den Duplikaten automatisch in den zusammengeführten Datensatz übernommen.', 'es-es': @@ -1759,7 +1753,7 @@ export const preferencesText = createDictionary({ 'en-us': 'When merging agents, automatically create {agentVariantTable:string} records based on the variations of first name/last name.', 'ru-ru': - 'При объединении агентов автоматически создавайте записи {agentVariantTable:string} на основе вариантов имени/фамилии.', + 'При объединении агентов автоматически создавать записи {agentVariantTable:string} на основе вариаций имени/фамилии.', 'de-ch': 'Beim Zusammenführen von Agenten werden automatisch {agentVariantTable:string}-Datensätze auf Basis der Varianten von Vor- und Nachnamen erstellt.', 'es-es': @@ -1782,7 +1776,7 @@ export const preferencesText = createDictionary({ }, rememberDialogSizes: { 'en-us': 'Remember dialog window sizes', - 'ru-ru': 'Запомнить размеры диалоговых окон', + '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': "Запам'ятайте розміри діалогових вікон", @@ -1791,7 +1785,7 @@ export const preferencesText = createDictionary({ }, rememberDialogPositions: { 'en-us': 'Remember dialog window positions', - 'ru-ru': 'Запомнить положение диалоговых окон', + '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': "Запам'ятовуйте положення діалогового вікна", @@ -1800,7 +1794,7 @@ export const preferencesText = createDictionary({ }, autoPlayMedia: { 'en-us': 'Automatically play media', - 'ru-ru': 'Автоматическое воспроизведение медиафайлов', + 'ru-ru': 'Автоматически воспроизводить медиа', 'es-es': 'Reproducir automáticamente medios', 'fr-fr': 'Lire automatiquement les médias', 'uk-ua': 'Автоматичне відтворення медіа', @@ -1809,7 +1803,7 @@ export const preferencesText = createDictionary({ }, useCustomTooltips: { 'en-us': 'Use modern tooltips', - 'ru-ru': 'Используйте современные всплывающие подсказки.', + 'ru-ru': 'Используйте современные подсказки', 'es-es': 'Utilice información sobre herramientas moderna', 'fr-fr': 'Utiliser des info-bulles modernes', 'uk-ua': 'Використовуйте сучасні підказки', @@ -1824,8 +1818,7 @@ export const preferencesText = createDictionary({ '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': - 'Всегда используйте поиск с помощью построителя запросов внутри формы поиска.', + 'ru-ru': 'Всегда используйте конструктор запросов внутри формы поиска.', 'uk-ua': 'Завжди використовуйте пошук конструктора запитів у формі пошуку', 'pt-br': 'Sempre utilize o construtor de consultas dentro do formulário de pesquisa.', @@ -1836,7 +1829,7 @@ export const preferencesText = createDictionary({ 'es-es': 'Localizar los nombres de los recursos de aplicaciones reconocidos', 'fr-fr': "Localiser les noms des ressources d'application reconnues", - 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения.', + 'ru-ru': 'Локализуйте названия распознанных ресурсов приложения', 'uk-ua': 'Локалізувати назви розпізнаних ресурсів програми', 'pt-br': 'Localize os nomes dos recursos de aplicativos reconhecidos.', }, @@ -1845,7 +1838,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Lange XML-Zeilen in mehrere Zeilen aufteilen', '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 на несколько строк.', + 'ru-ru': 'Разделить длинные строки XML на несколько строк', 'uk-ua': 'Розділіть довгі рядки XML на кілька рядків', 'pt-br': 'Dividir linhas longas de XML em várias linhas.', }, @@ -1872,7 +1865,7 @@ export const preferencesText = createDictionary({ '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': 'Вложение не загрузилось.', + 'ru-ru': 'Не удалось загрузить вложение.', 'uk-ua': 'Не вдалося завантажити вкладений файл.', 'pt-br': 'O anexo não carregou.', }, @@ -1890,7 +1883,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Erweiterte Bild-URL', 'es-es': 'URL de imagen expandida', 'fr-fr': "URL de l'image étendue", - 'ru-ru': 'Расширенная ссылка на изображение', + 'ru-ru': 'URL-адрес развернутого изображения', 'uk-ua': 'Розширена URL-адреса зображення', 'pt-br': 'URL da imagem expandida', }, @@ -1899,7 +1892,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'URL des zusammengefassten Bildes', 'es-es': 'URL de imagen contraída', 'fr-fr': "URL de l'image réduite", - 'ru-ru': 'Свернутая ссылка на изображение', + 'ru-ru': 'URL-адрес свернутого изображения', 'uk-ua': 'URL-адреса згорнутого зображення', 'pt-br': 'URL da imagem recolhida', }, @@ -1913,7 +1906,7 @@ export const preferencesText = createDictionary({ 'fr-fr': 'Une URL vers une image qui serait affichée à côté du logo Specify dans le menu de navigation.', 'ru-ru': - 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Указать» в навигационном меню.', + 'URL-адрес изображения, которое будет отображаться рядом с логотипом «Укажите» в меню навигации.', 'uk-ua': 'URL-адреса зображення, яке відображатиметься поруч із «Вказати логотип» у меню навігації.', 'pt-br': @@ -1941,9 +1934,9 @@ export const preferencesText = createDictionary({ 'en-us': 'Secondary button color', 'es-es': 'Color del botón secundario', 'fr-fr': 'Couleur du bouton secondaire', - 'ru-ru': 'Вторичный цвет кнопки', + 'ru-ru': 'Цвет вторичной кнопки', 'uk-ua': 'Колір вторинної кнопки', - 'de-ch': 'Sekundäre Tastenfarbe', + 'de-ch': 'Farbe der Sekundärtaste', 'pt-br': 'Cor do botão secundário', }, secondaryLightButtonColor: { @@ -1951,7 +1944,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Farbe des sekundären Lichtknopfes', 'es-es': 'Color del botón de luz secundaria', 'fr-fr': "Couleur du bouton d'éclairage secondaire", - 'ru-ru': 'Цвет кнопки вторичного освещения', + 'ru-ru': 'Цвет кнопки дополнительного освещения', 'uk-ua': 'Колір вторинної світлової кнопки', 'pt-br': 'Cor do botão de luz secundário', }, @@ -2005,7 +1998,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Grundlegende Ansicht anzeigen', 'es-es': 'Mostrar vista básica', 'fr-fr': 'Afficher la vue de base', - 'ru-ru': 'Отображение базового вида', + 'ru-ru': 'Отобразить базовый вид', 'uk-ua': 'Відобразити базовий вигляд', 'pt-br': 'Exibir visualização básica', }, @@ -2030,7 +2023,7 @@ export const preferencesText = createDictionary({ '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': 'Дозволяє застосовувати до текстових полів такі фільтри: «Більше ніж», «Менше ніж», «Більше або дорівнює» та «Менше або дорівнює»', }, @@ -2048,7 +2041,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Detailansicht', 'es-es': 'Vista detallada', 'fr-fr': 'Vue détaillée', - 'ru-ru': 'Детальный вид', + 'ru-ru': 'Подробный вид', 'uk-ua': 'Детальний вигляд', 'pt-br': 'Visão detalhada', }, @@ -2057,7 +2050,7 @@ export const preferencesText = createDictionary({ 'de-ch': 'Anhangsvorschaumodus', 'es-es': 'Modo de vista previa de archivos adjuntos', 'fr-fr': 'Mode aperçu des pièces jointes', - 'ru-ru': 'режим предварительного просмотра вложений', + 'ru-ru': 'Режим предварительного просмотра вложений', 'uk-ua': 'Режим попереднього перегляду вкладених файлів', 'pt-br': 'Modo de pré-visualização de anexos', }, @@ -2084,113 +2077,59 @@ export const preferencesText = createDictionary({ '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': 'Добавить строку поиска на главную страницу', + 'ru-ru': 'Добавить панель поиска на домашнюю страницу', 'uk-ua': 'Додайте рядок пошуку на головну сторінку', 'pt-br': 'Adicionar barra de pesquisa na página inicial', }, inheritanceCatNumberPrefDescription: { 'en-us': - 'Control whether collection objects inherit the catalog number from the primary collection object.', - 'de-ch': - 'Steuern Sie, ob Sammlungsobjekte die Katalognummer vom primären Sammlungsobjekt erben.', - 'es-es': - 'Controlar si los objetos de colección heredan el número de catálogo del objeto de colección principal.', - 'fr-fr': - "Contrôlez si les objets de collection héritent du numéro de catalogue de l'objet de collection principal.", - 'pt-br': - 'Controlar se os objetos da coleção herdam o número de catálogo do objeto da coleção principal.', - 'ru-ru': - 'Управляйте тем, будут ли объекты коллекции наследовать каталожный номер от основного объекта коллекции.', - 'uk-ua': - "Контролюйте, чи успадковують об'єкти колекції каталожний номер від основного об'єкта колекції.", + 'Only {collectionObjectTableName: string} records without a {catalogNumberFieldName: string} will inherit one from the primary {collectionObjectTableName: string} in a {collectionObjectGroupTableName: string}.', }, inheritanceCatNumberPref: { 'en-us': - 'Enable the inheritance of the primary catalog number to its empty siblings.', + 'Enable {catalogNumberFieldName: string} inheritance for {collectionObjectGroupTableName: string} siblings', 'de-ch': - 'Aktivieren Sie die Vererbung der primären Katalognummer an ihre leeren Geschwister.', + 'Aktivieren Sie die Vererbung der primären {catalogNumberFieldName: string} an ihre leeren Geschwister', 'es-es': - 'Habilitar la herencia del número de catálogo principal a sus hermanos vacíos.', + 'Habilitar la herencia del {catalogNumberFieldName: string} principal a sus hermanos vacíos', 'fr-fr': - "Activer l'héritage du numéro de catalogue principal à ses frères et sœurs vides.", + "Activer l'héritage du {catalogNumberFieldName: string} principal à ses frères et sœurs vides", 'pt-br': - 'Permita a herança do número de catálogo principal para seus irmãos vazios.', + 'Permita a herança do {catalogNumberFieldName: string} principal para seus irmãos vazios', 'ru-ru': - 'Разрешить наследование основного каталожного номера его пустым соседним элементам.', + 'Включить наследование основного {catalogNumberFieldName: string} его пустыми родственными номерами', 'uk-ua': - 'Увімкнути успадкування основного каталожного номера його порожнім братам і сестрам.', + 'Увімкнути успадкування основного {catalogNumberFieldName: string} його порожнім братам і сестрам', }, inheritanceCatNumberParentCOPref: { 'en-us': - 'Enable the inheritance of the parent catalog number to its empty children.', + 'Enable {catalogNumberFieldName: string} inheritance for {componentTableName: string} records', 'de-ch': - 'Aktivieren Sie die Vererbung der übergeordneten Katalognummer an deren leere untergeordnete Elemente.', + 'Aktivieren Sie die Vererbung von {catalogNumberFieldName: string} für {componentTableName: string}-Datensätze', 'es-es': - 'Habilitar la herencia del número de catálogo padre a sus hijos vacíos.', + 'Habilitar la herencia de {catalogNumberFieldName: string} para los registros de {componentTableName: string}', 'fr-fr': - "Activer l'héritage du numéro de catalogue parent à ses enfants vides.", + "Activer l'héritage de {catalogNumberFieldName: string} pour les enregistrements {componentTableName: string}", 'pt-br': - 'Habilitar a herança do número de catálogo pai para seus filhos vazios.', + 'Ative a herança de {catalogNumberFieldName: string} para registros {componentTableName: string}', 'ru-ru': - 'Разрешить наследование родительского каталожного номера его пустым дочерним элементам.', + 'Включить наследование {catalogNumberFieldName: string} для записей {componentTableName: string}', 'uk-ua': - 'Увімкнути успадкування батьківського каталожного номера його порожнім дочірнім елементам.', + 'Увімкніть успадкування {catalogNumberFieldName: string} для записів {componentTableName: string}', }, 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 único em todas as tabelas de Componente e CO.', - 'ru-ru': - 'Поле «Номер по каталогу» должно быть уникальным в таблицах «Компонент» и «CO».', - 'uk-ua': - 'Поле «Номер у каталозі» має бути унікальним у таблицях «Компонент» та «CO»', + 'Enforce uniqueness for the {catalogNumberFieldName: string} field across {componentTableName: string} and {collectionObjectTableName: string}.', }, scopeEntireTablePicklists: { 'en-us': 'Scope "Entire Table" Picklists', - 'de-ch': 'Bereich „Gesamte Tabelle“ Auswahllisten', - 'es-es': 'Listas de selección de "Tabla completa" de Scope', - 'fr-fr': 'Listes de sélection « Tableau entier »', - 'pt-br': 'Escopo "Tabela Inteira" Listas de seleção', - 'ru-ru': 'Область действия: Списки выбора "Вся таблица"', - 'uk-ua': 'Списки вибору «Уся таблиця»', }, scopeEntireTablePicklistsDescription: { 'en-us': 'If enabled, picklists of type "Entire Table" will only show items that are in use within the current collection.', - 'de-ch': - 'Wenn diese Option aktiviert ist, werden in Auswahllisten vom Typ „Gesamte Tabelle“ nur Elemente angezeigt, die in der aktuellen Sammlung verwendet werden.', - 'es-es': - 'Si esta opción está habilitada, las listas de selección de tipo "Tabla completa" solo mostrarán los elementos que estén en uso dentro de la colección actual.', - 'fr-fr': - "Si cette option est activée, les listes de sélection de type « Tableau entier » n'afficheront que les éléments utilisés dans la collection actuelle.", - 'pt-br': - 'Se ativada, a opção "Lista de opções" do tipo "Tabela inteira" exibirá apenas os itens que estão em uso na coleção atual.', - 'ru-ru': - 'Если эта функция включена, в выпадающих списках типа «Вся таблица» будут отображаться только элементы, используемые в текущей коллекции.', - 'uk-ua': - 'Якщо ввімкнено, у списках вибору типу «Уся таблиця» відображатимуться лише ті елементи, які використовуються в поточній колекції.', }, inheritanceCatNumberParentCOPrefDescription: { 'en-us': - 'Controls whether collection objects inherit the catalog number from the parent collection object.', - 'de-ch': - 'Steuert, ob Sammlungsobjekte die Katalognummer vom übergeordneten Sammlungsobjekt erben.', - 'es-es': - 'Controla si los objetos de colección heredan el número de catálogo del objeto de colección principal.', - 'fr-fr': - "Contrôle si les objets de collection héritent du numéro de catalogue de l'objet de collection parent.", - 'pt-br': - 'Controla se os objetos da coleção herdam o número de catálogo do objeto da coleção pai.', - 'ru-ru': - 'Определяет, будут ли объекты коллекции наследовать каталожный номер от родительского объекта коллекции.', - 'uk-ua': - "Керує тим, чи успадковують об'єкти колекції каталожний номер від батьківського об'єкта колекції.", + 'Only {componentTableName: string} records without a {catalogNumberFieldName: string} will inherit one from its parent {collectionObjectTableName: string}.', }, } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index 5f0a7c7a6fe..e57f566fca4 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -51,7 +51,7 @@ export const queryText = createDictionary({ being searched on `, 'en-us': 'Searched fields', - 'ru-ru': 'Поисковые поля', + 'ru-ru': 'Поля поиска', 'es-es': 'Campos buscados', 'fr-fr': 'Champs de recherche', 'uk-ua': 'Пошукові поля', @@ -78,7 +78,7 @@ export const queryText = createDictionary({ }, endValue: { 'en-us': 'End Value', - 'ru-ru': 'Конечная стоимость', + 'ru-ru': 'Конечное значение', 'es-es': 'Valor final', 'fr-fr': 'Valeur finale', 'uk-ua': 'Кінцеве значення', @@ -107,7 +107,7 @@ export const queryText = createDictionary({ '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': @@ -121,7 +121,7 @@ export const queryText = createDictionary({ }, queryDeleteIncomplete: { 'en-us': 'Query definition contains incomplete fields', - 'ru-ru': 'Определение запроса содержит неполные поля.', + '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': 'Визначення запиту містить незаповнені поля', @@ -132,7 +132,7 @@ export const queryText = createDictionary({ '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': @@ -184,7 +184,7 @@ export const queryText = createDictionary({ }, missingCoordinatesForKml: { 'en-us': 'Unable to export to KML', - 'ru-ru': 'Не удалось экспортировать в KML.', + 'ru-ru': 'Невозможно экспортировать в KML', 'es-es': 'No se puede exportar a KML', 'fr-fr': "Impossible d'exporter au format KML", 'uk-ua': 'Не вдалося експортувати в KML', @@ -204,7 +204,7 @@ export const queryText = createDictionary({ }, queryExportStarted: { 'en-us': 'Export File Being Created', - 'ru-ru': 'Создается файл экспорта', + 'ru-ru': 'Создается экспортный файл', 'es-es': 'Creando archivo de exportación', 'fr-fr': "Création du fichier d'exportation", 'uk-ua': 'Експортний файл створюється', @@ -223,7 +223,7 @@ export const queryText = createDictionary({ 'fr-fr': "Une notification s'affichera 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 completo e pronto para download.', }, @@ -257,7 +257,7 @@ export const queryText = createDictionary({ 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}"', + 'ru-ru': '{tableName:string} используя «{nodeFullName:string}»', 'es-es': '{tableName:string} usando "{nodeFullName:string}"', 'fr-fr': '{tableName:string} utilisant "{nodeFullName:string}"', 'uk-ua': '{tableName:string} за допомогою "{nodeFullName:string}"', @@ -339,7 +339,7 @@ export const queryText = createDictionary({ }, anyRank: { 'en-us': '(any rank)', - 'ru-ru': '(любого ранга)', + 'ru-ru': '(любой ранг)', 'es-es': '(cualquier rango)', 'fr-fr': '(tous grades)', 'uk-ua': '(будь-який ранг)', @@ -358,7 +358,7 @@ export const queryText = createDictionary({ moveUp: { comment: 'As in move it up', 'en-us': 'Move Up', - 'ru-ru': 'Поднимитесь выше', + 'ru-ru': 'Двигаться вверх', 'es-es': 'Mover hacia arriba', 'fr-fr': 'Monter en gamme', 'uk-ua': 'Рухатися вгору', @@ -368,7 +368,7 @@ export const queryText = createDictionary({ moveDown: { comment: 'As in move it down', 'en-us': 'Move Down', - 'ru-ru': 'Спуститесь вниз', + 'ru-ru': 'Двигаться вниз', 'es-es': 'Mover hacia abajo', 'fr-fr': 'Descendre', 'uk-ua': 'Рухатися вниз', @@ -377,7 +377,7 @@ export const queryText = createDictionary({ }, sort: { 'en-us': 'Sort', - 'ru-ru': 'Сортировка', + 'ru-ru': 'Сортировать', 'es-es': 'Ordenar', 'fr-fr': 'Trier', 'uk-ua': 'Сортувати', @@ -386,7 +386,7 @@ export const queryText = createDictionary({ }, ascendingSort: { 'en-us': 'Ascending Sort', - 'ru-ru': 'По возрастанию', + 'ru-ru': 'Сортировка по возрастанию', 'es-es': 'Orden ascendente', 'fr-fr': 'Tri croissant', 'uk-ua': 'Сортування за зростанням', @@ -395,7 +395,7 @@ export const queryText = createDictionary({ }, descendingSort: { 'en-us': 'Descending Sort', - 'ru-ru': 'Убывающая сортировка', + 'ru-ru': 'Сортировка по убыванию', 'es-es': 'Orden descendente', 'fr-fr': 'Tri décroissant', 'uk-ua': 'Сортування за спаданням', @@ -423,7 +423,7 @@ export const queryText = createDictionary({ }, aggregatedInline: { 'en-us': '(aggregated)', - 'ru-ru': '(в совокупности)', + 'ru-ru': '(агрегированные)', 'es-es': '(agregado)', 'fr-fr': '(agrégé)', 'uk-ua': '(узагальнено)', @@ -453,7 +453,7 @@ export const queryText = createDictionary({ 'en-us': 'Use "%" to match any number of characters.\n\nUse "_" to match a single character', 'ru-ru': - 'Используйте символ "%" для сопоставления любого количества символов.\n\n\n\n\n\nИспользуйте символ "_" для сопоставления одного символа.', + 'Используйте «%» для обозначения любого количества символов.\n\nИспользуйте «_» для обозначения одного символа.', 'es-es': 'Usar "%" para hacer coincidir cualquier número de caracteres.\n\nUsar "_" para hacer coincidir un solo carácter', 'fr-fr': @@ -539,7 +539,7 @@ export const queryText = createDictionary({ }, falseOrNull: { 'en-us': 'False or Empty', - 'ru-ru': 'Ложь или Пустота', + 'ru-ru': 'Ложь или пусто', 'es-es': 'Falso o vacío', 'fr-fr': 'Faux ou vide', 'uk-ua': 'False або Empty', @@ -566,7 +566,7 @@ export const queryText = createDictionary({ }, inDescription: { 'en-us': 'A comma-separated list of values', - 'ru-ru': 'Список значений, разделенных запятыми.', + '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': 'Список значень, розділених комами', @@ -615,7 +615,7 @@ export const queryText = createDictionary({ 'es-es': 'Termina con', 'fr-fr': 'Se termine par', 'pt-br': 'Termina com', - 'ru-ru': 'Заканчивается', + 'ru-ru': 'Заканчивается с', 'uk-ua': 'Закінчується на', }, or: { @@ -656,7 +656,7 @@ export const queryText = createDictionary({ }, configureQueryTables: { 'en-us': 'Configure visible query tables', - 'ru-ru': 'Настройка видимых таблиц запросов', + 'ru-ru': 'Настроить видимые таблицы запросов', 'es-es': 'Configurar tablas de consulta visibles', 'fr-fr': 'Configurer les tables de requêtes visibles', 'uk-ua': 'Налаштувати видимі таблиці запитів', @@ -665,7 +665,7 @@ export const queryText = createDictionary({ }, exportQueryForDwca: { 'en-us': 'Export query for DwCA definition', - 'ru-ru': 'Экспорт запроса для определения DwCA', + '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', @@ -674,7 +674,7 @@ export const queryText = createDictionary({ }, exportQueryAsReport: { 'en-us': 'Define report based on query', - 'ru-ru': 'Сформулируйте отчет на основе запроса.', + 'ru-ru': 'Определить отчет на основе запроса', 'es-es': 'Definir informe basado en consulta', 'fr-fr': 'Définir un rapport basé sur une requête', 'uk-ua': 'Визначити звіт на основі запиту', @@ -683,7 +683,7 @@ export const queryText = createDictionary({ }, exportQueryAsLabel: { 'en-us': 'Define label based on query', - 'ru-ru': 'Определите метку на основе запроса.', + 'ru-ru': 'Определить метку на основе запроса', 'es-es': 'Definir etiqueta según consulta', 'fr-fr': "Définir l'étiquette en fonction de la requête", 'uk-ua': 'Визначте мітку на основі запиту', @@ -723,7 +723,7 @@ export const queryText = createDictionary({ treeDesynonymize: { comment: 'Audit Log Action Type', 'en-us': 'Tree Desynonymize', - 'ru-ru': 'Дерево Десинонимизировать', + 'ru-ru': 'Десинонимизация дерева', 'es-es': 'Desinonimizar árboles', 'fr-fr': "Désynonymisation d'arbre", 'uk-ua': 'Десинонімізація дерева', @@ -736,7 +736,7 @@ export const queryText = createDictionary({ 'de-ch': 'Baumtransport', 'es-es': 'Movimiento masivo de árboles', 'fr-fr': "Déménagement en masse d'arbres", - 'ru-ru': 'Перевозка деревьев оптом', + 'ru-ru': 'Массовая перевозка деревьев', 'uk-ua': 'Масове переміщення дерева', 'pt-br': 'Mudança em massa de árvores', }, @@ -744,7 +744,7 @@ export const queryText = createDictionary({ 'en-us': 'Field value is too long. Max allowed length is {maxLength:number|formatted}', 'ru-ru': - 'Значение поля слишком длинное. Максимально допустимая длина — {maxLength:number|formatted}', + 'Значение поля слишком длинное. Максимально допустимая длина: {maxLength:number|formatted}.', 'es-es': 'El valor del campo es demasiado largo. La longitud máxima permitida es {maxLength:number|formatted}.', 'fr-fr': @@ -856,9 +856,9 @@ export const queryText = createDictionary({ '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 :", + "La requête que vous avez importée contient des tables auxquelles vous n'avez pas d'accès en lecture :", 'ru-ru': - 'В импортированном вами запросе содержатся таблицы, к которым у вас нет доступа на чтение:', + 'Импортированный вами запрос содержит таблицы, к которым у вас нет доступа на чтение:', 'uk-ua': 'Запит, який ви імпортували, містить таблиці, до яких ви не маєте доступу на читання:', 'de-ch': @@ -870,7 +870,7 @@ export const queryText = createDictionary({ 'en-us': 'No read permission', 'es-es': 'Sin permiso de lectura', 'fr-fr': 'Autorisation de lecture refusée', - 'ru-ru': 'Разрешение на чтение отсутствует.', + 'ru-ru': 'Нет разрешения на чтение', 'uk-ua': 'Немає дозволу на читання', 'de-ch': 'Keine Leseberechtigung', 'pt-br': 'Sem permissão de leitura', @@ -880,7 +880,7 @@ export const queryText = createDictionary({ 'de-ch': 'Wechseln Sie zu relativ', 'es-es': 'Cambiar a relativo', 'fr-fr': 'Passer au relatif', - 'ru-ru': 'Переключиться на относительное', + 'ru-ru': 'Переключиться на относительный', 'uk-ua': 'Перейти до відносного', 'pt-br': 'Mudar para relativo', }, @@ -899,7 +899,7 @@ export const queryText = createDictionary({ 'es-es': 'Desplazarse al editor', 'uk-ua': 'Перейдіть до редактора', 'fr-fr': "Défilez vers l'éditeur", - 'ru-ru': 'Прокрутите вниз до редактора', + 'ru-ru': 'Прокрутите до редактора', 'pt-br': 'Vá até o editor', }, viewRecords: { @@ -916,7 +916,7 @@ export const queryText = createDictionary({ 'de-ch': 'Formatierer auswählen', 'es-es': 'Elija el formateador', 'fr-fr': 'Choisir le formateur', - 'ru-ru': 'Выберите форматтер', + 'ru-ru': 'Выбрать форматировщик', 'uk-ua': 'Виберіть форматер', 'pt-br': 'Escolha o formatador', }, @@ -948,31 +948,14 @@ export const queryText = createDictionary({ 'uk-ua': 'Не суворий', }, primaryCatalogNumberInheritance: { - 'en-us': 'Primary Catalog Number Inheritance', - 'de-ch': 'Vererbung der primären Katalognummer', - 'es-es': 'Herencia del número de catálogo primario', - 'fr-fr': 'Héritage du numéro de catalogue principal', - 'pt-br': 'Herança do Número de Catálogo Primário', - 'ru-ru': 'Наследование основного каталожного номера', - 'uk-ua': 'Успадкування основного каталожного номера', + 'en-us': '{collectionObjectTableName: string}', }, parentCatalogNumberInheritance: { - 'en-us': 'Parent Catalog Number Inheritance', - 'de-ch': 'Vererbung der übergeordneten Katalognummer', - 'es-es': 'Herencia del número de catálogo principal', - 'fr-fr': 'Héritage du numéro de catalogue parent', - 'pt-br': 'Herança do número de catálogo pai', - 'ru-ru': 'Наследование родительского каталожного номера', - 'uk-ua': 'Успадкування батьківського каталожного номера', + 'en-us': '{componentTableName: string}', }, uniqueCatalogNumberAcrossComponentAndCoTitle: { - 'en-us': 'Unique Catalog # (Component & CO)', - 'de-ch': 'Eindeutige Katalognummer (Komponente & CO)', - 'es-es': 'Número de catálogo único (componente y CO)', - 'fr-fr': 'Numéro de catalogue unique (Composant et CO)', - 'pt-br': 'Número de catálogo exclusivo (componente e CO)', - 'ru-ru': 'Уникальный каталожный номер (компонент и CO)', - 'uk-ua': 'Унікальний каталожний номер (компонент та CO)', + 'en-us': + '{componentTableName: string} & {collectionObjectTableName: string}', }, formatInputAs: { comment: ` @@ -987,7 +970,7 @@ export const queryText = createDictionary({ 'es-es': 'Formato como: {commaSeparatedFormats:string}', 'fr-fr': 'Format : {commaSeparatedFormats:string}', 'pt-br': 'Formatar como: {commaSeparatedFormats:string}', - 'ru-ru': 'Формат: {commaSeparatedFormats:string}', + 'ru-ru': 'Форматировать как: {commaSeparatedFormats:string}', 'uk-ua': 'Форматувати як: {commaSeparatedFormats:string}', }, unsavedChangesInQuery: { @@ -996,7 +979,7 @@ export const queryText = createDictionary({ 'es-es': 'La consulta tiene cambios sin guardar', 'fr-fr': 'La requête contient des modifications non enregistrées.', 'pt-br': 'A consulta contém alterações não salvas.', - 'ru-ru': 'В запросе содержатся несохраненные изменения.', + 'ru-ru': 'Запрос имеет несохраненные изменения', 'uk-ua': 'Запит містить незбережені зміни', }, unsavedChangesInQueryDescription: { diff --git a/specifyweb/frontend/js_src/lib/localization/stats.ts b/specifyweb/frontend/js_src/lib/localization/stats.ts index 61c71728c64..3e8a7c4a4a3 100644 --- a/specifyweb/frontend/js_src/lib/localization/stats.ts +++ b/specifyweb/frontend/js_src/lib/localization/stats.ts @@ -14,474 +14,221 @@ export const statsText = createDictionary({ 'en-us': 'Holdings', 'ru-ru': 'Холдинги', 'es-es': 'Mantenimientos', - 'de-ch': 'Beteiligungen', - 'fr-fr': 'Participations', - 'pt-br': 'Participações', - 'uk-ua': 'Холдинги', }, collectionObjects: { 'en-us': 'Collection Objects', 'ru-ru': 'Объекты коллекции', 'es-es': 'Objetos de la Colección', - 'de-ch': 'Sammlungsobjekte', - 'fr-fr': 'Objets de collection', - 'pt-br': 'Objetos da Coleção', - 'uk-ua': "Об'єкти колекції", }, typeSpecimens: { 'en-us': 'Type Specimens', 'es-es': 'Especímenes Tipo', - 'de-ch': 'Typusexemplare', - 'fr-fr': 'Spécimens types', - 'pt-br': 'Espécimes-tipo', - 'ru-ru': 'Типовые образцы', - 'uk-ua': 'Типові зразки', }, curation: { 'en-us': 'Curation', 'es-es': 'Curación', - 'de-ch': 'Kuratierung', - 'fr-fr': 'Conservation', - 'pt-br': 'Curadoria', - 'ru-ru': 'Кураторство', - 'uk-ua': 'Кураторство', }, loans: { 'en-us': 'Loans', 'ru-ru': 'Заемы', 'es-es': 'Préstamos', - 'de-ch': 'Kredite', - 'fr-fr': 'Prêts', - 'pt-br': 'Empréstimos', - 'uk-ua': 'Кредити', }, itemsOnLoans: { 'en-us': 'Items on Loan', 'ru-ru': 'Предметы в Займы', 'es-es': 'Artículos en Préstamo', - 'de-ch': 'Leihgegenstände', - 'fr-fr': 'Objets prêtés', - 'pt-br': 'Itens emprestados', - 'uk-ua': 'Речі в оренду', }, openLoansStat: { 'en-us': 'Open Loans', 'ru-ru': 'Открытые Займы', 'es-es': 'Préstamos Abiertos', - 'de-ch': 'Offene Kredite', - 'fr-fr': 'Prêts ouverts', - 'pt-br': 'Empréstimos abertos', - 'uk-ua': 'Відкриті позики', }, overdueLoans: { 'en-us': 'Overdue Loans', 'ru-ru': 'Просроченные Займы', 'es-es': 'Préstamos Atrasados', - 'de-ch': 'Überfällige Kredite', - 'fr-fr': 'Prêts en souffrance', - 'pt-br': 'Empréstimos em atraso', - 'uk-ua': 'Прострочені кредити', }, localityGeography: { 'en-us': 'Locality / Geography', 'ru-ru': 'Местность / География', 'es-es': 'Localidad / Geografía', - 'de-ch': 'Ort / Geographie', - 'fr-fr': 'Localité / Géographie', - 'pt-br': 'Localidade / Geografia', - 'uk-ua': 'Місцевість / Географія', }, localities: { 'en-us': 'Localities', 'ru-ru': 'Местности', 'es-es': 'Localidades', - 'de-ch': 'Ortschaften', - 'fr-fr': 'Localités', - 'pt-br': 'Localidades', - 'uk-ua': 'Населені пункти', }, geographyEntries: { 'en-us': 'Geography Entries', 'ru-ru': 'География Записи', 'es-es': 'Entradas de Geografía', - 'de-ch': 'Geographie-Einträge', - 'fr-fr': 'Articles de géographie', - 'pt-br': 'Entradas de Geografia', - 'uk-ua': 'Географічні записи', }, countries: { 'en-us': 'Countries', 'ru-ru': 'Страны', 'es-es': 'Países', - 'de-ch': 'Länder', - 'fr-fr': 'Pays', - 'pt-br': 'Países', - 'uk-ua': 'Країни', }, georeferencedLocalities: { 'en-us': 'Georeferenced Localities', 'ru-ru': 'Места с географической привязкой', 'es-es': 'Localidades Georreferenciadas', - 'de-ch': 'Georeferenzierte Orte', - 'fr-fr': 'Localités géoréférencées', - 'pt-br': 'Localidades georreferenciadas', - 'uk-ua': "Геоприв'язані населені пункти", }, digitization: { 'en-us': 'Digitization', 'es-es': 'Digitalización', - 'de-ch': 'Digitalisierung', - 'fr-fr': 'Numérisation', - 'pt-br': 'Digitalização', - 'ru-ru': 'Оцифровка', - 'uk-ua': 'Оцифрування', }, digitizedLastSevenDays: { 'en-us': 'Digitized Last 7 Days', 'es-es': 'Digitalizado Últimos 7 Días', - 'de-ch': 'Digitalisiert in den letzten 7 Tagen', - 'fr-fr': 'Numérisé les 7 derniers jours', - 'pt-br': 'Últimos 7 dias digitalizados', - 'ru-ru': 'Оцифровано за последние 7 дней', - 'uk-ua': 'Оцифровано за останні 7 днів', }, digitizedLastMonth: { 'en-us': 'Digitized Last Month', 'es-es': 'Digitalizado Último Mes', - 'de-ch': 'Im letzten Monat digitalisiert', - 'fr-fr': 'Numérisé le mois dernier', - 'pt-br': 'Digitalizado no mês passado', - 'ru-ru': 'Оцифровано в прошлом месяце', - 'uk-ua': 'Оцифровано минулого місяця', }, digitizedLastYear: { 'en-us': 'Digitized Last Year', 'es-es': 'Digitalizado Último Año', - 'de-ch': 'Letztes Jahr digitalisiert', - 'fr-fr': "Numérisé l'année dernière", - 'pt-br': 'Digitalizado no ano passado', - 'ru-ru': 'Оцифровано в прошлом году', - 'uk-ua': 'Оцифровано минулого року', }, chooseStatistics: { 'en-us': 'Choose Statistics', 'ru-ru': 'Выберите статистику', 'es-es': 'Seleccionar Estadísticas', - 'de-ch': 'Statistik auswählen', - 'fr-fr': 'Choisir les statistiques', - 'pt-br': 'Selecione Estatísticas', - 'uk-ua': 'Виберіть Статистику', }, selectFromQueries: { 'en-us': 'Select From Queries', 'es-es': 'Seleccionar de Consultas', - 'de-ch': 'Auswahl aus Abfragen', - 'fr-fr': 'Sélectionner parmi les requêtes', - 'pt-br': 'Selecionar a partir de consultas', - 'ru-ru': 'Выберите из запросов', - 'uk-ua': 'Вибрати з запитів', }, selectFromAvailableDefault: { 'en-us': 'Select From Available Default Statistics', 'es-es': 'Seleccionar de Estadísticas Predeterminadas Disponibles', - 'de-ch': 'Wählen Sie aus den verfügbaren Standardstatistiken aus', - 'fr-fr': 'Sélectionnez parmi les statistiques par défaut disponibles', - 'pt-br': 'Selecione entre as estatísticas padrão disponíveis', - 'ru-ru': 'Выберите из доступных статистических данных по умолчанию.', - 'uk-ua': 'Виберіть із доступної статистики за замовчуванням', }, collection: { 'en-us': 'Collection', 'ru-ru': 'Коллекция', 'es-es': 'Colección', - 'de-ch': 'Sammlung', - 'fr-fr': 'Collection', - 'pt-br': 'Coleção', - 'uk-ua': 'Колекція', }, personal: { 'en-us': 'Personal', 'ru-ru': 'Личный', 'es-es': 'Personal', - 'de-ch': 'Persönlich', - 'fr-fr': 'Personnel', - 'pt-br': 'Pessoal', - 'uk-ua': 'Особисте', }, private: { 'en-us': 'Private', 'es-es': 'Privado', - 'de-ch': 'Privat', - 'fr-fr': 'Privé', - 'pt-br': 'Privado', - 'ru-ru': 'Частный', - 'uk-ua': 'Приватний', }, collectionObjectsCataloged: { 'en-us': 'Collection Objects Cataloged', 'ru-ru': 'Объекты коллекции каталогизированы', 'es-es': 'Objetos de la Colección Catalogados', - 'de-ch': 'Katalogisierte Sammlungsobjekte', - 'fr-fr': 'Objets de la collection catalogués', - 'pt-br': 'Objetos da Coleção Catalogados', - 'uk-ua': "Каталогізовані об'єкти колекції", }, collectionObjectsDetermined: { 'en-us': 'Collection Objects Determined', 'ru-ru': 'Объекты коллекции определены', 'es-es': 'Objetos de la Colección Determinados', - 'de-ch': 'Sammlungsobjekte ermittelt', - 'fr-fr': 'Objets de la collection déterminés', - 'pt-br': 'Objetos da Coleção Determinados', - 'uk-ua': "Визначено об'єкти колекції", }, lastRefreshed: { 'en-us': 'Last refreshed', 'es-es': 'Última Actualización', - 'de-ch': 'Zuletzt aktualisiert', - 'fr-fr': 'Dernière mise à jour', - 'pt-br': 'Última atualização', - 'ru-ru': 'Последнее обновление', - 'uk-ua': 'Останнє оновлення', }, categoryName: { 'en-us': 'Category Name', 'ru-ru': 'Название категории', 'es-es': 'Nombre de la Categoría', - 'de-ch': 'Kategoriename', - 'fr-fr': 'Nom de la catégorie', - 'pt-br': 'Nome da categoria', - 'uk-ua': 'Назва категорії', }, itemName: { 'en-us': 'Item Name', 'ru-ru': 'Название предмета', 'es-es': 'Nombre del Item', - 'de-ch': 'Artikelname', - 'fr-fr': "Nom de l'article", - 'pt-br': 'Nome do item', - 'uk-ua': 'Назва елемента', }, itemValue: { 'en-us': 'Item Value', 'ru-ru': 'Стоимость товара', 'es-es': 'Valor del Ítem', - 'de-ch': 'Wert des Artikels', - 'fr-fr': "Valeur de l'article", - 'pt-br': 'Valor do item', - 'uk-ua': 'Значення елемента', }, downloadAsTSV: { 'en-us': 'Download as TSV', 'ru-ru': 'Скачать как TSV', 'es-es': 'Descargar como TSV', - 'de-ch': 'Als TSV herunterladen', - 'fr-fr': 'Télécharger au format TSV', - 'pt-br': 'Baixar como TSV', - 'uk-ua': 'Завантажити як TSV', }, shared: { 'en-us': 'Shared', 'ru-ru': 'Общий', 'es-es': 'Compartido', - 'de-ch': 'Gemeinsam', - 'fr-fr': 'Commun', - 'pt-br': 'Compartilhado', - 'uk-ua': 'Спільний доступ', }, statistics: { 'en-us': 'Statistics', 'es-es': 'Estadísticas', - 'de-ch': 'Statistiken', - 'fr-fr': 'Statistiques', - 'pt-br': 'Estatísticas', - 'ru-ru': 'Статистика', - 'uk-ua': 'Статистика', }, deleteCategory: { 'en-us': 'Delete Category', 'es-es': 'Eliminar Categoría', - 'de-ch': 'Kategorie löschen', - 'fr-fr': 'Supprimer la catégorie', - 'pt-br': 'Excluir categoria', - 'ru-ru': 'Удалить категорию', - 'uk-ua': 'Видалити категорію', }, editPage: { 'en-us': 'Edit Page', 'es-es': 'Editar Página', - 'de-ch': 'Seite bearbeiten', - 'fr-fr': 'Modifier la page', - 'pt-br': 'Editar página', - 'ru-ru': 'Редактировать страницу', - 'uk-ua': 'Редагувати сторінку', }, addPage: { 'en-us': 'Add Page', 'es-es': 'Agregar Página', - 'de-ch': 'Seite hinzufügen', - 'fr-fr': 'Ajouter une page', - 'pt-br': 'Adicionar página', - 'ru-ru': 'Добавить страницу', - 'uk-ua': 'Додати сторінку', }, addACategory: { 'en-us': 'Add a Category', 'es-es': 'Agregar una Categoría', - 'de-ch': 'Kategorie hinzufügen', - 'fr-fr': 'Ajouter une catégorie', - 'pt-br': 'Adicionar uma categoria', - 'ru-ru': 'Добавить категорию', - 'uk-ua': 'Додати категорію', }, refresh: { 'en-us': 'Refresh', 'es-es': 'Actualizar', - 'de-ch': 'Aktualisieren', - 'fr-fr': 'Rafraîchir', - 'pt-br': 'Atualizar', - 'ru-ru': 'Обновить', - 'uk-ua': 'Оновити', }, collectionObjectsWithImages: { 'en-us': 'Collection Objects with images', 'es-es': 'Objetos de la Colección con imágenes', - 'de-ch': 'Sammlungsobjekte mit Bildern', - 'fr-fr': 'Objets de collection avec images', - 'pt-br': 'Objetos de coleção com imagens', - 'ru-ru': 'Коллекция объектов с изображениями', - 'uk-ua': "Об'єкти колекції із зображеннями", }, collectionObjectsWithAttachments: { 'en-us': 'Collection Objects with attachments', 'es-es': 'Objetos de la Colección con adjuntos', - 'de-ch': 'Sammlungsobjekte mit Anhängen', - 'fr-fr': 'Objets de collection avec pièces jointes', - 'pt-br': 'Objetos de coleção com anexos', - 'ru-ru': 'Объекты коллекции с вложениями', - 'uk-ua': "Об'єкти колекції з вкладеннями", }, error: { 'en-us': 'Error', 'es-es': 'Error', - 'de-ch': 'Fehler', - 'fr-fr': 'Erreur', - 'pt-br': 'Erro', - 'ru-ru': 'Ошибка', - 'uk-ua': 'Помилка', }, taxonRepresented: { 'en-us': 'Taxa Represented', 'es-es': 'Taxones Representados', - 'de-ch': 'Vertretene Taxa', - 'fr-fr': 'Taxons représentés', - 'pt-br': 'Imposto Representado', - 'ru-ru': 'Представленные таксоны', - 'uk-ua': 'Представлені таксони', }, geographiesRepresented: { 'en-us': 'Geographies Represented', 'es-es': 'Geografías Representadas', - 'de-ch': 'Vertretene Regionen', - 'fr-fr': 'Géographies représentées', - 'pt-br': 'Geografias representadas', - 'ru-ru': 'Представленные географические регионы', - 'uk-ua': 'Представлені географічні регіони', }, percentGeoReferenced: { 'en-us': 'Percent Georeferenced', 'es-es': 'Porcentaje Georreferenciado', - 'de-ch': 'Prozent georeferenziert', - 'fr-fr': 'Pourcentage géoréférencé', - 'pt-br': 'Percentual georreferenciado', - 'ru-ru': 'Процент географически привязанных данных', - 'uk-ua': "Відсоток геоприв'язаних", }, percentImaged: { 'en-us': 'Percent Imaged', 'es-es': 'Porcentaje Capturado', - 'de-ch': 'Prozent der abgebildeten', - 'fr-fr': "Pourcentage d'images", - 'pt-br': 'Percentual de imagens', - 'ru-ru': 'Процент изображений', - 'uk-ua': 'Відсоток зображень', }, deleteWarning: { 'en-us': 'Are you sure you want to delete the category?', - 'de-ch': 'Möchten Sie die Kategorie wirklich löschen?', - 'es-es': '¿Estás seguro que deseas eliminar la categoría?', - 'fr-fr': 'Êtes-vous sûr de vouloir supprimer cette catégorie ?', - 'pt-br': 'Tem certeza de que deseja excluir a categoria?', - 'ru-ru': 'Вы уверены, что хотите удалить категорию?', - 'uk-ua': 'Ви впевнені, що хочете видалити категорію?', }, categoryToDelete: { 'en-us': 'This will permanently delete the following category', - 'de-ch': 'Dadurch wird die folgende Kategorie dauerhaft gelöscht.', - 'es-es': 'Esto eliminará permanentemente la siguiente categoría', - 'fr-fr': 'Cela supprimera définitivement la catégorie suivante', - 'pt-br': 'Isso excluirá permanentemente a seguinte categoria.', - 'ru-ru': 'Это навсегда удалит следующую категорию.', - 'uk-ua': 'Це остаточно видалить наступну категорію', }, layoutPreference: { 'en-us': 'Defines the layout of the statistics page', - 'de-ch': 'Definiert das Layout der Statistikseite', - 'es-es': 'Define el diseño de la página de estadísticas.', - 'fr-fr': 'Définit la mise en page de la page de statistiques', - 'pt-br': 'Define o layout da página de estatísticas.', - 'ru-ru': 'Определяет структуру страницы статистики.', - 'uk-ua': 'Визначає макет сторінки статистики', }, showPreparationsTotal: { - 'en-us': 'Show Preparations Totals', - 'de-ch': 'Gesamtanzahl der Vorbereitungen anzeigen', - 'es-es': 'Totales de preparativos del espectáculo', - 'fr-fr': 'Afficher les totaux des préparatifs', - 'pt-br': 'Totais dos preparativos para o show', - 'ru-ru': 'Итоги подготовки к шоу', - 'uk-ua': 'Підсумки підготовки до шоу', + 'en-us': 'Show {preparationTableName:string} Totals', }, showPreparationsTotalDescription: { 'en-us': - '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.', - 'de-ch': - 'Ist diese Option aktiviert, zeigt das Standard-Statistikfeld für Zubereitungen neben der Gesamtzahl auch die Anzahl der einzelnen Zubereitungen eines bestimmten Zubereitungstyps an. Dies ist insbesondere für chargenbasierte Sammlungen hilfreich.', - 'es-es': - 'Si está habilitado, el panel de estadísticas de preparaciones predeterminado incluirá un recuento total de cada preparación de un tipo específico, junto con el total general. Esto resulta útil para recolecciones basadas en lotes.', - 'fr-fr': - "Si cette option est activée, le panneau de statistiques par défaut des préparations affichera le nombre total pour chaque préparation d'un type donné, en plus du total général. Ceci est utile pour les collections par lots.", - 'pt-br': - 'Se ativado, o painel de estatísticas de preparações padrão incluirá a contagem total de cada preparação de um determinado tipo, além do total geral. Isso é útil para coleções baseadas em lotes.', - 'ru-ru': - 'Если эта функция включена, на панели статистики по препаратам по умолчанию будет отображаться общее количество каждого препарата определенного типа наряду с общим итогом. Это полезно для коллекций, основанных на партиях.', - 'uk-ua': - 'Якщо ввімкнено, панель статистики препаратів за замовчуванням включатиме загальну кількість для кожного препарату певного типу препарату поряд із загальною кількістю. Це корисно для колекцій на основі партій.', + 'If enabled, the default {preparationTableName:string} statistics panel will include a total count for each {lowerPreparationTableName:string} of a particular {prepTypeTableName:string} alongside the overall total. This is useful for lot-based collections.', }, autoRefreshRate: { 'en-us': 'Auto-Refresh Rate (Hours)', - 'de-ch': 'Automatische Aktualisierungsrate (Stunden)', - 'es-es': 'Frecuencia de actualización automática (horas)', - 'fr-fr': "Fréquence d'actualisation automatique (heures)", - 'pt-br': 'Taxa de atualização automática (horas)', - 'ru-ru': 'Частота автоматического обновления (в часах)', - 'uk-ua': 'Частота автоматичного оновлення (години)', }, autoRefreshRateDescription: { 'en-us': 'The time interval, in hours, at which the statistics page will automatically refresh its data. Default is 24.', - 'de-ch': - 'Das Zeitintervall in Stunden, in dem die Statistikseite ihre Daten automatisch aktualisiert. Standardwert: 24.', - 'es-es': - 'El intervalo de tiempo, en horas, en el que la página de estadísticas actualizará automáticamente sus datos. El valor predeterminado es 24.', - 'fr-fr': - 'Intervalle de temps, en heures, auquel la page de statistiques actualise automatiquement ses données. La valeur par défaut est de 24 heures.', - 'pt-br': - 'O intervalo de tempo, em horas, no qual a página de estatísticas atualizará automaticamente seus dados. O padrão é 24.', - 'ru-ru': - 'Интервал времени в часах, через который страница статистики будет автоматически обновлять данные. Значение по умолчанию — 24.', - 'uk-ua': - 'Інтервал часу в годинах, через який сторінка статистики автоматично оновлюватиме свої дані. Значення за замовчуванням – 24.', }, } as const); /* eslint-enable @typescript-eslint/naming-convention */