From 30ea6a4b72d74edd761980167efec6da78f23b48 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Thu, 1 Oct 2026 20:53:43 -0300 Subject: [PATCH 1/6] feat: Add Portuguese (Brazil) translation for OCL Web - 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 | 1141 ++++++++++++++++++++++ 3 files changed, 1148 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 005a84b2d..8fe00cb37 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -2,7 +2,8 @@ import packageJson from '../../package.json'; export const LANGUAGES = [ {locale: 'en', name: 'English'}, - {locale: 'es', name: "Español"} + {locale: 'es', name: "Español"}, + {locale: 'pt-BR', name: "Português (Brasil)"} ] diff --git a/src/i18n/config.js b/src/i18n/config.js index d84ca3348..b2cda1d72 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,12 +17,15 @@ i18n.use(initReactI18next).init({ }, zh: { translations: zh + }, + 'pt-BR': { + translations: ptBR } }, ns: ['translations'], defaultNS: 'translations' }); -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 000000000..1cec16d5c --- /dev/null +++ b/src/i18n/locales/pt-BR/translations.json @@ -0,0 +1,1141 @@ +{ + "common": { + "error_details": "Detalhes do erro", + "or": "ou", + "of": "de", + "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", + "apply": "Aplicar", + "exclude": "Excluir", + "include": "Incluir", + "excluded": "excluído", + "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", + "read_more": "Ler mais", + "read_less": "Ler menos", + "refresh": "atualizar", + "reset": "Redefinir", + "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", + "retire": "Aposentar", + "unretire": "Reativar", + "id": "ID", + "uid": "UID", + "name": "Nome", + "full_name": "Nome completo", + "description": "Descrição", + "true": "Verdadeiro", + "false": "Falso", + "update": "Atualizar", + "create": "Criar", + "created": "Criado", + "create_from_ocl_url": "Criar a partir de URL do OCL", + "created_on": "Criado em", + "created_by": "Criado por", + "version": "Versão", + "versions": "Versões", + "summary": "Resumo", + "about": "Sobre", + "about_page": "Página Sobre", + "view_all_attributes": "Ver todos os atributos", + "view_attributes": "Ver atributos", + "all": "Todos", + "actions": "Ações", + "selected": "selecionados", + "eligible": "elegíveis", + "skipped": "ignorados", + "status": "Status", + "metadata": "Metadados", + "details": "Detalhes", + "copied_to_clipboard": "Copiado para a área de transferência", + "navigate": "Navegar", + "select": "Selecionar", + "search": "Buscar", + "match": "Correspondência", + "content_summary": "Resumo do conteúdo", + "for": "para", + "please": "Por favor", + "save": "Salvar", + "manage": "Gerenciar", + "overview": "Visão geral", + "quick_links": "Links rápidos", + "resolve": "Resolver", + "result": "Resultado", + "settings": "Configurações", + "add": "Adicionar", + "remove": "Remover", + "cancel": "Cancelar", + "upload": "Carregar", + "logo": "Logotipo", + "custom_attributes": "Atributos personalizados", + "public": "Público", + "private": "Privado", + "close": "Fechar", + "compare": "Comparar", + "something_went_wrong": "Algo deu errado", + "no_results": "Nenhum resultado", + "json_helper_text": "Formato JSON ex.: {\"chave\": \"valor\"}", + "format_json": "Formatar JSON", + "content": "Conteúdo", + "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", + "to_concepts_in": "para conceitos em", + "json": "JSON", + "draft": "Rascunho", + "released": "Publicado", + "highlights": "Destaques", + "click_to_copy": "Clique para copiar", + "submit": "Enviar", + "external_id": "ID externo", + "access_level": "Nível de acesso", + "history": "Histórico", + "from": "De", + "target": "Destino", + "properties": "Propriedades", + "view_raw": "Ver bruto", + "custom": "Personalizado", + "delete_label": "Excluir", + "edit": "Editar", + "visibility": "Visibilidade", + "website": "Site", + "your_url_will_be": "Sua URL será", + "proceed": "Prosseguir", + "loading": "Carregando...", + "none": "Nenhum", + "default": "Padrão", + "processing": "Processando", + "processed": "Processado", + "load_more": "Carregar mais", + "generate_with_ai": "Gerar com IA", + "release": "Publicar", + "unrelease": "Despublicar", + "reason": "Motivo", + "success_update": "Atualizado com sucesso", + "generic_error": "Algo deu errado.", + "company": "Empresa", + "location": "Localização", + "hierarchy": "Hierarquia", + "change": "Alteração", + "type_of_change": "Tipo de alteração", + "toggle_attributes": "Alternar atributos", + "delete": { + "warning": "Coisas ruins inesperadas acontecerão se você não ler isto!", + "title": "Excluir {{resourceType}}: {{resourceId}}", + "message": "Esta ação <0>não pode ser desfeita! Isso excluirá o {{resourceType}} inteiro e todos os seus {{relationship}} {{associationsLabel}} (se houver).", + "confirmation_title": "Tem certeza de que deseja excluir permanentemente este {{resourceType}}?", + "confirmation_message": "Digite <0>{{resourceId}} para confirmar.", + "confirmation_button_label": "Entendo as consequências, excluir este {{resourceType}}" + }, + "checking_auth": "Verificando autenticação...", + "using_ocl_semantic_search": "usando Busca Semântica do OCL", + "run_match": "Executar $match usando Busca Semântica do OCL", + "view_resource_version": "Ver versão do recurso", + "copy_api_url": "Copiar URL da API", + "api_url": "URL da API", + "copy_standard_checksum": "Copiar checksum padrão", + "copy_smart_checksum": "Copiar checksum inteligente", + "committed": "confirmado", + "results": "Resultados", + "suggested": "Sugeridos", + "rest": "Restante", + "click_here": "clique aqui", + "classic_termbrowser": "Ver no TBv2", + "back_to_classic_termbrowser": "Voltar para o TermBrowser clássico", + "already_exists": "Já existe", + "comment": "Comentário", + "update_comment": "Comentário de atualização", + "undo": "Desfazer", + "advanced": "Avançado", + "type_to_search": "Digite para buscar" + }, + "errors": { + "404": "Desculpe, sua página não pôde ser encontrada.", + "401": "Login é necessário", + "403": "Acesso a esta página não é autorizado", + "mandatory_field": "Este campo não pode ficar em branco", + "already_queued": "Já na fila", + "invalid_json": "Por favor, insira JSON válido", + "generic": "Algo falhou, por favor tente novamente mais tarde.", + "network_error": "Erro de rede", + "concept_404": "Desculpe, este conceito não pôde ser encontrado.", + "mapping_404": "Desculpe, este mapeamento não pôde ser encontrado.", + "reference_404": "Desculpe, esta referência não pôde ser encontrada." + }, + "success": { + "queued": "Enfileirado com sucesso" + }, + "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", + "pin": "Fixar", + "unpin": "Remover fixação", + "max_pins_reached": "Máximo de 4 itens podem ser 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": { + "concept": "Conceito", + "concepts": "Conceitos", + "retired_concepts": "Conceitos Aposentados", + "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", + "datatype_metadata": { + "numeric_header": "Detalhes numéricos", + "text_header": "Detalhes de texto", + "units": "Unidades de medida", + "allow_decimal": "Permitir decimais", + "low_absolute": "Mínimo absoluto", + "hi_absolute": "Máximo absoluto", + "low_critical": "Crítico baixo", + "hi_critical": "Crítico alto", + "low_normal": "Normal baixo", + "hi_normal": "Normal alto", + "text_format": "Formato de texto", + "plain": "Texto simples", + "structured": "Estruturado (ex.: JSON)" + }, + "locale": "Localidade", + "name": "Nome", + "description": "Descrição", + "type": "Tipo", + "locale_preferred": "Preferido", + "id_auto_assign": "ID do conceito será atribuído automaticamente", + "id_auto_assign_override": "para substituir com entrada manual", + "concept_details": { + "header": "Detalhes do conceito" + }, + "names": { + "header": "Nome e sinônimos" + }, + "descriptions": { + "header": "Descrições" + }, + "parent_concepts_header": "Conceitos pai", + "parent_concepts": "Conceitos Pai", + "parent_concepts_placeholder": "Buscar conceitos nesta fonte", + "parent_concepts_help": "Conceitos sob os quais este conceito se situa na hierarquia. Uma URL completa de conceito também pode ser colada." + }, + "edit_concept": "Editar Conceito", + "ai_assistant_not_configured": "Assistente de IA não está configurado para este ambiente.", + "try_again_in_a_moment": "Tente novamente em um momento.", + "make_change_before_generating": "Faça uma alteração no conceito antes de gerar um comentário.", + "generate_comment_aria": "Gerar comentário com IA", + "select_two_versions_to_compare": "Selecione 2 versões para comparar", + "success_create": "Conceito criado com sucesso", + "success_update": "Conceito atualizado com sucesso", + "error_create": "Não foi possível criar o conceito", + "error_update": "Não foi possível atualizar o conceito", + "view_in_source": "Ver conceito em sua fonte" + }, + "mapping": { + "mapping": "Mapeamento", + "mappings": "Mapeamentos", + "same_as_mappings": "Mapeamentos (SAME-AS)", + "retired_mappings": "Mapeamentos Aposentados", + "fromConcept": "Conceito de origem", + "toConcept": "Conceito de destino", + "fromConceptName": "Nome do conceito de origem", + "toConceptName": "Nome do conceito de destino", + "target_source": "Fonte 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", + "edit_mapping": "Editar Mapeamento", + "from_source_url": "URL da Fonte de Origem", + "from_source_version": "Versão da Fonte de Origem", + "from_concept_url": "URL do Conceito de Origem", + "from_concept_name": "Nome do Conceito de Origem", + "from_concept_code": "Código do Conceito de Origem", + "to_source_url": "URL da Fonte de Destino", + "to_source_version": "Versão da Fonte de Destino", + "from_source": "Fonte de Origem", + "to_source": "Fonte de Destino", + "from_concept": "Conceito de Origem", + "to_concept": "Conceito de Destino", + "to_concept_url": "URL do Conceito de Destino", + "to_concept_name": "Nome do Conceito de Destino", + "to_concept_code": "Código do Conceito de Destino", + "concept_ref_required": "Forneça uma URL de Conceito, ou tanto o Código do Conceito quanto o Nome do Conceito.", + "concept_required": "Por favor, selecione um conceito.", + "source_required": "Por favor, selecione uma fonte.", + "success_create": "Mapeamento criado com sucesso", + "success_update": "Mapeamento atualizado com sucesso", + "error_create": "Não foi possível criar o mapeamento", + "error_update": "Não foi possível atualizar o mapeamento", + "include_retired": "Incluir Aposentados", + "associations_info": "A seção Associações lista associações de hierarquia e mapeamento para este conceito.", + "has_child": "Tem filho", + "has_parent": "Tem pai", + "open_mapping_details": "Abrir Detalhes do Mapeamento", + "open_from_concept": "Abrir Conceito de Origem", + "open_to_concept": "Abrir Conceito de Destino", + "compare_concepts": "Comparar Conceitos", + "retire_mapping": "Aposentar mapeamento", + "reactivate_mapping": "Reativar mapeamento", + "success_retired": "Mapeamento aposentado", + "success_unretired": "Mapeamento reativado", + "add_new_mapping": "Adicionar Novo Mapeamento", + "add_a_mapping": "Adicionar um mapeamento", + "add_new_map_type_mapping": "Adicionar novo mapeamento {{mapType}}", + "relationship_type": "Tipo de Relacionamento", + "assign_sort_weight": "Atribuir Peso de Ordenação", + "clear_sort_weight": "Limpar Peso de Ordenação", + "custom_sorting_applied": "Ordenação personalizada foi aplicada", + "custom_sorting_applied_partial": "Ordenação personalizada foi aplicada a {{total}} mapeamentos.", + "no_sort_weight": "Mapeamento não tem peso de ordenação aplicado", + "sort_changes_warning": "{{total}} alteração(ões) feita(s). Salvar criará uma nova Versão de Mapeamento.", + "sort_success": "Mapeamentos atualizados com sucesso.", + "form": { + "id": "ID do Mapeamento", + "mapping_details": { + "header": "Detalhes do Mapeamento" + }, + "from_concept": { + "header": "Conceito de Origem" + }, + "to_concept": { + "header": "Conceito de Destino" + } + }, + "create_mapping": "Criar Mapeamento", + "view_in_source": "Ver mapeamento em sua fonte" + }, + "reference": { + "expression": "Expressão", + "references": "Referências", + "reference": "Referência", + "source": "Fonte", + "sources": "Fontes", + "type": "Tipo de Referência", + "last_resolved_at": "Última resolução em", + "details": "Detalhes da Referência", + "expansion_results": "Resultados da Expansão", + "concepts_and_mappings": "Conceitos e Mapeamentos resolvidos por esta referência", + "copy_expression": "Copiar Expressão da Referência", + "copy_url": "Copiar URL da Referência", + "reference_type": "Tipo de Ref", + "exclude": "Excluir", + "intensional": "Intensional", + "extensional": "Extensional", + "cascade": "Cascata", + "source_mappings": "Mapeamentos da Fonte", + "all_source_concepts_and_mappings": "Todos os Conceitos e Mapeamentos da Fonte", + "versioned_repo": "Versionado (Repo)", + "versioned_resource": "Versionado (Recurso)", + "resolved_repo": "Repo Resolvido", + "group_by_source": "Agrupar por Fonte", + "ungrouped": "Não agrupados", + "mixed": "Misto", + "source_to_concepts": "Fonte para Conceitos", + "source_to_mappings": "Fonte para Mapeamentos", + "raw": "Bruto", + "translation": "Tradução", + "transform": "Transformar", + "remove_selected": "Remover Selecionados", + "remove_confirm_title": "Remover {{count}} {{reference}}?", + "remove_confirm_body": "Isso removerá {{summary}} da expansão da coleção.", + "remove_confirm_body_selected": "Isso removerá a(s) referência(s) selecionada(s) da expansão da coleção.", + "not_available_in_version": "Não disponível em versões salvas. Mude para HEAD para editar.", + "remove_success": "Referências removidas com sucesso.", + "actions": "Ações", + "transform_to_non_versioned": "Transformar em referência não versionada", + "transform_confirm_title": "Transformar {{count}} referência(s)?", + "transform_confirm_body": "Isso adicionará primeiro referências de substituição não versionadas, então removerá as referências fixadas antigas após a adição ter sucesso.", + "transform_references": "Transformar referências", + "transform_success": "{{count}} referência(s) transformada(s) com sucesso.", + "transform_partial_success": "{{transformed}} referência(s) transformada(s). {{failed}} referência(s) não puderam ser transformadas e foram deixadas inalteradas.", + "transform_no_eligible": "Nenhuma das referências selecionadas pode ser transformada em referências não versionadas.", + "transform_no_references_changed": "Nenhuma referência foi transformada.", + "transform_delete_failed": "{{count}} referência(s) não versionada(s) foram adicionadas, mas as referências fixadas antigas não puderam ser removidas. Atualize e revise a lista de referências para duplicatas.", + "already_non_versioned": "Já não versionado", + "unsupported_transform": "Não suportado", + "new_expression": "Nova Expressão", + "brought_in_by": "Trazido por", + "brought_in_by_tooltip": "Este {{resource}} aparece nesta expansão de coleção como resultado destas referências.", + "no_references_found": "Nenhuma referência encontrada.", + "remove_from_collection": "Remover da coleção", + "remove_concept_confirm_title": "Remover conceito da coleção?", + "remove_concept_confirm_body": "Este conceito é trazido pela(s) seguinte(s) referência(s). Removê-lo excluirá essas referências da coleção.", + "remove_mapping_confirm_title": "Remover mapeamento da coleção?", + "remove_mapping_confirm_body": "Este mapeamento é trazido pela(s) seguinte(s) referência(s). Removê-lo excluirá essas referências da coleção.", + "advanced": "Avançado", + "hide_advanced": "Ocultar avançado", + "transform_tooltip": "Converte a referência em referência(s) extensional(is). Referências para conceitos ou mapeamentos resolvidos serão armazenadas como referências extensional(is) individuais em vez de referência(s) intensional(is).", + "add_references": "Adicionar Referências", + "add_reference": "Adicionar Referência", + "source_or_collection": "Fonte / Coleção", + "search_sources_collections": "Buscar fontes e coleções...", + "group_collections": "Coleções", + "group_sources": "Fontes", + "type_to_search": "Digite pelo menos 2 caracteres para buscar", + "open_repo": "Abrir {{name}}", + "resolves_to": "Resolve para {{version}}.", + "latest_released": "última versão publicada", + "pin_to_version": "Fixar em uma versão específica", + "include_exclude": "Incluir / Excluir", + "include": "Incluir", + "add_by_ids": "Adicionar por ID(s)", + "concept_ids": "IDs de Conceitos", + "mapping_ids": "IDs de Mapeamentos", + "select_source_first": "Selecione uma fonte ou coleção acima para usar Adicionar por ID(s)", + "id_helper": "Cada ID se torna {{path}}{id}/", + "expression_hint": "Expressão completa da referência. Preenchida a partir do seletor de fonte/coleção acima; edite conforme necessário.", + "adding_references": "Adicionando referências…", + "request_failed": "Requisição falhou — verifique sua conexão de rede e tente novamente." + }, + "checksums": { + "standard": "Checksum Padrão", + "smart": "Checksum Inteligente" + }, + "repo": { + "repos": "Repositórios", + "repo": "Repositório", + "new_repo": "Novo Repositório", + "repo_type": "Tipo de Repositório", + "source_type": "Tipo de Fonte", + "collection_type": "Tipo de Coleção", + "edit_version": "Editar Versão", + "repo_id": "ID do Repositório", + "repo_version": "Versão do Repo", + "latest_version": "Última versão", + "add_concept": "Adicionar Conceito", + "add_mapping": "Adicionar Mapeamento", + "source": "Fonte", + "collection": "Coleção", + "release_status": "Status de Publicação", + "release_version": "Publicar Versão", + "unrelease_version": "Despublicar Versão", + "compare_versions": "Comparar versões", + "compare_versions_and_expansions": "Comparar versões + expansões", + "compare_expansions_of_version": "Comparar expansões desta versão", + "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", + "hierarchy": "Hierarquia", + "hierarchy_description": "Opcionalmente declare o conceito que é a raiz da hierarquia desta fonte e o que o relacionamento pai/filho significa.", + "hierarchy_root": "Raiz da Hierarquia", + "hierarchy_root_help": "Deve ser um conceito nesta fonte", + "hierarchy_root_after_create_help": "Pode ser definido depois que esta fonte tiver conceitos", + "hierarchy_meaning_help": "Como o relacionamento pai/filho dos conceitos desta fonte deve ser interpretado", + "compositional": "Composicional", + "version_needed": "Versão Necessária", + "meta": "Meta", + "short_code": "Código Curto", + "full_name": "Nome Completo", + "short_name": "Nome Curto", + "default_locale": "Localidade Padrão", + "supported_locales": "Localidades Suportadas", + "additional_meta_data": "Metadados Adicionais", + "publisher_information": "Informações do Publicador", + "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_calculando": "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", + "create_a_repo": "Criar um repositório", + "create_a_repo_description": "Repositórios são contêineres ou pastas para seu conteúdo. <0>Saiba mais.", + "create_source_description": "Uma Fonte é usada para criar e editar conceitos e mapeamentos.", + "create_source_subtext": "Criar e editar conceitos e mapeamentos", + "create_collection_description": "Uma Coleção é um conjunto curado de conceitos e mapeamentos de uma ou mais fontes.", + "create_collection_subtext": "Curar conjuntos de conceitos de uma ou mais fontes", + "create_code_system_description": "Um Code System é uma representação compatível com FHIR de uma fonte.", + "create_code_system_subtext": "Code system compatível com FHIR", + "create_value_set_description": "Um Value Set é uma representação compatível com FHIR de uma coleção.", + "create_valueset_subtext": "Value set compatível com FHIR", + "create_concept_map_description": "Um Concept Map é um conjunto compatível com FHIR de mapeamentos de conceitos.", + "create_concept_map_subtext": "Concept map compatível com FHIR", + "code_system": "Code System", + "valueset": "Value Set", + "concept_map": "Concept Map", + "locked_date": "Data Travada", + "edit_repo": "Editar Repositório", + "error_update": "Não foi possível atualizar o repo", + "error_create": "Não foi possível criar o repo", + "success_update": "Repo atualizado com sucesso", + "success_create": "Repo criado com sucesso", + "success_delete": "Repo excluído com sucesso", + "success_delete_version": "Versão do repo excluída com sucesso", + "success_version_create": "Versão criada com sucesso", + "success_version_update": "Versão atualizada com sucesso", + "error_version_create": "Não foi possível criar a versão", + "error_version_update": "Não foi possível atualizar a versão", + "versions_expansions": "Versões + Expansões", + "versions": "Versões", + "unreleased": "Não Publicado", + "explore_version": "Explorar Versão", + "export_version": "Exportar Versão", + "external_exports": "Exportações Externas", + "changelog": "Changelog", + "compare_with_previous": "Comparar com Anterior", + "recompute_summary": "Recalcular Resumo", + "summary_request_queued": "Solicitação de resumo enfileirada.", + "summary_request_submitted": "Solicitação de resumo enviada.", + "reindex_concepts": "Reindexar Conceitos", + "reindex_mappings": "Reindexar Mapeamentos", + "reindex_dialog_title": "{{label}}: {{repoId}}", + "reindex_confirm_message": "Tem certeza de que deseja reindexar {{contentType}} para {{repoId}}?", + "reindex_scheduled": "Tarefa {{id}} foi agendada.", + "reindex_scheduled_no_id": "Solicitação de reindexação enviada.", + "reindex_already_in_progress": "Uma reindexação já está em andamento para esta versão. Por favor, aguarde.", + "reindex_in_progress_tooltip_with_id": "Reindexação em andamento (ID da Tarefa: {{id}})", + "reindex_in_progress_tooltip": "Reindexação já em andamento. Por favor, aguarde.", + "no_versions_found": "Nenhuma versão encontrada.", + "source_version_count": "{{count}} versão de fonte", + "source_versions_count": "{{count}} versões de fonte", + "mapper": "Mapper", + "export_source_version_title": "Exportar Versão da Fonte: {{repo}} / {{version}}", + "export_collection_version_title": "Exportar Versão da Coleção: {{repo}} / {{version}}", + "could_not_check_export": "Não foi possível verificar a exportação.", + "could_not_queue_export": "Não foi possível enfileirar a exportação.", + "export_already_exists": "Uma exportação já existe para esta versão.", + "export_request_queued": "Solicitação de exportação enfileirada.", + "checking_export_status": "Verificando status da exportação...", + "downloaded_cached_export": "Exportação em cache baixada.", + "cached_export_generating": "Uma exportação em cache está sendo gerada. Verifique novamente mais tarde.", + "export_request_queued_check_later": "Solicitação de exportação enfileirada. Verifique novamente mais tarde.", + "export_already_exists_try_again": "Uma exportação já existe. Tente baixar novamente.", + "no_cached_export": "Não há exportação em cache para esta versão de fonte.", + "queue_export": "Enfileirar Exportação", + "could_not_download_external_export": "Não foi possível baixar a exportação externa.", + "external_export_required": "Nome e arquivo da exportação externa são obrigatórios.", + "external_export_uploaded": "Exportação externa carregada.", + "could_not_upload_external_export": "Não foi possível carregar a exportação externa.", + "external_export_deleted": "Exportação externa excluída.", + "could_not_delete_external_export": "Não foi possível excluir a exportação externa.", + "confirm_delete_external_export_title": "Excluir Exportação Externa", + "confirm_delete_external_export_message": "Tem certeza de que deseja excluir \"{{key}}\"? Isso não pode ser desfeito.", + "existing_external_export": "Exportação Externa Existente", + "external_exports_title": "Exportações Externas: {{repo}} / {{version}}", + "no_external_exports": "Nenhuma exportação externa foi carregada para esta versão.", + "upload_external_export": "Carregar Exportação Externa", + "choose_file": "Escolher Arquivo", + "external_export_file_types": "sql, zip, pdf, csv", + "uploading": "Carregando...", + "could_not_load_changelog": "Não foi possível carregar o changelog.", + "large_sources_take_a_while": "Fontes grandes podem levar um tempo para processar.", + "copied_version_url": "URL da versão copiada.", + "expansion": "Expansão", + "expansions": "Expansões", + "versions_expansions_subtitle": "HEAD, versões publicadas e suas expansões", + "autoexpand": "Auto-expandir", + "expansion_url": "URL da Expansão", + "version_url": "URL da Versão", + "previous_version_url": "URL da Versão Anterior", + "canonical_url": "URL Canônica", + "autoexpand_head": "AutoExpandir HEAD", + "immutable": "Imutável", + "ocl_repo_url": "URL do Repo OCL", + "ocl_repo_url_help": "Uma URL de repo de qualquer servidor OCL (ex.: https://app.openconceptlab.org/#{{example}}) ou uma URL relativa deste servidor (ex.: {{example}})", + "invalid_repo_url": "Insira uma URL de repo OCL válida", + "create_version": "Criar Versão", + "new_version": "Nova Versão", + "new_expansion": "Nova Expansão", + "show_expansions": "Mostrar expansões ({{count}})", + "expansions_processing": "Expansões processando ({{count}})", + "hide_expansions": "Ocultar expansões", + "default_expansion_label": "Padrão: {{expansion}}", + "expansion_dropdown_label": "Expansão: {{mnemonic}}", + "expansion_already_selected_other_side": "Já selecionado no outro lado", + "edit_description": "Editar descrição", + "stale": "Desatualizado", + "stale_count": "{{count}} desatualizado(s)", + "expansions_for_version": "Para a versão {{version}}", + "no_description": "Sem descrição", + "no_expansions_yet": "Nenhuma expansão ainda", + "no_expansions_message": "Esta versão de coleção não tem expansões ainda.", + "create_first_expansion": "Criar Primeira Expansão", + "set_as_default": "Definir como padrão", + "update_metadata": "Atualizar metadados", + "create_similar": "Criar similar", + "create_similar_disclaimer": "Apenas os metadados do repositório são copiados. Conceitos, mapeamentos e versões não são copiados.", + "id_auto_assignment": "Atribuição Automática de ID", + "id_auto_assignment_description": "Configure a atribuição de ID para Conceitos e Mapeamentos", + "id_auto_assignment_openmrs_hint": "OpenMRS recomenda selecionar 'Sequencial' para IDs e 'UUID' para IDs Externos", + "ids": "IDs", + "external_ids": "IDs Externos", + "auto_id_manual": "Inserir Manualmente", + "auto_id_manual_description": "O ID deve ser inserido manualmente cada vez que você criar um novo recurso.", + "auto_id_uuid": "UUID", + "auto_id_uuid_description": "O ID é atribuído automaticamente no formato UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "auto_id_sequential": "Sequencial", + "auto_id_sequential_description": "O ID é atribuído automaticamente em formato numérico, aumentando em 1 para cada novo recurso. Você pode escolher com qual número começar.", + "auto_id_start_from": "Começar De", + "autoid_concept_mnemonic_help": "Isto determina se um ID é atribuído automaticamente a novos conceitos.", + "autoid_mapping_mnemonic_help": "Isto determina se um ID é atribuído automaticamente a novos mapeamentos.", + "autoid_concept_external_id_help": "Isto determina se um ID externo é atribuído automaticamente a novos conceitos. IDs Externos são opcionais mas podem ser úteis para IDs de outros sistemas.", + "autoid_mapping_external_id_help": "Isto determina se um ID externo é atribuído automaticamente a novos mapeamentos. IDs Externos são opcionais mas podem ser úteis para IDs de outros sistemas.", + "autoid_concept_name_external_id_help": "Isto determina se um ID externo é atribuído automaticamente a novos nomes de conceito. IDs Externos são opcionais mas podem ser úteis para IDs de outros sistemas.", + "autoid_concept_description_external_id_help": "Isto determina se um ID externo é atribuído automaticamente a novas descrições de conceito. IDs Externos são opcionais mas podem ser úteis para IDs de outros sistemas.", + "rebuild": "Reconstruir", + "rebuild_expansion": "Reconstruir Expansão", + "rebuild_expansion_message": "Isso reavaliará todas as referências nesta versão da coleção. Isso não pode ser desfeito.", + "rebuild_expansion_compare_message": "Você também pode criar uma expansão similar primeiro se quiser comparar resultados lado a lado.", + "collection_version_updated": "Versão da coleção atualizada.", + "unable_update_version_metadata": "Não foi possível atualizar metadados da versão.", + "default_expansion_updated": "Expansão padrão atualizada.", + "unable_set_default_expansion": "Não foi possível definir expansão padrão.", + "expansion_deleted": "Expansão excluída.", + "unable_delete_expansion": "Não foi possível excluir a expansão.", + "expansion_rebuild_accepted": "Reconstrução de expansão aceita.", + "unable_rebuild_expansion": "Não foi possível reconstruir a expansão.", + "opened_dependency_expansion": "Aberto a partir de uma notificação de dependência. Mostrando {{expansion}} na versão {{version}}.", + "opened_dependency_version": "Aberto a partir de uma notificação de dependência. Mostrando versão {{version}}.", + "created_by_at": "Criado", + "updated_by_at": "Atualizado", + "last_built_by": "Última construção por", + "collection_expansion": "Expansão de Coleção", + "concepts_and_mappings": "conceitos e mapeamentos", + "expansion_details_title": "Expansão: {{mnemonic}}", + "explicit_repo_versions": "Versões de Repo Explícitas", + "evaluated_repo_versions": "Versões de Repo Avaliadas", + "unresolved_repo_versions": "Versões de Repo Não Resolvidas", + "resolved_repo_versions": "Versões de Repo Resolvidas", + "resolved_repo_updates_available": "Novas versões estão disponíveis para algumas versões de repo resolvidas nesta expansão:", + "version": { + "vectorized_for_mapper": "Vetorização de conceitos está habilitada para esta versão do repositório", + "form": { + "id": { + "label": "ID", + "helper_text": "Caracteres alfanuméricos, @, hífens, pontos e sublinhados são permitidos." + }, + "new_title": "Nova Versão de {{resourceType}}: {{version}}", + "edit_title": "Editar Versão de {{resourceType}}: {{version}}" + }, + "update_dialog": { + "title": "Atualizar {{resourceType}}: {{resourceId}}", + "message": "Tem certeza de que deseja {{action}} este {{resourceType}} {{repoId}}?" + }, + "expansion_form": { + "new_title": "Nova Expansão: {{version}}", + "edit_title": "Editar Expansão: {{mnemonic}}", + "select_version": "Selecionar versão", + "collection_version": "Versão da Coleção", + "parameters": "Parâmetros", + "id_required": "ID é obrigatório", + "version_required": "Por favor, selecione uma versão de coleção.", + "created": "Expansão criada.", + "updated": "Expansão atualizada.", + "cleaned_values": "Valores limpos: {{values}}", + "format_hint": "Formato: {{format}}", + "parameters_fields": { + "filter": { + "label": "filtro", + "tooltip": "Adicionar critérios de busca" + }, + "activeOnly": { + "label": "activeOnly", + "tooltip": "Selecione isto para incluir apenas conceitos e mapeamentos não aposentados" + }, + "date": { + "label": "data", + "tooltip": "O filtro de data de revisão. Formato: AAAA, AAAA-MM, AAAA-MM-DD, ou timestamp completo" + }, + "count": { + "label": "contagem", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "offset": { + "label": "deslocamento", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "includeDesignations": { + "label": "includeDesignations", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "includeDefinition": { + "label": "includeDefinition", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "excludeNested": { + "label": "excludeNested", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "excludeNotForUI": { + "label": "excludeNotForUI", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "excludePostCoordinated": { + "label": "excludePostCoordinated", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "exclude-system": { + "label": "exclude-system", + "tooltip": "URL canônica com versão opcional para excluir da expansão" + }, + "system-version": { + "label": "system-version", + "tooltip": "URL canônica com versão opcional para forçar ao resolver um sistema" + }, + "check-system-version": { + "label": "check-system-version", + "tooltip": "Este parâmetro ainda não é suportado." + }, + "force-system-version": { + "label": "force-system-version", + "tooltip": "Este parâmetro ainda não é suportado." + } + } + } + }, + "delete_repo": "Excluir Repo", + "delete_accepted": "Exclusão de Repo Aceita. Isso pode levar alguns minutos.", + "delete_repo_version": "Excluir Versão do Repo", + "delete_accepted_version": "Exclusão de Versão do Repo Aceita. Isso pode levar alguns minutos.", + "properties": "Propriedades", + "property": "Propriedade", + "filters": "Filtros", + "version_changelog_request_accepted": "Solicitação de comparação de versões aceita, por favor volte em alguns minutos.", + "select_expansions_to_compare": "Selecione uma expansão para ambas as versões para comparar conteúdo.", + "select_different_version_or_expansion": "Esta versão e expansão são idênticas em ambos os lados. Escolha uma expansão ou versão diferente para ver uma comparação.", + "select_different_version": "Esta versão é idêntica em ambos os lados. Escolha uma versão diferente para ver uma comparação.", + "no_content_differences": "Nenhuma diferença foi encontrada entre estas duas versões.", + "properties_filters_subheader": "Propriedades do Repositório", + "additional_metadata_filters_subheader": "Metadados Adicionais", + "stage_seeded_concepts": "Conceitos semeados", + "stage_seeded_mappings": "Mapeamentos semeados", + "stage_indexed_concepts": "Conceitos indexados", + "stage_indexed_mappings": "Mapeamentos indexados", + "stage_exported": "Exportado", + "stage_changelog": "Changelog", + "export_time": "Tempo de exportação", + "copy_task_id": "Copiar ID da tarefa", + "copied_task_id": "ID da tarefa copiado para a área de transferência", + "processing_summary": "Processando — {{completed}} de {{total}} concluído", + "processing_failed_summary": "Processamento falhou — {{completed}} de {{total}} concluído", + "processing_progress_short": "Processando {{completed}}/{{total}}", + "processing_stage_caption": "{{stage}} · {{completed}}/{{total}}", + "processing_flag_tooltip": "Clique para ver estágios de processamento e IDs de tarefas", + "processing_listing_warning": "Esta versão ainda está processando. {{resource}} mostrado aqui pode estar incompleto.", + "processing_listing_failed": "Processamento falhou para esta versão. {{resource}} mostrado aqui pode estar incompleto.", + "view_processing_details": "Ver detalhes", + "action_disabled_while_processing": "Indisponível enquanto esta versão está processando", + "action_disabled_until_seeded": "Disponível quando conceitos e mapeamentos terminarem de semear", + "action_disabled_until_changelog_ready": "Disponível quando o changelog terminar de calcular", + "clear_processing": "Limpar Processamento", + "clear_processing_title": "{{resourceType}}: {{resourceId}}", + "clear_processing_confirmation": "Tem certeza de que deseja limpar o estado de processamento para esta versão?", + "clear_processing_message": "Isso apenas limpa os IDs de tarefas em segundo plano que a versão está rastreando. Não para nenhuma tarefa que esteja genuinamente ainda em execução, e não muda o conteúdo da versão.", + "clear_processing_not_processing": "Esta versão não está atualmente marcada como processando.", + "clear_processing_confirm_button": "Limpar estado de processamento", + "processing_cleared": "Estado de processamento limpo", + "could_not_clear_processing": "Não foi possível limpar o estado de processamento", + "export_not_ready_tooltip": "Exportação ainda está sendo gerada para esta versão", + "expansion_processing_tooltip": "Esta expansão ainda está sendo construída", + "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", + "edit_members": "Editar Membros", + "updated_members": "Membros Atualizados", + "member_add_failed": "Não foi possível adicionar {{user}}: {{detail}}", + "member_remove_failed": "Não foi possível remover {{user}}: {{detail}}", + "org_have_not_created_public_repos_suffix": "não criaram nenhum repositório público", + "browse_members": "Navegar membros", + "member_of": "Membro de", + "create_an_org": "Criar uma Organização", + "create_an_org_description": "Organize seu conteúdo e colaboradores. <0> Saiba mais sobre Organizações no OCL.", + "edit_org": "Editar Organização", + "error_update": "Não foi possível atualizar a organização", + "error_create": "Não foi possível criar a organização", + "success_update": "Organização atualizada com sucesso", + "success_create": "Organização criada com sucesso", + "delete_org": "Excluir Organização", + "delete_accepted": "Exclusão de Organização Aceita. Isso pode levar alguns minutos." + }, + "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", + "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", + "references": "Referências", + "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...", + "select_a_filter": "Selecione um filtro com as teclas /", + "filter": "Filtrar", + "filtered_by": "filtrado por", + "class": "Classe", + "map_type": "Tipo de Mapeamento", + "bookmarked_organizations": "Organizações favoritas", + "following_organizations": "Organizações que segue", + "no_organizations_found": "Nenhuma organização encontrada", + "bookmarked_repositories": "Repositórios favoritos", + "following_repositories": "Repositórios que segue", + "no_repositories_found": "Nenhum repositório encontrado", + "bookmarked_users": "Usuários favoritos", + "following_users": "Usuários que segue", + "no_users_found": "Nenhum usuário encontrado", + "table": "Tabela", + "card": "Cartão", + "hierarchy": "Hierarquia", + "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": "Destaque da Busca", + "save_default_filters": "Salvar como Filtros Padrão", + "reset_default_filters": "Redefinir para Filtros Padrão", + "reset_default_filters_tooltip": "Descartar filtros aplicados e voltar aos filtros padrão salvos", + "default_filters_menu_tooltip": "Opções de filtro padrão", + "clear_filters_tooltip": "Remover todos os filtros aplicados", + "clear_filters_with_defaults_tooltip": "Remover todos os filtros aplicados incluindo os filtros padrão", + "select_all": "Selecionar todos", + "select_all_concepts": "Selecionar todos os conceitos", + "select_all_mappings": "Selecionar todos os mapeamentos", + "select_all_references": "Selecionar todas as referências", + "select_all_repos": "Selecionar todos os repositórios", + "select_all_orgs": "Selecionar todas as organizações", + "select_all_users": "Selecionar todos os usuários" + }, + "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" + }, + "addToCollection": { + "title": "Adicionar à Coleção", + "adding_single": "Adicionando: {{name}} de {{source}}", + "adding_multiple": "Adicionando {{count}} conceitos", + "target_collection": "Coleção de Destino", + "no_editable_collections": "Nenhuma coleção editável encontrada", + "adding_reference": "Adicionando referência…", + "request_accepted": "Sua solicitação foi aceita e referências serão adicionadas em breve.", + "add_button": "Adicionar Referência", + "reference_header": "Referência", + "error_header": "Erro", + "no_references_added": "Nenhuma referência adicionada", + "add_to_collection": "Adicionar à Coleção" + }, + "import": { + "upload_file_tooltip": "Carregar Arquivo JSON/CSV/ZIP", + "upload_file_no_zip_tooltip": "Carregar Arquivo JSON/CSV", + "json_data_tooltip": "Enviar Dados JSON", + "url_tooltip": "Colar URL de Arquivo JSON/CSV/ZIP", + "npm_tooltip": "Importar pacote NPM", + "queue_id_label": "ID da Fila", + "queue_id_placeholder": "ex.: minha-fila", + "queue_id_helper_text": "Imports que compartilham o mesmo ID da fila são processados em sequência", + "update_if_exists_label": "Atualizar se Existir", + "update_if_exists_helper_text": "Atualizar se conceito/mapeamento existente encontrado", + "hierarchy_helper_text": "Importante marcar isto se o conteúdo da importação tem hierarquia", + "file_url_label": "URL do Arquivo JSON/CSV/ZIP", + "owner_helper_text": "Determina o namespace onde os recursos importados devem ser criados", + "npm_package_name": "Nome do Pacote NPM", + "npm_package_version": "Versão do Pacote NPM", + "or_upload_package_file": "Ou carregar arquivo do pacote:", + "json_data_label": "Dados JSON", + "size_limit_helper": "Até {{limit}} por importação", + "file_too_large": "Este arquivo é maior que seu limite de importação de {{limit}}.", + "new_import_footer": "OCL processa importação em massa assincronamente. Uma importação em massa pode incluir criações, atualizações ou exclusões para múltiplos proprietários e repositórios. <0>Leia Mais...", + "provide_npm_name_and_version": "Forneça nome e versão do pacote NPM para ser buscado no <0>Registro de Pacotes FHIR:", + "existing_imports": "Importações Existentes", + "result_expiry_message": "Resultados expirarão após <0>72 horas a partir do horário de início da tarefa", + "filter_tooltip": "Filtrar por fila ou status", + "refresh_list_tooltip": "Atualizar Lista", + "search_placeholder": "Buscar por ID da tarefa, status ou nome da fila...", + "filter_by_date_tooltip": "Filtrar por data", + "statuses": "Status", + "queues": "Filas", + "result_expired": "Resultado Expirado", + "received": "Recebido", + "queue": "Fila", + "download_report": "Baixar Relatório", + "task_id": "ID da Tarefa", + "started": "Iniciado", + "runtime": "Tempo de Execução", + "failed": "Falhou", + "retries": "Tentativas", + "revoked": "Revogado", + "exception": "Exceção", + "result": "Resultado", + "args": "Args", + "sub_tasks": "Sub-tarefas" + }, + "cloneToSource": { + "title": "Clonar Conceito(s) para Fonte", + "clone_to_source": "Clonar para Fonte", + "description": "Esta operação clonará o(s) conceito(s) selecionado(s), mais quaisquer respostas ou membros de conjunto, seguindo recursivamente os mapeamentos especificados. Conceitos já presentes na fonte de destino são ignorados.", + "target_source": "Fonte de Destino", + "no_sources": "Nenhuma fonte encontrada", + "advanced_settings": "Configurações avançadas", + "advanced_caution": "Cuidado: alterar estas configurações pode resultar em uma clonagem incompleta (ex.: respostas ou membros de conjunto faltando).", + "origination_sources": "Fonte(s) de Originação", + "destination_source": "Fonte de Destino", + "summary": "{{count}} conceito(s) selecionado(s) serão clonados em", + "cloning": "Clonando conceito(s)…", + "clone_button": "Clonar", + "clone_finished": "Clonagem finalizada. Veja a coluna de resultados para detalhes.", + "preview_api_call": "Visualizar chamada da API", + "hide_api_call": "Ocultar chamada da API", + "same_source_warning": "Mesma fonte do destino. Nada será clonado.", + "preview_header": "Visualização", + "results_header": "Resultados", + "preview_title": "Visualização", + "preview_tooltip": "Visualizar o que será clonado", + "preview_result_tooltip": "Visualizar conceito clonado", + "concepts_count": "Conceitos ({{count}})", + "mappings_count": "Mapeamentos ({{count}})", + "no_concepts": "Nenhum conceito", + "no_mappings": "Nenhum mapeamento", + "cloned_count": "{{count}} clonado(s)", + "nothing_cloned": "Nada clonado", + "failed": "Falhou", + "back": "Voltar", + "cascade_levels": "Níveis de Cascata", + "map_types": "Tipos de Mapeamento", + "exclude_map_types": "Excluir Tipos de Mapeamento", + "return_map_types": "Retornar Tipos de Mapeamento", + "equivalency_map_type": "Tipo de Mapeamento de Equivalência", + "map_types_placeholder": "ex.: Q-AND-A,CONCEPT-SET", + "equivalency_map_type_placeholder": "ex.: SAME-AS,CONCEPT-SET" + }, + "sort": { + "source": "Fonte", + "most_relevant": "Mais relevantes", + "newest_first": "Mais recentes primeiro", + "oldest_first": "Mais antigos primeiro", + "recently_joined": "Ingressaram recentemente", + "longest_member": "Membro mais antigo", + "a_z": "A-Z", + "z_a": "Z-A", + "num_asc": "0-9", + "num_desc": "9-0", + "tooltip_a_z": "Ordenar por {{field}}, A a Z", + "tooltip_z_a": "Ordenar por {{field}}, Z a A", + "tooltip_num_asc": "Ordenar por {{field}}, menor número primeiro", + "tooltip_num_desc": "Ordenar por {{field}}, maior número primeiro", + "clear": "Limpar Ordenação" + }, + "announcement": { + "title": "Bem-vindo à prévia pública do novo OCL TermBrowser v3!", + "text": "Seu conteúdo já está aqui, e você pode voltar para o TBv2 a qualquer momento.", + "link_label": "Saiba mais", + "dismiss": "Dispensar" + }, + "quota": { + "title_quota": "Você atingiu sua cota", + "title_cap": "Você atingiu seu limite", + "title_limit": "Isso está acima do seu limite", + "your_plan": "Seu plano", + "used_of": "{{used}} de {{limit}} usado(s)", + "requested_of": { + "generic": "{{requested}} solicitado(s), limite {{limit}}", + "import_file_size": "{{requested}} KB, limite {{limit}} KB", + "clone_resources": "Mais de {{limit}} conceitos e mapeamentos" + }, + "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", + "import_file_size": "Tamanho da importação", + "clone_resources": "Conceitos e mapeamentos por clonagem", + "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." + }, + "import_file_size": { + "default": "Divida o arquivo em importações menores, ou solicite mais acesso." + }, + "clone_resources": { + "default": "Clone um conceito mais estreito ou menos níveis de cascata, ou solicite mais acesso." + } + } + } +} \ No newline at end of file From a335f4719a9de0dc0bf47c55fa387db740d3b6e9 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Fri, 2 Oct 2026 09:49:21 -0300 Subject: [PATCH 2/6] feat: Add translations for event feed types and object types - Add event_types and object_types to common translations (en and pt-BR) - Update Events.jsx and DashboardEvents.jsx to translate event_type and referenced_object.type from API --- src/components/common/Events.jsx | 5 ++++- src/components/dashboard/DashboardEvents.jsx | 7 ++++--- src/i18n/locales/en/translations.json | 18 ++++++++++++++++++ src/i18n/locales/pt-BR/translations.json | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/components/common/Events.jsx b/src/components/common/Events.jsx index 547d3dc83..dcc6c599a 100644 --- a/src/components/common/Events.jsx +++ b/src/components/common/Events.jsx @@ -18,6 +18,7 @@ import Link from '../common/Link' import UserIcon from '../users/UserIcon' const EventDescription = ({ event, isFirst, isLast, isJoined }) => { + const { t } = useTranslation() const { event_type, description, referenced_object} = event; const getDescription = () => { let eventDescription = description @@ -25,7 +26,9 @@ const EventDescription = ({ event, isFirst, isLast, isJoined }) => { eventDescription += ' ' + getSiteTitle() let rel; if(event_type && !isEmpty(referenced_object)) { - eventDescription = `${event_type} ${referenced_object.type} ` + const translatedEventType = t(`common.event_types.${event_type.toLowerCase()}`, { defaultValue: event_type }); + const translatedObjectType = referenced_object.type ? t(`common.object_types.${referenced_object.type}`, { defaultValue: referenced_object.type }) : ''; + eventDescription = `${translatedEventType} ${translatedObjectType} ` if(['Source Version', 'Collection Version'].includes(referenced_object.type)) { rel = `${referenced_object.short_code}/${referenced_object.id}` } else diff --git a/src/components/dashboard/DashboardEvents.jsx b/src/components/dashboard/DashboardEvents.jsx index f5317e295..4d5e51cc9 100644 --- a/src/components/dashboard/DashboardEvents.jsx +++ b/src/components/dashboard/DashboardEvents.jsx @@ -26,10 +26,11 @@ const EventCard = ({ event, highlight }) => { const getTitle = (event, object, includeSubtitle) => { let title = object?.id || object?.username || object?.name let subTitle = event?.event_type?.toLowerCase() + const translatedEventType = t(`common.event_types.${subTitle}`, { defaultValue: subTitle }); if(event?.referenced_object?.type === 'Organization') - subTitle += ` ${t('common.an')} ${event.referenced_object?.type?.toLowerCase()}` + subTitle += ` ${t('common.an')} ${t(`common.object_types.${event.referenced_object?.type}`, { defaultValue: event.referenced_object?.type.toLowerCase() })}` else if(event?.referenced_object?.type) - subTitle += ` ${t('common.a')} ${event.referenced_object?.type?.toLowerCase()}` + subTitle += ` ${t('common.a')} ${t(`common.object_types.${event.referenced_object?.type}`, { defaultValue: event.referenced_object?.type.toLowerCase() })}` else subTitle += ` ${getSiteTitle()}` return ( @@ -40,7 +41,7 @@ const EventCard = ({ event, highlight }) => { { includeSubtitle && - {subTitle} + {translatedEventType} {subTitle} } diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index ec08b2d7e..0b5baa15c 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -48,6 +48,24 @@ "create_from_ocl_url": "Create from OCL URL", "created_on": "Created On", "created_by": "Created By", + "event_types": { + "created": "Created", + "updated": "Updated", + "released": "Released", + "deleted": "Deleted", + "joined": "Joined", + "source": "Source" + }, + "object_types": { + "Source": "Source", + "Collection": "Collection", + "Source Version": "Source Version", + "Collection Version": "Collection Version", + "Organization": "Organization", + "Concept": "Concept", + "Mapping": "Mapping", + "Repository": "Repository" + }, "version": "Version", "versions": "Versions", "summary": "Summary", diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 1cec16d5c..08d1619c7 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -48,6 +48,24 @@ "create_from_ocl_url": "Criar a partir de URL do OCL", "created_on": "Criado em", "created_by": "Criado por", + "event_types": { + "created": "Criado", + "updated": "Atualizado", + "released": "Publicado", + "deleted": "Excluído", + "joined": "Entrou", + "source": "Fonte" + }, + "object_types": { + "Source": "Fonte", + "Collection": "Coleção", + "Source Version": "Versão da Fonte", + "Collection Version": "Versão da Coleção", + "Organization": "Organização", + "Concept": "Conceito", + "Mapping": "Mapeamento", + "Repository": "Repositório" + }, "version": "Versão", "versions": "Versões", "summary": "Resumo", From f0fecde9119fa783c550fb297e1b7c4b5bc57b33 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Fri, 2 Oct 2026 14:25:10 -0300 Subject: [PATCH 3/6] feat(i18n): Add Portuguese (Brazil) language support * Implement the PT-BR locale configuration and language persistence logic * Add translations for event and object types to both en and pt-BR locales * Update event and object display components to utilize translated types --- src/components/common/Events.jsx | 2 +- src/components/dashboard/DashboardEvents.jsx | 13 +- .../dashboard/EventsButtonGroup.jsx | 3 +- src/i18n/config.js | 28 +++- src/i18n/locales/en/translations.json | 12 ++ src/i18n/locales/pt-BR/translations.json | 120 ++++++++++-------- 6 files changed, 112 insertions(+), 66 deletions(-) diff --git a/src/components/common/Events.jsx b/src/components/common/Events.jsx index dcc6c599a..a4f181cfb 100644 --- a/src/components/common/Events.jsx +++ b/src/components/common/Events.jsx @@ -27,7 +27,7 @@ const EventDescription = ({ event, isFirst, isLast, isJoined }) => { let rel; if(event_type && !isEmpty(referenced_object)) { const translatedEventType = t(`common.event_types.${event_type.toLowerCase()}`, { defaultValue: event_type }); - const translatedObjectType = referenced_object.type ? t(`common.object_types.${referenced_object.type}`, { defaultValue: referenced_object.type }) : ''; + const translatedObjectType = referenced_object.type ? t(`common.event_object_types.${referenced_object.type}`, { defaultValue: referenced_object.type }) : ''; eventDescription = `${translatedEventType} ${translatedObjectType} ` if(['Source Version', 'Collection Version'].includes(referenced_object.type)) { rel = `${referenced_object.short_code}/${referenced_object.id}` diff --git a/src/components/dashboard/DashboardEvents.jsx b/src/components/dashboard/DashboardEvents.jsx index 4d5e51cc9..48a8c9ddf 100644 --- a/src/components/dashboard/DashboardEvents.jsx +++ b/src/components/dashboard/DashboardEvents.jsx @@ -25,14 +25,13 @@ const EventCard = ({ event, highlight }) => { const { t } = useTranslation() const getTitle = (event, object, includeSubtitle) => { let title = object?.id || object?.username || object?.name - let subTitle = event?.event_type?.toLowerCase() - const translatedEventType = t(`common.event_types.${subTitle}`, { defaultValue: subTitle }); - if(event?.referenced_object?.type === 'Organization') - subTitle += ` ${t('common.an')} ${t(`common.object_types.${event.referenced_object?.type}`, { defaultValue: event.referenced_object?.type.toLowerCase() })}` - else if(event?.referenced_object?.type) - subTitle += ` ${t('common.a')} ${t(`common.object_types.${event.referenced_object?.type}`, { defaultValue: event.referenced_object?.type.toLowerCase() })}` + const eventType = event?.event_type?.toLowerCase() + const translatedEventType = t(`common.event_types.${eventType}`, { defaultValue: eventType }); + let subTitle + if(event?.referenced_object?.type) + subTitle = t(`common.event_object_types.${event.referenced_object.type}`, { defaultValue: event.referenced_object.type.toLowerCase() }) else - subTitle += ` ${getSiteTitle()}` + subTitle = getSiteTitle() return ( diff --git a/src/components/dashboard/EventsButtonGroup.jsx b/src/components/dashboard/EventsButtonGroup.jsx index 78dc98905..3c46222b1 100644 --- a/src/components/dashboard/EventsButtonGroup.jsx +++ b/src/components/dashboard/EventsButtonGroup.jsx @@ -1,6 +1,5 @@ import React from 'react' import { useTranslation } from 'react-i18next'; -import startCase from 'lodash/startCase' import DoneIcon from '@mui/icons-material/Done'; import ButtonGroup from '@mui/material/ButtonGroup' import Button from '@mui/material/Button' @@ -29,7 +28,7 @@ const EventsButtonGroup = ({ onClick, selected }) => { onClick('all')} /> onClick('following')} /> - onClick('orgs')} /> + onClick('orgs')} /> ) } diff --git a/src/i18n/config.js b/src/i18n/config.js index b2cda1d72..6fc2b425c 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 @@ -26,6 +49,7 @@ i18n.use(initReactI18next).init({ defaultNS: 'translations' }); -i18n.languages = ['en', 'es', 'zh', 'pt-BR']; +i18n.languages = SUPPORTED_LANGUAGES; +i18n.on('languageChanged', persistLanguage) export default i18n; diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 0b5baa15c..3a60a7380 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -53,6 +53,8 @@ "updated": "Updated", "released": "Released", "deleted": "Deleted", + "followed": "Followed", + "unfollowed": "Unfollowed", "joined": "Joined", "source": "Source" }, @@ -66,6 +68,16 @@ "Mapping": "Mapping", "Repository": "Repository" }, + "event_object_types": { + "Source": "a Source", + "Collection": "a Collection", + "Source Version": "a Source Version", + "Collection Version": "a Collection Version", + "Organization": "an Organization", + "Concept": "a Concept", + "Mapping": "a Mapping", + "Repository": "a Repository" + }, "version": "Version", "versions": "Versions", "summary": "Summary", diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 08d1619c7..83d17a23a 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -53,19 +53,31 @@ "updated": "Atualizado", "released": "Publicado", "deleted": "Excluído", + "followed": "passou a seguir", + "unfollowed": "deixou de seguir", "joined": "Entrou", - "source": "Fonte" + "source": "Source" }, "object_types": { - "Source": "Fonte", + "Source": "Source", "Collection": "Coleção", - "Source Version": "Versão da Fonte", + "Source Version": "Versão do Source", "Collection Version": "Versão da Coleção", "Organization": "Organização", "Concept": "Conceito", "Mapping": "Mapeamento", "Repository": "Repositório" }, + "event_object_types": { + "Source": "um Source", + "Collection": "uma Coleção", + "Source Version": "uma Versão do Source", + "Collection Version": "uma Versão da Coleção", + "Organization": "uma Organização", + "Concept": "um Conceito", + "Mapping": "um Mapeamento", + "Repository": "um Repositório" + }, "version": "Versão", "versions": "Versões", "summary": "Resumo", @@ -303,7 +315,7 @@ }, "parent_concepts_header": "Conceitos pai", "parent_concepts": "Conceitos Pai", - "parent_concepts_placeholder": "Buscar conceitos nesta fonte", + "parent_concepts_placeholder": "Buscar conceitos neste Source", "parent_concepts_help": "Conceitos sob os quais este conceito se situa na hierarquia. Uma URL completa de conceito também pode ser colada." }, "edit_concept": "Editar Conceito", @@ -316,7 +328,7 @@ "success_update": "Conceito atualizado com sucesso", "error_create": "Não foi possível criar o conceito", "error_update": "Não foi possível atualizar o conceito", - "view_in_source": "Ver conceito em sua fonte" + "view_in_source": "Ver conceito em seu Source" }, "mapping": { "mapping": "Mapeamento", @@ -327,12 +339,12 @@ "toConcept": "Conceito de destino", "fromConceptName": "Nome do conceito de origem", "toConceptName": "Nome do conceito de destino", - "target_source": "Fonte de destino", + "target_source": "Source 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", + "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", @@ -343,17 +355,17 @@ "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", "edit_mapping": "Editar Mapeamento", - "from_source_url": "URL da Fonte de Origem", - "from_source_version": "Versão da Fonte de Origem", + "from_source_url": "URL do Source de Origem", + "from_source_version": "Versão do Source de Origem", "from_concept_url": "URL do Conceito de Origem", "from_concept_name": "Nome do Conceito de Origem", "from_concept_code": "Código do Conceito de Origem", - "to_source_url": "URL da Fonte de Destino", - "to_source_version": "Versão da Fonte de Destino", - "from_source": "Fonte de Origem", - "to_source": "Fonte de Destino", + "to_source_url": "URL do Source de Destino", + "to_source_version": "Versão do Source de Destino", + "from_source": "Source de Origem", + "to_source": "Source de Destino", "from_concept": "Conceito de Origem", "to_concept": "Conceito de Destino", "to_concept_url": "URL do Conceito de Destino", @@ -361,7 +373,7 @@ "to_concept_code": "Código do Conceito de Destino", "concept_ref_required": "Forneça uma URL de Conceito, ou tanto o Código do Conceito quanto o Nome do Conceito.", "concept_required": "Por favor, selecione um conceito.", - "source_required": "Por favor, selecione uma fonte.", + "source_required": "Por favor, selecione um Source.", "success_create": "Mapeamento criado com sucesso", "success_update": "Mapeamento atualizado com sucesso", "error_create": "Não foi possível criar o mapeamento", @@ -402,14 +414,14 @@ } }, "create_mapping": "Criar Mapeamento", - "view_in_source": "Ver mapeamento em sua fonte" + "view_in_source": "Ver mapeamento em seu Source" }, "reference": { "expression": "Expressão", "references": "Referências", "reference": "Referência", - "source": "Fonte", - "sources": "Fontes", + "source": "Source", + "sources": "Sources", "type": "Tipo de Referência", "last_resolved_at": "Última resolução em", "details": "Detalhes da Referência", @@ -422,16 +434,16 @@ "intensional": "Intensional", "extensional": "Extensional", "cascade": "Cascata", - "source_mappings": "Mapeamentos da Fonte", - "all_source_concepts_and_mappings": "Todos os Conceitos e Mapeamentos da Fonte", + "source_mappings": "Mapeamentos do Source", + "all_source_concepts_and_mappings": "Todos os Conceitos e Mapeamentos do Source", "versioned_repo": "Versionado (Repo)", "versioned_resource": "Versionado (Recurso)", "resolved_repo": "Repo Resolvido", - "group_by_source": "Agrupar por Fonte", + "group_by_source": "Agrupar por Source", "ungrouped": "Não agrupados", "mixed": "Misto", - "source_to_concepts": "Fonte para Conceitos", - "source_to_mappings": "Fonte para Mapeamentos", + "source_to_concepts": "Source para Conceitos", + "source_to_mappings": "Source para Mapeamentos", "raw": "Bruto", "translation": "Tradução", "transform": "Transformar", @@ -467,10 +479,10 @@ "transform_tooltip": "Converte a referência em referência(s) extensional(is). Referências para conceitos ou mapeamentos resolvidos serão armazenadas como referências extensional(is) individuais em vez de referência(s) intensional(is).", "add_references": "Adicionar Referências", "add_reference": "Adicionar Referência", - "source_or_collection": "Fonte / Coleção", - "search_sources_collections": "Buscar fontes e coleções...", + "source_or_collection": "Source / Coleção", + "search_sources_collections": "Buscar sources e coleções...", "group_collections": "Coleções", - "group_sources": "Fontes", + "group_sources": "Sources", "type_to_search": "Digite pelo menos 2 caracteres para buscar", "open_repo": "Abrir {{name}}", "resolves_to": "Resolve para {{version}}.", @@ -481,9 +493,9 @@ "add_by_ids": "Adicionar por ID(s)", "concept_ids": "IDs de Conceitos", "mapping_ids": "IDs de Mapeamentos", - "select_source_first": "Selecione uma fonte ou coleção acima para usar Adicionar por ID(s)", + "select_source_first": "Selecione um Source ou coleção acima para usar Adicionar por ID(s)", "id_helper": "Cada ID se torna {{path}}{id}/", - "expression_hint": "Expressão completa da referência. Preenchida a partir do seletor de fonte/coleção acima; edite conforme necessário.", + "expression_hint": "Expressão completa da referência. Preenchida a partir do seletor de Source/coleção acima; edite conforme necessário.", "adding_references": "Adicionando referências…", "request_failed": "Requisição falhou — verifique sua conexão de rede e tente novamente." }, @@ -496,7 +508,7 @@ "repo": "Repositório", "new_repo": "Novo Repositório", "repo_type": "Tipo de Repositório", - "source_type": "Tipo de Fonte", + "source_type": "Tipo de Source", "collection_type": "Tipo de Coleção", "edit_version": "Editar Versão", "repo_id": "ID do Repositório", @@ -504,7 +516,7 @@ "latest_version": "Última versão", "add_concept": "Adicionar Conceito", "add_mapping": "Adicionar Mapeamento", - "source": "Fonte", + "source": "Source", "collection": "Coleção", "release_status": "Status de Publicação", "release_version": "Publicar Versão", @@ -528,11 +540,11 @@ "case_sensitive": "Diferencia maiúsculas/minúsculas", "hierarchy_meaning": "Significado da Hierarquia", "hierarchy": "Hierarquia", - "hierarchy_description": "Opcionalmente declare o conceito que é a raiz da hierarquia desta fonte e o que o relacionamento pai/filho significa.", + "hierarchy_description": "Opcionalmente declare o conceito que é a raiz da hierarquia deste Source e o que o relacionamento pai/filho significa.", "hierarchy_root": "Raiz da Hierarquia", - "hierarchy_root_help": "Deve ser um conceito nesta fonte", - "hierarchy_root_after_create_help": "Pode ser definido depois que esta fonte tiver conceitos", - "hierarchy_meaning_help": "Como o relacionamento pai/filho dos conceitos desta fonte deve ser interpretado", + "hierarchy_root_help": "Deve ser um conceito neste Source", + "hierarchy_root_after_create_help": "Pode ser definido depois que este Source tiver conceitos", + "hierarchy_meaning_help": "Como o relacionamento pai/filho dos conceitos deste Source deve ser interpretado", "compositional": "Composicional", "version_needed": "Versão Necessária", "meta": "Meta", @@ -563,11 +575,11 @@ "no_overview": "O proprietário não criou uma página de Visão Geral para este repositório", "create_a_repo": "Criar um repositório", "create_a_repo_description": "Repositórios são contêineres ou pastas para seu conteúdo. <0>Saiba mais.", - "create_source_description": "Uma Fonte é usada para criar e editar conceitos e mapeamentos.", + "create_source_description": "Um Source é usado para criar e editar conceitos e mapeamentos.", "create_source_subtext": "Criar e editar conceitos e mapeamentos", - "create_collection_description": "Uma Coleção é um conjunto curado de conceitos e mapeamentos de uma ou mais fontes.", - "create_collection_subtext": "Curar conjuntos de conceitos de uma ou mais fontes", - "create_code_system_description": "Um Code System é uma representação compatível com FHIR de uma fonte.", + "create_collection_description": "Uma Coleção é um conjunto curado de conceitos e mapeamentos de um ou mais Sources.", + "create_collection_subtext": "Curar conjuntos de conceitos de um ou mais Sources", + "create_code_system_description": "Um Code System é uma representação compatível com FHIR de um Source.", "create_code_system_subtext": "Code system compatível com FHIR", "create_value_set_description": "Um Value Set é uma representação compatível com FHIR de uma coleção.", "create_valueset_subtext": "Value set compatível com FHIR", @@ -609,10 +621,10 @@ "reindex_in_progress_tooltip_with_id": "Reindexação em andamento (ID da Tarefa: {{id}})", "reindex_in_progress_tooltip": "Reindexação já em andamento. Por favor, aguarde.", "no_versions_found": "Nenhuma versão encontrada.", - "source_version_count": "{{count}} versão de fonte", - "source_versions_count": "{{count}} versões de fonte", + "source_version_count": "{{count}} versão de Source", + "source_versions_count": "{{count}} versões de Source", "mapper": "Mapper", - "export_source_version_title": "Exportar Versão da Fonte: {{repo}} / {{version}}", + "export_source_version_title": "Exportar Versão do Source: {{repo}} / {{version}}", "export_collection_version_title": "Exportar Versão da Coleção: {{repo}} / {{version}}", "could_not_check_export": "Não foi possível verificar a exportação.", "could_not_queue_export": "Não foi possível enfileirar a exportação.", @@ -623,7 +635,7 @@ "cached_export_generating": "Uma exportação em cache está sendo gerada. Verifique novamente mais tarde.", "export_request_queued_check_later": "Solicitação de exportação enfileirada. Verifique novamente mais tarde.", "export_already_exists_try_again": "Uma exportação já existe. Tente baixar novamente.", - "no_cached_export": "Não há exportação em cache para esta versão de fonte.", + "no_cached_export": "Não há exportação em cache para esta versão de Source.", "queue_export": "Enfileirar Exportação", "could_not_download_external_export": "Não foi possível baixar a exportação externa.", "external_export_required": "Nome e arquivo da exportação externa são obrigatórios.", @@ -641,7 +653,7 @@ "external_export_file_types": "sql, zip, pdf, csv", "uploading": "Carregando...", "could_not_load_changelog": "Não foi possível carregar o changelog.", - "large_sources_take_a_while": "Fontes grandes podem levar um tempo para processar.", + "large_sources_take_a_while": "Sources grandes podem levar um tempo para processar.", "copied_version_url": "URL da versão copiada.", "expansion": "Expansão", "expansions": "Expansões", @@ -850,7 +862,7 @@ "could_not_clear_processing": "Não foi possível limpar o estado de processamento", "export_not_ready_tooltip": "Exportação ainda está sendo gerada para esta versão", "expansion_processing_tooltip": "Esta expansão ainda está sendo construída", - "suggested_sources": "Fontes Sugeridas" + "suggested_sources": "Sources Sugeridos" }, "org": { "my": "Minhas Organizações", @@ -1041,22 +1053,22 @@ "sub_tasks": "Sub-tarefas" }, "cloneToSource": { - "title": "Clonar Conceito(s) para Fonte", - "clone_to_source": "Clonar para Fonte", - "description": "Esta operação clonará o(s) conceito(s) selecionado(s), mais quaisquer respostas ou membros de conjunto, seguindo recursivamente os mapeamentos especificados. Conceitos já presentes na fonte de destino são ignorados.", - "target_source": "Fonte de Destino", - "no_sources": "Nenhuma fonte encontrada", + "title": "Clonar Conceito(s) para Source", + "clone_to_source": "Clonar para Source", + "description": "Esta operação clonará o(s) conceito(s) selecionado(s), mais quaisquer respostas ou membros de conjunto, seguindo recursivamente os mapeamentos especificados. Conceitos já presentes no Source de destino são ignorados.", + "target_source": "Source de Destino", + "no_sources": "Nenhum Source encontrado", "advanced_settings": "Configurações avançadas", "advanced_caution": "Cuidado: alterar estas configurações pode resultar em uma clonagem incompleta (ex.: respostas ou membros de conjunto faltando).", - "origination_sources": "Fonte(s) de Originação", - "destination_source": "Fonte de Destino", + "origination_sources": "Source(s) de Originação", + "destination_source": "Source de Destino", "summary": "{{count}} conceito(s) selecionado(s) serão clonados em", "cloning": "Clonando conceito(s)…", "clone_button": "Clonar", "clone_finished": "Clonagem finalizada. Veja a coluna de resultados para detalhes.", "preview_api_call": "Visualizar chamada da API", "hide_api_call": "Ocultar chamada da API", - "same_source_warning": "Mesma fonte do destino. Nada será clonado.", + "same_source_warning": "Mesmo Source do destino. Nada será clonado.", "preview_header": "Visualização", "results_header": "Resultados", "preview_title": "Visualização", @@ -1079,7 +1091,7 @@ "equivalency_map_type_placeholder": "ex.: SAME-AS,CONCEPT-SET" }, "sort": { - "source": "Fonte", + "source": "Source", "most_relevant": "Mais relevantes", "newest_first": "Mais recentes primeiro", "oldest_first": "Mais antigos primeiro", From 7e3314a35f9a8ebddd566fd6e050b28b5a1d648f Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Fri, 2 Oct 2026 21:51:24 -0300 Subject: [PATCH 4/6] feat(i18n): Improve user activity display * Refactor event component to use targeted internationalization strings based on user ownership * Added necessary translations for activity states in English, Spanish, Portuguese (Brazil), and Chinese locales --- src/components/common/Events.jsx | 2 +- 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 +++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/common/Events.jsx b/src/components/common/Events.jsx index a4f181cfb..06fd09452 100644 --- a/src/components/common/Events.jsx +++ b/src/components/common/Events.jsx @@ -108,7 +108,7 @@ const Events = ({ user, events, onLoadMore, showAvatar, maxHeight, dashboard }) showAvatar && } - {`${isSelf ? t('user.your') : (user.name + "'s")} ${t('user.recent_activity')}`} + {isSelf ? t('user.own_recent_activity') : t('user.recent_activity_of', {name: user.name})} Date: Sat, 3 Oct 2026 13:14:03 -0300 Subject: [PATCH 5/6] feat(i18n): Update user activity status translations for PT-BR * Update Portuguese (Brazil) translations for user state changes, including followed and unfollowed states --- src/i18n/locales/pt-BR/translations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 773c1a16a..c7d4711d7 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -53,8 +53,8 @@ "updated": "Atualizado", "released": "Publicado", "deleted": "Excluído", - "followed": "passou a seguir", - "unfollowed": "deixou de seguir", + "followed": "Passou a seguir", + "unfollowed": "Deixou de seguir", "joined": "Entrou", "source": "Source" }, From 07c82607f4305c07023adf6582d5e1537b09f68f Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Sat, 3 Oct 2026 13:23:18 -0300 Subject: [PATCH 6/6] feat(i18n): Update event type translations for Portuguese (Brazil) * Updated Portuguese (Brazil) translations for event types in the i18n localization files * Ensured that the translated terms accurately reflect the action (e.g., "Criou" instead of "Criado" for event creation) --- src/i18n/locales/pt-BR/translations.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index c7d4711d7..434570a71 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -49,10 +49,10 @@ "created_on": "Criado em", "created_by": "Criado por", "event_types": { - "created": "Criado", - "updated": "Atualizado", - "released": "Publicado", - "deleted": "Excluído", + "created": "Criou", + "updated": "Atualizou", + "released": "Publicou", + "deleted": "Excluiu", "followed": "Passou a seguir", "unfollowed": "Deixou de seguir", "joined": "Entrou",