Add multilingual support with translations for German, Russian, French, and Chinese
Added time limits and backup functions for servers
This commit is contained in:
@@ -60,11 +60,13 @@ CREATE TABLE IF NOT EXISTS vpn_clients (
|
||||
last_handshake TIMESTAMP NULL COMMENT 'Last successful WireGuard handshake',
|
||||
last_sync_at TIMESTAMP NULL COMMENT 'Last time stats were synced from server',
|
||||
status ENUM('active', 'disabled') DEFAULT 'active',
|
||||
expires_at TIMESTAMP NULL COMMENT 'Client expiration date (NULL = never expires)',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_server_id (server_id),
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_expires_at (expires_at),
|
||||
INDEX idx_last_handshake (last_handshake),
|
||||
UNIQUE KEY unique_server_client_ip (server_id, client_ip),
|
||||
FOREIGN KEY (server_id) REFERENCES vpn_servers(id) ON DELETE CASCADE,
|
||||
@@ -137,6 +139,26 @@ CREATE TABLE IF NOT EXISTS api_keys (
|
||||
INDEX idx_active (is_active)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Server Backups table
|
||||
CREATE TABLE IF NOT EXISTS server_backups (
|
||||
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||
server_id INT UNSIGNED NOT NULL,
|
||||
backup_name VARCHAR(255) NOT NULL COMMENT 'Backup file name',
|
||||
backup_path VARCHAR(500) NOT NULL COMMENT 'Path to backup file',
|
||||
backup_size BIGINT UNSIGNED DEFAULT 0 COMMENT 'Backup file size in bytes',
|
||||
clients_count INT UNSIGNED DEFAULT 0 COMMENT 'Number of clients in backup',
|
||||
backup_type ENUM('manual', 'automatic') DEFAULT 'manual',
|
||||
status ENUM('creating', 'completed', 'failed') DEFAULT 'creating',
|
||||
error_message TEXT NULL COMMENT 'Error message if backup failed',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
created_by INT UNSIGNED NULL COMMENT 'User who created the backup',
|
||||
INDEX idx_server_id (server_id),
|
||||
INDEX idx_status (status),
|
||||
INDEX idx_created_at (created_at),
|
||||
FOREIGN KEY (server_id) REFERENCES vpn_servers(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- Insert default admin user
|
||||
INSERT IGNORE INTO users (email, password_hash, name, role, status)
|
||||
VALUES ('admin@amnez.ia', '$2y$10$SKEI6ogiWr2gsSG/nELLp.JcfpGhxsDLAAI7gdtTOI3ELz4zJzzPG', 'Administrator', 'admin', 'active');
|
||||
@@ -160,8 +182,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
|
||||
('en', 'auth.register', 'Register'),
|
||||
('en', 'clients.actions', 'Actions'),
|
||||
('en', 'clients.add', 'Add Client'),
|
||||
('en', 'clients.create', 'Create Client'),
|
||||
('en', 'clients.delete', 'Delete'),
|
||||
('en', 'clients.delete_confirm', 'Delete this client permanently?'),
|
||||
('en', 'clients.download_config', 'Download Config'),
|
||||
('en', 'clients.expiration', 'Expiration'),
|
||||
('en', 'clients.expired', 'Expired'),
|
||||
('en', 'clients.never', 'Never'),
|
||||
('en', 'clients.never_expires', 'Never expires'),
|
||||
('en', 'clients.no_clients', 'No clients yet'),
|
||||
('en', 'clients.ip', 'IP Address'),
|
||||
('en', 'clients.last_handshake', 'Last Handshake'),
|
||||
('en', 'clients.name', 'Client Name'),
|
||||
@@ -169,12 +198,25 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
|
||||
('en', 'clients.received', 'Received'),
|
||||
('en', 'clients.restore', 'Restore'),
|
||||
('en', 'clients.revoke', 'Revoke'),
|
||||
('en', 'clients.revoke_confirm', 'Revoke access for this client?'),
|
||||
('en', 'clients.sent', 'Sent'),
|
||||
('en', 'clients.server', 'Server'),
|
||||
('en', 'clients.status', 'Status'),
|
||||
('en', 'clients.sync_stats', 'Sync Stats'),
|
||||
('en', 'clients.title', 'Clients'),
|
||||
('en', 'clients.traffic', 'Traffic'),
|
||||
('en', 'backups.title', 'Server Backups'),
|
||||
('en', 'backups.create', 'Create Backup'),
|
||||
('en', 'backups.restore', 'Restore'),
|
||||
('en', 'backups.no_backups', 'No backups yet'),
|
||||
('en', 'backups.create_confirm', 'Create backup of all clients on this server?'),
|
||||
('en', 'backups.restore_confirm', 'Restore clients from this backup? Existing clients will not be affected.'),
|
||||
('en', 'backups.delete_confirm', 'Delete this backup permanently?'),
|
||||
('en', 'backups.created_success', 'Backup created successfully'),
|
||||
('en', 'backups.restored_success', 'Restored'),
|
||||
('en', 'backups.deleted_success', 'Backup deleted successfully'),
|
||||
('en', 'backups.login_required', 'Please login via API to manage backups'),
|
||||
('en', 'common.days', 'days'),
|
||||
('en', 'dashboard.active_clients', 'Active Clients'),
|
||||
('en', 'dashboard.add_first_server', 'Add First Server'),
|
||||
('en', 'dashboard.get_started', 'Get started by adding your first VPN server'),
|
||||
@@ -188,6 +230,7 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
|
||||
('en', 'dashboard.welcome', 'Welcome to Amnezia VPN Management Panel'),
|
||||
('en', 'form.cancel', 'Cancel'),
|
||||
('en', 'form.close', 'Close'),
|
||||
('en', 'form.create', 'Create'),
|
||||
('en', 'form.loading', 'Loading...'),
|
||||
('en', 'form.processing', 'Processing...'),
|
||||
('en', 'form.save', 'Save'),
|
||||
@@ -221,7 +264,10 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
|
||||
('en', 'settings.api_keys', 'API Keys'),
|
||||
('en', 'settings.api_keys_desc', 'Configure API keys for external services'),
|
||||
('en', 'settings.auto_translate', 'Auto-translate'),
|
||||
('en', 'settings.change_password', 'Change Password'),
|
||||
('en', 'settings.confirm_password', 'Confirm Password'),
|
||||
('en', 'settings.confirm_translate', 'Start automatic translation? This may take a few minutes.'),
|
||||
('en', 'settings.current_password', 'Current Password'),
|
||||
('en', 'settings.description', 'Manage panel configuration and API integrations'),
|
||||
('en', 'settings.error_empty_key', 'API key cannot be empty'),
|
||||
('en', 'settings.error_invalid_key', 'Invalid API key format'),
|
||||
@@ -231,12 +277,28 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
|
||||
('en', 'settings.key_saved', 'API key saved successfully'),
|
||||
('en', 'settings.keys', 'keys'),
|
||||
('en', 'settings.language', 'Language'),
|
||||
('en', 'settings.min_6_chars', 'Minimum 6 characters'),
|
||||
('en', 'settings.new_password', 'New Password'),
|
||||
('en', 'settings.profile', 'Profile'),
|
||||
('en', 'settings.progress', 'Progress'),
|
||||
('en', 'settings.translations', 'Translations'),
|
||||
('en', 'settings.translation_complete', 'Translation completed'),
|
||||
('en', 'settings.translation_status', 'Translation Status'),
|
||||
('en', 'settings.users', 'Users'),
|
||||
('en', 'status.active', 'Active'),
|
||||
('en', 'status.deploying', 'Deploying'),
|
||||
('en', 'status.disabled', 'Disabled'),
|
||||
('en', 'status.error', 'Error'),
|
||||
('en', 'status.inactive', 'Inactive')
|
||||
('en', 'status.inactive', 'Inactive'),
|
||||
('en', 'users.add_user', 'Add User'),
|
||||
('en', 'users.all_users', 'All Users'),
|
||||
('en', 'users.administrator', 'Administrator'),
|
||||
('en', 'users.created', 'Created'),
|
||||
('en', 'users.delete_confirm', 'Delete {0}?'),
|
||||
('en', 'users.role', 'Role'),
|
||||
('en', 'users.role_admin', 'Admin'),
|
||||
('en', 'users.role_user', 'User'),
|
||||
('en', 'settings.api_key_configured', 'API Key Configured'),
|
||||
('en', 'settings.no_api_key', 'No API key configured. Auto-translation will not work.'),
|
||||
('en', 'settings.skip_validation', 'Skip validation (save without testing)')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,127 @@
|
||||
-- Spanish translations
|
||||
-- This migration adds Spanish language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('es', 'auth.email', 'Correo electrónico'),
|
||||
('es', 'auth.login', 'Iniciar sesión'),
|
||||
('es', 'auth.name', 'Nombre'),
|
||||
('es', 'auth.password', 'Contraseña'),
|
||||
('es', 'auth.register', 'Registrarse'),
|
||||
('es', 'backups.create', 'Crear copia de seguridad'),
|
||||
('es', 'backups.create_confirm', '¿Crear copia de seguridad de todos los clientes en este servidor?'),
|
||||
('es', 'backups.created_success', 'Copia de seguridad creada exitosamente'),
|
||||
('es', 'backups.delete_confirm', '¿Eliminar esta copia de seguridad permanentemente?'),
|
||||
('es', 'backups.deleted_success', 'Copia de seguridad eliminada exitosamente'),
|
||||
('es', 'backups.login_required', 'Por favor inicie sesión vía API para gestionar copias de seguridad'),
|
||||
('es', 'backups.no_backups', 'Aún no hay copias de seguridad'),
|
||||
('es', 'backups.restore', 'Restaurar'),
|
||||
('es', 'backups.restore_confirm', '¿Restaurar clientes desde esta copia de seguridad? Los clientes existentes no se verán afectados.'),
|
||||
('es', 'backups.restored_success', 'Restaurado'),
|
||||
('es', 'backups.title', 'Copias de seguridad del servidor'),
|
||||
('es', 'clients.actions', 'Acciones'),
|
||||
('es', 'clients.add', 'Agregar cliente'),
|
||||
('es', 'clients.create', 'Crear cliente'),
|
||||
('es', 'clients.delete', 'Eliminar'),
|
||||
('es', 'clients.download_config', 'Descargar configuración'),
|
||||
('es', 'clients.expiration', 'Vencimiento'),
|
||||
('es', 'clients.expired', 'Vencido'),
|
||||
('es', 'clients.ip', 'Dirección IP'),
|
||||
('es', 'clients.last_handshake', 'Último contacto'),
|
||||
('es', 'clients.name', 'Nombre del cliente'),
|
||||
('es', 'clients.never_expires', 'Nunca vence'),
|
||||
('es', 'clients.qr_code', 'Código QR'),
|
||||
('es', 'clients.received', 'Recibido'),
|
||||
('es', 'clients.restore', 'Restaurar'),
|
||||
('es', 'clients.revoke', 'Revocar'),
|
||||
('es', 'clients.sent', 'Enviado'),
|
||||
('es', 'clients.server', 'Servidor'),
|
||||
('es', 'clients.status', 'Estado'),
|
||||
('es', 'clients.sync_stats', 'Sincronizar estadísticas'),
|
||||
('es', 'clients.title', 'Clientes'),
|
||||
('es', 'clients.traffic', 'Tráfico'),
|
||||
('es', 'common.days', 'días'),
|
||||
('es', 'dashboard.active_clients', 'Clientes activos'),
|
||||
('es', 'dashboard.add_first_server', 'Agregar primer servidor'),
|
||||
('es', 'dashboard.get_started', 'Comience agregando su primer servidor VPN'),
|
||||
('es', 'dashboard.no_servers', 'Aún no hay servidores'),
|
||||
('es', 'dashboard.quick_actions', 'Acciones rápidas'),
|
||||
('es', 'dashboard.recent_servers', 'Servidores recientes'),
|
||||
('es', 'dashboard.title', 'Panel de control'),
|
||||
('es', 'dashboard.total_clients', 'Total de clientes'),
|
||||
('es', 'dashboard.total_servers', 'Total de servidores'),
|
||||
('es', 'dashboard.total_traffic', 'Tráfico total'),
|
||||
('es', 'dashboard.welcome', 'Bienvenido al Panel de Gestión de Amnezia VPN'),
|
||||
('es', 'form.cancel', 'Cancelar'),
|
||||
('es', 'form.close', 'Cerrar'),
|
||||
('es', 'form.create', 'Crear'),
|
||||
('es', 'form.loading', 'Cargando...'),
|
||||
('es', 'form.processing', 'Procesando...'),
|
||||
('es', 'form.save', 'Guardar'),
|
||||
('es', 'form.submit', 'Enviar'),
|
||||
('es', 'form.update', 'Actualizar'),
|
||||
('es', 'menu.clients', 'Clientes'),
|
||||
('es', 'menu.dashboard', 'Panel de control'),
|
||||
('es', 'menu.logout', 'Cerrar sesión'),
|
||||
('es', 'menu.servers', 'Servidores'),
|
||||
('es', 'menu.settings', 'Configuración'),
|
||||
('es', 'menu.users', 'Usuarios'),
|
||||
('es', 'message.confirm', '¿Está seguro?'),
|
||||
('es', 'message.deleted', 'Eliminado exitosamente'),
|
||||
('es', 'message.deployed', 'Implementado exitosamente'),
|
||||
('es', 'message.error', 'Ha ocurrido un error'),
|
||||
('es', 'message.saved', 'Guardado exitosamente'),
|
||||
('es', 'message.success', 'Operación completada exitosamente'),
|
||||
('es', 'servers.actions', 'Acciones'),
|
||||
('es', 'servers.add', 'Agregar servidor'),
|
||||
('es', 'servers.clients', 'Clientes'),
|
||||
('es', 'servers.delete', 'Eliminar'),
|
||||
('es', 'servers.deploy', 'Implementar'),
|
||||
('es', 'servers.edit', 'Editar'),
|
||||
('es', 'servers.host', 'Host'),
|
||||
('es', 'servers.name', 'Nombre'),
|
||||
('es', 'servers.port', 'Puerto'),
|
||||
('es', 'servers.status', 'Estado'),
|
||||
('es', 'servers.title', 'Servidores'),
|
||||
('es', 'servers.view', 'Ver'),
|
||||
('es', 'settings.actions', 'Acciones'),
|
||||
('es', 'settings.api_key_configured', 'Clave API configurada'),
|
||||
('es', 'settings.api_keys', 'Claves API'),
|
||||
('es', 'settings.api_keys_desc', 'Configurar claves API para servicios externos'),
|
||||
('es', 'settings.auto_translate', 'Auto-traducir'),
|
||||
('es', 'settings.change_password', 'Cambiar contraseña'),
|
||||
('es', 'settings.confirm_password', 'Confirmar contraseña'),
|
||||
('es', 'settings.confirm_translate', '¿Iniciar traducción automática? Esto puede tomar unos minutos.'),
|
||||
('es', 'settings.current_password', 'Contraseña actual'),
|
||||
('es', 'settings.description', 'Gestionar configuración del panel e integraciones API'),
|
||||
('es', 'settings.error_empty_key', 'La clave API no puede estar vacía'),
|
||||
('es', 'settings.error_invalid_key', 'Formato de clave API inválido'),
|
||||
('es', 'settings.error_key_test', 'Prueba de clave API fallida'),
|
||||
('es', 'settings.for_translation', 'para auto-traducción'),
|
||||
('es', 'settings.get_key_at', 'Obtenga su clave API en'),
|
||||
('es', 'settings.key_saved', 'Clave API guardada exitosamente'),
|
||||
('es', 'settings.keys', 'claves'),
|
||||
('es', 'settings.language', 'Idioma'),
|
||||
('es', 'settings.min_6_chars', 'Mínimo 6 caracteres'),
|
||||
('es', 'settings.new_password', 'Nueva contraseña'),
|
||||
('es', 'settings.no_api_key', 'No hay clave API configurada. La auto-traducción no funcionará.'),
|
||||
('es', 'settings.profile', 'Perfil'),
|
||||
('es', 'settings.progress', 'Progreso'),
|
||||
('es', 'settings.skip_validation', 'Omitir validación (guardar sin probar)'),
|
||||
('es', 'settings.translation_complete', 'Traducción completada'),
|
||||
('es', 'settings.translation_status', 'Estado de traducción'),
|
||||
('es', 'settings.translations', 'Traducciones'),
|
||||
('es', 'settings.users', 'Usuarios'),
|
||||
('es', 'status.active', 'Activo'),
|
||||
('es', 'status.deploying', 'Implementando'),
|
||||
('es', 'status.disabled', 'Deshabilitado'),
|
||||
('es', 'status.error', 'Error'),
|
||||
('es', 'status.inactive', 'Inactivo'),
|
||||
('es', 'users.add_user', 'Agregar usuario'),
|
||||
('es', 'users.administrator', 'Administrador'),
|
||||
('es', 'users.all_users', 'Todos los usuarios'),
|
||||
('es', 'users.created', 'Creado'),
|
||||
('es', 'users.delete_confirm', '¿Eliminar {0}?'),
|
||||
('es', 'users.role', 'Rol'),
|
||||
('es', 'users.role_admin', 'Administrador'),
|
||||
('es', 'users.role_user', 'Usuario')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,131 @@
|
||||
-- Russian translations
|
||||
-- This migration adds Russian language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('ru', 'auth.email', 'Email'),
|
||||
('ru', 'auth.login', 'Вход'),
|
||||
('ru', 'auth.name', 'Имя'),
|
||||
('ru', 'auth.password', 'Пароль'),
|
||||
('ru', 'auth.register', 'Регистрация'),
|
||||
('ru', 'backups.create', 'Создать резервную копию'),
|
||||
('ru', 'backups.create_confirm', 'Создать резервную копию всех клиентов на этом сервере?'),
|
||||
('ru', 'backups.created_success', 'Резервная копия успешно создана'),
|
||||
('ru', 'backups.delete_confirm', 'Удалить эту резервную копию навсегда?'),
|
||||
('ru', 'backups.deleted_success', 'Резервная копия успешно удалена'),
|
||||
('ru', 'backups.login_required', 'Пожалуйста, войдите через API для управления резервными копиями'),
|
||||
('ru', 'backups.no_backups', 'Пока нет резервных копий'),
|
||||
('ru', 'backups.restore', 'Восстановить'),
|
||||
('ru', 'backups.restore_confirm', 'Восстановить клиентов из этой резервной копии? Существующие клиенты не будут затронуты.'),
|
||||
('ru', 'backups.restored_success', 'Восстановлено'),
|
||||
('ru', 'backups.title', 'Резервные копии сервера'),
|
||||
('ru', 'clients.actions', 'Действия'),
|
||||
('ru', 'clients.add', 'Добавить клиента'),
|
||||
('ru', 'clients.create', 'Создать клиента'),
|
||||
('ru', 'clients.delete', 'Удалить'),
|
||||
('ru', 'clients.delete_confirm', 'Удалить этого клиента навсегда?'),
|
||||
('ru', 'clients.download_config', 'Скачать конфигурацию'),
|
||||
('ru', 'clients.expiration', 'Срок действия'),
|
||||
('ru', 'clients.expired', 'Истек'),
|
||||
('ru', 'clients.ip', 'IP-адрес'),
|
||||
('ru', 'clients.last_handshake', 'Последнее соединение'),
|
||||
('ru', 'clients.name', 'Имя клиента'),
|
||||
('ru', 'clients.never', 'Никогда'),
|
||||
('ru', 'clients.never_expires', 'Бессрочно'),
|
||||
('ru', 'clients.no_clients', 'Пока нет клиентов'),
|
||||
('ru', 'clients.qr_code', 'QR-код'),
|
||||
('ru', 'clients.received', 'Получено'),
|
||||
('ru', 'clients.restore', 'Восстановить'),
|
||||
('ru', 'clients.revoke', 'Отозвать'),
|
||||
('ru', 'clients.revoke_confirm', 'Отозвать доступ для этого клиента?'),
|
||||
('ru', 'clients.sent', 'Отправлено'),
|
||||
('ru', 'clients.server', 'Сервер'),
|
||||
('ru', 'clients.status', 'Статус'),
|
||||
('ru', 'clients.sync_stats', 'Синхронизировать статистику'),
|
||||
('ru', 'clients.title', 'Клиенты'),
|
||||
('ru', 'clients.traffic', 'Трафик'),
|
||||
('ru', 'common.days', 'дней'),
|
||||
('ru', 'dashboard.active_clients', 'Активные клиенты'),
|
||||
('ru', 'dashboard.add_first_server', 'Добавить первый сервер'),
|
||||
('ru', 'dashboard.get_started', 'Начните с добавления вашего первого VPN-сервера'),
|
||||
('ru', 'dashboard.no_servers', 'Пока нет серверов'),
|
||||
('ru', 'dashboard.quick_actions', 'Быстрые действия'),
|
||||
('ru', 'dashboard.recent_servers', 'Недавние серверы'),
|
||||
('ru', 'dashboard.title', 'Панель управления'),
|
||||
('ru', 'dashboard.total_clients', 'Всего клиентов'),
|
||||
('ru', 'dashboard.total_servers', 'Всего серверов'),
|
||||
('ru', 'dashboard.total_traffic', 'Общий трафик'),
|
||||
('ru', 'dashboard.welcome', 'Добро пожаловать в панель управления Amnezia VPN'),
|
||||
('ru', 'form.cancel', 'Отмена'),
|
||||
('ru', 'form.close', 'Закрыть'),
|
||||
('ru', 'form.create', 'Создать'),
|
||||
('ru', 'form.loading', 'Загрузка...'),
|
||||
('ru', 'form.processing', 'Обработка...'),
|
||||
('ru', 'form.save', 'Сохранить'),
|
||||
('ru', 'form.submit', 'Отправить'),
|
||||
('ru', 'form.update', 'Обновить'),
|
||||
('ru', 'menu.clients', 'Клиенты'),
|
||||
('ru', 'menu.dashboard', 'Панель управления'),
|
||||
('ru', 'menu.logout', 'Выход'),
|
||||
('ru', 'menu.servers', 'Серверы'),
|
||||
('ru', 'menu.settings', 'Настройки'),
|
||||
('ru', 'menu.users', 'Пользователи'),
|
||||
('ru', 'message.confirm', 'Вы уверены?'),
|
||||
('ru', 'message.deleted', 'Успешно удалено'),
|
||||
('ru', 'message.deployed', 'Успешно развернуто'),
|
||||
('ru', 'message.error', 'Произошла ошибка'),
|
||||
('ru', 'message.saved', 'Успешно сохранено'),
|
||||
('ru', 'message.success', 'Операция успешно завершена'),
|
||||
('ru', 'servers.actions', 'Действия'),
|
||||
('ru', 'servers.add', 'Добавить сервер'),
|
||||
('ru', 'servers.clients', 'Клиенты'),
|
||||
('ru', 'servers.delete', 'Удалить'),
|
||||
('ru', 'servers.deploy', 'Развернуть'),
|
||||
('ru', 'servers.edit', 'Редактировать'),
|
||||
('ru', 'servers.host', 'Хост'),
|
||||
('ru', 'servers.name', 'Имя'),
|
||||
('ru', 'servers.port', 'Порт'),
|
||||
('ru', 'servers.status', 'Статус'),
|
||||
('ru', 'servers.title', 'Серверы'),
|
||||
('ru', 'servers.view', 'Просмотр'),
|
||||
('ru', 'settings.actions', 'Действия'),
|
||||
('ru', 'settings.api_key_configured', 'API-ключ настроен'),
|
||||
('ru', 'settings.api_keys', 'API-ключи'),
|
||||
('ru', 'settings.api_keys_desc', 'Настройка API-ключей для внешних сервисов'),
|
||||
('ru', 'settings.auto_translate', 'Автоперевод'),
|
||||
('ru', 'settings.change_password', 'Изменить пароль'),
|
||||
('ru', 'settings.confirm_password', 'Подтвердите пароль'),
|
||||
('ru', 'settings.confirm_translate', 'Начать автоматический перевод? Это может занять несколько минут.'),
|
||||
('ru', 'settings.current_password', 'Текущий пароль'),
|
||||
('ru', 'settings.description', 'Управление конфигурацией панели и интеграциями API'),
|
||||
('ru', 'settings.error_empty_key', 'API-ключ не может быть пустым'),
|
||||
('ru', 'settings.error_invalid_key', 'Неверный формат API-ключа'),
|
||||
('ru', 'settings.error_key_test', 'Тест API-ключа не удался'),
|
||||
('ru', 'settings.for_translation', 'для автоперевода'),
|
||||
('ru', 'settings.get_key_at', 'Получите ваш API-ключ на'),
|
||||
('ru', 'settings.key_saved', 'API-ключ успешно сохранен'),
|
||||
('ru', 'settings.keys', 'ключи'),
|
||||
('ru', 'settings.language', 'Язык'),
|
||||
('ru', 'settings.min_6_chars', 'Минимум 6 символов'),
|
||||
('ru', 'settings.new_password', 'Новый пароль'),
|
||||
('ru', 'settings.no_api_key', 'API-ключ не настроен. Автоперевод не будет работать.'),
|
||||
('ru', 'settings.profile', 'Профиль'),
|
||||
('ru', 'settings.progress', 'Прогресс'),
|
||||
('ru', 'settings.skip_validation', 'Пропустить проверку (сохранить без тестирования)'),
|
||||
('ru', 'settings.translation_complete', 'Перевод завершен'),
|
||||
('ru', 'settings.translation_status', 'Статус перевода'),
|
||||
('ru', 'settings.translations', 'Переводы'),
|
||||
('ru', 'settings.users', 'Пользователи'),
|
||||
('ru', 'status.active', 'Активен'),
|
||||
('ru', 'status.deploying', 'Развертывание'),
|
||||
('ru', 'status.disabled', 'Отключен'),
|
||||
('ru', 'status.error', 'Ошибка'),
|
||||
('ru', 'status.inactive', 'Неактивен'),
|
||||
('ru', 'users.add_user', 'Добавить пользователя'),
|
||||
('ru', 'users.administrator', 'Администратор'),
|
||||
('ru', 'users.all_users', 'Все пользователи'),
|
||||
('ru', 'users.created', 'Создан'),
|
||||
('ru', 'users.delete_confirm', 'Удалить {0}?'),
|
||||
('ru', 'users.role', 'Роль'),
|
||||
('ru', 'users.role_admin', 'Администратор'),
|
||||
('ru', 'users.role_user', 'Пользователь')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,131 @@
|
||||
-- Spanish translations
|
||||
-- This migration adds Spanish language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('es', 'auth.email', 'Correo electrónico'),
|
||||
('es', 'auth.login', 'Iniciar sesión'),
|
||||
('es', 'auth.name', 'Nombre'),
|
||||
('es', 'auth.password', 'Contraseña'),
|
||||
('es', 'auth.register', 'Registrarse'),
|
||||
('es', 'backups.create', 'Crear copia de seguridad'),
|
||||
('es', 'backups.create_confirm', '¿Crear copia de seguridad de todos los clientes en este servidor?'),
|
||||
('es', 'backups.created_success', 'Copia de seguridad creada exitosamente'),
|
||||
('es', 'backups.delete_confirm', '¿Eliminar esta copia de seguridad permanentemente?'),
|
||||
('es', 'backups.deleted_success', 'Copia de seguridad eliminada exitosamente'),
|
||||
('es', 'backups.login_required', 'Por favor inicie sesión vía API para gestionar copias de seguridad'),
|
||||
('es', 'backups.no_backups', 'Aún no hay copias de seguridad'),
|
||||
('es', 'backups.restore', 'Restaurar'),
|
||||
('es', 'backups.restore_confirm', '¿Restaurar clientes desde esta copia de seguridad? Los clientes existentes no se verán afectados.'),
|
||||
('es', 'backups.restored_success', 'Restaurado'),
|
||||
('es', 'backups.title', 'Copias de seguridad del servidor'),
|
||||
('es', 'clients.actions', 'Acciones'),
|
||||
('es', 'clients.add', 'Agregar cliente'),
|
||||
('es', 'clients.create', 'Crear cliente'),
|
||||
('es', 'clients.delete', 'Eliminar'),
|
||||
('es', 'clients.delete_confirm', '¿Eliminar este cliente permanentemente?'),
|
||||
('es', 'clients.download_config', 'Descargar configuración'),
|
||||
('es', 'clients.expiration', 'Vencimiento'),
|
||||
('es', 'clients.expired', 'Vencido'),
|
||||
('es', 'clients.ip', 'Dirección IP'),
|
||||
('es', 'clients.last_handshake', 'Último contacto'),
|
||||
('es', 'clients.name', 'Nombre del cliente'),
|
||||
('es', 'clients.never', 'Nunca'),
|
||||
('es', 'clients.never_expires', 'Nunca vence'),
|
||||
('es', 'clients.no_clients', 'Aún no hay clientes'),
|
||||
('es', 'clients.qr_code', 'Código QR'),
|
||||
('es', 'clients.received', 'Recibido'),
|
||||
('es', 'clients.restore', 'Restaurar'),
|
||||
('es', 'clients.revoke', 'Revocar'),
|
||||
('es', 'clients.revoke_confirm', '¿Revocar acceso para este cliente?'),
|
||||
('es', 'clients.sent', 'Enviado'),
|
||||
('es', 'clients.server', 'Servidor'),
|
||||
('es', 'clients.status', 'Estado'),
|
||||
('es', 'clients.sync_stats', 'Sincronizar estadísticas'),
|
||||
('es', 'clients.title', 'Clientes'),
|
||||
('es', 'clients.traffic', 'Tráfico'),
|
||||
('es', 'common.days', 'días'),
|
||||
('es', 'dashboard.active_clients', 'Clientes activos'),
|
||||
('es', 'dashboard.add_first_server', 'Agregar primer servidor'),
|
||||
('es', 'dashboard.get_started', 'Comience agregando su primer servidor VPN'),
|
||||
('es', 'dashboard.no_servers', 'Aún no hay servidores'),
|
||||
('es', 'dashboard.quick_actions', 'Acciones rápidas'),
|
||||
('es', 'dashboard.recent_servers', 'Servidores recientes'),
|
||||
('es', 'dashboard.title', 'Panel de control'),
|
||||
('es', 'dashboard.total_clients', 'Total de clientes'),
|
||||
('es', 'dashboard.total_servers', 'Total de servidores'),
|
||||
('es', 'dashboard.total_traffic', 'Tráfico total'),
|
||||
('es', 'dashboard.welcome', 'Bienvenido al Panel de Gestión de Amnezia VPN'),
|
||||
('es', 'form.cancel', 'Cancelar'),
|
||||
('es', 'form.close', 'Cerrar'),
|
||||
('es', 'form.create', 'Crear'),
|
||||
('es', 'form.loading', 'Cargando...'),
|
||||
('es', 'form.processing', 'Procesando...'),
|
||||
('es', 'form.save', 'Guardar'),
|
||||
('es', 'form.submit', 'Enviar'),
|
||||
('es', 'form.update', 'Actualizar'),
|
||||
('es', 'menu.clients', 'Clientes'),
|
||||
('es', 'menu.dashboard', 'Panel de control'),
|
||||
('es', 'menu.logout', 'Cerrar sesión'),
|
||||
('es', 'menu.servers', 'Servidores'),
|
||||
('es', 'menu.settings', 'Configuración'),
|
||||
('es', 'menu.users', 'Usuarios'),
|
||||
('es', 'message.confirm', '¿Está seguro?'),
|
||||
('es', 'message.deleted', 'Eliminado exitosamente'),
|
||||
('es', 'message.deployed', 'Implementado exitosamente'),
|
||||
('es', 'message.error', 'Ha ocurrido un error'),
|
||||
('es', 'message.saved', 'Guardado exitosamente'),
|
||||
('es', 'message.success', 'Operación completada exitosamente'),
|
||||
('es', 'servers.actions', 'Acciones'),
|
||||
('es', 'servers.add', 'Agregar servidor'),
|
||||
('es', 'servers.clients', 'Clientes'),
|
||||
('es', 'servers.delete', 'Eliminar'),
|
||||
('es', 'servers.deploy', 'Implementar'),
|
||||
('es', 'servers.edit', 'Editar'),
|
||||
('es', 'servers.host', 'Host'),
|
||||
('es', 'servers.name', 'Nombre'),
|
||||
('es', 'servers.port', 'Puerto'),
|
||||
('es', 'servers.status', 'Estado'),
|
||||
('es', 'servers.title', 'Servidores'),
|
||||
('es', 'servers.view', 'Ver'),
|
||||
('es', 'settings.actions', 'Acciones'),
|
||||
('es', 'settings.api_key_configured', 'Clave API configurada'),
|
||||
('es', 'settings.api_keys', 'Claves API'),
|
||||
('es', 'settings.api_keys_desc', 'Configurar claves API para servicios externos'),
|
||||
('es', 'settings.auto_translate', 'Auto-traducir'),
|
||||
('es', 'settings.change_password', 'Cambiar contraseña'),
|
||||
('es', 'settings.confirm_password', 'Confirmar contraseña'),
|
||||
('es', 'settings.confirm_translate', '¿Iniciar traducción automática? Esto puede tomar unos minutos.'),
|
||||
('es', 'settings.current_password', 'Contraseña actual'),
|
||||
('es', 'settings.description', 'Gestionar configuración del panel e integraciones API'),
|
||||
('es', 'settings.error_empty_key', 'La clave API no puede estar vacía'),
|
||||
('es', 'settings.error_invalid_key', 'Formato de clave API inválido'),
|
||||
('es', 'settings.error_key_test', 'Prueba de clave API fallida'),
|
||||
('es', 'settings.for_translation', 'para auto-traducción'),
|
||||
('es', 'settings.get_key_at', 'Obtenga su clave API en'),
|
||||
('es', 'settings.key_saved', 'Clave API guardada exitosamente'),
|
||||
('es', 'settings.keys', 'claves'),
|
||||
('es', 'settings.language', 'Idioma'),
|
||||
('es', 'settings.min_6_chars', 'Mínimo 6 caracteres'),
|
||||
('es', 'settings.new_password', 'Nueva contraseña'),
|
||||
('es', 'settings.no_api_key', 'No hay clave API configurada. La auto-traducción no funcionará.'),
|
||||
('es', 'settings.profile', 'Perfil'),
|
||||
('es', 'settings.progress', 'Progreso'),
|
||||
('es', 'settings.skip_validation', 'Omitir validación (guardar sin probar)'),
|
||||
('es', 'settings.translation_complete', 'Traducción completada'),
|
||||
('es', 'settings.translation_status', 'Estado de traducción'),
|
||||
('es', 'settings.translations', 'Traducciones'),
|
||||
('es', 'settings.users', 'Usuarios'),
|
||||
('es', 'status.active', 'Activo'),
|
||||
('es', 'status.deploying', 'Implementando'),
|
||||
('es', 'status.disabled', 'Deshabilitado'),
|
||||
('es', 'status.error', 'Error'),
|
||||
('es', 'status.inactive', 'Inactivo'),
|
||||
('es', 'users.add_user', 'Agregar usuario'),
|
||||
('es', 'users.administrator', 'Administrador'),
|
||||
('es', 'users.all_users', 'Todos los usuarios'),
|
||||
('es', 'users.created', 'Creado'),
|
||||
('es', 'users.delete_confirm', '¿Eliminar {0}?'),
|
||||
('es', 'users.role', 'Rol'),
|
||||
('es', 'users.role_admin', 'Administrador'),
|
||||
('es', 'users.role_user', 'Usuario')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,127 @@
|
||||
-- German translations
|
||||
-- This migration adds German language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('de', 'auth.email', 'E-Mail'),
|
||||
('de', 'auth.login', 'Anmelden'),
|
||||
('de', 'auth.name', 'Name'),
|
||||
('de', 'auth.password', 'Passwort'),
|
||||
('de', 'auth.register', 'Registrieren'),
|
||||
('de', 'backups.create', 'Backup erstellen'),
|
||||
('de', 'backups.create_confirm', 'Backup aller Clients auf diesem Server erstellen?'),
|
||||
('de', 'backups.created_success', 'Backup erfolgreich erstellt'),
|
||||
('de', 'backups.delete_confirm', 'Dieses Backup endgültig löschen?'),
|
||||
('de', 'backups.deleted_success', 'Backup erfolgreich gelöscht'),
|
||||
('de', 'backups.login_required', 'Bitte melden Sie sich über die API an, um Backups zu verwalten'),
|
||||
('de', 'backups.no_backups', 'Noch keine Backups'),
|
||||
('de', 'backups.restore', 'Wiederherstellen'),
|
||||
('de', 'backups.restore_confirm', 'Clients aus diesem Backup wiederherstellen? Bestehende Clients bleiben unberührt.'),
|
||||
('de', 'backups.restored_success', 'Wiederhergestellt'),
|
||||
('de', 'backups.title', 'Server-Backups'),
|
||||
('de', 'clients.actions', 'Aktionen'),
|
||||
('de', 'clients.add', 'Client hinzufügen'),
|
||||
('de', 'clients.create', 'Client erstellen'),
|
||||
('de', 'clients.delete', 'Löschen'),
|
||||
('de', 'clients.download_config', 'Konfiguration herunterladen'),
|
||||
('de', 'clients.expiration', 'Ablaufdatum'),
|
||||
('de', 'clients.expired', 'Abgelaufen'),
|
||||
('de', 'clients.ip', 'IP-Adresse'),
|
||||
('de', 'clients.last_handshake', 'Letzter Handshake'),
|
||||
('de', 'clients.name', 'Client-Name'),
|
||||
('de', 'clients.never_expires', 'Läuft nie ab'),
|
||||
('de', 'clients.qr_code', 'QR-Code'),
|
||||
('de', 'clients.received', 'Empfangen'),
|
||||
('de', 'clients.restore', 'Wiederherstellen'),
|
||||
('de', 'clients.revoke', 'Widerrufen'),
|
||||
('de', 'clients.sent', 'Gesendet'),
|
||||
('de', 'clients.server', 'Server'),
|
||||
('de', 'clients.status', 'Status'),
|
||||
('de', 'clients.sync_stats', 'Statistiken synchronisieren'),
|
||||
('de', 'clients.title', 'Clients'),
|
||||
('de', 'clients.traffic', 'Datenverkehr'),
|
||||
('de', 'common.days', 'Tage'),
|
||||
('de', 'dashboard.active_clients', 'Aktive Clients'),
|
||||
('de', 'dashboard.add_first_server', 'Ersten Server hinzufügen'),
|
||||
('de', 'dashboard.get_started', 'Beginnen Sie mit dem Hinzufügen Ihres ersten VPN-Servers'),
|
||||
('de', 'dashboard.no_servers', 'Noch keine Server'),
|
||||
('de', 'dashboard.quick_actions', 'Schnellaktionen'),
|
||||
('de', 'dashboard.recent_servers', 'Aktuelle Server'),
|
||||
('de', 'dashboard.title', 'Dashboard'),
|
||||
('de', 'dashboard.total_clients', 'Gesamtzahl Clients'),
|
||||
('de', 'dashboard.total_servers', 'Gesamtzahl Server'),
|
||||
('de', 'dashboard.total_traffic', 'Gesamter Datenverkehr'),
|
||||
('de', 'dashboard.welcome', 'Willkommen im Amnezia VPN Verwaltungspanel'),
|
||||
('de', 'form.cancel', 'Abbrechen'),
|
||||
('de', 'form.close', 'Schließen'),
|
||||
('de', 'form.create', 'Erstellen'),
|
||||
('de', 'form.loading', 'Lädt...'),
|
||||
('de', 'form.processing', 'Verarbeitung...'),
|
||||
('de', 'form.save', 'Speichern'),
|
||||
('de', 'form.submit', 'Absenden'),
|
||||
('de', 'form.update', 'Aktualisieren'),
|
||||
('de', 'menu.clients', 'Clients'),
|
||||
('de', 'menu.dashboard', 'Dashboard'),
|
||||
('de', 'menu.logout', 'Abmelden'),
|
||||
('de', 'menu.servers', 'Server'),
|
||||
('de', 'menu.settings', 'Einstellungen'),
|
||||
('de', 'menu.users', 'Benutzer'),
|
||||
('de', 'message.confirm', 'Sind Sie sicher?'),
|
||||
('de', 'message.deleted', 'Erfolgreich gelöscht'),
|
||||
('de', 'message.deployed', 'Erfolgreich bereitgestellt'),
|
||||
('de', 'message.error', 'Ein Fehler ist aufgetreten'),
|
||||
('de', 'message.saved', 'Erfolgreich gespeichert'),
|
||||
('de', 'message.success', 'Vorgang erfolgreich abgeschlossen'),
|
||||
('de', 'servers.actions', 'Aktionen'),
|
||||
('de', 'servers.add', 'Server hinzufügen'),
|
||||
('de', 'servers.clients', 'Clients'),
|
||||
('de', 'servers.delete', 'Löschen'),
|
||||
('de', 'servers.deploy', 'Bereitstellen'),
|
||||
('de', 'servers.edit', 'Bearbeiten'),
|
||||
('de', 'servers.host', 'Host'),
|
||||
('de', 'servers.name', 'Name'),
|
||||
('de', 'servers.port', 'Port'),
|
||||
('de', 'servers.status', 'Status'),
|
||||
('de', 'servers.title', 'Server'),
|
||||
('de', 'servers.view', 'Ansehen'),
|
||||
('de', 'settings.actions', 'Aktionen'),
|
||||
('de', 'settings.api_key_configured', 'API-Schlüssel konfiguriert'),
|
||||
('de', 'settings.api_keys', 'API-Schlüssel'),
|
||||
('de', 'settings.api_keys_desc', 'API-Schlüssel für externe Dienste konfigurieren'),
|
||||
('de', 'settings.auto_translate', 'Automatische Übersetzung'),
|
||||
('de', 'settings.change_password', 'Passwort ändern'),
|
||||
('de', 'settings.confirm_password', 'Passwort bestätigen'),
|
||||
('de', 'settings.confirm_translate', 'Automatische Übersetzung starten? Dies kann einige Minuten dauern.'),
|
||||
('de', 'settings.current_password', 'Aktuelles Passwort'),
|
||||
('de', 'settings.description', 'Panel-Konfiguration und API-Integrationen verwalten'),
|
||||
('de', 'settings.error_empty_key', 'API-Schlüssel darf nicht leer sein'),
|
||||
('de', 'settings.error_invalid_key', 'Ungültiges API-Schlüssel-Format'),
|
||||
('de', 'settings.error_key_test', 'API-Schlüssel-Test fehlgeschlagen'),
|
||||
('de', 'settings.for_translation', 'für automatische Übersetzung'),
|
||||
('de', 'settings.get_key_at', 'Holen Sie sich Ihren API-Schlüssel bei'),
|
||||
('de', 'settings.key_saved', 'API-Schlüssel erfolgreich gespeichert'),
|
||||
('de', 'settings.keys', 'Schlüssel'),
|
||||
('de', 'settings.language', 'Sprache'),
|
||||
('de', 'settings.min_6_chars', 'Mindestens 6 Zeichen'),
|
||||
('de', 'settings.new_password', 'Neues Passwort'),
|
||||
('de', 'settings.no_api_key', 'Kein API-Schlüssel konfiguriert. Automatische Übersetzung wird nicht funktionieren.'),
|
||||
('de', 'settings.profile', 'Profil'),
|
||||
('de', 'settings.progress', 'Fortschritt'),
|
||||
('de', 'settings.skip_validation', 'Validierung überspringen (ohne Test speichern)'),
|
||||
('de', 'settings.translation_complete', 'Übersetzung abgeschlossen'),
|
||||
('de', 'settings.translation_status', 'Übersetzungsstatus'),
|
||||
('de', 'settings.translations', 'Übersetzungen'),
|
||||
('de', 'settings.users', 'Benutzer'),
|
||||
('de', 'status.active', 'Aktiv'),
|
||||
('de', 'status.deploying', 'Wird bereitgestellt'),
|
||||
('de', 'status.disabled', 'Deaktiviert'),
|
||||
('de', 'status.error', 'Fehler'),
|
||||
('de', 'status.inactive', 'Inaktiv'),
|
||||
('de', 'users.add_user', 'Benutzer hinzufügen'),
|
||||
('de', 'users.administrator', 'Administrator'),
|
||||
('de', 'users.all_users', 'Alle Benutzer'),
|
||||
('de', 'users.created', 'Erstellt'),
|
||||
('de', 'users.delete_confirm', '{0} löschen?'),
|
||||
('de', 'users.role', 'Rolle'),
|
||||
('de', 'users.role_admin', 'Admin'),
|
||||
('de', 'users.role_user', 'Benutzer')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,131 @@
|
||||
-- German translations
|
||||
-- This migration adds German language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('de', 'auth.email', 'E-Mail'),
|
||||
('de', 'auth.login', 'Anmelden'),
|
||||
('de', 'auth.name', 'Name'),
|
||||
('de', 'auth.password', 'Passwort'),
|
||||
('de', 'auth.register', 'Registrieren'),
|
||||
('de', 'backups.create', 'Backup erstellen'),
|
||||
('de', 'backups.create_confirm', 'Backup aller Clients auf diesem Server erstellen?'),
|
||||
('de', 'backups.created_success', 'Backup erfolgreich erstellt'),
|
||||
('de', 'backups.delete_confirm', 'Dieses Backup endgültig löschen?'),
|
||||
('de', 'backups.deleted_success', 'Backup erfolgreich gelöscht'),
|
||||
('de', 'backups.login_required', 'Bitte melden Sie sich über die API an, um Backups zu verwalten'),
|
||||
('de', 'backups.no_backups', 'Noch keine Backups'),
|
||||
('de', 'backups.restore', 'Wiederherstellen'),
|
||||
('de', 'backups.restore_confirm', 'Clients aus diesem Backup wiederherstellen? Bestehende Clients bleiben unberührt.'),
|
||||
('de', 'backups.restored_success', 'Wiederhergestellt'),
|
||||
('de', 'backups.title', 'Server-Backups'),
|
||||
('de', 'clients.actions', 'Aktionen'),
|
||||
('de', 'clients.add', 'Client hinzufügen'),
|
||||
('de', 'clients.create', 'Client erstellen'),
|
||||
('de', 'clients.delete', 'Löschen'),
|
||||
('de', 'clients.delete_confirm', 'Diesen Client dauerhaft löschen?'),
|
||||
('de', 'clients.download_config', 'Konfiguration herunterladen'),
|
||||
('de', 'clients.expiration', 'Ablaufdatum'),
|
||||
('de', 'clients.expired', 'Abgelaufen'),
|
||||
('de', 'clients.ip', 'IP-Adresse'),
|
||||
('de', 'clients.last_handshake', 'Letzter Handshake'),
|
||||
('de', 'clients.name', 'Client-Name'),
|
||||
('de', 'clients.never', 'Niemals'),
|
||||
('de', 'clients.never_expires', 'Läuft nie ab'),
|
||||
('de', 'clients.no_clients', 'Noch keine Kunden'),
|
||||
('de', 'clients.qr_code', 'QR-Code'),
|
||||
('de', 'clients.received', 'Empfangen'),
|
||||
('de', 'clients.restore', 'Wiederherstellen'),
|
||||
('de', 'clients.revoke', 'Widerrufen'),
|
||||
('de', 'clients.revoke_confirm', 'Zugriff für diesen Client widerrufen?'),
|
||||
('de', 'clients.sent', 'Gesendet'),
|
||||
('de', 'clients.server', 'Server'),
|
||||
('de', 'clients.status', 'Status'),
|
||||
('de', 'clients.sync_stats', 'Statistiken synchronisieren'),
|
||||
('de', 'clients.title', 'Clients'),
|
||||
('de', 'clients.traffic', 'Datenverkehr'),
|
||||
('de', 'common.days', 'Tage'),
|
||||
('de', 'dashboard.active_clients', 'Aktive Clients'),
|
||||
('de', 'dashboard.add_first_server', 'Ersten Server hinzufügen'),
|
||||
('de', 'dashboard.get_started', 'Beginnen Sie mit dem Hinzufügen Ihres ersten VPN-Servers'),
|
||||
('de', 'dashboard.no_servers', 'Noch keine Server'),
|
||||
('de', 'dashboard.quick_actions', 'Schnellaktionen'),
|
||||
('de', 'dashboard.recent_servers', 'Aktuelle Server'),
|
||||
('de', 'dashboard.title', 'Dashboard'),
|
||||
('de', 'dashboard.total_clients', 'Gesamtzahl Clients'),
|
||||
('de', 'dashboard.total_servers', 'Gesamtzahl Server'),
|
||||
('de', 'dashboard.total_traffic', 'Gesamter Datenverkehr'),
|
||||
('de', 'dashboard.welcome', 'Willkommen im Amnezia VPN Verwaltungspanel'),
|
||||
('de', 'form.cancel', 'Abbrechen'),
|
||||
('de', 'form.close', 'Schließen'),
|
||||
('de', 'form.create', 'Erstellen'),
|
||||
('de', 'form.loading', 'Lädt...'),
|
||||
('de', 'form.processing', 'Verarbeitung...'),
|
||||
('de', 'form.save', 'Speichern'),
|
||||
('de', 'form.submit', 'Absenden'),
|
||||
('de', 'form.update', 'Aktualisieren'),
|
||||
('de', 'menu.clients', 'Clients'),
|
||||
('de', 'menu.dashboard', 'Dashboard'),
|
||||
('de', 'menu.logout', 'Abmelden'),
|
||||
('de', 'menu.servers', 'Server'),
|
||||
('de', 'menu.settings', 'Einstellungen'),
|
||||
('de', 'menu.users', 'Benutzer'),
|
||||
('de', 'message.confirm', 'Sind Sie sicher?'),
|
||||
('de', 'message.deleted', 'Erfolgreich gelöscht'),
|
||||
('de', 'message.deployed', 'Erfolgreich bereitgestellt'),
|
||||
('de', 'message.error', 'Ein Fehler ist aufgetreten'),
|
||||
('de', 'message.saved', 'Erfolgreich gespeichert'),
|
||||
('de', 'message.success', 'Vorgang erfolgreich abgeschlossen'),
|
||||
('de', 'servers.actions', 'Aktionen'),
|
||||
('de', 'servers.add', 'Server hinzufügen'),
|
||||
('de', 'servers.clients', 'Clients'),
|
||||
('de', 'servers.delete', 'Löschen'),
|
||||
('de', 'servers.deploy', 'Bereitstellen'),
|
||||
('de', 'servers.edit', 'Bearbeiten'),
|
||||
('de', 'servers.host', 'Host'),
|
||||
('de', 'servers.name', 'Name'),
|
||||
('de', 'servers.port', 'Port'),
|
||||
('de', 'servers.status', 'Status'),
|
||||
('de', 'servers.title', 'Server'),
|
||||
('de', 'servers.view', 'Ansehen'),
|
||||
('de', 'settings.actions', 'Aktionen'),
|
||||
('de', 'settings.api_key_configured', 'API-Schlüssel konfiguriert'),
|
||||
('de', 'settings.api_keys', 'API-Schlüssel'),
|
||||
('de', 'settings.api_keys_desc', 'API-Schlüssel für externe Dienste konfigurieren'),
|
||||
('de', 'settings.auto_translate', 'Automatische Übersetzung'),
|
||||
('de', 'settings.change_password', 'Passwort ändern'),
|
||||
('de', 'settings.confirm_password', 'Passwort bestätigen'),
|
||||
('de', 'settings.confirm_translate', 'Automatische Übersetzung starten? Dies kann einige Minuten dauern.'),
|
||||
('de', 'settings.current_password', 'Aktuelles Passwort'),
|
||||
('de', 'settings.description', 'Panel-Konfiguration und API-Integrationen verwalten'),
|
||||
('de', 'settings.error_empty_key', 'API-Schlüssel darf nicht leer sein'),
|
||||
('de', 'settings.error_invalid_key', 'Ungültiges API-Schlüssel-Format'),
|
||||
('de', 'settings.error_key_test', 'API-Schlüssel-Test fehlgeschlagen'),
|
||||
('de', 'settings.for_translation', 'für automatische Übersetzung'),
|
||||
('de', 'settings.get_key_at', 'Holen Sie sich Ihren API-Schlüssel bei'),
|
||||
('de', 'settings.key_saved', 'API-Schlüssel erfolgreich gespeichert'),
|
||||
('de', 'settings.keys', 'Schlüssel'),
|
||||
('de', 'settings.language', 'Sprache'),
|
||||
('de', 'settings.min_6_chars', 'Mindestens 6 Zeichen'),
|
||||
('de', 'settings.new_password', 'Neues Passwort'),
|
||||
('de', 'settings.no_api_key', 'Kein API-Schlüssel konfiguriert. Automatische Übersetzung wird nicht funktionieren.'),
|
||||
('de', 'settings.profile', 'Profil'),
|
||||
('de', 'settings.progress', 'Fortschritt'),
|
||||
('de', 'settings.skip_validation', 'Validierung überspringen (ohne Test speichern)'),
|
||||
('de', 'settings.translation_complete', 'Übersetzung abgeschlossen'),
|
||||
('de', 'settings.translation_status', 'Übersetzungsstatus'),
|
||||
('de', 'settings.translations', 'Übersetzungen'),
|
||||
('de', 'settings.users', 'Benutzer'),
|
||||
('de', 'status.active', 'Aktiv'),
|
||||
('de', 'status.deploying', 'Wird bereitgestellt'),
|
||||
('de', 'status.disabled', 'Deaktiviert'),
|
||||
('de', 'status.error', 'Fehler'),
|
||||
('de', 'status.inactive', 'Inaktiv'),
|
||||
('de', 'users.add_user', 'Benutzer hinzufügen'),
|
||||
('de', 'users.administrator', 'Administrator'),
|
||||
('de', 'users.all_users', 'Alle Benutzer'),
|
||||
('de', 'users.created', 'Erstellt'),
|
||||
('de', 'users.delete_confirm', '{0} löschen?'),
|
||||
('de', 'users.role', 'Rolle'),
|
||||
('de', 'users.role_admin', 'Admin'),
|
||||
('de', 'users.role_user', 'Benutzer')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,127 @@
|
||||
-- Russian translations
|
||||
-- This migration adds Russian language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('ru', 'auth.email', 'Email'),
|
||||
('ru', 'auth.login', 'Вход'),
|
||||
('ru', 'auth.name', 'Имя'),
|
||||
('ru', 'auth.password', 'Пароль'),
|
||||
('ru', 'auth.register', 'Регистрация'),
|
||||
('ru', 'backups.create', 'Создать резервную копию'),
|
||||
('ru', 'backups.create_confirm', 'Создать резервную копию всех клиентов на этом сервере?'),
|
||||
('ru', 'backups.created_success', 'Резервная копия успешно создана'),
|
||||
('ru', 'backups.delete_confirm', 'Удалить эту резервную копию навсегда?'),
|
||||
('ru', 'backups.deleted_success', 'Резервная копия успешно удалена'),
|
||||
('ru', 'backups.login_required', 'Пожалуйста, войдите через API для управления резервными копиями'),
|
||||
('ru', 'backups.no_backups', 'Пока нет резервных копий'),
|
||||
('ru', 'backups.restore', 'Восстановить'),
|
||||
('ru', 'backups.restore_confirm', 'Восстановить клиентов из этой резервной копии? Существующие клиенты не будут затронуты.'),
|
||||
('ru', 'backups.restored_success', 'Восстановлено'),
|
||||
('ru', 'backups.title', 'Резервные копии сервера'),
|
||||
('ru', 'clients.actions', 'Действия'),
|
||||
('ru', 'clients.add', 'Добавить клиента'),
|
||||
('ru', 'clients.create', 'Создать клиента'),
|
||||
('ru', 'clients.delete', 'Удалить'),
|
||||
('ru', 'clients.download_config', 'Скачать конфигурацию'),
|
||||
('ru', 'clients.expiration', 'Срок действия'),
|
||||
('ru', 'clients.expired', 'Истек'),
|
||||
('ru', 'clients.ip', 'IP-адрес'),
|
||||
('ru', 'clients.last_handshake', 'Последнее соединение'),
|
||||
('ru', 'clients.name', 'Имя клиента'),
|
||||
('ru', 'clients.never_expires', 'Бессрочно'),
|
||||
('ru', 'clients.qr_code', 'QR-код'),
|
||||
('ru', 'clients.received', 'Получено'),
|
||||
('ru', 'clients.restore', 'Восстановить'),
|
||||
('ru', 'clients.revoke', 'Отозвать'),
|
||||
('ru', 'clients.sent', 'Отправлено'),
|
||||
('ru', 'clients.server', 'Сервер'),
|
||||
('ru', 'clients.status', 'Статус'),
|
||||
('ru', 'clients.sync_stats', 'Синхронизировать статистику'),
|
||||
('ru', 'clients.title', 'Клиенты'),
|
||||
('ru', 'clients.traffic', 'Трафик'),
|
||||
('ru', 'common.days', 'дней'),
|
||||
('ru', 'dashboard.active_clients', 'Активные клиенты'),
|
||||
('ru', 'dashboard.add_first_server', 'Добавить первый сервер'),
|
||||
('ru', 'dashboard.get_started', 'Начните с добавления вашего первого VPN-сервера'),
|
||||
('ru', 'dashboard.no_servers', 'Пока нет серверов'),
|
||||
('ru', 'dashboard.quick_actions', 'Быстрые действия'),
|
||||
('ru', 'dashboard.recent_servers', 'Недавние серверы'),
|
||||
('ru', 'dashboard.title', 'Панель управления'),
|
||||
('ru', 'dashboard.total_clients', 'Всего клиентов'),
|
||||
('ru', 'dashboard.total_servers', 'Всего серверов'),
|
||||
('ru', 'dashboard.total_traffic', 'Общий трафик'),
|
||||
('ru', 'dashboard.welcome', 'Добро пожаловать в панель управления Amnezia VPN'),
|
||||
('ru', 'form.cancel', 'Отмена'),
|
||||
('ru', 'form.close', 'Закрыть'),
|
||||
('ru', 'form.create', 'Создать'),
|
||||
('ru', 'form.loading', 'Загрузка...'),
|
||||
('ru', 'form.processing', 'Обработка...'),
|
||||
('ru', 'form.save', 'Сохранить'),
|
||||
('ru', 'form.submit', 'Отправить'),
|
||||
('ru', 'form.update', 'Обновить'),
|
||||
('ru', 'menu.clients', 'Клиенты'),
|
||||
('ru', 'menu.dashboard', 'Панель управления'),
|
||||
('ru', 'menu.logout', 'Выход'),
|
||||
('ru', 'menu.servers', 'Серверы'),
|
||||
('ru', 'menu.settings', 'Настройки'),
|
||||
('ru', 'menu.users', 'Пользователи'),
|
||||
('ru', 'message.confirm', 'Вы уверены?'),
|
||||
('ru', 'message.deleted', 'Успешно удалено'),
|
||||
('ru', 'message.deployed', 'Успешно развернуто'),
|
||||
('ru', 'message.error', 'Произошла ошибка'),
|
||||
('ru', 'message.saved', 'Успешно сохранено'),
|
||||
('ru', 'message.success', 'Операция успешно завершена'),
|
||||
('ru', 'servers.actions', 'Действия'),
|
||||
('ru', 'servers.add', 'Добавить сервер'),
|
||||
('ru', 'servers.clients', 'Клиенты'),
|
||||
('ru', 'servers.delete', 'Удалить'),
|
||||
('ru', 'servers.deploy', 'Развернуть'),
|
||||
('ru', 'servers.edit', 'Редактировать'),
|
||||
('ru', 'servers.host', 'Хост'),
|
||||
('ru', 'servers.name', 'Имя'),
|
||||
('ru', 'servers.port', 'Порт'),
|
||||
('ru', 'servers.status', 'Статус'),
|
||||
('ru', 'servers.title', 'Серверы'),
|
||||
('ru', 'servers.view', 'Просмотр'),
|
||||
('ru', 'settings.actions', 'Действия'),
|
||||
('ru', 'settings.api_key_configured', 'API-ключ настроен'),
|
||||
('ru', 'settings.api_keys', 'API-ключи'),
|
||||
('ru', 'settings.api_keys_desc', 'Настройка API-ключей для внешних сервисов'),
|
||||
('ru', 'settings.auto_translate', 'Автоперевод'),
|
||||
('ru', 'settings.change_password', 'Изменить пароль'),
|
||||
('ru', 'settings.confirm_password', 'Подтвердите пароль'),
|
||||
('ru', 'settings.confirm_translate', 'Начать автоматический перевод? Это может занять несколько минут.'),
|
||||
('ru', 'settings.current_password', 'Текущий пароль'),
|
||||
('ru', 'settings.description', 'Управление конфигурацией панели и интеграциями API'),
|
||||
('ru', 'settings.error_empty_key', 'API-ключ не может быть пустым'),
|
||||
('ru', 'settings.error_invalid_key', 'Неверный формат API-ключа'),
|
||||
('ru', 'settings.error_key_test', 'Тест API-ключа не удался'),
|
||||
('ru', 'settings.for_translation', 'для автоперевода'),
|
||||
('ru', 'settings.get_key_at', 'Получите ваш API-ключ на'),
|
||||
('ru', 'settings.key_saved', 'API-ключ успешно сохранен'),
|
||||
('ru', 'settings.keys', 'ключи'),
|
||||
('ru', 'settings.language', 'Язык'),
|
||||
('ru', 'settings.min_6_chars', 'Минимум 6 символов'),
|
||||
('ru', 'settings.new_password', 'Новый пароль'),
|
||||
('ru', 'settings.no_api_key', 'API-ключ не настроен. Автоперевод не будет работать.'),
|
||||
('ru', 'settings.profile', 'Профиль'),
|
||||
('ru', 'settings.progress', 'Прогресс'),
|
||||
('ru', 'settings.skip_validation', 'Пропустить проверку (сохранить без тестирования)'),
|
||||
('ru', 'settings.translation_complete', 'Перевод завершен'),
|
||||
('ru', 'settings.translation_status', 'Статус перевода'),
|
||||
('ru', 'settings.translations', 'Переводы'),
|
||||
('ru', 'settings.users', 'Пользователи'),
|
||||
('ru', 'status.active', 'Активен'),
|
||||
('ru', 'status.deploying', 'Развертывание'),
|
||||
('ru', 'status.disabled', 'Отключен'),
|
||||
('ru', 'status.error', 'Ошибка'),
|
||||
('ru', 'status.inactive', 'Неактивен'),
|
||||
('ru', 'users.add_user', 'Добавить пользователя'),
|
||||
('ru', 'users.administrator', 'Администратор'),
|
||||
('ru', 'users.all_users', 'Все пользователи'),
|
||||
('ru', 'users.created', 'Создан'),
|
||||
('ru', 'users.delete_confirm', 'Удалить {0}?'),
|
||||
('ru', 'users.role', 'Роль'),
|
||||
('ru', 'users.role_admin', 'Администратор'),
|
||||
('ru', 'users.role_user', 'Пользователь')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,127 @@
|
||||
-- French translations
|
||||
-- This migration adds French language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('fr', 'auth.email', 'Email'),
|
||||
('fr', 'auth.login', 'Connexion'),
|
||||
('fr', 'auth.name', 'Nom'),
|
||||
('fr', 'auth.password', 'Mot de passe'),
|
||||
('fr', 'auth.register', 'S''inscrire'),
|
||||
('fr', 'backups.create', 'Créer une sauvegarde'),
|
||||
('fr', 'backups.create_confirm', 'Créer une sauvegarde de tous les clients sur ce serveur ?'),
|
||||
('fr', 'backups.created_success', 'Sauvegarde créée avec succès'),
|
||||
('fr', 'backups.delete_confirm', 'Supprimer définitivement cette sauvegarde ?'),
|
||||
('fr', 'backups.deleted_success', 'Sauvegarde supprimée avec succès'),
|
||||
('fr', 'backups.login_required', 'Veuillez vous connecter via l''API pour gérer les sauvegardes'),
|
||||
('fr', 'backups.no_backups', 'Aucune sauvegarde pour le moment'),
|
||||
('fr', 'backups.restore', 'Restaurer'),
|
||||
('fr', 'backups.restore_confirm', 'Restaurer les clients depuis cette sauvegarde ? Les clients existants ne seront pas affectés.'),
|
||||
('fr', 'backups.restored_success', 'Restauré'),
|
||||
('fr', 'backups.title', 'Sauvegardes du serveur'),
|
||||
('fr', 'clients.actions', 'Actions'),
|
||||
('fr', 'clients.add', 'Ajouter un client'),
|
||||
('fr', 'clients.create', 'Créer un client'),
|
||||
('fr', 'clients.delete', 'Supprimer'),
|
||||
('fr', 'clients.download_config', 'Télécharger la configuration'),
|
||||
('fr', 'clients.expiration', 'Expiration'),
|
||||
('fr', 'clients.expired', 'Expiré'),
|
||||
('fr', 'clients.ip', 'Adresse IP'),
|
||||
('fr', 'clients.last_handshake', 'Dernière connexion'),
|
||||
('fr', 'clients.name', 'Nom du client'),
|
||||
('fr', 'clients.never_expires', 'N''expire jamais'),
|
||||
('fr', 'clients.qr_code', 'Code QR'),
|
||||
('fr', 'clients.received', 'Reçu'),
|
||||
('fr', 'clients.restore', 'Restaurer'),
|
||||
('fr', 'clients.revoke', 'Révoquer'),
|
||||
('fr', 'clients.sent', 'Envoyé'),
|
||||
('fr', 'clients.server', 'Serveur'),
|
||||
('fr', 'clients.status', 'Statut'),
|
||||
('fr', 'clients.sync_stats', 'Synchroniser les statistiques'),
|
||||
('fr', 'clients.title', 'Clients'),
|
||||
('fr', 'clients.traffic', 'Trafic'),
|
||||
('fr', 'common.days', 'jours'),
|
||||
('fr', 'dashboard.active_clients', 'Clients actifs'),
|
||||
('fr', 'dashboard.add_first_server', 'Ajouter le premier serveur'),
|
||||
('fr', 'dashboard.get_started', 'Commencez par ajouter votre premier serveur VPN'),
|
||||
('fr', 'dashboard.no_servers', 'Aucun serveur pour le moment'),
|
||||
('fr', 'dashboard.quick_actions', 'Actions rapides'),
|
||||
('fr', 'dashboard.recent_servers', 'Serveurs récents'),
|
||||
('fr', 'dashboard.title', 'Tableau de bord'),
|
||||
('fr', 'dashboard.total_clients', 'Total des clients'),
|
||||
('fr', 'dashboard.total_servers', 'Total des serveurs'),
|
||||
('fr', 'dashboard.total_traffic', 'Trafic total'),
|
||||
('fr', 'dashboard.welcome', 'Bienvenue sur le panneau de gestion Amnezia VPN'),
|
||||
('fr', 'form.cancel', 'Annuler'),
|
||||
('fr', 'form.close', 'Fermer'),
|
||||
('fr', 'form.create', 'Créer'),
|
||||
('fr', 'form.loading', 'Chargement...'),
|
||||
('fr', 'form.processing', 'Traitement...'),
|
||||
('fr', 'form.save', 'Enregistrer'),
|
||||
('fr', 'form.submit', 'Soumettre'),
|
||||
('fr', 'form.update', 'Mettre à jour'),
|
||||
('fr', 'menu.clients', 'Clients'),
|
||||
('fr', 'menu.dashboard', 'Tableau de bord'),
|
||||
('fr', 'menu.logout', 'Déconnexion'),
|
||||
('fr', 'menu.servers', 'Serveurs'),
|
||||
('fr', 'menu.settings', 'Paramètres'),
|
||||
('fr', 'menu.users', 'Utilisateurs'),
|
||||
('fr', 'message.confirm', 'Êtes-vous sûr ?'),
|
||||
('fr', 'message.deleted', 'Supprimé avec succès'),
|
||||
('fr', 'message.deployed', 'Déployé avec succès'),
|
||||
('fr', 'message.error', 'Une erreur est survenue'),
|
||||
('fr', 'message.saved', 'Enregistré avec succès'),
|
||||
('fr', 'message.success', 'Opération terminée avec succès'),
|
||||
('fr', 'servers.actions', 'Actions'),
|
||||
('fr', 'servers.add', 'Ajouter un serveur'),
|
||||
('fr', 'servers.clients', 'Clients'),
|
||||
('fr', 'servers.delete', 'Supprimer'),
|
||||
('fr', 'servers.deploy', 'Déployer'),
|
||||
('fr', 'servers.edit', 'Modifier'),
|
||||
('fr', 'servers.host', 'Hôte'),
|
||||
('fr', 'servers.name', 'Nom'),
|
||||
('fr', 'servers.port', 'Port'),
|
||||
('fr', 'servers.status', 'Statut'),
|
||||
('fr', 'servers.title', 'Serveurs'),
|
||||
('fr', 'servers.view', 'Voir'),
|
||||
('fr', 'settings.actions', 'Actions'),
|
||||
('fr', 'settings.api_key_configured', 'Clé API configurée'),
|
||||
('fr', 'settings.api_keys', 'Clés API'),
|
||||
('fr', 'settings.api_keys_desc', 'Configurer les clés API pour les services externes'),
|
||||
('fr', 'settings.auto_translate', 'Traduction automatique'),
|
||||
('fr', 'settings.change_password', 'Changer le mot de passe'),
|
||||
('fr', 'settings.confirm_password', 'Confirmer le mot de passe'),
|
||||
('fr', 'settings.confirm_translate', 'Démarrer la traduction automatique ? Cela peut prendre quelques minutes.'),
|
||||
('fr', 'settings.current_password', 'Mot de passe actuel'),
|
||||
('fr', 'settings.description', 'Gérer la configuration du panneau et les intégrations API'),
|
||||
('fr', 'settings.error_empty_key', 'La clé API ne peut pas être vide'),
|
||||
('fr', 'settings.error_invalid_key', 'Format de clé API invalide'),
|
||||
('fr', 'settings.error_key_test', 'Test de la clé API échoué'),
|
||||
('fr', 'settings.for_translation', 'pour la traduction automatique'),
|
||||
('fr', 'settings.get_key_at', 'Obtenez votre clé API sur'),
|
||||
('fr', 'settings.key_saved', 'Clé API enregistrée avec succès'),
|
||||
('fr', 'settings.keys', 'clés'),
|
||||
('fr', 'settings.language', 'Langue'),
|
||||
('fr', 'settings.min_6_chars', 'Minimum 6 caractères'),
|
||||
('fr', 'settings.new_password', 'Nouveau mot de passe'),
|
||||
('fr', 'settings.no_api_key', 'Aucune clé API configurée. La traduction automatique ne fonctionnera pas.'),
|
||||
('fr', 'settings.profile', 'Profil'),
|
||||
('fr', 'settings.progress', 'Progression'),
|
||||
('fr', 'settings.skip_validation', 'Ignorer la validation (enregistrer sans tester)'),
|
||||
('fr', 'settings.translation_complete', 'Traduction terminée'),
|
||||
('fr', 'settings.translation_status', 'État de la traduction'),
|
||||
('fr', 'settings.translations', 'Traductions'),
|
||||
('fr', 'settings.users', 'Utilisateurs'),
|
||||
('fr', 'status.active', 'Actif'),
|
||||
('fr', 'status.deploying', 'Déploiement'),
|
||||
('fr', 'status.disabled', 'Désactivé'),
|
||||
('fr', 'status.error', 'Erreur'),
|
||||
('fr', 'status.inactive', 'Inactif'),
|
||||
('fr', 'users.add_user', 'Ajouter un utilisateur'),
|
||||
('fr', 'users.administrator', 'Administrateur'),
|
||||
('fr', 'users.all_users', 'Tous les utilisateurs'),
|
||||
('fr', 'users.created', 'Créé'),
|
||||
('fr', 'users.delete_confirm', 'Supprimer {0} ?'),
|
||||
('fr', 'users.role', 'Rôle'),
|
||||
('fr', 'users.role_admin', 'Administrateur'),
|
||||
('fr', 'users.role_user', 'Utilisateur')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,131 @@
|
||||
-- French translations
|
||||
-- This migration adds French language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('fr', 'auth.email', 'Email'),
|
||||
('fr', 'auth.login', 'Connexion'),
|
||||
('fr', 'auth.name', 'Nom'),
|
||||
('fr', 'auth.password', 'Mot de passe'),
|
||||
('fr', 'auth.register', 'S''inscrire'),
|
||||
('fr', 'backups.create', 'Créer une sauvegarde'),
|
||||
('fr', 'backups.create_confirm', 'Créer une sauvegarde de tous les clients sur ce serveur ?'),
|
||||
('fr', 'backups.created_success', 'Sauvegarde créée avec succès'),
|
||||
('fr', 'backups.delete_confirm', 'Supprimer définitivement cette sauvegarde ?'),
|
||||
('fr', 'backups.deleted_success', 'Sauvegarde supprimée avec succès'),
|
||||
('fr', 'backups.login_required', 'Veuillez vous connecter via l''API pour gérer les sauvegardes'),
|
||||
('fr', 'backups.no_backups', 'Aucune sauvegarde pour le moment'),
|
||||
('fr', 'backups.restore', 'Restaurer'),
|
||||
('fr', 'backups.restore_confirm', 'Restaurer les clients depuis cette sauvegarde ? Les clients existants ne seront pas affectés.'),
|
||||
('fr', 'backups.restored_success', 'Restauré'),
|
||||
('fr', 'backups.title', 'Sauvegardes du serveur'),
|
||||
('fr', 'clients.actions', 'Actions'),
|
||||
('fr', 'clients.add', 'Ajouter un client'),
|
||||
('fr', 'clients.create', 'Créer un client'),
|
||||
('fr', 'clients.delete', 'Supprimer'),
|
||||
('fr', 'clients.delete_confirm', 'Supprimer ce client définitivement?'),
|
||||
('fr', 'clients.download_config', 'Télécharger la configuration'),
|
||||
('fr', 'clients.expiration', 'Expiration'),
|
||||
('fr', 'clients.expired', 'Expiré'),
|
||||
('fr', 'clients.ip', 'Adresse IP'),
|
||||
('fr', 'clients.last_handshake', 'Dernière connexion'),
|
||||
('fr', 'clients.name', 'Nom du client'),
|
||||
('fr', 'clients.never', 'Jamais'),
|
||||
('fr', 'clients.never_expires', 'N''expire jamais'),
|
||||
('fr', 'clients.no_clients', 'Pas encore de clients'),
|
||||
('fr', 'clients.qr_code', 'Code QR'),
|
||||
('fr', 'clients.received', 'Reçu'),
|
||||
('fr', 'clients.restore', 'Restaurer'),
|
||||
('fr', 'clients.revoke', 'Révoquer'),
|
||||
('fr', 'clients.revoke_confirm', 'Révoquer l''accès pour ce client?'),
|
||||
('fr', 'clients.sent', 'Envoyé'),
|
||||
('fr', 'clients.server', 'Serveur'),
|
||||
('fr', 'clients.status', 'Statut'),
|
||||
('fr', 'clients.sync_stats', 'Synchroniser les statistiques'),
|
||||
('fr', 'clients.title', 'Clients'),
|
||||
('fr', 'clients.traffic', 'Trafic'),
|
||||
('fr', 'common.days', 'jours'),
|
||||
('fr', 'dashboard.active_clients', 'Clients actifs'),
|
||||
('fr', 'dashboard.add_first_server', 'Ajouter le premier serveur'),
|
||||
('fr', 'dashboard.get_started', 'Commencez par ajouter votre premier serveur VPN'),
|
||||
('fr', 'dashboard.no_servers', 'Aucun serveur pour le moment'),
|
||||
('fr', 'dashboard.quick_actions', 'Actions rapides'),
|
||||
('fr', 'dashboard.recent_servers', 'Serveurs récents'),
|
||||
('fr', 'dashboard.title', 'Tableau de bord'),
|
||||
('fr', 'dashboard.total_clients', 'Total des clients'),
|
||||
('fr', 'dashboard.total_servers', 'Total des serveurs'),
|
||||
('fr', 'dashboard.total_traffic', 'Trafic total'),
|
||||
('fr', 'dashboard.welcome', 'Bienvenue sur le panneau de gestion Amnezia VPN'),
|
||||
('fr', 'form.cancel', 'Annuler'),
|
||||
('fr', 'form.close', 'Fermer'),
|
||||
('fr', 'form.create', 'Créer'),
|
||||
('fr', 'form.loading', 'Chargement...'),
|
||||
('fr', 'form.processing', 'Traitement...'),
|
||||
('fr', 'form.save', 'Enregistrer'),
|
||||
('fr', 'form.submit', 'Soumettre'),
|
||||
('fr', 'form.update', 'Mettre à jour'),
|
||||
('fr', 'menu.clients', 'Clients'),
|
||||
('fr', 'menu.dashboard', 'Tableau de bord'),
|
||||
('fr', 'menu.logout', 'Déconnexion'),
|
||||
('fr', 'menu.servers', 'Serveurs'),
|
||||
('fr', 'menu.settings', 'Paramètres'),
|
||||
('fr', 'menu.users', 'Utilisateurs'),
|
||||
('fr', 'message.confirm', 'Êtes-vous sûr ?'),
|
||||
('fr', 'message.deleted', 'Supprimé avec succès'),
|
||||
('fr', 'message.deployed', 'Déployé avec succès'),
|
||||
('fr', 'message.error', 'Une erreur est survenue'),
|
||||
('fr', 'message.saved', 'Enregistré avec succès'),
|
||||
('fr', 'message.success', 'Opération terminée avec succès'),
|
||||
('fr', 'servers.actions', 'Actions'),
|
||||
('fr', 'servers.add', 'Ajouter un serveur'),
|
||||
('fr', 'servers.clients', 'Clients'),
|
||||
('fr', 'servers.delete', 'Supprimer'),
|
||||
('fr', 'servers.deploy', 'Déployer'),
|
||||
('fr', 'servers.edit', 'Modifier'),
|
||||
('fr', 'servers.host', 'Hôte'),
|
||||
('fr', 'servers.name', 'Nom'),
|
||||
('fr', 'servers.port', 'Port'),
|
||||
('fr', 'servers.status', 'Statut'),
|
||||
('fr', 'servers.title', 'Serveurs'),
|
||||
('fr', 'servers.view', 'Voir'),
|
||||
('fr', 'settings.actions', 'Actions'),
|
||||
('fr', 'settings.api_key_configured', 'Clé API configurée'),
|
||||
('fr', 'settings.api_keys', 'Clés API'),
|
||||
('fr', 'settings.api_keys_desc', 'Configurer les clés API pour les services externes'),
|
||||
('fr', 'settings.auto_translate', 'Traduction automatique'),
|
||||
('fr', 'settings.change_password', 'Changer le mot de passe'),
|
||||
('fr', 'settings.confirm_password', 'Confirmer le mot de passe'),
|
||||
('fr', 'settings.confirm_translate', 'Démarrer la traduction automatique ? Cela peut prendre quelques minutes.'),
|
||||
('fr', 'settings.current_password', 'Mot de passe actuel'),
|
||||
('fr', 'settings.description', 'Gérer la configuration du panneau et les intégrations API'),
|
||||
('fr', 'settings.error_empty_key', 'La clé API ne peut pas être vide'),
|
||||
('fr', 'settings.error_invalid_key', 'Format de clé API invalide'),
|
||||
('fr', 'settings.error_key_test', 'Test de la clé API échoué'),
|
||||
('fr', 'settings.for_translation', 'pour la traduction automatique'),
|
||||
('fr', 'settings.get_key_at', 'Obtenez votre clé API sur'),
|
||||
('fr', 'settings.key_saved', 'Clé API enregistrée avec succès'),
|
||||
('fr', 'settings.keys', 'clés'),
|
||||
('fr', 'settings.language', 'Langue'),
|
||||
('fr', 'settings.min_6_chars', 'Minimum 6 caractères'),
|
||||
('fr', 'settings.new_password', 'Nouveau mot de passe'),
|
||||
('fr', 'settings.no_api_key', 'Aucune clé API configurée. La traduction automatique ne fonctionnera pas.'),
|
||||
('fr', 'settings.profile', 'Profil'),
|
||||
('fr', 'settings.progress', 'Progression'),
|
||||
('fr', 'settings.skip_validation', 'Ignorer la validation (enregistrer sans tester)'),
|
||||
('fr', 'settings.translation_complete', 'Traduction terminée'),
|
||||
('fr', 'settings.translation_status', 'État de la traduction'),
|
||||
('fr', 'settings.translations', 'Traductions'),
|
||||
('fr', 'settings.users', 'Utilisateurs'),
|
||||
('fr', 'status.active', 'Actif'),
|
||||
('fr', 'status.deploying', 'Déploiement'),
|
||||
('fr', 'status.disabled', 'Désactivé'),
|
||||
('fr', 'status.error', 'Erreur'),
|
||||
('fr', 'status.inactive', 'Inactif'),
|
||||
('fr', 'users.add_user', 'Ajouter un utilisateur'),
|
||||
('fr', 'users.administrator', 'Administrateur'),
|
||||
('fr', 'users.all_users', 'Tous les utilisateurs'),
|
||||
('fr', 'users.created', 'Créé'),
|
||||
('fr', 'users.delete_confirm', 'Supprimer {0} ?'),
|
||||
('fr', 'users.role', 'Rôle'),
|
||||
('fr', 'users.role_admin', 'Administrateur'),
|
||||
('fr', 'users.role_user', 'Utilisateur')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,131 @@
|
||||
-- Chinese translations
|
||||
-- This migration adds Chinese language translations
|
||||
|
||||
INSERT INTO translations (language_code, translation_key, translation_value) VALUES
|
||||
('zh', 'auth.email', '邮箱'),
|
||||
('zh', 'auth.login', '登录'),
|
||||
('zh', 'auth.name', '姓名'),
|
||||
('zh', 'auth.password', '密码'),
|
||||
('zh', 'auth.register', '注册'),
|
||||
('zh', 'backups.create', '创建备份'),
|
||||
('zh', 'backups.create_confirm', '创建此服务器上所有客户端的备份?'),
|
||||
('zh', 'backups.created_success', '备份创建成功'),
|
||||
('zh', 'backups.delete_confirm', '永久删除此备份?'),
|
||||
('zh', 'backups.deleted_success', '备份删除成功'),
|
||||
('zh', 'backups.login_required', '请通过API登录以管理备份'),
|
||||
('zh', 'backups.no_backups', '暂无备份'),
|
||||
('zh', 'backups.restore', '恢复'),
|
||||
('zh', 'backups.restore_confirm', '从此备份恢复客户端?现有客户端不会受到影响。'),
|
||||
('zh', 'backups.restored_success', '已恢复'),
|
||||
('zh', 'backups.title', '服务器备份'),
|
||||
('zh', 'clients.actions', '操作'),
|
||||
('zh', 'clients.add', '添加客户端'),
|
||||
('zh', 'clients.create', '创建客户端'),
|
||||
('zh', 'clients.delete', '删除'),
|
||||
('zh', 'clients.delete_confirm', '永久删除此客户端?'),
|
||||
('zh', 'clients.download_config', '下载配置'),
|
||||
('zh', 'clients.expiration', '过期时间'),
|
||||
('zh', 'clients.expired', '已过期'),
|
||||
('zh', 'clients.ip', 'IP地址'),
|
||||
('zh', 'clients.last_handshake', '最后握手'),
|
||||
('zh', 'clients.name', '客户端名称'),
|
||||
('zh', 'clients.never', '从不'),
|
||||
('zh', 'clients.never_expires', '永不过期'),
|
||||
('zh', 'clients.no_clients', '还没有客户'),
|
||||
('zh', 'clients.qr_code', '二维码'),
|
||||
('zh', 'clients.received', '已接收'),
|
||||
('zh', 'clients.restore', '恢复'),
|
||||
('zh', 'clients.revoke', '撤销'),
|
||||
('zh', 'clients.revoke_confirm', '撤销此客户端的访问权限?'),
|
||||
('zh', 'clients.sent', '已发送'),
|
||||
('zh', 'clients.server', '服务器'),
|
||||
('zh', 'clients.status', '状态'),
|
||||
('zh', 'clients.sync_stats', '同步统计'),
|
||||
('zh', 'clients.title', '客户端'),
|
||||
('zh', 'clients.traffic', '流量'),
|
||||
('zh', 'common.days', '天'),
|
||||
('zh', 'dashboard.active_clients', '活跃客户端'),
|
||||
('zh', 'dashboard.add_first_server', '添加第一个服务器'),
|
||||
('zh', 'dashboard.get_started', '从添加第一个VPN服务器开始'),
|
||||
('zh', 'dashboard.no_servers', '暂无服务器'),
|
||||
('zh', 'dashboard.quick_actions', '快捷操作'),
|
||||
('zh', 'dashboard.recent_servers', '最近的服务器'),
|
||||
('zh', 'dashboard.title', '仪表板'),
|
||||
('zh', 'dashboard.total_clients', '客户端总数'),
|
||||
('zh', 'dashboard.total_servers', '服务器总数'),
|
||||
('zh', 'dashboard.total_traffic', '总流量'),
|
||||
('zh', 'dashboard.welcome', '欢迎使用Amnezia VPN管理面板'),
|
||||
('zh', 'form.cancel', '取消'),
|
||||
('zh', 'form.close', '关闭'),
|
||||
('zh', 'form.create', '创建'),
|
||||
('zh', 'form.loading', '加载中...'),
|
||||
('zh', 'form.processing', '处理中...'),
|
||||
('zh', 'form.save', '保存'),
|
||||
('zh', 'form.submit', '提交'),
|
||||
('zh', 'form.update', '更新'),
|
||||
('zh', 'menu.clients', '客户端'),
|
||||
('zh', 'menu.dashboard', '仪表板'),
|
||||
('zh', 'menu.logout', '退出'),
|
||||
('zh', 'menu.servers', '服务器'),
|
||||
('zh', 'menu.settings', '设置'),
|
||||
('zh', 'menu.users', '用户'),
|
||||
('zh', 'message.confirm', '确定吗?'),
|
||||
('zh', 'message.deleted', '删除成功'),
|
||||
('zh', 'message.deployed', '部署成功'),
|
||||
('zh', 'message.error', '发生错误'),
|
||||
('zh', 'message.saved', '保存成功'),
|
||||
('zh', 'message.success', '操作完成'),
|
||||
('zh', 'servers.actions', '操作'),
|
||||
('zh', 'servers.add', '添加服务器'),
|
||||
('zh', 'servers.clients', '客户端'),
|
||||
('zh', 'servers.delete', '删除'),
|
||||
('zh', 'servers.deploy', '部署'),
|
||||
('zh', 'servers.edit', '编辑'),
|
||||
('zh', 'servers.host', '主机'),
|
||||
('zh', 'servers.name', '名称'),
|
||||
('zh', 'servers.port', '端口'),
|
||||
('zh', 'servers.status', '状态'),
|
||||
('zh', 'servers.title', '服务器'),
|
||||
('zh', 'servers.view', '查看'),
|
||||
('zh', 'settings.actions', '操作'),
|
||||
('zh', 'settings.api_key_configured', 'API密钥已配置'),
|
||||
('zh', 'settings.api_keys', 'API密钥'),
|
||||
('zh', 'settings.api_keys_desc', '配置外部服务的API密钥'),
|
||||
('zh', 'settings.auto_translate', '自动翻译'),
|
||||
('zh', 'settings.change_password', '修改密码'),
|
||||
('zh', 'settings.confirm_password', '确认密码'),
|
||||
('zh', 'settings.confirm_translate', '开始自动翻译?这可能需要几分钟。'),
|
||||
('zh', 'settings.current_password', '当前密码'),
|
||||
('zh', 'settings.description', '管理面板配置和API集成'),
|
||||
('zh', 'settings.error_empty_key', 'API密钥不能为空'),
|
||||
('zh', 'settings.error_invalid_key', '无效的API密钥格式'),
|
||||
('zh', 'settings.error_key_test', 'API密钥测试失败'),
|
||||
('zh', 'settings.for_translation', '用于自动翻译'),
|
||||
('zh', 'settings.get_key_at', '在此获取API密钥'),
|
||||
('zh', 'settings.key_saved', 'API密钥保存成功'),
|
||||
('zh', 'settings.keys', '密钥'),
|
||||
('zh', 'settings.language', '语言'),
|
||||
('zh', 'settings.min_6_chars', '最少6个字符'),
|
||||
('zh', 'settings.new_password', '新密码'),
|
||||
('zh', 'settings.no_api_key', '未配置API密钥。自动翻译将无法工作。'),
|
||||
('zh', 'settings.profile', '个人资料'),
|
||||
('zh', 'settings.progress', '进度'),
|
||||
('zh', 'settings.skip_validation', '跳过验证(不测试直接保存)'),
|
||||
('zh', 'settings.translation_complete', '翻译完成'),
|
||||
('zh', 'settings.translation_status', '翻译状态'),
|
||||
('zh', 'settings.translations', '翻译'),
|
||||
('zh', 'settings.users', '用户'),
|
||||
('zh', 'status.active', '活跃'),
|
||||
('zh', 'status.deploying', '部署中'),
|
||||
('zh', 'status.disabled', '已禁用'),
|
||||
('zh', 'status.error', '错误'),
|
||||
('zh', 'status.inactive', '不活跃'),
|
||||
('zh', 'users.add_user', '添加用户'),
|
||||
('zh', 'users.administrator', '管理员'),
|
||||
('zh', 'users.all_users', '所有用户'),
|
||||
('zh', 'users.created', '已创建'),
|
||||
('zh', 'users.delete_confirm', '删除 {0}?'),
|
||||
('zh', 'users.role', '角色'),
|
||||
('zh', 'users.role_admin', '管理员'),
|
||||
('zh', 'users.role_user', '用户')
|
||||
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
|
||||
@@ -0,0 +1,54 @@
|
||||
# Database Migrations
|
||||
|
||||
This directory contains SQL migration files that are automatically executed when the database container is first initialized.
|
||||
|
||||
## Execution Order
|
||||
|
||||
Migration files are executed in **alphabetical order** by MySQL's Docker entrypoint. Files are numbered to ensure correct execution sequence:
|
||||
|
||||
1. `001_init.sql` - Main database schema and tables
|
||||
2. `002_translations_ru.sql` - Russian translations
|
||||
3. `003_translations_es.sql` - Spanish translations
|
||||
4. `004_translations_de.sql` - German translations
|
||||
5. `005_translations_fr.sql` - French translations
|
||||
6. `006_translations_zh.sql` - Chinese translations
|
||||
|
||||
## Adding New Migrations
|
||||
|
||||
When creating new migration files:
|
||||
|
||||
1. Use numerical prefix (e.g., `007_add_feature.sql`)
|
||||
2. Ensure the number is higher than existing migrations
|
||||
3. Use descriptive names
|
||||
4. Always use `ON DUPLICATE KEY UPDATE` for INSERT statements to make migrations idempotent
|
||||
|
||||
## Manual Execution
|
||||
|
||||
To manually run migrations in an existing database:
|
||||
|
||||
```bash
|
||||
# Single migration
|
||||
docker compose exec db mysql -uroot -prootpassword amnezia_panel < migrations/001_init.sql
|
||||
|
||||
# All migrations in order
|
||||
for file in migrations/*.sql; do
|
||||
echo "Executing $file..."
|
||||
docker compose exec -T db mysql -uroot -prootpassword amnezia_panel < "$file"
|
||||
done
|
||||
```
|
||||
|
||||
## Regenerating Translation Migrations
|
||||
|
||||
To regenerate translation migrations from the current database:
|
||||
|
||||
```bash
|
||||
# Export translations for a specific language
|
||||
docker compose exec -T db mysql -uroot -prootpassword amnezia_panel \
|
||||
--default-character-set=utf8mb4 \
|
||||
-e "SELECT CONCAT('(''', language_code, ''', ''', translation_key, ''', ''',
|
||||
REPLACE(translation_value, '''', ''''''), '''),')
|
||||
FROM translations WHERE language_code = 'ru' ORDER BY translation_key;" \
|
||||
| grep -v "CONCAT" > /tmp/translations_ru.sql
|
||||
|
||||
# Then wrap with INSERT statement and ON DUPLICATE KEY UPDATE
|
||||
```
|
||||
Reference in New Issue
Block a user