Resource names are unique per owning principal, so different users can legally create same-name GPU instances, templates, SSH public keys, storage volumes and storage types — but the admin's cross-tenant lists and the instance-create template picker rendered them indistinguishably. - Group the template picker by owning scope: Your Templates, Global Templates, then — admin cross-tenant view only — one group per owner. A single group renders flat without headers. A plugin can take over grouping via hooks.useTemplateOwnerGroups when its principal model scopes templates beyond USER owners; a plugin without the hook keeps the flat list. - Add an admin-only Creator column to the Instances, SSH Public Keys, Storage and Storage Types tables, sitting right before Created (mirroring the API Keys page convention). Resolves creator_id to a username via the user directory, falling back to owner_principal_id for legacy rows — a personal-scope row's creator IS its owner. - Tag template cards with their owner scope (Global / username) for admins. The Creator column and the card tag defer to a plugin that registers the page's list columns / the OwnerScopeTag slot. Requires the gpustack server change that records creator_id on templates, SSH public keys and storage types.
180 lines
14 KiB
TypeScript
180 lines
14 KiB
TypeScript
export default {
|
||
'gpuservice.template': 'Шаблон экземпляра GPU',
|
||
'gpuservice.template.add': 'Добавить шаблон экземпляра',
|
||
'gpuservice.template.edit': 'Редактировать шаблон экземпляра',
|
||
'gpuservice.template.filter.name': 'Фильтр по имени',
|
||
'gpuservice.template.filter.vendor': 'Фильтр по производителю',
|
||
'gpuservice.template.image': 'Образ',
|
||
'gpuservice.template.imagePullPolicy': 'Политика загрузки образа',
|
||
'gpuservice.template.imagePullPolicy.always': 'Всегда загружать',
|
||
'gpuservice.template.imagePullPolicy.ifNotPresent':
|
||
'Загружать при отсутствии',
|
||
'gpuservice.template.imagePullPolicy.never': 'Никогда не загружать',
|
||
'gpuservice.template.command': 'Команда запуска контейнера',
|
||
'gpuservice.template.command.placeholder':
|
||
'Разделяйте аргументы пробелами; аргументы с пробелами заключайте в кавычки, например: /bin/bash -c "echo hello world"',
|
||
'gpuservice.template.mountPath': 'Путь монтирования',
|
||
'gpuservice.template.mountPath.tips':
|
||
'Путь, по которому том хранилища монтируется по умолчанию при создании экземпляра из этого шаблона. Может использоваться для сохранения данных, которые нужно сохранить во время работы экземпляра.',
|
||
'gpuservice.template.containerDisk': 'Диск контейнера (GB)',
|
||
'gpuservice.template.containerDisk.tips':
|
||
'Размер системного диска контейнера.',
|
||
'gpuservice.template.memory': 'Память (GB)',
|
||
'gpuservice.instance.containerDisk.remaining':
|
||
'Диск контейнера (Макс. {count} GB)',
|
||
'gpuservice.instance.memory.remaining': 'Память (Макс. {count} GB)',
|
||
'gpuservice.template.displayName': 'Отображаемое имя',
|
||
'gpuservice.template.displayName.max':
|
||
'Отображаемое имя не должно превышать 63 символа.',
|
||
'gpuservice.template.ports': 'Порты',
|
||
'gpuservice.template.ports.add': 'Добавить порт',
|
||
'gpuservice.template.ports.invalid': 'Заполните настройки портов полностью.',
|
||
'gpuservice.template.ports.name': 'Имя',
|
||
'gpuservice.template.ports.name.max':
|
||
'Имя порта не должно превышать 16 символов.',
|
||
'gpuservice.template.ports.name.duplicate':
|
||
'Имена портов должны быть уникальными.',
|
||
'gpuservice.template.env': 'Переменные окружения',
|
||
'gpuservice.template.env.add': 'Добавить переменную окружения',
|
||
'gpuservice.template.env.invalid':
|
||
'Заполните переменные окружения полностью.',
|
||
'gpuservice.template.env.name': 'Имя',
|
||
'gpuservice.template.env.value': 'Значение',
|
||
'gpuservice.template.card.image': 'Образ',
|
||
'gpuservice.template.card.mount': 'Монтирование',
|
||
'gpuservice.template.card.resources': 'Ресурсы',
|
||
'gpuservice.template.card.ports': 'Порты',
|
||
'gpuservice.storageType': 'Тип хранилища',
|
||
'gpuservice.storageType.add': 'Добавить тип хранилища',
|
||
'gpuservice.storageType.edit': 'Изменить тип хранилища',
|
||
'gpuservice.storageType.filter.name': 'Поиск по имени',
|
||
'gpuservice.storageType.kind': 'Тип',
|
||
'gpuservice.storageType.mountOptions': 'Параметры монтирования',
|
||
'gpuservice.storageType.nfs.server': 'Сервер NFS',
|
||
'gpuservice.storageType.nfs.server.tips':
|
||
'Убедитесь, что адрес NFS-сервера доступен из всех кластеров Kubernetes.',
|
||
'gpuservice.storageType.nfs.share': 'Путь общего ресурса',
|
||
'gpuservice.storageType.nfs.share.tips':
|
||
'В этом общем пути будет автоматически создан каталог на основе названия организации и названия хранилища. Если указан подкаталог, итоговый каталог будет создан внутри него.',
|
||
'gpuservice.storageType.nfs.subDirectory': 'Подкаталог',
|
||
'gpuservice.storageType.nfs.subDirectory.tips':
|
||
'Если поле пустое, будет создан подкаталог с именем постоянного тома. Если задано, под этим подкаталогом будет создан каталог с именем постоянного тома.',
|
||
'gpuservice.storageType.nfs.mountPermissions': 'Права монтирования',
|
||
'gpuservice.storageType.nfs.mountPermissions.tips':
|
||
'Наследует права файлов с NFS-сервера.',
|
||
'gpuservice.storageType.s3.endpoint': 'Endpoint',
|
||
'gpuservice.storageType.s3.endpoint.tips':
|
||
'Убедитесь, что S3 endpoint доступен из всех кластеров Kubernetes.',
|
||
'gpuservice.storageType.s3.endpoint.rule':
|
||
'Должен начинаться с http или https',
|
||
'gpuservice.storageType.s3.region': 'Регион',
|
||
'gpuservice.storageType.s3.bucket': 'Бакет',
|
||
'gpuservice.storageType.s3.bucket.tips':
|
||
'Если поле пустое, будет создан новый бакет с именем постоянного тома. Если задано, в этом бакете будет создан подкаталог с именем постоянного тома.',
|
||
'gpuservice.storageType.s3.bucket.tips1':
|
||
'В этом бакете будет автоматически создан префикс на основе названия организации и названия хранилища.',
|
||
'gpuservice.storageType.s3.bucket.tips2':
|
||
'Например, если организация называется <span class="desc-block">awesome-group</span>, а хранилище — <span class="desc-block">storage-1</span>, итоговый префикс будет: <span class="desc-block">awesome-group/storage-1</span>.',
|
||
'gpuservice.storageType.s3.accessKey': 'Access Key',
|
||
'gpuservice.storageType.s3.secretKey': 'Secret Key',
|
||
'gpuservice.storageType.s3.insecure':
|
||
'Пропустить проверку сертификата TLS/SSL',
|
||
'gpuservice.storageType.s3.insecure.tips':
|
||
'Если включено, сертификат сервера S3 не проверяется. Подходит для внутреннего тестирования или самоподписанных сертификатов; в производственной среде включайте с осторожностью.',
|
||
'gpuservice.publicKey': 'Открытый ключ SSH',
|
||
'gpuservice.publicKey.add': 'Добавить открытый ключ SSH',
|
||
'gpuservice.publicKey.edit': 'Изменить открытый ключ SSH',
|
||
'gpuservice.publicKey.filter.name': 'Поиск по имени',
|
||
'gpuservice.publicKey.label': 'Открытый ключ SSH',
|
||
'gpuservice.instance.ssh.enable': 'Включить SSH-доступ',
|
||
'gpuservice.instance.ssh.assignKey': 'Назначить открытый ключ SSH',
|
||
'gpuservice.instance.ssh.addKey': 'Добавить открытый ключ SSH',
|
||
'gpuservice.publicKey.placeholder':
|
||
'Начинается с ssh-rsa или ssh-ed25519, по одному открытому ключу на строку\n\nПросмотр открытого ключа:\n- RSA\ncat ~/.ssh/id_rsa.pub\n- Ed25519\ncat ~/.ssh/id_ed25519.pub',
|
||
'gpuservice.instance': 'Экземпляр GPU',
|
||
'gpuservice.instance.add': 'Добавить экземпляр GPU',
|
||
'gpuservice.instance.edit': 'Редактировать экземпляр GPU',
|
||
'gpuservice.instance.filter.cluster': 'Фильтр по кластеру',
|
||
'gpuservice.instance.name': 'Имя экземпляра',
|
||
'gpuservice.instance.name.required': 'Введите имя экземпляра',
|
||
'gpuservice.instance.section.basic': 'Основная информация',
|
||
'gpuservice.instance.section.type': 'Тип экземпляра',
|
||
'gpuservice.instance.section.template': 'Шаблон экземпляра',
|
||
'gpuservice.instance.types': 'Типы экземпляров',
|
||
'gpuservice.instance.templates': 'Шаблоны экземпляров',
|
||
'gpuservice.instance.section.storage': 'Том хранилища',
|
||
'gpuservice.instance.type.required': 'Выберите тип экземпляра',
|
||
'gpuservice.instance.type.noAvailable': 'Нет доступных типов экземпляров',
|
||
'gpuservice.instance.gpuCount': 'Количество GPU',
|
||
'gpuservice.instance.gpuCount.required': 'Введите количество GPU',
|
||
'gpuservice.instance.gpuCount.max': 'Выберите максимум {count} GPU-карт',
|
||
'gpuservice.instance.gpuCount.min': 'Выберите минимум {count} GPU-карт',
|
||
'gpuservice.instance.cpuCount.max': 'Выберите максимум {count} ядер CPU',
|
||
'gpuservice.instance.cpuCount.min': 'Выберите минимум {count} ядер CPU',
|
||
'gpuservice.instance.gpuCount.noAvailable':
|
||
'Нет доступных ресурсов GPU, выберите другой тип экземпляра.',
|
||
'gpuservice.instance.gpuCount.zero': 'Только CPU, для подготовки окружения.',
|
||
'gpuservice.instance.stock': 'Остаток',
|
||
'gpuservice.instance.sliced': 'Разделено',
|
||
'gpuservice.instance.memory': 'VRAM',
|
||
'gpuservice.instance.ram': 'RAM',
|
||
'gpuservice.instance.os': 'ОС',
|
||
'gpuservice.instance.arch': 'Архитектура',
|
||
'gpuservice.instance.disk': 'Диск',
|
||
'gpuservice.table.count': 'Количество',
|
||
'gpuservice.instance.disk.system': 'Системный диск',
|
||
'gpuservice.instance.disk.ephemeral': 'Временное хранилище',
|
||
'gpuservice.instance.disk.persistent': 'Постоянное хранилище',
|
||
'gpuservice.instance.search.type.placeholder': 'Поиск по имени',
|
||
'gpuservice.instance.search.template.placeholder':
|
||
'Поиск по имени шаблона, образу или пути монтирования',
|
||
'gpuservice.instance.template.image': 'Образ',
|
||
'gpuservice.instance.template.mount': 'Монтирование',
|
||
'gpuservice.instance.connect': 'Подключение',
|
||
'gpuservice.instance.connect.copySshCommand': 'Скопировать команду SSH',
|
||
'gpuservice.instance.event.reason': 'Причина',
|
||
'gpuservice.instance.event.message': 'Сообщение',
|
||
'gpuservice.instance.event.source': 'Источник',
|
||
'gpuservice.instance.event.count': 'Кол-во',
|
||
'gpuservice.instance.event.lastSeen': 'Последнее событие',
|
||
'gpuservice.instance.event.recentHourTip':
|
||
'Отображаются только события за последний час',
|
||
'gpuservice.instance.event.tab.instance': 'События экземпляра',
|
||
'gpuservice.instance.event.tab.volume': 'События тома',
|
||
'gpuservice.instance.recreate.confirm.title': 'Подтвердить пересоздание',
|
||
'gpuservice.instance.recreate.confirm.content':
|
||
'Текущий экземпляр будет сначала удалён, а затем пересоздан с текущей конфигурацией.\n <span style="font-size: 13px;font-weight: 700">{name}</span>',
|
||
'gpuservice.storage': 'Хранилище',
|
||
'gpuservice.storage.add': 'Добавить хранилище',
|
||
'gpuservice.storage.edit': 'Редактировать хранилище',
|
||
'gpuservice.storage.filter.cluster': 'Фильтр по кластеру',
|
||
'gpuservice.storage.type': 'Тип хранилища',
|
||
'gpuservice.storage.type.local': 'Локальное хранилище',
|
||
'gpuservice.storage.type.shared': 'Общее хранилище',
|
||
'gpuservice.storage.type.object': 'Объектное хранилище',
|
||
'gpuservice.storage.capacity': 'Объём',
|
||
'gpuservice.storage.accessMode': 'Режим доступа',
|
||
'gpuservice.storage.persistent': 'Постоянное',
|
||
'gpuservice.storage.temporary': 'Временное',
|
||
'gpuservice.storage.persistentVolume': 'Постоянное',
|
||
'gpuservice.storage.persistentVolume.required': 'Выберите хранилище',
|
||
'gpuservice.storage.persistentVolume.capacity': 'Ёмкость (ГБ)',
|
||
'gpuservice.storage.persistentVolume.capacity.required': 'Введите ёмкость',
|
||
'gpuservice.storage.persistentVolume.releaseWithInstance':
|
||
'Освобождать вместе с экземпляром',
|
||
'gpuservice.storage.tempCapacity': 'Объём (ГБ)',
|
||
'gpuservice.storage.tempCapacity.required':
|
||
'Введите объём временного хранилища',
|
||
'gpuservice.form.rule.name':
|
||
"Строчные буквы, цифры и '-'. Должно начинаться и заканчиваться буквой или цифрой, без подряд идущих '-', максимум 63 символа.",
|
||
'gpuservice.storage.temporary.tips':
|
||
'Data is cleared when the instance stops.',
|
||
'gpuservice.storage.persistentVolume.tips':
|
||
'Data persists across instance restarts. Persistent volumes remain intact after instance termination and can be shared by multiple instances.',
|
||
'gpuservice.form.storage.select': 'Выберите хранилище',
|
||
'gpuservice.creator': 'Создатель',
|
||
'gpuservice.owner.global': 'Глобальный',
|
||
'gpuservice.template.group.yours': 'Ваши шаблоны',
|
||
'gpuservice.template.group.global': 'Глобальные шаблоны'
|
||
};
|