Merge branch 'main' into insights

This commit is contained in:
rijkvanzanten
2021-09-15 14:58:20 -04:00
110 changed files with 2642 additions and 1926 deletions

View File

@@ -34,5 +34,5 @@ RUN npm install
WORKDIR /directus/api
CMD ["sh", "-c", "node ./cli.js bootstrap; node ./dist/start.js;"]
CMD ["sh", "-c", "node ./cli.js bootstrap; node ./start.js;"]
EXPOSE 8055/tcp

View File

@@ -96,6 +96,7 @@
"cors": "^2.8.5",
"csv-parser": "^3.0.0",
"date-fns": "^2.22.1",
"deep-diff": "^1.0.2",
"deep-map": "^2.0.0",
"destroy": "^1.0.4",
"dotenv": "^10.0.0",
@@ -169,6 +170,7 @@
"@types/busboy": "0.2.4",
"@types/cookie-parser": "1.4.2",
"@types/cors": "2.8.12",
"@types/deep-diff": "1.0.1",
"@types/destroy": "1.0.0",
"@types/express": "4.17.13",
"@types/express-pino-logger": "4.0.2",
@@ -187,9 +189,9 @@
"@types/node": "15.12.2",
"@types/node-cron": "2.0.4",
"@types/nodemailer": "6.4.4",
"@types/object-hash": "2.2.0",
"@types/object-hash": "2.2.1",
"@types/qs": "6.9.7",
"@types/sharp": "0.29.1",
"@types/sharp": "0.29.2",
"@types/stream-json": "1.7.1",
"@types/supertest": "2.0.11",
"@types/uuid": "8.3.1",

View File

@@ -0,0 +1,136 @@
import chalk from 'chalk';
import { promises as fs } from 'fs';
import inquirer from 'inquirer';
import { load as loadYaml } from 'js-yaml';
import path from 'path';
import getDatabase from '../../../database';
import logger from '../../../logger';
import { Snapshot } from '../../../types';
import { getSnapshot } from '../../../utils/get-snapshot';
import { getSnapshotDiff } from '../../../utils/get-snapshot-diff';
import { applySnapshot } from '../../../utils/apply-snapshot';
export async function apply(snapshotPath: string, options?: { yes: boolean }): Promise<void> {
const filename = path.resolve(process.cwd(), snapshotPath);
const database = getDatabase();
let snapshot: Snapshot;
try {
const fileContents = await fs.readFile(filename, 'utf8');
if (filename.endsWith('.yaml') || filename.endsWith('.yml')) {
snapshot = (await loadYaml(fileContents)) as Snapshot;
} else {
snapshot = JSON.parse(fileContents) as Snapshot;
}
const currentSnapshot = await getSnapshot({ database });
const snapshotDiff = getSnapshotDiff(currentSnapshot, snapshot);
if (
snapshotDiff.collections.length === 0 &&
snapshotDiff.fields.length === 0 &&
snapshotDiff.relations.length === 0
) {
logger.info('No changes to apply.');
database.destroy();
process.exit(0);
}
if (options?.yes !== true) {
let message = '';
if (snapshotDiff.collections.length > 0) {
message += chalk.black.underline.bold('Collections:');
for (const { collection, diff } of snapshotDiff.collections) {
if (diff[0]?.kind === 'E') {
message += `\n - ${chalk.blue('Update')} ${collection}`;
for (const change of diff) {
if (change.kind === 'E') {
const path = change.path!.slice(1).join('.');
message += `\n - Set ${path} to ${change.rhs}`;
}
}
} else if (diff[0]?.kind === 'D') {
message += `\n - ${chalk.red('Delete')} ${collection}`;
} else if (diff[0]?.kind === 'N') {
message += `\n - ${chalk.green('Create')} ${collection}`;
}
}
}
if (snapshotDiff.fields.length > 0) {
message += '\n\n' + chalk.black.underline.bold('Fields:');
for (const { collection, field, diff } of snapshotDiff.fields) {
if (diff[0]?.kind === 'E') {
message += `\n - ${chalk.blue('Update')} ${collection}.${field}`;
for (const change of diff) {
if (change.kind === 'E') {
const path = change.path!.slice(1).join('.');
message += `\n - Set ${path} to ${change.rhs}`;
}
}
} else if (diff[0]?.kind === 'D') {
message += `\n - ${chalk.red('Delete')} ${collection}.${field}`;
} else if (diff[0]?.kind === 'N') {
message += `\n - ${chalk.green('Create')} ${collection}.${field}`;
}
}
}
if (snapshotDiff.relations.length > 0) {
message += '\n\n' + chalk.black.underline.bold('Relations:');
for (const { collection, field, related_collection, diff } of snapshotDiff.relations) {
if (diff[0]?.kind === 'E') {
message += `\n - ${chalk.blue('Update')} ${collection}.${field} -> ${related_collection}`;
for (const change of diff) {
if (change.kind === 'E') {
const path = change.path!.slice(1).join('.');
message += `\n - Set ${path} to ${change.rhs}`;
}
}
} else if (diff[0]?.kind === 'D') {
message += `\n - ${chalk.red('Delete')} ${collection}.${field} -> ${related_collection}`;
} else if (diff[0]?.kind === 'N') {
message += `\n - ${chalk.green('Create')} ${collection}.${field} -> ${related_collection}`;
}
}
}
const { proceed } = await inquirer.prompt([
{
type: 'confirm',
name: 'proceed',
message:
'The following changes will be applied:\n\n' +
chalk.black(message) +
'\n\n' +
'Would you like to continue?',
},
]);
if (proceed === false) {
process.exit(0);
}
}
await applySnapshot(snapshot, { current: currentSnapshot, diff: snapshotDiff, database });
logger.info(`Snapshot applied successfully`);
database.destroy();
process.exit(0);
} catch (err: any) {
logger.error(err);
database.destroy();
process.exit(1);
}
}

View File

@@ -0,0 +1,58 @@
import getDatabase from '../../../database';
import logger from '../../../logger';
import { getSnapshot } from '../../../utils/get-snapshot';
import { constants as fsConstants, promises as fs } from 'fs';
import path from 'path';
import inquirer from 'inquirer';
import { dump as toYaml } from 'js-yaml';
export async function snapshot(
snapshotPath: string,
options?: { yes: boolean; format: 'json' | 'yaml' }
): Promise<void> {
const filename = path.resolve(process.cwd(), snapshotPath);
let snapshotExists: boolean;
try {
await fs.access(filename, fsConstants.F_OK);
snapshotExists = true;
} catch {
snapshotExists = false;
}
if (snapshotExists && options?.yes === false) {
const { overwrite } = await inquirer.prompt([
{
type: 'confirm',
name: 'overwrite',
message: 'Snapshot already exists. Do you want to overwrite the file?',
},
]);
if (overwrite === false) {
process.exit(0);
}
}
const database = getDatabase();
const snapshot = await getSnapshot({ database });
try {
if (options?.format === 'yaml') {
await fs.writeFile(filename, toYaml(snapshot));
} else {
await fs.writeFile(filename, JSON.stringify(snapshot));
}
logger.info(`Snapshot saved to ${filename}`);
database.destroy();
process.exit(0);
} catch (err: any) {
logger.error(err);
database.destroy();
process.exit(1);
}
}

View File

@@ -1,5 +1,5 @@
import { Command } from 'commander';
import start from '../start';
import { Command, Option } from 'commander';
import { startServer } from '../server';
import { emitAsyncSafe } from '../emitter';
import { initializeExtensions, registerExtensionHooks } from '../extensions';
import bootstrap from './commands/bootstrap';
@@ -10,6 +10,8 @@ import init from './commands/init';
import rolesCreate from './commands/roles/create';
import usersCreate from './commands/users/create';
import usersPasswd from './commands/users/passwd';
import { snapshot } from './commands/schema/snapshot';
import { apply } from './commands/schema/apply';
const pkg = require('../../package.json');
@@ -24,7 +26,7 @@ export async function createCli(): Promise<Command> {
program.name('directus').usage('[command] [options]');
program.version(pkg.version, '-v, --version');
program.command('start').description('Start the Directus API').action(start);
program.command('start').description('Start the Directus API').action(startServer);
program.command('init').description('Create a new Directus Project').action(init);
const dbCommand = program.command('database');
@@ -75,6 +77,23 @@ export async function createCli(): Promise<Command> {
.option('--skipAdminInit', 'Skips the creation of the default Admin Role and User')
.action(bootstrap);
const schemaCommands = program.command('schema');
schemaCommands
.command('snapshot')
.description('Create a new Schema Snapshot')
.option('-y, --yes', `Assume "yes" as answer to all prompts and run non-interactively`, false)
.addOption(new Option('--format <format>', 'JSON or YAML format').choices(['json', 'yaml']).default('yaml'))
.argument('<path>', 'Path to snapshot file')
.action(snapshot);
schemaCommands
.command('apply')
.description('Apply a snapshot file to the current database')
.option('-y, --yes', `Assume "yes" as answer to all prompts and run non-interactively`)
.argument('<path>', 'Path to snapshot file')
.action(apply);
await emitAsyncSafe('cli.init.after', { program });
return program;

View File

@@ -0,0 +1,55 @@
import { Knex } from 'knex';
export async function up(knex: Knex): Promise<void> {
await knex.schema.alterTable('directus_roles', (table) => {
table.dropColumn('module_list');
});
await knex.schema.alterTable('directus_settings', (table) => {
table.json('module_bar').defaultTo(
JSON.stringify([
{
type: 'module',
id: 'collections',
enabled: true,
},
{
type: 'module',
id: 'users',
enabled: true,
},
{
type: 'module',
id: 'files',
enabled: true,
},
{
type: 'module',
id: 'insights',
enabled: false,
},
{
type: 'module',
id: 'docs',
enabled: true,
},
{
type: 'module',
id: 'settings',
enabled: true,
locked: true,
},
])
);
});
}
export async function down(knex: Knex): Promise<void> {
await knex.schema.alterTable('directus_roles', (table) => {
table.json('module_list');
});
await knex.schema.alterTable('directus_settings', (table) => {
table.dropColumn('module_bar');
});
}

View File

@@ -57,3 +57,4 @@ data:
display_template: '{{ first_name }} {{ last_name }}'
- collection: directus_webhooks
note: $t:directus_collection.directus_webhooks
- collection: directus_migrations

View File

@@ -0,0 +1,10 @@
# directus_migrations isn't surfaced in the app, nor accessible from the API
table: directus_migrations
fields:
- collection: directus_migrations
field: version
- collection: directus_migrations
field: name
- collection: directus_migrations
field: timestamp

View File

@@ -33,3 +33,5 @@ fields:
- field: layout
width: half
- field: refresh_interval

View File

@@ -54,39 +54,6 @@ fields:
- last_name
width: full
- field: module_list
interface: list
options:
template: '{{ name }}'
addLabel: Add New Module...
fields:
- name: $t:field_options.directus_roles.fields.icon_name
field: icon
type: string
meta:
interface: select-icon
width: half
- name: $t:field_options.directus_roles.fields.name_name
field: name
type: string
meta:
interface: input
width: half
options:
iconRight: title
placeholder:
- name: $t:field_options.directus_roles.fields.link_name
field: link
type: string
meta:
interface: input
width: full
options:
iconRight: link
placeholder: $t:field_options.directus_roles.fields.link_placeholder
special: json
width: full
- field: collection_list
interface: list
options:

View File

@@ -332,3 +332,7 @@ fields:
type:
_neq: 'raster'
hidden: true
- field: module_bar
interface: system-modules
special: json

View File

@@ -58,3 +58,21 @@ data:
many_field: dashboard
one_collection: directus_dashboards
one_field: panels
- many_collection: directus_files
many_field: modified_by
one_collection: directus_users
- many_collection: directus_fields
many_field: group
one_collection: directus_fields
- many_collection: directus_permissions
many_field: role
one_collection: directus_roles
- many_collection: directus_revisions
many_field: parent
one_collection: directus_revisions
- many_collection: directus_sessions
many_field: user
one_collection: directus_users
- many_collection: directus_settings
many_field: storage_default_folder
one_collection: directus_files

View File

@@ -7,11 +7,13 @@ import qs from 'qs';
import url from 'url';
import createApp from './app';
import getDatabase from './database';
import { emitAsyncSafe } from './emitter';
import env from './env';
import logger from './logger';
import emitter, { emitAsyncSafe } from './emitter';
import checkForUpdate from 'update-check';
import pkg from '../package.json';
export default async function createServer(): Promise<http.Server> {
export async function createServer(): Promise<http.Server> {
const server = http.createServer(await createApp());
server.on('request', function (req: http.IncomingMessage & Request, res: http.ServerResponse) {
@@ -106,3 +108,35 @@ export default async function createServer(): Promise<http.Server> {
}
}
}
export async function startServer(): Promise<void> {
const server = await createServer();
await emitter.emitAsync('server.start.before', { server });
const port = env.PORT;
server
.listen(port, () => {
checkForUpdate(pkg)
.then((update) => {
if (update) {
logger.warn(`Update available: ${pkg.version} -> ${update.latest}`);
}
})
.catch(() => {
// No need to log/warn here. The update message is only an informative nice-to-have
});
logger.info(`Server started at http://localhost:${port}`);
emitAsyncSafe('server.start');
})
.once('error', (err: any) => {
if (err?.code === 'EADDRINUSE') {
logger.error(`Port ${port} is already in use`);
process.exit(1);
} else {
throw err;
}
});
}

View File

@@ -2,7 +2,7 @@ import { Range, StatResponse } from '@directus/drive';
import { Semaphore } from 'async-mutex';
import { Knex } from 'knex';
import { contentType } from 'mime-types';
import ObjectHash from 'object-hash';
import hash from 'object-hash';
import path from 'path';
import sharp from 'sharp';
import getDatabase from '../database';
@@ -124,5 +124,5 @@ export class AssetsService {
const getAssetSuffix = (transforms: Transformation[]) => {
if (Object.keys(transforms).length === 0) return '';
return `__${ObjectHash.sha1(transforms)}`;
return `__${hash(transforms)}`;
};

View File

@@ -16,7 +16,7 @@ import { Accountability, FieldMeta, RawField } from '@directus/shared/types';
export type RawCollection = {
collection: string;
fields?: RawField[];
meta?: Partial<CollectionMeta>;
meta?: Partial<CollectionMeta> | null;
};
export class CollectionsService {

View File

@@ -133,7 +133,11 @@ export class FieldsService {
return data;
}) as Field[];
const result = [...columnsWithSystem, ...aliasFieldsAsField];
const knownCollections = Object.keys(this.schema.collections);
const result = [...columnsWithSystem, ...aliasFieldsAsField].filter((field) =>
knownCollections.includes(field.collection)
);
// Filter the result so we only return the fields you have read access to
if (this.accountability && this.accountability.admin !== true) {

View File

@@ -1,44 +1,3 @@
import emitter, { emitAsyncSafe } from './emitter';
import env from './env';
import logger from './logger';
import checkForUpdate from 'update-check';
import pkg from '../package.json';
import { startServer } from './server';
// If this file is called directly using node, start the server
if (require.main === module) {
start();
}
export default async function start(): Promise<void> {
const createServer = require('./server').default;
const server = await createServer();
await emitter.emitAsync('server.start.before', { server });
const port = env.PORT;
server
.listen(port, () => {
checkForUpdate(pkg)
.then((update) => {
if (update) {
logger.warn(`Update available: ${pkg.version} -> ${update.latest}`);
}
})
.catch(() => {
// No need to log/warn here. The update message is only an informative nice-to-have
});
logger.info(`Server started at http://localhost:${port}`);
emitAsyncSafe('server.start');
})
.once('error', (err: any) => {
if (err?.code === 'EADDRINUSE') {
logger.error(`Port ${port} is already in use`);
process.exit(1);
} else {
throw err;
}
});
}
startServer();

View File

@@ -15,4 +15,5 @@ export * from './revision';
export * from './schema';
export * from './services';
export * from './sessions';
export * from './snapshot';
export * from './webhooks';

30
api/src/types/snapshot.ts Normal file
View File

@@ -0,0 +1,30 @@
import { Collection } from './collection';
import { Relation } from './relation';
import { Field } from '@directus/shared/types';
import { Diff } from 'deep-diff';
export type Snapshot = {
version: number;
directus: string;
collections: Collection[];
fields: Field[];
relations: Relation[];
};
export type SnapshotDiff = {
collections: {
collection: string;
diff: Diff<Collection | undefined>[];
}[];
fields: {
collection: string;
field: string;
diff: Diff<Field | undefined>[];
}[];
relations: {
collection: string;
field: string;
related_collection: string | null;
diff: Diff<Relation | undefined>[];
}[];
};

View File

@@ -0,0 +1,112 @@
import { Snapshot, SnapshotDiff, SchemaOverview, Relation } from '../types';
import { getSnapshot } from './get-snapshot';
import { getSnapshotDiff } from './get-snapshot-diff';
import { Knex } from 'knex';
import getDatabase from '../database';
import { getSchema } from './get-schema';
import { CollectionsService, FieldsService, RelationsService } from '../services';
import { set } from 'lodash';
import { DiffNew } from 'deep-diff';
import { Field } from '@directus/shared/types';
export async function applySnapshot(
snapshot: Snapshot,
options?: { database?: Knex; schema?: SchemaOverview; current?: Snapshot; diff?: SnapshotDiff }
): Promise<void> {
const database = options?.database ?? getDatabase();
const schema = options?.schema ?? (await getSchema({ database }));
const current = options?.current ?? (await getSnapshot({ database, schema }));
const snapshotDiff = options?.diff ?? getSnapshotDiff(current, snapshot);
await database.transaction(async (trx) => {
const collectionsService = new CollectionsService({ knex: trx, schema });
for (const { collection, diff } of snapshotDiff.collections) {
if (diff?.[0].kind === 'D') {
await collectionsService.deleteOne(collection);
}
if (diff?.[0].kind === 'N' && diff[0].rhs) {
// We'll nest the to-be-created fields in the same collection creation, to prevent
// creating a collection without a primary key
const fields = snapshotDiff.fields
.filter((fieldDiff) => fieldDiff.collection === collection)
.map((fieldDiff) => (fieldDiff.diff[0] as DiffNew<Field>).rhs);
await collectionsService.createOne({
...diff[0].rhs,
fields,
});
// Now that the fields are in for this collection, we can strip them from the field
// edits
snapshotDiff.fields = snapshotDiff.fields.filter((fieldDiff) => fieldDiff.collection !== collection);
}
if (diff?.[0].kind === 'E') {
const updates = diff.reduce((acc, edit) => {
if (edit.kind !== 'E') return acc;
set(acc, edit.path!, edit.rhs);
return acc;
}, {});
await collectionsService.updateOne(collection, updates);
}
}
const fieldsService = new FieldsService({ knex: trx, schema: await getSchema({ database: trx }) });
for (const { collection, field, diff } of snapshotDiff.fields) {
if (diff?.[0].kind === 'N') {
await fieldsService.createField(collection, (diff[0] as DiffNew<Field>).rhs);
}
if (diff?.[0].kind === 'E') {
const updates = diff.reduce((acc, edit) => {
if (edit.kind !== 'E') return acc;
set(acc, edit.path!, edit.rhs);
return acc;
}, {});
await fieldsService.updateField(collection, {
field,
type: 'unknown', // If the type was updated, the updates spread will overwrite it
...updates,
});
}
if (diff?.[0].kind === 'D') {
await fieldsService.deleteField(collection, field);
// Field deletion also cleans up the relationship. We should ignore any relationship
// changes attached to this now non-existing field
snapshotDiff.relations = snapshotDiff.relations.filter(
(relation) => (relation.collection === collection && relation.field === field) === false
);
}
}
const relationsService = new RelationsService({ knex: trx, schema: await getSchema({ database: trx }) });
for (const { collection, field, diff } of snapshotDiff.relations) {
if (diff?.[0].kind === 'N') {
await relationsService.createOne((diff[0] as DiffNew<Relation>).rhs);
}
if (diff?.[0].kind === 'E') {
const updates = diff.reduce((acc, edit) => {
if (edit.kind !== 'E') return acc;
set(acc, edit.path!, edit.rhs);
return acc;
}, {});
await relationsService.updateOne(collection, field, updates);
}
if (diff?.[0].kind === 'D') {
await relationsService.deleteOne(collection, field);
}
}
});
}

View File

@@ -14,7 +14,5 @@ export function getCacheKey(req: Request): string {
};
const key = hash(info);
// hash() only returns a buffer if the encoding is set to 'buffer'
return key as string;
return key;
}

View File

@@ -0,0 +1,116 @@
import { Snapshot, SnapshotDiff } from '../types';
import { diff } from 'deep-diff';
import { orderBy } from 'lodash';
export function getSnapshotDiff(current: Snapshot, after: Snapshot): SnapshotDiff {
const diffedSnapshot: SnapshotDiff = {
collections: orderBy(
[
...current.collections.map((currentCollection) => {
const afterCollection = after.collections.find(
(afterCollection) => afterCollection.collection === currentCollection.collection
);
return {
collection: currentCollection.collection,
diff: diff(currentCollection, afterCollection),
};
}),
...after.collections
.filter((afterCollection) => {
const currentCollection = current.collections.find(
(currentCollection) => currentCollection.collection === afterCollection.collection
);
return !!currentCollection === false;
})
.map((afterCollection) => ({
collection: afterCollection.collection,
diff: diff(undefined, afterCollection),
})),
].filter((obj) => Array.isArray(obj.diff)) as SnapshotDiff['collections'],
'collection'
),
fields: orderBy(
[
...current.fields.map((currentField) => {
const afterField = after.fields.find(
(afterField) => afterField.collection === currentField.collection && afterField.field === currentField.field
);
return {
collection: currentField.collection,
field: currentField.field,
diff: diff(currentField, afterField),
};
}),
...after.fields
.filter((afterField) => {
const currentField = current.fields.find(
(currentField) =>
currentField.collection === afterField.collection && afterField.field === currentField.field
);
return !!currentField === false;
})
.map((afterField) => ({
collection: afterField.collection,
field: afterField.field,
diff: diff(undefined, afterField),
})),
].filter((obj) => Array.isArray(obj.diff)) as SnapshotDiff['fields'],
['collection']
),
relations: orderBy(
[
...current.relations.map((currentRelation) => {
const afterRelation = after.relations.find(
(afterRelation) =>
afterRelation.collection === currentRelation.collection && afterRelation.field === currentRelation.field
);
return {
collection: currentRelation.collection,
field: currentRelation.field,
related_collection: currentRelation.related_collection,
diff: diff(currentRelation, afterRelation),
};
}),
...after.relations
.filter((afterRelation) => {
const currentRelation = current.relations.find(
(currentRelation) =>
currentRelation.collection === afterRelation.collection && afterRelation.field === currentRelation.field
);
return !!currentRelation === false;
})
.map((afterRelation) => ({
collection: afterRelation.collection,
field: afterRelation.field,
related_collection: afterRelation.related_collection,
diff: diff(undefined, afterRelation),
})),
].filter((obj) => Array.isArray(obj.diff)) as SnapshotDiff['relations'],
['collection']
),
};
/**
* When you delete a collection, we don't have to individually drop all the fields/relations as well
*/
const deletedCollections = diffedSnapshot.collections
.filter((collection) => collection.diff?.[0].kind === 'D')
.map(({ collection }) => collection);
diffedSnapshot.fields = diffedSnapshot.fields.filter(
(field) => deletedCollections.includes(field.collection) === false
);
diffedSnapshot.relations = diffedSnapshot.relations.filter(
(relation) => deletedCollections.includes(relation.collection) === false
);
return diffedSnapshot;
}

View File

@@ -0,0 +1,34 @@
import getDatabase from '../database';
import { getSchema } from './get-schema';
import { CollectionsService, FieldsService, RelationsService } from '../services';
import { version } from '../../package.json';
import { SchemaOverview, Snapshot } from '../types';
import { Knex } from 'knex';
export async function getSnapshot(options?: { database?: Knex; schema?: SchemaOverview }): Promise<Snapshot> {
const database = options?.database ?? getDatabase();
const schema = options?.schema ?? (await getSchema({ database }));
const collectionsService = new CollectionsService({ knex: database, schema });
const fieldsService = new FieldsService({ knex: database, schema });
const relationsService = new RelationsService({ knex: database, schema });
const [collections, fields, relations] = await Promise.all([
collectionsService.readByQuery(),
fieldsService.readAll(),
relationsService.readAll(),
]);
return {
version: 1,
directus: version,
collections: collections.filter((item: any) => excludeSystem(item)),
fields: fields.filter((item: any) => excludeSystem(item)),
relations: relations.filter((item: any) => excludeSystem(item)),
};
}
function excludeSystem(item: { meta?: { system?: boolean } }) {
if (item?.meta?.system === true) return false;
return true;
}

2
api/start.js Normal file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env node
require('./dist/start.js');

View File

@@ -76,7 +76,7 @@
"cropperjs": "1.5.12",
"date-fns": "2.23.0",
"diacritics": "1.3.0",
"dompurify": "2.3.1",
"dompurify": "2.3.2",
"escape-string-regexp": "5.0.0",
"front-matter": "4.0.2",
"html-entities": "2.3.2",
@@ -93,7 +93,7 @@
"pretty-ms": "7.0.1",
"qrcode": "1.4.4",
"rimraf": "3.0.2",
"sass": "1.39.2",
"sass": "1.41.0",
"tinymce": "5.9.2",
"typescript": "4.4.3",
"vite": "2.5.7",

View File

@@ -175,7 +175,7 @@ body {
width: 100%;
height: var(--input-height);
padding: 10px; // 14 - 4 (border)
border: 2px solid var(--border-normal);
border: var(--border-width) solid var(--border-normal);
border-radius: var(--border-radius);
transition: all var(--fast) var(--transition);

View File

@@ -104,7 +104,7 @@ body {
border: var(--border-width) solid var(--v-chip-background-color);
border-radius: 16px;
&:hover {
&.clickable:hover {
color: var(--v-chip-color-hover);
background-color: var(--v-chip-background-color-hover);
border-color: var(--v-chip-background-color-hover);
@@ -120,7 +120,7 @@ body {
background-color: var(--v-chip-background-color);
border-color: var(--v-chip-background-color);
&:hover {
&.clickable:hover {
color: var(--v-chip-color);
background-color: var(--v-chip-background-color);
border-color: var(--v-chip-background-color);

View File

@@ -52,7 +52,7 @@ body {
margin-top: 8px;
border: solid;
border-color: var(--v-divider-color);
border-width: 2px 0 0 0;
border-width: var(--border-width) 0 0 0;
}
span.wrapper {
@@ -101,7 +101,7 @@ body {
hr {
width: 0px;
max-width: 0px;
border-width: 0 2px 0 0;
border-width: 0 var(--border-width) 0 0;
}
span.wrapper {

View File

@@ -34,9 +34,11 @@
</template>
<template #title-outer:prepend>
<v-button class="header-icon" rounded icon secondary disabled>
<v-icon :name="icon" />
</v-button>
<slot name="title-outer:prepend">
<v-button class="header-icon" rounded icon secondary disabled>
<v-icon :name="icon" />
</v-button>
</slot>
</template>
<template #actions:prepend><slot name="actions:prepend" /></template>

View File

@@ -13,7 +13,7 @@
class="v-field-select"
>
<template #item="{ element }">
<v-chip v-tooltip="element.field" class="field draggable" @click="removeField(element.field)">
<v-chip v-tooltip="element.field" clickable class="field draggable" @click="removeField(element.field)">
{{ element.name }}
</v-chip>
</template>

View File

@@ -6,11 +6,12 @@
:value="field.field"
@update:model-value="$emit('toggle-batch', field)"
/>
<span v-tooltip="edited ? t('edited') : null" @click="toggle">
<span v-tooltip="edited ? t('edited') : null" class="field-name" @click="toggle">
{{ field.name }}
<v-icon v-if="field.meta?.required === true" class="required" sup name="star" />
<v-icon v-if="!disabled" class="ctx-arrow" :class="{ active }" name="arrow_drop_down" />
</span>
<v-chip v-if="badge" x-small>{{ badge }}</v-chip>
</div>
</template>
@@ -53,6 +54,10 @@ export default defineComponent({
type: Boolean,
default: false,
},
badge: {
type: String,
default: null,
},
},
emits: ['toggle-batch'],
setup() {
@@ -79,6 +84,11 @@ export default defineComponent({
margin-right: 4px;
}
.v-chip {
margin: 0;
margin-left: 8px;
}
.required {
--v-icon-color: var(--primary);
@@ -88,7 +98,7 @@ export default defineComponent({
.ctx-arrow {
position: absolute;
top: -3px;
right: -20px;
right: -24px;
color: var(--foreground-subdued);
opacity: 0;
transition: opacity var(--fast) var(--transition);
@@ -118,7 +128,7 @@ export default defineComponent({
pointer-events: none;
}
> span {
.field-name {
margin-left: -16px;
padding-left: 16px;
}

View File

@@ -11,6 +11,7 @@
:batch-active="batchActive"
:edited="isEdited"
:has-error="!!validationError"
:badge="badge"
@toggle-batch="$emit('toggle-batch', $event)"
/>
</template>
@@ -111,6 +112,10 @@ export default defineComponent({
type: Boolean,
default: false,
},
badge: {
type: String,
default: null,
},
},
emits: ['toggle-batch', 'unset', 'update:modelValue'],
setup(props, { emit }) {

View File

@@ -52,6 +52,7 @@
:primary-key="primaryKey"
:loading="loading"
:validation-error="validationErrors.find((err) => err.field === field.field)"
:badge="badge"
@update:model-value="setValue(field, $event)"
@unset="unsetValue(field)"
@toggle-batch="toggleBatchField(field)"
@@ -124,6 +125,10 @@ export default defineComponent({
type: Number,
default: null,
},
badge: {
type: String,
default: null,
},
},
emits: ['update:modelValue'],
setup(props, { emit }) {

View File

@@ -379,6 +379,7 @@ body {
}
.append {
flex-shrink: 0;
margin-left: 8px;
}
}

View File

@@ -138,6 +138,8 @@ body {
--v-list-item-min-height: 32px;
--v-list-item-max-height: auto;
--v-list-item-border-radius: var(--border-radius);
--v-list-item-border-color: var(--border-subdued);
--v-list-item-border-color-hover: var(--border-normal);
--v-list-item-color: var(--v-list-color, var(--foreground-normal));
--v-list-item-color-hover: var(--v-list-color-hover, var(--foreground-normal));
--v-list-item-color-active: var(--v-list-color-active, var(--foreground-normal));
@@ -223,26 +225,27 @@ body {
}
&.block {
--v-list-item-border-color: var(--border-subdued);
--v-list-item-background-color: var(--background-subdued);
--v-list-item-background-color-hover: var(--background-subdued);
--v-icon-color: var(--foreground-subdued);
position: relative;
display: flex;
height: var(--input-height);
margin: 0;
padding: 8px;
background-color: var(--background-subdued);
border: 2px solid var(--border-subdued);
background-color: var(--v-list-item-background-color);
border: var(--border-width) solid var(--v-list-item-border-color);
border-radius: var(--border-radius);
transition: border-color var(--fast) var(--transition);
:slotted(.v-icon) {
color: var(--foreground-subdued);
&:hover {
color: var(--foreground-normal);
}
}
:slotted(.drag-handle) {
cursor: grab;
&:hover {
color: var(--foreground-color);
}
}
:slotted(.drag-handle:active) {
@@ -254,12 +257,12 @@ body {
}
&:hover {
background-color: var(--background-subdued);
border: 2px solid var(--border-normal);
background-color: var(--v-list-item-background-color-hover);
border: var(--border-width) solid var(--v-list-item-border-color-hover);
}
&.sortable-chosen {
border: 2px solid var(--primary) !important;
border: var(--border-width) solid var(--primary) !important;
}
& + & {

View File

@@ -1,14 +1,18 @@
<template>
<div
class="v-progress-linear"
:class="{
absolute,
bottom,
fixed,
indeterminate,
rounded,
top,
}"
:class="[
{
absolute,
bottom,
fixed,
indeterminate,
rounded,
top,
colorful,
},
color,
]"
@animationiteration="$emit('animationiteration')"
>
<div
@@ -22,7 +26,7 @@
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { computed, defineComponent } from 'vue';
export default defineComponent({
props: {
@@ -54,8 +58,21 @@ export default defineComponent({
type: Number,
default: 0,
},
colorful: {
type: Boolean,
default: false,
},
},
emits: ['animationiteration'],
setup(props) {
const color = computed(() => {
if (props.value <= 33) return 'danger';
if (props.value <= 66) return 'warning';
return 'success';
});
return { color };
},
});
</script>
@@ -116,6 +133,20 @@ body {
&.top {
top: 0;
}
&.colorful {
&.danger .inner {
background-color: var(--danger);
}
&.warning .inner {
background-color: var(--warning);
}
&.success .inner {
background-color: var(--success);
}
}
}
@keyframes indeterminate {

View File

@@ -23,7 +23,10 @@
@click="toggle"
>
<template v-if="$slots.prepend" #prepend><slot name="prepend" /></template>
<template #append><v-icon name="expand_more" :class="{ active }" /></template>
<template #append>
<v-icon name="expand_more" :class="{ active }" />
<slot name="append" />
</template>
</v-input>
</template>

View File

@@ -250,7 +250,7 @@ export default defineComponent({
font-weight: 500;
font-size: 14px;
background-color: var(--v-table-background-color);
border-bottom: 2px solid var(--border-subdued);
border-bottom: var(--border-width) solid var(--border-subdued);
&.select,
&.manual {
@@ -346,7 +346,7 @@ export default defineComponent({
top: 20%;
left: 2px;
display: block;
width: 2px;
width: var(--border-width);
height: 60%;
background-color: var(--border-subdued);
content: '';

View File

@@ -102,7 +102,7 @@ export default defineComponent({
white-space: nowrap;
text-overflow: ellipsis;
background-color: var(--v-table-background-color);
border-bottom: 2px solid var(--border-subdued);
border-bottom: var(--border-width) solid var(--border-subdued);
&:last-child {
padding: 0 12px 0 12px;

View File

@@ -0,0 +1,12 @@
import { defineInterface } from '@directus/shared/utils';
import InterfaceSystemModules from './system-modules.vue';
export default defineInterface({
id: 'system-modules',
name: '$t:module_bar',
icon: 'arrow_drop_down_circle',
component: InterfaceSystemModules,
types: ['json'],
options: [],
system: true,
});

View File

@@ -0,0 +1,307 @@
<template>
<div class="system-modules">
<v-list class="list">
<draggable
v-model="valuesWithData"
:force-fallback="true"
:set-data="hideDragImage"
item-key="id"
handle=".drag-handle"
:animation="150"
>
<template #item="{ element }">
<v-list-item
block
:class="{ enabled: element.enabled }"
:clickable="element.type === 'link'"
@click="element.type === 'link' ? edit(element.id) : undefined"
>
<v-icon class="drag-handle" name="drag_handle" />
<v-icon class="icon" :name="element.icon" />
<div class="info">
<div class="name">{{ element.name }}</div>
<div class="to">{{ element.to }}</div>
</div>
<div class="spacer" />
<v-icon v-if="element.locked === true" name="lock" />
<v-icon v-else-if="element.type === 'link'" name="clear" @click.stop="remove(element.id)" />
<v-icon
v-else
:name="element.enabled ? 'check_box' : 'check_box_outline_blank'"
clickable
@click.stop="updateItem(element, { enabled: !element.enabled })"
/>
</v-list-item>
</template>
</draggable>
</v-list>
<v-button @click="edit('+')">{{ t('add_link') }}</v-button>
<v-drawer
:title="t('custom_link')"
:model-value="!!editing"
icon="link"
@update:modelValue="editing = null"
@cancel="editing = null"
>
<template #actions>
<v-button v-tooltip.bottom="t('save')" icon rounded @click="save">
<v-icon name="check" />
</v-button>
</template>
<div class="drawer-content">
<v-form v-model="values" :initial-values="initialValues" :fields="linkFields" />
</div>
</v-drawer>
</div>
</template>
<script lang="ts">
import { defineComponent, PropType, computed, ref } from 'vue';
import { getModules } from '@/modules';
import { Settings, SettingsModuleBarModule, SettingsModuleBarLink } from '@directus/shared/types';
import { hideDragImage } from '@/utils/hide-drag-image';
import Draggable from 'vuedraggable';
import { assign } from 'lodash';
import { useI18n } from 'vue-i18n';
import { nanoid } from 'nanoid';
import { Field, DeepPartial } from '@directus/shared/types';
type PreviewExtra = {
to: string;
name: string;
icon: string;
};
type PreviewValue = (SettingsModuleBarLink & PreviewExtra) | (SettingsModuleBarModule & PreviewExtra);
const linkFields: DeepPartial<Field>[] = [
{
field: 'name',
name: '$t:name',
meta: {
required: true,
interface: 'input',
width: 'half-left',
options: {
placeholder: '$t:enter_a_name',
},
},
},
{
field: 'icon',
name: '$t:icon',
meta: {
required: true,
interface: 'select-icon',
width: 'half-right',
},
},
{
field: 'url',
name: '$t:url',
meta: {
required: true,
interface: 'input',
options: {
placeholder: '$t:url_example',
},
},
},
];
export default defineComponent({
name: 'SystemModules',
components: { Draggable },
props: {
value: {
type: Array as PropType<Settings['module_bar']>,
default: () => [],
},
},
emits: ['input'],
setup(props, { emit }) {
const { t } = useI18n();
const editing = ref<string | null>();
const values = ref<SettingsModuleBarLink | null>();
const initialValues = ref<SettingsModuleBarLink | null>();
const { modules: registeredModules } = getModules();
const availableModulesAsBarModule = computed<SettingsModuleBarModule[]>(() => {
return registeredModules.value
.filter((module) => module.hidden !== true)
.map(
(module): SettingsModuleBarModule => ({
type: 'module',
id: module.id,
enabled: false,
})
);
});
const valuesWithData = computed<PreviewValue[]>({
get() {
const savedModules = (props.value.filter((value) => value.type === 'module') as SettingsModuleBarModule[]).map(
(value) => value.id
);
return valueToPreview([
...props.value,
...availableModulesAsBarModule.value.filter(
(availableModuleAsBarModule) => savedModules.includes(availableModuleAsBarModule.id) === false
),
]);
},
set(previewValue: PreviewValue[]) {
emit('input', previewToValue(previewValue));
},
});
return {
t,
editing,
valuesWithData,
hideDragImage,
updateItem,
edit,
linkFields,
save,
values,
remove,
initialValues,
};
function valueToPreview(value: Settings['module_bar']): PreviewValue[] {
return value
.filter((part) => {
if (part.type === 'link') return true;
return !!registeredModules.value.find((module) => module.id === part.id);
})
.map((part) => {
if (part.type === 'link') {
return {
...part,
to: part.url,
icon: part.icon,
name: part.name,
};
}
const module = registeredModules.value.find((module) => module.id === part.id)!;
return {
...part,
to: module.link === undefined ? `/${module.id}` : '',
name: module.name,
icon: module.icon,
};
});
}
function previewToValue(preview: PreviewValue[]): Settings['module_bar'] {
return preview.map((previewValue) => {
if (previewValue.type === 'link') {
const { type, id, name, url, icon, enabled, locked } = previewValue;
return { type, id, name, url, icon, enabled, locked };
}
const { type, id, enabled, locked } = previewValue;
return { type, id, enabled, locked };
});
}
function updateItem(item: PreviewValue, updates: Partial<PreviewValue>): void {
valuesWithData.value = valuesWithData.value.map((previewValue) => {
if (previewValue === item) {
return assign({}, item, updates);
}
return previewValue;
});
}
function edit(id: string) {
editing.value = id;
let value: SettingsModuleBarLink;
if (id !== '+') {
value = props.value.find((val) => val.id === id) as SettingsModuleBarLink;
} else {
value = {
id: nanoid(),
type: 'link',
enabled: true,
url: '',
name: '',
icon: '',
};
}
values.value = value;
initialValues.value = value;
}
function save() {
if (editing.value === '+') {
emit('input', [...props.value, values.value]);
} else {
emit(
'input',
props.value.map((val) => (val.id === editing.value ? values.value : val))
);
}
values.value = null;
editing.value = null;
}
function remove(id: string) {
emit(
'input',
props.value.filter((val) => val.id !== id)
);
}
},
});
</script>
<style scoped>
.icon {
margin: 0 12px;
}
.v-list-item.enabled {
--v-list-item-border-color: var(--primary);
--v-list-item-color: var(--primary-125);
--v-list-item-background-color: var(--primary-10);
--v-list-item-border-color-hover: var(--primary-150);
--v-list-item-color-hover: var(--primary-125);
--v-list-item-background-color-hover: var(--primary-10);
--v-icon-color: var(--primary);
--v-icon-color-hover: var(--foreground-normal);
}
.to {
color: var(--foreground-subdued);
font-family: var(--family-monospace);
}
.enabled .to {
color: var(--primary-50);
}
.drawer-content {
padding: var(--content-padding);
padding-bottom: var(--content-padding-bottom);
}
.list {
margin-bottom: 8px;
padding: 0;
}
</style>

View File

@@ -18,6 +18,7 @@
:disabled="disabled"
small
label
clickable
@click="toggleTag(preset)"
>
{{ preset }}
@@ -32,6 +33,7 @@
class="tag"
small
label
clickable
@click="removeTag(val)"
>
{{ val }}

View File

@@ -0,0 +1,153 @@
<template>
<v-menu attached class="language-select" :class="{ secondary }">
<template #activator="{ toggle, active }">
<button class="toggle" @click="toggle">
<v-icon class="translate" name="translate" />
<span class="display-value">{{ displayValue }}</span>
<v-icon name="expand_more" :class="{ active }" />
<span class="append-slot"><slot name="append" /></span>
</button>
</template>
<v-list>
<v-list-item v-for="(item, index) in items" :key="index" @click="$emit('update:modelValue', item.value)">
<div class="start">
<div class="dot" :class="{ show: item.edited }"></div>
{{ item.text }}
</div>
<div class="end">
<v-progress-linear
v-tooltip="`${Math.round((item.current / item.max) * 100)}%`"
:value="item.progress"
colorful
/>
</div>
</v-list-item>
</v-list>
</v-menu>
</template>
<script lang="ts">
import { defineComponent, PropType, computed } from 'vue';
export default defineComponent({
components: {},
props: {
modelValue: {
type: String,
default: null,
},
items: {
type: Array as PropType<Record<string, any>[]>,
default: () => [],
},
secondary: {
type: Boolean,
default: false,
},
},
emits: ['update:modelValue'],
setup(props) {
const displayValue = computed(() => {
const item = props.items.find((item) => item.value === props.modelValue);
return item?.text ?? props.modelValue;
});
return { displayValue };
},
});
</script>
<style lang="scss" scoped>
.toggle {
--v-icon-color: var(--primary);
--v-icon-color-hover: var(--primary-150);
display: flex;
align-items: center;
width: 100%;
height: var(--input-height);
padding: var(--input-padding);
color: var(--primary);
text-align: left;
background-color: var(--primary-alt);
border-radius: var(--border-radius);
.display-value {
flex-grow: 1;
margin-left: 8px;
}
.append-slot:not(:empty) {
margin-left: 8px;
}
}
.v-input .input {
color: var(--primary);
background-color: var(--primary-alt);
border: 0px;
}
.v-icon {
margin-left: 6px;
}
.secondary {
.toggle {
--v-icon-color: var(--blue);
--v-icon-color-hover: var(--blue-150);
color: var(--blue);
background-color: var(--blue-alt);
}
}
.v-list {
.v-list-item {
display: flex;
gap: 10px;
align-items: center;
justify-content: space-between;
white-space: nowrap;
cursor: pointer;
.start {
display: flex;
flex: 1;
align-items: center;
}
.end {
display: flex;
flex-grow: 1;
gap: 10px;
align-items: center;
justify-content: flex-end;
color: var(--foreground-subdued);
}
&:hover {
background-color: var(--background-normal);
}
.dot {
width: 8px;
height: 100%;
&.show::before {
display: block;
width: 4px;
height: 4px;
background-color: var(--foreground-subdued);
border-radius: 2px;
content: '';
}
}
.v-progress-linear {
max-width: 100px;
}
}
}
</style>

View File

@@ -4,29 +4,8 @@
</v-notice>
<div v-else class="form-grid">
<div class="field half">
<p class="type-label">{{ t('language_display_template') }}</p>
<v-field-template
v-model="languageTemplate"
:collection="languageCollection"
:depth="2"
:placeholder="
languageCollectionInfo && languageCollectionInfo.meta && languageCollectionInfo.meta.display_template
"
/>
</div>
<div class="field half">
<p class="type-label">{{ t('translations_display_template') }}</p>
<v-field-template
v-model="translationsTemplate"
:collection="translationsCollection"
:depth="2"
:placeholder="
translationsCollectionInfo &&
translationsCollectionInfo.meta &&
translationsCollectionInfo.meta.display_template
"
/>
<p class="type-label">{{ t('interfaces.translations.language_field') }}</p>
<v-select v-model="languageField" :items="languageCollectionFields" item-text="name" item-value="field" />
</div>
</div>
</template>
@@ -36,7 +15,7 @@ import { useI18n } from 'vue-i18n';
import { Relation } from '@/types';
import { Field } from '@directus/shared/types';
import { defineComponent, PropType, computed } from 'vue';
import { useCollectionsStore } from '@/stores/';
import { useFieldsStore } from '@/stores/';
export default defineComponent({
props: {
@@ -61,28 +40,16 @@ export default defineComponent({
setup(props, { emit }) {
const { t } = useI18n();
const collectionsStore = useCollectionsStore();
const fieldsStore = useFieldsStore();
const translationsTemplate = computed({
const languageField = computed({
get() {
return props.value?.translationsTemplate;
return props.value?.languageField;
},
set(newTemplate: string) {
emit('input', {
...(props.value || {}),
translationsTemplate: newTemplate,
});
},
});
const languageTemplate = computed({
get() {
return props.value?.languageTemplate;
},
set(newTemplate: string) {
emit('input', {
...(props.value || {}),
languageTemplate: newTemplate,
languageField: newTemplate,
});
},
});
@@ -109,27 +76,18 @@ export default defineComponent({
);
});
const translationsCollection = computed(() => translationsRelation.value?.collection ?? null);
const languageCollection = computed(() => languageRelation.value?.related_collection ?? null);
const translationsCollectionInfo = computed(() => {
if (!translationsCollection.value) return null;
return collectionsStore.getCollection(translationsCollection.value);
});
const languageCollectionInfo = computed(() => {
if (!languageCollection.value) return null;
return collectionsStore.getCollection(languageCollection.value);
const languageCollectionFields = computed(() => {
if (!languageCollection.value) return [];
return fieldsStore.getFieldsForCollection(languageCollection.value);
});
return {
t,
languageTemplate,
translationsTemplate,
translationsCollection,
translationsCollectionInfo,
languageField,
languageCollection,
languageCollectionInfo,
languageCollectionFields,
};
},
});

View File

@@ -1,54 +1,66 @@
<template>
<div v-if="languagesLoading || previewLoading">
<v-skeleton-loader v-for="n in 5" :key="n" />
</div>
<v-list v-else class="translations">
<v-list-item
v-for="(languageItem, i) in languages"
:key="languageItem[languagesPrimaryKeyField]"
clickable
class="language-row"
block
@click="startEditing(languageItem[languagesPrimaryKeyField])"
>
<v-icon class="translate" name="translate" left />
<render-template :template="internalLanguageTemplate" :collection="languagesCollection" :item="languageItem" />
<render-template
class="preview"
:template="internalTranslationsTemplate"
:collection="translationsCollection"
:item="previewItems[i]"
<div class="translations" :class="{ split: splitViewEnabled }">
<div class="primary" :class="splitViewEnabled ? 'half' : 'full'">
<language-select v-model="firstLang" :items="languageOptions">
<template #append>
<v-icon
v-if="splitViewAvailable && !splitViewEnabled"
v-tooltip="t('interfaces.translations.toggle_split_view')"
name="flip"
clickable
@click.stop="splitView = true"
/>
</template>
</language-select>
<v-form
:loading="valuesLoading"
:fields="fields"
:model-value="firstItem"
:initial-values="firstItemInitial"
:badge="languageOptions.find((lang) => lang.value === firstLang)?.text"
@update:modelValue="updateValue($event, firstLang)"
/>
<div class="spacer" />
</v-list-item>
<drawer-item
v-if="editing"
active
:collection="translationsCollection"
:primary-key="editing"
:edits="edits"
:circular-field="translationsRelation.field"
@input="stageEdits"
@update:active="cancelEdit"
/>
</v-list>
<v-divider />
</div>
<div v-if="splitViewEnabled" class="secondary" :class="splitViewEnabled ? 'half' : 'full'">
<language-select v-model="secondLang" :items="languageOptions" secondary>
<template #append>
<v-icon
v-tooltip="t('interfaces.translations.toggle_split_view')"
name="close"
clickable
@click.stop="splitView = !splitView"
/>
</template>
</language-select>
<v-form
:loading="valuesLoading"
:initial-values="secondItemInitial"
:fields="fields"
:badge="languageOptions.find((lang) => lang.value === secondLang)?.text"
:model-value="secondItem"
@update:modelValue="updateValue($event, secondLang)"
/>
<v-divider />
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, PropType, computed, ref, watch } from 'vue';
import { useRelationsStore, useFieldsStore } from '@/stores/';
import LanguageSelect from './language-select.vue';
import { computed, defineComponent, PropType, Ref, ref, toRefs, watch, unref } from 'vue';
import useCollection from '@/composables/use-collection';
import { useFieldsStore, useRelationsStore } from '@/stores/';
import { useI18n } from 'vue-i18n';
import api from '@/api';
import { Relation } from '@/types';
import { getFieldsFromTemplate } from '@/utils/get-fields-from-template';
import DrawerItem from '@/views/private/components/drawer-item/drawer-item.vue';
import { useCollection } from '@/composables/use-collection';
import { unexpectedError } from '@/utils/unexpected-error';
import { isPlainObject } from 'lodash';
import { cloneDeep, isEqual, assign } from 'lodash';
import { notEmpty } from '@/utils/is-empty';
import { useWindowSize } from '@/composables/use-window-size';
export default defineComponent({
components: { DrawerItem },
components: { LanguageSelect },
props: {
collection: {
type: String,
@@ -62,23 +74,37 @@ export default defineComponent({
type: String,
required: true,
},
languageTemplate: {
type: String,
default: null,
},
translationsTemplate: {
languageField: {
type: String,
default: null,
},
value: {
type: Array as PropType<(string | number | Record<string, any>)[]>,
default: () => [],
type: Array as PropType<(string | number | Record<string, any>)[] | null>,
default: null,
},
},
emits: ['input'],
setup(props, { emit }) {
const { collection } = toRefs(props);
const fieldsStore = useFieldsStore();
const relationsStore = useRelationsStore();
const { t } = useI18n();
const { width } = useWindowSize();
const splitView = ref(false);
const firstLang = ref<string | number>();
const secondLang = ref<string | number>();
const { info: collectionInfo } = useCollection(collection);
watch(splitView, (splitViewEnabled) => {
const lang = languageOptions.value;
if (splitViewEnabled && secondLang.value === firstLang.value) {
secondLang.value = lang[0].value === firstLang.value ? lang[1].value : lang[0].value;
}
});
const {
relationsForField,
@@ -91,29 +117,57 @@ export default defineComponent({
translationsLanguageField,
} = useRelations();
const { languages, loading: languagesLoading, template: internalLanguageTemplate } = useLanguages();
const { startEditing, editing, edits, stageEdits, cancelEdit } = useEdits();
const { previewItems, template: internalTranslationsTemplate, loading: previewLoading } = usePreview();
const { languageOptions, loading: languagesLoading } = useLanguages();
const {
items,
firstItem,
loading: valuesLoading,
updateValue,
secondItem,
firstItemInitial,
secondItemInitial,
} = useEdits();
const fields = computed(() => {
if (translationsCollection.value === null) return [];
return fieldsStore.getFieldsForCollection(translationsCollection.value);
});
const splitViewAvailable = computed(() => {
return width.value > 960;
});
const splitViewEnabled = computed(() => {
return splitViewAvailable.value && splitView.value;
});
return {
collectionInfo,
splitView,
firstLang,
secondLang,
t,
languageOptions,
fields,
relationsForField,
translationsRelation,
translationsCollection,
translationsPrimaryKeyField,
languagesRelation,
languages,
internalLanguageTemplate,
internalTranslationsTemplate,
languagesCollection,
languagesPrimaryKeyField,
languagesLoading,
startEditing,
translationsLanguageField,
editing,
stageEdits,
cancelEdit,
edits,
previewItems,
previewLoading,
items,
firstItem,
secondItem,
updateValue,
relationsStore,
firstItemInitial,
secondItemInitial,
splitViewAvailable,
splitViewEnabled,
languagesLoading,
valuesLoading,
};
function useRelations() {
@@ -174,40 +228,84 @@ export default defineComponent({
}
function useLanguages() {
const languages = ref<Record<string, any>[]>();
const languages = ref<Record<string, any>[]>([]);
const loading = ref(false);
const error = ref<any>(null);
const { info: languagesCollectionInfo } = useCollection(languagesCollection);
const template = computed(() => {
if (!languagesPrimaryKeyField.value) return '';
return (
props.languageTemplate ||
languagesCollectionInfo.value?.meta?.display_template ||
`{{ ${languagesPrimaryKeyField.value} }}`
);
});
watch(languagesCollection, fetchLanguages, { immediate: true });
return { languages, loading, error, template };
const languageOptions = computed(() => {
const langField = translationsLanguageField.value;
if (langField === null) return [];
const writableFields = fields.value.filter(
(field) => field.type !== 'alias' && field.meta?.hidden === false && field.meta.readonly === false
);
const totalFields = writableFields.length;
return languages.value.map((language) => {
if (languagesPrimaryKeyField.value === null) return language;
const langCode = language[languagesPrimaryKeyField.value];
const initialValue = items.value.find((item) => item[langField] === langCode) ?? {};
const edits = props.value?.find((val) => typeof val === 'object' && val[langField] === langCode) as
| Record<string, any>
| undefined;
const item = { ...initialValue, ...(edits ?? {}) };
const filledFields = writableFields.filter((field) => {
return field.field in item && notEmpty(item[field.field]);
}).length;
return {
text: language[props.languageField ?? languagesPrimaryKeyField.value],
value: langCode,
edited: edits !== undefined,
progress: (filledFields / totalFields) * 100,
max: totalFields,
current: filledFields,
};
});
});
return { languageOptions, loading, error };
async function fetchLanguages() {
if (!languagesCollection.value || !languagesPrimaryKeyField.value) return;
const fields = getFieldsFromTemplate(template.value);
const fields = new Set<string>();
if (fields.includes(languagesPrimaryKeyField.value) === false) {
fields.push(languagesPrimaryKeyField.value);
if (props.languageField !== null) {
fields.add(props.languageField);
}
fields.add(languagesPrimaryKeyField.value);
loading.value = true;
try {
const response = await api.get(`/items/${languagesCollection.value}`, { params: { fields, limit: -1 } });
const response = await api.get(`/items/${languagesCollection.value}`, {
params: {
fields: Array.from(fields),
limit: -1,
sort: props.languageField ?? languagesPrimaryKeyField.value,
},
});
languages.value = response.data.data;
if (!firstLang.value) {
firstLang.value = response.data.data?.[0]?.[languagesPrimaryKeyField.value];
}
if (!secondLang.value) {
secondLang.value = response.data.data?.[1]?.[languagesPrimaryKeyField.value];
}
} catch (err: any) {
unexpectedError(err);
} finally {
@@ -217,234 +315,174 @@ export default defineComponent({
}
function useEdits() {
const keyMap = ref<Record<string, string | number>[]>();
const loading = ref(false);
const error = ref<any>(null);
const editing = ref<boolean | string | number>(false);
const edits = ref<Record<string, any>>();
const existingPrimaryKeys = computed(() => {
const pkField = translationsPrimaryKeyField.value;
if (!pkField) return [];
return (props.value || [])
.map((value) => {
if (typeof value === 'string' || typeof value === 'number') return value;
return value[pkField];
})
.filter((key) => key);
});
watch(() => props.value, fetchKeyMap, { immediate: true });
return { startEditing, editing, edits, stageEdits, cancelEdit };
function startEditing(language: string | number) {
if (!translationsLanguageField.value || !translationsPrimaryKeyField.value) return;
edits.value = {
[translationsLanguageField.value]: language,
};
const existingEdits = (props.value || []).find((val) => {
if (typeof val === 'string' || typeof val === 'number') return false;
return val[translationsLanguageField.value!] === language;
});
if (existingEdits) {
edits.value = {
...edits.value,
...(existingEdits as Record<string, any>),
};
}
const primaryKey =
keyMap.value?.find((record) => record[translationsLanguageField.value!] === language)?.[
translationsPrimaryKeyField.value
] || '+';
if (primaryKey !== '+') {
edits.value = {
...edits.value,
[translationsPrimaryKeyField.value]: primaryKey,
};
}
editing.value = primaryKey;
}
async function fetchKeyMap() {
if (!props.value) return;
if (keyMap.value) return;
if (!existingPrimaryKeys.value?.length) return;
const pkField = translationsPrimaryKeyField.value;
if (!pkField) return;
const collection = translationsRelation.value?.collection;
if (!collection) return;
const fields = [pkField, translationsLanguageField.value];
loading.value = true;
try {
const response = await api.get(`/items/${collection}`, {
params: {
fields,
filter: {
[pkField]: {
_in: existingPrimaryKeys.value,
},
},
limit: -1,
},
});
keyMap.value = response.data.data;
} catch (err: any) {
error.value = err;
} finally {
loading.value = false;
}
}
function stageEdits(edits: any) {
if (!translationsLanguageField.value) return;
const pkField = translationsPrimaryKeyField.value;
if (!pkField) return;
const editedLanguage = edits[translationsLanguageField.value];
const languageAlreadyEdited = !!(props.value || []).find((val) => {
if (typeof val === 'string' || typeof val === 'number') return false;
return val[translationsLanguageField.value!] === editedLanguage;
});
if (languageAlreadyEdited === true) {
emit(
'input',
props.value.map((val) => {
if (typeof val === 'string' || typeof val === 'number') return val;
if (val[translationsLanguageField.value!] === editedLanguage) {
return edits;
}
return val;
})
);
} else {
if (editing.value === '+') {
emit('input', [...(props.value || []), edits]);
} else {
emit(
'input',
props.value.map((val) => {
if (typeof val === 'string' || typeof val === 'number') {
if (val === editing.value) return edits;
} else {
if (val[pkField] === editing.value) return edits;
}
return val;
})
);
}
}
editing.value = false;
}
function cancelEdit() {
edits.value = {};
editing.value = false;
}
}
function usePreview() {
const items = ref<Record<string, any>[]>([]);
const loading = ref(false);
const error = ref(null);
const previewItems = ref<Record<string, any>[]>([]);
const { info: translationsCollectionInfo } = useCollection(translationsCollection);
const firstItem = computed(() => getEditedValue(firstLang));
const secondItem = computed(() => getEditedValue(secondLang));
const template = computed(() => {
if (!translationsPrimaryKeyField.value) return '';
const firstItemInitial = computed<Record<string, any>>(() => getExistingValue(firstLang));
const secondItemInitial = computed<Record<string, any>>(() => getExistingValue(secondLang));
watch(
() => props.value,
(newVal, oldVal) => {
if (
newVal &&
newVal !== oldVal &&
newVal?.every((item) => typeof item === 'string' || typeof item === 'number')
) {
loadItems();
}
if (newVal === null || newVal.length === 0) {
items.value = [];
}
},
{ immediate: true }
);
return { items, firstItem, updateValue, secondItem, firstItemInitial, secondItemInitial, loading, error };
function getExistingValue(langRef: string | number | undefined | Ref<string | number | undefined>) {
const lang = unref(langRef);
const langField = translationsLanguageField.value;
if (langField === null) return {};
return (items.value.find((item) => item[langField] === lang) as Record<string, any>) ?? {};
}
function getEditedValue(langRef: string | number | undefined | Ref<string | number | undefined>) {
const lang = unref(langRef);
const langField = translationsLanguageField.value;
if (langField === null) return {};
return (
props.translationsTemplate ||
translationsCollectionInfo.value?.meta?.display_template ||
`{{ ${translationsPrimaryKeyField.value} }}`
(props.value?.find((item) => typeof item === 'object' && item[langField] === lang) as Record<string, any>) ??
{}
);
});
}
watch(() => props.value, fetchPreviews, { immediate: true });
watch(languages, fetchPreviews, { immediate: true });
async function loadItems() {
const pkField = translationsPrimaryKeyField.value;
return { loading, error, previewItems, fetchPreviews, template };
async function fetchPreviews() {
if (!translationsRelation.value || !languagesRelation.value || !languages.value) return;
if (props.primaryKey === '+') return;
if (pkField === null || !props.value || props.value.length === 0) return;
loading.value = true;
try {
const fields = getFieldsFromTemplate(template.value);
if (fields.includes(languagesRelation.value.field) === false) {
fields.push(languagesRelation.value.field);
}
const existing = await api.get(`/items/${translationsCollection.value}`, {
const response = await api.get(`/items/${translationsCollection.value}`, {
params: {
fields,
fields: '*',
limit: -1,
filter: {
[translationsRelation.value.field]: {
_eq: props.primaryKey,
[pkField]: {
_in: props.value,
},
},
limit: -1,
},
});
previewItems.value = languages.value.map((language) => {
const pkField = languagesPrimaryKeyField.value;
if (!pkField) return;
const existingEdit =
props.value && Array.isArray(props.value)
? (props.value.find(
(edit) =>
isPlainObject(edit) &&
(edit as Record<string, any>)[languagesRelation.value!.field] === language[pkField]
) as Record<string, any>)
: {};
return {
...(existing.data.data?.find(
(item: Record<string, any>) => item[languagesRelation.value!.field] === language[pkField]
) ?? {}),
...existingEdit,
};
});
} catch (err: any) {
items.value = response.data.data;
} catch (err) {
error.value = err;
previewItems.value = [];
unexpectedError(err);
} finally {
loading.value = false;
}
}
function updateValue(edits: Record<string, any>, lang: string) {
const pkField = translationsPrimaryKeyField.value;
const langField = translationsLanguageField.value;
const existing = getExistingValue(lang);
const values = assign({}, existing, edits);
if (pkField === null || langField === null) return;
let copyValue = cloneDeep(props.value ?? []);
if (pkField in values === false) {
const newIndex = copyValue.findIndex((item) => typeof item === 'object' && item[langField] === lang);
if (newIndex !== -1) {
if (Object.keys(values).length === 1 && langField in values) {
copyValue.splice(newIndex, 1);
} else {
copyValue[newIndex] = values;
}
} else {
copyValue.push({
...values,
[langField]: lang,
});
}
} else {
const initialValues = items.value.find((item) => item[langField] === lang);
copyValue = copyValue.map((item) => {
if (typeof item === 'number' || typeof item === 'string') {
if (values[pkField] === item) {
return values;
} else {
return item;
}
} else {
if (values[pkField] === item[pkField]) {
if (isEqual(initialValues, { ...initialValues, ...values })) {
return values[pkField];
} else {
return values;
}
} else {
return item;
}
}
});
}
emit('input', copyValue);
}
}
},
});
</script>
<style scoped>
.preview {
color: var(--foreground-subdued);
<style lang="scss" scoped>
@import '@/styles/mixins/form-grid';
.translations {
@include form-grid;
.v-form {
--form-vertical-gap: 32px;
--v-chip-color: var(--primary);
--v-chip-background-color: var(--primary-alt);
margin-top: 32px;
}
.v-divider {
margin-top: var(--form-vertical-gap);
}
.primary {
--v-divider-color: var(--primary-50);
}
.secondary {
--v-divider-color: var(--blue-50);
.v-form {
--primary: var(--blue);
--v-chip-color: var(--blue);
--v-chip-background-color: var(--blue-alt);
}
}
}
</style>

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: تعديل الحقل
conditions: الشروط
maps: الخرائط
@@ -142,9 +122,7 @@ fields_for_role: 'عناصر الدور {role} يمكن أن {action}.'
validation_for_role: 'الحقل {action} قواعد الدور {role} يجب أن يطيع.'
presets_for_role: 'قيمة الحقل الافتراضية لدور {role}.'
presentation_and_aliases: Presentation & Aliases
revision_post_update: إليك ما بدا عليه هذا العنصر بعد التحديث...
changes_made: هذه هي التغييرات المحددة التي تم إجراؤها...
no_relational_data: ولا يغيب عن البال أن هذا لا يشمل بيانات علاقية.
revision_post_update: بسم الله الرحمن الرحيم.
hide_field_on_detail: مخفي في التفاصيل
show_field_on_detail: أظهر الحقل في التفاصيل
delete_field: حذف الحقل
@@ -378,7 +356,6 @@ no_files_copy: لا توجد ملفات هنا.
user_count: 'لا توجد عناصر | عنصر واحد | {count} العناصر'
no_users_copy: لا يوجد مستخدمون في هذه التجزئة.
webhooks_count: 'لاتوجد روابط ويب | رابط ويب | {count} روابط ويب'
no_webhooks_copy: لا يوجد أسئلة بعد.
all_items: كافة العناصر
any: أي
csv: CSV
@@ -769,10 +746,8 @@ field_options:
directus_settings:
security_divider_title: الأمان
directus_activity:
login: تسجيل الدخول
create: انشاء
update: تحديث
delete: حذف
directus_collections:
track_activity_revisions: تتبع النشاط والتنقيحات
only_track_activity: تتبع النشاط فقط

View File

@@ -1,24 +1,6 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
draft: Чернова
archived: Архивиран
edit_field: Редактиране на поле
conditions: Условия
maps: Географски карти
@@ -142,9 +124,6 @@ fields_for_role: 'Полета, които ролята "{role}" има позв
validation_for_role: 'Правила, които ролята "{role}" трябва да спазва, при {action} на полета.'
presets_for_role: 'Стойности за полета по подразбиране, за ролята "{role}".'
presentation_and_aliases: Презентационни и псевдоними
revision_post_update: Ето как ще изглежда записът след промяната...
changes_made: Направените промени са следните...
no_relational_data: Имайте в предвид, че това не включва данните от релационните записи.
hide_field_on_detail: Скриване в детайлен изглед
show_field_on_detail: Показване в детайлния изглед
delete_field: Изтриване на поле
@@ -382,7 +361,6 @@ no_files_copy: Тук не са открити файлове.
user_count: 'Няма потребители | Един потребител | {count} потребителя'
no_users_copy: Все още няма потребители в тази роля.
webhooks_count: "Няма уеб-куки | 1 уеб-кука | {count} уеб-куки\n"
no_webhooks_copy: Все още няма уеб-куки.
all_items: Всички записи
any: Който и да е
csv: CSV
@@ -868,7 +846,7 @@ field_options:
auth_password_policy:
none_text: Без - не се препоръчва
weak_text: Слаба - минимум от 8 символа
strong_text: Силна - главни, малки, числа и специални символи
strong_text: Силна - главни, малки, числа и специални символи
storage_asset_presets:
fit:
contain_text: Напасване (запазване на съотношението)

View File

@@ -1,24 +1,6 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
draft: Esborrany
archived: Arxivat
edit_field: Edita el camp
conditions: Condicions
maps: Mapes
@@ -141,9 +123,6 @@ fields_for_role: 'Camps del {role} poden {action}.'
validation_for_role: 'El camp {action} determina que el rol {role} ha de obeir.'
presets_for_role: 'Valor de camp predeterminat per al rol {role}.'
presentation_and_aliases: Presentació i àlies
revision_post_update: Així és com queda l'element després d'actualitzar...
changes_made: Aquests són els canvis específics que s'han fet...
no_relational_data: Tingues present que això no inclou dades relacionals.
hide_field_on_detail: Amaga el camp en el detall
show_field_on_detail: Mostra el camp en el detall
delete_field: Elimina el camp
@@ -381,7 +360,6 @@ no_files_copy: No hi ha fitxers aquí.
user_count: 'No hi ha usuaris | Un usuari | {count} usuaris'
no_users_copy: Encara no hi ha usuaris en aquest rol.
webhooks_count: 'No hi ha webhooks | Un webhook | {count} webhooks'
no_webhooks_copy: Encara no hi ha webhooks.
all_items: Tots els elements
any: Qualsevol
csv: CSV
@@ -620,7 +598,7 @@ wysiwyg_options:
superscript: Superíndex
codeblock: Codi
blockquote: Bloc de cita
bullist: Llista amb vinyetes
bullist: Llista amb vinyetes
numlist: Llista ordenada
hr: Regle horitzontal
link: Afegeix / Edita l'enllaç
@@ -854,7 +832,6 @@ field_options:
files_divider_title: Fitxers i miniatures
overrides_divider_title: Substitucións de l'aplicació
directus_activity:
login: Entra
create: Crear
update: Actualitzar
delete: Elimina

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Upravit pole
conditions: Podmínky
maps: Mapy
@@ -352,10 +332,8 @@ fields:
status: Stav
field_options:
directus_activity:
login: Login
create: Vytořit
update: Úpravy
delete: Smazat
directus_collections:
language: Jazyk
archive_divider: Archivovat

View File

@@ -1,35 +1,20 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Rediger Felt
conditions: Betingelser
item_revision: Genstandsrevision
duplicate_field: Dupliker Felt
half_width: Halv Bredde
full_width: Fuld Bredde
group: Gruppe
and: Og
or: Eller
fill_width: Fuld Bredde
field_name_translations: Oversættelse af feltnavn
enter_password_to_enable_tfa: Indtast dit kodeord for at aktivere To-faktor-godkendelse (2FA)
add_field: Tilføj Felt
role_name: Rollenavn
exclusive: Eksklusiv
children: Underordnede
db_only_click_to_configure: 'Kun i databasen: Klik for at konfigurere '
show_archived_items: Vis arkiverede element
edited: Værdi Ændret
@@ -41,7 +26,9 @@ create_role: Opret Rolle
create_user: Opret bruger
create_webhook: Opret Webhook
invite_users: Inviter brugere
email_examples: "admin{'@'}example.com, bruger{'@'}example.com..."
invite: Inviter
email_already_invited: Email "{email}" er allerede blevet inviteret
emails: E-mail
connection_excellent: Udmærket forbindelse
connection_good: God forbindelse
@@ -61,6 +48,7 @@ delete_bookmark_copy: >-
logoutReason:
SIGN_OUT: Logget ud
SESSION_EXPIRED: Sessionen er udløbet
public_label: Offentlig
public_description: Kontrollerer, hvilke API-data der er tilgængelige uden godkendelse.
not_allowed: Ikke tilladt
directus_version: Directus Version
@@ -99,9 +87,16 @@ validationError:
null: Værdien skal være null
nnull: Værdien kan ikke være null
required: Værdi er påkrævet
unique: Værdien skal være unik
regex: Værdien har ikke det korrekte format
all_access: Alle Adgang
no_access: Ingen Adgang
use_custom: Brug Brugerdefineret
nullable: Nullbar
allow_null_value: Tillad NULL værdi
allow_multiple: Tillad Flere
allow_multiple_to_be_open: Tillad åbning af flere
enter_value_to_replace_nulls: Indtast venligst en ny værdi for at erstatte eventuelle NULL'er, der er i øjeblikket i dette felt.
field_standard: Standard
field_presentation: Presentation & Aliases
field_m2o: M2O Forhold
@@ -117,9 +112,6 @@ fields_for_role: 'Felter {role} Rollen kan {action}.'
validation_for_role: 'Felt {action} reglerne for {role} Rollen skal adlyde.'
presets_for_role: 'Feltets værdi er standard for {role} Rollen.'
presentation_and_aliases: Presentation & Aliases
revision_post_update: Her er hvad dette element så ud som, efter opdateringen...
changes_made: Disse er de specifikke ændringer, der blev lavet...
no_relational_data: Husk, at dette ikke omfatter relationelle data.
hide_field_on_detail: Skjul felt på detalje
show_field_on_detail: Vis felt på detalje
delete_field: Slet Felt
@@ -252,6 +244,7 @@ operators:
ncontains: Indeholder ikke
empty: Er tom
loading: Indlæser...
value_unique: Værdien skal være unik
no_results: Ingen resultater
role: Rolle
create: Opret
@@ -345,10 +338,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Log ind
create: Opret
update: Opdater
delete: Slet
directus_collections:
language: Sprog
archive_divider: Arkiver

View File

@@ -19,6 +19,9 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: Veröffentlicht
draft: Entwurf
archived: Archiviert
edit_field: Feld bearbeiten
conditions: Bedingungen
maps: Karten
@@ -142,9 +145,6 @@ fields_for_role: 'Felder die von der {role} Rolle {action} werden können.'
validation_for_role: 'Feld {action} Regeln welche durch die {role} Rolle befolgt werden muss.'
presets_for_role: 'Feld Voreinstellungen für die {role} Rolle.'
presentation_and_aliases: Darstellung & Aliasse
revision_post_update: Hier siehst du, wie das Element nach dem Update aussah...
changes_made: Dies sind die spezifischen Änderungen, die vorgenommen wurden...
no_relational_data: Beachten Sie, dass dies keine relationalen Daten enthält.
hide_field_on_detail: In Detailansicht ausblenden
show_field_on_detail: In Detailansicht einblenden
delete_field: Feld löschen
@@ -382,7 +382,6 @@ no_files_copy: Keine Dateien vorhanden.
user_count: 'Keine Benutzer | Ein Benutzer | {count} Benutzer'
no_users_copy: Es gibt noch keine Benutzer in dieser Rolle.
webhooks_count: 'Keine Webhooks | Ein Webhook | {count} Webhooks'
no_webhooks_copy: Es gibt noch keine Webhooks.
all_items: Alle Elemente
any: Irgendein
csv: CSV
@@ -934,6 +933,7 @@ field_options:
group_placeholder: Diese Gruppe benennen...
type_name: Typ
choices_always: Immer geöffnet
choices_start_open: Geöffnet starten
choices_start_collapsed: Eingeklappt starten
collections_name: Sammlungen
collections_addLabel: Sammlung hinzufügen...
@@ -957,6 +957,7 @@ field_options:
actions_create: Erstellen
actions_update: Aktualisieren
actions_delete: Löschen
actions_login: Login
no_fields_in_collection: 'Es gibt noch keine Felder in "{collection}"'
do_nothing: Keine Aktion
generate_and_save_uuid: UUID generieren und speichern
@@ -1043,6 +1044,11 @@ interfaces:
name: Akkordeon
description: Felder oder Gruppen als Akkordeonabschnitte anzeigen
start: Start
all_closed: Alle geschlossen
first_opened: Zuerst geöffnet
all_opened: Alle geöffnet
accordion_mode: Akkordeon-Modus
max_one_section_open: Max. einen Abschnitt öffnen
presentation-links:
presentation-links: Button-Links
links: Links
@@ -1058,6 +1064,13 @@ interfaces:
allow_other: Andere erlauben
show_more: 'Zeige {count} mehr'
items_shown: Angezeigte Elemente
select-multiple-checkbox-tree:
name: Kontrollkästchen (Baum)
description: Zwischen mehreren Optionen auswählen über Kontrollkästchen
value_combining: Kombination Werte
value_combining_note: Legt fest, welcher Werte gespeichert wird, wenn verschachtelte Selektionen gemacht werden.
show_all: Alle anzeigen
show_selected: Auswahl anzeigen
input-code:
code: Code
description: Code-Snippets schreiben oder teilen
@@ -1152,7 +1165,21 @@ interfaces:
imageToken: Bild-Token
imageToken_label: Welcher (statischer) Token, der an Bildquellen angehängt werden soll
map:
map: Karte
description: Ort auf der Karte wählen
zoom: Zoom
geometry_type: Geometrie-Typ
geometry_format: Geometrie-Format
default_view: Standardansicht
invalid_options: Ungültige Optionen
invalid_format: Ungültiges Format ({format})
unexpected_geometry: Erwartete {expected}, erhielt {got}.
fit_bounds: Ansicht an Daten anpassen
native: Nativ
geojson: GeoJSON
lnglat: Längengrad, Breitengrad
wkt: WKT
wkb: WKB
presentation-notice:
notice: Anmerkung
description: Kurze Anmerkung anzeigen
@@ -1163,6 +1190,10 @@ interfaces:
no_collection: Die Sammlung konnte nicht gefunden werden
system-folder:
folder: Ordner
description: Ordner auswählen
field_hint: Neu hochgeladene Dateien in den ausgewählten Ordner verschieben. Hat keine Auswirkung auf selektierte Dateien.
root_name: Root-Ordner für Dateien
system_default: System-Standardeinstellungen
select-radio:
radio-buttons: Radio Buttons
description: Eine von mehreren Optionen auswählen
@@ -1240,6 +1271,17 @@ interfaces:
value_path: Wertpfad
trigger: Trigger
rate: Rate
group-raw:
name: Rohgruppe
description: Felder so anzeigen wie sie sind
group-detail:
name: Detailgruppe
description: Felder als einklappbaren Abschnitt anzeigen
show_header: Kopfzeile anzeigen
header_icon: Icon Kopfzeile
header_color: Farbe Kopfzeile
start_open: Geöffnet starten
start_closed: Geschlossen starten
displays:
boolean:
boolean: Boolean
@@ -1347,4 +1389,16 @@ layouts:
start_date_field: Datumsfeld Start
end_date_field: Datumsfeld Ende
map:
map: Karte
basemap: Basemap
layers: Ebenen
edit_custom_layers: Ebenen bearbeiten
cluster_options: Clustering-Optionen
cluster: Clustering aktivieren
cluster_radius: Cluster-Radius
cluster_minpoints: Minimale Punkte Clustering
cluster_maxzoom: Maximaler Zoom für Clustering
field: Dimensionen
invalid_geometry: Ungültige Geometrie
auto_location_filter: Daten immer filtern, um Grenzen anzuzeigen
search_this_area: Diesen Bereich durchsuchen

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Επεξεργασία Πεδίου
item_revision: Αναθεώρηση Αντικειμένου
duplicate_field: Αντίγραφο Πεδίου
@@ -229,7 +209,6 @@ field_options:
directus_activity:
create: Δημιουργία
update: Ενημέρωση
delete: Διαγραφή
directus_collections:
archive_divider: Αρχειοθέτηση
directus_roles:

View File

@@ -23,10 +23,13 @@
published: Published
draft: Draft
archived: Archived
module_bar: Module Bar
tile_size: Tile Size
edit_field: Edit Field
conditions: Conditions
maps: Maps
item_revision: Item Revision
enter_a_name: Enter a Name...
duplicate_field: Duplicate Field
half_width: Half Width
full_width: Full Width
@@ -58,6 +61,7 @@ delete_panel: Delete Panel
create_webhook: Create Webhook
invite_users: Invite Users
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
url_example: "https://example.com"
invite: Invite
email_already_invited: Email "{email}" has already been invited
emails: Emails
@@ -236,6 +240,8 @@ add_m2m_to_collection: 'Add Many-to-Many to "{collection}"'
choose_a_type: Choose a Type...
determined_by_relationship: Determined by Relationship
add_note: Add a helpful note for users...
add_link: Add Link
custom_link: Custom Link
default_value: Default Value
standard_field: Standard Field
single_file: Single File
@@ -1343,6 +1349,8 @@ interfaces:
translations:
display_template: Display Template
no_collection: No Collection
toggle_split_view: Toggle Split View
language_field: Language Field
list-o2m-tree-view:
description: Tree view for nested recursive one-to-many items
recursive_only: The tree view interface only works for recursive relationships.

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Editar Campo
conditions: Condiciones
item_revision: Revisión de Elemento
@@ -136,9 +116,6 @@ fields_for_role: 'Campos que el Rol {role} puede {action}.'
validation_for_role: 'Reglas de campo al {action} que el Rol {role} tiene que obedecer.'
presets_for_role: 'Valor del campo por defecto para el rol {role}.'
presentation_and_aliases: Presentación y Alias
revision_post_update: Así es como se vería este artículo después de la actualización...
changes_made: Estos son los cambios específicos que se hicieron...
no_relational_data: Ten en cuenta que esto no incluye datos relacionales.
hide_field_on_detail: Oculto en Detalle
show_field_on_detail: Mostrar en Detalle
delete_field: Borrar Campo
@@ -375,7 +352,6 @@ no_files_copy: Aquí no hay archivos.
user_count: 'Sin Usuarios | Un Usuario | {count} Usuarios'
no_users_copy: No hay usuarios con este Rol aún.
webhooks_count: 'Sin Webhooks | Un Webhook | {count} Webhooks'
no_webhooks_copy: Aún no hay Webhooks.
all_items: Todos los Elementos
csv: CSV
no_collections: Sin Colecciones
@@ -815,6 +791,10 @@ fields:
name: Nombre
status: Estatus
field_options:
directus_activity:
create: Crear
update: Actualización
delete: Eliminar
directus_collections:
track_activity_revisions: Rastrear actividad y revisiones
only_track_activity: Sólo seguimiento de actividad
@@ -824,11 +804,6 @@ field_options:
language: Idioma
archive_divider: Archivar
divider: Ordenar
directus_activity:
login: Iniciar Sesión
create: Crear
update: Actualización
delete: Eliminar
directus_roles:
fields:
icon_name: Ícono

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Editar Campo
conditions: Condiciones
item_revision: Revisión de Elemento
@@ -136,9 +116,6 @@ fields_for_role: 'Campos que el Rol {role} puede {action}.'
validation_for_role: 'Reglas de campo al {action} que el Rol {role} tiene que obedecer.'
presets_for_role: 'Valores por defecto del Campo para el Rol {role}.'
presentation_and_aliases: Presentación y Alias
revision_post_update: Así se vería el elemento después de la actualización...
changes_made: Estos son los cambios específicos que se hicieron...
no_relational_data: Tener en cuenta que esto no incluye datos relacionales.
hide_field_on_detail: Ocultar campo en el Detalle
show_field_on_detail: Mostrar campo en el Detalle
delete_field: Eliminar Campo
@@ -375,7 +352,6 @@ no_files_copy: Aquí no hay archivos.
user_count: 'Sin Usuarios | Un Usuario | {count} Usuarios'
no_users_copy: No hay usuarios con este Rol aún.
webhooks_count: 'Sin Webhooks | Un Webhook | {count} Webhooks'
no_webhooks_copy: Aún no hay Webhooks.
all_items: Todos los Elementos
csv: CSV
no_collections: Sin Colecciones
@@ -816,7 +792,6 @@ fields:
status: Estado
field_options:
directus_activity:
login: Iniciar sesión
create: Crear
update: Actualizar
delete: Eliminar

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Editar Campo
conditions: Condiciones
item_revision: Revisión de Elemento
@@ -135,9 +115,6 @@ fields_for_role: 'Campos que el Rol {role} puede {action}.'
validation_for_role: 'Reglas de campo al {action} que el Rol {role} tiene que obedecer.'
presets_for_role: 'Valores por defecto del Campo para el Rol {role}.'
presentation_and_aliases: Presentación y Alias
revision_post_update: Así se vería el elemento después de la actualización...
changes_made: Estos son los cambios específicos que se hicieron...
no_relational_data: Tener en cuenta que esto no incluye datos relacionales.
hide_field_on_detail: Ocultar campo en el Detalle
show_field_on_detail: Mostrar campo en el Detalle
delete_field: Eliminar Campo
@@ -374,7 +351,6 @@ no_files_copy: Aquí no hay archivos.
user_count: 'Sin Usuarios | Un Usuario | {count} Usuarios'
no_users_copy: No hay usuarios con este Rol aún.
webhooks_count: 'Sin Webhooks | Un Webhook | {count} Webhooks'
no_webhooks_copy: Aún no hay Webhooks.
all_items: Todos los Elementos
csv: CSV
no_collections: Sin Colecciones
@@ -815,7 +791,6 @@ fields:
status: Estado
field_options:
directus_activity:
login: Iniciar Sesión
create: Crear
update: Actualización
delete: Eliminar

View File

@@ -1,24 +1,5 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
archived: Arhiveeritud
edit_field: Muuda välja
item_revision: Kirje parandamine
duplicate_field: Korduv väli
@@ -125,9 +106,6 @@ fields_for_role: '{role} rollil lubatud väljade {action}.'
validation_for_role: 'Tegevuse {action} jaoks on vajalik roll {role}.'
presets_for_role: 'Välja vaikeväärtuseks on {role} roll.'
presentation_and_aliases: Kujundus ja aliased
revision_post_update: Sellisena paistis see objekt pärast uuendamist...
changes_made: Tehti sellised parandused...
no_relational_data: Pea meeles, et see ei sisalda seotud andmeid.
hide_field_on_detail: Peida väli detailvaates
show_field_on_detail: Näita detailvaates
delete_field: Kustuta väli
@@ -363,7 +341,6 @@ no_files_copy: Faile pole.
user_count: 'Kasutajaid pole | Üks kasutaja | {count} kasutajat'
no_users_copy: Selles rollis pole ühtegi kasutajat.
webhooks_count: 'Webhooke ei leitud | Üks webhook | {count} webhooki'
no_webhooks_copy: Webhooke ei leitud.
all_items: Kõik kirjed
csv: CSV
no_collections: Andmekogusid pole
@@ -662,7 +639,7 @@ page_help_docs_global: >-
page_help_files_collection: >-
**Failikogu* - Näitab kõiki faile ja pilte selles projektis. Muuta saab vaateid, filtreid jm ning lisada järjehoidjaid
page_help_files_item: >-
**Faili detailid* - Vorm, milles saab muuta faili metaandmeid, ligipääse jm
**Faili detailid* - Vorm, milles saab muuta faili metaandmeid, ligipääse jm
page_help_settings_project: "**Projekti seaded** - Sinu projekti üldised seaded"
page_help_settings_datamodel_collections: >-
**Andmekogud** - Näitab kõiki andmekogusid (sh süsteemseid)
@@ -798,10 +775,8 @@ fields:
status: Staatus
field_options:
directus_activity:
login: Logi sisse
create: Loo
update: Uuenda
delete: Kustuta
directus_collections:
track_activity_revisions: Salvesta muudatuste statistika
only_track_activity: Jälgi ainult aktiivsust

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Muokkaa kenttää
item_revision: Kohteen versio
duplicate_field: Monista kenttä
@@ -125,9 +105,6 @@ fields_for_role: 'Kentät joita {role} rooli voi {action}.'
validation_for_role: 'Kentän sääntöjä {action} roolille {role} on noudatettava.'
presets_for_role: 'Kentän oletusarvot roolille {role}.'
presentation_and_aliases: Esitystapa & aliakset
revision_post_update: Tässä on miltä tämä kohde näytti päivityksen jälkeen...
changes_made: Nämä ovat mutokset jotka tarkalleenottaen tehtiin...
no_relational_data: Muista, että tämä ei sisällä relaatiotietoja.
hide_field_on_detail: Piilota kenttä yksityiskohdissa
show_field_on_detail: Näytä kenttä yksityiskohdissa
delete_field: Poista kenttä
@@ -363,7 +340,6 @@ no_files_copy: Täällä ei ole tiedostoja.
user_count: 'Ei käyttäjiä | Yksi käyttäjä | {count} käyttäjää'
no_users_copy: Tässä roolissa ei ole vielä käyttäjiä.
webhooks_count: 'Ei webhookkeja | Yksi webhookki | {count} webhookkia'
no_webhooks_copy: Webhookkeja ei ole vielä.
all_items: Kaikki kohteet
csv: CSV
no_collections: Ei kokoelmia
@@ -795,10 +771,8 @@ fields:
status: Tila
field_options:
directus_activity:
login: Kirjaudu sisään
create: Luo
update: Päivitä
delete: Poista
directus_collections:
track_activity_revisions: Seuraa tapahtumia ja versioita
only_track_activity: Seuraa vain tapahtumia

View File

@@ -19,6 +19,9 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: Publié
draft: Brouillon
archived: Archivé
edit_field: Modifier le champ
conditions: Conditions
maps: Cartes
@@ -38,6 +41,7 @@ role_name: Nom de rôle
branch: Branche
leaf: Feuille
indeterminate: Indéterminé
edit_collection: Modifier la collection
exclusive: Exclusif
children: Les enfants
db_only_click_to_configure: 'Base de données uniquement: cliquez pour configurer '
@@ -141,9 +145,9 @@ fields_for_role: 'Champs dont l''action « {action} » peut être effectué par
validation_for_role: 'Règles pour {action} le champ que le rôle {role} doit suivre.'
presets_for_role: 'Valeur par défaut du champ pour le rôle {role}.'
presentation_and_aliases: Présentation & Alias
revision_post_update: Voici à quoi ressemblait cet élément après la mise à jour...
changes_made: Voici les changements spécifiques qui ont été apportés...
no_relational_data: Gardez à l'esprit que cela n'inclut pas les données relationnelles.
revision_post_update: Voici à quoi ressemblait cet élément après la mise à jour.
changes_made: Vous trouverez ci-dessous les modifications spécifiques apportées à cette révision.
no_relational_data: Gardez à l'esprit que les données relationnelles ne sont pas incluses ici.
hide_field_on_detail: Masquer le champ dans le détail
show_field_on_detail: Afficher le champ dans le détail
delete_field: Supprimer le champ
@@ -381,7 +385,7 @@ no_files_copy: Il n'y a aucun fichier ici.
user_count: 'Aucun utilisateur | Un seul utilisateur | {count} utilisateurs'
no_users_copy: Il n'y a pas encore d'utilisateurs avec ce rôle.
webhooks_count: 'Aucun Webhooks | 1 Webhook | {count} Webhooks'
no_webhooks_copy: Il n'y a pas encore de webhooks.
no_webhooks_copy: Aucun webhooks n'a encore été configuré. Commencez par en créer un ci-dessous.
all_items: Tous les éléments
any: N'importe quel
csv: CSV
@@ -723,11 +727,28 @@ no_layout_collection_selected_yet: Aucune mise en page/collection sélectionnée
batch_delete_confirm: >-
Aucun élément na été sélectionné | Êtes-vous sûr de bien vouloir supprimer cet élément ? Vous ne pourrez pas revenir en arrière ! | Êtes-vous sûr de bien vouloir supprimer ces {count} éléments ? Vous ne pourrez pas revenir en arrière !
cancel: Annuler
no_upscale: Ne pas agrandir les images
collection: Collection
collections: Collections
singleton: Singleton
singleton_label: Est un objet unique
system_fields_locked: Les champs système sont verrouillés et ne peuvent pas être modifiés
directus_collection:
directus_activity: Journaux de responsabilité pour tous les événements
directus_collections: Configuration de la collection supplémentaire et métadonnées
directus_fields: Configuration supplémentaire des champs et métadonnées
directus_files: Métadonnées pour tous les fichiers gérés
directus_folders: Fournit des répertoires virtuels pour les fichiers
directus_migrations: Quelle version de la base de données que vous utilisez
directus_permissions: Sélectionner les permissions pour chaque groupe
directus_presets: Préréglages pour la collection par défaut et les signets
directus_relations: Configuration de la relation et métadonnées
directus_revisions: Instantanés de données pour toutes les activités
directus_roles: Groupes de permissions pour les utilisateurs système
directus_sessions: Informations sur la session utilisateur
directus_settings: Options de configuration du projet
directus_users: Utilisateurs du système pour la plateforme
directus_webhooks: Configuration des requêtes HTTP basées sur des événements
fields:
directus_activity:
item: Clé principale de l'élément
@@ -810,6 +831,8 @@ fields:
png: PNG
webP: WebP
tiff: Tiff
basemaps_raster: Raster
basemaps_tile: Raster TileJSON
basemaps_style: Style de Mapbox
mapbox_key: Jeton d'accès Mapbox
mapbox_placeholder: pk.eyJ1Ijo.....
@@ -865,16 +888,26 @@ field_options:
public_note_placeholder: Un message public court qui prend en charge le formatage des démarques...
security_divider_title: Sécurité
auth_password_policy:
none_text: Aucun - Non Recommandé
weak_text: Faible - 8 caractères minimum
strong_text: Fort Majuscules / minuscules / chiffres / spéciaux
storage_asset_presets:
fit:
contain_text: Contient (préserver le rapport d'aspect)
cover_text: Couverture (force la taille exacte)
fit_text: Ajuster l'intérieur
outside_text: Ajuster à l'extérieur
additional_transforms: Transformations supplémentaires
transforms_note: Le nom de la méthode Sharp et ses arguments. Voir https://sharp.pixelplumbing.com/api-constructor pour plus d'informations.
mapbox_key: Jeton d'accès Mapbox
mapbox_placeholder: pk.eyJ1Ijo.....
basemaps_raster: Raster
basemaps_tile: Raster TileJSON
basemaps_style: Style de Mapbox
files_divider_title: Fichiers et miniatures
overrides_divider_title: Remplacer les applications
directus_activity:
login: Se connecter
login: Identifiant
create: Créer
update: Mettre à jour
delete: Supprimer
@@ -920,7 +953,9 @@ field_options:
group_placeholder: Étiquetez ce groupe...
type_name: Type
choices_always: Toujours ouvert
choices_start_collapsed: Commencer à réduire
collections_name: Collections
collections_addLabel: Ajouter une collection...
directus_users:
preferences_divider: Préférences utilisateur
dropdown_auto: Automatique (Basé sur le système)
@@ -943,6 +978,7 @@ field_options:
actions_delete: Supprimer
actions_login: Identifiant
no_fields_in_collection: 'Il n''y a pas encore de champs dans "{collection}"'
no_value: Aucune valeur
do_nothing: Ne rien faire
generate_and_save_uuid: Générer et Enregistrer l'UUID
save_current_user_id: Enregistrer l'ID de l'utilisateur actuel
@@ -1054,6 +1090,7 @@ interfaces:
value_combining: Combinaison de valeurs
value_combining_note: Contrôle la valeur stockée lorsque des sélections imbriquées sont faites.
show_all: Tout afficher
show_selected: Afficher la sélection
input-code:
code: Code
description: Écrire ou partager des extraits de code
@@ -1149,8 +1186,20 @@ interfaces:
imageToken_label: Quel token (statique) ajouter aux sources d'images
map:
map: Carte
description: Sélectionnez un emplacement sur une carte
zoom: Zoom
geometry_type: Type de géométrie
geometry_format: Format géométrique
default_view: Vue par défaut
invalid_options: Options non valides
invalid_format: Format invalide ({format})
unexpected_geometry: '{expected} attendu, reçu {got}.'
fit_bounds: Ajuster la vue aux données
native: Natif
geojson: GeoJSON
lnglat: Longitude, Latitude
wkt: WKT
wkb: WKB
presentation-notice:
notice: Remarque
description: Afficher une courte remarque
@@ -1162,6 +1211,7 @@ interfaces:
system-folder:
folder: Dossier
description: Sélectionner un dossier
field_hint: Met les fichiers récemment téléchargés dans le dossier sélectionné. Cela n'affecte pas les fichiers existants qui sont sélectionnés.
root_name: Bibliothèque de fichiers racine
system_default: Paramètres par défaut du système
select-radio:
@@ -1243,6 +1293,10 @@ interfaces:
rate: Débit
group-raw:
name: Groupe brut
description: Rendre les champs tels qu'ils sont
group-detail:
name: Détail du groupe
description: Rendre les champs comme une section pliable
displays:
boolean:
boolean: Booléen
@@ -1352,3 +1406,4 @@ layouts:
map:
map: Carte
field: Géométrie
search_this_area: Chercher dans cette zone

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: ערוך שדה
half_width: חצי עמוד
full_width: רוחב מלא

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: एडिट फील्ड
item_revision: आइटम संशोधन
duplicate_field: डुप्लिकेट फ़ील्ड
@@ -123,7 +103,6 @@ fields_for_role: 'फ़ील्ड्स जो {role} भूमिका {action
validation_for_role: 'फील्ड {action} नियमों जो {role} भूमिका पालन करना चाहिए'
presets_for_role: '{role} भूमिका के लिए फ़ील्ड मान जो डिफ़ॉल्ट होगा'
presentation_and_aliases: प्रस्तुति और उपनाम
revision_post_update: यहां देखें कि अपडेट के बाद यह आइटम कैसा दिखता है
language: भाषा
global: ग्लोबल
admins_have_all_permissions: Admins के पास सभी अनुमतियां हैं
@@ -242,7 +221,8 @@ fields:
name: नाम
field_options:
directus_activity:
delete: डिलीट
create: Create
update: Update
directus_collections:
language: भाषा
archive_divider: आर्काइव

View File

@@ -1,24 +1,6 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
draft: Vázlat
archived: Archiválva
edit_field: Mező szerkesztése
conditions: Feltételek
maps: Térképek
@@ -36,7 +18,7 @@ enter_password_to_enable_tfa: Írja be jelszavát a kétfaktoros ellenőrzés be
add_field: Mező Hozzáadása
role_name: Szerepkör neve
branch: Ág
leaf: Falevél / Leaf
leaf: Leaf
indeterminate: Meghatározatlan
edit_collection: Gyűjtemény szerkesztése
exclusive: Kizárólagos
@@ -142,9 +124,6 @@ fields_for_role: 'A {role} szerepkör mezői a következő funkciót hajthatják
validation_for_role: 'A {action} mező szabályozza a {role} szerepek által követendő viselkedést.'
presets_for_role: 'A {role} szerepkör mezőértékeinek alapértelmezései.'
presentation_and_aliases: Prezentációk és Aliasok
revision_post_update: Ez az elem így nézett ki a frissítés után...
changes_made: Ezek a konkrét változtatások, melyeket elvégeztünk...
no_relational_data: Ne feledd, ez nem tartalmaz relációs adatokat!
hide_field_on_detail: Mező elrejtése a Részleteken
show_field_on_detail: Mező megjelenítése a Részleteken
delete_field: Mező törlése
@@ -381,14 +360,13 @@ no_files_copy: Nincsenek fileok.
user_count: 'Nincsenek felhasználók | Egy felhasználó | {count} felhasználó'
no_users_copy: Ez a szerepkör még egy felhasználóhoz sem lett hozzárendelve.
webhooks_count: 'Nincsenek webhookok | Egy webhook | {count} webhook'
no_webhooks_copy: Még nincsenek webhookok.
all_items: Minden elem
any: Bármely
csv: CSV
no_collections: Nincsenek gyűjtemények
create_collection: Gyűjtemény létrehozása
no_collections_copy_admin: Még nem hoztál létre gyűjteményt. Kattints az alábbi gombra a kezdéshez.
no_collections_copy: Még nem hoztál létre gyűjteményt. Lépj kapcsolatba a rendszeradminisztrátorral.
no_collections_copy: Ön még nem rendelkezik Gyűjteményekkel. Lépjen kapcsolatba a rendszeradminisztrátorral!
relationship_not_setup: Ez a kapcsolat nincs megfelelően beállítva
display_template_not_setup: A megjelenítő sablon nem megfelelően van beállítva
collection_field_not_setup: A gyűjtemény mező opció nem megfelelően van beállítva
@@ -545,7 +523,7 @@ upload_pending: Feltöltés folyamatban
drag_file_here: Dobj ide egy fájlt
click_to_browse: Kattints a böngészéshez
interface_options: Interfész opciók
layout_options: Elrendezési beállítások
layout_options: Elrendezés beállításai
rows: Sorok
columns: Oszlopok
collection_setup: Gyűjtemény beállítások
@@ -678,7 +656,7 @@ preset_name_placeholder: Alapértelmezettként szolgál, ha üres...
preset_search_placeholder: Keresési lekérdezés...
editing_preset: Alapértelmezés szerkesztése
layout_preview: Elrendezés előnézet
layout_setup: Elrendezés beállítás
layout_setup: További beállítások
unsaved_changes: Nem mentett módosítások
unsaved_changes_copy: Biztos, hogy elhagyja az oldalt?
discard_changes: Változtatások elvetése
@@ -754,7 +732,7 @@ fields:
$thumbnail: Miniatűr
title: Cím
description: Leírás
tags: Cimkék
tags: Címkék
location: Pozíció
storage: Tároló
filename_disk: Fájlnév (tárhely)
@@ -783,7 +761,7 @@ fields:
location: Pozíció
title: Cím
description: Leírás
tags: Cimkék
tags: Címkék
user_preferences: Felhasználói beállítások
language: Nyelv
theme: Téma
@@ -883,7 +861,7 @@ field_options:
files_divider_title: Fájlok és miniatűrök
overrides_divider_title: Alkalmazás felülbírálások
directus_activity:
login: Belépés
login: Bejelentkezés
create: Létrehozás
update: Frissítés
delete: Törlés
@@ -986,7 +964,7 @@ duplicate: Duplikálás
email: Email
embed: Beágyazás
fallback_icon: Tartalék ikon
field: mező | mezők
field: Mező | Mezők
file: File
file_library: Könyvtár
forgot_password: Elfelejtett jelszó
@@ -1201,7 +1179,7 @@ interfaces:
description: Válasszon számot csúszka segítségével
always_show_value: Mindig mutassa az értéket
tags:
tags: Cimkék
tags: Címkék
description: Címke megadása vagy kiválasztása
whitespace: Szóköz
hyphen: Helyettesítse kötőjellel
@@ -1361,7 +1339,7 @@ layouts:
cards:
cards: Kártya
image_source: Kép forrása
image_fit: Kép poziciója
image_fit: Kép pozíciója
crop: Vágás
contain: Tartalmaz
title: Cím
@@ -1372,7 +1350,7 @@ layouts:
spacing: Sorköz
comfortable: Kényelmes
compact: Kompakt
cozy: Kényelmes
cozy: Kellemes
calendar:
calendar: Naptár
start_date_field: Kezdő dátum mező

View File

@@ -1,34 +1,21 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Edit Kolom
conditions: Kondisi
maps: Peta
item_revision: Revisi Item
duplicate_field: Kolom Duplikat
half_width: Lebar Setengah
full_width: Lebar Penuh
limit: Batas
group: Grup
and: Dan
or: Atau
fill_width: Lebar Penuh
field_name_translations: Terjemahan Nama Kolom
enter_password_to_enable_tfa: Masukkan password anda untuk Two-Factor Authentication
add_field: Tambah Kolom
role_name: Nama Peran
branch: Cabang
db_only_click_to_configure: 'Khusus Database: Tekan Untuk Konfigurasi '
show_archived_items: Tampilkan Yang Diarsipkan
edited: Nilai Diedit
@@ -125,9 +112,6 @@ fields_for_role: 'Baris {role} Peran dapat {action}.'
validation_for_role: 'Aturan baris {action} Peran {role} harus tunduk.'
presets_for_role: 'Nilai bawaan baris untuk Peran {role}.'
presentation_and_aliases: Presentasi & Alias
revision_post_update: Ini adalah bagaimana item ini terlihat setelah pembaruan...
changes_made: Ini adalah perubahan spesifik yang telah dibuat...
no_relational_data: Untuk catatan bahwa ini tidak termasuk data relasional.
hide_field_on_detail: Sembunyikan Baris pada Rincian
show_field_on_detail: Tampilkan Baris pada Rincian
delete_field: Hapus Baris
@@ -362,7 +346,6 @@ no_files_copy: Tidak ada berkas disini.
user_count: 'Tidak Ada Pengguna | Satu Pengguna | {count} Pengguna'
no_users_copy: Belum ada pengguna didalam peran ini.
webhooks_count: 'Tidak Ada Webhook | Satu Webhook | {count} Webhook'
no_webhooks_copy: Belum ada webhook.
all_items: Semua Item
csv: CSV
no_collections: Tidak ada koleksi
@@ -430,11 +413,22 @@ copy_details: Salin Rincian
no_app_access: Tidak Ada Akses Aplikasi
no_app_access_copy: Pengguna ini tidak diperbolehkan untuk menggunakan aplikasi admin.
back: Kembali
rotate: Putar
all_users: Semua Pengguna
delete_collection: Hapus Koleksi
update_collection_success: Perbarui Koleksi
placeholder: Tulisan default pada input
icon_left: Ikon Kiri
icon_right: Ikon Kanan
font: Huruf
sans_serif: Sans Serif
serif: Serif
monospace: Monospace
divider: Pembagi/Pemecah
color: Warna
circle: Lingkaran
advanced_filter: Filter Lanjutan
delete_advanced_filter: Hapus Filter
operators:
lt: Kurang dari
gt: Lebih besar dari
@@ -448,9 +442,11 @@ operators:
empty: Kosong
nempty: Tidak kosong
loading: Memuat...
layout_options: Pilihan Tata Letak
value_unique: Nilai harus unik
display_template: Tampilan Template
no_results: Tidak Ada Hasil
saves_automatically: Menyimpan Secara Otomatis
role: Peran
create: Buat
on_update: Saat Pembaruan
@@ -473,6 +469,7 @@ editing_in_batch: 'Mengedit Masal {count} item'
settings_permissions: Peran dan Izin
settings_project: Pengaturan Proyek
settings_webhooks: Webhooks
scope: Lingkup
discard_changes: Batalkan Perubahan
keep_editing: Tetap Mengedit
add_new: Tambah Baru
@@ -541,10 +538,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Masuk
create: Buat
update: Perbarui
delete: Hapus
directus_collections:
language: Bahasa
archive_divider: Arsip
@@ -561,6 +556,7 @@ field_options:
actions_create: Buat
actions_update: Perbarui
comment: Komentar
editing_role: 'Peraturan {role}'
delete_field_are_you_sure: >-
Apakah Anda yakin Anda ingin menghapus bidang "{field}" ini? Tindakan ini tidak dapat dikembalikan.
description: Deskripsi
@@ -655,6 +651,8 @@ displays:
filesize: Ukuran Berkas
icon:
icon: Ikon
image:
circle: Lingkaran
labels:
choices_value_placeholder: Masukkan sebuah nilai...
user:

View File

@@ -19,10 +19,16 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: Pubblicato
draft: Bozza
archived: Archiviato
module_bar: Barra del modulo
tile_size: Dimensione della casella
edit_field: Modifica campo
conditions: Condizioni
maps: Mappe
item_revision: Revisione elemento
enter_a_name: Inserisci un nome...
duplicate_field: Campo duplicato
half_width: Metà larghezza
full_width: Larghezza Massima
@@ -53,6 +59,7 @@ create_user: Crea utente
create_webhook: Crea webhook
invite_users: Invita utenti
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
url_example: "https://example.com"
invite: Invita
email_already_invited: Email "{email}" è già stata invitata
emails: Email
@@ -142,9 +149,9 @@ fields_for_role: 'Campi che il ruolo {role} può {action}.'
validation_for_role: 'Regole per il campo {action} che il ruolo {role} deve rispettare.'
presets_for_role: 'Valore predefinito del campo per il ruolo {role}.'
presentation_and_aliases: Presentazione e Alias
revision_post_update: Ecco come appariva questo elemento dopo l'aggiornamento...
changes_made: Questi sono i cambiamenti specifici che sono stati fatti...
no_relational_data: Tieni presente che questo non include dati relazionali.
revision_post_update: Ecco come appariva questo elemento dopo l'aggiornamento.
changes_made: Di seguito sono riportate le modifiche apportate in questa revisione.
no_relational_data: Ricorda che qui i dati relazionali non sono inclusi.
hide_field_on_detail: Nascondi campo nel dettaglio
show_field_on_detail: Mostra campo nel dettaglio
delete_field: Elimina campo
@@ -211,6 +218,8 @@ add_m2m_to_collection: 'Aggiungi Many-to-Many a "{collection}"'
choose_a_type: Seleziona un Tipo...
determined_by_relationship: Determinato dalla Relazione
add_note: Aggiungi una nota utile per gli utenti ...
add_link: Aggiungi link
custom_link: Link personalizzato
default_value: Valore predefinito
standard_field: Campo Standard
single_file: File Singolo
@@ -382,7 +391,7 @@ no_files_copy: Non ci sono file qui.
user_count: 'Nessun Utente | Un Utente | {count} Utenti'
no_users_copy: Non ci sono ancora utenti in questo ruolo.
webhooks_count: 'Nessun webhook | 1 Webhook | {count} Webhook'
no_webhooks_copy: Non ci sono ancora webhook.
no_webhooks_copy: Non sono ancora stati configurati webhook. Inizia creandone uno qui sotto.
all_items: Tutti gli Elementi
any: Qualsiasi
csv: CSV
@@ -730,6 +739,22 @@ collections: Raccolte
singleton: Singleton
singleton_label: Tratta come oggetto singolo
system_fields_locked: I campi di sistema sono bloccati e non possono essere modificati
directus_collection:
directus_activity: Log autorizzazioni per tutti gli eventi
directus_collections: Configurazione e metadati aggiuntivi della raccolta
directus_fields: Configurazione e metadati aggiuntivi del campo
directus_files: Metadati per tutti i file degli asset gestiti
directus_folders: Fornisce directory virtuali per i file
directus_migrations: Quale versione del database stai usando
directus_permissions: Autorizzazioni di accesso per ciascun ruolo
directus_presets: Preset per i default della raccolta e i segnalibri
directus_relations: Configurazione e metadati della relazione
directus_revisions: Snapshot dei dati per tutte le attività
directus_roles: Gruppi di autorizzazioni per gli utenti di sistema
directus_sessions: Informazioni sulla sessione dell'utente
directus_settings: Opzioni di configurazione del progetto
directus_users: Utenti di sistema per la piattaforma
directus_webhooks: Configurazione per le richieste HTTP basate su eventi
fields:
directus_activity:
item: Chiave primaria elemento
@@ -888,7 +913,7 @@ field_options:
files_divider_title: File e miniature
overrides_divider_title: Personalizzazioni App
directus_activity:
login: Accesso
login: Accedi
create: Creare
update: Aggiornare
delete: Elimina
@@ -960,6 +985,7 @@ field_options:
actions_delete: Elimina
actions_login: Accedi
no_fields_in_collection: 'Non ci sono ancora campi in "{collection}"'
no_value: Nessun valore
do_nothing: Non Fare Niente
generate_and_save_uuid: Genera e Salva UUID
save_current_user_id: Salva l'Id Utente Attuale
@@ -1038,7 +1064,6 @@ require_value_to_be_set: Richiedi di impostare il valore
translation: Traduzione
value: Valore
view_project: Visualizza Progetto
weeks: { }
report_error: Segnala l'errore
start: Inizio
interfaces:
@@ -1404,3 +1429,5 @@ layouts:
invalid_geometry: Geometria non valida
auto_location_filter: Filtra sempre i dati al rettangolo di selezione
search_this_area: Cerca in quest'area
clear_data_filter: Rimuovi il filtro sui dati
clear_location_filter: Rimuovi il filtro sulla posizione

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: フィールドの編集
item_revision: 履歴
full_width: 最大幅
@@ -384,10 +364,8 @@ fields:
status: ステータス
field_options:
directus_activity:
login: ログイン
create: 作成
update: 更新
delete: 削除
directus_collections:
collection_setup: コレクションの作成
singleton: シングルオブジェクトに設定する

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: 필드 편집
item_revision: 아이템 리비전
duplicate_field: 중복 필드

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Redaguoti lauką
item_revision: Elemento pakeitimai
duplicate_field: Dubliuoti lauką
@@ -133,9 +113,6 @@ fields_for_role: 'Laukai, kuriuos {role} vaidmuo gali {action}.'
validation_for_role: 'Lauko {action} taisyklės, kurių {role} vaidmuo turi laikytis.'
presets_for_role: 'Lauko vertė pagal nutylėjimą {role} vaidmeniui.'
presentation_and_aliases: Atvaizdavimas ir sinonimai
revision_post_update: Taip šis elementas atrodė po paskutinio atnaujinimo...
changes_made: Tai yra konkretūs atlikti pakeitimai...
no_relational_data: Atminkite, kad neįtraukiami sąryšių duomenys.
hide_field_on_detail: Slėpti lauką detalėse
show_field_on_detail: Rodyti lauką detalėse
delete_field: Trinti lauką
@@ -358,7 +335,6 @@ no_files_copy: Nėra failų.
user_count: 'Nėra vartotojų | Vienas vartotojas | {count} vartotojų'
no_users_copy: Nėra vartotojų šioje grupėje.
webhooks_count: 'Nėra "Webhook"ų | Vienas "Webhook"as | {count} "Webhook"ų"'
no_webhooks_copy: Dar nėra sukurta "Webhook"ų.
all_items: Visi elementai
csv: CSV
no_collections: Nėra kolekcijų
@@ -739,7 +715,6 @@ fields:
status: Būsena
field_options:
directus_activity:
login: Prisijungti
create: Kurti
update: Atnaujinti
directus_collections:

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Талбарыг засах
item_revision: Хяналт
duplicate_field: Талбарыг хувилах

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Sunting halaman
item_revision: Barang semakan
duplicate_field: Halaman salinan
@@ -152,10 +132,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Log masuk
create: Cipta
update: Kemaskini
delete: Padam
directus_roles:
fields:
name_name: Nama

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Veld Bewerken
conditions: Voorwaarden
item_revision: Item revisie
@@ -137,9 +117,6 @@ fields_for_role: 'Velden die de rol "{role}" kan {action}.'
validation_for_role: 'Veld {action} regels die de rol "{role}" moet gehoorzamen.'
presets_for_role: 'Standaardwaarden voor de velden voor rol {role}.'
presentation_and_aliases: Presentatie & Aliasen
revision_post_update: Hier is hoe dit item eruit zag na de update...
changes_made: Dit zijn de specifieke wijzigingen die zijn aangebracht...
no_relational_data: Houd er rekening mee dat dit geen relationele gegevens omvat.
hide_field_on_detail: Veld Verbergen
show_field_on_detail: Veld Tonen
delete_field: Veld Verwijderen
@@ -376,7 +353,6 @@ no_files_copy: Er zijn geen bestanden hier.
user_count: 'Geen gebruikers | Één gebruiker | {count} gebruikers'
no_users_copy: Er zijn nog geen gebruikers in deze rol.
webhooks_count: 'Geen webhooks | 1 Webhook | {count} Webhooks'
no_webhooks_copy: Er zijn nog geen webhooks.
all_items: Alle items
csv: CSV
no_collections: Geen collecties
@@ -816,10 +792,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Login
create: Maak
update: Updaten
delete: Verwijder
directus_collections:
track_activity_revisions: Track Activiteiten & Revisies
only_track_activity: Track alleen activiteiten

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Rediger felt
item_revision: Element revisjoner
duplicate_field: Dupliser felt
@@ -119,9 +99,6 @@ fields_for_role: 'Felter {role} rollen kan {action}.'
validation_for_role: 'Felt {action} regler {role} rollen må følge.'
presets_for_role: 'Felt standardverdi for rollen {role}.'
presentation_and_aliases: Presentation & Aliaser
revision_post_update: Her er hvordan dette produktet så ut etter oppdateringen...
changes_made: Dette er de spesifikke endringene som ble gjort...
no_relational_data: Husk at dette ikke inkluderer relasjonsdata.
hide_field_on_detail: Skjul felt ved detaljert visning
show_field_on_detail: Vis felt ved detaljert visning
delete_field: Slett felt
@@ -301,7 +278,6 @@ no_files_copy: Det er ingen filer her.
user_count: 'Ingen brukere | En bruker | {count} brukere'
no_users_copy: Det er ingen brukere i denne rollen enda.
webhooks_count: 'Ingen Webhooks | En Webhook | {count} Webhooks'
no_webhooks_copy: Det finnes ingen webhooks ennå.
all_items: Alle elementer
csv: CSV
no_collections: Ingen kolleksjoner
@@ -440,10 +416,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Logg inn
create: Opprett
update: Oppdater
delete: Slett
directus_collections:
language: Språk
archive_divider: Arkiv

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Edytuj pole
maps: Mapy
item_revision: Wersja elementu
@@ -141,9 +121,6 @@ fields_for_role: 'Pola roli {role} mogą {action}.'
validation_for_role: 'Pole {action} zasad roli {role} musi być przestrzegane.'
presets_for_role: 'Wartość domyślna dla roli {role}.'
presentation_and_aliases: Prezentacja i aliasy
revision_post_update: Oto jak wyglądał ten element po aktualizacji...
changes_made: To są konkretne zmiany, które zostały wprowadzone...
no_relational_data: Pamiętaj, że nie obejmuje to danych relacyjnych.
hide_field_on_detail: Ukryj pole w szczegółach
show_field_on_detail: Pokaż pole w szczegółach
delete_field: Usuń pole
@@ -381,7 +358,6 @@ no_files_copy: Brak plików.
user_count: 'Brak użytkowników | Jeden użytkownik | {count} użytkowników'
no_users_copy: Nie ma jeszcze użytkowników w tej roli.
webhooks_count: 'Brak webhooków | Jeden Webhook | {count} Webhooków'
no_webhooks_copy: Brak webhooków.
all_items: Wszystkie elementy
any: Dowolny
csv: CSV
@@ -823,10 +799,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Zaloguj się
create: Stwórz
update: Zaktualizuj
delete: Usuń
directus_collections:
track_activity_revisions: Śledź aktywność i rewizje
only_track_activity: Tylko Śledź Aktywność

View File

@@ -1,25 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: Publicado
draft: Rascunho
archived: Arquivado
edit_field: Editar campo
@@ -55,7 +34,7 @@ create_role: Criar Função
create_user: Criar usuário
create_webhook: Criar Webgancho
invite_users: Convidar Usuários
email_examples: "admin{'@'}exemplo.com, usuário{'@'}exemplo.com..."
email_examples: "admin{'@'}exemplo.com, usuario{'@'}exemplo.com..."
invite: Convidar
email_already_invited: Um convite já foi enviado para o email "{email}"
emails: Emails
@@ -145,9 +124,6 @@ fields_for_role: 'Campos que o cargo {role} pode {action}.'
validation_for_role: 'As regras {action} do campo que o papel {role} deve obedecer.'
presets_for_role: 'Valores de campo padrões para a função {role}.'
presentation_and_aliases: Apresentação e pseudônimos
revision_post_update: Aqui está como este item ficou após a atualização...
changes_made: Estas são as mudanças específicas que foram feitas...
no_relational_data: Tenha em mente que isso não inclui dados relacionais.
hide_field_on_detail: Ocultar Campo em Detalhes
show_field_on_detail: Exibir Campo em Detalhes
delete_field: Excluir campo
@@ -385,7 +361,6 @@ no_files_copy: Ainda não há arquivos aqui.
user_count: 'Nenhum usuário | Um usuário | {count} usuários'
no_users_copy: Não há usuários neste cargo ainda.
webhooks_count: 'Nenhum Webhook | Um Webhook | {count} Webhooks'
no_webhooks_copy: Ainda não possui Webhooks.
all_items: Todos os itens
any: Qualquer
csv: CSV
@@ -852,7 +827,7 @@ fields:
collection_list: Navegação da Coleção
directus_webhooks:
name: Nome
method: Método
method: Método
status: Status
data: Dados
data_label: Enviar Dados do Evento
@@ -867,7 +842,6 @@ field_options:
files_divider_title: Arquivos e Miniaturas
overrides_divider_title: Substituições de Aplicativos
directus_activity:
login: Entrar
create: Criar
update: Alteração
delete: Excluir

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Editar campo
conditions: Condições
item_revision: Revisão do documento
@@ -137,9 +117,6 @@ fields_for_role: 'Campos que o estatuto {role} pode {action}.'
validation_for_role: 'As regras {action} do campo que a função {role} deve obedecer.'
presets_for_role: 'Valor do Campo definido por padrão para a função {role}.'
presentation_and_aliases: Apresentação & Pseudônimos
revision_post_update: Aqui está como este documento ficou após a atualização...
changes_made: Estas são as mudanças específicas que foram feitas...
no_relational_data: Tenha em atenção que isto não inclui dados relacionais.
hide_field_on_detail: Ocultar campo dentro de Detalhe
show_field_on_detail: Mostrar campo dentro de Detalhe
delete_field: Remover campo
@@ -375,7 +352,6 @@ no_files_copy: Não existem ficheiros aqui.
user_count: 'Nenhum utilizador | Um utilizador | {count} utilizadores'
no_users_copy: Ainda não existem utilizadores neste estatuto.
webhooks_count: 'Nenhum webhook | Um webhook | {count} webhooks'
no_webhooks_copy: Ainda não existem webhooks.
all_items: Todos os documentos
csv: CSV
no_collections: Nenhuma coleção
@@ -637,10 +613,6 @@ fields:
name: Nome
status: Estado
field_options:
directus_activity:
create: Criar
update: Atualizar
delete: Remover
directus_collections:
track_activity_revisions: Rastrear Atividades e Revisões
only_track_activity: Apenas rastrear Atividade

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Editează câmp
item_revision: Revizuire element
duplicate_field: Duplicare câmp

View File

@@ -19,10 +19,16 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: Опубликовано
draft: Черновик
archived: В архиве
module_bar: Панель модулей
tile_size: Размер тайла
edit_field: Редактировать поле
conditions: Условия
maps: Карты
item_revision: Редакция
enter_a_name: Введите название...
duplicate_field: Клонировать поле
half_width: Полширины
full_width: Вся ширина
@@ -36,7 +42,10 @@ enter_password_to_enable_tfa: Введите свой пароль для вкл
add_field: Добавить поле
role_name: Название роли
branch: Ветка
leaf: Лист
indeterminate: Неопределенный
edit_collection: Изменить коллекцию
exclusive: Эксклюзивный
children: Дочерние элементы
db_only_click_to_configure: 'Только База данных: Нажмите для Настройки '
show_archived_items: Показать элементы в архиве
@@ -50,6 +59,7 @@ create_user: Создать пользователя
create_webhook: Создать веб-хук
invite_users: Пригласить пользователей
email_examples: "admin{'@'}example.com, user{'@'}example.com..."
url_example: "https://example.com"
invite: Пригласить
email_already_invited: На адрес "{email}" уже было отправлено приглашение
emails: Email-адреса
@@ -139,9 +149,9 @@ fields_for_role: 'Поля, которые Роль {role} может {action}.'
validation_for_role: 'Правила {action} поля, которые Роль {role} должна соблюдать.'
presets_for_role: 'Значения поля по умолчанию для Роли {role}.'
presentation_and_aliases: Представление и Алиасы
revision_post_update: Вот как этот элемент выглядел после обновления...
changes_made: Вот конкретные изменения, которые были сделаны...
no_relational_data: Помните, что это не включает относительные данные.
revision_post_update: Вот как этот элемент выглядел после обновления.
changes_made: Ниже приведены конкретные изменения, внесенные в эту редакцию.
no_relational_data: Имейте в виду, что реляционные данные здесь не включены.
hide_field_on_detail: Скрыть Поле в Карточке
show_field_on_detail: Показать Поле в Карточке
delete_field: Удалить поле
@@ -157,6 +167,7 @@ exposure: Экспозиция
shutter: Затвор
iso: ISO
focal_length: Фокусное Расстояние
schema_setup_key: Имя столбца базы данных этого поля и API ключ
create_field: Создать Поле
creating_new_field: 'Новое Поле ({collection})'
field_in_collection: '{field} ({collection})'
@@ -197,6 +208,7 @@ click_to_manage_translated_fields: >-
Полей перевода пока нет. Нажмите здесь, чтобы создать их. | Есть одно поле перевода. Нажмите здесь, чтобы управлять им. | Есть {count} полей перевода. Нажмите здесь, чтобы управлять ими.
fields_group: Группа Полей
no_collections_found: Нет найденных коллекций.
new_data_alert: 'В вашей модели данных будет создано следующее:'
search_collection: Поиск коллекций...
new_field: 'Новое поле'
new_collection: 'Новая коллекция'
@@ -206,6 +218,8 @@ add_m2m_to_collection: 'Добавить Many-to-Many в "{collection}"'
choose_a_type: Выберите Тип...
determined_by_relationship: Определяется отношением
add_note: Добавить заметку для пользователей...
add_link: Добавить ссылку
custom_link: Пользовательская ссылка
default_value: Значение По умолчанию
standard_field: Стандартное Поле
single_file: Один Файл
@@ -377,7 +391,7 @@ no_files_copy: Здесь нет файлов.
user_count: 'Нет Пользователей | Один Пользователь | {count} Пользователей'
no_users_copy: В этой роли пока нет пользователей.
webhooks_count: 'Нет Веб-хуков | Один Веб-хук | {count} Веб-хуков'
no_webhooks_copy: Веб-хуков пока нет.
no_webhooks_copy: Веб-хуки еще не настроены. Начните с создания одного из них ниже.
all_items: Все Элементы
any: Любой
csv: CSV
@@ -403,6 +417,7 @@ documentation: Документация
sidebar: Боковая панель
duration: Продолжительность
charset: Кодировка
second: секунда
file_moved: Файл Перемещен
collection_created: Коллекция Создана
modified_on: Дата изменения
@@ -486,6 +501,7 @@ system_collections: Системные коллекции
placeholder: Плейсхолдер
icon_left: Значок слева
icon_right: Значок справа
count_other_revisions: '{count} других редакций'
font: Шрифт
sans_serif: Sans Serif
serif: Serif
@@ -524,6 +540,8 @@ operators:
has: Содержит некоторые из этих ключей
intersects: Пересекает
nintersects: Не пересекает
intersects_bbox: Пересекает ограничивающую рамку
nintersects_bbox: Не пересекает ограничивающую рамку
loading: Загрузка...
drop_to_upload: Перетащите для Загрузки
item: Элемент
@@ -546,6 +564,8 @@ value_unique: Значение должно быть уникальным
all_activity: Вся Активность
create_item: Создать Элемент
display_template: Шаблон отображения
language_display_template: Шаблон отображения языка
translations_display_template: Шаблон отображения переводов
n_items_selected: 'Не Выбраны Элементы | Выбран 1 Элемент | Выбрано {n} Элементов'
per_page: На Страницу
all_files: Все Файлы
@@ -565,6 +585,7 @@ user: Пользователь
no_presets: Нет Пресетов
no_presets_copy: Пресеты или закладки пока не были сохранены.
no_presets_cta: Добавить Пресет
presets_only: Только пресеты
create: Создать
on_create: При Создании
on_update: Во время обновления
@@ -665,6 +686,7 @@ select: Выбрать...
layout: Макет
tree_view: В виде дерева
changes_are_permanent: Изменения необратимы
preset_name_placeholder: Используется по умолчанию, когда пусто...
preset_search_placeholder: Строка поиска...
editing_preset: Редактирование Пресета
layout_preview: Предпросмотр Макета
@@ -711,11 +733,28 @@ no_layout_collection_selected_yet: Макет/коллекция пока не
batch_delete_confirm: >-
Никаких элементов не выбрано | Вы уверены, что хотите удалить этот элемент? Это действие не может быть отменено. | Вы уверены, что хотите удалить эти элементы {count}? Это действие не может быть отменено.
cancel: Отмена
no_upscale: Не масштабировать изображения
collection: Коллекция
collections: Коллекции
singleton: Синглтон
singleton_label: Считать одним объектом
system_fields_locked: Системные поля заблокированы и не могут быть изменены
directus_collection:
directus_activity: Журналы отчетности по всем событиям
directus_collections: Дополнительные настройки коллекции и метаданные
directus_fields: Дополнительные настройки полей и метаданные
directus_files: Метаданные для всех управляемых файлов
directus_folders: Предоставляет виртуальные папки для файлов
directus_migrations: Какую версию базы данных вы используете
directus_permissions: Права доступа для каждой роли
directus_presets: Пресеты для коллекций по умолчанию и закладки
directus_relations: Настройки связей и метаданные
directus_revisions: Снимки данных для всех действий
directus_roles: Группы разрешений для системных пользователей
directus_sessions: Информация о сеансе пользователя
directus_settings: Параметры конфигурации проекта
directus_users: Системные пользователи для платформы
directus_webhooks: Конфигурация для HTTP-запросов на основе событий
fields:
directus_activity:
item: Ключ Элемента
@@ -739,6 +778,7 @@ fields:
archive_value: Значение для архива
unarchive_value: Значение для извлеченных из архива
sort_field: Поле сортировки
accountability: Отслеживание активности и редакций
directus_files:
$thumbnail: Миниатюра
title: Заголовок
@@ -797,6 +837,13 @@ fields:
png: PNG
webP: WebP
tiff: Tiff
basemaps_raster: Растр
basemaps_tile: Растр TileJSON
basemaps_style: Стиль Mapbox
mapbox_key: Токен доступа Mapbox
mapbox_placeholder: pk.eyJ1Ijo.....
transforms_note: Имя метода Sharp и его аргументы. Дополнительную информацию см. в https://sharp.pixelplumbing.com/api-constructor.
additional_transforms: Дополнительные преобразования
project_name: Название проекта
project_url: URL проекта
project_color: Цвет Проекта
@@ -842,7 +889,27 @@ fields:
actions: Действия
field_options:
directus_settings:
project_name_placeholder: Мой проект
project_logo_note: Фон логина и логотипа
public_note_placeholder: Короткое, публичное сообщение, которое поддерживает markdown форматирование...
security_divider_title: Безопасность
auth_password_policy:
none_text: Нет — не рекомендуется
weak_text: Слабый минимум 8 символов
strong_text: Крепкий строчные, прописные, цифры, специальные
storage_asset_presets:
fit:
contain_text: Вместить (с сохранением пропорций)
cover_text: Покрыть (точный размер)
fit_text: Поместить внутри
outside_text: Поместить вне
additional_transforms: Дополнительные преобразования
transforms_note: Имя метода Sharp и его аргументы. Дополнительную информацию см. в https://sharp.pixelplumbing.com/api-constructor.
mapbox_key: Токен доступа Mapbox
mapbox_placeholder: pk.eyJ1Ijo.....
basemaps_raster: Растр
basemaps_tile: Растр TileJSON
basemaps_style: Стиль Mapbox
files_divider_title: Файлы и миниатюры
overrides_divider_title: Переопределить заводские настройки
directus_activity:
@@ -855,25 +922,45 @@ field_options:
only_track_activity: Отслеживать только активность
do_not_track_anything: Ничего не отслеживать
collection_setup: Настройки Коллекции
note_placeholder: Описание этой коллекции...
hidden_label: Скрыть в приложении
singleton: Считать одним объектом
language: Язык
translation: Введите перевод...
archive_divider: Архив
archive_field: Выберите поле...
archive_app_filter: Включить фильтр архива приложения
archive_value: Значение, установленное при архивировании...
unarchive_value: Значение, установленное при разархивировании...
divider: Сортировать
sort_field: Выберите поле...
accountability_divider: Подотчетность
directus_files:
title: Уникальное название...
description: Описание (необязательно)...
location: Необязательная локация...
storage_divider: Именование файлов
filename_disk: Имя на диске...
filename_download: Имя при загрузке...
directus_roles:
name: Уникальное имя для этой роли...
description: Описание этой роли...
ip_access: Добавьте разрешенные IP-адреса, оставьте поле пустым, чтобы разрешить все...
fields:
icon_name: Иконка
name_name: Имя
name_placeholder: Введите название...
link_name: Ссылка
link_placeholder: Относительный или абсолютный URL...
collection_list:
group_name_addLabel: Добавить новую группу...
fields:
group_name: Название группы
group_placeholder: Обозначьте эту группу...
type_name: Тип
choices_always: Всегда открыто
choices_start_open: Раскрыта
choices_start_collapsed: Начать свернутым
collections_name: Коллекции
collections_addLabel: Добавить коллекцию...
directus_users:
@@ -898,6 +985,7 @@ field_options:
actions_delete: Удалить
actions_login: Войти
no_fields_in_collection: 'В коллекции "{collection}" пока нет полей'
no_value: Нет значения
do_nothing: Ничего не Делать
generate_and_save_uuid: Создать и Сохранить UUID
save_current_user_id: Сохранить ID Текущего Пользователя
@@ -906,13 +994,17 @@ save_current_datetime: Сохранить Текущую Дату/Время
block: Блокировать
inline: Строчный
comment: Комментарий
relational_triggers: Реляционные триггеры
referential_action_field_label_m2o: При удалении {collection}...
referential_action_field_label_o2m: При отмене выбора {collection}...
referential_action_no_action: Предотвратить удаление
referential_action_cascade: Удалить элемент {collection} (cascade)
referential_action_set_null: Обнулить поле {field}
referential_action_set_default: Установить полю {field} значение по умолчанию
choose_action: Выбрать действие
continue_label: Продолжить
continue_as: >-
{name} в настоящее время аутентифицирован. Если вы узнаете этот аккаунт, нажмите продолжить.
editing_role: '{role} Роль'
creating_webhook: Создание Веб-хука
default_label: По умолчанию
@@ -968,6 +1060,7 @@ sort_direction: Направление сортировки
sort_asc: По Возрастанию
sort_desc: По Убыванию
template: Шаблон
require_value_to_be_set: Требовать установки значения
translation: Перевод
value: Значение
view_project: Просмотр Проекта
@@ -1033,6 +1126,7 @@ interfaces:
use_24: Использовать 24-Часовой Формат
system-display-template:
display-template: Шаблон отображения
description: Смешивать статический текст и динамические значения полей
collection_field: Поле коллекции
collection_field_not_setup: Опция поля коллекции настроена некорректно
select_a_collection: Выберите Коллекцию
@@ -1083,6 +1177,7 @@ interfaces:
description: Окно выбора параметров интерфейса
list-m2m:
many-to-many: Многие ко Многим
description: Выберите несколько связанных элементов
select-dropdown-m2o:
many-to-one: Многие к Одному
description: Выберите один связанный элемент
@@ -1106,6 +1201,7 @@ interfaces:
invalid_options: Некорректные настройки
invalid_format: Некорректный формат ({format})
unexpected_geometry: Ожидалось {expected}, а встретилось {got}.
fit_bounds: Подогнать вид по размеру данных
native: Родной
geojson: GeoJSON
lnglat: Долгота, широта (Lon, Lat)
@@ -1130,6 +1226,7 @@ interfaces:
description: Выбор одного из нескольких вариантов
list:
repeater: Повторитель
description: Создать несколько записей одной структуры
edit_fields: Редактировать поля
add_label: 'Ярлык «Создать новый»'
field_name_placeholder: Введите название поля...
@@ -1196,11 +1293,16 @@ interfaces:
options_override: Переопределение параметров
input-autocomplete-api:
input-autocomplete-api: Автоматическое дополнение ввода (API)
description: Автодополнение значений поиска через внешний API.
results_path: Путь к результатам
value_path: Путь значения
trigger: Триггер
rate: Рейтинг
group-raw:
name: Необработанная группа
description: Отображать поля как есть
group-detail:
name: Детали группы
description: Отображать поля как сворачиваемую секцию
show_header: Показывать заголовок группы
header_icon: Иконка заголовка
@@ -1231,6 +1333,8 @@ displays:
datetime: Дата и время
description: Показывать значения, относящиеся ко времени
format: Формат
format_note: >-
Пользовательский формат принимает __[Date Field Symbol Table](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table)__
long: Длинный
short: Короткий
relative: Относительный
@@ -1323,4 +1427,7 @@ layouts:
cluster_maxzoom: Максимальный масштаб для кластеров
field: Геометрия
invalid_geometry: Некорректная геометрия
auto_location_filter: Всегда фильтровать данные к границам отображения
search_this_area: Искать в этой области
clear_data_filter: Очистить фильтр данных
clear_location_filter: Очистить фильтр местоположения

View File

@@ -1,24 +1,6 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
draft: Osnutek
archived: Arhivirano
edit_field: Uredi polje
conditions: Pogoji
maps: Zemljevidi
@@ -38,6 +20,7 @@ role_name: Ime vloge
branch: Veja
leaf: List
indeterminate: Nedoločeno
edit_collection: Uredi zbirko
exclusive: Ekskluzivno
children: Podrejeni
db_only_click_to_configure: 'Samo podatkovna baza: konfiguriraj '
@@ -141,9 +124,6 @@ fields_for_role: 'Polja, nad katerimi lahko vloga {role} opravlja akcijo {action
validation_for_role: 'Pravila, ki jih mora upoštevati vloga {role} za polje {action}.'
presets_for_role: 'Privzete vrednosti vloge {role} za polje.'
presentation_and_aliases: Predstavitev in aliasi
revision_post_update: Tako je zapis zgledal po popravku ...
changes_made: To so narejeni popravki ...
no_relational_data: Upoštevajte, da to ne vključuje relacijskih podatkov.
hide_field_on_detail: Skrij polje v podrobnem pogledu
show_field_on_detail: Prikaži polje v podrobnem pogledu
delete_field: Izbriši polje
@@ -381,7 +361,6 @@ no_files_copy: Ni datotek.
user_count: 'Ni uporabnikov | En uporabnik | Dva uporabnika | Trije uporabniki | Štirje uporabniki | {count} uporabnikov'
no_users_copy: Ta vloga še nima uporabnikov.
webhooks_count: 'Ni prožilnikov | En prožilnik | Dva prožilnika | Trije prožilniki | Štirje prožilniki | {count} prožilnikov'
no_webhooks_copy: Prožilniki ne obstajajo.
all_items: Vsi zapisi
any: Katerokoli
csv: CSV
@@ -556,7 +535,7 @@ create_item: Ustvari zapis
display_template: Prikaži predlogo
language_display_template: Predloga prikaza jezika
translations_display_template: Predloga prikaza prevodov
n_items_selected: 'Noben zapis ni izbran | 1 zaois je izbran | {n} zapisov izbranih'
n_items_selected: 'Noben zapis ni izbran | 1 zapis je izbran | {n} zapisov izbranih'
per_page: Na stran
all_files: Vse datoteke
my_files: Moje datoteke
@@ -723,6 +702,7 @@ no_layout_collection_selected_yet: Nobena postavitev ali zbirka ni izbrana
batch_delete_confirm: >-
Noben zapis ni izbran | Ste prepričani, da želite izbrisati ta zapis? | Ste prepričani, da želite izbrisati {count} zapisov?
cancel: Prekliči
no_upscale: Brez povečevanja slik
collection: Zbirka
collections: Zbirke
singleton: En zapis
@@ -796,6 +776,7 @@ fields:
admin_options: Administracijske opcije
status: Stanje
status_draft: Osnutek
status_invited: Povabljen
status_active: Aktivno
status_suspended: Zaustavljeno
status_archived: Arhivirano
@@ -805,13 +786,15 @@ fields:
last_page: Zadnja stran
last_access: Zadnji dostop
directus_settings:
transforms_note: Ime Sharp metode in parametri. Več na https://sharp.pixelplumbing.com/api-constructor.
additional_transforms: Dodatne pretvorbe
project_name: Ime projekta
project_url: Spletni naslov (URL) projekta
project_color: Barva projekta
project_logo: Logo projekta
public_pages: Javne strani
public_foreground: Barva teksta v javnem delu
public_background: Barva ozadja v javnem delu
public_foreground: Glavna slika v javnem delu, logo
public_background: Slika za ozadje v javnem delu
public_note: Sporočilo v javnem delu
auth_password_policy: Pravila gesel
auth_login_attempts: Število poskusov prijave
@@ -850,7 +833,22 @@ fields:
actions: Dejanja
field_options:
directus_settings:
project_name_placeholder: Moj projekt ...
project_logo_note: Ozadje prijave in logotip
public_note_placeholder: Kratko javno sporočilo, ki podpira Markdown oblikovanje ...
security_divider_title: Varnost
auth_password_policy:
none_text: Brez - ni priporočljivo
weak_text: Šibko - najmanj 8 znakov
strong_text: Močno - Velike in majhne črke, številke, posebni znaki
storage_asset_presets:
fit:
contain_text: Omejeno (obdrži razmerje)
cover_text: Zapolni (točna velikost)
fit_text: Prilagodi znotraj
outside_text: Prilagodi zunaj
additional_transforms: Dodatne pretvorbe
transforms_note: Ime Sharp metode in parametri. Več na https://sharp.pixelplumbing.com/api-constructor.
files_divider_title: Datoteke & sličice
overrides_divider_title: Aplikacijske preglasitve
directus_activity:
@@ -863,20 +861,47 @@ field_options:
only_track_activity: Sledi samo aktivnosti
do_not_track_anything: Ne sledi ničesar
collection_setup: Nastavitve zbirke
note_placeholder: Opis te zbirke ...
hidden_label: Skrij v aplikaciji
singleton: Obravnavaj kot en objekt
language: Jezik
translation: Vnesite prevod ...
archive_divider: Arhiviraj
archive_field: Izberite polje ...
archive_app_filter: Omogoči aplikacijski arhivski filter
archive_value: Nastavljena vrednost pri arhiviranju ...
unarchive_value: Nastavljena vrednost pri dearhiviranju ...
divider: Razvrsti
sort_field: Izberite polje ...
accountability_divider: Odgovornost
directus_files:
title: Edinstven naziv ...
description: Opcijski opis ...
location: Opcijska lokacija ...
storage_divider: Imenovanje datotek
filename_disk: Ime na disku ...
filename_download: Ime za prenos ...
directus_roles:
name: Edinstveno ime te vloge ...
description: Opis te vloge ...
ip_access: Dovoljeni IP naslovi, pustite prazno za neomejen dostop ...
fields:
icon_name: Ikona
name_name: Ime
name_placeholder: Vnesite naslov ...
link_name: Povezava
link_placeholder: Relativni ali absolutni URL naslov ...
collection_list:
group_name_addLabel: Dodaj novo skupino ...
fields:
group_name: Ime skupine
group_placeholder: Naziv te skupine ...
type_name: Tip
choices_always: Vedno odprto
choices_start_open: Začni odprto
choices_start_collapsed: Začni zaprto
collections_name: Zbirke
collections_addLabel: Dodaj zbirko ...
directus_users:
preferences_divider: Uporabniške nastavitve
dropdown_auto: Avtomatsko (sistemsko)
@@ -884,6 +909,7 @@ field_options:
dropdown_dark: Temna tema
admin_divider: Administracijske opcije
status_dropdown_draft: Osnutek
status_dropdown_invited: Povabljen
status_dropdown_active: Aktivno
status_dropdown_suspended: Zaustavljeno
status_dropdown_archived: Arhivirano
@@ -896,6 +922,7 @@ field_options:
actions_create: Ustvari
actions_update: Posodobi
actions_delete: Izbriši
actions_login: Prijava
no_fields_in_collection: 'Zbirka {collection} še nima polj'
do_nothing: Ne stori ničesar
generate_and_save_uuid: Ustvari in shrani UUID

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Izmijeni
item_revision: Revizija stavke
duplicate_field: Dupliraj
@@ -126,9 +106,6 @@ fields_for_role: 'Sva polja {role} Role mogu {action}.'
validation_for_role: 'Polje {action} upravlja ulogom {role}.'
presets_for_role: 'Podrazumijevane vrijednosti polja za ulogu {role}.'
presentation_and_aliases: Prezentacija & Pseudonimi
revision_post_update: Ovako će ova stavka izgledati nakon ažuriranja...
changes_made: Postoje specifične izmjene koji su napravljene...
no_relational_data: Zapamtite da ovo ne uključuje relacione podatke.
hide_field_on_detail: Sakrij Polje u sekciji Detalji
show_field_on_detail: Prikaži Polje u sekciji Detalji
delete_field: Obriši Polje
@@ -364,7 +341,6 @@ no_files_copy: Ovdje nema fajlova.
user_count: 'Nema Korisnika | Jedan Korisnik | {count} Korisnika'
no_users_copy: Ne postoji nijedan korisnik u ovoj roli.
webhooks_count: 'Ne postoje Webhooks | Jedan Webhook | {count} Webhooks'
no_webhooks_copy: Trenutno ne postoji nijedan "webhook".
all_items: Sve Stavke
csv: CSV
no_collections: Nema Kolekcija
@@ -798,10 +774,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Prijavi se
create: Kreiraj
update: Ažuriranje
delete: Obriši
directus_collections:
track_activity_revisions: Prati Aktivnost & Revizije
only_track_activity: Samo Prati Aktivnost

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Уреди поља
item_revision: Ревизија итема
duplicate_field: Дуплирај поље

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Redigera fält
item_revision: Revision objekt
duplicate_field: Duplicera fält
@@ -122,9 +102,6 @@ fields_for_role: 'Fält {role} rollen kan {action}.'
validation_for_role: 'Fältets {action} regler {role} rollen måste lyda.'
presets_for_role: 'Förvalt fältvärde för rollen {role}.'
presentation_and_aliases: Presentation & alias
revision_post_update: Så här såg objektet ut efter uppdateringen...
changes_made: Dessa är de specifika ändringarna som gjordes...
no_relational_data: Tänk på att detta inte inkluderar datans relationer.
hide_field_on_detail: Dölj fältet på detaljnivå
show_field_on_detail: Visa fältet på detaljnivå
delete_field: Radera fält
@@ -352,7 +329,6 @@ no_files_copy: Det finns inga filer här.
user_count: 'Inga användare | En användare | {count} användare'
no_users_copy: Det finns inga användare i denna roll ännu.
webhooks_count: 'Inga webhooks | En webhook | {count} webhooks'
no_webhooks_copy: Det finns inga webhooks ännu.
all_items: Alla objekt
csv: CSV
no_collections: Inga kollektioner
@@ -774,10 +750,8 @@ fields:
status: Status
field_options:
directus_activity:
login: Logga in
create: Skapa
update: Uppdatera
delete: Radera
directus_collections:
collection_setup: Konfiguration av kollektion
singleton: Behandla som ett enskilt objekt

View File

@@ -19,12 +19,15 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: เผยแพร่แล้ว
edit_field: แก้ไขฟิลด์
conditions: เงื่อนไข
maps: แผนที่
item_revision: ประวัติรายการ
duplicate_field: สำเนาฟิลด์
half_width: กว้างครึ่งหนึ่ง
full_width: กว้างเต็มหน้า
limit: ขีดจำกัด
group: กลุ่ม
and: และ
or: หรือ
@@ -36,6 +39,7 @@ role_name: ชื่อบทบาท
branch: สาขา
leaf: ใบ
indeterminate: คลุมเครือ
edit_collection: แก้ไขคอลเลกชัน
exclusive: เฉพาะ
children: ลูก
db_only_click_to_configure: 'ฐานข้อมูลเท่านั้น: คลิกเพื่อกำหนดค่า '
@@ -140,8 +144,8 @@ validation_for_role: 'ฟิลด์ {action} ถูกกำหนดสิท
presets_for_role: 'ค่าตั้งต้นของฟิลด์สำหรับบทบาท {role}'
presentation_and_aliases: การแสดงผลและนาวแผง
revision_post_update: สิ่งที่ไอเท็มจะเป็นหลังจากอัพเดทแล้ว
changes_made: นี่คือการปลี่ยนแปลงที่ถูกทำ...
no_relational_data: โปรดจำไว้ว่านี่ไม่รวมข้อมูลความสัมพันธ์
changes_made: การปลี่ยนแปลงที่เกิดขึ้นในการแก้ไขนี้
no_relational_data: จำไว้ว่าข้อมูลสัมพันธ์ไม่ถูกรวมอยู่ในนี้
hide_field_on_detail: ซ่อนฟิลด์เมื่อแสดงรายละเอียด
show_field_on_detail: แสดงฟิลด์เมื่อแสดงรายละเอียด
delete_field: ลบฟิลด์
@@ -182,6 +186,7 @@ time: เวลา
timestamp: Timestamp
uuid: UUID
hash: ค่าแฮช
geometry: เรขาคณิต
not_available_for_type: ไม่มีสำหรับชนิดนี้
create_translations: สร้างการแปลใหม่
auto_refresh: รีเฟรซอัตโนมัติ
@@ -378,8 +383,9 @@ no_files_copy: ไม่มีไฟล์ที่นี่
user_count: 'ไม่มีผู้ใช้ | ผู้ใช้ 1 คน | ผู้ใช้ {count} คน'
no_users_copy: ยังไม่มีผู้ใช้ในบทบาท
webhooks_count: 'ไม่มี webhook | มี 1 webhook | มี {count} webhook'
no_webhooks_copy: ยังไม่มี webhook
no_webhooks_copy: ยังไม่มีการกำหนดค่าเว็บฮุค เริ่มต้นด้วยการสร้างด้านล่าง
all_items: รายการทั้งหมด
any: ใด ๆ
csv: CSV
no_collections: ไม่มีคอลเลกชัน
create_collection: สร้างคอลเลกชัน
@@ -390,6 +396,7 @@ display_template_not_setup: การตั้งค่าของการแ
collection_field_not_setup: การตั้งค่าของฟิลด์ยังไม่ถูกต้อง
select_a_collection: เลือกคอลเลกชัน
active: เปิดใช้งาน
inactive: ไม่ใช้งาน
users: ผู้ใช้
activity: กิจกรรม
webhooks: Webhooks
@@ -402,6 +409,7 @@ documentation: เอกสาร
sidebar: แถบด้านข้าง
duration: ระยะเวลา
charset: 'ชุดอักขระ:'
second: วินาที
file_moved: ย้ายไฟล์เสร็จสิ้น
collection_created: คอลเลกชันถูกสร้างแล้ว
modified_on: ถูกแก้ไขเมื่อ
@@ -443,6 +451,7 @@ errors:
UNPROCESSABLE_ENTITY: เอ็นติตี้ที่ประมวลผลไม่ได้
INTERNAL_SERVER_ERROR: พบข้อผิดพลาดบางอย่างที่ไม่คาดคิด
NOT_NULL_VIOLATION: ต้องไม่เป็นค่า null
security: ความปลอดภัย
value_hashed: ข้อมูลถูกเข้ารหัสไว้อย่างปลอดภัย
bookmark_name: ชื่อบุ๊กมาร์ก...
create_bookmark: สร้างบุ๊กมาร์ก
@@ -494,6 +503,7 @@ color: สี
circle: วงกลม
empty_item: ไอเท็มเปล่า
log_in_with: 'ลงชื่อเข้าใช้ด้วย {provider}'
advanced_settings: การตั้งค่าขั้นสูง
advanced_filter: ตัวกรองขั้นสูง
delete_advanced_filter: ลบตัวกรองนี้
change_advanced_filter_operator: เปลี่ยนตัวดำเนินการ
@@ -520,6 +530,10 @@ operators:
nempty: ไม่ว่างเปล่า
all: ประกอบด้วยคีย์เหล่านี้
has: ประกอบด้วยบางคีย์เหล่านี้
intersects: ทางแยก
nintersects: ไม่ตัดกัน
intersects_bbox: ตัดขอบกล่อง
nintersects_bbox: ไม่ตัดขอบกล่อง
loading: กำลังโหลด...
drop_to_upload: วางเพื่ออัพโหลด
item: รายการ
@@ -563,6 +577,7 @@ user: ผู้ใช้
no_presets: ไม่มีค่าที่ตั้งไว้ล่วงหน้า
no_presets_copy: ยังไม่มีค่าที่ตั้งไว้ล่วงหน้าหรือบุ๊กมาร์กที่ถูกบันทึกไว้
no_presets_cta: เพิ่มค่าที่ตั้งไว้ล่วงหน้าใหม่
presets_only: ที่ตั้งไว้ล่วงหน้าเท่านั้น
create: สร้าง
on_create: เมื่อสร้าง
on_update: เมื่อแก้ไข
@@ -578,6 +593,7 @@ label: ป้าย
image_url: URL ของรูปภาพ
alt_text: ข้อความแสดงแทน
media: สื่อ
quality: คุณภาพ
width: กว้าง
height: สูง
source: แหล่งที่มา
@@ -817,8 +833,9 @@ fields:
name: ชื่อ
status: สถานะ
field_options:
directus_settings:
security_divider_title: ความปลอดภัย
directus_activity:
login: ลงชื่อเข้าใช้
create: สร้าง
update: แก้ไข
directus_collections:
@@ -843,6 +860,7 @@ field_options:
status_dropdown_active: เปิดใช้งาน
directus_webhooks:
status_options_active: เปิดใช้งาน
status_options_inactive: ไม่ใช้งาน
actions_create: สร้าง
actions_update: แก้ไข
no_fields_in_collection: 'ยังไม่มีฟิลด์ใน {collection}'
@@ -1224,3 +1242,5 @@ layouts:
calendar: ปฏิทิน
start_date_field: ฟิลด์วันที่เริ่มต้น
end_date_field: ฟิลด์วันที่สิ้นสุด
map:
field: เรขาคณิต

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Alanı Düzenle
item_revision: Revizyonları Göster
duplicate_field: Yinelenen Alan
@@ -29,6 +9,7 @@ field_name_translations: Alan İsim Çevirileri
enter_password_to_enable_tfa: İki Faktörlü Kimlik Doğrulamayı etkinleştirmek için şifrenizi girin
add_field: Alan Ekle
role_name: Rol Adı
edit_collection: Koleksiyonu düzenle
db_only_click_to_configure: 'Yalnızca Veritabanı: Yapılandırmak için Tıklayın '
show_archived_items: Arşivlenmiş Öğeleri Göster
edited: Değer Düzenlendi
@@ -61,6 +42,7 @@ delete_bookmark_copy: >-
logoutReason:
SIGN_OUT: Oturum kapatıldı
SESSION_EXPIRED: Oturumun süresi doldu
public_label: Herkese Açık
public_description: Kimlik doğrulaması olmadan hangi API verilerinin kullanılabileceğini kontrol eder.
not_allowed: İzin Verilmedi
directus_version: Directus Versiyon
@@ -125,9 +107,6 @@ fields_for_role: '{role} rolünün {action} yapabileceği alanlar.'
validation_for_role: '{action} alanı, {role} rolünün uyması gereken kuralları belirler.'
presets_for_role: '{role} rolü için varsayılan alan değeri.'
presentation_and_aliases: Sunum ve Takma Adlar
revision_post_update: İşte güncellemeden sonra bu öğenin nasıl göründüğü...
changes_made: Bunlar yapılan belirli değişiklikler...
no_relational_data: Bunun ilişkisel verileri içermediğini unutmayın.
hide_field_on_detail: Alanı Detayda Gizle
show_field_on_detail: Alanı Detayda Göster
delete_field: Alanı Sil
@@ -227,7 +206,7 @@ undo_changes: Değişiklikleri geri al
notifications: Bildirimler
show_all_activity: Tüm etkinliği göster
page_not_found: Sayfa Bulunamadı
page_not_found_body: Aradığınız sayfanın var olduğuna emin misiniz? Biz bulamadık da...
page_not_found_body: Aradığınız sayfa mevcut değil.
confirm_revert: Geri Alma İşlemini Onayla
confirm_revert_body: Bu, öğeyi seçilen duruma geri döndürecektir.
display: Göster
@@ -328,6 +307,7 @@ type: Tür
creating_new_collection: Yeni Koleksiyon Oluştur
created_by: Oluşturan
created_on: Oluşturulma tarihi
creating_collection_info: Koleksiyonu isimlendir ve onun benzersiz "anahtar" alanını ayarla...
save_and_create_new: Kaydet ve Yeni Oluştur
save_and_stay: Kaydet ve Sayfada Kal
save_as_copy: Kopya Olarak Kaydet
@@ -349,7 +329,6 @@ no_files_copy: Burada dosya yok.
user_count: 'Kullanıcı Yok | Bir Kullanıcı | {count} Kullanıcı'
no_users_copy: Bu Grupta Kullanıcı Yok.
webhooks_count: 'Webhook Yok | Bir Webhook | {count} Webhook'
no_webhooks_copy: Henüz hiç bir webhook yok.
all_items: Tüm öğeler
csv: CSV
no_collections: Koleksiyon Yok
@@ -609,6 +588,9 @@ fields:
last_page: Son Sayfa
last_access: Son Erişim
directus_settings:
jpg: JPEG
png: PNG
webP: WebP
project_name: Proje Adı
custom_css: Özel CSS
directus_fields:
@@ -632,10 +614,8 @@ fields:
status: Durum
field_options:
directus_activity:
login: Oturum Aç
create: Oluştur
update: Güncelle
delete: Sil
directus_collections:
language: Dil
archive_divider: Arşiv

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Редагувати поле
conditions: Умови
maps: Мапи
@@ -277,10 +257,8 @@ fields:
status: Статус
field_options:
directus_activity:
login: Вхід
create: Створити
update: Оновити
delete: Видалити
directus_collections:
language: Мова
archive_divider: Архів

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: Sửa trường
item_revision: Xem Phiên bản
duplicate_field: Nhân bản Trường
@@ -554,7 +534,6 @@ fields:
status: Trạng thái
field_options:
directus_activity:
login: Đăng nhập
create: Tạo
update: Cập nhật
directus_collections:

View File

@@ -19,6 +19,9 @@
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
published: 已发布
draft: 草稿
archived: 已存档
edit_field: 编辑
conditions: 条件
maps: 地图
@@ -38,6 +41,7 @@ role_name: 角色名称
branch: 分支
leaf: Leaf
indeterminate: 不确定的状态
edit_collection: 编辑收藏
exclusive: 唯一的
children: 子页面
db_only_click_to_configure: '仅限数据库:点击配置 '
@@ -88,7 +92,7 @@ archive_confirm: 您确定要归档所选吗?
archive_confirm_count: >-
没有选定项目 | 你确定要存档这个项目吗?| 你确定你想要存档这些 {count} 个项目吗?
reset_system_permissions_to: '重置系统权限:'
reset_system_permissions_copy: 此操作将覆盖您可能应用到系统集合中的自定义权限。确定吗?
reset_system_permissions_copy: 此操作将覆盖您可能应用到系统收藏中的自定义权限。确定吗?
the_following_are_minimum_permissions: 以下是启用"应用访问"时所需的最低权限,您可以对除以下权限外的其他权限进行扩展。
app_access_minimum: 最小权限
recommended_defaults: 推荐设置
@@ -141,9 +145,6 @@ fields_for_role: '{role} 角色能够 {action} 字段。'
validation_for_role: '{role} 角色必须遵守字段的 {action} 规则。'
presets_for_role: '{role} 角色的默认值。'
presentation_and_aliases: 别名
revision_post_update: 这是更新这个项目后的样式...
changes_made: 这些是所做的具体更改...
no_relational_data: 请记住,这不包括关系数据。
hide_field_on_detail: 在详情中隐藏该字段
show_field_on_detail: 在详情中显示
delete_field: 删除
@@ -199,7 +200,7 @@ to_manually_setup_translations: 手动设置翻译。
click_to_manage_translated_fields: >-
还没有翻译的字段。点击这里创建它们。 点击这里来管理它。| 有 {count} 个翻译的字段。点击这里来管理。
fields_group: 字段组
no_collections_found: 未找到任何集合
no_collections_found: 未找到任何收藏
new_data_alert: '以下将在您的数据模型中创建:'
search_collection: 搜索数据模型...
new_field: '新建字段'
@@ -265,11 +266,11 @@ post_comment_success: 评论已发布
item_create_success: 条目已创建 | 条目已创建
item_update_success: 条目已更新 | 条目已更新
item_delete_success: 项目已删除 | 项目已删除
this_collection: 此集
related_collection: 相关集
related_collections: 相关集
this_collection: 收藏
related_collection: 相关收藏
related_collections: 相关收藏
translations_collection: 翻译收藏
languages_collection: 语言集合
languages_collection: 语言收藏
export_data: 导出数据
format: 格式
use_current_filters_settings: 使用当前筛选器和设置
@@ -284,7 +285,7 @@ submit: 提交
move_to_folder: 移动到文件夹
move: 移动
system: 系统
add_field_related: 将字段添加到关联集合
add_field_related: 将字段添加到关联收藏
interface_label: 接口
today: 今天
yesterday: 昨天
@@ -339,11 +340,11 @@ replace_from_library: 从库中替换文件
replace_from_url: 从 URL 中替换文件
no_file_selected: 未选择文件
download_file: 下载文件
collection_key: 集合的键
collection_key: 收藏的键
name: 名称
primary_key_field: 主键字段
type: 类型
creating_new_collection: 创建集合
creating_new_collection: 创建收藏
created_by: 创建自
created_on: 创建于
creating_collection_info: 命名集合并设置唯一键字段...
@@ -375,28 +376,27 @@ display_not_found: '未找到显示 "{display}" 。'
reset_display: 重置显示
list-m2a: 构建器 (M2A)
item_count: '暂无数据 | 找到一条数据 | 找到 {count} 条数据'
no_items_copy: 集合中没有项目。
no_items_copy: 收藏中没有项目。
file_count: '没有文件 | 一个文件 | {count} 个文件'
no_files_copy: 没有任何文件。
user_count: '没有用户 | 一个用户 | {count} 个用户'
no_users_copy: 该角色下还没有用户。
webhooks_count: '没有 Web钩子 | 一个钩子 | {count} 个Web钩子'
no_webhooks_copy: 还没有任何web钩子。
all_items: 所有项目
any: 任意
csv: CSV
no_collections: 没有任何集合
create_collection: 创建集合
no_collections_copy_admin: 您还没有任何集合。点击下面的按钮开始操作。
no_collections_copy: 您还没有任何集合。请联系您的系统管理员。
no_collections: 没有任何收藏
create_collection: 创建收藏
no_collections_copy_admin: 您还没有任何收藏。点击下面的按钮开始操作。
no_collections_copy: 您还没有任何收藏。请联系您的系统管理员。
relationship_not_setup: 关系配置不正确
display_template_not_setup: 显示的模板选项配置错误
collection_field_not_setup: 集合的字段选项配置错误
select_a_collection: 选择一个集合
collection_field_not_setup: 收藏的字段选项配置错误
select_a_collection: 选择一个收藏
active: 激活
inactive: 非活跃
users: 用户
activity:
activity:
webhooks: Webhook
field_width: 字段宽度
add_filter: 添加过滤器
@@ -409,7 +409,7 @@ duration: 持续时间
charset: 字符集
second:
file_moved: 文件已移动
collection_created: 集合已创建
collection_created: 收藏已创建
modified_on: 修改于
card_size: 卡片大小
sort_field: 排序字段
@@ -420,7 +420,7 @@ remove: 移除
toggle_manual_sorting: 切换手动排序
bookmark_doesnt_exist: 书签不存在
bookmark_doesnt_exist_copy: 找不到您试图打开的书签。
bookmark_doesnt_exist_cta: 返回集合
bookmark_doesnt_exist_cta: 返回收藏
select_an_item: 选择一个项目...
edit: 编辑
enabled: 已启用
@@ -432,7 +432,7 @@ account_created_successfully: 账号成功创建!
auto_fill: 自动填充
corresponding_field: 相应字段
errors:
COLLECTION_NOT_FOUND: "集合不存在"
COLLECTION_NOT_FOUND: "收藏不存在"
FIELD_NOT_FOUND: 空格未找到
FORBIDDEN: 禁止
INVALID_CREDENTIALS: 错误的用户名或密码
@@ -472,22 +472,22 @@ flip_vertical: 垂直翻转
aspect_ratio: 宽高比
rotate: 旋转
all_users: 全部用户
delete_collection: 删除集合
update_collection_success: 集合已更新
delete_collection_success: 集合已删除
delete_collection: 删除收藏
update_collection_success: 收藏已更新
delete_collection_success: 收藏已删除
start_end_of_count_items: '{count} 个项目中的 {start}-{end}'
start_end_of_count_filtered_items: '已过滤后{count} 个项目中的 {start}-{end}'
one_item: '1项'
one_filtered_item: '1 个已过滤项目'
delete_collection_are_you_sure: >-
您确定要删除此收藏吗?这将删除收藏及其中的所有项目。此操作是永久性的。
collections_shown: 集合展开
visible_collections: 显示集合
hidden_collections: 隐藏集合
show_hidden_collections: 展开隐藏集合
hide_hidden_collections: 不显示隐藏集合
unmanaged_collections: 未配置的集合
system_collections: 系统集合
collections_shown: 收藏展开
visible_collections: 显示收藏
hidden_collections: 隐藏收藏
show_hidden_collections: 展开隐藏收藏
hide_hidden_collections: 不显示隐藏收藏
unmanaged_collections: 未配置的收藏
system_collections: 系统收藏
placeholder: 占位文本
icon_left: 左图标
icon_right: 右图标
@@ -548,7 +548,7 @@ interface_options: 接口选项
layout_options: 布局选项
rows:
columns:
collection_setup: 集合设置
collection_setup: 收藏设置
optional_system_fields: 可选系统字段
value_unique: 值必须唯一
all_activity: 所有活动的
@@ -685,7 +685,7 @@ unsaved_changes: 修改还未保存
unsaved_changes_copy: 您确定要离开此页面吗?
discard_changes: 不保存修改并离开此页
keep_editing: 继续编辑
page_help_collections_overview: '**集合总览** - 您可以访问的所有集合列表。'
page_help_collections_overview: '**收藏总览** - 您可以访问的所有收藏列表。'
page_help_collections_collection: >-
**浏览条目** - 列出所有 {collection} 集合中你可以访问的条级数据。 可以通过设置自定义布局、过滤器和排序来调整视图,甚至将不同的设置保存为书签以便快速访问。
page_help_collections_item: >-
@@ -700,9 +700,9 @@ page_help_files_item: >-
**文件详情** - 管理文件元数据、编辑原始资产和更新访问设置的表格。
page_help_settings_project: "**项目设置** — — 你的项目的全局配置选项。"
page_help_settings_datamodel_collections: >-
**数据模型: 集合** - 列出所有可用的集合。这包括可见、隐藏和系统集合,以及可以添加的数据库表(当前还未加入并管理)。
**数据模型: 收藏** - 列出所有可用的收藏。这包括可见、隐藏和系统收藏,以及可以添加的数据库表(当前还未加入并管理)。
page_help_settings_datamodel_fields: >-
**数据模型: Collection** — 用于管理此集合及其字段的表单
**数据模型: Collection** — 用于管理此收藏及其字段的表单
page_help_settings_roles_collection: '**Browse Roles** - 列出管理员、公共和自定义用户角色。'
page_help_settings_roles_item: "**角色详细** — 管理角色的权限和其他设置。"
page_help_settings_presets_collection: >-
@@ -719,12 +719,12 @@ add_new: 新增
create_new: 新建
all: 全部
none:
no_layout_collection_selected_yet: 尚未选择布局/集合
no_layout_collection_selected_yet: 尚未选择布局/收藏
batch_delete_confirm: >-
您还没有选择数据 | 您确定要删除此条数据吗? 此操作无法撤消。 | 您确定要删除这 {count} 条数据吗? 此操作无法撤消。
cancel: 取消
collection: 集合
collections: 集合
collection: 收藏
collections: 收藏
singleton: 单一
singleton_label: 视为单个对象
system_fields_locked: 系统字段已锁定,无法编辑
@@ -732,7 +732,7 @@ fields:
directus_activity:
item: 项目主键
action: 操作
collection: 集合
collection: 收藏
timestamp: 操作于
user: 操作人
comment: 注释
@@ -740,13 +740,13 @@ fields:
ip: IP 地址
revisions: 修订版本
directus_collections:
collection: 集合
collection: 收藏
icon: 图标
note: 注释
display_template: 显示模板
hidden: 隐藏
singleton: 单一
translations: 集合名称翻译
translations: 收藏名称翻译
archive_app_filter: 后台Admin App中归档数据过滤器
archive_value: 归档值
unarchive_value: 取消归档值
@@ -822,8 +822,8 @@ fields:
overrides: 应用设置覆盖
custom_css: 自定义 CSS
directus_fields:
collection: 集合名称
icon: 集合 Icon
collection: 收藏名称
icon: 收藏 Icon
note: 注释
hidden: 隐藏
singleton: 单一
@@ -839,7 +839,7 @@ fields:
enforce_tfa: 请求两步验证
users: 角色中的用户
module_list: 模块导航
collection_list: 集合导航
collection_list: 收藏导航
directus_webhooks:
name: 名称
method: 方法
@@ -854,7 +854,6 @@ field_options:
files_divider_title: 文件和缩略图
overrides_divider_title: 应用设置覆盖
directus_activity:
login: 登录
create: 创建
update: 更新
delete: 删除
@@ -862,7 +861,7 @@ field_options:
track_activity_revisions: 跟踪活动和历史修改版本
only_track_activity: 仅跟踪活动
do_not_track_anything: 不跟踪任何内容
collection_setup: 集合设置
collection_setup: 收藏设置
singleton: 视为单个对象
language: 语言
archive_divider: 存档
@@ -875,7 +874,8 @@ field_options:
collection_list:
fields:
type_name: 类型
collections_name: 集合
collections_name: 收藏
collections_addLabel: 添加到收藏集...
directus_users:
preferences_divider: 用户设置
dropdown_auto: 自动 (系统主题)
@@ -940,7 +940,7 @@ normal: 标准
success: 成功
warning: 警示
danger: 危险
junction_collection: 交叉集合
junction_collection: 交叉收藏
latency: 延迟
login: 登录
my_activity: 操作记录
@@ -1013,13 +1013,13 @@ interfaces:
line_number: 行号
placeholder: 在此输入
system-collection:
collection: 集合
description: 在现有集合之间选择
include_system_collections: 包含系统集合
collection: 收藏
description: 在现有收藏之间选择
include_system_collections: 包含系统收藏
system-collections:
collections: 集合
description: 在现有集合之间选择
include_system_collections: 包含系统集合
collections: 收藏
description: 在现有收藏之间选择
include_system_collections: 包含系统收藏
select-color:
color: 颜色
description: 输入或选择颜色
@@ -1037,8 +1037,8 @@ interfaces:
display-template: 显示模板
description: 混合静态文本和动态字段值
collection_field: 收藏字段
collection_field_not_setup: 集合的字段选项配置错误
select_a_collection: 选择一个集合
collection_field_not_setup: 收藏的字段选项配置错误
select_a_collection: 选择一个收藏
presentation-divider:
divider: 分隔线
description: 标记字段并分成多个部分
@@ -1181,7 +1181,7 @@ interfaces:
label_default: 已启用
translations:
display_template: 显示模板
no_collection: 暂无集合
no_collection: 暂无收藏
list-o2m-tree-view:
description: 递归显示树状图
recursive_only: 树状图仅适用于递归关系。
@@ -1219,7 +1219,7 @@ displays:
color_on: 启用颜色
color_off: 禁用颜色
collection:
collection: 集合
collection: 收藏
description: 显示收藏
icon_label: 显示收藏的图标
color:

View File

@@ -1,24 +1,4 @@
---
## Be aware:
#Due to the way this is imported, JavaScript reserved words, including "delete", "private",
#"void", etc are stripped out. See
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/pluginutils/src/makeLegalIdentifier.ts#L4
#and
#https://github.com/rollup/plugins/blob/8748b8cd3bbab3c5ac6190556930219f19060e63/packages/yaml/src/index.js#L45
#Illegal words:
#'break', 'case', 'class', 'catch', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
#'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof',
#'let', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void',
#'while', 'with', 'yield', 'enum', 'await', 'implements', 'package', 'protected', 'static',
#'interface', 'private', 'public', 'arguments', 'Infinity', 'NaN', 'undefined', 'null', 'true',
#'false', 'eval', 'uneval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI',
#'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object',
#'Function', 'Boolean', 'Symbol', 'Error', 'EvalError', 'InternalError', 'RangeError',
#'ReferenceError', 'SyntaxError', 'TypeError', 'URIError', 'Number', 'Math', 'Date', 'String',
#'RegExp', 'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array',
#'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'Map', 'Set', 'WeakMap', 'WeakSet',
#'SIMD', 'ArrayBuffer', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'Reflect',
#'Proxy', 'Intl'
edit_field: 編輯欄位
item_revision: 項目修改
duplicate_field: 複製欄位
@@ -101,8 +81,6 @@ field_validation: 欄位驗證
permissions_for_role: '角色 {role} 可以 {action} 項目'
fields_for_role: '角色 {role} 可以 {action} 欄位'
validation_for_role: '角色 {role} 必須遵守欄位 {action} 規則'
revision_post_update: 項目更新後看起來像...
changes_made: 這些是具體的變更部分
hide_field_on_detail: 在詳細內容中隱藏
show_field_on_detail: 在詳細內容中顯示
delete_field: 刪除欄位
@@ -278,7 +256,6 @@ no_files_copy: 這裡還沒有任何檔案。
user_count: '沒有使用者 | 1 個使用者 | {count} 個使用者'
no_users_copy: 這個角色中還沒有任何使用者。
webhooks_count: '沒有 Webhooks1 個 Webhook{count} 個 Webhooks'
no_webhooks_copy: 這裡還沒有任何 Webhooks。
all_items: 所有項目
csv: CSV
no_collections: 沒有集合
@@ -546,10 +523,8 @@ fields:
status: 狀態
field_options:
directus_activity:
login: 登入
create: 新建
update: 更新
delete: 刪除
directus_collections:
language: 語言
archive_divider: 封存

View File

@@ -146,8 +146,8 @@ export default defineComponent({
margin-bottom: 36px;
padding: 0 8px;
background-color: var(--background-page);
border-top: 2px solid var(--border-subdued);
border-bottom: 2px solid var(--border-subdued);
border-top: var(--border-width) solid var(--border-subdued);
border-bottom: var(--border-width) solid var(--border-subdued);
box-shadow: 0 0 0 2px var(--background-page);
}

View File

@@ -4,11 +4,12 @@ import { notify } from '@/utils/notify';
import { unexpectedError } from '@/utils/unexpected-error';
import { merge } from 'lodash';
import { defineStore } from 'pinia';
import { Settings } from '@directus/shared/types';
export const useSettingsStore = defineStore({
id: 'settingsStore',
state: () => ({
settings: null as null | Record<string, any>,
settings: null as null | Settings,
}),
actions: {
async hydrate() {

View File

@@ -1,5 +1,5 @@
:root {
--brand: var(--primary); // will be overriden with directus_settings.project_color
--brand: var(--primary); // will be overridden with directus_settings.project_color
--white: #fff;
--black: #090c0d;
--transition: cubic-bezier(0.4, 0, 0.2, 1);

View File

@@ -15,6 +15,12 @@
<v-breadcrumb :items="[{ name: collectionInfo.name, disabled: true }]" />
</template>
<template #title-outer:prepend>
<v-button class="header-icon" rounded icon secondary disabled>
<v-icon :name="collectionInfo.icon" :color="collectionInfo.color" />
</v-button>
</template>
<template #actions:prepend><component :is="`layout-actions-${localLayout}`" v-bind="layoutState" /></template>
<template #actions>

View File

@@ -0,0 +1,109 @@
<template>
<div class="module-bar">
<module-bar-logo />
<div class="modules">
<v-button
v-for="modulePart in modules"
:key="modulePart.id"
v-tooltip.right="modulePart.name"
icon
x-large
:to="modulePart.to"
:href="modulePart.url"
tile
:style="
modulePart.color
? {
'--v-button-color-active': modulePart.color,
}
: null
"
>
<v-icon :name="modulePart.icon" outline />
</v-button>
</div>
<module-bar-avatar />
</div>
</template>
<script lang="ts">
import { defineComponent, computed } from 'vue';
import { getModules } from '@/modules/';
import ModuleBarLogo from './module-bar-logo/';
import ModuleBarAvatar from './module-bar-avatar/';
import { useSettingsStore } from '@/stores/';
import { translate } from '@/utils/translate-object-values';
export default defineComponent({
components: {
ModuleBarLogo,
ModuleBarAvatar,
},
setup() {
const settingsStore = useSettingsStore();
const { modules: registeredModules } = getModules();
const registeredModuleIDs = computed(() => registeredModules.value.map((module) => module.id));
const modules = computed(() => {
if (!settingsStore.settings) return [];
return settingsStore.settings.module_bar
.filter((modulePart) => {
if (modulePart.type === 'link') return true;
return modulePart.enabled && registeredModuleIDs.value.includes(modulePart.id);
})
.map((modulePart) => {
if (modulePart.type === 'link') {
return translate(modulePart);
}
const module = registeredModules.value.find((module) => module.id === modulePart.id)!;
return {
...modulePart,
...registeredModules.value.find((module) => module.id === modulePart.id),
to: module.link === undefined ? `/${module.id}` : '',
};
});
});
return { modules };
},
});
</script>
<style>
body {
--module-background: #18222f;
--module-background-alt: var(--background-normal);
--module-icon: #8196b1;
--module-icon-alt: var(--foreground-normal-alt);
}
</style>
<style lang="scss" scoped>
.module-bar {
display: flex;
flex-direction: column;
width: 60px;
height: 100%;
background-color: var(--module-background);
.modules {
flex-grow: 1;
overflow-x: hidden;
overflow-y: auto;
}
.v-button {
--v-button-color: var(--module-icon);
--v-button-color-hover: var(--white);
--v-button-color-active: var(--module-icon-alt);
--v-button-background-color: var(--module-background);
--v-button-background-color-hover: var(--module-background);
--v-button-background-color-active: var(--module-background-alt);
}
}
</style>

View File

@@ -1,4 +0,0 @@
import ModuleBar from './module-bar.vue';
export { ModuleBar };
export default ModuleBar;

View File

@@ -1,125 +0,0 @@
<template>
<div class="module-bar">
<module-bar-logo />
<div class="modules">
<v-button
v-for="module in internalModules"
:key="module.id"
v-tooltip.right="module.name"
icon
x-large
:to="module.to"
:href="module.href"
tile
:style="
module.color
? {
'--v-button-color-active': module.color,
}
: null
"
>
<v-icon :name="module.icon" outline />
</v-button>
</div>
<module-bar-avatar />
</div>
</template>
<script lang="ts">
import { defineComponent, computed, unref } from 'vue';
import { getModules } from '@/modules/';
import ModuleBarLogo from '../module-bar-logo/';
import ModuleBarAvatar from '../module-bar-avatar/';
import { useUserStore } from '@/stores/';
import { orderBy } from 'lodash';
import { ModuleConfig } from '@directus/shared/types';
export default defineComponent({
components: {
ModuleBarLogo,
ModuleBarAvatar,
},
setup() {
const userStore = useUserStore();
const { modules } = getModules();
const internalModules = computed(() => {
const customModuleListing = userStore.currentUser?.role.module_list;
const registeredModules = orderBy(
modules.value
.map((module: ModuleConfig) => ({
...module,
href: module.link,
to: module.link === undefined ? `/${module.id}` : '',
}))
.filter((module: ModuleConfig) => {
if (module.hidden !== undefined && unref(module.hidden) === true) {
return false;
}
return true;
}),
['order'],
['asc']
);
if (customModuleListing && Array.isArray(customModuleListing) && customModuleListing.length > 0) {
return [
...customModuleListing.map((custom) => {
if (custom.link?.startsWith('http') || custom.link?.startsWith('//')) {
return {
...custom,
href: custom.link,
};
} else {
return {
...custom,
to: custom.link,
};
}
}),
...registeredModules.filter((module) => module.persistent === true),
];
}
return registeredModules;
});
return { internalModules, modules };
},
});
</script>
<style>
body {
--module-background: #18222f;
--module-background-alt: var(--background-normal);
--module-icon: #8196b1;
--module-icon-alt: var(--foreground-normal-alt);
}
</style>
<style lang="scss" scoped>
.module-bar {
display: flex;
flex-direction: column;
width: 60px;
height: 100%;
background-color: var(--module-background);
.modules {
flex-grow: 1;
overflow-x: hidden;
overflow-y: auto;
}
.v-button {
--v-button-color: var(--module-icon);
--v-button-color-hover: var(--white);
--v-button-color-active: var(--module-icon-alt);
--v-button-background-color: var(--module-background);
--v-button-background-color-hover: var(--module-background);
--v-button-background-color-active: var(--module-background-alt);
}
}
</style>

View File

@@ -1,25 +0,0 @@
# Module bar
The left most sidebar that holds the module navigation.
## Usage
```html
<module-bar />
```
## Props
n/a
## Slots
n/a
## Events
n/a
## CSS Variables
n/a

View File

@@ -65,7 +65,7 @@
<script lang="ts">
import { useI18n } from 'vue-i18n';
import { defineComponent, ref, provide, toRefs, computed } from 'vue';
import ModuleBar from './components/module-bar/';
import ModuleBar from './components/module-bar.vue';
import SidebarDetailGroup from './components/sidebar-detail-group/';
import HeaderBar from './components/header-bar';
import ProjectInfo from './components/project-info';

View File

@@ -78,3 +78,7 @@ By default, the `create-directus-project` tool will set the file permissions of
(0640). If you run Directus from a separate user on your machine, make sure these permissions are correct.
:::
## Configure / Update / Upgrade your Project
See the [Project Guide](/guides/projects/#upgrading-updating-a-project) to learn how to maintain your project further.

View File

@@ -14,9 +14,9 @@ available. Since iisnode simply pipes requests to files, running the directus CL
this, use an entrypoint script like the `index.js` below.
```js
var { default: start } = require('directus/dist/start');
var { startServer } = require('directus/dist/server');
start();
startServer();
```
## web.config

View File

@@ -49,15 +49,15 @@ do not need to worry about choosing a specific port. Just use an arbitrary numbe
Add Directus and your database connector as a dependency. To execute Directus' `bootstrap` command you also have to add
a script entry for it.
```
```json
{
"scripts": {
"bootstrap": "directus bootstrap"
},
"dependencies": {
"directus": "*",
"mysql": "^2.18.1"
}
"scripts": {
"bootstrap": "directus bootstrap"
},
"dependencies": {
"directus": "*",
"mysql": "^2.18.1"
}
}
```
@@ -65,9 +65,10 @@ a script entry for it.
Instead of a start command, Plesk wants a startup file. So create a `index.js` with the following content:
```
var { default: start } = require('directus/dist/start');
start();
```js
var { startServer } = require('directus/dist/server');
startServer();
```
### 4. Add .npmrc
@@ -99,7 +100,7 @@ You get the console output after the script has run through.
You may run into an error of argon2 telling you that glibc is missing. If that's the case try adding and running this
script entry to your package.json:
```
```json
"scripts" {
"argon2-rebuild": "npm rebuild argon2 --build-from-source",
<...>

View File

@@ -29,7 +29,7 @@
"license": "ISC",
"gitHead": "24621f3934dc77eb23441331040ed13c676ceffd",
"devDependencies": {
"directory-tree": "2.3.1",
"directory-tree": "2.4.0",
"fs-extra": "10.0.0",
"lodash.get": "4.4.2",
"micromark": "3.0.5",

View File

@@ -44,9 +44,6 @@ CSV of IP addresses that have access to this role. Allows you to configure an al
`enforce_tfa` **boolean**\
Whether or not Two-Factor Authentication is required for users in this role.
`module_list` **object**\
Override for the module listing in the left most sidebar of the Admin App.
`collection_list` **object**\
Override for the collection listing in the navigation of the collections module in the Admin App.
@@ -71,7 +68,6 @@ The users in this role. One-to-many to [users](/reference/api/system/users/).
"description": null,
"ip_access": null,
"enforce_tfa": false,
"module_list": null,
"collection_list": null,
"admin_access": true,
"app_access": true,

Some files were not shown because too many files have changed in this diff Show More