Add multilingual support with translations for German, Russian, French, and Chinese

Added time limits and backup functions for servers
This commit is contained in:
infosave2007
2025-11-08 09:14:20 +03:00
parent 1deea2e4b7
commit 1f91f17f57
25 changed files with 2494 additions and 103 deletions
@@ -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);
+127
View File
@@ -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);
+131
View File
@@ -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);
+131
View File
@@ -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);
+127
View File
@@ -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);
+131
View File
@@ -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);
+127
View File
@@ -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);
+127
View File
@@ -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);
+131
View File
@@ -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);
+131
View File
@@ -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);
+54
View File
@@ -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
```