From 870b4a15d3feda5cfbc32468783fff0fc72dfcd0 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Thu, 1 Oct 2026 20:53:53 -0300 Subject: [PATCH 1/3] feat: Add Portuguese (Brazil) translation for OCL Mapper - Add pt-BR translation catalog with all English keys translated - Register pt-BR in i18n config - Add pt-BR to LANGUAGES in constants.js --- src/common/constants.js | 3 +- src/i18n/config.js | 6 +- src/i18n/locales/pt-BR/translations.json | 815 +++++++++++++++++++++++ 3 files changed, 822 insertions(+), 2 deletions(-) create mode 100644 src/i18n/locales/pt-BR/translations.json diff --git a/src/common/constants.js b/src/common/constants.js index d06becc8..3f683a2a 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -4,7 +4,8 @@ export const OCL_CLIENT = `oclmap/${packageJson.version}`; export const LANGUAGES = [ {locale: 'en', name: 'English'}, {locale: 'es', name: "Español"}, - {locale: 'zh', name: "中文"} + {locale: 'zh', name: "中文"}, + {locale: 'pt-BR', name: "Português (Brasil)"} ] diff --git a/src/i18n/config.js b/src/i18n/config.js index e7d166e0..a3ff94e7 100644 --- a/src/i18n/config.js +++ b/src/i18n/config.js @@ -3,6 +3,7 @@ import { initReactI18next } from 'react-i18next'; import en from './locales/en/translations.json' import es from './locales/es/translations.json' import zh from './locales/zh/translations.json' +import ptBR from './locales/pt-BR/translations.json' i18n.use(initReactI18next).init({ fallbackLng: 'en', @@ -16,6 +17,9 @@ i18n.use(initReactI18next).init({ }, zh: { translations: zh + }, + 'pt-BR': { + translations: ptBR } }, ns: ['translations'], @@ -23,6 +27,6 @@ i18n.use(initReactI18next).init({ interpolation: { escapeValue: false } }); -i18n.languages = ['en', 'es', 'zh']; +i18n.languages = ['en', 'es', 'zh', 'pt-BR']; export default i18n; diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json new file mode 100644 index 00000000..3ead55b9 --- /dev/null +++ b/src/i18n/locales/pt-BR/translations.json @@ -0,0 +1,815 @@ +{ + "common": { + "or": "ou", + "action": "Ação", + "language": "Idioma", + "languages": "Idiomas", + "preferred_language": "Idioma preferido", + "help_and_documentation": "Ajuda e documentação", + "community_website": "Site da comunidade OCL", + "chat": "Chat do OCL", + "clear": "Limpar", + "updated_on": "Última atualização", + "last_updated_on": "Última atualização em", + "last_updated": "Última atualização", + "updated_by": "Atualizado por", + "owner": "Proprietário", + "show": "Mostrar", + "hide": "Ocultar", + "more": "Mais", + "less": "Menos", + "latest": "Mais recente", + "read_more": "Ler mais", + "read_less": "Ler menos", + "refresh": "atualizar", + "go_to": "ir para", + "go_to_your": "ir para seu ", + "go_back_or_to_your_dashboard": "Ir <0/> ou para seu <1/>.", + "for_a_new_account": "para uma nova conta", + "back": "voltar", + "retired": "Aposentado", + "id": "ID", + "name": "Nome", + "full_name": "Nome completo", + "description": "Descrição", + "create": "Criar", + "created": "Criado", + "created_on": "Criado em", + "created_by": "Criado por", + "version": "Versão", + "versions": "Versões", + "summary": "Resumo", + "about": "Sobre", + "view_all_attributes": "Ver todos os atributos", + "all": "Todos", + "actions": "Ações", + "more_actions": "Mais ações", + "metadata": "Metadados", + "copied_to_clipboard": "Copiado para a área de transferência", + "navigate": "Navegar", + "select": "Selecionar", + "search": "Buscar", + "content_summary": "Resumo do conteúdo", + "for": "para", + "please": "Por favor", + "save": "Salvar", + "delete": "Excluir", + "open": "Abrir", + "manage": "Gerenciar", + "overview": "Visão geral", + "quick_links": "Links rápidos", + "resolve": "Resolver", + "result": "Resultado", + "settings": "Configurações", + "add": "Adicionar", + "cancel": "Cancelar", + "upload": "Carregar", + "custom_attributes": "Atributos personalizados", + "public": "Público", + "private": "Privado", + "close": "Fechar", + "ok": "OK", + "run": "Executar", + "short_code": "Código curto", + "attribute": "Atributo", + "attributes": "Atributos", + "value": "Valor", + "by": "por", + "statistics": "Estatísticas", + "subscribed": "Inscrito", + "following": "Seguindo", + "follow": "Seguir", + "unfollow": "Deixar de seguir", + "a": "um", + "an": "um", + "with": "com", + "json": "JSON", + "draft": "Rascunho", + "highlights": "Destaques", + "click_to_copy": "Clique para copiar", + "submit": "Enviar", + "external_id": "ID externo", + "access_level": "Nível de acesso", + "history": "Histórico e comentários", + "from": "De", + "target": "Destino", + "properties": "Propriedades", + "custom": "Personalizado", + "apply": "Aplicar", + "reset": "Redefinir", + "checking_auth": "Verificando autenticação...", + "default": "padrão", + "report": "Relatório", + "import": "Importar", + "download_csv": "Baixar CSV", + "advance_settings": "Configurações avançadas", + "sort": "Ordenar", + "group": "Agrupar", + "remove": "Remover", + "at": "às" + }, + "errors": { + "401": "Login é necessário", + "403": "Acesso a esta página não é autorizado", + "404": "Desculpe, sua página não pôde ser encontrada.", + "network_error": "Erro de rede", + "throttled": { + "title": "Muitas requisições", + "retry_after": "Isto desaparecerá após:", + "ended": "Janela de limite de requisições encerrada. Você pode continuar de onde parou.", + "limit_hit": { + "minute": "O limite de requisições por minuto foi atingido.", + "day": "O limite diário de requisições foi atingido.", + "minute_and_day": "Os limites de requisições por minuto e diário foram atingidos", + "unknown": "Um limite de requisições foi atingido." + } + } + }, + "dashboard": { + "name": "Painel", + "my": "Meu Painel", + "welcome_line": "Bem-vindo ao OCL.", + "take_a_tour": "Ver notas de versão e fazer um tour", + "hello": "Olá", + "create_repository": "Criar Repositório", + "anonymous_heading": "O que há de novo?", + "community_blog": "Blog da Comunidade", + "events_scope_sign_in": "Você precisa estar conectado para ver conteúdo de publicadores que segue", + "no_events": "Não há atualizações para mostrar ainda." + }, + "bookmarks": { + "name": "Favoritos", + "pinned": "Fixados", + "pinned_repos": "Repositórios fixados" + }, + "auth": { + "sign_in": "Entrar", + "sign_out": "Sair", + "register": "Cadastrar", + "signing_in": "Entrando...", + "sign_in_success": "Entrada realizada com sucesso.", + "sign_in_error": "Não foi possível entrar no momento.", + "email_verified_sign_in": "Seu e-mail foi verificado. Entre para continuar.", + "sign_in_to_continue": "Entre para continuar.", + "update_password": "Atualizar senha", + "session_expired": "Sua sessão expirou. Faça login para continuar." + }, + "custom_attributes": { + "label": "Atributos personalizados", + "key": "Nome do atributo", + "value": "Valor do atributo", + "add": "Adicionar um Atributo Personalizado" + }, + "concept": { + "concepts": "Conceitos", + "retired_concepts": "Conceitos Aposentados", + "tab_concept_details": "Detalhes do Conceito", + "tab_bridge_concept_details": "Detalhes do Conceito Ponte", + "tab_bridge_concept": "Conceito Ponte", + "tab_bridge_concepts": "Conceitos Ponte", + "tab_bridge_children": "Candidatos de Destino", + "open_in_term_browser": "Abrir no TermBrowser", + "also_candidate_for": "Também candidato para {{code}}", + "linked_bridge_concept": "Conceito ponte", + "linked_bridge_child": "Candidato de destino", + "linked_target_concept": "Conceito de destino", + "show_more_locales": "Ver mais {{count}}", + "show_fewer_locales": "Ver menos", + "display_name": "Nome de exibição", + "concept_class": "Classe do Conceito", + "datatype": "Tipo de Dado", + "datatypes": "Tipos de Dado", + "name_and_synonyms": "Nome e sinônimos", + "descriptions": "Descrições", + "copied_name": "Nome do conceito e URL copiados para a área de transferência", + "copied_description": "Descrição do conceito e URL copiados para a área de transferência", + "associations": "Associações", + "namespace": "Namespace", + "namespace_associations": "Associações de Namespace", + "concept_classes": "Classes de Conceito", + "name_type": "Tipo de Nome", + "name_types": "Tipos de Nome", + "form": { + "id": "ID do Conceito", + "external_id": "ID Externo", + "concept_class": "Classe do Conceito", + "datatype": "Tipo de dado", + "locale": "Localidade", + "name": "Nome", + "description": "Descrição", + "type": "Tipo", + "locale_preferred": "Preferido", + "concept_details": { + "header": "Detalhes do conceito" + }, + "names": { + "header": "Nome e sinônimos" + }, + "descriptions": { + "header": "Descrições" + } + }, + "edit_concept": "Editar Conceito" + }, + "mapping": { + "mappings": "Mapeamentos", + "same_as_mappings": "Mapeamentos (SAME-AS)", + "retired_mappings": "Mapeamentos Aposentados", + "fromConcept": "Conceito de origem", + "toConcept": "Conceito de destino", + "type": "Tipo", + "map_types": "Tipos de Mapeamento", + "map_type": "Tipo de mapeamento", + "from_concept_sources": "Fontes do Conceito de Origem", + "to_concept_sources": "Fontes do Conceito de Destino", + "relationship": "Relacionamento", + "code": "Código", + "inverse_mappings": "Mapeamentos Inversos", + "self_mappings": "Mapeamentos Próprios", + "direct_mappings": "Mapeamentos Diretos", + "from_concept_not_defined": "Conceito de origem não está definido no OCL", + "from_concept_defined": "Conceito de origem está definido no OCL", + "to_concept_not_defined": "Conceito de destino não está definido no OCL", + "to_concept_defined": "Conceito de destino está definido no OCL", + "sort_weight": "Peso de Ordenação", + "fromAndTargetSource": "Origem e fonte de destino", + "has_child": "Tem filho", + "has_parent": "Tem pai" + }, + "checksums": { + "standard": "Checksum Padrão", + "smart": "Checksum Inteligente" + }, + "repo": { + "repos": "Repositórios", + "repo": "Repositório", + "repo_type": "Tipo de Repositório", + "source_type": "Tipo de Fonte", + "collection_type": "Tipo de Coleção", + "collection": "Coleção", + "manage": "Gerenciar Repositório", + "repo_id": "ID do Repositório", + "add_concept": "Adicionar Conceito", + "source": "Fonte", + "release_status": "Status de Publicação", + "compare_versions": "Comparar versões", + "compare": "Comparar", + "visibility": "Visibilidade", + "locales": "Localidades", + "locale": "Localidade", + "identifier": "Identificador", + "contact": "Contato", + "jurisdiction": "Jurisdição", + "publisher": "Publicador", + "purpose": "Finalidade", + "copyright": "Direitos autorais", + "content_type": "Tipo de Conteúdo", + "revision_date": "Data de Revisão", + "experimental": "Experimental", + "case_sensitive": "Diferencia maiúsculas/minúsculas", + "hierarchy_meaning": "Significado da Hierarquia", + "compositional": "Composicional", + "version_needed": "Versão Necessária", + "autoid_concept_mnemonic": "Atribuição Automática de ID de Conceito", + "autoid_concept_external_id": "Atribuição Automática de ID Externo de Conceito", + "autoid_concept_name_external_id": "Atribuição Automática de ID Externo de Nome de Conceito", + "autoid_concept_description_external_id": "Atribuição Automática de ID Externo de Descrição de Conceito", + "autoid_mapping_mnemonic": "Atribuição Automática de ID de Mapeamento", + "autoid_mapping_external_id": "Atribuição Automática de ID Externo de Mapeamento", + "custom_validation_schema": "Schema de Validação Personalizado", + "compare_origin_version_disabled_tooltip": "Você deve selecionar uma versão mais antiga para comparar", + "compare_destination_version_disabled_tooltip": "Você deve selecionar uma versão mais nova para comparar", + "summary_active_concepts_from_total": "{{active}} conceitos ativos ({{retired}} aposentados)", + "summary_active_mappings_from_total": "{{active}} mapeamentos ativos ({{retired}} aposentados)", + "summary_released_versions_from_total": "{{released}} versões publicadas ({{unreleased}} não publicadas)", + "summary_concepts_references": "{{count}} referências de conceitos", + "summary_mappings_references": "{{count}} referências de mapeamentos", + "refresh_summary": "Atualizar resumo", + "repo_version_summary": "Resumo da Versão do Repositório", + "repo_summary_is_calculating": "Resumo do repositório está sendo calculado, por favor verifique novamente após algum tempo.", + "no_overview": "O proprietário não criou uma página de Visão Geral para este repositório", + "property": "Propriedade", + "properties_filters_subheader": "Propriedades do Repositório", + "additional_metadata_filters_subheader": "Metadados Adicionais", + "suggested_sources": "Fontes Sugeridas" + }, + "org": { + "my": "Minhas Organizações", + "orgs": "Organizações", + "org": "Organização", + "about_the_org": "Sobre a Organização", + "members": "Membros", + "member": "Membro", + "org_have_not_created_public_repos_suffix": "não criaram nenhum repositório público", + "browse_members": "Navegar membros", + "member_of": "Membro de" + }, + "user": { + "users": "Usuários", + "user": "Usuário", + "my_profile": "Meu Perfil", + "my_repositories": "Meus Repositórios", + "my_organizations": "Minhas Organizações", + "my_bookmarks": "Meus Favoritos", + "my_mapping_projects": "Meus Projetos de Mapeamento", + "username": "Nome de usuário", + "password": "Senha", + "joined_on": "Entrou em", + "email": "E-mail", + "company_name": "Nome da Empresa", + "location": "Localização", + "website": "Site", + "last_login": "Último Login", + "edit_my_profile": "Editar meu perfil", + "name_and_description": "Nome e descrição", + "login_and_security": "Login e segurança", + "first_name": "Primeiro Nome", + "last_name": "Último Nome", + "company": "Empresa", + "email_address": "Endereço de E-mail", + "profile_update_success": "Perfil atualizado com sucesso", + "profile_update_failure": "Ocorreu um erro ao atualizar o perfil.", + "copy_api_token": "Copiar token da API", + "copy_token_success": "Token copiado para sua área de transferência", + "your": "Seu", + "avatar": "Avatar", + "update_avatar": "Atualizar seu avatar", + "bio": "Bio curta", + "about_me": "Sobre mim", + "about_me_description": "Crie uma introdução para quem visita seu perfil (200 caracteres).", + "user_has_not_created_public_repos_suffix": "não criou nenhum repositório público", + "recent_activity": "atividade recente" + }, + "search": { + "filters": "Filtros", + "concepts": "Conceitos", + "mappings": "Mapeamentos", + "repos": "Repositórios", + "orgs": "Organizações", + "users": "Usuários", + "sort_by": "Ordenar por", + "display": "Exibir", + "loading": "Refinando seus resultados de busca...", + "no_results": "Não encontramos correspondências para ", + "input_placeholder_drawer": "Digite um termo de busca ou toque / para opções", + "input_placeholder": "Buscar no OCL...", + "table": "Tabela", + "card": "Cartão", + "search_all_site": "Buscar em todo o OCL para ", + "search_this_repository": "Buscar neste repositório", + "search_this_url_registry": "Buscar neste registro de URL para ", + "search_all_concepts": "Buscar todos os conceitos", + "url_registry": "entradas", + "confidence": "Confiança", + "score": "Pontuação", + "search_highlight": "Detalhes da Correspondência", + "search_results": "Resultados da Busca", + "search_score": "Pontuação Unificada", + "search_raw_score": "Pontuações Brutas", + "matched_attributes": "Atributos Correspondidos", + "no_match_metrics": "Nenhuma métrica de correspondência de algoritmo disponível para este conceito.", + "list_view": "Visualização em Lista", + "table_view": "Visualização em Tabela", + "select_all_rows": "Selecionar todas as linhas" + }, + "url_registry": { + "url_registry": "Registro de URL Canônica", + "registry_owner": "Proprietário do Registro", + "global": "Global", + "global_registry": "Registro Global", + "test_canonical_url": "Testar uma URL Canônica", + "add_entry": "Adicionar URL Canônica", + "test_canonical_url_description": "Digite uma URL canônica para testar como o OCL a resolverá em um namespace específico, como seu espaço de trabalho de usuário ou uma organização da qual você é membro. Use isso para simular como o OCL avaliará referências e mapeamentos em seus repositórios. <0>Saiba mais no OCL Docs", + "canonical_url": "URL Canônica", + "resolve_success_with_entry": "{{url}} resolvido para <0/> em <1/> usando uma entrada no <2/> Registro", + "resolve_success_without_entry": "{{url}} resolvido para <0/> em <1/> por correspondência com um repositório no <2/>", + "resolve_failed_with_entry": "{{url}} correspondeu a uma entrada no <0/> Registro mas não resolveu para um repositório", + "resolve_failed_without_entry": "{{url}} não correspondeu a uma entrada no <0/> Registro ou no Registro Global e não resolveu para um repositório", + "resolve_failed_without_entry_global": "{{url}} não correspondeu a uma entrada no Registro Global", + "target_owner": "Proprietário de Destino", + "view_canonical_url_registry": "Ver Registro de URL Canônica" + }, + "locale": { + "add_custom_language_codes": "Adicionar código(s) de idioma personalizado(s)", + "add_custom_language_code": "Adicionar código de idioma personalizado", + "custom_language_codes": "Código(s) de idioma personalizado(s)", + "custom_language_code": "Código de idioma personalizado", + "custom_language_code_warning": "OCL é otimizado para códigos de idioma de 2 e 4 letras (ex.: \"pt\" ou \"pt-BR\"). Use códigos personalizados apenas se absolutamente necessário.", + "custom_language_code_helper_multiple": "Códigos de idioma personalizados podem ter apenas letras e hífens, ex.: \"por\". Use vírgula ou espaço para separar múltiplos códigos personalizados", + "custom_language_code_helper_single": "Código de idioma personalizado pode ter apenas letras e hífens, ex.: \"por\".", + "custom_language_code_validation_multiple": "Letras e \"-\" são permitidas para códigos de idioma. Vírgula ou espaço podem ser usados para separar códigos personalizados se aplicável. Nenhum outro caractere, ex.: números, é aceito.", + "custom_language_code_validation_single": "Letras e \"-\" são permitidas para código de idioma. Nenhum outro caractere, ex.: números, é aceito.", + "custom_language_code_tooltip": "Códigos de idioma no OCL usam a sintaxe \"pt\" ou \"pt-BR\" de acordo com ISO 639-1, com um código de país opcional de 2 letras seguindo BCP47. OCL permite códigos de idioma em outros formatos, porém estes podem limitar certos recursos ou ser incompatíveis com sistemas cliente, como OpenMRS. Letras e \"-\" são permitidas para códigos de idioma.", + "add_custom_code": "Adicionar código personalizado", + "iso_639_1_language_code": "Código de idioma ISO-639-1", + "iso_639_1_support_note": "O modelo de dados do OCL suporta códigos ISO-639-1 (dois dígitos) como padrão. Considere atualizar." + }, + "map_project": { + "configure_mapping_project": "Configurar Projeto de Mapeamento", + "mapping_projects": "Projetos de Mapeamento", + "new_map_project": "Novo Projeto de Mapeamento", + "project_ownership_and_name": "Propriedade e Nome do Projeto", + "project_owner": "Proprietário do Projeto", + "project_name": "Nome do Projeto", + "no_projects_found": "Nenhum projeto encontrado.", + "input_data": "Dados de Entrada", + "upload_file_description": "Carregue uma planilha (.csv, .xls, .xlsx) que contenha os dados de entrada a serem mapeados.", + "upload_file": "Carregar arquivo", + "target_repository": "Repositório de Destino", + "target_repository_description": "Selecione o repositório para o qual você deseja mapear seus dados de entrada.", + "repository": "Repositório", + "filter_name_locales": "Filtro Global de Localidades de Nome", + "loading_name_locales": "Carregando Localidades de Nome...", + "filter_name_locales_helper": "Nota: Restringir candidatos a idiomas específicos limita capacidades de correspondência inter-idiomas, mas pode melhorar a precisão dos resultados para certos conjuntos de dados, especialmente se os dados de entrada estão no mesmo idioma que o idioma padrão do repositório de destino.", + "input_language": "Idioma de Entrada", + "input_language_helper": "Idioma dos dados de entrada. Determina quais localidades de nome do repositório de destino são enviadas ao Assistente de IA.", + "ai_effective_locales": "IA receberá nomes em: {{locales}}", + "ai_all_locales": "IA receberá nomes em: todas as localidades (sem filtro)", + "default_filter": "Filtro Padrão", + "matching_algorithm": "Algoritmo de Correspondência", + "matching_algorithm_description": "Selecione um algoritmo de correspondência. <0>Saiba mais", + "custom_match_api": "API de Correspondência Personalizada", + "custom_match_api_description": "Configurar URL e Token da API de Correspondência Externa", + "match_api_url": "URL da API de Correspondência", + "match_api_url_placeholder": "ex.: https://api.openconceptlab.org/concepts/$match/?includeSearchMeta=true", + "match_api_token": "Token da API de Correspondência", + "match_api_token_placeholder": "ex.: XXXXXXXXXXX", + "batch_size": "Tamanho do Lote", + "concurrent_requests": "Requisições Concurrentes", + "request_limit_up_to": "Até {{max}}", + "api_url": "URL da API", + "api_token": "Token da API", + "lookup_required": "Busca Obrigatória", + "select_an_algorithm": "Selecionar um algoritmo", + "rows_per_match_api": "Linhas por API $match", + "score_configuration": "Configuração de Pontuação", + "score_configuration_description": "Configurar limite de pontuação para agrupar recomendações de candidatos", + "not_recommended": "Não Recomendado", + "available": "Disponível", + "recommended": "Recomendado", + "state": "Estado", + "unranked": "Não classificado", + "match_quality_counts_help": "Linhas pela pontuação de sua correspondência proposta ou, onde nenhuma correspondência é proposta ainda, de seu melhor candidato.", + "best_candidate_quality": "Melhor candidato. Nenhuma correspondência proposta ainda.", + "low_ranked": "Baixa classificação", + "field_configuration": "Configuração de Campo", + "field_configuration_description": "Associe campos nos dados de entrada a campos que os algoritmos de correspondência são capazes de entender. Atribua campos de entrada que contenham códigos de conceito ou mapeamentos a repositórios específicos. Saiba mais", + "input_column": "Coluna de Entrada", + "mapped_field": "Campo Mapeado", + "field": "Campo", + "value": "Valor", + "include_retired": "Incluir Aposentados", + "map": "Mapear", + "un_map": "Desmapear", + "used_in_this_project": "Usado neste Projeto", + "all_options": "Todas as Opções", + "save_and_close": "Salvar e Fechar", + "saving": "Salvando...", + "successfully_saved": "Salvo com sucesso.", + "save_this_project": "Salvar este projeto", + "download_this_project_as_csv": "Baixar", + "delete_this_project": "Excluir projeto de mapeamento", + "last_saved": "salvo em {{time}}", + "successfully_deleted": "Excluído com sucesso.", + "delete_map_project": "Excluir Projeto de Mapeamento", + "delete_map_project_warning": "Isso excluirá o projeto de mapeamento e suas decisões e arquivo carregado.", + "delete_map_project_confirm": "Tem certeza de que deseja excluir permanentemente este projeto de mapeamento <0>{{name}}?", + "delete_map_project_type_to_confirm": "Por favor, digite <0>{{name}} para confirmar", + "clear_filter": "Limpar Filtro", + "configure_mapping_project_tooltip": "Configurar Projeto de Mapeamento", + "auto_match": "Correspondência Automática", + "auto_matched": "Correspondido Automaticamente", + "unmapped_only": "Apenas Não Mapeados", + "map_target": "Alvo do Mapeamento", + "propose": "Propor", + "proposal_note": "Nota da proposta", + "target_source": "Fonte de Destino", + "concept_id": "ID do Conceito", + "map_type": "Tipo de Mapeamento", + "attribute_name": "Nome do Atributo", + "attribute_value": "Valor do Atributo", + "add_more": "Adicionar mais", + "no_results": "Nenhum resultado", + "start_typing": "Comece a digitar...", + "type_atleast_characters": "Digite pelo menos {{count}} caracteres para buscar", + "source": "Fonte", + "show_more": "Mostrar mais", + "ai_recommended": "Recomendado por IA", + "ai_alternate": "Sugestão de Candidato Alternativo por IA", + "ai_assistant": "Assistente de IA", + "view_raw_json": "Ver JSON Bruto", + "comment": "Comentário", + "rejected": "Rejeitado", + "preview_splash_headline": "Mapeie seus termos para LOINC, SNOMED CT, CIEL e ICD-11 - com IA fazendo a primeira passagem.", + "preview_splash_subhead": "O OCL Mapper pega uma planilha de termos clínicos locais e propõe correspondências de terminologia padrão, ranqueadas, com a evidência para cada uma.", + "preview_splash_sign_in_cta": "Entre e comece a mapear", + "preview_splash_register_cta": "Criar uma conta gratuita", + "preview_quota_chip": "Prévia: {{limit}} linhas por projeto", + "preview_quota_tooltip_title": "Sua prévia do Mapper (permissão única)", + "preview_quota_projects": "Projetos", + "preview_quota_rows": "Linhas por projeto", + "preview_quota_rows_cap": "primeiras {{limit}} linhas de cada projeto", + "preview_quota_match_operations": "Operações de correspondência", + "preview_quota_ai_calls": "Chamadas do Assistente de IA", + "preview_quota_used_of_limit": "{{used}} de {{limit}} usado(s)", + "preview_estimate_will_truncate": "Isso cobre {{allowed}} das {{requested}} linhas que você selecionou, então corresponderemos as primeiras {{allowed}}.", + "preview_estimate_match": "{{rows}} linha(s) × {{algorithms}} algoritmo(s) = {{used}} de suas {{remaining}} operações de correspondência.", + "preview_estimate_no_operations_left": "Nenhuma operação de correspondência sobrou em sua prévia. Você pode continuar revisando, editando e exportando este projeto.", + "preview_estimate_ai_all": "Recomendações de IA para todas as {{count}} linha(s).", + "preview_estimate_ai_partial": "Recomendações de IA para as primeiras {{covered}} linha(s); as outras {{rest}} são correspondidas sem IA.", + "preview_estimate_ai_none": "Nenhuma chamada do Assistente de IA sobrou, então estas linhas são correspondidas sem IA.", + "preview_rows_activated_notice": "Projetos de prévia contêm {{limit}} linhas - ativamos as primeiras {{limit}} de suas {{total}}.", + "ai_assistant_limit_reached": "Você usou todas as chamadas de prévia do Assistente de IA. A correspondência continuará sem análise de IA para as linhas restantes.", + "preview_limit_title_rows": "Você usou as linhas de prévia deste projeto", + "preview_limit_title_match_operations": "Você usou suas operações de correspondência de prévia", + "preview_limit_title_projects": "A prévia cobre um projeto", + "preview_limit_title_org_projects": "Projetos de organização não estão na prévia", + "preview_limit_title_access": "Acesso ao Mapper está limitado no momento", + "preview_limit_title_custom_algorithms": "Algoritmos hospedados externamente não estão na prévia", + "preview_limit_title_ai_assistant": "O Assistente de IA ainda não está disponível", + "preview_limit_title_rows_not_entitled": "As linhas deste projeto não fazem parte de sua prévia ainda", + "preview_limit_title_match_operations_not_entitled": "Operações de correspondência não fazem parte de sua conta ainda", + "preview_limit_title_projects_not_entitled": "Projetos de mapeamento não fazem parte de sua conta ainda", + "preview_limit_title_generic": "Você atingiu um limite de prévia", + "preview_limit_body_rows": "Sua prévia gratuita cobre {{limit}} linhas auto-correspondidas para este projeto - você usou todas as {{limit}}. Nada está bloqueado: continue revisando, editando e exportando este projeto quanto quiser.", + "preview_limit_body_rows_no_count": "O limite de linhas de sua prévia gratuita para este projeto foi atingido. Nada está bloqueado: continue revisando, editando e exportando este projeto quanto quiser.", + "preview_limit_body_match_operations": "Sua prévia gratuita cobre {{limit}} operações de correspondência - você usou todas as {{limit}}. Nada está bloqueado: continue revisando, editando e exportando este projeto quanto quiser.", + "preview_limit_body_match_operations_no_count": "O limite de operações de correspondência de sua prévia gratuita foi atingido. Nada está bloqueado: continue revisando, editando e exportando este projeto quanto quiser.", + "preview_limit_body_projects": "Você já tem um projeto do Mapper ativo. A prévia gratuita cobre um projeto por vez - delete o que você tem, ou peça mais acesso abaixo.", + "preview_limit_body_projects_no_count": "Você já tem um projeto do Mapper ativo. A prévia gratuita cobre um projeto por vez.", + "preview_limit_body_org_projects": "Projetos de mapeamento pertencentes a organizações não fazem parte da prévia ainda. Crie um projeto sob sua própria conta, ou peça mais acesso abaixo.", + "preview_limit_body_org_projects_no_count": "Projetos de mapeamento pertencentes a organizações não fazem parte da prévia ainda.", + "preview_limit_body_access": "Sua conta não tem acesso ao Mapper no momento. Peça mais acesso abaixo e nós resolveremos.", + "preview_limit_body_access_no_count": "Sua conta não tem acesso ao Mapper no momento.", + "preview_limit_body_custom_algorithms_no_count": "Algoritmos hospedados externamente não fazem parte da prévia ainda. Use os algoritmos integrados do OCL, ou peça mais acesso abaixo.", + "preview_limit_body_ai_assistant": "Sua prévia gratuita cobre {{limit}} chamadas do Assistente de IA - você usou {{used}} de {{limit}}. A correspondência pode continuar sem análise de IA para as linhas restantes.", + "preview_limit_body_ai_assistant_no_count": "O Assistente de IA não está disponível para sua conta. Peça mais acesso abaixo e nós resolveremos.", + "preview_limit_body_rows_not_entitled_no_count": "Este projeto não tem uma permissão de linhas configurada ainda. Peça mais acesso abaixo e nós resolveremos.", + "preview_limit_body_match_operations_not_entitled_no_count": "Sua conta não tem acesso a operações de correspondência configurado ainda. Peça mais acesso abaixo e nós resolveremos.", + "preview_limit_body_projects_not_entitled_no_count": "Sua conta não tem acesso a projetos de mapeamento configurado ainda. Peça mais acesso abaixo e nós resolveremos.", + "preview_limit_body_generic": "Você atingiu um limite de prévia ({{used}} de {{limit}}).", + "preview_limit_body_generic_no_count": "Você atingiu um limite de prévia para o Mapper.", + "preview_limit_hardship_note": "Trabalhando com um orçamento de concessão que não estica, ou para um ministério da saúde? Use \"Solicitar mais acesso\" abaixo - se o limite não funciona para sua situação, nós encontraremos algo que funcione.", + "preview_limit_notify_me": "Notifique-me quando planos lançarem", + "preview_limit_request_access": "Solicitar mais acesso", + "preview_limit_dismiss": "Voltar ao meu projeto", + "preview_config_unavailable_title": "Este projeto usa configurações restritas de prévia", + "preview_config_unavailable_org_projects": "Projetos de Mapper pertencentes a organizações não fazem parte de sua prévia. Escolha seu namespace pessoal como proprietário do projeto.", + "preview_config_unavailable_custom_algorithms": "Algoritmos hospedados externamente não fazem parte de sua prévia. Remova o algoritmo personalizado antes de salvar.", + "semantic_search_not_configured": "{{owner}}:{{repo}}:{{version}} não está configurado para executar Busca Semântica", + "no_valid_columns_for_matching": "Nenhuma das colunas é válida para correspondência, por favor edite e atribua colunas válidas.", + "proposed_successfully": "Proposto com sucesso.", + "algorithm_es_label": "Correspondência Genérica de Busca Elástica", + "algorithm_es_description": "Busca por token e palavra-chave usando Elasticsearch", + "algorithm_llm_label": "Busca Semântica (all-MiniLM-L6-v2)", + "algorithm_llm_description": "Busca baseada em vetor que corresponde por significado, não apenas palavras-chave", + "algorithm_custom_label": "API Personalizada", + "algorithm_custom_description": "API $match personalizada", + "target_code": "Código de Destino", + "bridge_candidates": "Candidatos Ponte", + "scispacy_candidates": "Candidatos ScispaCy LOINC", + "ai_analysis": "Análise de IA", + "group_by_ai_analysis": "Análise de IA", + "view_existing_analysis": "Ver Existente", + "run_new_analysis": "Executar Nova Análise", + "matched": "Correspondido", + "dates": "Datas", + "none": "Nenhum", + "decision_changed_to_none": "Decisão Alterada para Nenhum", + "loading_project": "Carregando projeto...", + "stopping_gracefully": "Parando graciosamente...", + "stop_processing": "Parar Processamento", + "auto_match_unmapped_only_note": "Nota: Apenas linhas não mapeadas serão correspondidas", + "auto_match_note": "Nota: Isso não afetará {{approvedCount}} linhas de entrada aprovadas mas substituirá {{proposedCount}} linhas de entrada propostas", + "auto_match_note_no_counts": "Nota: Isso não afetará linhas de entrada aprovadas mas substituirá linhas de entrada propostas", + "auto_match_all_including_approved_note": "Aviso: Isso executará novamente cada linha de entrada do zero e sobrescreverá {{approvedCount}} decisões aprovadas e {{proposedCount}} propostas", + "auto_match_all_including_approved_confirm": "Entendo que {{approvedCount}} decisões aprovadas serão sobrescritas", + "auto_match_selected_rows_note": "Nota: Isso executará Correspondência Automática para {{count}} linha(s) de entrada selecionada(s)", + "auto_match_selected_rows_note_no_count": "Nota: Selecione linhas no painel esquerdo para habilitar esta opção", + "auto_match_rows_failed": "Correspondência falhou para {{count}} linha(s) de entrada, então elas estão sem candidatos: {{details}}. Linhas contam a partir da primeira linha de dados do seu arquivo. Execute Correspondência Automática naquelas linhas novamente para tentar de novo.", + "auto_match_rows_failed_algorithm": "{{algorithm}} na(s) linha(s) {{rows}}", + "match_request_failed": "Não foi possível obter candidatos ({{error}}). Tente novamente.", + "run_ai_analysis": "Executar Análise de IA", + "run_ai_analysis_note": "Nota: Habilitar este recurso executará Análise de IA nos resultados de cada linha. Isso tem implicações diretas de custo.", + "decision": "Decisão", + "decision_map": "Mapear", + "decision_exclude": "Excluir", + "decision_propose": "Propor", + "decision_none": "Nenhum", + "mapping_decisions": "Decisões de Mapeamento", + "approve": "Aprovar", + "approve_and_next": "Aprovar e Próximo", + "reject": "Rejeitar", + "bulk_selected": "{{count}} selecionado(s)", + "bulk_clear": "Nenhum / limpar", + "bulk_change_map_type": "Alterar tipo de mapeamento", + "bulk_clear_selection": "Limpar seleção", + "bulk_confirm_title": "Aplicar ação em massa?", + "bulk_confirm_body": "{{action}} será aplicada a {{count}} linha(s) selecionada(s).", + "bulk_confirm_map_type": "{{count}} linha(s) selecionada(s) usarão {{mapType}}.", + "bulk_apply": "Aplicar", + "bulk_action_summary": "{{changed}} linha(s) atualizada(s). {{skipped}} ignorada(s).", + "bulk_log_approved": "Aprovado em massa do painel de dataset de entrada à esquerda.", + "bulk_log_rejected": "Rejeitado em massa do painel de dataset de entrada à esquerda.", + "bulk_log_excluded": "Excluído em massa do painel de dataset de entrada à esquerda.", + "bulk_log_cleared": "Limpo em massa do painel de dataset de entrada à esquerda.", + "bulk_log_map_type_changed": "Tipo de mapeamento alterado em massa de {{oldMapType}} para {{newMapType}} do painel de dataset de entrada à esquerda.", + "review": "Revisar", + "recommended_candidates": "Candidatos Recomendados", + "no_candidates_found": "Não foi possível encontrar candidatos para esta linha.", + "available_candidates": "Candidatos Disponíveis", + "unranked_candidates": "Candidatos Não Classificados", + "low_ranked_candidates": "Candidatos de Baixa Classificação", + "ciel_bridge_terminology_candidates": "Candidatos de Terminologia Ponte CIEL", + "fetching": "Buscando...", + "fetch_more": "Buscar Mais", + "unrecognized_algorithm": "Algoritmo não reconhecido", + "source_code": "Código Fonte", + "class": "Classe", + "datatype": "Tipo de Dado", + "mapped_to_column": "Mapeado para a coluna {{columnName}} da planilha de entrada", + "excluded": "Excluído", + "decision_tab_candidates": "Candidatos", + "decision_tab_search": "Busca", + "decision_tab_propose": "Propor", + "decision_tab_discuss": "Discutir", + "view_all": "Todos", + "view_unmapped": "Não Mapeados", + "view_proposed": "Propostos", + "view_readyforreview": "Propostos", + "view_approved": "Aprovados", + "view_reviewed": "Aprovados", + "import_accepted": "Importação Aceita", + "import_failed": "Importação Falhou", + "save_this_project_to_collection": "Salvar conceitos de destino em uma coleção", + "save_to_collection": "Salvar na Coleção", + "concepts_will_be_added_to_this_collection": "{{count}} conceitos serão adicionados à coleção <0>{{collectionName}}", + "click_to_download_import_report": "Clique para baixar relatório de importação", + "approved_target_concepts_only": "Apenas conceitos de destino aprovados", + "all_approved_and_proposed_target_concepts": "Todos os conceitos de destino aprovados e propostos", + "enable_reranker": "Habilitar Re-ranqueador", + "would_you_like_to_cascade": "Você gostaria de também incluir Conceitos e Mapeamentos associados?", + "no_only_include_the_selected_resources": "Não, incluir apenas os recursos selecionados", + "yes_include_associated_mappings_from_same_source": "Sim, incluir Mapeamentos associados da mesma fonte", + "yes_include_associated_mappings_and_target_concepts_from_same_source": "Sim, incluir Mapeamentos associados e Conceitos de destino da mesma fonte", + "yes_apply_openmrs_cascade": "Sim, aplicar cascata compatível com OpenMRS", + "openmrs_cascade_tooltip": "Inclui Mapeamentos associados e Conceitos de destino da mesma fonte, e adiciona recursivamente quaisquer de seus conceitos e mapeamentos associados de resposta e membro de conjunto (ex.: mapeamentos Q-AND-A e CONCEPT-SET)", + "transform_to_extensional_references": "Transformar em referências extensionais", + "transform_to_extensional_tooltip_1": "Marcar esta caixa instruirá o OCL a criar referências separadas para cada conceito ou mapeamento individual (ou seja, referências 'extensionais' ou 'um-para-um').", + "transform_to_extensional_tooltip_2": "Desmarque esta caixa para instruir o OCL a criar menos referências que podem representar múltiplos conceitos e mapeamentos (ou seja, referências 'intensionais' ou 'um-para-muitos'). Veja este <0>vídeo no YouTube para detalhes.", + "sort_by_raw_algo_score": "Pontuação Bruta do Algoritmo", + "sort_by_unified_score": "Pontuação Unificada", + "project_logs": "Histórico do Projeto", + "project_logs_tooltip": "Histórico do Projeto", + "auto_saved_changes": "Alterações salvas automaticamente", + "leave_save_failed": "Suas últimas alterações em {{name}} não foram salvas: {{detail}}", + "saved_to_collection": "Salvo na coleção", + "bridge_terminology_search": "Busca de terminologia Bridge<0>Premium", + "bridge_terminology_search_description": "Incluir mapeamentos na <0>Terminologia de Interface CIEL para identificar candidatos adicionais de alta qualidade. Disponível apenas para repositórios de destino e algoritmos de correspondência compatíveis.", + "scispacy_loinc_search": "Busca ScispaCy LOINC<0>Premium", + "ocl_ai_assistant": "Assistente de IA do OCL", + "ocl_ai_candidates_analysis": "Assistente de IA do OCL: Análise de Candidatos", + "group_by_match_quality": "Qualidade de Correspondência", + "ocl_semantic_algorithm": "Algoritmo Semântico do OCL", + "ocl_search_algorithm": "Algoritmo de Busca do OCL", + "ocl_ciel_bridge_algorithm": "Terminologia Ponte CIEL do OCL", + "ocl_scispacy_loinc_algorithm": "Algoritmo ScispaCy LOINC do OCL", + "scispacy_warming_up": "Serviço de correspondência scispacy do OCL está aquecendo. Tentará novamente automaticamente em 2 minutos.", + "ocl_custom_algorithm": "Algoritmo Personalizado do OCL", + "algorithm": "Algoritmo", + "algorithms": "Algoritmos", + "column_send_to_ai_assistant": "Enviar para Assistente de IA", + "algo_conflicting_id": "ID Conflitante", + "algo_conflicting_name": "Nome Conflitante", + "lookup_configuration": "Configuração de Busca", + "lookup_configuration_url": "URL do Repositório", + "lookup_configuration_token": "Token", + "lookup_configuration_description": "Configure uma Fonte/CodeSystem para operação de busca para buscar definições de candidatos.", + "lookup_concept_404": "Busca de Conceito:{{code}} falhou com 404 (tentativa {{attempt}})", + "ai_prompt_template": "Template de Prompt de IA", + "ai_prompt_template_description": "Escolha o template de prompt usado para recomendações de mapeamento com IA.", + "ai_prompt_template_field": "Template de Prompt", + "ai_prompt_template_default_model": "Modelo padrão", + "reranker_configuration": "Configuração do Re-ranqueador", + "reranker_configuration_description": "Escolha o modelo de re-ranqueador usado para calcular pontuações unificadas para este projeto. O modelo padrão é selecionado automaticamente, ou você pode inserir um nome de modelo personalizado.", + "reranker_configuration_model": "Modelo de re-ranqueador", + "reranker_configuration_custom_option": "Nome de modelo personalizado", + "reranker_configuration_custom_model": "Modelo de re-ranqueador personalizado", + "reranker_configuration_placeholder": "ex.: BAAI/bge-reranker-v2-m3", + "refresh_candidates_tooltip": "Recuperar/Atualizar Candidatos", + "group_candidates": "Agrupar por", + "sort_candidates": "Ordenar", + "created_by_log": "<0>{{created_by}} criou projeto de mapeamento no workspace <1>{{owner}}", + "candidates_metadata": "Metadados de Candidatos", + "full_project_export": "Exportação Completa do Projeto", + "select_an_algo": "Selecionar um algoritmo", + "selected_rows": "Linhas Selecionadas", + "all_including_approved": "Todas (incl. Aprovadas)", + "unmapped_and_proposed": "Não Mapeadas e Propostas", + "rows_to_match": "Linhas para Correspondência", + "out_of": "de", + "retrieve_candidates": "Recuperar Candidatos", + "retrieve_candidates_helper_text": "Seu projeto está configurado para usar os seguintes algoritmos de correspondência:", + "all_candidates": "Todos os Candidatos", + "rows": "linhas", + "finished_running": "Finalizado", + "finished_reranking": "Re-ranqueamento finalizado", + "proposed_successfully": "Proposto com sucesso.", + "assessment": "Avaliação", + "requested_by": "Solicitado por", + "primary": "Primário", + "primary_candidate": "Candidato Primário", + "alternates": "Alternativos", + "alternate_candidates": "Candidatos Alternativos", + "rest": "Restante", + "model": "Modelo", + "bridge_source_url": "URL da Fonte Bridge", + "bridge_source_url_description": "A terminologia de interface para buscar candidatos de correspondência", + "target_canonical_url": "Canônica:", + "canonical_auto_derived": "Auto-derivada", + "canonical_auto_derived_short": "derivada", + "bridge_canonical_short": "Bridge:", + "bridge_canonical_url": "URL Canônica Bridge", + "bridge_canonical_url_description": "URL canônica do code system bridge (deixe em branco para derivar da URL relativa).", + "loading_versions": "Carregando versões...", + "bridge_version_description": "Apenas versões com suporte LLM podem ser selecionadas para correspondência bridge.", + "bridge_version_unavailable": "Nenhuma versão de fonte bridge com suporte LLM está disponível.", + "bridge_version_source_required": "Defina uma URL de fonte bridge antes de escolher uma versão.", + "bridge_version_reset": "Versão do repo bridge alterada para {{version}} porque a versão selecionada anteriormente ({{previous}}) não está mais disponível.", + "not_vectorised": "Não vetorizado", + "advanced_settings": "Configurações avançadas", + "resolution_namespace": "Namespace de Resolução", + "resolution_namespace_description": "Namespace passado para $resolveReference. Quando em branco, usa {{owner}} como padrão. Determina quais entradas do Registro de URL se aplicam ao resolver URLs canônicas.", + "algo_canonical_url": "URL Canônica", + "algo_canonical_url_required": "URL canônica é obrigatória para algoritmos personalizados (ex.: http://loinc.org).", + "algo_canonical_url_invalid": "Insira uma URL completa começando com http:// ou https://", + "algo_canonical_url_description": "URL canônica do code system que este algoritmo corresponde (ex.: http://loinc.org).", + "config_errors_title": "Configuração do projeto está incompleta", + "config_error_missing_canonical": "Algoritmo personalizado \"{{name}}\" está sem uma URL canônica válida.", + "target_repo_required_on_load": "Este projeto está sem um repositório de destino. Configure o repositório de destino para ver candidatos salvos.", + "create_similar": "Criar similar", + "create_similar_name": "Cópia de {{name}}", + "set_ai_assistant_output_language": "Definir idioma de saída do Assistente de IA", + "ai_assistant_output_locale": "Localidade de saída", + "ai_assistant_output_locale_helper": "Escolha da lista, ou digite um código BCP-47 regional (ex.: pt-BR, fr-CA).", + "output_locale": "Localidade de saída", + "use_lexical_variants": "Usar Variantes Lexicais", + "use_lexical_variants_description": "Expandir busca $match para incluir variantes de ortografia em inglês (ex.: color/colour, leukemia/leukaemia) ao corresponder nomes de conceitos.", + "ai_recommendation_failed_retry": "Recomendação de IA falhou — clique para tentar novamente", + "ai_recommendation_running": "Recomendação de IA em execução", + "repo_url": "URL do Repo", + "repo_version": "Versão do Repo" + }, + "app": { + "web_version": "Versão Web", + "api_version": "Versão API" + }, + "unknown_error": "Erro desconhecido", + "announcement": { + "title": "Bem-vindo à prévia pública do OCL Mapper!", + "text": "Experimente agora, antes do lançamento completo que chegará em breve.", + "link_label": "Saiba mais", + "dismiss": "Dispensar" + }, + "quota": { + "title_quota": "Você atingiu sua cota", + "title_cap": "Você atingiu seu limite", + "your_plan": "Seu plano", + "used_of": "{{used}} de {{limit}} usado(s)", + "period_one_time": "Permissão de prévia única", + "request_more_access": "Solicitar mais acesso", + "view_pricing": "Ver preços", + "meter": { + "match_operations": "Operações de correspondência", + "ai_assistant_calls": "Chamadas do Assistente de IA do OCL", + "ai_assistant_change_comments": "Comentários de atualização do Assistente de IA do OCL", + "projects": "Projetos de Mapeamento", + "rows": "Linhas por projeto", + "generic": "Uso" + }, + "consequence": { + "generic": "Alguns recursos estão pausados até que sua permissão seja aumentada.", + "ai_assistant_calls": { + "default": "Recursos que usam o Assistente de IA do OCL estão pausados.", + "auto_match": "Correspondência Automática continuará rodando sem recomendações do Assistente de IA do OCL." + }, + "ai_assistant_change_comments": { + "default": "Você ainda pode escrever o comentário de atualização sozinho, sem um rascunho do Assistente de IA do OCL.", + "tbv3_change_comment": "Você ainda pode escrever o comentário de atualização sozinho, sem um rascunho do Assistente de IA do OCL." + }, + "match_operations": { + "default": "Correspondência está pausada.", + "auto_match": "Você ainda pode revisar, editar e exportar seus projetos, mas a Correspondência Automática está pausada.", + "tbv3_match": "Busca continuará funcionando, mas $match com Busca Semântica do OCL está pausado." + }, + "projects": { + "default": "Seus projetos existentes permanecem abertos; delete um para liberar um espaço para um novo.", + "new_project": "Seus projetos existentes permanecem abertos; delete um para liberar um espaço para um novo." + }, + "rows": { + "default": "Linhas além do seu limite permanecem no projeto mas não são correspondidas.", + "import": "Linhas além do seu limite permanecem no projeto mas não são correspondidas." + } + } + } +} \ No newline at end of file From e5d4d5d6c03f3bc03d4d700d4ad7192cea1e2077 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Fri, 2 Oct 2026 14:23:40 -0300 Subject: [PATCH 2/3] feat(i18n): add Portuguese (Brazil) translation support * Add pt-BR translation files and update configuration to support Portuguese locales --- package-lock.json | 584 +++++++++++------------ src/i18n/config.js | 28 +- src/i18n/locales/pt-BR/translations.json | 34 +- 3 files changed, 331 insertions(+), 315 deletions(-) diff --git a/package-lock.json b/package-lock.json index a582188e..9dc674e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ocl-map", - "version": "1.0.0-beta", + "version": "1.0.11-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ocl-map", - "version": "1.0.0-beta", + "version": "1.0.11-beta", "dependencies": { "@airbrake/browser": "^2.1.9", "@emotion/react": "^11.14.0", @@ -138,9 +138,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz", - "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.9.tgz", + "integrity": "sha512-GmrJTAtiRbNip+eKFqeuSvoHMJhKlH36j8U0yE3Gqn45B+SIO7NvsEiHtsmzkBqV1hLSMqYr41dI1aZLTkJ37g==", "dev": true, "license": "MIT", "dependencies": { @@ -444,9 +444,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -2237,14 +2237,14 @@ } }, "node_modules/@jsonjoy.com/fs-core": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.72.1.tgz", - "integrity": "sha512-HXBM7Pz8oudzzna56Dhs1m7/h0C69/Ye8yNILrPgYpkn5R19v1G246J5WJhKgrGDouUNgudbzSWLHXViYfIKkg==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.80.0.tgz", + "integrity": "sha512-qMKWshnyjbyhm+NbzqGE3w5y1mckFFEMj0aDPU2/JBNh1BzIjVy9esq9lBmRnNVmhMEkxwDzLZ8Gqh5G1P5Dag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "@jsonjoy.com/fs-node-utils": "4.72.1", + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "@jsonjoy.com/fs-node-utils": "4.80.0", "thingies": "^2.5.0" }, "engines": { @@ -2259,15 +2259,15 @@ } }, "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.72.1.tgz", - "integrity": "sha512-dX/ozkcLEGo+4E3J0iTFp7XQ1GfeKfy9e9Ef3bemRydQkmeKAlmBCU2XDVmLUZV3qyRIIazD4PZXWLAHFg6XdQ==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.80.0.tgz", + "integrity": "sha512-ZBEKl7J6dbkRCfmrFV48Re211A/FHqniTUhsWCsaRteNSOqMgkX3qF1UreVgwB9oSPm81JLAwhIi6Lb/NH/PoA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.72.1", - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "@jsonjoy.com/fs-node-utils": "4.72.1", + "@jsonjoy.com/fs-core": "4.80.0", + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "@jsonjoy.com/fs-node-utils": "4.80.0", "thingies": "^2.5.0" }, "engines": { @@ -2282,18 +2282,18 @@ } }, "node_modules/@jsonjoy.com/fs-node": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.72.1.tgz", - "integrity": "sha512-9B2T/EuTIimexiAJbmYwf+RNONJnMuUl2PbUtAG9EQ08aHcTT1htlEtKIdDlb10nnXlM1EPcK09ZaPVMUn1exw==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.80.0.tgz", + "integrity": "sha512-yiBlUfkMMRFFGy8CD/h2zd5rPnrM6bjlF+nx2LRAxNV6hOSiuObQIUEE7m7y2VTMisjxCRtzINH94bFGySWL7g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.72.1", - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "@jsonjoy.com/fs-node-utils": "4.72.1", - "@jsonjoy.com/fs-print": "4.72.1", - "@jsonjoy.com/fs-snapshot": "4.72.1", - "glob-to-regex.js": "^1.0.0", + "@jsonjoy.com/fs-core": "4.80.0", + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "@jsonjoy.com/fs-node-utils": "4.80.0", + "@jsonjoy.com/fs-print": "4.80.0", + "@jsonjoy.com/fs-snapshot": "4.80.0", + "glob-to-regex.js": "^1.3.1", "thingies": "^2.5.0" }, "engines": { @@ -2308,9 +2308,9 @@ } }, "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.72.1.tgz", - "integrity": "sha512-X9WnFVfcA4cd7Bbl30LnNS5bgoe3W66CGu8WLjD8TK2xvNojKstENewC09qeOL6PZOKOM8dREMa7TxcrHPEaFQ==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.80.0.tgz", + "integrity": "sha512-OIOIhqaWiwUySFMny4epIAoviXsyMaQQ63PTc3zH+5HEOvarl5hpUmZIhp2m5+OfyKAh5ylxXnQIgew1OgJDVw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2325,15 +2325,15 @@ } }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.72.1.tgz", - "integrity": "sha512-ujt0rs4HGvAzTZ9586qzUXU7t1kEeSmQaAdmp+DtCvm0/0B3KYgWMLzaRQg+EszI7OoLphoKC5mWlWyf061Pew==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.80.0.tgz", + "integrity": "sha512-ljeaR5xwtX1EyRmB0wvXANUMQZ3mjKcm7z8s2N8D8SLQ04CcAGtUhHFRZQXFb9mhgFyEVMydQGQtSOFS7pcrFQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-fsa": "4.72.1", - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "@jsonjoy.com/fs-node-utils": "4.72.1" + "@jsonjoy.com/fs-fsa": "4.80.0", + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "@jsonjoy.com/fs-node-utils": "4.80.0" }, "engines": { "node": ">=10.0" @@ -2347,14 +2347,14 @@ } }, "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.72.1.tgz", - "integrity": "sha512-JSr3hfbcQM1k1DoyOhMwpxq44HTMF+xg5op0Lve7qT8CKbSOsm9wYXvM7pTF4c3uWx4vL+94WaUSrbqJewo6vQ==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.80.0.tgz", + "integrity": "sha512-xwHeVVi3f+Khg/Fmb8i5qoYVmQ08QznE5TWhQokUmIZjz4KBPzU+zt/+bahBI6G1ghtqajt27lWuAciIxApuzA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "glob-to-regex.js": "^1.0.1" + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "glob-to-regex.js": "^1.3.1" }, "engines": { "node": ">=10.0" @@ -2368,13 +2368,13 @@ } }, "node_modules/@jsonjoy.com/fs-print": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.72.1.tgz", - "integrity": "sha512-LtCgWXKJhx3PoJ4eftVDNdOpekLT12w+lZfL1k9MOj0qXmM5hPA5tjgrHvFSvyGMcSaP1xcsa9Cu2JqUh04E5g==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.80.0.tgz", + "integrity": "sha512-1ocZLJw/m/xlq0moaIHO7HV9nHRVBUvdc2zMzhsJGkFOrqfwWvexfCv5cYCPPLRhP+9p3yunoi4Ep5YhRORC9Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.72.1", + "@jsonjoy.com/fs-node-utils": "4.80.0", "tree-dump": "^1.1.0" }, "engines": { @@ -2389,14 +2389,14 @@ } }, "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.72.1.tgz", - "integrity": "sha512-LQKuH+gAy7PYBvjj8q6WI83Ma8Hkj+LKeVZMKbmezsjEUMdL+LFuYfL7xCWgqqwzide/OQ9sVhHlufDGgA1HlA==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.80.0.tgz", + "integrity": "sha512-3AV23Q1H228KTtJKTUE0nNq8FCtxSvtENOLrEat80wkAJCKHuqQEv8yjhpS8Bei2OEFJAnluGXp9Ri2SWBlROw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.72.1", + "@jsonjoy.com/fs-node-utils": "4.80.0", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, @@ -2901,19 +2901,19 @@ } }, "node_modules/@mui/x-data-grid": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-9.13.0.tgz", - "integrity": "sha512-7eXNgwSMGIwv+KiCuunzr1Rt3bZE1ubuCDukWUcie4XHV54Adn+M0dJBowU4+VVpY2WMF7BEnL8pVdq96csA4g==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-9.14.0.tgz", + "integrity": "sha512-DvQpyg3rkNs4GePo3x8NARoeco/EU7IaFLj4hNoAkuD5sWXMKNWLKERWLZvihVani2ypYYJ56FV4SmbNkFuv/g==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "^0.3.2", "@mui/utils": "^9.4.0", - "@mui/x-internals": "^9.13.0", - "@mui/x-virtualizer": "0.7.1", + "@mui/x-internals": "^9.14.0", + "@mui/x-virtualizer": "0.7.2", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "use-sync-external-store": "^1.6.0" + "use-sync-external-store": "^1.7.0" }, "engines": { "node": ">=14.0.0" @@ -2940,16 +2940,16 @@ } }, "node_modules/@mui/x-internals": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.13.0.tgz", - "integrity": "sha512-TAxYhWSQR351zhUO709ShsGlvbI9RSsh6zIn99tLmkxKav+QFoxAlullzd79dQOxjUsau6spw/hmYcB+zLGipQ==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.14.0.tgz", + "integrity": "sha512-m4XkKIihP+uWvz18BgSOHtwxCBWtE3Qi2X9hZUdEGW5mk50umziYaCLn9B/3cT9qBU7LirEC8agqpWxDSYjaNw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "^0.3.2", "@mui/utils": "^9.4.0", "reselect": "^5.2.0", - "use-sync-external-store": "^1.6.0" + "use-sync-external-store": "^1.7.0" }, "engines": { "node": ">=14.0.0" @@ -2964,15 +2964,15 @@ } }, "node_modules/@mui/x-virtualizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-0.7.1.tgz", - "integrity": "sha512-WNkwOr1g2PrtaEtQzDYVaFEHlPj983UA3JuazBw+pANTlUifaD2IQIfD/5QCVr3dOal5eOByfWecp+IPH2A9zA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-0.7.2.tgz", + "integrity": "sha512-8JYK1KZe7rVMzBRxvEZYt0BYS5zXRDV0HPXqTSwe4TPPuldCjTII7IvlzkSC8yS24+2iDlYo5kBKdTJ8uzfMjg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.7", "@base-ui/utils": "^0.3.2", "@mui/utils": "^9.4.0", - "@mui/x-internals": "^9.13.0" + "@mui/x-internals": "^9.14.0" }, "engines": { "node": ">=14.0.0" @@ -2997,13 +2997,13 @@ } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -3336,15 +3336,15 @@ } }, "node_modules/@peculiar/asn1-cms": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz", - "integrity": "sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.10.0.tgz", + "integrity": "sha512-CkX0H4NCIOMHOU3rh2xXZywinYZ/EnJlaOlJiGI0e5L4XjFqHf4iH30LMbXWChVppdA9ljbanjtzQFOhDNfTWg==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", - "@peculiar/asn1-x509-attr": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", + "@peculiar/asn1-x509-attr": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3353,14 +3353,14 @@ } }, "node_modules/@peculiar/asn1-csr": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.9.4.tgz", - "integrity": "sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.10.0.tgz", + "integrity": "sha512-jTPTr/9rxKM+niQLMF3jiAMb0lWHUhUHIuSOhdGCIfpB4FAQYf9SoiXOgxP8bS/68IB+bj+1OHvVnDVCQfVUZw==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3369,14 +3369,14 @@ } }, "node_modules/@peculiar/asn1-ecc": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.9.4.tgz", - "integrity": "sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.10.0.tgz", + "integrity": "sha512-GFd3iOjFrWX+QWH2R2dO5QSJyyRGv9CIBKtRlGlPNCvb2RvmCbBDexe91MJgV76c69d998Xsa+CvuQ98seoiPg==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3385,16 +3385,16 @@ } }, "node_modules/@peculiar/asn1-pfx": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.9.4.tgz", - "integrity": "sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.10.0.tgz", + "integrity": "sha512-1y3QK9ZH1IPleAMmRoJlPS10eGkAWnULETW8zDFNUK1ffqpG7zmDY+kYBMYQgwlcQZ2iitLm2z2EBP0xzRXpaA==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.9.4", - "@peculiar/asn1-pkcs8": "^2.9.4", - "@peculiar/asn1-rsa": "^2.9.4", - "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-cms": "^2.10.0", + "@peculiar/asn1-pkcs8": "^2.10.0", + "@peculiar/asn1-rsa": "^2.10.0", + "@peculiar/asn1-schema": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3403,14 +3403,14 @@ } }, "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.9.4.tgz", - "integrity": "sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.10.0.tgz", + "integrity": "sha512-Ri+BZT9bnwqlHWmhs7lvWjvJRxKev2hA2+4EbZajgeYWCbR8hyv0znF4DhsFouOhMj2nSDV/iGJ6DMQtwITnCw==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3419,18 +3419,18 @@ } }, "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.9.4.tgz", - "integrity": "sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.10.0.tgz", + "integrity": "sha512-XIXsbDQFezYk6fudczkuvawkRD4GNpISGCqfYhdkJlvcGF/RFknU+0DDJagOaJqBf+PdPzk4J9oMqDGcvfR9HQ==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.9.4", - "@peculiar/asn1-pfx": "^2.9.4", - "@peculiar/asn1-pkcs8": "^2.9.4", - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", - "@peculiar/asn1-x509-attr": "^2.9.4", + "@peculiar/asn1-cms": "^2.10.0", + "@peculiar/asn1-pfx": "^2.10.0", + "@peculiar/asn1-pkcs8": "^2.10.0", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", + "@peculiar/asn1-x509-attr": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3439,14 +3439,14 @@ } }, "node_modules/@peculiar/asn1-rsa": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.9.4.tgz", - "integrity": "sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.10.0.tgz", + "integrity": "sha512-4Jvmwlh3gZAhNZ4/u7JSyLuce9hofOFZ4o3PYKAccCImGnyaT5CMym/ATgvAvqpOYFNW531oPZvJlEBhJy9VfA==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3455,9 +3455,9 @@ } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz", - "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.10.0.tgz", + "integrity": "sha512-GhokD41lV4gQrrLYm3wCkHfBOnJrnhDMgt4XeMW8gzfE1UdJqIuSwsE+ggf82XBjUXRJylcm+KIGQFa4utIVLw==", "dev": true, "license": "MIT", "dependencies": { @@ -3470,13 +3470,13 @@ } }, "node_modules/@peculiar/asn1-x509": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.9.4.tgz", - "integrity": "sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.10.0.tgz", + "integrity": "sha512-ucNVg8+ANveTpMN3fy9lA2alryONdXc2A4cEG2hMniWbvQt+YOZoe8BI80YYNO8FBcuDY1qbDQ4uQGQVraHxGA==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" @@ -3486,14 +3486,14 @@ } }, "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.9.4.tgz", - "integrity": "sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.10.0.tgz", + "integrity": "sha512-/85GtKOKmgvuSJNlaFfwGWNdRSZZ+hpF02NyM01XiCdzpaZONiBltDyfluFPvFx966CR+ZHNSG1jniwpy07oGg==", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.9.4", - "@peculiar/asn1-x509": "^2.9.4", + "@peculiar/asn1-schema": "^2.10.0", + "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" }, @@ -3565,9 +3565,9 @@ "license": "MIT" }, "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.2.tgz", + "integrity": "sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3746,12 +3746,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.2.tgz", - "integrity": "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==", + "version": "26.6.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.4.tgz", + "integrity": "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~8.9.0" } }, "node_modules/@types/parse-json": { @@ -3884,9 +3884,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", "dev": true, "license": "MIT", "dependencies": { @@ -4808,9 +4808,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", - "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==", + "version": "2.11.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.27.tgz", + "integrity": "sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4905,23 +4905,6 @@ "dev": true, "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", - "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz", @@ -4941,9 +4924,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -4965,9 +4948,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", - "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", + "version": "4.29.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", "dev": true, "funding": [ { @@ -4985,11 +4968,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.20", - "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.420", - "node-releases": "^2.0.54", - "update-browserslist-db": "^1.3.2" + "baseline-browser-mapping": "^2.11.26", + "caniuse-lite": "^1.0.30001813", + "electron-to-chromium": "^1.5.439", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -5006,9 +4989,9 @@ "license": "MIT" }, "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", "dev": true, "license": "MIT", "dependencies": { @@ -5179,16 +5162,16 @@ } }, "node_modules/caniuse-db": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001810.tgz", - "integrity": "sha512-NdnrRgMKFjE7vphcIX2WMn0o7rj3fiaTO8PXyMyghJw+FNzRv49KAIrSZ2ImiFlkM2yJPIeX+8n4Tg6dSAbA0Q==", + "version": "1.0.30001814", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001814.tgz", + "integrity": "sha512-y2/m5It24F8Dbu6NXxs3sghP/yqmIaF5LxxQX3W2n2yRl+iXsGAgPQoqHkchc559emJzo0OohhmArrq3tp1L7w==", "dev": true, "license": "CC-BY-4.0" }, "node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "version": "1.0.30001814", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001814.tgz", + "integrity": "sha512-/Uaf1lAzr59XcMpW0o96WoEfr+VXK2OX4U9AgFoiSHsVJ4HppnIFUjtYzsyDH2+tgANaQb2/oxYGwCPapN1FpA==", "dev": true, "funding": [ { @@ -5492,15 +5475,16 @@ } }, "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.2.tgz", + "integrity": "sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==", "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", + "destroy": "1.2.0", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", @@ -5508,6 +5492,10 @@ }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/compression/node_modules/debug": { @@ -6484,9 +6472,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.425", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.425.tgz", - "integrity": "sha512-QvPtl41EUOnuT1HBvMKgxXRIaHNcagBPs50u7VULzhZXaGfqTbZyE16LQsctZ/RQHlGu+FOWeDTR4mY6YbeF1g==", + "version": "1.5.444", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.444.tgz", + "integrity": "sha512-5ss/uJfoDYDHT0lfJzT6FbcskIzROIOPf0BbbFkGcvDzoJU7i//9GDrwwIHQVmIsrAGiF3ihpADBRIsrEFt1rQ==", "dev": true, "license": "ISC" }, @@ -6528,9 +6516,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", "dev": true, "license": "MIT", "dependencies": { @@ -7489,9 +7477,9 @@ } }, "node_modules/express": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", - "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.3.tgz", + "integrity": "sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==", "dev": true, "license": "MIT", "dependencies": { @@ -7514,9 +7502,9 @@ "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", + "path-to-regexp": "~0.1.13", "proxy-addr": "~2.0.7", - "qs": "~6.15.1", + "qs": "~6.16.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -7588,9 +7576,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", - "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "dev": true, "funding": [ { @@ -7816,9 +7804,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.1.tgz", + "integrity": "sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==", "funding": [ { "type": "individual", @@ -8098,9 +8086,9 @@ } }, "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.3.1.tgz", + "integrity": "sha512-zhWhMRsgnOym+1txhUmYJGD6eUsbUdrZv55gCYKuJX8t2p3+M8My23PD09bEIsreGUs5pnSa/idmcfp2/IlqGg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8976,12 +8964,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "hasown": "^2.0.4" }, "engines": { "node": ">= 0.4" @@ -9818,23 +9806,23 @@ } }, "node_modules/memfs": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.72.1.tgz", - "integrity": "sha512-xxt40/OJnv1JEwcHdJJmcA1YXQ2BSXfUVB28psw7MO8A6a/Ar9t3gLkWxzw9zTVrQ7wjIKNokdxDV1RrsAwViw==", + "version": "4.80.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.80.0.tgz", + "integrity": "sha512-N70W2isi44XdGn7uPo9NJ4zRukcdkwSFHlnYx42SWOH/+hzqNc8P7+tVoA2up4z7faHvNi1RSNCFjxoYQ71VPQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.72.1", - "@jsonjoy.com/fs-fsa": "4.72.1", - "@jsonjoy.com/fs-node": "4.72.1", - "@jsonjoy.com/fs-node-builtins": "4.72.1", - "@jsonjoy.com/fs-node-to-fsa": "4.72.1", - "@jsonjoy.com/fs-node-utils": "4.72.1", - "@jsonjoy.com/fs-print": "4.72.1", - "@jsonjoy.com/fs-snapshot": "4.72.1", + "@jsonjoy.com/fs-core": "4.80.0", + "@jsonjoy.com/fs-fsa": "4.80.0", + "@jsonjoy.com/fs-node": "4.80.0", + "@jsonjoy.com/fs-node-builtins": "4.80.0", + "@jsonjoy.com/fs-node-to-fsa": "4.80.0", + "@jsonjoy.com/fs-node-utils": "4.80.0", + "@jsonjoy.com/fs-print": "4.80.0", + "@jsonjoy.com/fs-snapshot": "4.80.0", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", + "glob-to-regex.js": "^1.3.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" @@ -10004,9 +9992,9 @@ } }, "node_modules/minimizer-webpack-plugin": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.1.tgz", - "integrity": "sha512-+dsZEyTcy1lkq41lxdiOqvb26gXbYGgwY+30w37f9PqUVkuEBejBLDotsHOTjuga9xJyGLW2DqzKDUyJ4W/PMQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.12.0.tgz", + "integrity": "sha512-PCN1x1OzFeFB2GlP91s46q7Gz8Jf16Z7M45bzpoqrYZlh12QeY6tYVM5h299wbwy1DxnQ69VFmmh8Hb2Ff8mbw==", "dev": true, "license": "MIT", "dependencies": { @@ -10114,9 +10102,9 @@ "license": "MIT" }, "node_modules/minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.4.0.tgz", - "integrity": "sha512-ZzWFVzFgyRHi/T2Ecxm37lL6J9+hZO0P9L7LCuLxAbC6XWxkvxcaQBCXhQxMGn/Tdt9nD7zIBk0ELwhMQ3UEDg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "dependencies": { @@ -10169,9 +10157,9 @@ } }, "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.31.0.tgz", + "integrity": "sha512-0acOTfMiWOheYS4eoWb80yYMb/JLvVv9SHbs2PehaDzfUG0Bw855SKyk0IKTnPGa5+U2bmi3W68l1+sGLX/pvw==", "license": "MIT", "engines": { "node": "*" @@ -10296,9 +10284,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.55", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", - "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", + "version": "2.0.57", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz", + "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==", "dev": true, "license": "MIT", "engines": { @@ -10890,13 +10878,16 @@ } }, "node_modules/pkijs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.1.tgz", + "integrity": "sha512-Oo/NZcSWccq8KyoG7gLE9fnltgHns+pNCjCAp/WmjsUySi+sX7y4z4Xqu4fVb42CDHzRPl33fjzT15V1wvcyhA==", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "website" + ], "dependencies": { - "@noble/hashes": "1.4.0", + "@noble/hashes": "1.8.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", @@ -11690,9 +11681,9 @@ } }, "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.9.tgz", + "integrity": "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==", "dev": true, "license": "MIT", "bin": { @@ -11799,9 +11790,9 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11810,6 +11801,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/proxy-addr/node_modules/ipaddr.js": { @@ -11904,9 +11899,9 @@ } }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12007,9 +12002,9 @@ } }, "node_modules/react-draggable": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.1.tgz", - "integrity": "sha512-wa3tzfFnYt3yaZLuyU58fl1TNunfWfBekDgWhZA1+gb2jnp42wZ0ymuopR6M5kqDYmm4hKmzGlcKWjZf3Zb6RQ==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.7.2.tgz", + "integrity": "sha512-pmqDx72EqhMGoJe/x42ZO2wJ9TIz7qJ5OPnFu6lVWWznEuJumlSjR+J0V4tNyDFhUo6dVvv56FeiTqN+arTgnw==", "license": "MIT", "dependencies": { "clsx": "^2.1.1", @@ -12251,9 +12246,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.3.0.tgz", + "integrity": "sha512-9ns8odR8e9q3otKeHj3DE80jZYKg6zVeZKE+zQmRKXFoVUcuiTGeO6iusDhPRoIQQPVPRvH+SfBhrTud4eczuw==", "dev": true, "license": "MIT", "dependencies": { @@ -12292,14 +12287,14 @@ } }, "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.5.2.tgz", + "integrity": "sha512-zkmVH92DlzjSFc4xKGZp/2BXIFrDIdBQBC8gUXKCsMgKYb1bkCkxfSuoW1werDjaTEMTbULkHtKFHe1L+Abnaw==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", + "regenerate-unicode-properties": "^10.3.0", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", @@ -12317,9 +12312,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", - "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", + "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12637,9 +12632,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.104.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.104.0.tgz", - "integrity": "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w==", + "version": "1.105.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.105.1.tgz", + "integrity": "sha512-1CnAWPyrrnVQzXGB/DUep1vYCKCm1CIBr+YxjjiW6wk9qtzemnGP4qicH56T2F9S4Hjtv/Ne3jDz8JqfdDU4oA==", "dev": true, "license": "MIT", "dependencies": { @@ -12999,9 +12994,9 @@ } }, "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.11.0.tgz", + "integrity": "sha512-JdxDPD0DBTyu08pq0kPC0xSNet/qsU07qT6IsX1AS8oO2ICNRY4ldNa8OAI6PuwAH8tG3lxEhbqmyp4Dw4036g==", "dev": true, "license": "MIT", "engines": { @@ -13139,9 +13134,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13966,19 +13961,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", + "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", + "call-bind": "^1.0.9", + "for-each": "^0.3.5", "gopd": "^1.2.0", - "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -14035,9 +14029,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -14129,9 +14123,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", - "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -14283,9 +14277,9 @@ } }, "node_modules/webpack": { - "version": "5.110.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.3.tgz", - "integrity": "sha512-GuizBzRvo9YPpyoNMf3ag7AzxbaW85qrRSqTha345KyJbAFPt3/cMzBM0h+RWg7SK/7DdzRLINP3LvQ0hvr4hg==", + "version": "5.111.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.111.1.tgz", + "integrity": "sha512-cNypaz0RP+S4cvQVi1M/3bRUkvNP0xZpL0TjFx+c6jg64VbxD+2weWDgY9UnjRI6dhZgtaj8DU76GGFcJ79xPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14294,17 +14288,15 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.24.4", + "enhanced-resolve": "^5.25.0", "es-module-lexer": "^2.1.0", "events": "^3.2.0", "graceful-fs": "^4.2.11", "mime-db": "^1.54.0", "minimizer-webpack-plugin": "^5.7.0", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", + "schema-utils": "^4.5.0", "tapable": "^2.3.0", "watchpack": "^2.5.2", "webpack-sources": "^3.5.1" @@ -14476,9 +14468,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.4.0.tgz", - "integrity": "sha512-ZzWFVzFgyRHi/T2Ecxm37lL6J9+hZO0P9L7LCuLxAbC6XWxkvxcaQBCXhQxMGn/Tdt9nD7zIBk0ELwhMQ3UEDg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "dependencies": { @@ -14655,9 +14647,9 @@ } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.4.0.tgz", - "integrity": "sha512-ZzWFVzFgyRHi/T2Ecxm37lL6J9+hZO0P9L7LCuLxAbC6XWxkvxcaQBCXhQxMGn/Tdt9nD7zIBk0ELwhMQ3UEDg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "dependencies": { @@ -14758,9 +14750,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.4.0.tgz", - "integrity": "sha512-ZzWFVzFgyRHi/T2Ecxm37lL6J9+hZO0P9L7LCuLxAbC6XWxkvxcaQBCXhQxMGn/Tdt9nD7zIBk0ELwhMQ3UEDg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "dependencies": { @@ -14778,9 +14770,9 @@ } }, "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true, "license": "MIT", "engines": { @@ -14939,9 +14931,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", - "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15003,9 +14995,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", - "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", "dev": true, "license": "MIT", "engines": { diff --git a/src/i18n/config.js b/src/i18n/config.js index a3ff94e7..6541c4df 100644 --- a/src/i18n/config.js +++ b/src/i18n/config.js @@ -5,9 +5,32 @@ import es from './locales/es/translations.json' import zh from './locales/zh/translations.json' import ptBR from './locales/pt-BR/translations.json' +const LANGUAGE_STORAGE_KEY = 'ocl.language' +const SUPPORTED_LANGUAGES = ['en', 'es', 'zh', 'pt-BR'] + +const getInitialLanguage = () => { + if(typeof window === 'undefined') + return 'en' + + try { + const storedLanguage = window.localStorage.getItem(LANGUAGE_STORAGE_KEY) + return SUPPORTED_LANGUAGES.includes(storedLanguage) ? storedLanguage : 'en' + } catch(_) { + return 'en' + } +} + +const persistLanguage = language => { + try { + window.localStorage.setItem(LANGUAGE_STORAGE_KEY, language) + } catch(_) { + // Keep i18n usable when browser storage is unavailable. + } +} + i18n.use(initReactI18next).init({ fallbackLng: 'en', - lng: 'en', + lng: getInitialLanguage(), resources: { en: { translations: en @@ -27,6 +50,7 @@ i18n.use(initReactI18next).init({ interpolation: { escapeValue: false } }); -i18n.languages = ['en', 'es', 'zh', 'pt-BR']; +i18n.languages = SUPPORTED_LANGUAGES; +i18n.on('languageChanged', persistLanguage) export default i18n; diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 3ead55b9..880f5ed8 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -220,8 +220,8 @@ "type": "Tipo", "map_types": "Tipos de Mapeamento", "map_type": "Tipo de mapeamento", - "from_concept_sources": "Fontes do Conceito de Origem", - "to_concept_sources": "Fontes do Conceito de Destino", + "from_concept_sources": "Sources do Conceito de Origem", + "to_concept_sources": "Sources do Conceito de Destino", "relationship": "Relacionamento", "code": "Código", "inverse_mappings": "Mapeamentos Inversos", @@ -232,7 +232,7 @@ "to_concept_not_defined": "Conceito de destino não está definido no OCL", "to_concept_defined": "Conceito de destino está definido no OCL", "sort_weight": "Peso de Ordenação", - "fromAndTargetSource": "Origem e fonte de destino", + "fromAndTargetSource": "Origem e Source de destino", "has_child": "Tem filho", "has_parent": "Tem pai" }, @@ -244,13 +244,13 @@ "repos": "Repositórios", "repo": "Repositório", "repo_type": "Tipo de Repositório", - "source_type": "Tipo de Fonte", + "source_type": "Tipo de Source", "collection_type": "Tipo de Coleção", "collection": "Coleção", "manage": "Gerenciar Repositório", "repo_id": "ID do Repositório", "add_concept": "Adicionar Conceito", - "source": "Fonte", + "source": "Source", "release_status": "Status de Publicação", "compare_versions": "Comparar versões", "compare": "Comparar", @@ -291,7 +291,7 @@ "property": "Propriedade", "properties_filters_subheader": "Propriedades do Repositório", "additional_metadata_filters_subheader": "Metadados Adicionais", - "suggested_sources": "Fontes Sugeridas" + "suggested_sources": "Sources Sugeridos" }, "org": { "my": "Minhas Organizações", @@ -426,8 +426,8 @@ "ai_effective_locales": "IA receberá nomes em: {{locales}}", "ai_all_locales": "IA receberá nomes em: todas as localidades (sem filtro)", "default_filter": "Filtro Padrão", - "matching_algorithm": "Algoritmo de Correspondência", - "matching_algorithm_description": "Selecione um algoritmo de correspondência. <0>Saiba mais", + "matching_algorithm": "Inteligência de mapeamento", + "matching_algorithm_description": "Selecione um ou mais algoritmos de mapeamento. <0>Saiba mais", "custom_match_api": "API de Correspondência Personalizada", "custom_match_api_description": "Configurar URL e Token da API de Correspondência Externa", "match_api_url": "URL da API de Correspondência", @@ -483,7 +483,7 @@ "map_target": "Alvo do Mapeamento", "propose": "Propor", "proposal_note": "Nota da proposta", - "target_source": "Fonte de Destino", + "target_source": "Source de Destino", "concept_id": "ID do Conceito", "map_type": "Tipo de Mapeamento", "attribute_name": "Nome do Atributo", @@ -492,7 +492,7 @@ "no_results": "Nenhum resultado", "start_typing": "Comece a digitar...", "type_atleast_characters": "Digite pelo menos {{count}} caracteres para buscar", - "source": "Fonte", + "source": "Source", "show_more": "Mostrar mais", "ai_recommended": "Recomendado por IA", "ai_alternate": "Sugestão de Candidato Alternativo por IA", @@ -650,10 +650,10 @@ "enable_reranker": "Habilitar Re-ranqueador", "would_you_like_to_cascade": "Você gostaria de também incluir Conceitos e Mapeamentos associados?", "no_only_include_the_selected_resources": "Não, incluir apenas os recursos selecionados", - "yes_include_associated_mappings_from_same_source": "Sim, incluir Mapeamentos associados da mesma fonte", - "yes_include_associated_mappings_and_target_concepts_from_same_source": "Sim, incluir Mapeamentos associados e Conceitos de destino da mesma fonte", + "yes_include_associated_mappings_from_same_source": "Sim, incluir Mapeamentos associados do mesmo Source", + "yes_include_associated_mappings_and_target_concepts_from_same_source": "Sim, incluir Mapeamentos associados e Conceitos de destino do mesmo Source", "yes_apply_openmrs_cascade": "Sim, aplicar cascata compatível com OpenMRS", - "openmrs_cascade_tooltip": "Inclui Mapeamentos associados e Conceitos de destino da mesma fonte, e adiciona recursivamente quaisquer de seus conceitos e mapeamentos associados de resposta e membro de conjunto (ex.: mapeamentos Q-AND-A e CONCEPT-SET)", + "openmrs_cascade_tooltip": "Inclui Mapeamentos associados e Conceitos de destino do mesmo Source, e adiciona recursivamente quaisquer de seus conceitos e mapeamentos associados de resposta e membro de conjunto (ex.: mapeamentos Q-AND-A e CONCEPT-SET)", "transform_to_extensional_references": "Transformar em referências extensionais", "transform_to_extensional_tooltip_1": "Marcar esta caixa instruirá o OCL a criar referências separadas para cada conceito ou mapeamento individual (ou seja, referências 'extensionais' ou 'um-para-um').", "transform_to_extensional_tooltip_2": "Desmarque esta caixa para instruir o OCL a criar menos referências que podem representar múltiplos conceitos e mapeamentos (ou seja, referências 'intensionais' ou 'um-para-muitos'). Veja este <0>vídeo no YouTube para detalhes.", @@ -684,7 +684,7 @@ "lookup_configuration": "Configuração de Busca", "lookup_configuration_url": "URL do Repositório", "lookup_configuration_token": "Token", - "lookup_configuration_description": "Configure uma Fonte/CodeSystem para operação de busca para buscar definições de candidatos.", + "lookup_configuration_description": "Configure um Source/CodeSystem para operação de busca para buscar definições de candidatos.", "lookup_concept_404": "Busca de Conceito:{{code}} falhou com 404 (tentativa {{attempt}})", "ai_prompt_template": "Template de Prompt de IA", "ai_prompt_template_description": "Escolha o template de prompt usado para recomendações de mapeamento com IA.", @@ -723,7 +723,7 @@ "alternate_candidates": "Candidatos Alternativos", "rest": "Restante", "model": "Modelo", - "bridge_source_url": "URL da Fonte Bridge", + "bridge_source_url": "URL do Source Bridge", "bridge_source_url_description": "A terminologia de interface para buscar candidatos de correspondência", "target_canonical_url": "Canônica:", "canonical_auto_derived": "Auto-derivada", @@ -733,8 +733,8 @@ "bridge_canonical_url_description": "URL canônica do code system bridge (deixe em branco para derivar da URL relativa).", "loading_versions": "Carregando versões...", "bridge_version_description": "Apenas versões com suporte LLM podem ser selecionadas para correspondência bridge.", - "bridge_version_unavailable": "Nenhuma versão de fonte bridge com suporte LLM está disponível.", - "bridge_version_source_required": "Defina uma URL de fonte bridge antes de escolher uma versão.", + "bridge_version_unavailable": "Nenhuma versão de Source bridge com suporte LLM está disponível.", + "bridge_version_source_required": "Defina uma URL de Source bridge antes de escolher uma versão.", "bridge_version_reset": "Versão do repo bridge alterada para {{version}} porque a versão selecionada anteriormente ({{previous}}) não está mais disponível.", "not_vectorised": "Não vetorizado", "advanced_settings": "Configurações avançadas", From b05133c6d699d62a2840b3260f2dfa1248413274 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Fri, 2 Oct 2026 21:51:29 -0300 Subject: [PATCH 3/3] feat(i18n): support recent activity translations --- src/i18n/locales/en/translations.json | 4 +++- src/i18n/locales/es/translations.json | 4 +++- src/i18n/locales/pt-BR/translations.json | 4 +++- src/i18n/locales/zh/translations.json | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 88556175..66bd1f88 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -338,7 +338,9 @@ "about_me": "About me", "about_me_description": "Create an introduction for visiting your profile (200 characters).", "user_has_not_created_public_repos_suffix": "has not created any public repositories", - "recent_activity": "recent activity" + "recent_activity": "recent activity", + "own_recent_activity": "Your recent activity", + "recent_activity_of": "{{name}}'s recent activity" }, "search": { "filters": "Filters", diff --git a/src/i18n/locales/es/translations.json b/src/i18n/locales/es/translations.json index 4c74e7c2..3eb20443 100644 --- a/src/i18n/locales/es/translations.json +++ b/src/i18n/locales/es/translations.json @@ -330,7 +330,9 @@ "about_me": "Acerca de mí", "about_me_description": "Crea una introducción para quienes visitan tu perfil (200 caracteres).", "user_has_not_created_public_repos_suffix": "no ha creado repositorios públicos", - "recent_activity": "actividad reciente" + "recent_activity": "actividad reciente", + "own_recent_activity": "Tu actividad reciente", + "recent_activity_of": "Actividad reciente de {{name}}" }, "search": { "filters": "Filtros", diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 880f5ed8..c9a27544 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -338,7 +338,9 @@ "about_me": "Sobre mim", "about_me_description": "Crie uma introdução para quem visita seu perfil (200 caracteres).", "user_has_not_created_public_repos_suffix": "não criou nenhum repositório público", - "recent_activity": "atividade recente" + "recent_activity": "atividade recente", + "own_recent_activity": "Sua atividade recente", + "recent_activity_of": "Atividade recente de {{name}}" }, "search": { "filters": "Filtros", diff --git a/src/i18n/locales/zh/translations.json b/src/i18n/locales/zh/translations.json index 8552a31a..9fb0ea25 100644 --- a/src/i18n/locales/zh/translations.json +++ b/src/i18n/locales/zh/translations.json @@ -338,7 +338,9 @@ "about_me_description": "创建用于他人访问您的个人资料时阅读的简介(200 个字符)。", "user_has_not_created_public_repos_suffix": "尚未创建任何公开的存储库", "recent_activity": "最近的活动", - "my_mapping_projects": "我的映射项目" + "my_mapping_projects": "我的映射项目", + "own_recent_activity": "您的近期活动", + "recent_activity_of": "{{name}} 的近期活动" }, "search": { "filters": "筛选项",