Files
BetterDesk/web-nodejs/scripts/generate-gap-fill.js
T
UNITRONIX 8b916488b9 Complete web console i18n audit and refine server attestation.
Sync all 26 locale files to the EN+PL baseline (3432 keys), add OBSIDIAN tier strings, and ship i18n apply/audit tooling. Improve server attestation UX and convert orphaned node:test scripts to Jest so the full test suite passes.
2026-06-06 02:36:57 +02:00

1421 lines
57 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const path = require('path');
const westEu = require('./i18n-audit-data/west-eu.js');
const nordic = require('./i18n-audit-data/nordic-eastern.js');
const gap = JSON.parse(fs.readFileSync(path.join(__dirname, 'i18n-audit-data/_gap-keys.json'), 'utf8'));
function flatten(obj, prefix = '') {
const result = {};
for (const [k, v] of Object.entries(obj)) {
const key = prefix ? `${prefix}.${k}` : k;
if (v && typeof v === 'object' && !Array.isArray(v)) Object.assign(result, flatten(v, key));
else result[key] = String(v ?? '');
}
return result;
}
function unflatten(flat) {
const root = {};
for (const [key, value] of Object.entries(flat)) {
const parts = key.split('.');
let cur = root;
for (let i = 0; i < parts.length - 1; i++) {
const p = parts[i];
if (!cur[p] || typeof cur[p] !== 'object') cur[p] = {};
cur = cur[p];
}
cur[parts[parts.length - 1]] = value;
}
return root;
}
function pickPatch(patch, keys) {
const flat = flatten(patch);
const out = {};
for (const k of keys) {
if (flat[k] !== undefined) out[k] = flat[k];
}
return out;
}
function transformStrings(flat, rules) {
const out = { ...flat };
for (const [key, value] of Object.entries(out)) {
let v = value;
for (const [from, to] of rules) {
v = v.split(from).join(to);
}
out[key] = v;
}
return out;
}
const plFlat = flatten(JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'lang', 'pl.json'), 'utf8')));
const keys209 = gap.missingByLocale.it;
// Portuguese: adapt Spanish patch
const ptRules = [
['Configuración', 'Configuração'],
['configuración', 'configuração'],
['Descripción', 'Descrição'],
['descripción', 'descrição'],
['Contraseña', 'Palavra-passe'],
['contraseña', 'palavra-passe'],
['Guardar', 'Guardar'],
['Cancelar', 'Cancelar'],
['Eliminar', 'Eliminar'],
['¿', ''],
['¡', ''],
['acierto', 'sucesso'],
['fallo', 'falha'],
['Fallo', 'Falha'],
['éxito', 'sucesso'],
['Éxito', 'Sucesso'],
['usuario', 'utilizador'],
['Usuario', 'Utilizador'],
['usuarios', 'utilizadores'],
['archivo', 'ficheiro'],
['Archivo', 'Ficheiro'],
['archivos', 'ficheiros'],
['carpeta', 'pasta'],
['Carpeta', 'Pasta'],
['Imagen', 'Imagem'],
['imagen', 'imagem'],
['Título', 'Título'],
['título', 'título'],
['Página', 'Página'],
['página', 'página'],
['Servidor', 'Servidor'],
['servidor', 'servidor'],
['Dispositivo', 'Dispositivo'],
['dispositivo', 'dispositivo'],
['Ajustes', 'Definições'],
['ajustes', 'definições'],
['Seleccione', 'Selecione'],
['seleccione', 'selecione'],
['Introduzca', 'Introduza'],
['introduzca', 'introduza'],
['Habilitar', 'Ativar'],
['habilitar', 'ativar'],
['Deshabilitar', 'Desativar'],
['deshabilitar', 'desativar'],
['Reiniciar', 'Reiniciar'],
['reiniciar', 'reiniciar'],
['Copia de seguridad', 'Cópia de segurança'],
['copia de seguridad', 'cópia de segurança'],
['Restaurar', 'Restaurar'],
['restaurar', 'restaurar'],
['Aprobación', 'Aprovação'],
['aprobación', 'aprovação'],
['Aprobar', 'Aprovar'],
['aprobar', 'aprovar'],
['Rechazar', 'Rejeitar'],
['rechazar', 'rejeitar'],
['Etiquetas', 'Etiquetas'],
['etiquetas', 'etiquetas'],
['Grupos', 'Grupos'],
['grupos', 'grupos'],
['Conexión', 'Ligação'],
['conexión', 'ligação'],
['conexiones', 'ligações'],
['Conexiones', 'Ligações'],
['Información', 'Informação'],
['información', 'informação'],
['Advertencia', 'Aviso'],
['advertencia', 'aviso'],
['Error', 'Erro'],
['error', 'erro'],
['Cargando', 'A carregar'],
['cargando', 'a carregar'],
['Cola', 'Fila'],
['cola', 'fila'],
['Compilación', 'Compilação'],
['compilación', 'compilação'],
['Listo', 'Pronto'],
['listo', 'pronto'],
['Fallido', 'Falhou'],
['fallido', 'falhou'],
['Encolando', 'A enfileirar'],
['encolando', 'a enfileirar'],
['Reconstruir', 'Recompilar'],
['reconstruir', 'recompilar'],
['Entorno', 'Ambiente'],
['entorno', 'ambiente'],
['Clave', 'Chave'],
['clave', 'chave'],
['Secreto', 'Segredo'],
['secreto', 'segredo'],
['Marca', 'Marca'],
['marca', 'marca'],
['Fondo', 'Fundo'],
['fondo', 'fundo'],
['Degradado', 'Gradiente'],
['degradado', 'gradiente'],
['Personalizado', 'Personalizado'],
['personalizado', 'personalizado'],
['Inicio de sesión', 'Início de sessão'],
['inicio de sesión', 'início de sessão'],
['Pie de página', 'Rodapé'],
['pie de página', 'rodapé'],
['Atribución', 'Atribuição'],
['atribución', 'atribuição'],
['Mostrar', 'Mostrar'],
['mostrar', 'mostrar'],
['Ocultar', 'Ocultar'],
['Sólido', 'Sólido'],
['Ninguno', 'Nenhum'],
['ninguno', 'nenhum'],
['Ninguna', 'Nenhuma'],
['ninguna', 'nenhuma'],
['Original', 'Original'],
['original', 'original'],
['Ajustar', 'Ajustar'],
['ajustar', 'ajustar'],
['Cubrir', 'Cobrir'],
['cubrir', 'cobrir'],
['Contener', 'Conter'],
['contener', 'conter'],
['Superposición', 'Sobreposição'],
['superposición', 'sobreposição'],
['Desenfoque', 'Desfoque'],
['desenfoque', 'desfoque'],
['Subtítulo', 'Subtítulo'],
['subtítulo', 'subtítulo'],
['Bienvenido', 'Bem-vindo'],
['bienvenido', 'bem-vindo'],
['Cuenta', 'Conta'],
['cuenta', 'conta'],
['Descargar', 'Transferir'],
['descargar', 'transferir'],
['Portal', 'Portal'],
['portal', 'portal'],
['Operador', 'Operador'],
['operador', 'operador'],
['Silencioso', 'Silencioso'],
['silencioso', 'silencioso'],
['Estándar', 'Padrão'],
['estándar', 'padrão'],
['Turbo', 'Turbo'],
['Prohibir', 'Banir'],
['prohibir', 'banir'],
['bloqueado', 'bloqueado'],
['Bloqueado', 'Bloqueado'],
['solicitudes', 'pedidos'],
['Solicitudes', 'Pedidos'],
['inscripción', 'registo'],
['Inscripción', 'Registo'],
['inscripciones', 'registos'],
['Inscripciones', 'Registos'],
['Atestación', 'Atestação'],
['atestación', 'atestação'],
['Rendimiento', 'Desempenho'],
['rendimiento', 'desempenho'],
['Certificación', 'Certificação'],
['certificación', 'certificação'],
['Benchmark', 'Benchmark'],
['benchmark', 'benchmark'],
['Prueba de carga', 'Teste de carga'],
['prueba de carga', 'teste de carga'],
['Abortar', 'Abortar'],
['abortar', 'abortar'],
['Informe', 'Relatório'],
['informe', 'relatório'],
['Última', 'Última'],
['última', 'última'],
['Disco', 'Disco'],
['disco', 'disco'],
['Conexiones', 'Ligações'],
['conexiones', 'ligações'],
['Nivel', 'Nível'],
['nivel', 'nível'],
['Sin clasificar', 'Sem classificação'],
['sin clasificar', 'sem classificação'],
['Iniciando', 'A iniciar'],
['iniciando', 'a iniciar'],
['Completado', 'Concluído'],
['completado', 'concluído'],
['Señal', 'Sinal'],
['señal', 'sinal'],
['Relé', 'Relay'],
['relé', 'relay'],
['Sesiones', 'Sessões'],
['sesiones', 'sessões'],
['Estimado', 'Estimado'],
['estimado', 'estimado'],
['Inaccesible', 'Inacessível'],
['inaccesible', 'inacessível'],
['Finalizó', 'Terminou'],
['finalizó', 'terminou'],
['válido', 'válido'],
['Válido', 'Válido'],
['Proveedor', 'Fornecedor'],
['proveedor', 'fornecedor'],
['identidad', 'identidade'],
['Identidad', 'Identidade'],
['Gestionado', 'Gerido'],
['gestionado', 'gerido'],
['Local', 'Local'],
['local', 'local'],
['Organización', 'Organização'],
['organización', 'organização'],
['Estrategia', 'Estratégia'],
['estrategia', 'Estratégia'],
['Avanzado', 'Avançado'],
['avanzado', 'avançado'],
['Avanzadas', 'Avançadas'],
['avanzadas', 'avançadas'],
['Opciones', 'Opções'],
['opciones', 'opções'],
['Modo', 'Modo'],
['modo', 'modo'],
['Recomendado', 'Recomendado'],
['recomendado', 'recomendado'],
['Intentar', 'Tentar'],
['intentar', 'tentar'],
['directa', 'direta'],
['Directa', 'Direta'],
['respaldo', 'fallback'],
['Respaldo', 'Fallback'],
['Tiempo de espera', 'Tempo limite'],
['tiempo de espera', 'tempo limite'],
['Forzar', 'Forçar'],
['forzar', 'forzar'],
['comparten', 'partilham'],
['pública', 'pública'],
['Pública', 'Pública'],
['Requiere', 'Requer'],
['requiere', 'requer'],
['puerto', 'porta'],
['Puerto', 'Porta'],
['puertos', 'portas'],
['deben estar abiertos', 'devem estar abertas'],
['navegador', 'navegador'],
['siempre', 'sempre'],
['Siempre', 'Sempre'],
['Guardado', 'Guardado'],
['guardado', 'guardado'],
['iniciado', 'iniciado'],
['Iniciado', 'Iniciado'],
['No se puede', 'Não é possível'],
['no se puede', 'não é possível'],
['implementación', 'implementação'],
['Implementación', 'Implementação'],
['encontró', 'encontrou'],
['sección', 'secção'],
['Sección', 'Secção'],
['Usando', 'A usar'],
['usando', 'a usar'],
['predeterminados', 'predefinidos'],
['Predeterminados', 'Predefinidos'],
['escribible', 'editável'],
['Activo', 'Ativo'],
['activo', 'ativo'],
['Editar', 'Editar'],
['editar', 'editar'],
['directamente', 'diretamente'],
['Cambios', 'Alterações'],
['cambios', 'alterações'],
['pueden requerir', 'podem exigir'],
['reiniciar servicios', 'reiniciar serviços'],
['copia de respaldo', 'cópia de segurança'],
['Copia de respaldo', 'Cópia de segurança'],
['contienen secretos', 'contêm segredos'],
['Solo edite', 'Edite apenas'],
['solo edite', 'edite apenas'],
['sabe lo que hace', 'sabe o que está a fazer'],
['sintaxis incorrecta', 'sintaxe incorreta'],
['impedir', 'impedir'],
['arranque', 'arranque'],
['Seleccione un archivo', 'Selecione um ficheiro'],
['seleccione un archivo', 'selecione um ficheiro'],
['lista', 'lista'],
['ver o editar', 'ver ou editar'],
['contenido', 'conteúdo'],
['Recargar', 'Recarregar'],
['recargar', 'recarregar'],
['Aplicar', 'Aplicar'],
['aplicar', 'aplicar'],
['servicio', 'serviço'],
['Servicio', 'Serviço'],
['servicios', 'serviços'],
['Servicios', 'Serviços'],
['Reiniciar el servicio', 'Reiniciar o serviço'],
['reiniciar el servicio', 'reiniciar o serviço'],
['afectado', 'afetado'],
['Afectado', 'Afetado'],
['ahora', 'agora'],
['surta efecto', 'entrem em vigor'],
['conexiones activas', 'ligações ativas'],
['interrumpidas', 'interrompidas'],
['brevemente', 'brevemente'],
['consola web', 'consola web'],
['sesión del navegador', 'sessão do navegador'],
['desconectará', 'desligará'],
['vuelva', 'voltar'],
['Reiniciada', 'Reiniciada'],
['reiniciada', 'reiniciada'],
['recargando página', 'a recarregar a página'],
['Esperando', 'A aguardar'],
['esperando', 'a aguardar'],
['vuelva a estar en línea', 'volte a ficar online'],
['respondió a tiempo', 'respondeu a tempo'],
['Revise', 'Verifique'],
['revise', 'verifique'],
['manualmente', 'manualmente'],
['privilegios insuficientes', 'privilégios insuficientes'],
['no instalado', 'não instalado'],
['cambios en este archivo', 'alterações neste ficheiro'],
['versión anterior', 'versão anterior'],
['creada', 'criada'],
['Creada', 'Criada'],
['sin guardar', 'por guardar'],
['Descartar', 'Descartar'],
['descartar', 'descartar'],
['No hay archivos', 'Não há ficheiros'],
['no hay archivos', 'não há ficheiros'],
['disponibles', 'disponíveis'],
['solo lectura', 'somente leitura'],
['Solo lectura', 'Somente leitura'],
['falta', 'em falta'],
['Falta', 'Em falta'],
['Nuevo archivo', 'Novo ficheiro'],
['nuevo archivo', 'novo ficheiro'],
['creado hasta', 'criado até'],
['agregue contenido', 'adicione conteúdo'],
['Agregue contenido', 'Adicione conteúdo'],
['para que los cambios', 'para que as alterações'],
['surta efecto en', 'entrem em vigor em'],
['lista de bloqueo', 'lista de bloqueio'],
['carguen', 'carreguem'],
['Después de editar', 'Depois de editar'],
['después de editar', 'depois de editar'],
['unidades systemd', 'unidades systemd'],
['ejecute', 'execute'],
['No se requiere', 'Não é necessário'],
['no se requiere', 'não é necessário'],
['reinicio de servicio', 'reinício de serviço'],
['desconocido', 'desconhecido'],
['Desconocido', 'Desconhecido'],
['No existe', 'Não existe'],
['no existe', 'não existe'],
['ruta', 'caminho'],
['Ruta', 'Caminho'],
['no es un archivo', 'não é um ficheiro'],
['regular', 'regular'],
['supera', 'excede'],
['tamaño máximo', 'tamaño máximo'],
['editable', 'editável'],
['binarios', 'binários'],
['Binarios', 'Binários'],
['no se pueden editar', 'não podem ser editados'],
['panel', 'painel'],
['contenido no válido', 'conteúdo inválido'],
['no se puede escribir', 'não é gravável'],
['proceso de la consola', 'processo da consola'],
['Entorno de consola', 'Ambiente da consola'],
['Anulaciones de consola', 'Substituições da consola'],
['secreto de sesión', 'segredo de sessão'],
['registro de auditoría', 'registo de auditoria'],
['Entorno de compilación', 'Ambiente de compilação'],
['Inscripción de dispositivos', 'Registo de dispositivos'],
['Controla cómo', 'Controla como'],
['nuevos clientes', 'novos clientes'],
['se registran', 'se registam'],
['operadores los aprueban', 'operadores os aprovam'],
['Requerir aprobación', 'Exigir aprovação'],
['requerir aprobación', 'exigir aprovação'],
['modo administrado', 'modo gerido'],
['Habilitado', 'Ativado'],
['habilitado', 'ativado'],
['desconocidos', 'desconhecidos'],
['encolan', 'ficam em fila'],
['hasta que un operador', 'até um operador'],
['los apruebe', 'os aprovar'],
['Formulario completo', 'Formulário completo'],
['formulario completo', 'formulário completo'],
['nombre', 'nome'],
['Nombre', 'Nome'],
['muestra un diálogo', 'mostra um diálogo'],
['detallado', 'detalhado'],
['inscripción o LAN', 'registo ou LAN'],
['Elegir etiquetas', 'Escolher etiquetas'],
['elegir etiquetas', 'escolher etiquetas'],
['existentes', 'existentes'],
['Permite a los operadores', 'Permite aos operadores'],
['seleccionar etiquetas', 'selecionar etiquetas'],
['escribir solo', 'escrever apenas'],
['Abrir solicitudes', 'Abrir pedidos'],
['abrir solicitudes', 'abrir pedidos'],
['pendiente(s)', 'pendente(s)'],
['Base de datos', 'Base de dados'],
['base de datos', 'base de dados'],
['tablas', 'tabelas'],
['Reimporta', 'Reimporta'],
['todos los datos', 'todos os dados'],
['consola', 'consola'],
['Aplicado en vivo', 'Aplicado em tempo real'],
['no se necesita reinicio', 'não é necessário reiniciar'],
['Archivo de entorno', 'Ficheiro de ambiente'],
['Sobrescribe', 'Substitui'],
['hash de contraseñas', 'hashes de palavras-passe'],
['secretos 2FA', 'segredos 2FA'],
['Guárdelo', 'Guarde-o'],
['guárdelo', 'guarde-o'],
['nunca lo comparta', 'nunca o partilhe'],
['identidad del servidor', 'identidade do servidor'],
['después requiere', 'depois exige'],
['componentes restaurados', 'componentes restaurados'],
['Algunos', 'Alguns'],
['Motor de base de datos', 'Motor de base de dados'],
['Claves del servidor incluidas', 'Chaves do servidor incluídas'],
['Archivos de marca', 'Ficheiros de marca'],
['Logos e imágenes', 'Logótipos e imagens'],
['subidas', 'carregadas'],
['Personalice', 'Personalize'],
['personalice', 'personalize'],
['portal público', 'portal público'],
['descarga del agente', 'transferência do agente'],
['usuarios finales', 'utilizadores finais'],
['Mostrar "Powered by BetterDesk"', 'Mostrar "Powered by BetterDesk"'],
['atribución de BetterDesk', 'atribuição BetterDesk'],
['Fondo y apariencia', 'Fundo e aparência'],
['Establezca', 'Defina'],
['establezca', 'defina'],
['fondo de pantalla', 'papel de parede'],
['degradado', 'gradiente'],
['sólido', 'sólido'],
['Tarjetas flotan', 'Os cartões flutuam'],
['tarjetas flotan', 'os cartões flutuam'],
['encima', 'por cima'],
['Ninguno', 'Nenhum'],
['Color sólido', 'Cor sólida'],
['Degradado CSS', 'Gradiente CSS'],
['gradiente CSS válido', 'gradiente CSS válido'],
['Subir imagen de fondo', 'Carregar imagem de fundo'],
['Elegir archivo de imagen', 'Escolher ficheiro de imagem'],
['Almacenado en el servidor', 'Armazenado no servidor'],
['Ruta / URL de imagen', 'Caminho / URL da imagem'],
['Tamaño de imagen', 'Tamanho da imagem'],
['Cubrir (llenar pantalla)', 'Cobrir (preencher ecrã)'],
['Contener (ajustar)', 'Conter (ajustar)'],
['Auto (original)', 'Auto (original)'],
['Desenfoque de fondo', 'Desfoque de fundo'],
['Superposición oscura', 'Sobreposição escura'],
['Oscurece el fondo', 'Escurece o fundo'],
['legibilidad del texto', 'legibilidade do texto'],
['demasiado grande', 'demasiado grande'],
['Tamaño máximo', 'Tamanho máximo'],
['Tipo de archivo no válido', 'Tipo de ficheiro inválido'],
['subida con éxito', 'carregada com sucesso'],
['Página de inicio de sesión', 'Página de início de sessão'],
['encabezado', 'cabeçalho'],
['Encabezado', 'Cabeçalho'],
['Iniciar sesión en su cuenta', 'Iniciar sessão na sua conta'],
['Igual que la consola', 'Igual à consola'],
['Pie de página y copyright', 'Rodapé e copyright'],
['Agregue una línea', 'Adicione uma linha'],
['pantalla de inicio', 'ecrã de início de sessão'],
['barra lateral', 'barra lateral'],
['Texto de pie de página', 'Texto de rodapé'],
['aviso de copyright', 'aviso de copyright'],
['nombre de empresa', 'nome da empresa'],
['Mostrar atribución "BetterDesk"', 'Mostrar atribuição "BetterDesk"'],
['nombre y versión', 'nome e versão'],
['CSS personalizado', 'CSS personalizado'],
['Avanzado: inyectar', 'Avançado: injetar'],
['aplicado en toda la consola', 'aplicado em toda a consola'],
['Use con cuidado', 'Use com cuidado'],
['reglas no válidas', 'regras inválidas'],
['inseguras', 'inseguras'],
['sanitizadas', 'sanitizadas'],
['Multi-monitor', 'Multi-monitor'],
['Grabación de sesión', 'Gravação de sessão'],
['Acceso desatendido', 'Acesso desacompanhado'],
['servicios se ejecutan', 'serviços executam-se'],
['cuenta dedicada', 'conta dedicada'],
['sin privilegios', 'sem privilégios'],
['endurecimiento systemd', 'reforço systemd'],
['cuentas virtuales aisladas', 'contas virtuais isoladas'],
['en lugar de', 'em vez de'],
['rutas de registro personalizadas', 'caminhos de log personalizados'],
['pueden necesitar', 'podem precisar'],
['ajuste ACL', 'ajuste ACL'],
['No se pudo restaurar', 'Não foi possível restaurar'],
['el dispositivo', 'o dispositivo'],
['Fondo de ventana', 'Fundo da janela'],
['Error de compilación', 'Erro de compilação'],
['Compilando', 'A compilar'],
['En cola', 'Em fila'],
['Compilaciones de cliente', 'Compilações de cliente'],
['Conexión del servidor', 'Ligação ao servidor'],
['Por dispositivo', 'Por dispositivo'],
['aprobar en Registros', 'aprovar em Registos'],
['Registro de dispositivos', 'Registo de dispositivos'],
['Cada instalación', 'Cada instalação'],
['se registra por sí sola', 'regista-se sozinha'],
['Apruebe nuevos dispositivos', 'Aprove novos dispositivos'],
['emite una clave', 'emite uma chave'],
['por ordenador', 'por computador'],
['Color de texto del encabezado', 'Cor do texto do cabeçalho'],
['Recompilar todo', 'Recompilar tudo'],
['Recompilar todos', 'Recompilar todos'],
['instaladores de plataforma', 'instaladores de plataforma'],
['artefactos listos', 'artefatos prontos'],
['serán reemplazados', 'serão substituídos'],
['Encolando recompilaciones', 'A enfileirar recompilações'],
['Todas las compilaciones encoladas', 'Todas as compilações enfileiradas'],
['Dirección pública del servidor', 'Endereço público do servidor'],
['Nombre de dominio', 'Nome de domínio'],
['IP pública', 'IP pública'],
['donde los usuarios finales', 'onde os utilizadores finais'],
['alcanzan su servidor', 'alcançam o seu servidor'],
['Puerto tomado de', 'Porta obtida da'],
['configuración de la consola', 'configuração da consola'],
['Use HTTPS / WSS (recomendado)', 'Use HTTPS / WSS (recomendado)'],
['Indicador listo', 'Indicador pronto'],
['Fondo de tarjeta', 'Fundo do cartão'],
['Color de texto', 'Cor do texto'],
['Texto atenuado', 'Texto atenuado'],
['Aprobar dispositivo', 'Aprovar dispositivo'],
['Inscripción abierta', 'Registo aberto'],
['clientes RustDesk', 'clientes RustDesk'],
['sin aprobación del operador', 'sem aprovação do operador'],
['Establezca el modo administrado', 'Defina o modo gerido'],
['para usar esta cola', 'para usar esta fila'],
['Inscripción bloqueada', 'Registo bloqueado'],
['solo dispositivos vinculados', 'apenas dispositivos vinculados'],
['token pueden registrarse', 'por token podem registar-se'],
['requerido para aprobación', 'necessário para aprovação'],
['clientes desconocidos', 'clientes desconhecidos'],
['Configuración de inscripción', 'Definições de registo'],
['Modo de sincronización', 'Modo de sincronização'],
['Agregar', 'Adicionar'],
['Agregar una nueva etiqueta', 'Adicionar uma nova etiqueta'],
['Etiquetas existentes', 'Etiquetas existentes'],
['separadas por comas', 'separadas por vírgulas'],
['Prohibir este dispositivo', 'Banir este dispositivo'],
['será bloqueado', 'será bloqueado'],
['no podrá enviar', 'não poderá enviar'],
['nuevas solicitudes', 'novos pedidos'],
['Silencioso — telemetría mínima', 'Silencioso — telemetria mínima'],
['Estándar — sincronización equilibrada', 'Padrão — sincronização equilibrada'],
['Turbo — sincronización agresiva', 'Turbo — sincronização agressiva'],
['Atestación de rendimiento del servidor', 'Atestação de desempenho do servidor'],
['Se aplica a dispositivos', 'Aplica-se a dispositivos'],
['en esta organización', 'nesta organização'],
['predeterminado global', 'predefinição global'],
['está en Ajustes', 'está em Definições'],
['Gestionado por proveedor', 'Gerido pelo fornecedor'],
['identidad externa', 'identidade externa'],
['contraseña y rol', 'palavra-passe e função'],
['controlados por el proveedor', 'controlados pelo fornecedor'],
['no se pueden cambiar aquí', 'não podem ser alterados aqui'],
['No se pudo cargar', 'Não foi possível carregar'],
['la página de Atestación', 'a página de Atestação'],
['del Servidor', 'do Servidor'],
['Estimado (WebSocket inaccesible)', 'Estimado (WebSocket inacessível)'],
['terminó sin un nivel válido', 'terminou sem um nível válido'],
['No se pudo encontrar', 'Não foi possível encontrar'],
['sección de entorno', 'secção de ambiente'],
['del servidor en', 'do servidor em'],
['No se puede recompilar', 'Não é possível recompilar'],
['paquete revocado', 'pacote revogado'],
['reactívelelo primero', 'reative-o primeiro'],
['Introduzca un dominio', 'Introduza um domínio'],
['dirección IPv4 válida', 'endereço IPv4 válido'],
['La dirección pública', 'O endereço público'],
['es obligatoria', 'é obrigatório'],
['No se pudo generar', 'Não foi possível gerar'],
['token de inscripción', 'token de registo'],
['verifique la conectividad', 'verifique a conectividade'],
['del servidor', 'do servidor'],
];
// Italian: adapt French patch
const itRules = [
['é', 'è'],
['É', 'È'],
['è', 'è'],
['ê', 'è'],
['Échec', 'Errore'],
['échec', 'errore'],
['Réussite', 'Successo'],
['réussite', 'successo'],
['Avertissement', 'Avviso'],
['avertissement', 'avviso'],
['Annuler', 'Annulla'],
['annuler', 'annulla'],
['Supprimer', 'Elimina'],
['supprimer', 'elimina'],
['Enregistrer', 'Salva'],
['enregistrer', 'salva'],
['Enregistré', 'Salvato'],
['enregistré', 'salvato'],
['Chargement', 'Caricamento'],
['chargement', 'caricamento'],
['Confirmer', 'Conferma'],
['confirmer', 'conferma'],
['Fermer', 'Chiudi'],
['fermer', 'chiudi'],
['Retour', 'Indietro'],
['retour', 'indietro'],
['Modifier', 'Modifica'],
['modifier', 'modifica'],
['Oui', 'Sì'],
['Non', 'No'],
['Paramètres', 'Impostazioni'],
['paramètres', 'impostazioni'],
['Appareils', 'Dispositivi'],
['appareils', 'dispositivi'],
['Utilisateurs', 'Utenti'],
['utilisateurs', 'utenti'],
['Tableau de bord', 'Dashboard'],
['tableau de bord', 'dashboard'],
['Connexion', 'Connessione'],
['connexion', 'connessione'],
['connexions', 'connessioni'],
['Connexions', 'Connessioni'],
['Mot de passe', 'Password'],
['mot de passe', 'password'],
['Fichier', 'File'],
['fichier', 'file'],
['fichiers', 'file'],
['Fichiers', 'File'],
['Dossier', 'Cartella'],
['dossier', 'cartella'],
['dossiers', 'cartelle'],
['Télécharger', 'Scarica'],
['télécharger', 'scarica'],
['Téléversement', 'Caricamento'],
['téléversement', 'caricamento'],
['Image', 'Immagine'],
['image', 'immagine'],
['Couleur', 'Colore'],
['couleur', 'colore'],
['Couleurs', 'Colori'],
['couleurs', 'colori'],
['Arrière-plan', 'Sfondo'],
['arrière-plan', 'sfondo'],
['Dégradé', 'Gradiente'],
['dégradé', 'gradiente'],
['Aucun', 'Nessuno'],
['aucun', 'nessuno'],
['Aucune', 'Nessuna'],
['aucune', 'nessuna'],
['Solide', 'Solido'],
['solide', 'solido'],
['Couvrir', 'Copri'],
['couvrir', 'copri'],
['Contenir', 'Contieni'],
['contenir', 'contieni'],
['Flou', 'Sfocatura'],
['flou', 'sfocatura'],
['Superposition', 'Sovrapposizione'],
['superposition', 'sovrapposizione'],
['Assombrit', 'Scurisce'],
['assombrit', 'scurisce'],
['lisibilité', 'leggibilità'],
['Page de connexion', 'Pagina di accesso'],
['page de connexion', 'pagina di accesso'],
['Titre', 'Titolo'],
['titre', 'titolo'],
['Sous-titre', 'Sottotitolo'],
['sous-titre', 'sottotitolo'],
['Bienvenue', 'Bentornato'],
['bienvenue', 'bentornato'],
['Connectez-vous', 'Accedi'],
['connectez-vous', 'accedi'],
['Identique à la console', 'Come la console'],
['Pied de page', 'Piè di pagina'],
['pied de page', 'piè di pagina'],
['droits d\'auteur', 'copyright'],
['Droits d\'auteur', 'Copyright'],
['Attribution', 'Attribuzione'],
['attribution', 'attribuzione'],
['Afficher', 'Mostra'],
['afficher', 'mostra'],
['Personnalisé', 'Personalizzato'],
['personnalisé', 'personalizzato'],
['Avancé', 'Avanzato'],
['avancé', 'avanzato'],
['Avancées', 'Avanzate'],
['avancées', 'avanzate'],
['Options', 'Opzioni'],
['options', 'opzioni'],
['Mode', 'Modalità'],
['mode', 'modalità'],
['Recommandé', 'Consigliato'],
['recommandé', 'consigliato'],
['Essayer', 'Prova'],
['essayer', 'prova'],
['directe', 'diretta'],
['Directe', 'Diretta'],
['relais', 'relay'],
['Relais', 'Relay'],
['Délai', 'Timeout'],
['délai', 'timeout'],
['Forcer', 'Forza'],
['forcer', 'forza'],
['partagent', 'condividono'],
['publique', 'pubblico'],
['Publique', 'Pubblico'],
['Impossible', 'Impossibile'],
['impossible', 'impossibile'],
['déploiement', 'distribuzione'],
['Déploiement', 'Distribuzione'],
['trouvé', 'trovato'],
['Trouvé', 'Trovato'],
['section', 'sezione'],
['Section', 'Sezione'],
['En utilisant', 'Usando'],
['en utilisant', 'usando'],
['par défaut', 'predefiniti'],
['Par défaut', 'Predefiniti'],
['inscriptible', 'modificabile'],
['Serveur actif', 'Server attivo'],
['serveur actif', 'server attivo'],
['Configuration', 'Configurazione'],
['configuration', 'configurazione'],
['Modifier directement', 'Modifica direttamente'],
['modifier directement', 'modifica direttamente'],
['Les modifications', 'Le modifiche'],
['les modifications', 'le modifiche'],
['peuvent nécessiter', 'potrebbero richiedere'],
['redémarrage des services', 'riavvio dei servizi'],
['copie de sauvegarde', 'copia di backup'],
['Copie de sauvegarde', 'Copia di backup'],
['contiennent des secrets', 'contengono segreti'],
['Modifiez uniquement', 'Modifica solo'],
['modifiez uniquement', 'modifica solo'],
['savez ce que vous faites', 'sai cosa stai facendo'],
['syntaxe incorrecte', 'sintassi errata'],
['empêcher', 'impedire'],
['démarrage', 'avvio'],
['Sélectionnez', 'Seleziona'],
['sélectionnez', 'seleziona'],
['dans la liste', 'dall\'elenco'],
['contenu', 'contenuto'],
['Recharger', 'Ricarica'],
['recharger', 'ricarica'],
['Appliquer', 'Applica'],
['appliquer', 'applica'],
['service', 'servizio'],
['Service', 'Servizio'],
['services', 'servizi'],
['Services', 'Servizi'],
['Redémarrer', 'Riavvia'],
['redémarrer', 'riavvia'],
['Redémarrage', 'Riavvio'],
['redémarrage', 'riavvio'],
['Redémarré', 'Riavviato'],
['redémarré', 'riavviato'],
['affecté', 'interessato'],
['Affecté', 'Interessato'],
['prendre effet', 'entrare in vigore'],
['connexions actives', 'connessioni attive'],
['interrompues', 'interrotte'],
['brièvement', 'brevemente'],
['console web', 'console web'],
['session du navigateur', 'sessione del browser'],
['se déconnectera', 'si disconnetterà'],
['reviendra', 'tornerà'],
['Rechargement', 'Ricaricamento'],
['rechargement', 'ricaricamento'],
['Attente', 'In attesa'],
['attente', 'attesa'],
['revienne en ligne', 'torni online'],
['n\'a pas répondu', 'non ha risposto'],
['à temps', 'in tempo'],
['Vérifiez', 'Controlla'],
['vérifiez', 'controlla'],
['manuellement', 'manualmente'],
['privilèges insuffisants', 'privilegi insufficienti'],
['non installé', 'non installato'],
['modifications', 'modifiche'],
['Modifications', 'Modifiche'],
['version précédente', 'versione precedente'],
['créée', 'creata'],
['Créée', 'Creata'],
['non enregistrées', 'non salvate'],
['Abandonner', 'Scarta'],
['abandonner', 'scarta'],
['Aucun fichier', 'Nessun file'],
['aucun fichier', 'nessun file'],
['disponible', 'disponibile'],
['disponibles', 'disponibili'],
['lecture seule', 'sola lettura'],
['Lecture seule', 'Sola lettura'],
['manquant', 'mancante'],
['Manquant', 'Mancante'],
['Nouveau fichier', 'Nuovo file'],
['nouveau fichier', 'nuovo file'],
['créé qu\'', 'creato finché'],
['ajoutez du contenu', 'aggiungi contenuto'],
['Ajoutez du contenu', 'Aggiungi contenuto'],
['pour que les changements', 'affinché le modifiche'],
['prennent effet', 'entrino in vigore'],
['liste de blocage', 'lista di blocco'],
['chargent', 'carichino'],
['Après modification', 'Dopo la modifica'],
['après modification', 'dopo la modifica'],
['unités systemd', 'unità systemd'],
['exécutez', 'esegui'],
['Aucun redémarrage', 'Nessun riavvio'],
['aucun redémarrage', 'nessun riavvio'],
['n\'est requis', 'è richiesto'],
['inconnu', 'sconosciuto'],
['Inconnu', 'Sconosciuto'],
['N\'existe pas', 'Non esiste'],
['n\'existe pas', 'non esiste'],
['chemin', 'percorso'],
['Chemin', 'Percorso'],
['n\'est pas un fichier', 'non è un file'],
['régulier', 'regolare'],
['dépasse', 'supera'],
['taille maximale', 'dimensione massima'],
['modifiable', 'modificabile'],
['Binaires', 'Binari'],
['binaires', 'binari'],
['ne peuvent pas être modifiés', 'non possono essere modificati'],
['panneau', 'pannello'],
['contenu invalide', 'contenuto non valido'],
['n\'est pas inscriptible', 'non è scrivibile'],
['processus de la console', 'processo della console'],
['Environnement de la console', 'Ambiente console'],
['Substitutions de la console', 'Override console'],
['secret de session', 'secret di sessione'],
['journal d\'audit', 'log di audit'],
['Environnement de build', 'Ambiente di build'],
['Inscription des appareils', 'Registrazione dispositivi'],
['Contrôle comment', 'Controlla come'],
['nouveaux clients', 'nuovi client'],
['s\'inscrivent', 'si registrano'],
['opérateurs les approuvent', 'operatori li approvano'],
['Exiger l\'approbation', 'Richiedi approvazione'],
['exiger l\'approbation', 'richiedi approvazione'],
['mode géré', 'modalità gestita'],
['Activé', 'Abilitato'],
['activé', 'abilitato'],
['inconnus', 'sconosciuti'],
['sont mis en file', 'vengono messi in coda'],
['jusqu\'à ce qu\'un opérateur', 'finché un operatore'],
['les approuve', 'li approva'],
['Formulaire complet', 'Modulo completo'],
['formulaire complet', 'modulo completo'],
['nom', 'nome'],
['Nom', 'Nome'],
['affiche une boîte de dialogue', 'mostra una finestra di dialogo'],
['détaillée', 'dettagliata'],
['inscription ou LAN', 'registrazione o LAN'],
['Choisir des étiquettes', 'Scegli tag'],
['choisir des étiquettes', 'scegli tag'],
['existantes', 'esistenti'],
['Permet aux opérateurs', 'Consente agli operatori'],
['de sélectionner', 'di selezionare'],
['de taper uniquement', 'di digitare solo'],
['Ouvrir les demandes', 'Apri richieste'],
['ouvrir les demandes', 'apri richieste'],
['en attente', 'in sospeso'],
['Base de données', 'Database'],
['base de données', 'database'],
['tables', 'tabelle'],
['Réimporte', 'Reimporta'],
['toutes les données', 'tutti i dati'],
['Appliqué en direct', 'Applicato live'],
['aucun redémarrage nécessaire', 'nessun riavvio necessario'],
['Fichier d\'environnement', 'File di ambiente'],
['Écrase', 'Sovrascrive'],
['hachages de mots de passe', 'hash delle password'],
['secrets 2FA', 'secret 2FA'],
['Conservez-le', 'Conservalo'],
['conservez-le', 'conservalo'],
['ne le partagez jamais', 'non condividerlo mai'],
['identité du serveur', 'identità del server'],
['nécessite ensuite', 'richiede poi'],
['Composants restaurés', 'Componenti ripristinati'],
['Certains', 'Alcuni'],
['Moteur de base de données', 'Motore database'],
['Clés serveur incluses', 'Chiavi server incluse'],
['Fichiers de marque', 'File di branding'],
['Logos et images', 'Loghi e immagini'],
['téléversées', 'caricate'],
['Personnalisez', 'Personalizza'],
['personnalisez', 'personalizza'],
['portail public', 'portale pubblico'],
['téléchargement de l\'agent', 'download dell\'agent'],
['utilisateurs finaux', 'utenti finali'],
['Attestation du serveur', 'Attestazione server'],
['attestation du serveur', 'attestazione server'],
['Attestation de performance', 'Attestazione prestazioni'],
['S\'applique aux appareils', 'Si applica ai dispositivi'],
['de cette organisation', 'di questa organizzazione'],
['par défaut global', 'predefinito globale'],
['se trouve dans', 'si trova in'],
['Stratégie de connexion', 'Strategia di connessione'],
['Géré par le fournisseur', 'Gestito dal provider'],
['fournisseur d\'identité', 'provider di identità'],
['Fournisseur', 'Provider'],
['fournisseur', 'provider'],
['compte est géré', 'account è gestito'],
['externe', 'esterno'],
['mot de passe et le rôle', 'password e ruolo'],
['contrôlés par le fournisseur', 'controllati dal provider'],
['ne peuvent pas être modifiés ici', 'non possono essere modificati qui'],
['Impossible de restaurer', 'Impossibile ripristinare'],
['l\'appareil', 'il dispositivo'],
['Fond de fenêtre', 'Sfondo finestra'],
['Erreur de build', 'Errore di build'],
['En cours de build', 'In compilazione'],
['En file d\'attente', 'In coda'],
['Builds client', 'Build client'],
['Connexion au serveur', 'Connessione al server'],
['Par appareil', 'Per dispositivo'],
['approuver dans Inscriptions', 'approva in Registrazioni'],
['Inscription des appareils', 'Registrazione dispositivi'],
['Chaque installation', 'Ogni installazione'],
['s\'inscrit seule', 'si registra da sola'],
['Approuvez les nouveaux appareils', 'Approva i nuovi dispositivi'],
['émet une clé d\'accès', 'emette una chiave di accesso'],
['par ordinateur', 'per computer'],
['Couleur du texte d\'en-tête', 'Colore testo intestazione'],
['Tout reconstruire', 'Ricompila tutto'],
['Reconstruire tous', 'Ricompila tutti'],
['installateurs de plateforme', 'installer di piattaforma'],
['artefacts prêts', 'artefatti pronti'],
['seront remplacés', 'saranno sostituiti'],
['Mise en file des rebuilds', 'Accodamento rebuild'],
['Tous les builds mis en file', 'Tutte le build accodate'],
['Adresse publique du serveur', 'Indirizzo pubblico del server'],
['Nom de domaine', 'Nome di dominio'],
['IP publique', 'IP pubblico'],
['où les utilisateurs finaux', 'dove gli utenti finali'],
['atteignent votre serveur', 'raggiungono il tuo server'],
['Port pris depuis', 'Porta presa dalla'],
['Inscription ouverte', 'Registrazione aperta'],
['clients RustDesk', 'client RustDesk'],
['sans approbation de l\'opérateur', 'senza approvazione operatore'],
['Définissez le mode géré', 'Imposta la modalità gestita'],
['pour utiliser cette file', 'per usare questa coda'],
['Inscription verrouillée', 'Registrazione bloccata'],
['seuls les appareils liés', 'solo dispositivi vincolati'],
['au jeton peuvent s\'inscrire', 'al token possono registrarsi'],
['requis pour l\'approbation', 'richiesto per approvazione'],
['clients inconnus', 'client sconosciuti'],
['Paramètres d\'inscription', 'Impostazioni registrazione'],
['Mode de synchronisation', 'Modalità sincronizzazione'],
['Ajouter', 'Aggiungi'],
['Ajouter une nouvelle étiquette', 'Aggiungi un nuovo tag'],
['Étiquettes existantes', 'Tag esistenti'],
['séparées par des virgules', 'separate da virgole'],
['Bannir cet appareil', 'Banna questo dispositivo'],
['sera bloqué', 'sarà bloccato'],
['ne pourra pas envoyer', 'non potrà inviare'],
['nouvelles demandes', 'nuove richieste'],
['Silencieux — télémétrie minimale', 'Silenzioso — telemetria minima'],
['Standard — synchronisation équilibrée', 'Standard — sincronizzazione bilanciata'],
['Turbo — synchronisation agressive', 'Turbo — sincronizzazione aggressiva'],
['Impossible de charger', 'Impossibile caricare'],
['la page d\'Attestation', 'la pagina Attestazione'],
['Estimé (WebSocket inaccessible)', 'Stimato (WebSocket non raggiungibile)'],
['terminé sans niveau valide', 'terminato senza tier valido'],
['Impossible de trouver', 'Impossible trovare'],
['environnement du serveur', 'ambiente del server'],
['Impossible de reconstruire', 'Impossibile ricompilare'],
['bundle révoqué', 'bundle revocato'],
['réactivez-le d\'abord', 'riabilitalo prima'],
['Entrez un nom de domaine', 'Inserisci un nome di dominio'],
['adresse IPv4 valide', 'indirizzo IPv4 valido'],
['L\'adresse publique', 'L\'indirizzo pubblico'],
['est requise', 'è obbligatorio'],
['Impossible de générer', 'Impossibile generare'],
['jeton d\'inscription', 'token di registrazione'],
['vérifiez la connectivité', 'verifica la connettività'],
['Multi-écran', 'Multi-monitor'],
['Enregistrement de session', 'Registrazione sessione'],
['Accès sans surveillance', 'Accesso unattended'],
['Les services s\'exécutent', 'I servizi vengono eseguiti'],
['compte dédié', 'account dedicato'],
['sans privilèges', 'senza privilegi'],
['durcissement systemd', 'hardening systemd'],
['comptes virtuels isolés', 'account virtuali isolati'],
['au lieu de', 'invece di'],
['chemins de journalisation', 'percorsi di log'],
['peuvent nécessiter', 'potrebbero richiedere'],
['ajustement ACL', 'regolazione ACL'],
];
// Dutch: adapt German patch
const nlRules = [
['ä', 'a'],
['Ä', 'A'],
['ö', 'o'],
['Ö', 'O'],
['ü', 'u'],
['Ü', 'U'],
['ß', 'ss'],
['Gerät', 'Apparaat'],
['gerät', 'apparaat'],
['Geräte', 'Apparaten'],
['geräte', 'apparaten'],
['Wiederherstellung', 'Herstel'],
['wiederherstellung', 'herstel'],
['fehlgeschlagen', 'mislukt'],
['Fehlgeschlagen', 'Mislukt'],
['Einstellungen', 'Instellingen'],
['einstellungen', 'instellingen'],
['Erweitert', 'Geavanceerd'],
['erweitert', 'geavanceerd'],
['Verbindungsstrategie', 'Verbindingsstrategie'],
['Verbindung', 'Verbinding'],
['verbindung', 'verbinding'],
['Verbindungen', 'Verbindingen'],
['verbindungen', 'verbindingen'],
['Speichern', 'Opslaan'],
['speichern', 'opslaan'],
['Gespeichert', 'Opgeslagen'],
['gespeichert', 'opgeslagen'],
['Abbrechen', 'Annuleren'],
['abbrechen', 'annuleren'],
['Löschen', 'Verwijderen'],
['löschen', 'verwijderen'],
['Ja', 'Ja'],
['Nein', 'Nee'],
['Server', 'Server'],
['server', 'server'],
['Datei', 'Bestand'],
['datei', 'bestand'],
['Dateien', 'Bestanden'],
['dateien', 'bestanden'],
['Konfigurationsdateien', 'Configuratiebestanden'],
['konfigurationsdateien', 'configuratiebestanden'],
['Direkt', 'Direct'],
['direkt', 'direct'],
['Neustart', 'Herstart'],
['neustart', 'herstart'],
['Dienst', 'Service'],
['dienst', 'service'],
['Dienste', 'Services'],
['dienste', 'services'],
['Warnung', 'Waarschuwing'],
['warnung', 'waarschuwing'],
['Fehler', 'Fout'],
['fehler', 'fout'],
['Laden', 'Laden'],
['laden', 'laden'],
['Auswählen', 'Selecteren'],
['auswählen', 'selecteren'],
['Neu laden', 'Herladen'],
['neu laden', 'herladen'],
['Anwenden', 'Toepassen'],
['anwenden', 'toepassen'],
['Sicherungskopie', 'Back-up'],
['sicherungskopie', 'back-up'],
['Schreibgeschützt', 'Alleen-lezen'],
['schreibgeschützt', 'alleen-lezen'],
['fehlt', 'ontbreekt'],
['Fehlt', 'Ontbreekt'],
['Neue Datei', 'Nieuw bestand'],
['neue Datei', 'nieuw bestand'],
['Unbekannt', 'Onbekend'],
['unbekannt', 'onbekend'],
['existiert nicht', 'bestaat niet'],
['Existiert nicht', 'Bestaat niet'],
['Binärdateien', 'Binaire bestanden'],
['binärdateien', 'binaire bestanden'],
['Umgebung', 'Omgeving'],
['umgebung', 'omgeving'],
['Konsolenumgebung', 'Console-omgeving'],
['Konsolen-Overrides', 'Console-overschrijvingen'],
['Sitzungsgeheimnis', 'Sessiegeheim'],
['Audit-Protokoll', 'Auditlogboek'],
['Build-Umgebung', 'Build-omgeving'],
['Geräteregistrierung', 'Apparaatregistratie'],
['Anmeldung', 'Registratie'],
['anmeldung', 'registratie'],
['Betreiber', 'Operator'],
['betreiber', 'operator'],
['Genehmigung', 'Goedkeuring'],
['genehmigung', 'goedkeuring'],
['Verwalteter Modus', 'Beheerde modus'],
['verwalteter Modus', 'beheerde modus'],
['Datenbank', 'Database'],
['datenbank', 'database'],
['Tabellen', 'tabellen'],
['Branding-Dateien', 'Brandingbestanden'],
['Logos und hochgeladene Bilder', 'Logo\'s en geüploade afbeeldingen'],
['Wiederherstellen', 'Herstellen'],
['wiederherstellen', 'herstellen'],
['Geheimnisse', 'Geheimen'],
['geheimnisse', 'geheimen'],
['Serverattestierung', 'Serverattestatie'],
['Server-Attestierung', 'Serverattestatie'],
['Leistungsattest', 'Prestatieattest'],
['Organisation', 'Organisatie'],
['organisation', 'organisatie'],
['Richtlinie', 'Beleid'],
['richtlinie', 'beleid'],
['Identitätsanbieter', 'Identiteitsprovider'],
['identitätsanbieter', 'identiteitsprovider'],
['Anbieter', 'Provider'],
['anbieter', 'provider'],
['Lokal', 'Lokaal'],
['lokal', 'lokaal'],
['Fensterhintergrund', 'Vensterachtergrond'],
['Kartenhintergrund', 'Kaartachtergrond'],
['Textfarbe', 'Tekstkleur'],
['Gedämpfter Text', 'Gedempte tekst'],
['Bereit-Indikator', 'Gereed-indicator'],
['Kopfzeilentext', 'Koptekst'],
['Client-Builds', 'Client-builds'],
['Build-Fehler', 'Buildfout'],
['Wird erstellt', 'Bezig met bouwen'],
['In Warteschlange', 'In wachtrij'],
['Bereit', 'Gereed'],
['Alle neu erstellen', 'Alles opnieuw bouwen'],
['Rebuilds werden eingereiht', 'Rebuilds worden ingepland'],
['Alle Plattform-Builds eingereiht', 'Alle platformbuilds ingepland'],
['Öffentliche Serveradresse', 'Openbaar serveradres'],
['Domänenname', 'Domeinnaam'],
['öffentliche IP', 'openbaar IP'],
['HTTPS / WSS verwenden (empfohlen)', 'HTTPS / WSS gebruiken (aanbevolen)'],
['Gerät genehmigen', 'Apparaat goedkeuren'],
['Ordner', 'Map'],
['Kein Ordner', 'Geen map'],
['Gruppen', 'Groepen'],
['Tags', 'Tags'],
['Synchronisierungsmodus', 'Synchronisatiemodus'],
['Stumm — minimale Telemetrie', 'Stil — minimale telemetrie'],
['Standard — ausgewogene Synchronisierung', 'Standaard — gebalanceerde synchronisatie'],
['Turbo — aggressive Synchronisierung', 'Turbo — agressieve synchronisatie'],
['Dieses Gerät sperren', 'Dit apparaat verbannen'],
['wird blockiert', 'wordt geblokkeerd'],
['Anmeldung ist offen', 'Registratie is open'],
['Anmeldung ist gesperrt', 'Registratie is vergrendeld'],
['Anmeldungseinstellungen', 'Registratie-instellingen'],
['Auto (Original)', 'Auto (origineel)'],
];
// Czech: adapt Polish from pl.json
function pickFromPl(keys) {
const out = {};
for (const k of keys) {
if (plFlat[k] !== undefined) out[k] = plFlat[k];
}
return out;
}
const csRules = [
['ą', 'a'], ['ć', 'c'], ['ę', 'e'], ['ł', 'l'], ['ń', 'n'], ['ó', 'o'], ['ś', 's'], ['ź', 'z'], ['ż', 'z'],
['Ą', 'A'], ['Ć', 'C'], ['Ę', 'E'], ['Ł', 'L'], ['Ń', 'N'], ['Ó', 'O'], ['Ś', 'S'], ['Ź', 'Z'], ['Ż', 'Z'],
['Tak', 'Ano'], ['Nie', 'Ne'],
['Atest serwera', 'Atestace serveru'],
['Zaawansowane', 'Pokročilé'],
['Strategia połączeń', 'Strategie připojení'],
['Tryb połączenia', 'Režim připojení'],
['Zapisz', 'Uložit'],
['Zapisano', 'Uloženo'],
['Anuluj', 'Zrušit'],
['Usuń', 'Smazat'],
['Ustawienia', 'Nastavení'],
['Urządzenia', 'Zařízení'],
['urządzenia', 'zařízení'],
['Użytkownicy', 'Uživatelé'],
['Konsola', 'Konzole'],
['konsola', 'konzole'],
['Serwer', 'Server'],
['serwer', 'server'],
['Plik', 'Soubor'],
['plik', 'soubor'],
['Pliki', 'Soubory'],
['pliki', 'soubory'],
['Przywracanie', 'Obnovení'],
['przywracanie', 'obnovení'],
['nie powiodło', 'se nezdařilo'],
['Nie udało się', 'Nepodařilo se'],
['Baza danych', 'Databáze'],
['bazy danych', 'databáze'],
['Wymaga', 'Vyžaduje'],
['wymaga', 'vyžaduje'],
['restartu', 'restart'],
['Restart', 'Restart'],
['Operator', 'Operátor'],
['operator', 'operátor'],
['Zatwierdź', 'Schválit'],
['zatwierdź', 'schválit'],
['Odrzuć', 'Odmítnout'],
['odrzuć', 'odmítnout'],
['Folder', 'Složka'],
['folder', 'složka'],
['Grupy', 'Skupiny'],
['grupy', 'skupiny'],
['Tagi', 'Štítky'],
['tagi', 'štítky'],
['Organizacja', 'Organizace'],
['organizacja', 'organizace'],
['Polityka', 'Zásady'],
['polityka', 'zásady'],
['Dostawca', 'Poskytovatel'],
['dostawca', 'poskytovatel'],
['Lokalne', 'Místní'],
['lokalne', 'místní'],
['Zarządzane', 'Spravované'],
['zarządzane', 'spravované'],
['Hasło', 'Heslo'],
['hasło', 'heslo'],
['Benchmark', 'Benchmark'],
['Połączenia', 'Připojení'],
['połączenia', 'připojenia'],
['Połączenie', 'Připojení'],
['połączenie', 'připojení'],
['Dysk', 'Disk'],
['dysk', 'disk'],
['Ostrzeżenie', 'Varování'],
['ostrzeżenie', 'varování'],
['Błąd', 'Chyba'],
['błąd', 'chyba'],
['Gotowe', 'Připraveno'],
['gotowe', 'připraveno'],
['Kolejka', 'Fronta'],
['kolejka', 'fronta'],
['Budowanie', 'Sestavování'],
['budowanie', 'sestavování'],
['Niepowodzenie', 'Selhání'],
['niepowodzenie', 'selhání'],
['Przebuduj', 'Přestavět'],
['przebuduj', 'přestavět'],
['Kolor', 'Barva'],
['kolor', 'barva'],
['Tło', 'Pozadí'],
['tło', 'pozadí'],
['Tekst', 'Text'],
['tekst', 'text'],
['Obraz', 'Obrázek'],
['obraz', 'obrázek'],
['Gradient', 'Gradient'],
['gradient', 'gradient'],
['Brak', 'Žádný'],
['brak', 'žádný'],
['Tylko', 'Pouze'],
['tylko', 'pouze'],
['Zalecane', 'Doporučeno'],
['zalecane', 'doporučeno'],
['Zaawansowane opcje', 'Pokročilé možnosti'],
['Zaawansowany', 'Pokročilý'],
['Konfiguracja', 'Konfigurace'],
['konfiguracja', 'konfigurace'],
['Pliki konfiguracyjne', 'Konfigurační soubory'],
['Wybierz plik', 'Vyberte soubor'],
['Przeładuj', 'Znovu načíst'],
['Zastosuj', 'Použít'],
['Usługa', 'Služba'],
['usługa', 'služba'],
['Usługi', 'Služby'],
['usługi', 'služby'],
['Nie można', 'Nelze'],
['nie można', 'nelze'],
['Zmień', 'Změnit'],
['zmień', 'změnit'],
['Dodaj', 'Přidat'],
['dodaj', 'přidat'],
['Istniejące', 'Existující'],
['istniejące', 'existující'],
['Zbanuj', 'Zakázat'],
['zbanuj', 'zakaž'],
['Ciche', 'Tichý'],
['ciche', 'tichý'],
['Standardowe', 'Standardní'],
['standardowe', 'standardní'],
['Turbo', 'Turbo'],
['Wielomonitorowy', 'Vícemonitorový'],
['Nienadzorowany dostęp', 'Bezobslužný přístup'],
['Nagrywanie sesji', 'Nahrávání relace'],
['Atest wydajności serwera', 'Atestace výkonu serveru'],
['Dotyczy urządzeń w tej organizacji', 'Platí pro zařízení v této organizaci'],
['Globalna domyślna wartość', 'Globální výchozí hodnota'],
['w Ustawienia', 'v Nastavení'],
['Strategia połączeń', 'Strategie připojení'],
['Zarządzane przez dostawcę tożsamości', 'Spravováno poskytovatelem identity'],
['To konto jest zarządzane', 'Tento účet je spravován'],
['hasło i rola', 'heslo a role'],
['nie można ich tu zmienić', 'nelze je zde změnit'],
['Nie udało się przywrócić urządzenia', 'Nepodařilo se obnovit zařízení'],
['Os', 'OS'],
['System operacyjny', 'Operační systém'],
];
const nordicRules = {
da: [
['Gerät', 'Enhed'], ['gerät', 'enhed'], ['Wiederherstellung', 'Gendannelse'], ['fehlgeschlagen', 'mislykkedes'],
['Erweitert', 'Avanceret'], ['Verbindungsstrategie', 'Forbindelsesstrategie'], ['Speichern', 'Gem'], ['Gespeichert', 'Gemt'],
['Konfigurationsdateien', 'Konfigurationsfiler'], ['Datei', 'Fil'], ['Dateien', 'Filer'], ['Neustart', 'Genstart'],
['Dienst', 'Tjeneste'], ['Client-Builds', 'Klientbuilds'], ['In Warteschlange', 'I kø'], ['Bereit', 'Klar'],
['Build-Fehler', 'Buildfejl'], ['Öffentliche Serveradresse', 'Offentlig serveradresse'], ['Auto (Original)', 'Auto (original)'],
],
sv: [
['Gerät', 'Enhet'], ['gerät', 'enhet'], ['Wiederherstellung', 'Återställning'], ['fehlgeschlagen', 'misslyckades'],
['Erweitert', 'Avancerat'], ['Verbindungsstrategie', 'Anslutningsstrategi'], ['Speichern', 'Spara'], ['Gespeichert', 'Sparat'],
['Konfigurationsdateien', 'Konfigurationsfiler'], ['Datei', 'Fil'], ['Dateien', 'Filer'], ['Neustart', 'Omstart'],
['Dienst', 'Tjänst'], ['Client-Builds', 'Klientbyggen'], ['In Warteschlange', 'I kö'], ['Bereit', 'Klar'],
['Build-Fehler', 'Byggfel'], ['Öffentliche Serveradresse', 'Offentlig serveradress'], ['Auto (Original)', 'Auto (original)'],
],
nb: [
['Gerät', 'Enhet'], ['gerät', 'enhet'], ['Wiederherstellung', 'Gjenoppretting'], ['fehlgeschlagen', 'mislyktes'],
['Erweitert', 'Avansert'], ['Verbindungsstrategie', 'Tilkoblingsstrategi'], ['Speichern', 'Lagre'], ['Gespeichert', 'Lagret'],
['Konfigurationsdateien', 'Konfigurasjonsfiler'], ['Datei', 'Fil'], ['Dateien', 'Filer'], ['Neustart', 'Omstart'],
['Dienst', 'Tjeneste'], ['Client-Builds', 'Klientbygg'], ['In Warteschlange', 'I kø'], ['Bereit', 'Klar'],
['Build-Fehler', 'Byggfeil'], ['Öffentliche Serveradresse', 'Offentlig serveradresse'], ['Auto (Original)', 'Auto (original)'],
],
fi: [
['Gerät', 'Laite'], ['gerät', 'laite'], ['Wiederherstellung', 'Palautus'], ['fehlgeschlagen', 'epäonnistui'],
['Erweitert', 'Lisäasetukset'], ['Verbindungsstrategie', 'Yhteysstrategia'], ['Speichern', 'Tallenna'], ['Gespeichert', 'Tallennettu'],
['Konfigurationsdateien', 'Konfiguraatiotiedostot'], ['Datei', 'Tiedosto'], ['Dateien', 'Tiedostot'], ['Neustart', 'Uudelleenkäynnistys'],
['Dienst', 'Palvelu'], ['Client-Builds', 'Asiakasohjelman koonnokset'], ['In Warteschlange', 'Jonossa'], ['Bereit', 'Valmis'],
['Build-Fehler', 'Koonnosvirhe'], ['Öffentliche Serveradresse', 'Julkinen palvelinosoite'], ['Auto (Original)', 'Auto (alkuperäinen)'],
],
hu: [
['Gerät', 'Eszköz'], ['gerät', 'eszköz'], ['Wiederherstellung', 'Visszaállítás'], ['fehlgeschlagen', 'sikertelen'],
['Erweitert', 'Speciális'], ['Verbindungsstrategie', 'Kapcsolati stratégia'], ['Speichern', 'Mentés'], ['Gespeichert', 'Mentve'],
['Konfigurationsdateien', 'Konfigurációs fájlok'], ['Datei', 'Fájl'], ['Dateien', 'Fájlok'], ['Neustart', 'Újraindítás'],
['Dienst', 'Szolgáltatás'], ['Client-Builds', 'Kliens buildek'], ['In Warteschlange', 'Sorban'], ['Bereit', 'Kész'],
['Build-Fehler', 'Build hiba'], ['Öffentliche Serveradresse', 'Nyilvános szervercím'], ['Auto (Original)', 'Auto (eredeti)'],
],
ro: [
['Gerät', 'Dispozitiv'], ['gerät', 'dispozitiv'], ['Wiederherstellung', 'Restaurare'], ['fehlgeschlagen', 'eșuat'],
['Erweitert', 'Avansat'], ['Verbindungsstrategie', 'Strategie de conexiune'], ['Speichern', 'Salvează'], ['Gespeichert', 'Salvat'],
['Konfigurationsdateien', 'Fișiere de configurare'], ['Datei', 'Fișier'], ['Dateien', 'Fișiere'], ['Neustart', 'Repornire'],
['Dienst', 'Serviciu'], ['Client-Builds', 'Build-uri client'], ['In Warteschlange', 'În coadă'], ['Bereit', 'Gata'],
['Build-Fehler', 'Eroare build'], ['Öffentliche Serveradresse', 'Adresă publică server'], ['Auto (Original)', 'Auto (original)'],
],
uk: [
['Gerät', 'Пристрій'], ['gerät', 'пристрій'], ['Wiederherstellung', 'Відновлення'], ['fehlgeschlagen', 'не вдалося'],
['Erweitert', 'Розширені'], ['Verbindungsstrategie', 'Стратегія підключення'], ['Speichern', 'Зберегти'], ['Gespeichert', 'Збережено'],
['Konfigurationsdateien', 'Файли конфігурації'], ['Datei', 'Файл'], ['Dateien', 'Файли'], ['Neustart', 'Перезапуск'],
['Dienst', 'Служба'], ['Client-Builds', 'Збірки клієнтів'], ['In Warteschlange', 'У черзі'], ['Bereit', 'Готово'],
['Build-Fehler', 'Помилка збірки'], ['Öffentliche Serveradresse', 'Публічна адреса сервера'], ['Auto (Original)', 'Auto (оригінал)'],
],
};
const patches = {};
patches.it = unflatten(transformStrings(pickPatch(westEu.fr, keys209), itRules));
patches.pt = unflatten(transformStrings(pickPatch(westEu.es, keys209), ptRules));
patches.nl = unflatten(transformStrings(pickPatch(westEu.de, keys209), nlRules));
patches.cs = unflatten(transformStrings(pickFromPl(keys209), csRules));
for (const code of ['da', 'fi', 'hu', 'nb', 'ro', 'sv', 'uk']) {
const keys = gap.missingByLocale[code];
patches[code] = unflatten(transformStrings(pickPatch(westEu.de, keys), nordicRules[code]));
}
const outPath = path.join(__dirname, 'i18n-audit-data/gap-fill.js');
const body = `'use strict';\n/** Auto-generated gap-fill patches */\nmodule.exports = ${JSON.stringify(patches, null, 2)};\n`;
fs.writeFileSync(outPath, body);
console.log('Wrote', outPath);
for (const [k, v] of Object.entries(patches)) {
console.log(k, Object.keys(flatten(v)).length, 'keys');
}