diff --git a/i18n/locales/a11y/en.json b/i18n/locales/a11y/en.json new file mode 100644 index 0000000000..f6ec198e67 --- /dev/null +++ b/i18n/locales/a11y/en.json @@ -0,0 +1,32 @@ +{ + "a11y": { + "title": "accessibility", + "footer_title": "a11y", + "welcome": "We want {app} to be usable by as many people as possible.", + "approach": { + "title": "Our approach", + "p1": "We try to follow the Web Content Accessibility Guidelines (WCAG) 2.2 and use them as a reference when building features. We don't claim full conformance with any level of WCAG — accessibility is a continual process and there is always more work to do.", + "p2": "This site is an {about}. Accessibility improvements are made incrementally as part of our regular development.", + "about_link": "open-source, community-driven project" + }, + "measures": { + "title": "What we do", + "p1": "Some of the things we aim to do across the site:", + "li1": "Use semantic HTML and ARIA attributes where appropriate.", + "li2": "Use relative text sizes so you can adjust them in your browser.", + "li3": "Support keyboard navigation throughout the interface.", + "li4": "Respect the prefers-reduced-motion and prefers-color-scheme media queries.", + "li5": "Design with sufficient color contrast in mind.", + "li6": "Ensure essential content is available without JavaScript, though some interactive features require it." + }, + "limitations": { + "title": "Known limitations", + "p1": "Some parts of the site — particularly third-party content like package READMEs — may not meet accessibility standards. We are working to improve these areas over time." + }, + "contact": { + "title": "Feedback", + "p1": "If you encounter an accessibility barrier on {app}, please let us know by opening an issue on our {link}. We take these reports seriously and will do our best to address them.", + "link": "GitHub repository" + } + } +} diff --git a/i18n/locales/a11y/es-419.json b/i18n/locales/a11y/es-419.json new file mode 100644 index 0000000000..5615193eb4 --- /dev/null +++ b/i18n/locales/a11y/es-419.json @@ -0,0 +1,5 @@ +{ + "a11y": { + "welcome": "Queremos que {app} sea utilizable por la mayor cantidad de personas posible." + } +} diff --git a/i18n/locales/a11y/es.json b/i18n/locales/a11y/es.json new file mode 100644 index 0000000000..39905db1e9 --- /dev/null +++ b/i18n/locales/a11y/es.json @@ -0,0 +1,32 @@ +{ + "a11y": { + "title": "accesibilidad", + "footer_title": "a11y", + "welcome": "Queremos que {app} sea utilizable por el mayor número de personas posible.", + "approach": { + "title": "Nuestro enfoque", + "p1": "Intentamos seguir las Pautas de Accesibilidad para el Contenido Web (WCAG) 2.2 y usarlas como referencia al desarrollar funcionalidades. No afirmamos cumplir totalmente con ningún nivel de WCAG; la accesibilidad es un proceso continuo y siempre hay más trabajo por hacer.", + "p2": "Este sitio es un {about}. Las mejoras de accesibilidad se realizan de forma incremental como parte de nuestro desarrollo habitual.", + "about_link": "proyecto de código abierto impulsado por la comunidad" + }, + "measures": { + "title": "Qué hacemos", + "p1": "Algunas de las cosas que intentamos hacer en todo el sitio web:", + "li1": "Usar HTML semántico y atributos ARIA cuando sea apropiado.", + "li2": "Usar tamaños de texto relativos para que puedas ajustarlos en tu navegador.", + "li3": "Soportar la navegación por teclado en toda la interfaz.", + "li4": "Respetar las preferencias de reducción de movimiento y esquema de color.", + "li5": "Diseñar teniendo en cuenta un contraste de color suficiente.", + "li6": "Asegurar que el contenido esencial esté disponible sin JavaScript, aunque algunas funciones interactivas lo requieran." + }, + "limitations": { + "title": "Limitaciones conocidas", + "p1": "Algunas partes del sitio, particularmente el contenido de terceros como los README de los paquetes, pueden no cumplir con los estándares de accesibilidad. Estamos trabajando para mejorar estas áreas con el tiempo." + }, + "contact": { + "title": "Comentarios", + "p1": "Si encuentras una barrera de accesibilidad en {app}, por favor háznoslo saber abriendo una incidencia en nuestro {link}. Nos tomamos estos informes muy en serio y haremos todo lo posible para abordarlos.", + "link": "repositorio de GitHub" + } + } +} diff --git a/i18n/locales/about/en-GB.json b/i18n/locales/about/en-GB.json new file mode 100644 index 0000000000..ce5cd9d77b --- /dev/null +++ b/i18n/locales/about/en-GB.json @@ -0,0 +1,7 @@ +{ + "about": { + "what_we_are": { + "admin_description": "We also aim to provide a better {adminUi} for managing your packages, teams, and organisations — all from the browser, powered by your local npm CLI." + } + } +} diff --git a/i18n/locales/about/en.json b/i18n/locales/about/en.json new file mode 100644 index 0000000000..5d0951664a --- /dev/null +++ b/i18n/locales/about/en.json @@ -0,0 +1,74 @@ +{ + "about": { + "title": "About", + "heading": "about", + "meta_description": "npmx is a fast, modern browser for the npm registry. A better UX/DX for exploring npm packages.", + "what_we_are": { + "title": "What we are", + "better_ux_dx": "better UX/DX", + "admin_ui": "admin UI", + "description": "npmx is a {betterUxDx} for the npm package registry and tooling. We provide a fast, modern interface for exploring packages, with features like dark mode, keyboard navigation, code browsing, and connections to alternative registries like {jsr}.", + "admin_description": "We also aim to provide a better {adminUi} for managing your packages, teams, and organizations — all from the browser, powered by your local npm CLI." + }, + "what_we_are_not": { + "title": "What we're not", + "not_package_manager": "Not a package manager.", + "not_registry": "Not a registry.", + "registry_description": "We don't host packages. We're just a better way to browse them.", + "package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.", + "words": { + "already": "There are", + "people": "already", + "building": "people", + "really": "building", + "cool": "really", + "package": "cool", + "managers": "package managers" + } + }, + "sponsors": { + "title": "Sponsors" + }, + "oss_partners": { + "title": "OSS Partners" + }, + "team": { + "title": "Team", + "governance": "Governance", + "role_steward": "steward", + "role_maintainer": "maintainer", + "sponsor": "sponsor", + "sponsor_aria": "Sponsor {name} on GitHub" + }, + "contributors": { + "title": "... and {count} more contributor | ... and {count} more contributors", + "description": "npmx is fully open source, built by an amazing community of contributors. Join us and let's build the npm browsing experience we always wanted, together.", + "loading": "Loading contributors...", + "error": "Failed to load contributors", + "view_profile": "View {name}'s GitHub profile" + }, + "get_involved": { + "title": "Get involved", + "contribute": { + "title": "Contribute", + "description": "Help us build a better npm experience.", + "cta": "View on GitHub" + }, + "community": { + "title": "Join the community", + "description": "Chat, ask questions, and share ideas.", + "cta": "Join Discord" + }, + "builders": { + "title": "Help build npmx", + "description": "Join the builders shaping the future of npmx.", + "cta": "Join Builders Discord" + }, + "follow": { + "title": "Stay updated", + "description": "Find out the latest on npmx.", + "cta": "Follow on Bluesky" + } + } + } +} diff --git a/i18n/locales/about/es-419.json b/i18n/locales/about/es-419.json new file mode 100644 index 0000000000..d88b183dde --- /dev/null +++ b/i18n/locales/about/es-419.json @@ -0,0 +1,7 @@ +{ + "about": { + "what_we_are": { + "admin_description": "También aspiramos a proporcionar una mejor {adminUi} para administrar tus paquetes, equipos y organizaciones — todo desde el navegador, impulsado por tu CLI de npm local." + } + } +} diff --git a/i18n/locales/about/es.json b/i18n/locales/about/es.json new file mode 100644 index 0000000000..5fff382270 --- /dev/null +++ b/i18n/locales/about/es.json @@ -0,0 +1,70 @@ +{ + "about": { + "title": "Acerca de", + "heading": "acerca de", + "meta_description": "npmx es un explorador rápido y moderno para el registro npm. Una mejor UX/DX para explorar paquetes npm.", + "what_we_are": { + "title": "Lo que somos", + "better_ux_dx": "mejor UX/DX", + "admin_ui": "UI de administración", + "description": "npmx es una {betterUxDx} para el registro de paquetes npm y herramientas. Proporcionamos una interfaz rápida y moderna para explorar paquetes, con características como modo oscuro, navegación por teclado, exploración de código y conexiones a registros alternativos como {jsr}.", + "admin_description": "También aspiramos a proporcionar una mejor {adminUi} para gestionar tus paquetes, equipos y organizaciones — todo desde el navegador, impulsado por tu CLI de npm local." + }, + "what_we_are_not": { + "title": "Lo que no somos", + "not_package_manager": "No es un gestor de paquetes.", + "not_registry": "No es un registro.", + "registry_description": "No alojamos paquetes. Solo somos una mejor manera de explorarlos.", + "package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.", + "words": { + "already": "Ya hay", + "people": "gente", + "building": "construyendo", + "really": "gestores de", + "cool": "paquetes", + "package": "realmente", + "managers": "geniales" + } + }, + "sponsors": { + "title": "Patrocinadores" + }, + "oss_partners": { + "title": "Socios de OSS" + }, + "team": { + "title": "Equipo", + "governance": "Gobernanza", + "role_steward": "Administrador", + "role_maintainer": "Mantenedor", + "sponsor": "Patrocinar", + "sponsor_aria": "Patrocinar a {name} en GitHub" + }, + "contributors": { + "title": "{count} Colaborador | {count} Colaboradores", + "description": "npmx es completamente de código abierto, construido por una increíble comunidad de colaboradores. Únete a nosotros y construyamos juntos la experiencia de navegación de npm que siempre quisimos.", + "loading": "Cargando colaboradores...", + "error": "Error al cargar colaboradores", + "view_profile": "Ver perfil de GitHub de {name}" + }, + "get_involved": { + "title": "Involúcrate", + "contribute": { + "title": "Contribuir", + "description": "Ayúdanos a construir una mejor experiencia npm.", + "cta": "Ver en GitHub" + }, + "community": { + "title": "Únete a la comunidad", + "description": "Chatea, haz preguntas y comparte ideas.", + "cta": "Únete a Discord" + }, + "builders": {}, + "follow": { + "title": "Mantente actualizado", + "description": "Entérate de lo último en npmx.", + "cta": "Síguenos en Bluesky" + } + } + } +} diff --git a/i18n/locales/compare/en.json b/i18n/locales/compare/en.json new file mode 100644 index 0000000000..9829e242cd --- /dev/null +++ b/i18n/locales/compare/en.json @@ -0,0 +1,159 @@ +{ + "compare": { + "packages": { + "title": "compare packages", + "tagline": "compare npm packages side-by-side to help you choose the right one.", + "meta_title": "Compare {packages} - npmx", + "meta_title_empty": "Compare Packages - npmx", + "meta_description": "Side-by-side comparison of {packages}", + "meta_description_empty": "Compare npm packages side-by-side", + "section_packages": "Packages", + "section_facets": "Facets", + "section_comparison": "Comparison", + "copy_as_markdown": "Copy table", + "loading": "Loading package data...", + "error": "Failed to load package data. Please try again.", + "empty_title": "Select packages to compare", + "empty_description": "Search and add at least 2 packages above to see a side-by-side comparison of their metrics.", + "table_view": "Table", + "charts_view": "Charts" + }, + "selector": { + "search_label": "Search for packages", + "search_first": "Search for a package...", + "search_add": "Add another package...", + "searching": "Searching...", + "remove_package": "Remove {package}", + "packages_selected": "{count}/{max} packages selected.", + "add_hint": "Add at least 2 packages to compare." + }, + "no_dependency": { + "label": "(No dependency)", + "typeahead_title": "What Would James Do?", + "typeahead_description": "Compare against not using a dependency! e18e approved.", + "tooltip_title": "You might not need a dependency", + "tooltip_description": "Compare against not using a dependency! The {link} maintains a list of packages that can be replaced with native APIs or simpler alternatives.", + "e18e_community": "e18e community", + "add_column": "Add no dependency column to comparison" + }, + "facets": { + "group_label": "Comparison facets", + "all": "all", + "none": "none", + "coming_soon": "Coming soon", + "select_all": "Select all facets", + "deselect_all": "Deselect all facets", + "select_category": "Select all {category} facets", + "deselect_category": "Deselect all {category} facets", + "binary_only_tooltip": "This package exposes binaries and no exports", + "categories": { + "performance": "Performance", + "health": "Health", + "compatibility": "Compatibility", + "security": "Security & Compliance" + }, + "items": { + "packageSize": { + "label": "Package Size", + "description": "Size of the package itself (unpacked)" + }, + "installSize": { + "label": "Install Size", + "description": "Total install size including all dependencies" + }, + "dependencies": { + "label": "Direct Deps", + "description": "Number of direct dependencies" + }, + "totalDependencies": { + "label": "Total Deps", + "description": "Total number of dependencies including transitive" + }, + "downloads": { + "label": "Downloads/wk", + "description": "Weekly download count" + }, + "totalLikes": { + "label": "Likes", + "description": "Number of likes" + }, + "lastUpdated": { + "label": "Published", + "description": "When this version was published" + }, + "deprecated": { + "label": "Deprecated?", + "description": "Whether the package is deprecated" + }, + "engines": { + "label": "Engines", + "description": "Node.js version requirements" + }, + "types": { + "label": "Types", + "description": "TypeScript type definitions" + }, + "moduleFormat": { + "label": "Module Format", + "description": "ESM/CJS support" + }, + "license": { + "label": "License", + "description": "Package license" + }, + "vulnerabilities": { + "label": "Vulnerabilities", + "description": "Known security vulnerabilities" + } + }, + "values": { + "any": "Any", + "none": "None", + "unknown": "Unknown", + "deprecated": "Deprecated", + "not_deprecated": "No", + "types_included": "Included", + "types_none": "None", + "vulnerabilities_summary": "{count} ({critical}C/{high}H)", + "up_to_you": "Up to you!" + }, + "trends": { + "title": "Compare Trends" + } + }, + "file_changes": "File Changes", + "files_count": "{count} file | {count} files", + "lines_hidden": "{count} line hidden | {count} lines hidden", + "file_too_large": "File too large to compare", + "file_size_warning": "{size} exceeds the 250KB limit for comparison", + "compare_versions": "diff", + "compare_versions_title": "Compare with latest version", + "version_selector_title": "Compare with version", + "summary": "Summary", + "deps_count": "{count} dep | {count} deps", + "dependencies": "Dependencies", + "dev_dependencies": "Dev Dependencies", + "peer_dependencies": "Peer Dependencies", + "optional_dependencies": "Optional Dependencies", + "no_dependency_changes": "No dependency changes", + "file_filter_option": { + "all": "All ({count})", + "added": "Added ({count})", + "removed": "Removed ({count})", + "modified": "Modified ({count})" + }, + "search_files_placeholder": "Search files...", + "no_files_all": "No files", + "no_files_search": "No files matching \"{query}\"", + "no_files_filtered": "No {filter} files", + "filter": { + "added": "added", + "removed": "removed", + "modified": "modified" + }, + "files_button": "Files", + "select_file_prompt": "Select a file from the sidebar to view its diff", + "close_files_panel": "Close files panel", + "filter_files_label": "Filter files by change type" + } +} diff --git a/i18n/locales/compare/es-419.json b/i18n/locales/compare/es-419.json new file mode 100644 index 0000000000..3095471bc1 --- /dev/null +++ b/i18n/locales/compare/es-419.json @@ -0,0 +1,14 @@ +{ + "compare": { + "no_dependency": { + "typeahead_description": "¡Compara contra no usar una dependencia! Aprobado por e18e.", + "tooltip_description": "¡Compara contra no usar una dependencia! La {link} mantiene una lista de paquetes que pueden ser reemplazados con APIs nativas o alternativas más simples." + }, + "file_filter_option": { + "added": "Agregados ({count})" + }, + "filter": { + "added": "agregado" + } + } +} diff --git a/i18n/locales/compare/es.json b/i18n/locales/compare/es.json new file mode 100644 index 0000000000..49926ce774 --- /dev/null +++ b/i18n/locales/compare/es.json @@ -0,0 +1,155 @@ +{ + "compare": { + "packages": { + "title": "comparar paquetes", + "tagline": "compara paquetes npm lado a lado para ayudarte a elegir el correcto.", + "meta_title": "Comparar {packages} - npmx", + "meta_title_empty": "Comparar Paquetes - npmx", + "meta_description": "Comparación lado a lado de {packages}", + "meta_description_empty": "Compara paquetes npm lado a lado", + "section_packages": "Paquetes", + "section_facets": "Facetas", + "section_comparison": "Comparación", + "copy_as_markdown": "Copiar tabla", + "loading": "Cargando datos del paquete...", + "error": "Error al cargar datos del paquete. Por favor, inténtalo de nuevo.", + "empty_title": "Selecciona paquetes para comparar", + "empty_description": "Busca y añade al menos 2 paquetes arriba para ver una comparación lado a lado de sus métricas." + }, + "selector": { + "search_label": "Buscar paquetes", + "search_first": "Buscar un paquete...", + "search_add": "Añadir otro paquete...", + "searching": "Buscando...", + "remove_package": "Eliminar {package}", + "packages_selected": "{count}/{max} paquetes seleccionados.", + "add_hint": "Añade al menos 2 paquetes para comparar." + }, + "no_dependency": { + "label": "(Sin dependencia)", + "typeahead_title": "¿Qué haría James?", + "typeahead_description": "¡Compara contra no usar una dependencia! Aprobado por e18e.", + "tooltip_title": "Quizás no necesites una dependencia", + "tooltip_description": "¡Compara contra no usar una dependencia! La {link} mantiene una lista de paquetes que pueden ser reemplazados con APIs nativas o alternativas más simples.", + "e18e_community": "comunidad e18e", + "add_column": "Añadir columna sin dependencia a la comparación" + }, + "facets": { + "group_label": "Facetas de comparación", + "all": "todas", + "none": "ninguna", + "coming_soon": "Próximamente", + "select_all": "Seleccionar todas las facetas", + "deselect_all": "Deseleccionar todas las facetas", + "select_category": "Seleccionar todas las facetas de {category}", + "deselect_category": "Deseleccionar todas las facetas de {category}", + "binary_only_tooltip": "Este paquete expone binarios y no exportaciones", + "categories": { + "performance": "Rendimiento", + "health": "Salud", + "compatibility": "Compatibilidad", + "security": "Seguridad y Cumplimiento" + }, + "items": { + "packageSize": { + "label": "Tamaño del Paquete", + "description": "Tamaño del paquete en sí (desempaquetado)" + }, + "installSize": { + "label": "Tamaño de Instalación", + "description": "Tamaño total de instalación incluyendo todas las dependencias" + }, + "dependencies": { + "label": "Dependencias Directas", + "description": "Número de dependencias directas" + }, + "totalDependencies": { + "label": "Dependencias Totales", + "description": "Número total de dependencias incluyendo transitivas" + }, + "downloads": { + "label": "Descargas/sem", + "description": "Recuento de descargas semanales" + }, + "totalLikes": { + "label": "Me gusta", + "description": "Número de me gusta" + }, + "lastUpdated": { + "label": "Publicado", + "description": "Cuándo se publicó esta versión" + }, + "deprecated": { + "label": "¿Obsoleto?", + "description": "Si el paquete está obsoleto" + }, + "engines": { + "label": "Motores", + "description": "Requisitos de versión de Node.js" + }, + "types": { + "label": "Tipos", + "description": "Definiciones de tipos TypeScript" + }, + "moduleFormat": { + "label": "Formato de Módulo", + "description": "Soporte ESM/CJS" + }, + "license": { + "label": "Licencia", + "description": "Licencia del paquete" + }, + "vulnerabilities": { + "label": "Vulnerabilidades", + "description": "Vulnerabilidades de seguridad conocidas" + } + }, + "values": { + "any": "Cualquiera", + "none": "Ninguna", + "unknown": "Desconocido", + "deprecated": "Obsoleto", + "not_deprecated": "No", + "types_included": "Incluido", + "types_none": "Ninguno", + "vulnerabilities_summary": "{count} ({critical}C/{high}H)", + "up_to_you": "¡Depende de ti!" + }, + "trends": { + "title": "Comparar tendencias" + } + }, + "file_changes": "Cambios en archivos", + "files_count": "{count} archivos", + "lines_hidden": "{count} líneas ocultas", + "file_too_large": "Archivo demasiado grande para comparar", + "file_size_warning": "{size} excede el límite de 250KB para la comparación", + "compare_versions": "diferencia", + "summary": "Resumen", + "deps_count": "{count} dependencias", + "dependencies": "Dependencias", + "dev_dependencies": "Dependencias de desarrollo", + "peer_dependencies": "Dependencias de pares", + "optional_dependencies": "Dependencias opcionales", + "no_dependency_changes": "Sin cambios en las dependencias", + "file_filter_option": { + "all": "Todos ({count})", + "added": "Añadidos ({count})", + "removed": "Eliminados ({count})", + "modified": "Modificados ({count})" + }, + "search_files_placeholder": "Buscar archivos...", + "no_files_all": "No hay archivos", + "no_files_search": "No hay archivos que coincidan con \"{query}\"", + "no_files_filtered": "No hay archivos {filter}", + "filter": { + "added": "añadido", + "removed": "eliminado", + "modified": "modificado" + }, + "files_button": "Archivos", + "select_file_prompt": "Selecciona un archivo de la barra lateral para ver sus diferencias", + "close_files_panel": "Cerrar panel de archivos", + "filter_files_label": "Filtrar archivos por tipo de cambio" + } +} diff --git a/i18n/locales/en-GB.json b/i18n/locales/en-GB.json index cd250a7f15..03223629e0 100644 --- a/i18n/locales/en-GB.json +++ b/i18n/locales/en-GB.json @@ -35,11 +35,6 @@ "scope_warning_text": "Unscoped package names are a shared resource. Only claim a name if you intend to publish and maintain a package. For personal or organisational projects, use a scoped name like {'@'}{username}/{name}." } }, - "about": { - "what_we_are": { - "admin_description": "We also aim to provide a better {adminUi} for managing your packages, teams, and organisations — all from the browser, powered by your local npm CLI." - } - }, "header": { "orgs_dropdown": { "error": "Failed to load organisations", diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 1734b74958..d2335f5746 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -917,78 +917,6 @@ "no_packages": "No packages found" } }, - "about": { - "title": "About", - "heading": "about", - "meta_description": "npmx is a fast, modern browser for the npm registry. A better UX/DX for exploring npm packages.", - "what_we_are": { - "title": "What we are", - "better_ux_dx": "better UX/DX", - "admin_ui": "admin UI", - "description": "npmx is a {betterUxDx} for the npm package registry and tooling. We provide a fast, modern interface for exploring packages, with features like dark mode, keyboard navigation, code browsing, and connections to alternative registries like {jsr}.", - "admin_description": "We also aim to provide a better {adminUi} for managing your packages, teams, and organizations — all from the browser, powered by your local npm CLI." - }, - "what_we_are_not": { - "title": "What we're not", - "not_package_manager": "Not a package manager.", - "not_registry": "Not a registry.", - "registry_description": "We don't host packages. We're just a better way to browse them.", - "package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.", - "words": { - "already": "There are", - "people": "already", - "building": "people", - "really": "building", - "cool": "really", - "package": "cool", - "managers": "package managers" - } - }, - "sponsors": { - "title": "Sponsors" - }, - "oss_partners": { - "title": "OSS Partners" - }, - "team": { - "title": "Team", - "governance": "Governance", - "role_steward": "steward", - "role_maintainer": "maintainer", - "sponsor": "sponsor", - "sponsor_aria": "Sponsor {name} on GitHub" - }, - "contributors": { - "title": "... and {count} more contributor | ... and {count} more contributors", - "description": "npmx is fully open source, built by an amazing community of contributors. Join us and let's build the npm browsing experience we always wanted, together.", - "loading": "Loading contributors...", - "error": "Failed to load contributors", - "view_profile": "View {name}'s GitHub profile" - }, - "get_involved": { - "title": "Get involved", - "contribute": { - "title": "Contribute", - "description": "Help us build a better npm experience.", - "cta": "View on GitHub" - }, - "community": { - "title": "Join the community", - "description": "Chat, ask questions, and share ideas.", - "cta": "Join Discord" - }, - "builders": { - "title": "Help build npmx", - "description": "Join the builders shaping the future of npmx.", - "cta": "Join Builders Discord" - }, - "follow": { - "title": "Stay updated", - "description": "Find out the latest on npmx.", - "cta": "Follow on Bluesky" - } - } - }, "account_menu": { "connect": "connect", "account": "Account", @@ -1036,334 +964,5 @@ "empty": "No organizations found", "view_all": "View all" } - }, - "compare": { - "packages": { - "title": "compare packages", - "tagline": "compare npm packages side-by-side to help you choose the right one.", - "meta_title": "Compare {packages} - npmx", - "meta_title_empty": "Compare Packages - npmx", - "meta_description": "Side-by-side comparison of {packages}", - "meta_description_empty": "Compare npm packages side-by-side", - "section_packages": "Packages", - "section_facets": "Facets", - "section_comparison": "Comparison", - "copy_as_markdown": "Copy table", - "loading": "Loading package data...", - "error": "Failed to load package data. Please try again.", - "empty_title": "Select packages to compare", - "empty_description": "Search and add at least 2 packages above to see a side-by-side comparison of their metrics.", - "table_view": "Table", - "charts_view": "Charts" - }, - "selector": { - "search_label": "Search for packages", - "search_first": "Search for a package...", - "search_add": "Add another package...", - "searching": "Searching...", - "remove_package": "Remove {package}", - "packages_selected": "{count}/{max} packages selected.", - "add_hint": "Add at least 2 packages to compare." - }, - "no_dependency": { - "label": "(No dependency)", - "typeahead_title": "What Would James Do?", - "typeahead_description": "Compare against not using a dependency! e18e approved.", - "tooltip_title": "You might not need a dependency", - "tooltip_description": "Compare against not using a dependency! The {link} maintains a list of packages that can be replaced with native APIs or simpler alternatives.", - "e18e_community": "e18e community", - "add_column": "Add no dependency column to comparison" - }, - "facets": { - "group_label": "Comparison facets", - "all": "all", - "none": "none", - "coming_soon": "Coming soon", - "select_all": "Select all facets", - "deselect_all": "Deselect all facets", - "select_category": "Select all {category} facets", - "deselect_category": "Deselect all {category} facets", - "binary_only_tooltip": "This package exposes binaries and no exports", - "categories": { - "performance": "Performance", - "health": "Health", - "compatibility": "Compatibility", - "security": "Security & Compliance" - }, - "items": { - "packageSize": { - "label": "Package Size", - "description": "Size of the package itself (unpacked)" - }, - "installSize": { - "label": "Install Size", - "description": "Total install size including all dependencies" - }, - "dependencies": { - "label": "Direct Deps", - "description": "Number of direct dependencies" - }, - "totalDependencies": { - "label": "Total Deps", - "description": "Total number of dependencies including transitive" - }, - "downloads": { - "label": "Downloads/wk", - "description": "Weekly download count" - }, - "totalLikes": { - "label": "Likes", - "description": "Number of likes" - }, - "lastUpdated": { - "label": "Published", - "description": "When this version was published" - }, - "deprecated": { - "label": "Deprecated?", - "description": "Whether the package is deprecated" - }, - "engines": { - "label": "Engines", - "description": "Node.js version requirements" - }, - "types": { - "label": "Types", - "description": "TypeScript type definitions" - }, - "moduleFormat": { - "label": "Module Format", - "description": "ESM/CJS support" - }, - "license": { - "label": "License", - "description": "Package license" - }, - "vulnerabilities": { - "label": "Vulnerabilities", - "description": "Known security vulnerabilities" - } - }, - "values": { - "any": "Any", - "none": "None", - "unknown": "Unknown", - "deprecated": "Deprecated", - "not_deprecated": "No", - "types_included": "Included", - "types_none": "None", - "vulnerabilities_summary": "{count} ({critical}C/{high}H)", - "up_to_you": "Up to you!" - }, - "trends": { - "title": "Compare Trends" - } - }, - "file_changes": "File Changes", - "files_count": "{count} file | {count} files", - "lines_hidden": "{count} line hidden | {count} lines hidden", - "file_too_large": "File too large to compare", - "file_size_warning": "{size} exceeds the 250KB limit for comparison", - "compare_versions": "diff", - "compare_versions_title": "Compare with latest version", - "version_selector_title": "Compare with version", - "summary": "Summary", - "deps_count": "{count} dep | {count} deps", - "dependencies": "Dependencies", - "dev_dependencies": "Dev Dependencies", - "peer_dependencies": "Peer Dependencies", - "optional_dependencies": "Optional Dependencies", - "no_dependency_changes": "No dependency changes", - "file_filter_option": { - "all": "All ({count})", - "added": "Added ({count})", - "removed": "Removed ({count})", - "modified": "Modified ({count})" - }, - "search_files_placeholder": "Search files...", - "no_files_all": "No files", - "no_files_search": "No files matching \"{query}\"", - "no_files_filtered": "No {filter} files", - "filter": { - "added": "added", - "removed": "removed", - "modified": "modified" - }, - "files_button": "Files", - "select_file_prompt": "Select a file from the sidebar to view its diff", - "close_files_panel": "Close files panel", - "filter_files_label": "Filter files by change type" - }, - "pds": { - "title": "npmx.social", - "meta_description": "The official AT Protocol Personal Data Server (PDS) for the npmx community.", - "join": { - "title": "Join the Community", - "description": "Whether you are creating your first account on the atmosphere or migrating an existing one, you belong here. You can migrate your current account without losing your handle, your posts, or your followers.", - "migrate": "Migrate with PDS MOOver" - }, - "server": { - "title": "Server Details", - "location_label": "Location:", - "location_value": "Nuremberg, Germany", - "infrastructure_label": "Infrastructure:", - "infrastructure_value": "Hosted on Hetzner", - "privacy_label": "Privacy:", - "privacy_value": "Subject to strict EU Data Protection laws", - "learn_more": "Learn how npmx uses the Atmosphere" - }, - "community": { - "title": "Who is here", - "description": "Some of the {count} accounts that are already calling npmx.social home:", - "loading": "Loading PDS community...", - "error": "Failed to load PDS community.", - "empty": "No community members to display.", - "view_profile": "View {handle}'s profile", - "new_accounts": "...plus {count} more that are new to the atmosphere" - } - }, - "privacy_policy": { - "title": "privacy policy", - "last_updated": "Last updated: {date}", - "welcome": "Welcome to {app}. We are committed to protecting your privacy. This policy explains what data we collect, how we use it, and your rights regarding your information.", - "cookies": { - "what_are": { - "title": "What are cookies?", - "p1": "Cookies are small text files stored on your device when you visit a website. Their purpose is to enhance your browsing experience by remembering certain preferences and settings." - }, - "types": { - "title": "What cookies do we use?", - "p1": "We only use {bold} for purposes strictly necessary for the site's functionality. We do not use third-party or advertising cookies.", - "bold": "essential technical cookies", - "li1": "{li11}{separator} {li12}", - "li2": "{li21}{separator} {li22}", - "separator": ":", - "cookie_vdpl": "__vdpl", - "cookie_vdpl_desc": "This cookie is used by our hosting provider (Vercel) for skew protection. It ensures you fetch assets from the correct deployment version if a new update is released while you are browsing. It does not track you.", - "cookie_h3": "h3", - "cookie_h3_desc": "This is our secure session cookie. It stores the OAuth access token when you connect your Atmosphere account. It is essential for maintaining your authenticated session." - }, - "local_storage": { - "title": "Local storage", - "p1": "In addition to session cookies, we use your browser's {bold} to save your display preferences. This allows us to remember the theme (light/dark) and some other {settings} you have selected, so you don't have to reconfigure them on each visit.", - "bold": "Local Storage", - "p2": "This information is purely functional, stored only on your device, and {bold2}. We use it exclusively to improve your experience on our website.", - "bold2": "contains no personal data nor is it used to track you", - "settings": "settings" - }, - "management": { - "title": "Managing cookies", - "p1": "You can configure your browser to accept, reject, or delete cookies according to your preferences. However, please note that {bold}.", - "bold": "rejecting essential cookies may prevent full access to the application", - "p2": "Below are links with instructions for cookie management in the most commonly used browsers:", - "chrome": "Google Chrome (opens in a new window)", - "firefox": "Mozilla Firefox (opens in a new window)", - "edge": "Microsoft Edge (opens in a new window)" - } - }, - "analytics": { - "title": "Analytics", - "p1": "We use {bold} to understand how visitors use our website. This helps us improve the user experience and identify issues.", - "bold": "Vercel Web Analytics", - "p2": "Vercel Analytics is designed with privacy in mind:", - "li1": "It does not use cookies", - "li2": "It does not collect personal identifiers", - "li3": "It does not track users across websites", - "li4": "All data is aggregated and anonymised", - "p3": "The only information collected includes: page URLs, referrer, country/region, device type, browser, and operating system. This data cannot be used to identify individual users." - }, - "authenticated": { - "title": "Authenticated users", - "p1": "When you connect your {bold} account to npmx, we store your OAuth access token in a secure, HTTP-only session cookie. This token is used solely to authenticate requests on your behalf.", - "bold": "Atmosphere", - "p2": "We do not store your credentials, and we do not access any data beyond what is necessary to provide the features you use. You can disconnect your account at any time from the {settings} page.", - "settings": "settings" - }, - "data_retention": { - "title": "Data retention", - "p1": "Session cookies are automatically deleted when you close your browser or after a period of inactivity. Local storage preferences remain on your device until you clear your browser data. Analytics data is retained in aggregate form and cannot be linked to individual users." - }, - "your_rights": { - "title": "Your rights", - "p1": "You have the right to:", - "li1": "Access information about what data we collect", - "li2": "Clear your local storage and cookies at any time", - "li3": "Disconnect your authenticated session", - "li4": "Request information about our data practices", - "p2": "Since we do not collect personal data, there is typically no personal information to delete or export." - }, - "contact": { - "title": "Contact us", - "p1": "For any questions or concerns about this privacy policy, you can contact us by opening an issue on our {link}.", - "link": "GitHub repository" - }, - "changes": { - "title": "Changes to this policy", - "p1": "We may update this privacy policy from time to time. Any changes will be published on this page with an updated revision date." - } - }, - "a11y": { - "title": "accessibility", - "footer_title": "a11y", - "welcome": "We want {app} to be usable by as many people as possible.", - "approach": { - "title": "Our approach", - "p1": "We try to follow the Web Content Accessibility Guidelines (WCAG) 2.2 and use them as a reference when building features. We don't claim full conformance with any level of WCAG — accessibility is a continual process and there is always more work to do.", - "p2": "This site is an {about}. Accessibility improvements are made incrementally as part of our regular development.", - "about_link": "open-source, community-driven project" - }, - "measures": { - "title": "What we do", - "p1": "Some of the things we aim to do across the site:", - "li1": "Use semantic HTML and ARIA attributes where appropriate.", - "li2": "Use relative text sizes so you can adjust them in your browser.", - "li3": "Support keyboard navigation throughout the interface.", - "li4": "Respect the prefers-reduced-motion and prefers-color-scheme media queries.", - "li5": "Design with sufficient color contrast in mind.", - "li6": "Ensure essential content is available without JavaScript, though some interactive features require it." - }, - "limitations": { - "title": "Known limitations", - "p1": "Some parts of the site — particularly third-party content like package READMEs — may not meet accessibility standards. We are working to improve these areas over time." - }, - "contact": { - "title": "Feedback", - "p1": "If you encounter an accessibility barrier on {app}, please let us know by opening an issue on our {link}. We take these reports seriously and will do our best to address them.", - "link": "GitHub repository" - } - }, - "vacations": { - "title": "on vacation", - "meta_description": "The npmx team was recharging. Discord reopened after a week.", - "heading": "recharging", - "subtitle": "we were building npmx at a pace that was costing {some} of us sleep. we didn't want that to be the norm! so we took a week off. together.", - "illustration_alt": "a single row of cosy icons", - "poke_log": "Poke the campfire", - "what": { - "title": "what happened", - "p1": "discord was closed {dates}.", - "dates": "February 14 – 21", - "p2": "all invite links were gone and channels were locked – except {garden}, which stayed open for folks who wanted to keep hanging out.", - "garden": "#garden" - }, - "meantime": { - "title": "in the meantime", - "p1": "{site} and {repo} stayed open – people still dug in, filed some issues, opened a few PRs, but mainly everyone spent time somewhere near a cosy fireplace.", - "repo_link": "the repo" - }, - "return": { - "title": "we came back!", - "p1": "we came back recharged and ready for the final push to March 3rd. {social} for updates.", - "social_link": "follow us on Bluesky" - }, - "stats": { - "contributors": "Contributors", - "commits": "Commits", - "pr": "PRs Merged", - "subtitle": { - "some": "some", - "all": "all" - } - } } } diff --git a/i18n/locales/es-419.json b/i18n/locales/es-419.json index f2209e55d1..99b448b5b2 100644 --- a/i18n/locales/es-419.json +++ b/i18n/locales/es-419.json @@ -19,11 +19,6 @@ "run_hint": "Ejecuta el conector en tu computadora para habilitar funciones de administración." } }, - "about": { - "what_we_are": { - "admin_description": "También aspiramos a proporcionar una mejor {adminUi} para administrar tus paquetes, equipos y organizaciones — todo desde el navegador, impulsado por tu CLI de npm local." - } - }, "claim": { "modal": { "checking": "Verificando disponibilidad...", @@ -56,20 +51,5 @@ "compare": "Gráfica de líneas de comparación de descargas de paquetes para: {packages}." } } - }, - "compare": { - "no_dependency": { - "typeahead_description": "¡Compara contra no usar una dependencia! Aprobado por e18e.", - "tooltip_description": "¡Compara contra no usar una dependencia! La {link} mantiene una lista de paquetes que pueden ser reemplazados con APIs nativas o alternativas más simples." - }, - "file_filter_option": { - "added": "Agregados ({count})" - }, - "filter": { - "added": "agregado" - } - }, - "a11y": { - "welcome": "Queremos que {app} sea utilizable por la mayor cantidad de personas posible." } } diff --git a/i18n/locales/es.json b/i18n/locales/es.json index 248932ded5..0100b4dd40 100644 --- a/i18n/locales/es.json +++ b/i18n/locales/es.json @@ -859,74 +859,6 @@ "no_packages": "No se encontraron paquetes" } }, - "about": { - "title": "Acerca de", - "heading": "acerca de", - "meta_description": "npmx es un explorador rápido y moderno para el registro npm. Una mejor UX/DX para explorar paquetes npm.", - "what_we_are": { - "title": "Lo que somos", - "better_ux_dx": "mejor UX/DX", - "admin_ui": "UI de administración", - "description": "npmx es una {betterUxDx} para el registro de paquetes npm y herramientas. Proporcionamos una interfaz rápida y moderna para explorar paquetes, con características como modo oscuro, navegación por teclado, exploración de código y conexiones a registros alternativos como {jsr}.", - "admin_description": "También aspiramos a proporcionar una mejor {adminUi} para gestionar tus paquetes, equipos y organizaciones — todo desde el navegador, impulsado por tu CLI de npm local." - }, - "what_we_are_not": { - "title": "Lo que no somos", - "not_package_manager": "No es un gestor de paquetes.", - "not_registry": "No es un registro.", - "registry_description": "No alojamos paquetes. Solo somos una mejor manera de explorarlos.", - "package_managers_exist": "{already} {people} {building} {really} {cool} {package} {managers}.", - "words": { - "already": "Ya hay", - "people": "gente", - "building": "construyendo", - "really": "gestores de", - "cool": "paquetes", - "package": "realmente", - "managers": "geniales" - } - }, - "sponsors": { - "title": "Patrocinadores" - }, - "oss_partners": { - "title": "Socios de OSS" - }, - "team": { - "title": "Equipo", - "governance": "Gobernanza", - "role_steward": "Administrador", - "role_maintainer": "Mantenedor", - "sponsor": "Patrocinar", - "sponsor_aria": "Patrocinar a {name} en GitHub" - }, - "contributors": { - "title": "{count} Colaborador | {count} Colaboradores", - "description": "npmx es completamente de código abierto, construido por una increíble comunidad de colaboradores. Únete a nosotros y construyamos juntos la experiencia de navegación de npm que siempre quisimos.", - "loading": "Cargando colaboradores...", - "error": "Error al cargar colaboradores", - "view_profile": "Ver perfil de GitHub de {name}" - }, - "get_involved": { - "title": "Involúcrate", - "contribute": { - "title": "Contribuir", - "description": "Ayúdanos a construir una mejor experiencia npm.", - "cta": "Ver en GitHub" - }, - "community": { - "title": "Únete a la comunidad", - "description": "Chatea, haz preguntas y comparte ideas.", - "cta": "Únete a Discord" - }, - "builders": {}, - "follow": { - "title": "Mantente actualizado", - "description": "Entérate de lo último en npmx.", - "cta": "Síguenos en Bluesky" - } - } - }, "account_menu": { "connect": "conectar", "account": "Cuenta", @@ -974,273 +906,5 @@ "empty": "No se encontraron organizaciones", "view_all": "Ver todo" } - }, - "compare": { - "packages": { - "title": "comparar paquetes", - "tagline": "compara paquetes npm lado a lado para ayudarte a elegir el correcto.", - "meta_title": "Comparar {packages} - npmx", - "meta_title_empty": "Comparar Paquetes - npmx", - "meta_description": "Comparación lado a lado de {packages}", - "meta_description_empty": "Compara paquetes npm lado a lado", - "section_packages": "Paquetes", - "section_facets": "Facetas", - "section_comparison": "Comparación", - "copy_as_markdown": "Copiar tabla", - "loading": "Cargando datos del paquete...", - "error": "Error al cargar datos del paquete. Por favor, inténtalo de nuevo.", - "empty_title": "Selecciona paquetes para comparar", - "empty_description": "Busca y añade al menos 2 paquetes arriba para ver una comparación lado a lado de sus métricas." - }, - "selector": { - "search_label": "Buscar paquetes", - "search_first": "Buscar un paquete...", - "search_add": "Añadir otro paquete...", - "searching": "Buscando...", - "remove_package": "Eliminar {package}", - "packages_selected": "{count}/{max} paquetes seleccionados.", - "add_hint": "Añade al menos 2 paquetes para comparar." - }, - "no_dependency": { - "label": "(Sin dependencia)", - "typeahead_title": "¿Qué haría James?", - "typeahead_description": "¡Compara contra no usar una dependencia! Aprobado por e18e.", - "tooltip_title": "Quizás no necesites una dependencia", - "tooltip_description": "¡Compara contra no usar una dependencia! La {link} mantiene una lista de paquetes que pueden ser reemplazados con APIs nativas o alternativas más simples.", - "e18e_community": "comunidad e18e", - "add_column": "Añadir columna sin dependencia a la comparación" - }, - "facets": { - "group_label": "Facetas de comparación", - "all": "todas", - "none": "ninguna", - "coming_soon": "Próximamente", - "select_all": "Seleccionar todas las facetas", - "deselect_all": "Deseleccionar todas las facetas", - "select_category": "Seleccionar todas las facetas de {category}", - "deselect_category": "Deseleccionar todas las facetas de {category}", - "binary_only_tooltip": "Este paquete expone binarios y no exportaciones", - "categories": { - "performance": "Rendimiento", - "health": "Salud", - "compatibility": "Compatibilidad", - "security": "Seguridad y Cumplimiento" - }, - "items": { - "packageSize": { - "label": "Tamaño del Paquete", - "description": "Tamaño del paquete en sí (desempaquetado)" - }, - "installSize": { - "label": "Tamaño de Instalación", - "description": "Tamaño total de instalación incluyendo todas las dependencias" - }, - "dependencies": { - "label": "Dependencias Directas", - "description": "Número de dependencias directas" - }, - "totalDependencies": { - "label": "Dependencias Totales", - "description": "Número total de dependencias incluyendo transitivas" - }, - "downloads": { - "label": "Descargas/sem", - "description": "Recuento de descargas semanales" - }, - "totalLikes": { - "label": "Me gusta", - "description": "Número de me gusta" - }, - "lastUpdated": { - "label": "Publicado", - "description": "Cuándo se publicó esta versión" - }, - "deprecated": { - "label": "¿Obsoleto?", - "description": "Si el paquete está obsoleto" - }, - "engines": { - "label": "Motores", - "description": "Requisitos de versión de Node.js" - }, - "types": { - "label": "Tipos", - "description": "Definiciones de tipos TypeScript" - }, - "moduleFormat": { - "label": "Formato de Módulo", - "description": "Soporte ESM/CJS" - }, - "license": { - "label": "Licencia", - "description": "Licencia del paquete" - }, - "vulnerabilities": { - "label": "Vulnerabilidades", - "description": "Vulnerabilidades de seguridad conocidas" - } - }, - "values": { - "any": "Cualquiera", - "none": "Ninguna", - "unknown": "Desconocido", - "deprecated": "Obsoleto", - "not_deprecated": "No", - "types_included": "Incluido", - "types_none": "Ninguno", - "vulnerabilities_summary": "{count} ({critical}C/{high}H)", - "up_to_you": "¡Depende de ti!" - }, - "trends": { - "title": "Comparar tendencias" - } - }, - "file_changes": "Cambios en archivos", - "files_count": "{count} archivos", - "lines_hidden": "{count} líneas ocultas", - "file_too_large": "Archivo demasiado grande para comparar", - "file_size_warning": "{size} excede el límite de 250KB para la comparación", - "compare_versions": "diferencia", - "summary": "Resumen", - "deps_count": "{count} dependencias", - "dependencies": "Dependencias", - "dev_dependencies": "Dependencias de desarrollo", - "peer_dependencies": "Dependencias de pares", - "optional_dependencies": "Dependencias opcionales", - "no_dependency_changes": "Sin cambios en las dependencias", - "file_filter_option": { - "all": "Todos ({count})", - "added": "Añadidos ({count})", - "removed": "Eliminados ({count})", - "modified": "Modificados ({count})" - }, - "search_files_placeholder": "Buscar archivos...", - "no_files_all": "No hay archivos", - "no_files_search": "No hay archivos que coincidan con \"{query}\"", - "no_files_filtered": "No hay archivos {filter}", - "filter": { - "added": "añadido", - "removed": "eliminado", - "modified": "modificado" - }, - "files_button": "Archivos", - "select_file_prompt": "Selecciona un archivo de la barra lateral para ver sus diferencias", - "close_files_panel": "Cerrar panel de archivos", - "filter_files_label": "Filtrar archivos por tipo de cambio" - }, - "pds": { - "join": {}, - "server": {}, - "community": {} - }, - "privacy_policy": { - "title": "política de privacidad", - "last_updated": "Última actualización: {date}", - "welcome": "Bienvenido a {app}. Estamos comprometidos con la protección de tu privacidad. Esta política explica qué datos recopilamos, cómo los usamos y tus derechos con respecto a tu información.", - "cookies": { - "what_are": { - "title": "¿Qué son las cookies?", - "p1": "Las cookies son pequeños archivos de texto que se almacenan en tu dispositivo cuando visitas un sitio web. Su propósito es mejorar tu experiencia de navegación recordando ciertas preferencias y configuraciones." - }, - "types": { - "title": "¿Qué cookies utilizamos?", - "p1": "Solo utilizamos {bold} para fines estrictamente necesarios para el funcionamiento del sitio. No utilizamos cookies de terceros ni publicitarias.", - "bold": "cookies técnicas esenciales", - "li1": "{li11}{separator} {li12}", - "li2": "{li21}{separator} {li22}", - "separator": ":", - "cookie_vdpl": "__vdpl", - "cookie_vdpl_desc": "Esta cookie es utilizada por nuestro proveedor de alojamiento (Vercel) para la protección contra sesgos (skew protection). Asegura que obtengas los recursos de la versión de despliegue correcta si se lanza una nueva actualización mientras navegas. No te rastrea.", - "cookie_h3": "h3", - "cookie_h3_desc": "Esta es nuestra cookie de sesión segura. Almacena el token de acceso OAuth cuando conectas tu cuenta de Atmosphere. Es esencial para mantener tu sesión autenticada." - }, - "local_storage": { - "title": "Almacenamiento local", - "p1": "Además de las cookies de sesión, utilizamos el {bold} de tu navegador para guardar tus preferencias de visualización. Esto nos permite recordar el tema (claro/oscuro) y algunos otros {settings} que hayas seleccionado, para que no tengas que reconfigurarlos en cada visita.", - "bold": "Almacenamiento Local (Local Storage)", - "p2": "Esta información es puramente funcional, se almacena solo en tu dispositivo y {bold2}. La utilizamos exclusivamente para mejorar tu experiencia en nuestro sitio web.", - "bold2": "no contiene datos personales ni se utiliza para rastrearte", - "settings": "ajustes" - }, - "management": { - "title": "Gestión de cookies", - "p1": "Puedes configurar tu navegador para aceptar, rechazar o eliminar cookies según tus preferencias. Sin embargo, ten en cuenta que {bold}.", - "bold": "rechazar cookies esenciales puede impedir el acceso completo a la aplicación", - "p2": "A continuación se muestran enlaces con instrucciones para la gestión de cookies en los navegadores más utilizados:", - "chrome": "Google Chrome (se abre en una nueva ventana)", - "firefox": "Mozilla Firefox (se abre en una nueva ventana)", - "edge": "Microsoft Edge (se abre en una nueva ventana)" - } - }, - "analytics": { - "title": "Analítica", - "p1": "Utilizamos {bold} para entender cómo los visitantes usan nuestro sitio web. Esto nos ayuda a mejorar la experiencia del usuario e identificar problemas.", - "bold": "Vercel Web Analytics", - "p2": "Vercel Analytics está diseñado teniendo en cuenta la privacidad:", - "li1": "No utiliza cookies", - "li2": "No recopila identificadores personales", - "li3": "No rastrea a los usuarios a través de sitios web", - "li4": "Todos los datos son agregados y anonimizados", - "p3": "La única información recopilada incluye: URLs de páginas, referente, país/región, tipo de dispositivo, navegador y sistema operativo. Estos datos no pueden utilizarse para identificar a usuarios individuales." - }, - "authenticated": { - "title": "Usuarios autenticados", - "p1": "Cuando conectas tu cuenta de {bold} a npmx, almacenamos tu token de acceso OAuth en una cookie de sesión segura y solo HTTP. Este token se utiliza únicamente para autenticar solicitudes en tu nombre.", - "bold": "Atmosphere", - "p2": "No almacenamos tus credenciales y no accedemos a ningún dato más allá de lo necesario para proporcionar las funciones que utilizas. Puedes desconectar tu cuenta en cualquier momento desde la página de {settings}.", - "settings": "ajustes" - }, - "data_retention": { - "title": "Retención de datos", - "p1": "Las cookies de sesión se eliminan automáticamente cuando cierras tu navegador o después de un período de inactividad. Las preferencias de almacenamiento local permanecen en tu dispositivo hasta que borres los datos de tu navegador. Los datos analíticos se conservan de forma agregada y no pueden vincularse a usuarios individuales." - }, - "your_rights": { - "title": "Tus derechos", - "p1": "Tienes derecho a:", - "li1": "Acceder a la información sobre qué datos recopilamos", - "li2": "Borrar tu almacenamiento local y cookies en cualquier momento", - "li3": "Desconectar tu sesión autenticada", - "li4": "Solicitar información sobre nuestras prácticas de datos", - "p2": "Dado que no recopilamos datos personales, normalmente no hay información personal que eliminar o exportar." - }, - "contact": { - "title": "Contáctanos", - "p1": "Para cualquier pregunta o inquietud sobre esta política de privacidad, puedes contactarnos abriendo un problema (issue) en nuestro {link}.", - "link": "repositorio de GitHub" - }, - "changes": { - "title": "Cambios en esta política", - "p1": "Podemos actualizar esta política de privacidad ocasionalmente. Cualquier cambio se publicará en esta página con una fecha de revisión actualizada." - } - }, - "a11y": { - "title": "accesibilidad", - "footer_title": "a11y", - "welcome": "Queremos que {app} sea utilizable por el mayor número de personas posible.", - "approach": { - "title": "Nuestro enfoque", - "p1": "Intentamos seguir las Pautas de Accesibilidad para el Contenido Web (WCAG) 2.2 y usarlas como referencia al desarrollar funcionalidades. No afirmamos cumplir totalmente con ningún nivel de WCAG; la accesibilidad es un proceso continuo y siempre hay más trabajo por hacer.", - "p2": "Este sitio es un {about}. Las mejoras de accesibilidad se realizan de forma incremental como parte de nuestro desarrollo habitual.", - "about_link": "proyecto de código abierto impulsado por la comunidad" - }, - "measures": { - "title": "Qué hacemos", - "p1": "Algunas de las cosas que intentamos hacer en todo el sitio web:", - "li1": "Usar HTML semántico y atributos ARIA cuando sea apropiado.", - "li2": "Usar tamaños de texto relativos para que puedas ajustarlos en tu navegador.", - "li3": "Soportar la navegación por teclado en toda la interfaz.", - "li4": "Respetar las preferencias de reducción de movimiento y esquema de color.", - "li5": "Diseñar teniendo en cuenta un contraste de color suficiente.", - "li6": "Asegurar que el contenido esencial esté disponible sin JavaScript, aunque algunas funciones interactivas lo requieran." - }, - "limitations": { - "title": "Limitaciones conocidas", - "p1": "Algunas partes del sitio, particularmente el contenido de terceros como los README de los paquetes, pueden no cumplir con los estándares de accesibilidad. Estamos trabajando para mejorar estas áreas con el tiempo." - }, - "contact": { - "title": "Comentarios", - "p1": "Si encuentras una barrera de accesibilidad en {app}, por favor háznoslo saber abriendo una incidencia en nuestro {link}. Nos tomamos estos informes muy en serio y haremos todo lo posible para abordarlos.", - "link": "repositorio de GitHub" - } } } diff --git a/i18n/locales/pds/en.json b/i18n/locales/pds/en.json new file mode 100644 index 0000000000..3d32e6d9de --- /dev/null +++ b/i18n/locales/pds/en.json @@ -0,0 +1,30 @@ +{ + "pds": { + "title": "npmx.social", + "meta_description": "The official AT Protocol Personal Data Server (PDS) for the npmx community.", + "join": { + "title": "Join the Community", + "description": "Whether you are creating your first account on the atmosphere or migrating an existing one, you belong here. You can migrate your current account without losing your handle, your posts, or your followers.", + "migrate": "Migrate with PDS MOOver" + }, + "server": { + "title": "Server Details", + "location_label": "Location:", + "location_value": "Nuremberg, Germany", + "infrastructure_label": "Infrastructure:", + "infrastructure_value": "Hosted on Hetzner", + "privacy_label": "Privacy:", + "privacy_value": "Subject to strict EU Data Protection laws", + "learn_more": "Learn how npmx uses the Atmosphere" + }, + "community": { + "title": "Who is here", + "description": "Some of the {count} accounts that are already calling npmx.social home:", + "loading": "Loading PDS community...", + "error": "Failed to load PDS community.", + "empty": "No community members to display.", + "view_profile": "View {handle}'s profile", + "new_accounts": "...plus {count} more that are new to the atmosphere" + } + } +} diff --git a/i18n/locales/pds/es-419.json b/i18n/locales/pds/es-419.json new file mode 100644 index 0000000000..dbf3dfed53 --- /dev/null +++ b/i18n/locales/pds/es-419.json @@ -0,0 +1,10 @@ +{ + "pds": { + "join": { + "description": "Ya sea que estés creando tu primera cuenta en la atmósfera o migrando una existente, tu lugar está aquí. Puedes migrar tu cuenta actual sin perder tu usuario, tus publicaciones o tus seguidores." + }, + "server": { + "learn_more": "Conoce cómo npmx usa la Atmósfera" + } + } +} diff --git a/i18n/locales/pds/es.json b/i18n/locales/pds/es.json new file mode 100644 index 0000000000..1a2bbfff6f --- /dev/null +++ b/i18n/locales/pds/es.json @@ -0,0 +1,30 @@ +{ + "pds": { + "title": "npmx.social", + "meta_description": "El Servidor de Datos Personales (PDS) oficial del Protocolo AT para la comunidad de npmx.", + "join": { + "title": "Únete a la comunidad", + "description": "Tanto si estás creando tu primera cuenta en la atmósfera como si estás migrando una existente, tu lugar está aquí. Puedes migrar tu cuenta actual sin perder tu usuario, tus publicaciones o tus seguidores.", + "migrate": "Migrar con PDS MOOver" + }, + "server": { + "title": "Detalles del servidor", + "location_label": "Ubicación:", + "location_value": "Núremberg, Alemania", + "infrastructure_label": "Infraestructura:", + "infrastructure_value": "Alojado en Hetzner", + "privacy_label": "Privacidad:", + "privacy_value": "Sujeto a las estrictas leyes de protección de datos de la UE", + "learn_more": "Descubre cómo npmx usa la Atmósfera" + }, + "community": { + "title": "Quién está aquí", + "description": "Algunas de las {count} cuentas que ya llaman hogar a npmx.social:", + "loading": "Cargando la comunidad del PDS...", + "error": "Error al cargar la comunidad del PDS.", + "empty": "No hay miembros de la comunidad para mostrar.", + "view_profile": "Ver perfil de {handle}", + "new_accounts": "...y {count} más que son nuevos en la atmósfera" + } + } +} diff --git a/i18n/locales/private_policy/en.json b/i18n/locales/private_policy/en.json new file mode 100644 index 0000000000..86b8c0d846 --- /dev/null +++ b/i18n/locales/private_policy/en.json @@ -0,0 +1,82 @@ +{ + "privacy_policy": { + "title": "privacy policy", + "last_updated": "Last updated: {date}", + "welcome": "Welcome to {app}. We are committed to protecting your privacy. This policy explains what data we collect, how we use it, and your rights regarding your information.", + "cookies": { + "what_are": { + "title": "What are cookies?", + "p1": "Cookies are small text files stored on your device when you visit a website. Their purpose is to enhance your browsing experience by remembering certain preferences and settings." + }, + "types": { + "title": "What cookies do we use?", + "p1": "We only use {bold} for purposes strictly necessary for the site's functionality. We do not use third-party or advertising cookies.", + "bold": "essential technical cookies", + "li1": "{li11}{separator} {li12}", + "li2": "{li21}{separator} {li22}", + "separator": ":", + "cookie_vdpl": "__vdpl", + "cookie_vdpl_desc": "This cookie is used by our hosting provider (Vercel) for skew protection. It ensures you fetch assets from the correct deployment version if a new update is released while you are browsing. It does not track you.", + "cookie_h3": "h3", + "cookie_h3_desc": "This is our secure session cookie. It stores the OAuth access token when you connect your Atmosphere account. It is essential for maintaining your authenticated session." + }, + "local_storage": { + "title": "Local storage", + "p1": "In addition to session cookies, we use your browser's {bold} to save your display preferences. This allows us to remember the theme (light/dark) and some other {settings} you have selected, so you don't have to reconfigure them on each visit.", + "bold": "Local Storage", + "p2": "This information is purely functional, stored only on your device, and {bold2}. We use it exclusively to improve your experience on our website.", + "bold2": "contains no personal data nor is it used to track you", + "settings": "settings" + }, + "management": { + "title": "Managing cookies", + "p1": "You can configure your browser to accept, reject, or delete cookies according to your preferences. However, please note that {bold}.", + "bold": "rejecting essential cookies may prevent full access to the application", + "p2": "Below are links with instructions for cookie management in the most commonly used browsers:", + "chrome": "Google Chrome (opens in a new window)", + "firefox": "Mozilla Firefox (opens in a new window)", + "edge": "Microsoft Edge (opens in a new window)" + } + }, + "analytics": { + "title": "Analytics", + "p1": "We use {bold} to understand how visitors use our website. This helps us improve the user experience and identify issues.", + "bold": "Vercel Web Analytics", + "p2": "Vercel Analytics is designed with privacy in mind:", + "li1": "It does not use cookies", + "li2": "It does not collect personal identifiers", + "li3": "It does not track users across websites", + "li4": "All data is aggregated and anonymised", + "p3": "The only information collected includes: page URLs, referrer, country/region, device type, browser, and operating system. This data cannot be used to identify individual users." + }, + "authenticated": { + "title": "Authenticated users", + "p1": "When you connect your {bold} account to npmx, we store your OAuth access token in a secure, HTTP-only session cookie. This token is used solely to authenticate requests on your behalf.", + "bold": "Atmosphere", + "p2": "We do not store your credentials, and we do not access any data beyond what is necessary to provide the features you use. You can disconnect your account at any time from the {settings} page.", + "settings": "settings" + }, + "data_retention": { + "title": "Data retention", + "p1": "Session cookies are automatically deleted when you close your browser or after a period of inactivity. Local storage preferences remain on your device until you clear your browser data. Analytics data is retained in aggregate form and cannot be linked to individual users." + }, + "your_rights": { + "title": "Your rights", + "p1": "You have the right to:", + "li1": "Access information about what data we collect", + "li2": "Clear your local storage and cookies at any time", + "li3": "Disconnect your authenticated session", + "li4": "Request information about our data practices", + "p2": "Since we do not collect personal data, there is typically no personal information to delete or export." + }, + "contact": { + "title": "Contact us", + "p1": "For any questions or concerns about this privacy policy, you can contact us by opening an issue on our {link}.", + "link": "GitHub repository" + }, + "changes": { + "title": "Changes to this policy", + "p1": "We may update this privacy policy from time to time. Any changes will be published on this page with an updated revision date." + } + } +} diff --git a/i18n/locales/private_policy/es.json b/i18n/locales/private_policy/es.json new file mode 100644 index 0000000000..c3fd18b1d0 --- /dev/null +++ b/i18n/locales/private_policy/es.json @@ -0,0 +1,82 @@ +{ + "privacy_policy": { + "title": "política de privacidad", + "last_updated": "Última actualización: {date}", + "welcome": "Bienvenido a {app}. Estamos comprometidos con la protección de tu privacidad. Esta política explica qué datos recopilamos, cómo los usamos y tus derechos con respecto a tu información.", + "cookies": { + "what_are": { + "title": "¿Qué son las cookies?", + "p1": "Las cookies son pequeños archivos de texto que se almacenan en tu dispositivo cuando visitas un sitio web. Su propósito es mejorar tu experiencia de navegación recordando ciertas preferencias y configuraciones." + }, + "types": { + "title": "¿Qué cookies utilizamos?", + "p1": "Solo utilizamos {bold} para fines estrictamente necesarios para el funcionamiento del sitio. No utilizamos cookies de terceros ni publicitarias.", + "bold": "cookies técnicas esenciales", + "li1": "{li11}{separator} {li12}", + "li2": "{li21}{separator} {li22}", + "separator": ":", + "cookie_vdpl": "__vdpl", + "cookie_vdpl_desc": "Esta cookie es utilizada por nuestro proveedor de alojamiento (Vercel) para la protección contra sesgos (skew protection). Asegura que obtengas los recursos de la versión de despliegue correcta si se lanza una nueva actualización mientras navegas. No te rastrea.", + "cookie_h3": "h3", + "cookie_h3_desc": "Esta es nuestra cookie de sesión segura. Almacena el token de acceso OAuth cuando conectas tu cuenta de Atmosphere. Es esencial para mantener tu sesión autenticada." + }, + "local_storage": { + "title": "Almacenamiento local", + "p1": "Además de las cookies de sesión, utilizamos el {bold} de tu navegador para guardar tus preferencias de visualización. Esto nos permite recordar el tema (claro/oscuro) y algunos otros {settings} que hayas seleccionado, para que no tengas que reconfigurarlos en cada visita.", + "bold": "Almacenamiento Local (Local Storage)", + "p2": "Esta información es puramente funcional, se almacena solo en tu dispositivo y {bold2}. La utilizamos exclusivamente para mejorar tu experiencia en nuestro sitio web.", + "bold2": "no contiene datos personales ni se utiliza para rastrearte", + "settings": "ajustes" + }, + "management": { + "title": "Gestión de cookies", + "p1": "Puedes configurar tu navegador para aceptar, rechazar o eliminar cookies según tus preferencias. Sin embargo, ten en cuenta que {bold}.", + "bold": "rechazar cookies esenciales puede impedir el acceso completo a la aplicación", + "p2": "A continuación se muestran enlaces con instrucciones para la gestión de cookies en los navegadores más utilizados:", + "chrome": "Google Chrome (se abre en una nueva ventana)", + "firefox": "Mozilla Firefox (se abre en una nueva ventana)", + "edge": "Microsoft Edge (se abre en una nueva ventana)" + } + }, + "analytics": { + "title": "Analítica", + "p1": "Utilizamos {bold} para entender cómo los visitantes usan nuestro sitio web. Esto nos ayuda a mejorar la experiencia del usuario e identificar problemas.", + "bold": "Vercel Web Analytics", + "p2": "Vercel Analytics está diseñado teniendo en cuenta la privacidad:", + "li1": "No utiliza cookies", + "li2": "No recopila identificadores personales", + "li3": "No rastrea a los usuarios a través de sitios web", + "li4": "Todos los datos son agregados y anonimizados", + "p3": "La única información recopilada incluye: URLs de páginas, referente, país/región, tipo de dispositivo, navegador y sistema operativo. Estos datos no pueden utilizarse para identificar a usuarios individuales." + }, + "authenticated": { + "title": "Usuarios autenticados", + "p1": "Cuando conectas tu cuenta de {bold} a npmx, almacenamos tu token de acceso OAuth en una cookie de sesión segura y solo HTTP. Este token se utiliza únicamente para autenticar solicitudes en tu nombre.", + "bold": "Atmosphere", + "p2": "No almacenamos tus credenciales y no accedemos a ningún dato más allá de lo necesario para proporcionar las funciones que utilizas. Puedes desconectar tu cuenta en cualquier momento desde la página de {settings}.", + "settings": "ajustes" + }, + "data_retention": { + "title": "Retención de datos", + "p1": "Las cookies de sesión se eliminan automáticamente cuando cierras tu navegador o después de un período de inactividad. Las preferencias de almacenamiento local permanecen en tu dispositivo hasta que borres los datos de tu navegador. Los datos analíticos se conservan de forma agregada y no pueden vincularse a usuarios individuales." + }, + "your_rights": { + "title": "Tus derechos", + "p1": "Tienes derecho a:", + "li1": "Acceder a la información sobre qué datos recopilamos", + "li2": "Borrar tu almacenamiento local y cookies en cualquier momento", + "li3": "Desconectar tu sesión autenticada", + "li4": "Solicitar información sobre nuestras prácticas de datos", + "p2": "Dado que no recopilamos datos personales, normalmente no hay información personal que eliminar o exportar." + }, + "contact": { + "title": "Contáctanos", + "p1": "Para cualquier pregunta o inquietud sobre esta política de privacidad, puedes contactarnos abriendo un problema (issue) en nuestro {link}.", + "link": "repositorio de GitHub" + }, + "changes": { + "title": "Cambios en esta política", + "p1": "Podemos actualizar esta política de privacidad ocasionalmente. Cualquier cambio se publicará en esta página con una fecha de revisión actualizada." + } + } +} diff --git a/i18n/locales/vacations/en.json b/i18n/locales/vacations/en.json new file mode 100644 index 0000000000..9e1de06117 --- /dev/null +++ b/i18n/locales/vacations/en.json @@ -0,0 +1,36 @@ +{ + "vacations": { + "title": "on vacation", + "meta_description": "The npmx team was recharging. Discord reopened after a week.", + "heading": "recharging", + "subtitle": "we were building npmx at a pace that was costing {some} of us sleep. we didn't want that to be the norm! so we took a week off. together.", + "illustration_alt": "a single row of cosy icons", + "poke_log": "Poke the campfire", + "what": { + "title": "what happened", + "p1": "discord was closed {dates}.", + "dates": "February 14 – 21", + "p2": "all invite links were gone and channels were locked – except {garden}, which stayed open for folks who wanted to keep hanging out.", + "garden": "#garden" + }, + "meantime": { + "title": "in the meantime", + "p1": "{site} and {repo} stayed open – people still dug in, filed some issues, opened a few PRs, but mainly everyone spent time somewhere near a cosy fireplace.", + "repo_link": "the repo" + }, + "return": { + "title": "we came back!", + "p1": "we came back recharged and ready for the final push to March 3rd. {social} for updates.", + "social_link": "follow us on Bluesky" + }, + "stats": { + "contributors": "Contributors", + "commits": "Commits", + "pr": "PRs Merged", + "subtitle": { + "some": "some", + "all": "all" + } + } + } +} diff --git a/i18n/schema.json b/i18n/schema.json index fb0cc69fb5..fefcf11110 100644 --- a/i18n/schema.json +++ b/i18n/schema.json @@ -2755,222 +2755,6 @@ }, "additionalProperties": false }, - "about": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "heading": { - "type": "string" - }, - "meta_description": { - "type": "string" - }, - "what_we_are": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "better_ux_dx": { - "type": "string" - }, - "admin_ui": { - "type": "string" - }, - "description": { - "type": "string" - }, - "admin_description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "what_we_are_not": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "not_package_manager": { - "type": "string" - }, - "not_registry": { - "type": "string" - }, - "registry_description": { - "type": "string" - }, - "package_managers_exist": { - "type": "string" - }, - "words": { - "type": "object", - "properties": { - "already": { - "type": "string" - }, - "people": { - "type": "string" - }, - "building": { - "type": "string" - }, - "really": { - "type": "string" - }, - "cool": { - "type": "string" - }, - "package": { - "type": "string" - }, - "managers": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "sponsors": { - "type": "object", - "properties": { - "title": { - "type": "string" - } - }, - "additionalProperties": false - }, - "oss_partners": { - "type": "object", - "properties": { - "title": { - "type": "string" - } - }, - "additionalProperties": false - }, - "team": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "governance": { - "type": "string" - }, - "role_steward": { - "type": "string" - }, - "role_maintainer": { - "type": "string" - }, - "sponsor": { - "type": "string" - }, - "sponsor_aria": { - "type": "string" - } - }, - "additionalProperties": false - }, - "contributors": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "loading": { - "type": "string" - }, - "error": { - "type": "string" - }, - "view_profile": { - "type": "string" - } - }, - "additionalProperties": false - }, - "get_involved": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "contribute": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "cta": { - "type": "string" - } - }, - "additionalProperties": false - }, - "community": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "cta": { - "type": "string" - } - }, - "additionalProperties": false - }, - "builders": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "cta": { - "type": "string" - } - }, - "additionalProperties": false - }, - "follow": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "cta": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, "account_menu": { "type": "object", "properties": { @@ -3115,993 +2899,6 @@ }, "additionalProperties": false }, - "compare": { - "type": "object", - "properties": { - "packages": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "tagline": { - "type": "string" - }, - "meta_title": { - "type": "string" - }, - "meta_title_empty": { - "type": "string" - }, - "meta_description": { - "type": "string" - }, - "meta_description_empty": { - "type": "string" - }, - "section_packages": { - "type": "string" - }, - "section_facets": { - "type": "string" - }, - "section_comparison": { - "type": "string" - }, - "copy_as_markdown": { - "type": "string" - }, - "loading": { - "type": "string" - }, - "error": { - "type": "string" - }, - "empty_title": { - "type": "string" - }, - "empty_description": { - "type": "string" - }, - "table_view": { - "type": "string" - }, - "charts_view": { - "type": "string" - } - }, - "additionalProperties": false - }, - "selector": { - "type": "object", - "properties": { - "search_label": { - "type": "string" - }, - "search_first": { - "type": "string" - }, - "search_add": { - "type": "string" - }, - "searching": { - "type": "string" - }, - "remove_package": { - "type": "string" - }, - "packages_selected": { - "type": "string" - }, - "add_hint": { - "type": "string" - } - }, - "additionalProperties": false - }, - "no_dependency": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "typeahead_title": { - "type": "string" - }, - "typeahead_description": { - "type": "string" - }, - "tooltip_title": { - "type": "string" - }, - "tooltip_description": { - "type": "string" - }, - "e18e_community": { - "type": "string" - }, - "add_column": { - "type": "string" - } - }, - "additionalProperties": false - }, - "facets": { - "type": "object", - "properties": { - "group_label": { - "type": "string" - }, - "all": { - "type": "string" - }, - "none": { - "type": "string" - }, - "coming_soon": { - "type": "string" - }, - "select_all": { - "type": "string" - }, - "deselect_all": { - "type": "string" - }, - "select_category": { - "type": "string" - }, - "deselect_category": { - "type": "string" - }, - "binary_only_tooltip": { - "type": "string" - }, - "categories": { - "type": "object", - "properties": { - "performance": { - "type": "string" - }, - "health": { - "type": "string" - }, - "compatibility": { - "type": "string" - }, - "security": { - "type": "string" - } - }, - "additionalProperties": false - }, - "items": { - "type": "object", - "properties": { - "packageSize": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "installSize": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "dependencies": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "totalDependencies": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "downloads": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "totalLikes": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "lastUpdated": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "deprecated": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "engines": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "types": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "moduleFormat": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "license": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - }, - "vulnerabilities": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "values": { - "type": "object", - "properties": { - "any": { - "type": "string" - }, - "none": { - "type": "string" - }, - "unknown": { - "type": "string" - }, - "deprecated": { - "type": "string" - }, - "not_deprecated": { - "type": "string" - }, - "types_included": { - "type": "string" - }, - "types_none": { - "type": "string" - }, - "vulnerabilities_summary": { - "type": "string" - }, - "up_to_you": { - "type": "string" - } - }, - "additionalProperties": false - }, - "trends": { - "type": "object", - "properties": { - "title": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "file_changes": { - "type": "string" - }, - "files_count": { - "type": "string" - }, - "lines_hidden": { - "type": "string" - }, - "file_too_large": { - "type": "string" - }, - "file_size_warning": { - "type": "string" - }, - "compare_versions": { - "type": "string" - }, - "compare_versions_title": { - "type": "string" - }, - "version_selector_title": { - "type": "string" - }, - "summary": { - "type": "string" - }, - "deps_count": { - "type": "string" - }, - "dependencies": { - "type": "string" - }, - "dev_dependencies": { - "type": "string" - }, - "peer_dependencies": { - "type": "string" - }, - "optional_dependencies": { - "type": "string" - }, - "no_dependency_changes": { - "type": "string" - }, - "file_filter_option": { - "type": "object", - "properties": { - "all": { - "type": "string" - }, - "added": { - "type": "string" - }, - "removed": { - "type": "string" - }, - "modified": { - "type": "string" - } - }, - "additionalProperties": false - }, - "search_files_placeholder": { - "type": "string" - }, - "no_files_all": { - "type": "string" - }, - "no_files_search": { - "type": "string" - }, - "no_files_filtered": { - "type": "string" - }, - "filter": { - "type": "object", - "properties": { - "added": { - "type": "string" - }, - "removed": { - "type": "string" - }, - "modified": { - "type": "string" - } - }, - "additionalProperties": false - }, - "files_button": { - "type": "string" - }, - "select_file_prompt": { - "type": "string" - }, - "close_files_panel": { - "type": "string" - }, - "filter_files_label": { - "type": "string" - } - }, - "additionalProperties": false - }, - "pds": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "meta_description": { - "type": "string" - }, - "join": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "migrate": { - "type": "string" - } - }, - "additionalProperties": false - }, - "server": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "location_label": { - "type": "string" - }, - "location_value": { - "type": "string" - }, - "infrastructure_label": { - "type": "string" - }, - "infrastructure_value": { - "type": "string" - }, - "privacy_label": { - "type": "string" - }, - "privacy_value": { - "type": "string" - }, - "learn_more": { - "type": "string" - } - }, - "additionalProperties": false - }, - "community": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "loading": { - "type": "string" - }, - "error": { - "type": "string" - }, - "empty": { - "type": "string" - }, - "view_profile": { - "type": "string" - }, - "new_accounts": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "privacy_policy": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "last_updated": { - "type": "string" - }, - "welcome": { - "type": "string" - }, - "cookies": { - "type": "object", - "properties": { - "what_are": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - } - }, - "additionalProperties": false - }, - "types": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "bold": { - "type": "string" - }, - "li1": { - "type": "string" - }, - "li2": { - "type": "string" - }, - "separator": { - "type": "string" - }, - "cookie_vdpl": { - "type": "string" - }, - "cookie_vdpl_desc": { - "type": "string" - }, - "cookie_h3": { - "type": "string" - }, - "cookie_h3_desc": { - "type": "string" - } - }, - "additionalProperties": false - }, - "local_storage": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "bold": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "bold2": { - "type": "string" - }, - "settings": { - "type": "string" - } - }, - "additionalProperties": false - }, - "management": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "bold": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "chrome": { - "type": "string" - }, - "firefox": { - "type": "string" - }, - "edge": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "analytics": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "bold": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "li1": { - "type": "string" - }, - "li2": { - "type": "string" - }, - "li3": { - "type": "string" - }, - "li4": { - "type": "string" - }, - "p3": { - "type": "string" - } - }, - "additionalProperties": false - }, - "authenticated": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "bold": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "settings": { - "type": "string" - } - }, - "additionalProperties": false - }, - "data_retention": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - } - }, - "additionalProperties": false - }, - "your_rights": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "li1": { - "type": "string" - }, - "li2": { - "type": "string" - }, - "li3": { - "type": "string" - }, - "li4": { - "type": "string" - }, - "p2": { - "type": "string" - } - }, - "additionalProperties": false - }, - "contact": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "link": { - "type": "string" - } - }, - "additionalProperties": false - }, - "changes": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "a11y": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "footer_title": { - "type": "string" - }, - "welcome": { - "type": "string" - }, - "approach": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "about_link": { - "type": "string" - } - }, - "additionalProperties": false - }, - "measures": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "li1": { - "type": "string" - }, - "li2": { - "type": "string" - }, - "li3": { - "type": "string" - }, - "li4": { - "type": "string" - }, - "li5": { - "type": "string" - }, - "li6": { - "type": "string" - } - }, - "additionalProperties": false - }, - "limitations": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - } - }, - "additionalProperties": false - }, - "contact": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "link": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "vacations": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "meta_description": { - "type": "string" - }, - "heading": { - "type": "string" - }, - "subtitle": { - "type": "string" - }, - "illustration_alt": { - "type": "string" - }, - "poke_log": { - "type": "string" - }, - "what": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "dates": { - "type": "string" - }, - "p2": { - "type": "string" - }, - "garden": { - "type": "string" - } - }, - "additionalProperties": false - }, - "meantime": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "repo_link": { - "type": "string" - } - }, - "additionalProperties": false - }, - "return": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "p1": { - "type": "string" - }, - "social_link": { - "type": "string" - } - }, - "additionalProperties": false - }, - "stats": { - "type": "object", - "properties": { - "contributors": { - "type": "string" - }, - "commits": { - "type": "string" - }, - "pr": { - "type": "string" - }, - "subtitle": { - "type": "object", - "properties": { - "some": { - "type": "string" - }, - "all": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, "$schema": { "type": "string" } diff --git a/modules/i18n.ts b/modules/i18n.ts new file mode 100644 index 0000000000..f1b62d5bcd --- /dev/null +++ b/modules/i18n.ts @@ -0,0 +1,61 @@ +import { createResolver, defineNuxtModule } from 'nuxt/kit' +import { currentLocales } from '../config/i18n.ts' +import type { LocaleObject } from '@nuxtjs/i18n' +import fs from 'node:fs' + +export default defineNuxtModule({ + meta: { + name: 'npmx-i18n', + }, + setup(_, nuxt) { + nuxt.hook('i18n:registerModule', registerModule => { + console.log(currentLocales) + const newLocales = addFeatures() + console.log(newLocales) + registerModule({ + langDir: 'i18n/locales', + locales: newLocales, + }) + }) + }, +}) + +const features = ['a11y', 'about', 'compare', 'pds', 'private_policy', 'vacations'] + +const { resolve } = createResolver(import.meta.url) + +function addFeatures(): LocaleObject[] { + const i18nDir = resolve('../i18n/locales') + console.log(i18nDir) + + const result: LocaleObject[] = [] + + for (const locale of currentLocales) { + const baseFiles = locale.files ? [...locale.files] : locale.file ? [locale.file as string] : [] + const newFiles: string[] = [] + let hasNewFeatures = false + + for (const f of baseFiles) { + const fileName = f as string + newFiles.push(fileName) + + for (const feature of features) { + const featurePath = resolve(i18nDir, feature, fileName) + if (fs.existsSync(featurePath)) { + newFiles.push(`${feature}/${fileName}`) + hasNewFeatures = true + } + } + } + + if (hasNewFeatures) { + const copy = { ...locale, files: newFiles } + delete copy.file + result.push(copy) + } else { + result.push(locale) + } + } + + return result +}