mirror of
https://github.com/directus/directus.git
synced 2026-01-29 09:28:06 -05:00
Merge branch 'main' into insights
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
136
api/src/cli/commands/schema/apply.ts
Normal file
136
api/src/cli/commands/schema/apply.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
58
api/src/cli/commands/schema/snapshot.ts
Normal file
58
api/src/cli/commands/schema/snapshot.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
55
api/src/database/migrations/20210910A-move-module-setup.ts
Normal file
55
api/src/database/migrations/20210910A-move-module-setup.ts
Normal 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');
|
||||
});
|
||||
}
|
||||
@@ -57,3 +57,4 @@ data:
|
||||
display_template: '{{ first_name }} {{ last_name }}'
|
||||
- collection: directus_webhooks
|
||||
note: $t:directus_collection.directus_webhooks
|
||||
- collection: directus_migrations
|
||||
|
||||
10
api/src/database/system-data/fields/migrations.yaml
Normal file
10
api/src/database/system-data/fields/migrations.yaml
Normal 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
|
||||
@@ -33,3 +33,5 @@ fields:
|
||||
|
||||
- field: layout
|
||||
width: half
|
||||
|
||||
- field: refresh_interval
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -332,3 +332,7 @@ fields:
|
||||
type:
|
||||
_neq: 'raster'
|
||||
hidden: true
|
||||
|
||||
- field: module_bar
|
||||
interface: system-modules
|
||||
special: json
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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)}`;
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
30
api/src/types/snapshot.ts
Normal 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>[];
|
||||
}[];
|
||||
};
|
||||
112
api/src/utils/apply-snapshot.ts
Normal file
112
api/src/utils/apply-snapshot.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
116
api/src/utils/get-snapshot-diff.ts
Normal file
116
api/src/utils/get-snapshot-diff.ts
Normal 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;
|
||||
}
|
||||
34
api/src/utils/get-snapshot.ts
Normal file
34
api/src/utils/get-snapshot.ts
Normal 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
2
api/start.js
Normal file
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env node
|
||||
require('./dist/start.js');
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 }) {
|
||||
|
||||
@@ -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 }) {
|
||||
|
||||
@@ -379,6 +379,7 @@ body {
|
||||
}
|
||||
|
||||
.append {
|
||||
flex-shrink: 0;
|
||||
margin-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
& + & {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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: '';
|
||||
|
||||
@@ -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;
|
||||
|
||||
12
app/src/interfaces/_system/system-modules/index.ts
Normal file
12
app/src/interfaces/_system/system-modules/index.ts
Normal 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,
|
||||
});
|
||||
307
app/src/interfaces/_system/system-modules/system-modules.vue
Normal file
307
app/src/interfaces/_system/system-modules/system-modules.vue
Normal 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>
|
||||
@@ -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 }}
|
||||
|
||||
153
app/src/interfaces/translations/language-select.vue
Normal file
153
app/src/interfaces/translations/language-select.vue
Normal 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>
|
||||
@@ -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,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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: تتبع النشاط فقط
|
||||
|
||||
@@ -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: Напасване (запазване на съотношението)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 n’a é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
|
||||
|
||||
@@ -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: רוחב מלא
|
||||
|
||||
@@ -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: आर्काइव
|
||||
|
||||
@@ -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ő
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: シングルオブジェクトに設定する
|
||||
|
||||
@@ -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: 중복 필드
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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: Талбарыг хувилах
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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ść
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: Очистить фильтр местоположения
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: Дуплирај поље
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: เรขาคณิต
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: Архів
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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: '沒有 Webhooks|1 個 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: 封存
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
109
app/src/views/private/components/module-bar.vue
Normal file
109
app/src/views/private/components/module-bar.vue
Normal 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>
|
||||
@@ -1,4 +0,0 @@
|
||||
import ModuleBar from './module-bar.vue';
|
||||
|
||||
export { ModuleBar };
|
||||
export default ModuleBar;
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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';
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
<...>
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user